mirror of
https://github.com/opensourcepos/opensourcepos.git
synced 2026-09-13 13:57:34 -04:00
Merge branch 'master' into plugin-system-fresh
This commit is contained in:
90 files changed
+4225
-2824
No files matched your search
+61
-40
@@ -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
|
||||
@@ -76,6 +76,8 @@ system/
|
||||
*~
|
||||
*.~
|
||||
.env
|
||||
.env.lock
|
||||
.env.tmp.*
|
||||
auth.json
|
||||
|
||||
*.png
|
||||
|
||||
@@ -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,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();
|
||||
}
|
||||
|
||||
|
||||
@@ -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',
|
||||
|
||||
@@ -39,6 +39,7 @@ class OSPOS extends BaseConfig
|
||||
|
||||
try {
|
||||
$db = Database::connect();
|
||||
$db->resetDataCache();
|
||||
|
||||
if (!$db->tableExists('app_config')) {
|
||||
$this->settings = $this->getDefaultSettings();
|
||||
|
||||
@@ -2,9 +2,7 @@
|
||||
|
||||
use CodeIgniter\Router\RouteCollection;
|
||||
|
||||
/**
|
||||
* @var RouteCollection $routes
|
||||
*/
|
||||
/** @var RouteCollection $routes */
|
||||
$routes->setDefaultController('Login');
|
||||
|
||||
$routes->get('/', 'Login::index');
|
||||
|
||||
@@ -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
@@ -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 = [];
|
||||
|
||||
|
||||
@@ -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'));
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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');
|
||||
}
|
||||
}
|
||||
@@ -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
@@ -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,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')
|
||||
|
||||
File renamed without changes.
@@ -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();
|
||||
}
|
||||
}
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
}
|
||||
@@ -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');
|
||||
|
||||
@@ -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
@@ -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");
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
@@ -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' => 'اسم المستخدم مطلوب.',
|
||||
];
|
||||
@@ -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' => 'اسم المستخدم مطلوب.',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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' => 'Потребителското име е задължително поле.',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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' => 'ناوی بەکارهێنەر خانەیەکی پێویستە.',
|
||||
];
|
||||
@@ -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' => '',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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' => '',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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' => 'نام کاربری فیلد مورد نیاز است.',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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' => 'שם המשתמש הינו שדה חובה.',
|
||||
];
|
||||
@@ -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',
|
||||
];
|
||||
@@ -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ő',
|
||||
];
|
||||
@@ -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' => '',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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' => '',
|
||||
];
|
||||
@@ -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' => 'ឈ្មោះអ្នកប្រើប្រាស់ត្រូវការចាំបាច់។',
|
||||
];
|
||||
@@ -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 ຈຳເປັນຕ້ອງໃສ່.',
|
||||
];
|
||||
@@ -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' => '',
|
||||
];
|
||||
@@ -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' => '',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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' => '',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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' => '',
|
||||
];
|
||||
@@ -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' => 'Имя пользователя - обязательное поле для заполнения.',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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' => 'จำเป็นต้องระบุชื่อผู้ใช้งาน',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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' => 'Ім\'я користувача - обов\'язкове поле.',
|
||||
];
|
||||
@@ -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' => '',
|
||||
];
|
||||
@@ -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.',
|
||||
];
|
||||
@@ -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' => '帳號為必填',
|
||||
];
|
||||
@@ -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' => '帳號為必填.',
|
||||
];
|
||||
@@ -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);
|
||||
|
||||
@@ -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
@@ -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');
|
||||
|
||||
@@ -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
@@ -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;
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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>
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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('<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('<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('<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('<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('<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
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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 = [];
|
||||
|
||||
Reference in new issue
Block a user