Compare commits

..

2 Commits

Author SHA1 Message Date
objecttothis
afce945312 Correct Migration
- Programmatically delete an index which requires all constraints to be dropped.
- Removed unneeded blank line in Item model.

Signed-off-by: objecttothis <objecttothis@gmail.com>
2025-03-28 12:16:18 +04:00
objecttothis
84304cad04 Use custom rule to account for all locales
Signed-off-by: objecttothis <objecttothis@gmail.com>
2024-11-12 14:24:38 +04:00
57 changed files with 1920 additions and 2532 deletions

View File

@@ -1,22 +0,0 @@
name: "Delete Unstable Release"
on:
push:
branches:
- master
jobs:
delete_unstable_release:
runs-on: ubuntu-latest
steps:
- name: "Delete last unstable release"
uses: sgpublic/delete-release-action@v1.2
env:
GITHUB_TOKEN: ${{ secrets.TOKEN }}
with:
release-drop: false
release-drop-tag: false
pre-release-drop: true
pre-release-keep-count: -1
pre-release-drop-tag: true

View File

@@ -1,30 +0,0 @@
name: PHP Linting
on: push
jobs:
phplint:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0
- name: PHP Lint 8.0
uses: dbfx/github-phplint/8.0@master
with:
folder-to-exclude: "! -path \"./vendor/*\" ! -path \"./folder/excluded/*\""
- name: PHP Lint 8.1
uses: dbfx/github-phplint/8.1@master
with:
folder-to-exclude: "! -path \"./vendor/*\" ! -path \"./folder/excluded/*\""
- name: PHP Lint 8.2
uses: dbfx/github-phplint/8.2@master
with:
folder-to-exclude: "! -path \"./vendor/*\" ! -path \"./folder/excluded/*\""
- name: PHP Lint 8.3
uses: dbfx/github-phplint/8.3@master
with:
folder-to-exclude: "! -path \"./vendor/*\" ! -path \"./folder/excluded/*\""

View File

@@ -2,7 +2,6 @@ sudo: required
branches: branches:
except: except:
- unstable
- weblate - weblate
services: services:
- docker - docker
@@ -18,7 +17,6 @@ script:
- sed -i "s/commit_sha1 = 'dev'/commit_sha1 = '$rev'/g" app/Config/OSPOS.php - sed -i "s/commit_sha1 = 'dev'/commit_sha1 = '$rev'/g" app/Config/OSPOS.php
- echo "$version-$branch-$rev" - echo "$version-$branch-$rev"
- npm version "$version-$branch-$rev" --force || true - npm version "$version-$branch-$rev" --force || true
- sed -i 's/opensourcepos.tar.gz/opensourcepos.$version.tgz/g' package.json
- npm ci && npm install -g gulp && npm run build - npm ci && npm install -g gulp && npm run build
- docker build . --target ospos -t ospos - docker build . --target ospos -t ospos
- docker build app/Database/ -t "jekkos/opensourcepos:sql-$TAG" - docker build app/Database/ -t "jekkos/opensourcepos:sql-$TAG"
@@ -34,21 +32,16 @@ after_success:
- mv dist/opensourcepos.tar.gz "dist/opensourcepos.$version.$rev.tgz" - mv dist/opensourcepos.tar.gz "dist/opensourcepos.$version.$rev.tgz"
- mv dist/opensourcepos.zip "dist/opensourcepos.$version.$rev.zip" - mv dist/opensourcepos.zip "dist/opensourcepos.$version.$rev.zip"
deploy: deploy:
- provider: releases - provider: npm
edge: true edge: true
file: dist/opensourcepos.$version.$rev.zip src: dist/opensourcepos.$version.$rev.tgz
name: "Unstable OpensourcePos" registry: https://npm.pkg.github.com
overwrite: true email: jeroen@steganos.dev
release_notes: "This is a build of the latest master which might contain bugs. Use at your own risk. Check releases section for the latest official release"
prerelease: true
tag_name: unstable
user: jekkos
api_key: api_key:
secure: "KOukL8IFf/uL/BjMyCSKjf2vylydjcWqgEx0eMqFCg3nZ4ybMaOwPORRthIfyT72/FvGX/aoxxEn0uR/AEtb+hYQXHmNS+kZdX72JCe8LpGuZ7FJ5X+Eo9mhJcsmS+smd1sC95DySSc/GolKPo+0WtJYONY/xGCLxm+9Ay4HREg=" secure: "DNPJOrT51wdO0BAbkX2hKowdXYh7x8d43xvAw7eVfOslyBPiv6Bb/1QdC2Bpnlqe0WiJVS5hvBTMrJ+vSDK5i/l8jA+ZoI6ms1+P1DQ6sBBMBQI2fuvRCrJj+Fp3WnaduZb/N7R+FqdKQwD/ZORyhzJ4whtHkrO8uC7cY/wlacU="
on: on:
branch: master all_branches: true
- provider: releases - provider: releases
edge: true edge: true
file: dist/opensourcepos.$version.$rev.zip file: dist/opensourcepos.$version.$rev.zip
@@ -59,12 +52,8 @@ deploy:
user: jekkos user: jekkos
overwrite: true overwrite: true
api_key: api_key:
secure: "KOukL8IFf/uL/BjMyCSKjf2vylydjcWqgEx0eMqFCg3nZ4ybMaOwPORRthIfyT72/FvGX/aoxxEn0uR/AEtb+hYQXHmNS+kZdX72JCe8LpGuZ7FJ5X+Eo9mhJcsmS+smd1sC95DySSc/GolKPo+0WtJYONY/xGCLxm+9Ay4HREg=" secure: "DNPJOrT51wdO0BAbkX2hKowdXYh7x8d43xvAw7eVfOslyBPiv6Bb/1QdC2Bpnlqe0WiJVS5hvBTMrJ+vSDK5i/l8jA+ZoI6ms1+P1DQ6sBBMBQI2fuvRCrJj+Fp3WnaduZb/N7R+FqdKQwD/ZORyhzJ4whtHkrO8uC7cY/wlacU="
branches:
except:
- unstable
- /unstable.*/
on: on:
tags: true tags: true
branch: master branch: master

View File

@@ -1,98 +0,0 @@
Contributor Covenant Code of Conduct
Our Pledge
We as members, contributors, and leaders pledge to make participation in our
community a harassment-free experience for everyone, regardless of age, body
size, visible or invisible disability, ethnicity, sex characteristics, gender
identity and expression, level of experience, education, socio-economic status,
nationality, personal appearance, race, caste, color, religion, or sexual
identity and orientation.
We pledge to act and interact in ways that contribute to an open, welcoming,
diverse, inclusive, and healthy community.
Our Standards
Examples of behavior that contributes to a positive environment for our
community include:
* Demonstrating empathy and kindness toward other people
* Being respectful of differing opinions, viewpoints, and experiences
* Giving and gracefully accepting constructive feedback
* Accepting responsibility and apologizing to those affected by our mistakes,
and learning from the experience
* Focusing on what is best not just for us as individuals, but for the overall
community
Examples of unacceptable behavior include:
* The use of sexualized language or imagery, and sexual attention or advances of
any kind
* Trolling, insulting or derogatory comments, and personal or political attacks
* Public or private harassment
* Publishing others private information, such as a physical or email address,
without their explicit permission
* Other conduct which could reasonably be considered inappropriate in a
professional setting
Enforcement Responsibilities
Community leaders are responsible for clarifying and enforcing our standards of
acceptable behavior and will take appropriate and fair corrective action in
response to any behavior that they deem inappropriate, threatening, offensive,
or harmful.
Community leaders have the right and responsibility to remove, edit, or reject
comments, commits, code, wiki edits, issues, and other contributions that are
not aligned to this Code of Conduct, and will communicate reasons for moderation
decisions when appropriate.
Scope
This Code of Conduct applies within all community spaces, and also applies when
an individual is officially representing the community in public spaces.
Examples of representing our community include using an official email address,
posting via an official social media account, or acting as an appointed
representative at an online or offline event.
Enforcement
Instances of abusive, harassing, or otherwise unacceptable behavior may be
reported to the community leaders responsible for enforcement at
[INSERT CONTACT METHOD].
All complaints will be reviewed and investigated promptly and fairly.
All community leaders are obligated to respect the privacy and security of the
reporter of any incident.
Enforcement Guidelines
Community leaders will follow these Community Impact Guidelines in determining
the consequences for any action they deem in violation of this Code of Conduct:
1. Correction
Community Impact: Use of inappropriate language or other behavior deemed
unprofessional or unwelcome in the community.
Consequence: A private, written warning from community leaders, providing
clarity around the nature of the violation and an explanation of why the
behavior was inappropriate. A public apology may be requested.
2. Warning
Community Impact: A violation through a single incident or series of
actions.
Consequence: A warning with consequences for continued behavior. No
interaction with the people involved, including unsolicited interaction with
those enforcing the Code of Conduct, for a specified period of time. This
includes avoiding interactions in community spaces as well as external channels
like social media. Violating these terms may lead to a temporary or permanent
ban.
3. Temporary Ban
Community Impact: A serious violation of community standards, including
sustained inappropriate behavior.
Consequence: A temporary ban from any sort of interaction or public
communication with the community for a specified period of time. No public or
private interaction with the people involved, including unsolicited interaction
with those enforcing the Code of Conduct, is allowed during this period.
Violating these terms may lead to a permanent ban.
4. Permanent Ban
Community Impact: Demonstrating a pattern of violation of community
standards, including sustained inappropriate behavior, harassment of an
individual, or aggression toward or disparagement of classes of individuals.
Consequence: A permanent ban from any sort of public interaction within the
community.
Attribution
This Code of Conduct is adapted from the Contributor Covenant,
version 2.1, available at
https://www.contributor-covenant.org/version/2/1/code_of_conduct.html.
Community Impact Guidelines were inspired by
Mozillas code of conduct enforcement ladder.
For answers to common questions about this code of conduct, see the FAQ at
https://www.contributor-covenant.org/faq. Translations are available at
https://www.contributor-covenant.org/translations.

View File

@@ -1,6 +1,6 @@
## Server Requirements ## Server Requirements
- PHP version `7.4` is supported, PHP version `≤7.3` is NOT supported. Please note that PHP needs to have the extensions `php-gd`, `php-bcmath`, `php-intl`, `php-openssl`, `php-mbstring` , `php-curl` and `php-xml` installed and enabled. PHP version `8.x` is only supported by the code that is still under development in master branch. An unstable build can be downloaded in the releases section. - PHP version `7.4` is supported, PHP version `≤7.3` is NOT supported. Please note that PHP needs to have the extensions `php-gd`, `php-bcmath`, `php-intl`, `php-openssl`, `php-mbstring` , `php-curl` and `php-xml` installed and enabled. PHP version `8.x` is only supported by the code that is still under development in master branch.
- MySQL `5.6` and `5.7` are supported, also MariaDB replacement `10.x` is supported and might offer better performance. - MySQL `5.6` and `5.7` are supported, also MariaDB replacement `10.x` is supported and might offer better performance.
- Apache `2.4` is supported. Nginx should work fine too, see [wiki page here](https://github.com/opensourcepos/opensourcepos/wiki/Local-Deployment-using-LEMP). - Apache `2.4` is supported. Nginx should work fine too, see [wiki page here](https://github.com/opensourcepos/opensourcepos/wiki/Local-Deployment-using-LEMP).
- 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)>). - 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)>).

View File

@@ -137,7 +137,7 @@ Any person or company found breaching the license agreement might find a bunch o
## 🙏 Credits ## 🙏 Credits
| <div align="center">DigitalOcean</div> | <div align="center">JetBrains</div> | <div align="center">Travis CI</div> | | <div align="center">JetBrains</div> | <div align="center">Travis CI</div> |
|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| --- | --- | |--- | --- |
| <div align="center"><a href="https://www.digitalocean.com?utm_medium=opensource&utm_source=opensourcepos" target="_blank"><img src="https://opensource.nyc3.cdn.digitaloceanspaces.com/attribution/assets/SVG/DO_Logo_horizontal_blue.svg" alt="DigitalOcean Logo" height="50"></a></div> | <div align="center"><a href="https://www.jetbrains.com/idea/" target="_blank"><img src="https://github.com/opensourcepos/opensourcepos/assets/12870258/187f9bbe-4484-475c-9b58-5e5d5f931f09" alt="IntelliJ IDEA Logo" height="50"></a></div> | <div align="center"><a href="https://www.travis-ci.com/" target="_blank"><img src="https://github.com/opensourcepos/opensourcepos/assets/12870258/71cc2b44-83af-4510-a543-6358285f43c6" alt="Travis CI Logo" height="50"></a></div> | | <div align="center"><a href="https://www.jetbrains.com/idea/" target="_blank"><img src="https://github.com/opensourcepos/opensourcepos/assets/12870258/187f9bbe-4484-475c-9b58-5e5d5f931f09" alt="IntelliJ IDEA Logo" height="50"></a></div> | <div align="center"><a href="https://www.travis-ci.com/" target="_blank"><img src="https://github.com/opensourcepos/opensourcepos/assets/12870258/71cc2b44-83af-4510-a543-6358285f43c6" alt="Travis CI Logo" height="50"></a></div> |
| Many thanks to [Digital Ocean](https://www.digitalocean.com) for providing the project with hosting credits | Many thanks to [JetBrains](https://www.jetbrains.com/) for providing a free license of [IntelliJ IDEA](https://www.jetbrains.com/idea/) to kindly support the development of OSPOS. | Many thanks to [Travis CI](https://www.travis-ci.com/) for providing a free continuous integration service for open source projects. | | Many thanks to [JetBrains](https://www.jetbrains.com/) for providing a free license of [IntelliJ IDEA](https://www.jetbrains.com/idea/) to kindly support the development of OSPOS. | Many thanks to [Travis CI](https://www.travis-ci.com/) for providing a free continuous integration service for open source projects. |

View File

@@ -140,6 +140,7 @@ class OSPOSRules
*/ */
public function decimal_locale(string $candidate, ?string &$error = null): bool public function decimal_locale(string $candidate, ?string &$error = null): bool
{ {
$candidate = prepare_decimal($candidate);
$validation = Services::validation(); $validation = Services::validation();
$validation->setRules([ $validation->setRules([

View File

@@ -228,16 +228,24 @@ class Cashups extends Secure_Controller
$close_date = $this->request->getPost('close_date'); $close_date = $this->request->getPost('close_date');
$close_date_formatter = date_create_from_format($this->config['dateformat'] . ' ' . $this->config['timeformat'], $close_date); $close_date_formatter = date_create_from_format($this->config['dateformat'] . ' ' . $this->config['timeformat'], $close_date);
$open_amount_cash = prepare_decimal($this->request->getPost('open_amount_cash'));
$transfer_amount_cash = prepare_decimal($this->request->getPost('transfer_amount_cash'));
$closed_amount_cash = prepare_decimal($this->request->getPost('closed_amount_cash'));
$closed_amount_due = prepare_decimal($this->request->getPost('closed_amount_due'));
$closed_amount_card = prepare_decimal($this->request->getPost('closed_amount_card'));
$closed_amount_check = prepare_decimal($this->request->getPost('closed_amount_check'));
$closed_amount_total = prepare_decimal($this->request->getPost('closed_amount_total'));
$cash_up_data = [ $cash_up_data = [
'open_date' => $open_date_formatter->format('Y-m-d H:i:s'), 'open_date' => $open_date_formatter->format('Y-m-d H:i:s'),
'close_date' => $close_date_formatter->format('Y-m-d H:i:s'), 'close_date' => $close_date_formatter->format('Y-m-d H:i:s'),
'open_amount_cash' => parse_decimals($this->request->getPost('open_amount_cash')), 'open_amount_cash' => parse_decimals(filter_var($open_amount_cash, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)),
'transfer_amount_cash' => parse_decimals($this->request->getPost('transfer_amount_cash')), 'transfer_amount_cash' => parse_decimals(filter_var($transfer_amount_cash, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)),
'closed_amount_cash' => parse_decimals($this->request->getPost('closed_amount_cash')), 'closed_amount_cash' => parse_decimals(filter_var($closed_amount_cash, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)),
'closed_amount_due' => parse_decimals($this->request->getPost('closed_amount_due')), 'closed_amount_due' => parse_decimals(filter_var($closed_amount_due, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)),
'closed_amount_card' => parse_decimals($this->request->getPost('closed_amount_card')), 'closed_amount_card' => parse_decimals(filter_var($closed_amount_card, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)),
'closed_amount_check' => parse_decimals($this->request->getPost('closed_amount_check')), 'closed_amount_check' => parse_decimals(filter_var($closed_amount_check, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)),
'closed_amount_total' => parse_decimals($this->request->getPost('closed_amount_total')), 'closed_amount_total' => parse_decimals(filter_var($closed_amount_total, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)),
'note' => $this->request->getPost('note') != null, 'note' => $this->request->getPost('note') != null,
'description' => $this->request->getPost('description', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'description' => $this->request->getPost('description', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
'open_employee_id' => $this->request->getPost('open_employee_id', FILTER_SANITIZE_NUMBER_INT), 'open_employee_id' => $this->request->getPost('open_employee_id', FILTER_SANITIZE_NUMBER_INT),
@@ -288,12 +296,19 @@ class Cashups extends Secure_Controller
*/ */
public function ajax_cashup_total(): void public function ajax_cashup_total(): void
{ {
$open_amount_cash = parse_decimals($this->request->getPost('open_amount_cash')); $raw_open_amount_cash = $this->request->getPost('open_amount_cash');
$transfer_amount_cash = parse_decimals($this->request->getPost('transfer_amount_cash')); $raw_transfer_amount_cash = $this->request->getPost('transfer_amount_cash');
$closed_amount_cash = parse_decimals($this->request->getPost('closed_amount_cash')); $raw_closed_amount_cash = $this->request->getPost('closed_amount_cash');
$closed_amount_due = parse_decimals($this->request->getPost('closed_amount_due')); $raw_closed_amount_due = $this->request->getPost('closed_amount_due');
$closed_amount_card = parse_decimals($this->request->getPost('closed_amount_card')); $raw_closed_amount_card = $this->request->getPost('closed_amount_card');
$closed_amount_check = parse_decimals($this->request->getPost('closed_amount_check')); $raw_closed_amount_check = $this->request->getPost('closed_amount_check');
$open_amount_cash = parse_decimals(filter_var(prepare_decimal($raw_open_amount_cash), FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
$transfer_amount_cash = parse_decimals(filter_var(prepare_decimal($raw_transfer_amount_cash), FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
$closed_amount_cash = parse_decimals(filter_var(prepare_decimal($raw_closed_amount_cash), FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
$closed_amount_due = parse_decimals(filter_var(prepare_decimal($raw_closed_amount_due), FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
$closed_amount_card = parse_decimals(filter_var(prepare_decimal($raw_closed_amount_card), FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
$closed_amount_check = parse_decimals(filter_var(prepare_decimal($raw_closed_amount_check), FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
$total = $this->_calculate_total($open_amount_cash, $transfer_amount_cash, $closed_amount_due, $closed_amount_cash, $closed_amount_card, $closed_amount_check); //TODO: hungarian notation $total = $this->_calculate_total($open_amount_cash, $transfer_amount_cash, $closed_amount_due, $closed_amount_cash, $closed_amount_card, $closed_amount_check); //TODO: hungarian notation

View File

@@ -360,13 +360,16 @@ class Config extends Secure_Controller
*/ */
public function postSaveGeneral(): void public function postSaveGeneral(): void
{ {
$default_sales_discount = prepare_decimal($this->request->getPost('default_sales_discount'));
$default_receivings_discount = prepare_decimal($this->request->getPost('default_receivings_discount'));
$batch_save_data = [ $batch_save_data = [
'theme' => $this->request->getPost('theme'), 'theme' => $this->request->getPost('theme'),
'login_form' => $this->request->getPost('login_form'), 'login_form' => $this->request->getPost('login_form'),
'default_sales_discount_type' => $this->request->getPost('default_sales_discount_type') != null, 'default_sales_discount_type' => $this->request->getPost('default_sales_discount_type') != null,
'default_sales_discount' => parse_decimals($this->request->getPost('default_sales_discount')), 'default_sales_discount' => filter_var($default_sales_discount, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION),
'default_receivings_discount_type' => $this->request->getPost('default_receivings_discount_type') != null, 'default_receivings_discount_type' => $this->request->getPost('default_receivings_discount_type') != null,
'default_receivings_discount' => parse_decimals($this->request->getPost('default_receivings_discount')), 'default_receivings_discount' => filter_var($default_receivings_discount, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION),
'enforce_privacy' => $this->request->getPost('enforce_privacy') != null, 'enforce_privacy' => $this->request->getPost('enforce_privacy') != null,
'receiving_calculate_average_price' => $this->request->getPost('receiving_calculate_average_price') != null, 'receiving_calculate_average_price' => $this->request->getPost('receiving_calculate_average_price') != null,
'lines_per_page' => $this->request->getPost('lines_per_page', FILTER_SANITIZE_NUMBER_INT), 'lines_per_page' => $this->request->getPost('lines_per_page', FILTER_SANITIZE_NUMBER_INT),
@@ -769,8 +772,8 @@ class Config extends Secure_Controller
*/ */
public function postSaveTax(): void public function postSaveTax(): void
{ {
$default_tax_1_rate = $this->request->getPost('default_tax_1_rate'); $default_tax_1_rate = prepare_decimal($this->request->getPost('default_tax_1_rate'));
$default_tax_2_rate = $this->request->getPost('default_tax_2_rate'); $default_tax_2_rate = prepare_decimal($this->request->getPost('default_tax_2_rate'));
$batch_save_data = [ $batch_save_data = [
'default_tax_1_rate' => parse_tax(filter_var($default_tax_1_rate, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)), 'default_tax_1_rate' => parse_tax(filter_var($default_tax_1_rate, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)),

View File

@@ -286,12 +286,14 @@ class Customers extends Persons
$date_formatter = date_create_from_format($this->config['dateformat'] . ' ' . $this->config['timeformat'], $this->request->getPost('date')); $date_formatter = date_create_from_format($this->config['dateformat'] . ' ' . $this->config['timeformat'], $this->request->getPost('date'));
$discount = prepare_decimal($this->request->getPost('discount'));
$customer_data = [ $customer_data = [
'consent' => $this->request->getPost('consent') != null, 'consent' => $this->request->getPost('consent') != null,
'account_number' => $this->request->getPost('account_number') == '' ? null : $this->request->getPost('account_number'), 'account_number' => $this->request->getPost('account_number') == '' ? null : $this->request->getPost('account_number'),
'tax_id' => $this->request->getPost('tax_id'), 'tax_id' => $this->request->getPost('tax_id'),
'company_name' => $this->request->getPost('company_name') == '' ? null : $this->request->getPost('company_name'), 'company_name' => $this->request->getPost('company_name') == '' ? null : $this->request->getPost('company_name'),
'discount' => $this->request->getPost('discount') == '' ? 0.00 : parse_decimals($this->request->getPost('discount')), 'discount' => $this->request->getPost('discount') == '' ? 0.00 : filter_var($discount, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION),
'discount_type' => $this->request->getPost('discount_type') == null ? PERCENT : $this->request->getPost('discount_type', FILTER_SANITIZE_NUMBER_INT), 'discount_type' => $this->request->getPost('discount_type') == null ? PERCENT : $this->request->getPost('discount_type', FILTER_SANITIZE_NUMBER_INT),
'package_id' => $this->request->getPost('package_id') == '' ? null : $this->request->getPost('package_id'), 'package_id' => $this->request->getPost('package_id') == '' ? null : $this->request->getPost('package_id'),
'taxable' => $this->request->getPost('taxable') != null, 'taxable' => $this->request->getPost('taxable') != null,

View File

@@ -158,13 +158,15 @@ class Expenses extends Secure_Controller
$newdate = $this->request->getPost('date', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $newdate = $this->request->getPost('date', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$date_formatter = date_create_from_format($config['dateformat'] . ' ' . $config['timeformat'], $newdate); $date_formatter = date_create_from_format($config['dateformat'] . ' ' . $config['timeformat'], $newdate);
$amount = prepare_decimal($this->request->getPost('amount'));
$tax_amount = prepare_decimal($this->request->getPost('tax_amount'));
$expense_data = [ $expense_data = [
'date' => $date_formatter->format('Y-m-d H:i:s'), '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), 'supplier_id' => $this->request->getPost('supplier_id') == '' ? null : $this->request->getPost('supplier_id', FILTER_SANITIZE_NUMBER_INT),
'supplier_tax_code' => $this->request->getPost('supplier_tax_code', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'supplier_tax_code' => $this->request->getPost('supplier_tax_code', FILTER_SANITIZE_FULL_SPECIAL_CHARS),
'amount' => parse_decimals($this->request->getPost('amount')), 'amount' => filter_var($amount, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION),
'tax_amount' => parse_decimals($this->request->getPost('tax_amount')), 'tax_amount' => filter_var($tax_amount, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION),
'payment_type' => $this->request->getPost('payment_type', FILTER_SANITIZE_FULL_SPECIAL_CHARS), '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), 'expense_category_id' => $this->request->getPost('expense_category_id', FILTER_SANITIZE_NUMBER_INT),
'description' => $this->request->getPost('description', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'description' => $this->request->getPost('description', FILTER_SANITIZE_FULL_SPECIAL_CHARS),

View File

@@ -120,16 +120,17 @@ class Giftcards extends Secure_Controller
public function postSave(int $giftcard_id = NEW_ENTRY): void public function postSave(int $giftcard_id = NEW_ENTRY): void
{ {
$giftcard_number = $this->request->getPost('giftcard_number', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $giftcard_number = $this->request->getPost('giftcard_number', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$giftcard_amount = prepare_decimal($this->request->getPost('giftcard_amount'));
if($giftcard_id == NEW_ENTRY && trim($giftcard_number) == '') if($giftcard_id == NEW_ENTRY && trim($giftcard_number) == '')
{ {
$giftcard_number = $this->giftcard->generate_unique_giftcard_name($giftcard_number); $giftcard_number = $this->giftcard->generate_unique_giftcard_name(filter_var($giftcard_amount, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
} }
$giftcard_data = [ $giftcard_data = [
'record_time' => date('Y-m-d H:i:s'), 'record_time' => date('Y-m-d H:i:s'),
'giftcard_number' => $giftcard_number, 'giftcard_number' => $giftcard_number,
'value' => parse_decimals($this->request->getPost('giftcard_amount')), 'value' => filter_var($giftcard_amount, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION),
'person_id' => $this->request->getPost('person_id') == '' ? null : $this->request->getPost('person_id', FILTER_SANITIZE_NUMBER_INT) 'person_id' => $this->request->getPost('person_id') == '' ? null : $this->request->getPost('person_id', FILTER_SANITIZE_NUMBER_INT)
]; ];

View File

@@ -169,11 +169,13 @@ class Item_kits extends Secure_Controller
*/ */
public function postSave(int $item_kit_id = NEW_ENTRY): void public function postSave(int $item_kit_id = NEW_ENTRY): void
{ {
$kit_discount = prepare_decimal($this->request->getPost('kit_discount'));
$item_kit_data = [ $item_kit_data = [
'name' => $this->request->getPost('name'), 'name' => $this->request->getPost('name'),
'item_kit_number' => $this->request->getPost('item_kit_number'), 'item_kit_number' => $this->request->getPost('item_kit_number'),
'item_id' => $this->request->getPost('kit_item_id') ? null : intval($this->request->getPost('kit_item_id')), 'item_id' => $this->request->getPost('kit_item_id') ? null : intval($this->request->getPost('kit_item_id')),
'kit_discount' => parse_decimals($this->request->getPost('kit_discount')), 'kit_discount' => filter_var($kit_discount,FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION),
'kit_discount_type' => $this->request->getPost('kit_discount_type') === null ? PERCENT : intval($this->request->getPost('kit_discount_type')), 'kit_discount_type' => $this->request->getPost('kit_discount_type') === null ? PERCENT : intval($this->request->getPost('kit_discount_type')),
'price_option' => $this->request->getPost('price_option') === null ? PRICE_ALL : intval($this->request->getPost('price_option')), 'price_option' => $this->request->getPost('price_option') === null ? PRICE_ALL : intval($this->request->getPost('price_option')),
'print_option' => $this->request->getPost('print_option') === null ? PRINT_ALL : intval($this->request->getPost('print_option')), 'print_option' => $this->request->getPost('print_option') === null ? PRINT_ALL : intval($this->request->getPost('print_option')),

View File

@@ -195,7 +195,7 @@ class Items extends Secure_Controller
*/ */
public function getSuggest(): void public function getSuggest(): void
{ {
$search = $this->request->getGet('term'); $search = $this->request->getPost('term');
$suggestions = $this->item->get_search_suggestions($search, ['search_custom' => false, 'is_deleted' => false], true); $suggestions = $this->item->get_search_suggestions($search, ['search_custom' => false, 'is_deleted' => false], true);
echo json_encode($suggestions); echo json_encode($suggestions);
@@ -205,9 +205,9 @@ class Items extends Secure_Controller
* @return void * @return void
* @noinspection PhpUnused * @noinspection PhpUnused
*/ */
public function getSuggestLowSell(): void public function suggest_low_sell(): void
{ {
$suggestions = $this->item->get_low_sell_suggestions($this->request->getPo1stGet('name')); $suggestions = $this->item->get_low_sell_suggestions($this->request->getPostGet('name'));
echo json_encode($suggestions); echo json_encode($suggestions);
} }
@@ -631,9 +631,9 @@ class Items extends Secure_Controller
$upload_data = $this->upload_image(); $upload_data = $this->upload_image();
$upload_success = empty($upload_data['error']); $upload_success = empty($upload_data['error']);
$raw_receiving_quantity = $this->request->getPost('receiving_quantity'); $raw_receiving_quantity = prepare_decimal($this->request->getPost('receiving_quantity'));
$receiving_quantity = parse_quantity($raw_receiving_quantity); $receiving_quantity = parse_quantity(filter_var($raw_receiving_quantity, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
$item_type = $this->request->getPost('item_type') === null ? ITEM : intval($this->request->getPost('item_type')); $item_type = $this->request->getPost('item_type') === null ? ITEM : intval($this->request->getPost('item_type'));
if($receiving_quantity === 0.0 && $item_type !== ITEM_TEMP) if($receiving_quantity === 0.0 && $item_type !== ITEM_TEMP)
@@ -643,10 +643,10 @@ class Items extends Secure_Controller
$default_pack_name = lang('Items.default_pack_name'); $default_pack_name = lang('Items.default_pack_name');
$cost_price = parse_decimals($this->request->getPost('cost_price')); $cost_price = prepare_decimal($this->request->getPost('cost_price'));
$unit_price = parse_decimals($this->request->getPost('unit_price')); $unit_price = prepare_decimal($this->request->getPost('unit_price'));
$reorder_level = parse_quantity($this->request->getPost('reorder_level')); $reorder_level = prepare_decimal($this->request->getPost('reorder_level'));
$qty_per_pack = parse_quantity($this->request->getPost('qty_per_pack') ?? ''); $qty_per_pack = prepare_decimal($this->request->getPost('qty_per_pack') ?? '');
//Save item data //Save item data
$item_data = [ $item_data = [
@@ -657,13 +657,13 @@ class Items extends Secure_Controller
'stock_type' => $this->request->getPost('stock_type') === null ? HAS_STOCK : intval($this->request->getPost('stock_type')), 'stock_type' => $this->request->getPost('stock_type') === null ? HAS_STOCK : intval($this->request->getPost('stock_type')),
'supplier_id' => empty($this->request->getPost('supplier_id')) ? null : intval($this->request->getPost('supplier_id')), 'supplier_id' => empty($this->request->getPost('supplier_id')) ? null : intval($this->request->getPost('supplier_id')),
'item_number' => empty($this->request->getPost('item_number')) ? null : $this->request->getPost('item_number'), 'item_number' => empty($this->request->getPost('item_number')) ? null : $this->request->getPost('item_number'),
'cost_price' => $cost_price, 'cost_price' => parse_decimals(filter_var($cost_price, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)),
'unit_price' => $unit_price, 'unit_price' => parse_decimals(filter_var($unit_price, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)),
'reorder_level' => $reorder_level, 'reorder_level' => parse_quantity(filter_var($reorder_level, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)),
'receiving_quantity' => $receiving_quantity, 'receiving_quantity' => $receiving_quantity,
'allow_alt_description' => $this->request->getPost('allow_alt_description') != null, 'allow_alt_description' => $this->request->getPost('allow_alt_description') != null,
'is_serialized' => $this->request->getPost('is_serialized') != null, 'is_serialized' => $this->request->getPost('is_serialized') != null,
'qty_per_pack' => $this->request->getPost('qty_per_pack') == null ? 1 : parse_quantity($qty_per_pack), 'qty_per_pack' => $this->request->getPost('qty_per_pack') == null ? 1 : parse_quantity(filter_var($qty_per_pack, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)),
'pack_name' => $this->request->getPost('pack_name') == null ? $default_pack_name : $this->request->getPost('pack_name'), 'pack_name' => $this->request->getPost('pack_name') == null ? $default_pack_name : $this->request->getPost('pack_name'),
'low_sell_item_id' => $this->request->getPost('low_sell_item_id') === null ? $item_id : intval($this->request->getPost('low_sell_item_id')), 'low_sell_item_id' => $this->request->getPost('low_sell_item_id') === null ? $item_id : intval($this->request->getPost('low_sell_item_id')),
'deleted' => $this->request->getPost('is_deleted') != null, 'deleted' => $this->request->getPost('is_deleted') != null,
@@ -688,9 +688,9 @@ class Items extends Secure_Controller
$item_data['tax_category_id'] = empty($this->request->getPost('tax_category_id')) ? null : intval($this->request->getPost('tax_category_id')); $item_data['tax_category_id'] = empty($this->request->getPost('tax_category_id')) ? null : intval($this->request->getPost('tax_category_id'));
} }
if (!empty($upload_data['orig_name']) && $upload_data['raw_name']) { $item_data['pic_filename'] = !empty($upload_data['orig_name']) && $upload_data['raw_name']
$item_data['pic_filename'] = $upload_data['raw_name'] . '.' . $upload_data['file_ext']; ? $upload_data['raw_name'] . '.' . $upload_data['file_ext']
} : null;
$employee_id = $this->employee->get_logged_in_employee_info()->person_id; $employee_id = $this->employee->get_logged_in_employee_info()->person_id;
@@ -733,7 +733,8 @@ class Items extends Secure_Controller
$stock_locations = $this->stock_location->get_undeleted_all()->getResultArray(); $stock_locations = $this->stock_location->get_undeleted_all()->getResultArray();
foreach($stock_locations as $location) foreach($stock_locations as $location)
{ {
$updated_quantity = parse_quantity($this->request->getPost('quantity_' . $location['location_id'])); $stock_quantity = prepare_decimal($this->request->getPost('quantity_' . $location['location_id']));
$updated_quantity = parse_quantity(filter_var($stock_quantity, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
if($item_data['item_type'] == ITEM_TEMP) if($item_data['item_type'] == ITEM_TEMP)
{ {
@@ -886,14 +887,14 @@ class Items extends Secure_Controller
$employee_id = $this->employee->get_logged_in_employee_info()->person_id; $employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$cur_item_info = $this->item->get_info($item_id); $cur_item_info = $this->item->get_info($item_id);
$location_id = $this->request->getPost('stock_location'); $location_id = $this->request->getPost('stock_location');
$new_quantity = $this->request->getPost('newquantity'); $new_quantity = prepare_decimal($this->request->getPost('newquantity'));
$inv_data = [ $inv_data = [
'trans_date' => date('Y-m-d H:i:s'), 'trans_date' => date('Y-m-d H:i:s'),
'trans_items' => $item_id, 'trans_items' => $item_id,
'trans_user' => $employee_id, 'trans_user' => $employee_id,
'trans_location' => $location_id, 'trans_location' => $location_id,
'trans_comment' => $this->request->getPost('trans_comment'), 'trans_comment' => $this->request->getPost('trans_comment'),
'trans_inventory' => parse_quantity($new_quantity) 'trans_inventory' => parse_quantity(filter_var($new_quantity, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION))
]; ];
$this->inventory->insert($inv_data, false); $this->inventory->insert($inv_data, false);
@@ -1446,7 +1447,7 @@ class Items extends Secure_Controller
$attributeId = $attributeValue; $attributeId = $attributeValue;
break; break;
case DECIMAL: case DECIMAL:
$attributeValue = parse_decimals($attributeValue); $attributeValue = prepare_decimal($attributeValue);
//Fall through to save the attribute value //Fall through to save the attribute value
default: default:
$attributeId = $this->attribute->saveAttributeValue($attributeValue, $definitionId, $itemId, $attributeIds[$definitionId], $definitionType); $attributeId = $this->attribute->saveAttributeValue($attributeValue, $definitionId, $itemId, $attributeIds[$definitionId], $definitionType);

View File

@@ -35,7 +35,7 @@ abstract class Persons extends Secure_Controller
*/ */
public function getSuggest(): void public function getSuggest(): void
{ {
$search = $this->request->getGet('term'); $search = $this->request->getPost('term');
$suggestions = $this->person->get_search_suggestions($search); $suggestions = $this->person->get_search_suggestions($search);
echo json_encode($suggestions); echo json_encode($suggestions);

View File

@@ -206,24 +206,24 @@ class Receivings extends Secure_Controller
$data = []; $data = [];
$validation_rule = [ $validation_rule = [
'price' => 'trim|required|decimal_locale', 'price' => 'trim|required|numeric',
'quantity' => 'trim|required|decimal_locale', 'quantity' => 'trim|required|numeric',
'discount' => 'trim|permit_empty|decimal_locale', 'discount' => 'trim|required|numeric',
]; ];
$price = parse_decimals($this->request->getPost('price')); $raw_price = prepare_decimal($this->request->getPost('price'));
$quantity = parse_quantity($this->request->getPost('quantity')); $raw_quantity = prepare_decimal($this->request->getPost('quantity'));
$discount = parse_decimals($this->request->getPost('discount')); $raw_discount = prepare_decimal($this->request->getPost('discount'));
$raw_receiving_quantity = parse_quantity($this->request->getPost('receiving_quantity')); $raw_receiving_quantity = prepare_decimal($this->request->getPost('receiving_quantity'));
$description = $this->request->getPost('description', FILTER_SANITIZE_FULL_SPECIAL_CHARS); //TODO: Duplicated code $description = $this->request->getPost('description', FILTER_SANITIZE_FULL_SPECIAL_CHARS); //TODO: Duplicated code
$serialnumber = $this->request->getPost('serialnumber', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?? ''; $serialnumber = $this->request->getPost('serialnumber', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?? '';
$price = filter_var($price, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); $price = filter_var($raw_price, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$quantity = filter_var($quantity, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); $quantity = filter_var($raw_quantity, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$discount_type = $this->request->getPost('discount_type', FILTER_SANITIZE_NUMBER_INT); $discount_type = $this->request->getPost('discount_type', FILTER_SANITIZE_NUMBER_INT);
$discount = $discount_type $discount = $discount_type
? parse_quantity(filter_var($this->request->getPost('discount'), FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)) ? parse_quantity(filter_var($raw_discount, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION))
: parse_decimals(filter_var($this->request->getPost('discount'), FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)); : parse_decimals(filter_var($raw_discount, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
$receiving_quantity = filter_var($raw_receiving_quantity, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); $receiving_quantity = filter_var($raw_receiving_quantity, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
@@ -266,7 +266,6 @@ class Receivings extends Secure_Controller
$data['selected_supplier_name'] = !empty($receiving_info['supplier_id']) ? $receiving_info['company_name'] : ''; $data['selected_supplier_name'] = !empty($receiving_info['supplier_id']) ? $receiving_info['company_name'] : '';
$data['selected_supplier_id'] = $receiving_info['supplier_id']; $data['selected_supplier_id'] = $receiving_info['supplier_id'];
$data['receiving_info'] = $receiving_info; $data['receiving_info'] = $receiving_info;
$balance_due = round($receiving_info['amount_due'] - $receiving_info['amount_tendered'] + $receiving_info['cash_refund'], totals_decimals(), PHP_ROUND_HALF_UP);
echo view('receivings/form', $data); echo view('receivings/form', $data);
} }
@@ -328,26 +327,22 @@ class Receivings extends Secure_Controller
*/ */
public function postComplete(): void public function postComplete(): void
{ {
$amount_tendered = parse_decimals($this->request->getPost('amount_tendered')); $amount_tendered = prepare_decimal($this->request->getPost('amount_tendered'));
$data = []; $data = [];
$data['cart'] = $this->receiving_lib->get_cart(); $data['cart'] = $this->receiving_lib->get_cart();
$data['total'] = $this->receiving_lib->get_total(); $data['total'] = $this->receiving_lib->get_total();
$data['transaction_time'] = date('Y-m-d H:i:s'); // Fecha y hora actuales $data['transaction_time'] = to_datetime(time());
$data['mode'] = $this->receiving_lib->get_mode(); $data['mode'] = $this->receiving_lib->get_mode();
$data['comment'] = $this->receiving_lib->get_comment(); $data['comment'] = $this->receiving_lib->get_comment();
$data['reference'] = $this->receiving_lib->get_reference(); $data['reference'] = $this->receiving_lib->get_reference();
$data['term_days'] = $this->receiving_lib->get_term_days();
$data['payment_type'] = $this->request->getPost('payment_type', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $data['payment_type'] = $this->request->getPost('payment_type', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$data['payments'] = $this->receiving_lib->get_payments(); // Obtener pagos del carrito
$data['show_stock_locations'] = $this->stock_location->show_locations('receivings'); $data['show_stock_locations'] = $this->stock_location->show_locations('receivings');
$data['stock_location'] = $this->receiving_lib->get_stock_source(); $data['stock_location'] = $this->receiving_lib->get_stock_source();
if($this->request->getPost('amount_tendered') != null)
if ($this->request->getPost('amount_tendered') != null) { {
$data['amount_tendered'] = filter_var($amount_tendered, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION); $data['amount_tendered'] = filter_var($amount_tendered, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$data['amount_change'] = $data['amount_tendered'] - $data['total']; $data['amount_change'] = to_currency($data['amount_tendered'] - $data['total']);
} else {
$data['amount_change'] = 0;
} }
$employee_id = $this->employee->get_logged_in_employee_info()->person_id; $employee_id = $this->employee->get_logged_in_employee_info()->person_id;
@@ -355,62 +350,40 @@ class Receivings extends Secure_Controller
$data['employee'] = $employee_info->first_name . ' ' . $employee_info->last_name; $data['employee'] = $employee_info->first_name . ' ' . $employee_info->last_name;
$supplier_id = $this->receiving_lib->get_supplier(); $supplier_id = $this->receiving_lib->get_supplier();
if ($supplier_id != -1) { if($supplier_id != -1)
{
$supplier_info = $this->supplier->get_info($supplier_id); $supplier_info = $this->supplier->get_info($supplier_id);
$data['supplier'] = $supplier_info->company_name; $data['supplier'] = $supplier_info->company_name; //TODO: duplicated code
$data['first_name'] = $supplier_info->first_name; $data['first_name'] = $supplier_info->first_name;
$data['last_name'] = $supplier_info->last_name; $data['last_name'] = $supplier_info->last_name;
$data['supplier_email'] = $supplier_info->email; $data['supplier_email'] = $supplier_info->email;
$data['supplier_address'] = $supplier_info->address_1; $data['supplier_address'] = $supplier_info->address_1;
if(!empty($supplier_info->zip) or !empty($supplier_info->city))
if (!empty($supplier_info->zip) || !empty($supplier_info->city)) { {
$data['supplier_location'] = $supplier_info->zip . ' ' . $supplier_info->city; $data['supplier_location'] = $supplier_info->zip . ' ' . $supplier_info->city;
} else { }
else
{
$data['supplier_location'] = ''; $data['supplier_location'] = '';
} }
} }
// Guardar el registro de compra en la base de datos //SAVE receiving to database
$receiving_id = $this->receiving->save_value( $data['receiving_id'] = 'RECV ' . $this->receiving->save_value($data['cart'], $supplier_id, $employee_id, $data['comment'], $data['reference'], $data['payment_type'], $data['stock_location']);
$data['cart'],
$supplier_id,
$employee_id,
$data['comment'],
$data['reference'],
$data['term_days'],
$data['payment_type']
);
if ($receiving_id == -1) { if($data['receiving_id'] == 'RECV -1')
{
$data['error_message'] = lang('Receivings.transaction_failed'); $data['error_message'] = lang('Receivings.transaction_failed');
} else { }
$data['receiving_id'] = $receiving_id; else
{
// Calcular el cambio (cash_refund) $data['barcode'] = $this->barcode_lib->generate_receipt_barcode($data['receiving_id']);
$total_payments = array_sum(array_column($data['payments'], 'payment_amount'));
$cash_refund = max(0, $total_payments - $data['total']);
// Guardar los pagos en la base de datos
foreach ($data['payments'] as $payment) {
$this->receiving->save_payment([
'receiving_id' => $receiving_id, // Utiliza el ID generado
'payment_type' => $payment['payment_type'],
'payment_amount' => $payment['payment_amount'],
'cash_refund' => ($payment['payment_type'] === lang('Sales.cash')) ? $cash_refund : 0,
'employee_id' => $employee_id,
'payment_time' => $data['transaction_time'], // Fecha y hora actuales
]);
}
$data['barcode'] = $this->barcode_lib->generate_receipt_barcode($receiving_id);
} }
$data['print_after_sale'] = $this->receiving_lib->is_print_after_sale(); $data['print_after_sale'] = $this->receiving_lib->is_print_after_sale();
echo view("receivings/receipt", $data); echo view("receivings/receipt",$data);
// Limpiar pagos y otros datos
$this->receiving_lib->clear_payments(); // Limpia los pagos
$this->receiving_lib->clear_all(); $this->receiving_lib->clear_all();
} }
@@ -422,58 +395,23 @@ class Receivings extends Secure_Controller
*/ */
public function postRequisitionComplete(): void public function postRequisitionComplete(): void
{ {
$data = []; if($this->receiving_lib->get_stock_source() != $this->receiving_lib->get_stock_destination())
{
foreach($this->receiving_lib->get_cart() as $item)
{
$this->receiving_lib->delete_item($item['line']);
$this->receiving_lib->add_item($item['item_id'], $item['quantity'], $this->receiving_lib->get_stock_destination(), $item['discount_type']);
$this->receiving_lib->add_item($item['item_id'], -$item['quantity'], $this->receiving_lib->get_stock_source(), $item['discount_type']);
}
// Check if stock locations are different $this->complete();
if ($this->receiving_lib->get_stock_source() != $this->receiving_lib->get_stock_destination()) { }
// Process items in the cart else
foreach ($this->receiving_lib->get_cart() as $item) { {
$this->receiving_lib->delete_item($item['line']); $data['error'] = lang('Receivings.error_requisition');
$this->receiving_lib->add_item($item['item_id'], $item['quantity'], $this->receiving_lib->get_stock_destination(), $item['discount_type']);
$this->receiving_lib->add_item($item['item_id'], -$item['quantity'], $this->receiving_lib->get_stock_source(), $item['discount_type']);
}
// Prepare data to complete the requisition $this->_reload($data); //TODO: Hungarian notation
$data['cart'] = $this->receiving_lib->get_cart(); }
$data['total'] = $this->receiving_lib->get_total();
$data['transaction_time'] = to_datetime(time());
$data['mode'] = $this->receiving_lib->get_mode();
$data['comment'] = $this->receiving_lib->get_comment();
$data['term_days'] = $this->receiving_lib->get_term_days();
$data['reference'] = $this->receiving_lib->get_reference();
$data['show_stock_locations'] = $this->stock_location->show_locations('receivings');
$data['stock_location_source'] = $this->receiving_lib->get_stock_source();
$data['stock_location_destination'] = $this->receiving_lib->get_stock_destination();
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$employee_info = $this->employee->get_info($employee_id);
$data['employee'] = $employee_info->first_name . ' ' . $employee_info->last_name;
// Save the requisition in the database
$data['receiving_id'] = 'REQ ' . $this->receiving->save_requisition(
$data['cart'],
$employee_id,
$data['comment'],
$data['reference'],
$data['stock_location_source'],
$data['stock_location_destination']
);
if ($data['receiving_id'] == 'REQ -1') {
$data['error_message'] = lang('Receivings.transaction_failed');
} else {
$data['barcode'] = $this->barcode_lib->generate_receipt_barcode($data['receiving_id']);
}
$data['print_after_sale'] = $this->receiving_lib->is_print_after_sale();
echo view("receivings/receipt", $data);
$this->receiving_lib->clear_all();
} else {
$data['error'] = lang('Receivings.error_requisition');
$this->_reload($data);
}
} }
/** /**
@@ -529,7 +467,7 @@ class Receivings extends Secure_Controller
* @param array $data * @param array $data
* @return void * @return void
*/ */
private function _reload(array $data = []): void private function _reload(array $data = []): void //TODO: Hungarian notation
{ {
$data['cart'] = $this->receiving_lib->get_cart(); $data['cart'] = $this->receiving_lib->get_cart();
$data['modes'] = ['receive' => lang('Receivings.receiving'), 'return' => lang('Receivings.return')]; $data['modes'] = ['receive' => lang('Receivings.receiving'), 'return' => lang('Receivings.return')];
@@ -546,26 +484,15 @@ class Receivings extends Secure_Controller
$data['total'] = $this->receiving_lib->get_total(); $data['total'] = $this->receiving_lib->get_total();
$data['items_module_allowed'] = $this->employee->has_grant('items', $this->employee->get_logged_in_employee_info()->person_id); $data['items_module_allowed'] = $this->employee->has_grant('items', $this->employee->get_logged_in_employee_info()->person_id);
$data['comment'] = $this->receiving_lib->get_comment(); $data['comment'] = $this->receiving_lib->get_comment();
$data['term_days'] = $this->receiving_lib->get_term_days();
$data['reference'] = $this->receiving_lib->get_reference(); $data['reference'] = $this->receiving_lib->get_reference();
$data['payment_options'] = $this->receiving->get_payment_options(); $data['payment_options'] = $this->receiving->get_payment_options();
$data['selected_payment_type'] = $this->receiving_lib->get_payment_type();
$data['amount_due'] = $this->receiving_lib->get_total() - $this->receiving_lib->get_payments_total();
// Agregar pagos al arreglo de datos
$data['payments'] = $this->receiving_lib->get_payments();
// Inicializar tabindex
$data['tabindex'] = 0;
$supplier_id = $this->receiving_lib->get_supplier(); $supplier_id = $this->receiving_lib->get_supplier();
if($supplier_id != -1) if($supplier_id != -1) //TODO: Duplicated Code... replace -1 with a constant
{ {
$supplier_info = $this->supplier->get_info($supplier_id); $supplier_info = $this->supplier->get_info($supplier_id);
$data['supplier'] = $supplier_info->company_name; $data['supplier'] = $supplier_info->company_name;
$data['avatar'] = $supplier_info->avatar;
$data['gender'] = $supplier_info->gender;
$data['first_name'] = $supplier_info->first_name; $data['first_name'] = $supplier_info->first_name;
$data['last_name'] = $supplier_info->last_name; $data['last_name'] = $supplier_info->last_name;
$data['supplier_email'] = $supplier_info->email; $data['supplier_email'] = $supplier_info->email;
@@ -588,9 +515,9 @@ class Receivings extends Secure_Controller
/** /**
* @throws ReflectionException * @throws ReflectionException
*/ */
public function save(int $receiving_id = -1): void public function save(int $receiving_id = -1): void //TODO: Replace -1 with a constant
{ {
$newdate = $this->request->getPost('date', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $newdate = $this->request->getPost('date', FILTER_SANITIZE_FULL_SPECIAL_CHARS); //TODO: newdate does not follow naming conventions
$date_formatter = date_create_from_format($this->config['dateformat'] . ' ' . $this->config['timeformat'], $newdate); $date_formatter = date_create_from_format($this->config['dateformat'] . ' ' . $this->config['timeformat'], $newdate);
$receiving_time = $date_formatter->format('Y-m-d H:i:s'); $receiving_time = $date_formatter->format('Y-m-d H:i:s');
@@ -630,77 +557,8 @@ class Receivings extends Secure_Controller
*/ */
public function postCancelReceiving(): void public function postCancelReceiving(): void
{ {
// Limpiar los pagos
$this->receiving_lib->clear_payments();
// Limpiar todos los datos relacionados con la transacción
$this->receiving_lib->clear_all(); $this->receiving_lib->clear_all();
// Recargar la vista $this->_reload(); //TODO: Hungarian Notation
$this->_reload();
}
public function postAddPayment(): void
{
$data = [];
$payment_type = $this->request->getPost('payment_type', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
// Validar el tipo de pago
if ($payment_type !== lang('Sales.giftcard')) {
$rules = ['amount_tendered' => 'trim|required|decimal_locale'];
$messages = ['amount_tendered' => lang('Sales.must_enter_numeric')];
} else {
$rules = ['amount_tendered' => 'trim|required'];
$messages = ['amount_tendered' => lang('Sales.must_enter_numeric_giftcard')];
}
if (!$this->validate($rules, $messages)) {
$data['error'] = $payment_type === lang('Sales.giftcard')
? lang('Sales.must_enter_numeric_giftcard')
: lang('Sales.must_enter_numeric');
} else {
if ($payment_type === lang('Sales.giftcard')) {
$amount_tendered = parse_decimals($this->request->getPost('amount_tendered'));
$giftcard_num = filter_var($amount_tendered, FILTER_SANITIZE_FULL_SPECIAL_CHARS, FILTER_FLAG_ALLOW_FRACTION);
$payments = $this->receiving_lib->get_payments();
$payment_type = $payment_type . ':' . $giftcard_num;
$current_payments_with_giftcard = isset($payments[$payment_type]) ? $payments[$payment_type]['payment_amount'] : 0;
$giftcard = model(Giftcard::class);
$cur_giftcard_value = $giftcard->get_giftcard_value($giftcard_num);
if (($cur_giftcard_value - $current_payments_with_giftcard) <= 0) {
$data['error'] = lang('Giftcards.remaining_balance', [$giftcard_num, $cur_giftcard_value]);
} else {
$amount_tendered = min($this->receiving_lib->get_amount_due(), $cur_giftcard_value);
$this->receiving_lib->add_payment($payment_type, $amount_tendered);
}
} elseif ($payment_type === lang('Sales.cash')) {
$raw_amount_tendered = parse_decimals($this->request->getPost('amount_tendered'));
$amount_tendered = filter_var($raw_amount_tendered, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$this->receiving_lib->add_payment($payment_type, $amount_tendered);
} else {
$raw_amount_tendered = parse_decimals($this->request->getPost('amount_tendered'));
$amount_tendered = filter_var($raw_amount_tendered, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$this->receiving_lib->add_payment($payment_type, $amount_tendered);
}
}
$this->_reload($data);
}
/**
* Multiple Payments. Used in app/Views/sales/register.php
*
* @param string $payment_id
* @return void
* @noinspection PhpUnused
*/
public function getDeletePayment(string $payment_id): void
{
$this->receiving_lib->delete_payment($payment_id);
$this->_reload();
} }
} }

View File

@@ -371,8 +371,8 @@ class Sales extends Secure_Controller
*/ */
public function postSetPriceWorkOrders(): void public function postSetPriceWorkOrders(): void
{ {
$price_work_orders = parse_decimals($this->request->getPost('price_work_orders')); $price_work_orders = prepare_decimal($this->request->getPost('price_work_orders'));
$this->sale_lib->set_price_work_orders($price_work_orders); $this->sale_lib->set_price_work_orders(filter_var($price_work_orders, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
} }
/** /**
@@ -420,8 +420,8 @@ class Sales extends Secure_Controller
if($payment_type === lang('Sales.giftcard')) if($payment_type === lang('Sales.giftcard'))
{ {
//In the case of giftcard payment the register input amount_tendered becomes the giftcard number //In the case of giftcard payment the register input amount_tendered becomes the giftcard number
$amount_tendered = parse_decimals($this->request->getPost('amount_tendered')); $amount_tendered = prepare_decimal($this->request->getPost('amount_tendered'));
$giftcard_num = $amount_tendered; $giftcard_num = filter_var($amount_tendered, FILTER_SANITIZE_FULL_SPECIAL_CHARS, FILTER_FLAG_ALLOW_FRACTION);
$payments = $this->sale_lib->get_payments(); $payments = $this->sale_lib->get_payments();
$payment_type = $payment_type . ':' . $giftcard_num; $payment_type = $payment_type . ':' . $giftcard_num;
@@ -485,7 +485,8 @@ class Sales extends Secure_Controller
{ {
$amount_due = $this->sale_lib->get_total(); $amount_due = $this->sale_lib->get_total();
$sales_total = $this->sale_lib->get_total(false); $sales_total = $this->sale_lib->get_total(false);
$amount_tendered = parse_decimals($this->request->getPost('amount_tendered')); $raw_amount_tendered = prepare_decimal($this->request->getPost('amount_tendered'));
$amount_tendered = filter_var($raw_amount_tendered, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$this->sale_lib->add_payment($payment_type, $amount_tendered); $this->sale_lib->add_payment($payment_type, $amount_tendered);
$cash_adjustment_amount = $amount_due - $sales_total; $cash_adjustment_amount = $amount_due - $sales_total;
if($cash_adjustment_amount <> 0) if($cash_adjustment_amount <> 0)
@@ -496,7 +497,8 @@ class Sales extends Secure_Controller
} }
else else
{ {
$amount_tendered = parse_decimals($this->request->getPost('amount_tendered')); $raw_amount_tendered = prepare_decimal($this->request->getPost('amount_tendered'));
$amount_tendered = filter_var($raw_amount_tendered, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$this->sale_lib->add_payment($payment_type, $amount_tendered); $this->sale_lib->add_payment($payment_type, $amount_tendered);
} }
} }
@@ -638,18 +640,23 @@ class Sales extends Secure_Controller
if($this->validate($rules)) if($this->validate($rules))
{ {
$raw_price = prepare_decimal($this->request->getPost('price'));
$raw_quantity = prepare_decimal($this->request->getPost('quantity'));
$raw_discount = prepare_decimal($this->request->getPost('discount'));
$raw_discounted_total = prepare_decimal($this->request->getPost('discounted_total') ?? '');
$description = $this->request->getPost('description', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $description = $this->request->getPost('description', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$serialnumber = $this->request->getPost('serialnumber', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $serialnumber = $this->request->getPost('serialnumber', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$price = parse_decimals($this->request->getPost('price')); $price = filter_var($raw_price, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$quantity = parse_decimals($this->request->getPost('quantity')); $quantity = filter_var($raw_quantity, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$discount_type = $this->request->getPost('discount_type', FILTER_SANITIZE_FULL_SPECIAL_CHARS); $discount_type = $this->request->getPost('discount_type', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$discount = $discount_type $discount = $discount_type
? parse_quantity($this->request->getPost('discount')) ? parse_quantity(filter_var($raw_discount, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION))
: parse_decimals($this->request->getPost('discount')); : parse_decimals(filter_var($raw_discount, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
$item_location = $this->request->getPost('location', FILTER_SANITIZE_NUMBER_INT); $item_location = $this->request->getPost('location', FILTER_SANITIZE_NUMBER_INT);
$discounted_total = $this->request->getPost('discounted_total') != '' $discounted_total = $this->request->getPost('discounted_total') != ''
? parse_decimals($this->request->getPost('discounted_total') ?? '') ? filter_var($raw_discounted_total, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION)
: null; : null;
@@ -1546,11 +1553,14 @@ class Sales extends Secure_Controller
$number_of_payments = $this->request->getPost('number_of_payments', FILTER_SANITIZE_NUMBER_INT); $number_of_payments = $this->request->getPost('number_of_payments', FILTER_SANITIZE_NUMBER_INT);
for($i = 0; $i < $number_of_payments; ++$i) for($i = 0; $i < $number_of_payments; ++$i)
{ {
$raw_payment_amount = prepare_decimal($this->request->getPost("payment_amount_$i"));
$raw_refund_amount = prepare_decimal($this->request->getPost("refund_amount_$i"));
$payment_id = $this->request->getPost("payment_id_$i", FILTER_SANITIZE_NUMBER_INT); $payment_id = $this->request->getPost("payment_id_$i", FILTER_SANITIZE_NUMBER_INT);
$payment_type = $this->request->getPost("payment_type_$i", FILTER_SANITIZE_FULL_SPECIAL_CHARS); $payment_type = $this->request->getPost("payment_type_$i", FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$payment_amount = parse_decimals($this->request->getPost("payment_amount_$i")); $payment_amount = filter_var($raw_payment_amount , FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$refund_type = $this->request->getPost("refund_type_$i", FILTER_SANITIZE_FULL_SPECIAL_CHARS); $refund_type = $this->request->getPost("refund_type_$i", FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$cash_refund = parse_decimals($this->request->getPost("refund_amount_$i")); $cash_refund = filter_var($raw_refund_amount, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$cash_adjustment = $payment_type == lang('Sales.cash_adjustment') ? CASH_ADJUSTMENT_TRUE : CASH_ADJUSTMENT_FALSE; $cash_adjustment = $payment_type == lang('Sales.cash_adjustment') ? CASH_ADJUSTMENT_TRUE : CASH_ADJUSTMENT_FALSE;
@@ -1584,7 +1594,7 @@ class Sales extends Secure_Controller
if($payment_type != PAYMENT_TYPE_UNASSIGNED && !empty($payment_amount_new)) if($payment_type != PAYMENT_TYPE_UNASSIGNED && !empty($payment_amount_new))
{ {
$payment_amount = parse_decimals($payment_amount_new); $payment_amount = filter_var(prepare_decimal($payment_amount_new), FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$cash_refund = 0; $cash_refund = 0;
if($payment_type == lang('Sales.cash_adjustment')) if($payment_type == lang('Sales.cash_adjustment'))
{ {

View File

@@ -94,7 +94,7 @@ class Secure_Controller extends BaseController
*/ */
public function getCheckNumeric(): void public function getCheckNumeric(): void
{ {
foreach($this->request->getGet() as $value) foreach($this->request->getGet(null, FILTER_SANITIZE_FULL_SPECIAL_CHARS) as $value)
{ {
if (parse_decimals($value) === false) if (parse_decimals($value) === false)
{ {

View File

@@ -402,8 +402,10 @@ class Taxes extends Secure_Controller
*/ */
public function postSave(int $tax_rate_id = NEW_ENTRY): void public function postSave(int $tax_rate_id = NEW_ENTRY): void
{ {
$raw_tax_rate = prepare_decimal($this->request->getPost('tax_rate'));
$tax_category_id = $this->request->getPost('rate_tax_category_id', FILTER_SANITIZE_NUMBER_INT); $tax_category_id = $this->request->getPost('rate_tax_category_id', FILTER_SANITIZE_NUMBER_INT);
$tax_rate = parse_tax($this->request->getPost('tax_rate')); $tax_rate = parse_tax(filter_var($raw_tax_rate, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION));
if ($tax_rate == 0) //TODO: Replace 0 with constant? if ($tax_rate == 0) //TODO: Replace 0 with constant?
{ {
@@ -412,7 +414,7 @@ class Taxes extends Secure_Controller
$tax_rate_data = [ $tax_rate_data = [
'rate_tax_code_id' => $this->request->getPost('rate_tax_code_id', FILTER_SANITIZE_NUMBER_INT), 'rate_tax_code_id' => $this->request->getPost('rate_tax_code_id', FILTER_SANITIZE_NUMBER_INT),
'rate_tax_category_id' => $tax_category_id, 'rate_tax_category_id' => $this->request->getPost('rate_tax_category_id', FILTER_SANITIZE_NUMBER_INT),
'rate_jurisdiction_id' => $this->request->getPost('rate_jurisdiction_id', FILTER_SANITIZE_NUMBER_INT), 'rate_jurisdiction_id' => $this->request->getPost('rate_jurisdiction_id', FILTER_SANITIZE_NUMBER_INT),
'tax_rate' => $tax_rate, 'tax_rate' => $tax_rate,
'tax_rounding_code' => $this->request->getPost('tax_rounding_code', FILTER_SANITIZE_NUMBER_INT) 'tax_rounding_code' => $this->request->getPost('tax_rounding_code', FILTER_SANITIZE_NUMBER_INT)

View File

@@ -6,6 +6,9 @@ use CodeIgniter\Database\Migration;
use Config\Database; use Config\Database;
class Migration_fix_keys_for_db_upgrade extends Migration { class Migration_fix_keys_for_db_upgrade extends Migration {
private array $constraints;
/** /**
* Perform a migration step. * Perform a migration step.
*/ */
@@ -60,10 +63,15 @@ class Migration_fix_keys_for_db_upgrade extends Migration {
if ( ! $result->getRowArray()) if ( ! $result->getRowArray())
{ {
$this->delete_index($table, $index); $constraintsDropped = $this->delete_index($table, $index);
$forge = Database::forge(); $forge = Database::forge();
$forge->addPrimaryKey($table, ''); $forge->addPrimaryKey($table, '');
if($constraintsDropped)
{
$this->recreateConstraints($table, $index);
}
} }
} }
@@ -74,13 +82,81 @@ class Migration_fix_keys_for_db_upgrade extends Migration {
return $row_array && $row_array['COUNT(*)'] > 0; return $row_array && $row_array['COUNT(*)'] > 0;
} }
private function delete_index(string $table, string $index): void private function delete_index(string $table, string $index): bool
{ {
$constraintsDropped = false;
if ($this->index_exists($table, $index)) if ($this->index_exists($table, $index))
{ {
$constraintsDropped = $this->dropConstraints($table, $index);
$forge = Database::forge(); $forge = Database::forge();
$forge->dropKey($table, $index, FALSE); $forge->dropKey($table, $index, FALSE);
} }
return $constraintsDropped;
}
/**
* Checks to see if a foreign key constraint exists and drops it if it does.
* @param string $table The table name to check for the constraint
* @param string $index The index name to check for the constraint
* @return void
*/
private function dropConstraints(string $table, string $index): bool
{
$sql = "SELECT
kcu.CONSTRAINT_NAME,
kcu.COLUMN_NAME,
kcu.TABLE_NAME,
kcu.REFERENCED_COLUMN_NAME,
kcu.REFERENCED_TABLE_NAME,
rc.UPDATE_RULE,
rc.DELETE_RULE
FROM information_schema.KEY_COLUMN_USAGE kcu
JOIN information_schema.REFERENTIAL_CONSTRAINTS rc
ON kcu.CONSTRAINT_NAME = rc.CONSTRAINT_NAME
WHERE kcu.TABLE_SCHEMA = DATABASE()
AND (kcu.REFERENCED_TABLE_NAME = '" . $this->db->getPrefix() . "$table'
AND kcu.REFERENCED_COLUMN_NAME = '$index'
OR kcu.TABLE_NAME = '" . $this->db->getPrefix() . "$table'
AND kcu.COLUMN_NAME = '$index')
";
$query = $this->db->query($sql);
$this->constraints = $query->getResult();
$constraintsDropped = false;
foreach($this->constraints as $constraint)
{
$constraintName = $constraint->CONSTRAINT_NAME;
$referencingTable = str_replace($this->db->getPrefix(), '', $constraint->TABLE_NAME);
$forge = Database::forge();
if($forge->dropForeignKey($referencingTable, $constraintName))
{
$constraintsDropped = true;
}
}
return $constraintsDropped;
}
/**
* Re-creates the missing foreign key constraint which needed to be dropped in order to add the Primary Key
* @return void
*/
private function recreateConstraints(): void
{
$forge = Database::forge();
foreach($this->constraints as $constraint)
{
$index = $constraint->COLUMN_NAME;
$table = str_replace($this->db->getPrefix(), '', $constraint->TABLE_NAME);
$referencedTable = $constraint->REFERENCED_TABLE_NAME;
$constraintName = $constraint->CONSTRAINT_NAME;
$onUpdate = $constraint->UPDATE_RULE;
$onDelete = $constraint->DELETE_RULE;
$forge->addForeignKey($index, $referencedTable, $index, $onUpdate, $onDelete, $constraintName);
$forge->processIndexes($table);
}
} }
} }

View File

@@ -485,6 +485,17 @@ function parse_decimals(string $number, int $decimals = null): mixed
return $number; return $number;
} }
$locale_safe_number = prepare_decimal($number);
if ($locale_safe_number > MAX_PRECISION)
{
return false;
}
if($locale_safe_number > 1.e14)
{
return false;
}
$config = config(OSPOS::class)->settings; $config = config(OSPOS::class)->settings;
@@ -492,10 +503,11 @@ function parse_decimals(string $number, int $decimals = null): mixed
if(!$decimals) if(!$decimals)
{ {
$decimals = intVal($config['currency_decimals']); $decimals = $config['currency_decimals'];
$fmt->setAttribute(NumberFormatter::FRACTION_DIGITS, $decimals);
} }
$fmt->setAttribute(NumberFormatter::FRACTION_DIGITS, $decimals);
if(empty($config['thousands_separator'])) if(empty($config['thousands_separator']))
{ {
$fmt->setTextAttribute(NumberFormatter::GROUPING_SEPARATOR_SYMBOL, ''); $fmt->setTextAttribute(NumberFormatter::GROUPING_SEPARATOR_SYMBOL, '');
@@ -503,18 +515,7 @@ function parse_decimals(string $number, int $decimals = null): mixed
try try
{ {
$locale_safe_number = $fmt->parse($number); return $fmt->parse($number);
if (
$locale_safe_number === false
|| $locale_safe_number > MAX_PRECISION
|| $locale_safe_number > 1.e14
)
{
return false;
}
return (float) $locale_safe_number;
} }
catch(Exception $e) catch(Exception $e)
{ {
@@ -703,3 +704,23 @@ function decode_array(array $data): array
return $data; return $data;
} }
/**
* Determines if the current locale uses a comma for decimal separator and reformats the decimal to use a period.
*
* @param string $decimal The decimal to reformat.
* @return string The reformatted decimal.
*/
function prepare_decimal(string $decimal): string
{
$config = config(OSPOS::class)->settings;
$fmt = new NumberFormatter($config['number_locale'], NumberFormatter::DECIMAL);
$decimal_separator = $fmt->getSymbol(NumberFormatter::DECIMAL_SEPARATOR_SYMBOL);
if($decimal_separator === ',' && str_contains($decimal, ','))
{
$decimal = str_replace('.', '', $decimal); //Remove thousands separator
$decimal = str_replace(',', '.', $decimal); //Replace decimal separator
}
return $decimal;
}

View File

@@ -84,10 +84,10 @@ function get_sales_manage_table_headers(): string
if($config['invoice_enable']) if($config['invoice_enable'])
{ {
$headers[] = ['invoice_number' => lang('Sales.invoice_number')]; $headers[] = ['invoice_number' => lang('Sales.invoice_number')];
$headers[] = ['invoice' => '', 'sortable' => false, 'escape' => false]; $headers[] = ['invoice' => '&nbsp', 'sortable' => false, 'escape' => false];
} }
$headers[] = ['receipt' => '', 'sortable' => false, 'escape' => false]; $headers[] = ['receipt' => '&nbsp', 'sortable' => false, 'escape' => false];
return transform_headers($headers); return transform_headers($headers);
} }
@@ -116,7 +116,7 @@ function get_sale_data_row(object $sale): array
{ {
$row['invoice_number'] = $sale->invoice_number; $row['invoice_number'] = $sale->invoice_number;
$row['invoice'] = empty($sale->invoice_number) $row['invoice'] = empty($sale->invoice_number)
? '-' ? ''
: anchor( : anchor(
"$controller/invoice/$sale->sale_id", "$controller/invoice/$sale->sale_id",
'<span class="glyphicon glyphicon-list-alt"></span>', '<span class="glyphicon glyphicon-list-alt"></span>',

View File

@@ -1,149 +1,148 @@
<?php <?php
return [ return [
'all' => "hamısı", "all" => "hamısı",
'authority' => "Səlahiyyət", "authority" => "Səlahiyyət",
'canceled' => "Ləğv Edilmiş", "canceled" => "Ləğv Edilmiş",
'categories' => "Kateqoriyalar", "categories" => "Kateqoriyalar",
'categories_summary_report' => "komentariyalar", "categories_summary_report" => "komentariyalar",
'category' => "Kategoriya", "category" => "Kategoriya",
'code_canceled' => "CNL", "code_canceled" => "CNL",
'code_invoice' => "INV", "code_invoice" => "INV",
'code_pos' => "POS", "code_pos" => "POS",
'code_quote' => "Q", "code_quote" => "Q",
'code_return' => "RET", "code_return" => "RET",
'code_type' => "Növ", "code_type" => "Növ",
'code_work_order' => "W/O", "code_work_order" => "W/O",
'comments' => "bütün qiymət", "comments" => "bütün qiymət",
'commission' => "", "commission" => "",
'complete' => "Tamamlanmış Satış və Geri Qaytarılanlar", "complete" => "Tamamlanmış Satış və Geri Qaytarılanlar",
'completed_sales' => "Tamamlanmış Satışlar", "completed_sales" => "Tamamlanmış Satışlar",
'confirm_delete' => "Seçdiyiniz giriş (lər) silmək istədiyinizə əminsinizmi?", "confirm_delete" => "Seçdiyiniz giriş (lər) silmək istədiyinizə əminsinizmi?",
'confirm_restore' => "Seçilmiş giriş (lər) bərpa etmək istədiyinizə əminsinizmi?", "confirm_restore" => "Seçilmiş giriş (lər) bərpa etmək istədiyinizə əminsinizmi?",
'cost' => "hesab", "cost" => "hesab",
'cost_price' => "müştəri", "cost_price" => "müştəri",
'count' => "müştərilər", "count" => "müştərilər",
'customer' => "müştərilərin hesabatı", "customer" => "müştərilərin hesabatı",
'customers' => "Müştərilər", "customers" => "Müştərilər",
'customers_summary_report' => "gün", "customers_summary_report" => "gün",
'date' => "təsvir", "date" => "təsvir",
'date_range' => "detallı göndərilən hesabatlar", "date_range" => "detallı göndərilən hesabatlar",
'description' => "detallı hesabatlar", "description" => "detallı hesabatlar",
'detailed_receivings_report' => "Ətraflı satınalma hesabatı", "detailed_receivings_report" => "Ətraflı satınalma hesabatı",
'detailed_receivings_report_input' => "", "detailed_receivings_report_input" => "",
'detailed_reports' => "etraflı məlumat", "detailed_reports" => "etraflı məlumat",
'detailed_requisition_report' => "endirimler", "detailed_requisition_report" => "endirimler",
'detailed_sales_report' => "Ətraflı satış hesabatı", "detailed_sales_report" => "Ətraflı satış hesabatı",
'discount' => "endirimlər", "discount" => "endirimlər",
'discount_fixed' => "Sabit endirim", "discount_fixed" => "Sabit endirim",
'discount_percent' => "endirim hesabları", "discount_percent" => "endirim hesabları",
'discount_type' => "Endirim növü", "discount_type" => "Endirim növü",
'discounts' => "Endirimlər", "discounts" => "Endirimlər",
'discounts_summary_report' => "əməkdaş", "discounts_summary_report" => "əməkdaş",
'earned' => "əməkdaş", "earned" => "əməkdaş",
'employee' => "əməkdaşın hesabatı", "employee" => "əməkdaşın hesabatı",
'employees' => "İşçilər", "employees" => "İşçilər",
'employees_summary_report' => "İşçilərin Xülasəsi Hesabatı", "employees_summary_report" => "İşçilərin Xülasəsi Hesabatı",
'expenses' => "Xərclər", "expenses" => "Xərclər",
'expenses_amount' => "Məbləğ", "expenses_amount" => "Məbləğ",
'expenses_categories' => "Xərclər", "expenses_categories" => "Xərclər",
'expenses_categories_summary_report' => "Xərc kateqoriyasında Son Hesabat", "expenses_categories_summary_report" => "Xərc kateqoriyasında Son Hesabat",
'expenses_category' => "Kategoriya", "expenses_category" => "Kategoriya",
'expenses_payment_amount' => "", "expenses_payment_amount" => "",
'expenses_tax_amount' => "Vergi", "expenses_tax_amount" => "Vergi",
'expenses_total_amount' => "Ümumi Məbləğ", "expenses_total_amount" => "Ümumi Məbləğ",
'expenses_total_tax_amount' => "Ümumi Vergi", "expenses_total_tax_amount" => "Ümumi Vergi",
'graphical_reports' => "Qrafik Hesabatlar", "graphical_reports" => "Qrafik Hesabatlar",
'inventory' => "İnvertizasiya", "inventory" => "İnvertizasiya",
'inventory_low' => "inventor hesabatları", "inventory_low" => "inventor hesabatları",
'inventory_low_report' => "mal adı", "inventory_low_report" => "mal adı",
'inventory_reports' => "malın nomrəsi", "inventory_reports" => "malın nomrəsi",
'inventory_summary' => "mallar", "inventory_summary" => "mallar",
'inventory_summary_report' => "alınan mallar", "inventory_summary_report" => "alınan mallar",
'item' => "gondərilən mallar", "item" => "gondərilən mallar",
'item_count' => "mal hesabatı", "item_count" => "mal hesabatı",
'item_name' => "aşağı hesabatlar", "item_name" => "aşağı hesabatlar",
'item_number' => "aşağı inventor hesabat", "item_number" => "aşağı inventor hesabat",
'items' => "Mallar", "items" => "Mallar",
'items_purchased' => "ad", "items_purchased" => "ad",
'items_received' => "Qəbul Olunan Mallar", "items_received" => "Qəbul Olunan Mallar",
'items_summary_report' => "ödəniş tipi", "items_summary_report" => "ödəniş tipi",
'jurisdiction' => "Yurisdiksiya", "jurisdiction" => "Yurisdiksiya",
'low_inventory' => "ödənişlər", "low_inventory" => "ödənişlər",
'low_inventory_report' => "inventor hesabatı", "low_inventory_report" => "inventor hesabatı",
'low_sell_quantity' => "Satış miqdarı", "low_sell_quantity" => "Satış miqdarı",
'more_than_zero' => "gəlir", "more_than_zero" => "gəlir",
'name' => "Qty On Hand", "name" => "Qty On Hand",
'no_reports_to_display' => "Göstərmək üçün məhsul yoxdur.", "no_reports_to_display" => "Göstərmək üçün məhsul yoxdur.",
'payment_type' => "Ödəmə Növü", "payment_type" => "Ödəmə Növü",
'payments' => "kim tərəfindən", "payments" => "kim tərəfindən",
'payments_summary_report' => "Ödəmələr Yekun Hesabatı", "payments_summary_report" => "Ödəmələr Yekun Hesabatı",
'profit' => "Qazanc", "profit" => "Qazanc",
'quantity' => "qəbul olunanlar", "quantity" => "qəbul olunanlar",
'quantity_purchased' => "aşağı səviyyə", "quantity_purchased" => "aşağı səviyyə",
'quotes' => "hesabat", "quotes" => "hesabat",
'received_by' => "çıxış hesabatı", "received_by" => "çıxış hesabatı",
'receiving_id' => "Hesabatlar", "receiving_id" => "Hesabatlar",
'receiving_type' => "Qəbul Növü", "receiving_type" => "Qəbul Növü",
'receivings' => "Qəbul olunanlar", "receivings" => "Qəbul olunanlar",
'reorder_level' => "Səviyyəni Yenidən Düzəlt", "reorder_level" => "Səviyyəni Yenidən Düzəlt",
'report' => "Hesabat", "report" => "Hesabat",
'report_input' => "Hesabatı daxil edin", "report_input" => "Hesabatı daxil edin",
'reports' => "Hesabatlar", "reports" => "Hesabatlar",
'requisition' => "", "requisition" => "",
'requisition_by' => "", "requisition_by" => "",
'requisition_id' => "", "requisition_id" => "",
'requisition_item' => "geri qaytarılanlar", "requisition_item" => "geri qaytarılanlar",
'requisition_item_quantity' => "gəlir", "requisition_item_quantity" => "gəlir",
'requisition_related_item' => "ID satışı", "requisition_related_item" => "ID satışı",
'requisition_related_item_total_quantity' => "endirim tipi", "requisition_related_item_total_quantity" => "endirim tipi",
'requisition_related_item_unit_quantity' => "satışlar", "requisition_related_item_unit_quantity" => "satışlar",
'requisitions' => "Satış qiyməti", "requisitions" => "Satış qiyməti",
'returns' => "endirim hesabatları", "returns" => "endirim hesabatları",
'revenue' => "Gəlir", "revenue" => "Gəlir",
'sale_id' => "satılıb kim tərəfindən", "sale_id" => "satılıb kim tərəfindən",
'sale_type' => "satılıb kimə", "sale_type" => "satılıb kimə",
'sales' => "Əməliyyatlar", "sales" => "Əməliyyatlar",
'sales_amount' => "Əməliyyatların Məbləği", "sales_amount" => "Əməliyyatların Məbləği",
'sales_summary_report' => "toplam", "sales_summary_report" => "toplam",
'sales_taxes' => "Satışdan Vergi", "sales_taxes" => "Satışdan Vergi",
'sales_taxes_summary_report' => "Satışdan vergilərə dair yekun hesabat", "sales_taxes_summary_report" => "Satışdan vergilərə dair yekun hesabat",
'serial_number' => "hesabatlar", "serial_number" => "hesabatlar",
'service_charge' => "", "service_charge" => "",
'sold_by' => "kim tərəfindən qoyulub", "sold_by" => "kim tərəfindən qoyulub",
'sold_items' => "", "sold_items" => "",
'sold_to' => "təchizatçı", "sold_to" => "təchizatçı",
'stock_location' => "təchizatçılar", "stock_location" => "təchizatçılar",
'sub_total_value' => "təchizatci hesabatı", "sub_total_value" => "təchizatci hesabatı",
'subtotal' => "vergi", "subtotal" => "vergi",
'summary_reports' => "Yekun Hesabatı", "summary_reports" => "vergi faizi",
'supplied_by' => "vergilər", "supplied_by" => "vergilər",
'supplier' => "vergi hesabatı", "supplier" => "vergi hesabatı",
'suppliers' => "toplam", "suppliers" => "toplam",
'suppliers_summary_report' => "Təchizatçıların Yekun Hesabatı", "suppliers_summary_report" => "Təchizatçıların Yekun Hesabatı",
'tax' => "tip", "tax" => "tip",
'tax_category' => "Vergi Bolməsi", "tax_category" => "Vergi Bolməsi",
'tax_name' => "", "tax_name" => "",
'tax_percent' => "Retail Price", "tax_percent" => "Retail Price",
'tax_rate' => "Vergi dərəcəsi", "tax_rate" => "Vergi dərəcəsi",
'taxes' => "Vergilər", "taxes" => "Vergilər",
'taxes_summary_report' => "Vergi Yekun Hesabatı", "taxes_summary_report" => "Vergi Yekun Hesabatı",
'total' => "Cəm", "total" => "Cəm",
'total_inventory_value' => "Ümumi İnvanter Qiyməti", "total_inventory_value" => "Ümumi İnvanter Qiyməti",
'total_low_sell_quantity' => "Ümumi aşağı satışların sayı", "total_low_sell_quantity" => "Ümumi aşağı satışların sayı",
'total_quantity' => "Ümumi Miqdarı", "total_quantity" => "Ümumi Miqdarı",
'total_retail' => "Toplam inv. Pərakəndə dəyəri", "total_retail" => "Toplam inv. Pərakəndə dəyəri",
'trans_amount' => "Əməliyyat məbləği", "trans_amount" => "Əməliyyat məbləği",
'trans_due' => "Buna görə", "trans_due" => "Buna görə",
'trans_group' => "Əməliyyat Qrupu", "trans_group" => "Əməliyyat Qrupu",
'trans_nopay_sales' => "Ödənişsiz satış", "trans_nopay_sales" => "Ödənişsiz satış",
'trans_payments' => "Ödəmələr", "trans_payments" => "Ödəmələr",
'trans_refunded' => "Geri qaytarıldı", "trans_refunded" => "Geri qaytarıldı",
'trans_sales' => "Satışlar", "trans_sales" => "Satışlar",
'trans_type' => "Əməliyyat növü", "trans_type" => "Əməliyyat növü",
'type' => "Növ", "type" => "Növ",
'unit_price' => "Pərakəndə Qiyməti", "unit_price" => "Pərakəndə Qiyməti",
'used' => "İstifadə edilən ballar", "used" => "İstifadə edilən ballar",
'work_orders' => "İstifadə Olunan Ballar", "work_orders" => "İstifadə Olunan Ballar",
'zero_and_less' => "Sıfır və Aşağı", "zero_and_less" => "Sıfır və Aşağı",
]; ];

View File

@@ -1,331 +1,330 @@
<?php <?php
return [ return [
'address' => "Alamat Perusahaan", "address" => "Alamat Perusahaan",
'address_required' => "Alamat Perusahaan wajib diisi.", "address_required" => "Alamat Perusahaan wajib diisi.",
'all_set' => "Semua perizinan file diatur dengan benar!", "all_set" => "Semua perizinan file diatur dengan benar!",
'allow_duplicate_barcodes' => "Ijinkan kode batang ganda", "allow_duplicate_barcodes" => "Ijinkan kode batang ganda",
'apostrophe' => "Tanda petik (')", "apostrophe" => "Tanda petik (')",
'backup_button' => "Cadangkan", "backup_button" => "Cadangkan",
'backup_database' => "Cadangkan basis data", "backup_database" => "Cadangkan basis data",
'barcode' => "Kode batang", "barcode" => "Kode batang",
'barcode_company' => "Nama Perusahaan", "barcode_company" => "Nama Perusahaan",
'barcode_configuration' => "Pengaturan kode batang", "barcode_configuration" => "Pengaturan kode batang",
'barcode_content' => "Isi kode batang", "barcode_content" => "Isi kode batang",
'barcode_first_row' => "Baris 1", "barcode_first_row" => "Baris 1",
'barcode_font' => "Jenis huruf", "barcode_font" => "Jenis huruf",
'barcode_formats' => "Format masukan", "barcode_formats" => "Format masukan",
'barcode_generate_if_empty' => "Buatkan kode batang otomatis jika kosong.", "barcode_generate_if_empty" => "Buatkan kode batang otomatis jika kosong.",
'barcode_height' => "Tinggi (px)", "barcode_height" => "Tinggi (px)",
'barcode_id' => "Item Id/Nama", "barcode_id" => "Item Id/Nama",
'barcode_info' => "Informasi pengaturan kode batang", "barcode_info" => "Informasi pengaturan kode batang",
'barcode_layout' => "Tata letak kode batang", "barcode_layout" => "Tata letak kode batang",
'barcode_name' => "Nama", "barcode_name" => "Nama",
'barcode_number' => "Kode batang", "barcode_number" => "Kode batang",
'barcode_number_in_row' => "Jumlah baris", "barcode_number_in_row" => "Jumlah baris",
'barcode_page_cellspacing' => "Tampilkan jarak antar sel pada halaman.", "barcode_page_cellspacing" => "Tampilkan jarak antar sel pada halaman.",
'barcode_page_width' => "Lebar halaman", "barcode_page_width" => "Lebar halaman",
'barcode_price' => "Harga", "barcode_price" => "Harga",
'barcode_second_row' => "Baris 2", "barcode_second_row" => "Baris 2",
'barcode_third_row' => "Baris 3", "barcode_third_row" => "Baris 3",
'barcode_tooltip' => "Peringatan: Fitur ini dapat meyebabkan duplikasi item yang diimpor atau dibuat. Jangan digunakan jika Anda tidak ingin menggandakan kode batang.", "barcode_tooltip" => "Peringatan: Fitur ini dapat meyebabkan duplikasi item yang diimpor atau dibuat. Jangan digunakan jika Anda tidak ingin menggandakan kode batang.",
'barcode_type' => "Jenis kode batang", "barcode_type" => "Jenis kode batang",
'barcode_width' => "Lebar (px)", "barcode_width" => "Lebar (px)",
'bottom' => "Bawah", "bottom" => "Bawah",
'cash_button' => "", "cash_button" => "",
'cash_button_1' => "", "cash_button_1" => "",
'cash_button_2' => "", "cash_button_2" => "",
'cash_button_3' => "", "cash_button_3" => "",
'cash_button_4' => "", "cash_button_4" => "",
'cash_button_5' => "", "cash_button_5" => "",
'cash_button_6' => "", "cash_button_6" => "",
'cash_decimals' => "Desimal Tunai", "cash_decimals" => "Desimal Tunai",
'cash_decimals_tooltip' => "Jika Desimal Tunai dan Desimal Mata Uang sama, maka pembulatan uang tidak akan dilakukan.", "cash_decimals_tooltip" => "Jika Desimal Tunai dan Desimal Mata Uang sama, maka pembulatan uang tidak akan dilakukan.",
'cash_rounding' => "Pembulatan tunai", "cash_rounding" => "Pembulatan tunai",
'category_dropdown' => "Tampilkan menu tarik turun untuk Kategori", "category_dropdown" => "Tampilkan menu tarik turun untuk Kategori",
'center' => "Tengah", "center" => "Tengah",
'change_apperance_tooltip' => "", "change_apperance_tooltip" => "",
'comma' => "koma", "comma" => "koma",
'company' => "Nama Perusahaan", "company" => "Nama Perusahaan",
'company_avatar' => "", "company_avatar" => "",
'company_change_image' => "Ubah gambar", "company_change_image" => "Ubah gambar",
'company_logo' => "Logo perusahaan", "company_logo" => "Logo perusahaan",
'company_remove_image' => "Hapus gambar", "company_remove_image" => "Hapus gambar",
'company_required' => "Nama Perusahaan wajib diisi", "company_required" => "Nama Perusahaan wajib diisi",
'company_select_image' => "Pilih gambar", "company_select_image" => "Pilih gambar",
'company_website_url' => "Situs Perusahaan bukan URL yang benar(http://...).", "company_website_url" => "Situs Perusahaan bukan URL yang benar(http://...).",
'country_codes' => "Kode negara", "country_codes" => "Kode negara",
'country_codes_tooltip' => "Daftar kode negara format CSV untuk lookup alamat.", "country_codes_tooltip" => "Daftar kode negara format CSV untuk lookup alamat.",
'currency_code' => "Kode Mata uang", "currency_code" => "Kode Mata uang",
'currency_decimals' => "Angka desimal", "currency_decimals" => "Angka desimal",
'currency_symbol' => "Simbol Mata Uang", "currency_symbol" => "Simbol Mata Uang",
'current_employee_only' => "", "current_employee_only" => "",
'customer_reward' => "Hadiah", "customer_reward" => "Hadiah",
'customer_reward_duplicate' => "Masukkan nama unik untuk hadiah.", "customer_reward_duplicate" => "Masukkan nama unik untuk hadiah.",
'customer_reward_enable' => "Aktifkan Hadiah Konsumen", "customer_reward_enable" => "Aktifkan Hadiah Konsumen",
'customer_reward_invalid_chars' => "Nama hadiah tidak boleh berisi '_'", "customer_reward_invalid_chars" => "Nama hadiah tidak boleh berisi '_'",
'customer_reward_required' => "Kolom hadiah tidak boleh kosong", "customer_reward_required" => "Kolom hadiah tidak boleh kosong",
'customer_sales_tax_support' => "Dukungan Pajak Penjualan Pelanggan", "customer_sales_tax_support" => "Dukungan Pajak Penjualan Pelanggan",
'date_or_time_format' => "Penyaring tanggal dan waktu", "date_or_time_format" => "Penyaring tanggal dan waktu",
'datetimeformat' => "Format tanggal dan waktu", "datetimeformat" => "Format tanggal dan waktu",
'decimal_point' => "Titik Desimal", "decimal_point" => "Titik Desimal",
'default_barcode_font_size_number' => "Pengaturan ukuran kode batang default harus berupa angka.", "default_barcode_font_size_number" => "Pengaturan ukuran kode batang default harus berupa angka.",
'default_barcode_font_size_required' => "Pengaturan ukuran kode batang default harus diisi.", "default_barcode_font_size_required" => "Pengaturan ukuran kode batang default harus diisi.",
'default_barcode_height_number' => "Pengaturan tinggi kode batang harus berupa angka.", "default_barcode_height_number" => "Pengaturan tinggi kode batang harus berupa angka.",
'default_barcode_height_required' => "Pengaturan tinggi kode batang harus diisi.", "default_barcode_height_required" => "Pengaturan tinggi kode batang harus diisi.",
'default_barcode_num_in_row_number' => "Kode batang harus berupa angka.", "default_barcode_num_in_row_number" => "Kode batang harus berupa angka.",
'default_barcode_num_in_row_required' => "Kode batang harus diisi.", "default_barcode_num_in_row_required" => "Kode batang harus diisi.",
'default_barcode_page_cellspacing_number' => "Pengaturan spasi sel kode batang harus berupa angka.", "default_barcode_page_cellspacing_number" => "Pengaturan spasi sel kode batang harus berupa angka.",
'default_barcode_page_cellspacing_required' => "Pengaturan spasi sel kode batang harus diisi.", "default_barcode_page_cellspacing_required" => "Pengaturan spasi sel kode batang harus diisi.",
'default_barcode_page_width_number' => "Lebar halaman kode batang harus berupa angka.", "default_barcode_page_width_number" => "Lebar halaman kode batang harus berupa angka.",
'default_barcode_page_width_required' => "Lebar halaman kode batang harus diisi.", "default_barcode_page_width_required" => "Lebar halaman kode batang harus diisi.",
'default_barcode_width_number' => "Lebar kode batang harus berupa angka.", "default_barcode_width_number" => "Lebar kode batang harus berupa angka.",
'default_barcode_width_required' => "Lebar kode batang harus diisi.", "default_barcode_width_required" => "Lebar kode batang harus diisi.",
'default_item_columns' => "Kolom item terlihat bawaan", "default_item_columns" => "Kolom item terlihat bawaan",
'default_origin_tax_code' => "Kode Pajak Asal Default", "default_origin_tax_code" => "Kode Pajak Asal Default",
'default_receivings_discount' => "Diskon pembelian bawaan", "default_receivings_discount" => "Diskon pembelian bawaan",
'default_receivings_discount_number' => "Diskon pembelian bawaaan harus berupa angka.", "default_receivings_discount_number" => "Diskon pembelian bawaaan harus berupa angka.",
'default_receivings_discount_required' => "Diskon oembelian harus diisi.", "default_receivings_discount_required" => "Diskon oembelian harus diisi.",
'default_sales_discount' => "Diskon penjualan bawaan", "default_sales_discount" => "Diskon penjualan bawaan",
'default_sales_discount_number' => "Diskon penjualan harus berupa angka.", "default_sales_discount_number" => "Diskon penjualan harus berupa angka.",
'default_sales_discount_required' => "Diskon penjualan harus diisi.", "default_sales_discount_required" => "Diskon penjualan harus diisi.",
'default_tax_category' => "Kategori pajak bawaan", "default_tax_category" => "Kategori pajak bawaan",
'default_tax_code' => "Kode pajak bawaan", "default_tax_code" => "Kode pajak bawaan",
'default_tax_jurisdiction' => "Yuridiksi Pajak bawaan", "default_tax_jurisdiction" => "Yuridiksi Pajak bawaan",
'default_tax_name_number' => "Nama Pajak Default harus berupa string.", "default_tax_name_number" => "Nama Pajak Default harus berupa string.",
'default_tax_name_required' => "Jenis pajak harus diisi.", "default_tax_name_required" => "Jenis pajak harus diisi.",
'default_tax_rate' => "Tarif Pajak %", "default_tax_rate" => "Tarif Pajak %",
'default_tax_rate_1' => "Tarif Pajak 1", "default_tax_rate_1" => "Tarif Pajak 1",
'default_tax_rate_2' => "Tarif Pajak 2", "default_tax_rate_2" => "Tarif Pajak 2",
'default_tax_rate_3' => "", "default_tax_rate_3" => "",
'default_tax_rate_number' => "Tarif Pajak harus berupa angkat.", "default_tax_rate_number" => "Tarif Pajak harus berupa angkat.",
'default_tax_rate_required' => "Tarif Pajak Biasa harus diisi.", "default_tax_rate_required" => "Tarif Pajak Biasa harus diisi.",
'derive_sale_quantity' => "Ijinkan Kuantitas Penjulan Diturunkan", "derive_sale_quantity" => "Ijinkan Kuantitas Penjulan Diturunkan",
'derive_sale_quantity_tooltip' => "Jika dicentang maka jenis barang baru akan disediakan untuk barang yang dipesan dengan jumlah yang diperpanjang", "derive_sale_quantity_tooltip" => "Jika dicentang maka jenis barang baru akan disediakan untuk barang yang dipesan dengan jumlah yang diperpanjang",
'dinner_table' => "Meja", "dinner_table" => "Meja",
'dinner_table_duplicate' => "Masukkan nama meja (harus unik).", "dinner_table_duplicate" => "Masukkan nama meja (harus unik).",
'dinner_table_enable' => "Aktifkan meja", "dinner_table_enable" => "Aktifkan meja",
'dinner_table_invalid_chars' => "Nama meja tidak dapat berisi karater '_'.", "dinner_table_invalid_chars" => "Nama meja tidak dapat berisi karater '_'.",
'dinner_table_required' => "Meja adalah kolom yang harus diisi.", "dinner_table_required" => "Meja adalah kolom yang harus diisi.",
'dot' => "titik", "dot" => "titik",
'email' => "Email", "email" => "Email",
'email_configuration' => "Konfigurasi Email", "email_configuration" => "Konfigurasi Email",
'email_mailpath' => "Direktori untuk Sendmail", "email_mailpath" => "Direktori untuk Sendmail",
'email_protocol' => "Protocol", "email_protocol" => "Protocol",
'email_receipt_check_behaviour' => "Kotak centang Penerimaan Email", "email_receipt_check_behaviour" => "Kotak centang Penerimaan Email",
'email_receipt_check_behaviour_always' => "Selalu dicentang", "email_receipt_check_behaviour_always" => "Selalu dicentang",
'email_receipt_check_behaviour_last' => "Ingat pilihan terakhir", "email_receipt_check_behaviour_last" => "Ingat pilihan terakhir",
'email_receipt_check_behaviour_never' => "Selalu tidak tercentang", "email_receipt_check_behaviour_never" => "Selalu tidak tercentang",
'email_smtp_crypto' => "Enkripsi SMTP", "email_smtp_crypto" => "Enkripsi SMTP",
'email_smtp_host' => "Server SMTP", "email_smtp_host" => "Server SMTP",
'email_smtp_pass' => "Kata Sandi SMTP", "email_smtp_pass" => "Kata Sandi SMTP",
'email_smtp_port' => "Port SMTP", "email_smtp_port" => "Port SMTP",
'email_smtp_timeout' => "Masa Aktif SMTP", "email_smtp_timeout" => "Masa Aktif SMTP",
'email_smtp_user' => "Nama Pengguna SMTP", "email_smtp_user" => "Nama Pengguna SMTP",
'enable_avatar' => "", "enable_avatar" => "",
'enable_avatar_tooltip' => "", "enable_avatar_tooltip" => "",
'enable_dropdown_tooltip' => "", "enable_dropdown_tooltip" => "",
'enable_new_look' => "", "enable_new_look" => "",
'enable_right_bar' => "", "enable_right_bar" => "",
'enable_right_bar_tooltip' => "", "enable_right_bar_tooltip" => "",
'enforce_privacy' => "Berlakukan privasi", "enforce_privacy" => "Berlakukan privasi",
'enforce_privacy_tooltip' => "Lindungi privasi Pelanggan yang menegakkan data dalam hal data mereka dihapus", "enforce_privacy_tooltip" => "Lindungi privasi Pelanggan yang menegakkan data dalam hal data mereka dihapus",
'fax' => "Fax", "fax" => "Fax",
'file_perm' => "Perizinan berkas bermasalah, Silakan perbaiki dan muat ulang halaman ini.", "file_perm" => "Perizinan berkas bermasalah, Silakan perbaiki dan muat ulang halaman ini.",
'financial_year' => "Tahun Awal Fiskal", "financial_year" => "Tahun Awal Fiskal",
'financial_year_apr' => "1 April", "financial_year_apr" => "1 April",
'financial_year_aug' => "1 Agustus", "financial_year_aug" => "1 Agustus",
'financial_year_dec' => "1 Desember", "financial_year_dec" => "1 Desember",
'financial_year_feb' => "1 Februari", "financial_year_feb" => "1 Februari",
'financial_year_jan' => "1 Januari", "financial_year_jan" => "1 Januari",
'financial_year_jul' => "1 Juli", "financial_year_jul" => "1 Juli",
'financial_year_jun' => "1 Juni", "financial_year_jun" => "1 Juni",
'financial_year_mar' => "1 Maret", "financial_year_mar" => "1 Maret",
'financial_year_may' => "1 Mei", "financial_year_may" => "1 Mei",
'financial_year_nov' => "1 November", "financial_year_nov" => "1 November",
'financial_year_oct' => "1 Oktober", "financial_year_oct" => "1 Oktober",
'financial_year_sep' => "1 September", "financial_year_sep" => "1 September",
'floating_labels' => "Label mengambang", "floating_labels" => "Label mengambang",
'gcaptcha_enable' => "Halaman login reCHAPTCHA", "gcaptcha_enable" => "Halaman login reCHAPTCHA",
'gcaptcha_secret_key' => "Kunci Rahasia reCHAPTCHA", "gcaptcha_secret_key" => "Kunci Rahasia reCHAPTCHA",
'gcaptcha_secret_key_required' => "Kunci Rahasia reCHAPTCHA adalah bidang yang harus diisi", "gcaptcha_secret_key_required" => "Kunci Rahasia reCHAPTCHA adalah bidang yang harus diisi",
'gcaptcha_site_key' => "Kunci Situs reCHAPTCHA", "gcaptcha_site_key" => "Kunci Situs reCHAPTCHA",
'gcaptcha_site_key_required' => "Kunci Situs reCHAPTCHA adalah bidang yang dibutuhkan", "gcaptcha_site_key_required" => "Kunci Situs reCHAPTCHA adalah bidang yang dibutuhkan",
'gcaptcha_tooltip' => "Lindungi Halaman Login dengan reCAPTCHA Google, klik pada ikon untuk pasangan kunci API.", "gcaptcha_tooltip" => "Lindungi Halaman Login dengan reCAPTCHA Google, klik pada ikon untuk pasangan kunci API.",
'general' => "Umum", "general" => "Umum",
'general_configuration' => "Pengaturan Umum", "general_configuration" => "Pengaturan Umum",
'giftcard_number' => "Nomor Kartu Hadiah", "giftcard_number" => "Nomor Gift Card",
'giftcard_random' => "Hasilkan acak", "giftcard_random" => "Hasilkan acak",
'giftcard_series' => "Hasilkan dalam seri", "giftcard_series" => "Hasilkan dalam seri",
'image_allowed_file_types' => "Jenis berkas yang diizinkan", "image_allowed_file_types" => "Jenis berkas yang diizinkan",
'image_max_height_tooltip' => "Tinggi maksimum unggahan gambar yang diizinkan dalam piksel (px).", "image_max_height_tooltip" => "Tinggi maksimum unggahan gambar yang diizinkan dalam piksel (px).",
'image_max_size_tooltip' => "ukuran berkas maksimum yang diijinkan untuk mengunggah gambar dalam kilobyte (kb).", "image_max_size_tooltip" => "ukuran berkas maksimum yang diijinkan untuk mengunggah gambar dalam kilobyte (kb).",
'image_max_width_tooltip' => "Lebar maksimum yang diunggah dari pengunggahan gambar dalam piksel (px).", "image_max_width_tooltip" => "Lebar maksimum yang diunggah dari pengunggahan gambar dalam piksel (px).",
'image_restrictions' => "Pembatasan Pengunggahan Gambar", "image_restrictions" => "Pembatasan Pengunggahan Gambar",
'include_hsn' => "Termasuk dukungan kode HSN", "include_hsn" => "Termasuk dukungan kode HSN",
'info' => "Informasi", "info" => "Informasi",
'info_configuration' => "Informasi Toko", "info_configuration" => "Informasi Toko",
'input_groups' => "Grup masukan", "input_groups" => "Grup masukan",
'integrations' => "Integrasi", "integrations" => "Integrasi",
'integrations_configuration' => "Integrasi pihak ketiga", "integrations_configuration" => "Integrasi pihak ketiga",
'invoice' => "Faktur", "invoice" => "Faktur",
'invoice_configuration' => "Pengaturan cetak faktur", "invoice_configuration" => "Pengaturan cetak faktur",
'invoice_default_comments' => "Komentar faktur", "invoice_default_comments" => "Komentar faktur",
'invoice_email_message' => "Templat email faktur", "invoice_email_message" => "Templat email faktur",
'invoice_enable' => "Mengaktifkan faktur", "invoice_enable" => "Mengaktifkan faktur",
'invoice_printer' => "Pencetak Faktur", "invoice_printer" => "Pencetak Faktur",
'invoice_type' => "Tipe Faktur", "invoice_type" => "Tipe Faktur",
'is_readable' => "dapat dibaca, tetapi izin tidak disetel dengan benar. Setel ke 640 atau 660, kemudian segarkan.", "is_readable" => "dapat dibaca, tetapi izin tidak disetel dengan benar. Setel ke 640 atau 660, kemudian segarkan.",
'is_writable' => "bisa ditulis, tetapi izin tidak disetel dengan benar. Setel ke 750 dan segarkan.", "is_writable" => "bisa ditulis, tetapi izin tidak disetel dengan benar. Setel ke 750 dan segarkan.",
'item_markup' => "", "item_markup" => "",
'jsprintsetup_required' => "Perhatian! Fungsi ini hanya berjalan jika anda menggunakan Firefox yang memiliki tambahan jsPrintSetup. Tetap simpan?", "jsprintsetup_required" => "Perhatian! Fungsi ini hanya berjalan jika anda menggunakan Firefox yang memiliki tambahan jsPrintSetup. Tetap simpan?",
'language' => "Bahasa", "language" => "Bahasa",
'last_used_invoice_number' => "Nomor terakhir faktur", "last_used_invoice_number" => "Nomor terakhir faktur",
'last_used_quote_number' => "Nomor Penawaran yang terakhir digunakan", "last_used_quote_number" => "Nomor Penawaran yang terakhir digunakan",
'last_used_work_order_number' => "Nomor W/O yang terakhir dipakai", "last_used_work_order_number" => "Nomor W/O yang terakhir dipakai",
'left' => "Kiri", "left" => "Kiri",
'license' => "Lisensi", "license" => "Lisensi",
'license_configuration' => "Pernyataan Lisensi", "license_configuration" => "Pernyataan Lisensi",
'line_sequence' => "Urutan baris", "line_sequence" => "Urutan baris",
'lines_per_page' => "Baris per halaman", "lines_per_page" => "Baris per halaman",
'lines_per_page_number' => "Baris per halaman harus berupa angka.", "lines_per_page_number" => "Baris per halaman harus berupa angka.",
'lines_per_page_required' => "Baris per halaman tidak boleh kosong.", "lines_per_page_required" => "Baris per halaman tidak boleh kosong.",
'locale' => "Terjemahan", "locale" => "Terjemahan",
'locale_configuration' => "Konfigurasi Terjemahan", "locale_configuration" => "Konfigurasi Terjemahan",
'locale_info' => "Informasi Konfigurasi Terjemahan", "locale_info" => "Informasi Konfigurasi Terjemahan",
'location' => "Lokasi Stock", "location" => "Lokasi Stock",
'location_configuration' => "Lokasi Stock", "location_configuration" => "Lokasi Stock",
'location_info' => "Informasi konfigurasi lokasi stock", "location_info" => "Informasi konfigurasi lokasi stock",
'login_form' => "Gaya Formulir Log Masuk", "login_form" => "Gaya Formulir Log Masuk",
'logout' => "Apakah Anda akan membuat cadangan sebelum anda keluar? Klik [OK] untuk pencadangan, [Batal] untuk keluar.", "logout" => "Apakah Anda akan membuat cadangan sebelum anda keluar? Klik [OK] untuk pencadangan, [Batal] untuk keluar.",
'mailchimp' => "MailChimp", "mailchimp" => "MailChimp",
'mailchimp_api_key' => "Kunci API MailChimp", "mailchimp_api_key" => "Kunci API MailChimp",
'mailchimp_configuration' => "Pengaturan MailChimp", "mailchimp_configuration" => "Pengaturan MailChimp",
'mailchimp_key_successfully' => "Kunci API benar.", "mailchimp_key_successfully" => "Kunci API benar.",
'mailchimp_key_unsuccessfully' => "Kunci API tidak valid.", "mailchimp_key_unsuccessfully" => "Kunci API tidak valid.",
'mailchimp_lists' => "Daftar MailChimp", "mailchimp_lists" => "Daftar MailChimp",
'mailchimp_tooltip' => "Klik pada ikon untuk KUnci API.", "mailchimp_tooltip" => "Klik pada ikon untuk KUnci API.",
'message' => "Pesan", "message" => "Pesan",
'message_configuration' => "Pengaturan Pesan", "message_configuration" => "Pengaturan Pesan",
'msg_msg' => "Pesan teks tersimpan", "msg_msg" => "Pesan teks tersimpan",
'msg_msg_placeholder' => "Apakah Anda ingin menggunakan template SMS menyimpan pesan Anda disini? Jika tidak, biarkan kosong.", "msg_msg_placeholder" => "Apakah Anda ingin menggunakan template SMS menyimpan pesan Anda disini? Jika tidak, biarkan kosong.",
'msg_pwd' => "SMS-API Password", "msg_pwd" => "SMS-API Password",
'msg_pwd_required' => "SMS-API Password harus diisi", "msg_pwd_required" => "SMS-API Password harus diisi",
'msg_src' => "ID pengirim SMS-API", "msg_src" => "ID pengirim SMS-API",
'msg_src_required' => "SMS-API Sender ID harus diisi", "msg_src_required" => "SMS-API Sender ID harus diisi",
'msg_uid' => "SMS-API User Name", "msg_uid" => "SMS-API User Name",
'msg_uid_required' => "SMS-API Username harus diisi", "msg_uid_required" => "SMS-API Username harus diisi",
'multi_pack_enabled' => "Multi paket per item", "multi_pack_enabled" => "Multi paket per item",
'no_risk' => "Tidak ada risiko keamanan / kerentanan.", "no_risk" => "Tidak ada risiko keamanan / kerentanan.",
'none' => "none", "none" => "none",
'notify_alignment' => "Posisi notifikasi Popup", "notify_alignment" => "Posisi notifikasi Popup",
'number_format' => "Format Nomor", "number_format" => "Format Nomor",
'number_locale' => "Terjemahan", "number_locale" => "Terjemahan",
'number_locale_invalid' => "Kode bahasa salah. Cek tautan pada tooltip untuk mendapatkan kode bahasa yang benar.", "number_locale_invalid" => "Kode bahasa salah. Cek tautan pada tooltip untuk mendapatkan kode bahasa yang benar.",
'number_locale_required' => "Kode Lokal wajib diisi.", "number_locale_required" => "Kode Lokal wajib diisi.",
'number_locale_tooltip' => "Menemukan kode lokal melalui link ini.", "number_locale_tooltip" => "Menemukan kode lokal melalui link ini.",
'os_timezone' => "Zona waktu OSPOS:", "os_timezone" => "Zona waktu OSPOS:",
'ospos_info' => "Info pemasangan OSPOS", "ospos_info" => "Info pemasangan OSPOS",
'payment_options_order' => "Urutan pilihan pembayaran", "payment_options_order" => "Urutan pilihan pembayaran",
'perm_risk' => "Setelan izin yang salah berbahaya bagi keamanan perangkat lunak.", "perm_risk" => "Setelan izin yang salah berbahaya bagi keamanan perangkat lunak.",
'phone' => "Telepon Perusahaan", "phone" => "Telepon Perusahaan",
'phone_required' => "Telepon Perusahaan wajib diisi.", "phone_required" => "Telepon Perusahaan wajib diisi.",
'print_bottom_margin' => "Margin Bawah", "print_bottom_margin" => "Margin Bawah",
'print_bottom_margin_number' => "Default margin bawah harus angka.", "print_bottom_margin_number" => "Default margin bawah harus angka.",
'print_bottom_margin_required' => "Default margin Bawah harus di isi.", "print_bottom_margin_required" => "Default margin Bawah harus di isi.",
'print_delay_autoreturn' => "Otomatis Retur pada penundaan Penjualan", "print_delay_autoreturn" => "Otomatis Retur pada penundaan Penjualan",
'print_delay_autoreturn_number' => "Kolom Otomatis Retur pada Penundaan Penjualan harus diisi.", "print_delay_autoreturn_number" => "Kolom Otomatis Retur pada Penundaan Penjualan harus diisi.",
'print_delay_autoreturn_required' => "Pengembalian otomatis untuk Penjualan tertunda harus berupa angka.", "print_delay_autoreturn_required" => "Pengembalian otomatis untuk Penjualan tertunda harus berupa angka.",
'print_footer' => "Mencetak Footer Browser", "print_footer" => "Mencetak Footer Browser",
'print_header' => "Mencetak Browser Header", "print_header" => "Mencetak Browser Header",
'print_left_margin' => "Margin Kiri", "print_left_margin" => "Margin Kiri",
'print_left_margin_number' => "Margin kiri harus berupa angka.", "print_left_margin_number" => "Margin kiri harus berupa angka.",
'print_left_margin_required' => "Margin kiri wajib di isi.", "print_left_margin_required" => "Margin kiri wajib di isi.",
'print_receipt_check_behaviour' => "Centang Cetak Struk", "print_receipt_check_behaviour" => "Centang Cetak Struk",
'print_receipt_check_behaviour_always' => "Selalu dicentang", "print_receipt_check_behaviour_always" => "Selalu dicentang",
'print_receipt_check_behaviour_last' => "Ingat pilihan terakhir", "print_receipt_check_behaviour_last" => "Ingat pilihan terakhir",
'print_receipt_check_behaviour_never' => "Selalu tidak dicentang", "print_receipt_check_behaviour_never" => "Selalu tidak dicentang",
'print_right_margin' => "Margin kanan", "print_right_margin" => "Margin kanan",
'print_right_margin_number' => "Margin kiri harus berupa angka.", "print_right_margin_number" => "Margin kiri harus berupa angka.",
'print_right_margin_required' => "Margin kanan wajib di isi.", "print_right_margin_required" => "Margin kanan wajib di isi.",
'print_silently' => "Tampilkan Print Dialog", "print_silently" => "Tampilkan Print Dialog",
'print_top_margin' => "Margin atas", "print_top_margin" => "Margin atas",
'print_top_margin_number' => "Nilai margin atas harus di isi angka.", "print_top_margin_number" => "Nilai margin atas harus di isi angka.",
'print_top_margin_required' => "Margin atas wajib di isi.", "print_top_margin_required" => "Margin atas wajib di isi.",
'quantity_decimals' => "Desimal untuk Jumlah", "quantity_decimals" => "Desimal untuk Jumlah",
'quick_cash_enable' => "", "quick_cash_enable" => "",
'quote_default_comments' => "Komentar faktur", "quote_default_comments" => "Komentar faktur",
'receipt' => "Struk Penerimaan", "receipt" => "Struk Penerimaan",
'receipt_category' => "", "receipt_category" => "",
'receipt_configuration' => "Struk Print Settings", "receipt_configuration" => "Struk Print Settings",
'receipt_default' => "Default", "receipt_default" => "Default",
'receipt_font_size' => "Ukuran Font", "receipt_font_size" => "Ukuran Font",
'receipt_font_size_number' => "Ukuran font harus berupa angka.", "receipt_font_size_number" => "Ukuran font harus berupa angka.",
'receipt_font_size_required' => "Ukuran font harus diisi.", "receipt_font_size_required" => "Ukuran font harus diisi.",
'receipt_info' => "Struk Konfigurasi Informasi", "receipt_info" => "Struk Konfigurasi Informasi",
'receipt_printer' => "Tiket Printer", "receipt_printer" => "Tiket Printer",
'receipt_short' => "Ringkas", "receipt_short" => "Ringkas",
'receipt_show_company_name' => "Tampilkan nama perusahaan", "receipt_show_company_name" => "Tampilkan nama perusahaan",
'receipt_show_description' => "Tampilkan deskripsi", "receipt_show_description" => "Tampilkan deskripsi",
'receipt_show_serialnumber' => "Tampilkan nomor seri", "receipt_show_serialnumber" => "Tampilkan nomor seri",
'receipt_show_tax_ind' => "Tampilkan Indikator Pajak", "receipt_show_tax_ind" => "Tampilkan Indikator Pajak",
'receipt_show_taxes' => "Tampilkan pajak", "receipt_show_taxes" => "Tampilkan pajak",
'receipt_show_total_discount' => "Tampilkan total diskon", "receipt_show_total_discount" => "Tampilkan total diskon",
'receipt_template' => "Template struk", "receipt_template" => "Template struk",
'receiving_calculate_average_price' => "Menghitung harga rata-rata (Penerimaan)", "receiving_calculate_average_price" => "Menghitung harga rata-rata (Penerimaan)",
'recv_invoice_format' => "Format Faktur", "recv_invoice_format" => "Format Faktur",
'register_mode_default' => "Default register mode", "register_mode_default" => "Default register mode",
'report_an_issue' => "Laporkan masalah", "report_an_issue" => "Laporkan masalah",
'return_policy_required' => "Kebijakan retur wajib diisi.", "return_policy_required" => "Kebijakan retur wajib diisi.",
'reward' => "Hadiah", "reward" => "Hadiah",
'reward_configuration' => "Konfigurasi Hadiah", "reward_configuration" => "Konfigurasi Hadiah",
'right' => "Kanan", "right" => "Kanan",
'sales_invoice_format' => "Format Faktur Penjualan", "sales_invoice_format" => "Format Faktur Penjualan",
'sales_quote_format' => "Format Penawaran Penjualan", "sales_quote_format" => "Format Penawaran Penjualan",
'saved_successfully' => "Konfigurasi berhasil disimpan.", "saved_successfully" => "Konfigurasi berhasil disimpan.",
'saved_unsuccessfully' => "Konfigurasi tidak berhasil disimpan.", "saved_unsuccessfully" => "Konfigurasi tidak berhasil disimpan.",
'security_issue' => "Peringatan Kerentanan Keamanan", "security_issue" => "Peringatan Kerentanan Keamanan",
'server_notice' => "Silakan gunakan info di bawah ini untuk pelaporan masalah.", "server_notice" => "Silakan gunakan info di bawah ini untuk pelaporan masalah.",
'service_charge' => "", "service_charge" => "",
'show_due_enable' => "", "show_due_enable" => "",
'show_office_group' => "Tampilkan ikon kantor", "show_office_group" => "Tampilkan ikon kantor",
'statistics' => "Kirim statistik", "statistics" => "Kirim statistik",
'statistics_tooltip' => "Kirim statistik untuk pengembangan dan peningkatan fitur.", "statistics_tooltip" => "Kirim statistik untuk pengembangan dan peningkatan fitur.",
'stock_location' => "Lokasi Stock", "stock_location" => "Lokasi Stock",
'stock_location_duplicate' => "Gunakan nama yang unik untuk lokasi stock.", "stock_location_duplicate" => "Gunakan nama yang unik untuk lokasi stock.",
'stock_location_invalid_chars' => "Nama lokasi tidak boleh berisi karakter '_'.", "stock_location_invalid_chars" => "Nama lokasi tidak boleh berisi karakter '_'.",
'stock_location_required' => "Nomor lokasi stock harus diisi.", "stock_location_required" => "Nomor lokasi stock harus diisi.",
'suggestions_fifth_column' => "", "suggestions_fifth_column" => "",
'suggestions_first_column' => "Kolom 1", "suggestions_first_column" => "Kolom 1",
'suggestions_fourth_column' => "", "suggestions_fourth_column" => "",
'suggestions_layout' => "Tampilan Saran Pencarian", "suggestions_layout" => "Tampilan Saran Pencarian",
'suggestions_second_column' => "Kolom 2", "suggestions_second_column" => "Kolom 2",
'suggestions_third_column' => "Kolom 3", "suggestions_third_column" => "Kolom 3",
'system_conf' => "Setting & Conf", "system_conf" => "Setting & Conf",
'system_info' => "System Info", "system_info" => "System Info",
'table' => "Meja", "table" => "Meja",
'table_configuration' => "Konfigurasi Meja", "table_configuration" => "Konfigurasi Meja",
'takings_printer' => "Struk Printer", "takings_printer" => "Struk Printer",
'tax' => "Pajak", "tax" => "Pajak",
'tax_category' => "Kategori Pajak", "tax_category" => "Kategori Pajak",
'tax_category_duplicate' => "Kategori pajak yang dimasukkan sudah ada.", "tax_category_duplicate" => "Kategori pajak yang dimasukkan sudah ada.",
'tax_category_invalid_chars' => "Kategori pajak yang dimasukkan tidak valid.", "tax_category_invalid_chars" => "Kategori pajak yang dimasukkan tidak valid.",
'tax_category_required' => "Kategori pajak dibutuhkan.", "tax_category_required" => "Kategori pajak dibutuhkan.",
'tax_category_used' => "Kategori pajak tidak bisa dihapus karena sedang digunakan.", "tax_category_used" => "Kategori pajak tidak bisa dihapus karena sedang digunakan.",
'tax_configuration' => "Konfigurasi Pajak", "tax_configuration" => "Konfigurasi Pajak",
'tax_decimals' => "Pajak Decimals", "tax_decimals" => "Pajak Decimals",
'tax_id' => "Id Pajak", "tax_id" => "Id Pajak",
'tax_included' => "Dikenakan Pajak", "tax_included" => "Dikenakan Pajak",
'theme' => "Tema", "theme" => "Tema",
'theme_preview' => "Pratinjau Tema:", "theme_preview" => "Pratinjau Tema:",
'thousands_separator' => "Pemisah Ribuan", "thousands_separator" => "Pemisah Ribuan",
'timezone' => "Zona Waktu", "timezone" => "Zona Waktu",
'timezone_error' => "Zona Waktu OSPOS berbeda dari Zona Waktu Anda.", "timezone_error" => "Zona Waktu OSPOS berbeda dari Zona Waktu Anda.",
'top' => "Atas", "top" => "Atas",
'use_destination_based_tax' => "Gunakan Pajak Berdasarkan Tujuan", "use_destination_based_tax" => "Gunakan Pajak Berdasarkan Tujuan",
'user_timezone' => "Zona waktu lokal:", "user_timezone" => "Zona waktu lokal:",
'website' => "Situs Perusahaan", "website" => "Situs Perusahaan",
'wholesale_markup' => "", "wholesale_markup" => "",
'work_order_enable' => "Dukungan Work Order", "work_order_enable" => "Dukungan Work Order",
'work_order_format' => "Format Work Order", "work_order_format" => "Format Work Order",
]; ];

View File

@@ -1,57 +1,56 @@
<?php <?php
return [ return [
'account_number' => "Akun #", "account_number" => "Akun #",
'account_number_duplicate' => "Nomor akun ini telah ada di basis data.", "account_number_duplicate" => "Nomor akun ini telah ada di basis data.",
'available_points' => "Poin tersedia", "available_points" => "Poin tersedia",
'available_points_value' => "", "available_points_value" => "",
'average' => "Rata-rata yang dihabiskan", "average" => "Rata-rata yang dihabiskan",
'avg_discount' => "Rata-rata diskon", "avg_discount" => "Rata-rata diskon",
'basic_information' => "Informasi", "basic_information" => "Informasi",
'cannot_be_deleted' => "Pelanggan terpilih tidak bisa dihapus. satu atau lebih dari pelanggan yang dipilih memiliki penjualan.", "cannot_be_deleted" => "Pelanggan terpilih tidak bisa dihapus. satu atau lebih dari pelanggan yang dipilih memiliki penjualan.",
'company_name' => "Perusahaan", "company_name" => "Perusahaan",
'confirm_delete' => "Apakah Anda yakin ingin menghapus pelanggan yang dipilih?", "confirm_delete" => "Apakah Anda yakin ingin menghapus pelanggan yang dipilih?",
'confirm_restore' => "Anda yakin akan mengembalikan pelanggan terpilih?", "confirm_restore" => "Anda yakin akan mengembalikan pelanggan terpilih?",
'consent' => "Persetujuan pendaftaran", "consent" => "Persetujuan pendaftaran",
'consent_required' => "Persetujuan pendaftaran adalah bidang yang harus diisi.", "consent_required" => "Persetujuan pendaftaran adalah bidang yang harus diisi.",
'csv_import_failed' => "Gagal impor CSV", "csv_import_failed" => "Impor dari CSV gagal",
'csv_import_nodata_wrongformat' => "Berkas yang Anda unggah tidak berisi data atau salah format.", "csv_import_nodata_wrongformat" => "Berkas yang Anda unggah tidak berisi data atau salah format.",
'csv_import_partially_failed' => "Impor pelanggan berhasil dwngan beberapa kesalahan:", "csv_import_partially_failed" => "Impor pelanggan berhasil dwngan beberapa kesalahan:",
'csv_import_success' => "Impor pelanggan berhasil.", "csv_import_success" => "Impor pelanggan berhasil.",
'customer' => "Pelanggan", "customer" => "Pelanggan",
'date' => "Tanggal", "date" => "Tanggal",
'discount' => "Diskon", "discount" => "Diskon",
'discount_fixed' => "Diskon Tetap", "discount_fixed" => "Diskon Tetap",
'discount_percent' => "Persentase Diskon", "discount_percent" => "Persentase Diskon",
'discount_type' => "Jenis Diskon", "discount_type" => "Jenis Diskon",
'email_duplicate' => "Alamat email telah digunakan.", "email_duplicate" => "Alamat email telah digunakan.",
'employee' => "Karyawan", "employee" => "Karyawan",
'error_adding_updating' => "Kesalahan ketika menambah atau memperbaharui pelanggan.", "error_adding_updating" => "Kesalahan ketika menambah atau memperbaharui pelanggan.",
'import_items_csv' => "Impor pelanggan dari CSV", "import_items_csv" => "Impor pelanggan dari CSV",
'mailchimp_activity_click' => "Klik Email", "mailchimp_activity_click" => "Klik Email",
'mailchimp_activity_lastopen' => "Email yang terakhir dibuka", "mailchimp_activity_lastopen" => "Email yang terakhir dibuka",
'mailchimp_activity_open' => "Buka email", "mailchimp_activity_open" => "Buka email",
'mailchimp_activity_total' => "Email terkirim", "mailchimp_activity_total" => "Email terkirim",
'mailchimp_activity_unopen' => "Email belum dibuka", "mailchimp_activity_unopen" => "Email belum dibuka",
'mailchimp_email_client' => "Klien email", "mailchimp_email_client" => "Klien email",
'mailchimp_info' => "MailChimp", "mailchimp_info" => "MailChimp",
'mailchimp_member_rating' => "Peringkat", "mailchimp_member_rating" => "Peringkat",
'mailchimp_status' => "Status", "mailchimp_status" => "Status",
'mailchimp_vip' => "VIP", "mailchimp_vip" => "VIP",
'max' => "Max. dihabiskan", "max" => "Max. dihabiskan",
'min' => "Min. dihabiskan", "min" => "Min. dihabiskan",
'new' => "Pelanggan Baru", "new" => "Pelanggan Baru",
'none_selected' => "Anda belum memilih pelanggan untuk dihapus.", "none_selected" => "Anda belum memilih pelanggan untuk dihapus.",
'one_or_multiple' => "Pelanggan", "one_or_multiple" => "Pelanggan",
'quantity' => "Kuantitas", "quantity" => "Kuantitas",
'stats_info' => "Statistik", "stats_info" => "Statistik",
'successful_adding' => "Anda telah berhasil menambah pelanggan", "successful_adding" => "Anda telah berhasil menambah pelanggan",
'successful_deleted' => "Berhasil menghapus Kartu Hadiah", "successful_deleted" => "Anda telah berhasil menghapus pelanggan",
'successful_updating' => "Anda telah berhasil memperbarui pelanggan", "successful_updating" => "Anda telah berhasil memperbarui pelanggan",
'tax_code' => "Kode pajak", "tax_code" => "Kode pajak",
'tax_id' => "ID Pajak", "tax_id" => "ID Pajak",
'taxable' => "Dikenakan pajak", "taxable" => "Dikenakan pajak",
'total' => "Total", "total" => "Total",
'update' => "Ubah Pelanggan", "update" => "Ubah Pelanggan",
'rewards_package' => "Paket Hadiah", "rewards_package" => "Paket Hadiah",
]; ];

View File

@@ -1,45 +1,44 @@
<?php <?php
return [ return [
'administrator' => "", "administrator" => "",
'basic_information' => "Informasi Karyawan", "basic_information" => "Informasi Karyawan",
'cannot_be_deleted' => "Karyawan terpilih tidak bisa dihapus satu atau lebih dari para pekerja telah memproses penjualan atau Anda mencoba untuk menghapus diri Anda sendiri.", "cannot_be_deleted" => "Karyawan terpilih tidak bisa dihapus satu atau lebih dari para pekerja telah memproses penjualan atau Anda mencoba untuk menghapus diri Anda sendiri.",
'change_employee' => "", "change_employee" => "",
'change_password' => "Ubah kata kunci", "change_password" => "Ubah kata kunci",
'clerk' => "", "clerk" => "",
'commission' => "", "commission" => "",
'confirm_delete' => "Apakah Anda yakin ingin menghapus karyawan yang dipilih?", "confirm_delete" => "Apakah Anda yakin ingin menghapus karyawan yang dipilih?",
'confirm_restore' => "Anda yakin ingin mengembalikan karyawan terpilih?", "confirm_restore" => "Anda yakin ingin mengembalikan karyawan terpilih?",
'current_password' => "Kata kunci sekarang", "current_password" => "Kata kunci sekarang",
'current_password_invalid' => "Kata kunci sekarang salah.", "current_password_invalid" => "Kata kunci sekarang salah.",
'employee' => "Karyawan", "employee" => "Karyawan",
'error_adding_updating' => "Kesalahan menambah / memperbarui karyawan.", "error_adding_updating" => "Kesalahan menambah / memperbarui karyawan.",
'error_deleting_demo_admin' => "Anda tidak dapat menghapus Demo admin user.", "error_deleting_demo_admin" => "Anda tidak dapat menghapus Demo admin user.",
'error_updating_demo_admin' => "Anda tidak dapat mengubah Demo admin user.", "error_updating_demo_admin" => "Anda tidak dapat mengubah Demo admin user.",
'language' => "Bahasa", "language" => "Bahasa",
'login_info' => "Info Login Karyawan", "login_info" => "Info Login Karyawan",
'manager' => "", "manager" => "",
'new' => "Karyawan Baru", "new" => "Karyawan Baru",
'none_selected' => "Anda belum memilih karyawan untuk dihapus.", "none_selected" => "Anda belum memilih karyawan untuk dihapus.",
'one_or_multiple' => "Karyawan", "one_or_multiple" => "Karyawan",
'password' => "Kata Sandi", "password" => "Kata Sandi",
'password_minlength' => "Kata kunci minimal terdiri dari 8 karakter.", "password_minlength" => "Kata kunci minimal terdiri dari 8 karakter.",
'password_must_match' => "Kata Sandi tidak cocok.", "password_must_match" => "Kata Sandi tidak cocok.",
'password_not_must_match' => "Kata kunci sekarang dan kata kunci baru harus unik.", "password_not_must_match" => "Kata kunci sekarang dan kata kunci baru harus unik.",
'password_required' => "Kata Sandi wajib diisi.", "password_required" => "Kata Sandi wajib diisi.",
'permission_desc' => "Tandai kotak di bawah ini untuk memberikan akses ke Modul.", "permission_desc" => "Tandai kotak di bawah ini untuk memberikan akses ke Modul.",
'permission_info' => "Hak Akses Karyawan", "permission_info" => "Hak Akses Karyawan",
'repeat_password' => "Ulang Kata Sandi", "repeat_password" => "Ulang Kata Sandi",
'subpermission_required' => "Paling tidak tambahkan satu hak akses untuk setiap modul.", "subpermission_required" => "Paling tidak tambahkan satu hak akses untuk setiap modul.",
'successful_adding' => "Anda telah berhasil menambahkan karyawan.", "successful_adding" => "Anda telah berhasil menambahkan karyawan.",
'successful_change_password' => "Kata kunci berhasil diubah.", "successful_change_password" => "Kata kunci berhasil diubah.",
'successful_deleted' => "Berhasil menghapus Kartu Hadiah", "successful_deleted" => "Anda telah berhasil menghapus",
'successful_updating' => "Anda telah berhasil memperbarui karyawan", "successful_updating" => "Anda telah berhasil memperbarui karyawan",
'system_language' => "Bahasa Sistem", "system_language" => "Bahasa Sistem",
'unsuccessful_change_password' => "Gagal mengubah kata sandi.", "unsuccessful_change_password" => "Gagal mengubah kata sandi.",
'update' => "Ubah Karyawan", "update" => "Ubah Karyawan",
'username' => "Nama Pengguna", "username" => "Nama Pengguna",
'username_duplicate' => "Nama pengguna karyawan sudah digunakan. Silakan pilih yang lain.", "username_duplicate" => "Nama pengguna karyawan sudah digunakan. Silakan pilih yang lain.",
'username_minlength' => "Nama Pengguna minimal 5 huruf.", "username_minlength" => "Nama Pengguna minimal 5 huruf.",
'username_required' => "Nama Pengguna wajib diisi.", "username_required" => "Nama Pengguna wajib diisi.",
]; ];

View File

@@ -1,72 +1,71 @@
<?php <?php
return [ return [
'add_minus' => "Tambah atau kurangi Inventori.", "add_minus" => "Penambahan atau pengurangan inventory.",
'allow_alt_description' => "Izinkan Deskripsi Alternatif", "allow_alt_description" => "Deskripsi Alternatif dimungkinkan",
'bulk_edit' => "Ubah Massal", "bulk_edit" => "Ubah Massal",
'cannot_be_deleted' => "Kartu Hadiah tidak dapat dihapus, satu atau beberapa di antaranya memiliki penjualan.", "cannot_be_deleted" => "Tidak dapat menghapus GiftCard terpilih, Satu atau lebih GiftCard yang dipilih memiliki Penjualan.",
'cannot_find_giftcard' => "Kartu Hadiah tidak ditemukan.", "cannot_find_giftcard" => "Informasi GiftCard tidak ditemukan.",
'cannot_use' => "Kartu Hadiah {0} tidak dapat digunakan: Pelanggan tidak valid.", "cannot_use" => "Giftcard {0} tidak dapat digunakan: Pelanggan tidak valid.",
'card_value' => "Nilai", "card_value" => "Nilai",
'category' => "Kategori", "category" => "Kategori",
'change_all_to_allow_alt_desc' => "Izinkan deskripsi alternatif untuk semua.", "change_all_to_allow_alt_desc" => "Diijinkan deskripsi alternatif untuk semua.",
'change_all_to_not_allow_allow_desc' => "Tidak diizinkan deskripsi alternatif untuk semua.", "change_all_to_not_allow_allow_desc" => "Tidak diijinkan deskripsi alternatif untuk semua.",
'change_all_to_serialized' => "Ubah semua jadi berseri", "change_all_to_serialized" => "Ubah semua menggunakan nomor serial",
'change_all_to_unserialized' => "Ubah semua menjadi tidak berseri", "change_all_to_unserialized" => "Ubah semua tanpa nomor serial",
'confirm_bulk_edit' => "Apakah Anda ingin edit Kartu Hadiah terpilih?", "confirm_bulk_edit" => "Apakah Anda yakin ingin merubah semua GiftCard yang dipilih?",
'confirm_delete' => "Anda yakin ingin menghapus Kartu Hadiah terpilih?", "confirm_delete" => "Apakah anda yakin ingin menghapus GiftCard yang dipilih?",
'confirm_restore' => "Anda yakin ingin memulihkan Kartu Hadiah terpilih?", "confirm_restore" => "Apakah Anda yakin akan mengembalikan Gift Card terpilih?",
'cost_price' => "Harga Beli", "cost_price" => "Harga Pokok",
'count' => "Mutasi Inventori", "count" => "Mutasi/Penyesuaian Inventori",
'csv_import_failed' => "Impor dari CSV gagal.", "csv_import_failed" => "Impor dari CSV gagal.",
'current_quantity' => "Jumlah saat ini", "current_quantity" => "Jumlah saat ini",
'description' => "Deskripsi", "description" => "Deskripsi",
'details_count' => "Jumlah Detail Inventori", "details_count" => "Jumlah Detail Inventori",
'do_nothing' => "Tidak ada Perubahan", "do_nothing" => "Tidak ada Perubahan",
'edit_fields_you_want_to_update' => "Edit kolom yang diinginkan pada Kartu Hadiah terpilih.", "edit_fields_you_want_to_update" => "Ubah bagian yang ingin Anda edit untuk SEMUA GiftCard yang dipilih.",
'edit_multiple_giftcards' => "Edit beberapa Kartu Hadiah.", "edit_multiple_giftcards" => "Ubah beberapa GiftCard.",
'error_adding_updating' => "Gagal menambah atau memperbarui Kartu Hadiah.", "error_adding_updating" => "Kesalahan ketika menambahkan/memperbaharui GiftCard.",
'error_updating_multiple' => "Gagal memperbaharui Kartu Hadiah.", "error_updating_multiple" => "Gagal memperbaharui Giftcard.",
'generate_barcodes' => "Buat Barcode", "generate_barcodes" => "Buat Barcode",
'giftcard' => "Kartu Hadiah", "giftcard" => "GiftCard",
'giftcard_number' => "Nomor Kartu Hadiah", "giftcard_number" => "Nomor GiftCard",
'info_provided_by' => "Info disediakan oleh", "info_provided_by" => "Informasi disediakan oleh",
'inventory_comments' => "Keterangan", "inventory_comments" => "Keterangan",
'is_serialized' => "Kartu Hadiah memiliki nomor seri", "is_serialized" => "GiftCard Memiliki Nomor Serial",
'low_inventory_giftcards' => "Kartu Hadiah Inventori Rendah", "low_inventory_giftcards" => "GiftCard Inventori Rendah",
'manually_editing_of_quantity' => "Edit manual kuantitas", "manually_editing_of_quantity" => "Perubahan jumlah Stok secara manual",
'must_select_giftcard_for_barcode' => "Anda harus pilih setidaknya satu (1) Kartu Hadiah untuk membuat barcode.", "must_select_giftcard_for_barcode" => "Anda harus memilih minimal satu (1) GiftCard untuk membuat Barcode.",
'new' => "Kartu Hadiah baru", "new" => "GiftCard Baru",
'no_description_giftcards' => "Tidak ada deskripsi Kartu Hadiah", "no_description_giftcards" => "Tidak ada Deskripsi Gift Card",
'no_giftcards_to_display' => "Tidak ada Kartu Hadiah yang ditampilkan.", "no_giftcards_to_display" => "Tidak ada GiftCard yang ditampilkan.",
'none' => "Tidak Ada", "none" => "Tidak Ada",
'none_selected' => "Belum ada Kartu Hadiah terpilih untuk diedit.", "none_selected" => "Anda belum memilih GiftCard untuk diubah.",
'number' => "Nomor Kartu Hadiah harus angka.", "number" => "Nomor GiftCard harus angka.",
'number_information' => "Nomor Kartu Hadiah", "number_information" => "Nomor GiftCard",
'number_required' => "Nomor Kartu Hadiah wajib diisi.", "number_required" => "Nomor GiftCard wajib diisi.",
'one_or_multiple' => "Kartu Hadiah", "one_or_multiple" => "GiftCard",
'person_id' => "Pelanggan", "person_id" => "Nomor Pelanggan",
'quantity' => "Jumlah", "quantity" => "Jumlah",
'quantity_required' => "Jumlah wajib diisi. Silahkan tutup ( X ) untuk batal.", "quantity_required" => "Jumlah wajib diisi. Silahkan tutup ( X ) untuk batal.",
'remaining_balance' => "Kartu Hadiah {0} tersisa {1}!", "remaining_balance" => "Giftcard {0} tersisa {1}!",
'reorder_level' => "Level pesan ulang", "reorder_level" => "Level Pesan Ulang",
'retrive_giftcard_info' => "Informasi Kartu Hadiah", "retrive_giftcard_info" => "Informasi GiftCard",
'sales_tax_1' => "Pajak Penjualan", "sales_tax_1" => "Pajak Penjualan",
'sales_tax_2' => "Pajak Penjualan 2", "sales_tax_2" => "Pajak Penjualan 2",
'serialized_giftcards' => "Kartu Hadiah berseri", "serialized_giftcards" => "Serial GiftCard",
'successful_adding' => "Berhasil menambahkan Kartu Hadiah", "successful_adding" => "GiftCard telah berhasil ditambahkan",
'successful_bulk_edit' => "Berhasil memperbarui Kartu Hadiah terpilih", "successful_bulk_edit" => "Anda telah berhasil memperbarui GiftCard yang dipilih",
'successful_deleted' => "Berhasil menghapus Kartu Hadiah", "successful_deleted" => "GiftCard telah berhasil dihapus",
'successful_updating' => "Berhasil perbarui Kartu Hadiah", "successful_updating" => "GiftCard telah berhasil diperbarui",
'supplier' => "Pemasok", "supplier" => "Pemasok",
'tax_1' => "Pajak 1", "tax_1" => "Pajak 1",
'tax_2' => "Pajak 2", "tax_2" => "Pajak 2",
'tax_percent' => "Persentasi Pajak", "tax_percent" => "Persen Pajak",
'tax_percents' => "Persentase Pajak", "tax_percents" => "Persentase Pajak",
'unit_price' => "Harga Jual", "unit_price" => "Harga Jual",
'upc_database' => "Basis data Barcode", "upc_database" => "Database UPC",
'update' => "Perbarui Kartu Hadiah", "update" => "Ubah GiftCard",
'use_inventory_menu' => "Gunakan Inv. Menu", "use_inventory_menu" => "Gunakan Inv. Menu",
'value' => "Nilai Kartu Hadiah harus angka.", "value" => "Nilai GiftCard harus angka.",
'value_required' => "Nilai Kartu Hadiah wajib diisi.", "value_required" => "Nilai GiftCard wajib diisi.",
]; ];

View File

@@ -1,42 +1,41 @@
<?php <?php
return [ return [
'add_item' => "Tambah Item Barang", "add_item" => "Tambah Item Barang",
'all' => "Semua", "all" => "Semua",
'cannot_be_deleted' => "Item Paket tidak dapat dihapus.", "cannot_be_deleted" => "Item Paket tidak dapat dihapus.",
'confirm_delete' => "Apakah Anda yakin ingin menghapus Item Paket dipilih?", "confirm_delete" => "Apakah Anda yakin ingin menghapus Item Paket dipilih?",
'confirm_restore' => "Apakah Anda yakin untuk mengembalikan Kit Item yang terpilih?", "confirm_restore" => "Apakah Anda yakin untuk mengembalikan Kit Item yang terpilih?",
'description' => "Deskripsi Item Paket", "description" => "Deskripsi Item Paket",
'discount' => "Diskon", "discount" => "Diskon",
'discount_fixed' => "Diskon Tetap", "discount_fixed" => "Diskon Tetap",
'discount_percent' => "Persentase Diskon", "discount_percent" => "Persentase Diskon",
'discount_type' => "Jenis Diskon", "discount_type" => "Jenis Diskon",
'error_adding_updating' => "Tambah/Ubah Item Paket tidak berhasil.", "error_adding_updating" => "Tambah/Ubah Item Paket tidak berhasil.",
'find_kit_item' => "Paket Item", "find_kit_item" => "Paket Item",
'info' => "Item Paket Info", "info" => "Item Paket Info",
'item' => "Item Barang", "item" => "Item Barang",
'item_kit_number' => "Kode bar", "item_kit_number" => "Kode bar",
'item_kit_number_duplicate' => "Nomor Paket Item telah ada di basis data.", "item_kit_number_duplicate" => "Nomor Paket Item telah ada di basis data.",
'item_number' => "", "item_number" => "",
'item_number_duplicate' => "", "item_number_duplicate" => "",
'items' => "Item Barang", "items" => "Item Barang",
'kit' => "ID Paket", "kit" => "ID Paket",
'kit_and_components' => "Kit dan komponen", "kit_and_components" => "Kit dan komponen",
'kit_and_stock' => "Kit dan Stok", "kit_and_stock" => "Kit dan Stok",
'kit_only' => "Hanya Kit", "kit_only" => "Hanya Kit",
'name' => "Nama Item Paket", "name" => "Nama Item Paket",
'new' => "Item Paket Baru", "new" => "Item Paket Baru",
'no_item_kits_to_display' => "Tidak ada Item Paket yang ditampilkan.", "no_item_kits_to_display" => "Tidak ada Item Paket yang ditampilkan.",
'none_selected' => "Anda belum memilih satupun Item Paket.", "none_selected" => "Anda belum memilih satupun Item Paket.",
'one_or_multiple' => "Item Paket", "one_or_multiple" => "Item Paket",
'price_option' => "Opsi Harga", "price_option" => "Opsi Harga",
'priced_only' => "Hanya Harga", "priced_only" => "Hanya Harga",
'print_option' => "Opsi Cetak", "print_option" => "Opsi Cetak",
'quantity' => "Jumlah", "quantity" => "Jumlah",
'sequence' => "Urutan", "sequence" => "Urutan",
'successful_adding' => "Item Paket Baru berhasil ditambahkan", "successful_adding" => "Item Paket Baru berhasil ditambahkan",
'successful_deleted' => "Berhasil menghapus Kartu Hadiah", "successful_deleted" => "Item Paket berhasil dihapus",
'successful_updating' => "Item Paket berhasil dirubah", "successful_updating" => "Item Paket berhasil dirubah",
'unit_price' => "", "unit_price" => "",
'update' => "Ubah Item Paket", "update" => "Ubah Item Paket",
]; ];

View File

@@ -1,8 +1,7 @@
<?php <?php
return [
return [ 'add_minus' => "Menambah atau mengurangi Inventori.",
'add_minus' => "Tambah atau kurangi Inventori.", 'allow_alt_description' => "Deskripsi Alternatif dimungkinkan",
'allow_alt_description' => "Izinkan Deskripsi Alternatif",
'amount_entry' => "Jumlah entri", 'amount_entry' => "Jumlah entri",
'bulk_edit' => "Ubah Massal", 'bulk_edit' => "Ubah Massal",
'buy_price_required' => "Harga Beli wajib diisi.", 'buy_price_required' => "Harga Beli wajib diisi.",
@@ -14,22 +13,22 @@ return [
'category_required' => "Kategori wajib diisi.", 'category_required' => "Kategori wajib diisi.",
'change_all_to_allow_alt_desc' => "Izinkan deskripsi alternatif untuk semua.", 'change_all_to_allow_alt_desc' => "Izinkan deskripsi alternatif untuk semua.",
'change_all_to_not_allow_allow_desc' => "Tidak diizinkan deskripsi alternatif untuk semua.", 'change_all_to_not_allow_allow_desc' => "Tidak diizinkan deskripsi alternatif untuk semua.",
'change_all_to_serialized' => "Ubah semua jadi berseri", 'change_all_to_serialized' => "Ubah semua menggunakan nomor serial",
'change_all_to_unserialized' => "Ubah semua menjadi tidak berseri", 'change_all_to_unserialized' => "Ubah semua tanpa nomor serial",
'change_image' => "Ubah Gambar", 'change_image' => "Ubah Gambar",
'confirm_bulk_edit' => "Anda yakin ingin mengubah semua item terpilih?", 'confirm_bulk_edit' => "Apakah Anda yakin ingin merubah semua item yang dipilih?",
'confirm_bulk_edit_wipe_taxes' => "Semua item informasi pajak akan diganti.", 'confirm_bulk_edit_wipe_taxes' => "Semua item informasi pajak akan diganti.",
'confirm_delete' => "Anda yakin ingin menghapus item terpilih?", 'confirm_delete' => "Apakah Anda yakin ingin menghapus item yang dipilih?",
'confirm_restore' => "Anda yakin ingin mengembalikan item terpilih?", 'confirm_restore' => "Anda yakin ingin mengembalikan item terpilih?",
'cost_price' => "Harga Beli", 'cost_price' => "Harga Beli",
'cost_price_number' => "Harga beli harus berupa angka.", 'cost_price_number' => "Harga beli harus berupa angka.",
'cost_price_required' => "Harga beli harus diisi.", 'cost_price_required' => "Harga beli harus diisi.",
'count' => "Mutasi Inventori", 'count' => "Mutasi/Penyesuaian Inventori",
'csv_import_failed' => "Gagal impor CSV", 'csv_import_failed' => "Impor dari CSV tidak berhasil dilakukan",
'csv_import_nodata_wrongformat' => "Berkas CSV terunggah tidak berisi data atau formatnya salah.", 'csv_import_nodata_wrongformat' => "Berkas unggahan tidak berisi data atau format salah.",
'csv_import_partially_failed' => "Terdapat {0} item gagal impor pada baris: {1}. Tidak ada baris yang diimpor.", 'csv_import_partially_failed' => "Terdapat {0} item yang gagal diimpor pada baris: {1}. Tidak ada kolom yang diimpor.",
'csv_import_success' => "Impor item CSV berhasil.", 'csv_import_success' => "Impor item berhasil.",
'current_quantity' => "Jumlah saat ini", 'current_quantity' => "Jumlah Saat ini",
'default_pack_name' => "Setiap", 'default_pack_name' => "Setiap",
'description' => "Deskripsi", 'description' => "Deskripsi",
'details_count' => "Jumlah Detail Inventori", 'details_count' => "Jumlah Detail Inventori",
@@ -64,7 +63,7 @@ return [
'location' => "Lokasi Barang", 'location' => "Lokasi Barang",
'low_inventory_items' => "Daftar Stock Rendah", 'low_inventory_items' => "Daftar Stock Rendah",
'low_sell_item' => "Produk dengan Penjualan yang Rendah", 'low_sell_item' => "Produk dengan Penjualan yang Rendah",
'manually_editing_of_quantity' => "Edit manual kuantitas", 'manually_editing_of_quantity' => "Perubahan jumlah Stok secara manual",
'markup' => "", 'markup' => "",
'name' => "Nama Barang", 'name' => "Nama Barang",
'name_required' => "Nama item wajib diisi.", 'name_required' => "Nama item wajib diisi.",
@@ -84,7 +83,7 @@ return [
'quantity_required' => "Jumlah wajib diisi.", 'quantity_required' => "Jumlah wajib diisi.",
'receiving_quantity' => "Jumlah per penerimaan", 'receiving_quantity' => "Jumlah per penerimaan",
'remove_image' => "Hapus gambar", 'remove_image' => "Hapus gambar",
'reorder_level' => "Level pesan ulang", 'reorder_level' => "Batas pesan ulang",
'reorder_level_number' => "Batas pesan ulang harus berupa angka.", 'reorder_level_number' => "Batas pesan ulang harus berupa angka.",
'reorder_level_required' => "Batas pesan ulang wajib diisi.", 'reorder_level_required' => "Batas pesan ulang wajib diisi.",
'retrive_item_info' => "Dapatkan Info Barang", 'retrive_item_info' => "Dapatkan Info Barang",
@@ -99,7 +98,7 @@ return [
'stock_type' => "Jenis Stok", 'stock_type' => "Jenis Stok",
'successful_adding' => "Item Barang telah berhasil ditambahkan", 'successful_adding' => "Item Barang telah berhasil ditambahkan",
'successful_bulk_edit' => "Anda telah berhasil memperbarui item yang dipilih", 'successful_bulk_edit' => "Anda telah berhasil memperbarui item yang dipilih",
'successful_deleted' => "Berhasil menghapus Kartu Hadiah", 'successful_deleted' => "Item Barang telah berhasil dihapus",
'successful_updating' => "Item Barang telah berhasil diperbarui", 'successful_updating' => "Item Barang telah berhasil diperbarui",
'supplier' => "Pemasok", 'supplier' => "Pemasok",
'tax_1' => "Pajak 1", 'tax_1' => "Pajak 1",
@@ -115,7 +114,7 @@ return [
'unit_price' => "Harga Jual", 'unit_price' => "Harga Jual",
'unit_price_number' => "Harga satuan harus berupa angka.", 'unit_price_number' => "Harga satuan harus berupa angka.",
'unit_price_required' => "Harga Jual wajib diisi.", 'unit_price_required' => "Harga Jual wajib diisi.",
'upc_database' => "Basis data Barcode", 'upc_database' => "Database UPC",
'update' => "Ubah", 'update' => "Ubah",
'use_inventory_menu' => "Gunakan Inv. Menu", 'use_inventory_menu' => "Gunakan Inv. Menu",
]; ];

View File

@@ -1,59 +1,58 @@
<?php <?php
return [ return [
'amount_due' => "", "amount_due" => "",
'cancel_receiving' => "Batal", "cancel_receiving" => "Batal",
'cannot_be_deleted' => "Tidak bisa dihapus.", "cannot_be_deleted" => "Tidak bisa dihapus.",
'comments' => "Keterangan", "comments" => "Keterangan",
'complete_receiving' => "Selesai", "complete_receiving" => "Selesai",
'confirm_cancel_receiving' => "Apakah anda yakin untuk menghapus Pembelian Barang masuk ini? Semua item Akan dihapus.", "confirm_cancel_receiving" => "Apakah anda yakin untuk menghapus Pembelian Barang masuk ini? Semua item Akan dihapus.",
'confirm_delete' => "Apakah Anda yakin akan hapus penerimaan ini? Tindakan ini tidak bisa dibatalkan.", "confirm_delete" => "Apakah Anda yakin akan hapus penerimaan ini? Tindakan ini tidak bisa dibatalkan.",
'confirm_finish_receiving' => "Apakah anda yakin untuk memproses Pembelian Barang masuk ini? Proses ini tidak dapat dibatalkan.", "confirm_finish_receiving" => "Apakah anda yakin untuk memproses Pembelian Barang masuk ini? Proses ini tidak dapat dibatalkan.",
'confirm_restore' => "", "confirm_restore" => "",
'cost' => "Harga", "cost" => "Harga",
'daily' => "", "daily" => "",
'date' => "Tanggal", "date" => "Tanggal",
'date_required' => "Tanggal harus diisi.", "date_required" => "Tanggal harus diisi.",
'date_type' => "Kolom tanggal harus diisi.", "date_type" => "Kolom tanggal harus diisi.",
'delete_entire_sale' => "Hapus Semua Penjualan", "delete_entire_sale" => "Hapus Semua Penjualan",
'discount' => "Diskon", "discount" => "Diskon",
'edit' => "Ubah", "edit" => "Ubah",
'edit_sale' => "Ubah Pembelian", "edit_sale" => "Ubah Pembelian",
'employee' => "Karyawan", "employee" => "Karyawan",
'error_editing_item' => "Ubah Item barang gagal.", "error_editing_item" => "Ubah Item barang gagal.",
'error_requisition' => "Tidak dapat memindahkan Persediaan dari atau ke Lokasi yang Sama.", "error_requisition" => "Tidak dapat memindahkan Persediaan dari atau ke Lokasi yang Sama.",
'find_or_scan_item' => "Cari/Scan Item", "find_or_scan_item" => "Cari/Scan Item",
'find_or_scan_item_or_receipt' => "Temukan atau pindai Item atau Faktur", "find_or_scan_item_or_receipt" => "Cari/Scan Item atau Faktur",
'id' => "ID Pembelian", "id" => "ID Pembelian",
'item_name' => "Nama Item", "item_name" => "Nama Item",
'mode' => "Jenis Pembelian", "mode" => "Jenis Pembelian",
'new_supplier' => "Pemasok Baru", "new_supplier" => "Pemasok Baru",
'one_or_multiple' => "penerimaan", "one_or_multiple" => "penerimaan",
'print_after_sale' => "Cetak Faktur setelah penjualan", "print_after_sale" => "Cetak Faktur setelah penjualan",
'quantity' => "Jumlah", "quantity" => "Jumlah",
'receipt' => "Faktur Pembelian", "receipt" => "Faktur Pembelian",
'receipt_number' => "No. Faktur Pembelian", "receipt_number" => "No. Faktur Pembelian",
'receiving' => "Barang Masuk", "receiving" => "Barang Masuk",
'reference' => "Referensi", "reference" => "Referensi",
'register' => "Pembelian Barang Masuk", "register" => "Pembelian Barang Masuk",
'requisition' => "Daftar Permintaan", "requisition" => "Daftar Permintaan",
'return' => "Retur", "return" => "Retur",
'select_supplier' => "Pilih Pemasok (Opsional)", "select_supplier" => "Pilih Pemasok (Opsional)",
'ship_pack' => "Paket Pengiriman", "ship_pack" => "Paket Pengiriman",
'start_typing_supplier_name' => "Ketik nama pemasok ...", "start_typing_supplier_name" => "Ketik nama pemasok ...",
'stock' => "Stok", "stock" => "Stok",
'stock_destination' => "Tujuan Stok", "stock_destination" => "Tujuan Stok",
'stock_locaiton' => "Lokasi Stok", "stock_locaiton" => "Lokasi Stok",
'stock_source' => "Asal Stok", "stock_source" => "Asal Stok",
'successfully_deleted' => "Berhasil Dihapus", "successfully_deleted" => "Berhasil Dihapus",
'successfully_updated' => "Berhasil Diperbaharui", "successfully_updated" => "Berhasil Diperbaharui",
'supplier' => "Pemasok", "supplier" => "Pemasok",
'supplier_address' => "Alamat", "supplier_address" => "Alamat",
'supplier_email' => "Email", "supplier_email" => "Email",
'supplier_location' => "Lokasi", "supplier_location" => "Lokasi",
'total' => "Total", "total" => "Total",
'transaction_failed' => "Transaksi Pembelian gagal.", "transaction_failed" => "Transaksi Pembelian gagal.",
'unable_to_add_item' => "Penambahan Item kedalam Pembelian Barang gagal.", "unable_to_add_item" => "Penambahan Item kedalam Pembelian Barang gagal.",
'unsuccessfully_updated' => "Pembelian barang gagal Diperbaharui.", "unsuccessfully_updated" => "Pembelian barang gagal Diperbaharui.",
'update' => "Memperbarui", "update" => "Memperbarui",
]; ];

View File

@@ -1,149 +1,148 @@
<?php <?php
return [ return [
'all' => "Semua", "all" => "Semua",
'authority' => "Otoritas", "authority" => "Otoritas",
'canceled' => "Dibatalkan", "canceled" => "Dibatalkan",
'categories' => "Kategori", "categories" => "Kategori",
'categories_summary_report' => "Laporan Ringkasan Kategori", "categories_summary_report" => "Laporan Ringkasan Kategori",
'category' => "Kategori", "category" => "Kategori",
'code_canceled' => "BTL", "code_canceled" => "CNL",
'code_invoice' => "INV", "code_invoice" => "INV",
'code_pos' => "POS", "code_pos" => "POS",
'code_quote' => "Q", "code_quote" => "Q",
'code_return' => "RET", "code_return" => "RET",
'code_type' => "Tipe", "code_type" => "Tipe",
'code_work_order' => "W/O", "code_work_order" => "W/O",
'comments' => "Catatan", "comments" => "Catatan",
'commission' => "", "commission" => "",
'complete' => "Penjualan dan Retur yang sukses", "complete" => "Penjualan dan Retur yang sukses",
'completed_sales' => "Penjualan yang Sukses", "completed_sales" => "Penjualan yang Sukses",
'confirm_delete' => "Anda yakin ingin menghapus masukan terpilih?", "confirm_delete" => "Anda yakin ingin menghapus masukan terpilih?",
'confirm_restore' => "Anda yakin ingin mengembalikan entri terpilih?", "confirm_restore" => "Anda yakin ingin mengembalikan entri terpilih?",
'cost' => "Grosir", "cost" => "Grosir",
'cost_price' => "Harga Beli", "cost_price" => "Harga Beli",
'count' => "Jumlah", "count" => "Jumlah",
'customer' => "Pelanggan", "customer" => "Pelanggan",
'customers' => "Pelanggan", "customers" => "Pelanggan",
'customers_summary_report' => "Laporan Ringkasan Pelanggan", "customers_summary_report" => "Laporan Ringkasan Pelanggan",
'date' => "Tanggal", "date" => "Tanggal",
'date_range' => "Rentang Tanggal", "date_range" => "Rentang Tanggal",
'description' => "Deskripsi", "description" => "Deskripsi",
'detailed_receivings_report' => "Laporan Detail Barang Masuk", "detailed_receivings_report" => "Laporan Detail Barang Masuk",
'detailed_receivings_report_input' => "", "detailed_receivings_report_input" => "",
'detailed_reports' => "Perincian Laporan", "detailed_reports" => "Perincian Laporan",
'detailed_requisition_report' => "Rincian Daftar Laporan Permintaan", "detailed_requisition_report" => "Rincian Daftar Laporan Permintaan",
'detailed_sales_report' => "Laporan Perincian Penjualan", "detailed_sales_report" => "Laporan Perincian Penjualan",
'discount' => "Diskon", "discount" => "Diskon",
'discount_fixed' => "Diskon Tetap", "discount_fixed" => "Diskon Tetap",
'discount_percent' => "Persen Diskon", "discount_percent" => "Persen Diskon",
'discount_type' => "Tipe Diskon", "discount_type" => "Tipe Diskon",
'discounts' => "Diskon", "discounts" => "Diskon",
'discounts_summary_report' => "Laporan Ringkasan Diskon", "discounts_summary_report" => "Laporan Ringkasan Diskon",
'earned' => "Poin yang diperoleh", "earned" => "Poin yang diperoleh",
'employee' => "Karyawan", "employee" => "Karyawan",
'employees' => "Karyawan", "employees" => "Karyawan",
'employees_summary_report' => "Laporan Ringkasan Karyawan", "employees_summary_report" => "Laporan Ringkasan Karyawan",
'expenses' => "Biaya", "expenses" => "Biaya",
'expenses_amount' => "Jumlah", "expenses_amount" => "Jumlah",
'expenses_categories' => "Biaya", "expenses_categories" => "Biaya",
'expenses_categories_summary_report' => "Laporan RIngkasan Kategori Biaya", "expenses_categories_summary_report" => "Laporan RIngkasan Kategori Biaya",
'expenses_category' => "Kategori", "expenses_category" => "Kategori",
'expenses_payment_amount' => "", "expenses_payment_amount" => "",
'expenses_tax_amount' => "Pajak", "expenses_tax_amount" => "Pajak",
'expenses_total_amount' => "Jumlah Total", "expenses_total_amount" => "Jumlah Total",
'expenses_total_tax_amount' => "Total Pajak", "expenses_total_tax_amount" => "Total Pajak",
'graphical_reports' => "Laporan Dalam Bentuk Grafis", "graphical_reports" => "Laporan Dalam Bentuk Grafis",
'inventory' => "Laporan Persediaan", "inventory" => "Laporan Persediaan",
'inventory_low' => "Laporan Persediaan Rendah", "inventory_low" => "Laporan Persediaan Rendah",
'inventory_low_report' => "Laporan Persediaan Rendah", "inventory_low_report" => "Laporan Persediaan Rendah",
'inventory_reports' => "Laporan Persediaan", "inventory_reports" => "Laporan Persediaan",
'inventory_summary' => "Laporan Ringkasan Persediaan", "inventory_summary" => "Laporan Ringkasan Persediaan",
'inventory_summary_report' => "Laporan Ringkasan Persediaan", "inventory_summary_report" => "Laporan Ringkasan Persediaan",
'item' => "Produk/Item", "item" => "Produk/Item",
'item_count' => "Filter Jumlah Item", "item_count" => "Filter Jumlah Item",
'item_name' => "Nama Barang", "item_name" => "Nama Barang",
'item_number' => "Kode batang", "item_number" => "Kode batang",
'items' => "Produk/Item", "items" => "Produk/Item",
'items_purchased' => "Produk Dibeli", "items_purchased" => "Produk Dibeli",
'items_received' => "Barang Masuk", "items_received" => "Barang Masuk",
'items_summary_report' => "Laporan Ringkasan Produk/Item", "items_summary_report" => "Laporan Ringkasan Produk/Item",
'jurisdiction' => "Ranah hukum", "jurisdiction" => "Ranah hukum",
'low_inventory' => "Kurang Persediaan", "low_inventory" => "Kurang Persediaan",
'low_inventory_report' => "Laporan Persediaan Kurang", "low_inventory_report" => "Laporan Persediaan Kurang",
'low_sell_quantity' => "Jumlah penjualan yang rendah", "low_sell_quantity" => "Jumlah penjualan yang rendah",
'more_than_zero' => "Stok belum habis", "more_than_zero" => "Stok belum habis",
'name' => "Nama", "name" => "Nama",
'no_reports_to_display' => "Tidak ada item untuk ditampilkan.", "no_reports_to_display" => "Tidak ada item untuk ditampilkan.",
'payment_type' => "Tipe Pembayaran", "payment_type" => "Tipe Pembayaran",
'payments' => "Pembayaran", "payments" => "Pembayaran",
'payments_summary_report' => "Laporan Ringkasan Pembayaran", "payments_summary_report" => "Laporan Ringkasan Pembayaran",
'profit' => "Keuntungan/Laba", "profit" => "Keuntungan/Laba",
'quantity' => "Jumlah", "quantity" => "Jumlah",
'quantity_purchased' => "Jumlah Dibeli", "quantity_purchased" => "Jumlah Dibeli",
'quotes' => "Penawaran", "quotes" => "Penawaran",
'received_by' => "Diterima Oleh", "received_by" => "Diterima Oleh",
'receiving_id' => "Id Penerima", "receiving_id" => "Id Penerima",
'receiving_type' => "Type Diterima", "receiving_type" => "Type Diterima",
'receivings' => "Barang Masuk", "receivings" => "Barang Masuk",
'reorder_level' => "Level pesan ulang", "reorder_level" => "Level Pesan Ulang",
'report' => "Laporan", "report" => "Laporan",
'report_input' => "Input data Laporan", "report_input" => "Input data Laporan",
'reports' => "Lihat dan Cetak Laporan", "reports" => "Lihat dan Cetak Laporan",
'requisition' => "Daftar Permintaan", "requisition" => "Daftar Permintaan",
'requisition_by' => "Daftar Permintaan Oleh", "requisition_by" => "Daftar Permintaan Oleh",
'requisition_id' => "Identitas Peminta", "requisition_id" => "Identitas Peminta",
'requisition_item' => "Jenis Permintaan", "requisition_item" => "Jenis Permintaan",
'requisition_item_quantity' => "Jumlah Permintaan", "requisition_item_quantity" => "Jumlah Permintaan",
'requisition_related_item' => "", "requisition_related_item" => "",
'requisition_related_item_total_quantity' => "Jumlah Item Barang", "requisition_related_item_total_quantity" => "Jumlah Item Barang",
'requisition_related_item_unit_quantity' => "Unit Item Barang", "requisition_related_item_unit_quantity" => "Unit Item Barang",
'requisitions' => "Laporan Permintaan", "requisitions" => "Laporan Permintaan",
'returns' => "Retur", "returns" => "Retur",
'revenue' => "Pendapatan", "revenue" => "Pendapatan",
'sale_id' => "ID Penjualan", "sale_id" => "ID Penjualan",
'sale_type' => "Jenis Penjualan", "sale_type" => "Jenis Penjualan",
'sales' => "Penjualan", "sales" => "Penjualan",
'sales_amount' => "Jumlah Penjualan", "sales_amount" => "Jumlah Penjualan",
'sales_summary_report' => "Laporan Ringkasan Penjualan", "sales_summary_report" => "Laporan Ringkasan Penjualan",
'sales_taxes' => "Pajak Penjualan", "sales_taxes" => "Pajak Penjualan",
'sales_taxes_summary_report' => "Laporan Ringkasan Pajak Penjualan", "sales_taxes_summary_report" => "Laporan Ringkasan Pajak Penjualan",
'serial_number' => "No. Seri #", "serial_number" => "No. Seri #",
'service_charge' => "", "service_charge" => "",
'sold_by' => "Dijual Oleh", "sold_by" => "Dijual Oleh",
'sold_items' => "", "sold_items" => "",
'sold_to' => "Dijual Kepada", "sold_to" => "Dijual Kepada",
'stock_location' => "Lokasi Stock", "stock_location" => "Lokasi Stock",
'sub_total_value' => "Sub-total", "sub_total_value" => "Sub-total",
'subtotal' => "SubTotal", "subtotal" => "SubTotal",
'summary_reports' => "Laporan Ringkas", "summary_reports" => "Laporan Ringkas",
'supplied_by' => "Pemasok", "supplied_by" => "Pemasok",
'supplier' => "Pemasok", "supplier" => "Pemasok",
'suppliers' => "Pemasok", "suppliers" => "Pemasok",
'suppliers_summary_report' => "Laporan Ringkasan Pemasok", "suppliers_summary_report" => "Laporan Ringkasan Pemasok",
'tax' => "Pajak", "tax" => "Pajak",
'tax_category' => "Kategori Pajak", "tax_category" => "Kategori Pajak",
'tax_name' => "Nama Pajak", "tax_name" => "Nama Pajak",
'tax_percent' => "Persentasi Pajak", "tax_percent" => "Persentase Pajak",
'tax_rate' => "Tarif Pajak", "tax_rate" => "Tarif Pajak",
'taxes' => "Pajak", "taxes" => "Pajak",
'taxes_summary_report' => "Laporan Ringkasan Pajak", "taxes_summary_report" => "Laporan Ringkasan Pajak",
'total' => "Total", "total" => "Total",
'total_inventory_value' => "Total Nilai Persediaan", "total_inventory_value" => "Total Nilai Persediaan",
'total_low_sell_quantity' => "Total Jumlah Penjualan yang Rendah", "total_low_sell_quantity" => "Total Jumlah Penjualan yang Rendah",
'total_quantity' => "Total Kuantitas", "total_quantity" => "Total Kuantitas",
'total_retail' => "Total Faktur Eceran Nilai", "total_retail" => "Total Faktur Eceran Nilai",
'trans_amount' => "Jumlah Transaksi", "trans_amount" => "Jumlah Transaksi",
'trans_due' => "Hutang", "trans_due" => "Hutang",
'trans_group' => "Kelompok Transaksi", "trans_group" => "Kelompok Transaksi",
'trans_nopay_sales' => "Penjualan tanpa pembayaran", "trans_nopay_sales" => "Penjualan tanpa pembayaran",
'trans_payments' => "Pembayaran", "trans_payments" => "Pembayaran",
'trans_refunded' => "Dikembalikan", "trans_refunded" => "Dikembalikan",
'trans_sales' => "Penjualan", "trans_sales" => "Penjualan",
'trans_type' => "Tipe Transaksi", "trans_type" => "Tipe Transaksi",
'type' => "Tipe", "type" => "Tipe",
'unit_price' => "Harga Jual", "unit_price" => "Harga Jual",
'used' => "Poin yang telah digunakan", "used" => "Poin yang telah digunakan",
'work_orders' => "Perintah Kerja", "work_orders" => "Perintah Kerja",
'zero_and_less' => "Stok habis dan minus", "zero_and_less" => "Stok habis dan minus",
]; ];

View File

@@ -1,6 +1,5 @@
<?php <?php
return [
return [
'customers_available_points' => "Poin tersedia", 'customers_available_points' => "Poin tersedia",
'rewards_package' => "Hadiah", 'rewards_package' => "Hadiah",
'rewards_remaining_balance' => "Poin hadiah yang tersisa adalah ", 'rewards_remaining_balance' => "Poin hadiah yang tersisa adalah ",
@@ -74,11 +73,11 @@ return [
'entry' => "Entri", 'entry' => "Entri",
'error_editing_item' => "mengubah item salah", 'error_editing_item' => "mengubah item salah",
'find_or_scan_item' => "Cari/Scan Item", 'find_or_scan_item' => "Cari/Scan Item",
'find_or_scan_item_or_receipt' => "Temukan atau pindai Item atau Faktur", 'find_or_scan_item_or_receipt' => "Cari atau Scan Item atau Faktur",
'giftcard' => "Kartu Hadiah", 'giftcard' => "Kupon Bonus",
'giftcard_balance' => "Nilai Kupon Bonus", 'giftcard_balance' => "Nilai Kupon Bonus",
'giftcard_filter' => "", 'giftcard_filter' => "",
'giftcard_number' => "Nomor Kartu Hadiah", 'giftcard_number' => "Nomor Kartu Bonus",
'group_by_category' => "Dikelompokkan berdasarkan Kategori", 'group_by_category' => "Dikelompokkan berdasarkan Kategori",
'group_by_type' => "Dikelompokkan berdasarkan Jenis", 'group_by_type' => "Dikelompokkan berdasarkan Jenis",
'hsn' => "HSN", 'hsn' => "HSN",
@@ -86,7 +85,7 @@ return [
'include_prices' => "Termasuk Harga?", 'include_prices' => "Termasuk Harga?",
'invoice' => "Faktur", 'invoice' => "Faktur",
'invoice_confirm' => "Faktur ini akan dikirim ke", 'invoice_confirm' => "Faktur ini akan dikirim ke",
'invoice_enable' => "Nomor Faktur", 'invoice_enable' => "Buat Faktur",
'invoice_filter' => "Faktur", 'invoice_filter' => "Faktur",
'invoice_no_email' => "Pelanggan ini tidak memiliki alamat email yang valid.", 'invoice_no_email' => "Pelanggan ini tidak memiliki alamat email yang valid.",
'invoice_number' => "Nomor Nota", 'invoice_number' => "Nomor Nota",

View File

@@ -1,25 +1,24 @@
<?php <?php
return [ return [
'account_number' => "Nomor Akun Pemasok", "account_number" => "Nomor Akun Pemasok",
'agency_name' => "Nama", "agency_name" => "Nama",
'cannot_be_deleted' => "Tidak bisa dihapus pemasok yang dipilih, satu atau lebih dari pemasok yang dipilih memiliki penjualan.", "cannot_be_deleted" => "Tidak bisa dihapus pemasok yang dipilih, satu atau lebih dari pemasok yang dipilih memiliki penjualan.",
'category' => "Kategori", "category" => "Kategori",
'company_name' => "Nama Perusahaan", "company_name" => "Nama Perusahaan",
'company_name_required' => "Nama Perusahaan wajib diisi.", "company_name_required" => "Nama Perusahaan wajib diisi.",
'confirm_delete' => "Apakah Anda yakin ingin menghapus pemasok yang dipilih?", "confirm_delete" => "Apakah Anda yakin ingin menghapus pemasok yang dipilih?",
'confirm_restore' => "Anda yakin ingin mengembalikan Pemasok terpilih?", "confirm_restore" => "Anda yakin ingin mengembalikan Pemasok terpilih?",
'cost' => "Biaya Pemasok", "cost" => "Biaya Pemasok",
'error_adding_updating' => "Kesalahan Menambah / memperbarui data pemasok.", "error_adding_updating" => "Kesalahan Menambah / memperbarui data pemasok.",
'goods' => "Pemasok Barang", "goods" => "Pemasok Barang",
'new' => "Pemasok Baru", "new" => "Pemasok Baru",
'none_selected' => "Anda belum memilih pemasok untuk dihapus.", "none_selected" => "Anda belum memilih pemasok untuk dihapus.",
'one_or_multiple' => "Pemasok", "one_or_multiple" => "Pemasok",
'successful_adding' => "Anda telah berhasil menambahkan data pemasok", "successful_adding" => "Anda telah berhasil menambahkan data pemasok",
'successful_deleted' => "Berhasil menghapus Kartu Hadiah", "successful_deleted" => "Anda telah berhasil menghapus data pemasok",
'successful_updating' => "Anda telah berhasil memperbarui data pemasok", "successful_updating" => "Anda telah berhasil memperbarui data pemasok",
'supplier' => "Pemasok", "supplier" => "Pemasok",
'supplier_id' => "ID", "supplier_id" => "ID",
'tax_id' => "ID Pajak", "tax_id" => "ID Pajak",
'update' => "Ubah data Pemasok", "update" => "Ubah data Pemasok",
]; ];

View File

@@ -1,83 +1,82 @@
<?php <?php
return [ return [
'add_exception' => "Tambah pengecualian", "add_exception" => "Tambah pengecualian",
'cascade' => "Menurunkan", "cascade" => "Menurunkan",
'cascade_sequence' => "Urutan Penurunan", "cascade_sequence" => "Urutan Penurunan",
'city' => "Kota", "city" => "Kota",
'code' => "Kode", "code" => "Kode",
'confirm_delete' => "Anda yakin ingin menghapus Kode Pajak ini? Aksi ini tidak dapat dibatalkan", "confirm_delete" => "Anda yakin ingin menghapus Kode Pajak ini? Aksi ini tidak dapat dibatalkan",
'confirm_restore' => "Anda yakin ingin mengembalikan Kode Pajak terpilih?", "confirm_restore" => "Anda yakin ingin mengembalikan Kode Pajak terpilih?",
'default_tax_category' => "Kategori Pajak Default", "default_tax_category" => "Kategori Pajak Default",
'default_tax_rate' => "Taruf Pajak Default", "default_tax_rate" => "Taruf Pajak Default",
'error_adding_updating' => "Penambahan atau pembaharuan Kode Pajak gagal", "error_adding_updating" => "Penambahan atau pembaharuan Kode Pajak gagal",
'group_seq' => "Urutan grup", "group_seq" => "Urutan grup",
'jurisdiction_name' => "Nama Yuridiksi", "jurisdiction_name" => "Nama Yuridiksi",
'name' => "Nama", "name" => "Nama",
'new' => "Pajak baru", "new" => "Pajak baru",
'no_taxes' => "", "no_taxes" => "",
'no_taxes_to_display' => "Tidak ada Kode Pajak yang dapat ditampilkan", "no_taxes_to_display" => "Tidak ada Kode Pajak yang dapat ditampilkan",
'reporting_authority' => "Otoritas Pelaporan", "reporting_authority" => "Otoritas Pelaporan",
'round_half_down' => "Turun setengah", "round_half_down" => "Turun setengah",
'round_half_even' => "Setengah Genap", "round_half_even" => "Setengah Genap",
'round_half_odd' => "Setengah Ganjil", "round_half_odd" => "Setengah Ganjil",
'round_half_up' => "Naikkan Setengah", "round_half_up" => "Naikkan Setengah",
'rounding_code' => "Kode Pembulatan", "rounding_code" => "Kode Pembulatan",
'sales_tax' => "Pajak Penjualan", "sales_tax" => "Pajak Penjualan",
'sales_tax_by_invoice' => "Pajak Penjualan berdasarkan faktur", "sales_tax_by_invoice" => "Pajak Penjualan berdasarkan faktur",
'sequence' => "Urutan", "sequence" => "Urutan",
'state' => "Status", "state" => "Status",
'successful_deleted' => "Berhasil menghapus Kartu Hadiah", "successful_deleted" => "Anda berhasil dihapus",
'tax_categories' => "Kategori Pajak", "tax_categories" => "Kategori Pajak",
'tax_categories_configuration' => "Konfigurasi Kategori Pajak", "tax_categories_configuration" => "Konfigurasi Kategori Pajak",
'tax_categories_saved_successfully' => "Perubahan Ketegori Pajak berhasil disimpan", "tax_categories_saved_successfully" => "Perubahan Ketegori Pajak berhasil disimpan",
'tax_categories_saved_unsuccessfully' => "Perubahan Kategori Pajak tidak tersimpan", "tax_categories_saved_unsuccessfully" => "Perubahan Kategori Pajak tidak tersimpan",
'tax_category' => "Kategori pajak", "tax_category" => "Kategori pajak",
'tax_category_code' => "Kode Kategori Pajak", "tax_category_code" => "Kode Kategori Pajak",
'tax_category_duplicate' => "Kategori pajak ganda", "tax_category_duplicate" => "Kategori pajak ganda",
'tax_category_invalid_chars' => "terdapat karakter yang salah dalam nama kategori pajak", "tax_category_invalid_chars" => "terdapat karakter yang salah dalam nama kategori pajak",
'tax_category_name' => "Nama Kategori Pajak", "tax_category_name" => "Nama Kategori Pajak",
'tax_category_new' => "Kategori Pajak baru", "tax_category_new" => "Kategori Pajak baru",
'tax_category_required' => "Kategori Pajak dibutuhkan", "tax_category_required" => "Kategori Pajak dibutuhkan",
'tax_code' => "Kode Pajak", "tax_code" => "Kode Pajak",
'tax_code_cannot_be_deleted' => "Gagal menghapus Kode Pajak", "tax_code_cannot_be_deleted" => "Gagal menghapus Kode Pajak",
'tax_code_duplicate' => "Kode Pajak ganda", "tax_code_duplicate" => "Kode Pajak ganda",
'tax_code_invalid_chars' => "Terdapat karakter yang salah dalam Kode Pajak", "tax_code_invalid_chars" => "Terdapat karakter yang salah dalam Kode Pajak",
'tax_code_name' => "Nama Kode Pajak", "tax_code_name" => "Nama Kode Pajak",
'tax_code_required' => "Kode pajak harus diisi", "tax_code_required" => "Kode pajak harus diisi",
'tax_code_successful_deleted' => "Anda berhasil menghapus Kode Pajak", "tax_code_successful_deleted" => "Anda berhasil menghapus Kode Pajak",
'tax_code_successful_updated' => "Anda berhasil memperbaharui", "tax_code_successful_updated" => "Anda berhasil memperbaharui",
'tax_code_successful_updating' => "Anda berhasil memperbaharui Kode Pajak", "tax_code_successful_updating" => "Anda berhasil memperbaharui Kode Pajak",
'tax_code_successfully_added' => "Anda berhasil menambahkan", "tax_code_successfully_added" => "Anda berhasil menambahkan",
'tax_code_type' => "jenis Kode Pajak", "tax_code_type" => "jenis Kode Pajak",
'tax_codes' => "Kode Pajak", "tax_codes" => "Kode Pajak",
'tax_codes_configuration' => "Konfigurasi Kode Pajak", "tax_codes_configuration" => "Konfigurasi Kode Pajak",
'tax_codes_saved_successfully' => "Perubahan Kode Pajak berhasil disimpan", "tax_codes_saved_successfully" => "Perubahan Kode Pajak berhasil disimpan",
'tax_codes_saved_unsuccessfully' => "Perubahan Kode Pajak tidak tersimpan", "tax_codes_saved_unsuccessfully" => "Perubahan Kode Pajak tidak tersimpan",
'tax_excluded' => "Pengecualian Pajak", "tax_excluded" => "Pengecualian Pajak",
'tax_group' => "Grup Pajak", "tax_group" => "Grup Pajak",
'tax_group_not_unique' => "Grup Pajak {0} tidak unik", "tax_group_not_unique" => "Grup Pajak {0} tidak unik",
'tax_group_sequence' => "Urutan Grup Pajak", "tax_group_sequence" => "Urutan Grup Pajak",
'tax_included' => "Termasuk pajak", "tax_included" => "Termasuk pajak",
'tax_jurisdiction' => "Yuridiksi Pajak", "tax_jurisdiction" => "Yuridiksi Pajak",
'tax_jurisdiction_duplicate' => "Yuridiksi Pajak ganda", "tax_jurisdiction_duplicate" => "Yuridiksi Pajak ganda",
'tax_jurisdiction_invalid_chars' => "Karakter yang salah pada Nama Yuridiksi", "tax_jurisdiction_invalid_chars" => "Karakter yang salah pada Nama Yuridiksi",
'tax_jurisdiction_required' => "Diperlukan yurisdiksi Pajak", "tax_jurisdiction_required" => "Diperlukan yurisdiksi Pajak",
'tax_jurisdictions' => "Yurisdiksi Pajak", "tax_jurisdictions" => "Yurisdiksi Pajak",
'tax_jurisdictions_configuration' => "Konfigurasi Yurisdiksi Pajak", "tax_jurisdictions_configuration" => "Konfigurasi Yurisdiksi Pajak",
'tax_jurisdictions_saved_successfully' => "Perubahan Yurisdiksi Pajak berhasil disimpan", "tax_jurisdictions_saved_successfully" => "Perubahan Yurisdiksi Pajak berhasil disimpan",
'tax_jurisdictions_saved_unsuccessfully' => "Perubahan Yurisdiksi Pajak tidak tersimpan", "tax_jurisdictions_saved_unsuccessfully" => "Perubahan Yurisdiksi Pajak tidak tersimpan",
'tax_rate' => "Tarif Pajak", "tax_rate" => "Tarif Pajak",
'tax_rate_configuration' => "Konfigurasi Tarif Pajak", "tax_rate_configuration" => "Konfigurasi Tarif Pajak",
'tax_rate_error_adding_updating' => "Gagal menambahkan atau memperbaharui Tarif Pajak", "tax_rate_error_adding_updating" => "Gagal menambahkan atau memperbaharui Tarif Pajak",
'tax_rate_numeric' => "Tarif Pajak harus berupa angka", "tax_rate_numeric" => "Tarif Pajak harus berupa angka",
'tax_rate_required' => "Tarif Pajak harus diisi", "tax_rate_required" => "Tarif Pajak harus diisi",
'tax_rate_successful_updated' => "Anda berhasil melakukan perubahan", "tax_rate_successful_updated" => "Anda berhasil melakukan perubahan",
'tax_rate_successfully_added' => "Anda berhasil menambahkan", "tax_rate_successfully_added" => "Anda berhasil menambahkan",
'tax_rates' => "Tarif Pajak", "tax_rates" => "Tarif Pajak",
'tax_rates_configuration' => "Konfigurasi Tarif Pajak", "tax_rates_configuration" => "Konfigurasi Tarif Pajak",
'tax_rounding' => "Pembulatan Pajak", "tax_rounding" => "Pembulatan Pajak",
'tax_type' => "Jenis Pajak", "tax_type" => "Jenis Pajak",
'update' => "Perbaharui Tarif Pajak", "update" => "Perbaharui Tarif Pajak",
'vat_tax' => "PPN", "vat_tax" => "PPN",
]; ];

View File

@@ -52,7 +52,7 @@ return [
"expenses_tax_amount" => "Imposte", "expenses_tax_amount" => "Imposte",
"expenses_total_amount" => "Totale Importo", "expenses_total_amount" => "Totale Importo",
"expenses_total_tax_amount" => "Totale Imposte", "expenses_total_tax_amount" => "Totale Imposte",
"graphical_reports" => "Resoconto Grafico", "graphical_reports" => "Resoconto Geografico",
"inventory" => "Inventario", "inventory" => "Inventario",
"inventory_low" => "Inventario Basso", "inventory_low" => "Inventario Basso",
"inventory_low_report" => "Resoconto Inventario Basso", "inventory_low_report" => "Resoconto Inventario Basso",

View File

@@ -1,59 +1,58 @@
<?php <?php
return [ return [
'amount_due' => "", "amount_due" => "",
'cancel_receiving' => "ยกเลิก", "cancel_receiving" => "ยกเลิก",
'cannot_be_deleted' => "ไม่สามารถลบใบรับสินค้าได้", "cannot_be_deleted" => "ไม่สามารถลบใบรับสินค้าได้",
'comments' => "ความคิดเห็น", "comments" => "ความคิดเห็น",
'complete_receiving' => "เสร็จสิ้น", "complete_receiving" => "เสร็จสิ้น",
'confirm_cancel_receiving' => "คุณแน่ใจที่ต้องการล้างค่าใบรับสินค้าใช่หรือไม่? เมื่อล้างค่าแล้วทุกรายการจะถูกล้างออก", "confirm_cancel_receiving" => "คุณแน่ใจที่ต้องการล้างค่าใบรับสินค้าใช่หรือไม่? เมื่อล้างค่าแล้วทุกรายการจะถูกล้างออก",
'confirm_delete' => "คุณต้องการลบใบรับสินค้าใช่หรือไม่? หากลบแล้วจะไม่สามารถเรียกคืนได้อีก", "confirm_delete" => "คุณต้องการลบใบรับสินค้าใช่หรือไม่? หากลบแล้วจะไม่สามารถเรียกคืนได้อีก",
'confirm_finish_receiving' => "คุณต้องการบันทึกใบรับสินค้าใช่หรือไม่? เมื่อบันทึกแล้วไม่สามารถยกเลิกได้", "confirm_finish_receiving" => "คุณต้องการบันทึกใบรับสินค้าใช่หรือไม่? เมื่อบันทึกแล้วไม่สามารถยกเลิกได้",
'confirm_restore' => "", "confirm_restore" => "",
'cost' => "ต้นทุน", "cost" => "ต้นทุน",
'daily' => "", "daily" => "",
'date' => "วันที่ใบรับสินค้า", "date" => "วันที่ใบรับสินค้า",
'date_required' => "ต้องบันทึกวันที่ที่ถูกต้อง", "date_required" => "ต้องบันทึกวันที่ที่ถูกต้อง",
'date_type' => "ต้องระบุวันที่", "date_type" => "ต้องระบุวันที่",
'delete_entire_sale' => "ลบรายการขายทั้งหมด", "delete_entire_sale" => "ลบรายการขายทั้งหมด",
'discount' => "ส่วนลด %", "discount" => "ส่วนลด %",
'edit' => "แก้ไข", "edit" => "แก้ไข",
'edit_sale' => "แก้ไขรายการรับ", "edit_sale" => "แก้ไขรายการรับ",
'employee' => "พนักงาน", "employee" => "พนักงาน",
'error_editing_item' => "แก้ไขสินค้าล้มเหลว", "error_editing_item" => "แก้ไขสินค้าล้มเหลว",
'error_requisition' => "ไม่สามารถย้ายสินค้าคงคลังจากหรือไปยังที่เก็บสินค้าเดียวกัน", "error_requisition" => "ไม่สามารถย้ายสินค้าคงคลังจากหรือไปยังที่เก็บสินค้าเดียวกัน",
'find_or_scan_item' => "ค้นหาสินค้า", "find_or_scan_item" => "ค้นหาสินค้า",
'find_or_scan_item_or_receipt' => "ค้นหา หรือ แสกนรายการ หรือ ใบเสร็จ", "find_or_scan_item_or_receipt" => "ค้นหาสินค้าหรือบิล",
'id' => "รายการสินค้าเข้า ID", "id" => "รายการสินค้าเข้า ID",
'item_name' => "ชื่อสินคัา", "item_name" => "ชื่อสินคัา",
'mode' => "ประเภทธุรกรรม", "mode" => "ประเภทธุรกรรม",
'new_supplier' => "ผู้ผลิตรายใหม่", "new_supplier" => "ผู้ผลิตรายใหม่",
'one_or_multiple' => "ใบรับสินค้า", "one_or_multiple" => "ใบรับสินค้า",
'print_after_sale' => "พิมพ์บิลหลังการขาย", "print_after_sale" => "พิมพ์บิลหลังการขาย",
'quantity' => "จำนวน.", "quantity" => "จำนวน.",
'receipt' => "บิลสินค้าเข้า", "receipt" => "บิลสินค้าเข้า",
'receipt_number' => "ใบรับสินค้า #", "receipt_number" => "ใบรับสินค้า #",
'receiving' => "รับสินค้า", "receiving" => "รับสินค้า",
'reference' => "อ้างอิง", "reference" => "อ้างอิง",
'register' => "รับสินค้า", "register" => "รับสินค้า",
'requisition' => "เบิกสินค้า", "requisition" => "เบิกสินค้า",
'return' => "คืนสินค้า", "return" => "คืนสินค้า",
'select_supplier' => "เลือกคู่ค้า (ไม่ระบุก็ได้)", "select_supplier" => "เลือกคู่ค้า (ไม่ระบุก็ได้)",
'ship_pack' => "แพคการขนส่ง", "ship_pack" => "แพคการขนส่ง",
'start_typing_supplier_name' => "เริ่มต้นพิมพ์ชื่อผู้ผลิต...", "start_typing_supplier_name" => "เริ่มต้นพิมพ์ชื่อผู้ผลิต...",
'stock' => "คลังสินค้า", "stock" => "คลังสินค้า",
'stock_destination' => "คลังสินค้าปลายทาง", "stock_destination" => "คลังสินค้าปลายทาง",
'stock_locaiton' => "สถานที่เก็บสินค้า", "stock_locaiton" => "สถานที่เก็บสินค้า",
'stock_source' => "คลังสินค้าต้นทาง", "stock_source" => "คลังสินค้าต้นทาง",
'successfully_deleted' => "คุณได้ทำการลบเรียบร้อยแล้ว", "successfully_deleted" => "คุณได้ทำการลบเรียบร้อยแล้ว",
'successfully_updated' => "ปรับปรุงใบรับสินค้าเรียบร้อยแล้ว", "successfully_updated" => "ปรับปรุงใบรับสินค้าเรียบร้อยแล้ว",
'supplier' => "ผู้ผลิต", "supplier" => "ผู้ผลิต",
'supplier_address' => "ที่อยู่", "supplier_address" => "ที่อยู่",
'supplier_email' => "อีเมล์", "supplier_email" => "อีเมล์",
'supplier_location' => "ที่อยู่", "supplier_location" => "ที่อยู่",
'total' => "รวม", "total" => "รวม",
'transaction_failed' => "ทำรายการใบรับสินค้าล้มเหลว", "transaction_failed" => "ทำรายการใบรับสินค้าล้มเหลว",
'unable_to_add_item' => "ไม่สามารถเพิ่มสินค้าได้", "unable_to_add_item" => "ไม่สามารถเพิ่มสินค้าได้",
'unsuccessfully_updated' => "ทำการปรับปรุง Receiving ไม่ได้", "unsuccessfully_updated" => "ทำการปรับปรุง Receiving ไม่ได้",
'update' => "ปรับปรุง", "update" => "ปรับปรุง",
]; ];

View File

@@ -1,12 +1,11 @@
<?php <?php
return [ return [
'all' => "سب", "all" => "",
'columns' => "", "columns" => "",
'hide_show_pagination' => "", "hide_show_pagination" => "",
'loading' => "", "loading" => "",
'page_from_to' => "", "page_from_to" => "",
'refresh' => "", "refresh" => "",
'rows_per_page' => "", "rows_per_page" => "",
'toggle' => "", "toggle" => "",
]; ];

View File

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

View File

@@ -1,89 +1,88 @@
<?php <?php
return [ return [
'address_1' => "گھر کا پتہ", "address_1" => "",
'address_2' => "", "address_2" => "",
'admin' => "", "admin" => "",
'city' => "", "city" => "",
'clerk' => "", "clerk" => "",
'close' => "", "close" => "",
'color' => "", "color" => "",
'comments' => "", "comments" => "",
'common' => "", "common" => "",
'confirm_search' => "", "confirm_search" => "",
'copyrights' => "© 2010 - {0}", "copyrights" => "© 2010 - {0}",
'correct_errors' => "", "correct_errors" => "",
'country' => "", "country" => "",
'dashboard' => "", "dashboard" => "",
'date' => "", "date" => "",
'delete' => "", "delete" => "",
'det' => "", "det" => "",
'download_import_template' => "", "download_import_template" => "",
'edit' => "", "edit" => "",
'email' => "", "email" => "",
'email_invalid_format' => "", "email_invalid_format" => "",
'export_csv' => "", "export_csv" => "",
'export_csv_no' => "", "export_csv_no" => "",
'export_csv_yes' => "", "export_csv_yes" => "",
'fields_required_message' => "", "fields_required_message" => "",
'fields_required_message_unique' => "", "fields_required_message_unique" => "",
'first_name' => "", "first_name" => "",
'first_name_required' => "", "first_name_required" => "",
'first_page' => "", "first_page" => "",
'gender' => "", "gender" => "",
'gender_female' => "", "gender_female" => "",
'gender_male' => "", "gender_male" => "",
'gender_undefined' => "", "gender_undefined" => "",
'icon' => "", "icon" => "",
'id' => "", "id" => "",
'import' => "", "import" => "",
'import_change_file' => "", "import_change_file" => "",
'import_csv' => "", "import_csv" => "",
'import_full_path' => "", "import_full_path" => "",
'import_remove_file' => "", "import_remove_file" => "",
'import_select_file' => "", "import_select_file" => "",
'inv' => "", "inv" => "",
'last_name' => "", "last_name" => "",
'last_name_required' => "", "last_name_required" => "",
'last_page' => "", "last_page" => "",
'learn_about_project' => "", "learn_about_project" => "",
'list_of' => "", "list_of" => "",
'logo' => "", "logo" => "",
'logo_mark' => "", "logo_mark" => "",
'logout' => "", "logout" => "",
'manager' => "", "manager" => "",
'migration_needed' => "", "migration_needed" => "",
'new' => "", "new" => "",
'no' => "", "no" => "",
'no_persons_to_display' => "", "no_persons_to_display" => "",
'none_selected_text' => "", "none_selected_text" => "",
'or' => "", "or" => "",
'people' => "", "people" => "",
'phone_number' => "", "phone_number" => "",
'phone_number_required' => "", "phone_number_required" => "",
'please_visit_my' => "", "please_visit_my" => "",
'position' => "", "position" => "",
'powered_by' => "", "powered_by" => "",
'price' => "", "price" => "",
'print' => "", "print" => "",
'remove' => "", "remove" => "",
'required' => "", "required" => "",
'restore' => "", "restore" => "",
'return_policy' => "", "return_policy" => "",
'search' => "", "search" => "",
'search_options' => "", "search_options" => "",
'searched_for' => "", "searched_for" => "",
'software_short' => "", "software_short" => "",
'software_title' => "", "software_title" => "",
'state' => "", "state" => "",
'submit' => "", "submit" => "",
'total_spent' => "", "total_spent" => "",
'unknown' => "", "unknown" => "",
'view_recent_sales' => "", "view_recent_sales" => "",
'website' => "", "website" => "",
'welcome' => "", "welcome" => "",
'welcome_message' => "", "welcome_message" => "",
'yes' => "", "yes" => "",
'you_are_using_ospos' => "", "you_are_using_ospos" => "",
'zip' => "", "zip" => "",
]; ];

View File

@@ -1,57 +1,56 @@
<?php <?php
return [ return [
'account_number' => "اکاوٗنٹ", "account_number" => "",
'account_number_duplicate' => "", "account_number_duplicate" => "",
'available_points' => "", "available_points" => "",
'available_points_value' => "", "available_points_value" => "",
'average' => "", "average" => "",
'avg_discount' => "", "avg_discount" => "",
'basic_information' => "", "basic_information" => "",
'cannot_be_deleted' => "", "cannot_be_deleted" => "",
'company_name' => "", "company_name" => "",
'confirm_delete' => "", "confirm_delete" => "",
'confirm_restore' => "", "confirm_restore" => "",
'consent' => "", "consent" => "",
'consent_required' => "", "consent_required" => "",
'csv_import_failed' => "", "csv_import_failed" => "",
'csv_import_nodata_wrongformat' => "", "csv_import_nodata_wrongformat" => "",
'csv_import_partially_failed' => "", "csv_import_partially_failed" => "",
'csv_import_success' => "", "csv_import_success" => "",
'customer' => "", "customer" => "",
'date' => "", "date" => "",
'discount' => "", "discount" => "",
'discount_fixed' => "", "discount_fixed" => "",
'discount_percent' => "", "discount_percent" => "",
'discount_type' => "", "discount_type" => "",
'email_duplicate' => "", "email_duplicate" => "",
'employee' => "", "employee" => "",
'error_adding_updating' => "", "error_adding_updating" => "",
'import_items_csv' => "", "import_items_csv" => "",
'mailchimp_activity_click' => "", "mailchimp_activity_click" => "",
'mailchimp_activity_lastopen' => "", "mailchimp_activity_lastopen" => "",
'mailchimp_activity_open' => "", "mailchimp_activity_open" => "",
'mailchimp_activity_total' => "", "mailchimp_activity_total" => "",
'mailchimp_activity_unopen' => "", "mailchimp_activity_unopen" => "",
'mailchimp_email_client' => "", "mailchimp_email_client" => "",
'mailchimp_info' => "", "mailchimp_info" => "",
'mailchimp_member_rating' => "", "mailchimp_member_rating" => "",
'mailchimp_status' => "", "mailchimp_status" => "",
'mailchimp_vip' => "", "mailchimp_vip" => "",
'max' => "", "max" => "",
'min' => "", "min" => "",
'new' => "", "new" => "",
'none_selected' => "", "none_selected" => "",
'one_or_multiple' => "", "one_or_multiple" => "",
'quantity' => "", "quantity" => "",
'stats_info' => "", "stats_info" => "",
'successful_adding' => "", "successful_adding" => "",
'successful_deleted' => "", "successful_deleted" => "",
'successful_updating' => "", "successful_updating" => "",
'tax_code' => "", "tax_code" => "",
'tax_id' => "", "tax_id" => "",
'taxable' => "", "taxable" => "",
'total' => "", "total" => "",
'update' => "", "update" => "",
'rewards_package' => "", "rewards_package" => "",
]; ];

View File

@@ -1,24 +1,23 @@
<?php <?php
return [ return [
'all_time' => "ہمیشہ", "all_time" => "",
'apply' => "", "apply" => "",
'cancel' => "", "cancel" => "",
'custom' => "", "custom" => "",
'from' => "", "from" => "",
'last_30' => "", "last_30" => "",
'last_7' => "", "last_7" => "",
'last_financial_year' => "", "last_financial_year" => "",
'last_month' => "", "last_month" => "",
'last_year' => "", "last_year" => "",
'same_month_last_year' => "", "same_month_last_year" => "",
'same_month_to_same_day_last_year' => "", "same_month_to_same_day_last_year" => "",
'this_financial_year' => "", "this_financial_year" => "",
'this_month' => "", "this_month" => "",
'this_year' => "", "this_year" => "",
'to' => "", "to" => "",
'today' => "", "today" => "",
'today_last_year' => "", "today_last_year" => "",
'weekstart' => "", "weekstart" => "",
'yesterday' => "", "yesterday" => "",
]; ];

View File

@@ -1,6 +1,5 @@
<?php <?php
return [ return [
'no_permission_module' => "آپ کو اس ماڈیول تک رسائی کی اجازت نہیں ہے", "no_permission_module" => "",
'unknown' => "غیر متوقع رکاوٹ", "unknown" => "",
]; ];

View File

@@ -1,51 +1,50 @@
<?php <?php
return [ return [
'add_item' => "", "add_item" => "",
'amount' => "رقم", "amount" => "",
'amount_number' => "", "amount_number" => "",
'amount_required' => "", "amount_required" => "",
'by_category' => "", "by_category" => "",
'cannot_be_deleted' => "زمرہ کے اخراجات کو حذف نہیں کیا جا سکا", "cannot_be_deleted" => "",
'cash' => "", "cash" => "",
'cash_filter' => "", "cash_filter" => "",
'categories_name' => "", "categories_name" => "",
'category_required' => "", "category_required" => "",
'check' => "", "check" => "",
'check_filter' => "", "check_filter" => "",
'confirm_delete' => "", "confirm_delete" => "",
'confirm_restore' => "", "confirm_restore" => "",
'credit' => "", "credit" => "",
'credit_filter' => "", "credit_filter" => "",
'date' => "", "date" => "",
'date_number' => "", "date_number" => "",
'date_required' => "", "date_required" => "",
'debit' => "", "debit" => "",
'debit_filter' => "", "debit_filter" => "",
'description' => "", "description" => "",
'due' => "", "due" => "",
'due_filter' => "", "due_filter" => "",
'employee' => "", "employee" => "",
'error_adding_updating' => "", "error_adding_updating" => "",
'expense_id' => "", "expense_id" => "",
'expenses_employee' => "", "expenses_employee" => "",
'info' => "", "info" => "",
'ip_address' => "", "ip_address" => "",
'is_deleted' => "", "is_deleted" => "",
'name_required' => "", "name_required" => "",
'new' => "", "new" => "",
'new_supplier' => "", "new_supplier" => "",
'no_expenses_to_display' => "", "no_expenses_to_display" => "",
'none_selected' => "", "none_selected" => "",
'one_or_multiple' => "", "one_or_multiple" => "",
'payment' => "", "payment" => "",
'start_typing_supplier_name' => "", "start_typing_supplier_name" => "",
'successful_adding' => "", "successful_adding" => "",
'successful_deleted' => "", "successful_deleted" => "",
'successful_updating' => "", "successful_updating" => "",
'supplier_name' => "", "supplier_name" => "",
'supplier_tax_code' => "", "supplier_tax_code" => "",
'tax_amount' => "", "tax_amount" => "",
'tax_amount_number' => "", "tax_amount_number" => "",
'update' => "", "update" => "",
]; ];

View File

@@ -1,23 +1,22 @@
<?php <?php
return [ return [
'category_name_required' => "اخراجات کے زمرے کا نام درکار ہے", "category_name_required" => "",
'add_item' => "زمرہ شامل کریں", "add_item" => "",
'cannot_be_deleted' => "زمرہ کے اخراجات کو حذف نہیں کیا جا سکا", "cannot_be_deleted" => "",
'category_id' => "شناخت", "category_id" => "",
'confirm_delete' => "کیا آپ واقعی منتخب کردہ اخراجات کے زمرے کو حذف کرنا چاہتے ہیں؟", "confirm_delete" => "",
'confirm_restore' => "کیا آپ واقعی منتخب کردہ اخراجات کے زمرے کو بحال کرنا چاہتے ہیں؟", "confirm_restore" => "",
'description' => "زمرے کے تفصیلات", "description" => "",
'error_adding_updating' => "", "error_adding_updating" => "",
'info' => "", "info" => "",
'name' => "", "name" => "",
'new' => "", "new" => "",
'no_expenses_categories_to_display' => "", "no_expenses_categories_to_display" => "",
'none_selected' => "", "none_selected" => "",
'one_or_multiple' => "", "one_or_multiple" => "",
'quantity' => "", "quantity" => "",
'successful_adding' => "", "successful_adding" => "",
'successful_deleted' => "", "successful_deleted" => "",
'successful_updating' => "", "successful_updating" => "",
'update' => "", "update" => "",
]; ];

View File

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

View File

@@ -6,13 +6,11 @@ use App\Models\Attribute;
use App\Models\Item; use App\Models\Item;
use App\Models\Item_kit_items; use App\Models\Item_kit_items;
use App\Models\Item_quantity; use App\Models\Item_quantity;
use App\Models\Enums\Rounding_mode;
use App\Models\Receiving; use App\Models\Receiving;
use App\Models\Stock_location; use App\Models\Stock_location;
use CodeIgniter\Session\Session; use CodeIgniter\Session\Session;
use Config\OSPOS; use Config\OSPOS;
use ReflectionException;
/** /**
* Receiving library * Receiving library
@@ -28,7 +26,6 @@ class Receiving_lib
private Receiving $receiving; private Receiving $receiving;
private Stock_location $stock_location; private Stock_location $stock_location;
private Session $session; private Session $session;
private array $config;
public function __construct() public function __construct()
{ {
@@ -38,7 +35,6 @@ class Receiving_lib
$this->item_quantity = model(Item_quantity::class); $this->item_quantity = model(Item_quantity::class);
$this->receiving = model(Receiving::class); $this->receiving = model(Receiving::class);
$this->stock_location = model(Stock_location::class); $this->stock_location = model(Stock_location::class);
$this->config = config(OSPOS::class)->settings;
$this->session = session(); $this->session = session();
} }
@@ -198,31 +194,6 @@ class Receiving_lib
$this->session->remove('recv_reference'); $this->session->remove('recv_reference');
} }
/**
* @return string
*/
public function get_term_days(): string
{
return $this->session->get('recv_term_days') ?? '';
}
/**
* @param string $term_days
* @return void
*/
public function set_term_days(string $term_days): void
{
$this->session->set('recv_term_days', $term_days);
}
/**
* @return void
*/
public function clear_term_days(): void //TODO: This function verb is inconsistent from the others. Consider refactoring to remove_reference()
{
$this->session->remove('recv_term_days');
}
/** /**
* @return bool * @return bool
*/ */
@@ -545,7 +516,6 @@ class Receiving_lib
$this->remove_supplier(); $this->remove_supplier();
$this->clear_comment(); $this->clear_comment();
$this->clear_reference(); $this->clear_reference();
$this->clear_term_days();
} }
/** /**
@@ -584,200 +554,4 @@ class Receiving_lib
return $total; return $total;
} }
/**
* @param string $payment_type
* @return void
*/
public function set_payment_type(string $payment_type): void
{
$this->session->set('payment_type', $payment_type);
}
/**
* @return string|null
*/
public function get_payment_type(): ?string
{
return $this->session->get('payment_type');
}
public function get_total_due(): float
{
return $this->get_total() - $this->get_payments_total();
}
public function get_payments_total(): string
{
$subtotal = '0.0';
$cash_mode_eligible = CASH_MODE_TRUE;
foreach($this->get_payments() as $payments)
{
if(!$payments['cash_adjustment'])
{
$subtotal = bcadd($payments['payment_amount'], $subtotal);
}
if(lang('Sales.cash') != $payments['payment_type'] && lang('Sales.cash_adjustment') != $payments['payment_type'])
{
$cash_mode_eligible = CASH_MODE_FALSE;
}
}
if($cash_mode_eligible && $this->session->get('cash_rounding'))
{
$this->session->set('cash_mode', CASH_MODE_TRUE);
}
return $subtotal;
}
/**
* Multiple Payments
*/
public function get_payments(): array
{
if(!$this->session->get('sales_payments'))
{
$this->set_payments ([]);
}
return $this->session->get('sales_payments');
}
/**
* Multiple Payments
*/
public function set_payments(array $payments_data): void
{
$this->session->set('sales_payments', $payments_data);
}
/**
* Adds a new payment to the payments array or updates an existing one.
* It will also disable cash_mode if a non-qualifying payment type is added.
* @param string $payment_id
* @param string $payment_amount
* @param int $cash_adjustment
*/
public function add_payment(string $payment_id, string $payment_amount, int $cash_adjustment = CASH_ADJUSTMENT_FALSE): void
{
$payments = $this->get_payments();
if(isset($payments[$payment_id]))
{
//payment_method already exists, add to payment_amount
$payments[$payment_id]['payment_amount'] = bcadd($payments[$payment_id]['payment_amount'], $payment_amount);
}
else
{
//add to existing array
$payment = [
$payment_id => [
'payment_type' => $payment_id,
'payment_amount' => $payment_amount,
'cash_refund' => 0,
'cash_adjustment' => $cash_adjustment
]
];
$payments += $payment;
}
if($this->session->get('cash_mode'))
{
if($this->session->get('cash_rounding') && $payment_id != lang('Sales.cash') && $payment_id != lang('Sales.cash_adjustment'))
{
$this->session->set('cash_mode', CASH_MODE_FALSE);
}
}
$this->set_payments($payments);
}
/**
* Multiple Payments
*/
public function edit_payment(string $payment_id, float $payment_amount): bool
{
$payments = $this->get_payments();
if(isset($payments[$payment_id]))
{
$payments[$payment_id]['payment_type'] = $payment_id;
$payments[$payment_id]['payment_amount'] = $payment_amount;
$this->set_payments($payments);
return true;
}
return false;
}
/**
* Delete the selected payment from the payment array and if cash rounding is enabled
* and the payment type is one of the cash types then automatically delete the other
* @param string $payment_id
*/
public function delete_payment(string $payment_id): void
{
$payments = $this->get_payments();
$decoded_payment_id = urldecode($payment_id);
unset($payments[$decoded_payment_id]);
$cash_rounding = $this->reset_cash_rounding();
if($cash_rounding)
{
if($decoded_payment_id == lang('Sales.cash'))
{
unset($payments[lang('Sales.cash_adjustment')]);
}
if($decoded_payment_id == lang('Sales.cash_adjustment'))
{
unset($payments[lang('Sales.cash')]);
}
}
$this->set_payments($payments);
}
/**
* Determines if cash rounding should be a consideration for this site
* It also set resets the cash mode to disabled which will then be re-evaluated when
* retrieving payments.
*/
public function reset_cash_rounding(): int
{
$cash_rounding_code = $this->config['cash_rounding_code'];
if(cash_decimals() < totals_decimals() || $cash_rounding_code == Rounding_mode::HALF_FIVE)
{
$cash_rounding = 1;
}
else
{
$cash_rounding = 0;
}
$this->session->set('cash_rounding', $cash_rounding);
$this->session->set('cash_mode', CASH_MODE_FALSE);
return $cash_rounding;
}
/**
* @param string $total
* @return string
*/
public function check_for_cash_rounding(string $total): string
{
$cash_decimals = cash_decimals();
$cash_rounding_code = $this->config['cash_rounding_code'];
return Rounding_mode::round_number($cash_rounding_code, (float)$total, $cash_decimals);
}
public function clear_payments(): void
{
$this->set_payments([]);
}
} }

View File

@@ -19,25 +19,26 @@ class Token_lib
*/ */
public function render(string $tokened_text, array $tokens = [], $save = true): string public function render(string $tokened_text, array $tokens = [], $save = true): string
{ {
// Apply the transformation for the "%" tokens if any are used $config = config(OSPOS::class)->settings;
if(strpos($tokened_text, '%') !== false) $formatter = new IntlDateFormatter(
$config['number_locale'], // Locale
IntlDateFormatter::FULL, // Date type
IntlDateFormatter::FULL // Time type
);
//Apply the transformation for the "%" tokens if any are used
if(str_contains($tokened_text, '%'))
{ {
$tokened_text = strftime($tokened_text); //TODO: these need to be converted to IntlDateFormatter::format()
$tokened_text = $formatter->format(new DateTime());
} }
// Call scan to build an array of all of the tokens used in the text to be transformed //Call scan to build an array of all tokens used in the text to be transformed
$token_tree = $this->scan($tokened_text); $token_tree = $this->scan($tokened_text);
if(empty($token_tree)) if(empty($token_tree))
{ {
if(strpos($tokened_text, '%') !== false) return str_contains($tokened_text, '%') ? $formatter->format(new DateTime()) : $tokened_text;
{
return strftime($tokened_text);
}
else
{
return $tokened_text;
}
} }
$token_values = []; $token_values = [];

View File

@@ -547,7 +547,7 @@ class Attribute extends Model
{ {
$builder = $this->db->table('attribute_definitions'); $builder = $this->db->table('attribute_definitions');
$success = $builder->insert($definition_data); $success = $builder->insert($definition_data);
$definition_data['definition_id'] = $this->getInsertID(); $definition_data['definition_id'] = $this->db->insertID();
} }
} }
@@ -875,7 +875,7 @@ class Attribute extends Model
$builder->set(["attribute_$data_type" => $attribute_value]); $builder->set(["attribute_$data_type" => $attribute_value]);
$builder->insert(); $builder->insert();
$attribute_id = $this->getInsertID(); $attribute_id = $this->db->insertID();
} }
$data = [ $data = [

View File

@@ -43,7 +43,6 @@ class Item extends Model
'hsn_code' 'hsn_code'
]; ];
/** /**
* Determines if a given item_id is an item * Determines if a given item_id is an item
*/ */

View File

@@ -104,7 +104,7 @@ class Receiving extends Model
/** /**
* @throws ReflectionException * @throws ReflectionException
*/ */
public function save_value(array $items, int $supplier_id, int $employee_id, string $comment, string $reference, string $term_days, string $payment_type, int $receiving_id = NEW_ENTRY): int //TODO: $receiving_id gets overwritten before it's evaluated. It doesn't make sense to pass this here. public function save_value(array $items, int $supplier_id, int $employee_id, string $comment, string $reference, string $payment_type, int $receiving_id = NEW_ENTRY): int //TODO: $receiving_id gets overwritten before it's evaluated. It doesn't make sense to pass this here.
{ {
$attribute = model(Attribute::class); $attribute = model(Attribute::class);
$inventory = model('Inventory'); $inventory = model('Inventory');
@@ -123,8 +123,7 @@ class Receiving extends Model
'employee_id' => $employee_id, 'employee_id' => $employee_id,
'payment_type' => $payment_type, 'payment_type' => $payment_type,
'comment' => $comment, 'comment' => $comment,
'reference' => $reference, 'reference' => $reference
'term_days' => $term_days
]; ];
//Run these queries as a transaction, we want to make sure we do all or nothing //Run these queries as a transaction, we want to make sure we do all or nothing
@@ -188,7 +187,7 @@ class Receiving extends Model
$inventory->insert($inv_data, false); $inventory->insert($inv_data, false);
$attribute->copy_attribute_links($item_data['item_id'], 'receiving_id', $receiving_id); $attribute->copy_attribute_links($item_data['item_id'], 'receiving_id', $receiving_id);
// $supplier = $supplier->get_info($supplier_id); //TODO: supplier is never used after this. $supplier = $supplier->get_info($supplier_id); //TODO: supplier is never used after this.
} }
$this->db->transComplete(); $this->db->transComplete();
@@ -196,153 +195,6 @@ class Receiving extends Model
return $this->db->transStatus() ? $receiving_id : -1; return $this->db->transStatus() ? $receiving_id : -1;
} }
/**
* Save a requisition to the `ospos_receivings` and `ospos_receivings_items` tables
* and update stock quantities in the respective locations.
*
* @throws ReflectionException
*/
public function save_requisition(array $items, int $employee_id, string $comment, string $reference, int $stock_source, int $stock_destination): int
{
$inventory = model('Inventory');
$item_quantity_model = model(Item_quantity::class);
if (count($items) == 0) {
return -1; // No items to save
}
// Prepare the receiving data
$receivings_data = [
'receiving_time' => date('Y-m-d H:i:s'),
'employee_id' => $employee_id,
'comment' => $comment,
'reference' => $reference,
'total' => 0, // This will be updated later
'amount_change' => 0,
'amount_tendered' => 0,
'operation_type' => 'Requisition',
];
// Run these queries as a transaction
$this->db->transStart();
// Insert into `ospos_receivings`
$builder = $this->db->table('ospos_receivings');
$builder->insert($receivings_data);
$receiving_id = $this->db->insertID();
if (!$receiving_id) {
log_message('error', 'Failed to insert requisition header: ' . print_r($receivings_data, true));
$this->db->transRollback();
return -1;
}
// Insert items into `ospos_receivings_items`
$builder = $this->db->table('ospos_receivings_items');
$total_cost = 0;
foreach ($items as $item_data) {
$receivings_items_data = [
'receiving_id' => $receiving_id,
'item_id' => $item_data['item_id'],
'line' => $item_data['line'],
'description' => $item_data['description'] ?? '',
'serialnumber' => $item_data['serialnumber'] ?? '',
'quantity_purchased' => $item_data['quantity'],
'item_cost_price' => $item_data['price'],
'item_unit_price' => $item_data['price'],
'discount' => $item_data['discount'] ?? 0,
'discount_type' => $item_data['discount_type'] ?? 0,
'item_location' => $item_data['item_location'] ?? 1,
'receiving_quantity' => $item_data['receiving_quantity'] ?? 1,
];
$builder->insert($receivings_items_data);
if (!$this->db->affectedRows()) {
log_message('error', 'Failed to insert requisition item: ' . print_r($receivings_items_data, true));
$this->db->transRollback();
return -1;
}
// Calculate the total cost
$total_cost += ($item_data['price'] * $item_data['quantity']) - ($item_data['discount'] ?? 0);
// Update stock quantities
$item_id = $item_data['item_id'] > 0 ? $item_data['item_id'] : 0;
$quantity = $item_data['quantity'] > 0 ? $item_data['quantity'] : 0;
if ($item_id === 0 || $quantity === 0) {
continue; // Skip if item or quantity is invalid
}
// Subtract from stock at the source
$source_quantity = $item_quantity_model->get_item_quantity($item_id, $stock_source);
$item_quantity_model->save_value([
'quantity' => $source_quantity->quantity - $quantity,
'item_id' => $item_id,
'location_id' => $stock_source,
], $item_id, $stock_source);
// Add to stock at the destination
$destination_quantity = $item_quantity_model->get_item_quantity($item_id, $stock_destination);
$item_quantity_model->save_value([
'quantity' => $destination_quantity->quantity + $quantity,
'item_id' => $item_id,
'location_id' => $stock_destination,
], $item_id, $stock_destination);
// Register inventory for the outgoing location (only if not already registered)
$recv_remarks = 'REQ ' . $receiving_id;
$inv_data_source = [
'trans_date' => date('Y-m-d H:i:s'),
'trans_items' => $item_id,
'trans_user' => $employee_id,
'trans_location' => $stock_source,
'trans_comment' => $recv_remarks . ' OUT',
'trans_inventory' => -$quantity,
];
$existing_source = $inventory->where([
'trans_items' => $item_id,
'trans_location' => $stock_source,
'trans_comment' => $recv_remarks . ' OUT'
])->countAllResults();
if ($existing_source === 0) {
$inventory->insert($inv_data_source, false);
}
// Register inventory for the incoming location (only if not already registered)
$inv_data_destination = [
'trans_date' => date('Y-m-d H:i:s'),
'trans_items' => $item_id,
'trans_user' => $employee_id,
'trans_location' => $stock_destination,
'trans_comment' => $recv_remarks . ' IN',
'trans_inventory' => $quantity,
];
$existing_destination = $inventory->where([
'trans_items' => $item_id,
'trans_location' => $stock_destination,
'trans_comment' => $recv_remarks . ' IN'
])->countAllResults();
if ($existing_destination === 0) {
$inventory->insert($inv_data_destination, false);
}
}
// Update the total cost in ospos_receivings
$this->db->table('ospos_receivings')
->where('receiving_id', $receiving_id)
->update(['total' => $total_cost]);
if (!$this->db->transComplete()) {
log_message('error', 'Transaction failed for requisition: ' . print_r($receivings_data, true));
return -1;
}
return $receiving_id;
}
/** /**
* @throws ReflectionException * @throws ReflectionException
@@ -512,9 +364,4 @@ class Receiving extends Model
$this->db->query($sql); $this->db->query($sql);
} }
public function save_payment(array $payment_data): bool
{
return $this->db->table('ospos_receivings_payments')->insert($payment_data);
}
} }

View File

@@ -143,7 +143,7 @@
?> ?>
<tr> <tr>
<td colspan="3" style='text-align:right;'><?= lang('Sales.amount_tendered') ?></td> <td colspan="3" style='text-align:right;'><?= lang('Sales.amount_tendered') ?></td>
<td><div class="total-value">0.00</div></td> <td><div class="total-value"><?= to_currency($amount_tendered) ?></div></td>
</tr> </tr>
<tr> <tr>

View File

@@ -155,76 +155,77 @@ if (isset($success))
<td><?= anchor("$controller_name/deleteItem/$line", '<span class="glyphicon glyphicon-trash"></span>') ?></td> <td><?= anchor("$controller_name/deleteItem/$line", '<span class="glyphicon glyphicon-trash"></span>') ?></td>
<td><?= esc($item['item_number']) ?></td> <td><?= esc($item['item_number']) ?></td>
<td style="text-align:center;"> <td style="text-align:center;">
<?= esc($item['name'] . ' ' . implode(' ', [$item['attribute_values'], $item['attribute_dtvalues']])) ?><br /> <?= 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 ' . $item['stock_name'] . ']' ?>
<?= form_hidden('location', (string)$item['item_location']) ?> <?= form_hidden('location', (string)$item['item_location']) ?>
</td> </td>
<?php if ($items_module_allowed && $mode != 'requisition') { ?> <?php
<td><?= form_input([ if ($items_module_allowed && $mode != 'requisition')
{
?>
<td><?= form_input ([
'name' => 'price', 'name' => 'price',
'class' => 'form-control input-sm', 'class' => 'form-control input-sm',
'value' => (string)to_currency_no_money($item['price']), 'value' => to_currency_no_money($item['price']),
'onClick' => 'this.select();' 'onClick' => 'this.select();'
]) ?></td> ]) ?></td>
<?php } else { ?> <?php
}
else
{
?>
<td> <td>
<?= (string)$item['price'] ?> <?= $item['price'] ?>
<?= form_hidden('price', (string)to_currency_no_money($item['price'])) ?> <?= form_hidden('price', to_currency_no_money($item['price'])) ?>
</td> </td>
<?php } ?> <?php
}
?>
<td><?= form_input([ <td><?= form_input (['name' => 'quantity', 'class' => 'form-control input-sm', 'value' => to_quantity_decimals($item['quantity']),'onClick' => 'this.select();']) ?></td>
'name' => 'quantity',
'class' => 'form-control input-sm',
'value' => (string)to_quantity_decimals($item['quantity']),
'onClick' => 'this.select();'
]) ?></td>
<td><?= form_dropdown( <td><?= form_dropdown(
'receiving_quantity', 'receiving_quantity',
$item['receiving_quantity_choices'], $item['receiving_quantity_choices'],
(string)$item['receiving_quantity'], $item['receiving_quantity'],
['class' => 'form-control input-sm'] ['class' => 'form-control input-sm']
) ?></td> ) ?></td>
<?php if ($items_module_allowed && $mode != 'requisition') { ?> <?php
if ($items_module_allowed && $mode != 'requisition')
{
?>
<td> <td>
<div class="input-group"> <div class="input-group">
<?= form_input([ <?= form_input (['name' => 'discount', 'class' => 'form-control input-sm', 'value' => $item['discount_type'] ? to_currency_no_money($item['discount']) : to_decimals($item['discount']), 'onClick' => 'this.select();']) ?>
'name' => 'discount', <span class="input-group-btn">
'class' => 'form-control input-sm', <?= form_checkbox ([
'value' => (string)($item['discount_type'] ? to_currency_no_money($item['discount']) : to_decimals($item['discount'])), 'id' => 'discount_toggle',
'onClick' => 'this.select();' 'name' => 'discount_toggle',
'value' => 1,
'data-toggle' => "toggle",
'data-size' => 'small',
'data-onstyle' => 'success',
'data-on' => '<b>' . $config['currency_symbol'] .'</b>',
'data-off' => '<b>%</b>',
'data-line' => $line,
'checked' => $item['discount_type'] == 1
]) ?> ]) ?>
<span class="input-group-btn"> </span>
<?= form_checkbox([ </div>
'id' => 'discount_toggle',
'name' => 'discount_toggle',
'value' => 1,
'data-toggle' => "toggle",
'data-size' => 'small',
'data-onstyle' => 'success',
'data-on' => '<b>' . $config['currency_symbol'] . '</b>',
'data-off' => '<b>%</b>',
'data-line' => $line,
'checked' => $item['discount_type'] == 1
]) ?>
</span>
</div>
</td>
<?php } else { ?>
<td><?= (string)$item['discount'] ?></td>
<?= form_hidden('discount', (string)$item['discount']) ?>
<?php } ?>
<td>
<?= to_currency(
($item['discount_type'] == PERCENT)
? $item['price'] * $item['quantity'] * $item['receiving_quantity'] - $item['price'] * $item['quantity'] * $item['receiving_quantity'] * $item['discount'] / 100
: $item['price'] * $item['quantity'] * $item['receiving_quantity'] - $item['discount']
) ?>
</td> </td>
<td><a href="javascript:$('#<?= esc("cart_$line", 'js') ?>').submit();" title=<?= lang(ucfirst($controller_name) . '.update') ?>><span class="glyphicon glyphicon-refresh"></span></a></td> <?php
}
else
{
?>
<td><?= $item['discount'] ?></td>
<?= form_hidden('discount', $item['discount']) ?>
<?php
}
?>
<td>
<?= to_currency(($item['discount_type'] == PERCENT) ? $item['price']*$item['quantity']*$item['receiving_quantity'] - $item['price'] * $item['quantity'] * $item['receiving_quantity'] * $item['discount'] / 100 : $item['price']*$item['quantity']*$item['receiving_quantity'] - $item['discount']) ?></td>
<td><a href="javascript:$('#<?= esc("cart_$line", 'js') ?>').submit();" title=<?= lang(ucfirst($controller_name) .'.update') ?> ><span class="glyphicon glyphicon-refresh"></span></a></td>
</tr> </tr>
<tr> <tr>
<?php <?php
@@ -374,53 +375,6 @@ if (isset($success))
</tr> </tr>
</table> </table>
<?= form_open("$controller_name/addPayment", ['id' => 'add_payment_form', 'class' => 'form-horizontal']) ?>
<section class="mainContent">
<div class="formContainer">
<form action="">
<fieldset class="fieldInput">
<div class="dropdown">
<?= form_dropdown('payment_type', $payment_options, $selected_payment_type, ['id' => 'payment_types', 'class' => 'dropdown-toggle', 'data-style' => 'btn-default btn-sm', 'data-width' => 'fit']) ?>
</div>
<?= form_input (['name' => 'amount_tendered', 'id' => 'amount_tendered', 'class' => 'form-input', 'value' => to_currency_no_money($amount_due), 'size' => '5', 'tabindex' => ++$tabindex, 'onClick' => 'this.select();']) ?>
<?= form_input (['name' => 'amount_tendered', 'id' => 'amount_tendered', 'class' => 'form-input', 'disabled' => true, 'value' => to_currency_no_money($amount_due), 'size' => '5', 'tabindex' => ++$tabindex]) ?>
<button type="submit" class="form-submit" id='add_payment_button' tabindex="<?= ++$tabindex ?>"><i class="bi bi-credit-card-fill"></i> Pagar</button>
</fieldset>
</form>
</div>
</section>
<?= form_close() ?>
<table class="sales_table_100" id="registersss">
<thead>
<tr>
<th style="width: 10%;"><?= lang('Common.delete') ?></th>
<th style="width: 60%;"><?= lang(ucfirst($controller_name) .'.payment_type') ?></th>
<th style="width: 20%;"><?= lang(ucfirst($controller_name) .'.payment_amount') ?></th>
</tr>
</thead>
<tbody id="payment_contents">
<?php
$payment_types = [];
foreach($payments as $payment_id => $payment)
{
$payment_types[] = $payment['payment_type'];
?>
<tr>
<td><?= anchor("$controller_name/deletePayment/$payment_id", '<span class="glyphicon glyphicon-trash"></span>') ?></td>
<td><?= esc($payment['payment_type']) ?></td>
<td style="text-align: right;"><?= to_currency($payment['payment_amount']) ?></td>
</tr>
<?php
}
$payment_types_string = implode(', ', $payment_types);
?>
</tbody>
</table>
<?php <?php
if(count($cart) > 0) if(count($cart) > 0)
{ {

View File

@@ -53,6 +53,8 @@
.bootstrapTable({ .bootstrapTable({
columns: <?= transform_headers(esc($headers), true, false) ?>, columns: <?= transform_headers(esc($headers), true, false) ?>,
stickyHeader: true, stickyHeader: true,
stickyHeaderOffsetLeft: $('#table').offset().left + 'px',
stickyHeaderOffsetRight: $('#table').offset().right + 'px',
pageSize: <?= $config['lines_per_page'] ?>, pageSize: <?= $config['lines_per_page'] ?>,
sortable: true, sortable: true,
showExport: true, showExport: true,

View File

@@ -62,6 +62,8 @@
.bootstrapTable({ .bootstrapTable({
columns: <?= transform_headers(esc($headers['summary']), true) ?>, columns: <?= transform_headers(esc($headers['summary']), true) ?>,
stickyHeader: true, stickyHeader: true,
stickyHeaderOffsetLeft: $('#table').offset().left + 'px',
stickyHeaderOffsetRight: $('#table').offset().right + 'px',
pageSize: <?= $config['lines_per_page'] ?>, pageSize: <?= $config['lines_per_page'] ?>,
pagination: true, pagination: true,
sortable: true, sortable: true,

View File

@@ -31,9 +31,9 @@ gulp.task('clean', function () {
}); });
gulp.task('compress', function() { gulp.task('compress', function() {
const sources = ['app*/**/*', 'public*/**/*', 'vendor*/**/*', '*.md', 'LICENSE', 'docker*', 'Dockerfile', '**/.htaccess', 'writable*/**/*'] ; const sources = ['public/**', 'vendor/**', '*.md', 'LICENSE', 'docker*', 'docker/**', 'Dockerfile', '**/.htaccess', 'writable/*'] ;
gulp.src(sources, {encoding: false}).pipe(tar('opensourcepos.tar')).pipe(gulp.dest('dist')); gulp.src(sources).pipe(tar('opensourcepos.tar')).pipe(gzip()).pipe(gulp.dest('dist'));
return gulp.src(sources, {encoding: false}).pipe(zip('opensourcepos.zip')).pipe(gulp.dest('dist')); return gulp.src(sources).pipe(zip('opensourcepos.zip')).pipe(gulp.dest('dist'));
}); });
// Copy the bootswatch styles into their own folder so OSPOS can select one from the collection // Copy the bootswatch styles into their own folder so OSPOS can select one from the collection

View File

@@ -1,5 +1,5 @@
{ {
"name": "@opensourcepos/opensourcepos", "name": "opensourcepos",
"version": "3.4.0", "version": "3.4.0",
"description": "Open Source Point of Sale is a web based point of sale system written in the PHP language. It uses MySQL as the data storage back-end and has a simple user interface.", "description": "Open Source Point of Sale is a web based point of sale system written in the PHP language. It uses MySQL as the data storage back-end and has a simple user interface.",
"main": "index.php", "main": "index.php",
@@ -10,7 +10,6 @@
"objecttothis <objecttothis - at - gmail.com>", "objecttothis <objecttothis - at - gmail.com>",
"SteveIreland <stevei - at - ruledomain.com>" "SteveIreland <stevei - at - ruledomain.com>"
], ],
"files": ["dist/opensourcepos.$version.tgz"],
"publishConfig": { "publishConfig": {
"registry": "https://npm.pkg.github.com/" "registry": "https://npm.pkg.github.com/"
}, },
@@ -18,10 +17,6 @@
"point-of-sale", "point-of-sale",
"POS" "POS"
], ],
"repository": {
"type": "git",
"url": "https://github.com/opensourcepos/opensourcepos"
},
"scripts": { "scripts": {
"build": "gulp default", "build": "gulp default",
"gulp": "gulp" "gulp": "gulp"

View File

@@ -21,7 +21,8 @@
if (button_id == 'submit' && (!submitted && btn_id != "btnNew")) { if (button_id == 'submit' && (!submitted && btn_id != "btnNew")) {
form.submit(); form.submit();
$('#submit').prop('disabled', true).css('opacity', 0.5);
validator.valid() && $('#submit').prop('disabled', true).css('opacity', 0.5);
} }
return false; return false;
} }
@@ -214,6 +215,8 @@
.bootstrapTable($.extend(options, { .bootstrapTable($.extend(options, {
columns: options.headers, columns: options.headers,
stickyHeader: true, stickyHeader: true,
stickyHeaderOffsetLeft: $('#table').offset().left + 'px',
stickyHeaderOffsetRight: $('#table').offset().right + 'px',
url: options.resource + '/search', url: options.resource + '/search',
sidePagination: 'server', sidePagination: 'server',
selectItemName: 'btSelectItem', selectItemName: 'btSelectItem',