Merge branch 'master' into plugin-system-fresh

This commit is contained in:
objecttothis authored and GitHub committed 2026-08-31 16:18:59 +04:00
commit 459610cded
90 files changed
+4225 -2824

No files matched your search

+61 -40
View File
@@ -2,7 +2,7 @@
# ENVIRONMENT
#--------------------------------------------------------------------
CI_ENVIRONMENT = production
CI_ENVIRONMENT=production
#--------------------------------------------------------------------
# SECURITY: ALLOWED HOSTNAMES
@@ -14,71 +14,92 @@ CI_ENVIRONMENT = production
# In development, falls back to 'localhost' with an error log.
#
# Configure with comma-separated list of domains/subdomains:
# app.allowedHostnames = 'yourdomain.com,www.yourdomain.com'
# app.allowedHostnames='yourdomain.com,www.yourdomain.com'
#
# Or via environment variable (useful for Docker/Compose):
# ALLOWED_HOSTNAMES=yourdomain.com,www.yourdomain.com
#
# For local development:
# app.allowedHostnames = 'localhost'
# app.allowedHostnames='localhost'
#
# Note: Do not include protocol (http/https) or port numbers.
app.allowedHostnames = ''
app.allowedHostnames=''
#--------------------------------------------------------------------
# DATABASE
#--------------------------------------------------------------------
database.default.hostname = 'localhost'
database.default.database = 'ospos'
database.default.username = 'admin'
database.default.password = 'pointofsale'
database.default.DBDriver = 'MySQLi'
database.default.DBPrefix = 'ospos_'
database.default.hostname='localhost'
database.default.database='ospos'
database.default.username='admin'
database.default.password='pointofsale'
database.default.DBDriver='MySQLi'
database.default.DBPrefix='ospos_'
database.development.hostname = 'localhost'
database.development.database = 'ospos'
database.development.username = 'admin'
database.development.password = 'pointofsale'
database.development.DBDriver = 'MySQLi'
database.development.DBPrefix = 'ospos_'
database.development.hostname='localhost'
database.development.database='ospos'
database.development.username='admin'
database.development.password='pointofsale'
database.development.DBDriver='MySQLi'
database.development.DBPrefix='ospos_'
database.tests.hostname = 'localhost'
database.tests.database = 'ospos'
database.tests.username = 'admin'
database.tests.password = 'pointofsale'
database.tests.DBDriver = 'MySQLi'
database.tests.DBPrefix = 'ospos_'
database.tests.hostname='localhost'
database.tests.database='ospos'
database.tests.username='admin'
database.tests.password='pointofsale'
database.tests.DBDriver='MySQLi'
database.tests.DBPrefix='ospos_'
#--------------------------------------------------------------------
# ENCRYPTION
#--------------------------------------------------------------------
encryption.key = ''
encryption.key=''
#--------------------------------------------------------------------
# LOGGER
# - 0 = Disables logging, Error logging TURNED OFF
# - 1 = Emergency Messages - System is unusable
# - 2 = Alert Messages - Action Must Be Taken Immediately
# - 3 = Critical Messages - Application component unavailable, unexpected exception.
# - 4 = Runtime Errors - Don't need immediate action, but should be monitored.
# - 5 = Warnings - Exceptional occurrences that are not errors.
# - 6 = Notices - Normal but significant events.
# - 7 = Info - Interesting events, like user logging in, etc.
# - 8 = Debug - Detailed debug information.
# - 9 = All Messages
# - 0=Disables logging, Error logging TURNED OFF
# - 1=Emergency Messages - System is unusable
# - 2=Alert Messages - Action Must Be Taken Immediately
# - 3=Critical Messages - Application component unavailable, unexpected exception.
# - 4=Runtime Errors - Don't need immediate action, but should be monitored.
# - 5=Warnings - Exceptional occurrences that are not errors.
# - 6=Notices - Normal but significant events.
# - 7=Info - Interesting events, like user logging in, etc.
# - 8=Debug - Detailed debug information.
# - 9=All Messages
#--------------------------------------------------------------------
logger.threshold = 0
app.db_log_enabled = false
logger.threshold=0
app.db_log_enabled=false
#--------------------------------------------------------------------
# HONEYPOT
#--------------------------------------------------------------------
honeypot.hidden = true
honeypot.label = 'Fill This Field'
honeypot.name = 'honeypot'
honeypot.template = '<label>{label}</label><input type="text" name="{name}" value="">'
honeypot.container = '<div style="display:none">{template}</div>'
honeypot.hidden=true
honeypot.label='Fill This Field'
honeypot.name='honeypot'
honeypot.template='<label>{label}</label><input type="text" name="{name}" value="">'
honeypot.container='<div style="display:none">{template}</div>'
#--------------------------------------------------------------------
# SECURITY: DISALLOW PASSWORD CHANGE
#--------------------------------------------------------------------
# When true, disables the "change password" feature for all employees.
# Useful when passwords are managed by an external system (e.g. SSO/LDAP).
#
# DISALLOW_PASSWORD_CHANGE=false
DISALLOW_PASSWORD_CHANGE=false
#--------------------------------------------------------------------
# SECURITY: DISALLOW GRANT CHANGE
#--------------------------------------------------------------------
# When true, disables changing an employee's grants for all employees.
# New employees cannot be created with grants while this is enabled.
# Useful for demo deployments.
#
# DISALLOW_GRANT_CHANGE=false
DISALLOW_GRANT_CHANGE=false
+2
View File
@@ -76,6 +76,8 @@ system/
*~
*.~
.env
.env.lock
.env.tmp.*
auth.json
*.png
+3
View File
@@ -135,6 +135,9 @@ app/Plugins/{PluginName}/
```
**Base class:** Extend `Tests\Support\PluginTestCase` (registers plugin namespaces in `setUp`). Pure-PHP tests may extend `CodeIgniter\Test\CIUnitTestCase` directly.
- Run PHPUnit tests: `composer test`
- Tests must pass before submitting changes
- **One test file per class under test.** A controller, model, library, or helper gets exactly one test file covering all of its behavior — `Item_kits.php``tests/Controllers/Item_kitsTest.php` (or `Item_kitsControllerTest.php`, matching this codebase's existing `*ControllerTest.php` suffix for controllers), `Sale_lib.php``tests/Libraries/Sale_libTest.php`, etc. Do not create feature- or endpoint-scoped test files alongside a class's main test file (e.g. no `Item_kitsBarcodeTest.php` next to `Item_kitsControllerTest.php`) — add the new test methods to the existing file for that class instead. If no test file exists yet for the class, create the one canonical file rather than a narrowly-scoped one.
```bash
vendor/bin/phpunit --testsuite Plugins # plugins only
+3 -8
View File
@@ -3,7 +3,6 @@
namespace Config;
use CodeIgniter\Events\Events;
use CodeIgniter\Exceptions\ConfigException;
use CodeIgniter\Exceptions\FrameworkException;
use CodeIgniter\HotReloader\HotReloader;
use App\Events\Db_log;
@@ -34,14 +33,10 @@ Events::on('pre_system', static function (): void {
Events::on('pre_system', static function (): void {
if (ENVIRONMENT !== 'testing') {
helper('security');
check_encryption();
checkThrottleEncryption();
$encryptionKey = config('Encryption')->key;
if (empty($encryptionKey) || strlen($encryptionKey) < 64) {
throw new ConfigException('Encryption key could not be provisioned. Check that .env is writable.');
}
if (ini_get('zlib.output_compression')) {
$value = ini_get('zlib.output_compression');
if (filter_var($value, FILTER_VALIDATE_BOOLEAN) || (int) $value > 0) {
throw FrameworkException::forEnabledZlibOutputCompression();
}
+3
View File
@@ -13,6 +13,7 @@ use CodeIgniter\Filters\InvalidChars;
use CodeIgniter\Filters\PageCache;
use CodeIgniter\Filters\PerformanceMetrics;
use CodeIgniter\Filters\SecureHeaders;
use App\Filters\IsLoggedIn;
class Filters extends BaseFilters
{
@@ -35,6 +36,7 @@ class Filters extends BaseFilters
'forcehttps' => ForceHTTPS::class,
'pagecache' => PageCache::class,
'performance' => PerformanceMetrics::class,
'isLoggedIn' => IsLoggedIn::class,
'throttle' => Throttle::class,
];
@@ -77,6 +79,7 @@ class Filters extends BaseFilters
'honeypot',
'csrf' => ['except' => ['login', 'migrate', 'plugins/*/webhook']],
'invalidchars',
'isLoggedIn' => ['except' => 'login|migrate'],
],
'after' => [
'toolbar',
+1
View File
@@ -39,6 +39,7 @@ class OSPOS extends BaseConfig
try {
$db = Database::connect();
$db->resetDataCache();
if (!$db->tableExists('app_config')) {
$this->settings = $this->getDefaultSettings();
+1 -3
View File
@@ -2,9 +2,7 @@
use CodeIgniter\Router\RouteCollection;
/**
* @var RouteCollection $routes
*/
/** @var RouteCollection $routes */
$routes->setDefaultController('Login');
$routes->get('/', 'Login::index');
+1
View File
@@ -15,6 +15,7 @@ class Session extends BaseConfig
* --------------------------------------------------------------------------
*
* The session storage driver to use:
* - `CodeIgniter\Session\Handlers\ArrayHandler` (for testing)
* - `CodeIgniter\Session\Handlers\FileHandler`
* - `CodeIgniter\Session\Handlers\DatabaseHandler`
* - `CodeIgniter\Session\Handlers\MemcachedHandler`
+2 -8
View File
@@ -5,10 +5,6 @@ namespace Config;
use CodeIgniter\Config\View as BaseView;
use CodeIgniter\View\ViewDecoratorInterface;
/**
* @phpstan-type parser_callable (callable(mixed): mixed)
* @phpstan-type parser_callable_string (callable(mixed): mixed)&string
*/
class View extends BaseView
{
/**
@@ -34,8 +30,7 @@ class View extends BaseView
* { title|esc(js) }
* { created_on|date(Y-m-d)|esc(attr) }
*
* @var array<string, string>
* @phpstan-var array<string, parser_callable_string>
* @var array<string, (callable(mixed): mixed)&string>
*/
public $filters = [];
@@ -44,8 +39,7 @@ class View extends BaseView
* by the core Parser by creating aliases that will be replaced with
* any callable. Can be single or tag pair.
*
* @var array<string, callable|list<string>|string>
* @phpstan-var array<string, list<parser_callable_string>|parser_callable_string|parser_callable>
* @var array<string, (callable(mixed...): mixed)|((callable(mixed...): mixed)&string)|list<(callable(mixed...): mixed)&string>>
*/
public $plugins = [];
+3 -3
View File
@@ -63,7 +63,7 @@ class Config extends Secure_Controller
$this->db = Database::connect();
helper('security');
if (check_encryption()) {
if (checkEncryption()) {
$this->encrypter = Services::encrypter();
} else {
log_message('alert', 'Error preparing encryption key');
@@ -505,7 +505,7 @@ class Config extends Secure_Controller
{
$password = '';
if (check_encryption() && !empty($this->request->getPost('smtp_pass'))) {
if (checkEncryption() && !empty($this->request->getPost('smtp_pass'))) {
$password = $this->encrypter->encrypt($this->request->getPost('smtp_pass'));
}
@@ -551,7 +551,7 @@ class Config extends Secure_Controller
{
$password = '';
if (check_encryption() && !empty($this->request->getPost('msg_pwd'))) {
if (checkEncryption() && !empty($this->request->getPost('msg_pwd'))) {
$password = $this->encrypter->encrypt($this->request->getPost('msg_pwd'));
}
+86 -31
View File
@@ -3,6 +3,7 @@
namespace App\Controllers;
use App\Models\Module;
use CodeIgniter\HTTP\Exceptions\RedirectException;
use CodeIgniter\HTTP\ResponseInterface;
use Config\Services;
@@ -79,8 +80,7 @@ class Employees extends Persons
$current_user = $this->employee->get_logged_in_employee_info();
if ($employee_id != NEW_ENTRY && !$this->employee->canModifyEmployee($person_info->person_id, $current_user->person_id)) {
header('Location: ' . base_url('no_access/employees/employees'));
exit();
throw new RedirectException('no_access/employees/employees');
}
foreach (get_object_vars($person_info) as $property => $value) {
@@ -114,13 +114,13 @@ class Employees extends Persons
* Inserts/updates an employee
* @return ResponseInterface
*/
public function postSave(int $employee_id = NEW_ENTRY): ResponseInterface
public function postSave(int $employeeId = NEW_ENTRY): ResponseInterface
{
$current_user = $this->employee->get_logged_in_employee_info();
$currentUser = $this->employee->get_logged_in_employee_info();
if ($employee_id != NEW_ENTRY) {
$target_employee = $this->employee->getInfo($employee_id);
if (!$this->employee->canModifyEmployee($target_employee->person_id, $current_user->person_id)) {
if ($employeeId != NEW_ENTRY) {
$targetEmployee = $this->employee->get_info($employeeId);
if (!$this->employee->canModifyEmployee($targetEmployee->person_id, $currentUser->person_id)) {
return $this->response->setJSON([
'success' => false,
'message' => lang('Employees.error_updating_admin'),
@@ -129,17 +129,17 @@ class Employees extends Persons
}
}
$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);
$firstName = $this->request->getPost('first_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS); // TODO: duplicated code
$lastName = $this->request->getPost('last_name', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$email = strtolower($this->request->getPost('email', FILTER_SANITIZE_EMAIL));
// format first and last name properly
$first_name = $this->nameize($first_name);
$last_name = $this->nameize($last_name);
$firstName = $this->nameize($firstName);
$lastName = $this->nameize($lastName);
$person_data = [
'first_name' => $first_name,
'last_name' => $last_name,
$personData = [
'first_name' => $firstName,
'last_name' => $lastName,
'gender' => $this->request->getPost('gender', FILTER_SANITIZE_NUMBER_INT),
'email' => $email,
'phone_number' => $this->request->getPost('phone_number', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
@@ -152,27 +152,55 @@ class Employees extends Persons
'comments' => $this->request->getPost('comments', FILTER_SANITIZE_FULL_SPECIAL_CHARS)
];
$grants_array = [];
$isAdmin = $this->employee->isAdmin($current_user->person_id);
$grantsArray = [];
$isAdmin = $this->employee->isAdmin($currentUser->person_id);
foreach ($this->module->get_all_permissions()->getResult() as $permission) {
$grants = [];
$grant = $this->request->getPost('grant_' . $permission->permission_id) != null ? $this->request->getPost('grant_' . $permission->permission_id, FILTER_SANITIZE_FULL_SPECIAL_CHARS) : '';
if ($grant == $permission->permission_id) {
if (!$isAdmin && !$this->employee->has_grant($permission->permission_id, $current_user->person_id)) {
if (!$isAdmin && !$this->employee->has_grant($permission->permission_id, $currentUser->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;
$grantsArray[] = $grants;
}
}
$minimumGrants = ['employees', 'home', 'office'];
$missingMinimumGrant = array_diff($minimumGrants, array_column($grantsArray, 'permission_id'));
if ($isAdmin && $employeeId == $currentUser->person_id && !empty($missingMinimumGrant)) {
return $this->response->setJSON([
'success' => false,
'message' => lang('Employees.error_cannot_remove_own_minimum_grant'),
'id' => $employeeId
]);
}
if (filter_var(getenv('DISALLOW_GRANT_CHANGE'), FILTER_VALIDATE_BOOLEAN)
&& $this->hasGrantsChanged($employeeId, $isAdmin, $currentUser, $grantsArray)) {
return $this->response->setJSON([
'success' => false,
'message' => lang('Employees.error_grant_change_disallowed'),
'id' => $employeeId
]);
}
if (!empty($this->request->getPost('password')) && ENVIRONMENT != 'testing' && filter_var(getenv('DISALLOW_PASSWORD_CHANGE'), FILTER_VALIDATE_BOOLEAN)) {
return $this->response->setJSON([
'success' => false,
'message' => lang('Employees.error_password_change_disallowed'),
'id' => $employeeId
]);
}
// Password has been changed OR first time password set
if (!empty($this->request->getPost('password')) && ENVIRONMENT != 'testing') {
$exploded = explode(":", $this->request->getPost('language', FILTER_SANITIZE_FULL_SPECIAL_CHARS));
$employee_data = [
$employeeData = [
'username' => $this->request->getPost('username', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
'password' => password_hash($this->request->getPost('password'), PASSWORD_DEFAULT),
'hash_version' => 2,
@@ -181,42 +209,69 @@ class Employees extends Persons
];
} else { // Password not changed
$exploded = explode(":", $this->request->getPost('language', FILTER_SANITIZE_FULL_SPECIAL_CHARS));
$employee_data = [
$employeeData = [
'username' => $this->request->getPost('username', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
'language_code' => $exploded[0],
'language' => $exploded[1]
];
}
if ($this->employee->save_employee($person_data, $employee_data, $grants_array, $employee_id)) {
if ($this->employee->save_employee($personData, $employeeData, $grantsArray, $employeeId)) {
// New employee
if ($employee_id == NEW_ENTRY) {
if ($employeeId == NEW_ENTRY) {
return $this->response->setJSON([
'success' => true,
'message' => lang('Employees.successful_adding') . ' ' . $first_name . ' ' . $last_name,
'id' => $employee_data['person_id']
'message' => lang('Employees.successful_adding') . ' ' . $firstName . ' ' . $lastName,
'id' => $employeeData['person_id']
]);
} else { // Existing employee
$logged_in_employee_id = session()->get('person_id');
if ($employee_id == $logged_in_employee_id) {
session()->set('language_code', $employee_data['language_code']);
session()->set('language', $employee_data['language']);
$loggedInEmployeeId = session()->get('person_id');
if ($employeeId == $loggedInEmployeeId) {
session()->set('language_code', $employeeData['language_code']);
session()->set('language', $employeeData['language']);
}
return $this->response->setJSON([
'success' => true,
'message' => lang('Employees.successful_updating') . ' ' . $first_name . ' ' . $last_name,
'id' => $employee_id
'message' => lang('Employees.successful_updating') . ' ' . $firstName . ' ' . $lastName,
'id' => $employeeId
]);
}
} else { // Failure
return $this->response->setJSON([
'success' => false,
'message' => lang('Employees.error_adding_updating') . ' ' . $first_name . ' ' . $last_name,
'message' => lang('Employees.error_adding_updating') . ' ' . $firstName . ' ' . $lastName,
'id' => NEW_ENTRY
]);
}
}
/**
* Determines whether the submitted grants differ from the employee's current grants,
* limited to the permissions the current user has authority over when not an admin.
*/
private function hasGrantsChanged(int $employeeId, bool $isAdmin, object $currentUser, array $grantsArray): bool
{
$currentGrantIds = [];
if ($employeeId != NEW_ENTRY) {
$currentGrantIds = array_column($this->employee->get_employee_grants($employeeId), 'permission_id');
if (!$isAdmin) {
$currentGrantIds = array_values(array_filter(
$currentGrantIds,
fn ($permissionId) => $this->employee->has_grant($permissionId, $currentUser->person_id)
));
}
}
$submittedGrantIds = array_column($grantsArray, 'permission_id');
sort($currentGrantIds);
sort($submittedGrantIds);
return $currentGrantIds !== $submittedGrantIds;
}
/**
* This deletes employees from the employees table
* @return ResponseInterface
+8
View File
@@ -3,6 +3,7 @@
namespace App\Controllers;
use App\Libraries\MY_Migration;
use App\Models\Employee;
use CodeIgniter\HTTP\RedirectResponse;
use CodeIgniter\HTTP\ResponseInterface;
@@ -10,6 +11,13 @@ class Home extends Secure_Controller
{
public function __construct()
{
$methodName = urldecode(service('request')->getUri()->getSegment(2));
if ($methodName === 'logout') {
$this->employee = model(Employee::class);
return;
}
parent::__construct('home', null, 'home');
}
+16 -16
View File
@@ -255,39 +255,39 @@ class Item_kits extends Secure_Controller
/**
* 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.
* @param string $itemKitIds Colon separated list of item_kit_id values to generate barcodes for.
* @return string
* @noinspection PhpUnused
*/
public function getGenerateBarcodes(string $item_kit_ids): string
public function getGenerateBarcodes(string $itemKitIds): string
{
$barcode_lib = new Barcode_lib();
$barcodeLib = new Barcode_lib();
$result = [];
$item_kit_ids = explode(':', $item_kit_ids);
foreach ($item_kit_ids as $item_kid_id) {
$itemKitIds = explode(':', $itemKitIds);
foreach ($itemKitIds as $itemKitId) {
// Calculate the total cost and retail price of the Kit, so it can be added to the barcode text at the bottom
$item_kit = $this->_add_totals_to_item_kit($this->item_kit->get_info($item_kid_id));
$itemKit = $this->_add_totals_to_item_kit($this->item_kit->get_info($itemKitId));
$item_kid_id = 'KIT ' . urldecode($item_kid_id);
$itemKitId = 'KIT ' . $itemKitId;
$result[] = [
'name' => $item_kit->name,
'item_id' => $item_kid_id,
'item_number' => $item_kid_id,
'cost_price' => $item_kit->total_cost_price,
'unit_price' => $item_kit->total_unit_price
'name' => $itemKit->name,
'item_id' => $itemKitId,
'item_number' => $itemKitId,
'cost_price' => $itemKit->total_cost_price,
'unit_price' => $itemKit->total_unit_price
];
}
$data['items'] = $result;
$barcode_config = $barcode_lib->get_barcode_config();
$barcodeConfig = $barcodeLib->get_barcode_config();
// In case the selected barcode type is not Code39 or Code128 we set by default Code128
// The rationale for this is that EAN codes cannot have strings as seed, so 'KIT ' is not allowed
if ($barcode_config['barcode_type'] != 'C39' && $barcode_config['barcode_type'] != 'C128') {
$barcode_config['barcode_type'] = 'C128';
if ($barcodeConfig['barcode_type'] != 'C39' && $barcodeConfig['barcode_type'] != 'C128') {
$barcodeConfig['barcode_type'] = 'C128';
}
$data['barcode_config'] = $barcode_config;
$data['barcode_config'] = $barcodeConfig;
// Display barcodes
return view("barcodes/barcode_sheet", $data);
+19 -1
View File
@@ -2,8 +2,10 @@
namespace App\Controllers;
use App\Models\Employee;
use App\Models\Module;
use CodeIgniter\HTTP\ResponseInterface;
use Config\OSPOS;
/**
* Part of the grants mechanism to restrict access to modules that the user doesn't have permission for.
@@ -13,10 +15,12 @@ use CodeIgniter\HTTP\ResponseInterface;
*/
class No_access extends BaseController
{
private Employee $employee;
private Module $module;
public function __construct()
{
$this->employee = model(Employee::class);
$this->module = model(Module::class);
}
@@ -30,6 +34,20 @@ class No_access extends BaseController
$data['module_name'] = $this->module->get_module_name($module_id);
$data['permission_id'] = $permission_id;
return view('no_access', $data);
$userInfo = $this->employee->get_logged_in_employee_info();
if ($userInfo === false || $this->request->isAJAX()) {
return view('no_access', $data);
}
$menuGroup = session()->get('menu_group');
$allowedModules = $menuGroup == 'home'
? $this->module->get_allowed_home_modules($userInfo->person_id)
: $this->module->get_allowed_office_modules($userInfo->person_id);
$data['user_info'] = $userInfo;
$data['allowed_modules'] = $allowedModules->getResult();
$data['config'] = config(OSPOS::class)->settings;
return view('partial/header', $data) . view('no_access', $data) . view('partial/footer');
}
}
+11 -9
View File
@@ -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\Exceptions\RedirectException;
use CodeIgniter\HTTP\ResponseInterface;
use Config\OSPOS;
use Config\Services;
@@ -55,8 +56,8 @@ class Reports extends Secure_Controller
{
parent::__construct('reports');
$request = Services::request();
$method_name = $request->getUri()->getSegment(2);
$exploder = explode('_', $method_name);
$methodName = urldecode($request->getUri()->getSegment(2));
$exploder = explode('_', $methodName);
$this->attribute = config(Attribute::class);
$this->config = config(OSPOS::class)->settings;
@@ -79,15 +80,16 @@ class Reports extends Secure_Controller
$this->inventory_summary = model(Inventory_summary::class);
if (sizeof($exploder) > 1) {
preg_match('/(?:inventory)|([^_.]*)(?:_graph|_row)?$/', $method_name, $matches);
preg_match('/(?:inventory)|([^_.]*)(?:_graph|_row)?$/', $methodName, $matches);
preg_match('/^(.*?)([sy])?$/', array_pop($matches), $matches);
$submodule_id = $matches[1] . ((count($matches) > 2) ? $matches[2] : 's');
$submoduleId = $matches[1] . ((count($matches) > 2) ? $matches[2] : 's');
} else {
$submoduleId = null;
}
// Check access to report submodule
if (!$this->employee->has_grant('reports_' . $submodule_id, $this->employee->get_logged_in_employee_info()->person_id)) {
header('Location: ' . base_url('no_access/reports/reports_' . $submodule_id));
exit();
}
// Check access to report submodule
if ($submoduleId !== null && !$this->employee->has_grant('reports_' . $submoduleId, $this->employee->get_logged_in_employee_info()->person_id)) {
throw new RedirectException('no_access/reports/reports_' . $submoduleId);
}
helper('report');
+175 -126
View File
@@ -126,26 +126,38 @@ class Sales extends Secure_Controller
}
/**
* @param int $row_id
* @param int $rowId
* @return ResponseInterface
*/
public function getRow(int $row_id): ResponseInterface
public function getRow(int $rowId): ResponseInterface
{
$sale_info = $this->sale->getInfo($row_id)->getRow();
$data_row = get_sale_data_row($sale_info);
$personId = $this->session->get('person_id');
return $this->response->setJSON($data_row);
if (!$this->employee->has_grant('reports_sales', $personId)) {
return $this->response->setStatusCode(403)->setJSON(['success' => false, 'message' => lang('Sales.not_authorized')]);
}
$saleInfo = $this->sale->get_info($rowId)->getRow();
$dataRow = getSaleDataRow($saleInfo);
return $this->response->setJSON($dataRow);
}
/**
* @return void
* @return ResponseInterface
*/
public function getSearch(): ResponseInterface
{
$personId = $this->session->get('person_id');
if (!$this->employee->has_grant('reports_sales', $personId)) {
return $this->response->setStatusCode(403)->setJSON(['success' => false, 'message' => lang('Sales.not_authorized')]);
}
$search = $this->request->getGet('search', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
$offset = $this->request->getGet('offset', FILTER_SANITIZE_NUMBER_INT);
$sort = $this->sanitizeSortColumn(sales_headers(), $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'sale_id');
$sort = $this->sanitizeSortColumn(salesHeaders(), $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'sale_id');
$order = $this->request->getGet('order', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$filters = [
@@ -166,24 +178,24 @@ class Sales extends Secure_Controller
];
// Check if any filter is set in the multiselect dropdown
$request_filters = array_fill_keys($this->request->getGet('filters', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?? [], true);
$filters = array_merge($filters, $request_filters);
$requestFilters = array_fill_keys($this->request->getGet('filters', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?? [], true);
$filters = array_merge($filters, $requestFilters);
$sales = $this->sale->search($search, $filters, $limit, $offset, $sort, $order);
$total_rows = $this->sale->get_found_rows($search, $filters);
$payments = $this->sale->get_payments_summary($search, $filters);
$payment_summary = get_sales_manage_payments_summary($payments);
$totalRows = $this->sale->get_found_rows($search, $filters);
$payments = $this->sale->getPaymentsSummary($search, $filters);
$paymentSummary = getSalesManagePaymentsSummary($payments);
$data_rows = [];
$dataRows = [];
foreach ($sales->getResult() as $sale) {
$data_rows[] = get_sale_data_row($sale);
$dataRows[] = getSaleDataRow($sale);
}
if ($total_rows > 0) {
$data_rows[] = get_sale_data_last_row($sales);
if ($totalRows > 0) {
$dataRows[] = getSaleDataLastRow($sales);
}
return $this->response->setJSON(['total' => $total_rows, 'rows' => $data_rows, 'payment_summary' => $payment_summary]);
return $this->response->setJSON(['total' => $totalRows, 'rows' => $dataRows, 'payment_summary' => $paymentSummary]);
}
/**
@@ -633,6 +645,7 @@ class Sales extends Secure_Controller
$description = $this->request->getPost('description', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$serialnumber = $this->request->getPost('serialnumber', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$price = parse_decimals($this->request->getPost('price'));
$price = $price !== false ? number_format((float) $price, totals_decimals(), '.', '') : $price;
$quantity = parse_decimals($this->request->getPost('quantity'));
$discount_type = $this->request->getPost('discount_type', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$discount = $discount_type
@@ -1007,38 +1020,44 @@ class Sales extends Secure_Controller
/**
* Email PDF invoice to customer. Used in app/Views/sales/form.php, invoice.php, quote.php, tax_invoice.php and work_order.php
*
* @param int $sale_id
* @param int $saleId
* @param string $type
* @return ResponseInterface
* @noinspection PhpUnused
*/
public function getSendPdf(int $sale_id, string $type = 'invoice'): ResponseInterface
public function getSendPdf(int $saleId, string $type = 'invoice'): ResponseInterface
{
$sale_data = $this->_load_sale_data($sale_id);
$personId = $this->session->get('person_id');
if (!$this->employee->has_grant('reports_sales', $personId)) {
return $this->response->setStatusCode(403)->setJSON(['success' => false, 'message' => lang('Sales.not_authorized')]);
}
$saleData = $this->_load_sale_data($saleId);
$result = false;
$message = lang('Sales.invoice_no_email');
if (!empty($sale_data['customer_email'])) {
$to = $sale_data['customer_email'];
$number = array_key_exists($type . "_number", $sale_data) ? $sale_data[$type . "_number"] : "";
if (!empty($saleData['customer_email'])) {
$to = $saleData['customer_email'];
$number = array_key_exists($type . "_number", $saleData) ? $saleData[$type . "_number"] : "";
$subject = lang('Sales.' . $type) . ' ' . $number;
$text = $this->config['invoice_email_message'];
$tokens = [
new Token_invoice_sequence($number),
new Token_invoice_count('POS ' . $sale_data['sale_id']),
new Token_customer((array)$sale_data)
new Token_invoice_count('POS ' . $saleData['sale_id']),
new Token_customer((array)$saleData)
];
$text = $this->token_lib->render($text, $tokens);
$sale_data['mimetype'] = $this->email_lib->getLogoMimeType();
$saleData['mimetype'] = $this->email_lib->getLogoMimeType();
// Build img_tag for email views that need it (receipt_email.php)
$sale_data['img_tag'] = $this->email_lib->buildLogoImgTag();
$saleData['img_tag'] = $this->email_lib->buildLogoImgTag();
// Generate email attachment: invoice in PDF format
$view = Services::renderer();
$html = $view->setData($sale_data)->render("sales/$type" . '_email', $sale_data);
$html = $view->setData($saleData)->render("sales/$type" . '_email', $saleData);
// Load PDF helper
helper(['dompdf', 'file']);
@@ -1052,32 +1071,38 @@ class Sales extends Secure_Controller
$this->sale_lib->clear_all();
return $this->response->setJSON(['success' => $result, 'message' => $message, 'id' => $sale_id]);
return $this->response->setJSON(['success' => $result, 'message' => $message, 'id' => $saleId]);
}
/**
* Emails sales receipt to customer. Used in app/Views/sales/receipt.php
*
* @param int $sale_id
* @param int $saleId
* @return ResponseInterface
* @noinspection PhpUnused
*/
public function getSendReceipt(int $sale_id): ResponseInterface
public function getSendReceipt(int $saleId): ResponseInterface
{
$sale_data = $this->_load_sale_data($sale_id);
$personId = $this->session->get('person_id');
if (!$this->employee->has_grant('reports_sales', $personId)) {
return $this->response->setStatusCode(403)->setJSON(['success' => false, 'message' => lang('Sales.not_authorized')]);
}
$saleData = $this->_load_sale_data($saleId);
$result = false;
$message = lang('Sales.receipt_no_email');
if (!empty($sale_data['customer_email'])) {
$sale_data['barcode'] = $this->barcode_lib->generate_receipt_barcode($sale_data['sale_id']);
$sale_data['img_tag'] = $this->email_lib->buildLogoImgTag();
if (!empty($saleData['customer_email'])) {
$saleData['barcode'] = $this->barcode_lib->generate_receipt_barcode($saleData['sale_id']);
$saleData['img_tag'] = $this->email_lib->buildLogoImgTag();
$to = $sale_data['customer_email'];
$to = $saleData['customer_email'];
$subject = lang('Sales.receipt');
$view = Services::renderer();
$text = $view->setData($sale_data)->render('sales/receipt_email');
$text = $view->setData($saleData)->render('sales/receipt_email');
$result = $this->email_lib->sendEmail($to, $subject, $text);
@@ -1086,7 +1111,7 @@ class Sales extends Secure_Controller
$this->sale_lib->clear_all();
return $this->response->setJSON(['success' => $result, 'message' => $message, 'id' => $sale_id]);
return $this->response->setJSON(['success' => $result, 'message' => $message, 'id' => $saleId]);
}
/**
@@ -1382,13 +1407,19 @@ class Sales extends Secure_Controller
/**
* Load the sales receipt for a sale. Used in app/Views/sales/form.php
*
* @param int $sale_id
* @param int $saleId
* @return string
* @noinspection PhpUnused
*/
public function getReceipt(int $sale_id): string
public function getReceipt(int $saleId): string|ResponseInterface
{
$data = $this->_load_sale_data($sale_id);
$personId = $this->session->get('person_id');
if (!$this->employee->has_grant('reports_sales', $personId)) {
return redirect()->to('no_access/sales/reports_sales');
}
$data = $this->_load_sale_data($saleId);
$this->sale_lib->clear_all();
return view('sales/receipt', $data);
@@ -1397,13 +1428,19 @@ class Sales extends Secure_Controller
/**
* Loads the sales invoice for a sale. Used in app/Views/sales/form.php
*
* @param int $sale_id
* @param int $saleId
* @return string
* @noinspection PhpUnused
*/
public function getInvoice(int $sale_id): string
public function getInvoice(int $saleId): string|ResponseInterface
{
$data = $this->_load_sale_data($sale_id);
$personId = $this->session->get('person_id');
if (!$this->employee->has_grant('reports_sales', $personId)) {
return redirect()->to('no_access/sales/reports_sales');
}
$data = $this->_load_sale_data($saleId);
$this->sale_lib->clear_all();
return view('sales/' . $data['invoice_view'], $data);
@@ -1412,25 +1449,31 @@ class Sales extends Secure_Controller
/**
* Edits an existing sale or work order. Used in app/Views/sales/form.php
*
* @param int $sale_id
* @param int $saleId
* @return string
* @throws ReflectionException
*/
public function getEdit(int $sale_id): string
public function getEdit(int $saleId): string|ResponseInterface
{
$personId = $this->session->get('person_id');
if (!$this->employee->has_grant('reports_sales', $personId)) {
return redirect()->to('no_access/sales/reports_sales');
}
$data = [];
$sale_info = $this->sale->getInfo($sale_id)->getRowArray();
$data['selected_customer_id'] = $sale_info['customer_id'];
$data['selected_customer_name'] = $sale_info['customer_name'];
$employee_info = $this->employee->getInfo($sale_info['employee_id']);
$data['selected_employee_id'] = $sale_info['employee_id'];
$data['selected_employee_name'] = $employee_info->first_name . ' ' . $employee_info->last_name;
$data['sale_info'] = $sale_info;
$balance_due = round($sale_info['amount_due'] - $sale_info['amount_tendered'] + $sale_info['cash_refund'], totals_decimals(), PHP_ROUND_HALF_UP);
$saleInfo = $this->sale->get_info($saleId)->getRowArray();
$data['selected_customer_id'] = $saleInfo['customer_id'];
$data['selected_customer_name'] = $saleInfo['customer_name'];
$employeeInfo = $this->employee->get_info($saleInfo['employee_id']);
$data['selected_employee_id'] = $saleInfo['employee_id'];
$data['selected_employee_name'] = $employeeInfo->first_name . ' ' . $employeeInfo->last_name;
$data['sale_info'] = $saleInfo;
$balanceDue = round($saleInfo['amount_due'] - $saleInfo['amount_tendered'] + $saleInfo['cash_refund'], totals_decimals(), PHP_ROUND_HALF_UP);
if (!$this->sale_lib->reset_cash_rounding() && $balance_due < 0) {
$balance_due = 0;
if (!$this->sale_lib->reset_cash_rounding() && $balanceDue < 0) {
$balanceDue = 0;
}
$data['payments'] = [];
@@ -1443,24 +1486,24 @@ class Sales extends Secure_Controller
}
$data['payment_type_new'] = PAYMENT_TYPE_UNASSIGNED;
$data['payment_amount_new'] = $balance_due;
$data['payment_amount_new'] = $balanceDue;
$data['balance_due'] = $balance_due != 0;
$data['balance_due'] = $balanceDue != 0;
// Don't allow gift card to be a payment option in a sale transaction edit because it's a complex change
$payment_options = $this->sale->get_payment_options(false);
$paymentOptions = $this->sale->get_payment_options(false);
if ($this->sale_lib->reset_cash_rounding()) {
$payment_options[lang('Sales.cash_adjustment')] = lang('Sales.cash_adjustment');
$paymentOptions[lang('Sales.cash_adjustment')] = lang('Sales.cash_adjustment');
}
$data['payment_options'] = $payment_options;
$data['payment_options'] = $paymentOptions;
$data['reference_code_payment_types'] = get_reference_code_payment_types();
// Set up a slightly modified list of payment types for new payment entry
$payment_options["--"] = lang('Common.none_selected_text');
$paymentOptions["--"] = lang('Common.none_selected_text');
$data['new_payment_options'] = $payment_options;
$data['new_payment_options'] = $paymentOptions;
return view('sales/form', $data);
}
@@ -1476,7 +1519,7 @@ class Sales extends Secure_Controller
$has_grant = $this->employee->has_grant('sales_delete', $employee_id);
if (!$has_grant) {
return $this->response->setJSON(['success' => false, 'message' => lang('Sales.not_authorized')]);
return $this->response->setStatusCode(403)->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];
@@ -1503,7 +1546,7 @@ class Sales extends Secure_Controller
$has_grant = $this->employee->has_grant('sales_delete', $employee_id);
if (!$has_grant) {
return $this->response->setJSON(['success' => false, 'message' => lang('Sales.not_authorized')]);
return $this->response->setStatusCode(403)->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];
@@ -1522,20 +1565,26 @@ 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
* @param int $saleId
* @return ResponseInterface
* @throws ReflectionException
*/
public function postSave(int $sale_id = NEW_ENTRY): ResponseInterface
public function postSave(int $saleId = NEW_ENTRY): ResponseInterface
{
$newdate = $this->request->getPost('date', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$inventory = model(Inventory::class);
$date_formatter = date_create_from_format($this->config['dateformat'] . ' ' . $this->config['timeformat'], $newdate);
$sale_time = $date_formatter->format('Y-m-d H:i:s');
$personId = $this->session->get('person_id');
$sale_data = [
'sale_time' => $sale_time,
if (!$this->employee->has_grant('reports_sales', $personId)) {
return $this->response->setStatusCode(403)->setJSON(['success' => false, 'message' => lang('Sales.not_authorized')]);
}
$newdate = $this->request->getPost('date', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$employeeId = $this->employee->get_logged_in_employee_info()->person_id;
$inventory = model(Inventory::class);
$dateFormatter = date_create_from_format($this->config['dateformat'] . ' ' . $this->config['timeformat'], $newdate);
$saleTime = $dateFormatter->format('Y-m-d H:i:s');
$saleData = [
'sale_time' => $saleTime,
'customer_id' => $this->request->getPost('customer_id') != '' ? $this->request->getPost('customer_id', FILTER_SANITIZE_NUMBER_INT) : null,
'employee_id' => $this->request->getPost('employee_id') != '' ? $this->request->getPost('employee_id', FILTER_SANITIZE_NUMBER_INT) : null,
'comment' => $this->request->getPost('comment', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
@@ -1543,10 +1592,10 @@ class Sales extends Secure_Controller
];
// Validate reference_code for the new payment if applicable
$payment_type_new_check = $this->request->getPost('payment_type_new', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$payment_amount_new_check = $this->request->getPost('payment_amount_new');
if ($payment_type_new_check != PAYMENT_TYPE_UNASSIGNED && !empty($payment_amount_new_check)
&& in_array($payment_type_new_check, get_reference_code_payment_types())) {
$paymentTypeNewCheck = $this->request->getPost('payment_type_new', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$paymentAmountNewCheck = $this->request->getPost('payment_amount_new');
if ($paymentTypeNewCheck != PAYMENT_TYPE_UNASSIGNED && !empty($paymentAmountNewCheck)
&& in_array($paymentTypeNewCheck, get_reference_code_payment_types())) {
$min = (int)($this->config['payment_reference_code_min'] ?? 3);
$max = (int)($this->config['payment_reference_code_max'] ?? 40);
$rules = [
@@ -1562,82 +1611,82 @@ class Sales extends Secure_Controller
];
if (!$this->validate($rules, $messages)) {
$errors = $this->validator->getErrors();
return $this->response->setJSON(['success' => false, 'message' => reset($errors), 'id' => $sale_id]);
return $this->response->setJSON(['success' => false, 'message' => reset($errors), 'id' => $saleId]);
}
}
// In order to maintain tradition the only element that can change on prior payments is the payment type
$amount_tendered = 0;
$number_of_payments = $this->request->getPost('number_of_payments', FILTER_SANITIZE_NUMBER_INT);
for ($i = 0; $i < $number_of_payments; ++$i) {
$payment_id = $this->request->getPost("payment_id_$i", FILTER_SANITIZE_NUMBER_INT);
$payment_type = $this->request->getPost("payment_type_$i", FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$payment_amount = parse_decimals($this->request->getPost("payment_amount_$i"));
$refund_type = $this->request->getPost("refund_type_$i", FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$cash_refund = parse_decimals($this->request->getPost("refund_amount_$i"));
$reference_code = $this->request->getPost("reference_code_$i", FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?: null;
$amountTendered = 0;
$numberOfPayments = $this->request->getPost('number_of_payments', FILTER_SANITIZE_NUMBER_INT);
for ($i = 0; $i < $numberOfPayments; ++$i) {
$paymentId = $this->request->getPost("payment_id_$i", FILTER_SANITIZE_NUMBER_INT);
$paymentType = $this->request->getPost("payment_type_$i", FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$paymentAmount = parse_decimals($this->request->getPost("payment_amount_$i"));
$refundType = $this->request->getPost("refund_type_$i", FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$cashRefund = parse_decimals($this->request->getPost("refund_amount_$i"));
$referenceCode = $this->request->getPost("reference_code_$i", FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?: null;
$cash_adjustment = $payment_type == lang('Sales.cash_adjustment') ? CASH_ADJUSTMENT_TRUE : CASH_ADJUSTMENT_FALSE;
$cashAdjustment = $paymentType == lang('Sales.cash_adjustment') ? CASH_ADJUSTMENT_TRUE : CASH_ADJUSTMENT_FALSE;
if (!$cash_adjustment) {
$amount_tendered += $payment_amount - $cash_refund;
if (!$cashAdjustment) {
$amountTendered += $paymentAmount - $cashRefund;
}
// Non-cash positive refund amounts
if (empty(strstr($refund_type, lang('Sales.cash'))) && $cash_refund > 0) { // TODO: This if and the one below can be combined.
if (empty(strstr($refundType, lang('Sales.cash'))) && $cashRefund > 0) { // TODO: This if and the one below can be combined.
// Change it to be a new negative payment (a "non-cash refund")
$payment_type = $refund_type;
$payment_amount = $payment_amount - $cash_refund;
$cash_refund = 0.00;
$paymentType = $refundType;
$paymentAmount = $paymentAmount - $cashRefund;
$cashRefund = 0.00;
}
$sale_data['payments'][] = [
'payment_id' => $payment_id,
'payment_type' => $payment_type,
'payment_amount' => $payment_amount,
'cash_refund' => $cash_refund,
'cash_adjustment' => $cash_adjustment,
'employee_id' => $employee_id,
'reference_code' => $reference_code,
$saleData['payments'][] = [
'payment_id' => $paymentId,
'payment_type' => $paymentType,
'payment_amount' => $paymentAmount,
'cash_refund' => $cashRefund,
'cash_adjustment' => $cashAdjustment,
'employee_id' => $employeeId,
'reference_code' => $referenceCode,
];
}
$payment_id = NEW_ENTRY;
$payment_amount_new = $this->request->getPost('payment_amount_new');
$payment_type = $this->request->getPost('payment_type_new', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$reference_code_new = $this->request->getPost('reference_code_new', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?: null;
$paymentId = NEW_ENTRY;
$paymentAmountNew = $this->request->getPost('payment_amount_new');
$paymentType = $this->request->getPost('payment_type_new', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$referenceCodeNew = $this->request->getPost('reference_code_new', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?: null;
if ($payment_type != PAYMENT_TYPE_UNASSIGNED && !empty($payment_amount_new)) {
$payment_amount = parse_decimals($payment_amount_new);
$cash_refund = 0;
if ($payment_type == lang('Sales.cash_adjustment')) {
$cash_adjustment = CASH_ADJUSTMENT_TRUE;
if ($paymentType != PAYMENT_TYPE_UNASSIGNED && !empty($paymentAmountNew)) {
$paymentAmount = parse_decimals($paymentAmountNew);
$cashRefund = 0;
if ($paymentType == lang('Sales.cash_adjustment')) {
$cashAdjustment = CASH_ADJUSTMENT_TRUE;
} else {
$cash_adjustment = CASH_ADJUSTMENT_FALSE;
$amount_tendered += $payment_amount;
$sale_info = $this->sale->getInfo($sale_id)->getRowArray();
if ($amount_tendered > $sale_info['amount_due']) {
$cash_refund = $amount_tendered - $sale_info['amount_due'];
if ($amountTendered > $saleInfo['amount_due']) {
$cashRefund = $amountTendered - $saleInfo['amount_due'];
}
}
$sale_data['payments'][] = [
'payment_id' => $payment_id,
'payment_type' => $payment_type,
'payment_amount' => $payment_amount,
'cash_refund' => $cash_refund,
'cash_adjustment' => $cash_adjustment,
'employee_id' => $employee_id,
'reference_code' => $reference_code_new,
$saleData['payments'][] = [
'payment_id' => $paymentId,
'payment_type' => $paymentType,
'payment_amount' => $paymentAmount,
'cash_refund' => $cashRefund,
'cash_adjustment' => $cashAdjustment,
'employee_id' => $employeeId,
'reference_code' => $referenceCodeNew,
];
}
$inventory->update('POS ' . $sale_id, ['trans_date' => $sale_time]); // TODO: Reflection Exception
if ($this->sale->update($sale_id, $sale_data)) {
return $this->response->setJSON(['success' => true, 'message' => lang('Sales.successfully_updated'), 'id' => $sale_id]);
$inventory->update('POS ' . $saleId, ['trans_date' => $saleTime]); // TODO: Reflection Exception
if ($this->sale->update($saleId, $saleData)) {
return $this->response->setJSON(['success' => true, 'message' => lang('Sales.successfully_updated'), 'id' => $saleId]);
} else {
return $this->response->setJSON(['success' => false, 'message' => lang('Sales.unsuccessfully_updated'), 'id' => $sale_id]);
return $this->response->setJSON(['success' => false, 'message' => lang('Sales.unsuccessfully_updated'), 'id' => $saleId]);
}
}
+4 -9
View File
@@ -4,6 +4,7 @@ namespace App\Controllers;
use App\Models\Employee;
use App\Models\Module;
use CodeIgniter\HTTP\Exceptions\RedirectException;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Model;
use CodeIgniter\Session\Session;
@@ -39,18 +40,12 @@ class Secure_Controller extends BaseController
$config = config(OSPOS::class)->settings;
$validation = Services::validation();
if (!$this->employee->is_logged_in()) {
header("Location:" . base_url('login'));
exit();
}
$logged_in_employee_info = $this->employee->get_logged_in_employee_info();
if (
!$this->employee->has_module_grant($module_id, $logged_in_employee_info->person_id)
|| (isset($submodule_id) && !$this->employee->has_module_grant($submodule_id, $logged_in_employee_info->person_id))
) {
header("Location:" . base_url("no_access/$module_id/$submodule_id"));
exit();
throw new RedirectException("no_access/$module_id/$submodule_id");
}
// Load up global global_view_data visible to all the loaded views
@@ -144,9 +139,9 @@ class Secure_Controller extends BaseController
/**
* @param int $data_item_id
* @return false
* @return ResponseInterface|false
*/
public function postSave(int $data_item_id = -1)
public function postSave(int $data_item_id = -1): ResponseInterface|false
{
return false;
}
@@ -24,7 +24,7 @@ class Migration_Initial_Schema extends Migration
// Check if core application tables exist (existing install)
// Note: migrations table may exist even on fresh DB due to migration tracking
$tables = $this->db->listTables();
// Check for a core application table, not just migrations table
foreach ($tables as $table) {
// Strip prefix if present for comparison
@@ -35,7 +35,7 @@ class Migration_Initial_Schema extends Migration
return;
}
}
// Fresh install - load initial schema
helper('migration');
executeScript(APPPATH . 'Database/Migrations/sqlscripts/initial_schema.sql');
@@ -0,0 +1,147 @@
<?php
namespace App\Database\Migrations;
use App\Models\Appconfig;
use CodeIgniter\Database\Exceptions\DatabaseException;
use CodeIgniter\Database\Forge;
use CodeIgniter\Database\Migration;
use CodeIgniter\HTTP\Exceptions\RedirectException;
use Config\Encryption;
use Config\Services;
use ReflectionException;
class ConvertToCI4 extends Migration
{
/**
* Constructor.
*/
public function __construct(?Forge $forge = null)
{
parent::__construct($forge);
helper('security');
}
/**
* Perform a migration step.
*/
public function up(): void
{
helper('migration');
if (!executeScript(APPPATH . 'Database/Migrations/sqlscripts/3.4.0_CI4Conversion.sql')) {
throw new DatabaseException('Migration script 3.4.0_CI4Conversion.sql failed. Check logs for details.');
}
$existingKey = config('Encryption')->key;
if (!empty($existingKey) && strlen($existingKey) < 64) {
$this->convertCI3EncryptedData();
} else {
if (!checkEncryption()) {
abortEncryptionConversion();
throw new DatabaseException('Failed to persist encryption key. Check logs for details.');
}
}
removeBackup();
}
/**
* Revert a migration step.
*/
public function down(): void {}
/**
* @throws ReflectionException
*/
private function convertCI3EncryptedData(): void
{
$appConfig = model(Appconfig::class);
$ci3EncryptedData = [
'clcdesq_api_key' => '',
'clcdesq_api_url' => '',
'mailchimp_api_key' => '',
'mailchimp_list_id' => '',
'smtp_pass' => ''
];
foreach ($ci3EncryptedData as $key => $value) {
$ci3EncryptedData[$key] = $appConfig->get_value($key);
}
$decryptedData = $this->decryptCI3Data($ci3EncryptedData);
if (!checkEncryption()) {
abortEncryptionConversion();
throw new DatabaseException('Failed to persist encryption key. Check logs for details.');
}
$ci4EncryptedData = $this->encryptData($decryptedData);
$success = empty(array_diff_assoc($decryptedData, $this->decryptData($ci4EncryptedData)));
if (!$success) {
abortEncryptionConversion();
throw new RedirectException('login'); // TODO: Need to figure out how to pass the error to the Login controller so that it gets displayed.
}
if (!$appConfig->batch_save($ci4EncryptedData)) {
abortEncryptionConversion();
throw new DatabaseException('Failed to save converted encryption data. Check logs for details.');
}
}
/**
* Decrypts CI3 encrypted data and returns the plaintext values.
*
* @param array $encryptedData Data encrypted using CI3 methodology.
* @return array Plaintext, unencrypted data.
*/
private function decryptCI3Data(array $encryptedData): array
{
$config = new Encryption();
$config->driver = 'OpenSSL';
$config->key = config('Encryption')->key;
$config->cipher = 'AES-128-CBC';
$config->rawData = false;
$config->encryptKeyInfo = 'encryption';
$config->authKeyInfo = 'authentication';
$encrypter = Services::encrypter($config);
return array_map(function ($value) use ($encrypter) {
return !empty($value) ? $encrypter->decrypt($value) : '';
}, $encryptedData);
}
/**
* Encrypts data using CI4 algorithms.
*
* @param array $plainData Data to be encrypted.
* @return array Encrypted data.
*/
private function encryptData(array $plainData): array
{
$encrypter = Services::encrypter();
return array_map(function ($value) use ($encrypter) {
return $value !== '' ? $encrypter->encrypt($value) : '';
}, $plainData);
}
/**
* Decrypts data using CI4 algorithms.
*
* @param array $encryptedData Data to be decrypted.
* @return array Decrypted data.
*/
private function decryptData(array $encryptedData): array
{
$encrypter = Services::encrypter();
return array_map(function ($value) use ($encrypter) {
return !empty($value) ? $encrypter->decrypt($value) : '';
}, $encryptedData);
}
}
@@ -1,148 +0,0 @@
<?php
namespace App\Database\Migrations;
use App\Models\Appconfig;
use CodeIgniter\Database\Forge;
use CodeIgniter\Database\Migration;
use CodeIgniter\HTTP\RedirectResponse;
use CodeIgniter\HTTP\Exceptions\RedirectException;
use Config\Encryption;
use Config\Services;
use ReflectionException;
class Convert_to_ci4 extends Migration
{
/**
* Constructor.
*/
public function __construct(?Forge $forge = null)
{
parent::__construct($forge);
helper('security');
}
/**
* Perform a migration step.
*/
public function up(): void
{
helper('migration');
executeScript(APPPATH . 'Database/Migrations/sqlscripts/3.4.0_ci4_conversion.sql');
if (!empty(config('Encryption')->key)) {
$this->convert_ci3_encrypted_data();
} else {
check_encryption();
}
remove_backup();
}
/**
* Revert a migration step.
*/
public function down(): void {}
/**
* @return RedirectResponse|void
* @throws ReflectionException
*/
private function convert_ci3_encrypted_data()
{
$appconfig = model(Appconfig::class);
$ci3_encrypted_data = [
'clcdesq_api_key' => '',
'clcdesq_api_url' => '',
'mailchimp_api_key' => '',
'mailchimp_list_id' => '',
'smtp_pass' => ''
];
foreach ($ci3_encrypted_data as $key => $value) {
$ci3_encrypted_data[$key] = $appconfig->get_value($key);
}
$decrypted_data = $this->decrypt_ci3_data($ci3_encrypted_data);
check_encryption();
try {
$ci4_encrypted_data = $this->encrypt_data($decrypted_data);
$success = empty(array_diff_assoc($decrypted_data, $this->decrypt_data($ci4_encrypted_data)));
if (!$success) {
abort_encryption_conversion();
remove_backup();
throw new RedirectException('login');
}
$appconfig->batch_save($ci4_encrypted_data);
} catch (RedirectException $e) {
return redirect()->to('login'); // TODO: Need to figure out how to pass the error to the Login controller so that it gets displayed.
}
}
/**
* Decrypts CI3 encrypted data and returns the plaintext values.
*
* @param array $encrypted_data Data encrypted using CI3 methodology.
* @return array Plaintext, unencrypted data.
*/
private function decrypt_ci3_data(array $encrypted_data): array
{
$config = new Encryption();
$config->driver = 'OpenSSL';
$config->key = config('Encryption')->key;
$config->cipher = 'AES-128-CBC';
$config->rawData = false;
$config->encryptKeyInfo = 'encryption';
$config->authKeyInfo = 'authentication';
$encrypter = Services::encrypter($config);
$decrypted_data = [];
foreach ($encrypted_data as $key => $value) {
$decrypted_data[$key] = !empty($value) ? $encrypter->decrypt($value) : '';
}
return $decrypted_data;
}
/**
* Encrypts data using CI4 algorithms.
*
* @param array $plain_data Data to be encrypted.
* @return array Encrypted data.
*/
private function encrypt_data(array $plain_data): array
{
$encrypter = Services::encrypter();
$encrypted_data = [];
foreach ($plain_data as $key => $value) {
$encrypted_data[$key] = !empty($value) ? $encrypter->encrypt($value) : '';
}
return $encrypted_data;
}
/**
* Decrypts data using CI4 algorithms.
*
* @param array $encrypted_data Data to be decrypted.
* @return array Decrypted data.
*/
private function decrypt_data(array $encrypted_data): array
{
$encrypter = Services::encrypter();
$decrypted_data = [];
foreach ($encrypted_data as $key => $value) {
$decrypted_data[$key] = !empty($value) ? $encrypter->decrypt($value) : '';
}
return $decrypted_data;
}
}
@@ -56,7 +56,7 @@ class Migration_fix_keys_for_db_upgrade extends Migration
$foreignKeyExists = $this->db->query($checkSql)->getRow();
if ($foreignKeyExists) {
$this->db->query('ALTER TABLE ' . $this->db->prefixTable('sales_items_taxes') . ' DROP CONSTRAINT ospos_sales_items_taxes_ibfk_1');
$this->db->query('ALTER TABLE ' . $this->db->prefixTable('sales_items_taxes') . ' DROP FOREIGN KEY ospos_sales_items_taxes_ibfk_1');
}
$this->db->query('ALTER TABLE ' . $this->db->prefixTable('sales_items_taxes')
@@ -7,7 +7,7 @@ use Config\Database;
class TestDatabaseBootstrapSeeder extends Seeder
{
public function run(): void
public static function reset(): void
{
if (ENVIRONMENT !== 'testing') {
throw new \RuntimeException('TestDatabaseBootstrapSeeder can only run in the testing environment.');
@@ -34,4 +34,9 @@ class TestDatabaseBootstrapSeeder extends Seeder
$serverConn->query("DROP DATABASE IF EXISTS `{$dbName}`");
$serverConn->query("CREATE DATABASE IF NOT EXISTS `{$dbName}`");
}
public function run(): void
{
self::reset();
}
}
+25
View File
@@ -0,0 +1,25 @@
<?php
namespace App\Filters;
use App\Models\Employee;
use CodeIgniter\Filters\FilterInterface;
use CodeIgniter\HTTP\Exceptions\RedirectException;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
class IsLoggedIn implements FilterInterface
{
public function before(RequestInterface $request, $arguments = null)
{
$employee = model(Employee::class);
if (!$employee->is_logged_in()) {
throw new RedirectException('login');
}
}
public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
{
}
}
+3 -1
View File
@@ -24,8 +24,10 @@ class Throttle implements FilterInterface
return null;
}
helper('security');
$throttler = Services::throttler();
$secret = config('Encryption')->key;
$secret = checkThrottleEncryption();
$ipKey = 'login-ip-' . hash_hmac('sha256', $request->getIPAddress(), $secret);
$rawUsername = $request->getPost('username');
+1 -1
View File
@@ -485,7 +485,7 @@ function parse_decimals(string $number, ?int $decimals = null): mixed
$fmt = new NumberFormatter($config['number_locale'], NumberFormatter::DECIMAL);
if (!$decimals) {
$decimals = intVal($config['currency_decimals']);
$decimals = intVal($config['currency_decimals'] ?? 2);
$fmt->setAttribute(NumberFormatter::FRACTION_DIGITS, $decimals);
}
+274 -47
View File
@@ -2,61 +2,216 @@
use CodeIgniter\Encryption\Encryption;
use Config\Services;
use Random\RandomException;
/**
* Opens (creating if needed) and exclusively locks a dedicated mutex file
* for coordinating .env writes. Windows can't rename/delete a file while
* any handle to it is open, so the mutex must be a separate file from
* .env itself — never fopen()/flock() .env directly.
*
* @return resource
*/
function lockEnvFile()
{
$lockPath = ROOTPATH . '.env.lock';
$handle = @fopen($lockPath, 'c+');
if ($handle === false) {
throw new RuntimeException("Unable to open $lockPath");
}
if (!flock($handle, LOCK_EX)) {
fclose($handle);
throw new RuntimeException("Unable to lock $lockPath");
}
return $handle;
}
/**
* @param resource $handle
* @return void
*/
function unlockEnvFile($handle): void
{
flock($handle, LOCK_UN);
fclose($handle);
}
/**
* Replaces or inserts a single `key='value'` line in .env
*
* @param string $envKey
* @param string $value
* @return bool true on success, false if the write could not be completed
*/
function writeEnvKey(string $envKey, string $value): bool
{
$configPath = ROOTPATH . '.env';
if (!file_exists($configPath)) {
$examplePath = ROOTPATH . '.env.example';
if (file_exists($examplePath)) {
@copy($examplePath, $configPath);
} else {
@file_put_contents($configPath, "# OSPOS Configuration\n\n");
}
@chmod($configPath, 0640);
}
if (!file_exists($configPath)) {
return false;
}
$lock = lockEnvFile();
try {
$configFile = file_get_contents($configPath);
if ($configFile === false) {
return false;
}
$configFile = applyEnvKeyReplacement($configFile, $envKey, $value);
return atomicWriteFile($configPath, $configFile);
} finally {
unlockEnvFile($lock);
}
}
/**
* @param string $configFile
* @param string $envKey
* @param string $value
* @return string
*/
function applyEnvKeyReplacement(string $configFile, string $envKey, string $value): string
{
$pattern = '/^\s*' . preg_quote($envKey, '/') . '\s*=.*/m';
if (preg_match($pattern, $configFile)) {
return preg_replace($pattern, "$envKey='$value'", $configFile, 1);
}
if (preg_match('/^encryption\.key\s*=.*$/m', $configFile, $matches, PREG_OFFSET_CAPTURE)) {
$insertAt = $matches[0][1] + strlen($matches[0][0]);
return substr_replace($configFile, "\n$envKey='$value'", $insertAt, 0);
}
return $configFile . "\n$envKey='$value'\n";
}
/**
* Writes $contents to a temp file in the same directory as $path, then
* renames it onto $path so readers never observe a partially-written file.
*
* @param string $path
* @param string $contents
* @return bool
*/
function atomicWriteFile(string $path, string $contents): bool
{
$tmpPath = $path . '.tmp.' . bin2hex(random_bytes(8));
$handle = @fopen($tmpPath, 'x');
if ($handle === false) {
return false;
}
if (!@chmod($tmpPath, 0640)) {
fclose($handle);
@unlink($tmpPath);
return false;
}
$written = fwrite($handle, $contents);
if ($written === false || $written !== strlen($contents) || !fflush($handle)) {
fclose($handle);
@unlink($tmpPath);
return false;
}
if (function_exists('fsync') && !fsync($handle)) {
fclose($handle);
@unlink($tmpPath);
return false;
}
fclose($handle);
// rename() overwrites an existing destination on POSIX. On Windows it
// does not, so fall back to unlink()+rename() there. Callers must not
// hold any open handle on $path — Windows can't unlink/rename a path
// that's still open, even by the same process.
if (!@rename($tmpPath, $path)) {
if (PHP_OS_FAMILY !== 'Windows' || !@unlink($path) || !@rename($tmpPath, $path)) {
@unlink($tmpPath);
return false;
}
}
@chmod($path, 0640);
return true;
}
/**
* @return bool
*/
function check_encryption(): bool
function checkEncryption(): bool
{
$old_key = config('Encryption')->key;
$oldKey = config('Encryption')->key;
if ((empty($old_key)) || (strlen($old_key) < 64)) {
if ((empty($oldKey)) || (strlen($oldKey) < 64)) {
$encryption = new Encryption();
$key = bin2hex($encryption->createKey());
config('Encryption')->key = $key;
$config_path = ROOTPATH . '.env';
$backup_path = WRITEPATH . '/backup/.env.bak';
$backup_folder = WRITEPATH . '/backup';
$configPath = ROOTPATH . '.env';
$backupPath = WRITEPATH . '/backup/.env.bak';
$backupFolder = WRITEPATH . '/backup';
if (!file_exists($backup_folder)) {
@mkdir($backup_folder, 0750, true);
if (!file_exists($backupFolder)) {
@mkdir($backupFolder, 0750, true);
}
if (!file_exists($config_path)) {
$example_path = ROOTPATH . '.env.example';
if (file_exists($example_path)) {
@copy($example_path, $config_path);
if (!file_exists($configPath)) {
$examplePath = ROOTPATH . '.env.example';
if (file_exists($examplePath)) {
@copy($examplePath, $configPath);
} else {
@file_put_contents($config_path, "# OSPOS Configuration\n\n");
@file_put_contents($configPath, "# OSPOS Configuration\n\n");
}
@chmod($config_path, 0640);
@chmod($configPath, 0640);
}
if (file_exists($config_path)) {
@copy($config_path, $backup_path);
@chmod($backup_path, 0640);
@chmod($config_path, 0640);
if (file_exists($configPath)) {
@copy($configPath, $backupPath);
@chmod($backupPath, 0640);
@chmod($configPath, 0640);
$config_file = file_get_contents($config_path);
if (preg_match('/^\s*encryption\.key\s*=/m', $config_file)) {
$config_file = preg_replace("/^(\s*encryption\.key\s*=\s*).*/m", "\$1'$key'", $config_file, 1);
} else {
$config_file .= "\nencryption.key = '$key'\n";
if (!writeEnvKey('encryption.key', $key)) {
return false;
}
if (!empty($old_key)) {
$old_line = "# encryption.key = '$old_key' REMOVE IF UNNEEDED\r\n";
if (preg_match('/^encryption\.key\s*=/m', $config_file, $matches, PREG_OFFSET_CAPTURE)) {
$config_file = substr_replace($config_file, $old_line, $matches[0][1], 0);
if (!empty($oldKey)) {
$configFile = file_get_contents($configPath);
$oldLine = "# encryption.key='$oldKey' REMOVE IF UNNEEDED\r\n";
if (preg_match('/^encryption\.key\s*=/m', $configFile, $matches, PREG_OFFSET_CAPTURE)) {
$configFile = substr_replace($configFile, $oldLine, $matches[0][1], 0);
@file_put_contents($configPath, $configFile);
@chmod($configPath, 0640);
}
}
@file_put_contents($config_path, $config_file);
@chmod($config_path, 0640);
log_message('info', "Updated encryption key in $config_path");
log_message('info', "Updated encryption key in $configPath");
}
}
@@ -64,32 +219,104 @@ function check_encryption(): bool
}
/**
* @return void
* Returns a persistent secret for HMAC-hashing login-throttle cache keys.
*
* Deliberately independent of checkEncryption()/encryption.key: the throttle
* filter runs before the login-triggered CI3->CI4 migration, so provisioning
* this secret must never touch or rotate the encryption key.
*
* @return string
* @throws RandomException
* @throws RuntimeException if the key cannot be durably persisted
*/
function abort_encryption_conversion(): void
function checkThrottleEncryption(): string
{
$config_path = ROOTPATH . '.env';
$backup_path = WRITEPATH . '/backup/.env.bak';
$key = (string) env('throttle.key', '');
if (!file_exists($backup_path)) {
return;
if (!empty($key)) {
return $key;
}
@chmod($config_path, 0640);
$config_file = file_get_contents($backup_path);
@file_put_contents($config_path, $config_file);
log_message('info', "Restored $config_path from backup");
$configPath = ROOTPATH . '.env';
if (!file_exists($configPath)) {
$examplePath = ROOTPATH . '.env.example';
if (file_exists($examplePath)) {
@copy($examplePath, $configPath);
} else {
@file_put_contents($configPath, "# OSPOS Configuration\n\n");
}
@chmod($configPath, 0640);
}
if (!file_exists($configPath)) {
throw new RuntimeException("Unable to create $configPath to provision throttle.key");
}
$lock = lockEnvFile();
try {
$configFile = file_get_contents($configPath);
if ($configFile === false) {
throw new RuntimeException("Unable to read $configPath to provision throttle.key");
}
// Another process may have provisioned the key while we waited for the lock.
if (preg_match('/^\s*throttle\.key\s*=\s*[\'"]?([^\'"\r\n]*)/m', $configFile, $matches)) {
$existing = trim($matches[1]);
if ($existing !== '') {
$key = $existing;
}
}
if (empty($key)) {
$key = bin2hex(random_bytes(32));
$configFile = applyEnvKeyReplacement($configFile, 'throttle.key', $key);
if (!atomicWriteFile($configPath, $configFile)) {
throw new RuntimeException("Unable to persist throttle.key to $configPath");
}
}
} finally {
unlockEnvFile($lock);
}
putenv("throttle.key=$key");
$_ENV['throttle.key'] = $key;
$_SERVER['throttle.key'] = $key;
log_message('info', 'Provisioned throttle key in ' . ROOTPATH . '.env');
return $key;
}
/**
* @return void
*/
function remove_backup(): void
function abortEncryptionConversion(): void
{
$backup_path = WRITEPATH . '/backup/.env.bak';
if (!file_exists($backup_path)) {
$configPath = ROOTPATH . '.env';
$backupPath = WRITEPATH . '/backup/.env.bak';
if (!file_exists($backupPath)) {
return;
}
@unlink($backup_path);
log_message('info', "Removed $backup_path");
@chmod($configPath, 0640);
$configFile = file_get_contents($backupPath);
@file_put_contents($configPath, $configFile);
log_message('info', "Restored $configPath from backup");
}
/**
* @return void
*/
function removeBackup(): void
{
$backupPath = WRITEPATH . '/backup/.env.bak';
if (!file_exists($backupPath)) {
return;
}
@unlink($backupPath);
log_message('info', "Removed $backupPath");
}
+5 -5
View File
@@ -61,7 +61,7 @@ function transform_headers(array $headers, bool $readonly = false, bool $editabl
}
function sales_headers(): array
function salesHeaders(): array
{
return [
['sale_id' => lang('Common.id')],
@@ -79,7 +79,7 @@ function sales_headers(): array
*/
function get_sales_manage_table_headers(): string
{
$headers = sales_headers();
$headers = salesHeaders();
$config = config(OSPOS::class)->settings;
if ($config['invoice_enable']) {
@@ -95,7 +95,7 @@ function get_sales_manage_table_headers(): string
/**
* Get the html data row for the sales
*/
function get_sale_data_row(object $sale): array
function getSaleDataRow(object $sale): array
{
$uri = current_url(true);
$controller = $uri->getSegment(1);
@@ -145,7 +145,7 @@ function get_sale_data_row(object $sale): array
/**
* Get the html data last row for the sales
*/
function get_sale_data_last_row(ResultInterface $sales): array
function getSaleDataLastRow(ResultInterface $sales): array
{
$sum_amount_due = 0;
$sum_amount_tendered = 0;
@@ -169,7 +169,7 @@ function get_sale_data_last_row(ResultInterface $sales): array
/**
* Get the sales payments summary
*/
function get_sales_manage_payments_summary(array $payments): string
function getSalesManagePaymentsSummary(array $payments): string
{
$table = '<div id="report_summary">';
$total = 0;
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "المعلومات الأساسية للموظف",
"cannot_be_deleted" => "لايمكن حذف الموظفين ، واحد أو أكثر من المظفين قام بإجراء مبيعات :).",
"change_employee" => "",
"change_password" => "تغيير كلمة المرور",
"clerk" => "",
"commission" => "",
"confirm_delete" => "هل أنت متأكد أنك تريد حذف الموظفين المختارين؟",
"confirm_restore" => "هل انت متاكد من استعادة الموظفين المحددين؟",
"current_password" => "كلمة المرور الحالية",
"current_password_invalid" => "كلمة المرور الحالية غير صحيحة.",
"employee" => "موظف",
"error_adding_updating" => "خطاء فى إضافة/تعديل موظف.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "لايمكن حذف المستخدم admin الخاص بنسخة العرض.",
"error_updating_demo_admin" => "لايمكن تغيير بيانات المستخدم admin الخاص بنسخة العرض.",
"language" => "اللغة",
"login_info" => "معلومات دخول الموظف",
"manager" => "",
"new" => "موظف جديد",
"none_selected" => "لم تختار أى من الموظفين للحذف.",
"one_or_multiple" => "موظف/موظفين",
"password" => "كلمة السر",
"password_minlength" => "كلمة السر يجب أن تكون 8 حروف على الأقل.",
"password_must_match" => "كلمتى السر لا تتطابقان.",
"password_not_must_match" => "كلمة المرور الحالية والجديدة يجب ان يكونو فريدين.",
"password_required" => "كلمة السر مطلوبة.",
"permission_desc" => "قم بإضافة الصلاحيات بلإختيار من الأسفل.",
"permission_info" => "اذونات المستخدمين",
"repeat_password" => "كلمة السر مرة اخرى",
"subpermission_required" => "يجب إختيار صلاحية واحدة على الأقل لكل قسم.",
"successful_adding" => "لقد تم إضافة الموظف بنجاح.",
"successful_change_password" => "تم تغيير كلمة المرور بنجاح.",
"successful_deleted" => "لقد تم حذف الموظف بنجاح",
"successful_updating" => "لقد تم تحديث بيانات الموظف بنجاح",
"system_language" => "لغة النظام",
"unsuccessful_change_password" => "فشل في تغيير كلمة المرور.",
"update" => "تحديث بيانات موظف",
"username" => "اسم المستخدم",
"username_duplicate" => "حساب المحدد هو موجود في قاعدة البيانات. نرجوا استخدام اسم حساب مختلف.",
"username_minlength" => "اسم المستخدم يجب أن يكون 5 حروف على الأقل.",
"username_required" => "اسم المستخدم مطلوب.",
'administrator' => '',
'basic_information' => 'المعلومات الأساسية للموظف',
'cannot_be_deleted' => 'لايمكن حذف الموظفين ، واحد أو أكثر من المظفين قام بإجراء مبيعات :).',
'change_employee' => '',
'change_password' => 'تغيير كلمة المرور',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'هل أنت متأكد أنك تريد حذف الموظفين المختارين؟',
'confirm_restore' => 'هل انت متاكد من استعادة الموظفين المحددين؟',
'current_password' => 'كلمة المرور الحالية',
'current_password_invalid' => 'كلمة المرور الحالية غير صحيحة.',
'employee' => 'موظف',
'error_adding_updating' => 'خطاء فى إضافة/تعديل موظف.',
'error_cannot_remove_own_minimum_grant' => 'لا يمكنك إزالة الحد الأدنى من صلاحيات الوصول للوحدات الخاصة بك.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'لايمكن حذف المستخدم admin الخاص بنسخة العرض.',
'error_grant_change_disallowed' => 'تم تعطيل تغييرات المنح في هذه النسخة التجريبية.',
'error_password_change_disallowed' => 'تم تعطيل تغييرات كلمة المرور في هذه النسخة التجريبية.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'لايمكن تغيير بيانات المستخدم admin الخاص بنسخة العرض.',
'language' => 'اللغة',
'login_info' => 'معلومات دخول الموظف',
'manager' => '',
'new' => 'موظف جديد',
'none_selected' => 'لم تختار أى من الموظفين للحذف.',
'one_or_multiple' => 'موظف/موظفين',
'password' => 'كلمة السر',
'password_minlength' => 'كلمة السر يجب أن تكون 8 حروف على الأقل.',
'password_must_match' => 'كلمتى السر لا تتطابقان.',
'password_not_must_match' => 'كلمة المرور الحالية والجديدة يجب ان يكونو فريدين.',
'password_required' => 'كلمة السر مطلوبة.',
'permission_desc' => 'قم بإضافة الصلاحيات بلإختيار من الأسفل.',
'permission_info' => 'اذونات المستخدمين',
'repeat_password' => 'كلمة السر مرة اخرى',
'subpermission_required' => 'يجب إختيار صلاحية واحدة على الأقل لكل قسم.',
'successful_adding' => 'لقد تم إضافة الموظف بنجاح.',
'successful_change_password' => 'تم تغيير كلمة المرور بنجاح.',
'successful_deleted' => 'لقد تم حذف الموظف بنجاح',
'successful_updating' => 'لقد تم تحديث بيانات الموظف بنجاح',
'system_language' => 'لغة النظام',
'unsuccessful_change_password' => 'فشل في تغيير كلمة المرور.',
'update' => 'تحديث بيانات موظف',
'username' => 'اسم المستخدم',
'username_duplicate' => 'حساب المحدد هو موجود في قاعدة البيانات. نرجوا استخدام اسم حساب مختلف.',
'username_minlength' => 'اسم المستخدم يجب أن يكون 5 حروف على الأقل.',
'username_required' => 'اسم المستخدم مطلوب.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "المعلومات الأساسية للموظف",
"cannot_be_deleted" => "لايمكن حذف الموظفين ، واحد أو أكثر من المظفين قام بإجراء مبيعات :).",
"change_employee" => "",
"change_password" => "تغيير كلمة المرور",
"clerk" => "",
"commission" => "",
"confirm_delete" => "هل أنت متأكد أنك تريد حذف الموظفين المختارين؟",
"confirm_restore" => "هل انت متاكد من استعادة الموظفين المحددين؟",
"current_password" => "كلمة المرور الحالية",
"current_password_invalid" => "كلمة المرور الحالية غير صحيحة.",
"employee" => "موظف",
"error_adding_updating" => "خطاء فى إضافة/تعديل موظف.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "لايمكن حذف المستخدم admin الخاص بنسخة العرض.",
"error_updating_demo_admin" => "لايمكن تغيير بيانات المستخدم admin الخاص بنسخة العرض.",
"language" => "اللغة",
"login_info" => "معلومات دخول الموظف",
"manager" => "",
"new" => "موظف جديد",
"none_selected" => "لم تختار أى من الموظفين للحذف.",
"one_or_multiple" => "موظف/موظفين",
"password" => "كلمة السر",
"password_minlength" => "كلمة السر يجب أن تكون 8 حروف على الأقل.",
"password_must_match" => "كلمتى السر لا تتطابقان.",
"password_not_must_match" => "كلمة المرور الحالية والجديدة يجب ان يكونو فريدين.",
"password_required" => "كلمة السر مطلوبة.",
"permission_desc" => "قم بإضافة الصلاحيات بلإختيار من الأسفل.",
"permission_info" => "اذونات المستخدمين",
"repeat_password" => "كلمة السر مرة اخرى",
"subpermission_required" => "يجب إختيار صلاحية واحدة على الأقل لكل قسم.",
"successful_adding" => "لقد تم إضافة الموظف بنجاح.",
"successful_change_password" => "تم تغيير كلمة المرور بنجاح.",
"successful_deleted" => "لقد تم حذف الموظف بنجاح",
"successful_updating" => "لقد تم تحديث بيانات الموظف بنجاح",
"system_language" => "لغة النظام",
"unsuccessful_change_password" => "فشل في تغيير كلمة المرور.",
"update" => "تحديث بيانات موظف",
"username" => "اسم المستخدم",
"username_duplicate" => "حساب المحدد هو موجود في قاعدة البيانات. نرجوا استخدام اسم حساب مختلف.",
"username_minlength" => "اسم المستخدم يجب أن يكون 5 حروف على الأقل.",
"username_required" => "اسم المستخدم مطلوب.",
'administrator' => '',
'basic_information' => 'المعلومات الأساسية للموظف',
'cannot_be_deleted' => 'لايمكن حذف الموظفين ، واحد أو أكثر من المظفين قام بإجراء مبيعات :).',
'change_employee' => '',
'change_password' => 'تغيير كلمة المرور',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'هل أنت متأكد أنك تريد حذف الموظفين المختارين؟',
'confirm_restore' => 'هل انت متاكد من استعادة الموظفين المحددين؟',
'current_password' => 'كلمة المرور الحالية',
'current_password_invalid' => 'كلمة المرور الحالية غير صحيحة.',
'employee' => 'موظف',
'error_adding_updating' => 'خطاء فى إضافة/تعديل موظف.',
'error_cannot_remove_own_minimum_grant' => 'ما فيك تشيل الحد الأدنى من صلاحيات الوصول للموديولات تبعتك.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'لايمكن حذف المستخدم admin الخاص بنسخة العرض.',
'error_grant_change_disallowed' => 'تم تعطيل تغييرات المنح في هذه النسخة التجريبية.',
'error_password_change_disallowed' => 'تم تعطيل تغييرات كلمة المرور في هذه النسخة التجريبية.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'لايمكن تغيير بيانات المستخدم admin الخاص بنسخة العرض.',
'language' => 'اللغة',
'login_info' => 'معلومات دخول الموظف',
'manager' => '',
'new' => 'موظف جديد',
'none_selected' => 'لم تختار أى من الموظفين للحذف.',
'one_or_multiple' => 'موظف/موظفين',
'password' => 'كلمة السر',
'password_minlength' => 'كلمة السر يجب أن تكون 8 حروف على الأقل.',
'password_must_match' => 'كلمتى السر لا تتطابقان.',
'password_not_must_match' => 'كلمة المرور الحالية والجديدة يجب ان يكونو فريدين.',
'password_required' => 'كلمة السر مطلوبة.',
'permission_desc' => 'قم بإضافة الصلاحيات بلإختيار من الأسفل.',
'permission_info' => 'اذونات المستخدمين',
'repeat_password' => 'كلمة السر مرة اخرى',
'subpermission_required' => 'يجب إختيار صلاحية واحدة على الأقل لكل قسم.',
'successful_adding' => 'لقد تم إضافة الموظف بنجاح.',
'successful_change_password' => 'تم تغيير كلمة المرور بنجاح.',
'successful_deleted' => 'لقد تم حذف الموظف بنجاح',
'successful_updating' => 'لقد تم تحديث بيانات الموظف بنجاح',
'system_language' => 'لغة النظام',
'unsuccessful_change_password' => 'فشل في تغيير كلمة المرور.',
'update' => 'تحديث بيانات موظف',
'username' => 'اسم المستخدم',
'username_duplicate' => 'حساب المحدد هو موجود في قاعدة البيانات. نرجوا استخدام اسم حساب مختلف.',
'username_minlength' => 'اسم المستخدم يجب أن يكون 5 حروف على الأقل.',
'username_required' => 'اسم المستخدم مطلوب.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Məlumat",
"cannot_be_deleted" => "Seçilmiş əməkdaş (lar) silinə bilməz, bir və ya birdən çox əməkdaş satışlar edib, əks halda siz öz heasabınızı silməyə çalışırsınız.",
"change_employee" => "",
"change_password" => "Şifrəni Dəyiş",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Siz əminsiniz ki seçilmiş əməkdaşları silmək istəyirsiniz?",
"confirm_restore" => "Seçilmiş əməkdaşı (lar) yenidən bərpa etməyinizə əminsinizmi?",
"current_password" => "İndiki Şifrə",
"current_password_invalid" => "Hazirki Şifrə düzgün deyil.",
"employee" => "Əməkdaş",
"error_adding_updating" => "Əməkdaş əlavə etməsk və ya yeniləməsi baş vermədi.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Demo administrator istifadəçisini silə bilməzsiniz.",
"error_updating_demo_admin" => "Demo administrator istifadəçisini dəyişə bilməzsiniz.",
"language" => "Dil",
"login_info" => "Daxil Ol",
"manager" => "",
"new" => "Yeni Əməkdaş",
"none_selected" => "Silmək üçün heç bir işçi (lər) seçməmisiniz.",
"one_or_multiple" => "İşçi (lər)",
"password" => "Şifrə",
"password_minlength" => "Şifrə ən azı 8 simvol olmalıdır.",
"password_must_match" => "Şifrələr uyğun gəlmir.",
"password_not_must_match" => "Hazırki şifrə və yeni şifrə unikal olmalıdır.",
"password_required" => "Şifrə tələb olunur.",
"permission_desc" => "Modullara giriş imkanı vermək üçün aşağıdakı qutuları yoxlayın.",
"permission_info" => "İcazələr",
"repeat_password" => "Şifrəni yenidən təkrar edin",
"subpermission_required" => "Hər bir modul üçün ən azı bir qrant əlavə edin.",
"successful_adding" => "Əməkdaş müvəffəqiyyətə əlavə olundu.",
"successful_change_password" => "Şifrə müvəffəqiyyətlə dəyişildi.",
"successful_deleted" => "Siz uğurla sildiniz",
"successful_updating" => "Siz uğurla əməkdaşı yenilədiniz",
"system_language" => "Sistem Dili",
"unsuccessful_change_password" => "Şifrə dəyişməsi uğursuz oldu.",
"update" => "İşçini yeniləyin",
"username" => "İstifadəçi Adı",
"username_duplicate" => "",
"username_minlength" => "İstifadəçi adı ən azı 5 simvol olmalıdır.",
"username_required" => "İstifadəçi adı tələb olunan sahədir.",
'administrator' => '',
'basic_information' => 'Məlumat',
'cannot_be_deleted' => 'Seçilmiş əməkdaş (lar) silinə bilməz, bir və ya birdən çox əməkdaş satışlar edib, əks halda siz öz hesabınızı silməyə çalışırsınız.',
'change_employee' => '',
'change_password' => 'Şifrəni Dəyiş',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Siz əminsiniz ki seçilmiş əməkdaşları silmək istəyirsiniz?',
'confirm_restore' => 'Seçilmiş əməkdaşı (lar) yenidən bərpa etməyinizə əminsinizmi?',
'current_password' => 'İndiki Şifrə',
'current_password_invalid' => 'Hazirki Şifrə düzgün deyil.',
'employee' => 'Əməkdaş',
'error_adding_updating' => 'Əməkdaş əlavə etməsk və ya yeniləməsi baş vermədi.',
'error_cannot_remove_own_minimum_grant' => 'Öz minimum modul giriş qrantlarınızı silə bilməzsiniz.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'Demo administrator istifadəçisini silə bilməzsiniz.',
'error_grant_change_disallowed' => 'Bu demodan icazə dəyişiklikləri deaktivdir.',
'error_password_change_disallowed' => 'Bu demodan şifrə dəyişiklikləri deaktivdir.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'Demo administrator istifadəçisini dəyişə bilməzsiniz.',
'language' => 'Dil',
'login_info' => 'Daxil Ol',
'manager' => '',
'new' => 'Yeni Əməkdaş',
'none_selected' => 'Silmək üçün heç bir işçi (lər) seçməmisiniz.',
'one_or_multiple' => 'İşçi (lər)',
'password' => 'Şifrə',
'password_minlength' => 'Şifrə ən azı 8 simvol olmalıdır.',
'password_must_match' => 'Şifrələr uyğun gəlmir.',
'password_not_must_match' => 'Hazırki şifrə və yeni şifrə unikal olmalıdır.',
'password_required' => 'Şifrə tələb olunur.',
'permission_desc' => 'Modullara giriş imkanı vermək üçün aşağıdakı qutuları yoxlayın.',
'permission_info' => 'İcazələr',
'repeat_password' => 'Şifrəni yenidən təkrar edin',
'subpermission_required' => 'Hər bir modul üçün ən azı bir qrant əlavə edin.',
'successful_adding' => 'Əməkdaş müvəffəqiyyətə əlavə olundu.',
'successful_change_password' => 'Şifrə müvəffəqiyyətlə dəyişildi.',
'successful_deleted' => 'Siz uğurla sildiniz',
'successful_updating' => 'Siz uğurla əməkdaşı yenilədiniz',
'system_language' => 'Sistem Dili',
'unsuccessful_change_password' => 'Şifrə dəyişməsi uğursuz oldu.',
'update' => 'İşçini yeniləyin',
'username' => 'İstifadəçi Adı',
'username_duplicate' => '',
'username_minlength' => 'İstifadəçi adı ən azı 5 simvol olmalıdır.',
'username_required' => 'İstifadəçi adı tələb olunan sahədir.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Информация",
"cannot_be_deleted" => "Невъзможно е да изтриете избрани служители, един или повече от тях са обработили продажби или се опитвате да изтриете профила си.",
"change_employee" => "",
"change_password" => "Промяна на паролата",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Наистина ли искате да изтриете избрания служител (и)?",
"confirm_restore" => "Наистина ли искате да възстановите избраните служители?",
"current_password" => "Настояща парола",
"current_password_invalid" => "Текущата парола е невалидна.",
"employee" => "Служител",
"error_adding_updating" => "Добавянето или актуализирането на служителите е неуспешно.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Не може да изтриете Пробният Администратор.",
"error_updating_demo_admin" => "Не може да промените Пробният Администратор.",
"language" => "Език",
"login_info" => "Login",
"manager" => "",
"new" => "Нов служител",
"none_selected" => "Не сте избрали служител (и), който да изтриете.",
"one_or_multiple" => "служител (и)",
"password" => "Password",
"password_minlength" => "Паролата трябва да е с дължина най-малко 8 знака.",
"password_must_match" => "Паролите не съвпадат.",
"password_not_must_match" => "Текущата парола и новата парола трябва да са уникални.",
"password_required" => "Изисква се парола.",
"permission_desc" => "Поставете отметка в квадратчетата по-долу, за да получите достъп до модулите.",
"permission_info" => "Разрешения",
"repeat_password" => "Паролата отново",
"subpermission_required" => "Добавете поне един грант за всеки модул.",
"successful_adding" => "Служителя е добавен успешно.",
"successful_change_password" => "Промяна на паролата е успешна.",
"successful_deleted" => "Вие успешно сте изтрили",
"successful_updating" => "Успешно сте актуализирали служител",
"system_language" => "Системен език",
"unsuccessful_change_password" => "Промяната на паролата се провали.",
"update" => "Актуализиране на служителя",
"username" => "Потребител",
"username_duplicate" => "",
"username_minlength" => "Потребителското име трябва да е с дължина най-малко 5 знака.",
"username_required" => "Потребителското име е задължително поле.",
'administrator' => '',
'basic_information' => 'Информация',
'cannot_be_deleted' => 'Невъзможно е да изтриете избрани служители, един или повече от тях са обработили продажби или се опитвате да изтриете профила си.',
'change_employee' => '',
'change_password' => 'Промяна на паролата',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Наистина ли искате да изтриете избрания служител (и)?',
'confirm_restore' => 'Наистина ли искате да възстановите избраните служители?',
'current_password' => 'Настояща парола',
'current_password_invalid' => 'Текущата парола е невалидна.',
'employee' => 'Служител',
'error_adding_updating' => 'Добавянето или актуализирането на служителите е неуспешно.',
'error_cannot_remove_own_minimum_grant' => 'Не можете да премахнете минималните си права за достъп до модулите.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'Не може да изтриете Пробният Администратор.',
'error_grant_change_disallowed' => 'Промените на правата са заключени в това демо.',
'error_password_change_disallowed' => 'Промените на пароли са заключени в това демо.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'Не може да промените Пробният Администратор.',
'language' => 'Език',
'login_info' => 'Login',
'manager' => '',
'new' => 'Нов служител',
'none_selected' => 'Не сте избрали служител (и), който да изтриете.',
'one_or_multiple' => 'служител (и)',
'password' => 'Password',
'password_minlength' => 'Паролата трябва да е с дължина най-малко 8 знака.',
'password_must_match' => 'Паролите не съвпадат.',
'password_not_must_match' => 'Текущата парола и новата парола трябва да са уникални.',
'password_required' => 'Изисква се парола.',
'permission_desc' => 'Поставете отметка в квадратчетата по-долу, за да получите достъп до модулите.',
'permission_info' => 'Разрешения',
'repeat_password' => 'Паролата отново',
'subpermission_required' => 'Добавете поне един грант за всеки модул.',
'successful_adding' => 'Служителя е добавен успешно.',
'successful_change_password' => 'Промяна на паролата е успешна.',
'successful_deleted' => 'Вие успешно сте изтрили',
'successful_updating' => 'Успешно сте актуализирали служител',
'system_language' => 'Системен език',
'unsuccessful_change_password' => 'Промяната на паролата се провали.',
'update' => 'Актуализиране на служителя',
'username' => 'Потребител',
'username_duplicate' => '',
'username_minlength' => 'Потребителското име трябва да е с дължина най-малко 5 знака.',
'username_required' => 'Потребителското име е задължително поле.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Informacije",
"cannot_be_deleted" => "Nije moguće izbrisati odabrane zaposlenike, jedan ili više njih su obradili prodaju ili pokušavate izbrisati svoj nalog.",
"change_employee" => "",
"change_password" => "Promijeni lozinku",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Da li ste zaista sigurni da želite da izbrišete izabranog zaposlenika?",
"confirm_restore" => "Da li ste sigurni da želite da vratite izabranog zaposlenika?",
"current_password" => "Trenutna lozinka",
"current_password_invalid" => "Trenutna lozinka je nevažeća.",
"employee" => "Zaposlenik",
"error_adding_updating" => "Dodavanje ili ažuriranje zaposlenika nije uspjelo.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Ne možete izbrisati demo korisnika administratora.",
"error_updating_demo_admin" => "Ne možete promijeniti korisnika demo administratora.",
"language" => "Jezik",
"login_info" => "Prijava",
"manager" => "",
"new" => "Novi zaposlenik",
"none_selected" => "Nije izabran nijedan zaposlenik za brisanje.",
"one_or_multiple" => "Zaposlenici",
"password" => "Lozinka",
"password_minlength" => "Lozinka mora imati najmanje 8 znakova.",
"password_must_match" => "Lozinke se ne podudaraju.",
"password_not_must_match" => "Trenutna lozinka i nova lozinka moraju biti jedinstvene.",
"password_required" => "Lozinka je obavezna.",
"permission_desc" => "Označite polja u nastavku da biste odobrili pristup modulima.",
"permission_info" => "Dozvole",
"repeat_password" => "Ponovite lozinku",
"subpermission_required" => "Dodajte najmanje jedno odobrenje za svaki modul.",
"successful_adding" => "Uspješno ste dodali zaposlenika.",
"successful_change_password" => "Promjena lozinke je uspješna.",
"successful_deleted" => "Uspješno ste izbrisali zaposlenika",
"successful_updating" => "Uspješno ste ažurirali zaposlenika",
"system_language" => "Sistemski jezik",
"unsuccessful_change_password" => "Promjena lozinke nije uspjela.",
"update" => "Ažuriraj zaposlenika",
"username" => "Korisničko ime",
"username_duplicate" => "Korisničko ime zaposlenog je već u upotrebi. Molimo izaberite drugo.",
"username_minlength" => "Korisničko ime mora imati najmanje 5 znakova.",
"username_required" => "Korisničko ime je obavezno polje.",
'administrator' => '',
'basic_information' => 'Informacije',
'cannot_be_deleted' => 'Nije moguće izbrisati odabrane zaposlenike, jedan ili više njih su obradili prodaju ili pokušavate izbrisati svoj nalog.',
'change_employee' => '',
'change_password' => 'Promijeni lozinku',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Da li ste zaista sigurni da želite da izbrišete izabranog zaposlenika?',
'confirm_restore' => 'Da li ste sigurni da želite da vratite izabranog zaposlenika?',
'current_password' => 'Trenutna lozinka',
'current_password_invalid' => 'Trenutna lozinka je nevažeća.',
'employee' => 'Zaposlenik',
'error_adding_updating' => 'Dodavanje ili ažuriranje zaposlenika nije uspjelo.',
'error_cannot_remove_own_minimum_grant' => 'Ne možete ukloniti sopstvena minimalna odobrenja pristupa modulima.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'Ne možete izbrisati demo korisnika administratora.',
'error_grant_change_disallowed' => 'Izmene dozvola su onemogućene u ovoj demo verziji.',
'error_password_change_disallowed' => 'Izmene lozinke su onemogućene u ovoj demo verziji.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'Ne možete promijeniti korisnika demo administratora.',
'language' => 'Jezik',
'login_info' => 'Prijava',
'manager' => '',
'new' => 'Novi zaposlenik',
'none_selected' => 'Nije izabran nijedan zaposlenik za brisanje.',
'one_or_multiple' => 'Zaposlenici',
'password' => 'Lozinka',
'password_minlength' => 'Lozinka mora imati najmanje 8 znakova.',
'password_must_match' => 'Lozinke se ne podudaraju.',
'password_not_must_match' => 'Trenutna lozinka i nova lozinka moraju biti jedinstvene.',
'password_required' => 'Lozinka je obavezna.',
'permission_desc' => 'Označite polja u nastavku da biste odobrili pristup modulima.',
'permission_info' => 'Dozvole',
'repeat_password' => 'Ponovite lozinku',
'subpermission_required' => 'Dodajte najmanje jedno odobrenje za svaki modul.',
'successful_adding' => 'Uspješno ste dodali zaposlenika.',
'successful_change_password' => 'Promjena lozinke je uspješna.',
'successful_deleted' => 'Uspješno ste izbrisali zaposlenika',
'successful_updating' => 'Uspješno ste ažurirali zaposlenika',
'system_language' => 'Sistemski jezik',
'unsuccessful_change_password' => 'Promjena lozinke nije uspjela.',
'update' => 'Ažuriraj zaposlenika',
'username' => 'Korisničko ime',
'username_duplicate' => 'Korisničko ime zaposlenog je već u upotrebi. Molimo izaberite drugo.',
'username_minlength' => 'Korisničko ime mora imati najmanje 5 znakova.',
'username_required' => 'Korisničko ime je obavezno polje.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
'administrator' => "",
'basic_information' => "زانیاری",
'cannot_be_deleted' => "ناتوانیت کارمەند(ەکان)ی هەڵبژێردراو بسڕیتەوە، یەکێک یان زیاتر لەوانە فرۆشتنی پرۆسێس کردووە یان تۆ هەوڵی سڕینەوەی هەژمارەکەت دەدەیت.",
'change_employee' => "",
'change_password' => "وشەی نهێنی بگۆڕە",
'clerk' => "",
'commission' => "",
'confirm_delete' => "‌ئایا دڵنیای کە دەتەوێت کارمەند(ەکان)ی هەڵبژێردراو بسڕیتەوە؟",
'confirm_restore' => "ئایا دڵنیای کە دەتەوێت کارمەند(ەکان)ی هەڵبژێردراو بگەڕێنیتەوە؟",
'current_password' => "وشەی نهێنی ئێستا",
'current_password_invalid' => "وشەی نهێنی ئێستا نادروستە.",
'employee' => "فەرمانبەر",
'error_adding_updating' => "زیادکردن یان نوێکردنەوەی کارمەند سەرکەوتوو نەبوو.",
'error_deleting_admin' => "",
'error_updating_admin' => "",
'error_deleting_demo_admin' => "ناتوانیت بەکارهێنەری ئەدمینی تاقیکردنەوەیی بسڕیتەوە.",
'error_updating_demo_admin' => "ناتوانیت بەکارهێنەری ئەدمین تاقیکردنەوەیی بگۆڕیت.",
'language' => "زمان",
'login_info' => "چوونەژوورەوە",
'manager' => "",
'new' => "فەرمانبەری نوێ",
'none_selected' => "هیچ فەرمانبەرێک(کان)ت هەڵنەبژاردووە بۆ سڕینەوە.",
'one_or_multiple' => "فەرمانبەر(ان)",
'password' => "وشەی نهێنی",
'password_minlength' => "وشەی نهێنی دەبێت بەلایەنی کەمەوە ٨ پیت بێت.",
'password_must_match' => "وشەی نهێنییەکان هاوشێوە نین.",
'password_not_must_match' => "وشەی نهێنی ئێستا و وشەی نهێنی نوێ دەبێت بێهاوتابن.",
'password_required' => "وشەی نهێنی پێویستە.",
'permission_desc' => "چوارگۆشەکانی خوارەوە دیاری بکە بۆ پێدانی دەستگەیشتن بە مۆدیولەکان.",
'permission_info' => "ڕێپێدانەکان",
'repeat_password' => "دووبارە وشەی نهێنی",
'subpermission_required' => "بۆ هەر مۆدیولێک بەلایەنی کەمەوە یەک پێدان زیاد بکە.",
'successful_adding' => "زیادکردنی فەرمانبەر سەرکەوتوو بوو.",
'successful_change_password' => "گۆڕینی وشەی نهێنی سەرکەوتوو بوو.",
'successful_deleted' => "بەسەرکەوتووی سڕیتەوە",
'successful_updating' => "بەسەرکەوتوویی فەرمانبەرەکەت نوێ کردۆتەوە",
'system_language' => "زمانی سیستەم",
'unsuccessful_change_password' => "گۆڕینی وشەی نهێنی سەرکەوتوو نەبوو.",
'update' => "فەرمانبەر نوێبکەوە",
'username' => "ناوی بەکارهێنەر",
'username_duplicate' => "ناوی بەکارهێنەری فەرمانبەر پێشتر بەکارهاتووە. تکایە یەکێکی تر هەڵبژێرە.",
'username_minlength' => "ناوی بەکارهێنەر دەبێت لانیکەم ٥ پیت درێژ بێت.",
'username_required' => "ناوی بەکارهێنەر خانەیەکی پێویستە.",
'administrator' => '',
'basic_information' => 'زانیاری',
'cannot_be_deleted' => 'ناتوانیت کارمەند(ەکان)ی هەڵبژێردراو بسڕیتەوە، یەکێک یان زیاتر لەوانە فرۆشتنی پرۆسێس کردووە یان تۆ هەوڵی سڕینەوەی هەژمارەکەت دەدەیت.',
'change_employee' => '',
'change_password' => 'وشەی نهێنی بگۆڕە',
'clerk' => '',
'commission' => '',
'confirm_delete' => '‌ئایا دڵنیای کە دەتەوێت کارمەند(ەکان)ی هەڵبژێردراو بسڕیتەوە؟',
'confirm_restore' => 'ئایا دڵنیای کە دەتەوێت کارمەند(ەکان)ی هەڵبژێردراو بگەڕێنیتەوە؟',
'current_password' => 'وشەی نهێنی ئێستا',
'current_password_invalid' => 'وشەی نهێنی ئێستا نادروستە.',
'employee' => 'فەرمانبەر',
'error_adding_updating' => 'زیادکردن یان نوێکردنەوەی کارمەند سەرکەوتوو نەبوو.',
'error_cannot_remove_own_minimum_grant' => 'ناتوانیت کەمترین پێدانی دەستگەیشتنی مۆدیولەکانی خۆت لاببەیت.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'ناتوانیت بەکارهێنەری ئەدمینی تاقیکردنەوەیی بسڕیتەوە.',
'error_grant_change_disallowed' => 'گۆڕینی دەستگەیشتن لە ئەم دیموێدا ناتوانی لێدرایت.',
'error_password_change_disallowed' => 'گۆڕینی وشەی نهێنی لە ئەم دیموێدا ناتوانی لێدرایت.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'ناتوانیت بەکارهێنەری ئەدمین تاقیکردنەوەیی بگۆڕیت.',
'language' => 'زمان',
'login_info' => 'چوونەژوورەوە',
'manager' => '',
'new' => 'فەرمانبەری نوێ',
'none_selected' => 'هیچ فەرمانبەرێک(کان)ت هەڵنەبژاردووە بۆ سڕینەوە.',
'one_or_multiple' => 'فەرمانبەر(ان)',
'password' => 'وشەی نهێنی',
'password_minlength' => 'وشەی نهێنی دەبێت بەلایەنی کەمەوە ٨ پیت بێت.',
'password_must_match' => 'وشەی نهێنییەکان هاوشێوە نین.',
'password_not_must_match' => 'وشەی نهێنی ئێستا و وشەی نهێنی نوێ دەبێت بێهاوتابن.',
'password_required' => 'وشەی نهێنی پێویستە.',
'permission_desc' => 'چوارگۆشەکانی خوارەوە دیاری بکە بۆ پێدانی دەستگەیشتن بە مۆدیولەکان.',
'permission_info' => 'ڕێپێدانەکان',
'repeat_password' => 'دووبارە وشەی نهێنی',
'subpermission_required' => 'بۆ هەر مۆدیولێک بەلایەنی کەمەوە یەک پێدان زیاد بکە.',
'successful_adding' => 'زیادکردنی فەرمانبەر سەرکەوتوو بوو.',
'successful_change_password' => 'گۆڕینی وشەی نهێنی سەرکەوتوو بوو.',
'successful_deleted' => 'بەسەرکەوتووی سڕیتەوە',
'successful_updating' => 'بەسەرکەوتوویی فەرمانبەرەکەت نوێ کردۆتەوە',
'system_language' => 'زمانی سیستەم',
'unsuccessful_change_password' => 'گۆڕینی وشەی نهێنی سەرکەوتوو نەبوو.',
'update' => 'فەرمانبەر نوێبکەوە',
'username' => 'ناوی بەکارهێنەر',
'username_duplicate' => 'ناوی بەکارهێنەری فەرمانبەر پێشتر بەکارهاتووە. تکایە یەکێکی تر هەڵبژێرە.',
'username_minlength' => 'ناوی بەکارهێنەر دەبێت لانیکەم ٥ پیت درێژ بێت.',
'username_required' => 'ناوی بەکارهێنەر خانەیەکی پێویستە.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "",
"cannot_be_deleted" => "",
"change_employee" => "",
"change_password" => "",
"clerk" => "",
"commission" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"current_password" => "",
"current_password_invalid" => "",
"employee" => "",
"error_adding_updating" => "",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "",
"error_updating_demo_admin" => "",
"language" => "",
"login_info" => "",
"manager" => "",
"new" => "",
"none_selected" => "",
"one_or_multiple" => "",
"password" => "",
"password_minlength" => "",
"password_must_match" => "",
"password_not_must_match" => "",
"password_required" => "",
"permission_desc" => "",
"permission_info" => "",
"repeat_password" => "",
"subpermission_required" => "",
"successful_adding" => "",
"successful_change_password" => "",
"successful_deleted" => "",
"successful_updating" => "",
"system_language" => "",
"unsuccessful_change_password" => "",
"update" => "",
"username" => "",
"username_duplicate" => "",
"username_minlength" => "",
"username_required" => "",
'administrator' => '',
'basic_information' => '',
'cannot_be_deleted' => '',
'change_employee' => '',
'change_password' => '',
'clerk' => '',
'commission' => '',
'confirm_delete' => '',
'confirm_restore' => '',
'current_password' => '',
'current_password_invalid' => '',
'employee' => '',
'error_adding_updating' => '',
'error_cannot_remove_own_minimum_grant' => 'Nemůžete odebrat svá vlastní minimální oprávnění pro přístup k modulům.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => '',
'error_grant_change_disallowed' => 'Změny oprávnění jsou v tomto demonu zakázány.',
'error_password_change_disallowed' => 'Změny hesla jsou v tomto demonu zakázány.',
'error_updating_admin' => '',
'error_updating_demo_admin' => '',
'language' => '',
'login_info' => '',
'manager' => '',
'new' => '',
'none_selected' => '',
'one_or_multiple' => '',
'password' => '',
'password_minlength' => '',
'password_must_match' => '',
'password_not_must_match' => '',
'password_required' => '',
'permission_desc' => '',
'permission_info' => '',
'repeat_password' => '',
'subpermission_required' => '',
'successful_adding' => '',
'successful_change_password' => '',
'successful_deleted' => '',
'successful_updating' => '',
'system_language' => '',
'unsuccessful_change_password' => '',
'update' => '',
'username' => '',
'username_duplicate' => '',
'username_minlength' => '',
'username_required' => '',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Information",
"cannot_be_deleted" => "Unable to delete selected employee(s), one or more of the has processed sales or you are trying to delete your account.",
"change_employee" => "",
"change_password" => "Change Password",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Are you sure you want to delete the selected employee(s)?",
"confirm_restore" => "Are you sure you want to restore selected employee(s)?",
"current_password" => "Current Password",
"current_password_invalid" => "Current Password is invalid.",
"employee" => "Employee",
"error_adding_updating" => "Employee add or update failed.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "You can not delete the demo admin user.",
"error_updating_demo_admin" => "You can not change the demo admin user.",
"language" => "Language",
"login_info" => "Login",
"manager" => "",
"new" => "New Employee",
"none_selected" => "You have not selected any employee(s) to delete.",
"one_or_multiple" => "employee(s)",
"password" => "Password",
"password_minlength" => "Password must be at least 8 characters in length.",
"password_must_match" => "Passwords do not match.",
"password_not_must_match" => "Current password and new password must be unique.",
"password_required" => "Password is required.",
"permission_desc" => "Check the boxes below to grant access to modules.",
"permission_info" => "Permissions",
"repeat_password" => "Password Again",
"subpermission_required" => "Add at least one grant for each module.",
"successful_adding" => "Employee add successful.",
"successful_change_password" => "Password change successful.",
"successful_deleted" => "You have successfully deleted",
"successful_updating" => "You have successfully updated employee",
"system_language" => "System Language",
"unsuccessful_change_password" => "Password change failed.",
"update" => "Update Employee",
"username" => "Username",
"username_duplicate" => "",
"username_minlength" => "Username must be at least 5 characters in length.",
"username_required" => "Username is a required field.",
'administrator' => '',
'basic_information' => 'Information',
'cannot_be_deleted' => 'Unable to delete selected employee(s), one or more of the has processed sales or you are trying to delete your account.',
'change_employee' => '',
'change_password' => 'Change Password',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Are you sure you want to delete the selected employee(s)?',
'confirm_restore' => 'Are you sure you want to restore selected employee(s)?',
'current_password' => 'Current Password',
'current_password_invalid' => 'Current Password is invalid.',
'employee' => 'Employee',
'error_adding_updating' => 'Employee add or update failed.',
'error_cannot_remove_own_minimum_grant' => 'Du kan ikke fjerne dine egne minimumsrettigheder til moduladgang.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'You can not delete the demo admin user.',
'error_grant_change_disallowed' => 'Rettighedsændringer er deaktiveret i denne demo.',
'error_password_change_disallowed' => 'Adgangskodeændringer er deaktiveret i denne demo.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'You can not change the demo admin user.',
'language' => 'Language',
'login_info' => 'Login',
'manager' => '',
'new' => 'New Employee',
'none_selected' => 'You have not selected any employee(s) to delete.',
'one_or_multiple' => 'employee(s)',
'password' => 'Password',
'password_minlength' => 'Password must be at least 8 characters in length.',
'password_must_match' => 'Passwords do not match.',
'password_not_must_match' => 'Current password and new password must be unique.',
'password_required' => 'Password is required.',
'permission_desc' => 'Check the boxes below to grant access to modules.',
'permission_info' => 'Permissions',
'repeat_password' => 'Password Again',
'subpermission_required' => 'Add at least one grant for each module.',
'successful_adding' => 'Employee add successful.',
'successful_change_password' => 'Password change successful.',
'successful_deleted' => 'You have successfully deleted',
'successful_updating' => 'You have successfully updated employee',
'system_language' => 'System Language',
'unsuccessful_change_password' => 'Password change failed.',
'update' => 'Update Employee',
'username' => 'Username',
'username_duplicate' => '',
'username_minlength' => 'Username must be at least 5 characters in length.',
'username_required' => 'Username is a required field.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Mitarbeiter-Information",
"cannot_be_deleted" => "Konnte gewählten Mitarbeiter nicht löschen, einer oder mehrere weisen Verkäufe aus.",
"change_employee" => "",
"change_password" => "",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Wollen Sie diesen Mitarbeiter wirklich löschen?",
"confirm_restore" => "",
"current_password" => "",
"current_password_invalid" => "",
"employee" => "Mitarbeiter",
"error_adding_updating" => "Fehler beim Hinzufügen/Ändern",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Sie können den Admin nicht löschen",
"error_updating_demo_admin" => "Sie können den Admin nicht ändern",
"language" => "",
"login_info" => "Mitarbeiter Login",
"manager" => "",
"new" => "Neuer Mitarbeiter",
"none_selected" => "Sie haben keinen Mitarbeiter zum Löschen gewählt",
"one_or_multiple" => "Mitarbeiter",
"password" => "Passwort",
"password_minlength" => "Passwort muss mindestens 8 Zeichen lang sein",
"password_must_match" => "Passwörter passen nicht überein",
"password_not_must_match" => "",
"password_required" => "Passwort ist erforderlich",
"permission_desc" => "Klicken Sie unten, um die jeweiligen Zugangsrechte zu aktivieren",
"permission_info" => "Mitarbeiter Zugangsrechte",
"repeat_password" => "Wiederhole Passwort",
"subpermission_required" => "Fügen Sie mindestens ein Zugangsrecht pro Modul hinzu",
"successful_adding" => "Hinzufügen erfolgreich",
"successful_change_password" => "",
"successful_deleted" => "Löschung erfolgreich",
"successful_updating" => "Änderung erfolgreich",
"system_language" => "",
"unsuccessful_change_password" => "",
"update" => "Mitarbeiter ändern",
"username" => "Benutzername",
"username_duplicate" => "",
"username_minlength" => "Benutzername muss mindestens 5 Zeichen lang sein",
"username_required" => "Benutzername ist erforderlich",
'administrator' => '',
'basic_information' => 'Mitarbeiter-Information',
'cannot_be_deleted' => 'Konnte gewählten Mitarbeiter nicht löschen, einer oder mehrere weisen Verkäufe aus.',
'change_employee' => '',
'change_password' => '',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Wollen Sie diesen Mitarbeiter wirklich löschen?',
'confirm_restore' => '',
'current_password' => '',
'current_password_invalid' => '',
'employee' => 'Mitarbeiter',
'error_adding_updating' => 'Fehler beim Hinzufügen/Ändern',
'error_cannot_remove_own_minimum_grant' => 'Sie können Ihre eigenen minimalen Zugangsrechte für Module nicht entfernen.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'Sie können den Admin nicht löschen',
'error_grant_change_disallowed' => 'Berechtigungsänderungen sind in dieser Demo deaktiviert.',
'error_password_change_disallowed' => 'Passwortänderungen sind in dieser Demo deaktiviert.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'Sie können den Admin nicht ändern',
'language' => '',
'login_info' => 'Mitarbeiter Login',
'manager' => '',
'new' => 'Neuer Mitarbeiter',
'none_selected' => 'Sie haben keinen Mitarbeiter zum Löschen gewählt',
'one_or_multiple' => 'Mitarbeiter',
'password' => 'Passwort',
'password_minlength' => 'Passwort muss mindestens 8 Zeichen lang sein',
'password_must_match' => 'Passwörter passen nicht überein',
'password_not_must_match' => '',
'password_required' => 'Passwort ist erforderlich',
'permission_desc' => 'Klicken Sie unten, um die jeweiligen Zugangsrechte zu aktivieren',
'permission_info' => 'Mitarbeiter Zugangsrechte',
'repeat_password' => 'Wiederhole Passwort',
'subpermission_required' => 'Fügen Sie mindestens ein Zugangsrecht pro Modul hinzu',
'successful_adding' => 'Hinzufügen erfolgreich',
'successful_change_password' => '',
'successful_deleted' => 'Löschung erfolgreich',
'successful_updating' => 'Änderung erfolgreich',
'system_language' => '',
'unsuccessful_change_password' => '',
'update' => 'Mitarbeiter ändern',
'username' => 'Benutzername',
'username_duplicate' => '',
'username_minlength' => 'Benutzername muss mindestens 5 Zeichen lang sein',
'username_required' => 'Benutzername ist erforderlich',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "Administrator",
"basic_information" => "Mitarbeiter-Information",
"cannot_be_deleted" => "Konnte gewählten Mitarbeiter nicht löschen, einer oder mehrere weisen Verkäufe aus.",
"change_employee" => "Mitarbeiter ändern",
"change_password" => "Passwort Ändern",
"clerk" => "Angestellter",
"commission" => "Provision",
"confirm_delete" => "Wollen Sie diesen Mitarbeiter wirklich löschen?",
"confirm_restore" => "Möchten Sie die ausgewählten Mitarbeiter wiederherstellen?",
"current_password" => "Aktuelles Passwort",
"current_password_invalid" => "Aktuelles Passwort ist ungültig.",
"employee" => "Mitarbeiter",
"error_adding_updating" => "Fehler beim Hinzufügen/Ändern.",
"error_deleting_admin" => "Sie können keinen Administrator löschen.",
"error_updating_admin" => "Sie können keinen Administrator ändern.",
"error_deleting_demo_admin" => "Sie können den Demo-Administrator nicht löschen.",
"error_updating_demo_admin" => "Sie können den Demo-Administrator nicht verändern.",
"language" => "Sprache",
"login_info" => "Mitarbeiter Login",
"manager" => "Manager",
"new" => "Neuer Mitarbeiter",
"none_selected" => "Sie haben keine Mitarbeiter zum Löschen gewählt.",
"one_or_multiple" => "Mitarbeiter",
"password" => "Passwort",
"password_minlength" => "Das Passwort muss mindestens 8 Zeichen lang sein.",
"password_must_match" => "Passwörter stimmen nicht überein.",
"password_not_must_match" => "Altes und neues Passwort dürfen nicht gleich sein.",
"password_required" => "Passwort ist erforderlich.",
"permission_desc" => "Klicken Sie unten, um die jeweiligen Zugangsrechte zu aktivieren.",
"permission_info" => "Mitarbeiter Zugangsrechte",
"repeat_password" => "Wiederhole Passwort",
"subpermission_required" => "Fügen Sie mindestens ein Zugangsrecht pro Modul hinzu.",
"successful_adding" => "Hinzufügen erfolgreich.",
"successful_change_password" => "Passwort erfolgreich geändert.",
"successful_deleted" => "Löschung erfolgreich",
"successful_updating" => "Änderung erfolgreich",
"system_language" => "System Sprache",
"unsuccessful_change_password" => "Passwort ändern fehlgeschlagen.",
"update" => "Mitarbeiter ändern",
"username" => "Benutzername",
"username_duplicate" => "",
"username_minlength" => "Benutzername muss mindestens 5 Zeichen lang sein.",
"username_required" => "Benutzername ist erforderlich.",
'administrator' => 'Administrator',
'basic_information' => 'Mitarbeiter-Information',
'cannot_be_deleted' => 'Konnte gewählten Mitarbeiter nicht löschen, einer oder mehrere weisen Verkäufe aus.',
'change_employee' => 'Mitarbeiter ändern',
'change_password' => 'Passwort Ändern',
'clerk' => 'Angestellter',
'commission' => 'Provision',
'confirm_delete' => 'Wollen Sie diesen Mitarbeiter wirklich löschen?',
'confirm_restore' => 'Möchten Sie die ausgewählten Mitarbeiter wiederherstellen?',
'current_password' => 'Aktuelles Passwort',
'current_password_invalid' => 'Aktuelles Passwort ist ungültig.',
'employee' => 'Mitarbeiter',
'error_adding_updating' => 'Fehler beim Hinzufügen/Ändern.',
'error_cannot_remove_own_minimum_grant' => 'Sie können Ihre eigenen minimalen Zugangsrechte für Module nicht entfernen.',
'error_deleting_admin' => 'Sie können keinen Administrator löschen.',
'error_deleting_demo_admin' => 'Sie können den Demo-Administrator nicht löschen.',
'error_grant_change_disallowed' => 'Berechtigungsänderungen sind in dieser Demo deaktiviert.',
'error_password_change_disallowed' => 'Passwortänderungen sind in dieser Demo deaktiviert.',
'error_updating_admin' => 'Sie können keinen Administrator ändern.',
'error_updating_demo_admin' => 'Sie können den Demo-Administrator nicht verändern.',
'language' => 'Sprache',
'login_info' => 'Mitarbeiter Login',
'manager' => 'Manager',
'new' => 'Neuer Mitarbeiter',
'none_selected' => 'Sie haben keine Mitarbeiter zum Löschen gewählt.',
'one_or_multiple' => 'Mitarbeiter',
'password' => 'Passwort',
'password_minlength' => 'Das Passwort muss mindestens 8 Zeichen lang sein.',
'password_must_match' => 'Passwörter stimmen nicht überein.',
'password_not_must_match' => 'Altes und neues Passwort dürfen nicht gleich sein.',
'password_required' => 'Passwort ist erforderlich.',
'permission_desc' => 'Klicken Sie unten, um die jeweiligen Zugangsrechte zu aktivieren.',
'permission_info' => 'Mitarbeiter Zugangsrechte',
'repeat_password' => 'Wiederhole Passwort',
'subpermission_required' => 'Fügen Sie mindestens ein Zugangsrecht pro Modul hinzu.',
'successful_adding' => 'Hinzufügen erfolgreich.',
'successful_change_password' => 'Passwort erfolgreich geändert.',
'successful_deleted' => 'Löschung erfolgreich',
'successful_updating' => 'Änderung erfolgreich',
'system_language' => 'System Sprache',
'unsuccessful_change_password' => 'Passwort ändern fehlgeschlagen.',
'update' => 'Mitarbeiter ändern',
'username' => 'Benutzername',
'username_duplicate' => '',
'username_minlength' => 'Benutzername muss mindestens 5 Zeichen lang sein.',
'username_required' => 'Benutzername ist erforderlich.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "",
"cannot_be_deleted" => "",
"change_employee" => "",
"change_password" => "",
"clerk" => "",
"commission" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"current_password" => "",
"current_password_invalid" => "",
"employee" => "",
"error_adding_updating" => "",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "",
"error_updating_demo_admin" => "",
"language" => "",
"login_info" => "",
"manager" => "",
"new" => "",
"none_selected" => "",
"one_or_multiple" => "",
"password" => "",
"password_minlength" => "",
"password_must_match" => "",
"password_not_must_match" => "",
"password_required" => "",
"permission_desc" => "",
"permission_info" => "",
"repeat_password" => "",
"subpermission_required" => "",
"successful_adding" => "",
"successful_change_password" => "",
"successful_deleted" => "",
"successful_updating" => "",
"system_language" => "",
"unsuccessful_change_password" => "",
"update" => "",
"username" => "",
"username_duplicate" => "",
"username_minlength" => "",
"username_required" => "",
'administrator' => '',
'basic_information' => '',
'cannot_be_deleted' => '',
'change_employee' => '',
'change_password' => '',
'clerk' => '',
'commission' => '',
'confirm_delete' => '',
'confirm_restore' => '',
'current_password' => '',
'current_password_invalid' => '',
'employee' => '',
'error_adding_updating' => '',
'error_cannot_remove_own_minimum_grant' => 'Δεν μπορείτε να αφαιρέσετε τα ελάχιστα δικαιώματα πρόσβασης των δικών σας μονάδων.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => '',
'error_grant_change_disallowed' => 'Οι αλλαγές δικαιωμάτων είναι απενεργοποιημένες σε αυτό το demo.',
'error_password_change_disallowed' => 'Οι αλλαγές κωδικού πρόσβασης είναι απενεργοποιημένες σε αυτό το demo.',
'error_updating_admin' => '',
'error_updating_demo_admin' => '',
'language' => '',
'login_info' => '',
'manager' => '',
'new' => '',
'none_selected' => '',
'one_or_multiple' => '',
'password' => '',
'password_minlength' => '',
'password_must_match' => '',
'password_not_must_match' => '',
'password_required' => '',
'permission_desc' => '',
'permission_info' => '',
'repeat_password' => '',
'subpermission_required' => '',
'successful_adding' => '',
'successful_change_password' => '',
'successful_deleted' => '',
'successful_updating' => '',
'system_language' => '',
'unsuccessful_change_password' => '',
'update' => '',
'username' => '',
'username_duplicate' => '',
'username_minlength' => '',
'username_required' => '',
];
+46 -41
View File
@@ -1,45 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Information",
"cannot_be_deleted" => "Unable to delete selected Employee(s), one or more of the has processed sales or you are trying to delete your account.",
"change_employee" => "",
"change_password" => "Change Password",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Are you sure you want to delete the selected Employee(s)?",
"confirm_restore" => "Are you sure you want to restore the selected Employee(s)?",
"current_password" => "Current Password",
"current_password_invalid" => "Current Password is invalid.",
"employee" => "Employee",
"error_adding_updating" => "Employee add or update failed.",
"error_deleting_demo_admin" => "You cannot delete the demo admin user.",
"error_updating_demo_admin" => "You cannot change the demo admin user.",
"language" => "Language",
"login_info" => "Login",
"manager" => "",
"new" => "New Employee",
"none_selected" => "You have not selected any Employee(s) to delete.",
"one_or_multiple" => "Employee(s)",
"password" => "Password",
"password_minlength" => "Passwords must be at least 8 characters.",
"password_must_match" => "Passwords do not match.",
"password_not_must_match" => "Current password and new password must be unique.",
"password_required" => "Password is required.",
"permission_desc" => "Check the boxes below to grant access to modules.",
"permission_info" => "Permissions",
"repeat_password" => "Password Again",
"subpermission_required" => "Add at least one grant for each module.",
"successful_adding" => "Employee add successful.",
"successful_change_password" => "Password change successful.",
"successful_deleted" => "You have successfully deleted Employee",
"successful_updating" => "You have successfully updated Employee",
"system_language" => "System Language",
"unsuccessful_change_password" => "Password change failed.",
"update" => "Update Employee",
"username" => "Username",
"username_duplicate" => "Employee username is already in use. Please choose another one.",
"username_minlength" => "Username must be at least 5 characters.",
"username_required" => "Username is a required field.",
'administrator' => '',
'basic_information' => 'Information',
'cannot_be_deleted' => 'Unable to delete selected Employee(s), one or more of them has processed sales or you are trying to delete your account.',
'change_employee' => '',
'change_password' => 'Change Password',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Are you sure you want to delete the selected Employee(s)?',
'confirm_restore' => 'Are you sure you want to restore the selected Employee(s)?',
'current_password' => 'Current Password',
'current_password_invalid' => 'Current Password is invalid.',
'employee' => 'Employee',
'error_adding_updating' => 'Employee add or update failed.',
'error_cannot_remove_own_minimum_grant' => 'You cannot remove your own minimum module access grants.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'You cannot delete the demo admin user.',
'error_grant_change_disallowed' => 'Grant changes are disabled in this demo.',
'error_password_change_disallowed' => 'Password changes are disabled in this demo.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'You cannot change the demo admin user.',
'language' => 'Language',
'login_info' => 'Login',
'manager' => '',
'new' => 'New Employee',
'none_selected' => 'You have not selected any Employee(s) to delete.',
'one_or_multiple' => 'Employee(s)',
'password' => 'Password',
'password_minlength' => 'Passwords must be at least 8 characters.',
'password_must_match' => 'Passwords do not match.',
'password_not_must_match' => 'Current password and new password must be unique.',
'password_required' => 'Password is required.',
'permission_desc' => 'Check the boxes below to grant access to modules.',
'permission_info' => 'Permissions',
'repeat_password' => 'Password Again',
'subpermission_required' => 'Add at least one grant for each module.',
'successful_adding' => 'Employee add successful.',
'successful_change_password' => 'Password change successful.',
'successful_deleted' => 'You have successfully deleted Employee',
'successful_updating' => 'You have successfully updated Employee',
'system_language' => 'System Language',
'unsuccessful_change_password' => 'Password change failed.',
'update' => 'Update Employee',
'username' => 'Username',
'username_duplicate' => 'Employee username is already in use. Please choose another one.',
'username_minlength' => 'Username must be at least 5 characters.',
'username_required' => 'Username is a required field.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Information",
"cannot_be_deleted" => "Unable to delete selected employee(s), one or more of the has processed sales or you are trying to delete your account.",
"change_employee" => "",
"change_password" => "Change Password",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Are you sure you want to delete the selected employee(s)?",
"confirm_restore" => "Are you sure you want to restore selected employee(s)?",
"current_password" => "Current Password",
"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",
"manager" => "",
"new" => "New Employee",
"none_selected" => "You have not selected any employee(s) to delete.",
"one_or_multiple" => "employee(s)",
"password" => "Password",
"password_minlength" => "Password must be at least 8 characters in length.",
"password_must_match" => "Passwords do not match.",
"password_not_must_match" => "Current password and new password must be unique.",
"password_required" => "Password is required.",
"permission_desc" => "Check the boxes below to grant access to modules.",
"permission_info" => "Permissions",
"repeat_password" => "Password Again",
"subpermission_required" => "Add at least one grant for each module.",
"successful_adding" => "Employee add successful.",
"successful_change_password" => "Password change successful.",
"successful_deleted" => "You have successfully deleted",
"successful_updating" => "You have successfully updated employee",
"system_language" => "System Language",
"unsuccessful_change_password" => "Password change failed.",
"update" => "Update Employee",
"username" => "Username",
"username_duplicate" => "Employee username is already in use. Please choose another one.",
"username_minlength" => "Username must be at least 5 characters in length.",
"username_required" => "Username is a required field.",
'administrator' => '',
'basic_information' => 'Information',
'cannot_be_deleted' => 'Unable to delete selected employee(s), one or more of the has processed sales or you are trying to delete your account.',
'change_employee' => '',
'change_password' => 'Change Password',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Are you sure you want to delete the selected employee(s)?',
'confirm_restore' => 'Are you sure you want to restore selected employee(s)?',
'current_password' => 'Current Password',
'current_password_invalid' => 'Current Password is invalid.',
'employee' => 'Employee',
'error_adding_updating' => 'Employee add or update failed.',
'error_cannot_remove_own_minimum_grant' => 'You cannot remove your own minimum module access grants.',
'error_deleting_admin' => 'You cannot delete an admin user.',
'error_deleting_demo_admin' => 'You can not delete the demo admin user.',
'error_grant_change_disallowed' => 'Grant changes are disabled in this demo.',
'error_password_change_disallowed' => 'Password changes are disabled in this demo.',
'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',
'manager' => '',
'new' => 'New Employee',
'none_selected' => 'You have not selected any employee(s) to delete.',
'one_or_multiple' => 'employee(s)',
'password' => 'Password',
'password_minlength' => 'Password must be at least 8 characters in length.',
'password_must_match' => 'Passwords do not match.',
'password_not_must_match' => 'Current password and new password must be unique.',
'password_required' => 'Password is required.',
'permission_desc' => 'Check the boxes below to grant access to modules.',
'permission_info' => 'Permissions',
'repeat_password' => 'Password Again',
'subpermission_required' => 'Add at least one grant for each module.',
'successful_adding' => 'Employee add successful.',
'successful_change_password' => 'Password change successful.',
'successful_deleted' => 'You have successfully deleted',
'successful_updating' => 'You have successfully updated employee',
'system_language' => 'System Language',
'unsuccessful_change_password' => 'Password change failed.',
'update' => 'Update Employee',
'username' => 'Username',
'username_duplicate' => 'Employee username is already in use. Please choose another one.',
'username_minlength' => 'Username must be at least 5 characters in length.',
'username_required' => 'Username is a required field.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "Administrador",
"basic_information" => "Información Básica de Empleados",
"cannot_be_deleted" => "No se pudieron borrar empleados. Uno o más empleados tiene ventas procesadas o estás tratando de borrarte a tí mismo(a).",
"change_employee" => "Cambio de Empleado",
"change_password" => "Cambiar Contraseña",
"clerk" => "Empleado",
"commission" => "Tasa de Comisión",
"confirm_delete" => "¿Seguro(a) que quieres borrar los empleados seleccionados?",
"confirm_restore" => "Esta seguro de quere restaurar lo(s) empleado(s) seleccionado(s)?",
"current_password" => "Contraseña Actual",
"current_password_invalid" => "Contraseña Actual Inválida.",
"employee" => "Empleado",
"error_adding_updating" => "Error al agregar/actualizar empleado.",
"error_deleting_admin" => "No puedes eliminar un usuario administrador.",
"error_updating_admin" => "No puedes modificar un usuario administrador.",
"error_deleting_demo_admin" => "No puedes borrar el usuario admin del demo.",
"error_updating_demo_admin" => "No puedes cambiar el usuario admin del demo.",
"language" => "Idioma",
"login_info" => "Información de Ingreso del Empleado",
"manager" => "Encargado",
"new" => "Nuevo Empleado",
"none_selected" => "No has seleccionado empleados para borrar.",
"one_or_multiple" => "empleado(s)",
"password" => "Contraseña",
"password_minlength" => "La contraseña debe tener, por lo menos, 8 caracteres.",
"password_must_match" => "Las Contraseñas no coinciden.",
"password_not_must_match" => "La contraseña actual y la nueva contraseña no deben ser iguales.",
"password_required" => "La Contraseña es requerida.",
"permission_desc" => "Activa las cajas debajo para permitir el acceso a los módulos.",
"permission_info" => "Permisos y Acceso del Empleado",
"repeat_password" => "Repita Contraseña",
"subpermission_required" => "Agregar al menos un permiso para cada modulo.",
"successful_adding" => "Empleado agregado satisfactoriamente.",
"successful_change_password" => "Contraseña cambiada satisfactoriamente.",
"successful_deleted" => "Has borrado satisfactoriamente a",
"successful_updating" => "Has actualizado el empleado satisfactoriamente",
"system_language" => "Idioma de sistema",
"unsuccessful_change_password" => "Cambio de contraseña fallido.",
"update" => "Actualizar Empleado",
"username" => "Usuario",
"username_duplicate" => "Nombre de Usuario de Empleado yá está en uso. Por favor escoja otro.",
"username_minlength" => "El nombre de usuario debe ser por lo menos, 5 caracteres.",
"username_required" => "Nombre de usuario es requerido.",
'administrator' => 'Administrador',
'basic_information' => 'Información Básica de Empleados',
'cannot_be_deleted' => 'No se pudieron borrar empleados. Uno o más empleados tiene ventas procesadas o estás tratando de borrarte a tí mismo(a).',
'change_employee' => 'Cambio de Empleado',
'change_password' => 'Cambiar Contraseña',
'clerk' => 'Empleado',
'commission' => 'Tasa de Comisión',
'confirm_delete' => '¿Seguro(a) que quieres borrar los empleados seleccionados?',
'confirm_restore' => 'Esta seguro de quere restaurar lo(s) empleado(s) seleccionado(s)?',
'current_password' => 'Contraseña Actual',
'current_password_invalid' => 'Contraseña Actual Inválida.',
'employee' => 'Empleado',
'error_adding_updating' => 'Error al agregar/actualizar empleado.',
'error_cannot_remove_own_minimum_grant' => 'No puedes eliminar tus propios permisos mínimos de acceso a módulos.',
'error_deleting_admin' => 'No puedes eliminar un usuario administrador.',
'error_deleting_demo_admin' => 'No puedes borrar el usuario admin del demo.',
'error_grant_change_disallowed' => 'Los cambios de permisos están deshabilitados en esta demo.',
'error_password_change_disallowed' => 'Los cambios de contraseña están deshabilitados en esta demo.',
'error_updating_admin' => 'No puedes modificar un usuario administrador.',
'error_updating_demo_admin' => 'No puedes cambiar el usuario admin del demo.',
'language' => 'Idioma',
'login_info' => 'Información de Ingreso del Empleado',
'manager' => 'Encargado',
'new' => 'Nuevo Empleado',
'none_selected' => 'No has seleccionado empleados para borrar.',
'one_or_multiple' => 'empleado(s)',
'password' => 'Contraseña',
'password_minlength' => 'La contraseña debe tener, por lo menos, 8 caracteres.',
'password_must_match' => 'Las Contraseñas no coinciden.',
'password_not_must_match' => 'La contraseña actual y la nueva contraseña no deben ser iguales.',
'password_required' => 'La Contraseña es requerida.',
'permission_desc' => 'Activa las cajas debajo para permitir el acceso a los módulos.',
'permission_info' => 'Permisos y Acceso del Empleado',
'repeat_password' => 'Repita Contraseña',
'subpermission_required' => 'Agregar al menos un permiso para cada modulo.',
'successful_adding' => 'Empleado agregado satisfactoriamente.',
'successful_change_password' => 'Contraseña cambiada satisfactoriamente.',
'successful_deleted' => 'Has borrado satisfactoriamente a',
'successful_updating' => 'Has actualizado el empleado satisfactoriamente',
'system_language' => 'Idioma de sistema',
'unsuccessful_change_password' => 'Cambio de contraseña fallido.',
'update' => 'Actualizar Empleado',
'username' => 'Usuario',
'username_duplicate' => 'Nombre de Usuario de Empleado yá está en uso. Por favor escoja otro.',
'username_minlength' => 'El nombre de usuario debe ser por lo menos, 5 caracteres.',
'username_required' => 'Nombre de usuario es requerido.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Información",
"cannot_be_deleted" => "No se puede borrar los empleados seleccionados, uno o más de ellos tienen ventas registradas ó intentas borrar tu propia cuenta.",
"change_employee" => "",
"change_password" => "Cambiar contraseña",
"clerk" => "",
"commission" => "",
"confirm_delete" => "¿Estás seguro que deseas borrar los empleados seleccionados?",
"confirm_restore" => "¿Estás seguro que deseas restaurar los empleados seleccionados?",
"current_password" => "Contraseña Actual",
"current_password_invalid" => "La contraseña actual es inválida.",
"employee" => "Empleado",
"error_adding_updating" => "Agregar ó Actualizar empleado ha fallado.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "No puede borrar el usuario demo de administrador.",
"error_updating_demo_admin" => "No puede cambiar el usuario demo de administrador.",
"language" => "Idioma",
"login_info" => "Iniciar sesión",
"manager" => "",
"new" => "Nuevo Empleado",
"none_selected" => "No ha seleccionado empleados a borrar.",
"one_or_multiple" => "Empleado(s)",
"password" => "Contraseña",
"password_minlength" => "La contraseña debe tener por lo menos 8 letras.",
"password_must_match" => "Las contraseñas no coinciden.",
"password_not_must_match" => "La contraseña actual y nueva contraseña deben ser distintas.",
"password_required" => "Se requiere contraseña.",
"permission_desc" => "Selecciona las casillas para otorgar acceso a los módulos.",
"permission_info" => "Permisos",
"repeat_password" => "Contraseña otra vez",
"subpermission_required" => "Concede por lo menos un permiso para cada módulo.",
"successful_adding" => "Empleado agregado exitosamente.",
"successful_change_password" => "Cambio de contraseña exitoso.",
"successful_deleted" => "Se ha borrado correctamente",
"successful_updating" => "Empleado actualizado exitosamente",
"system_language" => "Idioma del sistema",
"unsuccessful_change_password" => "El cambio de contraseña ha fallado.",
"update" => "Actualizar Empleado",
"username" => "Nombre de Usuario",
"username_duplicate" => "El usuario del empleado ya esta en uso. Favor de escoger otro.",
"username_minlength" => "Nombre de usuario debe tener por lo menos 5 letras.",
"username_required" => "Es necesario el nombre de usuario.",
'administrator' => '',
'basic_information' => 'Información',
'cannot_be_deleted' => 'No se puede borrar los empleados seleccionados, uno o más de ellos tienen ventas registradas ó intentas borrar tu propia cuenta.',
'change_employee' => '',
'change_password' => 'Cambiar contraseña',
'clerk' => '',
'commission' => '',
'confirm_delete' => '¿Estás seguro que deseas borrar los empleados seleccionados?',
'confirm_restore' => '¿Estás seguro que deseas restaurar los empleados seleccionados?',
'current_password' => 'Contraseña Actual',
'current_password_invalid' => 'La contraseña actual es inválida.',
'employee' => 'Empleado',
'error_adding_updating' => 'Agregar ó Actualizar empleado ha fallado.',
'error_cannot_remove_own_minimum_grant' => 'No puede eliminar sus propios permisos mínimos de acceso a módulos.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'No puede borrar el usuario demo de administrador.',
'error_grant_change_disallowed' => 'Los cambios de permisos están deshabilitados en esta demo.',
'error_password_change_disallowed' => 'Los cambios de contraseña están deshabilitados en esta demo.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'No puede cambiar el usuario demo de administrador.',
'language' => 'Idioma',
'login_info' => 'Iniciar sesión',
'manager' => '',
'new' => 'Nuevo Empleado',
'none_selected' => 'No ha seleccionado empleados a borrar.',
'one_or_multiple' => 'Empleado(s)',
'password' => 'Contraseña',
'password_minlength' => 'La contraseña debe tener por lo menos 8 letras.',
'password_must_match' => 'Las contraseñas no coinciden.',
'password_not_must_match' => 'La contraseña actual y nueva contraseña deben ser distintas.',
'password_required' => 'Se requiere contraseña.',
'permission_desc' => 'Selecciona las casillas para otorgar acceso a los módulos.',
'permission_info' => 'Permisos',
'repeat_password' => 'Contraseña otra vez',
'subpermission_required' => 'Concede por lo menos un permiso para cada módulo.',
'successful_adding' => 'Empleado agregado exitosamente.',
'successful_change_password' => 'Cambio de contraseña exitoso.',
'successful_deleted' => 'Se ha borrado correctamente',
'successful_updating' => 'Empleado actualizado exitosamente',
'system_language' => 'Idioma del sistema',
'unsuccessful_change_password' => 'El cambio de contraseña ha fallado.',
'update' => 'Actualizar Empleado',
'username' => 'Nombre de Usuario',
'username_duplicate' => 'El usuario del empleado ya esta en uso. Favor de escoger otro.',
'username_minlength' => 'Nombre de usuario debe tener por lo menos 5 letras.',
'username_required' => 'Es necesario el nombre de usuario.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "اطلاعات",
"cannot_be_deleted" => "حذف کارمند (های) انتخابی امکان پذیر نیست ، یک یا چند مورد از فروش پردازش شده استفاده کرده یا می خواهید حساب خود را حذف کنید.",
"change_employee" => "",
"change_password" => "تغییر رمز عبور",
"clerk" => "",
"commission" => "",
"confirm_delete" => "آیا مطمئن هستید که می خواهید کارمند (های) انتخاب شده را حذف کنید؟",
"confirm_restore" => "آیا مطمئن هستید که می خواهید کارمندان (های) انتخاب شده را بازیابی کنید؟",
"current_password" => "گذرواژه فعلی",
"current_password_invalid" => "گذرواژه فعلی نامعتبر است.",
"employee" => "کارمند",
"error_adding_updating" => "افزودن یا به روزرسانی کارکنان انجام نشد.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "شما نمی توانید کاربر مدیر نسخه ی نمایشی را حذف کنید.",
"error_updating_demo_admin" => "شما نمی توانید کاربر مدیر نسخه ی نمایشی را تغییر دهید.",
"language" => "زبان",
"login_info" => "وارد شدن",
"manager" => "",
"new" => "کارمند جدید",
"none_selected" => "شما هیچ کارمندی را برای حذف انتخاب نکرده اید.",
"one_or_multiple" => "کارمند (ها)",
"password" => "کلمه عبور",
"password_minlength" => "گذرواژه باید حداقل 8 نویسه داشته باشد.",
"password_must_match" => "رمزهای ورود مطابقت ندارند.",
"password_not_must_match" => "گذرواژه فعلی و رمز جدید باید بی نظیر باشند.",
"password_required" => "رمز عبور مورد نیاز است.",
"permission_desc" => "کادرهای زیر را برای دسترسی به ماژولها بررسی کنید.",
"permission_info" => "مجوزها",
"repeat_password" => "رمز عبور دوباره",
"subpermission_required" => "برای هر ماژول حداقل یک کمک هزینه اضافه کنید.",
"successful_adding" => "کارمندان موفق شدند.",
"successful_change_password" => "تغییر رمز عبور موفقیت آمیز است.",
"successful_deleted" => "شما با موفقیت حذف شده اید",
"successful_updating" => "شما با موفقیت کارمند را به روز کردید",
"system_language" => "زبان سیستم",
"unsuccessful_change_password" => "تغییر رمز انجام نشد.",
"update" => "به روزرسانی کارمند",
"username" => "نام کاربری",
"username_duplicate" => "",
"username_minlength" => "نام کاربری باید حداقل 5 کاراکتر داشته باشد.",
"username_required" => "نام کاربری فیلد مورد نیاز است.",
'administrator' => '',
'basic_information' => 'اطلاعات',
'cannot_be_deleted' => 'حذف کارمند (های) انتخابی امکان پذیر نیست ، یک یا چند مورد از فروش پردازش شده استفاده کرده یا می خواهید حساب خود را حذف کنید.',
'change_employee' => '',
'change_password' => 'تغییر رمز عبور',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'آیا مطمئن هستید که می خواهید کارمند (های) انتخاب شده را حذف کنید؟',
'confirm_restore' => 'آیا مطمئن هستید که می خواهید کارمندان (های) انتخاب شده را بازیابی کنید؟',
'current_password' => 'گذرواژه فعلی',
'current_password_invalid' => 'گذرواژه فعلی نامعتبر است.',
'employee' => 'کارمند',
'error_adding_updating' => 'افزودن یا به روزرسانی کارکنان انجام نشد.',
'error_cannot_remove_own_minimum_grant' => 'شما نمی توانید حداقل مجوزهای دسترسی به ماژول خود را حذف کنید.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'شما نمی توانید کاربر مدیر نسخه ی نمایشی را حذف کنید.',
'error_grant_change_disallowed' => 'تغییرات اعطا در این نسخه نمایشی غیرفعال است.',
'error_password_change_disallowed' => 'تغییرات رمز عبور در این نسخه نمایشی غیرفعال است.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'شما نمی توانید کاربر مدیر نسخه ی نمایشی را تغییر دهید.',
'language' => 'زبان',
'login_info' => 'وارد شدن',
'manager' => '',
'new' => 'کارمند جدید',
'none_selected' => 'شما هیچ کارمندی را برای حذف انتخاب نکرده اید.',
'one_or_multiple' => 'کارمند (ها)',
'password' => 'کلمه عبور',
'password_minlength' => 'گذرواژه باید حداقل 8 نویسه داشته باشد.',
'password_must_match' => 'رمزهای ورود مطابقت ندارند.',
'password_not_must_match' => 'گذرواژه فعلی و رمز جدید باید بی نظیر باشند.',
'password_required' => 'رمز عبور مورد نیاز است.',
'permission_desc' => 'کادرهای زیر را برای دسترسی به ماژولها بررسی کنید.',
'permission_info' => 'مجوزها',
'repeat_password' => 'رمز عبور دوباره',
'subpermission_required' => 'برای هر ماژول حداقل یک کمک هزینه اضافه کنید.',
'successful_adding' => 'کارمندان موفق شدند.',
'successful_change_password' => 'تغییر رمز عبور موفقیت آمیز است.',
'successful_deleted' => 'شما با موفقیت حذف شده اید',
'successful_updating' => 'شما با موفقیت کارمند را به روز کردید',
'system_language' => 'زبان سیستم',
'unsuccessful_change_password' => 'تغییر رمز انجام نشد.',
'update' => 'به روزرسانی کارمند',
'username' => 'نام کاربری',
'username_duplicate' => '',
'username_minlength' => 'نام کاربری باید حداقل 5 کاراکتر داشته باشد.',
'username_required' => 'نام کاربری فیلد مورد نیاز است.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "Administrateur",
"basic_information" => "Fiche",
"cannot_be_deleted" => "Impossible de supprimer le(s) employé(s) sélectionné(s),car un ou plusieur a éffectué une vente, ou car vous essayez de vous supprimer vous-meme.",
"change_employee" => "Changer d'employé",
"change_password" => "Changement de mot de passe",
"clerk" => "Employé",
"commission" => "Commission",
"confirm_delete" => "Êtes-vous certain de vouloir supprimer le(s) employé(s) sélectionné(s) ?",
"confirm_restore" => "Êtes-vous certain de vouloir restaurer le(s) employé(s) selectionné(s) ?",
"current_password" => "Mot de passe actuel",
"current_password_invalid" => "Le mot de passe actuel est invalide.",
"employee" => "Employé",
"error_adding_updating" => "Erreur d'ajout/édition d'employé.",
"error_deleting_admin" => "Vous ne pouvez pas supprimer un utilisateur administrateur.",
"error_updating_admin" => "Vous ne pouvez pas modifier un utilisateur administrateur.",
"error_deleting_demo_admin" => "Vous ne pouvez pas supprimer l'utilisateur de démonstration admin.",
"error_updating_demo_admin" => "Vous ne pouvez pas modifier l'utilisateur de démonstration admin.",
"language" => "Langue",
"login_info" => "Connexion",
"manager" => "Gestionnaire",
"new" => "Nouvel employé",
"none_selected" => "Aucun employé sélectionné pour la suppression.",
"one_or_multiple" => "employé(s)",
"password" => "Mot de passe",
"password_minlength" => "Le mot de passe doit contenir au moins 8 caractères.",
"password_must_match" => "Les mots de passe ne concordent pas.",
"password_not_must_match" => "Le mot de passe actuel et le nouveau mot de passe doivent être uniques.",
"password_required" => "Mot de passe requis.",
"permission_desc" => "Cochez les cases ci-dessous pour autoriser l'accès aux modules.",
"permission_info" => "Permissions",
"repeat_password" => "Re-saisissez le mot de passe",
"subpermission_required" => "Ajoutez au moins une permission pour chaque module.",
"successful_adding" => "Employé ajouté.",
"successful_change_password" => "Mot de passe modifié avec succès.",
"successful_deleted" => "Suppression d'employé réussie",
"successful_updating" => "Édition d'employé réussie",
"system_language" => "Langue système",
"unsuccessful_change_password" => "Échec du changement de mot de passe.",
"update" => "Éditer employé",
"username" => "Nom d'utilisateur",
"username_duplicate" => "Nom d'utilisateur existant. Veuillez en choisir un autre.",
"username_minlength" => "Le nom d'utilisateur doit contenir au moins 5 caractères.",
"username_required" => "Nom d'utilisateur requis.",
'administrator' => 'Administrateur',
'basic_information' => 'Fiche',
'cannot_be_deleted' => 'Impossible de supprimer le(s) employé(s) sélectionné(s),car un ou plusieur a éffectué une vente, ou car vous essayez de vous supprimer vous-meme.',
'change_employee' => 'Changer d\'employé',
'change_password' => 'Changement de mot de passe',
'clerk' => 'Employé',
'commission' => 'Commission',
'confirm_delete' => 'Êtes-vous certain de vouloir supprimer le(s) employé(s) sélectionné(s) ?',
'confirm_restore' => 'Êtes-vous certain de vouloir restaurer le(s) employé(s) selectionné(s) ?',
'current_password' => 'Mot de passe actuel',
'current_password_invalid' => 'Le mot de passe actuel est invalide.',
'employee' => 'Employé',
'error_adding_updating' => 'Erreur d\'ajout/édition d\'employé.',
'error_cannot_remove_own_minimum_grant' => 'Vous ne pouvez pas retirer vos propres permissions minimales d\'accès aux modules.',
'error_deleting_admin' => 'Vous ne pouvez pas supprimer un utilisateur administrateur.',
'error_deleting_demo_admin' => 'Vous ne pouvez pas supprimer l\'utilisateur de démonstration admin.',
'error_grant_change_disallowed' => 'Les modifications de permissions sont désactivées dans cette démo.',
'error_password_change_disallowed' => 'Les modifications de mot de passe sont désactivées dans cette démo.',
'error_updating_admin' => 'Vous ne pouvez pas modifier un utilisateur administrateur.',
'error_updating_demo_admin' => 'Vous ne pouvez pas modifier l\'utilisateur de démonstration admin.',
'language' => 'Langue',
'login_info' => 'Connexion',
'manager' => 'Gestionnaire',
'new' => 'Nouvel employé',
'none_selected' => 'Aucun employé sélectionné pour la suppression.',
'one_or_multiple' => 'employé(s)',
'password' => 'Mot de passe',
'password_minlength' => 'Le mot de passe doit contenir au moins 8 caractères.',
'password_must_match' => 'Les mots de passe ne concordent pas.',
'password_not_must_match' => 'Le mot de passe actuel et le nouveau mot de passe doivent être uniques.',
'password_required' => 'Mot de passe requis.',
'permission_desc' => 'Cochez les cases ci-dessous pour autoriser l\'accès aux modules.',
'permission_info' => 'Permissions',
'repeat_password' => 'Re-saisissez le mot de passe',
'subpermission_required' => 'Ajoutez au moins une permission pour chaque module.',
'successful_adding' => 'Employé ajouté.',
'successful_change_password' => 'Mot de passe modifié avec succès.',
'successful_deleted' => 'Suppression d\'employé réussie',
'successful_updating' => 'Édition d\'employé réussie',
'system_language' => 'Langue système',
'unsuccessful_change_password' => 'Échec du changement de mot de passe.',
'update' => 'Éditer employé',
'username' => 'Nom d\'utilisateur',
'username_duplicate' => 'Nom d\'utilisateur existant. Veuillez en choisir un autre.',
'username_minlength' => 'Le nom d\'utilisateur doit contenir au moins 5 caractères.',
'username_required' => 'Nom d\'utilisateur requis.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "מידע",
"cannot_be_deleted" => "לא ניתן למחוק עובדים נבחרים, לאחד או יותר יש מכירות בתהליך או שאתה מנסה למחוק את החשבון שלך.",
"change_employee" => "",
"change_password" => "שנה סיסמה",
"clerk" => "",
"commission" => "",
"confirm_delete" => "האם אתה בטוח שברצונך למחוק את העובדים שנבחרו?",
"confirm_restore" => "האם אתה בטוח שברצונך לשחזר את העובדים שנבחרו?",
"current_password" => "סיסמה נוכחית",
"current_password_invalid" => "הסיסמה הנוכחית אינה חוקית.",
"employee" => "עובד",
"error_adding_updating" => "הוספה או עדכון של עובד נכשלה.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "לא ניתן למחוק את משתמש המנהל ההדגמה.",
"error_updating_demo_admin" => "לא ניתן לשנות את משתמש המנהל ההדגמה.",
"language" => "שפה",
"login_info" => "כניסה",
"manager" => "",
"new" => "עובד חדש",
"none_selected" => "לא בחרת עובדים שברצונך למחוק.",
"one_or_multiple" => "עובד(ים)",
"password" => "סיסמה",
"password_minlength" => "על הסיסמה להיות באורך של 8 תווים לפחות.",
"password_must_match" => "סיסמאות לא תואמות.",
"password_not_must_match" => "הסיסמה הנוכחית והסיסמה החדשה חייבות להיות ייחודיות.",
"password_required" => "דרושה סיסמה.",
"permission_desc" => "סמן את התיבות שלהלן כדי להעניק גישה למודולים.",
"permission_info" => "הרשאות",
"repeat_password" => "סיסמא בשנית",
"subpermission_required" => "הוסף לפחות גישה אחת לכל מודול.",
"successful_adding" => "הוספת עובד בהצלחה.",
"successful_change_password" => "סיסמה שונתה בהצלחה.",
"successful_deleted" => "נמחק בהצלחה",
"successful_updating" => "עדכנת בהצלחה את פרטי העובד",
"system_language" => "שפת מערכת",
"unsuccessful_change_password" => "שינוי הסיסמה נכשל.",
"update" => "עדכן עובד",
"username" => "שם משתמש",
"username_duplicate" => "",
"username_minlength" => "על שם המשתמש להיות באורך של 5 תווים לפחות.",
"username_required" => "שם המשתמש הינו שדה חובה.",
'administrator' => '',
'basic_information' => 'מידע',
'cannot_be_deleted' => 'לא ניתן למחוק עובדים נבחרים, לאחד או יותר יש מכירות בתהליך או שאתה מנסה למחוק את החשבון שלך.',
'change_employee' => '',
'change_password' => 'שנה סיסמה',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'האם אתה בטוח שברצונך למחוק את העובדים שנבחרו?',
'confirm_restore' => 'האם אתה בטוח שברצונך לשחזר את העובדים שנבחרו?',
'current_password' => 'סיסמה נוכחית',
'current_password_invalid' => 'הסיסמה הנוכחית אינה חוקית.',
'employee' => 'עובד',
'error_adding_updating' => 'הוספה או עדכון של עובד נכשלה.',
'error_cannot_remove_own_minimum_grant' => 'אינך יכול להסיר את הרשאות הגישה המינימליות שלך למודולים.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'לא ניתן למחוק את משתמש המנהל ההדגמה.',
'error_grant_change_disallowed' => 'שינויים בהרשאות מבוטלים בדמו זה.',
'error_password_change_disallowed' => 'שינויים בסיסמה מבוטלים בדמו זה.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'לא ניתן לשנות את משתמש המנהל ההדגמה.',
'language' => 'שפה',
'login_info' => 'כניסה',
'manager' => '',
'new' => 'עובד חדש',
'none_selected' => 'לא בחרת עובדים שברצונך למחוק.',
'one_or_multiple' => 'עובד(ים)',
'password' => 'סיסמה',
'password_minlength' => 'על הסיסמה להיות באורך של 8 תווים לפחות.',
'password_must_match' => 'סיסמאות לא תואמות.',
'password_not_must_match' => 'הסיסמה הנוכחית והסיסמה החדשה חייבות להיות ייחודיות.',
'password_required' => 'דרושה סיסמה.',
'permission_desc' => 'סמן את התיבות שלהלן כדי להעניק גישה למודולים.',
'permission_info' => 'הרשאות',
'repeat_password' => 'סיסמא בשנית',
'subpermission_required' => 'הוסף לפחות גישה אחת לכל מודול.',
'successful_adding' => 'הוספת עובד בהצלחה.',
'successful_change_password' => 'סיסמה שונתה בהצלחה.',
'successful_deleted' => 'נמחק בהצלחה',
'successful_updating' => 'עדכנת בהצלחה את פרטי העובד',
'system_language' => 'שפת מערכת',
'unsuccessful_change_password' => 'שינוי הסיסמה נכשל.',
'update' => 'עדכן עובד',
'username' => 'שם משתמש',
'username_duplicate' => '',
'username_minlength' => 'על שם המשתמש להיות באורך של 5 תווים לפחות.',
'username_required' => 'שם המשתמש הינו שדה חובה.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Informacije",
"cannot_be_deleted" => "Ne možete obristi odabranog radnika, jedan ili više radnika ima prodaju ili pokušavate obristi sebe :)",
"change_employee" => "",
"change_password" => "",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Jeste li ste sigurni da želite obristi odabranog radnika?",
"confirm_restore" => "",
"current_password" => "",
"current_password_invalid" => "",
"employee" => "Radnik",
"error_adding_updating" => "Greška kod dodavanja/ažuriranja radnika",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Ne možete obrisati demo admin korisnika",
"error_updating_demo_admin" => "Ne možete promijeniti demo admin korisnika",
"language" => "",
"login_info" => "Prijava",
"manager" => "",
"new" => "Novi radnik",
"none_selected" => "Nije odabran niti jedan radnik za brisanje",
"one_or_multiple" => "Radnik(ci)",
"password" => "Lozinka",
"password_minlength" => "Lozinka mora imati najmanje 8 znakova",
"password_must_match" => "Lozinka se ne podudara",
"password_not_must_match" => "",
"password_required" => "Lozinka je potrebna",
"permission_desc" => "Odaberite module za dozvolu",
"permission_info" => "Dozvole",
"repeat_password" => "Ponovite lozinku",
"subpermission_required" => "Odaberite barem jednu dozvolu po modulu",
"successful_adding" => "Uspješno ste dodali radnika",
"successful_change_password" => "",
"successful_deleted" => "Uspješno ste obrisali radnika",
"successful_updating" => "Uspješno ste ažurirali radnika",
"system_language" => "",
"unsuccessful_change_password" => "",
"update" => "Ažuriraj radnika",
"username" => "Korisničko ime",
"username_duplicate" => "",
"username_minlength" => "Korisničko ime mora imati najmanje 5 znakova",
"username_required" => "Korisničko ime je potrebno",
'administrator' => '',
'basic_information' => 'Informacije',
'cannot_be_deleted' => 'Ne možete obristi odabranog radnika, jedan ili više radnika ima prodaju ili pokušavate obristi sebe :)',
'change_employee' => '',
'change_password' => '',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Jeste li ste sigurni da želite obristi odabranog radnika?',
'confirm_restore' => '',
'current_password' => '',
'current_password_invalid' => '',
'employee' => 'Radnik',
'error_adding_updating' => 'Greška kod dodavanja/ažuriranja radnika',
'error_cannot_remove_own_minimum_grant' => 'Ne možete ukloniti vlastite minimalne dozvole pristupa modulima.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'Ne možete obrisati demo admin korisnika',
'error_grant_change_disallowed' => 'Promene dozvola su onemogućene u ovoj demo verziji.',
'error_password_change_disallowed' => 'Promene lozinke su onemogućene u ovoj demo verziji.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'Ne možete promijeniti demo admin korisnika',
'language' => '',
'login_info' => 'Prijava',
'manager' => '',
'new' => 'Novi radnik',
'none_selected' => 'Nije odabran niti jedan radnik za brisanje',
'one_or_multiple' => 'Radnik(ci)',
'password' => 'Lozinka',
'password_minlength' => 'Lozinka mora imati najmanje 8 znakova',
'password_must_match' => 'Lozinka se ne podudara',
'password_not_must_match' => '',
'password_required' => 'Lozinka je potrebna',
'permission_desc' => 'Odaberite module za dozvolu',
'permission_info' => 'Dozvole',
'repeat_password' => 'Ponovite lozinku',
'subpermission_required' => 'Odaberite barem jednu dozvolu po modulu',
'successful_adding' => 'Uspješno ste dodali radnika',
'successful_change_password' => '',
'successful_deleted' => 'Uspješno ste obrisali radnika',
'successful_updating' => 'Uspješno ste ažurirali radnika',
'system_language' => '',
'unsuccessful_change_password' => '',
'update' => 'Ažuriraj radnika',
'username' => 'Korisničko ime',
'username_duplicate' => '',
'username_minlength' => 'Korisničko ime mora imati najmanje 5 znakova',
'username_required' => 'Korisničko ime je potrebno',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Munkavállaló alap információk",
"cannot_be_deleted" => "Nem lehet a kiválasztott munkavállaló(ka)t törölni, mert már van lezárt értékesítése vagy saját magát kívánja törölni! :)",
"change_employee" => "",
"change_password" => "",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Biztos, hogy törölni kívánja a munkavállalót?",
"confirm_restore" => "",
"current_password" => "",
"current_password_invalid" => "",
"employee" => "Munkavállaló",
"error_adding_updating" => "Hiba a munkavállaló módosításánál/hozzáadásánál",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Nem tudja törölni a demo admin felhasználót",
"error_updating_demo_admin" => "Nem tudja módosítani a demo admin felhasználót",
"language" => "",
"login_info" => "Munkavállaló azonosító",
"manager" => "",
"new" => "Új munkavállaló",
"none_selected" => "Nem választott ki munkavállalót a törléshez",
"one_or_multiple" => "munkavállaló(k)",
"password" => "Jelszó",
"password_minlength" => "A jelszónak legalább 8 karakternek kell lennie",
"password_must_match" => "A jelszó nem egyezik",
"password_not_must_match" => "",
"password_required" => "A jelszó kötelező",
"permission_desc" => "Válassza ki az alábbi boxokat a hozzáférés megadásához",
"permission_info" => "Munkavállaló engedélyei",
"repeat_password" => "Jelszó újra",
"subpermission_required" => "Engedélyezzen legalább egyet minden modulhoz",
"successful_adding" => "Sikeresen hozzáadott egy új munkavállalót",
"successful_change_password" => "",
"successful_deleted" => "Sikeresen törölt egy munkavállalót",
"successful_updating" => "Sikeresen módosította a munkavállalót",
"system_language" => "",
"unsuccessful_change_password" => "",
"update" => "Munkavállaló módosítása",
"username" => "Felhasználó név",
"username_duplicate" => "",
"username_minlength" => "A felhasználó névnek legalább 5 karakternek kell lennie",
"username_required" => "Felhasználó név kötelező",
'administrator' => '',
'basic_information' => 'Munkavállaló alap információk',
'cannot_be_deleted' => 'Nem lehet a kiválasztott munkavállaló(ka)t törölni, mert már van lezárt értékesítése vagy saját magát kívánja törölni! :)',
'change_employee' => '',
'change_password' => '',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Biztos, hogy törölni kívánja a munkavállalót?',
'confirm_restore' => '',
'current_password' => '',
'current_password_invalid' => '',
'employee' => 'Munkavállaló',
'error_adding_updating' => 'Hiba a munkavállaló módosításánál/hozzáadásánál',
'error_cannot_remove_own_minimum_grant' => 'Nem távolíthatja el a saját minimális modulhozzáférési engedélyeit.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'Nem tudja törölni a demo admin felhasználót',
'error_grant_change_disallowed' => 'A jogok módosítása le van tiltva ebben a demóban.',
'error_password_change_disallowed' => 'A jelszóváltoztatás le van tiltva ebben a demóban.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'Nem tudja módosítani a demo admin felhasználót',
'language' => '',
'login_info' => 'Munkavállaló azonosító',
'manager' => '',
'new' => 'Új munkavállaló',
'none_selected' => 'Nem választott ki munkavállalót a törléshez',
'one_or_multiple' => 'munkavállaló(k)',
'password' => 'Jelszó',
'password_minlength' => 'A jelszónak legalább 8 karakternek kell lennie',
'password_must_match' => 'A jelszó nem egyezik',
'password_not_must_match' => '',
'password_required' => 'A jelszó kötelező',
'permission_desc' => 'Válassza ki az alábbi boxokat a hozzáférés megadásához',
'permission_info' => 'Munkavállaló engedélyei',
'repeat_password' => 'Jelszó újra',
'subpermission_required' => 'Engedélyezzen legalább egyet minden modulhoz',
'successful_adding' => 'Sikeresen hozzáadott egy új munkavállalót',
'successful_change_password' => '',
'successful_deleted' => 'Sikeresen törölt egy munkavállalót',
'successful_updating' => 'Sikeresen módosította a munkavállalót',
'system_language' => '',
'unsuccessful_change_password' => '',
'update' => 'Munkavállaló módosítása',
'username' => 'Felhasználó név',
'username_duplicate' => '',
'username_minlength' => 'A felhasználó névnek legalább 5 karakternek kell lennie',
'username_required' => 'Felhasználó név kötelező',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "",
"cannot_be_deleted" => "",
"change_employee" => "",
"change_password" => "",
"clerk" => "",
"commission" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"current_password" => "",
"current_password_invalid" => "",
"employee" => "",
"error_adding_updating" => "",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "",
"error_updating_demo_admin" => "",
"language" => "",
"login_info" => "",
"manager" => "",
"new" => "",
"none_selected" => "",
"one_or_multiple" => "",
"password" => "",
"password_minlength" => "",
"password_must_match" => "",
"password_not_must_match" => "",
"password_required" => "",
"permission_desc" => "",
"permission_info" => "",
"repeat_password" => "",
"subpermission_required" => "",
"successful_adding" => "",
"successful_change_password" => "",
"successful_deleted" => "",
"successful_updating" => "",
"system_language" => "",
"unsuccessful_change_password" => "",
"update" => "",
"username" => "",
"username_duplicate" => "",
"username_minlength" => "",
"username_required" => "",
'administrator' => '',
'basic_information' => '',
'cannot_be_deleted' => '',
'change_employee' => '',
'change_password' => '',
'clerk' => '',
'commission' => '',
'confirm_delete' => '',
'confirm_restore' => '',
'current_password' => '',
'current_password_invalid' => '',
'employee' => '',
'error_adding_updating' => '',
'error_cannot_remove_own_minimum_grant' => 'Դուք չեք կարող հեռացնել ձեր սեփական մոդուլների նվազագույն մատչելիության թույլտվությունները:',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => '',
'error_grant_change_disallowed' => 'Թույլատրումների փոփոխումները անջատված են այս ցուցադրտեսքում:',
'error_password_change_disallowed' => 'Գաղտնաբառի փոփոխումները անջատված են այս ցուցադրտեսքում:',
'error_updating_admin' => '',
'error_updating_demo_admin' => '',
'language' => '',
'login_info' => '',
'manager' => '',
'new' => '',
'none_selected' => '',
'one_or_multiple' => '',
'password' => '',
'password_minlength' => '',
'password_must_match' => '',
'password_not_must_match' => '',
'password_required' => '',
'permission_desc' => '',
'permission_info' => '',
'repeat_password' => '',
'subpermission_required' => '',
'successful_adding' => '',
'successful_change_password' => '',
'successful_deleted' => '',
'successful_updating' => '',
'system_language' => '',
'unsuccessful_change_password' => '',
'update' => '',
'username' => '',
'username_duplicate' => '',
'username_minlength' => '',
'username_required' => '',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Informasi Karyawan",
"cannot_be_deleted" => "Karyawan terpilih tidak bisa dihapus satu atau lebih dari para pekerja telah memproses penjualan atau Anda mencoba untuk menghapus diri Anda sendiri.",
"change_employee" => "",
"change_password" => "Ubah kata kunci",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Apakah Anda yakin ingin menghapus karyawan yang dipilih?",
"confirm_restore" => "Anda yakin ingin mengembalikan karyawan terpilih?",
"current_password" => "Kata kunci sekarang",
"current_password_invalid" => "Kata kunci sekarang salah.",
"employee" => "Karyawan",
"error_adding_updating" => "Kesalahan menambah / memperbarui karyawan.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Anda tidak dapat menghapus Demo admin user.",
"error_updating_demo_admin" => "Anda tidak dapat mengubah Demo admin user.",
"language" => "Bahasa",
"login_info" => "Info Login Karyawan",
"manager" => "",
"new" => "Karyawan Baru",
"none_selected" => "Anda belum memilih karyawan untuk dihapus.",
"one_or_multiple" => "Karyawan",
"password" => "Kata Sandi",
"password_minlength" => "Kata kunci minimal terdiri dari 8 karakter.",
"password_must_match" => "Kata Sandi tidak cocok.",
"password_not_must_match" => "Kata kunci sekarang dan kata kunci baru harus unik.",
"password_required" => "Kata Sandi wajib diisi.",
"permission_desc" => "Tandai kotak di bawah ini untuk memberikan akses ke Modul.",
"permission_info" => "Hak Akses Karyawan",
"repeat_password" => "Ulang Kata Sandi",
"subpermission_required" => "Paling tidak tambahkan satu hak akses untuk setiap modul.",
"successful_adding" => "Anda telah berhasil menambahkan karyawan.",
"successful_change_password" => "Kata kunci berhasil diubah.",
"successful_deleted" => "Berhasil menghapus Kartu Hadiah",
"successful_updating" => "Anda telah berhasil memperbarui karyawan",
"system_language" => "Bahasa Sistem",
"unsuccessful_change_password" => "Gagal mengubah kata sandi.",
"update" => "Ubah Karyawan",
"username" => "Nama Pengguna",
"username_duplicate" => "Nama pengguna karyawan sudah digunakan. Silakan pilih yang lain.",
"username_minlength" => "Nama Pengguna minimal 5 huruf.",
"username_required" => "Nama Pengguna wajib diisi.",
'administrator' => '',
'basic_information' => 'Informasi Karyawan',
'cannot_be_deleted' => 'Karyawan terpilih tidak bisa dihapus satu atau lebih dari para pekerja telah memproses penjualan atau Anda mencoba untuk menghapus diri Anda sendiri.',
'change_employee' => '',
'change_password' => 'Ubah kata kunci',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Apakah Anda yakin ingin menghapus karyawan yang dipilih?',
'confirm_restore' => 'Anda yakin ingin mengembalikan karyawan terpilih?',
'current_password' => 'Kata kunci sekarang',
'current_password_invalid' => 'Kata kunci sekarang salah.',
'employee' => 'Karyawan',
'error_adding_updating' => 'Kesalahan menambah / memperbarui karyawan.',
'error_cannot_remove_own_minimum_grant' => 'Anda tidak dapat menghapus hak akses modul minimum milik Anda sendiri.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'Anda tidak dapat menghapus Demo admin user.',
'error_grant_change_disallowed' => 'Perubahan izin dinonaktifkan dalam demo ini.',
'error_password_change_disallowed' => 'Perubahan kata sandi dinonaktifkan dalam demo ini.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'Anda tidak dapat mengubah Demo admin user.',
'language' => 'Bahasa',
'login_info' => 'Info Login Karyawan',
'manager' => '',
'new' => 'Karyawan Baru',
'none_selected' => 'Anda belum memilih karyawan untuk dihapus.',
'one_or_multiple' => 'Karyawan',
'password' => 'Kata Sandi',
'password_minlength' => 'Kata kunci minimal terdiri dari 8 karakter.',
'password_must_match' => 'Kata Sandi tidak cocok.',
'password_not_must_match' => 'Kata kunci sekarang dan kata kunci baru harus unik.',
'password_required' => 'Kata Sandi wajib diisi.',
'permission_desc' => 'Tandai kotak di bawah ini untuk memberikan akses ke Modul.',
'permission_info' => 'Hak Akses Karyawan',
'repeat_password' => 'Ulang Kata Sandi',
'subpermission_required' => 'Paling tidak tambahkan satu hak akses untuk setiap modul.',
'successful_adding' => 'Anda telah berhasil menambahkan karyawan.',
'successful_change_password' => 'Kata kunci berhasil diubah.',
'successful_deleted' => 'Berhasil menghapus Kartu Hadiah',
'successful_updating' => 'Anda telah berhasil memperbarui karyawan',
'system_language' => 'Bahasa Sistem',
'unsuccessful_change_password' => 'Gagal mengubah kata sandi.',
'update' => 'Ubah Karyawan',
'username' => 'Nama Pengguna',
'username_duplicate' => 'Nama pengguna karyawan sudah digunakan. Silakan pilih yang lain.',
'username_minlength' => 'Nama Pengguna minimal 5 huruf.',
'username_required' => 'Nama Pengguna wajib diisi.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "Amministratore",
"basic_information" => "Informazioni",
"cannot_be_deleted" => "Eliminazione dell'impiegato/i non consentita, uno o più hanno trattato delle vendite o stai cancellando il tuo account.",
"change_employee" => "Cambia Impiegato",
"change_password" => "Cambia Password",
"clerk" => "Impiegato",
"commission" => "Commissione",
"confirm_delete" => "Sei sicuro di voler eliminare l'impiegato/i selezionato?",
"confirm_restore" => "Sei sicuro di voler ripristinare gl'Impiegati selezionati?",
"current_password" => "Password Corrente",
"current_password_invalid" => "Password corrente non valida.",
"employee" => "Impiegato",
"error_adding_updating" => "Aggiunta o aggiornamento di impiegati fallito.",
"error_deleting_admin" => "Non puoi eliminare un utente amministratore.",
"error_updating_admin" => "Non puoi modificare un utente amministratore.",
"error_deleting_demo_admin" => "Non puoi eliminare l'utente admin demo.",
"error_updating_demo_admin" => "Non puoi cambiare l'utente admin demo.",
"language" => "Lingua",
"login_info" => "Login",
"manager" => "Manager",
"new" => "Nuovo Impiegato",
"none_selected" => "Non hai selezionato nessun impiegato da eliminare.",
"one_or_multiple" => "impiegato/i",
"password" => "Password",
"password_minlength" => "La Password deve essere lunga almeno 8 caratteri.",
"password_must_match" => "Le Password non corrispondono.",
"password_not_must_match" => "La password corrente e quella nuova devono essere uniche.",
"password_required" => "Password obbligatoria.",
"permission_desc" => "Barra le caselle sotto per garantire l'accesso ai moduli.",
"permission_info" => "Permessi",
"repeat_password" => "Password di nuovo",
"subpermission_required" => "Aggiungi almeno un permesso per ogni modulo.",
"successful_adding" => "Impiegato aggiunto correttamente.",
"successful_change_password" => "Password cambiata con successo.",
"successful_deleted" => "Eliminato correttamente",
"successful_updating" => "Hai correttamente aggiornato un impiegato",
"system_language" => "Lingua di sistema",
"unsuccessful_change_password" => "Cambio password fallito.",
"update" => "Aggiornamento Impiegato",
"username" => "Username",
"username_duplicate" => "",
"username_minlength" => "Lo Username deve essere almeno lungo 5 caratteri di lunghezza.",
"username_required" => "Il campo Username è richiesto.",
'administrator' => 'Amministratore',
'basic_information' => 'Informazioni',
'cannot_be_deleted' => 'Eliminazione dell\'impiegato/i non consentita, uno o più hanno trattato delle vendite o stai cancellando il tuo account.',
'change_employee' => 'Cambia Impiegato',
'change_password' => 'Cambia Password',
'clerk' => 'Impiegato',
'commission' => 'Commissione',
'confirm_delete' => 'Sei sicuro di voler eliminare l\'impiegato/i selezionato?',
'confirm_restore' => 'Sei sicuro di voler ripristinare gl\'Impiegati selezionati?',
'current_password' => 'Password Corrente',
'current_password_invalid' => 'Password corrente non valida.',
'employee' => 'Impiegato',
'error_adding_updating' => 'Aggiunta o aggiornamento di impiegati fallito.',
'error_cannot_remove_own_minimum_grant' => 'Non puoi rimuovere i tuoi permessi minimi di accesso ai moduli.',
'error_deleting_admin' => 'Non puoi eliminare un utente amministratore.',
'error_deleting_demo_admin' => 'Non puoi eliminare l\'utente admin demo.',
'error_grant_change_disallowed' => 'I cambiamenti dei permessi sono disabilitati in questa demo.',
'error_password_change_disallowed' => 'I cambiamenti della password sono disabilitati in questa demo.',
'error_updating_admin' => 'Non puoi modificare un utente amministratore.',
'error_updating_demo_admin' => 'Non puoi cambiare l\'utente admin demo.',
'language' => 'Lingua',
'login_info' => 'Login',
'manager' => 'Manager',
'new' => 'Nuovo Impiegato',
'none_selected' => 'Non hai selezionato nessun impiegato da eliminare.',
'one_or_multiple' => 'impiegato/i',
'password' => 'Password',
'password_minlength' => 'La Password deve essere lunga almeno 8 caratteri.',
'password_must_match' => 'Le Password non corrispondono.',
'password_not_must_match' => 'La password corrente e quella nuova devono essere uniche.',
'password_required' => 'Password obbligatoria.',
'permission_desc' => 'Barra le caselle sotto per garantire l\'accesso ai moduli.',
'permission_info' => 'Permessi',
'repeat_password' => 'Password di nuovo',
'subpermission_required' => 'Aggiungi almeno un permesso per ogni modulo.',
'successful_adding' => 'Impiegato aggiunto correttamente.',
'successful_change_password' => 'Password cambiata con successo.',
'successful_deleted' => 'Eliminato correttamente',
'successful_updating' => 'Hai correttamente aggiornato un impiegato',
'system_language' => 'Lingua di sistema',
'unsuccessful_change_password' => 'Cambio password fallito.',
'update' => 'Aggiornamento Impiegato',
'username' => 'Username',
'username_duplicate' => '',
'username_minlength' => 'Lo Username deve essere almeno lungo 5 caratteri di lunghezza.',
'username_required' => 'Il campo Username è richiesto.',
];
+50
View File
@@ -0,0 +1,50 @@
<?php
return [
'administrator' => '',
'basic_information' => '',
'cannot_be_deleted' => '',
'change_employee' => '',
'change_password' => '',
'clerk' => '',
'commission' => '',
'confirm_delete' => '',
'confirm_restore' => '',
'current_password' => '',
'current_password_invalid' => '',
'employee' => '',
'error_adding_updating' => '',
'error_cannot_remove_own_minimum_grant' => 'თქვენ არ შეგიძლიათ წაშალოთ თქვენი საკუთარი მინიმალური მოდულის წვდომის უფლებები.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => '',
'error_grant_change_disallowed' => 'უფლებების ცვლილებები დეაქტივირებულია ამ დემოში.',
'error_password_change_disallowed' => 'პაროლის ცვლილებები დეაქტივირებულია ამ დემოში.',
'error_updating_admin' => '',
'error_updating_demo_admin' => '',
'language' => '',
'login_info' => '',
'manager' => '',
'new' => '',
'none_selected' => '',
'one_or_multiple' => '',
'password' => '',
'password_minlength' => '',
'password_must_match' => '',
'password_not_must_match' => '',
'password_required' => '',
'permission_desc' => '',
'permission_info' => '',
'repeat_password' => '',
'subpermission_required' => '',
'successful_adding' => '',
'successful_change_password' => '',
'successful_deleted' => '',
'successful_updating' => '',
'system_language' => '',
'unsuccessful_change_password' => '',
'update' => '',
'username' => '',
'username_duplicate' => '',
'username_minlength' => '',
'username_required' => '',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "ព៌តមាន",
"cannot_be_deleted" => "មិនអាចលុបបុគ្គលិកដែលបានជ្រើសរើស, មួយ ឬក៏ច្រើន នៃការលក់ ឬអ្នកកំពុងព្យាយាមលុបគណនីរបស់ខ្លួន។",
"change_employee" => "",
"change_password" => "ផ្លាស់ប្ដូរពាក្យសម្ងាត់",
"clerk" => "",
"commission" => "",
"confirm_delete" => "តើអ្នកពិតជាចង់លុបបុគ្គលិកដែលបានជ្រើសរើសមែនទេ?",
"confirm_restore" => "តើអ្នកពិតជាចង់ដាក់មកវិញនៅបុគ្គលិកដែរបានជ្រើសរើស?",
"current_password" => "ពាក្យសម្ងាត់បច្ចុប្បន្ន",
"current_password_invalid" => "ពាក្យសម្ងាត់បច្ចុប្បន្ន មិនត្រឹមត្រូវ។",
"employee" => "បុគ្គលិក",
"error_adding_updating" => "បន្ថែម ឬកែប្រែបុគ្គលិកមិនបានសំរេច។",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "អ្នកមិនអាចលុប គណនីសាកល្បង បានទេ។",
"error_updating_demo_admin" => "អ្នកមិនអាចកែប្រែ គណនីសាកល្បងបានទេ។",
"language" => "ភាសា",
"login_info" => "ចូលទៅក្នុងប្រពន្ធ័",
"manager" => "",
"new" => "បុគ្គលិកថ្មី",
"none_selected" => "អ្នកមិនបានជ្រើសរើស បុគ្គលិកណាមួយដើម្បីលុបនោះទេ។",
"one_or_multiple" => "បុគ្គលិក",
"password" => "ពាក្យសម្ងាត់",
"password_minlength" => "ពាក្យសម្ងាត់ ត្រូវតែមានយ៉ាងតិច​ 8 តួអក្សរ។",
"password_must_match" => "ពាក្យសម្ងាត់មិនដូចគ្នា។",
"password_not_must_match" => "ពាក្យសម្ងាត់បច្ចុប្បន្ន នឹងពាក្យសម្ងាត់ថ្មី ត្រូវតែមានតែមួយ។",
"password_required" => "ត្រូវការពាក្យសម្ងាត់។",
"permission_desc" => "ឆែកប្រអប់ខាងក្រោម ដើម្បីផ្ដល់សិទ្ធទៅក្នុងផ្នែកណាមួយ។",
"permission_info" => "សិទ្ធិ",
"repeat_password" => "ពាក្យសម្ងាត់ម្ដងទៀត",
"subpermission_required" => "យ៉ាងហោចណាស់ក៏មាន ផ្នែកមួយត្រូវតែផ្ដល់សិទ្ធិ។",
"successful_adding" => "ការបន្ថែមបុគ្គលិកបានទទួលជោគជ័យ។",
"successful_change_password" => "ការផ្លាស់ប្ដូរពាក្យសម្ងាត់ទទួលបានជោគជ័យ។",
"successful_deleted" => "អ្នកទទួលបានជោគជ័យក្នុងការលុប",
"successful_updating" => "អ្នកទទួលបានជោគជ័យ ក្នុងការកែប្រែបុគ្គលិក",
"system_language" => "ភាសារបស់ប្រព័ន្ធ",
"unsuccessful_change_password" => "ការផ្លាស់ប្ដូរពាក្យសម្ងាត់មិនបានសំរេច។",
"update" => "កែប្រែបុគ្គលិក",
"username" => "ឈ្នោះអ្នកប្រើប្រាស់",
"username_duplicate" => "ឈ្មោះបុគ្គលិកត្រូវបានប្រើប្រាស់រួចរាល់។ សូមជ្រើសរើសសារជាថ្មី។",
"username_minlength" => "ឈ្មោះអ្នកប្រើប្រាស់ត្រូវមាន 5 តួអក្សរយ៉ាងតិច។",
"username_required" => "ឈ្ោះអ្នកប្រើប្រាស់ត្រូវការចាំបាច់។",
'administrator' => '',
'basic_information' => 'ព៌តមាន',
'cannot_be_deleted' => 'មិនអាចលុបបុគ្គលិកដែលបានជ្រើសរើស, មួយ ឬក៏ច្រើន នៃការលក់ ឬអ្នកកំពុងព្យាយាមលុបគណនីរបស់ខ្លួន។',
'change_employee' => '',
'change_password' => 'ផ្លាស់ប្ដូរពាក្យសម្ងាត់',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'តើអ្នកពិតជាចង់លុបបុគ្គលិកដែលបានជ្រើសរើសមែនទេ?',
'confirm_restore' => 'តើអ្នកពិតជាចង់ដាក់មកវិញនៅបុគ្គលិកដែរបានជ្រើសរើស?',
'current_password' => 'ពាក្យសម្ងាត់បច្ចុប្បន្ន',
'current_password_invalid' => 'ពាក្យសម្ងាត់បច្ចុប្បន្ន មិនត្រឹមត្រូវ។',
'employee' => 'បុគ្គលិក',
'error_adding_updating' => 'បន្ថែម ឬកែប្រែបុគ្គលិកមិនបានសំរេច។',
'error_cannot_remove_own_minimum_grant' => 'អ្នកមិនអាចដកសិទ្ធិចូលប្រើផ្នែកអប្បបរមារបស់ខ្លួនឯងបានទេ។',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'អ្នកមិនអាចលុប គណនីសាកល្បង បានទេ។',
'error_grant_change_disallowed' => 'ការផ្លាស់ប្តូរលក្ខណៈប្រadministrative ត្រូវបានគ្របដណ្តប់ក្នុងលក្ខណៈពិសេស។',
'error_password_change_disallowed' => 'ការផ្លាស់ប្តូរលេខសម្ងាត់ត្រូវបានគ្របដណ្តប់ក្នុងលក្ខណៈពិសេស។',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'អ្នកមិនអាចកែប្រែ គណនីសាកល្បងបានទេ។',
'language' => 'ភាសា',
'login_info' => 'ចូលទៅក្នុងប្រពន្ធ័',
'manager' => '',
'new' => 'បុគ្គលិកថ្មី',
'none_selected' => 'អ្នកមិនបានជ្រើសរើស បុគ្គលិកណាមួយដើម្បីលុបនោះទេ។',
'one_or_multiple' => 'បុគ្គលិក',
'password' => 'ពាក្យសម្ងាត់',
'password_minlength' => 'ពាក្យសម្ងាត់ ត្រូវតែមានយ៉ាងតិច​ 8 តួអក្សរ។',
'password_must_match' => 'ពាក្យសម្ងាត់មិនដូចគ្នា។',
'password_not_must_match' => 'ពាក្យសម្ងាត់បច្ចុប្បន្ន នឹងពាក្យសម្ងាត់ថ្មី ត្រូវតែមានតែមួយ។',
'password_required' => 'ត្រូវការពាក្យសម្ងាត់។',
'permission_desc' => 'ឆែកប្រអប់ខាងក្រោម ដើម្បីផ្ដល់សិទ្ធទៅក្នុងផ្នែកណាមួយ។',
'permission_info' => 'សិទ្ធិ',
'repeat_password' => 'ពាក្យសម្ងាត់ម្ដងទៀត',
'subpermission_required' => 'យ៉ាងហោចណាស់ក៏មាន ផ្នែកមួយត្រូវតែផ្ដល់សិទ្ធិ។',
'successful_adding' => 'ការបន្ថែមបុគ្គលិកបានទទួលជោគជ័យ។',
'successful_change_password' => 'ការផ្លាស់ប្ដូរពាក្យសម្ងាត់ទទួលបានជោគជ័យ។',
'successful_deleted' => 'អ្នកទទួលបានជោគជ័យក្នុងការលុប',
'successful_updating' => 'អ្នកទទួលបានជោគជ័យ ក្នុងការកែប្រែបុគ្គលិក',
'system_language' => 'ភាសារបស់ប្រព័ន្ធ',
'unsuccessful_change_password' => 'ការផ្លាស់ប្ដូរពាក្យសម្ងាត់មិនបានសំរេច។',
'update' => 'កែប្រែបុគ្គលិក',
'username' => 'ឈ្ោះអ្នកប្រើប្រាស់',
'username_duplicate' => 'ឈ្មោះបុគ្គលិកត្រូវបានប្រើប្រាស់រួចរាល់។ សូមជ្រើសរើសសារជាថ្មី។',
'username_minlength' => 'ឈ្មោះអ្នកប្រើប្រាស់ត្រូវមាន 5 តួអក្សរយ៉ាងតិច។',
'username_required' => 'ឈ្មោះអ្នកប្រើប្រាស់ត្រូវការចាំបាច់។',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "ຂໍ້ມູນ",
"cannot_be_deleted" => "ບໍ່ສາມາດລຶບພະນັກງານທີ່ເລືອກໄດ້, ຢ່າງໜ້ອຍມີ 1 ລາຍການຫຼືຫຼາຍກວ່ານັ້ນ ຍັງມີການຊື້ຂາຍກັນຢູ່ ຫຼື ທ່ານກຳລັງພະຍາຍາມລຶບບັນຊີຂອງຕົວເອງ.",
"change_employee" => "",
"change_password" => "ປ່ຽນ Password",
"clerk" => "",
"commission" => "",
"confirm_delete" => "ທ່ານຈະລຶບພະນັກງານທີ່ເລືອກແທ້ບໍ່ ?",
"confirm_restore" => "",
"current_password" => "Password ປັດຈຸບັນ",
"current_password_invalid" => "Password ປັດຈຸບັນບໍ່ຖືກຕ້ອງ.",
"employee" => "ພະນັກງານ",
"error_adding_updating" => "ເພີ່ມ ຫຼື ແກ້ໄຂ ພະນັກງານ ບໍ່ສຳເລັດ.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "ທ່ານບໍ່ສາມາດລຶບບັນຊີທົດລອງຜູ້ດູແລລະບົບໄດ້.",
"error_updating_demo_admin" => "ທ່ານບໍ່ສາມາດປ່ຽນແປງບັນຊີທົດລອງຜູ້ດູແລລະບົບໄດ້.",
"language" => "ພາສາ",
"login_info" => "ເຂົ້າລະບົບ",
"manager" => "",
"new" => "ພະນັກງານໃໝ່",
"none_selected" => "ທ່ານຍັງບໍ່ໄດ້ເລືອກພະນັກງານໃດເລີຍເພື່ອລຶບ.",
"one_or_multiple" => "ພະນັກງານ",
"password" => "Password",
"password_minlength" => "Password ຄວນໃສ່ຢ່າງໜ້ອຍ 8 ຕົວອັກສອນ.",
"password_must_match" => "Password ບໍ່ຄືກັນ.",
"password_not_must_match" => "Password ປັດຈຸບັນ ແລະ Password ໃໝ່ ຈະຕ້ອງບໍ່ຄືກັນ.",
"password_required" => "Password ຈຳເປັນຕ້ອງໃສ່.",
"permission_desc" => "ຕິກຂໍ້ມູນດ້ານລຸ່ມເພື່ອໃຫ້ສາມາດນຳໃຊ້ Modules ຕ່າງໆໄດ້.",
"permission_info" => "ສິດ",
"repeat_password" => "ລະຫັດຜ່ານອີກຄັ້ງ",
"subpermission_required" => "Add at least one grant for each module.",
"successful_adding" => "ເພີ່ມພະນັກງານສຳເລັດ.",
"successful_change_password" => "ປ່ຽນລະຫັດຜ່ານສຳເລັດ.",
"successful_deleted" => "ທ່ານລຶບສຳເລັດແລ້ວ",
"successful_updating" => "ທ່ານແກ້ໄຂພະນັກງານສຳເລັດ",
"system_language" => "ພາສາຂອງລະບົບ",
"unsuccessful_change_password" => "ປ່ຽນລະຫັດຜ່ານບໍ່ສຳເລັດ.",
"update" => "ແກ້ໄຂພະນັກງານ",
"username" => "ຊື່ຜູ້ໃຊ້",
"username_duplicate" => "",
"username_minlength" => "Username ຕ້ອງໃສ່ຢ່າງໜ້ອຍ 5 ຕົວອັກສອນ.",
"username_required" => "Username ຈຳເປັນຕ້ອງໃສ່.",
'administrator' => '',
'basic_information' => 'ຂໍ້ມູນ',
'cannot_be_deleted' => 'ບໍ່ສາມາດລຶບພະນັກງານທີ່ເລືອກໄດ້, ຢ່າງໜ້ອຍມີ 1 ລາຍການຫຼືຫຼາຍກວ່ານັ້ນ ຍັງມີການຊື້ຂາຍກັນຢູ່ ຫຼື ທ່ານກຳລັງພະຍາຍາມລຶບບັນຊີຂອງຕົວເອງ.',
'change_employee' => '',
'change_password' => 'ປ່ຽນ Password',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'ທ່ານຈະລຶບພະນັກງານທີ່ເລືອກແທ້ບໍ່ ?',
'confirm_restore' => '',
'current_password' => 'Password ປັດຈຸບັນ',
'current_password_invalid' => 'Password ປັດຈຸບັນບໍ່ຖືກຕ້ອງ.',
'employee' => 'ພະນັກງານ',
'error_adding_updating' => 'ເພີ່ມ ຫຼື ແກ້ໄຂ ພະນັກງານ ບໍ່ສຳເລັດ.',
'error_cannot_remove_own_minimum_grant' => 'ທ່ານບໍ່ສາມາດເອົາສິດອະນຸຍາດຂັ້ນຕ່ຳຂອງຕົນເອງອອກໄດ້.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'ທ່ານບໍ່ສາມາດລຶບບັນຊີທົດລອງຜູ້ດູແລລະບົບໄດ້.',
'error_grant_change_disallowed' => 'ການປ່ຽນແປງສິດທິໄດ້ຖືກປິດໃນ demo ນີ້.',
'error_password_change_disallowed' => 'ການປ່ຽນແປງລະຫັດຜ່ານໄດ້ຖືກປິດໃນ demo ນີ້.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'ທ່ານບໍ່ສາມາດປ່ຽນແປງບັນຊີທົດລອງຜູ້ດູແລລະບົບໄດ້.',
'language' => 'ພາສາ',
'login_info' => 'ເຂົ້າລະບົບ',
'manager' => '',
'new' => 'ພະນັກງານໃໝ່',
'none_selected' => 'ທ່ານຍັງບໍ່ໄດ້ເລືອກພະນັກງານໃດເລີຍເພື່ອລຶບ.',
'one_or_multiple' => 'ພະນັກງານ',
'password' => 'Password',
'password_minlength' => 'Password ຄວນໃສ່ຢ່າງໜ້ອຍ 8 ຕົວອັກສອນ.',
'password_must_match' => 'Password ບໍ່ຄືກັນ.',
'password_not_must_match' => 'Password ປັດຈຸບັນ ແລະ Password ໃໝ່ ຈະຕ້ອງບໍ່ຄືກັນ.',
'password_required' => 'Password ຈຳເປັນຕ້ອງໃສ່.',
'permission_desc' => 'ຕິກຂໍ້ມູນດ້ານລຸ່ມເພື່ອໃຫ້ສາມາດນຳໃຊ້ Modules ຕ່າງໆໄດ້.',
'permission_info' => 'ສິດ',
'repeat_password' => 'ລະຫັດຜ່ານອີກຄັ້ງ',
'subpermission_required' => 'Add at least one grant for each module.',
'successful_adding' => 'ເພີ່ມພະນັກງານສຳເລັດ.',
'successful_change_password' => 'ປ່ຽນລະຫັດຜ່ານສຳເລັດ.',
'successful_deleted' => 'ທ່ານລຶບສຳເລັດແລ້ວ',
'successful_updating' => 'ທ່ານແກ້ໄຂພະນັກງານສຳເລັດ',
'system_language' => 'ພາສາຂອງລະບົບ',
'unsuccessful_change_password' => 'ປ່ຽນລະຫັດຜ່ານບໍ່ສຳເລັດ.',
'update' => 'ແກ້ໄຂພະນັກງານ',
'username' => 'ຊື່ຜູ້ໃຊ້',
'username_duplicate' => '',
'username_minlength' => 'Username ຕ້ອງໃສ່ຢ່າງໜ້ອຍ 5 ຕົວອັກສອນ.',
'username_required' => 'Username ຈຳເປັນຕ້ອງໃສ່.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "",
"cannot_be_deleted" => "",
"change_employee" => "",
"change_password" => "",
"clerk" => "",
"commission" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"current_password" => "",
"current_password_invalid" => "",
"employee" => "",
"error_adding_updating" => "",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "",
"error_updating_demo_admin" => "",
"language" => "",
"login_info" => "",
"manager" => "",
"new" => "",
"none_selected" => "",
"one_or_multiple" => "",
"password" => "",
"password_minlength" => "",
"password_must_match" => "",
"password_not_must_match" => "",
"password_required" => "",
"permission_desc" => "",
"permission_info" => "",
"repeat_password" => "",
"subpermission_required" => "",
"successful_adding" => "",
"successful_change_password" => "",
"successful_deleted" => "",
"successful_updating" => "",
"system_language" => "",
"unsuccessful_change_password" => "",
"update" => "",
"username" => "",
"username_duplicate" => "",
"username_minlength" => "",
"username_required" => "",
'administrator' => '',
'basic_information' => '',
'cannot_be_deleted' => '',
'change_employee' => '',
'change_password' => '',
'clerk' => '',
'commission' => '',
'confirm_delete' => '',
'confirm_restore' => '',
'current_password' => '',
'current_password_invalid' => '',
'employee' => '',
'error_adding_updating' => '',
'error_cannot_remove_own_minimum_grant' => 'നിങ്ങളുടെ സ്വന്തം കുറഞ്ഞ മൊഡ്യൂൾ അനുമതികൾ നീക്കം ചെയ്യാൻ കഴിയില്ല.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => '',
'error_grant_change_disallowed' => 'അനുമതി മാറ്റങ്ങൾ ഈ ഡെമോയിൽ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.',
'error_password_change_disallowed' => 'പാസ്‌വേർഡ് മാറ്റങ്ങൾ ഈ ഡെമോയിൽ പ്രവർത്തനരഹിതമാക്കിയിരിക്കുന്നു.',
'error_updating_admin' => '',
'error_updating_demo_admin' => '',
'language' => '',
'login_info' => '',
'manager' => '',
'new' => '',
'none_selected' => '',
'one_or_multiple' => '',
'password' => '',
'password_minlength' => '',
'password_must_match' => '',
'password_not_must_match' => '',
'password_required' => '',
'permission_desc' => '',
'permission_info' => '',
'repeat_password' => '',
'subpermission_required' => '',
'successful_adding' => '',
'successful_change_password' => '',
'successful_deleted' => '',
'successful_updating' => '',
'system_language' => '',
'unsuccessful_change_password' => '',
'update' => '',
'username' => '',
'username_duplicate' => '',
'username_minlength' => '',
'username_required' => '',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "",
"cannot_be_deleted" => "",
"change_employee" => "",
"change_password" => "",
"clerk" => "",
"commission" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"current_password" => "",
"current_password_invalid" => "",
"employee" => "",
"error_adding_updating" => "",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "",
"error_updating_demo_admin" => "",
"language" => "",
"login_info" => "",
"manager" => "",
"new" => "",
"none_selected" => "",
"one_or_multiple" => "",
"password" => "",
"password_minlength" => "",
"password_must_match" => "",
"password_not_must_match" => "",
"password_required" => "",
"permission_desc" => "",
"permission_info" => "",
"repeat_password" => "",
"subpermission_required" => "",
"successful_adding" => "",
"successful_change_password" => "",
"successful_deleted" => "",
"successful_updating" => "",
"system_language" => "",
"unsuccessful_change_password" => "",
"update" => "",
"username" => "",
"username_duplicate" => "",
"username_minlength" => "",
"username_required" => "",
'administrator' => '',
'basic_information' => '',
'cannot_be_deleted' => '',
'change_employee' => '',
'change_password' => '',
'clerk' => '',
'commission' => '',
'confirm_delete' => '',
'confirm_restore' => '',
'current_password' => '',
'current_password_invalid' => '',
'employee' => '',
'error_adding_updating' => '',
'error_cannot_remove_own_minimum_grant' => 'Du kan ikke fjerne dine egne minimumsrettigheter for moduler.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => '',
'error_grant_change_disallowed' => 'Tillatelser kan ikke endres i denne demoen.',
'error_password_change_disallowed' => 'Passordet kan ikke endres i denne demoen.',
'error_updating_admin' => '',
'error_updating_demo_admin' => '',
'language' => '',
'login_info' => '',
'manager' => '',
'new' => '',
'none_selected' => '',
'one_or_multiple' => '',
'password' => '',
'password_minlength' => '',
'password_must_match' => '',
'password_not_must_match' => '',
'password_required' => '',
'permission_desc' => '',
'permission_info' => '',
'repeat_password' => '',
'subpermission_required' => '',
'successful_adding' => '',
'successful_change_password' => '',
'successful_deleted' => '',
'successful_updating' => '',
'system_language' => '',
'unsuccessful_change_password' => '',
'update' => '',
'username' => '',
'username_duplicate' => '',
'username_minlength' => '',
'username_required' => '',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Informatie",
"cannot_be_deleted" => "Kon de geselecteerde gebruilker(s) niet verwijderen, één of meerdere die u probeert te verwijderen hebben aankopen verwerkt.",
"change_employee" => "",
"change_password" => "Wijzig Paswoord",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Bent u zeker dat u de geselecteerde werknemers wil verwijderen?",
"confirm_restore" => "Bent u zeker dat u de geselecteerde werknemers wil herstellen?",
"current_password" => "Huidig Paswoord",
"current_password_invalid" => "Huidig paswoord is ongeldig.",
"employee" => "Werknemer",
"error_adding_updating" => "Fout bij het toevoegen/aanpassen medewerker.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Je kan de demo gebruilker niet verwijderen.",
"error_updating_demo_admin" => "Jij kan de demo gebruiker niet veranderen.",
"language" => "Taal",
"login_info" => "Login",
"manager" => "",
"new" => "N. Werknemer",
"none_selected" => "U hebt geen werknemers geselecteerd.",
"one_or_multiple" => "werknemer(s) verwijderd",
"password" => "Paswoord",
"password_minlength" => "Paswoord moet minstens 8 characters lang zijn.",
"password_must_match" => "Paswoorden komen niet overeen.",
"password_not_must_match" => "Het huidige en het nieuwe paswoord moeten verschillend zijn.",
"password_required" => "Paswoord moet ingevuld worden.",
"permission_desc" => "Vink de selectievakjes hieronder aan om toegang te verlenen tot de modules.",
"permission_info" => "Rechten",
"repeat_password" => "Herhaal Paswoord",
"subpermission_required" => "Selecteer minstens één permissie voor elke module.",
"successful_adding" => "Je hebt met succes een medewerker toegevoegd.",
"successful_change_password" => "Paswoord wijziging geslaagd.",
"successful_deleted" => "Er werd(en)",
"successful_updating" => "Je hebt met succes de medewerker gewijzigd",
"system_language" => "Systeem taal",
"unsuccessful_change_password" => "Paswoord wijziging gefaald.",
"update" => "Update Werknemer",
"username" => "Gebruikersnaam",
"username_duplicate" => "Werknemer gebruikersnaam is al in gebruik. Gelieve een andere te kiezen.",
"username_minlength" => "Gebruikersnaam moet minstens 5 characters lang zijn.",
"username_required" => "Gebruikersnaam moet ingevuld worden.",
'administrator' => '',
'basic_information' => 'Informatie',
'cannot_be_deleted' => 'Kon de geselecteerde gebruiker(s) niet verwijderen',
'change_employee' => '',
'change_password' => 'Wijzig Paswoord',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Bent u zeker dat u de geselecteerde werknemers wil verwijderen?',
'confirm_restore' => 'Bent u zeker dat u de geselecteerde werknemers wil herstellen?',
'current_password' => 'Huidig Paswoord',
'current_password_invalid' => 'Huidig paswoord is ongeldig.',
'employee' => 'Werknemer',
'error_adding_updating' => 'Fout bij het toevoegen/aanpassen medewerker.',
'error_cannot_remove_own_minimum_grant' => 'U kan uw eigen minimale modulerechten niet verwijderen.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'Je kan de demo gebruilker niet verwijderen.',
'error_grant_change_disallowed' => 'Machtigingswijzigingen zijn uitgeschakeld in deze demo.',
'error_password_change_disallowed' => 'Wachtwoordwijzigingen zijn uitgeschakeld in deze demo.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'Jij kan de demo gebruiker niet veranderen.',
'language' => 'Taal',
'login_info' => 'Login',
'manager' => '',
'new' => 'N. Werknemer',
'none_selected' => 'U hebt geen werknemers geselecteerd.',
'one_or_multiple' => 'werknemer(s) verwijderd',
'password' => 'Paswoord',
'password_minlength' => 'Paswoord moet minstens 8 characters lang zijn.',
'password_must_match' => 'Paswoorden komen niet overeen.',
'password_not_must_match' => 'Het huidige en het nieuwe paswoord moeten verschillend zijn.',
'password_required' => 'Paswoord moet ingevuld worden.',
'permission_desc' => 'Vink de selectievakjes hieronder aan om toegang te verlenen tot de modules.',
'permission_info' => 'Rechten',
'repeat_password' => 'Herhaal Paswoord',
'subpermission_required' => 'Selecteer minstens één permissie voor elke module.',
'successful_adding' => 'Je hebt met succes een medewerker toegevoegd.',
'successful_change_password' => 'Paswoord wijziging geslaagd.',
'successful_deleted' => 'Er werd(en)',
'successful_updating' => 'Je hebt met succes de medewerker gewijzigd',
'system_language' => 'Systeem taal',
'unsuccessful_change_password' => 'Paswoord wijziging gefaald.',
'update' => 'Update Werknemer',
'username' => 'Gebruikersnaam',
'username_duplicate' => 'Werknemer gebruikersnaam is al in gebruik. Gelieve een andere te kiezen.',
'username_minlength' => 'Gebruikersnaam moet minstens 5 characters lang zijn.',
'username_required' => 'Gebruikersnaam moet ingevuld worden.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "Beheerder",
"basic_information" => "Informatie",
"cannot_be_deleted" => "Kan geselecteerde werknemer(s) niet verwijderen, één of meerdere bevatten verwerkte verkopen of u probeert uw account te verwijderen.",
"change_employee" => "Werknemer wijzigen",
"change_password" => "Wachtwoord wijzigen",
"clerk" => "Bediende",
"commission" => "Commissie",
"confirm_delete" => "Weet u zeker dat u de geselecteerde werknemer(s) wilt verwijderen?",
"confirm_restore" => "Weet u zeker dat u de geselecteerde werknemer(s) wilt herstellen?",
"current_password" => "Huidige wachtwoord",
"current_password_invalid" => "Huidige wachtwoord is ongeldig.",
"employee" => "Werknemer",
"error_adding_updating" => "Werknemer toevoegen of bijwerken mislukt.",
"error_deleting_admin" => "U kunt een beheerder niet verwijderen.",
"error_updating_admin" => "U kunt een beheerder niet wijzigen.",
"error_deleting_demo_admin" => "Kan de demo admin gebruiker niet verwijderen.",
"error_updating_demo_admin" => "Kan de demo admin gebruiker niet wijzigen.",
"language" => "Taal",
"login_info" => "Aanmelden",
"manager" => "Manager",
"new" => "Nieuwe werknemer",
"none_selected" => "Geen werknemer(s) geselecteerd om te verwijderen.",
"one_or_multiple" => "werknemer(s)",
"password" => "Wachtwoord",
"password_minlength" => "Wachtwoord moet minstens 8 karakters bevatten.",
"password_must_match" => "Wachtwoorden komen niet overeen.",
"password_not_must_match" => "Huidige wachtwoord en nieuwe wachtwoord moeten uniek zijn.",
"password_required" => "Wachtwoord is vereist.",
"permission_desc" => "De selectievakjes hieronder selecteren om toegang te verlenen tot modules.",
"permission_info" => "Machtigingen",
"repeat_password" => "Wachtwoord opnieuw",
"subpermission_required" => "Tenminste eenmaal toegang verlenen voor elke module.",
"successful_adding" => "Werknemer toegevoegd.",
"successful_change_password" => "Wachtwoord gewijzigd.",
"successful_deleted" => "U heeft verwijderd",
"successful_updating" => "Werknemer bijgewerkt",
"system_language" => "Systeemtaal",
"unsuccessful_change_password" => "Wachtwoord wijzigen mislukt.",
"update" => "Werknemer bijwerken",
"username" => "Gebruikersnaam",
"username_duplicate" => "",
"username_minlength" => "Gebruikersnaam moet minstens 5 karakters bevatten.",
"username_required" => "Gebruikersnaam is een vereist veld.",
'administrator' => 'Beheerder',
'basic_information' => 'Informatie',
'cannot_be_deleted' => 'Kan geselecteerde werknemer(s) niet verwijderen',
'change_employee' => 'Werknemer wijzigen',
'change_password' => 'Wachtwoord wijzigen',
'clerk' => 'Bediende',
'commission' => 'Commissie',
'confirm_delete' => 'Weet u zeker dat u de geselecteerde werknemer(s) wilt verwijderen?',
'confirm_restore' => 'Weet u zeker dat u de geselecteerde werknemer(s) wilt herstellen?',
'current_password' => 'Huidige wachtwoord',
'current_password_invalid' => 'Huidige wachtwoord is ongeldig.',
'employee' => 'Werknemer',
'error_adding_updating' => 'Werknemer toevoegen of bijwerken mislukt.',
'error_cannot_remove_own_minimum_grant' => 'U kunt uw eigen minimale machtigingen voor modules niet verwijderen.',
'error_deleting_admin' => 'U kunt een beheerder niet verwijderen.',
'error_deleting_demo_admin' => 'Kan de demo admin gebruiker niet verwijderen.',
'error_grant_change_disallowed' => 'Machtigingswijzigingen zijn uitgeschakeld in deze demo.',
'error_password_change_disallowed' => 'Wachtwoordwijzigingen zijn uitgeschakeld in deze demo.',
'error_updating_admin' => 'U kunt een beheerder niet wijzigen.',
'error_updating_demo_admin' => 'Kan de demo admin gebruiker niet wijzigen.',
'language' => 'Taal',
'login_info' => 'Aanmelden',
'manager' => 'Manager',
'new' => 'Nieuwe werknemer',
'none_selected' => 'Geen werknemer(s) geselecteerd om te verwijderen.',
'one_or_multiple' => 'werknemer(s)',
'password' => 'Wachtwoord',
'password_minlength' => 'Wachtwoord moet minstens 8 karakters bevatten.',
'password_must_match' => 'Wachtwoorden komen niet overeen.',
'password_not_must_match' => 'Huidige wachtwoord en nieuwe wachtwoord moeten uniek zijn.',
'password_required' => 'Wachtwoord is vereist.',
'permission_desc' => 'De selectievakjes hieronder selecteren om toegang te verlenen tot modules.',
'permission_info' => 'Machtigingen',
'repeat_password' => 'Wachtwoord opnieuw',
'subpermission_required' => 'Tenminste eenmaal toegang verlenen voor elke module.',
'successful_adding' => 'Werknemer toegevoegd.',
'successful_change_password' => 'Wachtwoord gewijzigd.',
'successful_deleted' => 'U heeft verwijderd',
'successful_updating' => 'Werknemer bijgewerkt',
'system_language' => 'Systeemtaal',
'unsuccessful_change_password' => 'Wachtwoord wijzigen mislukt.',
'update' => 'Werknemer bijwerken',
'username' => 'Gebruikersnaam',
'username_duplicate' => '',
'username_minlength' => 'Gebruikersnaam moet minstens 5 karakters bevatten.',
'username_required' => 'Gebruikersnaam is een vereist veld.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Informacje",
"cannot_be_deleted" => "",
"change_employee" => "",
"change_password" => "",
"clerk" => "",
"commission" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"current_password" => "",
"current_password_invalid" => "",
"employee" => "",
"error_adding_updating" => "",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "",
"error_updating_demo_admin" => "",
"language" => "",
"login_info" => "",
"manager" => "",
"new" => "",
"none_selected" => "",
"one_or_multiple" => "",
"password" => "",
"password_minlength" => "",
"password_must_match" => "",
"password_not_must_match" => "",
"password_required" => "",
"permission_desc" => "",
"permission_info" => "",
"repeat_password" => "",
"subpermission_required" => "",
"successful_adding" => "",
"successful_change_password" => "",
"successful_deleted" => "",
"successful_updating" => "",
"system_language" => "",
"unsuccessful_change_password" => "",
"update" => "",
"username" => "",
"username_duplicate" => "",
"username_minlength" => "",
"username_required" => "",
'administrator' => '',
'basic_information' => 'Informacje',
'cannot_be_deleted' => '',
'change_employee' => '',
'change_password' => '',
'clerk' => '',
'commission' => '',
'confirm_delete' => '',
'confirm_restore' => '',
'current_password' => '',
'current_password_invalid' => '',
'employee' => '',
'error_adding_updating' => '',
'error_cannot_remove_own_minimum_grant' => 'Nie możesz usunąć własnych minimalnych uprawnień do modułów.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => '',
'error_grant_change_disallowed' => 'Zmiany uprawnień są wyłączone w tej wersji demo.',
'error_password_change_disallowed' => 'Zmiany hasła są wyłączone w tej wersji demo.',
'error_updating_admin' => '',
'error_updating_demo_admin' => '',
'language' => '',
'login_info' => '',
'manager' => '',
'new' => '',
'none_selected' => '',
'one_or_multiple' => '',
'password' => '',
'password_minlength' => '',
'password_must_match' => '',
'password_not_must_match' => '',
'password_required' => '',
'permission_desc' => '',
'permission_info' => '',
'repeat_password' => '',
'subpermission_required' => '',
'successful_adding' => '',
'successful_change_password' => '',
'successful_deleted' => '',
'successful_updating' => '',
'system_language' => '',
'unsuccessful_change_password' => '',
'update' => '',
'username' => '',
'username_duplicate' => '',
'username_minlength' => '',
'username_required' => '',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "Administrador",
"basic_information" => "Informações do Funcionário",
"cannot_be_deleted" => "Não foi possível excluir funcionários selecionados, um ou mais dos funcionários processou vendas ou você está tentando excluir-se :).",
"change_employee" => "Alterar Funcionário",
"change_password" => "Alterar senha",
"clerk" => "Funcionário",
"commission" => "Comissão",
"confirm_delete" => "Tem certeza de que deseja excluir os funcionários selecionados?",
"confirm_restore" => "Tem certeza de que deseja restaurar o (s) empregado (s) selecionado (s)?",
"current_password" => "Senha atual",
"current_password_invalid" => "Senha atual inválida.",
"employee" => "Funcionário",
"error_adding_updating" => "Erro ao adicionar/atualizar funcionário.",
"error_deleting_admin" => "Você não pode excluir um usuário administrador.",
"error_updating_admin" => "Você não pode modificar um usuário administrador.",
"error_deleting_demo_admin" => "Você não pode excluir o usuário administrador de demonstração.",
"error_updating_demo_admin" => "Você não pode alterar o usuário de demonstração de administração.",
"language" => "Linguagem",
"login_info" => "Autenticação",
"manager" => "Gerente",
"new" => "Novo Funcionário",
"none_selected" => "Você não selecionou nenhum funcionário para excluir.",
"one_or_multiple" => "funcionário(s)",
"password" => "Senha",
"password_minlength" => "As senhas devem ter pelo menos 8 caracteres.",
"password_must_match" => "As senhas não correspondem.",
"password_not_must_match" => "A senha atual e a nova senha devem ser exclusivas.",
"password_required" => "Senha requerida.",
"permission_desc" => "Marque as caixas abaixo para conceder acesso aos módulos.",
"permission_info" => "Permissões de acesso do funcionário",
"repeat_password" => "Confirme a senha",
"subpermission_required" => "Adicione pelo menos um privilégio para cada módulo.",
"successful_adding" => "Você adicionou o funcionário com sucesso.",
"successful_change_password" => "Alteração de senha bem sucedida.",
"successful_deleted" => "Você apagou o funcionário com sucesso",
"successful_updating" => "Você atualizou com sucesso o funcionário",
"system_language" => "Idioma do sistema",
"unsuccessful_change_password" => "Falha na mudança de senha.",
"update" => "Atualizar funcionário",
"username" => "Usuário",
"username_duplicate" => "",
"username_minlength" => "O nome de usuário deve ter pelo menos 5 caracteres.",
"username_required" => "Nome de Usuário é um campo obrigatório.",
'administrator' => 'Administrador',
'basic_information' => 'Informações do Funcionário',
'cannot_be_deleted' => 'Não foi possível excluir funcionários selecionados',
'change_employee' => 'Alterar Funcionário',
'change_password' => 'Alterar senha',
'clerk' => 'Funcionário',
'commission' => 'Comissão',
'confirm_delete' => 'Tem certeza de que deseja excluir os funcionários selecionados?',
'confirm_restore' => 'Tem certeza de que deseja restaurar o (s) empregado (s) selecionado (s)?',
'current_password' => 'Senha atual',
'current_password_invalid' => 'Senha atual inválida.',
'employee' => 'Funcionário',
'error_adding_updating' => 'Erro ao adicionar/atualizar funcionário.',
'error_cannot_remove_own_minimum_grant' => 'Você não pode remover suas próprias permissões mínimas de módulo.',
'error_deleting_admin' => 'Você não pode excluir um usuário administrador.',
'error_deleting_demo_admin' => 'Você não pode excluir o usuário administrador de demonstração.',
'error_grant_change_disallowed' => 'As alterações de permissão são desabilitadas nesta demonstração.',
'error_password_change_disallowed' => 'As alterações de senha são desabilitadas nesta demonstração.',
'error_updating_admin' => 'Você não pode modificar um usuário administrador.',
'error_updating_demo_admin' => 'Você não pode alterar o usuário de demonstração de administração.',
'language' => 'Linguagem',
'login_info' => 'Autenticação',
'manager' => 'Gerente',
'new' => 'Novo Funcionário',
'none_selected' => 'Você não selecionou nenhum funcionário para excluir.',
'one_or_multiple' => 'funcionário(s)',
'password' => 'Senha',
'password_minlength' => 'As senhas devem ter pelo menos 8 caracteres.',
'password_must_match' => 'As senhas não correspondem.',
'password_not_must_match' => 'A senha atual e a nova senha devem ser exclusivas.',
'password_required' => 'Senha requerida.',
'permission_desc' => 'Marque as caixas abaixo para conceder acesso aos módulos.',
'permission_info' => 'Permissões de acesso do funcionário',
'repeat_password' => 'Confirme a senha',
'subpermission_required' => 'Adicione pelo menos um privilégio para cada módulo.',
'successful_adding' => 'Você adicionou o funcionário com sucesso.',
'successful_change_password' => 'Alteração de senha bem sucedida.',
'successful_deleted' => 'Você apagou o funcionário com sucesso',
'successful_updating' => 'Você atualizou com sucesso o funcionário',
'system_language' => 'Idioma do sistema',
'unsuccessful_change_password' => 'Falha na mudança de senha.',
'update' => 'Atualizar funcionário',
'username' => 'Usuário',
'username_duplicate' => '',
'username_minlength' => 'O nome de usuário deve ter pelo menos 5 caracteres.',
'username_required' => 'Nome de Usuário é um campo obrigatório.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "",
"cannot_be_deleted" => "",
"change_employee" => "",
"change_password" => "",
"clerk" => "",
"commission" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"current_password" => "",
"current_password_invalid" => "",
"employee" => "",
"error_adding_updating" => "",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "",
"error_updating_demo_admin" => "",
"language" => "",
"login_info" => "",
"manager" => "",
"new" => "",
"none_selected" => "",
"one_or_multiple" => "",
"password" => "",
"password_minlength" => "",
"password_must_match" => "",
"password_not_must_match" => "",
"password_required" => "",
"permission_desc" => "",
"permission_info" => "",
"repeat_password" => "",
"subpermission_required" => "",
"successful_adding" => "",
"successful_change_password" => "",
"successful_deleted" => "",
"successful_updating" => "",
"system_language" => "",
"unsuccessful_change_password" => "",
"update" => "",
"username" => "",
"username_duplicate" => "",
"username_minlength" => "",
"username_required" => "",
'administrator' => '',
'basic_information' => '',
'cannot_be_deleted' => '',
'change_employee' => '',
'change_password' => '',
'clerk' => '',
'commission' => '',
'confirm_delete' => '',
'confirm_restore' => '',
'current_password' => '',
'current_password_invalid' => '',
'employee' => '',
'error_adding_updating' => '',
'error_cannot_remove_own_minimum_grant' => 'Nu vă puteți elimina propriile permisiuni minime pentru module.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => '',
'error_grant_change_disallowed' => 'Modificările permisiunilor sunt dezactivate în această demo.',
'error_password_change_disallowed' => 'Modificările parolei sunt dezactivate în această demo.',
'error_updating_admin' => '',
'error_updating_demo_admin' => '',
'language' => '',
'login_info' => '',
'manager' => '',
'new' => '',
'none_selected' => '',
'one_or_multiple' => '',
'password' => '',
'password_minlength' => '',
'password_must_match' => '',
'password_not_must_match' => '',
'password_required' => '',
'permission_desc' => '',
'permission_info' => '',
'repeat_password' => '',
'subpermission_required' => '',
'successful_adding' => '',
'successful_change_password' => '',
'successful_deleted' => '',
'successful_updating' => '',
'system_language' => '',
'unsuccessful_change_password' => '',
'update' => '',
'username' => '',
'username_duplicate' => '',
'username_minlength' => '',
'username_required' => '',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Информация",
"cannot_be_deleted" => "Не удалось удалить выбранных сотрудников, один или несколько из них обработали продажи или вы пытаетесь удалить свою учетную запись.",
"change_employee" => "",
"change_password" => "Смена пароля",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Вы уверены, что хотите удалить выбранных сотрудников?",
"confirm_restore" => "Вы уверены, что хотите восстановить выбранных сотрудников?",
"current_password" => "Текущий пароль",
"current_password_invalid" => "Текущий пароль введен неверно.",
"employee" => "Сотрудник",
"error_adding_updating" => "Ошибка при добавлении/обновлении сотрудника.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Вы не можете удалить демо-администратора.",
"error_updating_demo_admin" => "Вы не можете изменить демо-администратора.",
"language" => "Язык",
"login_info" => "Вход",
"manager" => "",
"new" => "Новый сотрудник",
"none_selected" => "Вы не выбрали ни одного сотрудника для удаления.",
"one_or_multiple" => "сотрудник(и)",
"password" => "Пароль",
"password_minlength" => "Пароль должен быть не менее 8 символов.",
"password_must_match" => "Пароли не совпадают.",
"password_not_must_match" => "Текущий пароль и новый пароль должны быть уникальными.",
"password_required" => "Ввод пароля - обязателен.",
"permission_desc" => "Отметьте флажками ниже, чтобы предоставить доступ к модулям.",
"permission_info" => "Права доступа",
"repeat_password" => "Повтор пароля",
"subpermission_required" => "Добавьте хотя бы одно разрешение для каждого модуля.",
"successful_adding" => "Сотрудник успешно создан.",
"successful_change_password" => "Смена пароля прошла успешно.",
"successful_deleted" => "Успешно удалено",
"successful_updating" => "Информация о сотруднике успешно обновлена",
"system_language" => "Язык системы",
"unsuccessful_change_password" => "Не удалось изменить пароль.",
"update" => "Обновление сотрудника",
"username" => "Имя пользователя",
"username_duplicate" => "Имя пользователя сотрудника уже используется. Пожалуйста, выберите другое.",
"username_minlength" => "Имя пользователя должно быть не менее 5 символов.",
"username_required" => "Имя пользователя - обязательное поле для заполнения.",
'administrator' => '',
'basic_information' => 'Информация',
'cannot_be_deleted' => 'Не удалось удалить выбранных сотрудников, один или несколько из них обработали продажи или вы пытаетесь удалить свою учетную запись.',
'change_employee' => '',
'change_password' => 'Смена пароля',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Вы уверены, что хотите удалить выбранных сотрудников?',
'confirm_restore' => 'Вы уверены, что хотите восстановить выбранных сотрудников?',
'current_password' => 'Текущий пароль',
'current_password_invalid' => 'Текущий пароль введен неверно.',
'employee' => 'Сотрудник',
'error_adding_updating' => 'Ошибка при добавлении/обновлении сотрудника.',
'error_cannot_remove_own_minimum_grant' => 'Вы не можете удалить собственные минимальные права доступа к модулям.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'Вы не можете удалить демо-администратора.',
'error_grant_change_disallowed' => 'Изменения прав доступа отключены в этой демонстрации.',
'error_password_change_disallowed' => 'Изменение пароля отключено в этой демонстрации.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'Вы не можете изменить демо-администратора.',
'language' => 'Язык',
'login_info' => 'Вход',
'manager' => '',
'new' => 'Новый сотрудник',
'none_selected' => 'Вы не выбрали ни одного сотрудника для удаления.',
'one_or_multiple' => 'сотрудник(и)',
'password' => 'Пароль',
'password_minlength' => 'Пароль должен быть не менее 8 символов.',
'password_must_match' => 'Пароли не совпадают.',
'password_not_must_match' => 'Текущий пароль и новый пароль должны быть уникальными.',
'password_required' => 'Ввод пароля - обязателен.',
'permission_desc' => 'Отметьте флажками ниже, чтобы предоставить доступ к модулям.',
'permission_info' => 'Права доступа',
'repeat_password' => 'Повтор пароля',
'subpermission_required' => 'Добавьте хотя бы одно разрешение для каждого модуля.',
'successful_adding' => 'Сотрудник успешно создан.',
'successful_change_password' => 'Смена пароля прошла успешно.',
'successful_deleted' => 'Успешно удалено',
'successful_updating' => 'Информация о сотруднике успешно обновлена',
'system_language' => 'Язык системы',
'unsuccessful_change_password' => 'Не удалось изменить пароль.',
'update' => 'Обновление сотрудника',
'username' => 'Имя пользователя',
'username_duplicate' => 'Имя пользователя сотрудника уже используется. Пожалуйста, выберите другое.',
'username_minlength' => 'Имя пользователя должно быть не менее 5 символов.',
'username_required' => 'Имя пользователя - обязательное поле для заполнения.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Information",
"cannot_be_deleted" => "Det går inte att radera valda anställda, en eller flera av de behandlade försäljningarna eller du försöker radera ditt konto.",
"change_employee" => "",
"change_password" => "Ändra lösenord",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Är du säker på att du vill radera de valda arbetstagarna?",
"confirm_restore" => "Är du säker på att du vill återställa valda anställda (er)?",
"current_password" => "Nuvarande lösenord",
"current_password_invalid" => "Nuvarande lösenord är fel.",
"employee" => "Anställd",
"error_adding_updating" => "Anställd lägg till eller uppdatering misslyckades.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Du kan inte radera demo admin-användaren.",
"error_updating_demo_admin" => "Du kan inte ändra demo admin-användaren.",
"language" => "Språk",
"login_info" => "Login",
"manager" => "",
"new" => "Ny anställd",
"none_selected" => "Du har inte valt någon anställd att radera.",
"one_or_multiple" => "Anställda",
"password" => "Lösenord",
"password_minlength" => "Lösenordet måste vara minst 8 tecken i längd.",
"password_must_match" => "Lösenorden matchar ej.",
"password_not_must_match" => "Nuvarande lösenord och nytt lösenord måste vara unikt.",
"password_required" => "Lösenord krävs.",
"permission_desc" => "Markera rutorna nedan för att ge tillgång till moduler.",
"permission_info" => "Behörigheter",
"repeat_password" => "Lösenord igen",
"subpermission_required" => "Lägg till minst en behörighet för varje modul.",
"successful_adding" => "Tillägg av anställd lyckades.",
"successful_change_password" => "Lösenordsbyte lyckades.",
"successful_deleted" => "Du har tagit bort",
"successful_updating" => "Du har uppdaterat anställda",
"system_language" => "System Språk",
"unsuccessful_change_password" => "Lösenordsbyte misslyckades.",
"update" => "Uppdatera anställd",
"username" => "Användarnamn",
"username_duplicate" => "Användarnamnet för den anställda används redan. Vänligen välj ett annat.",
"username_minlength" => "Användarnamnet måste vara minst 5 tecken långt.",
"username_required" => "Användarnamnet är ett obligatoriskt fält.",
'administrator' => '',
'basic_information' => 'Information',
'cannot_be_deleted' => 'Det går inte att radera valda anställda, en eller flera av dem har behandlat försäljningar eller du försöker radera ditt konto.',
'change_employee' => '',
'change_password' => 'Ändra lösenord',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Är du säker på att du vill radera de valda arbetstagarna?',
'confirm_restore' => 'Är du säker på att du vill återställa valda anställda (er)?',
'current_password' => 'Nuvarande lösenord',
'current_password_invalid' => 'Nuvarande lösenord är fel.',
'employee' => 'Anställd',
'error_adding_updating' => 'Anställd lägg till eller uppdatering misslyckades.',
'error_cannot_remove_own_minimum_grant' => 'Du kan inte ta bort dina egna minimibehörigheter för moduler.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'Du kan inte radera demo admin-användaren.',
'error_grant_change_disallowed' => 'Behörighetsändringar är inaktiverade i denna demo.',
'error_password_change_disallowed' => 'Lösenordsändringar är inaktiverade i denna demo.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'Du kan inte ändra demo admin-användaren.',
'language' => 'Språk',
'login_info' => 'Login',
'manager' => '',
'new' => 'Ny anställd',
'none_selected' => 'Du har inte valt någon anställd att radera.',
'one_or_multiple' => 'Anställda',
'password' => 'Lösenord',
'password_minlength' => 'Lösenordet måste vara minst 8 tecken i längd.',
'password_must_match' => 'Lösenorden matchar ej.',
'password_not_must_match' => 'Nuvarande lösenord och nytt lösenord måste vara unikt.',
'password_required' => 'Lösenord krävs.',
'permission_desc' => 'Markera rutorna nedan för att ge tillgång till moduler.',
'permission_info' => 'Behörigheter',
'repeat_password' => 'Lösenord igen',
'subpermission_required' => 'Lägg till minst en behörighet för varje modul.',
'successful_adding' => 'Tillägg av anställd lyckades.',
'successful_change_password' => 'Lösenordsbyte lyckades.',
'successful_deleted' => 'Du har tagit bort',
'successful_updating' => 'Du har uppdaterat anställda',
'system_language' => 'System Språk',
'unsuccessful_change_password' => 'Lösenordsbyte misslyckades.',
'update' => 'Uppdatera anställd',
'username' => 'Användarnamn',
'username_duplicate' => 'Användarnamnet för den anställda används redan. Vänligen välj ett annat.',
'username_minlength' => 'Användarnamnet måste vara minst 5 tecken långt.',
'username_required' => 'Användarnamnet är ett obligatoriskt fält.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?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_admin" => "",
"error_updating_admin" => "",
"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.",
'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_cannot_remove_own_minimum_grant' => 'Huwezi kuondoa ruhusa zako za chini kabisa za ufikiaji wa moduli.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'Huwezi kufuta mtumiaji wa admin wa majaribio.',
'error_grant_change_disallowed' => 'Mabadiliko ya ruhusa yamezimwa katika demo hii.',
'error_password_change_disallowed' => 'Mabadiliko ya neno la siri yamezimwa katika demo hii.',
'error_updating_admin' => '',
'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.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?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_admin" => "",
"error_updating_admin" => "",
"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.",
'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_cannot_remove_own_minimum_grant' => 'Huwezi kuondoa ruhusa zako za chini kabisa za ufikiaji wa moduli.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'Huwezi kufuta mtumiaji wa admin wa majaribio.',
'error_grant_change_disallowed' => 'Mabadiliko ya ruhusa yamezimwa katika demo hii.',
'error_password_change_disallowed' => 'Mabadiliko ya neno la siri yamezimwa katika demo hii.',
'error_updating_admin' => '',
'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.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Information",
"cannot_be_deleted" => "Unable to delete selected employee(s), one or more of the has processed sales or you are trying to delete your account.",
"change_employee" => "",
"change_password" => "Change Password",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Are you sure you want to delete the selected employee(s)?",
"confirm_restore" => "Are you sure you want to restore selected employee(s)?",
"current_password" => "Current Password",
"current_password_invalid" => "Current Password is invalid.",
"employee" => "Employee",
"error_adding_updating" => "Employee add or update failed.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "You can not delete the demo admin user.",
"error_updating_demo_admin" => "You can not change the demo admin user.",
"language" => "Language",
"login_info" => "Login",
"manager" => "",
"new" => "New Employee",
"none_selected" => "You have not selected any employee(s) to delete.",
"one_or_multiple" => "employee(s)",
"password" => "Password",
"password_minlength" => "Password must be at least 8 characters in length.",
"password_must_match" => "Passwords do not match.",
"password_not_must_match" => "Current password and new password must be unique.",
"password_required" => "Password is required.",
"permission_desc" => "Check the boxes below to grant access to modules.",
"permission_info" => "Permissions",
"repeat_password" => "Password Again",
"subpermission_required" => "Add at least one grant for each module.",
"successful_adding" => "Employee add successful.",
"successful_change_password" => "Password change successful.",
"successful_deleted" => "You have successfully deleted",
"successful_updating" => "You have successfully updated employee",
"system_language" => "System Language",
"unsuccessful_change_password" => "Password change failed.",
"update" => "Update Employee",
"username" => "Username",
"username_duplicate" => "",
"username_minlength" => "Username must be at least 5 characters in length.",
"username_required" => "Username is a required field.",
'administrator' => '',
'basic_information' => 'Information',
'cannot_be_deleted' => 'தேர்ந்தெடுக்கப்பட்ட ஊழியர்(களை) நீக்க முடியவில்லை, ஒன்று அல்லது அதற்கு மேற்பட்டவை விற்பனையை செயலாக்கியுள்ளன அல்லது நீங்கள் உங்கள் கணக்கை நீக்க முயற்சிக்கிறீர்கள்.',
'change_employee' => '',
'change_password' => 'Change Password',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Are you sure you want to delete the selected employee(s)?',
'confirm_restore' => 'Are you sure you want to restore selected employee(s)?',
'current_password' => 'Current Password',
'current_password_invalid' => 'Current Password is invalid.',
'employee' => 'Employee',
'error_adding_updating' => 'Employee add or update failed.',
'error_cannot_remove_own_minimum_grant' => 'உங்கள் சொந்த குறைந்தபட்ச தொகுதி அணுகல் அனுமதிகளை நீக்க முடியாது.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'You can not delete the demo admin user.',
'error_grant_change_disallowed' => 'அனுமதி மாற்றங்கள் இந்த டெமோவில் முடக்கப்பட்டுள்ளன.',
'error_password_change_disallowed' => 'கடவுச்சொல் மாற்றங்கள் இந்த டெமோவில் முடக்கப்பட்டுள்ளன.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'You can not change the demo admin user.',
'language' => 'Language',
'login_info' => 'Login',
'manager' => '',
'new' => 'New Employee',
'none_selected' => 'You have not selected any employee(s) to delete.',
'one_or_multiple' => 'employee(s)',
'password' => 'Password',
'password_minlength' => 'Password must be at least 8 characters in length.',
'password_must_match' => 'Passwords do not match.',
'password_not_must_match' => 'Current password and new password must be unique.',
'password_required' => 'Password is required.',
'permission_desc' => 'Check the boxes below to grant access to modules.',
'permission_info' => 'Permissions',
'repeat_password' => 'Password Again',
'subpermission_required' => 'Add at least one grant for each module.',
'successful_adding' => 'Employee add successful.',
'successful_change_password' => 'Password change successful.',
'successful_deleted' => 'You have successfully deleted',
'successful_updating' => 'You have successfully updated employee',
'system_language' => 'System Language',
'unsuccessful_change_password' => 'Password change failed.',
'update' => 'Update Employee',
'username' => 'Username',
'username_duplicate' => '',
'username_minlength' => 'Username must be at least 5 characters in length.',
'username_required' => 'Username is a required field.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
'administrator' => "",
'basic_information' => "ข้อมูลพื้นฐานของพนักงาน",
'cannot_be_deleted' => "ไม่สามารถลบพนักงานที่เลือกไว้ได้ เนื่องจากมีการทำรายการขายหรือคุณกำลังพยายามที่จะลบบัญชีของคุณเอง",
'change_employee' => "",
'change_password' => "เปลี่ยนรหัสผ่าน",
'clerk' => "",
'commission' => "",
'confirm_delete' => "คุณยืนยันการลบข้อมูลพนักงานที่เลือกไว้?",
'confirm_restore' => "คุณแน่ใจหรือไม่ว่าต้องการกู้คืนพนักงานที่เลือกไว้?",
'current_password' => "รหัสผ่านปัจจุบัน",
'current_password_invalid' => "รหัสผ่านปัจจุบันไม่ถูกต้อง",
'employee' => "พนักงาน",
'error_adding_updating' => "การเพิ่มหรือปรับปรุงข้อมูลพนักงานผิดพลาด",
'error_deleting_admin' => "คุณไม่สามารถลบบัญชีแอดมินได้",
'error_updating_admin' => "คุณไม่สามารถแก้ไขบัญชีแอดมินได้",
'error_deleting_demo_admin' => "คุณไม่สามารถลบผู้ใช้งานสำหรับการเดโม้ได้",
'error_updating_demo_admin' => "คุณไม่สามารถทำการเปลี่ยนข้อมูลผู้ใช้งานเดโม้ได้",
'language' => "ภาษา",
'login_info' => "รหัสเข้าระบบ",
'manager' => "",
'new' => "เพิ่มพนักงาน",
'none_selected' => "โปรดเลือกพนักงานที่จะลบ",
'one_or_multiple' => "พนักงาน",
'password' => "รหัสผ่าน",
'password_minlength' => "รหัสผ่านต้องยาวอย่างน้อย 8 อักษร",
'password_must_match' => "รหัสผ่านไม่ตรงกัน",
'password_not_must_match' => "รหัสผ่านปัจจุบันและรหัสผ่านใหม่จะต้องไม่ซ้ำกัน",
'password_required' => "ต้องระบุรหัสผ่าน",
'permission_desc' => "ทำเครื่องหมายในช่องด้านล่างเพื่อให้สิทธิ์การเข้าถึงโมดูลต่างๆ",
'permission_info' => "สิทธิ์",
'repeat_password' => "ระบุรหัสผ่านอีกครั้ง",
'subpermission_required' => "เพิ่มการอนุญาตอย่างน้อยหนึ่งรายการสำหรับแต่ละโมดูล",
'successful_adding' => "เพิ่มข้อมูลพนักงานเรียบร้อยแล้ว",
'successful_change_password' => "ทำการเปลี่ยนรหัสผ่านเรียบร้อยแล้ว",
'successful_deleted' => "ลบข้อมูลสำเร็จ",
'successful_updating' => "ปรับปรุงข้อมูลพนักงานเรียบร้อยแล้ว",
'system_language' => "ภาษาของระบบ",
'unsuccessful_change_password' => "เปลี่ยนรหัสผ่านไม่สำเร็จ",
'update' => "แก้ไขข้อมูลพนักงาน",
'username' => "ชื่อผู้ใช้งาน",
'username_duplicate' => "ชื่อผู้ใช้งานพนักงานถูกใช้งานแล้ว กรุณาเลือกใช้งานชื่ออื่น",
'username_minlength' => "ชื่อผู้ใช้งานต้องยาวอย่างน้อย 5 อักษร",
'username_required' => "จำเป็นต้องระบุชื่อผู้ใช้งาน",
'administrator' => '',
'basic_information' => 'ข้อมูลพื้นฐานของพนักงาน',
'cannot_be_deleted' => 'ไม่สามารถลบพนักงานที่เลือกไว้ได้ เนื่องจากมีการทำรายการขายหรือคุณกำลังพยายามที่จะลบบัญชีของคุณเอง',
'change_employee' => '',
'change_password' => 'เปลี่ยนรหัสผ่าน',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'คุณยืนยันการลบข้อมูลพนักงานที่เลือกไว้?',
'confirm_restore' => 'คุณแน่ใจหรือไม่ว่าต้องการกู้คืนพนักงานที่เลือกไว้?',
'current_password' => 'รหัสผ่านปัจจุบัน',
'current_password_invalid' => 'รหัสผ่านปัจจุบันไม่ถูกต้อง',
'employee' => 'พนักงาน',
'error_adding_updating' => 'การเพิ่มหรือปรับปรุงข้อมูลพนักงานผิดพลาด',
'error_cannot_remove_own_minimum_grant' => 'คุณไม่สามารถลบสิทธิ์การเข้าถึงโมดูลขั้นต่ำของคุณเองได้',
'error_deleting_admin' => 'คุณไม่สามารถลบบัญชีแอดมินได้',
'error_deleting_demo_admin' => 'คุณไม่สามารถลบผู้ใช้งานสำหรับการเดโม้ได้',
'error_grant_change_disallowed' => 'การเปลี่ยนแปลงการอนุญาตถูกปิดใช้งานในการสาธิตนี้',
'error_password_change_disallowed' => 'การเปลี่ยนแปลงรหัสผ่านถูกปิดใช้งานในการสาธิตนี้',
'error_updating_admin' => 'คุณไม่สามารถแก้ไขบัญชีแอดมินได้',
'error_updating_demo_admin' => 'คุณไม่สามารถทำการเปลี่ยนข้อมูลผู้ใช้งานเดโม้ได้',
'language' => 'ภาษา',
'login_info' => 'รหัสเข้าระบบ',
'manager' => '',
'new' => 'เพิ่มพนักงาน',
'none_selected' => 'โปรดเลือกพนักงานที่จะลบ',
'one_or_multiple' => 'พนักงาน',
'password' => 'รหัสผ่าน',
'password_minlength' => 'รหัสผ่านต้องยาวอย่างน้อย 8 อักษร',
'password_must_match' => 'รหัสผ่านไม่ตรงกัน',
'password_not_must_match' => 'รหัสผ่านปัจจุบันและรหัสผ่านใหม่จะต้องไม่ซ้ำกัน',
'password_required' => 'ต้องระบุรหัสผ่าน',
'permission_desc' => 'ทำเครื่องหมายในช่องด้านล่างเพื่อให้สิทธิ์การเข้าถึงโมดูลต่างๆ',
'permission_info' => 'สิทธิ์',
'repeat_password' => 'ระบุรหัสผ่านอีกครั้ง',
'subpermission_required' => 'เพิ่มการอนุญาตอย่างน้อยหนึ่งรายการสำหรับแต่ละโมดูล',
'successful_adding' => 'เพิ่มข้อมูลพนักงานเรียบร้อยแล้ว',
'successful_change_password' => 'ทำการเปลี่ยนรหัสผ่านเรียบร้อยแล้ว',
'successful_deleted' => 'ลบข้อมูลสำเร็จ',
'successful_updating' => 'ปรับปรุงข้อมูลพนักงานเรียบร้อยแล้ว',
'system_language' => 'ภาษาของระบบ',
'unsuccessful_change_password' => 'เปลี่ยนรหัสผ่านไม่สำเร็จ',
'update' => 'แก้ไขข้อมูลพนักงาน',
'username' => 'ชื่อผู้ใช้งาน',
'username_duplicate' => 'ชื่อผู้ใช้งานพนักงานถูกใช้งานแล้ว กรุณาเลือกใช้งานชื่ออื่น',
'username_minlength' => 'ชื่อผู้ใช้งานต้องยาวอย่างน้อย 5 อักษร',
'username_required' => 'จำเป็นต้องระบุชื่อผู้ใช้งาน',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Information",
"cannot_be_deleted" => "Unable to delete selected employee(s), one or more of the has processed sales or you are trying to delete your account.",
"change_employee" => "",
"change_password" => "Change Password",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Are you sure you want to delete the selected Supplier(s)?",
"confirm_restore" => "Are you sure you want to restore selected entry(s)?",
"current_password" => "Current Password",
"current_password_invalid" => "Current Password is invalid.",
"employee" => "Employee",
"error_adding_updating" => "Employee add or update failed.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "You can not change the demo admin user.",
"error_updating_demo_admin" => "You can not delete the demo admin user.",
"language" => "Language",
"login_info" => "Login",
"manager" => "",
"new" => "New Employee",
"none_selected" => "You have not selected any employee(s) to delete.",
"one_or_multiple" => "employee(s)",
"password" => "Password",
"password_minlength" => "Username must be at least 5 characters in length.",
"password_must_match" => "Passwords do not match.",
"password_not_must_match" => "Current password and new password must be unique.",
"password_required" => "Password is required.",
"permission_desc" => "Check the boxes below to grant access to modules.",
"permission_info" => "Permissions",
"repeat_password" => "Password Again",
"subpermission_required" => "Add at least one grant for each module.",
"successful_adding" => "Employee add successful.",
"successful_change_password" => "Password change successful.",
"successful_deleted" => "You have successfully deleted",
"successful_updating" => "You have successfully added customer",
"system_language" => "System Language",
"unsuccessful_change_password" => "Password change failed.",
"update" => "Update Employee",
"username" => "Username",
"username_duplicate" => "",
"username_minlength" => "Password must be at least 8 characters in length.",
"username_required" => "Username is a required field.",
'administrator' => '',
'basic_information' => 'Information',
'cannot_be_deleted' => 'Hindi maaaring tanggalin ang mga napiling empleyado, isa o higit pa sa kanila ang may naiprosesong benta o sinusubukan mong tanggalin ang iyong sariling account.',
'change_employee' => '',
'change_password' => 'Change Password',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Are you sure you want to delete the selected Supplier(s)?',
'confirm_restore' => 'Are you sure you want to restore selected entry(s)?',
'current_password' => 'Current Password',
'current_password_invalid' => 'Current Password is invalid.',
'employee' => 'Employee',
'error_adding_updating' => 'Employee add or update failed.',
'error_cannot_remove_own_minimum_grant' => 'Hindi mo maaaring tanggalin ang iyong sariling pinakamababang pahintulot sa access ng module.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'You can not delete the demo admin user.',
'error_grant_change_disallowed' => 'Ang mga pagbabago sa pahintulot ay hindi pinagana sa demo na ito.',
'error_password_change_disallowed' => 'Ang mga pagbabago ng password ay hindi pinagana sa demo na ito.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'You can not change the demo admin user.',
'language' => 'Language',
'login_info' => 'Login',
'manager' => '',
'new' => 'New Employee',
'none_selected' => 'You have not selected any employee(s) to delete.',
'one_or_multiple' => 'employee(s)',
'password' => 'Password',
'password_minlength' => 'Username must be at least 5 characters in length.',
'password_must_match' => 'Passwords do not match.',
'password_not_must_match' => 'Current password and new password must be unique.',
'password_required' => 'Password is required.',
'permission_desc' => 'Check the boxes below to grant access to modules.',
'permission_info' => 'Permissions',
'repeat_password' => 'Password Again',
'subpermission_required' => 'Add at least one grant for each module.',
'successful_adding' => 'Employee add successful.',
'successful_change_password' => 'Password change successful.',
'successful_deleted' => 'You have successfully deleted',
'successful_updating' => 'You have successfully added customer',
'system_language' => 'System Language',
'unsuccessful_change_password' => 'Password change failed.',
'update' => 'Update Employee',
'username' => 'Username',
'username_duplicate' => '',
'username_minlength' => 'Password must be at least 8 characters in length.',
'username_required' => 'Username is a required field.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Personel Temel Bilgileri",
"cannot_be_deleted" => "Seçili personel silinemedi, personellerin satışları var yada kendinizi silmeye çalışıyorsunuz.",
"change_employee" => "",
"change_password" => "Parolayı Değiştir",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Seçili personelleri silmek istediğinize emin misiniz?",
"confirm_restore" => "Seçili çalışanları geri yüklemek istediğinizden emin misiniz?",
"current_password" => "Var Olan Parola",
"current_password_invalid" => "Var Olan Parola geçersiz.",
"employee" => "Personel",
"error_adding_updating" => "Personel ekleme/güncelleme hatası.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Admin güncellenemez.",
"error_updating_demo_admin" => "Admin silinemez.",
"language" => "Dil",
"login_info" => "Personel Giriş Bilgileri",
"manager" => "",
"new" => "Yeni Personel",
"none_selected" => "Silmek için çalışan seçmediniz.",
"one_or_multiple" => "personel",
"password" => "Parola",
"password_minlength" => "Parola en az 8 karakter olmalıdır.",
"password_must_match" => "Parolalar uyuşmuyor.",
"password_not_must_match" => "Geçerli parola ve yeni parola benzersiz olmalıdır.",
"password_required" => "Parola zorunludur.",
"permission_desc" => "Modül yetkisi vermek için kutuları işaretleyin.",
"permission_info" => "Personel İzin ve Yetkileri",
"repeat_password" => "Parola Yeniden",
"subpermission_required" => "Her bir birim için en az bir izin ekle.",
"successful_adding" => "Personel eklendi.",
"successful_change_password" => "Parola değişikliği başarılı.",
"successful_deleted" => "Silme başarılı",
"successful_updating" => "Personel güncellendi",
"system_language" => "Sistem dili",
"unsuccessful_change_password" => "Parola değişikliği başarısız oldu.",
"update" => "Personeli Güncelle",
"username" => "Kullandı Adı",
"username_duplicate" => "",
"username_minlength" => "Kullanıcı Adı en az 5 karakter olmalıdır.",
"username_required" => "Kullanıcı Adı zorunlu alandır.",
'administrator' => '',
'basic_information' => 'Personel Temel Bilgileri',
'cannot_be_deleted' => 'Seçili personel silinemedi, personellerin satışları var ya da kendinizi silmeye çalışıyorsunuz.',
'change_employee' => '',
'change_password' => 'Parolayı Değiştir',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Seçili personelleri silmek istediğinize emin misiniz?',
'confirm_restore' => 'Seçili çalışanları geri yüklemek istediğinizden emin misiniz?',
'current_password' => 'Var Olan Parola',
'current_password_invalid' => 'Var Olan Parola geçersiz.',
'employee' => 'Personel',
'error_adding_updating' => 'Personel ekleme/güncelleme hatası.',
'error_cannot_remove_own_minimum_grant' => 'Kendi asgari modül erişim izinlerinizi kaldıramazsınız.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'Admin silinemez.',
'error_grant_change_disallowed' => 'İzin değişiklikleri bu demoda devre dışı bırakılmıştır.',
'error_password_change_disallowed' => 'Şifre değişiklikleri bu demoda devre dışı bırakılmıştır.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'Admin güncellenemez.',
'language' => 'Dil',
'login_info' => 'Personel Giriş Bilgileri',
'manager' => '',
'new' => 'Yeni Personel',
'none_selected' => 'Silmek için çalışan seçmediniz.',
'one_or_multiple' => 'personel',
'password' => 'Parola',
'password_minlength' => 'Parola en az 8 karakter olmalıdır.',
'password_must_match' => 'Parolalar uyuşmuyor.',
'password_not_must_match' => 'Geçerli parola ve yeni parola benzersiz olmalıdır.',
'password_required' => 'Parola zorunludur.',
'permission_desc' => 'Modül yetkisi vermek için kutuları işaretleyin.',
'permission_info' => 'Personel İzin ve Yetkileri',
'repeat_password' => 'Parola Yeniden',
'subpermission_required' => 'Her bir birim için en az bir izin ekle.',
'successful_adding' => 'Personel eklendi.',
'successful_change_password' => 'Parola değişikliği başarılı.',
'successful_deleted' => 'Silme başarılı',
'successful_updating' => 'Personel güncellendi',
'system_language' => 'Sistem dili',
'unsuccessful_change_password' => 'Parola değişikliği başarısız oldu.',
'update' => 'Personeli Güncelle',
'username' => 'Kullanıcı Adı',
'username_duplicate' => '',
'username_minlength' => 'Kullanıcı Adı en az 5 karakter olmalıdır.',
'username_required' => 'Kullanıcı Adı zorunlu alandır.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Інформація про працівників",
"cannot_be_deleted" => "Неможливо видалити вибраних працівника(ів), які вже здійснили продажі або ви намагаєтесь видалити свій обліковий запис.",
"change_employee" => "",
"change_password" => "Змінити пароль",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Ви впевнені, що хочете видалити обраного(их) працівника(ів)?",
"confirm_restore" => "Ви впевнені, що хочете відновити обраного(их) працівника(ів)?",
"current_password" => "Поточний пароль",
"current_password_invalid" => "Поточний пароль невірний.",
"employee" => "Працівник",
"error_adding_updating" => "Помилка при додаванні/оновлені працівника.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Ви не можете видалити аккаунт користувача.",
"error_updating_demo_admin" => "Ви не можете змінити аккаунт користувача.",
"language" => "Мова",
"login_info" => "Вхід",
"manager" => "",
"new" => "Новий працівник",
"none_selected" => "Ви не вибрали працівника(ів) для видалення.",
"one_or_multiple" => "Працівник(и)",
"password" => "Пароль",
"password_minlength" => "Пароль повинен містити не менше 8 символів.",
"password_must_match" => "Паролі не співпадають.",
"password_not_must_match" => "Поточний пароль та новий пароль не повинні співпадати.",
"password_required" => "Пароль - обов'язкове поле.",
"permission_desc" => "Поставте прапорці нижче, щоб надати доступ до модулів.",
"permission_info" => "Дозволи",
"repeat_password" => "Повторіть пароль",
"subpermission_required" => "Додайте принаймні один грант для кожного модуля.",
"successful_adding" => "Ви успішно додали працівника.",
"successful_change_password" => "Пароль успішно змінено.",
"successful_deleted" => "Працівника успішно видалено",
"successful_updating" => "Працівника успішно оновлено",
"system_language" => "Мова системи",
"unsuccessful_change_password" => "Не вдалось змінити пароль.",
"update" => "Оновити працівника",
"username" => "Ім'я користувача",
"username_duplicate" => "",
"username_minlength" => "Ім'я користувача повинно бути не менше 5 символів.",
"username_required" => "Ім'я користувача - обов'язкове поле.",
'administrator' => '',
'basic_information' => 'Інформація про працівників',
'cannot_be_deleted' => 'Неможливо видалити вибраних працівника(ів), які вже здійснили продажі або ви намагаєтесь видалити свій обліковий запис.',
'change_employee' => '',
'change_password' => 'Змінити пароль',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Ви впевнені, що хочете видалити обраного(их) працівника(ів)?',
'confirm_restore' => 'Ви впевнені, що хочете відновити обраного(их) працівника(ів)?',
'current_password' => 'Поточний пароль',
'current_password_invalid' => 'Поточний пароль невірний.',
'employee' => 'Працівник',
'error_adding_updating' => 'Помилка при додаванні/оновлені працівника.',
'error_cannot_remove_own_minimum_grant' => 'Ви не можете видалити власні мінімальні дозволи доступу до модулів.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'Ви не можете видалити аккаунт користувача.',
'error_grant_change_disallowed' => 'Зміни дозволів заборонені в цій демонстрації.',
'error_password_change_disallowed' => 'Зміни пароля заборонені в цій демонстрації.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'Ви не можете змінити аккаунт користувача.',
'language' => 'Мова',
'login_info' => 'Вхід',
'manager' => '',
'new' => 'Новий працівник',
'none_selected' => 'Ви не вибрали працівника(ів) для видалення.',
'one_or_multiple' => 'Працівник(и)',
'password' => 'Пароль',
'password_minlength' => 'Пароль повинен містити не менше 8 символів.',
'password_must_match' => 'Паролі не співпадають.',
'password_not_must_match' => 'Поточний пароль та новий пароль не повинні співпадати.',
'password_required' => 'Пароль - обов\'язкове поле.',
'permission_desc' => 'Поставте прапорці нижче, щоб надати доступ до модулів.',
'permission_info' => 'Дозволи',
'repeat_password' => 'Повторіть пароль',
'subpermission_required' => 'Додайте принаймні один грант для кожного модуля.',
'successful_adding' => 'Ви успішно додали працівника.',
'successful_change_password' => 'Пароль успішно змінено.',
'successful_deleted' => 'Працівника успішно видалено',
'successful_updating' => 'Працівника успішно оновлено',
'system_language' => 'Мова системи',
'unsuccessful_change_password' => 'Не вдалось змінити пароль.',
'update' => 'Оновити працівника',
'username' => 'Ім\'я користувача',
'username_duplicate' => '',
'username_minlength' => 'Ім\'я користувача повинно бути не менше 5 символів.',
'username_required' => 'Ім\'я користувача - обов\'язкове поле.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "",
"cannot_be_deleted" => "",
"change_employee" => "",
"change_password" => "",
"clerk" => "",
"commission" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"current_password" => "",
"current_password_invalid" => "",
"employee" => "",
"error_adding_updating" => "",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "",
"error_updating_demo_admin" => "",
"language" => "",
"login_info" => "",
"manager" => "",
"new" => "",
"none_selected" => "",
"one_or_multiple" => "",
"password" => "",
"password_minlength" => "",
"password_must_match" => "",
"password_not_must_match" => "",
"password_required" => "",
"permission_desc" => "",
"permission_info" => "",
"repeat_password" => "",
"subpermission_required" => "",
"successful_adding" => "",
"successful_change_password" => "",
"successful_deleted" => "",
"successful_updating" => "",
"system_language" => "",
"unsuccessful_change_password" => "",
"update" => "",
"username" => "",
"username_duplicate" => "",
"username_minlength" => "",
"username_required" => "",
'administrator' => '',
'basic_information' => '',
'cannot_be_deleted' => '',
'change_employee' => '',
'change_password' => '',
'clerk' => '',
'commission' => '',
'confirm_delete' => '',
'confirm_restore' => '',
'current_password' => '',
'current_password_invalid' => '',
'employee' => '',
'error_adding_updating' => '',
'error_cannot_remove_own_minimum_grant' => 'آپ اپنے کم از کم ماڈیول رسائی کے اجازت ناموں کو ہٹا نہیں سکتے۔',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => '',
'error_grant_change_disallowed' => 'اس ڈیمو میں اجازت کی تبدیلیاں غیر فعال ہیں۔',
'error_password_change_disallowed' => 'اس ڈیمو میں پاس ورڈ کی تبدیلیاں غیر فعال ہیں۔',
'error_updating_admin' => '',
'error_updating_demo_admin' => '',
'language' => '',
'login_info' => '',
'manager' => '',
'new' => '',
'none_selected' => '',
'one_or_multiple' => '',
'password' => '',
'password_minlength' => '',
'password_must_match' => '',
'password_not_must_match' => '',
'password_required' => '',
'permission_desc' => '',
'permission_info' => '',
'repeat_password' => '',
'subpermission_required' => '',
'successful_adding' => '',
'successful_change_password' => '',
'successful_deleted' => '',
'successful_updating' => '',
'system_language' => '',
'unsuccessful_change_password' => '',
'update' => '',
'username' => '',
'username_duplicate' => '',
'username_minlength' => '',
'username_required' => '',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "Thông tin",
"cannot_be_deleted" => "Không thể xóa các nhân viên đã chọn, một hay nhiều nhân viên đã xử lý bán hàng hoặc bạn đang cố xóa tài khoản của mình.",
"change_employee" => "",
"change_password" => "Đổi mật khẩu",
"clerk" => "",
"commission" => "",
"confirm_delete" => "Bạn chắc chắn muốn xóa các nhân viên được chọn không?",
"confirm_restore" => "Bạn chắc chắn muốn hoàn lại các nhân viên được chọn không?",
"current_password" => "Mật khẩu hiện tại",
"current_password_invalid" => "Mật khẩu hiện tại không hợp lệ.",
"employee" => "Nhân viên",
"error_adding_updating" => "Gặp lỗi khi cập nhật hay thêm nhân viên.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "Bạn không thể xóa người dùng demo admin.",
"error_updating_demo_admin" => "Bạn không thể thay đổi người dùng demo admin.",
"language" => "Ngôn ngữ",
"login_info" => "Đăng nhập",
"manager" => "",
"new" => "Nhân viên mới",
"none_selected" => "Bạn chưa chọn bất kỳ một nhân viên nào để mà xóa.",
"one_or_multiple" => "nhân viên",
"password" => "Mật khẩu",
"password_minlength" => "Mật khẩu phải dài ít nhất 8 ký tự.",
"password_must_match" => "Mật khẩu không khớp nhau.",
"password_not_must_match" => "Mật khẩu hiện tại và mới phải khác nhau.",
"password_required" => "Mật khẩu là bắt buộc.",
"permission_desc" => "Các hộp dấu kiểm phía dưới cấp quyền truy cập cho các mô đun.",
"permission_info" => "Quyền hạn",
"repeat_password" => "Gõ lại mật khẩu lần nữa",
"subpermission_required" => "Thêm ít nhất một quyền cho từng mô đun.",
"successful_adding" => "Đã thêm thành công nhân viên.",
"successful_change_password" => "Đổi mật khẩu thành công.",
"successful_deleted" => "Bạn đã xóa thành công",
"successful_updating" => "Bạn đã cập nhật nhân viên thành công",
"system_language" => "Ngôn ngữ hệ thống",
"unsuccessful_change_password" => "Gặp lỗi khi thay đổi mật khẩu.",
"update" => "Cập nhật Nhân viên",
"username" => "Tài khoản",
"username_duplicate" => "",
"username_minlength" => "Tài khoản phải dài ít nhất là 5 ký tự.",
"username_required" => "Trường tài khoản là bắt buộc.",
'administrator' => '',
'basic_information' => 'Thông tin',
'cannot_be_deleted' => 'Không thể xóa các nhân viên đã chọn, một hay nhiều nhân viên đã xử lý bán hàng hoặc bạn đang cố xóa tài khoản của mình.',
'change_employee' => '',
'change_password' => 'Đổi mật khẩu',
'clerk' => '',
'commission' => '',
'confirm_delete' => 'Bạn chắc chắn muốn xóa các nhân viên được chọn không?',
'confirm_restore' => 'Bạn chắc chắn muốn hoàn lại các nhân viên được chọn không?',
'current_password' => 'Mật khẩu hiện tại',
'current_password_invalid' => 'Mật khẩu hiện tại không hợp lệ.',
'employee' => 'Nhân viên',
'error_adding_updating' => 'Gặp lỗi khi cập nhật hay thêm nhân viên.',
'error_cannot_remove_own_minimum_grant' => 'Bạn không thể gỡ bỏ các quyền truy cập mô đun tối thiểu của chính mình.',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => 'Bạn không thể xóa người dùng demo admin.',
'error_grant_change_disallowed' => 'Thay đổi quyền bị vô hiệu hóa trong bản demo này.',
'error_password_change_disallowed' => 'Thay đổi mật khẩu bị vô hiệu hóa trong bản demo này.',
'error_updating_admin' => '',
'error_updating_demo_admin' => 'Bạn không thể thay đổi người dùng demo admin.',
'language' => 'Ngôn ngữ',
'login_info' => 'Đăng nhập',
'manager' => '',
'new' => 'Nhân viên mới',
'none_selected' => 'Bạn chưa chọn bất kỳ một nhân viên nào để mà xóa.',
'one_or_multiple' => 'nhân viên',
'password' => 'Mật khẩu',
'password_minlength' => 'Mật khẩu phải dài ít nhất 8 ký tự.',
'password_must_match' => 'Mật khẩu không khớp nhau.',
'password_not_must_match' => 'Mật khẩu hiện tại và mới phải khác nhau.',
'password_required' => 'Mật khẩu là bắt buộc.',
'permission_desc' => 'Các hộp dấu kiểm phía dưới cấp quyền truy cập cho các mô đun.',
'permission_info' => 'Quyền hạn',
'repeat_password' => 'Gõ lại mật khẩu lần nữa',
'subpermission_required' => 'Thêm ít nhất một quyền cho từng mô đun.',
'successful_adding' => 'Đã thêm thành công nhân viên.',
'successful_change_password' => 'Đổi mật khẩu thành công.',
'successful_deleted' => 'Bạn đã xóa thành công',
'successful_updating' => 'Bạn đã cập nhật nhân viên thành công',
'system_language' => 'Ngôn ngữ hệ thống',
'unsuccessful_change_password' => 'Gặp lỗi khi thay đổi mật khẩu.',
'update' => 'Cập nhật Nhân viên',
'username' => 'Tài khoản',
'username_duplicate' => '',
'username_minlength' => 'Tài khoản phải dài ít nhất là 5 ký tự.',
'username_required' => 'Trường tài khoản là bắt buộc.',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "員工基本資料",
"cannot_be_deleted" => "無法刪除選定的僱員,選定的員工中已有銷售紀錄或你正在試圖刪除自己 :)",
"change_employee" => "",
"change_password" => "",
"clerk" => "",
"commission" => "",
"confirm_delete" => "你確定要刪除所選的員工嗎?",
"confirm_restore" => "",
"current_password" => "",
"current_password_invalid" => "",
"employee" => "員工",
"error_adding_updating" => "添加/更新員工錯誤",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "您不能刪除admin用戶",
"error_updating_demo_admin" => "您不能更改admin用戶",
"language" => "",
"login_info" => "員工登錄資料",
"manager" => "",
"new" => "新員工",
"none_selected" => "您還沒有選擇任何員工進行刪除",
"one_or_multiple" => "員工",
"password" => "密碼",
"password_minlength" => "密碼需為八個字元以上",
"password_must_match" => "密碼與確認密碼不一致",
"password_not_must_match" => "",
"password_required" => "請輸入密碼",
"permission_desc" => "勾選後授予使用該模組功能",
"permission_info" => "員工權限",
"repeat_password" => "確認密碼",
"subpermission_required" => "Add at least one grant for each module",
"successful_adding" => "新增員工資料成功",
"successful_change_password" => "",
"successful_deleted" => "成功刪除員工資料",
"successful_updating" => "成功更新員工資料",
"system_language" => "",
"unsuccessful_change_password" => "",
"update" => "更新員工",
"username" => "帳號",
"username_duplicate" => "",
"username_minlength" => "帳號必需為五個字元以上",
"username_required" => "帳號為必填",
'administrator' => '',
'basic_information' => '員工基本資料',
'cannot_be_deleted' => '無法刪除選定的僱員,選定的員工中已有銷售紀錄或你正在試圖刪除自己 :)',
'change_employee' => '',
'change_password' => '',
'clerk' => '',
'commission' => '',
'confirm_delete' => '你確定要刪除所選的員工嗎?',
'confirm_restore' => '',
'current_password' => '',
'current_password_invalid' => '',
'employee' => '員工',
'error_adding_updating' => '添加/更新員工錯誤',
'error_cannot_remove_own_minimum_grant' => '您不能移除自己的最低模块访问权限。',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => '您不能刪除admin用戶',
'error_grant_change_disallowed' => '演示中禁用了权限更改。',
'error_password_change_disallowed' => '演示中禁用了密码更改。',
'error_updating_admin' => '',
'error_updating_demo_admin' => '您不能更改admin用戶',
'language' => '',
'login_info' => '員工登錄資料',
'manager' => '',
'new' => '新員工',
'none_selected' => '您還沒有選擇任何員工進行刪除',
'one_or_multiple' => '員工',
'password' => '密碼',
'password_minlength' => '密碼需為八個字元以上',
'password_must_match' => '密碼與確認密碼不一致',
'password_not_must_match' => '',
'password_required' => '請輸入密碼',
'permission_desc' => '勾選後授予使用該模組功能',
'permission_info' => '員工權限',
'repeat_password' => '確認密碼',
'subpermission_required' => 'Add at least one grant for each module',
'successful_adding' => '新增員工資料成功',
'successful_change_password' => '',
'successful_deleted' => '成功刪除員工資料',
'successful_updating' => '成功更新員工資料',
'system_language' => '',
'unsuccessful_change_password' => '',
'update' => '更新員工',
'username' => '帳號',
'username_duplicate' => '',
'username_minlength' => '帳號必需為五個字元以上',
'username_required' => '帳號為必填',
];
+46 -43
View File
@@ -1,47 +1,50 @@
<?php
return [
"administrator" => "",
"basic_information" => "員工基本資料",
"cannot_be_deleted" => "無法刪除選定的僱員,選定的員工中已有銷售紀錄或你正在試圖刪除自己.",
"change_employee" => "",
"change_password" => "更改密碼",
"clerk" => "",
"commission" => "",
"confirm_delete" => "你確定要刪除所選的員工嗎?",
"confirm_restore" => "您確定要還原所選員工嗎?",
"current_password" => "當前密碼",
"current_password_invalid" => "當前密碼無效。",
"employee" => "員工",
"error_adding_updating" => "添加/更新員工錯誤.",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "您不能刪除admin用戶.",
"error_updating_demo_admin" => "您不能更改admin用戶.",
"language" => "語言",
"login_info" => "員工登錄資料",
"manager" => "",
"new" => "新員工",
"none_selected" => "您還沒有選擇任何員工進行刪除.",
"one_or_multiple" => "員工",
"password" => "密碼",
"password_minlength" => "密碼需為八個字元以上.",
"password_must_match" => "密碼與確認密碼不一致.",
"password_not_must_match" => "當前密碼和新密碼一致。",
"password_required" => "請輸入密碼.",
"permission_desc" => "勾選後授予使用該模組功能.",
"permission_info" => "員工權限",
"repeat_password" => "確認密碼",
"subpermission_required" => "為每個模塊添加至少一項撥款.",
"successful_adding" => "新增員工資料成功.",
"successful_change_password" => "密碼更改成功。",
"successful_deleted" => "成功刪除員工資料",
"successful_updating" => "成功更新員工資料",
"system_language" => "系統語言",
"unsuccessful_change_password" => "密碼更改失敗。",
"update" => "更新員工",
"username" => "帳號",
"username_duplicate" => "",
"username_minlength" => "帳號必需為五個字元以上.",
"username_required" => "帳號為必填.",
'administrator' => '',
'basic_information' => '員工基本資料',
'cannot_be_deleted' => '無法刪除選定的僱員,選定的員工中已有銷售紀錄或你正在試圖刪除自己.',
'change_employee' => '',
'change_password' => '更改密碼',
'clerk' => '',
'commission' => '',
'confirm_delete' => '你確定要刪除所選的員工嗎?',
'confirm_restore' => '您確定要還原所選員工嗎?',
'current_password' => '當前密碼',
'current_password_invalid' => '當前密碼無效。',
'employee' => '員工',
'error_adding_updating' => '添加/更新員工錯誤.',
'error_cannot_remove_own_minimum_grant' => '您不能移除自己的最低模組存取權限。',
'error_deleting_admin' => '',
'error_deleting_demo_admin' => '您不能刪除admin用戶.',
'error_grant_change_disallowed' => '演示中禁用了權限更改。',
'error_password_change_disallowed' => '演示中禁用了密碼更改。',
'error_updating_admin' => '',
'error_updating_demo_admin' => '您不能更改admin用戶.',
'language' => '語言',
'login_info' => '員工登錄資料',
'manager' => '',
'new' => '新員工',
'none_selected' => '您還沒有選擇任何員工進行刪除.',
'one_or_multiple' => '員工',
'password' => '密碼',
'password_minlength' => '密碼需為八個字元以上.',
'password_must_match' => '密碼與確認密碼不一致.',
'password_not_must_match' => '當前密碼和新密碼一致。',
'password_required' => '請輸入密碼.',
'permission_desc' => '勾選後授予使用該模組功能.',
'permission_info' => '員工權限',
'repeat_password' => '確認密碼',
'subpermission_required' => '為每個模塊添加至少一項撥款.',
'successful_adding' => '新增員工資料成功.',
'successful_change_password' => '密碼更改成功。',
'successful_deleted' => '成功刪除員工資料',
'successful_updating' => '成功更新員工資料',
'system_language' => '系統語言',
'unsuccessful_change_password' => '密碼更改失敗。',
'update' => '更新員工',
'username' => '帳號',
'username_duplicate' => '',
'username_minlength' => '帳號必需為五個字元以上.',
'username_required' => '帳號為必填.',
];
+17 -17
View File
@@ -146,10 +146,10 @@ class Barcode_lib
if ((isset($item['item_number']) || isset($item['name'])) && isset($item['item_id'])) {
$barcode = $this->generate_barcode($item, $barcode_config);
$display_table = '<table>';
$display_table .= '<tr><td style="text-align: center;">' . $this->manage_display_layout($barcode_config['barcode_first_row'], $item, $barcode_config) . '</td></tr>';
$display_table .= '<tr><td style="text-align: center;">' . $this->manageDisplayLayout($barcode_config['barcode_first_row'], $item, $barcode_config) . '</td></tr>';
$display_table .= '<tr><td style="text-align: center;"><div class="barcode">'.$barcode.'</div></td></tr>';
$display_table .= '<tr><td style="text-align: center;">' . $this->manage_display_layout($barcode_config['barcode_second_row'], $item, $barcode_config) . '</td></tr>';
$display_table .= '<tr><td style="text-align: center;">' . $this->manage_display_layout($barcode_config['barcode_third_row'], $item, $barcode_config) . '</td></tr>';
$display_table .= '<tr><td style="text-align: center;">' . $this->manageDisplayLayout($barcode_config['barcode_second_row'], $item, $barcode_config) . '</td></tr>';
$display_table .= '<tr><td style="text-align: center;">' . $this->manageDisplayLayout($barcode_config['barcode_third_row'], $item, $barcode_config) . '</td></tr>';
$display_table .= '</table>';
return $display_table;
@@ -159,30 +159,30 @@ class Barcode_lib
}
/**
* @param $layout_type
* @param string $layoutType
* @param array $item
* @param array $barcode_config
* @param array $barcodeConfig
* @return string
*/
private function manage_display_layout($layout_type, array $item, array $barcode_config): string
private function manageDisplayLayout(string $layoutType, array $item, array $barcodeConfig): string
{
$result = '';
helper('text');
if ($layout_type == 'name') {
$result = $item['name'];
} elseif ($layout_type == 'category' && isset($item['category'])) {
if ($layoutType == 'name') {
$result = esc($item['name']);
} elseif ($layoutType == 'category' && isset($item['category'])) {
$result = lang('Items.category') . " " . esc($item['category']);
} elseif ($layout_type == 'cost_price' && isset($item['cost_price'])) {
} elseif ($layoutType == 'cost_price' && isset($item['cost_price'])) {
$result = lang('Items.cost_price') . " " . to_currency($item['cost_price']);
} elseif ($layout_type == 'unit_price' && isset($item['unit_price'])) {
} elseif ($layoutType == 'unit_price' && isset($item['unit_price'])) {
$result = lang('Items.unit_price') . " " . to_currency($item['unit_price']);
} elseif ($layout_type == 'company_name') {
$result = $barcode_config['company'];
} elseif ($layout_type == 'item_code') {
$result = $barcode_config['barcode_content'] !== "id" && isset($item['item_number'])
? $item['item_number']
: $item['item_id'];
} elseif ($layoutType == 'company_name') {
$result = esc($barcodeConfig['company']);
} elseif ($layoutType == 'item_code') {
$result = $barcodeConfig['barcode_content'] !== "id" && isset($item['item_number'])
? esc($item['item_number'])
: esc($item['item_id']);
}
return character_limiter($result, 40);
+9 -9
View File
@@ -28,8 +28,8 @@ class Email_lib
$encrypter = Services::encrypter();
$smtp_pass = $this->config['smtp_pass'];
if (!empty($smtp_pass) && check_encryption()) {
$smtp_pass = $this->config['smtp_pass'] ?? '';
if (!empty($smtp_pass) && checkEncryption()) {
try {
$smtp_pass = $encrypter->decrypt($smtp_pass);
} catch (\EncryptionException $e) {
@@ -44,14 +44,14 @@ class Email_lib
'mailType' => 'html',
'userAgent' => 'OSPOS',
'validate' => true,
'protocol' => $this->config['protocol'],
'mailPath' => $this->config['mailpath'],
'SMTPHost' => $this->config['smtp_host'],
'SMTPUser' => $this->config['smtp_user'],
'protocol' => $this->config['protocol'] ?? 'mail',
'mailPath' => $this->config['mailpath'] ?? '/usr/sbin/sendmail',
'SMTPHost' => $this->config['smtp_host'] ?? '',
'SMTPUser' => $this->config['smtp_user'] ?? '',
'SMTPPass' => $smtp_pass,
'SMTPPort' => (int)$this->config['smtp_port'],
'SMTPTimeout' => (int)$this->config['smtp_timeout'],
'SMTPCrypto' => $this->config['smtp_crypto']
'SMTPPort' => (int)(!empty($this->config['smtp_port']) ? $this->config['smtp_port'] : 465),
'SMTPTimeout' => (int)(!empty($this->config['smtp_timeout']) ? $this->config['smtp_timeout'] : 5),
'SMTPCrypto' => $this->config['smtp_crypto'] ?? 'ssl'
];
$this->email->initialize($email_config);
}
+25 -7
View File
@@ -131,13 +131,21 @@ class Employee extends Person
public function save_employee(array &$person_data, array &$employee_data, array &$grants_data, int $employee_id = NEW_ENTRY): bool
{
$success = false;
$isNewEmployee = ($employee_id == NEW_ENTRY || !$this->exists($employee_id));
$grantChangeDisallowed = filter_var(getenv('DISALLOW_GRANT_CHANGE'), FILTER_VALIDATE_BOOLEAN);
// Run these queries as a transaction, we want to make sure we do all or nothing
$this->db->transStart();
if (ENVIRONMENT != 'testing' && parent::save_value($person_data, $employee_id)) {
if ($grantChangeDisallowed && $isNewEmployee && !empty($grants_data)) {
$this->db->transComplete();
return false;
}
if (parent::save_value($person_data, $employee_id)) {
$builder = $this->db->table('employees');
if ($employee_id == NEW_ENTRY || !$this->exists($employee_id)) {
if ($isNewEmployee) {
$employee_data['person_id'] = $employee_id = $person_data['person_id'];
$success = $builder->insert($employee_data);
} else {
@@ -146,7 +154,7 @@ class Employee extends Person
}
// We have either inserted or updated a new employee, now lets set permissions.
if ($success) {
if ($success && !$grantChangeDisallowed) {
// First lets clear out any grants the employee currently has.
$builder = $this->db->table('grants');
$success = $builder->delete(['person_id' => $employee_id]);
@@ -375,11 +383,21 @@ class Employee extends Person
// Compare passwords depending on the hash version
if ($row->hash_version === '1' && $row->password === md5($password)) {
$builder->where('person_id', $row->person_id);
$this->session->set('person_id', $row->person_id);
$password_hash = password_hash($password, PASSWORD_DEFAULT);
$passwordHash = password_hash($password, PASSWORD_DEFAULT);
$updated = $builder->update(['hash_version' => 2, 'password' => $passwordHash]);
return $builder->update(['hash_version' => 2, 'password' => $password_hash]);
if ($updated) {
if (session_status() === PHP_SESSION_ACTIVE) {
$this->session->regenerate(true);
}
$this->session->set('person_id', $row->person_id);
}
return $updated;
} elseif ($row->hash_version === '2' && password_verify($password, $row->password)) {
if (session_status() === PHP_SESSION_ACTIVE) {
$this->session->regenerate(true);
}
$this->session->set('person_id', $row->person_id);
return true;
@@ -521,7 +539,7 @@ class Employee extends Person
{
$success = false;
if (!getenv('DISALLOW_PASSWORD_CHANGE')) {
if (!filter_var(getenv('DISALLOW_PASSWORD_CHANGE'), FILTER_VALIDATE_BOOLEAN)) {
$this->db->transStart();
$builder = $this->db->table('employees');
+4 -4
View File
@@ -32,10 +32,10 @@ class Module extends Model
if ($query->getNumRows() == 1) { // TODO: ===
$row = $query->getRow();
return lang($row->name_lang_key);
return lang('Module.' . $row->module_id);
}
return lang('Errors.unknown');
return lang('Error.unknown');
}
/**
@@ -50,10 +50,10 @@ class Module extends Model
if ($query->getNumRows() == 1) { // TODO: ===
$row = $query->getRow();
return lang($row->desc_lang_key);
return lang('Module.' . $row->module_id . '_desc');
}
return lang('Errors.unknown');
return lang('Error.unknown');
}
/**
+1 -1
View File
@@ -210,7 +210,7 @@ class Sale extends Model
/**
* Get the payment summary for the takings (sales/manage) view
*/
public function get_payments_summary(?string $search, array $filters): array
public function getPaymentsSummary(?string $search, array $filters): array
{
$config = config(OSPOS::class)->settings;
+7 -7
View File
@@ -26,7 +26,7 @@
</ul>
<div class="tab-content">
<div class="tab-pane fade in active" id="employee_basic_info">
<div class="tab-pane active" id="employee_basic_info">
<fieldset>
<?= view('people/form_basic_info') ?>
</fieldset>
@@ -113,9 +113,10 @@
<p><?= lang('Employees.permission_desc') ?></p>
<ul id="permission_list">
<?= form_hidden('module_validation', '1', 'class="module"') ?>
<?php foreach ($all_modules as $module) { ?>
<li>
<?= form_checkbox("grant_$module->module_id", $module->module_id, $module->grant == 1, 'class="module"') ?>
<?= form_checkbox("grant_$module->module_id", $module->module_id, $module->grant == 1, 'class="module-toggle"') ?>
<?= form_dropdown(
"menu_group_$module->module_id",
[
@@ -123,8 +124,7 @@
'office' => lang('Module.office'),
'both' => lang('Module.both')
],
$module->menu_group,
'class="module"'
$module->menu_group
) ?>
<span class="medium"><?= lang("Module.$module->module_id") ?>:</span>
@@ -166,9 +166,9 @@
ignore: []
});
$.validator.addMethod('module', function(value, element) {
$.validator.addMethod('module', function() {
let result = $('#permission_list input').is(':checked');
$('.module').each(function(index, element) {
$('.module-toggle').each(function(index, element) {
const parent = $(element);
const checked = $(element).is(':checked');
if ($('ul', parent).length > 0 && result) {
@@ -178,7 +178,7 @@
return result;
}, "<?= lang('Employees.subpermission_required') ?>");
$('ul#permission_list > li > input.module').each(function() {
$('ul#permission_list > li > input.module-toggle').each(function() {
const $this = $(this);
$('ul > li > input,select', $this.parent()).each(function() {
const $that = $(this);
+2
View File
@@ -4,3 +4,5 @@
*/
echo lang('Error.no_permission_module') . " $module_name" . (!empty($permission_id) ? " ($permission_id)" : '');
?>
<script>document.getElementById('submit')?.setAttribute('disabled', 'disabled');</script>
+137 -9
View File
@@ -19,9 +19,23 @@ class EmployeesControllerTest extends CIUnitTestCase
protected $refresh = false;
protected $namespace = null;
protected $priorDisallowGrantChange;
protected function setUp(): void
{
parent::setUp();
$this->priorDisallowGrantChange = getenv('DISALLOW_GRANT_CHANGE');
putenv('DISALLOW_GRANT_CHANGE=false');
}
protected function tearDown(): void
{
if ($this->priorDisallowGrantChange === false) {
putenv('DISALLOW_GRANT_CHANGE');
} else {
putenv('DISALLOW_GRANT_CHANGE=' . $this->priorDisallowGrantChange);
}
parent::tearDown();
}
protected function createNonAdminEmployee(): int
@@ -203,17 +217,131 @@ class EmployeesControllerTest extends CIUnitTestCase
public function testAdminCanGrantAnyPermission(): void
{
$employeeId = $this->createNonAdminEmployee();
$this->loginAsAdmin();
putenv('DISALLOW_GRANT_CHANGE=false');
$permissionsRequested = ['customers', 'employees', 'sales', 'config'];
$userPermissions = ['customers', 'sales'];
$isAdmin = true;
$granted = [];
$postData = [
'first_name' => 'NonAdmin',
'last_name' => 'User',
'email' => 'nonadmin@test.com',
'username' => 'nonadmin'
];
foreach ($permissionsRequested as $perm) {
if ($isAdmin || in_array($perm, $userPermissions)) {
$granted[] = $perm;
}
$postData['grant_' . $perm] = $perm;
}
$this->assertEquals($permissionsRequested, $granted);
$response = $this->post('/employees/save/' . $employeeId, $postData);
$response->assertStatus(200);
$result = json_decode($response->getJSON(), true);
$this->assertTrue($result['success']);
$employeeModel = model(Employee::class);
foreach ($permissionsRequested as $perm) {
$this->assertTrue($employeeModel->has_grant($perm, $employeeId));
}
}
public function testGrantChangeRequestFailsWhenGrantChangeDisallowed(): void
{
$employeeId = $this->createNonAdminEmployee();
$this->loginAsAdmin();
putenv('DISALLOW_GRANT_CHANGE=true');
$response = $this->post('/employees/save/' . $employeeId, [
'first_name' => 'NonAdmin',
'last_name' => 'User',
'email' => 'nonadmin@test.com',
'username' => 'nonadmin',
'grant_employees' => 'employees'
]);
$response->assertStatus(200);
$result = json_decode($response->getJSON(), true);
$this->assertFalse($result['success']);
$employeeModel = model(Employee::class);
$this->assertTrue($employeeModel->has_grant('customers', $employeeId));
$this->assertTrue($employeeModel->has_grant('sales', $employeeId));
$this->assertFalse($employeeModel->has_grant('employees', $employeeId));
}
public function testNewEmployeeCreationWithGrantsFailsWhenGrantChangeDisallowed(): void
{
$this->loginAsAdmin();
putenv('DISALLOW_GRANT_CHANGE=true');
$response = $this->post('/employees/save', [
'first_name' => 'Brand',
'last_name' => 'New',
'email' => 'brandnew@test.com',
'username' => 'brandnew',
'password' => 'password123',
'grant_customers' => 'customers'
]);
$response->assertStatus(200);
$result = json_decode($response->getJSON(), true);
$this->assertFalse($result['success']);
$createdEmployee = $this->db->table('employees')->where('username', 'brandnew')->get()->getRow();
$this->assertNull($createdEmployee);
}
public function testGrantChangeRequestSucceedsWhenGrantChangeAllowed(): void
{
$employeeId = $this->createNonAdminEmployee();
$this->loginAsAdmin();
putenv('DISALLOW_GRANT_CHANGE=false');
$response = $this->post('/employees/save/' . $employeeId, [
'first_name' => 'NonAdmin',
'last_name' => 'User',
'email' => 'nonadmin@test.com',
'username' => 'nonadmin',
'grant_employees' => 'employees'
]);
$response->assertStatus(200);
$result = json_decode($response->getJSON(), true);
$this->assertTrue($result['success']);
$employeeModel = model(Employee::class);
$this->assertTrue($employeeModel->has_grant('employees', $employeeId));
$this->assertFalse($employeeModel->has_grant('customers', $employeeId));
$this->assertFalse($employeeModel->has_grant('sales', $employeeId));
}
public function testNewEmployeeCreationWithGrantsSucceedsWhenGrantChangeAllowed(): void
{
$this->loginAsAdmin();
putenv('DISALLOW_GRANT_CHANGE=false');
$response = $this->post('/employees/save', [
'first_name' => 'Brand',
'last_name' => 'New2',
'email' => 'brandnew2@test.com',
'username' => 'brandnew2',
'password' => 'password123',
'grant_customers' => 'customers'
]);
$response->assertStatus(200);
$result = json_decode($response->getJSON(), true);
$this->assertTrue($result['success']);
$createdEmployee = $this->db->table('employees')->where('username', 'brandnew2')->get()->getRow();
$this->assertNotNull($createdEmployee);
$employeeModel = model(Employee::class);
$this->assertTrue($employeeModel->has_grant('customers', (int) $createdEmployee->person_id));
}
}
+55 -33
View File
@@ -2,11 +2,12 @@
namespace Tests\Controllers;
use CodeIgniter\Database\Config;
use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait;
use CodeIgniter\Test\FeatureTestTrait;
use CodeIgniter\Config\Services;
use App\Models\Employee;
use RuntimeException;
/**
* Test suite for Home controller password validation
@@ -25,11 +26,17 @@ class HomeTest extends CIUnitTestCase
protected $refresh = false;
protected $namespace = null;
/**
* Set up test environment
*/
private static bool $doneBootstrap = false;
protected function setUp(): void
{
if (self::$doneBootstrap === false) {
Config::seeder($this->DBGroup)->call('App\Database\Seeds\TestDatabaseBootstrapSeeder');
Config::connect($this->DBGroup)->close();
self::$doneBootstrap = true;
}
parent::setUp();
}
@@ -124,26 +131,36 @@ class HomeTest extends CIUnitTestCase
}
/**
* Test password validation rejects whitespace-only passwords
* Password validation is a raw strlen() check with no whitespace
* handling, so a password consisting entirely of spaces still counts
* toward the length minimum.
*
* @return void
*/
public function testPasswordMinLength_RejectsWhitespaceOnly(): void
public function testPasswordMinLength_WhitespaceOnlyPasswordCountsTowardLength(): void
{
$this->resetSession();
// Attempt to set password as only whitespace
$response = $this->post('/home/save', [
'employee_id' => 1,
'username' => 'admin',
'current_password' => 'pointofsale',
'password' => ' ' // 8 spaces but empty actual password
]);
try {
$response = $this->post('/home/save', [
'employee_id' => 1,
'username' => 'admin',
'current_password' => 'pointofsale',
'password' => ' ' // 8 spaces: exactly meets the byte-length minimum
]);
$response->assertStatus(200);
$result = json_decode($response->getJSON(), true);
$this->assertFalse($result['success'], 'Whitespace only password should be rejected');
$this->assertEquals(-1, $result['id']);
$response->assertStatus(200);
$result = json_decode($response->getJSON(), true);
$this->assertTrue($result['success'], 'strlen()-based validation accepts 8 spaces as meeting the minimum length');
} finally {
// Restore original password
$employee = model(Employee::class);
$employee->change_password([
'username' => 'admin',
'password' => password_hash('pointofsale', PASSWORD_DEFAULT),
'hash_version' => 2
], 1);
}
}
/**
@@ -224,9 +241,7 @@ class HomeTest extends CIUnitTestCase
*/
protected function resetSession(): void
{
$session = Services::session();
$session->destroy();
$session->set('person_id', 1); // Admin user
$this->withSession(['person_id' => 1]); // Admin user
}
/**
@@ -237,30 +252,37 @@ class HomeTest extends CIUnitTestCase
*/
protected function createNonAdminEmployee(array $overrides = []): int
{
$uniqueSuffix = uniqid();
$personData = [
'first_name' => $overrides['first_name'] ?? 'NonAdmin',
'last_name' => $overrides['last_name'] ?? 'User',
'email' => $overrides['email'] ?? 'nonadmin@test.com',
'email' => $overrides['email'] ?? "nonadmin{$uniqueSuffix}@test.com",
'phone_number' => $overrides['phone_number'] ?? '555-1234'
];
$employeeData = [
'username' => $overrides['username'] ?? 'nonadmin',
'username' => $overrides['username'] ?? "nonadmin{$uniqueSuffix}",
'password' => password_hash($overrides['password'] ?? 'password123', PASSWORD_DEFAULT),
'hash_version' => 2,
'language_code' => 'en',
'language' => 'english'
];
$grantsData = [
$grantsData = $overrides['grants'] ?? [
['permission_id' => 'home', 'menu_group' => 'home'],
['permission_id' => 'customers', 'menu_group' => 'home'],
['permission_id' => 'sales', 'menu_group' => 'home']
];
$employeeModel = model(Employee::class);
$employeeModel->save_employee($personData, $employeeData, $grantsData, NEW_ENTRY);
$saved = $employeeModel->save_employee($personData, $employeeData, $grantsData, NEW_ENTRY);
return $employeeModel->get_found_rows('');
if (!$saved || empty($personData['person_id'])) {
throw new RuntimeException('Failed to create non-admin employee for testing');
}
return (int) $personData['person_id'];
}
/**
@@ -271,10 +293,10 @@ class HomeTest extends CIUnitTestCase
*/
protected function loginAs(int $personId): void
{
$session = Services::session();
$session->destroy();
$session->set('person_id', $personId);
$session->set('menu_group', 'home');
$this->withSession([
'person_id' => $personId,
'menu_group' => 'home',
]);
}
// ========== BOLA Authorization Tests ==========
@@ -346,11 +368,11 @@ class HomeTest extends CIUnitTestCase
*/
public function testUserCanChangeOwnPassword(): void
{
$nonAdminId = $this->createNonAdminEmployee();
$nonAdminId = $this->createNonAdminEmployee(['username' => 'nonadminchangeown']);
$this->loginAs($nonAdminId);
$response = $this->post('/home/save/' . $nonAdminId, [
'username' => 'nonadmin',
'username' => 'nonadminchangeown',
'current_password' => 'password123',
'password' => 'newpassword123'
]);
@@ -388,11 +410,11 @@ class HomeTest extends CIUnitTestCase
*/
public function testAdminCanChangeAnyPassword(): void
{
$nonAdminId = $this->createNonAdminEmployee();
$nonAdminId = $this->createNonAdminEmployee(['username' => 'nonadminadminchange']);
$this->resetSession(); // Login as admin
$response = $this->post('/home/save/' . $nonAdminId, [
'username' => 'nonadmin',
'username' => 'nonadminadminchange',
'current_password' => 'password123',
'password' => 'adminset123'
]);
@@ -0,0 +1,139 @@
<?php
namespace Tests\Controllers;
use CodeIgniter\Config\Factories;
use CodeIgniter\Database\Config;
use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait;
use CodeIgniter\Test\FeatureTestTrait;
use App\Models\Item;
use App\Models\Item_kit;
use Config\OSPOS;
use Exception;
class ItemKitsControllerTest extends CIUnitTestCase
{
use DatabaseTestTrait;
use FeatureTestTrait;
protected $migrate = true;
protected $migrateOnce = true;
protected $seedOnce = true;
protected $refresh = false;
protected $namespace = null;
private static bool $doneBootstrap = false;
protected Item $item;
protected Item_kit $itemKit;
protected function setUp(): void
{
if (self::$doneBootstrap === false) {
Config::seeder($this->DBGroup)->call('App\Database\Seeds\TestDatabaseBootstrapSeeder');
Config::connect($this->DBGroup)->close();
self::$doneBootstrap = true;
}
parent::setUp();
$ospos = new OSPOS();
$ospos->settings = [
'company' => 'Test Co',
'barcode_content' => 'id',
'barcode_type' => 'C128',
'barcode_font' => 'inconsolata.ttf',
'barcode_font_size' => 10,
'barcode_height' => 40,
'barcode_width' => 2,
'barcode_first_row' => 'item_code',
'barcode_second_row' => 'none',
'barcode_third_row' => 'none',
'barcode_num_in_row' => 1,
'barcode_page_width' => 8,
'barcode_page_cellspacing' => 1,
'barcode_generate_if_empty' => 0,
'barcode_formats' => 'null',
];
Factories::injectMock('config', OSPOS::class, $ospos);
$this->item = model(Item::class);
$this->itemKit = model(Item_kit::class);
}
protected function tearDown(): void
{
Factories::reset();
parent::tearDown();
}
protected function loginAsAdmin(): void
{
$this->withSession([
'person_id' => 1,
'menu_group' => 'office'
]);
}
private function createItemKit(): int
{
$itemData = [
'item_id' => null,
'name' => 'Kit Base Item',
'category' => 'Test',
'cost_price' => 10.00,
'unit_price' => 20.00,
'deleted' => 0
];
$this->assertTrue($this->item->save_value($itemData));
$itemKitData = [
'name' => 'Test Kit',
'description' => 'Test Kit Description',
'item_id' => $itemData['item_id'],
'kit_discount' => 0,
'kit_discount_type' => 0,
'price_option' => 0,
'print_option' => 0
];
$this->assertTrue($this->itemKit->save_value($itemKitData));
return (int) $itemKitData['item_kit_id'];
}
/**
* @throws Exception
*/
public function testGenerateBarcodesDoesNotDecodeTripleEncodedPayload(): void
{
$itemKitId = $this->createItemKit();
$this->loginAsAdmin();
// <svg onload=alert(document.domain)> URL-encoded three times (GHSA-3vpv-jqr3-7256 PoC).
// The framework's router decodes this twice before routing; the controller used to apply
// a third urldecode(), turning the remaining %3C.../%3E into a live <svg onload=...> tag.
// With that urldecode() removed, the value must stay percent-encoded text and never
// become a raw '<' in the response.
$payload = $itemKitId . '%25253Csvg%252520onload%25253Dalert%252528document.domain%252529%25253E';
$response = $this->get('/item_kits/generateBarcodes/' . $payload);
$response->assertStatus(200);
$body = $response->getBody();
$this->assertStringNotContainsString('<svg onload', $body);
$this->assertStringContainsString('%3Csvg', $body);
}
public function testGenerateBarcodesWorksForPlainItemKitId(): void
{
$itemKitId = $this->createItemKit();
$this->loginAsAdmin();
$response = $this->get('/item_kits/generateBarcodes/' . $itemKitId);
$response->assertStatus(200);
$this->assertStringContainsString('KIT ' . $itemKitId, $response->getBody());
}
}
+13 -12
View File
@@ -2,6 +2,7 @@
namespace Tests\Controllers;
use CodeIgniter\Database\Config;
use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait;
use App\Models\Item;
@@ -11,7 +12,6 @@ use App\Models\Item_taxes;
use App\Models\Attribute;
use App\Models\Stock_location;
use App\Models\Supplier;
use Config\Database;
class ItemsCsvImportTest extends CIUnitTestCase
{
@@ -19,11 +19,12 @@ class ItemsCsvImportTest extends CIUnitTestCase
protected $migrate = true;
protected $migrateOnce = true;
protected $seed = '';
protected $seedOnce = true;
protected $refresh = true;
protected $refresh = false;
protected $namespace = null;
private static $doneBootstrap = false;
protected $item;
protected $item_quantity;
protected $inventory;
@@ -32,15 +33,15 @@ class ItemsCsvImportTest extends CIUnitTestCase
protected $stock_location;
protected $supplier;
public static function setUpBeforeClass(): void
{
$seeder = Database::seeder('tests');
$seeder->call('TestDatabaseBootstrapSeeder');
}
protected function setUp(): void
{
if (self::$doneBootstrap === false) {
Config::seeder($this->DBGroup)->call('App\Database\Seeds\TestDatabaseBootstrapSeeder');
Config::connect($this->DBGroup)->close();
self::$doneBootstrap = true;
}
parent::setUp();
helper('importfile');
@@ -236,8 +237,8 @@ class ItemsCsvImportTest extends CIUnitTestCase
public function testMissingAttributeColumnIsRejected(): void
{
$csvContent = 'Id,Barcode,"Item Name",Category,"Supplier ID","Cost Price","Unit Price","Tax 1 Name","Tax 1 Percent","Tax 2 Name","Tax 2 Percent","Reorder Level",Description,"Allow Alt Description","Item has Serial Number",Image,HSN' . "\n";
$csvContent .= ",ITEM001,Test Item,Electronics,1,10.00,15.00,,,,,5,Test Description,0,0,,HSN001\n";
$csvContent = 'Id,Barcode,"Item Name",Category,"Supplier ID","Cost Price","Unit Price","Tax 1 Name","Tax 1 Percent","Tax 2 Name","Tax 2 Percent","Reorder Level",Description,"Allow Alt Description","Item has Serial Number",Image,HSN,"location_Warehouse"' . "\n";
$csvContent .= ",ITEM001,Test Item,Electronics,1,10.00,15.00,,,,,5,Test Description,0,0,,HSN001,100\n";
$tempFile = tempnam(sys_get_temp_dir(), 'csv_test_headers_no_attribute_');
file_put_contents($tempFile, $csvContent);
+199 -43
View File
@@ -3,55 +3,211 @@
namespace Tests\Controllers;
use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait;
use CodeIgniter\Test\FeatureTestTrait;
use App\Database\Seeds\TestDatabaseBootstrapSeeder;
use App\Models\Employee;
use Config\OSPOS;
/**
* Regression tests for GHSA-9gr6-4mm4-4wrq
*
* Reports::__construct() previously derived the report method name from
* $request->getUri()->getSegment(2), which CodeIgniter decodes once, while
* the router decodes the same path a second time before dispatch. Encoding
* the report name's underscore as %255F meant the constructor saw no
* underscore, skipped the has_grant() check entirely, and the router still
* dispatched to the real (double-decoded) method — letting any authenticated
* employee read reports they had no grant for.
*/
class ReportsControllerTest extends CIUnitTestCase
{
public function testRedirectPatternUsesHeaderAndExit(): void
use DatabaseTestTrait;
use FeatureTestTrait;
protected $migrate = true;
protected $migrateOnce = true;
protected $refresh = false;
protected $namespace = null;
private static bool $doneBootstrap = false;
/**
* Set up test environment
*/
protected function setUp(): void
{
// This test validates that the Reports submodule permission check
// uses the correct redirect pattern in constructors.
//
// The original bug: redirect() returns a RedirectResponse object
// but the constructor doesn't return it, so it gets discarded.
//
// The fix: Use header('Location: ' . base_url(...)); exit();
// which properly terminates execution and redirects.
$constructorCode = file_get_contents(APPPATH . 'Controllers/Reports.php');
// Verify the fix pattern is present
$this->assertStringContainsString("header('Location: ' . base_url(", $constructorCode);
$this->assertStringContainsString('exit();', $constructorCode);
// Verify the buggy pattern is NOT present in the permission check area
// (Note: redirect() may appear elsewhere in the codebase for valid uses)
$lines = explode("\n", $constructorCode);
$inConstructor = false;
foreach ($lines as $line) {
if (strpos($line, 'public function __construct') !== false) {
$inConstructor = true;
}
if ($inConstructor && strpos($line, '}') !== false && trim($line) === '}') {
break;
}
if ($inConstructor && strpos($line, "redirect('no_access") !== false) {
$this->fail('Old redirect() pattern found in constructor - should use header() + exit()');
}
if (self::$doneBootstrap === false) {
TestDatabaseBootstrapSeeder::reset();
self::$doneBootstrap = true;
}
$this->assertTrue(true, 'Permission check pattern validated');
parent::setUp();
config(OSPOS::class)->update_settings();
}
public function testSubmodulePermissionCheckOccursBeforeControllerInitialization(): void
/**
* Create a non-admin employee for testing
*
* @param array $overrides
* @return int
*/
protected function createNonAdminEmployee(array $overrides = []): int
{
// Verify that permission checks happen in the constructor
// before any controller methods can execute
$constructorCode = file_get_contents(APPPATH . 'Controllers/Reports.php');
// Verify the permission check is in the constructor
$this->assertStringContainsString('has_grant', $constructorCode);
$this->assertStringContainsString('reports_', $constructorCode);
$this->assertStringContainsString('submodule_id', $constructorCode);
$uniqueSuffix = uniqid();
$personData = [
'first_name' => $overrides['first_name'] ?? 'NonAdmin',
'last_name' => $overrides['last_name'] ?? 'User',
'email' => $overrides['email'] ?? "nonadmin{$uniqueSuffix}@test.com",
'phone_number' => $overrides['phone_number'] ?? '555-1234'
];
$employeeData = [
'username' => $overrides['username'] ?? "nonadmin{$uniqueSuffix}",
'password' => password_hash($overrides['password'] ?? 'password123', PASSWORD_DEFAULT),
'hash_version' => 2,
'language_code' => 'en',
'language' => 'english'
];
$grantsData = $overrides['grants'] ?? [
['permission_id' => 'customers', 'menu_group' => 'home'],
['permission_id' => 'sales', 'menu_group' => 'home']
];
$employeeModel = model(Employee::class);
$saved = $employeeModel->save_employee($personData, $employeeData, $grantsData, NEW_ENTRY);
$this->assertTrue($saved, 'Failed to save non-admin employee fixture.');
$this->assertArrayHasKey('person_id', $personData, 'Saved employee fixture missing person_id.');
return (int) $personData['person_id'];
}
}
/**
* Log in as the given employee
*
* @param int $personId
* @return void
*/
protected function loginAs(int $personId): void
{
$this->withSession([
'person_id' => $personId,
'menu_group' => 'home',
]);
}
/**
* A non-admin employee with no reports_customers grant must be denied
* access to the summary_customers report.
*
* @return void
*/
public function testNonAdminWithoutReportGrantIsDeniedSummaryCustomers(): void
{
$nonAdminId = $this->createNonAdminEmployee([
'grants' => [
['permission_id' => 'reports_sales', 'menu_group' => 'home']
]
]);
$this->loginAs($nonAdminId);
$response = $this->get('/reports/summary_customers');
$response->assertRedirect();
$this->assertStringContainsString('no_access', $response->getRedirectUrl());
}
/**
* Regression test for the double-URL-encoding bypass itself: replacing
* the underscore with %255F must not change the outcome versus the
* plain request in testNonAdminWithoutReportGrantIsDeniedSummaryCustomers().
*
* @return void
*/
public function testDoubleEncodedUnderscoreCannotBypassSummaryCustomersGrantCheck(): void
{
$nonAdminId = $this->createNonAdminEmployee([
'grants' => [
['permission_id' => 'reports_sales', 'menu_group' => 'home']
]
]);
$this->loginAs($nonAdminId);
$response = $this->get('/reports/summary%255Fcustomers');
$response->assertRedirect();
$this->assertStringContainsString('no_access', $response->getRedirectUrl());
}
/**
* Same bypass attempt against a different report prefix, to confirm the
* fix isn't narrowly specific to the summary_ prefix's regex path.
*
* @return void
*/
public function testDoubleEncodedUnderscoreCannotBypassDetailedSalesGrantCheck(): void
{
$nonAdminId = $this->createNonAdminEmployee([
'grants' => [
['permission_id' => 'reports_customers', 'menu_group' => 'home']
]
]);
$this->loginAs($nonAdminId);
$response = $this->get('/reports/detailed%255Fsales');
$response->assertRedirect();
$this->assertStringContainsString('no_access', $response->getRedirectUrl());
}
/**
* An employee with the reports_customers grant must be able to access
* the summary_customers report.
*
* @return void
*/
public function testEmployeeWithReportGrantCanAccessSummaryCustomers(): void
{
$employeeId = $this->createNonAdminEmployee([
'username' => 'reportviewer',
'email' => 'reportviewer@test.com',
'grants' => [
['permission_id' => 'reports', 'menu_group' => 'home'],
['permission_id' => 'reports_customers', 'menu_group' => 'home']
]
]);
$this->loginAs($employeeId);
$response = $this->get('/reports/summary_customers');
$response->assertStatus(200);
}
/**
* An employee with the base reports grant plus a submodule grant must be
* able to access the base /reports listing route (no submodule id derivable).
*
* @return void
*/
public function testEmployeeWithReportsGrantCanAccessBaseReportsIndex(): void
{
$employeeId = $this->createNonAdminEmployee([
'username' => 'reportsindexviewer',
'email' => 'reportsindexviewer@test.com',
'grants' => [
['permission_id' => 'reports', 'menu_group' => 'home'],
['permission_id' => 'reports_customers', 'menu_group' => 'home']
]
]);
$this->loginAs($employeeId);
$response = $this->get('/reports');
$response->assertStatus(200);
}
}
+351 -256
View File
@@ -6,11 +6,13 @@ use CodeIgniter\Test\CIUnitTestCase;
use CodeIgniter\Test\DatabaseTestTrait;
use CodeIgniter\Test\FeatureTestTrait;
use CodeIgniter\Config\Services;
use App\Database\Seeds\TestDatabaseBootstrapSeeder;
use App\Models\Employee;
use App\Models\Item;
use Config\OSPOS;
use Tests\Support\ItemFixtureTrait;
/**
* Includes regression tests for GHSA-3xf6-8fmq-44wg.
* Regression tests for GHSA-3xf6-8fmq-44wg.
*
* A cashier holding only the base "sales" grant (no "reports_sales") must
* not be able to reach the per-sale endpoints that getManage() gates
@@ -21,91 +23,54 @@ class SalesControllerTest extends CIUnitTestCase
{
use DatabaseTestTrait;
use FeatureTestTrait;
use ItemFixtureTrait;
protected $migrate = true;
protected $migrateOnce = true;
protected $refresh = true;
protected $seedOnce = true;
protected $refresh = false;
protected $namespace = null;
private static bool $doneBootstrap = false;
protected function setUp(): void
{
if (self::$doneBootstrap === false) {
TestDatabaseBootstrapSeeder::reset();
self::$doneBootstrap = true;
}
parent::setUp();
config(OSPOS::class)->update_settings();
}
protected function createCashierWithoutChangePriceGrant(): int
protected function tearDown(): void
{
$personData = [
'first_name' => 'Cashier',
'last_name' => 'NoChangePrice',
'email' => 'cashier-nochangeprice@test.com',
'phone_number' => '555-0001'
];
$employeeData = [
'username' => 'cashier_nochangeprice',
'password' => password_hash('password123', PASSWORD_DEFAULT),
'hash_version' => 2,
'language_code' => 'en',
'language' => 'english'
];
$grantsData = [
['permission_id' => 'sales', 'menu_group' => 'home'],
];
$employeeModel = model(Employee::class);
$employeeModel->save_employee($personData, $employeeData, $grantsData, NEW_ENTRY);
return $employeeModel->get_found_rows('');
}
protected function createCashierWithChangePriceGrant(): int
{
$personData = [
'first_name' => 'Cashier',
'last_name' => 'ChangePrice',
'email' => 'cashier-changeprice@test.com',
'phone_number' => '555-0002'
];
$employeeData = [
'username' => 'cashier_changeprice',
'password' => password_hash('password123', PASSWORD_DEFAULT),
'hash_version' => 2,
'language_code' => 'en',
'language' => 'english'
];
$grantsData = [
['permission_id' => 'sales', 'menu_group' => 'home'],
['permission_id' => 'sales_change_price', 'menu_group' => 'home'],
];
$employeeModel = model(Employee::class);
$employeeModel->save_employee($personData, $employeeData, $grantsData, NEW_ENTRY);
return $employeeModel->get_found_rows('');
}
protected function loginAsEmployee(int $personId): void
{
$session = Services::session();
$session->destroy();
$session->set('person_id', $personId);
$session->set('menu_group', 'home');
parent::tearDown();
}
protected function createCashierEmployee(): int
{
$unique = uniqid();
$personData = [
'first_name' => 'Cashier',
'last_name' => 'NoReports',
'email' => 'cashier@test.com',
'phone_number' => '555-0001'
'email' => "cashier.$unique@test.com",
'phone_number' => '555-0001',
'address_1' => '',
'address_2' => '',
'city' => '',
'state' => '',
'zip' => '',
'country' => '',
'comments' => '',
];
$employeeData = [
'username' => 'cashier',
'username' => "cashier.$unique",
'password' => password_hash('password123', PASSWORD_DEFAULT),
'hash_version' => 2,
'language_code' => 'en',
@@ -113,27 +78,40 @@ class SalesControllerTest extends CIUnitTestCase
];
// Deliberately grants "sales" (register access) but NOT "reports_sales".
// "sales_stock" is also required: Employee::has_module_grant('sales', ...)
// treats the bare "sales" grant as insufficient once any sales_* submodule
// permission exists in the permissions table (see has_subpermissions()).
$grantsData = [
['permission_id' => 'sales', 'menu_group' => 'home']
['permission_id' => 'sales', 'menu_group' => 'home'],
['permission_id' => 'sales_stock', 'menu_group' => 'home']
];
$employeeModel = model(Employee::class);
$employeeModel->save_employee($personData, $employeeData, $grantsData, NEW_ENTRY);
$this->assertTrue($employeeModel->save_employee($personData, $employeeData, $grantsData, NEW_ENTRY));
return $employeeModel->get_found_rows('');
return (int) $personData['person_id'];
}
protected function createReportsSalesEmployee(): int
{
$unique = uniqid();
$personData = [
'first_name' => 'Supervisor',
'last_name' => 'WithReports',
'email' => 'supervisor@test.com',
'phone_number' => '555-0002'
'email' => "supervisor.$unique@test.com",
'phone_number' => '555-0002',
'address_1' => '',
'address_2' => '',
'city' => '',
'state' => '',
'zip' => '',
'country' => '',
'comments' => '',
];
$employeeData = [
'username' => 'supervisor',
'username' => "supervisor.$unique",
'password' => password_hash('password123', PASSWORD_DEFAULT),
'hash_version' => 2,
'language_code' => 'en',
@@ -142,55 +120,142 @@ class SalesControllerTest extends CIUnitTestCase
$grantsData = [
['permission_id' => 'sales', 'menu_group' => 'home'],
['permission_id' => 'sales_stock', 'menu_group' => 'home'],
['permission_id' => 'reports_sales', 'menu_group' => 'home']
];
$employeeModel = model(Employee::class);
$employeeModel->save_employee($personData, $employeeData, $grantsData, NEW_ENTRY);
$this->assertTrue($employeeModel->save_employee($personData, $employeeData, $grantsData, NEW_ENTRY));
return $employeeModel->get_found_rows('');
return (int) $personData['person_id'];
}
protected function createCashierWithoutChangePriceGrant(): int
{
$unique = uniqid();
$personData = [
'first_name' => 'Cashier',
'last_name' => 'NoChangePrice',
'email' => "cashier-nochangeprice.$unique@test.com",
'phone_number' => '555-0001',
'address_1' => '',
'address_2' => '',
'city' => '',
'state' => '',
'zip' => '',
'country' => '',
'comments' => '',
];
$employeeData = [
'username' => "cashier_nochangeprice.$unique",
'password' => password_hash('password123', PASSWORD_DEFAULT),
'hash_version' => 2,
'language_code' => 'en',
'language' => 'english'
];
// "sales_stock" is required alongside "sales": see the has_module_grant/
// has_subpermissions note on createCashierEmployee() above.
$grantsData = [
['permission_id' => 'sales', 'menu_group' => 'home'],
['permission_id' => 'sales_stock', 'menu_group' => 'home'],
];
$employeeModel = model(Employee::class);
$this->assertTrue($employeeModel->save_employee($personData, $employeeData, $grantsData, NEW_ENTRY));
return (int) $personData['person_id'];
}
protected function createCashierWithChangePriceGrant(): int
{
$unique = uniqid();
$personData = [
'first_name' => 'Cashier',
'last_name' => 'ChangePrice',
'email' => "cashier-changeprice.$unique@test.com",
'phone_number' => '555-0002',
'address_1' => '',
'address_2' => '',
'city' => '',
'state' => '',
'zip' => '',
'country' => '',
'comments' => '',
];
$employeeData = [
'username' => "cashier_changeprice.$unique",
'password' => password_hash('password123', PASSWORD_DEFAULT),
'hash_version' => 2,
'language_code' => 'en',
'language' => 'english'
];
$grantsData = [
['permission_id' => 'sales', 'menu_group' => 'home'],
['permission_id' => 'sales_stock', 'menu_group' => 'home'],
['permission_id' => 'sales_change_price', 'menu_group' => 'home'],
];
$employeeModel = model(Employee::class);
$this->assertTrue($employeeModel->save_employee($personData, $employeeData, $grantsData, NEW_ENTRY));
return (int) $personData['person_id'];
}
protected function loginAs(int $personId): void
{
$this->withSession([
'person_id' => $personId,
'menu_group' => 'home',
]);
}
/**
* Inserts a minimal completed sale row directly, bypassing Sale::save_value()
* (which requires a full cart/inventory/tax pipeline unrelated to this
* authorization check).
* authorization check). Sale::get_info() inner-joins sales_items, so a
* matching item/sales_items row is required for the sale to be found.
*/
protected function createSale(int $employeeId): int
{
$builder = \Config\Database::connect()->table('sales');
$builder->insert([
$unique = uniqid();
$db = \Config\Database::connect();
$db->table('items')->insert([
'name' => "Test Item $unique",
'category' => 'Test',
'description' => 'Test item',
'cost_price' => 1,
'unit_price' => 1,
'item_number' => "TEST-$unique",
]);
$itemId = (int) $db->insertID();
$db->table('sales')->insert([
'sale_time' => date('Y-m-d H:i:s'),
'customer_id' => null,
'employee_id' => $employeeId,
'comment' => 'test sale',
'invoice_number' => null,
]);
$saleId = (int) $db->insertID();
return (int) \Config\Database::connect()->insertID();
}
$db->table('sales_items')->insert([
'sale_id' => $saleId,
'item_id' => $itemId,
'line' => 1,
'quantity_purchased' => 1,
'item_cost_price' => 1,
'item_unit_price' => 1,
'item_location' => 1,
]);
protected function createTestItem(): int
{
$itemData = [
'item_id' => null,
'name' => 'Test Item',
'description' => 'Test Item',
'category' => 'Test Category',
'cost_price' => 1.00,
'unit_price' => 5.00,
'reorder_level' => 0,
'item_number' => 'TEST-' . uniqid(),
'allow_alt_description' => 0,
'is_serialized' => 0,
'stock_type' => HAS_NO_STOCK,
'deleted' => 0,
];
$itemModel = model(Item::class);
$itemModel->save_value($itemData);
return (int) $itemData['item_id'];
return $saleId;
}
/**
@@ -200,43 +265,195 @@ class SalesControllerTest extends CIUnitTestCase
*/
protected function seedCartLine(int $line, string $price, int $itemId): void
{
$session = Services::session();
$session->set('sales_cart', [
$line => [
'item_id' => $itemId,
'item_location' => 1,
'stock_name' => 'Test Location',
'line' => $line,
'name' => 'Test Item',
'item_number' => 'TEST-1',
'attribute_values' => null,
'attribute_dtvalues' => null,
'description' => 'Test Item',
'serialnumber' => '',
'allow_alt_description' => false,
'is_serialized' => false,
'quantity' => '1',
'discount' => '0',
'discount_type' => 0,
'in_stock' => '10',
'price' => $price,
'cost_price' => '1.00',
'total' => $price,
'discounted_total' => $price,
'print_option' => 1,
'stock_type' => HAS_NO_STOCK,
'item_type' => ITEM,
'hsn_code' => null,
'tax_category_id' => null,
$this->withSession(array_merge($this->session, [
'sales_cart' => [
$line => [
'item_id' => $itemId,
'item_location' => 1,
'stock_name' => 'Test Location',
'line' => $line,
'name' => 'Test Item',
'item_number' => 'TEST-1',
'attribute_values' => null,
'attribute_dtvalues' => null,
'description' => 'Test Item',
'serialnumber' => '',
'allow_alt_description' => false,
'is_serialized' => false,
'quantity' => '1',
'discount' => '0',
'discount_type' => 0,
'in_stock' => '10',
'price' => $price,
'cost_price' => '1.00',
'total' => $price,
'discounted_total' => $price,
'print_option' => 1,
'stock_type' => HAS_NO_STOCK,
'item_type' => ITEM,
'hsn_code' => null,
'tax_category_id' => null,
],
],
]));
}
public function testCashierWithoutReportsSalesCannotGetRow(): void
{
$cashierId = $this->createCashierEmployee();
$saleId = $this->createSale($cashierId);
$this->loginAs($cashierId);
$response = $this->get('/sales/row/' . $saleId);
$response->assertStatus(403);
$result = json_decode($response->getJSON(), true);
$this->assertFalse($result['success']);
}
public function testCashierWithoutReportsSalesCannotGetEdit(): void
{
$cashierId = $this->createCashierEmployee();
$saleId = $this->createSale($cashierId);
$this->loginAs($cashierId);
$response = $this->get('/sales/edit/' . $saleId);
$response->assertRedirect();
$this->assertStringContainsString('no_access', $response->getRedirectUrl());
}
public function testCashierWithoutReportsSalesCannotGetReceipt(): void
{
$cashierId = $this->createCashierEmployee();
$saleId = $this->createSale($cashierId);
$this->loginAs($cashierId);
$response = $this->get('/sales/receipt/' . $saleId);
$response->assertRedirect();
$this->assertStringContainsString('no_access', $response->getRedirectUrl());
}
public function testCashierWithoutReportsSalesCannotGetInvoice(): void
{
$cashierId = $this->createCashierEmployee();
$saleId = $this->createSale($cashierId);
$this->loginAs($cashierId);
$response = $this->get('/sales/invoice/' . $saleId);
$response->assertRedirect();
$this->assertStringContainsString('no_access', $response->getRedirectUrl());
}
public function testCashierWithoutReportsSalesCannotSendPdf(): void
{
$cashierId = $this->createCashierEmployee();
$saleId = $this->createSale($cashierId);
$this->loginAs($cashierId);
$response = $this->get('/sales/sendpdf/' . $saleId);
$response->assertStatus(403);
$result = json_decode($response->getJSON(), true);
$this->assertFalse($result['success']);
}
public function testCashierWithoutReportsSalesCannotSendReceipt(): void
{
$cashierId = $this->createCashierEmployee();
$saleId = $this->createSale($cashierId);
$this->loginAs($cashierId);
$response = $this->get('/sales/sendreceipt/' . $saleId);
$response->assertStatus(403);
$result = json_decode($response->getJSON(), true);
$this->assertFalse($result['success']);
}
public function testCashierWithoutReportsSalesCannotPostSave(): void
{
$cashierId = $this->createCashierEmployee();
$saleId = $this->createSale($cashierId);
$this->loginAs($cashierId);
$response = $this->post('/sales/save/' . $saleId, [
'date' => date('m/d/Y H:i:s'),
'customer_id' => '',
'employee_id' => $cashierId,
'comment' => 'tampered',
'invoice_number' => '',
'number_of_payments'=> 0,
'payment_type_new' => '--',
'payment_amount_new'=> ''
]);
$response->assertStatus(403);
$result = json_decode($response->getJSON(), true);
$this->assertFalse($result['success']);
$this->assertSame(lang('Sales.not_authorized'), $result['message']);
}
public function testCashierWithoutReportsSalesCannotGetSearch(): void
{
$cashierId = $this->createCashierEmployee();
$this->createSale($cashierId);
$this->loginAs($cashierId);
$response = $this->get('/sales/search');
$response->assertStatus(403);
$result = json_decode($response->getJSON(), true);
$this->assertFalse($result['success']);
}
public function testEmployeeWithReportsSalesCanGetSearch(): void
{
$supervisorId = $this->createReportsSalesEmployee();
$this->createSale($supervisorId);
$this->loginAs($supervisorId);
$response = $this->get('/sales/search');
$response->assertStatus(200);
$result = json_decode($response->getJSON(), true);
$this->assertArrayNotHasKey('success', $result);
$this->assertArrayHasKey('total', $result);
$this->assertArrayHasKey('rows', $result);
$this->assertArrayHasKey('payment_summary', $result);
}
public function testEmployeeWithReportsSalesCanGetRow(): void
{
$supervisorId = $this->createReportsSalesEmployee();
$saleId = $this->createSale($supervisorId);
$this->loginAs($supervisorId);
$response = $this->get('/sales/row/' . $saleId);
$response->assertStatus(200);
$result = json_decode($response->getJSON(), true);
$this->assertArrayNotHasKey('success', $result);
}
public function testEmployeeWithReportsSalesCanGetEdit(): void
{
$supervisorId = $this->createReportsSalesEmployee();
$saleId = $this->createSale($supervisorId);
$this->loginAs($supervisorId);
$response = $this->get('/sales/edit/' . $saleId);
$response->assertStatus(200);
}
public function testCashierWithoutGrantCannotChangePrice(): void
{
$cashierId = $this->createCashierWithoutChangePriceGrant();
$this->loginAsEmployee($cashierId);
$itemId = $this->createTestItem();
$this->loginAs($cashierId);
$itemId = $this->createTestItem(HAS_NO_STOCK);
$this->seedCartLine(1, '5.00', $itemId);
$response = $this->post('/sales/editItem/1', [
@@ -259,8 +476,8 @@ class SalesControllerTest extends CIUnitTestCase
public function testCashierWithoutGrantCanEditQuantityAtSamePrice(): void
{
$cashierId = $this->createCashierWithoutChangePriceGrant();
$this->loginAsEmployee($cashierId);
$itemId = $this->createTestItem();
$this->loginAs($cashierId);
$itemId = $this->createTestItem(HAS_NO_STOCK);
$this->seedCartLine(1, '5.00', $itemId);
$response = $this->post('/sales/editItem/1', [
@@ -283,8 +500,8 @@ class SalesControllerTest extends CIUnitTestCase
public function testCashierWithGrantCanChangePrice(): void
{
$cashierId = $this->createCashierWithChangePriceGrant();
$this->loginAsEmployee($cashierId);
$itemId = $this->createTestItem();
$this->loginAs($cashierId);
$itemId = $this->createTestItem(HAS_NO_STOCK);
$this->seedCartLine(1, '5.00', $itemId);
$response = $this->post('/sales/editItem/1', [
@@ -302,126 +519,4 @@ class SalesControllerTest extends CIUnitTestCase
$cart = $session->get('sales_cart');
$this->assertEquals('0.01', $cart[1]['price']);
}
public function testCashierWithoutReportsSalesCannotGetRow(): void
{
$cashierId = $this->createCashierEmployee();
$saleId = $this->createSale($cashierId);
$this->loginAsEmployee($cashierId);
$response = $this->get('/sales/row/' . $saleId);
$response->assertStatus(200);
$result = json_decode($response->getJSON(), true);
$this->assertFalse($result['success']);
}
public function testCashierWithoutReportsSalesCannotGetEdit(): void
{
$cashierId = $this->createCashierEmployee();
$saleId = $this->createSale($cashierId);
$this->loginAsEmployee($cashierId);
$response = $this->get('/sales/edit/' . $saleId);
$response->assertRedirect();
$this->assertStringContainsString('no_access', $response->getRedirectUrl());
}
public function testCashierWithoutReportsSalesCannotGetReceipt(): void
{
$cashierId = $this->createCashierEmployee();
$saleId = $this->createSale($cashierId);
$this->loginAsEmployee($cashierId);
$response = $this->get('/sales/receipt/' . $saleId);
$response->assertRedirect();
$this->assertStringContainsString('no_access', $response->getRedirectUrl());
}
public function testCashierWithoutReportsSalesCannotGetInvoice(): void
{
$cashierId = $this->createCashierEmployee();
$saleId = $this->createSale($cashierId);
$this->loginAsEmployee($cashierId);
$response = $this->get('/sales/invoice/' . $saleId);
$response->assertRedirect();
$this->assertStringContainsString('no_access', $response->getRedirectUrl());
}
public function testCashierWithoutReportsSalesCannotSendPdf(): void
{
$cashierId = $this->createCashierEmployee();
$saleId = $this->createSale($cashierId);
$this->loginAsEmployee($cashierId);
$response = $this->get('/sales/sendpdf/' . $saleId);
$response->assertStatus(200);
$result = json_decode($response->getJSON(), true);
$this->assertFalse($result['success']);
}
public function testCashierWithoutReportsSalesCannotSendReceipt(): void
{
$cashierId = $this->createCashierEmployee();
$saleId = $this->createSale($cashierId);
$this->loginAsEmployee($cashierId);
$response = $this->get('/sales/sendreceipt/' . $saleId);
$response->assertStatus(200);
$result = json_decode($response->getJSON(), true);
$this->assertFalse($result['success']);
}
public function testCashierWithoutReportsSalesCannotPostSave(): void
{
$cashierId = $this->createCashierEmployee();
$saleId = $this->createSale($cashierId);
$this->loginAsEmployee($cashierId);
$response = $this->post('/sales/save/' . $saleId, [
'date' => date('m/d/Y H:i:s'),
'customer_id' => '',
'employee_id' => $cashierId,
'comment' => 'tampered',
'invoice_number' => '',
'number_of_payments'=> 0,
'payment_type_new' => '--',
'payment_amount_new'=> ''
]);
$response->assertStatus(200);
$result = json_decode($response->getJSON(), true);
$this->assertFalse($result['success']);
$this->assertSame(lang('Sales.not_authorized'), $result['message']);
}
public function testEmployeeWithReportsSalesCanGetRow(): void
{
$supervisorId = $this->createReportsSalesEmployee();
$saleId = $this->createSale($supervisorId);
$this->loginAsEmployee($supervisorId);
$response = $this->get('/sales/row/' . $saleId);
$response->assertStatus(200);
$result = json_decode($response->getJSON(), true);
$this->assertArrayNotHasKey('success', $result);
}
public function testEmployeeWithReportsSalesCanGetEdit(): void
{
$supervisorId = $this->createReportsSalesEmployee();
$saleId = $this->createSale($supervisorId);
$this->loginAsEmployee($supervisorId);
$response = $this->get('/sales/edit/' . $saleId);
$response->assertStatus(200);
}
}
+127
View File
@@ -0,0 +1,127 @@
<?php
namespace Tests\Libraries;
use App\Libraries\Barcode_lib;
use CodeIgniter\Test\CIUnitTestCase;
class Barcode_libTest extends CIUnitTestCase
{
private Barcode_lib $barcodeLib;
protected function setUp(): void
{
parent::setUp();
$this->barcodeLib = new Barcode_lib();
}
private function baseBarcodeConfig(string $layout): array
{
return [
'company' => 'Test Co',
'barcode_content' => 'id',
'barcode_type' => 'C128',
'barcode_font' => 'inconsolata.ttf',
'barcode_font_size' => 10,
'barcode_height' => 40,
'barcode_width' => 2,
'barcode_first_row' => $layout,
'barcode_second_row' => 'none',
'barcode_third_row' => 'none',
'barcode_num_in_row' => 1,
'barcode_page_width' => 8,
'barcode_page_cellspacing' => 1,
'barcode_generate_if_empty' => 0,
'barcode_formats' => [],
];
}
public function testNamePayloadIsEscaped(): void
{
$item = [
'name' => '<svg onload=alert(document.domain)>',
'item_id' => '1',
];
$result = $this->barcodeLib->display_barcode($item, $this->baseBarcodeConfig('name'));
$this->assertStringNotContainsString('<svg onload', $result);
$this->assertStringContainsString('&lt;svg', $result);
}
public function testItemCodeIdPayloadIsEscaped(): void
{
$item = [
'name' => 'Item Name',
'item_id' => 'KIT 1<svg onload=alert(document.domain)>',
];
$config = $this->baseBarcodeConfig('item_code');
$config['barcode_content'] = 'id';
$result = $this->barcodeLib->display_barcode($item, $config);
$this->assertStringNotContainsString('<svg onload', $result);
$this->assertStringContainsString('&lt;svg', $result);
}
public function testItemCodeNumberPayloadIsEscaped(): void
{
$item = [
'name' => 'Item Name',
'item_id' => '1',
'item_number' => 'KIT 1<svg onload=alert(document.domain)>',
];
$config = $this->baseBarcodeConfig('item_code');
$config['barcode_content'] = 'item_number';
$result = $this->barcodeLib->display_barcode($item, $config);
$this->assertStringNotContainsString('<svg onload', $result);
$this->assertStringContainsString('&lt;svg', $result);
}
public function testCategoryPayloadIsEscaped(): void
{
$item = [
'name' => 'Item Name',
'item_id' => '1',
'category' => '<svg onload=alert(document.domain)>',
];
$result = $this->barcodeLib->display_barcode($item, $this->baseBarcodeConfig('category'));
$this->assertStringNotContainsString('<svg onload', $result);
$this->assertStringContainsString('&lt;svg', $result);
}
public function testCompanyNamePayloadIsEscaped(): void
{
$item = [
'name' => 'Item Name',
'item_id' => '1',
];
$config = $this->baseBarcodeConfig('company_name');
$config['company'] = '<svg onload=alert(document.domain)>';
$result = $this->barcodeLib->display_barcode($item, $config);
$this->assertStringNotContainsString('<svg onload', $result);
$this->assertStringContainsString('&lt;svg', $result);
}
public function testCleanNameIsUnaffected(): void
{
$item = [
'name' => 'Widget A',
'item_id' => '1',
];
$result = $this->barcodeLib->display_barcode($item, $this->baseBarcodeConfig('name'));
$this->assertStringContainsString('Widget A', $result);
}
}
+155 -32
View File
@@ -12,7 +12,7 @@ class EmployeeTest extends CIUnitTestCase
protected $migrate = true;
protected $migrateOnce = true;
protected $refresh = true;
protected $refresh = false;
protected $namespace = null;
protected function setUp(): void
@@ -23,9 +23,9 @@ class EmployeeTest extends CIUnitTestCase
public function testIsAdminReturnsTrueForPersonId1(): void
{
$employeeModel = model(Employee::class);
$result = $employeeModel->isAdmin(1);
$this->assertTrue($result);
}
@@ -34,12 +34,12 @@ class EmployeeTest extends CIUnitTestCase
$employeeModel = $this->getMockBuilder(Employee::class)
->onlyMethods(['has_grant'])
->getMock();
$employeeModel->method('has_grant')
->willReturn(true);
$result = $employeeModel->isAdmin(2);
$this->assertTrue($result);
}
@@ -48,14 +48,14 @@ class EmployeeTest extends CIUnitTestCase
$employeeModel = $this->getMockBuilder(Employee::class)
->onlyMethods(['has_grant'])
->getMock();
$employeeModel->method('has_grant')
->willReturnCallback(function($permissionId, $personId) {
return $permissionId !== 'config';
});
$result = $employeeModel->isAdmin(3);
$this->assertFalse($result);
}
@@ -64,12 +64,12 @@ class EmployeeTest extends CIUnitTestCase
$employeeModel = $this->getMockBuilder(Employee::class)
->onlyMethods(['isAdmin'])
->getMock();
$employeeModel->method('isAdmin')
->willReturn(false);
$result = $employeeModel->canModifyEmployee(1, 1);
$this->assertTrue($result);
}
@@ -78,12 +78,12 @@ class EmployeeTest extends CIUnitTestCase
$employeeModel = $this->getMockBuilder(Employee::class)
->onlyMethods(['isAdmin'])
->getMock();
$employeeModel->method('isAdmin')
->willReturn(true);
$result = $employeeModel->canModifyEmployee(1, 1);
$this->assertTrue($result);
}
@@ -92,14 +92,14 @@ class EmployeeTest extends CIUnitTestCase
$employeeModel = $this->getMockBuilder(Employee::class)
->onlyMethods(['isAdmin'])
->getMock();
$employeeModel->method('isAdmin')
->willReturnCallback(function($personId) {
return $personId === 1;
});
$result = $employeeModel->canModifyEmployee(1, 2);
$this->assertFalse($result);
}
@@ -108,14 +108,14 @@ class EmployeeTest extends CIUnitTestCase
$employeeModel = $this->getMockBuilder(Employee::class)
->onlyMethods(['isAdmin'])
->getMock();
$employeeModel->method('isAdmin')
->willReturnCallback(function($personId) {
return $personId === 1;
});
$result = $employeeModel->canModifyEmployee(2, 1);
$this->assertTrue($result);
}
@@ -124,12 +124,12 @@ class EmployeeTest extends CIUnitTestCase
$employeeModel = $this->getMockBuilder(Employee::class)
->onlyMethods(['isAdmin'])
->getMock();
$employeeModel->method('isAdmin')
->willReturn(false);
$result = $employeeModel->canModifyEmployee(2, 3);
$this->assertTrue($result);
}
@@ -138,32 +138,155 @@ class EmployeeTest extends CIUnitTestCase
$employeeModel = $this->getMockBuilder(Employee::class)
->onlyMethods(['isAdmin'])
->getMock();
$employeeModel->method('isAdmin')
->willReturnCallback(function($personId) {
return $personId === 1;
});
$result = $employeeModel->canModifyEmployee(1, 2);
$this->assertFalse($result);
}
public function testHasGrantReturnsTrueForActualGrant(): void
{
$employeeModel = model(Employee::class);
$result = $employeeModel->has_grant('employees', 1);
$this->assertTrue($result);
}
public function testHasGrantReturnsFalseForMissingGrant(): void
{
$employeeModel = model(Employee::class);
$result = $employeeModel->has_grant('nonexistent_permission', 1);
$this->assertFalse($result);
}
}
protected function createEmployeeWithGrants(array $grantsData): int
{
$uniqueSuffix = uniqid();
$personData = [
'first_name' => 'Grant',
'last_name' => 'Tester',
'email' => "granttester{$uniqueSuffix}@test.com",
'phone_number' => '555-5678'
];
$employeeData = [
'username' => "granttester{$uniqueSuffix}",
'password' => password_hash('password123', PASSWORD_DEFAULT),
'hash_version' => 2,
'language_code' => 'en',
'language' => 'english'
];
$employeeModel = model(Employee::class);
$result = $employeeModel->save_employee($personData, $employeeData, $grantsData, NEW_ENTRY);
$this->assertTrue($result);
$this->assertArrayHasKey('person_id', $personData);
return $personData['person_id'];
}
public function testExistingEmployeeKeepsOriginalGrantsWhenGrantChangeDisallowed(): void
{
$employeeId = $this->createEmployeeWithGrants([
['permission_id' => 'customers', 'menu_group' => 'home']
]);
$originalDisallowGrantChange = getenv('DISALLOW_GRANT_CHANGE');
putenv('DISALLOW_GRANT_CHANGE=true');
try {
$employeeModel = model(Employee::class);
$personData = ['first_name' => 'Grant', 'last_name' => 'Tester'];
$employeeData = ['username' => 'granttester', 'language_code' => 'en', 'language' => 'english'];
$newGrantsData = [['permission_id' => 'sales', 'menu_group' => 'home']];
$saveEmployeeResult = $employeeModel->save_employee($personData, $employeeData, $newGrantsData, $employeeId);
$this->assertTrue($saveEmployeeResult);
$this->assertTrue($employeeModel->has_grant('customers', $employeeId));
$this->assertFalse($employeeModel->has_grant('sales', $employeeId));
} finally {
$originalDisallowGrantChange === false
? putenv('DISALLOW_GRANT_CHANGE')
: putenv("DISALLOW_GRANT_CHANGE={$originalDisallowGrantChange}");
}
}
public function testNewEmployeeCreationWithGrantsRejectedWhenGrantChangeDisallowed(): void
{
$originalDisallowGrantChange = getenv('DISALLOW_GRANT_CHANGE');
putenv('DISALLOW_GRANT_CHANGE=true');
try {
$result = $this->createEmployeeWithGrantsExpectingFailure([
['permission_id' => 'customers', 'menu_group' => 'home']
]);
$this->assertFalse($result);
} finally {
$originalDisallowGrantChange === false
? putenv('DISALLOW_GRANT_CHANGE')
: putenv("DISALLOW_GRANT_CHANGE={$originalDisallowGrantChange}");
}
}
protected function createEmployeeWithGrantsExpectingFailure(array $grantsData): bool
{
$uniqueSuffix = uniqid();
$personData = [
'first_name' => 'Rejected',
'last_name' => 'Tester',
'email' => "rejectedtester{$uniqueSuffix}@test.com",
'phone_number' => '555-9999'
];
$employeeData = [
'username' => "rejectedtester{$uniqueSuffix}",
'password' => password_hash('password123', PASSWORD_DEFAULT),
'hash_version' => 2,
'language_code' => 'en',
'language' => 'english'
];
$employeeModel = model(Employee::class);
return $employeeModel->save_employee($personData, $employeeData, $grantsData, NEW_ENTRY);
}
public function testExistingEmployeeGrantsUpdateWhenGrantChangeAllowed(): void
{
$employeeId = $this->createEmployeeWithGrants([
['permission_id' => 'customers', 'menu_group' => 'home']
]);
$employeeModel = model(Employee::class);
$personData = ['first_name' => 'Grant', 'last_name' => 'Tester'];
$employeeData = ['username' => 'granttester', 'language_code' => 'en', 'language' => 'english'];
$newGrantsData = [['permission_id' => 'sales', 'menu_group' => 'home']];
$employeeModel->save_employee($personData, $employeeData, $newGrantsData, $employeeId);
$this->assertFalse($employeeModel->has_grant('customers', $employeeId));
$this->assertTrue($employeeModel->has_grant('sales', $employeeId));
}
public function testNewEmployeeCreationWithGrantsSucceedsWhenGrantChangeAllowed(): void
{
$result = $this->createEmployeeWithGrantsExpectingFailure([
['permission_id' => 'customers', 'menu_group' => 'home']
]);
$this->assertTrue((bool) $result);
}
}
+1 -1
View File
@@ -14,7 +14,7 @@ class Summary_taxes_test extends CIUnitTestCase
protected $migrate = true;
protected $migrateOnce = true;
protected $refresh = true;
protected $refresh = false;
protected $namespace = null;
private array $seededSaleIds = [];