Compare commits

..

2 Commits

Author SHA1 Message Date
Ollama
6633bb36a8 fix: tax rate input locale handling - save path
The display fix (using (float) instead of to_tax_decimals()) was
correct but incomplete. The save path in Config.php also needed
fixing because parse_tax() misinterprets dot-decimal values from
type="number" inputs when locale uses comma as decimal separator.

Root cause: Browsers submit type="number" inputs as dot-decimal
(e.g., "5.5") regardless of locale. With comma-decimal locales
like de_DE, parse_tax() treats the dot as thousands separator,
causing 5.5 to be saved as 5.

Fix: Replace parse_tax() with direct (float) cast for these
inputs since type="number" already guarantees dot-decimal format.

Includes tests for tax rate handling with various decimal values.

Fixes #4553
2026-05-22 19:06:41 +02:00
Ollama
30d5ac4496 fix: tax rate inputs blank with comma-decimal locales
The to_tax_decimals() function returns locale-formatted values
(e.g. "18,00" for comma-decimal locales like fr_FR, de_DE).
Browsers reject comma-decimal values in <input type="number">
and render the field blank.

Use raw float value instead - PHP serializes floats with period
decimal regardless of locale. The parse_tax() on the save side
already handles locale-aware parsing, so round-tripping works
correctly.

Fixes #4553
Regression from commit 42ba39d29
2026-05-21 21:36:14 +02:00
346 changed files with 2246 additions and 5795 deletions

2
.gitignore vendored
View File

@@ -87,5 +87,3 @@ auth.json
/app/Database/database.sql
/writable/cache/settings
/.env.bak
/.php-cs-fixer.cache
/build

127
AGENTS.md
View File

@@ -1,125 +1,40 @@
# Agent Instructions
This document is the single source of truth for all AI agents working on the Open Source Point of Sale (OSPOS) codebase. Read it fully before making any changes.
## Project Overview
OpenSourcePOS is a web-based Point of Sale system built on **CodeIgniter 4** (PHP 8.2+) with MySQL/MariaDB. Frontend uses Bootstrap 3 (Bootstrap 5 migration in progress) and jQuery, with assets built via Gulp.
## Common Commands
```bash
# PHP dependencies
composer install
# Frontend dependencies and asset build
npm install
npm run build # Runs Gulp: compiles and copies all CSS/JS to public/resources/
# Run full test suite
composer test
# Run a single test file
vendor/bin/phpunit tests/unit/AppTest.php
# Lint / code style check
vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.no-header.php --dry-run
# Apply code style fixes
vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.no-header.php
```
Tests require a MariaDB/MySQL database (see CI config in `.github/workflows/phpunit.yml`).
## Architecture
### Framework & Entry Point
- **Framework**: CodeIgniter 4 — MVC with QueryBuilder ORM, no Eloquent
- **Web root**: `public/``public/index.php` is the only entry point
- **Routes**: `app/Config/Routes.php`
- **App config**: `app/Config/App.php` (version, session, security settings)
- **Environment**: `.env` file (copy from `.env.example`); `CI_ENVIRONMENT` controls dev/prod/test mode
### Directory Layout
```text
app/
├── Config/ # CI4 config classes
├── Controllers/ # ~27 controllers (Sales, Items, Reports, Customers, etc.)
├── Models/ # ~28 models (Sale, Item, Customer, Supplier, etc.)
├── Views/ # PHP view templates
├── Libraries/ # Business logic (Sale_lib, Tax_lib, Receiving_lib, etc.)
├── Plugins/ # Plugin system — each plugin is a subdirectory here
├── Database/ # Migrations (ospos_ prefix) and seeds
├── Language/ # i18n files (IETF BCP 47 locale names)
├── Filters/ # Request/response filters (auth, HTTPS, etc.)
└── Events/ # CI4 event subscribers
public/
└── resources/ # Built CSS/JS (do not edit directly — generated by npm run build)
tests/ # PHPUnit test suite
```
### Key Libraries
`app/Libraries/` holds core business logic:
- `Sale_lib.php` — sale cart state, pricing, discounts, tax calculation
- `Tax_lib.php` — multi-tier tax engine
- `Receiving_lib.php` — purchase orders / receivings
- `Barcode_lib.php` — barcode generation
- `Email_lib.php` — email delivery
- `Token_lib.php` — CSRF/session token management
### Database
- Table prefix: `ospos_` (defined in `app/Config/Database.php`)
- Migrations live in `app/Database/Migrations/` and run automatically on first access
- CodeIgniter QueryBuilder throughout — no raw SQL unless necessary
### Plugin System
Plugins live in `app/Plugins/<PluginName>/` and are auto-discovered by `PluginManager`. Each plugin:
- Extends `BasePlugin` or implements `PluginInterface`
- Registers event hooks (e.g., `item_sale`, `customer_saved`, view hooks like `customer_tabs`)
- Can include its own `Views/`, `Models/`, `Controllers/`, and `Language/` subdirectories
- Configuration stored in `ospos_plugin_config` table
- See `app/Plugins/README.md` for plugin structure, event hooks, and LICENSE requirements
### Frontend Build
`gulpfile.js` (Gulp 5) copies vendor CSS/JS from `node_modules/` into `public/resources/`. Run `npm run build` after installing npm packages or changing gulp tasks. Do not manually edit files under `public/resources/`.
This document provides guidance for AI agents working on the Open Source Point of Sale (OSPOS) codebase.
## Code Style
- **PSR-12** enforced via PHP-CS-Fixer (config: `.php-cs-fixer.no-header.php`)
- `camelCase` for variables and methods; `PascalCase` for classes; `UPPER_CASE` for constants
- PHP 8.2+ features acceptable (named arguments, enums, readonly properties)
- Views in `app/Views/errors/html/` are excluded from the fixer
- Run fixer before committing: `vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.no-header.php`
- Follow PHP CodeIgniter 4 coding standards
- Run PHP-CS-Fixer before committing: `vendor/bin/php-cs-fixer fix --config=.php-cs-fixer.no-header.php`
- Write PHP 8.1+ compatible code with proper type declarations
- Use PSR-12 naming conventions: `camelCase` for variables and functions, `PascalCase` for classes, `UPPER_CASE` for constants
## Development Workflow
## Development
- Create a new git worktree for each issue, based on the latest state of `origin/master`
- Commit fixes to the worktree and push to the remote
- Tests must pass before submitting changes (`composer test`)
- Minimum PHPUnit version: 10.5.16+. Default config: `phpunit.xml.dist`
## Testing
- Run PHPUnit tests: `composer test`
- Tests must pass before submitting changes
## Build
- Install dependencies: `composer install && npm install`
- Build assets: `npm run build` or `gulp`
## Conventions
- Controllers `app/Controllers/`
- Models `app/Models/`
- Views `app/Views/`
- Migrations `app/Database/Migrations/`
- Plugins → `app/Plugins/` (see `app/Plugins/README.md` for plugin structure, event hooks, and LICENSE requirements)
- Controllers go in `app/Controllers/`
- Models go in `app/Models/`
- Views go in `app/Views/`
- Database migrations in `app/Database/Migrations/`
- Use CodeIgniter 4 framework patterns and helpers
- Sanitize user input; escape output using `esc()` helper
## Security
- `app.allowedHostnames` **must** be set in production (host header injection protection)
- HTMLPurifier for HTML sanitization; Laminas Escaper for output escaping
- CSRF tokens managed via `Token_lib` — do not bypass CI4's CSRF filter
- Session storage is database-backed (`ospos_sessions` table) for multi-instance support
- Never commit secrets, credentials, or `.env` files
- Use parameterized queries to prevent SQL injection
- Validate and sanitize all user input
- Validate and sanitize all user input

View File

@@ -1,3 +0,0 @@
# CLAUDE.md
> **MANDATORY INSTRUCTION**: You MUST read `AGENTS.md` in this directory before doing anything else. `AGENTS.md` is the single source of truth for this project — architecture, commands, conventions, security rules, and workflow are all defined there. Do not proceed with any task until you have read and internalized its contents.

View File

@@ -78,7 +78,6 @@ class Autoload extends AutoloadConfig
'No_access' => '/App/Controllers/No_access.php',
'Office' => '/App/Controllers/Office.php',
'Persons' => '/App/Controllers/Persons.php',
'Plugins' => '/App/Controllers/Plugins.php',
'Receivings' => '/App/Controllers/Receivings.php',
'Reports' => '/App/Controllers/Reports.php',
'Sales' => '/App/Controllers/Sales.php',
@@ -158,9 +157,9 @@ class Autoload extends AutoloadConfig
'Barcode_lib' => '/App/Libraries/Barcode_lib.php',
'Email_lib' => '/App/Libraries/Email_lib.php',
'Item_lib' => '/App/Libraries/Item_lib.php',
'Mailchimp_lib' => '/App/Libraries/Mailchimp_lib.php',
'MY_Email' => '/App/Libraries/MY_Email.php',
'MY_Migration' => '/App/Libraries/MY_Migration.php',
'PluginManager' => '/App/Libraries/Plugins/PluginManager.php',
'Receving_lib' => '/App/Libraries/Receiving_lib.php',
'Sale_lib' => '/App/Libraries/Sale_lib.php',
'Sms_lib' => '/App/Libraries/Sms_lib.php',
@@ -204,7 +203,6 @@ class Autoload extends AutoloadConfig
'cookie',
'tabular',
'locale',
'security',
'plugin'
'security'
];
}

View File

@@ -173,4 +173,4 @@ const DEFAULT_LANGUAGE_CODE = 'en';
/**
* Admin modules - list of modules required for admin privileges
*/
const ADMIN_MODULES = ['customers', 'employees', 'giftcards', 'items', 'item_kits', 'messages', 'plugins', 'receivings', 'reports', 'sales', 'config', 'suppliers'];
const ADMIN_MODULES = ['customers', 'employees', 'giftcards', 'items', 'item_kits', 'messages', 'receivings', 'reports', 'sales', 'config', 'suppliers'];

View File

@@ -8,7 +8,6 @@ use CodeIgniter\HotReloader\HotReloader;
use App\Events\Db_log;
use App\Events\Load_config;
use App\Events\Method;
use App\Libraries\Plugins\PluginManager;
/*
* --------------------------------------------------------------------
@@ -26,9 +25,6 @@ use App\Libraries\Plugins\PluginManager;
* Example:
* Events::on('create', [$myInstance, 'myMethod']);
*/
Events::on('pre_system', static function (): void {
PluginManager::registerAllNamespaces();
});
Events::on('pre_system', static function (): void {
if (ENVIRONMENT !== 'testing') {
@@ -52,6 +48,7 @@ Events::on('pre_system', static function (): void {
if (CI_DEBUG && ! is_cli()) {
Events::on('DBQuery', 'CodeIgniter\Debug\Toolbar\Collectors\Database::collect');
service('toolbar')->respond();
// Hot Reload route - for framework use on the hot reloader.
if (ENVIRONMENT === 'development') {
service('routes')->get('__hot-reload', static function (): void {
(new HotReloader())->run();
@@ -60,12 +57,8 @@ Events::on('pre_system', static function (): void {
}
});
Events::on('post_controller_constructor', static function (): void {
service('pluginManager');
}, 10);
$config = new Load_config();
Events::on('post_controller_constructor', [$config, 'load_config'], 1);
Events::on('post_controller_constructor', [$config, 'load_config']);
$db_log = new Db_log();
Events::on('DBQuery', [$db_log, 'db_log_queries']);

View File

@@ -3,7 +3,6 @@
namespace Config;
use App\Libraries\MY_Language;
use App\Libraries\Plugins\PluginManager;
use Locale;
use HTMLPurifier;
use HTMLPurifier_Config;
@@ -62,24 +61,6 @@ class Services extends BaseService
return new MY_Language($locale);
}
public static function pluginManager(bool $getShared = true): PluginManager
{
if ($getShared) {
return static::getSharedInstance('pluginManager');
}
$manager = new PluginManager();
if ($manager->canLoadPlugins()) {
$manager->discoverPlugins();
$manager->registerPluginEvents();
} else {
log_message('debug', 'PluginManager: skipping init, plugin_config table not found.');
}
return $manager;
}
private static HTMLPurifier $htmlPurifier;
public static function htmlPurifier($getShared = true): object

View File

@@ -3,6 +3,7 @@
namespace App\Controllers;
use App\Libraries\Barcode_lib;
use App\Libraries\Mailchimp_lib;
use App\Libraries\Receiving_lib;
use App\Libraries\Sale_lib;
use App\Libraries\Tax_lib;
@@ -252,6 +253,32 @@ class Config extends Secure_Controller
$data['image_allowed_types'] = array_combine($image_allowed_types, $image_allowed_types);
$data['selected_image_allowed_types'] = explode(',', $this->config['image_allowed_types']);
// Integrations Related fields
$data['mailchimp'] = [];
if (check_encryption()) { // TODO: Hungarian notation
if (!isset($this->encrypter)) {
helper('security');
$this->encrypter = Services::encrypter();
}
$data['mailchimp']['api_key'] = (isset($this->config['mailchimp_api_key']) && !empty($this->config['mailchimp_api_key']))
? $this->encrypter->decrypt($this->config['mailchimp_api_key'])
: '';
$data['mailchimp']['list_id'] = (isset($this->config['mailchimp_list_id']) && !empty($this->config['mailchimp_list_id']))
? $this->encrypter->decrypt($this->config['mailchimp_list_id'])
: '';
// Remove any backup of .env created by check_encryption()
remove_backup();
} else {
$data['mailchimp']['api_key'] = '';
$data['mailchimp']['list_id'] = '';
}
$data['mailchimp']['lists'] = $this->_mailchimp();
return view('configs/manage', $data);
}
@@ -289,6 +316,7 @@ class Config extends Secure_Controller
return $this->response->setJSON(['success' => $success, 'message' => $message]);
}
/**
* @return array
*/
@@ -547,6 +575,76 @@ class Config extends Secure_Controller
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
}
/**
* This function fetches all the available lists from Mailchimp for the given API key
*/
private function _mailchimp(string $api_key = ''): array // TODO: Hungarian notation
{
$mailchimp_lib = new Mailchimp_lib(['api_key' => $api_key]);
$result = [];
$lists = $mailchimp_lib->getLists();
if ($lists !== false) {
if (is_array($lists) && !empty($lists['lists']) && is_array($lists['lists'])) {
foreach ($lists['lists'] as $list) {
$result[$list['id']] = $list['name'] . ' [' . $list['stats']['member_count'] . ']';
}
}
}
return $result;
}
/**
* Gets Mailchimp lists when a valid API key is inserted. Used in app/Views/configs/integrations_config.php
*
* @return ResponseInterface
* @noinspection PhpUnused
*/
public function postCheckMailchimpApiKey(): ResponseInterface
{
$lists = $this->_mailchimp($this->request->getPost('mailchimp_api_key'));
$success = count($lists) > 0;
return $this->response->setJSON([
'success' => $success,
'message' => lang('Config.mailchimp_key_' . ($success ? '' : 'un') . 'successfully'),
'mailchimp_lists' => $lists
]);
}
/**
* Saves Mailchimp configuration. Used in app/Views/configs/integrations_config.php
*
* @throws ReflectionException
* @return ResponseInterface
* @noinspection PhpUnused
*/
public function postSaveMailchimp(): ResponseInterface
{
$api_key = '';
$list_id = '';
if (check_encryption()) {
$api_key_unencrypted = $this->request->getPost('mailchimp_api_key');
if (!empty($api_key_unencrypted)) {
$api_key = $this->encrypter->encrypt($api_key_unencrypted);
}
$list_id_unencrypted = $this->request->getPost('mailchimp_list_id');
if (!empty($list_id_unencrypted)) {
$list_id = $this->encrypter->encrypt($list_id_unencrypted);
}
}
$batch_save_data = ['mailchimp_api_key' => $api_key, 'mailchimp_list_id' => $list_id];
$success = $this->appconfig->batch_save($batch_save_data);
return $this->response->setJSON(['success' => $success, 'message' => lang('Config.saved_' . ($success ? '' : 'un') . 'successfully')]);
}
/**
* Gets all stock locations. Used in app/Views/configs/stock_config.php
*
@@ -710,10 +808,14 @@ class Config extends Secure_Controller
$default_tax_1_rate = $this->request->getPost('default_tax_1_rate');
$default_tax_2_rate = $this->request->getPost('default_tax_2_rate');
// Note: parse_tax() is not used here because these inputs use type="number"
// which always submits dot-decimal values regardless of locale. Using parse_tax()
// with a comma-decimal locale (e.g., de_DE) would incorrectly interpret the dot
// as a thousands separator, causing 5.5 to be saved as 5.
$batch_save_data = [
'default_tax_1_rate' => parse_tax(filter_var($default_tax_1_rate, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)),
'default_tax_1_rate' => (float) filter_var($default_tax_1_rate, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION),
'default_tax_1_name' => $this->request->getPost('default_tax_1_name'),
'default_tax_2_rate' => parse_tax(filter_var($default_tax_2_rate, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)),
'default_tax_2_rate' => (float) filter_var($default_tax_2_rate, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION),
'default_tax_2_name' => $this->request->getPost('default_tax_2_name'),
'tax_included' => $this->request->getPost('tax_included') != null,
'use_destination_based_tax' => $this->request->getPost('use_destination_based_tax') != null,
@@ -914,8 +1016,8 @@ class Config extends Secure_Controller
'work_order_enable' => $this->request->getPost('work_order_enable') != null,
'work_order_format' => $this->request->getPost('work_order_format'),
'last_used_work_order_number' => $this->request->getPost('last_used_work_order_number', FILTER_SANITIZE_NUMBER_INT),
'invoice_type' => Sale_lib::isValidInvoiceType($this->request->getPost('invoice_type'))
? $this->request->getPost('invoice_type')
'invoice_type' => Sale_lib::isValidInvoiceType($this->request->getPost('invoice_type'))
? $this->request->getPost('invoice_type')
: 'invoice'
];
@@ -961,8 +1063,8 @@ class Config extends Secure_Controller
return $fieldType === 'first' ? 'name' : '';
}
$allowed = $fieldType === 'first'
? Item::ALLOWED_SUGGESTIONS_COLUMNS
$allowed = $fieldType === 'first'
? Item::ALLOWED_SUGGESTIONS_COLUMNS
: Item::ALLOWED_SUGGESTIONS_COLUMNS_WITH_EMPTY;
$fallback = $fieldType === 'first' ? 'name' : '';

View File

@@ -2,10 +2,11 @@
namespace App\Controllers;
use App\Libraries\Mailchimp_lib;
use App\Models\Customer;
use App\Models\Customer_rewards;
use App\Models\Tax_code;
use CodeIgniter\Events\Events;
use CodeIgniter\HTTP\DownloadResponse;
use CodeIgniter\HTTP\ResponseInterface;
use Config\OSPOS;
@@ -14,6 +15,8 @@ use stdClass;
class Customers extends Persons
{
private string $_list_id;
private Mailchimp_lib $mailchimp_lib;
private Customer_rewards $customer_rewards;
private Customer $customer;
private Tax_code $tax_code;
@@ -22,11 +25,19 @@ class Customers extends Persons
public function __construct()
{
parent::__construct('customers');
$this->mailchimp_lib = new Mailchimp_lib();
$this->customer_rewards = model(Customer_rewards::class);
$this->customer = model(Customer::class);
$this->tax_code = model(Tax_code::class);
$this->config = config(OSPOS::class)->settings;
$encrypter = Services::encrypter();
if (!empty($this->config['mailchimp_list_id'])) {
$this->_list_id = $encrypter->decrypt($this->config['mailchimp_list_id']);
} else {
$this->_list_id = '';
}
}
/**
@@ -41,12 +52,11 @@ class Customers extends Persons
/**
* Gets one row for a customer manage table. This is called using AJAX to update one row.
* @param int $row_id
* @return ResponseInterface
*/
public function getRow(int $row_id): ResponseInterface
{
$person = $this->customer->getInfo($row_id);
$person = $this->customer->get_info($row_id);
// Retrieve the total amount the customer spent so far together with min, max and average values
$stats = $this->customer->get_stats($person->person_id); // TODO: This and the next 11 lines are duplicated in search(). Extract a method.
@@ -131,16 +141,14 @@ class Customers extends Persons
/**
* Loads the customer edit form
* @param int $customerId
* @return string
*/
public function getView(int $customerId = NEW_ENTRY): string
public function getView(int $customer_id = NEW_ENTRY): string
{
if ($customerId == null) {
$customerId = NEW_ENTRY;
}
// Set default values
if ($customer_id == null) $customer_id = NEW_ENTRY;
$info = $this->customer->getInfo($customerId);
$info = $this->customer->get_info($customer_id);
foreach (get_object_vars($info) as $property => $value) {
$info->$property = $value;
}
@@ -151,7 +159,7 @@ class Customers extends Persons
$data['person_info']->employee_id = $this->employee->get_logged_in_employee_info()->person_id;
}
$employee_info = $this->employee->getInfo($info->employee_id);
$employee_info = $this->employee->get_info($info->employee_id);
$data['employee'] = $employee_info->first_name . ' ' . $employee_info->last_name;
$tax_code_info = $this->tax_code->get_info($info->sales_tax_code_id);
@@ -172,7 +180,7 @@ class Customers extends Persons
$data['use_destination_based_tax'] = $this->config['use_destination_based_tax'];
// Retrieve the total amount the customer spent so far together with min, max and average values
$stats = $this->customer->get_stats($customerId);
$stats = $this->customer->get_stats($customer_id);
if (!empty($stats)) {
foreach (get_object_vars($stats) as $property => $value) {
$info->$property = $value;
@@ -180,29 +188,69 @@ class Customers extends Persons
$data['stats'] = $stats;
}
Events::trigger('customer_loaded', $customerId);
// Retrieve the info from Mailchimp only if there is an email address assigned
if (!empty($info->email)) {
// Collect Mailchimp customer info
if (($mailchimp_info = $this->mailchimp_lib->getMemberInfo($this->_list_id, $info->email)) !== false) {
$data['mailchimp_info'] = $mailchimp_info;
// Collect customer Mailchimp emails activities (stats)
if (($activities = $this->mailchimp_lib->getMemberActivity($this->_list_id, $info->email)) !== false) {
if (array_key_exists('activity', $activities)) {
$open = 0;
$unopen = 0;
$click = 0;
$total = 0;
$lastopen = '';
foreach ($activities['activity'] as $activity) {
if ($activity['action'] == 'sent') {
++$unopen;
} elseif ($activity['action'] == 'open') {
if (empty($lastopen)) {
$lastopen = substr($activity['timestamp'], 0, 10);
}
++$open;
} elseif ($activity['action'] == 'click') {
if (empty($lastopen)) {
$lastopen = substr($activity['timestamp'], 0, 10);
}
++$click;
}
++$total;
}
$data['mailchimp_activity']['total'] = $total;
$data['mailchimp_activity']['open'] = $open;
$data['mailchimp_activity']['unopen'] = $unopen;
$data['mailchimp_activity']['click'] = $click;
$data['mailchimp_activity']['lastopen'] = $lastopen;
}
}
}
}
return view("customers/form", $data);
}
/**
* Inserts/updates a customer
* @param int $customerId
* @return ResponseInterface
*/
public function postSave(int $customerId = NEW_ENTRY): ResponseInterface
public function postSave(int $customer_id = NEW_ENTRY): ResponseInterface
{
$firstName = $this->request->getPost('first_name');
$lastName = $this->request->getPost('last_name');
$first_name = $this->request->getPost('first_name');
$last_name = $this->request->getPost('last_name');
$email = strtolower($this->request->getPost('email', FILTER_SANITIZE_EMAIL));
// Format first and last name properly
$firstName = $this->nameize($firstName);
$lastName = $this->nameize($lastName);
$first_name = $this->nameize($first_name);
$last_name = $this->nameize($last_name);
$personData = [
'first_name' => $firstName,
'last_name' => $lastName,
$person_data = [
'first_name' => $first_name,
'last_name' => $last_name,
'gender' => $this->request->getPost('gender', FILTER_SANITIZE_NUMBER_INT),
'email' => $email,
'phone_number' => $this->request->getPost('phone_number'),
@@ -215,9 +263,9 @@ class Customers extends Persons
'comments' => $this->request->getPost('comments')
];
$dateFormatter = date_create_from_format($this->config['dateformat'] . ' ' . $this->config['timeformat'], $this->request->getPost('date'));
$date_formatter = date_create_from_format($this->config['dateformat'] . ' ' . $this->config['timeformat'], $this->request->getPost('date'));
$customerData = [
$customer_data = [
'consent' => $this->request->getPost('consent') != null,
'account_number' => $this->request->getPost('account_number') == '' ? null : $this->request->getPost('account_number'),
'tax_id' => $this->request->getPost('tax_id'),
@@ -226,32 +274,41 @@ class Customers extends Persons
'discount_type' => $this->request->getPost('discount_type') == null ? PERCENT : $this->request->getPost('discount_type', FILTER_SANITIZE_NUMBER_INT),
'package_id' => $this->request->getPost('package_id') == '' ? null : $this->request->getPost('package_id'),
'taxable' => $this->request->getPost('taxable') != null,
'date' => $dateFormatter->format('Y-m-d H:i:s'),
'date' => $date_formatter->format('Y-m-d H:i:s'),
'employee_id' => $this->request->getPost('employee_id', FILTER_SANITIZE_NUMBER_INT),
'sales_tax_code_id' => $this->request->getPost('sales_tax_code_id') == '' ? null : $this->request->getPost('sales_tax_code_id', FILTER_SANITIZE_NUMBER_INT)
];
if ($this->customer->saveCustomer($personData, $customerData, $customerId)) {
Events::trigger('customer_saved', [$customerData['person_id']]);
if ($this->customer->save_customer($person_data, $customer_data, $customer_id)) {
// Save customer to Mailchimp selected list // TODO: addOrUpdateMember should be refactored. Potentially pass an array or object instead of 6 parameters.
$mailchimp_status = $this->request->getPost('mailchimp_status');
$this->mailchimp_lib->addOrUpdateMember(
$this->_list_id,
$email,
$first_name,
$last_name,
$mailchimp_status == null ? "" : $mailchimp_status,
['vip' => $this->request->getPost('mailchimp_vip') != null]
);
// New customer
if ($customerId == NEW_ENTRY) {
if ($customer_id == NEW_ENTRY) {
return $this->response->setJSON([
'success' => true,
'message' => lang('Customers.successful_adding') . " $firstName $lastName",
'id' => $customerData['person_id']
'message' => lang('Customers.successful_adding') . ' ' . $first_name . ' ' . $last_name,
'id' => $customer_data['person_id']
]);
} else { // Existing customer
return $this->response->setJSON([
'success' => true,
'message' => lang('Customers.successful_updating') . " $firstName $lastName",
'id' => $customerId
'message' => lang('Customers.successful_updating') . ' ' . $first_name . ' ' . $last_name,
'id' => $customer_id
]);
}
} else { // Failure
return $this->response->setJSON([
'success' => false,
'message' => lang('Customers.error_adding_updating') . " $firstName $lastName",
'message' => lang('Customers.error_adding_updating') . ' ' . $first_name . ' ' . $last_name,
'id' => NEW_ENTRY
]);
}
@@ -287,23 +344,26 @@ class Customers extends Persons
}
/**
* This deletes customers from the customer's table
* This deletes customers from the customers table
* @return ResponseInterface
*/
public function postDelete(): ResponseInterface
{
$customersToDelete = $this->request->getPost('ids');
$customers = $this->customer->get_multiple_info($customersToDelete);
$customers_to_delete = $this->request->getPost('ids');
$customers_info = $this->customer->get_multiple_info($customers_to_delete);
$count = 0;
foreach ($customers->getResult() as $customer) {
if ($this->customer->delete($customer->person_id)) {
Events::trigger('customer_deleted', (int)$customer->person_id, (string)$customer->email);
foreach ($customers_info->getResult() as $info) {
if ($this->customer->delete($info->person_id)) {
// remove customer from Mailchimp selected list
$this->mailchimp_lib->removeMember($this->_list_id, $info->email);
$count++;
}
}
if ($count === count($customersToDelete)) {
if ($count == count($customers_to_delete)) {
return $this->response->setJSON([
'success' => true,
'message' => lang('Customers.successful_deleted') . ' ' . $count . ' ' . lang('Customers.one_or_multiple')
@@ -351,17 +411,16 @@ class Customers extends Persons
if (($handle = fopen($_FILES['file_path']['tmp_name'], 'r')) !== false) {
// Skip the first row as it's the table description
fgetcsv($handle);
$rowNumber = 1;
$i = 1;
$failCodes = [];
$customerIds = [];
while (($data = fgetcsv($handle)) !== false) {
$consent = $data[3] == '' ? 0 : 1;
if (sizeof($data) >= 16 && $consent) {
$email = strtolower($data[4]);
$personData = [
$person_data = [
'first_name' => $data[0],
'last_name' => $data[1],
'gender' => $data[2],
@@ -376,7 +435,7 @@ class Customers extends Persons
'comments' => $data[12]
];
$customerData = [
$customer_data = [
'consent' => $consent,
'company_name' => $data[13],
'discount' => $data[15],
@@ -391,7 +450,7 @@ class Customers extends Persons
$invalidated = $this->customer->check_email_exists($email);
if ($account_number != '') {
$customerData['account_number'] = $account_number;
$customer_data['account_number'] = $account_number;
$invalidated &= $this->customer->check_account_number_exists($account_number);
}
} else {
@@ -399,15 +458,16 @@ class Customers extends Persons
}
if ($invalidated) {
$failCodes[] = $rowNumber;
log_message('error', "Row $rowNumber was not imported: Either email or account number already exist or data was invalid.");
} elseif ($this->customer->saveCustomer($personData, $customerData)) {
$customerIds[] = $customerData['person_id'];
$failCodes[] = $i;
log_message('error', "Row $i was not imported: Either email or account number already exist or data was invalid.");
} elseif ($this->customer->save_customer($person_data, $customer_data)) {
// Save customer to Mailchimp selected list
$this->mailchimp_lib->addOrUpdateMember($this->_list_id, $person_data['email'], $person_data['first_name'], '', $person_data['last_name']);
} else {
$failCodes[] = $rowNumber;
$failCodes[] = $i;
}
++$rowNumber;
++$i;
}
if (count($failCodes) > 0) {
@@ -415,8 +475,6 @@ class Customers extends Persons
return $this->response->setJSON(['success' => false, 'message' => $message]);
} else {
Events::trigger('customer_saved', $customerIds);
return $this->response->setJSON(['success' => true, 'message' => lang('Customers.csv_import_success')]);
}
} else {

View File

@@ -75,7 +75,7 @@ class Employees extends Persons
*/
public function getView(int $employee_id = NEW_ENTRY): string
{
$person_info = $this->employee->getInfo($employee_id);
$person_info = $this->employee->get_info($employee_id);
$current_user = $this->employee->get_logged_in_employee_info();
if ($employee_id != NEW_ENTRY && !$this->employee->canModifyEmployee($person_info->person_id, $current_user->person_id)) {
@@ -119,7 +119,7 @@ class Employees extends Persons
$current_user = $this->employee->get_logged_in_employee_info();
if ($employee_id != NEW_ENTRY) {
$target_employee = $this->employee->getInfo($employee_id);
$target_employee = $this->employee->get_info($employee_id);
if (!$this->employee->canModifyEmployee($target_employee->person_id, $current_user->person_id)) {
return $this->response->setJSON([
'success' => false,

View File

@@ -106,7 +106,7 @@ class Expenses extends Secure_Controller
}
} else {
$stored_employee_id = $expense_id == NEW_ENTRY ? $current_employee_id : $data['expenses_info']->employee_id;
$stored_employee = $this->employee->getInfo($stored_employee_id);
$stored_employee = $this->employee->get_info($stored_employee_id);
$data['employees'][$stored_employee_id] = $stored_employee->first_name . ' ' . $stored_employee->last_name;
}
$data['can_assign_employee'] = $can_assign_employee;

View File

@@ -51,7 +51,7 @@ class Home extends Secure_Controller
return $this->response->setStatusCode(403)->setBody(lang('Employees.unauthorized_modify'));
}
$person_info = $this->employee->getInfo($employeeId);
$person_info = $this->employee->get_info($employeeId);
foreach (get_object_vars($person_info) as $property => $value) {
$person_info->$property = $value;
}

View File

@@ -13,7 +13,6 @@ use App\Models\Item_taxes;
use App\Models\Stock_location;
use App\Models\Supplier;
use App\Models\Tax_category;
use CodeIgniter\Events\Events;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Images\Handlers\BaseHandler;
use CodeIgniter\HTTP\DownloadResponse;
@@ -276,7 +275,7 @@ class Items extends Secure_Controller
*/
public function getRow(string $item_ids): ResponseInterface // TODO: An array would be better for parameter.
{
$item_infos = $this->item->getMultipleInfo(explode(':', $item_ids), $this->item_lib->get_item_location());
$item_infos = $this->item->get_multiple_info(explode(':', $item_ids), $this->item_lib->get_item_location());
$result = [];
@@ -492,7 +491,7 @@ class Items extends Secure_Controller
public function getGenerateBarcodes(string $item_ids): string // TODO: Passing these through as a string instead of an array limits the contents of the item_ids. Perhaps a better approach would to serialize as JSON in an array and pass through post variables?
{
$item_ids = explode(':', $item_ids);
$result = $this->item->getMultipleInfo($item_ids, $this->item_lib->get_item_location())->getResultArray();
$result = $this->item->get_multiple_info($item_ids, $this->item_lib->get_item_location())->getResultArray();
$data['barcode_config'] = $this->barcode_lib->get_barcode_config();
foreach ($result as &$item) {
@@ -612,149 +611,148 @@ class Items extends Secure_Controller
}
/**
* @param int $itemId
* @param int $item_id
* @return ResponseInterface
* @throws ReflectionException
*/
public function postSave(int $itemId = NEW_ENTRY): ResponseInterface
public function postSave(int $item_id = NEW_ENTRY): ResponseInterface
{
$uploadData = $this->upload_image();
$uploadSuccess = empty($uploadData['error']);
$upload_data = $this->upload_image();
$upload_success = empty($upload_data['error']);
$rawReceivingQuantity = $this->request->getPost('receiving_quantity');
$raw_receiving_quantity = $this->request->getPost('receiving_quantity');
$receivingQuantity = parse_quantity($rawReceivingQuantity);
$itemType = $this->request->getPost('item_type') === null ? ITEM : intval($this->request->getPost('item_type'));
$receiving_quantity = parse_quantity($raw_receiving_quantity);
$item_type = $this->request->getPost('item_type') === null ? ITEM : intval($this->request->getPost('item_type'));
if ($receivingQuantity === 0.0 && $itemType !== ITEM_TEMP) {
$receivingQuantity = 1;
if ($receiving_quantity === 0.0 && $item_type !== ITEM_TEMP) {
$receiving_quantity = 1;
}
$defaultPackName = lang('Items.default_pack_name');
$default_pack_name = lang('Items.default_pack_name');
$costPrice = parse_decimals($this->request->getPost('cost_price'));
$unitPrice = parse_decimals($this->request->getPost('unit_price'));
$reorderLevel = parse_quantity($this->request->getPost('reorder_level'));
$quantityPerPack = parse_quantity($this->request->getPost('qty_per_pack') ?? '');
$cost_price = parse_decimals($this->request->getPost('cost_price'));
$unit_price = parse_decimals($this->request->getPost('unit_price'));
$reorder_level = parse_quantity($this->request->getPost('reorder_level'));
$qty_per_pack = parse_quantity($this->request->getPost('qty_per_pack') ?? '');
// Save item data
$itemData = [
$item_data = [
'name' => $this->request->getPost('name'),
'description' => $this->request->getPost('description', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
'category' => $this->request->getPost('category'),
'item_type' => $itemType,
'item_type' => $item_type,
'stock_type' => $this->request->getPost('stock_type') === null ? HAS_STOCK : intval($this->request->getPost('stock_type')),
'supplier_id' => empty($this->request->getPost('supplier_id')) ? null : intval($this->request->getPost('supplier_id')),
'item_number' => empty($this->request->getPost('item_number')) ? null : $this->request->getPost('item_number'),
'cost_price' => $costPrice,
'unit_price' => $unitPrice,
'reorder_level' => $reorderLevel,
'receiving_quantity' => $receivingQuantity,
'cost_price' => $cost_price,
'unit_price' => $unit_price,
'reorder_level' => $reorder_level,
'receiving_quantity' => $receiving_quantity,
'allow_alt_description' => $this->request->getPost('allow_alt_description') != null,
'is_serialized' => $this->request->getPost('is_serialized') != null,
'qty_per_pack' => $this->request->getPost('qty_per_pack') == null ? 1 : parse_quantity($quantityPerPack),
'pack_name' => $this->request->getPost('pack_name') == null ? $defaultPackName : $this->request->getPost('pack_name'),
'low_sell_item_id' => $this->request->getPost('low_sell_item_id') === null ? $itemId : intval($this->request->getPost('low_sell_item_id')),
'qty_per_pack' => $this->request->getPost('qty_per_pack') == null ? 1 : parse_quantity($qty_per_pack),
'pack_name' => $this->request->getPost('pack_name') == null ? $default_pack_name : $this->request->getPost('pack_name'),
'low_sell_item_id' => $this->request->getPost('low_sell_item_id') === null ? $item_id : intval($this->request->getPost('low_sell_item_id')),
'deleted' => $this->request->getPost('is_deleted') != null,
'hsn_code' => $this->request->getPost('hsn_code') === null ? '' : $this->request->getPost('hsn_code')
];
if ($itemData['item_type'] == ITEM_TEMP) {
$itemData['stock_type'] = HAS_NO_STOCK;
$itemData['receiving_quantity'] = 0;
$itemData['reorder_level'] = 0;
if ($item_data['item_type'] == ITEM_TEMP) {
$item_data['stock_type'] = HAS_NO_STOCK;
$item_data['receiving_quantity'] = 0;
$item_data['reorder_level'] = 0;
}
$taxCategoryId = $this->request->getPost('tax_category_id');
$tax_category_id = $this->request->getPost('tax_category_id');
if (!isset($taxCategoryId)) {
$itemData['tax_category_id'] = null;
if (!isset($tax_category_id)) {
$item_data['tax_category_id'] = null;
} else {
$itemData['tax_category_id'] = empty($this->request->getPost('tax_category_id')) ? null : intval($this->request->getPost('tax_category_id'));
$item_data['tax_category_id'] = empty($this->request->getPost('tax_category_id')) ? null : intval($this->request->getPost('tax_category_id'));
}
if (!empty($uploadData['orig_name']) && $uploadData['raw_name']) {
$itemData['pic_filename'] = $uploadData['raw_name'] . '.' . $uploadData['file_ext'];
if (!empty($upload_data['orig_name']) && $upload_data['raw_name']) {
$item_data['pic_filename'] = $upload_data['raw_name'] . '.' . $upload_data['file_ext'];
}
$employeeId = $this->employee->get_logged_in_employee_info()->person_id;
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
if ($this->item->save_value($itemData, $itemId)) {
if ($this->item->save_value($item_data, $item_id)) {
$success = true;
$newItem = false;
$new_item = false;
if ($itemId === NEW_ENTRY) {
$itemId = $itemData['item_id'];
$newItem = true;
if ($item_id === NEW_ENTRY) {
$item_id = $item_data['item_id'];
$new_item = true;
}
$useDestinationBasedTax = (bool)$this->config['use_destination_based_tax'];
$use_destination_based_tax = (bool)$this->config['use_destination_based_tax'];
if (!$useDestinationBasedTax) {
$itemsTaxesData = [];
$taxNames = $this->request->getPost('tax_names');
$taxPercents = $this->request->getPost('tax_percents');
if (!$use_destination_based_tax) {
$items_taxes_data = [];
$tax_names = $this->request->getPost('tax_names');
$tax_percents = $this->request->getPost('tax_percents');
$taxNameIndex = 0;
$tax_name_index = 0;
foreach ($taxPercents as $taxPercent) {
$taxpercentage = parse_tax($taxPercent);
foreach ($tax_percents as $tax_percent) {
$tax_percentage = parse_tax($tax_percent);
if (is_numeric($taxpercentage)) {
$itemsTaxesData[] = ['name' => $taxNames[$taxNameIndex], 'percent' => $taxpercentage];
if (is_numeric($tax_percentage)) {
$items_taxes_data[] = ['name' => $tax_names[$tax_name_index], 'percent' => $tax_percentage];
}
$taxNameIndex++;
$tax_name_index++;
}
$success &= $this->item_taxes->save_value($itemsTaxesData, $itemId);
$success &= $this->item_taxes->save_value($items_taxes_data, $item_id);
}
// Save item quantity
$stockLocations = $this->stock_location->get_undeleted_all()->getResultArray();
foreach ($stockLocations as $location) {
$updatedQuantity = parse_quantity($this->request->getPost('quantity_' . $location['location_id']));
$stock_locations = $this->stock_location->get_undeleted_all()->getResultArray();
foreach ($stock_locations as $location) {
$updated_quantity = parse_quantity($this->request->getPost('quantity_' . $location['location_id']));
if ($itemData['item_type'] == ITEM_TEMP) {
$updatedQuantity = 0;
if ($item_data['item_type'] == ITEM_TEMP) {
$updated_quantity = 0;
}
$locationDetail = [
'item_id' => $itemId,
$location_detail = [
'item_id' => $item_id,
'location_id' => $location['location_id'],
'quantity' => $updatedQuantity
'quantity' => $updated_quantity
];
$itemQuantity = $this->item_quantity->get_item_quantity($itemId, $location['location_id']);
$item_quantity = $this->item_quantity->get_item_quantity($item_id, $location['location_id']);
if ($itemQuantity->quantity != $updatedQuantity || $newItem) {
$success = $success && $this->item_quantity->save_value($locationDetail, $itemId, $location['location_id']);
if ($item_quantity->quantity != $updated_quantity || $new_item) {
$success = $success && $this->item_quantity->save_value($location_detail, $item_id, $location['location_id']);
$inv_data = [
'trans_date' => date('Y-m-d H:i:s'),
'trans_items' => $itemId,
'trans_user' => $employeeId,
'trans_items' => $item_id,
'trans_user' => $employee_id,
'trans_location' => $location['location_id'],
'trans_comment' => lang('Items.manually_editing_of_quantity'),
'trans_inventory' => $updatedQuantity - $itemQuantity->quantity
'trans_inventory' => $updated_quantity - $item_quantity->quantity
];
$success = $success && $this->inventory->insert($inv_data, false);
}
}
$success = $success && $this->saveItemAttributes($itemId);
$success = $success && $this->saveItemAttributes($item_id);
if ($success && $uploadSuccess) {
Events::trigger('item_saved', [$itemId]);
if ($success && $upload_success) {
$message = lang('Items.successful_' . ($new_item ? 'adding' : 'updating')) . ' ' . $item_data['name'];
$message = lang('Items.successful_' . ($newItem ? 'adding' : 'updating')) . ' ' . $itemData['name'];
return $this->response->setJSON(['success' => true, 'message' => $message, 'id' => $itemId]);
return $this->response->setJSON(['success' => true, 'message' => $message, 'id' => $item_id]);
} else {
$message = $uploadSuccess ? lang('Items.error_adding_updating') . ' ' . $itemData['name'] : strip_tags($uploadData['error']);
$message = $upload_success ? lang('Items.error_adding_updating') . ' ' . $item_data['name'] : strip_tags($upload_data['error']);
return $this->response->setJSON(['success' => false, 'message' => $message, 'id' => $itemId]);
return $this->response->setJSON(['success' => false, 'message' => $message, 'id' => $item_id]);
}
} else {
$message = lang('Items.error_adding_updating') . ' ' . $itemData['name'];
$message = lang('Items.error_adding_updating') . ' ' . $item_data['name'];
return $this->response->setJSON(['success' => false, 'message' => $message, 'id' => NEW_ENTRY]);
}
@@ -974,7 +972,7 @@ class Items extends Secure_Controller
}
/**
* Imports items from a CSV-formatted file.
* Imports items from a CSV formatted file.
* @return ResponseInterface
* @noinspection PhpUnused
*/
@@ -999,7 +997,7 @@ class Items extends Secure_Controller
$attributeData = [];
foreach ($attributeDefinitionNames as $definitionName) {
$attributeData[$definitionName] = $this->attribute->getDefinitionByName($definitionName)[0];
$attributeData[$definitionName] = $this->attribute->get_definition_by_name($definitionName)[0];
if ($attributeData[$definitionName]['definition_type'] === DROPDOWN) {
$attributeData[$definitionName]['dropdown_values'] = $this->attribute->get_definition_values($attributeData[$definitionName]['definition_id']);
@@ -1008,7 +1006,6 @@ class Items extends Secure_Controller
$db = db_connect();
$db->transBegin(); // TODO: This section needs to be reworked so that the data array is being created then passed to the Item model because $db doesn't exist in the controller without being instantiated, but database operations should be restricted to the model
$itemIds = [];
foreach ($csvRows as $key => $row) {
$isFailedRow = false;
$itemId = (int)$row['Id'];
@@ -1078,8 +1075,6 @@ class Items extends Secure_Controller
if ($isUpdate) {
$itemData = array_merge($itemData, get_object_vars($this->item->get_info_by_id_or_number($itemId)));
}
$itemIds[] = $itemData['item_id'];
} else {
$failedRow = $key + 2;
$failCodes[] = $failedRow;
@@ -1099,8 +1094,6 @@ class Items extends Secure_Controller
$db->transCommit();
$this->attribute->deleteOrphanedValues();
Events::trigger('item_saved', [$itemIds]);
return $this->response->setJSON(['success' => true, 'message' => lang('Items.csv_import_success')]);
}
} else {

View File

@@ -33,7 +33,7 @@ class Messages extends Secure_Controller
public function getView(int $person_id = NEW_ENTRY): string
{
$person = model(Person::class);
$info = $person->getInfo($person_id);
$info = $person->get_info($person_id);
foreach (get_object_vars($info) as $property => $value) {
$info->$property = $value;

View File

@@ -49,7 +49,7 @@ abstract class Persons extends Secure_Controller
*/
public function getRow(int $row_id): ResponseInterface
{
$data_row = get_person_data_row($this->person->getInfo($row_id));
$data_row = get_person_data_row($this->person->get_info($row_id));
return $this->response->setJSON($data_row);
}

View File

@@ -1,169 +0,0 @@
<?php
namespace App\Controllers;
use App\Libraries\Plugins\PluginManager;
use CodeIgniter\HTTP\ResponseInterface;
class Plugins extends Secure_Controller
{
private PluginManager $pluginManager;
public function __construct()
{
parent::__construct('plugins');
$this->pluginManager = service('pluginManager');
}
public function getIndex(): string
{
$data['table_headers'] = get_plugin_manage_table_headers();
return view('plugins/manage', $data);
}
public function getSearch(): ResponseInterface
{
$search = strtolower($this->request->getGet('search') ?? '');
$limit = (int)($this->request->getGet('limit') ?? 0);
$offset = (int)($this->request->getGet('offset') ?? 0);
$sort = $this->sanitizeSortColumn(plugin_headers(), $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'name');
$order = strtolower($this->request->getGet('order', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?? 'asc');
$pluginData = $this->buildPluginDataArray();
if ($search !== '') {
$pluginData = array_values(array_filter($pluginData, static function (array $p) use ($search): bool {
return str_contains(strtolower($p['name']), $search)
|| str_contains(strtolower($p['description']), $search)
|| str_contains(strtolower($p['id']), $search);
}));
}
$total = count($pluginData);
usort($pluginData, static function (array $a, array $b) use ($sort, $order): int {
$valA = strtolower($a[$sort] ?? $a['name']);
$valB = strtolower($b[$sort] ?? $b['name']);
return $order === 'asc' ? strcmp($valA, $valB) : strcmp($valB, $valA);
});
$pluginData = $limit > 0 ? array_slice($pluginData, $offset, $limit) : array_slice($pluginData, $offset);
return $this->response->setJSON(['total' => $total, 'rows' => array_map('get_plugin_data_row', $pluginData)]);
}
public function getRow(string $pluginId): ResponseInterface
{
$plugin = $this->pluginManager->getPlugin($pluginId);
if (!$plugin) {
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.not_found')]);
}
$enabled = $this->pluginManager->getEnabledPlugins();
$pluginData = [
'id' => $plugin->getPluginId(),
'name' => $plugin->getPluginName(),
'description' => $plugin->getPluginDescription(),
'version' => $plugin->getVersion(),
'enabled' => isset($enabled[$pluginId]),
'has_config' => $plugin->getConfigView() !== null,
];
return $this->response->setJSON(get_plugin_data_row($pluginData));
}
private function buildPluginDataArray(): array
{
$plugins = $this->pluginManager->getAllPlugins();
$enabled = $this->pluginManager->getEnabledPlugins();
$result = [];
foreach ($plugins as $pluginId => $plugin) {
$result[] = [
'id' => $plugin->getPluginId(),
'name' => $plugin->getPluginName(),
'description' => $plugin->getPluginDescription(),
'version' => $plugin->getVersion(),
'enabled' => isset($enabled[$pluginId]),
'has_config' => $plugin->getConfigView() !== null,
];
}
return $result;
}
public function postEnable(string $pluginId): ResponseInterface
{
if ($this->pluginManager->enablePlugin($pluginId)) {
return $this->response->setJSON(['success' => true, 'message' => lang('Plugins.enabled')]);
}
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.enable_failed')]);
}
public function postDisable(string $pluginId): ResponseInterface
{
if ($this->pluginManager->disablePlugin($pluginId)) {
return $this->response->setJSON(['success' => true, 'message' => lang('Plugins.disabled')]);
}
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.disable_failed')]);
}
public function postUninstall(string $pluginId): ResponseInterface
{
if ($this->pluginManager->uninstallPlugin($pluginId)) {
return $this->response->setJSON(['success' => true, 'message' => lang('Plugins.uninstalled')]);
}
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.uninstall_failed')]);
}
public function getConfig(string $pluginId): ResponseInterface
{
$plugin = $this->pluginManager->getPlugin($pluginId);
if (!$plugin) {
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.not_found')]);
}
$configView = $plugin->getConfigView();
if (!$configView) {
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.no_config')]);
}
$settings = $plugin->getSettings();
$data = array_merge(['settings' => $settings, 'plugin' => $plugin], $plugin->getConfigViewData());
// Plugin views may live outside app/Views/ (absolute path from plugin's __DIR__)
if (is_file($configView . '.php')) {
$renderer = \Config\Services::renderer(dirname($configView) . DIRECTORY_SEPARATOR, null, false);
echo $renderer->setData($data)->render(basename($configView));
} else {
echo view($configView, $data);
}
return $this->response;
}
/**
* Save plugin settings by calling the plugin's saveSettings method.
*
* @param string $pluginId The plugin ID for the current plugin
* @return ResponseInterface The JSON response
* @noinspection PhpUnused Called via AJAX
*/
public function postSaveConfig(string $pluginId): ResponseInterface
{
$plugin = $this->pluginManager->getPlugin($pluginId);
if (!$plugin) {
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.not_found')]);
}
$settings = $this->request->getPost();
unset($settings['_method'], $settings[csrf_token()]);
if ($plugin->saveSettings($settings)) {
return $this->response->setJSON(['success' => true, 'message' => lang('Plugins.settings_saved')]);
}
return $this->response->setJSON(['success' => false, 'message' => lang('Plugins.settings_save_failed')]);
}
}

View File

@@ -11,7 +11,6 @@ use App\Models\Item_kit;
use App\Models\Receiving;
use App\Models\Stock_location;
use App\Models\Supplier;
use CodeIgniter\Events\Events;
use CodeIgniter\HTTP\ResponseInterface;
use Config\OSPOS;
use Config\Services;
@@ -254,7 +253,7 @@ class Receivings extends Secure_Controller
}
} else {
$stored_employee_id = $receiving_info['employee_id'];
$stored_employee = $this->employee->getInfo($stored_employee_id);
$stored_employee = $this->employee->get_info($stored_employee_id);
$data['employees'][$stored_employee_id] = $stored_employee->first_name . ' ' . $stored_employee->last_name;
}
@@ -343,12 +342,12 @@ class Receivings extends Secure_Controller
}
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$employee_info = $this->employee->getInfo($employee_id);
$employee_info = $this->employee->get_info($employee_id);
$data['employee'] = $employee_info->first_name . ' ' . $employee_info->last_name;
$supplier_id = $this->receiving_lib->get_supplier();
if ($supplier_id != -1) {
$supplier_info = $this->supplier->getInfo($supplier_id);
$supplier_info = $this->supplier->get_info($supplier_id);
$data['supplier'] = $supplier_info->company_name; // TODO: duplicated code
$data['first_name'] = $supplier_info->first_name;
$data['last_name'] = $supplier_info->last_name;
@@ -368,7 +367,6 @@ class Receivings extends Secure_Controller
$data['error_message'] = lang('Receivings.transaction_failed');
} else {
$data['barcode'] = $this->barcode_lib->generate_receipt_barcode($data['receiving_id']);
Events::trigger('receiving_complete', (int) substr($data['receiving_id'], 5), $data['mode']);
}
$data['print_after_sale'] = $this->receiving_lib->is_print_after_sale();
@@ -424,12 +422,12 @@ class Receivings extends Secure_Controller
$data['reference'] = $this->receiving_lib->get_reference();
$data['receiving_id'] = 'RECV ' . $receiving_id;
$data['barcode'] = $this->barcode_lib->generate_receipt_barcode($data['receiving_id']);
$employee_info = $this->employee->getInfo($receiving_info['employee_id']);
$employee_info = $this->employee->get_info($receiving_info['employee_id']);
$data['employee'] = $employee_info->first_name . ' ' . $employee_info->last_name;
$supplier_id = $this->receiving_lib->get_supplier(); // TODO: Duplicated code
if ($supplier_id != -1) {
$supplier_info = $this->supplier->getInfo($supplier_id);
$supplier_info = $this->supplier->get_info($supplier_id);
$data['supplier'] = $supplier_info->company_name;
$data['first_name'] = $supplier_info->first_name;
$data['last_name'] = $supplier_info->last_name;
@@ -477,7 +475,7 @@ class Receivings extends Secure_Controller
$supplier_id = $this->receiving_lib->get_supplier();
if ($supplier_id != -1) { // TODO: Duplicated Code... replace -1 with a constant
$supplier_info = $this->supplier->getInfo($supplier_id);
$supplier_info = $this->supplier->get_info($supplier_id);
$data['supplier'] = $supplier_info->company_name;
$data['first_name'] = $supplier_info->first_name;
$data['last_name'] = $supplier_info->last_name;

View File

@@ -1343,7 +1343,7 @@ class Reports extends Secure_Controller
}
}
$customer_info = $this->customer->getInfo($customer_id);
$customer_info = $this->customer->get_info($customer_id);
$customer_name = !empty($customer_info->company_name) // TODO: This variable is not used anywhere in the code. Should it be or can it be deleted?
? "[ $customer_info->company_name ]"
: $customer_info->company_name;
@@ -1470,7 +1470,7 @@ class Reports extends Secure_Controller
}
}
$employee_info = $this->employee->getInfo($employee_id);
$employee_info = $this->employee->get_info($employee_id);
// TODO: Duplicated Code
$data = [
'title' => $employee_info->first_name . ' ' . $employee_info->last_name . ' ' . lang('Reports.report'),
@@ -1736,7 +1736,7 @@ class Reports extends Secure_Controller
];
}
$supplier_info = $this->supplier->getInfo((int) $supplier_id);
$supplier_info = $this->supplier->get_info((int) $supplier_id);
$data = [
'title' => $supplier_info->company_name . ' (' . $supplier_info->first_name . ' ' . $supplier_info->last_name . ') ' . lang('Reports.report'),
'subtitle' => $this->_get_subtitle_report(['start_date' => $start_date, 'end_date' => $end_date]),

View File

@@ -20,7 +20,6 @@ use App\Models\Stock_location;
use App\Models\Tokens\Token_invoice_count;
use App\Models\Tokens\Token_customer;
use App\Models\Tokens\Token_invoice_sequence;
use CodeIgniter\Events\Events;
use CodeIgniter\HTTP\ResponseInterface;
use Config\Services;
use Config\OSPOS;
@@ -162,7 +161,7 @@ class Sales extends Secure_Controller
'only_bank_transfer'=> false,
'only_wallet' => false,
'only_invoices' => $this->config['invoice_enable'] && $this->request->getGet('only_invoices', FILTER_SANITIZE_NUMBER_INT),
'is_valid_receipt' => $this->sale->isValidReceipt($search)
'is_valid_receipt' => $this->sale->is_valid_receipt($search)
];
// Check if any filter is set in the multiselect dropdown
@@ -199,7 +198,7 @@ class Sales extends Secure_Controller
? $this->request->getGet('term')
: null;
if ($this->sale_lib->get_mode() == 'return' && $this->sale->isValidReceipt($receipt)) {
if ($this->sale_lib->get_mode() == 'return' && $this->sale->is_valid_receipt($receipt)) {
// If a valid receipt or invoice was found the search term will be replaced with a receipt number (POS #)
$suggestions[] = $receipt;
}
@@ -234,8 +233,8 @@ class Sales extends Secure_Controller
$customer_id = (int)$this->request->getPost('customer', FILTER_SANITIZE_NUMBER_INT);
if ($this->customer->exists($customer_id)) {
$this->sale_lib->set_customer($customer_id);
$discount = $this->customer->getInfo($customer_id)->discount;
$discount_type = $this->customer->getInfo($customer_id)->discount_type;
$discount = $this->customer->get_info($customer_id)->discount;
$discount_type = $this->customer->get_info($customer_id)->discount_type;
// Apply customer default discount to items that have 0 discount
if ($discount != '') {
@@ -438,9 +437,9 @@ class Sales extends Secure_Controller
}
} elseif ($payment_type === lang('Sales.rewards')) {
$customer_id = $this->sale_lib->get_customer();
$package_id = $this->customer->getInfo($customer_id)->package_id;
$package_id = $this->customer->get_info($customer_id)->package_id;
if (!empty($package_id)) {
$points = $this->customer->getInfo($customer_id)->points;
$points = $this->customer->get_info($customer_id)->points;
$points = ($points == null ? 0 : $points);
$payments = $this->sale_lib->get_payments();
@@ -512,8 +511,8 @@ class Sales extends Secure_Controller
$customer_id = $this->sale_lib->get_customer();
if ($customer_id != NEW_ENTRY) {
// Load the customer discount if any
$customer_discount = $this->customer->getInfo($customer_id)->discount;
$customer_discount_type = $this->customer->getInfo($customer_id)->discount_type;
$customer_discount = $this->customer->get_info($customer_id)->discount;
$customer_discount_type = $this->customer->get_info($customer_id)->discount_type;
if ($customer_discount != '') {
$discount = $customer_discount;
$discount_type = $customer_discount_type;
@@ -526,7 +525,7 @@ class Sales extends Secure_Controller
$quantity = ($mode == 'return') ? -$quantity : $quantity;
$item_location = $this->sale_lib->get_sale_location();
if ($mode == 'return' && $this->sale->isValidReceipt($item_id_or_number_or_item_kit_or_receipt)) {
if ($mode == 'return' && $this->sale->is_valid_receipt($item_id_or_number_or_item_kit_or_receipt)) {
$this->sale_lib->return_entire_sale($item_id_or_number_or_item_kit_or_receipt);
} elseif ($this->item_kit->is_valid_item_kit($item_id_or_number_or_item_kit_or_receipt)) {
// Add kit item to order if one is assigned
@@ -704,7 +703,7 @@ class Sales extends Secure_Controller
$data['show_stock_locations'] = $this->stock_location->show_locations('sales');
$data['comments'] = $this->sale_lib->get_comment();
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$employee_info = $this->employee->getInfo($employee_id);
$employee_info = $this->employee->get_info($employee_id);
$data['employee'] = $employee_info->first_name . ' ' . mb_substr($employee_info->last_name, 0, 1);
$data['company_info'] = implode("\n", [$this->config['address'], $this->config['phone']]);
@@ -917,8 +916,6 @@ class Sales extends Secure_Controller
}
$data['receipt_template_view'] = $receipt_template;
Events::trigger('sale_complete', $data['sale_id_num'], $sale_type);
$this->sale_lib->clear_all();
return view('sales/receipt', $data);
}
@@ -1021,7 +1018,7 @@ class Sales extends Secure_Controller
$customer_info = '';
if ($customer_id != NEW_ENTRY) {
$customer_info = $this->customer->getInfo($customer_id);
$customer_info = $this->customer->get_info($customer_id);
$data['customer_id'] = $customer_id;
if (!empty($customer_info->company_name)) {
@@ -1044,11 +1041,11 @@ class Sales extends Secure_Controller
$data['customer_account_number'] = $customer_info->account_number;
$data['customer_discount'] = $customer_info->discount;
$data['customer_discount_type'] = $customer_info->discount_type;
$package_id = $this->customer->getInfo($customer_id)->package_id;
$package_id = $this->customer->get_info($customer_id)->package_id;
if ($package_id != null) {
$package_name = $this->customer_rewards->get_name($package_id);
$points = $this->customer->getInfo($customer_id)->points;
$points = $this->customer->get_info($customer_id)->points;
$data['customer_rewards']['package_id'] = $package_id;
$data['customer_rewards']['points'] = empty($points) ? 0 : $points;
$data['customer_rewards']['package_name'] = $package_name;
@@ -1127,7 +1124,7 @@ class Sales extends Secure_Controller
$data['amount_change'] = $data['amount_due'] * -1;
$employee_info = $this->employee->getInfo($this->sale_lib->get_employee());
$employee_info = $this->employee->get_info($this->sale_lib->get_employee());
$data['employee'] = $employee_info->first_name . ' ' . mb_substr($employee_info->last_name, 0, 1);
$this->_load_customer_data($this->sale_lib->get_customer(), $data);
@@ -1342,7 +1339,7 @@ class Sales extends Secure_Controller
$sale_info = $this->sale->get_info($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']);
$employee_info = $this->employee->get_info($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;

View File

@@ -99,10 +99,10 @@ class Secure_Controller extends BaseController
}
/**
* @param string $key
* @param $key
* @return mixed|void
*/
public function getConfig(string $key)
public function getConfig($key)
{
if (isset($config[$key])) {
return $config[$key];

View File

@@ -34,7 +34,7 @@ class Suppliers extends Persons
*/
public function getRow($row_id): ResponseInterface
{
$data_row = get_supplier_data_row($this->supplier->getInfo($row_id));
$data_row = get_supplier_data_row($this->supplier->get_info($row_id));
$data_row['category'] = $this->supplier->get_category_name($data_row['category']);
return $this->response->setJSON($data_row);
@@ -97,7 +97,7 @@ class Suppliers extends Persons
*/
public function getView(int $supplier_id = NEW_ENTRY): string
{
$info = $this->supplier->getInfo($supplier_id);
$info = $this->supplier->get_info($supplier_id);
foreach (get_object_vars($info) as $property => $value) {
$info->$property = $value;
}

View File

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

View File

@@ -1,21 +0,0 @@
CREATE TABLE IF NOT EXISTS `ospos_plugin_config` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`plugin_id` varchar(100) NOT NULL,
`key` varchar(100) NOT NULL,
`value` text NOT NULL,
`is_control` tinyint(1) NOT NULL DEFAULT 0,
`created_at` timestamp NOT NULL DEFAULT current_timestamp(),
`updated_at` timestamp NOT NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
PRIMARY KEY (`id`),
UNIQUE KEY `uq_plugin_key` (`plugin_id`, `key`),
KEY `idx_plugin_id` (`plugin_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
INSERT IGNORE INTO `ospos_modules` (`name_lang_key`, `desc_lang_key`, `sort`, `module_id`) VALUES
('module_plugins', 'module_plugins_desc', 111, 'plugins');
INSERT IGNORE INTO `ospos_permissions` (`permission_id`, `module_id`) VALUES
('plugins', 'plugins');
INSERT IGNORE INTO `ospos_grants` (`permission_id`, `person_id`, `menu_group`)
SELECT 'plugins', `person_id`, 'office' FROM `ospos_grants` WHERE `permission_id` = 'config';

View File

@@ -1,19 +0,0 @@
<?php
use CodeIgniter\Events\Events;
if (!function_exists('pluginContent')) {
function pluginContent(string $section, array $data = []): string
{
ob_start();
Events::trigger("view:{$section}", $data);
return ob_get_clean() ?: '';
}
}
if (!function_exists('pluginContentExists')) {
function pluginContentExists(string $section): bool
{
return !empty(Events::listeners("view:{$section}"));
}
}

View File

@@ -933,50 +933,6 @@ function get_controller(): string
return end($controller_name_parts);
}
function plugin_headers(): array
{
return [
['name' => lang('Plugins.name'), 'escape' => false],
['description' => lang('Plugins.description')],
['version' => lang('Plugins.version'), 'escape' => false],
['status' => lang('Plugins.status'), 'escape' => false],
];
}
function get_plugin_manage_table_headers(): string
{
return transform_headers(plugin_headers(), false, true);
}
function get_plugin_data_row(array $plugin): array
{
$pluginId = $plugin['id'];
$statusHtml = $plugin['enabled']
? '<span class="label label-success">' . lang('Plugins.active') . '</span>'
: '<span class="label label-default">' . lang('Plugins.inactive') . '</span>';
$editHtml = $plugin['enabled']
? '<button class="btn btn-warning btn-xs plugin-action" data-action="disable" data-plugin-id="' . esc($pluginId) . '">'
. '<span class="glyphicon glyphicon-pause"></span> ' . lang('Plugins.disable') . '</button>'
: '<button class="btn btn-success btn-xs plugin-action" data-action="enable" data-plugin-id="' . esc($pluginId) . '">'
. '<span class="glyphicon glyphicon-play"></span> ' . lang('Plugins.enable') . '</button>';
if ($plugin['has_config'] && $plugin['enabled']) {
$editHtml .= ' <button class="btn btn-primary btn-xs plugin-config" data-plugin-id="' . esc($pluginId) . '">'
. '<span class="glyphicon glyphicon-cog"></span> ' . lang('Plugins.configure') . '</button>';
}
return [
'plugin_id' => $pluginId,
'name' => '<strong>' . esc($plugin['name']) . '</strong><br><small class="text-muted">' . esc($pluginId) . '</small>',
'description' => esc($plugin['description']),
'version' => '<span class="label label-default">' . esc($plugin['version']) . '</span>',
'status' => $statusHtml,
'edit' => $editHtml,
];
}
/**
* Restores filter values from the URL query string.
*

View File

@@ -166,6 +166,8 @@ return [
"info" => "معلومات",
"info_configuration" => "معلومات الشركة",
"input_groups" => "مجموعات الإدخال",
"integrations" => "التكامل",
"integrations_configuration" => "تكامل",
"invoice" => "الفاتورة",
"invoice_configuration" => "إعدادات طباعة الفاتورة",
"invoice_default_comments" => "التعليق الافتراضي على الفاتورة",
@@ -196,6 +198,13 @@ return [
"location_info" => "معلومات تهيئة الأماكن",
"login_form" => "نمط نموذج تسجيل الدخول",
"logout" => "هل تريد عمل نسخة إحتياطية قبل الخروج؟ اضغط [نعم] لعمل النسخة أو [الغاء] للخروج.",
"mailchimp" => "ميل تشامب",
"mailchimp_api_key" => "مفتاح ميل شيمب",
"mailchimp_configuration" => "إعدادات ميل شيمب",
"mailchimp_key_successfully" => "نجاح.",
"mailchimp_key_unsuccessfully" => "فشل.",
"mailchimp_lists" => "إعدادات ميل شيمب",
"mailchimp_tooltip" => "انقر على رمز مفتاح API.",
"message" => "الرسائل",
"message_configuration" => "إعدادات الرسائل",
"msg_msg" => "الرسائل النصية المحفوظة",

View File

@@ -28,6 +28,16 @@ return [
"employee" => "الموظف",
"error_adding_updating" => "خطاء فى إضافة أو تحديث العميل.",
"import_items_csv" => "استيراد العملا ء من ورقة عمل اكسل",
"mailchimp_activity_click" => "النقر على البريد الإلكتروني",
"mailchimp_activity_lastopen" => "آخر رسالة إلكترونية مفتوحة",
"mailchimp_activity_open" => "رسالة إلكترونية مفتوحة",
"mailchimp_activity_total" => "تم ارسال الرسالة الإلكترونية بنجاح",
"mailchimp_activity_unopen" => "رسالة إلكترونية غير مفتوحة",
"mailchimp_email_client" => "بريد الكتروني",
"mailchimp_info" => "ميل تشيمب",
"mailchimp_member_rating" => "التقييم",
"mailchimp_status" => "الحالة",
"mailchimp_vip" => "مهم",
"max" => "الحد الأقصى",
"min" => "الحد الأدنى",
"new" => "عميل جديد",

View File

@@ -32,7 +32,6 @@ return [
"migrate_desc" => "تحديث قاعدة البيانات.",
"office" => "المكتب",
"office_desc" => "اظهار الائحة المكتبية.",
'plugins' => 'الإضافات',
"receivings" => "استلام الأصناف",
"receivings_desc" => "معالجة أوامر الشراء و استلام الأصناف.",
"reports" => "التقارير",

View File

@@ -1,27 +0,0 @@
<?php
return [
'actions' => 'إجراءات',
'active' => 'نشط',
'configure' => 'تكوين',
'description' => 'الوصف',
'disable' => 'تعطيل',
'disable_failed' => 'فشل تعطيل الإضافة',
'disabled' => 'تم تعطيل الإضافة بنجاح',
'enable' => 'تفعيل',
'enable_failed' => 'فشل تفعيل الإضافة',
'enabled' => 'تم تفعيل الإضافة بنجاح',
'inactive' => 'غير نشط',
'management' => 'إدارة الإضافات',
'name' => 'اسم الإضافة',
'no_config' => 'هذه الإضافة لا تحتوي على خيارات تكوين',
'no_plugins_to_display' => 'لا توجد إضافات للعرض',
'not_found' => 'الإضافة غير موجودة',
'plugins' => 'الإضافات',
'settings_save_failed' => 'فشل حفظ إعدادات الإضافة',
'settings_saved' => 'تم حفظ إعدادات الإضافة بنجاح',
'status' => 'الحالة',
'uninstall' => 'إلغاء التثبيت',
'uninstall_failed' => 'فشل إلغاء تثبيت الإضافة',
'uninstalled' => 'تم إلغاء تثبيت الإضافة بنجاح',
'version' => 'الإصدار',
];

View File

@@ -41,6 +41,7 @@ return [
"customer_discount" => "الخصم",
"customer_email" => "البريد الإلكترونى",
"customer_location" => "المكان",
"customer_mailchimp_status" => "حالة بريد ميل تشيمب",
"customer_optional" => "(مطلوب للدفعات المستحقة)",
"customer_required" => "(اجباري)",
"customer_total" => "المجموع",

View File

@@ -166,6 +166,8 @@ return [
"info" => "معلومات",
"info_configuration" => "معلومات الشركة",
"input_groups" => "مجموعات الإدخال",
"integrations" => "التكامل",
"integrations_configuration" => "تكامل",
"invoice" => "الفاتورة",
"invoice_configuration" => "إعدادات طباعة الفاتورة",
"invoice_default_comments" => "التعليق الافتراضي على الفاتورة",
@@ -196,6 +198,13 @@ return [
"location_info" => "معلومات تهيئة الأماكن",
"login_form" => "نمط نموذج تسجيل الدخول",
"logout" => "هل تريد عمل نسخة إحتياطية قبل الخروج؟ اضغط [نعم] لعمل النسخة أو [الغاء] للخروج.",
"mailchimp" => "ميل تشامب",
"mailchimp_api_key" => "مفتاح ميل شيمب",
"mailchimp_configuration" => "إعدادات ميل شيمب",
"mailchimp_key_successfully" => "نجاح.",
"mailchimp_key_unsuccessfully" => "فشل.",
"mailchimp_lists" => "قوائم ميل شيمب",
"mailchimp_tooltip" => "انقر على رمز مفتاح API.",
"message" => "الرسائل",
"message_configuration" => "إعدادات الرسائل",
"msg_msg" => "الرسائل النصية المحفوظة",

View File

@@ -28,6 +28,16 @@ return [
"employee" => "الموظف",
"error_adding_updating" => "خطاء فى إضافة أو تحديث العميل.",
"import_items_csv" => "استيراد العملا ء من ورقة عمل اكسل",
"mailchimp_activity_click" => "النقر على البريد الإلكتروني",
"mailchimp_activity_lastopen" => "آخر رسالة إلكترونية مفتوحة",
"mailchimp_activity_open" => "رسالة إلكترونية مفتوحة",
"mailchimp_activity_total" => "تم ارسال الرسالة الإلكترونية بنجاح",
"mailchimp_activity_unopen" => "رسالة إلكترونية غير مفتوحة",
"mailchimp_email_client" => "بريد الكتروني",
"mailchimp_info" => "ميل تشيمب",
"mailchimp_member_rating" => "التقييم",
"mailchimp_status" => "الحالة",
"mailchimp_vip" => "مهم",
"max" => "الحد الأقصى",
"min" => "الحد الأدنى",
"new" => "عميل جديد",

View File

@@ -32,7 +32,6 @@ return [
"migrate_desc" => "تحديث قاعدة البيانات.",
"office" => "المكتب",
"office_desc" => "اظهار الائحة المكتبية.",
'plugins' => 'الإضافات',
"receivings" => "استلام الأصناف",
"receivings_desc" => "معالجة أوامر الشراء و استلام الأصناف.",
"reports" => "التقارير",

View File

@@ -1,27 +0,0 @@
<?php
return [
'actions' => 'إجراءات',
'active' => 'نشط',
'configure' => 'تكوين',
'description' => 'الوصف',
'disable' => 'تعطيل',
'disable_failed' => 'فشل تعطيل الإضافة',
'disabled' => 'تم تعطيل الإضافة بنجاح',
'enable' => 'تفعيل',
'enable_failed' => 'فشل تفعيل الإضافة',
'enabled' => 'تم تفعيل الإضافة بنجاح',
'inactive' => 'غير نشط',
'management' => 'إدارة الإضافات',
'name' => 'اسم الإضافة',
'no_config' => 'هذه الإضافة لا تحتوي على خيارات تكوين',
'no_plugins_to_display' => 'لا توجد إضافات للعرض',
'not_found' => 'الإضافة غير موجودة',
'plugins' => 'الإضافات',
'settings_save_failed' => 'فشل حفظ إعدادات الإضافة',
'settings_saved' => 'تم حفظ إعدادات الإضافة بنجاح',
'status' => 'الحالة',
'uninstall' => 'إلغاء التثبيت',
'uninstall_failed' => 'فشل إلغاء تثبيت الإضافة',
'uninstalled' => 'تم إلغاء تثبيت الإضافة بنجاح',
'version' => 'الإصدار',
];

View File

@@ -41,6 +41,7 @@ return [
"customer_discount" => "الخصم",
"customer_email" => "البريد الإلكترونى",
"customer_location" => "المكان",
"customer_mailchimp_status" => "حالة بريد ميل تشيمب",
"customer_optional" => "(مطلوب للدفعات المستحقة)",
"customer_required" => "(اجباري)",
"customer_total" => "المجموع",

View File

@@ -166,6 +166,8 @@ return [
"info" => "Məlumat",
"info_configuration" => "Dükan İnformasiyası",
"input_groups" => "",
"integrations" => "İnteqrasiya",
"integrations_configuration" => "Üçüncü tərəf inteqrasiya",
"invoice" => "Faktura",
"invoice_configuration" => "Faktura Çap Parametrləri",
"invoice_default_comments" => "Standart Faktura Şərhləri",
@@ -196,6 +198,13 @@ return [
"location_info" => "Yer Konfiqurasiya Məlumatı",
"login_form" => "",
"logout" => "Çıxışdan əvvəl məlumatlari ehtiyat bazasına köçürmək istəyirsinizmi? Çıxış üçün Bekap və ya [Ləğv] üçün [OK]' düyməsinə basın.",
"mailchimp" => "Mailçimp",
"mailchimp_api_key" => "Mailchimp API Açarı",
"mailchimp_configuration" => "Mailchimp Konfiqurasiyası",
"mailchimp_key_successfully" => "API Açarı etibarlıdır.",
"mailchimp_key_unsuccessfully" => "API Açarı etibarsızdır.",
"mailchimp_lists" => "Mailchimp siyahısı (lar)",
"mailchimp_tooltip" => "API Açarının İşarəsinə basın.",
"message" => "Mesaj",
"message_configuration" => "Mesaj Konfiqurasiyası",
"msg_msg" => "Saxlanılan Mətn Mesajı",

View File

@@ -28,6 +28,16 @@ return [
"employee" => "Əməkdaş",
"error_adding_updating" => "Müştəri əlavəsində ya da yenilənməsində XƏTA.",
"import_items_csv" => "CSVdən müştəri əlavə et",
"mailchimp_activity_click" => "Elektron poçt düyməsi",
"mailchimp_activity_lastopen" => "Son açılan məktub",
"mailchimp_activity_open" => "ıq məktub",
"mailchimp_activity_total" => "Məktub göndərildi",
"mailchimp_activity_unopen" => "ılmamış məktub",
"mailchimp_email_client" => "Müştəriyə Məktub Göndər",
"mailchimp_info" => "Mailchimp-də",
"mailchimp_member_rating" => "Reytinq",
"mailchimp_status" => "Status",
"mailchimp_vip" => "siz silmək üçün heç bir müştəri seçməmisiniz",
"max" => "Ən çox xərclənən",
"min" => "Ən az xərclənən",
"new" => "Yeni Müştəri",

View File

@@ -32,7 +32,6 @@ return [
"migrate_desc" => "ALSAN Məlumat Bazasıni Yenilə.",
"office" => "Ofis",
"office_desc" => "Ofis menyusu siyahısı modulları.",
'plugins' => 'Plaginlər',
"receivings" => "Qəbul Edilənlər",
"receivings_desc" => "Satınalma sifarişləri işləyin.",
"reports" => "Hesabatlar",

View File

@@ -1,27 +0,0 @@
<?php
return [
'actions' => 'Əməliyyatlar',
'active' => 'Aktiv',
'configure' => 'Konfiqurasiya',
'description' => 'Təsvir',
'disable' => 'Deaktiv et',
'disable_failed' => 'Plagini deaktiv etmək alınmadı',
'disabled' => 'Plagin uğurla deaktiv edildi',
'enable' => 'Aktiv et',
'enable_failed' => 'Plagini aktiv etmək alınmadı',
'enabled' => 'Plagin uğurla aktiv edildi',
'inactive' => 'Deaktiv',
'management' => 'Plagin idarəetməsi',
'name' => 'Plagin adı',
'no_config' => 'Bu plaginin konfiqurasiya seçimləri yoxdur',
'no_plugins_to_display' => 'Göstəriləcək plagin yoxdur',
'not_found' => 'Plagin tapılmadı',
'plugins' => 'Plaginlər',
'settings_save_failed' => 'Plagin parametrlərini saxlamaq alınmadı',
'settings_saved' => 'Plagin parametrləri uğurla saxlandı',
'status' => 'Status',
'uninstall' => 'Sil',
'uninstall_failed' => 'Plagini silmək alınmadı',
'uninstalled' => 'Plagin uğurla silindi',
'version' => 'Versiya',
];

View File

@@ -41,6 +41,7 @@ return [
"customer_discount" => "Endirim",
"customer_email" => "E-poçt",
"customer_location" => "Yer",
"customer_mailchimp_status" => "Mailchimp Statusu",
"customer_optional" => "(Ödənişlərdə tələb olunur)",
"customer_required" => "(Vacib)",
"customer_total" => "Cəmi",

View File

@@ -166,6 +166,8 @@ return [
"info" => "Information",
"info_configuration" => "Store Information",
"input_groups" => "",
"integrations" => "",
"integrations_configuration" => "",
"invoice" => "Invoice",
"invoice_configuration" => "Invoice Print Settings",
"invoice_default_comments" => "Default Invoice Comments",
@@ -196,6 +198,13 @@ return [
"location_info" => "Location Configuration Information",
"login_form" => "",
"logout" => "Do you want to make a backup before logging out? Click [OK] to backup or [Cancel] to logout.",
"mailchimp" => "Mailchimp",
"mailchimp_api_key" => "Mailchimp API Key",
"mailchimp_configuration" => "Mailchimp Configuration",
"mailchimp_key_successfully" => "API Key is valid.",
"mailchimp_key_unsuccessfully" => "API Key is invalid.",
"mailchimp_lists" => "Mailchimp List(s)",
"mailchimp_tooltip" => "Click the icon for an API Key.",
"message" => "Message",
"message_configuration" => "Message Configuration",
"msg_msg" => "Saved Text Message",

View File

@@ -28,6 +28,16 @@ return [
"employee" => "Служител",
"error_adding_updating" => "Добавянето или актуализирането на клиента е неуспешно.",
"import_items_csv" => "Импортиране на клиент от CSV",
"mailchimp_activity_click" => "Email click",
"mailchimp_activity_lastopen" => "Последно отворен Имейл",
"mailchimp_activity_open" => "Имейлът е отворен",
"mailchimp_activity_total" => "Имейлът е изпратен",
"mailchimp_activity_unopen" => "Имейлът е неотворен",
"mailchimp_email_client" => "Имейл клиент",
"mailchimp_info" => "Mailchimp (Услуга)",
"mailchimp_member_rating" => "Оценка",
"mailchimp_status" => "Статус",
"mailchimp_vip" => "VIP",
"max" => "Максимално похарчени",
"min" => "Минимално похарчено",
"new" => "Нов клиент",

View File

@@ -32,7 +32,6 @@ return [
"migrate_desc" => "Update the OSPOS Database.",
"office" => "Office",
"office_desc" => "List office menu modules.",
'plugins' => 'Плъгини',
"receivings" => "Receivings",
"receivings_desc" => "Process Purchase Orders.",
"reports" => "Reports",

View File

@@ -1,27 +0,0 @@
<?php
return [
'actions' => 'Действия',
'active' => 'Активен',
'configure' => 'Конфигуриране',
'description' => 'Описание',
'disable' => 'Деактивиране',
'disable_failed' => 'Неуспешно деактивиране на приставката',
'disabled' => 'Приставката е деактивирана успешно',
'enable' => 'Активиране',
'enable_failed' => 'Неуспешно активиране на приставката',
'enabled' => 'Приставката е активирана успешно',
'inactive' => 'Неактивен',
'management' => 'Управление на приставки',
'name' => 'Име на приставката',
'no_config' => 'Тази приставка няма опции за конфигурация',
'no_plugins_to_display' => 'Няма приставки за показване',
'not_found' => 'Приставката не е намерена',
'plugins' => 'Приставки',
'settings_save_failed' => 'Неуспешно запазване на настройките на приставката',
'settings_saved' => 'Настройките на приставката са запазени успешно',
'status' => 'Статус',
'uninstall' => 'Деинсталиране',
'uninstall_failed' => 'Неуспешно деинсталиране на приставката',
'uninstalled' => 'Приставката е деинсталирана успешно',
'version' => 'Версия',
];

View File

@@ -41,7 +41,7 @@ return [
"customer_discount" => "Намаление",
"customer_email" => "Електронна поща",
"customer_location" => "Местоположение",
"mailchimp_customer_status" => "Състояние на Mailchimp",
"customer_mailchimp_status" => "Състояние на Mailchimp",
"customer_optional" => "(Незадължително)",
"customer_required" => "(Задължително)",
"customer_total" => "Обща сума",

View File

@@ -166,6 +166,8 @@ return [
"info" => "Informacije",
"info_configuration" => "Info o web trgovini",
"input_groups" => "Grupe unosa",
"integrations" => "Integracije",
"integrations_configuration" => "Integracije trećih strana",
"invoice" => "Faktura",
"invoice_configuration" => "Podešavanja štamapnja",
"invoice_default_comments" => "Komentar na fakturi",
@@ -196,6 +198,13 @@ return [
"location_info" => "Informacije o konfiguraciji lokacije",
"login_form" => "Stil formulara za prijavu",
"logout" => "Zar ne želite da napravite rezervnu kopiju prije odjave? Kliknite [OK] za sigurnosnu kopiju, [Cancel] da biste se odjavili.",
"mailchimp" => "MeilChimp",
"mailchimp_api_key" => "MailChimp API ključ",
"mailchimp_configuration" => "MailChimp konfiguracija",
"mailchimp_key_successfully" => "API ključ je važeći.",
"mailchimp_key_unsuccessfully" => "API ključ je nevažeći.",
"mailchimp_lists" => "MailChimp lista(e)",
"mailchimp_tooltip" => "Kliknite na ikonu za API ključ.",
"message" => "Poruke",
"message_configuration" => "Konfigurisanje poruke",
"msg_msg" => "Snimljena tekst poruka",

View File

@@ -28,6 +28,16 @@ return [
"employee" => "Zaposlenik",
"error_adding_updating" => "Dodavanje ili ažuriranje kupca nije uspjelo.",
"import_items_csv" => "Uvezi kupce iz CSV datoteke",
"mailchimp_activity_click" => "Klik na e-mail",
"mailchimp_activity_lastopen" => "Zadnji otvoreni e-mail",
"mailchimp_activity_open" => "E-mail otvoren",
"mailchimp_activity_total" => "E-mail poslat",
"mailchimp_activity_unopen" => "E-mail nije otvoren",
"mailchimp_email_client" => "E-mail klijenta",
"mailchimp_info" => "MeilChimp",
"mailchimp_member_rating" => "Ocjena",
"mailchimp_status" => "Status",
"mailchimp_vip" => "VIP",
"max" => "Maks. potrošeno",
"min" => "Min. potrošeno",
"new" => "Novi kupac",

View File

@@ -32,7 +32,6 @@ return [
"migrate_desc" => "Ažurirajte OSPOS bazu podataka.",
"office" => "Administracija",
"office_desc" => "Lista modula kancelarijskog menija.",
'plugins' => 'Dodaci',
"receivings" => "Ulazi",
"receivings_desc" => "Obrada narudžbenica.",
"reports" => "Izvještaji",

View File

@@ -1,27 +0,0 @@
<?php
return [
'actions' => 'Akcije',
'active' => 'Aktivno',
'configure' => 'Konfiguracija',
'description' => 'Opis',
'disable' => 'Onemogući',
'disable_failed' => 'Nije uspjelo onemogućavanje dodatka',
'disabled' => 'Dodatak je uspješno onemogućen',
'enable' => 'Omogući',
'enable_failed' => 'Nije uspjelo omogućavanje dodatka',
'enabled' => 'Dodatak je uspješno omogućen',
'inactive' => 'Neaktivno',
'management' => 'Upravljanje dodacima',
'name' => 'Naziv dodatka',
'no_config' => 'Ovaj dodatak nema opcija konfiguracije',
'no_plugins_to_display' => 'Nema dodataka za prikaz',
'not_found' => 'Dodatak nije pronađen',
'plugins' => 'Dodaci',
'settings_save_failed' => 'Nije uspjelo spremanje postavki dodatka',
'settings_saved' => 'Postavke dodatka su uspješno sačuvane',
'status' => 'Status',
'uninstall' => 'Deinstaliraj',
'uninstall_failed' => 'Nije uspjelo deinstaliranje dodatka',
'uninstalled' => 'Dodatak je uspješno deinstaliran',
'version' => 'Verzija',
];

View File

@@ -41,6 +41,7 @@ return [
"customer_discount" => "Popust",
"customer_email" => "E-mail kupca",
"customer_location" => "Mjesto kupca",
"customer_mailchimp_status" => "Status MailChimp-a",
"customer_optional" => "(Potrebno za odloženo plaćanje)",
"customer_required" => "Obavezno",
"customer_total" => "Ukupno",

View File

@@ -166,8 +166,8 @@ return [
'info' => "زانیاری",
'info_configuration' => "زانیاری فڕۆشتگا",
'input_groups' => "گروپەکانی زانیارییە پێدراوەکان",
'plugins' => "یەکگرتنەکان",
'plugins_configuration' => "یەکگرتنەکانی لایەنی سێیەم",
'integrations' => "یەکگرتنەکان",
'integrations_configuration' => "یەکگرتنەکانی لایەنی سێیەم",
'invoice' => "فاکتۆرە",
'invoice_configuration' => "ڕێکخستنەکانی چاپی فاکتورە",
'invoice_default_comments' => "سەرنجەکانی فاکتۆرەی بنەڕەتیی",
@@ -198,6 +198,13 @@ return [
'location_info' => "زانیاری ڕێکخستنی شوێن",
'login_form' => "ستایلی فۆڕمی چوونەژوورەوە",
'logout' => "دەتەوێت پاڵپشت دروست بکەیت پێش چوونە دەرەوە؟ کرتە بکە لەسەر [باشە] بۆ پاڵپشت دروستکردن یان [هەڵوەشاندنەوە] بۆ چوونە دەرەوە.",
'mailchimp' => "مەیڵچیمپ",
'mailchimp_api_key' => "کلیلی (ئەی پی ئای)ی مەیڵچیمپ",
'mailchimp_configuration' => "ڕێکخستنی مەیڵچیمپ",
'mailchimp_key_successfully' => "کلیلی (ئەی پی ئای) دروستە.",
'mailchimp_key_unsuccessfully' => "کلیلی (ئەی پی ئای) نادروستە.",
'mailchimp_lists' => "لیست(ەکان)ی مەیڵچیمپ",
'mailchimp_tooltip' => "کرتە لەسەر ئایکۆنی کلیلی (ئەی پی ئای) بکە.",
'message' => "نامە",
'message_configuration' => "ڕێکخستنی نامە",
'msg_msg' => "دەقی نامەی پاشەکەوتکراو",

View File

@@ -28,6 +28,16 @@ return [
'employee' => "فەرمانبەر",
'error_adding_updating' => "زیادکردن یان نوێکردنەوەی کڕیار سەرکەوتوو نەبوو.",
'import_items_csv' => "هاوردەکردنی کڕیار لەڕێگایCSV",
'mailchimp_activity_click' => "کرتەی ئیمەیل",
'mailchimp_activity_lastopen' => "دوایین ئیمەیڵی کراوە",
'mailchimp_activity_open' => "ئیمەیڵ کرایەوە",
'mailchimp_activity_total' => "ئیمەیڵ نێردرا",
'mailchimp_activity_unopen' => "ئیمەیڵ نەکراوە",
'mailchimp_email_client' => "کڕیاری ئیمەیل",
'mailchimp_info' => "مەیڵچیمپ",
'mailchimp_member_rating' => "پلەپێدان",
'mailchimp_status' => "دۆخ",
'mailchimp_vip' => "ڤی ئای پی",
'max' => "زۆرترین. خەرجکراو",
'min' => "کەمترین. خەرجکراو",
'new' => "کڕیاری نوێ",

View File

@@ -32,7 +32,6 @@ return [
'migrate_desc' => "داتابەیسی OSPOS نوێ بکەرەوە.",
'office' => "ئۆفیس",
'office_desc' => "لیستی مۆدۆلی پێڕستی ئۆفیس نیشان بدە.",
'plugins' => 'پڵەگینەکان',
'receivings' => "وەرگرتنەکان",
'receivings_desc' => "پرۆسەی داواکاری کڕین.",
'reports' => "ڕاپۆرتەکان",

View File

@@ -1,27 +0,0 @@
<?php
return [
'actions' => 'کردارەکان',
'active' => 'چالاک',
'configure' => 'ڕێکخستن',
'description' => 'وەسف',
'disable' => 'ناچالاک کردن',
'disable_failed' => 'ناکامی لە ناچالاک کردنی پڵەگین',
'disabled' => 'پڵەگین بە سەرکەوتوویی ناچالاک کرا',
'enable' => 'چالاک کردن',
'enable_failed' => 'ناکامی لە چالاک کردنی پڵەگین',
'enabled' => 'پڵەگین بە سەرکەوتوویی چالاک کرا',
'inactive' => 'ناچالاک',
'management' => 'بەڕێوەبردنی پڵەگین',
'name' => 'ناوی پڵەگین',
'no_config' => 'ئەم پڵەگینە هیچ بژاردەیەکی ڕێکخستن نییە',
'no_plugins_to_display' => 'هیچ پڵەگینێک بۆ نیشاندان نییە',
'not_found' => 'پڵەگین نەدۆزرایەوە',
'plugins' => 'پڵەگینەکان',
'settings_save_failed' => 'ناکامی لە پاشەکەوت کردنی ڕێکخستنەکانی پڵەگین',
'settings_saved' => 'ڕێکخستنەکانی پڵەگین بە سەرکەوتوویی پاشەکەوت کران',
'status' => 'باری',
'uninstall' => 'لادانی دامەزراندن',
'uninstall_failed' => 'ناکامی لە لادانی دامەزراندنی پڵەگین',
'uninstalled' => 'پڵەگین بە سەرکەوتوویی لادرا',
'version' => 'وەشان',
];

View File

@@ -41,6 +41,7 @@ return [
'customer_discount' => "داشکاندن",
'customer_email' => "ئیمەیڵ",
'customer_location' => "ناونیشان",
'customer_mailchimp_status' => "دۆخی بەکارهێنان مایلچیمپ",
'customer_optional' => "(پێویستە بۆئەو پارانەی دەبێت بدرێت)",
'customer_required' => "(پێویستە)",
'customer_total' => "کۆی گشتی",

View File

@@ -166,6 +166,8 @@ return [
"info" => "",
"info_configuration" => "",
"input_groups" => "",
"integrations" => "",
"integrations_configuration" => "",
"invoice" => "",
"invoice_configuration" => "",
"invoice_default_comments" => "",
@@ -196,6 +198,13 @@ return [
"location_info" => "",
"login_form" => "",
"logout" => "",
"mailchimp" => "",
"mailchimp_api_key" => "",
"mailchimp_configuration" => "",
"mailchimp_key_successfully" => "",
"mailchimp_key_unsuccessfully" => "",
"mailchimp_lists" => "",
"mailchimp_tooltip" => "",
"message" => "",
"message_configuration" => "",
"msg_msg" => "",

View File

@@ -28,6 +28,16 @@ return [
"employee" => "Zaměstnanec",
"error_adding_updating" => "Chyba při vytváření nebo aktualizaci zákazníka.",
"import_items_csv" => "Import zákazníků z CSV",
"mailchimp_activity_click" => "",
"mailchimp_activity_lastopen" => "Poslední otevřený email",
"mailchimp_activity_open" => "",
"mailchimp_activity_total" => "",
"mailchimp_activity_unopen" => "",
"mailchimp_email_client" => "",
"mailchimp_info" => "",
"mailchimp_member_rating" => "Hodnocení",
"mailchimp_status" => "",
"mailchimp_vip" => "VIP",
"max" => "",
"min" => "",
"new" => "",

View File

@@ -32,7 +32,6 @@ return [
"migrate_desc" => "Aktualizovat databázi OSPOS.",
"office" => "Správa",
"office_desc" => "Seznam modulů pro správu.",
'plugins' => 'Doplňky',
"receivings" => "Příjem zboží",
"receivings_desc" => "",
"reports" => "Sestavy",

View File

@@ -1,27 +0,0 @@
<?php
return [
'actions' => 'Akce',
'active' => 'Aktivní',
'configure' => 'Konfigurovat',
'description' => 'Popis',
'disable' => 'Deaktivovat',
'disable_failed' => 'Deaktivace pluginu se nezdařila',
'disabled' => 'Plugin byl úspěšně deaktivován',
'enable' => 'Aktivovat',
'enable_failed' => 'Aktivace pluginu se nezdařila',
'enabled' => 'Plugin byl úspěšně aktivován',
'inactive' => 'Neaktivní',
'management' => 'Správa pluginů',
'name' => 'Název pluginu',
'no_config' => 'Tento plugin nemá žádné možnosti konfigurace',
'no_plugins_to_display' => 'Žádné pluginy k zobrazení',
'not_found' => 'Plugin nebyl nalezen',
'plugins' => 'Pluginy',
'settings_save_failed' => 'Uložení nastavení pluginu se nezdařilo',
'settings_saved' => 'Nastavení pluginu bylo úspěšně uloženo',
'status' => 'Stav',
'uninstall' => 'Odinstalovat',
'uninstall_failed' => 'Odinstalace pluginu se nezdařila',
'uninstalled' => 'Plugin byl úspěšně odinstalován',
'version' => 'Verze',
];

View File

@@ -41,6 +41,7 @@ return [
"customer_discount" => "Sleva",
"customer_email" => "Email",
"customer_location" => "Místo",
"customer_mailchimp_status" => "Stav mailchimp",
"customer_optional" => "(Volitelné)",
"customer_required" => "(Vyžadováno)",
"customer_total" => "Celkem",

View File

@@ -166,6 +166,8 @@ return [
"info" => "Information",
"info_configuration" => "Store Information",
"input_groups" => "",
"integrations" => "Integrations",
"integrations_configuration" => "Third Party Integrations",
"invoice" => "Invoice",
"invoice_configuration" => "Invoice Print Settings",
"invoice_default_comments" => "Default Invoice Comments",
@@ -196,6 +198,13 @@ return [
"location_info" => "Location Configuration Information",
"login_form" => "",
"logout" => "Do you want to make a backup before logging out? Click [OK] to backup or [Cancel] to logout.",
"mailchimp" => "Mailchimp",
"mailchimp_api_key" => "Mailchimp API Key",
"mailchimp_configuration" => "Mailchimp Configuration",
"mailchimp_key_successfully" => "API Key is valid.",
"mailchimp_key_unsuccessfully" => "API Key is invalid.",
"mailchimp_lists" => "Mailchimp List(s)",
"mailchimp_tooltip" => "Click the icon for an API Key.",
"message" => "Message",
"message_configuration" => "Message Configuration",
"msg_msg" => "Saved Text Message",

View File

@@ -28,6 +28,16 @@ return [
"employee" => "Employee",
"error_adding_updating" => "Customer add or update failed.",
"import_items_csv" => "Customer Import from CSV",
"mailchimp_activity_click" => "Email click",
"mailchimp_activity_lastopen" => "Last open email",
"mailchimp_activity_open" => "Email open",
"mailchimp_activity_total" => "Email sent",
"mailchimp_activity_unopen" => "Email unopen",
"mailchimp_email_client" => "Email client",
"mailchimp_info" => "Mailchimp",
"mailchimp_member_rating" => "Rating",
"mailchimp_status" => "Status",
"mailchimp_vip" => "VIP",
"max" => "Max. spent",
"min" => "Min. spent",
"new" => "New Customer",

View File

@@ -32,7 +32,6 @@ return [
"migrate_desc" => "",
"office" => "",
"office_desc" => "",
'plugins' => 'Plugins',
"receivings" => "",
"receivings_desc" => "",
"reports" => "",

View File

@@ -1,27 +0,0 @@
<?php
return [
'actions' => 'Handlinger',
'active' => 'Aktiv',
'configure' => 'Konfigurer',
'description' => 'Beskrivelse',
'disable' => 'Deaktiver',
'disable_failed' => 'Deaktivering af plugin mislykkedes',
'disabled' => 'Plugin blev deaktiveret',
'enable' => 'Aktiver',
'enable_failed' => 'Aktivering af plugin mislykkedes',
'enabled' => 'Plugin blev aktiveret',
'inactive' => 'Inaktiv',
'management' => 'Plugin-administration',
'name' => 'Plugin-navn',
'no_config' => 'Dette plugin har ingen konfigurationsmuligheder',
'no_plugins_to_display' => 'Ingen plugins at vise',
'not_found' => 'Plugin ikke fundet',
'plugins' => 'Plugins',
'settings_save_failed' => 'Gemning af plugin-indstillinger mislykkedes',
'settings_saved' => 'Plugin-indstillinger blev gemt',
'status' => 'Status',
'uninstall' => 'Afinstaller',
'uninstall_failed' => 'Afinstallation af plugin mislykkedes',
'uninstalled' => 'Plugin blev afinstalleret',
'version' => 'Version',
];

View File

@@ -41,6 +41,7 @@ return [
"customer_discount" => "Rabat",
"customer_email" => "",
"customer_location" => "",
"customer_mailchimp_status" => "",
"customer_optional" => "",
"customer_required" => "",
"customer_total" => "",

View File

@@ -166,6 +166,8 @@ return [
"info" => "Instellungen",
"info_configuration" => "Instellungen",
"input_groups" => "",
"integrations" => "",
"integrations_configuration" => "",
"invoice" => "Rechnungs",
"invoice_configuration" => "Druckereinstellungen",
"invoice_default_comments" => "Rechnungskommentar",
@@ -196,6 +198,13 @@ return [
"location_info" => "Lagerort-Information",
"login_form" => "",
"logout" => "Wollen Sie eine Sicherung machen vor dem Beenden? Klicke [OK] für Sicherung",
"mailchimp" => "",
"mailchimp_api_key" => "",
"mailchimp_configuration" => "",
"mailchimp_key_successfully" => "",
"mailchimp_key_unsuccessfully" => "",
"mailchimp_lists" => "",
"mailchimp_tooltip" => "",
"message" => "Message",
"message_configuration" => "Message Configuration",
"msg_msg" => "Saved Text Message",

View File

@@ -28,6 +28,16 @@ return [
"employee" => "",
"error_adding_updating" => "Fehler beim Hinzufügen/Ändern",
"import_items_csv" => "Importiere Kunden via CSV",
"mailchimp_activity_click" => "",
"mailchimp_activity_lastopen" => "",
"mailchimp_activity_open" => "",
"mailchimp_activity_total" => "",
"mailchimp_activity_unopen" => "",
"mailchimp_email_client" => "",
"mailchimp_info" => "",
"mailchimp_member_rating" => "",
"mailchimp_status" => "",
"mailchimp_vip" => "",
"max" => "",
"min" => "",
"new" => "Neuer Kunde",

View File

@@ -32,7 +32,6 @@ return [
"migrate_desc" => "",
"office" => "",
"office_desc" => "",
'plugins' => 'Plugins',
"receivings" => "Eingänge",
"receivings_desc" => "Hinzufügen, Ändern, Löschen und Suchen",
"reports" => "Berichte",

View File

@@ -1,27 +0,0 @@
<?php
return [
'actions' => 'Aktionen',
'active' => 'Aktiv',
'configure' => 'Konfigurieren',
'description' => 'Beschreibung',
'disable' => 'Deaktivieren',
'disable_failed' => 'Plugin konnte nicht deaktiviert werden',
'disabled' => 'Plugin erfolgreich deaktiviert',
'enable' => 'Aktivieren',
'enable_failed' => 'Plugin konnte nicht aktiviert werden',
'enabled' => 'Plugin erfolgreich aktiviert',
'inactive' => 'Inaktiv',
'management' => 'Plugin-Verwaltung',
'name' => 'Plugin-Name',
'no_config' => 'Dieses Plugin hat keine Konfigurationsoptionen',
'no_plugins_to_display' => 'Keine Plugins anzuzeigen',
'not_found' => 'Plugin nicht gefunden',
'plugins' => 'Plugins',
'settings_save_failed' => 'Plugin-Einstellungen konnten nicht gespeichert werden',
'settings_saved' => 'Plugin-Einstellungen erfolgreich gespeichert',
'status' => 'Status',
'uninstall' => 'Deinstallieren',
'uninstall_failed' => 'Plugin konnte nicht deinstalliert werden',
'uninstalled' => 'Plugin erfolgreich deinstalliert',
'version' => 'Version',
];

View File

@@ -41,6 +41,7 @@ return [
"customer_discount" => "Discount",
"customer_email" => "Customer Email",
"customer_location" => "Customer Location",
"customer_mailchimp_status" => "",
"customer_optional" => "",
"customer_required" => "",
"customer_total" => "Total",

View File

@@ -166,6 +166,8 @@ return [
"info" => "Informationen",
"info_configuration" => "Generelle Einstellungen",
"input_groups" => "",
"integrations" => "Integrationen",
"integrations_configuration" => "Drittanbieter Integrationen",
"invoice" => "Rechnungs",
"invoice_configuration" => "Druckereinstellungen",
"invoice_default_comments" => "Rechnungskommentar",
@@ -196,7 +198,14 @@ return [
"location_info" => "Lagerort-Information",
"login_form" => "",
"logout" => "Wollen Sie vor dem Beenden eine Sicherung erstellen? Klicke [OK] für Sicherung.",
"message" => "Nachricht",
"mailchimp" => "Mailchimp",
"mailchimp_api_key" => "Mailchimp API Schlüssel",
"mailchimp_configuration" => "Mailchimp Konfiguration",
"mailchimp_key_successfully" => "API Key ist gültig.",
"mailchimp_key_unsuccessfully" => "API Key ist ungültig.",
"mailchimp_lists" => "Mailchimp Liste(n)",
"mailchimp_tooltip" => "Icon anklicken um API Key zu erhalten.",
"message" => "Nachricht",
"message_configuration" => "Nachrichtenkonfiguration",
"msg_msg" => "Gespeicherte Nachricht",
"msg_msg_placeholder" => "Wenn Sie eine SMS Vorlage benutzen wollen, geben Sie diese hier ein, ansonsten lassen Sie dieses Feld frei.",

View File

@@ -28,6 +28,16 @@ return [
"employee" => "Mitarbeiter",
"error_adding_updating" => "Fehler beim Hinzufügen/Ändern.",
"import_items_csv" => "Importiere Kunden via CSV",
"mailchimp_activity_click" => "E-Mail klick",
"mailchimp_activity_lastopen" => "Letzte geöffnet E-Mail",
"mailchimp_activity_open" => "E-Mail geöffnet",
"mailchimp_activity_total" => "E-Mail gesendet",
"mailchimp_activity_unopen" => "E-Mail ungeöffnet",
"mailchimp_email_client" => "E-Mail Client",
"mailchimp_info" => "Mailchimp",
"mailchimp_member_rating" => "Bewertung",
"mailchimp_status" => "Status",
"mailchimp_vip" => "VIP",
"max" => "Maximal Ausgegeben",
"min" => "Minimal Ausgegeben",
"new" => "Neuer Kunde",

View File

@@ -32,7 +32,6 @@ return [
"migrate_desc" => "Aktualisiere die OSPOS-Datenbank.",
"office" => "Verwaltung",
"office_desc" => "Auflistung der Module für das Verwaltungs-Menü.",
'plugins' => 'Plugins',
"receivings" => "Eingänge",
"receivings_desc" => "Hinzufügen, Ändern, Löschen und Suchen von Bestellungen.",
"reports" => "Berichte",

View File

@@ -1,27 +0,0 @@
<?php
return [
'actions' => 'Aktionen',
'active' => 'Aktiv',
'configure' => 'Konfigurieren',
'description' => 'Beschreibung',
'disable' => 'Deaktivieren',
'disable_failed' => 'Plugin konnte nicht deaktiviert werden',
'disabled' => 'Plugin erfolgreich deaktiviert',
'enable' => 'Aktivieren',
'enable_failed' => 'Plugin konnte nicht aktiviert werden',
'enabled' => 'Plugin erfolgreich aktiviert',
'inactive' => 'Inaktiv',
'management' => 'Plugin-Verwaltung',
'name' => 'Plugin-Name',
'no_config' => 'Dieses Plugin hat keine Konfigurationsoptionen',
'no_plugins_to_display' => 'Keine Plugins anzuzeigen',
'not_found' => 'Plugin nicht gefunden',
'plugins' => 'Plugins',
'settings_save_failed' => 'Plugin-Einstellungen konnten nicht gespeichert werden',
'settings_saved' => 'Plugin-Einstellungen erfolgreich gespeichert',
'status' => 'Status',
'uninstall' => 'Deinstallieren',
'uninstall_failed' => 'Plugin konnte nicht deinstalliert werden',
'uninstalled' => 'Plugin erfolgreich deinstalliert',
'version' => 'Version',
];

View File

@@ -41,6 +41,7 @@ return [
"customer_discount" => "Rabatt",
"customer_email" => "Kunden eMail",
"customer_location" => "Kunden Stadt",
"customer_mailchimp_status" => "Mailchim Status",
"customer_optional" => "(Benötigt für fällige Zahlungen)",
"customer_required" => "(Benötigt)",
"customer_total" => "Gesamtbetrag",

View File

@@ -166,6 +166,8 @@ return [
"info" => "",
"info_configuration" => "",
"input_groups" => "",
"integrations" => "",
"integrations_configuration" => "",
"invoice" => "",
"invoice_configuration" => "",
"invoice_default_comments" => "",
@@ -196,6 +198,13 @@ return [
"location_info" => "",
"login_form" => "",
"logout" => "",
"mailchimp" => "",
"mailchimp_api_key" => "",
"mailchimp_configuration" => "",
"mailchimp_key_successfully" => "",
"mailchimp_key_unsuccessfully" => "",
"mailchimp_lists" => "",
"mailchimp_tooltip" => "",
"message" => "",
"message_configuration" => "",
"msg_msg" => "",

View File

@@ -28,6 +28,16 @@ return [
"employee" => "",
"error_adding_updating" => "",
"import_items_csv" => "",
"mailchimp_activity_click" => "",
"mailchimp_activity_lastopen" => "",
"mailchimp_activity_open" => "",
"mailchimp_activity_total" => "",
"mailchimp_activity_unopen" => "",
"mailchimp_email_client" => "",
"mailchimp_info" => "",
"mailchimp_member_rating" => "",
"mailchimp_status" => "",
"mailchimp_vip" => "",
"max" => "",
"min" => "",
"new" => "",

View File

@@ -32,7 +32,6 @@ return [
"migrate_desc" => "",
"office" => "",
"office_desc" => "",
'plugins' => 'Πρόσθετα',
"receivings" => "",
"receivings_desc" => "",
"reports" => "",

View File

@@ -1,27 +0,0 @@
<?php
return [
'actions' => 'Ενέργειες',
'active' => 'Ενεργό',
'configure' => 'Διαμόρφωση',
'description' => 'Περιγραφή',
'disable' => 'Απενεργοποίηση',
'disable_failed' => 'Η απενεργοποίηση της προσθήκης απέτυχε',
'disabled' => 'Η προσθήκη απενεργοποιήθηκε επιτυχώς',
'enable' => 'Ενεργοποίηση',
'enable_failed' => 'Η ενεργοποίηση της προσθήκης απέτυχε',
'enabled' => 'Η προσθήκη ενεργοποιήθηκε επιτυχώς',
'inactive' => 'Ανενεργό',
'management' => 'Διαχείριση Προσθηκών',
'name' => 'Όνομα Προσθήκης',
'no_config' => 'Αυτή η προσθήκη δεν έχει επιλογές διαμόρφωσης',
'no_plugins_to_display' => 'Δεν υπάρχουν προσθήκες για εμφάνιση',
'not_found' => 'Η προσθήκη δεν βρέθηκε',
'plugins' => 'Προσθήκες',
'settings_save_failed' => 'Η αποθήκευση των ρυθμίσεων της προσθήκης απέτυχε',
'settings_saved' => 'Οι ρυθμίσεις της προσθήκης αποθηκεύτηκαν επιτυχώς',
'status' => 'Κατάσταση',
'uninstall' => 'Απεγκατάσταση',
'uninstall_failed' => 'Η απεγκατάσταση της προσθήκης απέτυχε',
'uninstalled' => 'Η προσθήκη απεγκαταστάθηκε επιτυχώς',
'version' => 'Έκδοση',
];

View File

@@ -41,6 +41,7 @@ return [
"customer_discount" => "Έκπτωση",
"customer_email" => "Διεύθυνση ηλεκτρονικού ταχυδρομείου",
"customer_location" => "Τοποθεσία",
"customer_mailchimp_status" => "Κατάσταση Mailchimp",
"customer_optional" => "(Απαραίτητο για πληρωμές επί Πιστώσει)",
"customer_required" => "(Απαραίτητο)",
"customer_total" => "Σύνολο",

View File

@@ -166,6 +166,8 @@ return [
"info" => "Information",
"info_configuration" => "Shop Information",
"input_groups" => "Input Groups",
"integrations" => "Integrations",
"integrations_configuration" => "Third Party Integrations",
"invoice" => "Invoice",
"invoice_configuration" => "Invoice Print Settings",
"invoice_default_comments" => "Default Invoice Comments",
@@ -196,6 +198,13 @@ return [
"location_info" => "Location Configuration Information",
"login_form" => "Login Form Style",
"logout" => "Don't you want to make a backup before logging out? Click [OK] to backup, [Cancel] to logout.",
"mailchimp" => "MailChimp",
"mailchimp_api_key" => "MailChimp API Key",
"mailchimp_configuration" => "MailChimp Configuration",
"mailchimp_key_successfully" => "Valid API Key.",
"mailchimp_key_unsuccessfully" => "Invalid API Key.",
"mailchimp_lists" => "MailChimp List(s)",
"mailchimp_tooltip" => "Click the icon for an API key.",
"message" => "Message",
"message_configuration" => "Message Configuration",
"msg_msg" => "Saved Text Message",

View File

@@ -28,6 +28,16 @@ return [
"employee" => "Employee",
"error_adding_updating" => "Error adding/updating Customer.",
"import_items_csv" => "Customer Import from CSV",
"mailchimp_activity_click" => "Email click",
"mailchimp_activity_lastopen" => "Last open email",
"mailchimp_activity_open" => "Email open",
"mailchimp_activity_total" => "Email sent",
"mailchimp_activity_unopen" => "Email unopen",
"mailchimp_email_client" => "Email client",
"mailchimp_info" => "MailChimp",
"mailchimp_member_rating" => "Rating",
"mailchimp_status" => "Status",
"mailchimp_vip" => "VIP",
"max" => "Max spent",
"min" => "Min spent",
"new" => "New Customer",

View File

@@ -32,7 +32,6 @@ return [
"migrate_desc" => "Update the OSPOS Database.",
"office" => "Office",
"office_desc" => "List office menu modules.",
'plugins' => 'Plugins',
"receivings" => "Receivings",
"receivings_desc" => "Process Purchase Orders.",
"reports" => "Reports",

View File

@@ -1,27 +0,0 @@
<?php
return [
'actions' => 'Actions',
'active' => 'Active',
'configure' => 'Configure',
'description' => 'Description',
'disable' => 'Disable',
'disable_failed' => 'Failed to disable plugin',
'disabled' => 'Plugin disabled successfully',
'enable' => 'Enable',
'enable_failed' => 'Failed to enable plugin',
'enabled' => 'Plugin enabled successfully',
'inactive' => 'Inactive',
'management' => 'Plugin Management',
'name' => 'Plugin Name',
'no_config' => 'This plugin has no configuration options',
'no_plugins_to_display' => 'No Plugins to display',
'not_found' => 'Plugin not found',
'plugins' => 'Plugins',
'settings_save_failed' => 'Failed to save plugin settings',
'settings_saved' => 'Plugin settings saved successfully',
'status' => 'Status',
'uninstall' => 'Uninstall',
'uninstall_failed' => 'Failed to uninstall plugin',
'uninstalled' => 'Plugin uninstalled successfully',
'version' => 'Version',
];

View File

@@ -42,6 +42,7 @@ return [
"customer_discount" => "Discount",
"customer_email" => "Email",
"customer_location" => "Location",
"customer_mailchimp_status" => "MailChimp Status",
"customer_optional" => "(Required for Due Payments)",
"customer_required" => "(Required)",
"customer_total" => "Total",

View File

@@ -166,6 +166,8 @@ return [
"info" => "Information",
"info_configuration" => "Store Information",
"input_groups" => "Input Groups",
"integrations" => "Integrations",
"integrations_configuration" => "Third Party Integrations",
"invoice" => "Invoice",
"invoice_configuration" => "Invoice Print Settings",
"invoice_default_comments" => "Default Invoice Comments",
@@ -196,6 +198,13 @@ return [
"location_info" => "Location Configuration Information",
"login_form" => "Login Form Style",
"logout" => "Do you want to make a backup before logging out? Click [OK] to backup or [Cancel] to logout.",
"mailchimp" => "MailChimp",
"mailchimp_api_key" => "MailChimp API Key",
"mailchimp_configuration" => "MailChimp Configuration",
"mailchimp_key_successfully" => "API Key is valid.",
"mailchimp_key_unsuccessfully" => "API Key is invalid.",
"mailchimp_lists" => "MailChimp List(s)",
"mailchimp_tooltip" => "Click the icon for an API Key.",
"message" => "Message",
"message_configuration" => "Message Configuration",
"msg_msg" => "Saved Text Message",

View File

@@ -28,6 +28,16 @@ return [
"employee" => "Employee",
"error_adding_updating" => "Customer add or update failed.",
"import_items_csv" => "Customer Import from CSV",
"mailchimp_activity_click" => "Email click",
"mailchimp_activity_lastopen" => "Last open email",
"mailchimp_activity_open" => "Email open",
"mailchimp_activity_total" => "Email sent",
"mailchimp_activity_unopen" => "Email unopen",
"mailchimp_email_client" => "Email client",
"mailchimp_info" => "MailChimp",
"mailchimp_member_rating" => "Rating",
"mailchimp_status" => "Status",
"mailchimp_vip" => "VIP",
"max" => "Max. spent",
"min" => "Min. spent",
"new" => "New Customer",

View File

@@ -32,7 +32,6 @@ return [
"migrate_desc" => "Update the OSPOS Database.",
"office" => "Office",
"office_desc" => "List office menu modules.",
'plugins' => 'Plugins',
"receivings" => "Receivings",
"receivings_desc" => "Process Purchase Orders.",
"reports" => "Reports",

View File

@@ -1,27 +0,0 @@
<?php
return [
'actions' => 'Actions',
'active' => 'Active',
'configure' => 'Configure',
'description' => 'Description',
'disable' => 'Disable',
'disable_failed' => 'Failed to disable plugin',
'disabled' => 'Plugin disabled successfully',
'enable' => 'Enable',
'enable_failed' => 'Failed to enable plugin',
'enabled' => 'Plugin enabled successfully',
'inactive' => 'Inactive',
'management' => 'Plugin Management',
'name' => 'Plugin Name',
'no_config' => 'This plugin has no configuration options',
'no_plugins_to_display' => 'No Plugins to display',
'not_found' => 'Plugin not found',
'plugins' => 'Plugins',
'settings_save_failed' => 'Failed to save plugin settings',
'settings_saved' => 'Plugin settings saved successfully',
'status' => 'Status',
'uninstall' => 'Uninstall',
'uninstall_failed' => 'Failed to uninstall plugin',
'uninstalled' => 'Plugin uninstalled successfully',
'version' => 'Version',
];

View File

@@ -42,6 +42,7 @@ return [
"customer_discount" => "Discount",
"customer_email" => "Email",
"customer_location" => "Location",
"customer_mailchimp_status" => "MailChimp Status",
"customer_optional" => "(Required for Due Payments)",
"customer_required" => "(Required)",
"customer_total" => "Total",

View File

@@ -166,6 +166,8 @@ return [
"info" => "Información",
"info_configuration" => "Información del Comercio",
"input_groups" => "Introducir Grupos",
"integrations" => "Componentes Integrados",
"integrations_configuration" => "Componentes de Terceros Integrados",
"invoice" => "Factura",
"invoice_configuration" => "Parámetros de Impresión",
"invoice_default_comments" => "Comentarios predeterminados en la factura",
@@ -196,6 +198,13 @@ return [
"location_info" => "Información de Configuración de Ubicación",
"login_form" => "Estilo del formulario de inicio de sesión",
"logout" => "Desea hacer un respaldo antes de salir? Pulsa [OK] para respaldar o [Cancelar] para salir.",
"mailchimp" => "Correo MailChimp",
"mailchimp_api_key" => "Clave API de Mailchimp",
"mailchimp_configuration" => "Configuración de Mailchimp",
"mailchimp_key_successfully" => "Clave API correcta.",
"mailchimp_key_unsuccessfully" => "Clave API incorrecta.",
"mailchimp_lists" => "Lista(s) de Mailchimp",
"mailchimp_tooltip" => "Haga clic en el icono de una clave de API.",
"message" => "Mensajes SMS",
"message_configuration" => "Configuracion del mensaje",
"msg_msg" => "Texto del mensaje guardado",

View File

@@ -28,6 +28,16 @@ return [
"employee" => "Empleado",
"error_adding_updating" => "Error agregando/actualizando cliente.",
"import_items_csv" => "Importar Clientes desde CSV",
"mailchimp_activity_click" => "Email click",
"mailchimp_activity_lastopen" => "Último correo abierto",
"mailchimp_activity_open" => "Correo abierto",
"mailchimp_activity_total" => "Correo enviado",
"mailchimp_activity_unopen" => "Correo sin abrir",
"mailchimp_email_client" => "Correo del cliente",
"mailchimp_info" => "Correo Mailchimp",
"mailchimp_member_rating" => "Porcentaje",
"mailchimp_status" => "Estado",
"mailchimp_vip" => "VIP",
"max" => "Máx. gastado",
"min" => "Mín. gastado",
"new" => "Nuevo Cliente",

View File

@@ -32,7 +32,6 @@ return [
"migrate_desc" => "Actualizar la base de datos OSPOS.",
"office" => "Oficina",
"office_desc" => "Lista modulo de menu oficina.",
'plugins' => 'Complementos',
"receivings" => "Recepción",
"receivings_desc" => "Procesar Ordenes de Compra.",
"reports" => "Reportes",

View File

@@ -1,27 +0,0 @@
<?php
return [
'actions' => 'Acciones',
'active' => 'Activo',
'configure' => 'Configurar',
'description' => 'Descripción',
'disable' => 'Deshabilitar',
'disable_failed' => 'Error al deshabilitar el plugin',
'disabled' => 'Plugin deshabilitado correctamente',
'enable' => 'Habilitar',
'enable_failed' => 'Error al habilitar el plugin',
'enabled' => 'Plugin habilitado correctamente',
'inactive' => 'Inactivo',
'management' => 'Gestión de plugins',
'name' => 'Nombre del plugin',
'no_config' => 'Este plugin no tiene opciones de configuración',
'no_plugins_to_display' => 'No hay plugins para mostrar',
'not_found' => 'Plugin no encontrado',
'plugins' => 'Plugins',
'settings_save_failed' => 'Error al guardar la configuración del plugin',
'settings_saved' => 'Configuración del plugin guardada correctamente',
'status' => 'Estado',
'uninstall' => 'Desinstalar',
'uninstall_failed' => 'Error al desinstalar el plugin',
'uninstalled' => 'Plugin desinstalado correctamente',
'version' => 'Versión',
];

View File

@@ -42,6 +42,7 @@ return [
"customer_discount" => "Descuento",
"customer_email" => "Email",
"customer_location" => "Ubicacion",
"customer_mailchimp_status" => "Estado de Mailchimp",
"customer_optional" => "(Obligatorio para Pagos Vencidos)",
"customer_required" => "(Requerido)",
"customer_total" => "Total",

View File

@@ -166,6 +166,8 @@ return [
"info" => "Information",
"info_configuration" => "Store Information",
"input_groups" => "Grupos de Entrada",
"integrations" => "Integraciones",
"integrations_configuration" => "Integraciones Externas",
"invoice" => "Invoice",
"invoice_configuration" => "Invoice Print Settings",
"invoice_default_comments" => "Default Invoice Comments",
@@ -196,6 +198,13 @@ return [
"location_info" => "Location Configuration Information",
"login_form" => "Estilo de formulario de inicio de sesión",
"logout" => "Do you want to make a backup before logging out? Click [OK] to backup or [Cancel] to logout.",
"mailchimp" => "Mailchimp",
"mailchimp_api_key" => "Mailchimp Clave API",
"mailchimp_configuration" => "Configuración de MailChimp",
"mailchimp_key_successfully" => "API Key is valid.",
"mailchimp_key_unsuccessfully" => "API Key is invalid.",
"mailchimp_lists" => "Lista (s) de MailChimp",
"mailchimp_tooltip" => "Click the icon for an API Key.",
"message" => "Message",
"message_configuration" => "Message Configuration",
"msg_msg" => "Saved Text Message",

View File

@@ -28,6 +28,16 @@ return [
"employee" => "Empleado",
"error_adding_updating" => "Fallo al agregar o actualizar el Cliente.",
"import_items_csv" => "Importar Cliente desde CSV",
"mailchimp_activity_click" => "Click Correo Electrónico",
"mailchimp_activity_lastopen" => "Último correo electrónico abierto",
"mailchimp_activity_open" => "Correo electrónico abierto",
"mailchimp_activity_total" => "Correo electrónico enviado",
"mailchimp_activity_unopen" => "Correo electrónico sin abrir",
"mailchimp_email_client" => "cliente de correo electrónico",
"mailchimp_info" => "Mailchimp",
"mailchimp_member_rating" => "Puntaje",
"mailchimp_status" => "Estado",
"mailchimp_vip" => "VIP",
"max" => "Gasto Máximo",
"min" => "Gasto Mínimo",
"new" => "Nuevo Cliente",

View File

@@ -32,7 +32,6 @@ return [
"migrate_desc" => "Actualizar la Base de Datos de OSPOS.",
"office" => "Oficina",
"office_desc" => "Listar los módulos del menú de la oficina.",
'plugins' => 'Complementos',
"receivings" => "Recepciones",
"receivings_desc" => "Procesar Órdenes de Compra.",
"reports" => "Reportes",

View File

@@ -1,27 +0,0 @@
<?php
return [
'actions' => 'Acciones',
'active' => 'Activo',
'configure' => 'Configurar',
'description' => 'Descripción',
'disable' => 'Deshabilitar',
'disable_failed' => 'Error al deshabilitar el plugin',
'disabled' => 'Plugin deshabilitado correctamente',
'enable' => 'Habilitar',
'enable_failed' => 'Error al habilitar el plugin',
'enabled' => 'Plugin habilitado correctamente',
'inactive' => 'Inactivo',
'management' => 'Gestión de plugins',
'name' => 'Nombre del plugin',
'no_config' => 'Este plugin no tiene opciones de configuración',
'no_plugins_to_display' => 'No hay plugins para mostrar',
'not_found' => 'Plugin no encontrado',
'plugins' => 'Plugins',
'settings_save_failed' => 'Error al guardar la configuración del plugin',
'settings_saved' => 'Configuración del plugin guardada correctamente',
'status' => 'Estado',
'uninstall' => 'Desinstalar',
'uninstall_failed' => 'Error al desinstalar el plugin',
'uninstalled' => 'Plugin desinstalado correctamente',
'version' => 'Versión',
];

View File

@@ -42,6 +42,7 @@ return [
"customer_discount" => "Descuento",
"customer_email" => "Correo electrónico",
"customer_location" => "Ubicación",
"customer_mailchimp_status" => "Estado de MailChimp",
"customer_optional" => "(Obligatorio para pagos vencidos)",
"customer_required" => "(Obligatorio)",
"customer_total" => "Total",

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