Merge remote-tracking branch 'origin/master' into feature-case-sensitive-attribute-updates

This commit is contained in:
objec
2026-03-30 16:56:06 +04:00
109 changed files with 3456 additions and 1750 deletions

View File

@@ -4,6 +4,35 @@
CI_ENVIRONMENT = production
#--------------------------------------------------------------------
# SECURITY: ALLOWED HOSTNAMES
#--------------------------------------------------------------------
# IMPORTANT: Whitelist of allowed hostnames to prevent Host Header
# Injection attacks (GHSA-jchf-7hr6-h4f3).
#
# If not configured, the application will default to 'localhost',
# which may break functionality in production.
#
# Configure this with all domains/subdomains that host your application:
# - Primary domain
# - WWW subdomain (if used)
# - Any alternative domains
#
# Examples:
# Single domain:
# app.allowedHostnames.0 = 'example.com'
#
# Multiple domains:
# app.allowedHostnames.0 = 'example.com'
# app.allowedHostnames.1 = 'www.example.com'
# app.allowedHostnames.2 = 'demo.opensourcepos.org'
#
# For localhost development:
# app.allowedHostnames.0 = 'localhost'
#
# Note: Do not include the protocol (http/https) or port number.
#app.allowedHostnames.0 = ''
#--------------------------------------------------------------------
# DATABASE
#--------------------------------------------------------------------

View File

@@ -0,0 +1,72 @@
name: Update Issue Templates
on:
release:
types: [published]
workflow_dispatch:
schedule:
- cron: '0 0 * * 0'
jobs:
update-templates:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Fetch releases and update templates
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
# Fetch releases from GitHub API
RELEASES=$(gh api repos/${{ github.repository }}/releases --jq '.[].tag_name' | head -n 10)
# Create temporary file with options
OPTIONS_FILE=$(mktemp)
echo " - development (unreleased)" >> "$OPTIONS_FILE"
while IFS= read -r release; do
echo " - opensourcepos $release" >> "$OPTIONS_FILE"
done <<< "$RELEASES"
update_template() {
local template="$1"
local template_path=".github/ISSUE_TEMPLATE/$template"
# Find the line numbers for the OpensourcePOS Version dropdown
start_line=$(grep -n "label: OpensourcePOS Version" "$template_path" | cut -d: -f1)
if [ -z "$start_line" ]; then
echo "Could not find OpensourcePOS Version in $template"
return 1
fi
# Find the options section and default line
options_start=$((start_line + 3))
default_line=$(grep -n "default:" "$template_path" | awk -F: -v opts="$options_start" '$1 > opts {print $1; exit}')
# Create new template file
head -n $((options_start - 1)) "$template_path" > "${template_path}.new"
cat "$OPTIONS_FILE" >> "${template_path}.new"
tail -n +$default_line "$template_path" >> "${template_path}.new"
mv "${template_path}.new" "$template_path"
echo "Updated $template"
}
update_template "bug report.yml"
update_template "feature_request.yml"
- name: Commit and push changes
run: |
git config user.name "github-actions[bot]"
git config user.email "github-actions[bot]@users.noreply.github.com"
git add .github/ISSUE_TEMPLATE/*.yml
if git diff --staged --quiet; then
echo "No changes to commit"
else
git commit -m "Update issue templates with latest releases [skip ci]"
git push
fi

40
AGENTS.md Normal file
View File

@@ -0,0 +1,40 @@
# Agent Instructions
This document provides guidance for AI agents working on the Open Source Point of Sale (OSPOS) codebase.
## Code Style
- 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
- 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
## 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 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
- Never commit secrets, credentials, or `.env` files
- Use parameterized queries to prevent SQL injection
- Validate and sanitize all user input

3
Dockerfile.test Normal file
View File

@@ -0,0 +1,3 @@
FROM php:8.4-cli
RUN apt-get update && apt-get install -y libicu-dev && docker-php-ext-install intl
WORKDIR /app

View File

@@ -6,6 +6,36 @@
- Raspberry PI based installations proved to work, see [wiki page here](<https://github.com/opensourcepos/opensourcepos/wiki/Installing-on-Raspberry-PI---Orange-PI-(Headless-OSPOS)>).
- For Windows based installations please read [the wiki](https://github.com/opensourcepos/opensourcepos/wiki). There are closed issues about this subject, as this topic has been covered a lot.
## Security Configuration
### Allowed Hostnames (Required for Production)
OpenSourcePOS validates the Host header against a whitelist to prevent Host Header Injection attacks (GHSA-jchf-7hr6-h4f3). **You must configure this for production deployments.**
Add the following to your `.env` file:
```
app.allowedHostnames.0 = 'yourdomain.com'
app.allowedHostnames.1 = 'www.yourdomain.com'
```
**For local development**, use:
```
app.allowedHostnames.0 = 'localhost'
```
If `allowedHostnames` is not configured:
1. A security warning will be logged
2. The application will fall back to 'localhost' as the hostname
3. This means URLs generated by the application (links, redirects, etc.) will point to 'localhost'
### HTTPS Behind Proxy
If your installation is behind a proxy with SSL offloading, set:
```
FORCE_HTTPS = true
```
## Local install
First of all, if you're seeing the message `system folder missing` after launching your browser, or cannot find `database.sql`, that most likely means you have cloned the repository and have not built the project. To build the project from a source commit point instead of from an official release check out [Building OSPOS](BUILD.md). Otherwise, continue with the following steps.

View File

@@ -1,9 +1,9 @@
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
- [Security Policy](#security-policy)
- [Supported Versions](#supported-versions)
- [Security Advisories](#security-advisories)
- [Reporting a Vulnerability](#reporting-a-vulnerability)
<!-- END doctoc generated TOC please keep comment here to allow auto update -->
@@ -12,14 +12,35 @@
## Supported Versions
We release patches for security vulnerabilities. Which versions are eligible to receive such patches depend on the CVSS v3.0 Rating:
We release patches for security vulnerabilities.
| CVSS v3.0 | Supported Versions |
| --------- | -------------------------------------------------- |
| 7.3 | 3.3.5 |
| 9.8 | 3.3.6 |
| 6.8 | 3.4.2 |
| Version | Supported |
| --------- | ------------------ |
| >= 3.4.2 | :white_check_mark: |
| < 3.4.2 | :x: |
## Security Advisories
The following security vulnerabilities have been published:
### High Severity
| CVE | Vulnerability | CVSS | Published | Fixed In | Credit |
|-----|--------------|------|-----------|----------|--------|
| [CVE-2025-68434](https://github.com/opensourcepos/opensourcepos/security/advisories/GHSA-wjm4-hfwg-5w5r) | CSRF leading to Admin Creation | 8.8 | 2025-12-17 | 3.4.2 | @Nixon-H, @jekkos |
| [CVE-2025-68147](https://github.com/opensourcepos/opensourcepos/security/advisories/GHSA-xgr7-7pvw-fpmh) | Stored XSS in Return Policy | 8.1 | 2025-12-17 | 3.4.2 | @Nixon-H, @jekkos |
| [CVE-2025-66924](https://github.com/opensourcepos/opensourcepos/security/advisories/GHSA-gv8j-f6gq-g59m) | Stored XSS in Item Kits | 7.2 | 2026-03-04 | 3.4.2 | @hungnqdz, @omkaryepre |
### Medium Severity
| CVE | Vulnerability | CVSS | Published | Fixed In | Credit |
|-----|--------------|------|-----------|----------|--------|
| [CVE-2025-68658](https://github.com/opensourcepos/opensourcepos/security/advisories/GHSA-32r8-8r9r-9chw) | Stored XSS in Company Name | 4.3 | 2026-01-13 | 3.4.2 | @hungnqdz |
For a complete list including draft advisories, see our [GitHub Security Advisories page](https://github.com/opensourcepos/opensourcepos/security/advisories).
## Reporting a Vulnerability
Please report (suspected) security vulnerabilities to **[jeroen@steganos.dev](mailto:jeroen@steganos.dev)**. You will receive a response from us within 48 hours. If the issue is confirmed, we will release a patch as soon as possible depending on complexity but historically within a few days.
Please report (suspected) security vulnerabilities to **[jeroen@steganos.dev](mailto:jeroen@steganos.dev)**.
You will receive a response from us within 48 hours. If the issue is confirmed, we will release a patch as soon as possible depending on complexity but historically within a few days.

View File

@@ -55,13 +55,21 @@ class App extends BaseConfig
public string $baseURL; // Defined in the constructor
/**
* Allowed Hostnames in the Site URL other than the hostname in the baseURL.
* If you want to accept multiple Hostnames, set this.
*
* E.g.,
* When your site URL ($baseURL) is 'http://example.com/', and your site
* also accepts 'http://media.example.com/' and 'http://accounts.example.com/':
* ['media.example.com', 'accounts.example.com']
* Allowed Hostnames for the Site URL.
*
* Security: This is used to validate the HTTP Host header to prevent
* Host Header Injection attacks. If the Host header doesn't match
* an entry in this list, the request will use the first allowed hostname.
*
* IMPORTANT: This MUST be configured for production deployments.
* If empty, the application will fall back to 'localhost'.
*
* Configure via .env file:
* app.allowedHostnames.0 = 'example.com'
* app.allowedHostnames.1 = 'www.example.com'
*
* For local development:
* app.allowedHostnames.0 = 'localhost'
*
* @var list<string>
*/
@@ -284,8 +292,44 @@ class App extends BaseConfig
{
parent::__construct();
$this->https_on = (isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] == 'on') || (isset($_ENV['FORCE_HTTPS']) && $_ENV['FORCE_HTTPS'] == 'true');
$host = $this->getValidHost();
$this->baseURL = $this->https_on ? 'https' : 'http';
$this->baseURL .= '://' . ((isset($_SERVER['HTTP_HOST'])) ? $_SERVER['HTTP_HOST'] : 'localhost') . '/';
$this->baseURL .= '://' . $host . '/';
$this->baseURL .= str_replace(basename($_SERVER['SCRIPT_NAME']), '', $_SERVER['SCRIPT_NAME']);
}
/**
* Validates and returns a trusted hostname.
*
* Security: Prevents Host Header Injection attacks (GHSA-jchf-7hr6-h4f3)
* by validating the HTTP_HOST against a whitelist of allowed hostnames.
*
* @return string A validated hostname
*/
private function getValidHost(): string
{
$httpHost = $_SERVER['HTTP_HOST'] ?? 'localhost';
if (empty($this->allowedHostnames)) {
log_message('warning',
'Security: allowedHostnames is not configured. ' .
'Host header injection protection is disabled. ' .
'Please set app.allowedHostnames in your .env file. ' .
'Received Host: ' . $httpHost
);
return 'localhost';
}
if (in_array($httpHost, $this->allowedHostnames, true)) {
return $httpHost;
}
log_message('warning',
'Security: Rejected HTTP_HOST "' . $httpHost . '" - not in allowedHostnames whitelist. ' .
'Using fallback: ' . $this->allowedHostnames[0]
);
return $this->allowedHostnames[0];
}
}

View File

@@ -106,12 +106,24 @@ class Attributes extends Secure_Controller
$definition_flags |= $flag;
}
// Validate definition_group (definition_fk) foreign key
$definition_group_input = $this->request->getPost('definition_group');
$definition_fk = $this->validateDefinitionGroup($definition_group_input);
if ($definition_fk === false) {
return $this->response->setJSON([
'success' => false,
'message' => lang('Attributes.definition_invalid_group'),
'id' => NEW_ENTRY
]);
}
// Save definition data
$definition_data = [
'definition_name' => $this->request->getPost('definition_name'),
'definition_unit' => $this->request->getPost('definition_unit') != '' ? $this->request->getPost('definition_unit') : null,
'definition_flags' => $definition_flags,
'definition_fk' => $this->request->getPost('definition_group') != '' ? $this->request->getPost('definition_group') : null
'definition_fk' => $definition_fk
];
if ($this->request->getPost('definition_type') != null) {
@@ -150,6 +162,32 @@ class Attributes extends Secure_Controller
}
}
/**
* Validates a definition_group foreign key.
* Returns the validated integer ID, null if empty, or false if invalid.
*
* @param mixed $definition_group_input
* @return int|null|false
*/
private function validateDefinitionGroup(mixed $definition_group_input): int|null|false
{
if ($definition_group_input === '' || $definition_group_input === null) {
return null;
}
$definition_group_id = (int) $definition_group_input;
// Must be a positive integer, exist in attribute_definitions, and be of type GROUP
if ($definition_group_id <= 0
|| !$this->attribute->exists($definition_group_id)
|| $this->attribute->getAttributeInfo($definition_group_id)->definition_type !== GROUP
) {
return false;
}
return $definition_group_id;
}
/**
*
* @param int $definition_id

View File

@@ -36,6 +36,9 @@ class Cashups extends Secure_Controller
// filters that will be loaded in the multiselect dropdown
$data['filters'] = ['is_deleted' => lang('Cashups.is_deleted')];
// Restore filters from URL
$data = array_merge($data, restoreTableFilters($this->request));
return view('cashups/manage', $data);
}

View File

@@ -11,6 +11,7 @@ use App\Models\Appconfig;
use App\Models\Attribute;
use App\Models\Customer_rewards;
use App\Models\Dinner_table;
use App\Models\Item;
use App\Models\Module;
use App\Models\Enums\Rounding_mode;
use App\Models\Stock_location;
@@ -385,9 +386,9 @@ class Config extends Secure_Controller
'gcaptcha_enable' => $this->request->getPost('gcaptcha_enable') != null,
'gcaptcha_secret_key' => $this->request->getPost('gcaptcha_secret_key'),
'gcaptcha_site_key' => $this->request->getPost('gcaptcha_site_key'),
'suggestions_first_column' => $this->request->getPost('suggestions_first_column'),
'suggestions_second_column' => $this->request->getPost('suggestions_second_column'),
'suggestions_third_column' => $this->request->getPost('suggestions_third_column'),
'suggestions_first_column' => $this->validateSuggestionsColumn($this->request->getPost('suggestions_first_column'), 'first'),
'suggestions_second_column' => $this->validateSuggestionsColumn($this->request->getPost('suggestions_second_column'), 'other'),
'suggestions_third_column' => $this->validateSuggestionsColumn($this->request->getPost('suggestions_third_column'), 'other'),
'giftcard_number' => $this->request->getPost('giftcard_number'),
'derive_sale_quantity' => $this->request->getPost('derive_sale_quantity') != null,
'multi_pack_enabled' => $this->request->getPost('multi_pack_enabled') != null,
@@ -976,4 +977,26 @@ class Config extends Secure_Controller
return $this->response->setJSON(['success' => $success]);
}
/**
* Validates suggestions column configuration to prevent SQL injection.
*
* @param mixed $column The column value from POST
* @param string $fieldType Either 'first' or 'other' to determine default fallback
* @return string Validated column name
*/
private function validateSuggestionsColumn(mixed $column, string $fieldType): string
{
if (!is_string($column)) {
return $fieldType === 'first' ? 'name' : '';
}
$allowed = $fieldType === 'first'
? Item::ALLOWED_SUGGESTIONS_COLUMNS
: Item::ALLOWED_SUGGESTIONS_COLUMNS_WITH_EMPTY;
$fallback = $fieldType === 'first' ? 'name' : '';
return in_array($column, $allowed, true) ? $column : $fallback;
}
}

View File

@@ -38,6 +38,9 @@ class Expenses extends Secure_Controller
'is_deleted' => lang('Expenses.is_deleted')
];
// Restore filters from URL
$data = array_merge($data, restoreTableFilters($this->request));
return view('expenses/manage', $data);
}
@@ -90,16 +93,23 @@ class Expenses extends Secure_Controller
{
$data = []; // TODO: Duplicated code
$data['employees'] = [];
foreach ($this->employee->get_all()->getResult() as $employee) {
foreach (get_object_vars($employee) as $property => $value) {
$employee->$property = $value;
}
$data['employees'][$employee->person_id] = $employee->first_name . ' ' . $employee->last_name;
}
$data['expenses_info'] = $this->expense->get_info($expense_id);
$expense_id = $data['expenses_info']->expense_id;
$current_employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$can_assign_employee = $this->employee->has_grant('employees', $current_employee_id);
$data['employees'] = [];
if ($can_assign_employee) {
foreach ($this->employee->get_all()->getResult() as $employee) {
$data['employees'][$employee->person_id] = $employee->first_name . ' ' . $employee->last_name;
}
} else {
$stored_employee_id = $expense_id == NEW_ENTRY ? $current_employee_id : $data['expenses_info']->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;
$expense_categories = [];
foreach ($this->expense_category->get_all(0, 0, true)->getResultArray() as $row) {
@@ -107,11 +117,9 @@ class Expenses extends Secure_Controller
}
$data['expense_categories'] = $expense_categories;
$expense_id = $data['expenses_info']->expense_id;
if ($expense_id == NEW_ENTRY) {
$data['expenses_info']->date = date('Y-m-d H:i:s');
$data['expenses_info']->employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$data['expenses_info']->employee_id = $current_employee_id;
}
$data['payments'] = [];
@@ -152,6 +160,20 @@ class Expenses extends Secure_Controller
$date_formatter = date_create_from_format($config['dateformat'] . ' ' . $config['timeformat'], $newdate);
$current_employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$submitted_employee_id = $this->request->getPost('employee_id', FILTER_SANITIZE_NUMBER_INT);
if (!$this->employee->has_grant('employees', $current_employee_id)) {
if ($expense_id == NEW_ENTRY) {
$employee_id = $current_employee_id;
} else {
$existing_expense = $this->expense->get_info($expense_id);
$employee_id = $existing_expense->employee_id;
}
} else {
$employee_id = $submitted_employee_id;
}
$expense_data = [
'date' => $date_formatter->format('Y-m-d H:i:s'),
'supplier_id' => $this->request->getPost('supplier_id') == '' ? null : $this->request->getPost('supplier_id', FILTER_SANITIZE_NUMBER_INT),
@@ -161,7 +183,7 @@ class Expenses extends Secure_Controller
'payment_type' => $this->request->getPost('payment_type', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
'expense_category_id' => $this->request->getPost('expense_category_id', FILTER_SANITIZE_NUMBER_INT),
'description' => $this->request->getPost('description', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
'employee_id' => $this->request->getPost('employee_id', FILTER_SANITIZE_NUMBER_INT),
'employee_id' => $employee_id,
'deleted' => $this->request->getPost('deleted') != null
];

View File

@@ -36,19 +36,18 @@ class Home extends Secure_Controller
/**
* Load "change employee password" form
*
* @return string
* @return ResponseInterface|string
* @noinspection PhpUnused
*/
public function getChangePassword(int $employeeId = NEW_ENTRY): string
public function getChangePassword(int $employeeId = NEW_ENTRY)
{
$loggedInEmployee = $this->employee->get_logged_in_employee_info();
$currentPersonId = $loggedInEmployee->person_id;
$employeeId = $employeeId === NEW_ENTRY ? $currentPersonId : $employeeId;
if (!$this->employee->can_modify_employee($employeeId, $currentPersonId)) {
header('Location: ' . base_url('no_access/home/home'));
exit();
if (!$this->employee->isAdmin($currentPersonId) && $employeeId !== $currentPersonId) {
return $this->response->setStatusCode(403)->setBody(lang('Employees.unauthorized_modify'));
}
$person_info = $this->employee->get_info($employeeId);
@@ -71,7 +70,7 @@ class Home extends Secure_Controller
$employeeId = $employeeId === NEW_ENTRY ? $currentUser->person_id : $employeeId;
if (!$this->employee->can_modify_employee($employeeId, $currentUser->person_id)) {
if (!$this->employee->isAdmin($currentUser->person_id) && $employeeId !== $currentUser->person_id) {
return $this->response->setStatusCode(403)->setJSON([
'success' => false,
'message' => lang('Employees.unauthorized_modify')

View File

@@ -71,7 +71,12 @@ class Items extends Secure_Controller
$this->session->set('allow_temp_items', 0);
$data['table_headers'] = get_items_manage_table_headers();
$data['stock_location'] = $this->item_lib->get_item_location();
// Restore stock_location from URL or session
$stockLocation = $this->request->getGet('stock_location', FILTER_SANITIZE_NUMBER_INT);
$data['stock_location'] = $stockLocation
? $stockLocation
: $this->item_lib->get_item_location();
$data['stock_locations'] = $this->stock_location->get_allowed_locations();
// Filters that will be loaded in the multiselect dropdown
@@ -85,6 +90,9 @@ class Items extends Secure_Controller
'temporary' => lang('Items.temp')
];
// Restore filters from URL
$data = array_merge($data, restoreTableFilters($this->request));
return view('items/manage', $data);
}

View File

@@ -241,15 +241,26 @@ class Receivings extends Secure_Controller
$data['suppliers'][$supplier->person_id] = $supplier->first_name . ' ' . $supplier->last_name;
}
$receiving_info = $this->receiving->get_info($receiving_id)->getRowArray();
$current_employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$can_assign_employee = $this->employee->has_grant('employees', $current_employee_id);
$data['employees'] = [];
foreach ($this->employee->get_all()->getResult() as $employee) {
$data['employees'][$employee->person_id] = $employee->first_name . ' ' . $employee->last_name;
if ($can_assign_employee) {
foreach ($this->employee->get_all()->getResult() as $employee) {
$data['employees'][$employee->person_id] = $employee->first_name . ' ' . $employee->last_name;
}
} else {
$stored_employee_id = $receiving_info['employee_id'];
$stored_employee = $this->employee->get_info($stored_employee_id);
$data['employees'][$stored_employee_id] = $stored_employee->first_name . ' ' . $stored_employee->last_name;
}
$receiving_info = $this->receiving->get_info($receiving_id)->getRowArray();
$data['selected_supplier_name'] = !empty($receiving_info['supplier_id']) ? $receiving_info['company_name'] : '';
$data['selected_supplier_id'] = $receiving_info['supplier_id'];
$data['receiving_info'] = $receiving_info;
$data['can_assign_employee'] = $can_assign_employee;
return view('receivings/form', $data);
}
@@ -491,10 +502,20 @@ class Receivings extends Secure_Controller
$date_formatter = date_create_from_format($this->config['dateformat'] . ' ' . $this->config['timeformat'], $newdate);
$receiving_time = $date_formatter->format('Y-m-d H:i:s');
$current_employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$submitted_employee_id = $this->request->getPost('employee_id', FILTER_SANITIZE_NUMBER_INT);
if (!$this->employee->has_grant('employees', $current_employee_id)) {
$existing_receiving = $this->receiving->get_info($receiving_id)->getRowArray();
$employee_id = $existing_receiving['employee_id'];
} else {
$employee_id = $submitted_employee_id;
}
$receiving_data = [
'receiving_time' => $receiving_time,
'supplier_id' => $this->request->getPost('supplier_id') ? $this->request->getPost('supplier_id', FILTER_SANITIZE_NUMBER_INT) : null,
'employee_id' => $this->request->getPost('employee_id', FILTER_SANITIZE_NUMBER_INT),
'employee_id' => $employee_id,
'comment' => $this->request->getPost('comment', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
'reference' => $this->request->getPost('reference') != '' ? $this->request->getPost('reference', FILTER_SANITIZE_FULL_SPECIAL_CHARS) : null
];

View File

@@ -1776,7 +1776,7 @@ class Reports extends Secure_Controller
{
$this->clearCache();
$definition_names = $this->attribute->get_definitions_by_flags(attribute::SHOW_IN_SALES);
$definition_names = $this->attribute->get_definitions_by_flags(attribute::SHOW_IN_SALES, true);
$inputs = [
'start_date' => $start_date,
@@ -1789,7 +1789,12 @@ class Reports extends Secure_Controller
$this->detailed_sales->create($inputs);
$columns = $this->detailed_sales->getDataColumns();
$columns['details'] = array_merge($columns['details'], $definition_names);
// Extract just names for column headers
$definitionHeaders = [];
foreach ($definition_names as $definition_id => $definitionInfo) {
$definitionHeaders[$definition_id] = $definitionInfo['name'];
}
$columns['details'] = array_merge($columns['details'], $definitionHeaders);
$headers = $columns;
@@ -1930,14 +1935,19 @@ class Reports extends Secure_Controller
{
$this->clearCache();
$definition_names = $this->attribute->get_definitions_by_flags(attribute::SHOW_IN_RECEIVINGS);
$definition_names = $this->attribute->get_definitions_by_flags(attribute::SHOW_IN_RECEIVINGS, true);
$inputs = ['start_date' => $start_date, 'end_date' => $end_date, 'receiving_type' => $receiving_type, 'location_id' => $location_id, 'definition_ids' => array_keys($definition_names)];
$this->detailed_receivings->create($inputs);
$columns = $this->detailed_receivings->getDataColumns();
$columns['details'] = array_merge($columns['details'], $definition_names);
// Extract just names for column headers
$definitionHeaders = [];
foreach ($definition_names as $definition_id => $definitionInfo) {
$definitionHeaders[$definition_id] = $definitionInfo['name'];
}
$columns['details'] = array_merge($columns['details'], $definitionHeaders);
$headers = $columns;
$report_data = $this->detailed_receivings->getData($inputs);

View File

@@ -75,15 +75,15 @@ class Sales extends Secure_Controller
/**
* Load the sale edit modal. Used in app/Views/sales/register.php.
*
* @return string
* @return ResponseInterface|string
* @noinspection PhpUnused
*/
public function getManage(): string
public function getManage(): ResponseInterface|string
{
$person_id = $this->session->get('person_id');
$personId = $this->session->get('person_id');
if (!$this->employee->has_grant('reports_sales', $person_id)) {
redirect('no_access/sales/reports_sales');
if (!$this->employee->has_grant('reports_sales', $personId)) {
return redirect()->to('no_access/sales/reports_sales');
} else {
$data['table_headers'] = get_sales_manage_table_headers();
@@ -92,18 +92,31 @@ class Sales extends Secure_Controller
'only_due' => lang('Sales.due_filter'),
'only_check' => lang('Sales.check_filter'),
'only_creditcard' => lang('Sales.credit_filter'),
'only_debit' => lang('Sales.debit'),
'only_invoices' => lang('Sales.invoice_filter'),
'selected_customer' => lang('Sales.selected_customer')
];
if ($this->sale_lib->get_customer() != -1) {
$selected_filters = ['selected_customer'];
$selectedFilters = ['selected_customer'];
$data['customer_selected'] = true;
} else {
$data['customer_selected'] = false;
$selected_filters = [];
$selectedFilters = [];
}
$data['selected_filters'] = $selected_filters;
// Restore filters from URL query string
$filters = restoreTableFilters($this->request);
if (!empty($filters['selected_filters'])) {
$selectedFilters = array_merge($selectedFilters, $filters['selected_filters']);
}
if (isset($filters['start_date'])) {
$data['start_date'] = $filters['start_date'];
}
if (isset($filters['end_date'])) {
$data['end_date'] = $filters['end_date'];
}
$data['selected_filters'] = $selectedFilters;
return view('sales/manage', $data);
}
@@ -142,6 +155,7 @@ class Sales extends Secure_Controller
'only_check' => false,
'selected_customer' => false,
'only_creditcard' => false,
'only_debit' => false,
'only_invoices' => $this->config['invoice_enable'] && $this->request->getGet('only_invoices', FILTER_SANITIZE_NUMBER_INT),
'is_valid_receipt' => $this->sale->is_valid_receipt($search)
];

View File

@@ -408,7 +408,7 @@ function get_items_manage_table_headers(): string
{
$attribute = model(Attribute::class);
$config = config(OSPOS::class)->settings;
$definition_names = $attribute->get_definitions_by_flags($attribute::SHOW_IN_ITEMS); // TODO: this should be made into a constant in constants.php
$definitionsWithTypes = $attribute->get_definitions_by_flags($attribute::SHOW_IN_ITEMS, true);
$headers = item_headers();
@@ -420,8 +420,8 @@ function get_items_manage_table_headers(): string
$headers[] = ['item_pic' => lang('Items.image'), 'sortable' => false];
foreach ($definition_names as $definition_id => $definition_name) {
$headers[] = [$definition_id => $definition_name, 'sortable' => false];
foreach ($definitionsWithTypes as $definition_id => $definitionInfo) {
$headers[] = [$definition_id => $definitionInfo['name'], 'sortable' => false];
}
$headers[] = ['inventory' => '', 'escape' => false];
@@ -479,7 +479,7 @@ function get_item_data_row(object $item): array
$item->name .= NAME_SEPARATOR . $item->pack_name;
}
$definition_names = $attribute->get_definitions_by_flags($attribute::SHOW_IN_ITEMS);
$definition_names = $attribute->get_definitions_by_flags($attribute::SHOW_IN_ITEMS, true);
$columns = [
'items.item_id' => $item->item_id,
@@ -634,7 +634,7 @@ function parse_attribute_values(array $columns, array $row): array
}
/**
* @param array $definition_names
* @param array $definition_names Array of definition_id => ['name' => name, 'type' => type] or definition_id => name
* @param array $row
* @return array
*/
@@ -651,10 +651,16 @@ function expand_attribute_values(array $definition_names, array $row): array
}
$attribute_values = [];
foreach ($definition_names as $definition_id => $definition_name) {
foreach ($definition_names as $definition_id => $definitionInfo) {
if (isset($indexed_values[$definition_id])) {
$attribute_value = $indexed_values[$definition_id];
$attribute_values["$definition_id"] = $attribute_value;
$raw_value = $indexed_values[$definition_id];
// Format DECIMAL attributes according to locale
if (is_array($definitionInfo) && isset($definitionInfo['type']) && $definitionInfo['type'] === DECIMAL) {
$attribute_values["$definition_id"] = to_decimals($raw_value);
} else {
$attribute_values["$definition_id"] = $raw_value;
}
} else {
$attribute_values["$definition_id"] = "";
}
@@ -925,3 +931,24 @@ function get_controller(): string
$controller_name_parts = explode('\\', $controller_name);
return end($controller_name_parts);
}
/**
* Restores filter values from URL query string.
*
* @param CodeIgniter\HTTP\IncomingRequest $request The request object
* @return array Array with 'start_date', 'end_date', and 'selected_filters' keys
*/
function restoreTableFilters($request): array
{
$startDate = $request->getGet('start_date', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$endDate = $request->getGet('end_date', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$urlFilters = $request->getGet('filters', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
return array_filter([
'start_date' => $startDate ?: null,
'end_date' => $endDate ?: null,
'selected_filters' => $urlFilters ?? []
], function($value) {
return $value !== null && $value !== [];
});
}

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "هل أنت متأكد من أنك تريد حذف الميزات المحددة ؟",
"confirm_restore" => "هل أنت متأكد من أنك تريد استعادة السمة (السمات) المحددة؟",
"definition_cannot_be_deleted" => "لا يمكن حذف السمات المحددة",
"definition_invalid_group" => "المجموعة المحددة غير موجودة أو غير صالحة.",
"definition_error_adding_updating" => "لا يمكن إضافة السمة {0} أو تحديثها. يرجى التحقق من سجل الخطأ.",
"definition_flags" => "رؤية الميزات",
"definition_group" => "المجموعة",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "هل أنت متأكد من أنك تريد حذف الميزات المحددة ؟",
"confirm_restore" => "هل أنت متأكد من أنك تريد استعادة السمة (السمات) المحددة؟",
"definition_cannot_be_deleted" => "لا يمكن حذف السمات المحددة",
"definition_invalid_group" => "المجموعة المحددة غير موجودة أو غير صالحة.",
"definition_error_adding_updating" => "لا يمكن إضافة السمة {0} أو تحديثها. يرجى التحقق من سجل الخطأ.",
"definition_flags" => "رؤية الميزات",
"definition_group" => "المجموعة",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Seçilmiş Atributları silmək istədiyinizdən əminsinizmi?",
"confirm_restore" => "Seçilmiş atributları bərpa etmək istədiyinizə əminsinizmi?",
"definition_cannot_be_deleted" => "Seçilmiş xüsusiyyətləri silmək olmadı",
"definition_invalid_group" => "",
"definition_error_adding_updating" => "{0} -in atributları əlavə oluna və yenilənə bilmədi. Lütfən XƏTA loq faylını yoxlayın.",
"definition_flags" => "Atribut görünüşü",
"definition_group" => "Qrup",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "",
"confirm_restore" => "",
"definition_cannot_be_deleted" => "",
"definition_invalid_group" => "",
"definition_error_adding_updating" => "",
"definition_flags" => "",
"definition_group" => "",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Da li ste sigurni da želite da izbrišete izabrani atribut?",
"confirm_restore" => "Da li ste sigurni da želite vratiti izabrane atribute?",
"definition_cannot_be_deleted" => "Nije moguće izbrisati izabrane atribut",
"definition_invalid_group" => "",
"definition_error_adding_updating" => "Atribut {0} nije moguće dodati ili ažurirati. Molimo provjerite dnevnik grešaka.",
"definition_flags" => "Vidljivost atributa",
"definition_group" => "Grupa",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "ئایا دڵنیای کە دەتەوێت تایبەتمەندییە هەڵبژێردراوەکە(کان) بسڕیتەوە؟",
"confirm_restore" => "ئایا دڵنیای کە دەتەوێت تایبەتمەندییە هەڵبژێردراوەکە(کان) بگەڕێنیتەوە؟",
"definition_cannot_be_deleted" => "نەتوانرا تایبەتمەندی هەڵبژێردراو بسڕدرێتەوە",
"definition_invalid_group" => "",
"definition_error_adding_updating" => "تایبەتمەندی {0} نەتوانرا زیاد بکرێت یان نوێ بکرێتەوە. تکایە لیستی هەڵەکان بپشکنە.",
"definition_flags" => "توانای بینراویی تایبەتمەندی",
"definition_group" => "گروپ",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "",
"confirm_restore" => "",
"definition_cannot_be_deleted" => "",
"definition_invalid_group" => "",
"definition_error_adding_updating" => "",
"definition_flags" => "",
"definition_group" => "",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Er du sikker på, at du vil slette de valgte egenskaber?",
"confirm_restore" => "Er du sikker på, at du vil gendanne de valgte egenskaber?",
"definition_cannot_be_deleted" => "De valgte egenskaber kunne ikke slettes",
"definition_invalid_group" => "Den valgte gruppe findes ikke eller er ugyldig.",
"definition_error_adding_updating" => "Egenskab {0} Kunne ikke tilføjes eller opdateres. Tjek venligst fejlprotokollen.",
"definition_flags" => "Egenskabens Synlighed",
"definition_group" => "Gruppe",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "",
"confirm_restore" => "",
"definition_cannot_be_deleted" => "",
"definition_invalid_group" => "Die ausgewählte Gruppe existiert nicht oder ist ungültig.",
"definition_error_adding_updating" => "",
"definition_flags" => "",
"definition_group" => "",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Sind Sie sicher, dass Sie die ausgewählten Attribute löschen möchten?",
"confirm_restore" => "Sind Sie sicher, dass Sie die ausgewählten Attribute wiederherstellen möchten?",
"definition_cannot_be_deleted" => "Ausgewählte Attribute konnten nicht gelöscht werden",
"definition_invalid_group" => "Die ausgewählte Gruppe existiert nicht oder ist ungültig.",
"definition_error_adding_updating" => "Das Attribut {0} konnte nicht hinzugefügt oder aktualisiert werden. Bitte überprüfen Sie den Error-Log.",
"definition_flags" => "Attribut Sichtbarkeit",
"definition_group" => "Gruppe",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Είστε βέβαιοι ότι θέλετε να διαγράψετε τα επιλεγμένα χαρακτηριστικά;",
"confirm_restore" => "Είστε βέβαιοι ότι θέλετε να επαναφέρετε τα επιλεγμένα χαρακτηριστικά;",
"definition_cannot_be_deleted" => "Δεν ήταν δυνατή η διαγραφή των επιλεγμένων χαρακτηριστικών",
"definition_invalid_group" => "Η επιλεγμένη ομάδα δεν υπάρχει ή δεν είναι έγκυρη.",
"definition_error_adding_updating" => "Το χαρακτηριστικό {0} δεν ήταν δυνατό να προστεθεί ή να ενημερωθεί. Ελέγξτε το αρχείο καταγραφής σφαλμάτων.",
"definition_flags" => "Ορατότητα χαρακτηριστικών",
"definition_group" => "Ομάδα",

View File

@@ -6,6 +6,7 @@ return [
"confirm_restore" => "Are you sure you want to restore the selected attribute(s)?",
"definition_cannot_be_deleted" => "Could not delete selected attribute(s)",
"definition_error_adding_updating" => "Attribute {0} could not be added or updated. Please check the error log.",
"definition_invalid_group" => "The selected group does not exist or is invalid.",
"definition_flags" => "Attribute Visibility",
"definition_group" => "Group",
"definition_id" => "Id",

View File

@@ -6,6 +6,7 @@ return [
"confirm_restore" => "Are you sure you want to restore the selected attribute(s)?",
"definition_cannot_be_deleted" => "Could not delete selected attribute(s)",
"definition_error_adding_updating" => "Attribute {0} could not be added or updated. Please check the error log.",
"definition_invalid_group" => "The selected group does not exist or is invalid.",
"definition_flags" => "Attribute Visibility",
"definition_group" => "Group",
"definition_id" => "Id",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "¿Está seguro de que desea borrar los atributos seleccionados?",
"confirm_restore" => "¿Está seguro de que desea restaurar los atributos seleccionados?",
"definition_cannot_be_deleted" => "No se han podido borrar los atributos seleccionados",
"definition_invalid_group" => "El grupo seleccionado no existe o no es válido.",
"definition_error_adding_updating" => "El atributo {0} no pudo ser agregado o actulizado. Por favor compruebe el registro de errores.",
"definition_flags" => "Visibilidad del atributo",
"definition_group" => "Grupo",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "¿Está seguro de eliminar el/los atributo(s) seleccionado(s)?",
"confirm_restore" => "¿Está seguro que quiere restaurar los atributos seleccionados?",
"definition_cannot_be_deleted" => "No ha sido posible eliminar el/los atributo(s) seleccionado(s)",
"definition_invalid_group" => "El grupo seleccionado no existe o no es válido.",
"definition_error_adding_updating" => "El atributo {0} no pudo ser agregado o actualizado. Favor de revisar el registro de errorres.",
"definition_flags" => "Visibilidad del atributo",
"definition_group" => "Grupo",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "آیا مطمئن هستید که می خواهید ویژگی (های) انتخاب شده را حذف کنید؟",
"confirm_restore" => "آیا مطمئن هستید که می خواهید ویژگی (های) انتخاب شده را بازیابی کنید؟",
"definition_cannot_be_deleted" => "نمی توان ویژگی (های) انتخابی را حذف کرد",
"definition_invalid_group" => "گروه انتخاب شده وجود ندارد یا نامعتبر است.",
"definition_error_adding_updating" => "ویژگی{0} اضافه نشد یا به روز نمی شود. لطفا گزارش خطا را بررسی کنید.",
"definition_flags" => "قابلیت مشاهده ویژگی",
"definition_group" => "گروه",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Êtes-vous certain de vouloir supprimer le(s) attribut(s) sélectionné(s) ?",
"confirm_restore" => "Êtes-vous certain de vouloir restaurer le(s) attribut(s) sélectionné(s) ?",
"definition_cannot_be_deleted" => "Le(s) attribut(s) sélectionné(s) n'ont pas pu être supprimé(s)",
"definition_invalid_group" => "Le groupe sélectionné n'existe pas ou est invalide.",
"definition_error_adding_updating" => "L'attribut {0} n'a pas pu être ajouté ou mis à jour. Veuillez vérifier le journal d'erreurs.",
"definition_flags" => "Visibilité de l'attribut",
"definition_group" => "Groupe",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "האם אתה בטוח שברצונך למחוק את המאפיינים שנבחרו?",
"confirm_restore" => "האם אתה בטוח שברצונך לשחזר את המאפיינים שנבחרו?",
"definition_cannot_be_deleted" => "לא ניתן למחוק מאפיינים נבחר(ים)",
"definition_invalid_group" => "הקבוצה שנבחרה לא קיימת או אינה תקינה.",
"definition_error_adding_updating" => "לא ניתן להוסיף או לעדכן את הערך {0}. בדוק את יומן השגיאות.",
"definition_flags" => "מאפיין גלוי",
"definition_group" => "קבוצה",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "",
"confirm_restore" => "",
"definition_cannot_be_deleted" => "",
"definition_invalid_group" => "",
"definition_error_adding_updating" => "",
"definition_flags" => "",
"definition_group" => "",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Biztosan törli szeretné a kijelölt tulajdonságokat?",
"confirm_restore" => "Biztosan visszaállítja a kijelölt tulajdonságokat?",
"definition_cannot_be_deleted" => "Nem sikerült törölni a kijelölt tulajdonságokat",
"definition_invalid_group" => "A kiválasztott csoport nem létezik vagy érvénytelen.",
"definition_error_adding_updating" => "{0} attribútum nem adható hozzá és nem frissíthető. Kérjük, ellenőrizze a hibanaplót.",
"definition_flags" => "Tulajdonság láthatósága",
"definition_group" => "Csoport",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Are you sure you want to delete the selected attribute(s)?",
"confirm_restore" => "Are you sure you want to restore the selected attribute(s)?",
"definition_cannot_be_deleted" => "Could not delete selected attribute(s)",
"definition_invalid_group" => "",
"definition_error_adding_updating" => "Attribute {0} could not be added or updated. Please check the error log.",
"definition_flags" => "Attribute Visibility",
"definition_group" => "Group",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Apakah Anda yakin ingin menghapus atribut tersebut?",
"confirm_restore" => "Apakah Anda yakin ingin mengembalikan atribut tersebut?",
"definition_cannot_be_deleted" => "Tidak bisa menghapus atribut terpilih",
"definition_invalid_group" => "Grup yang dipilih tidak ada atau tidak valid.",
"definition_error_adding_updating" => "Atribut {0} tidak dapat ditambah atau diperbaharui. Silahkan periksa log kesalahan.",
"definition_flags" => "Visibilitas Atribut",
"definition_group" => "Grup",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Sei sicuro di voler eliminare gli attributi selezionati?",
"confirm_restore" => "Sei sicuro di voler ripristinare l'attributo selezionato?",
"definition_cannot_be_deleted" => "Non riesco a cancellare l'attributo selezionato",
"definition_invalid_group" => "Il gruppo selezionato non esiste o non è valido.",
"definition_error_adding_updating" => "Impossibile aggiungere o aggiornare l'attributo {0}. Si prega di controllare il registro degli errori.",
"definition_flags" => "Visibilità attributo",
"definition_group" => "Gruppo",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "តើអ្នកពិតជាចង់លុប ព៌តមានបន្ថែម ដែលបានជ្រើសរើស?",
"confirm_restore" => "តើអ្នកពិតជាដាក់ឡើងវិញនៅ ព៌តមានបន្ថែម ដែលបានជ្រើសរើស?",
"definition_cannot_be_deleted" => "មិនអាចលុបព៌តមានបន្ថែមដែលបានជ្រើសរើស",
"definition_invalid_group" => "",
"definition_error_adding_updating" => "ព៌តមានបន្ថែម {0} មិនអាចថែម រឺកែប្រែបានឡើយ។​ សូមចូលទៅឆែករបាយការណ៍កំហុស។",
"definition_flags" => "ដាក់បង្ហាញព៌តមានបន្ថែម",
"definition_group" => "ក្រុម",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "ແນ່ໃຈຫຼືບໍທີ່ຈະລືບລາຍການທີ່ເລືອກ",
"confirm_restore" => "ແນ່ໃຈຫຼືບໍທີ່ຈະຄືນຄ່າແອັດທິບິ້ວດັ່ງກ່າວ?",
"definition_cannot_be_deleted" => "ບໍສາມາດລືບລາຍການທີ່ເລືອກໄດ້",
"definition_invalid_group" => "",
"definition_error_adding_updating" => "ລາຍການ {0} ບໍສາມາດເພີ່ມ ຫຼື ແກ້ໄຂ. ກະລຸນາກວດສອບຢູ່ log ຂໍ້ຜິດຜາດ",
"definition_flags" => "ຄູນສົມບັດການເບິ່ງເຫັນ",
"definition_group" => "ກຸ່ມ",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Are you sure you want to delete the selected attribute(s)?",
"confirm_restore" => "",
"definition_cannot_be_deleted" => "Could not delete selected attribute(s)",
"definition_invalid_group" => "",
"definition_error_adding_updating" => "",
"definition_flags" => "Attribute Visibility",
"definition_group" => "Group",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Are you sure you want to delete the selected attribute(s)?",
"confirm_restore" => "Are you sure you want to restore the selected attribute(s)?",
"definition_cannot_be_deleted" => "Could not delete selected attribute(s)",
"definition_invalid_group" => "",
"definition_error_adding_updating" => "Attribute {0} could not be added or updated. Please check the error log.",
"definition_flags" => "Attribute Visibility",
"definition_group" => "Group",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Bent u zeker dat u de geselecteerde attributen wil verwijderen?",
"confirm_restore" => "Bent u zeker dat u de geselecteerde attributen wil herstellen?",
"definition_cannot_be_deleted" => "De geselecteerde attributen konden niet verwijderd worden",
"definition_invalid_group" => "De geselecteerde groep bestaat niet of is ongeldig.",
"definition_error_adding_updating" => "Attribuut {0} kon niet toegevoegd of gewijzigd worden. Kijk de error logs na.",
"definition_flags" => "Zichtbaarheid",
"definition_group" => "Groep",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Weet u zeker dat u de geselecteerde kenmerken wilt verwijderen?",
"confirm_restore" => "Weet u zeker dat u de geselecteerde kenmerken wilt herstellen?",
"definition_cannot_be_deleted" => "Kan geselecteerde kenmerk(en) niet verwijderen",
"definition_invalid_group" => "De geselecteerde groep bestaat niet of is ongeldig.",
"definition_error_adding_updating" => "Kenmerk {0} kan niet worden toegevoegd of bijgewerkt. Bekijk het foutenlogboek.",
"definition_flags" => "Kenmerk zichtbaarheid",
"definition_group" => "Groep",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Czy jesteś pewny, że chcesz usunąć wybrane atrybuty?",
"confirm_restore" => "Czy jesteś pewien, że chcesz przywrócić zaznaczone atrybuty?",
"definition_cannot_be_deleted" => "Nie można usunąć wybranych atrybutów",
"definition_invalid_group" => "Wybrana grupa nie istnieje lub jest nieprawidłowa.",
"definition_error_adding_updating" => "Atrybut 51 nie może zostać dodany lub zaktualizowany. Sprawdź dziennik błędów.",
"definition_flags" => "Widoczność atrybutu",
"definition_group" => "Grupa",

View File

@@ -1,50 +1,50 @@
<?php
return [
"amount" => "Liczba",
"amount_number" => "",
"amount_required" => "",
"cancel_cashups" => "",
"cancel_cashups_enter" => "",
"cannot_be_deleted" => "",
"cash_difference" => "",
"close_date" => "",
"close_employee" => "",
"closed_amount_card" => "",
"closed_amount_cash" => "",
"closed_amount_check" => "",
"closed_amount_due" => "",
"closed_amount_giftcard" => "",
"closed_amount_total" => "",
"closed_date" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"confirm_submit" => "",
"date_number" => "",
"date_required" => "",
"description" => "",
"enable_expected" => "",
"error_adding_updating" => "",
"giftcard" => "",
"id" => "",
"info" => "",
"info_employee" => "",
"is_deleted" => "",
"new" => "",
"no_cashups_to_display" => "",
"none_selected" => "",
"note" => "",
"one_or_multiple" => "",
"open_amount_cash" => "",
"open_date" => "",
"open_employee" => "",
"opened_date" => "",
"successful_adding" => "",
"successful_deleted" => "",
"successful_updating" => "",
"total" => "",
"transfer_amount_cash" => "",
"transfer_amount_cash_minus" => "",
"update" => "",
"warning" => "",
'amount' => "Liczba",
'amount_number' => "",
'amount_required' => "",
'cancel_cashups' => "",
'cancel_cashups_enter' => "",
'cannot_be_deleted' => "",
'cash_difference' => "",
'close_date' => "",
'close_employee' => "",
'closed_amount_card' => "",
'closed_amount_cash' => "",
'closed_amount_check' => "",
'closed_amount_due' => "",
'closed_amount_giftcard' => "",
'closed_amount_total' => "",
'closed_date' => "",
'confirm_delete' => "",
'confirm_restore' => "",
'confirm_submit' => "",
'date_number' => "",
'date_required' => "",
'description' => "Opis",
'enable_expected' => "",
'error_adding_updating' => "",
'giftcard' => "",
'id' => "",
'info' => "",
'info_employee' => "",
'is_deleted' => "",
'new' => "",
'no_cashups_to_display' => "",
'none_selected' => "",
'note' => "",
'one_or_multiple' => "",
'open_amount_cash' => "",
'open_date' => "",
'open_employee' => "",
'opened_date' => "",
'successful_adding' => "",
'successful_deleted' => "",
'successful_updating' => "",
'total' => "",
'transfer_amount_cash' => "",
'transfer_amount_cash_minus' => "",
'update' => "",
'warning' => "",
];

View File

@@ -1,331 +1,331 @@
<?php
return [
"address" => "",
"address_required" => "",
"all_set" => "All file permissions are set correctly!",
"allow_duplicate_barcodes" => "",
"apostrophe" => "",
"backup_button" => "",
"backup_database" => "",
"barcode" => "",
"barcode_company" => "",
"barcode_configuration" => "",
"barcode_content" => "",
"barcode_first_row" => "",
"barcode_font" => "",
"barcode_formats" => "",
"barcode_generate_if_empty" => "",
"barcode_height" => "",
"barcode_id" => "",
"barcode_info" => "",
"barcode_layout" => "",
"barcode_name" => "",
"barcode_number" => "",
"barcode_number_in_row" => "",
"barcode_page_cellspacing" => "",
"barcode_page_width" => "",
"barcode_price" => "",
"barcode_second_row" => "",
"barcode_third_row" => "",
"barcode_tooltip" => "",
"barcode_type" => "",
"barcode_width" => "",
"bottom" => "",
"cash_button" => "",
"cash_button_1" => "",
"cash_button_2" => "",
"cash_button_3" => "",
"cash_button_4" => "",
"cash_button_5" => "",
"cash_button_6" => "",
"cash_decimals" => "",
"cash_decimals_tooltip" => "",
"cash_rounding" => "",
"category_dropdown" => "",
"center" => "",
"change_apperance_tooltip" => "",
"comma" => "",
"company" => "",
"company_avatar" => "",
"company_change_image" => "",
"company_logo" => "",
"company_remove_image" => "",
"company_required" => "",
"company_select_image" => "",
"company_website_url" => "",
"country_codes" => "",
"country_codes_tooltip" => "",
"currency_code" => "",
"currency_decimals" => "",
"currency_symbol" => "",
"current_employee_only" => "",
"customer_reward" => "",
"customer_reward_duplicate" => "",
"customer_reward_enable" => "",
"customer_reward_invalid_chars" => "",
"customer_reward_required" => "",
"customer_sales_tax_support" => "",
"date_or_time_format" => "",
"datetimeformat" => "",
"decimal_point" => "",
"default_barcode_font_size_number" => "",
"default_barcode_font_size_required" => "",
"default_barcode_height_number" => "",
"default_barcode_height_required" => "",
"default_barcode_num_in_row_number" => "",
"default_barcode_num_in_row_required" => "",
"default_barcode_page_cellspacing_number" => "",
"default_barcode_page_cellspacing_required" => "",
"default_barcode_page_width_number" => "",
"default_barcode_page_width_required" => "",
"default_barcode_width_number" => "",
"default_barcode_width_required" => "",
"default_item_columns" => "",
"default_origin_tax_code" => "",
"default_receivings_discount" => "",
"default_receivings_discount_number" => "",
"default_receivings_discount_required" => "",
"default_sales_discount" => "",
"default_sales_discount_number" => "",
"default_sales_discount_required" => "",
"default_tax_category" => "",
"default_tax_code" => "",
"default_tax_jurisdiction" => "",
"default_tax_name_number" => "",
"default_tax_name_required" => "",
"default_tax_rate" => "",
"default_tax_rate_1" => "",
"default_tax_rate_2" => "",
"default_tax_rate_3" => "",
"default_tax_rate_number" => "",
"default_tax_rate_required" => "",
"derive_sale_quantity" => "",
"derive_sale_quantity_tooltip" => "",
"dinner_table" => "",
"dinner_table_duplicate" => "",
"dinner_table_enable" => "",
"dinner_table_invalid_chars" => "",
"dinner_table_required" => "",
"dot" => "",
"email" => "",
"email_configuration" => "",
"email_mailpath" => "",
"email_protocol" => "",
"email_receipt_check_behaviour" => "",
"email_receipt_check_behaviour_always" => "",
"email_receipt_check_behaviour_last" => "",
"email_receipt_check_behaviour_never" => "",
"email_smtp_crypto" => "",
"email_smtp_host" => "",
"email_smtp_pass" => "",
"email_smtp_port" => "",
"email_smtp_timeout" => "",
"email_smtp_user" => "",
"enable_avatar" => "",
"enable_avatar_tooltip" => "",
"enable_dropdown_tooltip" => "",
"enable_new_look" => "",
"enable_right_bar" => "",
"enable_right_bar_tooltip" => "",
"enforce_privacy" => "",
"enforce_privacy_tooltip" => "",
"fax" => "",
"file_perm" => "There are problems with file permissions please fix and reload this page.",
"financial_year" => "",
"financial_year_apr" => "",
"financial_year_aug" => "",
"financial_year_dec" => "",
"financial_year_feb" => "",
"financial_year_jan" => "",
"financial_year_jul" => "",
"financial_year_jun" => "",
"financial_year_mar" => "",
"financial_year_may" => "",
"financial_year_nov" => "",
"financial_year_oct" => "",
"financial_year_sep" => "",
"floating_labels" => "",
"gcaptcha_enable" => "",
"gcaptcha_secret_key" => "",
"gcaptcha_secret_key_required" => "",
"gcaptcha_site_key" => "",
"gcaptcha_site_key_required" => "",
"gcaptcha_tooltip" => "",
"general" => "",
"general_configuration" => "",
"giftcard_number" => "",
"giftcard_random" => "",
"giftcard_series" => "",
"image_allowed_file_types" => "",
"image_max_height_tooltip" => "",
"image_max_size_tooltip" => "",
"image_max_width_tooltip" => "",
"image_restrictions" => "",
"include_hsn" => "",
"info" => "",
"info_configuration" => "",
"input_groups" => "",
"integrations" => "",
"integrations_configuration" => "",
"invoice" => "",
"invoice_configuration" => "",
"invoice_default_comments" => "",
"invoice_email_message" => "",
"invoice_enable" => "",
"invoice_printer" => "",
"invoice_type" => "",
"is_readable" => "",
"is_writable" => "is writable, but the permissions are higher than 750.",
"item_markup" => "",
"jsprintsetup_required" => "",
"language" => "",
"last_used_invoice_number" => "",
"last_used_quote_number" => "",
"last_used_work_order_number" => "",
"left" => "",
"license" => "",
"license_configuration" => "",
"line_sequence" => "",
"lines_per_page" => "",
"lines_per_page_number" => "",
"lines_per_page_required" => "",
"locale" => "",
"locale_configuration" => "",
"locale_info" => "",
"location" => "",
"location_configuration" => "",
"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" => "",
"msg_msg_placeholder" => "",
"msg_pwd" => "",
"msg_pwd_required" => "",
"msg_src" => "",
"msg_src_required" => "",
"msg_uid" => "",
"msg_uid_required" => "",
"multi_pack_enabled" => "",
"no_risk" => "No security/vulnerability risks.",
"none" => "",
"notify_alignment" => "",
"number_format" => "",
"number_locale" => "",
"number_locale_invalid" => "",
"number_locale_required" => "",
"number_locale_tooltip" => "",
"os_timezone" => "",
"ospos_info" => "",
"payment_options_order" => "",
"perm_risk" => "Permissions higher than 750 leaves this software at risk.",
"phone" => "",
"phone_required" => "",
"print_bottom_margin" => "",
"print_bottom_margin_number" => "",
"print_bottom_margin_required" => "",
"print_delay_autoreturn" => "",
"print_delay_autoreturn_number" => "",
"print_delay_autoreturn_required" => "",
"print_footer" => "",
"print_header" => "",
"print_left_margin" => "",
"print_left_margin_number" => "",
"print_left_margin_required" => "",
"print_receipt_check_behaviour" => "",
"print_receipt_check_behaviour_always" => "",
"print_receipt_check_behaviour_last" => "",
"print_receipt_check_behaviour_never" => "",
"print_right_margin" => "",
"print_right_margin_number" => "",
"print_right_margin_required" => "",
"print_silently" => "",
"print_top_margin" => "",
"print_top_margin_number" => "",
"print_top_margin_required" => "",
"quantity_decimals" => "",
"quick_cash_enable" => "",
"quote_default_comments" => "",
"receipt" => "",
"receipt_category" => "",
"receipt_configuration" => "",
"receipt_default" => "",
"receipt_font_size" => "",
"receipt_font_size_number" => "",
"receipt_font_size_required" => "",
"receipt_info" => "",
"receipt_printer" => "",
"receipt_short" => "",
"receipt_show_company_name" => "",
"receipt_show_description" => "",
"receipt_show_serialnumber" => "",
"receipt_show_tax_ind" => "",
"receipt_show_taxes" => "",
"receipt_show_total_discount" => "",
"receipt_template" => "",
"receiving_calculate_average_price" => "",
"recv_invoice_format" => "",
"register_mode_default" => "",
"report_an_issue" => "",
"return_policy_required" => "",
"reward" => "",
"reward_configuration" => "",
"right" => "",
"sales_invoice_format" => "",
"sales_quote_format" => "",
"saved_successfully" => "",
"saved_unsuccessfully" => "",
"security_issue" => "Security Vulnerability Warning",
"server_notice" => "Please use the below info for issue reporting.",
"service_charge" => "",
"show_due_enable" => "",
"show_office_group" => "",
"statistics" => "",
"statistics_tooltip" => "",
"stock_location" => "",
"stock_location_duplicate" => "",
"stock_location_invalid_chars" => "",
"stock_location_required" => "",
"suggestions_fifth_column" => "",
"suggestions_first_column" => "",
"suggestions_fourth_column" => "",
"suggestions_layout" => "",
"suggestions_second_column" => "",
"suggestions_third_column" => "",
"system_conf" => "Setup & Conf",
"system_info" => "System Info",
"table" => "",
"table_configuration" => "",
"takings_printer" => "",
"tax" => "",
"tax_category" => "",
"tax_category_duplicate" => "",
"tax_category_invalid_chars" => "",
"tax_category_required" => "",
"tax_category_used" => "",
"tax_configuration" => "",
"tax_decimals" => "",
"tax_id" => "",
"tax_included" => "",
"theme" => "",
"theme_preview" => "",
"thousands_separator" => "",
"timezone" => "",
"timezone_error" => "",
"top" => "",
"use_destination_based_tax" => "",
"user_timezone" => "",
"website" => "",
"wholesale_markup" => "",
"work_order_enable" => "",
"work_order_format" => "",
'address' => "Adres Firmy",
'address_required' => "Adres Firmy jest polem wymaganym.",
'all_set' => "All file permissions are set correctly!",
'allow_duplicate_barcodes' => "Zezwalaj na duplikaty kodów kreskowych",
'apostrophe' => "apostrof",
'backup_button' => "Kopia zapasowa",
'backup_database' => "Kopia zapasowa bazy danych",
'barcode' => "Kod kreskowy",
'barcode_company' => "Nazwa firmy",
'barcode_configuration' => "Konfiguracja Kodów Kreskowych",
'barcode_content' => "Kontent Kodów Kreskowych",
'barcode_first_row' => "Wiersz 1",
'barcode_font' => "Czcionka",
'barcode_formats' => "",
'barcode_generate_if_empty' => "",
'barcode_height' => "",
'barcode_id' => "",
'barcode_info' => "",
'barcode_layout' => "",
'barcode_name' => "",
'barcode_number' => "",
'barcode_number_in_row' => "",
'barcode_page_cellspacing' => "",
'barcode_page_width' => "",
'barcode_price' => "",
'barcode_second_row' => "",
'barcode_third_row' => "",
'barcode_tooltip' => "",
'barcode_type' => "",
'barcode_width' => "",
'bottom' => "",
'cash_button' => "",
'cash_button_1' => "",
'cash_button_2' => "",
'cash_button_3' => "",
'cash_button_4' => "",
'cash_button_5' => "",
'cash_button_6' => "",
'cash_decimals' => "",
'cash_decimals_tooltip' => "",
'cash_rounding' => "",
'category_dropdown' => "",
'center' => "",
'change_apperance_tooltip' => "",
'comma' => "",
'company' => "",
'company_avatar' => "",
'company_change_image' => "",
'company_logo' => "",
'company_remove_image' => "",
'company_required' => "",
'company_select_image' => "",
'company_website_url' => "",
'country_codes' => "",
'country_codes_tooltip' => "",
'currency_code' => "",
'currency_decimals' => "",
'currency_symbol' => "",
'current_employee_only' => "",
'customer_reward' => "",
'customer_reward_duplicate' => "",
'customer_reward_enable' => "",
'customer_reward_invalid_chars' => "",
'customer_reward_required' => "",
'customer_sales_tax_support' => "",
'date_or_time_format' => "",
'datetimeformat' => "",
'decimal_point' => "",
'default_barcode_font_size_number' => "",
'default_barcode_font_size_required' => "",
'default_barcode_height_number' => "",
'default_barcode_height_required' => "",
'default_barcode_num_in_row_number' => "",
'default_barcode_num_in_row_required' => "",
'default_barcode_page_cellspacing_number' => "",
'default_barcode_page_cellspacing_required' => "",
'default_barcode_page_width_number' => "",
'default_barcode_page_width_required' => "",
'default_barcode_width_number' => "",
'default_barcode_width_required' => "",
'default_item_columns' => "",
'default_origin_tax_code' => "",
'default_receivings_discount' => "",
'default_receivings_discount_number' => "",
'default_receivings_discount_required' => "",
'default_sales_discount' => "",
'default_sales_discount_number' => "",
'default_sales_discount_required' => "",
'default_tax_category' => "",
'default_tax_code' => "",
'default_tax_jurisdiction' => "",
'default_tax_name_number' => "",
'default_tax_name_required' => "",
'default_tax_rate' => "",
'default_tax_rate_1' => "",
'default_tax_rate_2' => "",
'default_tax_rate_3' => "",
'default_tax_rate_number' => "",
'default_tax_rate_required' => "",
'derive_sale_quantity' => "",
'derive_sale_quantity_tooltip' => "",
'dinner_table' => "",
'dinner_table_duplicate' => "",
'dinner_table_enable' => "",
'dinner_table_invalid_chars' => "",
'dinner_table_required' => "",
'dot' => "",
'email' => "",
'email_configuration' => "",
'email_mailpath' => "",
'email_protocol' => "",
'email_receipt_check_behaviour' => "",
'email_receipt_check_behaviour_always' => "",
'email_receipt_check_behaviour_last' => "",
'email_receipt_check_behaviour_never' => "",
'email_smtp_crypto' => "",
'email_smtp_host' => "",
'email_smtp_pass' => "",
'email_smtp_port' => "",
'email_smtp_timeout' => "",
'email_smtp_user' => "",
'enable_avatar' => "",
'enable_avatar_tooltip' => "",
'enable_dropdown_tooltip' => "",
'enable_new_look' => "",
'enable_right_bar' => "",
'enable_right_bar_tooltip' => "",
'enforce_privacy' => "",
'enforce_privacy_tooltip' => "",
'fax' => "",
'file_perm' => "There are problems with file permissions please fix and reload this page.",
'financial_year' => "",
'financial_year_apr' => "",
'financial_year_aug' => "",
'financial_year_dec' => "",
'financial_year_feb' => "",
'financial_year_jan' => "",
'financial_year_jul' => "",
'financial_year_jun' => "",
'financial_year_mar' => "",
'financial_year_may' => "",
'financial_year_nov' => "",
'financial_year_oct' => "",
'financial_year_sep' => "",
'floating_labels' => "",
'gcaptcha_enable' => "",
'gcaptcha_secret_key' => "",
'gcaptcha_secret_key_required' => "",
'gcaptcha_site_key' => "",
'gcaptcha_site_key_required' => "",
'gcaptcha_tooltip' => "",
'general' => "",
'general_configuration' => "",
'giftcard_number' => "Numer Karty Podarunkowej",
'giftcard_random' => "",
'giftcard_series' => "",
'image_allowed_file_types' => "",
'image_max_height_tooltip' => "",
'image_max_size_tooltip' => "",
'image_max_width_tooltip' => "",
'image_restrictions' => "",
'include_hsn' => "",
'info' => "",
'info_configuration' => "",
'input_groups' => "",
'integrations' => "",
'integrations_configuration' => "",
'invoice' => "",
'invoice_configuration' => "",
'invoice_default_comments' => "",
'invoice_email_message' => "",
'invoice_enable' => "",
'invoice_printer' => "",
'invoice_type' => "",
'is_readable' => "",
'is_writable' => "is writable, but the permissions are higher than 750.",
'item_markup' => "",
'jsprintsetup_required' => "",
'language' => "",
'last_used_invoice_number' => "",
'last_used_quote_number' => "",
'last_used_work_order_number' => "",
'left' => "",
'license' => "",
'license_configuration' => "",
'line_sequence' => "",
'lines_per_page' => "",
'lines_per_page_number' => "",
'lines_per_page_required' => "",
'locale' => "",
'locale_configuration' => "",
'locale_info' => "",
'location' => "",
'location_configuration' => "",
'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' => "",
'msg_msg_placeholder' => "",
'msg_pwd' => "",
'msg_pwd_required' => "",
'msg_src' => "",
'msg_src_required' => "",
'msg_uid' => "",
'msg_uid_required' => "",
'multi_pack_enabled' => "",
'no_risk' => "No security/vulnerability risks.",
'none' => "",
'notify_alignment' => "",
'number_format' => "",
'number_locale' => "",
'number_locale_invalid' => "",
'number_locale_required' => "",
'number_locale_tooltip' => "",
'os_timezone' => "",
'ospos_info' => "",
'payment_options_order' => "",
'perm_risk' => "Permissions higher than 750 leaves this software at risk.",
'phone' => "",
'phone_required' => "",
'print_bottom_margin' => "",
'print_bottom_margin_number' => "",
'print_bottom_margin_required' => "",
'print_delay_autoreturn' => "",
'print_delay_autoreturn_number' => "",
'print_delay_autoreturn_required' => "",
'print_footer' => "",
'print_header' => "",
'print_left_margin' => "",
'print_left_margin_number' => "",
'print_left_margin_required' => "",
'print_receipt_check_behaviour' => "",
'print_receipt_check_behaviour_always' => "",
'print_receipt_check_behaviour_last' => "",
'print_receipt_check_behaviour_never' => "",
'print_right_margin' => "",
'print_right_margin_number' => "",
'print_right_margin_required' => "",
'print_silently' => "",
'print_top_margin' => "",
'print_top_margin_number' => "",
'print_top_margin_required' => "",
'quantity_decimals' => "",
'quick_cash_enable' => "",
'quote_default_comments' => "",
'receipt' => "",
'receipt_category' => "",
'receipt_configuration' => "",
'receipt_default' => "",
'receipt_font_size' => "",
'receipt_font_size_number' => "",
'receipt_font_size_required' => "",
'receipt_info' => "",
'receipt_printer' => "",
'receipt_short' => "",
'receipt_show_company_name' => "",
'receipt_show_description' => "",
'receipt_show_serialnumber' => "",
'receipt_show_tax_ind' => "",
'receipt_show_taxes' => "",
'receipt_show_total_discount' => "",
'receipt_template' => "",
'receiving_calculate_average_price' => "",
'recv_invoice_format' => "",
'register_mode_default' => "",
'report_an_issue' => "",
'return_policy_required' => "",
'reward' => "",
'reward_configuration' => "",
'right' => "",
'sales_invoice_format' => "",
'sales_quote_format' => "",
'saved_successfully' => "",
'saved_unsuccessfully' => "",
'security_issue' => "Security Vulnerability Warning",
'server_notice' => "Please use the below info for issue reporting.",
'service_charge' => "",
'show_due_enable' => "",
'show_office_group' => "",
'statistics' => "",
'statistics_tooltip' => "",
'stock_location' => "",
'stock_location_duplicate' => "",
'stock_location_invalid_chars' => "",
'stock_location_required' => "",
'suggestions_fifth_column' => "",
'suggestions_first_column' => "",
'suggestions_fourth_column' => "",
'suggestions_layout' => "",
'suggestions_second_column' => "",
'suggestions_third_column' => "",
'system_conf' => "Setup & Conf",
'system_info' => "System Info",
'table' => "",
'table_configuration' => "",
'takings_printer' => "",
'tax' => "",
'tax_category' => "",
'tax_category_duplicate' => "",
'tax_category_invalid_chars' => "",
'tax_category_required' => "",
'tax_category_used' => "",
'tax_configuration' => "",
'tax_decimals' => "",
'tax_id' => "",
'tax_included' => "",
'theme' => "",
'theme_preview' => "",
'thousands_separator' => "",
'timezone' => "",
'timezone_error' => "",
'top' => "",
'use_destination_based_tax' => "",
'user_timezone' => "",
'website' => "",
'wholesale_markup' => "",
'work_order_enable' => "",
'work_order_format' => "",
];

View File

@@ -1,57 +1,57 @@
<?php
return [
"account_number" => "Konto #",
"account_number_duplicate" => "",
"available_points" => "Dostępne punkty",
"available_points_value" => "",
"average" => "",
"avg_discount" => "",
"basic_information" => "",
"cannot_be_deleted" => "",
"company_name" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"consent" => "",
"consent_required" => "",
"csv_import_failed" => "",
"csv_import_nodata_wrongformat" => "",
"csv_import_partially_failed" => "",
"csv_import_success" => "",
"customer" => "",
"date" => "",
"discount" => "",
"discount_fixed" => "",
"discount_percent" => "",
"discount_type" => "",
"email_duplicate" => "",
"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" => "",
"none_selected" => "",
"one_or_multiple" => "",
"quantity" => "",
"stats_info" => "",
"successful_adding" => "",
"successful_deleted" => "",
"successful_updating" => "",
"tax_code" => "",
"tax_id" => "",
"taxable" => "",
"total" => "",
"update" => "",
"rewards_package" => "",
'account_number' => "Konto #",
'account_number_duplicate' => "",
'available_points' => "Dostępne punkty",
'available_points_value' => "",
'average' => "",
'avg_discount' => "",
'basic_information' => "",
'cannot_be_deleted' => "",
'company_name' => "",
'confirm_delete' => "",
'confirm_restore' => "",
'consent' => "",
'consent_required' => "",
'csv_import_failed' => "",
'csv_import_nodata_wrongformat' => "",
'csv_import_partially_failed' => "",
'csv_import_success' => "",
'customer' => "",
'date' => "",
'discount' => "",
'discount_fixed' => "",
'discount_percent' => "",
'discount_type' => "",
'email_duplicate' => "",
'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' => "",
'none_selected' => "",
'one_or_multiple' => "",
'quantity' => "Ilość",
'stats_info' => "",
'successful_adding' => "",
'successful_deleted' => "",
'successful_updating' => "",
'tax_code' => "",
'tax_id' => "",
'taxable' => "",
'total' => "",
'update' => "",
'rewards_package' => "",
];

View File

@@ -1,51 +1,51 @@
<?php
return [
"add_item" => "Dodaj wydatek",
"amount" => "",
"amount_number" => "",
"amount_required" => "",
"by_category" => "",
"cannot_be_deleted" => "",
"cash" => "",
"cash_filter" => "",
"categories_name" => "",
"category_required" => "",
"check" => "",
"check_filter" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"credit" => "",
"credit_filter" => "",
"date" => "",
"date_number" => "",
"date_required" => "",
"debit" => "",
"debit_filter" => "",
"description" => "",
"due" => "",
"due_filter" => "",
"employee" => "",
"error_adding_updating" => "",
"expense_id" => "",
"expenses_employee" => "",
"info" => "",
"ip_address" => "",
"is_deleted" => "",
"name_required" => "",
"new" => "",
"new_supplier" => "",
"no_expenses_to_display" => "",
"none_selected" => "",
"one_or_multiple" => "",
"payment" => "",
"start_typing_supplier_name" => "",
"successful_adding" => "",
"successful_deleted" => "",
"successful_updating" => "",
"supplier_name" => "",
"supplier_tax_code" => "",
"tax_amount" => "",
"tax_amount_number" => "",
"update" => "",
'add_item' => "Dodaj wydatek",
'amount' => "",
'amount_number' => "",
'amount_required' => "",
'by_category' => "",
'cannot_be_deleted' => "Nie można usunąć Kategorię Wydatki",
'cash' => "",
'cash_filter' => "",
'categories_name' => "",
'category_required' => "",
'check' => "",
'check_filter' => "",
'confirm_delete' => "",
'confirm_restore' => "",
'credit' => "",
'credit_filter' => "",
'date' => "",
'date_number' => "",
'date_required' => "",
'debit' => "",
'debit_filter' => "",
'description' => "Opis",
'due' => "",
'due_filter' => "",
'employee' => "",
'error_adding_updating' => "",
'expense_id' => "",
'expenses_employee' => "",
'info' => "",
'ip_address' => "",
'is_deleted' => "",
'name_required' => "",
'new' => "",
'new_supplier' => "",
'no_expenses_to_display' => "",
'none_selected' => "",
'one_or_multiple' => "",
'payment' => "",
'start_typing_supplier_name' => "",
'successful_adding' => "",
'successful_deleted' => "",
'successful_updating' => "",
'supplier_name' => "",
'supplier_tax_code' => "",
'tax_amount' => "",
'tax_amount_number' => "",
'update' => "",
];

View File

@@ -1,23 +1,23 @@
<?php
return [
"category_name_required" => "",
"add_item" => "",
"cannot_be_deleted" => "",
"category_id" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"description" => "",
"error_adding_updating" => "",
"info" => "",
"name" => "",
"new" => "",
"no_expenses_categories_to_display" => "",
"none_selected" => "",
"one_or_multiple" => "",
"quantity" => "",
"successful_adding" => "",
"successful_deleted" => "",
"successful_updating" => "",
"update" => "",
'category_name_required' => "Nazwa Kategorii Wydatków jest wymagana",
'add_item' => "Dodaj Kategorię",
'cannot_be_deleted' => "Nie można usunąć Kategorię Wydatki",
'category_id' => "Id",
'confirm_delete' => "Czy jesteś pewien, że chcesz usunąć zaznaczone Kategorie Wydatków?",
'confirm_restore' => "Czy jesteś pewien, że chcesz przywrócić zaznaczone Kategorie Wydatków?",
'description' => "Opis kategorii",
'error_adding_updating' => "Błąd podczas dodawania lub aktualizowania Kategorii Wydatków",
'info' => "Kategoria Wydatków - Informacje",
'name' => "Nazwa Kategorii",
'new' => "Nowa Kategoria",
'no_expenses_categories_to_display' => "Brak Kategorii do wyświetlenia",
'none_selected' => "Nie zaznaczono żadnej Kategorii Wydatków",
'one_or_multiple' => "Kategoria Wydatki",
'quantity' => "Ilość",
'successful_adding' => "Kategoria Wydatków została dodana",
'successful_deleted' => "Kategoria Wydatków została usunięta",
'successful_updating' => "Kategoria Wydatków została zaktualizowana",
'update' => "Aktualizacja Kategorii",
];

View File

@@ -1,72 +1,72 @@
<?php
return [
"add_minus" => "",
"allow_alt_description" => "Zezwól na alternatywny opis",
"bulk_edit" => "Edycja zbiorcza",
"cannot_be_deleted" => "",
"cannot_find_giftcard" => "",
"cannot_use" => "",
"card_value" => "",
"category" => "",
"change_all_to_allow_alt_desc" => "",
"change_all_to_not_allow_allow_desc" => "",
"change_all_to_serialized" => "",
"change_all_to_unserialized" => "",
"confirm_bulk_edit" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"cost_price" => "",
"count" => "",
"csv_import_failed" => "",
"current_quantity" => "",
"description" => "",
"details_count" => "",
"do_nothing" => "",
"edit_fields_you_want_to_update" => "",
"edit_multiple_giftcards" => "",
"error_adding_updating" => "",
"error_updating_multiple" => "",
"generate_barcodes" => "",
"giftcard" => "",
"giftcard_number" => "",
"info_provided_by" => "",
"inventory_comments" => "",
"is_serialized" => "",
"low_inventory_giftcards" => "",
"manually_editing_of_quantity" => "",
"must_select_giftcard_for_barcode" => "",
"new" => "",
"no_description_giftcards" => "",
"no_giftcards_to_display" => "",
"none" => "",
"none_selected" => "",
"number" => "",
"number_information" => "",
"number_required" => "",
"one_or_multiple" => "",
"person_id" => "",
"quantity" => "",
"quantity_required" => "",
"remaining_balance" => "",
"reorder_level" => "",
"retrive_giftcard_info" => "",
"sales_tax_1" => "",
"sales_tax_2" => "",
"serialized_giftcards" => "",
"successful_adding" => "",
"successful_bulk_edit" => "",
"successful_deleted" => "",
"successful_updating" => "",
"supplier" => "",
"tax_1" => "",
"tax_2" => "",
"tax_percent" => "",
"tax_percents" => "",
"unit_price" => "",
"upc_database" => "",
"update" => "",
"use_inventory_menu" => "",
"value" => "",
"value_required" => "",
'add_minus' => "Ilość do dodania lub odjęcia.",
'allow_alt_description' => "Zezwól na alternatywny opis",
'bulk_edit' => "Edycja zbiorcza",
'cannot_be_deleted' => "",
'cannot_find_giftcard' => "Nie odnaleziono Karty Podarunkowej",
'cannot_use' => "Nie można użyć Karty Podarunkowej {0} w tej sprzedaży: nieprawidłowy klient.",
'card_value' => "Wartość",
'category' => "Kategoria",
'change_all_to_allow_alt_desc' => "",
'change_all_to_not_allow_allow_desc' => "",
'change_all_to_serialized' => "",
'change_all_to_unserialized' => "",
'confirm_bulk_edit' => "Czy jesteś pewny, że chcesz edytować wybrane Karty Podarunkowe?",
'confirm_delete' => "",
'confirm_restore' => "",
'cost_price' => "",
'count' => "",
'csv_import_failed' => "Nie udało się zaimportować CSV.",
'current_quantity' => "Aktualna Ilość",
'description' => "Opis",
'details_count' => "",
'do_nothing' => "Nic nie rób",
'edit_fields_you_want_to_update' => "",
'edit_multiple_giftcards' => "Edytuj wiele Kart Podarunkowych",
'error_adding_updating' => "Dodanie lub aktualizacja Karty Podarunkowej nie powiodła się.",
'error_updating_multiple' => "",
'generate_barcodes' => "Generuj kody kreskowe",
'giftcard' => "Karta Podarunkowa",
'giftcard_number' => "Numer Karty Podarunkowej",
'info_provided_by' => "Informacje dostarczone przez",
'inventory_comments' => "Komentarze",
'is_serialized' => "",
'low_inventory_giftcards' => "",
'manually_editing_of_quantity' => "",
'must_select_giftcard_for_barcode' => "",
'new' => "",
'no_description_giftcards' => "",
'no_giftcards_to_display' => "",
'none' => "",
'none_selected' => "",
'number' => "",
'number_information' => "",
'number_required' => "",
'one_or_multiple' => "",
'person_id' => "",
'quantity' => "Ilość",
'quantity_required' => "",
'remaining_balance' => "",
'reorder_level' => "",
'retrive_giftcard_info' => "",
'sales_tax_1' => "",
'sales_tax_2' => "",
'serialized_giftcards' => "",
'successful_adding' => "",
'successful_bulk_edit' => "",
'successful_deleted' => "",
'successful_updating' => "",
'supplier' => "",
'tax_1' => "",
'tax_2' => "",
'tax_percent' => "",
'tax_percents' => "",
'unit_price' => "",
'upc_database' => "",
'update' => "",
'use_inventory_menu' => "",
'value' => "",
'value_required' => "",
];

View File

@@ -1,42 +1,42 @@
<?php
return [
"add_item" => "Dodaj element",
"all" => "",
"cannot_be_deleted" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"description" => "",
"discount" => "",
"discount_fixed" => "",
"discount_percent" => "",
"discount_type" => "",
"error_adding_updating" => "",
"find_kit_item" => "",
"info" => "",
"item" => "",
"item_kit_number" => "",
"item_kit_number_duplicate" => "",
"item_number" => "",
"item_number_duplicate" => "",
"items" => "",
"kit" => "",
"kit_and_components" => "",
"kit_and_stock" => "",
"kit_only" => "",
"name" => "",
"new" => "",
"no_item_kits_to_display" => "",
"none_selected" => "",
"one_or_multiple" => "",
"price_option" => "",
"priced_only" => "",
"print_option" => "",
"quantity" => "",
"sequence" => "",
"successful_adding" => "",
"successful_deleted" => "",
"successful_updating" => "",
"unit_price" => "",
"update" => "",
'add_item' => "Dodaj element",
'all' => "",
'cannot_be_deleted' => "",
'confirm_delete' => "",
'confirm_restore' => "",
'description' => "",
'discount' => "",
'discount_fixed' => "",
'discount_percent' => "",
'discount_type' => "",
'error_adding_updating' => "",
'find_kit_item' => "",
'info' => "",
'item' => "",
'item_kit_number' => "",
'item_kit_number_duplicate' => "",
'item_number' => "",
'item_number_duplicate' => "",
'items' => "",
'kit' => "",
'kit_and_components' => "",
'kit_and_stock' => "",
'kit_only' => "",
'name' => "",
'new' => "",
'no_item_kits_to_display' => "",
'none_selected' => "",
'one_or_multiple' => "",
'price_option' => "",
'priced_only' => "",
'print_option' => "",
'quantity' => "Ilość",
'sequence' => "",
'successful_adding' => "",
'successful_deleted' => "",
'successful_updating' => "",
'unit_price' => "",
'update' => "",
];

View File

@@ -1,122 +1,122 @@
<?php
return [
"add_minus" => "",
"allow_alt_description" => "",
"amount_entry" => "",
"bulk_edit" => "",
"buy_price_required" => "",
"cannot_be_deleted" => "",
"cannot_find_item" => "",
"categories" => "",
"category" => "",
"category_new" => "",
"category_required" => "",
"change_all_to_allow_alt_desc" => "",
"change_all_to_not_allow_allow_desc" => "",
"change_all_to_serialized" => "",
"change_all_to_unserialized" => "",
"change_image" => "",
"confirm_bulk_edit" => "",
"confirm_bulk_edit_wipe_taxes" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"cost_price" => "",
"cost_price_number" => "",
"cost_price_required" => "",
"count" => "",
"csv_import_failed" => "",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "",
"csv_import_partially_failed" => "",
"csv_import_success" => "",
"current_quantity" => "",
"default_pack_name" => "",
"description" => "",
"details_count" => "",
"do_nothing" => "",
"edit" => "",
"edit_fields_you_want_to_update" => "",
"edit_multiple_items" => "",
"empty_upc_items" => "",
"error_adding_updating" => "",
"error_updating_multiple" => "",
"generate_barcodes" => "",
"hsn_code" => "",
"image" => "",
"import_items_csv" => "",
"info_provided_by" => "",
"inventory" => "",
"inventory_CSV_import_quantity" => "",
"inventory_comments" => "",
"inventory_data_tracking" => "",
"inventory_date" => "",
"inventory_employee" => "",
"inventory_in_out_quantity" => "",
"inventory_remarks" => "",
"is_deleted" => "",
"is_printed" => "",
"is_serialized" => "",
"item" => "",
"item_id" => "",
"item_number" => "",
"item_number_duplicate" => "",
"kit" => "",
"location" => "",
"low_inventory_items" => "",
"low_sell_item" => "",
"manually_editing_of_quantity" => "",
"markup" => "",
"name" => "",
"name_required" => "",
"new" => "",
"no_description_items" => "",
"no_items_to_display" => "",
"none" => "",
"none_selected" => "",
"nonstock" => "",
"number_information" => "",
"number_required" => "",
"one_or_multiple" => "",
"pack_name" => "",
"qty_per_pack" => "",
"quantity" => "",
"quantity_number" => "",
"quantity_required" => "",
"receiving_quantity" => "",
"remove_image" => "",
"reorder_level" => "",
"reorder_level_number" => "",
"reorder_level_required" => "",
"retrive_item_info" => "",
"sales_tax_1" => "",
"sales_tax_2" => "",
"search_attributes" => "",
"select_image" => "",
"serialized_items" => "",
"standard" => "",
"stock" => "",
"stock_location" => "",
"stock_type" => "",
"successful_adding" => "",
"successful_bulk_edit" => "",
"successful_deleted" => "",
"successful_updating" => "",
"supplier" => "",
"tax_1" => "",
"tax_2" => "",
"tax_3" => "",
"tax_category" => "",
"tax_percent" => "",
"tax_percent_number" => "",
"tax_percent_required" => "",
"tax_percents" => "",
"temp" => "",
"type" => "",
"unit_price" => "",
"unit_price_number" => "",
"unit_price_required" => "",
"upc_database" => "",
"update" => "",
"use_inventory_menu" => "",
'add_minus' => "Ilość do dodania lub odjęcia.",
'allow_alt_description' => "",
'amount_entry' => "",
'bulk_edit' => "",
'buy_price_required' => "",
'cannot_be_deleted' => "",
'cannot_find_item' => "",
'categories' => "",
'category' => "Kategoria",
'category_new' => "",
'category_required' => "",
'change_all_to_allow_alt_desc' => "",
'change_all_to_not_allow_allow_desc' => "",
'change_all_to_serialized' => "",
'change_all_to_unserialized' => "",
'change_image' => "",
'confirm_bulk_edit' => "",
'confirm_bulk_edit_wipe_taxes' => "",
'confirm_delete' => "",
'confirm_restore' => "",
'cost_price' => "",
'cost_price_number' => "",
'cost_price_required' => "",
'count' => "",
'csv_import_failed' => "",
'csv_import_invalid_location' => "",
'csv_import_nodata_wrongformat' => "",
'csv_import_partially_failed' => "",
'csv_import_success' => "",
'current_quantity' => "Aktualna Ilość",
'default_pack_name' => "",
'description' => "Opis",
'details_count' => "",
'do_nothing' => "Nic nie rób",
'edit' => "",
'edit_fields_you_want_to_update' => "",
'edit_multiple_items' => "",
'empty_upc_items' => "",
'error_adding_updating' => "",
'error_updating_multiple' => "",
'generate_barcodes' => "Generuj kody kreskowe",
'hsn_code' => "",
'image' => "",
'import_items_csv' => "",
'info_provided_by' => "",
'inventory' => "",
'inventory_CSV_import_quantity' => "",
'inventory_comments' => "Komentarze",
'inventory_data_tracking' => "",
'inventory_date' => "",
'inventory_employee' => "",
'inventory_in_out_quantity' => "",
'inventory_remarks' => "",
'is_deleted' => "",
'is_printed' => "",
'is_serialized' => "",
'item' => "",
'item_id' => "",
'item_number' => "",
'item_number_duplicate' => "",
'kit' => "",
'location' => "",
'low_inventory_items' => "",
'low_sell_item' => "",
'manually_editing_of_quantity' => "",
'markup' => "",
'name' => "",
'name_required' => "",
'new' => "",
'no_description_items' => "",
'no_items_to_display' => "",
'none' => "",
'none_selected' => "",
'nonstock' => "",
'number_information' => "",
'number_required' => "",
'one_or_multiple' => "",
'pack_name' => "",
'qty_per_pack' => "",
'quantity' => "Ilość",
'quantity_number' => "",
'quantity_required' => "",
'receiving_quantity' => "",
'remove_image' => "",
'reorder_level' => "",
'reorder_level_number' => "",
'reorder_level_required' => "",
'retrive_item_info' => "",
'sales_tax_1' => "",
'sales_tax_2' => "",
'search_attributes' => "",
'select_image' => "",
'serialized_items' => "",
'standard' => "",
'stock' => "",
'stock_location' => "",
'stock_type' => "",
'successful_adding' => "",
'successful_bulk_edit' => "",
'successful_deleted' => "",
'successful_updating' => "",
'supplier' => "",
'tax_1' => "",
'tax_2' => "",
'tax_3' => "",
'tax_category' => "",
'tax_percent' => "",
'tax_percent_number' => "",
'tax_percent_required' => "",
'tax_percents' => "",
'temp' => "",
'type' => "",
'unit_price' => "",
'unit_price_number' => "",
'unit_price_required' => "",
'upc_database' => "",
'update' => "",
'use_inventory_menu' => "",
];

View File

@@ -1,149 +1,149 @@
<?php
return [
"all" => "Wszystko",
"authority" => "",
"canceled" => "",
"categories" => "",
"categories_summary_report" => "",
"category" => "",
"code_canceled" => "",
"code_invoice" => "",
"code_pos" => "",
"code_quote" => "",
"code_return" => "",
"code_type" => "",
"code_work_order" => "",
"comments" => "",
"commission" => "",
"complete" => "",
"completed_sales" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"cost" => "",
"cost_price" => "",
"count" => "",
"customer" => "",
"customers" => "",
"customers_summary_report" => "",
"date" => "",
"date_range" => "",
"description" => "",
"detailed_receivings_report" => "",
"detailed_receivings_report_input" => "",
"detailed_reports" => "",
"detailed_requisition_report" => "",
"detailed_sales_report" => "",
"discount" => "",
"discount_fixed" => "",
"discount_percent" => "",
"discount_type" => "",
"discounts" => "",
"discounts_summary_report" => "",
"earned" => "",
"employee" => "",
"employees" => "",
"employees_summary_report" => "",
"expenses" => "",
"expenses_amount" => "",
"expenses_categories" => "",
"expenses_categories_summary_report" => "",
"expenses_category" => "",
"expenses_payment_amount" => "",
"expenses_tax_amount" => "",
"expenses_total_amount" => "",
"expenses_total_tax_amount" => "",
"graphical_reports" => "",
"inventory" => "",
"inventory_low" => "",
"inventory_low_report" => "",
"inventory_reports" => "",
"inventory_summary" => "",
"inventory_summary_report" => "",
"item" => "",
"item_count" => "",
"item_name" => "",
"item_number" => "",
"items" => "",
"items_purchased" => "",
"items_received" => "",
"items_summary_report" => "",
"jurisdiction" => "",
"low_inventory" => "",
"low_inventory_report" => "",
"low_sell_quantity" => "",
"more_than_zero" => "",
"name" => "",
"no_reports_to_display" => "",
"payment_type" => "",
"payments" => "",
"payments_summary_report" => "",
"profit" => "",
"quantity" => "",
"quantity_purchased" => "",
"quotes" => "",
"received_by" => "",
"receiving_id" => "",
"receiving_type" => "",
"receivings" => "",
"reorder_level" => "",
"report" => "",
"report_input" => "",
"reports" => "",
"requisition" => "",
"requisition_by" => "",
"requisition_id" => "",
"requisition_item" => "",
"requisition_item_quantity" => "",
"requisition_related_item" => "",
"requisition_related_item_total_quantity" => "",
"requisition_related_item_unit_quantity" => "",
"requisitions" => "",
"returns" => "",
"revenue" => "",
"sale_id" => "",
"sale_type" => "",
"sales" => "",
"sales_amount" => "",
"sales_summary_report" => "",
"sales_taxes" => "",
"sales_taxes_summary_report" => "",
"serial_number" => "",
"service_charge" => "",
"sold_by" => "",
"sold_items" => "",
"sold_to" => "",
"stock_location" => "",
"sub_total_value" => "",
"subtotal" => "",
"summary_reports" => "",
"supplied_by" => "",
"supplier" => "",
"suppliers" => "",
"suppliers_summary_report" => "",
"tax" => "",
"tax_category" => "",
"tax_name" => "",
"tax_percent" => "",
"tax_rate" => "",
"taxes" => "",
"taxes_summary_report" => "",
"total" => "",
"total_inventory_value" => "",
"total_low_sell_quantity" => "",
"total_quantity" => "",
"total_retail" => "",
"trans_amount" => "",
"trans_due" => "",
"trans_group" => "",
"trans_nopay_sales" => "",
"trans_payments" => "",
"trans_refunded" => "",
"trans_sales" => "",
"trans_type" => "",
"type" => "",
"unit_price" => "",
"used" => "",
"work_orders" => "",
"zero_and_less" => "",
'all' => "Wszystko",
'authority' => "",
'canceled' => "",
'categories' => "",
'categories_summary_report' => "",
'category' => "Kategoria",
'code_canceled' => "",
'code_invoice' => "",
'code_pos' => "",
'code_quote' => "",
'code_return' => "",
'code_type' => "",
'code_work_order' => "",
'comments' => "",
'commission' => "",
'complete' => "",
'completed_sales' => "",
'confirm_delete' => "",
'confirm_restore' => "",
'cost' => "",
'cost_price' => "",
'count' => "",
'customer' => "",
'customers' => "",
'customers_summary_report' => "",
'date' => "",
'date_range' => "",
'description' => "Opis",
'detailed_receivings_report' => "",
'detailed_receivings_report_input' => "",
'detailed_reports' => "",
'detailed_requisition_report' => "",
'detailed_sales_report' => "",
'discount' => "",
'discount_fixed' => "",
'discount_percent' => "",
'discount_type' => "",
'discounts' => "",
'discounts_summary_report' => "",
'earned' => "",
'employee' => "",
'employees' => "",
'employees_summary_report' => "",
'expenses' => "",
'expenses_amount' => "",
'expenses_categories' => "",
'expenses_categories_summary_report' => "",
'expenses_category' => "",
'expenses_payment_amount' => "",
'expenses_tax_amount' => "",
'expenses_total_amount' => "",
'expenses_total_tax_amount' => "",
'graphical_reports' => "",
'inventory' => "",
'inventory_low' => "",
'inventory_low_report' => "",
'inventory_reports' => "",
'inventory_summary' => "",
'inventory_summary_report' => "",
'item' => "",
'item_count' => "",
'item_name' => "",
'item_number' => "",
'items' => "",
'items_purchased' => "",
'items_received' => "",
'items_summary_report' => "",
'jurisdiction' => "",
'low_inventory' => "",
'low_inventory_report' => "",
'low_sell_quantity' => "",
'more_than_zero' => "",
'name' => "",
'no_reports_to_display' => "",
'payment_type' => "",
'payments' => "",
'payments_summary_report' => "",
'profit' => "",
'quantity' => "Ilość",
'quantity_purchased' => "",
'quotes' => "",
'received_by' => "",
'receiving_id' => "",
'receiving_type' => "",
'receivings' => "",
'reorder_level' => "",
'report' => "",
'report_input' => "",
'reports' => "",
'requisition' => "",
'requisition_by' => "",
'requisition_id' => "",
'requisition_item' => "",
'requisition_item_quantity' => "",
'requisition_related_item' => "",
'requisition_related_item_total_quantity' => "",
'requisition_related_item_unit_quantity' => "",
'requisitions' => "",
'returns' => "",
'revenue' => "",
'sale_id' => "",
'sale_type' => "",
'sales' => "",
'sales_amount' => "",
'sales_summary_report' => "",
'sales_taxes' => "",
'sales_taxes_summary_report' => "",
'serial_number' => "",
'service_charge' => "",
'sold_by' => "",
'sold_items' => "",
'sold_to' => "",
'stock_location' => "",
'sub_total_value' => "",
'subtotal' => "",
'summary_reports' => "",
'supplied_by' => "",
'supplier' => "",
'suppliers' => "",
'suppliers_summary_report' => "",
'tax' => "",
'tax_category' => "",
'tax_name' => "",
'tax_percent' => "",
'tax_rate' => "",
'taxes' => "",
'taxes_summary_report' => "",
'total' => "",
'total_inventory_value' => "",
'total_low_sell_quantity' => "",
'total_quantity' => "",
'total_retail' => "",
'trans_amount' => "",
'trans_due' => "",
'trans_group' => "",
'trans_nopay_sales' => "",
'trans_payments' => "",
'trans_refunded' => "",
'trans_sales' => "",
'trans_type' => "",
'type' => "",
'unit_price' => "",
'used' => "",
'work_orders' => "",
'zero_and_less' => "",
];

View File

@@ -1,225 +1,225 @@
<?php
return [
"customers_available_points" => "Dostępne punkty",
"rewards_package" => "",
"rewards_remaining_balance" => "",
"account_number" => "",
"add_payment" => "",
"amount_due" => "",
"amount_tendered" => "",
"authorized_signature" => "",
"cancel_sale" => "",
"cash" => "",
"cash_1" => "",
"cash_2" => "",
"cash_3" => "",
"cash_4" => "",
"cash_adjustment" => "",
"cash_deposit" => "",
"cash_filter" => "",
"change_due" => "",
"change_price" => "",
"check" => "",
"check_balance" => "",
"check_filter" => "",
"close" => "",
"comment" => "",
"comments" => "",
"company_name" => "",
"complete" => "",
"complete_sale" => "",
"confirm_cancel_sale" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"credit" => "",
"credit_deposit" => "",
"credit_filter" => "",
"current_table" => "",
"customer" => "",
"customer_address" => "",
"customer_discount" => "",
"customer_email" => "",
"customer_location" => "",
"customer_mailchimp_status" => "",
"customer_optional" => "",
"customer_required" => "",
"customer_total" => "",
"customer_total_spent" => "",
"daily_sales" => "",
"date" => "",
"date_range" => "",
"date_required" => "",
"date_type" => "",
"debit" => "",
"debit_filter" => "",
"delete" => "",
"delete_confirmation" => "",
"delete_entire_sale" => "",
"delete_successful" => "",
"delete_unsuccessful" => "",
"description_abbrv" => "",
"discard" => "",
"discard_quote" => "",
"discount" => "",
"discount_included" => "",
"discount_short" => "",
"due" => "",
"due_filter" => "",
"edit" => "",
"edit_item" => "",
"edit_sale" => "",
"email_receipt" => "",
"employee" => "",
"entry" => "",
"error_editing_item" => "",
"find_or_scan_item" => "",
"find_or_scan_item_or_receipt" => "",
"giftcard" => "",
"giftcard_balance" => "",
"giftcard_filter" => "",
"giftcard_number" => "",
"group_by_category" => "",
"group_by_type" => "",
"hsn" => "",
"id" => "",
"include_prices" => "",
"invoice" => "",
"invoice_confirm" => "",
"invoice_enable" => "",
"invoice_filter" => "",
"invoice_no_email" => "",
"invoice_number" => "",
"invoice_number_duplicate" => "",
"invoice_sent" => "",
"invoice_total" => "",
"invoice_type_custom_invoice" => "",
"invoice_type_custom_tax_invoice" => "",
"invoice_type_invoice" => "",
"invoice_type_tax_invoice" => "",
"invoice_unsent" => "",
"invoice_update" => "",
"item_insufficient_of_stock" => "",
"item_name" => "",
"item_number" => "",
"item_out_of_stock" => "",
"key_browser" => "",
"key_cancel" => "Cancels Current Quote/Invoice/Sale",
"key_customer_search" => "Customer Search",
"key_finish_quote" => "Finish Quote/Invoice witdout payment",
"key_finish_sale" => "Add Payment and Complete Invoice/Sale",
"key_full" => "",
"key_function" => "Function",
"key_help" => "Shortcuts",
"key_help_modal" => "Open Shortcuts Window",
"key_in" => "",
"key_item_search" => "Item Search",
"key_out" => "",
"key_payment" => "Add Payment",
"key_print" => "",
"key_restore" => "",
"key_search" => "",
"key_suspend" => "Suspend Current Sale",
"key_suspended" => "Show Suspended Sales",
"key_system" => "",
"key_tendered" => "Edit Amount Tendered",
"key_title" => "Sales Keyboard Shortcuts",
"mc" => "",
"mode" => "",
"must_enter_numeric" => "",
"must_enter_numeric_giftcard" => "",
"new_customer" => "",
"new_item" => "",
"no_description" => "",
"no_filter" => "",
"no_items_in_cart" => "",
"no_sales_to_display" => "",
"none_selected" => "",
"nontaxed_ind" => "",
"not_authorized" => "",
"one_or_multiple" => "",
"payment" => "",
"payment_amount" => "",
"payment_not_cover_total" => "",
"payment_type" => "",
"payments" => "",
"payments_total" => "",
"price" => "",
"print_after_sale" => "",
"quantity" => "",
"quantity_less_than_reorder_level" => "",
"quantity_less_than_zero" => "",
"quantity_of_items" => "",
"quote" => "",
"quote_number" => "",
"quote_number_duplicate" => "",
"quote_sent" => "",
"quote_unsent" => "",
"receipt" => "",
"receipt_no_email" => "",
"receipt_number" => "",
"receipt_sent" => "",
"receipt_unsent" => "",
"refund" => "",
"register" => "",
"remove_customer" => "",
"remove_discount" => "",
"return" => "",
"rewards" => "",
"rewards_balance" => "",
"sale" => "",
"sale_by_invoice" => "",
"sale_for_customer" => "",
"sale_time" => "",
"sales_tax" => "",
"sales_total" => "",
"select_customer" => "",
"send_invoice" => "",
"send_quote" => "",
"send_receipt" => "",
"send_work_order" => "",
"serial" => "",
"service_charge" => "",
"show_due" => "",
"show_invoice" => "",
"show_receipt" => "",
"start_typing_customer_name" => "",
"start_typing_item_name" => "",
"stock" => "",
"stock_location" => "",
"sub_total" => "",
"successfully_deleted" => "",
"successfully_restored" => "",
"successfully_suspended_sale" => "",
"successfully_updated" => "",
"suspend_sale" => "",
"suspended_doc_id" => "",
"suspended_sale_id" => "",
"suspended_sales" => "",
"table" => "",
"takings" => "",
"tax" => "",
"tax_id" => "",
"tax_invoice" => "",
"tax_percent" => "",
"taxed_ind" => "",
"total" => "",
"total_tax_exclusive" => "",
"transaction_failed" => "",
"unable_to_add_item" => "",
"unsuccessfully_deleted" => "",
"unsuccessfully_restored" => "",
"unsuccessfully_suspended_sale" => "",
"unsuccessfully_updated" => "",
"unsuspend" => "",
"unsuspend_and_delete" => "",
"update" => "",
"upi" => "",
"visa" => "",
"wholesale" => "",
"work_order" => "",
"work_order_number" => "",
"work_order_number_duplicate" => "",
"work_order_sent" => "",
"work_order_unsent" => "",
'customers_available_points' => "Dostępne punkty",
'rewards_package' => "",
'rewards_remaining_balance' => "",
'account_number' => "",
'add_payment' => "",
'amount_due' => "",
'amount_tendered' => "",
'authorized_signature' => "",
'cancel_sale' => "",
'cash' => "",
'cash_1' => "",
'cash_2' => "",
'cash_3' => "",
'cash_4' => "",
'cash_adjustment' => "",
'cash_deposit' => "",
'cash_filter' => "",
'change_due' => "",
'change_price' => "",
'check' => "",
'check_balance' => "",
'check_filter' => "",
'close' => "",
'comment' => "",
'comments' => "",
'company_name' => "",
'complete' => "",
'complete_sale' => "",
'confirm_cancel_sale' => "",
'confirm_delete' => "",
'confirm_restore' => "",
'credit' => "",
'credit_deposit' => "",
'credit_filter' => "",
'current_table' => "",
'customer' => "",
'customer_address' => "",
'customer_discount' => "",
'customer_email' => "",
'customer_location' => "",
'customer_mailchimp_status' => "",
'customer_optional' => "",
'customer_required' => "",
'customer_total' => "",
'customer_total_spent' => "",
'daily_sales' => "",
'date' => "",
'date_range' => "",
'date_required' => "",
'date_type' => "",
'debit' => "",
'debit_filter' => "",
'delete' => "",
'delete_confirmation' => "",
'delete_entire_sale' => "",
'delete_successful' => "",
'delete_unsuccessful' => "",
'description_abbrv' => "",
'discard' => "",
'discard_quote' => "",
'discount' => "",
'discount_included' => "",
'discount_short' => "",
'due' => "",
'due_filter' => "",
'edit' => "",
'edit_item' => "",
'edit_sale' => "",
'email_receipt' => "",
'employee' => "",
'entry' => "",
'error_editing_item' => "",
'find_or_scan_item' => "",
'find_or_scan_item_or_receipt' => "",
'giftcard' => "Karta Podarunkowa",
'giftcard_balance' => "",
'giftcard_filter' => "",
'giftcard_number' => "Numer Karty Podarunkowej",
'group_by_category' => "",
'group_by_type' => "",
'hsn' => "",
'id' => "",
'include_prices' => "",
'invoice' => "",
'invoice_confirm' => "",
'invoice_enable' => "",
'invoice_filter' => "",
'invoice_no_email' => "",
'invoice_number' => "",
'invoice_number_duplicate' => "",
'invoice_sent' => "",
'invoice_total' => "",
'invoice_type_custom_invoice' => "",
'invoice_type_custom_tax_invoice' => "",
'invoice_type_invoice' => "",
'invoice_type_tax_invoice' => "",
'invoice_unsent' => "",
'invoice_update' => "",
'item_insufficient_of_stock' => "",
'item_name' => "",
'item_number' => "",
'item_out_of_stock' => "",
'key_browser' => "",
'key_cancel' => "Cancels Current Quote/Invoice/Sale",
'key_customer_search' => "Customer Search",
'key_finish_quote' => "Finish Quote/Invoice witdout payment",
'key_finish_sale' => "Add Payment and Complete Invoice/Sale",
'key_full' => "",
'key_function' => "Function",
'key_help' => "Shortcuts",
'key_help_modal' => "Open Shortcuts Window",
'key_in' => "",
'key_item_search' => "Item Search",
'key_out' => "",
'key_payment' => "Add Payment",
'key_print' => "",
'key_restore' => "",
'key_search' => "",
'key_suspend' => "Suspend Current Sale",
'key_suspended' => "Show Suspended Sales",
'key_system' => "",
'key_tendered' => "Edit Amount Tendered",
'key_title' => "Sales Keyboard Shortcuts",
'mc' => "",
'mode' => "",
'must_enter_numeric' => "",
'must_enter_numeric_giftcard' => "",
'new_customer' => "",
'new_item' => "",
'no_description' => "",
'no_filter' => "",
'no_items_in_cart' => "",
'no_sales_to_display' => "",
'none_selected' => "",
'nontaxed_ind' => "",
'not_authorized' => "",
'one_or_multiple' => "",
'payment' => "",
'payment_amount' => "",
'payment_not_cover_total' => "",
'payment_type' => "",
'payments' => "",
'payments_total' => "",
'price' => "",
'print_after_sale' => "",
'quantity' => "Ilość",
'quantity_less_than_reorder_level' => "",
'quantity_less_than_zero' => "",
'quantity_of_items' => "",
'quote' => "",
'quote_number' => "",
'quote_number_duplicate' => "",
'quote_sent' => "",
'quote_unsent' => "",
'receipt' => "",
'receipt_no_email' => "",
'receipt_number' => "",
'receipt_sent' => "",
'receipt_unsent' => "",
'refund' => "",
'register' => "",
'remove_customer' => "",
'remove_discount' => "",
'return' => "",
'rewards' => "",
'rewards_balance' => "",
'sale' => "",
'sale_by_invoice' => "",
'sale_for_customer' => "",
'sale_time' => "",
'sales_tax' => "",
'sales_total' => "",
'select_customer' => "",
'send_invoice' => "",
'send_quote' => "",
'send_receipt' => "",
'send_work_order' => "",
'serial' => "",
'service_charge' => "",
'show_due' => "",
'show_invoice' => "",
'show_receipt' => "",
'start_typing_customer_name' => "",
'start_typing_item_name' => "",
'stock' => "",
'stock_location' => "",
'sub_total' => "",
'successfully_deleted' => "",
'successfully_restored' => "",
'successfully_suspended_sale' => "",
'successfully_updated' => "",
'suspend_sale' => "",
'suspended_doc_id' => "",
'suspended_sale_id' => "",
'suspended_sales' => "",
'table' => "",
'takings' => "",
'tax' => "",
'tax_id' => "",
'tax_invoice' => "",
'tax_percent' => "",
'taxed_ind' => "",
'total' => "",
'total_tax_exclusive' => "",
'transaction_failed' => "",
'unable_to_add_item' => "",
'unsuccessfully_deleted' => "",
'unsuccessfully_restored' => "",
'unsuccessfully_suspended_sale' => "",
'unsuccessfully_updated' => "",
'unsuspend' => "",
'unsuspend_and_delete' => "",
'update' => "",
'upi' => "",
'visa' => "",
'wholesale' => "",
'work_order' => "",
'work_order_number' => "",
'work_order_number_duplicate' => "",
'work_order_sent' => "",
'work_order_unsent' => "",
];

View File

@@ -1,25 +1,25 @@
<?php
return [
"account_number" => "Numer konta",
"agency_name" => "",
"cannot_be_deleted" => "",
"category" => "",
"company_name" => "",
"company_name_required" => "",
"confirm_delete" => "",
"confirm_restore" => "",
"cost" => "",
"error_adding_updating" => "",
"goods" => "",
"new" => "",
"none_selected" => "",
"one_or_multiple" => "",
"successful_adding" => "",
"successful_deleted" => "",
"successful_updating" => "",
"supplier" => "",
"supplier_id" => "",
"tax_id" => "",
"update" => "",
'account_number' => "Numer konta",
'agency_name' => "",
'cannot_be_deleted' => "",
'category' => "Kategoria",
'company_name' => "",
'company_name_required' => "",
'confirm_delete' => "",
'confirm_restore' => "",
'cost' => "",
'error_adding_updating' => "",
'goods' => "",
'new' => "",
'none_selected' => "",
'one_or_multiple' => "",
'successful_adding' => "",
'successful_deleted' => "",
'successful_updating' => "",
'supplier' => "",
'supplier_id' => "",
'tax_id' => "",
'update' => "",
];

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Tem certeza de que deseja excluir os atributos selecionados?",
"confirm_restore" => "Tem certeza de que deseja restaurar o(s) atributo(s) selecionado(s)?",
"definition_cannot_be_deleted" => "Não foi possível excluir atributo selecionado (s)",
"definition_invalid_group" => "O grupo selecionado não existe ou é inválido.",
"definition_error_adding_updating" => "Atributo {0} não pode ser adicionado ou atualizado. Por favor verifique o log de erros.",
"definition_flags" => "Visibilidade de atributo",
"definition_group" => "Grupo",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Sigur doriti stergerea atributului/atributelor selectat(e)?",
"confirm_restore" => "",
"definition_cannot_be_deleted" => "Nu se poate sterge atributul/atributele selectat(e)",
"definition_invalid_group" => "Grupul selectat nu există sau este invalid.",
"definition_error_adding_updating" => "",
"definition_flags" => "Vizibilitate atribut",
"definition_group" => "Grup",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Вы уверены, что хотите удалить выбранные атрибут(ы)?",
"confirm_restore" => "Вы уверены, что хотите восстановить выбранные атрибут(ы)?",
"definition_cannot_be_deleted" => "Не удалось удалить выбранные атрибут(ы)",
"definition_invalid_group" => "Выбранная группа не существует или недействительна.",
"definition_error_adding_updating" => "Атрибут {0} не может быть добавлен или обновлен. Пожалуйста, проверьте журнал ошибок.",
"definition_flags" => "Видимость атрибута",
"definition_group" => "Группа",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Är du säker på att du vill ta bort de valda attributen?",
"confirm_restore" => "Är du säker på att du vill återställa de valda attributen?",
"definition_cannot_be_deleted" => "Det gick inte att ta bort valda attribut",
"definition_invalid_group" => "Den valda gruppen finns inte eller är ogiltig.",
"definition_error_adding_updating" => "Attribut{0} kunde inte läggas till eller uppdateras. Kontrollera felloggen.",
"definition_flags" => "Attribut synlighet",
"definition_group" => "Grupp",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Una uhakika unataka kufuta sifa iliyochaguliwa/zilizochaguliwa?",
"confirm_restore" => "Una uhakika unataka kurejesha sifa iliyochaguliwa/zilizochaguliwa?",
"definition_cannot_be_deleted" => "Haiwezekani kufuta sifa iliyochaguliwa/zilizochaguliwa",
"definition_invalid_group" => "Kikundi ulichochagua hakipo au hakitoshi.",
"definition_error_adding_updating" => "Sifa {0} haiwezekani kuongezwa au kusasishwa. Tafadhali angalia logi ya makosa.",
"definition_flags" => "Uonekano wa Sifa",
"definition_group" => "Kundi",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Una uhakika unataka kufuta sifa iliyochaguliwa/zilizochaguliwa?",
"confirm_restore" => "Una uhakika unataka kurejesha sifa iliyochaguliwa/zilizochaguliwa?",
"definition_cannot_be_deleted" => "Haiwezekani kufuta sifa iliyochaguliwa/zilizochaguliwa",
"definition_invalid_group" => "Kikundi ulichochagua hakipo au hakitoshi.",
"definition_error_adding_updating" => "Sifa {0} haiwezekani kuongezwa au kusasishwa. Tafadhali angalia logi ya makosa.",
"definition_flags" => "Uonekano wa Sifa",
"definition_group" => "Kundi",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "தேர்ந்தெடுக்கப்பட்ட பண்புக்கூறு (களை) நீக்க விரும்புகிறீர்களா?",
"confirm_restore" => "தேர்ந்தெடுக்கப்பட்ட பண்புக்கூறுகளை (களை) மீட்டெடுக்க விரும்புகிறீர்களா?",
"definition_cannot_be_deleted" => "Could not delete selected attribute(s)",
"definition_invalid_group" => "",
"definition_error_adding_updating" => "Attribute {0} could not be added or updated. Please check the error log.",
"definition_flags" => "Attribute Visibility",
"definition_group" => "Group",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "ต้องการลบคุณลักษณะที่เลือกหรือไม่ ?",
"confirm_restore" => "ต้องการคืนค่าคุณลักษณะที่เลือกหรือไม่ ?",
"definition_cannot_be_deleted" => "ไม่สามารถลบคุณลักษณะที่เลือก",
"definition_invalid_group" => "กลุ่มที่เลือกไม่มีอยู่หรือไม่ถูกต้อง",
"definition_error_adding_updating" => "ไม่สามารถเพิ่มหรือแก้ไขคุณลักษณะ {0}, โปรดตรวจสอบความผิดพลาดในบันทึก",
"definition_flags" => "การมองเห็นคุณลักษณะ",
"definition_group" => "กลุ่ม",

View File

@@ -1,47 +1,47 @@
<?php
return [
"administrator" => "",
"basic_information" => "ข้อมูลพื้นฐานของพนักงาน",
"cannot_be_deleted" => "ไม่สามารถลบพนักงานที่เลือกไว้ได้ เนื่องจากมีการทำรายการขายหรือคุณกำลังพยายามที่จะลบบัญชีของคุณเอง",
"change_employee" => "",
"change_password" => "เปลี่ยนรหัสผ่าน",
"clerk" => "",
"commission" => "",
"confirm_delete" => "คุณยืนยันการลบข้อมูลพนักงานที่เลือกไว้?",
"confirm_restore" => "คุณแน่ใจหรือไม่ว่าต้องการกู้คืนพนักงานที่เลือกไว้?",
"current_password" => "รหัสผ่านปัจจุบัน",
"current_password_invalid" => "รหัสผ่านปัจจุบันไม่ถูกต้อง",
"employee" => "พนักงาน",
"error_adding_updating" => "การเพิ่มหรือปรับปรุงข้อมูลพนักงานผิดพลาด",
"error_deleting_admin" => "",
"error_updating_admin" => "",
"error_deleting_demo_admin" => "คุณไม่สามารถลบผู้ใช้งานสำหรับการเดโม้ได้",
"error_updating_demo_admin" => "คุณไม่สามารถทำการเปลี่ยนข้อมูลผู้ใช้งานเดโม้ได้",
"language" => "ภาษา",
"login_info" => "รหัสเข้าระบบ",
"manager" => "",
"new" => "เพิ่มพนักงาน",
"none_selected" => "โปรดเลือกพนักงานที่จะลบ",
"one_or_multiple" => "พนักงาน",
"password" => "รหัสผ่าน",
"password_minlength" => "รหัสผ่านต้องยาวอย่างน้อย 8 อักษร",
"password_must_match" => "รหัสผ่านไม่ตรงกัน",
"password_not_must_match" => "รหัสผ่านปัจจุบันและรหัสผ่านใหม่จะต้องไม่ซ้ำกัน",
"password_required" => "ต้องระบุรหัสผ่าน",
"permission_desc" => "ทำเครื่องหมายในช่องด้านล่างเพื่อให้สิทธิ์การเข้าถึงโมดูลต่างๆ",
"permission_info" => "สิทธิ์",
"repeat_password" => "ระบุรหัสผ่านอีกครั้ง",
"subpermission_required" => "เพิ่มการอนุญาตอย่างน้อยหนึ่งรายการสำหรับแต่ละโมดูล",
"successful_adding" => "เพิ่มข้อมูลพนักงานเรียบร้อยแล้ว",
"successful_change_password" => "ทำการเปลี่ยนรหัสผ่านเรียบร้อยแล้ว",
"successful_deleted" => "ลบข้อมูลสำเร็จ",
"successful_updating" => "ปรับปรุงข้อมูลพนักงานเรียบร้อยแล้ว",
"system_language" => "ภาษาของระบบ",
"unsuccessful_change_password" => "เปลี่ยนรหัสผ่านไม่สำเร็จ",
"update" => "แก้ไขข้อมูลพนักงาน",
"username" => "ชื่อผู้ใช้งาน",
"username_duplicate" => "ชื่อผู้ใช้งานพนักงานถูกใช้งานแล้ว กรุณาเลือกใช้งานชื่ออื่น",
"username_minlength" => "ชื่อผู้ใช้งานต้องยาวอย่างน้อย 5 อักษร",
"username_required" => "จำเป็นต้องระบุชื่อผู้ใช้งาน",
'administrator' => "",
'basic_information' => "ข้อมูลพื้นฐานของพนักงาน",
'cannot_be_deleted' => "ไม่สามารถลบพนักงานที่เลือกไว้ได้ เนื่องจากมีการทำรายการขายหรือคุณกำลังพยายามที่จะลบบัญชีของคุณเอง",
'change_employee' => "",
'change_password' => "เปลี่ยนรหัสผ่าน",
'clerk' => "",
'commission' => "",
'confirm_delete' => "คุณยืนยันการลบข้อมูลพนักงานที่เลือกไว้?",
'confirm_restore' => "คุณแน่ใจหรือไม่ว่าต้องการกู้คืนพนักงานที่เลือกไว้?",
'current_password' => "รหัสผ่านปัจจุบัน",
'current_password_invalid' => "รหัสผ่านปัจจุบันไม่ถูกต้อง",
'employee' => "พนักงาน",
'error_adding_updating' => "การเพิ่มหรือปรับปรุงข้อมูลพนักงานผิดพลาด",
'error_deleting_admin' => "คุณไม่สามารถลบบัญชีแอดมินได้",
'error_updating_admin' => "คุณไม่สามารถแก้ไขบัญชีแอดมินได้",
'error_deleting_demo_admin' => "คุณไม่สามารถลบผู้ใช้งานสำหรับการเดโม้ได้",
'error_updating_demo_admin' => "คุณไม่สามารถทำการเปลี่ยนข้อมูลผู้ใช้งานเดโม้ได้",
'language' => "ภาษา",
'login_info' => "รหัสเข้าระบบ",
'manager' => "",
'new' => "เพิ่มพนักงาน",
'none_selected' => "โปรดเลือกพนักงานที่จะลบ",
'one_or_multiple' => "พนักงาน",
'password' => "รหัสผ่าน",
'password_minlength' => "รหัสผ่านต้องยาวอย่างน้อย 8 อักษร",
'password_must_match' => "รหัสผ่านไม่ตรงกัน",
'password_not_must_match' => "รหัสผ่านปัจจุบันและรหัสผ่านใหม่จะต้องไม่ซ้ำกัน",
'password_required' => "ต้องระบุรหัสผ่าน",
'permission_desc' => "ทำเครื่องหมายในช่องด้านล่างเพื่อให้สิทธิ์การเข้าถึงโมดูลต่างๆ",
'permission_info' => "สิทธิ์",
'repeat_password' => "ระบุรหัสผ่านอีกครั้ง",
'subpermission_required' => "เพิ่มการอนุญาตอย่างน้อยหนึ่งรายการสำหรับแต่ละโมดูล",
'successful_adding' => "เพิ่มข้อมูลพนักงานเรียบร้อยแล้ว",
'successful_change_password' => "ทำการเปลี่ยนรหัสผ่านเรียบร้อยแล้ว",
'successful_deleted' => "ลบข้อมูลสำเร็จ",
'successful_updating' => "ปรับปรุงข้อมูลพนักงานเรียบร้อยแล้ว",
'system_language' => "ภาษาของระบบ",
'unsuccessful_change_password' => "เปลี่ยนรหัสผ่านไม่สำเร็จ",
'update' => "แก้ไขข้อมูลพนักงาน",
'username' => "ชื่อผู้ใช้งาน",
'username_duplicate' => "ชื่อผู้ใช้งานพนักงานถูกใช้งานแล้ว กรุณาเลือกใช้งานชื่ออื่น",
'username_minlength' => "ชื่อผู้ใช้งานต้องยาวอย่างน้อย 5 อักษร",
'username_required' => "จำเป็นต้องระบุชื่อผู้ใช้งาน",
];

View File

@@ -1,51 +1,51 @@
<?php
return [
"add_item" => "เพิ่มรายจ่าย",
"amount" => "จำนวน",
"amount_number" => "ยอดจำนวนต้องเป็นตัวเลข",
"amount_required" => "จำเป็นต้องระบุยอดค่าใช้จ่าย",
"by_category" => "หมวดหมู่",
"cannot_be_deleted" => "ไม่สามารถลบหมวดหมู่ค่าใช้จ่าย",
"cash" => "เงินสด",
"cash_filter" => "เงินสด",
"categories_name" => "หมวดหมู่",
"category_required" => "จำเป็นต้องระบุหมวดหมู่",
"check" => "ตรวจสอบ",
"check_filter" => "เช็ค",
"confirm_delete" => "คุณแน่ใจหรือว่าต้องการลบค่าใช้จ่ายที่เลือกทั้งหมด?",
"confirm_restore" => "คุณแน่ใจหรือไม่ว่าต้องการคืนค่าใช้จ่ายที่เลือกทั้งหมด?",
"credit" => "บัตรเครดิต",
"credit_filter" => "บัตรเครติด",
"date" => "วันที่",
"date_number" => "วันที่ต้องเป็นตัวเลข",
"date_required" => "จำเป็นต้องระบุวันที่",
"debit" => "บัตรเดบิต",
"debit_filter" => "บัตรเดบิต",
"description" => "คำอธิบาย",
"due" => "ครบกำหนด",
"due_filter" => "ครบกำหนด",
"employee" => "สร้างโดย",
"error_adding_updating" => "ผิดพลาดขณะเพิ่ม/ปรับปรุงค่าใช้จ่าย",
"expense_id" => "รหัส",
"expenses_employee" => "ลูกจ้าง",
"info" => "ข้อมูลค่าใช้จ่าย",
"ip_address" => "",
"is_deleted" => "ถูกลบ",
"name_required" => "ต้องระบุชื่อรายจ่าย",
"new" => "เพิ่มรายจ่าย",
"new_supplier" => "",
"no_expenses_to_display" => "ไม่มีรายจ่ายต้องแสดง",
"none_selected" => "ท่านยังไม่ได้เลือกรายจ่าย",
"one_or_multiple" => "รายจ่าย",
"payment" => "ประเภทการชำระ",
"start_typing_supplier_name" => "เริ่มต้นพิมพ์ชื่อผู้ผลิต...",
"successful_adding" => "เพิ่มรายจ่ายสำเร็จ",
"successful_deleted" => "ลบรายจ่ายสำเร็จ",
"successful_updating" => "ปรับปรุงรายจ่ายสำเร็จ",
"supplier_name" => "ผู้ผลิต",
"supplier_tax_code" => "รหัสภาษี",
"tax_amount" => "ภาษี",
"tax_amount_number" => "",
"update" => "ปรับปรุงค่าใช้จ่าย",
'add_item' => "เพิ่มค่าใช้จ่าย",
'amount' => "จำนวน",
'amount_number' => "ยอดจำนวนต้องเป็นตัวเลข",
'amount_required' => "จำเป็นต้องระบุยอดค่าใช้จ่าย",
'by_category' => "หมวดหมู่",
'cannot_be_deleted' => "ไม่สามารถลบหมวดหมู่ค่าใช้จ่าย",
'cash' => "เงินสด",
'cash_filter' => "เงินสด",
'categories_name' => "หมวดหมู่",
'category_required' => "จำเป็นต้องระบุหมวดหมู่",
'check' => "ตรวจสอบ",
'check_filter' => "เช็ค",
'confirm_delete' => "คุณแน่ใจหรือว่าต้องการลบค่าใช้จ่ายที่เลือกทั้งหมด?",
'confirm_restore' => "คุณแน่ใจหรือไม่ว่าต้องการคืนค่าใช้จ่ายที่เลือกทั้งหมด?",
'credit' => "บัตรเครดิต",
'credit_filter' => "บัตรเครติด",
'date' => "วันที่",
'date_number' => "วันที่ต้องเป็นตัวเลข",
'date_required' => "จำเป็นต้องระบุวันที่",
'debit' => "บัตรเดบิต",
'debit_filter' => "บัตรเดบิต",
'description' => "คำอธิบาย",
'due' => "ครบกำหนด",
'due_filter' => "ครบกำหนด",
'employee' => "สร้างโดย",
'error_adding_updating' => "ผิดพลาดขณะเพิ่ม/ปรับปรุงค่าใช้จ่าย",
'expense_id' => "รหัส",
'expenses_employee' => "ลูกจ้าง",
'info' => "ข้อมูลค่าใช้จ่าย",
'ip_address' => "",
'is_deleted' => "ถูกลบ",
'name_required' => "ต้องระบุชื่อค่าใช้จ่าย",
'new' => "เพิ่มค่าใช้จ่ายใหม่",
'new_supplier' => "",
'no_expenses_to_display' => "ไม่มีค่าใช้จ่ายต้องแสดง",
'none_selected' => "ท่านยังไม่ได้เลือกค่าใช้จ่าย",
'one_or_multiple' => "ค่าใช้จ่าย",
'payment' => "ประเภทการชำระ",
'start_typing_supplier_name' => "เริ่มต้นพิมพ์ชื่อผู้ผลิต...",
'successful_adding' => "เพิ่มค่าใช้จ่ายสำเร็จ",
'successful_deleted' => "ลบค่าใช้จ่ายสำเร็จ",
'successful_updating' => "ปรับปรุงค่าใช้จ่ายสำเร็จ",
'supplier_name' => "ผู้ผลิต",
'supplier_tax_code' => "รหัสภาษี",
'tax_amount' => "ภาษี",
'tax_amount_number' => "",
'update' => "ปรับปรุงค่าใช้จ่าย",
];

View File

@@ -1,72 +1,72 @@
<?php
return [
"add_minus" => "สินค้าคงคลัง เพิ่ม/ลด",
"allow_alt_description" => "คำอธิบายสำรอง",
"bulk_edit" => "แก้ไขเป็นกลุ่ม",
"cannot_be_deleted" => "ไม่สามารถลบข้อมูลบัตรของขวัญที่เลือก, หรือบัตรของขวัญได้มีการใช้ไปแล้ว",
"cannot_find_giftcard" => "ไม่พบข้อมูลเกี่ยวกับบัตรของขวัญนี้",
"cannot_use" => "บัตรของขวัญ {0} ไม่สามารถใช้งานกับรายการขายนี้ได้ เนื่องจากรายการลูกค้าไม่ถูกต้อง",
"card_value" => "มูลค่า",
"category" => "ประเภท",
"change_all_to_allow_alt_desc" => "คำอธิบายสำรองสำหรับทั้งหมด",
"change_all_to_not_allow_allow_desc" => "ไม่อนุญาตให้เปลี่ยนคำอธิบายทั้งหมด",
"change_all_to_serialized" => "เปลี่ยนแปลงทั้งหมด",
"change_all_to_unserialized" => "เปลี่ยนทั้งหมดเป็นแบบไม่ต่อเนื่องกัน",
"confirm_bulk_edit" => "คุณแน่ใจหรือไม่ว่าต้องการแก้ไขบัตรของขวัญที่เลือก?",
"confirm_delete" => "คุณแน่ใจหรือไม่ว่าต้องการลบบัตรของขวัญที่เลือก?",
"confirm_restore" => "คุณแน่ใจหรือไม่ว่าต้องการยกเลิกบัตรของขวัญที่เลือก?",
"cost_price" => "ต้นทุน",
"count" => "ปรับปรุงสินค้าคงคลัง",
"csv_import_failed" => "การส่งออกในรูปแบบไฟล์เอ็กเซล ไม่สำเร็จ",
"current_quantity" => "จำนวน ณ. ปัจจุบัน",
"description" => "รายละเอียด",
"details_count" => "รายละเอียดการตรวจนับในสินค้าคงคลัง",
"do_nothing" => "ไม่ทำอะไร",
"edit_fields_you_want_to_update" => "แก้ไขฟิลด์ที่ต้องการสำหรับบัตรของขวัญที่เลือก",
"edit_multiple_giftcards" => "แก้ไขบัตรกำนัลหลายใบ",
"error_adding_updating" => "มีข้อผิดพลาดในการ เพิ่ม/ปรับปรุง บัตรกำนัล",
"error_updating_multiple" => "มีข้อผิดพลาดในการปรับปรุง บัตรกำนัล",
"generate_barcodes" => "สร้างบาร์โค้ด",
"giftcard" => "บัตรกำนัล",
"giftcard_number" => "เลขบัตรกำนัล",
"info_provided_by" => "ข้อมูลที่จัดทำโดย",
"inventory_comments" => "คำแนะนำ",
"is_serialized" => "Giftcard has Serial Number",
"low_inventory_giftcards" => "Low Inventory Giftcards",
"manually_editing_of_quantity" => "แก้ไขจำนวนปริมาณเอง",
"must_select_giftcard_for_barcode" => "กรุณาเลือกบัตรกำนัลอย่างน้อย 1 รายการ เพื่อสร้างบาร์โค๊ด",
"new" => "เพิ่มบัตรกำนัล",
"no_description_giftcards" => "No Description Giftcards",
"no_giftcards_to_display" => "No Giftcards to display",
"none" => "ไม่มี",
"none_selected" => "กรุณาเลือกบัตรกำนัลที่ต้องการแก้ไข",
"number" => "เลขบัตรกำนัลต้องเป็นตัวเลขเท่านั้น",
"number_information" => "หมายเลขบัตรของขวัญ",
"number_required" => "ต้องกรอกเลขบัตรกำนัล",
"one_or_multiple" => "giftcard(s)",
"person_id" => "เจ้าของบัตร",
"quantity" => "ปริมาณ",
"quantity_required" => "ช่องข้อมูลปริมาณ จำเป็นต้องกรอก. คลิกที่เครื่องหมาย ( X ) เพื่อยกเลิก",
"remaining_balance" => "บัตรของขวัญ {0} มีมูลค่า {1}!",
"reorder_level" => "ยอดขั้นต่ำ",
"retrive_giftcard_info" => "Retrieve Giftcard Info",
"sales_tax_1" => "ภาษีการขาย",
"sales_tax_2" => "ภาษีขาย 2",
"serialized_giftcards" => "Serialized Giftcards",
"successful_adding" => "You have successfully added giftcard",
"successful_bulk_edit" => "You have successfully updated the selected giftcards",
"successful_deleted" => "คุณทำการลบสำเร็จแล้ว",
"successful_updating" => "You have successfully updated giftcard",
"supplier" => "ผู้ผลิต",
"tax_1" => "ภาษี 1",
"tax_2" => "ภาษี 2",
"tax_percent" => "เปอร์เซ็นต์ภาษี",
"tax_percents" => "อัตราภาษีแบบเปอร์เซ็นต์",
"unit_price" => "ราคาปลีก",
"upc_database" => "ฐานข้อมุลบาร์โค๊ด",
"update" => "ปรับข้อมูลบัตรกำนัล",
"use_inventory_menu" => "ใช้เมนูสินค้าคงคลัง",
"value" => "มูลค่าบัตรกำนัลต้องเป็นตัวเลขเท่านั้น",
"value_required" => "ต้องกรอกมูลค่าบัตรกำนัล",
'add_minus' => "สินค้าคงคลัง เพิ่ม/ลด",
'allow_alt_description' => "คำอธิบายสำรอง",
'bulk_edit' => "แก้ไขเป็นกลุ่ม",
'cannot_be_deleted' => "ไม่สามารถลบข้อมูลบัตรของขวัญที่เลือก, หรือบัตรของขวัญได้มีการใช้ไปแล้ว",
'cannot_find_giftcard' => "ไม่พบข้อมูลเกี่ยวกับบัตรของขวัญนี้",
'cannot_use' => "บัตรของขวัญ {0} ไม่สามารถใช้งานกับรายการขายนี้ได้ เนื่องจากรายการลูกค้าไม่ถูกต้อง",
'card_value' => "มูลค่า",
'category' => "ประเภท",
'change_all_to_allow_alt_desc' => "คำอธิบายสำรองสำหรับทั้งหมด",
'change_all_to_not_allow_allow_desc' => "ไม่อนุญาตให้เปลี่ยนคำอธิบายทั้งหมด",
'change_all_to_serialized' => "เปลี่ยนแปลงทั้งหมด",
'change_all_to_unserialized' => "เปลี่ยนทั้งหมดเป็นแบบไม่ต่อเนื่องกัน",
'confirm_bulk_edit' => "คุณแน่ใจหรือไม่ว่าต้องการแก้ไขบัตรของขวัญที่เลือก?",
'confirm_delete' => "คุณแน่ใจหรือไม่ว่าต้องการลบบัตรของขวัญที่เลือก?",
'confirm_restore' => "คุณแน่ใจหรือไม่ว่าต้องการยกเลิกบัตรของขวัญที่เลือก?",
'cost_price' => "ราคาขายส่ง",
'count' => "ปรับปรุงสินค้าคงคลัง",
'csv_import_failed' => "การส่งออกในรูปแบบไฟล์เอ็กเซล ไม่สำเร็จ",
'current_quantity' => "จำนวน ณ. ปัจจุบัน",
'description' => "รายละเอียด",
'details_count' => "รายละเอียดการตรวจนับในสินค้าคงคลัง",
'do_nothing' => "ไม่ทำอะไร",
'edit_fields_you_want_to_update' => "แก้ไขฟิลด์ที่ต้องการสำหรับบัตรของขวัญที่เลือก",
'edit_multiple_giftcards' => "แก้ไขบัตรกำนัลหลายใบ",
'error_adding_updating' => "มีข้อผิดพลาดในการ เพิ่ม/ปรับปรุง บัตรกำนัล",
'error_updating_multiple' => "มีข้อผิดพลาดในการปรับปรุง บัตรกำนัล",
'generate_barcodes' => "สร้างบาร์โค้ด",
'giftcard' => "บัตรกำนัล",
'giftcard_number' => "เลขบัตรกำนัล",
'info_provided_by' => "ข้อมูลที่จัดทำโดย",
'inventory_comments' => "คำแนะนำ",
'is_serialized' => "Giftcard has Serial Number",
'low_inventory_giftcards' => "Low Inventory Giftcards",
'manually_editing_of_quantity' => "แก้ไขจำนวนปริมาณเอง",
'must_select_giftcard_for_barcode' => "กรุณาเลือกบัตรกำนัลอย่างน้อย 1 รายการ เพื่อสร้างบาร์โค๊ด",
'new' => "เพิ่มบัตรกำนัล",
'no_description_giftcards' => "No Description Giftcards",
'no_giftcards_to_display' => "No Giftcards to display",
'none' => "ไม่มี",
'none_selected' => "กรุณาเลือกบัตรกำนัลที่ต้องการแก้ไข",
'number' => "เลขบัตรกำนัลต้องเป็นตัวเลขเท่านั้น",
'number_information' => "หมายเลขบัตรของขวัญ",
'number_required' => "ต้องกรอกเลขบัตรกำนัล",
'one_or_multiple' => "giftcard(s)",
'person_id' => "เจ้าของบัตร",
'quantity' => "ปริมาณ",
'quantity_required' => "ช่องข้อมูลปริมาณ จำเป็นต้องกรอก. คลิกที่เครื่องหมาย ( X ) เพื่อยกเลิก",
'remaining_balance' => "บัตรของขวัญ {0} มีมูลค่า {1}!",
'reorder_level' => "ยอดขั้นต่ำ",
'retrive_giftcard_info' => "Retrieve Giftcard Info",
'sales_tax_1' => "ภาษีการขาย",
'sales_tax_2' => "ภาษีขาย 2",
'serialized_giftcards' => "Serialized Giftcards",
'successful_adding' => "You have successfully added giftcard",
'successful_bulk_edit' => "You have successfully updated the selected giftcards",
'successful_deleted' => "คุณทำการลบสำเร็จแล้ว",
'successful_updating' => "You have successfully updated giftcard",
'supplier' => "ผู้ผลิต",
'tax_1' => "ภาษี 1",
'tax_2' => "ภาษี 2",
'tax_percent' => "เปอร์เซ็นต์ภาษี",
'tax_percents' => "อัตราภาษีแบบเปอร์เซ็นต์",
'unit_price' => "ราคาปลีก",
'upc_database' => "ฐานข้อมุลบาร์โค๊ด",
'update' => "ปรับข้อมูลบัตรกำนัล",
'use_inventory_menu' => "ใช้เมนูสินค้าคงคลัง",
'value' => "มูลค่าบัตรกำนัลต้องเป็นตัวเลขเท่านั้น",
'value_required' => "ต้องกรอกมูลค่าบัตรกำนัล",
];

View File

@@ -1,122 +1,122 @@
<?php
return [
"add_minus" => "เพิ่ม/ลบ จำนวนสินค้าคงคลัง",
"allow_alt_description" => "แสดงข้อมูลเพิ่มเติม",
"amount_entry" => "จำนวนเงิน",
"bulk_edit" => "แก้ไขความจุ",
"buy_price_required" => "ราคาซื้อขายต้องกรอก",
"cannot_be_deleted" => "ไม่สามารถลบสินค้าที่เลือก, สินค้าที่เลือกถูกขายไปแล้ว.",
"cannot_find_item" => "ไม่พบข้อมูลของสินค้า",
"categories" => "",
"category" => "หมวดหมู่",
"category_new" => "",
"category_required" => "หมวดหมู่สินค้าต้องกรอก",
"change_all_to_allow_alt_desc" => "อนุญาตให้รายละเอียดสำรองทั้งหมด",
"change_all_to_not_allow_allow_desc" => "ไม่อนุญาตให้จัดเรียงลำดับ",
"change_all_to_serialized" => "เปลี่ยนแปลงรหัสสินค้าทั้งหมด",
"change_all_to_unserialized" => "ลบรหัสสินค้าทั้งหมด",
"change_image" => "เปลี่ยนรูปภาพ",
"confirm_bulk_edit" => "แน่ใจหรือไม่ที่จะแก้ใขสินค้าทั้งหมดที่คุณเลือก?",
"confirm_bulk_edit_wipe_taxes" => "ข้อมูลภาษีทั้งหมดจะถูกแทนที่",
"confirm_delete" => "โปรดยืนยันการลบสินค้าที่ถูกเลือก?",
"confirm_restore" => "คุณแน่ใจหรือไม่ว่าต้องการกู้คืนรายการที่เลือก?",
"cost_price" => "ราคาขายส่ง",
"cost_price_number" => "ราคาขายส่งต้องเป็นตัวเลข",
"cost_price_required" => "ต้องกรอกราคาขายส่ง",
"count" => "แก้ไขจำนวนสินค้าคงคลัง",
"csv_import_failed" => "นำเข้าข้อมูล CSV ล้มเหลว",
"csv_import_invalid_location" => "",
"csv_import_nodata_wrongformat" => "Your uploaded file has no data or wrong format",
"csv_import_partially_failed" => "มีรายการ {0} รายการที่นำเข้าล้มเหลว : {1} รายการที่ยังไม่ได้นำเข้า",
"csv_import_success" => "Import of Items successful",
"current_quantity" => "ปริมาณสินค้าคงคลัง",
"default_pack_name" => "ชิ้นละ",
"description" => "รายละเอียด",
"details_count" => "รายละเอียดจำนวนสินค้าคงคลัง",
"do_nothing" => "ไม่ต้องทำอะไร",
"edit" => "",
"edit_fields_you_want_to_update" => "แก้ไขสินค้าทุกชนิดที่คุณเลือก",
"edit_multiple_items" => "แก้ใขสินค้าต่างๆ",
"empty_upc_items" => "Empty UPC Items",
"error_adding_updating" => "เพิ่ม/ปรับแต่ง สินค้าล้มเหลว",
"error_updating_multiple" => "ปรับแต่งสินค้าล้มเหลว",
"generate_barcodes" => "พิมพ์บาร์โค๊ด",
"hsn_code" => "ระบบการตั้งชื่อที่กลมกลืนกัน",
"image" => "รูป",
"import_items_csv" => "รายการที่นำเข้าจาก CSV",
"info_provided_by" => "จัดเตรียมข้อมูลโดย",
"inventory" => "สินค้าคงเหลือ",
"inventory_CSV_import_quantity" => "จำนวนที่นำเข้าจาก CSV",
"inventory_comments" => "คำอธิบาย",
"inventory_data_tracking" => "การติดตามข้อมูลสินค้าคงคลัง",
"inventory_date" => "วันที่",
"inventory_employee" => "พนักงาน",
"inventory_in_out_quantity" => "ปริมาณเข้า / ออก",
"inventory_remarks" => "หมายเหตุ",
"is_deleted" => "ถูกลบแล้ว",
"is_printed" => "",
"is_serialized" => "สินค้ามีซีเรียลนัมเบอร์",
"item" => "สินค้า",
"item_id" => "",
"item_number" => "โค๊ด",
"item_number_duplicate" => "The item number is already present in the database",
"kit" => "ชุด",
"location" => "ที่ตั้ง",
"low_inventory_items" => "สินค้าคงเหลือน้อย",
"low_sell_item" => "รายการขายต่ำ",
"manually_editing_of_quantity" => "แก้ไขจำนวน",
"markup" => "",
"name" => "ชื่อสินค้า",
"name_required" => "ชื่อสินค้าต้องกรอก",
"new" => "เพิ่มรายการสินค้า",
"no_description_items" => "สินค้าที่ไม่มีคำอธิบายหรือวิธีการใช้",
"no_items_to_display" => "ไม่มีสินค้าแสดง",
"none" => "ว่างเปล่า",
"none_selected" => "กรุณาเลือสินค้าที่ต้องการแก้ไข",
"nonstock" => "ไม่นับสต็อก",
"number_information" => "หมายเลขสินค้า",
"number_required" => "จำเป็นต้องระบุบาร์โค้ด",
"one_or_multiple" => "สินค้า(s)",
"pack_name" => "ชื่อแพ็ค",
"qty_per_pack" => "ปริมาณต่อแพ็ค",
"quantity" => "จำนวน",
"quantity_number" => "จำนวนต้องเป็นตัวเลข",
"quantity_required" => "จำนวนต้องกรอก",
"receiving_quantity" => "ยอดรับมา",
"remove_image" => "นำภาพออก",
"reorder_level" => "ระดับการสั่งใหม่",
"reorder_level_number" => "ระดับการสั่งใหม่ต้องเป็นตัวเลข",
"reorder_level_required" => "ระดับการสั่งไหม่ต้องกรอก",
"retrive_item_info" => "ดึงข้อมูลรายการ",
"sales_tax_1" => "ถาษีขาย",
"sales_tax_2" => "ภาษีขาย 2",
"search_attributes" => "ค้นหาตามคุณสมบัติ",
"select_image" => "เลือกรูปภาพ",
"serialized_items" => "รหัสสินค้า",
"standard" => "มาตรฐาน",
"stock" => "คลังสินค้า",
"stock_location" => "ที่เก็บ",
"stock_type" => "ประเภทคลัง",
"successful_adding" => "เพิ่มสินค้าสำเร็จ",
"successful_bulk_edit" => "ปรับแต่งสินค้าสำเร็จ",
"successful_deleted" => "ลบสินค้าสำเร็จ",
"successful_updating" => "ปรับแต่งสินค้าสำเร็จ",
"supplier" => "ผู้ผลิต",
"tax_1" => "ภาษี 1",
"tax_2" => "ภาษี 2",
"tax_3" => "",
"tax_category" => "ประเภทภาษี",
"tax_percent" => "ภาษี(%)",
"tax_percent_number" => "เปอร์เซ็นต์ภาษีต้องเป็นค่าตัวเลข",
"tax_percent_required" => "เปอร์เซ็นต์ต้องกรอก",
"tax_percents" => "ภาษี(%)",
"temp" => "ชั่วคราว",
"type" => "ประเภทรายการ",
"unit_price" => "ราคาขาย",
"unit_price_number" => "ราคาต่อหน่วยต้องเป็นตัวเลข",
"unit_price_required" => "ราคาต่อหน่วยต้องกรอก",
"upc_database" => "UPC ฐานข้อมูล",
"update" => "ปรับแต่งสินค้า",
"use_inventory_menu" => "ใช้เมนูสินค้าคงเหลือ",
'add_minus' => "เพิ่ม/ลบ จำนวนสินค้าคงคลัง",
'allow_alt_description' => "แสดงข้อมูลเพิ่มเติม",
'amount_entry' => "จำนวนเงิน",
'bulk_edit' => "แก้ไขความจุ",
'buy_price_required' => "ราคาซื้อขายต้องกรอก",
'cannot_be_deleted' => "ไม่สามารถลบสินค้าที่เลือก, สินค้าที่เลือกถูกขายไปแล้ว.",
'cannot_find_item' => "ไม่พบข้อมูลของสินค้า",
'categories' => "",
'category' => "หมวดหมู่",
'category_new' => "",
'category_required' => "หมวดหมู่สินค้าต้องกรอก",
'change_all_to_allow_alt_desc' => "อนุญาตให้รายละเอียดสำรองทั้งหมด",
'change_all_to_not_allow_allow_desc' => "ไม่อนุญาตให้จัดเรียงลำดับ",
'change_all_to_serialized' => "เปลี่ยนแปลงรหัสสินค้าทั้งหมด",
'change_all_to_unserialized' => "ลบรหัสสินค้าทั้งหมด",
'change_image' => "เปลี่ยนรูปภาพ",
'confirm_bulk_edit' => "แน่ใจหรือไม่ที่จะแก้ใขสินค้าทั้งหมดที่คุณเลือก?",
'confirm_bulk_edit_wipe_taxes' => "ข้อมูลภาษีทั้งหมดจะถูกแทนที่",
'confirm_delete' => "โปรดยืนยันการลบสินค้าที่ถูกเลือก?",
'confirm_restore' => "คุณแน่ใจหรือไม่ว่าต้องการกู้คืนรายการที่เลือก?",
'cost_price' => "ราคาขายส่ง",
'cost_price_number' => "ราคาขายส่งต้องเป็นตัวเลข",
'cost_price_required' => "ต้องกรอกราคาขายส่ง",
'count' => "แก้ไขจำนวนสินค้าคงคลัง",
'csv_import_failed' => "นำเข้าข้อมูล CSV ล้มเหลว",
'csv_import_invalid_location' => "คลังสินค้าไม่ถูกต้องหรือไม่พบ: {0} อนุญาตเฉพาะคลังสินค้าที่มีเท่านั้น",
'csv_import_nodata_wrongformat' => "Your uploaded file has no data or wrong format",
'csv_import_partially_failed' => "มีรายการ {0} รายการที่นำเข้าล้มเหลว : {1} รายการที่ยังไม่ได้นำเข้า",
'csv_import_success' => "Import of Items successful",
'current_quantity' => "ปริมาณสินค้าคงคลัง",
'default_pack_name' => "ชิ้นละ",
'description' => "รายละเอียด",
'details_count' => "รายละเอียดจำนวนสินค้าคงคลัง",
'do_nothing' => "ไม่ต้องทำอะไร",
'edit' => "",
'edit_fields_you_want_to_update' => "แก้ไขสินค้าทุกชนิดที่คุณเลือก",
'edit_multiple_items' => "แก้ใขสินค้าต่างๆ",
'empty_upc_items' => "Empty UPC Items",
'error_adding_updating' => "เพิ่ม/ปรับแต่ง สินค้าล้มเหลว",
'error_updating_multiple' => "ปรับแต่งสินค้าล้มเหลว",
'generate_barcodes' => "พิมพ์บาร์โค๊ด",
'hsn_code' => "ระบบการตั้งชื่อที่กลมกลืนกัน",
'image' => "รูป",
'import_items_csv' => "รายการที่นำเข้าจาก CSV",
'info_provided_by' => "จัดเตรียมข้อมูลโดย",
'inventory' => "สินค้าคงเหลือ",
'inventory_CSV_import_quantity' => "จำนวนที่นำเข้าจาก CSV",
'inventory_comments' => "คำอธิบาย",
'inventory_data_tracking' => "การติดตามข้อมูลสินค้าคงคลัง",
'inventory_date' => "วันที่",
'inventory_employee' => "พนักงาน",
'inventory_in_out_quantity' => "ปริมาณเข้า / ออก",
'inventory_remarks' => "หมายเหตุ",
'is_deleted' => "ถูกลบแล้ว",
'is_printed' => "",
'is_serialized' => "สินค้ามีซีเรียลนัมเบอร์",
'item' => "สินค้า",
'item_id' => "",
'item_number' => "โค๊ด",
'item_number_duplicate' => "The item number is already present in the database",
'kit' => "ชุด",
'location' => "ที่ตั้ง",
'low_inventory_items' => "สินค้าคงเหลือน้อย",
'low_sell_item' => "รายการขายต่ำ",
'manually_editing_of_quantity' => "แก้ไขจำนวน",
'markup' => "",
'name' => "ชื่อสินค้า",
'name_required' => "ชื่อสินค้าต้องกรอก",
'new' => "เพิ่มรายการสินค้า",
'no_description_items' => "สินค้าที่ไม่มีคำอธิบายหรือวิธีการใช้",
'no_items_to_display' => "ไม่มีสินค้าแสดง",
'none' => "ว่างเปล่า",
'none_selected' => "กรุณาเลือสินค้าที่ต้องการแก้ไข",
'nonstock' => "ไม่นับสต็อก",
'number_information' => "หมายเลขสินค้า",
'number_required' => "จำเป็นต้องระบุบาร์โค้ด",
'one_or_multiple' => "สินค้า(s)",
'pack_name' => "ชื่อแพ็ค",
'qty_per_pack' => "ปริมาณต่อแพ็ค",
'quantity' => "จำนวน",
'quantity_number' => "จำนวนต้องเป็นตัวเลข",
'quantity_required' => "จำนวนต้องกรอก",
'receiving_quantity' => "ยอดรับมา",
'remove_image' => "นำภาพออก",
'reorder_level' => "ระดับการสั่งใหม่",
'reorder_level_number' => "ระดับการสั่งใหม่ต้องเป็นตัวเลข",
'reorder_level_required' => "ระดับการสั่งไหม่ต้องกรอก",
'retrive_item_info' => "ดึงข้อมูลรายการ",
'sales_tax_1' => "ถาษีขาย",
'sales_tax_2' => "ภาษีขาย 2",
'search_attributes' => "ค้นหาตามคุณสมบัติ",
'select_image' => "เลือกรูปภาพ",
'serialized_items' => "รหัสสินค้า",
'standard' => "มาตรฐาน",
'stock' => "คลังสินค้า",
'stock_location' => "ที่เก็บ",
'stock_type' => "ประเภทคลัง",
'successful_adding' => "เพิ่มสินค้าสำเร็จ",
'successful_bulk_edit' => "ปรับแต่งสินค้าสำเร็จ",
'successful_deleted' => "ลบสินค้าสำเร็จ",
'successful_updating' => "ปรับแต่งสินค้าสำเร็จ",
'supplier' => "ผู้ผลิต",
'tax_1' => "ภาษี 1",
'tax_2' => "ภาษี 2",
'tax_3' => "",
'tax_category' => "ประเภทภาษี",
'tax_percent' => "ภาษี(%)",
'tax_percent_number' => "เปอร์เซ็นต์ภาษีต้องเป็นค่าตัวเลข",
'tax_percent_required' => "เปอร์เซ็นต์ต้องกรอก",
'tax_percents' => "ภาษี(%)",
'temp' => "ชั่วคราว",
'type' => "ประเภทรายการ",
'unit_price' => "ราคาขาย",
'unit_price_number' => "ราคาต่อหน่วยต้องเป็นตัวเลข",
'unit_price_required' => "ราคาต่อหน่วยต้องกรอก",
'upc_database' => "UPC ฐานข้อมูล",
'update' => "ปรับแต่งสินค้า",
'use_inventory_menu' => "ใช้เมนูสินค้าคงเหลือ",
];

View File

@@ -1,149 +1,150 @@
<?php
return [
"all" => "ทั้งหมด",
"authority" => "ผู้ได้รับอนุญาติ",
"canceled" => "ถูกยกเลิก",
"categories" => "หมวดหมู่",
"categories_summary_report" => "รายงานสรุปหมวดหมู่",
"category" => "หมวดหมู่",
"code_canceled" => "รหัสยกเลิก",
"code_invoice" => "รหัสใบแจ้งหนี้",
"code_pos" => "รหัส POS",
"code_quote" => "อ้างอิง",
"code_return" => "รหัสส่งคืน",
"code_type" => "ประเภท",
"code_work_order" => "รหัสสั่งงาน",
"comments" => "หมายเหตุ",
"commission" => "",
"complete" => "การขายและรับคืนที่สมบูรณ์",
"completed_sales" => "การขายที่สมบูรณ์",
"confirm_delete" => "คุณแน่ใจหรือว่าต้องการลบรายการที่เลือก ?",
"confirm_restore" => "คุณแน่ใจหรือไม่ว่าต้องการกู้คืนรายการที่เลือก?",
"cost" => "ราคาขายส่ง",
"cost_price" => "ราคาขายส่ง",
"count" => "นับ",
"customer" => "ลูกค้า",
"customers" => "ลูกค้า",
"customers_summary_report" => "รายงานสรุปลูกค้า",
"date" => "วันที่",
"date_range" => "ระหว่างวันที่",
"description" => "คำอธิบาย",
"detailed_receivings_report" => "รายงานรายละเอียกการรับของ",
"detailed_receivings_report_input" => "",
"detailed_reports" => "รายละเอียดรายงาน",
"detailed_requisition_report" => "รายงานรายละเอียดการเบิกของ",
"detailed_sales_report" => "รายงายงานขาย",
"discount" => "ส่วนลด",
"discount_fixed" => "ส่วนลดคงที่",
"discount_percent" => "เปอร์เซ็นต์ส่วนลด",
"discount_type" => "ประเภทส่วนลด",
"discounts" => "ส่วนลด",
"discounts_summary_report" => "รายงานสรุปส่วนลด",
"earned" => "คะแนนที่ได้รับ",
"employee" => "พนักงาน",
"employees" => "พนักงาน",
"employees_summary_report" => "รายงานสรุปพนักงาน",
"expenses" => "รายจ่าย",
"expenses_amount" => "ยอดรวม",
"expenses_categories" => "สรุปค่าใช้จ่าย",
"expenses_categories_summary_report" => "รายงานสรุปหมวดหมู่ค่าใช้จ่าย",
"expenses_category" => "หมวดหมู่",
"expenses_payment_amount" => "",
"expenses_tax_amount" => "ภาษี",
"expenses_total_amount" => "ยอดรวมทั้งหมด",
"expenses_total_tax_amount" => "ภาษีทั้งหมด",
"graphical_reports" => "รายงายแบบกราฟ",
"inventory" => "สินค้าคงคลัง",
"inventory_low" => "สินค้าเหลือน้อย",
"inventory_low_report" => "รายงานสินค้าที่เหลือน้อย",
"inventory_reports" => "รายงานสินค้าคงเหลือ",
"inventory_summary" => "รายงานสินค้าคงเหลือ",
"inventory_summary_report" => "รายงานสรุปสินค้าคงเหลือ",
"item" => "สินค้า",
"item_count" => "ตัวกรองรายการตามการนับ",
"item_name" => "ชื่อสินค้า",
"item_number" => "เลขสินค้า",
"items" => "สินค้า",
"items_purchased" => "สินค้าที่ถูกซื้อ",
"items_received" => "สินค้าเข้า",
"items_summary_report" => "รายงานสรุปสินค้า",
"jurisdiction" => "การควบคุม",
"low_inventory" => "",
"low_inventory_report" => "",
"low_sell_quantity" => "จำนวนขายน้อย",
"more_than_zero" => "มากกว่าศูนย์",
"name" => "ชื่อ",
"no_reports_to_display" => "ไม่มีสินค้าแสดง",
"payment_type" => "ชนิดของการจ่าย",
"payments" => "รายจ่าย",
"payments_summary_report" => "รายงานสรุปการจ่าย",
"profit" => "กำไร",
"quantity" => "จำนวน",
"quantity_purchased" => "จำนวนการช์้อ",
"quotes" => "อ้างอิง",
"received_by" => "รับโดย",
"receiving_id" => "เลขที่การรับ",
"receiving_type" => "รูปแบบการรับสินค้า",
"receivings" => "รับสินค้า",
"reorder_level" => "ระดับการสั่งใหม่",
"report" => "รายงาน",
"report_input" => "ข้อมูลรายงาน",
"reports" => "รายงาน",
"requisition" => "เบิกสินค้า",
"requisition_by" => "ผู้เบิกสินค้า",
"requisition_id" => "IDเบิกสินค้า",
"requisition_item" => "ชื่อสินค้า",
"requisition_item_quantity" => "จำนวนเบิก",
"requisition_related_item" => "สินค้าย่อย",
"requisition_related_item_total_quantity" => "จำนวนรวมสินค้าย่อย",
"requisition_related_item_unit_quantity" => "จำนวนสินค้าย่ิอย",
"requisitions" => "ใบเบิกของ",
"returns" => "คืน",
"revenue" => "รายรับ",
"sale_id" => "เลขที่รายการ",
"sale_type" => "ชนิดของการขาย",
"sales" => "ขาย",
"sales_amount" => "จำนวนขาย",
"sales_summary_report" => "รายงานสรุปการขาย",
"sales_taxes" => "ภาษีขาย",
"sales_taxes_summary_report" => "รายงานสรุปภาษีขาย",
"serial_number" => "หมายเลขซีเรียล",
"service_charge" => "",
"sold_by" => "ขายโดย",
"sold_items" => "",
"sold_to" => "ขายไปที่",
"stock_location" => "ที่ตั้งคลังสินค้า",
"sub_total_value" => "ยอดรวมหักภาษี",
"subtotal" => "ยอดรวมรอง",
"summary_reports" => "สรุปรายงาน",
"supplied_by" => "ผบิตโดย",
"supplier" => "ผู้ผลิต",
"suppliers" => "ผู้ผลิต",
"suppliers_summary_report" => "รายงานสรุปผู้ผลิต",
"tax" => "ภาษี",
"tax_category" => "หมวดหมู่ภาษี",
"tax_name" => "ชื่อผู้เสียภาษี",
"tax_percent" => "เปอร์เซ็นภาษี",
"tax_rate" => "อัตราภาษี",
"taxes" => "ภาษี",
"taxes_summary_report" => "รายงานสรุปภาษี",
"total" => "ยอดรวม",
"total_inventory_value" => "มูลค่าสินค้าคงคลังรวม",
"total_low_sell_quantity" => "จำนวนการขายต่ำ",
"total_quantity" => "ปริมาณรวม",
"total_retail" => "มูลค่ารวมใบแจ้งหนี้ค้าปลีก",
"trans_amount" => "จำนวนรายการ",
"trans_due" => "วันนัดหมาย",
"trans_group" => "กลุ่มธุรกรรม",
"trans_nopay_sales" => "การขายโดยไม่มีการชำระเงิน",
"trans_payments" => "การชำระเงิน",
"trans_refunded" => "คืนเงิน",
"trans_sales" => "การขาย",
"trans_type" => "ประเภทธุรกรรม",
"type" => "ชนิด",
"unit_price" => "ราคาขาย",
"used" => "คะแนนที่ใช้",
"work_orders" => "การสั่งงาน",
"zero_and_less" => "เท่ากับศูนย์และน้อยกว่า",
'all' => "ทั้งหมด",
'authority' => "ผู้ได้รับอนุญาติ",
'canceled' => "ถูกยกเลิก",
'categories' => "หมวดหมู่",
'categories_summary_report' => "รายงานสรุปหมวดหมู่",
'category' => "หมวดหมู่",
'code_canceled' => "รหัสยกเลิก",
'code_invoice' => "รหัสใบแจ้งหนี้",
'code_pos' => "รหัส POS",
'code_quote' => "อ้างอิง",
'code_return' => "รหัสส่งคืน",
'code_type' => "ประเภท",
'code_work_order' => "รหัสสั่งงาน",
'comments' => "หมายเหตุ",
'commission' => "",
'complete' => "การขายและรับคืนที่สมบูรณ์",
'completed_sales' => "การขายที่สมบูรณ์",
'confirm_delete' => "คุณแน่ใจหรือว่าต้องการลบรายการที่เลือก ?",
'confirm_restore' => "คุณแน่ใจหรือไม่ว่าต้องการกู้คืนรายการที่เลือก?",
'cost' => "ราคาขายส่ง",
'cost_price' => "ราคาขายส่ง",
'count' => "นับ",
'customer' => "ลูกค้า",
'customers' => "ลูกค้า",
'customers_summary_report' => "รายงานสรุปลูกค้า",
'date' => "วันที่",
'date_range' => "ระหว่างวันที่",
'description' => "คำอธิบาย",
'detailed_receivings_report' => "รายงานรายละเอียกการรับของ",
'detailed_receivings_report_input' => "",
'detailed_reports' => "รายละเอียดรายงาน",
'detailed_requisition_report' => "รายงานรายละเอียดการเบิกของ",
'detailed_sales_report' => "รายงายงานขาย",
'discount' => "ส่วนลด",
'discount_fixed' => "ส่วนลดคงที่",
'discount_percent' => "เปอร์เซ็นต์ส่วนลด",
'discount_type' => "ประเภทส่วนลด",
'discounts' => "ส่วนลด",
'discounts_summary_report' => "รายงานสรุปส่วนลด",
'earned' => "คะแนนที่ได้รับ",
'employee' => "พนักงาน",
'employees' => "พนักงาน",
'employees_summary_report' => "รายงานสรุปพนักงาน",
'expenses' => "ค่าใช้จ่าย",
'expenses_amount' => "ยอดรวม",
'expenses_categories' => "สรุปค่าใช้จ่าย",
'expenses_categories_summary_report' => "รายงานสรุปหมวดหมู่ค่าใช้จ่าย",
'expenses_category' => "หมวดหมู่",
'expenses_payment_amount' => "",
'expenses_tax_amount' => "ภาษี",
'expenses_total_amount' => "ยอดรวมทั้งหมด",
'expenses_total_tax_amount' => "ภาษีทั้งหมด",
'graphical_reports' => "รายงายแบบกราฟ",
'inventory' => "สินค้าคงคลัง",
'inventory_low' => "สินค้าเหลือน้อย",
'inventory_low_report' => "รายงานสินค้าที่เหลือน้อย",
'inventory_reports' => "รายงานสินค้าคงเหลือ",
'inventory_summary' => "รายงานสินค้าคงเหลือ",
'inventory_summary_report' => "รายงานสรุปสินค้าคงเหลือ",
'item' => "สินค้า",
'item_count' => "ตัวกรองรายการตามการนับ",
'item_name' => "ชื่อสินค้า",
'item_number' => "เลขสินค้า",
'items' => "สินค้า",
'items_purchased' => "สินค้าที่ถูกซื้อ",
'items_received' => "สินค้าเข้า",
'items_summary_report' => "รายงานสรุปสินค้า",
'jurisdiction' => "การควบคุม",
'low_inventory' => "",
'low_inventory_report' => "",
'low_sell_quantity' => "จำนวนขายน้อย",
'more_than_zero' => "มากกว่าศูนย์",
'name' => "ชื่อ",
'no_reports_to_display' => "ไม่มีสินค้าแสดง",
'payment_type' => "ชนิดของการจ่าย",
'payments' => "รายจ่าย",
'payments_summary_report' => "รายงานสรุปการจ่าย",
'profit' => "กำไร",
'quantity' => "จำนวน",
'quantity_purchased' => "จำนวนการช์้อ",
'quotes' => "อ้างอิง",
'received_by' => "รับโดย",
'receiving_id' => "เลขที่การรับ",
'receiving_type' => "รูปแบบการรับสินค้า",
'receivings' => "รับสินค้า",
'reorder_level' => "ระดับการสั่งใหม่",
'report' => "รายงาน",
'report_input' => "ข้อมูลรายงาน",
'reports' => "รายงาน",
'requisition' => "เบิกสินค้า",
'requisition_by' => "ผู้เบิกสินค้า",
'requisition_id' => "IDเบิกสินค้า",
'requisition_item' => "ชื่อสินค้า",
'requisition_item_quantity' => "จำนวนเบิก",
'requisition_related_item' => "สินค้าย่อย",
'requisition_related_item_total_quantity' => "จำนวนรวมสินค้าย่อย",
'requisition_related_item_unit_quantity' => "จำนวนสินค้าย่ิอย",
'requisitions' => "ใบเบิกของ",
'returns' => "คืน",
'revenue' => "รายรับ",
'sale_id' => "เลขที่รายการ",
'sale_type' => "ชนิดของการขาย",
'sales' => "ขาย",
'sales_amount' => "จำนวนขาย",
'sales_summary_report' => "รายงานสรุปการขาย",
'sales_taxes' => "ภาษีขาย",
'sales_taxes_summary_report' => "รายงานสรุปภาษีขาย",
'serial_number' => "หมายเลขซีเรียล",
'service_charge' => "",
'sold_by' => "ขายโดย",
'sold_items' => "",
'sold_to' => "ขายไปที่",
'stock_location' => "ที่ตั้งคลังสินค้า",
'sub_total_value' => "ยอดรวมหักภาษี",
'subtotal' => "ยอดรวมรอง",
'summary_reports' => "สรุปรายงาน",
'supplied_by' => "ผบิตโดย",
'supplier' => "ผู้ผลิต",
'suppliers' => "ผู้ผลิต",
'suppliers_summary_report' => "รายงานสรุปผู้ผลิต",
'tax' => "ภาษี",
'tax_category' => "หมวดหมู่ภาษี",
'tax_name' => "ชื่อผู้เสียภาษี",
'tax_percent' => "เปอร์เซ็นภาษี",
'tax_rate' => "อัตราภาษี",
'taxes' => "ภาษี",
'taxes_summary_report' => "รายงานสรุปภาษี",
'total' => "ยอดรวม",
'total_inventory_value' => "มูลค่าสินค้าคงคลังรวม",
'total_low_sell_quantity' => "จำนวนการขายต่ำ",
'total_quantity' => "ปริมาณรวม",
'total_retail' => "มูลค่ารวมใบแจ้งหนี้ค้าปลีก",
'trans_amount' => "จำนวนรายการ",
'trans_due' => "วันนัดหมาย",
'trans_group' => "กลุ่มธุรกรรม",
'trans_nopay_sales' => "การขายโดยไม่มีการชำระเงิน",
'trans_payments' => "การชำระเงิน",
'trans_refunded' => "คืนเงิน",
'trans_sales' => "การขาย",
'trans_type' => "ประเภทธุรกรรม",
'type' => "ชนิด",
'unit_price' => "ราคาขาย",
'used' => "คะแนนที่ใช้",
'work_orders' => "การสั่งงาน",
'zero_and_less' => "เท่ากับศูนย์และน้อยกว่า",
'toggle_cost_and_profit' => "เปลี่ยนระหว่างต้นทุนและกำไร",
];

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Are you sure you want to restore the selected attribute(s)?",
"confirm_restore" => "Are you sure you want to delete the selected attribute(s)?",
"definition_cannot_be_deleted" => "Could not delete selected attribute(s)",
"definition_invalid_group" => "",
"definition_error_adding_updating" => "Attribute {0} could not be added or updated. Please check the error log.",
"definition_flags" => "Attribute Visibility",
"definition_group" => "Group",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Seçili niteliği ya da nitelikleri silmek istediğinize emin misiniz?",
"confirm_restore" => "Seçili nitelik ya da nitelikleri kurtarmak istediğinize emin misiniz?",
"definition_cannot_be_deleted" => "Seçili nitelik ya da nitelikler silinemedi",
"definition_invalid_group" => "Seçilen grup mevcut değil veya geçersiz.",
"definition_error_adding_updating" => "Nitelik {0} eklenemedi ya da güncellenemedi. Lütfen hata kaydını gözden geçirin.",
"definition_flags" => "Nitelik Görünebilirliği",
"definition_group" => "Küme",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Ви впевнені, що хочете видалити вибрані атрибут(и)?",
"confirm_restore" => "Ви впевнені, що хочете відновити вибрані атрибут(и)?",
"definition_cannot_be_deleted" => "Не вдалося видалити вибрані атрибут(и)",
"definition_invalid_group" => "Вибрана група не існує або недійсна.",
"definition_error_adding_updating" => "Атрибут {0} не може бути доданий або оновлений. Будь ласка, перевірте журнал помилок.",
"definition_flags" => "Видимість атрибуту",
"definition_group" => "Група",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "کیا آپ منتخب شدہ کو حذف کرنا چاہتے ہیں ؟",
"confirm_restore" => "کیا آپ منتخب شدہ کو بحال کرنا چاہتے ہیں ؟",
"definition_cannot_be_deleted" => "منتخب شدہ کو حذف نہیں کیا جا سکتا",
"definition_invalid_group" => "",
"definition_error_adding_updating" => "Attribute {0} could not be added or updated. Please check the error log.",
"definition_flags" => "Attribute Visibility",
"definition_group" => "Group",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "Bạn có chắc chắn muốn xóa (các) thuộc tính đã chọn không?",
"confirm_restore" => "Bạn có chắc chắn muốn khôi phục (các) thuộc tính đã chọn không?",
"definition_cannot_be_deleted" => "Không thể xóa (các) thuộc tính được chọn",
"definition_invalid_group" => "Nhóm đã chọn không tồn tại hoặc không hợp lệ.",
"definition_error_adding_updating" => "Thuộc tính {0} không thể thêm hoặc cập nhật. Vui lòng kiểm tra nhật ký lỗi.",
"definition_flags" => "Hiển thị thuộc tính",
"definition_group" => "Nhóm",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "确定要删除所选属性吗",
"confirm_restore" => "您确定要还原所选属性吗?",
"definition_cannot_be_deleted" => "不能删除该特征属性",
"definition_invalid_group" => "所选组不存在或无效。",
"definition_error_adding_updating" => "无法添加或更新属性{0}。 请检查错误日志。",
"definition_flags" => "属性可见性",
"definition_group" => "",

View File

@@ -5,6 +5,7 @@ return [
"confirm_delete" => "您確定要刪除此屬性?",
"confirm_restore" => "您確定要還原所選屬性嗎?",
"definition_cannot_be_deleted" => "無法刪除所選屬性",
"definition_invalid_group" => "所選擇的群組不存在或無效。",
"definition_error_adding_updating" => "無法添加或更新屬性 {0}。 請檢查錯誤日誌。",
"definition_flags" => "屬性可見性",
"definition_group" => "群組",

View File

@@ -1,6 +1,6 @@
<?php
namespace app\Libraries;
namespace App\Libraries;
use App\Models\Tokens\Token;
use Config\OSPOS;
@@ -14,40 +14,137 @@ use DateTime;
*/
class Token_lib
{
private array $strftimeToIntlPatternMap = [
'%a' => 'EEE',
'%A' => 'EEEE',
'%b' => 'MMM',
'%B' => 'MMMM',
'%d' => 'dd',
'%D' => 'MM/dd/yy',
'%e' => 'd',
'%F' => 'yyyy-MM-dd',
'%h' => 'MMM',
'%j' => 'D',
'%m' => 'MM',
'%U' => 'w',
'%V' => 'ww',
'%W' => 'ww',
'%y' => 'yy',
'%Y' => 'yyyy',
'%H' => 'HH',
'%I' => 'hh',
'%l' => 'h',
'%M' => 'mm',
'%p' => 'a',
'%P' => 'a',
'%r' => 'hh:mm:ss a',
'%R' => 'HH:mm',
'%S' => 'ss',
'%T' => 'HH:mm:ss',
'%X' => 'HH:mm:ss',
'%z' => 'ZZZZZ',
'%Z' => 'z',
'%g' => 'yy',
'%G' => 'yyyy',
'%u' => 'e',
'%w' => 'c',
];
private array $validStrftimeFormats = [
'a', 'A', 'b', 'B', 'c', 'd', 'D', 'e', 'F', 'g', 'G',
'h', 'H', 'I', 'j', 'm', 'M', 'n', 'p', 'P', 'r', 'R',
'S', 't', 'T', 'u', 'U', 'V', 'w', 'W', 'x', 'X', 'y', 'Y', 'z', 'Z'
];
/**
* Expands all the tokens found in a given text string and returns the results.
*/
public function render(string $tokened_text, array $tokens = [], $save = true): string
{
// Apply the transformation for the "%" tokens if any are used
if (strpos($tokened_text, '%') !== false) {
$tokened_text = strftime($tokened_text); // TODO: these need to be converted to IntlDateFormatter::format()
if (str_contains($tokened_text, '%')) {
$tokened_text = $this->applyDateFormats($tokened_text);
}
// Call scan to build an array of all of the tokens used in the text to be transformed
$token_tree = $this->scan($tokened_text);
if (empty($token_tree)) {
if (strpos($tokened_text, '%') !== false) {
return strftime($tokened_text);
} else {
return $tokened_text;
}
return $tokened_text;
}
$token_values = [];
$tokens_to_replace = [];
$this->generate($token_tree, $tokens_to_replace, $token_values, $tokens, $save);
$this->generate($token_tree, $tokens, $tokens_to_replace, $token_values, $save);
return str_replace($tokens_to_replace, $token_values, $tokened_text);
}
/**
* Parses out the all the tokens enclosed in braces {} and subparses on the colon : character where supplied
*/
private function applyDateFormats(string $text): string
{
$formatter = new IntlDateFormatter(
null,
IntlDateFormatter::FULL,
IntlDateFormatter::FULL,
null,
null,
''
);
$dateTime = new DateTime();
return preg_replace_callback(
'/%([a-zA-Z%])/',
function ($match) use ($formatter, $dateTime) {
$formatChar = $match[1];
if ($formatChar === '%') {
return '%';
}
if ($formatChar === 'n') {
return "\n";
}
if ($formatChar === 't') {
return "\t";
}
if ($formatChar === 'C') {
return str_pad((string) intdiv((int) $dateTime->format('Y'), 100), 2, '0', STR_PAD_LEFT);
}
if ($formatChar === 'c') {
$formatter->setPattern('yyyy-MM-dd HH:mm:ss');
$result = $formatter->format($dateTime);
return $result !== false ? $result : $match[0];
}
if ($formatChar === 'x') {
$formatter->setPattern('yyyy-MM-dd');
$result = $formatter->format($dateTime);
return $result !== false ? $result : $match[0];
}
if (!in_array($formatChar, $this->validStrftimeFormats, true)) {
return $match[0];
}
$intlPattern = $this->strftimeToIntlPatternMap[$match[0]] ?? null;
if ($intlPattern === null) {
return $match[0];
}
$formatter->setPattern($intlPattern);
$result = $formatter->format($dateTime);
return $result !== false ? $result : $match[0];
},
$text
);
}
public function scan(string $text): array
{
// Matches tokens with the following pattern: [$token:$length]
preg_match_all('/
\{ # [ - pattern start
([^\s\{\}:]+) # match $token not containing whitespace : { or }
@@ -69,12 +166,6 @@ class Token_lib
return $token_tree;
}
/**
* @param string|null $quantity
* @param string|null $price
* @param string|null $item_id_or_number_or_item_kit_or_receipt
* @return void
*/
public function parse_barcode(?string &$quantity, ?string &$price, ?string &$item_id_or_number_or_item_kit_or_receipt): void
{
$config = config(OSPOS::class)->settings;
@@ -90,17 +181,11 @@ class Token_lib
$price = (isset($parsed_results['P'])) ? (double) $parsed_results['P'] : null;
}
} else {
$quantity = 1; // TODO: Quantity is handled using bcmath functions so that it is precision safe. This should be '1'
$quantity = 1;
}
}
/**
* @param string $string
* @param string $pattern
* @param array $tokens
* @return array
*/
public function parse(string $string, string $pattern, array $tokens = []): array // TODO: $string is a poor name for this parameter.
public function parse(string $string, string $pattern, array $tokens = []): array
{
$token_tree = $this->scan($pattern);
@@ -129,19 +214,10 @@ class Token_lib
return $results;
}
/**
* @param array $used_tokens
* @param array $tokens_to_replace
* @param array $token_values
* @param array $tokens
* @param bool $save
* @return array
*/
public function generate(array $used_tokens, array &$tokens_to_replace, array &$token_values, array $tokens, bool $save = true): array // TODO: $tokens
private function generate(array $used_tokens, array $tokens, array &$tokens_to_replace, array &$token_values, bool $save = true): void
{
foreach ($used_tokens as $token_code => $token_info) {
// Generate value here based on the key value
$token_value = $this->resolve_token($token_code, [], $save);
$token_value = $this->resolve_token($token_code, $tokens, $save);
foreach ($token_info as $length => $token_spec) {
$tokens_to_replace[] = $token_spec;
@@ -152,16 +228,8 @@ class Token_lib
}
}
}
return $token_values;
}
/**
* @param $token_code
* @param array $tokens
* @param bool $save
* @return string
*/
private function resolve_token($token_code, array $tokens = [], bool $save = true): string
{
foreach (array_merge($tokens, Token::get_tokens()) as $token) {
@@ -172,4 +240,4 @@ class Token_lib
return '';
}
}
}

View File

@@ -263,9 +263,10 @@ class Attribute extends Model
/**
* @param int $definition_flags
* @param bool $include_types If true, returns array with definition_id => ['name' => name, 'type' => type]
* @return array
*/
public function get_definitions_by_flags(int $definition_flags): array
public function get_definitions_by_flags(int $definition_flags, bool $include_types = false): array
{
$builder = $this->db->table('attribute_definitions');
$builder->where(new RawSql("definition_flags & $definition_flags")); // TODO: we need to heed CI warnings to escape properly
@@ -275,6 +276,17 @@ class Attribute extends Model
$results = $builder->get()->getResultArray();
if ($include_types) {
$definitions = [];
foreach ($results as $result) {
$definitions[$result['definition_id']] = [
'name' => $result['definition_name'],
'type' => $result['definition_type']
];
}
return $definitions;
}
return $this->to_array($results, 'definition_id', 'definition_name');
}

View File

@@ -16,6 +16,10 @@ use stdClass;
*/
class Item extends Model
{
public const ALLOWED_SUGGESTIONS_COLUMNS = ['name', 'item_number', 'description', 'cost_price', 'unit_price'];
public const ALLOWED_SUGGESTIONS_COLUMNS_WITH_EMPTY = ['', 'name', 'item_number', 'description', 'cost_price', 'unit_price'];
public const ALLOWED_BULK_EDIT_FIELDS = [
'name',
'category',
@@ -27,7 +31,6 @@ class Item extends Model
'allow_alt_description',
'is_serialized'
];
protected $table = 'items';
protected $primaryKey = 'item_id';
protected $useAutoIncrement = true;
@@ -544,13 +547,17 @@ class Item extends Model
public function get_search_suggestion_format(?string $seed = null): string
{
$config = config(OSPOS::class)->settings;
$seed .= ',' . $config['suggestions_first_column'];
$suggestionsFirstColumn = $this->suggestionColumnIsAllowed($config['suggestions_first_column'])
? $config['suggestions_first_column']
: 'name';
$seed .= ',' . $suggestionsFirstColumn;
if ($config['suggestions_second_column'] !== '') {
if ($config['suggestions_second_column'] !== '' && $this->suggestionColumnIsAllowed($config['suggestions_second_column'])) {
$seed .= ',' . $config['suggestions_second_column'];
}
if ($config['suggestions_third_column'] !== '') {
if ($config['suggestions_third_column'] !== '' && $this->suggestionColumnIsAllowed($config['suggestions_third_column'])) {
$seed .= ',' . $config['suggestions_third_column'];
}
@@ -566,9 +573,15 @@ class Item extends Model
$config = config(OSPOS::class)->settings;
$label = '';
$label1 = $config['suggestions_first_column'];
$label2 = $config['suggestions_second_column'];
$label3 = $config['suggestions_third_column'];
$label1 = $this->suggestionColumnIsAllowed($config['suggestions_first_column'])
? $config['suggestions_first_column']
: 'name';
$label2 = $this->suggestionColumnIsAllowed($config['suggestions_second_column'])
? $config['suggestions_second_column']
: '';
$label3 = $this->suggestionColumnIsAllowed($config['suggestions_third_column'])
? $config['suggestions_third_column']
: '';
$this->format_result_numbers($result_row);
@@ -592,6 +605,17 @@ class Item extends Model
return $label;
}
/**
* Validates if a column name is in the allowed suggestions columns.
*
* @param string $columnName
* @return bool
*/
private function suggestionColumnIsAllowed(string $columnName): bool
{
return in_array($columnName, self::ALLOWED_SUGGESTIONS_COLUMNS, true);
}
/**
* Converts decimal money values to their correct locale format.
*

View File

@@ -14,10 +14,7 @@ class Summary_taxes extends Summary_report
$this->config = config(OSPOS::class)->settings;
}
/**
* @return array[]
*/
protected function _get_data_columns(): array // TODO: hungarian notation
protected function _get_data_columns(): array
{
return [
['tax_name' => lang('Reports.tax_name'), 'sortable' => false],
@@ -29,12 +26,7 @@ class Summary_taxes extends Summary_report
];
}
/**
* @param array $inputs
* @param $builder
* @return void
*/
protected function _where(array $inputs, &$builder): void // TODO: hungarian notation
protected function _where(array $inputs, &$builder): void
{
$builder->where('sales.sale_status', COMPLETED);
@@ -45,51 +37,90 @@ class Summary_taxes extends Summary_report
}
}
/**
* @param array $inputs
* @return array
*/
public function getData(array $inputs): array
{
$decimals = totals_decimals();
$db_prefix = $this->db->getPrefix();
$sale_amount = '(CASE WHEN ' . $db_prefix . 'sales_items.discount_type = ' . PERCENT
. " THEN " . $db_prefix . "sales_items.quantity_purchased * " . $db_prefix . "sales_items.item_unit_price - ROUND(" . $db_prefix . "sales_items.quantity_purchased * " . $db_prefix . "sales_items.item_unit_price * " . $db_prefix . "sales_items.discount / 100, $decimals)"
. ' ELSE ' . $db_prefix . 'sales_items.quantity_purchased * (' . $db_prefix . "sales_items.item_unit_price - " . $db_prefix . "sales_items.discount) END)";
$sale_tax = "IFNULL(" . $db_prefix . "sales_items_taxes.item_tax_amount, 0)";
if ($this->config['tax_included']) {
$sale_total = '(CASE WHEN ' . $db_prefix . 'sales_items.discount_type = ' . PERCENT
. " THEN " . $db_prefix . "sales_items.quantity_purchased * " . $db_prefix . "sales_items.item_unit_price - ROUND(" . $db_prefix . "sales_items.quantity_purchased * " . $db_prefix . "sales_items.item_unit_price * " . $db_prefix . "sales_items.discount / 100, $decimals)"
. ' ELSE ' . $db_prefix . 'sales_items.quantity_purchased * (' . $db_prefix . 'sales_items.item_unit_price - ' . $db_prefix . 'sales_items.discount) END)';
$sale_subtotal = '(CASE WHEN ' . $db_prefix . 'sales_items.discount_type = ' . PERCENT
. " THEN " . $db_prefix . "sales_items.quantity_purchased * " . $db_prefix . "sales_items.item_unit_price - ROUND(" . $db_prefix . "sales_items.quantity_purchased * " . $db_prefix . "sales_items.item_unit_price * " . $db_prefix . "sales_items.discount / 100, $decimals) "
. 'ELSE ' . $db_prefix . 'sales_items.quantity_purchased * ' . $db_prefix . 'sales_items.item_unit_price - ' . $db_prefix . 'sales_items.discount END * (100 / (100 + ' . $db_prefix . 'sales_items_taxes.percent)))';
$sale_subtotal = "ROUND($sale_amount - $sale_tax, $decimals)";
} else {
$sale_total = '(CASE WHEN ' . $db_prefix . 'sales_items.discount_type = ' . PERCENT
. " THEN " . $db_prefix . "sales_items.quantity_purchased * " . $db_prefix . "sales_items.item_unit_price - ROUND(" . $db_prefix . "sales_items.quantity_purchased * " . $db_prefix . "sales_items.item_unit_price * " . $db_prefix . "sales_items.discount / 100, $decimals)"
. ' ELSE ' . $db_prefix . 'sales_items.quantity_purchased * ' . $db_prefix . 'sales_items.item_unit_price - ' . $db_prefix . 'sales_items.discount END * (1 + (' . $db_prefix . 'sales_items_taxes.percent / 100)))';
$sale_subtotal = '(CASE WHEN ' . $db_prefix . 'sales_items.discount_type = ' . PERCENT
. " THEN " . $db_prefix . "sales_items.quantity_purchased * " . $db_prefix . "sales_items.item_unit_price - ROUND(" . $db_prefix . "sales_items.quantity_purchased * " . $db_prefix . "sales_items.item_unit_price * " . $db_prefix . "sales_items.discount / 100, $decimals)"
. ' ELSE ' . $db_prefix . 'sales_items.quantity_purchased * (' . $db_prefix . 'sales_items.item_unit_price - ' . $db_prefix . 'sales_items.discount) END)';
$sale_subtotal = "ROUND($sale_amount, $decimals)";
}
$sale_tax_rounded = "ROUND($sale_tax, $decimals)";
$sale_total = "($sale_subtotal + $sale_tax_rounded)";
$subquery_builder = $this->db->table('sales_items');
$subquery_builder->select("name AS name, CONCAT(IFNULL(ROUND(percent, $decimals), 0), '%') AS percent, sales.sale_id AS sale_id, $sale_subtotal AS subtotal, IFNULL($db_prefix" . "sales_items_taxes.item_tax_amount, 0) AS tax, IFNULL($sale_total, $sale_subtotal) AS total");
$subquery_builder->select(
"name AS name, "
. "CONCAT(IFNULL(ROUND(percent, $decimals), 0), '%') AS percent, "
. "sales.sale_id AS sale_id, "
. "$sale_subtotal AS subtotal, "
. "$sale_tax_rounded AS tax, "
. "$sale_total AS total"
);
$subquery_builder->join('sales', 'sales_items.sale_id = sales.sale_id', 'inner');
$subquery_builder->join('sales_items_taxes', 'sales_items.sale_id = sales_items_taxes.sale_id AND sales_items.item_id = sales_items_taxes.item_id AND sales_items.line = sales_items_taxes.line', 'left outer');
$subquery_builder->join(
'sales_items_taxes',
'sales_items.sale_id = sales_items_taxes.sale_id AND sales_items.item_id = sales_items_taxes.item_id AND sales_items.line = sales_items_taxes.line',
'left outer'
);
$subquery_builder->where('sale_status', COMPLETED);
if (empty($this->config['date_or_time_format'])) {
$subquery_builder->where('DATE(' . $db_prefix . 'sales.sale_time) BETWEEN ' . $this->db->escape($inputs['start_date']) . ' AND ' . $this->db->escape($inputs['end_date']));
$subquery_builder->where(
'DATE(' . $db_prefix . 'sales.sale_time) BETWEEN ' . $this->db->escape($inputs['start_date'])
. ' AND ' . $this->db->escape($inputs['end_date'])
);
} else {
$subquery_builder->where('sales.sale_time BETWEEN ' . $this->db->escape(rawurldecode($inputs['start_date'])) . ' AND ' . $this->db->escape(rawurldecode($inputs['end_date'])));
$subquery_builder->where(
'sales.sale_time BETWEEN ' . $this->db->escape(rawurldecode($inputs['start_date']))
. ' AND ' . $this->db->escape(rawurldecode($inputs['end_date']))
);
}
$builder = $this->db->newQuery()->fromSubquery($subquery_builder, 'temp_taxes');
$builder->select("name, percent, COUNT(DISTINCT sale_id) AS count, ROUND(SUM(subtotal), $decimals) AS subtotal, ROUND(SUM(tax), $decimals) AS tax, ROUND(SUM(total), $decimals) total");
$builder->select(
"name, percent, COUNT(DISTINCT sale_id) AS count, "
. "ROUND(SUM(subtotal), $decimals) AS subtotal, "
. "ROUND(SUM(tax), $decimals) AS tax, "
. "ROUND(SUM(total), $decimals) AS total"
);
$builder->groupBy('percent, name');
return $builder->get()->getResultArray();
}
}
public function getSummaryData(array $inputs): array
{
$decimals = totals_decimals();
$data = $this->getData($inputs);
$subtotal = 0;
$tax = 0;
$total = 0;
$count = 0;
foreach ($data as $row) {
$subtotal += (float) $row['subtotal'];
$tax += (float) $row['tax'];
$total += (float) $row['total'];
$count += (int) $row['count'];
}
return [
'subtotal' => round($subtotal, $decimals),
'tax' => round($tax, $decimals),
'total' => round($total, $decimals),
'count' => $count
];
}
}

View File

@@ -273,6 +273,10 @@ class Sale extends Model
$builder->like('payment_type', lang('Sales.credit'));
}
if ($filters['only_debit']) {
$builder->like('payment_type', lang('Sales.debit'));
}
$builder->groupBy('payment_type');
$payments = $builder->get()->getResultArray();
@@ -1494,6 +1498,10 @@ class Sale extends Model
$builder->like('payments.payment_type', lang('Sales.credit'));
}
if ($filters['only_debit']) {
$builder->like('payments.payment_type', lang('Sales.debit'));
}
if ($filters['only_due']) {
$builder->like('payments.payment_type', lang('Sales.due'));
}

View File

@@ -23,7 +23,7 @@
'name' => 'definition_name',
'id' => 'definition_name',
'class' => 'form-control input-sm',
'value' => $definition_info->definition_name
'value' => esc($definition_info->definition_name)
]) ?>
</div>
</div>
@@ -69,7 +69,7 @@
<div class="input-group">
<?= form_input([
'name' => 'definition_unit',
'value' => $definition_info->definition_unit,
'value' => esc($definition_info->definition_unit),
'class' => 'form-control input-sm',
'id' => 'definition_unit'
]) ?>

View File

@@ -23,7 +23,7 @@
<?php foreach ($definition_values as $definition_id => $definition_value) { ?>
<div class="form-group form-group-sm">
<?= form_label($definition_value['definition_name'], $definition_value['definition_name'], ['class' => 'control-label col-xs-3']) ?>
<?= form_label(esc($definition_value['definition_name']), esc($definition_value['definition_name']), ['class' => 'control-label col-xs-3']) ?>
<div class="col-xs-8">
<div class="input-group">
<?php
@@ -55,7 +55,7 @@
$value = (empty($attribute_value) || empty($attribute_value->attribute_value)) ? $definition_value['selected_value'] : $attribute_value->attribute_value;
echo form_input([
'name' => "attribute_links[$definition_id]",
'value' => $value,
'value' => esc($value),
'class' => 'form-control valid_chars',
'data-definition-id' => $definition_id
]);

View File

@@ -3,7 +3,10 @@
* @var string $controller_name
* @var string $table_headers
* @var array $filters
* @var array $selected_filters
* @var array $config
* @var string|null $start_date
* @var string|null $end_date
*/
?>
@@ -11,20 +14,19 @@
<script type="text/javascript">
$(document).ready(function() {
// When any filter is clicked and the dropdown window is closed
$('#filters').on('hidden.bs.select', function(e) {
table_support.refresh();
});
// Load the preset datarange picker
<?= view('partial/daterangepicker') ?>
$("#daterangepicker").on('apply.daterangepicker', function(ev, picker) {
table_support.refresh();
});
<?= view('partial/bootstrap_tables_locale') ?>
// Override dates from server if provided
<?php if (isset($start_date) && $start_date): ?>
start_date = "<?= esc($start_date) ?>";
<?php endif; ?>
<?php if (isset($end_date) && $end_date): ?>
end_date = "<?= esc($end_date) ?>";
<?php endif; ?>
table_support.init({
resource: '<?= esc($controller_name) ?>',
headers: <?= $table_headers ?>,
@@ -40,6 +42,7 @@
});
});
</script>
<?= view('partial/table_filter_persistence') ?>
<?= view('partial/print_receipt', ['print_after_sale' => false, 'selected_printer' => 'takings_printer']) ?>
@@ -58,7 +61,7 @@
<span class="glyphicon glyphicon-trash">&nbsp;</span><?= lang('Common.delete') ?>
</button>
<?= form_input(['name' => 'daterangepicker', 'class' => 'form-control input-sm', 'id' => 'daterangepicker']) ?>
<?= form_multiselect('filters[]', $filters, [''], [
<?= form_multiselect('filters[]', $filters, $selected_filters ?? [], [
'id' => 'filters',
'data-none-selected-text' => lang('Common.none_selected_text'),
'class' => 'selectpicker show-menu-arrow',

View File

@@ -126,7 +126,12 @@
<div class="form-group form-group-sm">
<?= form_label(lang('Expenses.employee'), 'employee', ['class' => 'control-label col-xs-3']) ?>
<div class="col-xs-6">
<?= form_dropdown('employee_id', $employees, $expenses_info->employee_id, 'id="employee_id" class="form-control"') ?>
<?php if ($can_assign_employee): ?>
<?= form_dropdown('employee_id', $employees, $expenses_info->employee_id, 'id="employee_id" class="form-control"') ?>
<?php else: ?>
<?= form_hidden('employee_id', $expenses_info->employee_id) ?>
<?= form_input(['name' => 'employee_name', 'value' => esc($employees[$expenses_info->employee_id] ?? ''), 'class' => 'form-control', 'readonly' => 'readonly']) ?>
<?php endif; ?>
</div>
</div>

View File

@@ -3,7 +3,10 @@
* @var string $controller_name
* @var string $table_headers
* @var array $filters
* @var array $selected_filters
* @var array $config
* @var string|null $start_date
* @var string|null $end_date
*/
?>
@@ -11,20 +14,19 @@
<script type="text/javascript">
$(document).ready(function() {
// When any filter is clicked and the dropdown window is closed
$('#filters').on('hidden.bs.select', function(e) {
table_support.refresh();
});
// Load the preset datarange picker
<?= view('partial/daterangepicker') ?>
$("#daterangepicker").on('apply.daterangepicker', function(ev, picker) {
table_support.refresh();
});
<?= view('partial/bootstrap_tables_locale') ?>
// Override dates from server if provided
<?php if (isset($start_date) && $start_date): ?>
start_date = "<?= esc($start_date) ?>";
<?php endif; ?>
<?php if (isset($end_date) && $end_date): ?>
end_date = "<?= esc($end_date) ?>";
<?php endif; ?>
table_support.init({
resource: '<?= esc($controller_name) ?>',
headers: <?= $table_headers ?>,
@@ -45,8 +47,10 @@
});
}
});
});
</script>
</script
<?= view('partial/table_filter_persistence') ?>>
<?= view('partial/print_receipt', ['print_after_sale' => false, 'selected_printer' => 'takings_printer']) ?>
@@ -65,7 +69,7 @@
<span class="glyphicon glyphicon-trash">&nbsp;</span><?= lang('Common.delete') ?>
</button>
<?= form_input(['name' => 'daterangepicker', 'class' => 'form-control input-sm', 'id' => 'daterangepicker']) ?>
<?= form_multiselect('filters[]', esc($filters), [''], [
<?= form_multiselect('filters[]', esc($filters), $selected_filters ?? [], [
'id' => 'filters',
'data-none-selected-text' => lang('Common.none_selected_text'),
'class' => 'selectpicker show-menu-arrow',

View File

@@ -6,6 +6,9 @@
* @var array $stock_locations
* @var int $stock_location
* @var array $config
* @var string|null $start_date
* @var string|null $end_date
* @var array $selected_filters
*/
use App\Models\Employee;
@@ -22,24 +25,20 @@ use App\Models\Employee;
);
});
// When any filter is clicked and the dropdown window is closed
$('#filters').on('hidden.bs.select', function(e) {
table_support.refresh();
});
// Load the preset daterange picker
<?= view('partial/daterangepicker') ?>
// Set the beginning of time as starting date
$('#daterangepicker').data('daterangepicker').setStartDate("<?= date($config['dateformat'], mktime(0, 0, 0, 01, 01, 2010)) ?>");
// Update the hidden inputs with the selected dates before submitting the search data
var start_date = "<?= date('Y-m-d', mktime(0, 0, 0, 01, 01, 2010)) ?>";
$("#daterangepicker").on('apply.daterangepicker', function(ev, picker) {
table_support.refresh();
});
$("#stock_location").change(function() {
table_support.refresh();
});
// Override dates from server if provided
<?php if (isset($start_date) && $start_date): ?>
start_date = "<?= esc($start_date) ?>";
<?php endif; ?>
<?php if (isset($end_date) && $end_date): ?>
end_date = "<?= esc($end_date) ?>";
<?php endif; ?>
<?php
echo view('partial/bootstrap_tables_locale');
@@ -75,6 +74,8 @@ use App\Models\Employee;
});
</script>
<?= view('partial/table_filter_persistence', ['additional_params' => ['stock_location']]) ?>
<div id="title_bar" class="btn-toolbar print_hide">
<button class="btn btn-info btn-sm pull-right modal-dlg" data-btn-submit="<?= lang('Common.submit') ?>" data-href="<?= "$controller_name/csvImport" ?>" title="<?= lang('Items.import_items_csv') ?>">
<span class="glyphicon glyphicon-import">&nbsp;</span><?= lang('Common.import_csv') ?>
@@ -97,7 +98,7 @@ use App\Models\Employee;
<span class="glyphicon glyphicon-barcode">&nbsp;</span><?= lang('Items.generate_barcodes') ?>
</button>
<?= form_input(['name' => 'daterangepicker', 'class' => 'form-control input-sm', 'id' => 'daterangepicker']) ?>
<?= form_multiselect('filters[]', $filters, [''], [
<?= form_multiselect('filters[]', $filters, $selected_filters ?? [], [
'id' => 'filters',
'class' => 'selectpicker show-menu-arrow',
'data-none-selected-text' => lang('Common.none_selected_text'),

View File

@@ -92,7 +92,7 @@
<?php
if ($gcaptcha_enabled) {
echo '<script src="https://www.google.com/recaptcha/api.js"></script>';
echo '<div class="g-recaptcha mb-3" style="text-align: center;" data-sitekey="' . $config['gcaptcha_site_key'] . '"></div>';
echo '<div class="g-recaptcha mb-3" style="text-align: center;" data-sitekey="' . esc($config['gcaptcha_site_key']) . '"></div>';
}
?>
<div class="d-grid">

View File

@@ -0,0 +1,84 @@
<?php
/**
* Table Filter Persistence
*
* This partial updates the URL when filters change, allowing users to
* share/bookmark filtered views and maintain state on back navigation.
*
* Filter restoration from URL is handled server-side in the controller.
*
* @param array $options Additional filter options
* - 'additional_params': Array of additional parameter names to track (e.g., ['stock_location'])
* - 'filter_select_id': Filter multiselect element ID (default: 'filters')
*/
$options = $options ?? [];
$additional_params = $options['additional_params'] ?? [];
$filter_select_id = $options['filter_select_id'] ?? 'filters';
?>
<script type="text/javascript">
$(document).ready(function() {
var additional_params = <?= json_encode($additional_params) ?>;
var filter_select_id = '<?= esc($filter_select_id) ?>';
function update_url() {
var params = new URLSearchParams();
// Add dates
if (typeof start_date !== 'undefined') {
params.set('start_date', start_date);
}
if (typeof end_date !== 'undefined') {
params.set('end_date', end_date);
}
// Add filters
var filters = $('#' + filter_select_id).val();
if (filters) {
filters.forEach(function(filter) {
params.append('filters[]', filter);
});
}
// Add additional params
additional_params.forEach(function(param) {
var element = $('#' + param);
if (element.length) {
var value = element.val();
if (Array.isArray(value) && value.length > 0) {
value.forEach(function(v) {
params.append(param + '[]', v);
});
} else if (value) {
params.set(param, value);
}
}
});
// Update URL without page reload
var new_url = window.location.pathname;
var params_str = params.toString();
if (params_str) {
new_url += '?' + params_str;
}
window.history.replaceState({}, '', new_url);
}
// Update URL when filter dropdown changes
$('#' + filter_select_id).on('hidden.bs.select', function(e) {
update_url();
});
// Update URL when stock location changes (if exists)
if ($('#stock_location').length) {
$("#stock_location").change(function() {
update_url();
});
}
// Update URL when daterangepicker changes
$("#daterangepicker").on('apply.daterangepicker', function(ev, picker) {
update_url();
});
});
</script>

View File

@@ -5,6 +5,7 @@
* @var int $selected_supplier_id
* @var array $employees
* @var string $controller_name
* @var bool $can_assign_employee
*/
?>
@@ -50,7 +51,12 @@
<div class="form-group form-group-sm">
<?= form_label(lang('Receivings.employee'), 'employee', ['class' => 'control-label col-xs-3']) ?>
<div class="col-xs-8">
<?= form_dropdown('employee_id', $employees, $receiving_info['employee_id'], 'id="employee_id" class="form-control"') ?>
<?php if ($can_assign_employee): ?>
<?= form_dropdown('employee_id', $employees, $receiving_info['employee_id'], 'id="employee_id" class="form-control"') ?>
<?php else: ?>
<?= form_hidden('employee_id', $receiving_info['employee_id']) ?>
<?= form_input(['name' => 'employee_name', 'value' => esc($employees[$receiving_info['employee_id']] ?? ''), 'class' => 'form-control input-sm', 'readonly' => 'readonly']) ?>
<?php endif; ?>
</div>
</div>

View File

@@ -137,7 +137,7 @@ if (isset($success)) {
<td><?= esc($item['item_number']) ?></td>
<td style="text-align: center;">
<?= esc($item['name'] . ' ' . implode(' ', [$item['attribute_values'], $item['attribute_dtvalues']])) ?><br>
<?= '[' . to_quantity_decimals($item['in_stock']) . ' in ' . $item['stock_name'] . ']' ?>
<?= '[' . to_quantity_decimals($item['in_stock']) . ' in ' . esc($item['stock_name']) . ']' ?>
<?= form_hidden('location', (string)$item['item_location']) ?>
</td>

View File

@@ -5,6 +5,8 @@
* @var array $filters
* @var array $selected_filters
* @var array $config
* @var string|null $start_date
* @var string|null $end_date
*/
?>
@@ -26,6 +28,14 @@
<?= view('partial/bootstrap_tables_locale') ?>
// Override dates from server if provided
<?php if (isset($start_date) && $start_date): ?>
start_date = "<?= esc($start_date) ?>";
<?php endif; ?>
<?php if (isset($end_date) && $end_date): ?>
end_date = "<?= esc($end_date) ?>";
<?php endif; ?>
table_support.query_params = function() {
return {
"start_date": start_date,
@@ -55,9 +65,11 @@
}
}
});
});
});
</script>
<?= view('partial/table_filter_persistence') ?>
<?= view('partial/print_receipt', ['print_after_sale' => false, 'selected_printer' => 'takings_printer']) ?>
<div id="title_bar" class="print_hide btn-toolbar">

View File

@@ -181,7 +181,7 @@ helper('url');
<td style="align: center;">
<?= esc($item['name']) . ' ' . implode(' ', [$item['attribute_values'], $item['attribute_dtvalues']]) ?>
<br>
<?php if ($item['stock_type'] == '0'): echo '[' . to_quantity_decimals($item['in_stock']) . ' in ' . $item['stock_name'] . ']';
<?php if ($item['stock_type'] == '0'): echo '[' . to_quantity_decimals($item['in_stock']) . ' in ' . esc($item['stock_name']) . ']';
endif; ?>
</td>
<?php } ?>

View File

@@ -139,7 +139,7 @@ if (isset($error_message)) {
if ($item['print_option'] == PRINT_YES) { // TODO: === ?
?>
<tr class="item-row">
<td><?= $item['item_number'] ?></td>
<td><?= esc($item['item_number']) ?></td>
<?php if ($include_hsn): ?>
<td style="text-align: center;"><?= esc($item['hsn_code']) ?></td>
<?php endif; ?>

View File

@@ -0,0 +1 @@
{"version":2,"defects":{"Token_libTest::testRenderHandlesSpecialCharacters":8,"Token_libTest::testRenderHandlesUnicode":8,"Token_libTest::testRenderHandlesNewLines":8,"Token_libTest::testRenderHandlesTabs":8,"Token_libTest::testRenderHandlesDateAtStart":8,"Token_libTest::testRenderHandlesSqlInjectionAttempt":8,"Token_libTest::testRenderHandlesVeryLongStringWithDate":8,"Token_libTest::testRenderHandlesMultipleDates":8,"Token_libTest::testRenderDoesNotReplaceInvalidFormatSpecifiers":7},"times":{"Token_libTest::testRenderReturnsInputStringWhenNoTokens":0.002,"Token_libTest::testRenderHandlesStringWithPercentNotInDateFormat":0.004,"Token_libTest::testRenderHandlesInvalidDateFormatPercentDashPercent":0.001,"Token_libTest::testRenderHandlesInvalidDateFormatPercentYPercentQPercentBad":0,"Token_libTest::testRenderHandlesStringWithPercentAPercent":0,"Token_libTest::testRenderHandlesExtremelyLongString":0,"Token_libTest::testRenderHandlesStringWithMultiplePercentSymbols":0,"Token_libTest::testRenderHandlesStringWithOnlyPercentSymbol":0,"Token_libTest::testRenderPreservesTextWithValidDateTokensAndNoOtherTokens":0,"Token_libTest::testRenderHandlesEmptyString":0,"Token_libTest::testScanExtractsTokens":0,"Token_libTest::testScanExtractsTokensWithLength":0,"Token_libTest::testScanReturnsEmptyArrayForNoTokens":0,"Token_libTest::testRenderHandlesConsecutivePercentSigns":0,"Token_libTest::testRenderHandlesEscapedPercentSigns":0,"Token_libTest::testRenderHandlesSpecialCharacters":0.005,"Token_libTest::testRenderHandlesUnicode":0,"Token_libTest::testRenderHandlesNewLines":0,"Token_libTest::testRenderHandlesTabs":0,"Token_libTest::testRenderHandlesUnclosedBraces":0,"Token_libTest::testRenderHandlesUnopenedBraces":0,"Token_libTest::testRenderHandlesDateAtStart":0,"Token_libTest::testRenderHandlesSqlInjectionAttempt":0,"Token_libTest::testRenderHandlesVeryLongStringWithDate":0,"Token_libTest::testRenderHandlesMultipleDates":0,"Token_libTest::testRenderHandlesValidYearFormat":0,"Token_libTest::testRenderHandlesValidMonthFormat":0,"Token_libTest::testRenderHandlesValidDayFormat":0,"Token_libTest::testRenderHandlesFullDateFormat":0,"Token_libTest::testRenderHandlesPercentB":0,"Token_libTest::testRenderHandlesPercentA":0,"Token_libTest::testRenderHandlesComplexPercentFormat":0,"Token_libTest::testRenderDoesNotReplaceInvalidFormatSpecifiers":0,"Token_libTest::testScanWorksWithMixedContent":0,"Token_libTest::testRenderReplacesTimezoneFormat":0,"Tests\\Libraries\\Token_libTest::testRenderReturnsInputStringWhenNoTokens":0.001,"Tests\\Libraries\\Token_libTest::testRenderHandlesStringWithPercentNotInDateFormat":0.004,"Tests\\Libraries\\Token_libTest::testRenderHandlesInvalidDateFormatPercentDashPercent":0.001,"Tests\\Libraries\\Token_libTest::testRenderHandlesInvalidDateFormatPercentYPercentQPercentBad":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesStringWithPercentAPercent":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesExtremelyLongString":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesStringWithMultiplePercentSymbols":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesStringWithOnlyPercentSymbol":0,"Tests\\Libraries\\Token_libTest::testRenderPreservesTextWithValidDateTokensAndNoOtherTokens":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesEmptyString":0,"Tests\\Libraries\\Token_libTest::testScanExtractsTokens":0,"Tests\\Libraries\\Token_libTest::testScanExtractsTokensWithLength":0,"Tests\\Libraries\\Token_libTest::testScanReturnsEmptyArrayForNoTokens":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesConsecutivePercentSigns":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesEscapedPercentSigns":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesUnclosedBraces":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesUnopenedBraces":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesVeryLongStringWithDate":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesMultipleDates":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesValidYearFormat":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesValidMonthFormat":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesValidDayFormat":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesFullDateFormat":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesPercentB":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesPercentA":0,"Tests\\Libraries\\Token_libTest::testRenderHandlesComplexPercentFormat":0,"Tests\\Libraries\\Token_libTest::testRenderDoesNotReplaceInvalidFormatSpecifiers":0,"Tests\\Libraries\\Token_libTest::testRenderReplacesTimezoneFormat":0,"Tests\\Libraries\\Token_libTest::testScanWorksWithMixedContent":0}}

38
build/logs/logfile.xml Normal file
View File

@@ -0,0 +1,38 @@
<?xml version="1.0" encoding="UTF-8"?>
<testsuites>
<testsuite name="/app/phpunit.xml.dist" tests="29" assertions="44" errors="0" failures="0" skipped="0" time="0.029097">
<testsuite name="App" tests="29" assertions="44" errors="0" failures="0" skipped="0" time="0.029097">
<testsuite name="Tests\Libraries\Token_libTest" file="/app/tests/Libraries/Token_libTest.php" tests="29" assertions="44" errors="0" failures="0" skipped="0" time="0.029097">
<testcase name="testRenderReturnsInputStringWhenNoTokens" file="/app/tests/Libraries/Token_libTest.php" line="18" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.007667"/>
<testcase name="testRenderHandlesStringWithPercentNotInDateFormat" file="/app/tests/Libraries/Token_libTest.php" line="25" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="2" time="0.004001"/>
<testcase name="testRenderHandlesInvalidDateFormatPercentDashPercent" file="/app/tests/Libraries/Token_libTest.php" line="33" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="2" time="0.001162"/>
<testcase name="testRenderHandlesInvalidDateFormatPercentYPercentQPercentBad" file="/app/tests/Libraries/Token_libTest.php" line="41" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.000766"/>
<testcase name="testRenderHandlesStringWithPercentAPercent" file="/app/tests/Libraries/Token_libTest.php" line="48" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.000613"/>
<testcase name="testRenderHandlesExtremelyLongString" file="/app/tests/Libraries/Token_libTest.php" line="55" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.000513"/>
<testcase name="testRenderHandlesStringWithMultiplePercentSymbols" file="/app/tests/Libraries/Token_libTest.php" line="62" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="2" time="0.000589"/>
<testcase name="testRenderHandlesStringWithOnlyPercentSymbol" file="/app/tests/Libraries/Token_libTest.php" line="70" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.000578"/>
<testcase name="testRenderPreservesTextWithValidDateTokensAndNoOtherTokens" file="/app/tests/Libraries/Token_libTest.php" line="77" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.000612"/>
<testcase name="testRenderHandlesEmptyString" file="/app/tests/Libraries/Token_libTest.php" line="84" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.000503"/>
<testcase name="testScanExtractsTokens" file="/app/tests/Libraries/Token_libTest.php" line="91" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="2" time="0.000578"/>
<testcase name="testScanExtractsTokensWithLength" file="/app/tests/Libraries/Token_libTest.php" line="98" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="2" time="0.000501"/>
<testcase name="testScanReturnsEmptyArrayForNoTokens" file="/app/tests/Libraries/Token_libTest.php" line="105" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.000513"/>
<testcase name="testRenderHandlesConsecutivePercentSigns" file="/app/tests/Libraries/Token_libTest.php" line="111" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="2" time="0.000628"/>
<testcase name="testRenderHandlesEscapedPercentSigns" file="/app/tests/Libraries/Token_libTest.php" line="119" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.000626"/>
<testcase name="testRenderHandlesUnclosedBraces" file="/app/tests/Libraries/Token_libTest.php" line="126" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.000617"/>
<testcase name="testRenderHandlesUnopenedBraces" file="/app/tests/Libraries/Token_libTest.php" line="133" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.000620"/>
<testcase name="testRenderHandlesVeryLongStringWithDate" file="/app/tests/Libraries/Token_libTest.php" line="140" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="2" time="0.000599"/>
<testcase name="testRenderHandlesMultipleDates" file="/app/tests/Libraries/Token_libTest.php" line="148" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.000593"/>
<testcase name="testRenderHandlesValidYearFormat" file="/app/tests/Libraries/Token_libTest.php" line="155" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.000688"/>
<testcase name="testRenderHandlesValidMonthFormat" file="/app/tests/Libraries/Token_libTest.php" line="162" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.000611"/>
<testcase name="testRenderHandlesValidDayFormat" file="/app/tests/Libraries/Token_libTest.php" line="169" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.000627"/>
<testcase name="testRenderHandlesFullDateFormat" file="/app/tests/Libraries/Token_libTest.php" line="176" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="1" time="0.000757"/>
<testcase name="testRenderHandlesPercentB" file="/app/tests/Libraries/Token_libTest.php" line="183" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="3" time="0.000766"/>
<testcase name="testRenderHandlesPercentA" file="/app/tests/Libraries/Token_libTest.php" line="192" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="3" time="0.000703"/>
<testcase name="testRenderHandlesComplexPercentFormat" file="/app/tests/Libraries/Token_libTest.php" line="201" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="2" time="0.000669"/>
<testcase name="testRenderDoesNotReplaceInvalidFormatSpecifiers" file="/app/tests/Libraries/Token_libTest.php" line="209" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="2" time="0.000646"/>
<testcase name="testRenderReplacesTimezoneFormat" file="/app/tests/Libraries/Token_libTest.php" line="217" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="2" time="0.000811"/>
<testcase name="testScanWorksWithMixedContent" file="/app/tests/Libraries/Token_libTest.php" line="225" class="Tests\Libraries\Token_libTest" classname="Tests.Libraries.Token_libTest" assertions="2" time="0.000540"/>
</testsuite>
</testsuite>
</testsuite>
</testsuites>

87
build/logs/testdox.html Normal file
View File

@@ -0,0 +1,87 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8"/>
<title>Test Documentation</title>
<style>
body {
text-rendering: optimizeLegibility;
font-family: Source SansSerif Pro, Arial, sans-serif;
font-variant-ligatures: common-ligatures;
font-kerning: normal;
margin-left: 2rem;
background-color: #fff;
color: #000;
}
body > ul > li {
font-size: larger;
}
h2 {
font-size: larger;
text-decoration-line: underline;
text-decoration-thickness: 2px;
margin: 0;
padding: 0.5rem 0;
}
ul {
list-style: none;
margin: 0 0 2rem;
padding: 0 0 0 1rem;
text-indent: -1rem;
}
.success:before {
color: #4e9a06;
content: '✓';
padding-right: 0.5rem;
}
.defect {
color: #a40000;
}
.defect:before {
color: #a40000;
content: '✗';
padding-right: 0.5rem;
}
</style>
</head>
<body>
<h2>Token_lib (Tests\Libraries\Token_lib)</h2>
<ul>
<li class="success">Render returns input string when no tokens</li>
<li class="success">Render handles string with percent not in date format</li>
<li class="success">Render handles invalid date format percent dash percent</li>
<li class="success">Render handles invalid date format percent y percent q percent bad</li>
<li class="success">Render handles string with percent a percent</li>
<li class="success">Render handles extremely long string</li>
<li class="success">Render handles string with multiple percent symbols</li>
<li class="success">Render handles string with only percent symbol</li>
<li class="success">Render preserves text with valid date tokens and no other tokens</li>
<li class="success">Render handles empty string</li>
<li class="success">Scan extracts tokens</li>
<li class="success">Scan extracts tokens with length</li>
<li class="success">Scan returns empty array for no tokens</li>
<li class="success">Render handles consecutive percent signs</li>
<li class="success">Render handles escaped percent signs</li>
<li class="success">Render handles unclosed braces</li>
<li class="success">Render handles unopened braces</li>
<li class="success">Render handles very long string with date</li>
<li class="success">Render handles multiple dates</li>
<li class="success">Render handles valid year format</li>
<li class="success">Render handles valid month format</li>
<li class="success">Render handles valid day format</li>
<li class="success">Render handles full date format</li>
<li class="success">Render handles percent b</li>
<li class="success">Render handles percent a</li>
<li class="success">Render handles complex percent format</li>
<li class="success">Render does not replace invalid format specifiers</li>
<li class="success">Render replaces timezone format</li>
<li class="success">Scan works with mixed content</li>
</ul>
</body>
</html>

31
build/logs/testdox.txt Normal file
View File

@@ -0,0 +1,31 @@
Token_lib (Tests\Libraries\Token_lib)
[x] Render returns input string when no tokens
[x] Render handles string with percent not in date format
[x] Render handles invalid date format percent dash percent
[x] Render handles invalid date format percent y percent q percent bad
[x] Render handles string with percent a percent
[x] Render handles extremely long string
[x] Render handles string with multiple percent symbols
[x] Render handles string with only percent symbol
[x] Render preserves text with valid date tokens and no other tokens
[x] Render handles empty string
[x] Scan extracts tokens
[x] Scan extracts tokens with length
[x] Scan returns empty array for no tokens
[x] Render handles consecutive percent signs
[x] Render handles escaped percent signs
[x] Render handles unclosed braces
[x] Render handles unopened braces
[x] Render handles very long string with date
[x] Render handles multiple dates
[x] Render handles valid year format
[x] Render handles valid month format
[x] Render handles valid day format
[x] Render handles full date format
[x] Render handles percent b
[x] Render handles percent a
[x] Render handles complex percent format
[x] Render does not replace invalid format specifiers
[x] Render replaces timezone format
[x] Scan works with mixed content

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