Compare commits

..

3 Commits

Author SHA1 Message Date
andriux1990
b64a93e483 Merging the postRequisitionComplete and complete functions 2025-01-18 20:58:26 -06:00
andriux1990
7f073bce8f Requisition (transfers) and payment methods in Receivings 2025-01-18 16:39:25 -06:00
jekkos
6ab72ce5c2 Fix for requisitions (#4147) 2025-01-15 23:47:32 +01:00
71 changed files with 6141 additions and 2511 deletions

View File

@@ -49,3 +49,22 @@ deploy:
on:
branch: master
- provider: releases
edge: true
file: dist/opensourcepos.$version.$rev.zip
name: "OpensourcePos $version"
release_notes_file: CHANGELOG.md
prerelease: true
user: jekkos
overwrite: true
api_key:
secure: "KOukL8IFf/uL/BjMyCSKjf2vylydjcWqgEx0eMqFCg3nZ4ybMaOwPORRthIfyT72/FvGX/aoxxEn0uR/AEtb+hYQXHmNS+kZdX72JCe8LpGuZ7FJ5X+Eo9mhJcsmS+smd1sC95DySSc/GolKPo+0WtJYONY/xGCLxm+9Ay4HREg="
branches:
except:
- unstable
- /unstable.*/
on:
tags: true
branch: master

View File

@@ -1,5 +1,4 @@
[unreleased]: https://github.com/opensourcepos/opensourcepos/compare/3.4.0...HEAD
[3.4.0]: https://github.com/opensourcepos/opensourcepos/compare/3.3.9...3.4.0
[unreleased]: https://github.com/opensourcepos/opensourcepos/compare/3.3.9...HEAD
[3.3.9]: https://github.com/opensourcepos/opensourcepos/compare/3.3.8...3.3.9
[3.3.8]: https://github.com/opensourcepos/opensourcepos/compare/3.3.7...3.3.8
[3.3.7]: https://github.com/opensourcepos/opensourcepos/compare/3.3.6...3.3.7
@@ -32,16 +31,6 @@ All notable changes to this project will be documented in this file.
## [Unreleased]
## [3.4.0] - 2025-02-06
- Translation updates (Spanish, Indonesian, Swedish, Urdu, Chinese, Thai, French, Dutch)
- PHP 8.x support
- Security fixes (XSS, SQLi)
- Migration to Gulp as buildsystem
- Decimal validation fix
- Sticky header fix
- Receipt sent as attachment
- Barcode generation library upgrade
- Bump framework to CodeIgniter `4.x.x`
- Improve security performance against bots

View File

@@ -1,20 +1,21 @@
## Server Requirements
- PHP version `8.1` to `8.3` are supported, PHP version `≤7.4` is NOT supported. Please note that PHP needs to have the extensions `php-json`, `php-gd`, `php-bcmath`, `php-intl`, `php-openssl`, `php-mbstring` , `php-curl` and `php-xml` installed and enabled. An unstable master build can be downloaded in the releases section.
- MySQL `5.7` is supported, also MariaDB replacement `10.x` is supported and might offer better performance.
- 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.
- 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).
- Raspberry PI based installations proved to work, see [wiki page here](<https://github.com/opensourcepos/opensourcepos/wiki/Installing-on-Raspberry-PI---Orange-PI-(Headless-OSPOS)>).
- For Windows based installations please read [the wiki](https://github.com/opensourcepos/opensourcepos/wiki). There are closed issues about this subject, as this topic has been covered a lot.
## Local install
First of all, if you're seeing the message `system folder missing` after launching your browser, or cannot find `database.sql`, that most likely means you have cloned the repository and have not built the project. To build the project from a source commit point instead of from an official release check out [Building OSPOS](BUILD.md). Otherwise, continue with the following steps.
First of all, if you're seeing the message `system folder missing` after launching your browser, or cannot find `database.php`, that most likely means you have cloned the repository and have not built the project. To build the project from a source commit point instead of from an official release check out [Building OSPOS](BUILD.md). Otherwise, continue with the following steps.
1. Download the a [pre-release for a specific branch](https://github.com/opensourcepos/opensourcepos/releases) or the latest stable [from GitHub here](https://github.com/opensourcepos/opensourcepos/releases). A repository clone will not work unless know how to build the project.
1. Download the a [pre-release for a specific branch](https://github.com/opensourcepos/opensourcepos/packages/1047637) or the latest stable [from GitHub here](https://github.com/opensourcepos/opensourcepos/releases). A repository clone will not work unless know how to build the project.
2. Create/locate a new MySQL database to install Open Source Point of Sale into.
3. Execute the file `database/database.sql` to create the tables needed.
4. Unzip and upload Open Source Point of Sale files to the web-server.
5. Open `app/Config/database.php` and modify credentials to connect to your database if needed.
6. Open `app/Config/config.php` and swap the encryption key with your own.
7. Go to your install `public` dir via the browser.
8. Log in using
- Username: admin

26
LICENSE
View File

@@ -1,30 +1,30 @@
MIT License
Copyright (c) 2013-2025 jekkos
Copyright (c) 2017-2025 objecttothis
Copyright (c) 2017-2024 Steve Ireland
Copyright (c) 2017-2025 odiea
Copyright (c) 2018-2024 WebShells
Copyright (c) 2021-2025 BudsieBuds
Copyright (c) 2013-2023 jekkos
Copyright (c) 2015-2023 FrancescoUK (aka daN4cat)
Copyright (c) 2015-2022 Aamir Shahzad (aka asakpke), RoshanTech, eSite.pk
Copyright (c) 2019-2020 Andriux1990
Copyright (c) 2018-2019 Erasto Marroquin (aka Erastus)
Copyright (c) 2017-2023 Steve Ireland
Copyright (c) 2017-2023 objecttothis
Copyright (c) 2017-2023 odiea
Copyright (c) 2017-2023 WebShells
Copyright (c) 2020-2021 Andriux1990
Copyright (c) 2021 BudsieBuds
Copyright (c) 2019 Loyd Jayme (aka loydjayme25)
Copyright (c) 2018 Erasto Marroquin (aka Erastus)
Copyright (c) 2018 Nathan Sas (aka nathanzky)
Copyright (c) 2018 Emilio Silva (aka emi-silva)
Copyright (c) 2016-2017 Ramkrishna Mondal (aka RamkrishnaMondal)
Copyright (c) 2016-2017 Jorge Colmenarez (aka jlctmaster), frontuari.com
Copyright (c) 2016-2017 Jesus Guerrero Botella (aka i92guboj)
Copyright (c) 2017 Jesus Guerrero Botella (aka i92guboj)
Copyright (c) 2017 Deep Shah (aka deepshah)
Copyright (c) 2017 Joshua Fernandez (aka joshua1234511)
Copyright (c) 2017 asadjaved63
Copyright (c) 2016-2017 Ramkrishna Mondal (aka RamkrishnaMondal)
Copyright (c) 2016-2017 Jorge Colmenarez (aka jlctmaster), frontuari.com
Copyright (c) 2016 Rinaldy@dbarber (aka rnld26)
Copyright (c) 2015-2022 Aamir Shahzad (aka asakpke), RoshanTech, eSite.pk
Copyright (c) 2015 Toni Haryanto (aka yllumi)
Copyright (c) 2012-2014 pappastech
Copyright (c) 2013 Rob Garrison
Copyright (c) 2013 Parq
Copyright (c) 2013 Ramel
Copyright (c) 2012-2014 pappastech
Copyright (c) 2012 Alain
Permission is hereby granted, free of charge, to any person obtaining a copy

View File

@@ -94,11 +94,11 @@ NOTE: If you're running non-release code, please make sure you always run the la
- Apache server configurations are SysAdmin issues and not strictly related to OSPOS. Please make sure you can show a "Hello world" HTML page before pointing to OSPOS public directory. Make sure `.htaccess` is correctly configured.
- If the avatar pictures are not shown in items or at item save you get an error, please make sure your `writable` and subdirs are assigned to the correct owner and the access permission is set to `750`.
- If the avatar pictures are not shown in items or at item save you get an error, please make sure your `public` and subdirs are assigned to the correct owner and the access permission is set to `750`.
- If you install OSPOS in Docker behind a proxy that performs `ssloffloading`, you can enable the URL generated to be HTTPS instead of HTTP, by activating the environment variable `FORCE_HTTPS = 1`.
- If you install OSPOS behind a proxy and OSPOS constantly drops your session, consider whitelisting the proxy IP address by setting `public array $proxyIPs = [];` in the [main PHP config file](https://github.com/opensourcepos/opensourcepos/blob/master/app/Config/App.php).
- If you install OSPOS behind a proxy and OSPOS constantly drops your session, consider whitelisting the proxy IP address by setting `$config['proxy_ips'] = '<proxy ip>';` in the [main PHP config file](https://github.com/opensourcepos/opensourcepos/blob/master/application/config/config.php). In extreme instances, changing `$config['sess_match_ip'] = true;` to `FALSE` may also help.
- If you have suhosin installed and face an issue with CSRF, please make sure you read [issue #1492](https://github.com/opensourcepos/opensourcepos/issues/1492).
@@ -137,7 +137,7 @@ Any person or company found breaching the license agreement might find a bunch o
## 🙏 Credits
| <div align="center">DigitalOcean</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://github.com/user-attachments/assets/fbbf7433-ed35-407d-8946-fd03d236d350" 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> |
| Many thanks to [DigitalOcean](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. |
| <div align="center">DigitalOcean</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> |
| 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. |

View File

@@ -1,8 +1,5 @@
## How to Upgrade
> [!WARNING]
> Not updated for upcoming CodeIgniter4 release (3.4.0 and subsequent versions).
1. Back up all your current database and OSPOS code.
2. Make sure you have a copy of `application/config/config.php` and `application/config/database.php`.
3. Remove all directories.

View File

@@ -12,7 +12,7 @@ class App extends BaseConfig
*
* @var string
*/
public string $application_version = '3.4.0';
public string $application_version = '3.4.0-dev';
/**
* This is the commit hash for the version you are currently using.

View File

@@ -109,7 +109,7 @@ class OSPOSRules
private function installation_check(): bool
{
$installed_extensions = implode(', ', get_loaded_extensions());
$required_extensions = ['bcmath', 'intl', 'gd', 'openssl', 'mbstring', 'curl', 'xml', 'json'];
$required_extensions = ['bcmath', 'intl', 'gd', 'openssl', 'mbstring', 'curl'];
$pattern = '/';
foreach($required_extensions as $extension)
@@ -140,6 +140,22 @@ class OSPOSRules
*/
public function decimal_locale(string $candidate, ?string &$error = null): bool
{
return parse_decimals($candidate) !== false;
$validation = Services::validation();
$validation->setRules([
'candidate' => 'decimal'
]);
$data = [
'candidate' => $candidate
];
if (!$validation->run($data))
{
$error = $validation->getErrors();
return false;
}
return true;
}
}

View File

@@ -41,7 +41,7 @@ class Attributes extends Secure_Controller
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
$offset = $this->request->getGet('offset', FILTER_SANITIZE_NUMBER_INT);
$sort = $this->sanitizeSortColumn(attribute_definition_headers(), $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'definition_id');
$sort = $this->sanitizeSortColumn(ATTRIBUTE_DEFINITION_HEADERS, $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'definition_id');
$order = $this->request->getGet('order', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$attributes = $this->attribute->search($search, $limit, $offset, $sort, $order);
@@ -67,8 +67,8 @@ class Attributes extends Secure_Controller
$success = $this->attribute->saveAttributeValue(
html_entity_decode($this->request->getPost('attribute_value')),
$this->request->getPost('definition_id', FILTER_SANITIZE_NUMBER_INT),
$this->request->getPost('item_id', FILTER_SANITIZE_NUMBER_INT) ?? false,
$this->request->getPost('attribute_id', FILTER_SANITIZE_NUMBER_INT) ?? false
$this->request->getPost('item_id', FILTER_SANITIZE_NUMBER_INT),
$this->request->getPost('attribute_id', FILTER_SANITIZE_NUMBER_INT)
);
echo json_encode(['success' => $success != 0]);
@@ -231,15 +231,14 @@ class Attributes extends Secure_Controller
}
/**
* AJAX called function to delete an attribute value. This is called when a dropdown item is removed.
*
* @param string $attribute_value
* AJAX called function to delete an attribute value. This is never called in the code. Perhaps it was boiler plate code that just isn't needed?
* @param int $attribute_id
* @return bool
* @noinspection PhpUnused
*/
public function delete_value(string $attribute_value): bool
public function delete_value(int $attribute_id): bool //TODO: This function appears to never be used in the codebase. Is it needed?
{
return $this->attribute->delete_value($attribute_value, NO_DEFINITION_ID);
return $this->attribute->delete_value($attribute_id, NO_DEFINITION_ID);
}
/**

View File

@@ -46,7 +46,7 @@ class Cashups extends Secure_Controller
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
$offset = $this->request->getGet('offset', FILTER_SANITIZE_NUMBER_INT);
$sort = $this->sanitizeSortColumn(cashup_headers(), $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'cashup_id');
$sort = $this->sanitizeSortColumn(CASHUPS_HEADERS, $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'cashup_id');
$order = $this->request->getGet('order', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$filters = [
'start_date' => $this->request->getGet('start_date', FILTER_SANITIZE_FULL_SPECIAL_CHARS), //TODO: Is this the best way to filter dates

View File

@@ -82,7 +82,7 @@ class Config extends Secure_Controller
$license[$i]['title'] = 'Open Source Point Of Sale ' . config('App')->application_version;
if (file_exists('license/LICENSE')) {
$license[$i]['text'] = file_get_contents('license/LICENSE', false, null, 0, 3000);
$license[$i]['text'] = file_get_contents('license/LICENSE', false, null, 0, 2000);
} else {
$license[$i]['text'] = 'LICENSE file must be in OSPOS license directory. You are not allowed to use OSPOS application until the distribution copy of LICENSE file is present.';
}
@@ -139,13 +139,13 @@ class Config extends Secure_Controller
$license[$i]['text'] .= "$val3 ";
}
$license[$i]['text'] .= "\n";
$license[$i]['text'] .= '\n';
} else {
$license[$i]['text'] .= "$key2: $val2\n";
}
}
$license[$i]['text'] .= "\n";
$license[$i]['text'] .= '\n';
} else {
$license[$i]['text'] .= "$key1: $val1\n";
}

View File

@@ -90,7 +90,7 @@ class Customers extends Persons
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
$offset = $this->request->getGet('offset', FILTER_SANITIZE_NUMBER_INT);
$sort = $this->sanitizeSortColumn(customer_headers(), $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'people.person_id');
$sort = $this->sanitizeSortColumn(CUSTOMER_HEADERS, $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'people.person_id');
$order = $this->request->getGet('order', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$customers = $this->customer->search($search, $limit, $offset, $sort, $order);

View File

@@ -30,7 +30,7 @@ class Employees extends Persons
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
$offset = $this->request->getGet('offset', FILTER_SANITIZE_NUMBER_INT);
$sort = $this->sanitizeSortColumn(person_headers(), $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'people.person_id');
$sort = $this->sanitizeSortColumn(PERSON_HEADERS, $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'people.person_id');
$order = $this->request->getGet('order', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$employees = $this->employee->search($search, $limit, $offset, $sort, $order);

View File

@@ -48,7 +48,7 @@ class Expenses extends Secure_Controller
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
$offset = $this->request->getGet('offset', FILTER_SANITIZE_NUMBER_INT);
$sort = $this->sanitizeSortColumn(expense_headers(), $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'expense_id');
$sort = $this->sanitizeSortColumn(EXPENSE_HEADERS, $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'expense_id');
$order = $this->request->getGet('order', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$filters = [
'start_date' => $this->request->getGet('start_date', FILTER_SANITIZE_FULL_SPECIAL_CHARS),

View File

@@ -34,7 +34,7 @@ class Expenses_categories extends Secure_Controller //TODO: Is this class ever u
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
$offset = $this->request->getGet('offset', FILTER_SANITIZE_NUMBER_INT);
$sort = $this->sanitizeSortColumn(expense_category_headers(), $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'expense_category_id');
$sort = $this->sanitizeSortColumn(EXPENSE_CATEGORY_HEADERS, $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'expense_category_id');
$order = $this->request->getGet('order', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$expense_categories = $this->expense_category->search($search, $limit, $offset, $sort, $order);

View File

@@ -35,7 +35,7 @@ class Giftcards extends Secure_Controller
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
$offset = $this->request->getGet('offset', FILTER_SANITIZE_NUMBER_INT);
$sort = $this->sanitizeSortColumn(giftcard_headers(), $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'giftcard_id');
$sort = $this->sanitizeSortColumn(GIFTCARD_HEADERS, $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'giftcard_id');
$order = $this->request->getGet('order', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$giftcards = $this->giftcard->search($search, $limit, $offset, $sort, $order);

View File

@@ -79,7 +79,7 @@ class Item_kits extends Secure_Controller
$search = $this->request->getGet('search') ?? '';
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
$offset = $this->request->getGet('offset', FILTER_SANITIZE_NUMBER_INT);
$sort = $this->sanitizeSortColumn(item_kit_headers(), $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'item_kit_id');
$sort = $this->sanitizeSortColumn(ITEM_KIT_HEADERS, $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'item_kit_id');
$order = $this->request->getGet('order', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$item_kits = $this->item_kit->search($search, $limit, $offset, $sort, $order);

View File

@@ -97,7 +97,7 @@ class Items extends Secure_Controller
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
$offset = $this->request->getGet('offset', FILTER_SANITIZE_NUMBER_INT);
$sort = $this->sanitizeSortColumn(item_headers(), $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'item_id');
$sort = $this->sanitizeSortColumn(ITEM_HEADERS, $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'item_id');
$order = $this->request->getGet('order', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$this->item_lib->set_item_location($this->request->getGet('stock_location'));
@@ -207,7 +207,7 @@ class Items extends Secure_Controller
*/
public function getSuggestLowSell(): void
{
$suggestions = $this->item->get_low_sell_suggestions($this->request->getPostGet('name'));
$suggestions = $this->item->get_low_sell_suggestions($this->request->getPo1stGet('name'));
echo json_encode($suggestions);
}

View File

@@ -213,10 +213,13 @@ class Receivings extends Secure_Controller
$price = parse_decimals($this->request->getPost('price'));
$quantity = parse_quantity($this->request->getPost('quantity'));
$discount = parse_decimals($this->request->getPost('discount'));
$raw_receiving_quantity = parse_quantity($this->request->getPost('receiving_quantity'));
$description = $this->request->getPost('description', FILTER_SANITIZE_FULL_SPECIAL_CHARS); //TODO: Duplicated code
$serialnumber = $this->request->getPost('serialnumber', FILTER_SANITIZE_FULL_SPECIAL_CHARS) ?? '';
$price = filter_var($price, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$quantity = filter_var($quantity, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$discount_type = $this->request->getPost('discount_type', FILTER_SANITIZE_NUMBER_INT);
$discount = $discount_type
? parse_quantity(filter_var($this->request->getPost('discount'), FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION))
@@ -263,6 +266,7 @@ class Receivings extends Secure_Controller
$data['selected_supplier_name'] = !empty($receiving_info['supplier_id']) ? $receiving_info['company_name'] : '';
$data['selected_supplier_id'] = $receiving_info['supplier_id'];
$data['receiving_info'] = $receiving_info;
$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);
}
@@ -324,22 +328,26 @@ class Receivings extends Secure_Controller
*/
public function postComplete(): void
{
$amount_tendered = parse_decimals($this->request->getPost('amount_tendered'));
$data = [];
$data['cart'] = $this->receiving_lib->get_cart();
$data['total'] = $this->receiving_lib->get_total();
$data['transaction_time'] = to_datetime(time());
$data['transaction_time'] = date('Y-m-d H:i:s'); // Fecha y hora actuales
$data['mode'] = $this->receiving_lib->get_mode();
$data['comment'] = $this->receiving_lib->get_comment();
$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['payments'] = $this->receiving_lib->get_payments(); // Obtener pagos del carrito
$data['show_stock_locations'] = $this->stock_location->show_locations('receivings');
$data['stock_location'] = $this->receiving_lib->get_stock_source();
if($this->request->getPost('amount_tendered') != null)
{
$data['amount_tendered'] = parse_decimals($this->request->getPost('amount_tendered'));
$data['amount_change'] = to_currency($data['amount_tendered'] - $data['total']);
if ($this->request->getPost('amount_tendered') != null) {
$data['amount_tendered'] = filter_var($amount_tendered, FILTER_SANITIZE_NUMBER_FLOAT, FILTER_FLAG_ALLOW_FRACTION);
$data['amount_change'] = $data['amount_tendered'] - $data['total'];
} else {
$data['amount_change'] = 0;
}
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
@@ -347,40 +355,62 @@ class Receivings extends Secure_Controller
$data['employee'] = $employee_info->first_name . ' ' . $employee_info->last_name;
$supplier_id = $this->receiving_lib->get_supplier();
if($supplier_id != -1)
{
if ($supplier_id != -1) {
$supplier_info = $this->supplier->get_info($supplier_id);
$data['supplier'] = $supplier_info->company_name; //TODO: duplicated code
$data['supplier'] = $supplier_info->company_name;
$data['first_name'] = $supplier_info->first_name;
$data['last_name'] = $supplier_info->last_name;
$data['supplier_email'] = $supplier_info->email;
$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;
}
else
{
} else {
$data['supplier_location'] = '';
}
}
//SAVE receiving to database
$data['receiving_id'] = 'RECV ' . $this->receiving->save_value($data['cart'], $supplier_id, $employee_id, $data['comment'], $data['reference'], $data['payment_type'], $data['stock_location']);
// Guardar el registro de compra en la base de datos
$receiving_id = $this->receiving->save_value(
$data['cart'],
$supplier_id,
$employee_id,
$data['comment'],
$data['reference'],
$data['term_days'],
$data['payment_type']
);
if($data['receiving_id'] == 'RECV -1')
{
if ($receiving_id == -1) {
$data['error_message'] = lang('Receivings.transaction_failed');
}
else
{
$data['barcode'] = $this->barcode_lib->generate_receipt_barcode($data['receiving_id']);
} else {
$data['receiving_id'] = $receiving_id;
// Calcular el cambio (cash_refund)
$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();
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();
}
@@ -392,23 +422,58 @@ class Receivings extends Secure_Controller
*/
public function postRequisitionComplete(): void
{
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']);
}
$data = [];
$this->postComplete();
}
else
{
$data['error'] = lang('Receivings.error_requisition');
// Check if stock locations are different
if ($this->receiving_lib->get_stock_source() != $this->receiving_lib->get_stock_destination()) {
// Process items in the cart
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']);
}
$this->_reload($data); //TODO: Hungarian notation
}
// Prepare data to complete the requisition
$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);
}
}
/**
@@ -464,7 +529,7 @@ class Receivings extends Secure_Controller
* @param array $data
* @return void
*/
private function _reload(array $data = []): void //TODO: Hungarian notation
private function _reload(array $data = []): void
{
$data['cart'] = $this->receiving_lib->get_cart();
$data['modes'] = ['receive' => lang('Receivings.receiving'), 'return' => lang('Receivings.return')];
@@ -481,15 +546,26 @@ class Receivings extends Secure_Controller
$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['comment'] = $this->receiving_lib->get_comment();
$data['term_days'] = $this->receiving_lib->get_term_days();
$data['reference'] = $this->receiving_lib->get_reference();
$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();
if($supplier_id != -1) //TODO: Duplicated Code... replace -1 with a constant
if($supplier_id != -1)
{
$supplier_info = $this->supplier->get_info($supplier_id);
$data['supplier'] = $supplier_info->company_name;
$data['avatar'] = $supplier_info->avatar;
$data['gender'] = $supplier_info->gender;
$data['first_name'] = $supplier_info->first_name;
$data['last_name'] = $supplier_info->last_name;
$data['supplier_email'] = $supplier_info->email;
@@ -512,9 +588,9 @@ class Receivings extends Secure_Controller
/**
* @throws ReflectionException
*/
public function save(int $receiving_id = -1): void //TODO: Replace -1 with a constant
public function save(int $receiving_id = -1): void
{
$newdate = $this->request->getPost('date', FILTER_SANITIZE_FULL_SPECIAL_CHARS); //TODO: newdate does not follow naming conventions
$newdate = $this->request->getPost('date', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$date_formatter = date_create_from_format($this->config['dateformat'] . ' ' . $this->config['timeformat'], $newdate);
$receiving_time = $date_formatter->format('Y-m-d H:i:s');
@@ -554,8 +630,77 @@ class Receivings extends Secure_Controller
*/
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->_reload(); //TODO: Hungarian Notation
// Recargar la vista
$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

@@ -136,7 +136,7 @@ class Sales extends Secure_Controller
$search = $this->request->getGet('search', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
$offset = $this->request->getGet('offset', FILTER_SANITIZE_NUMBER_INT);
$sort = $this->sanitizeSortColumn(sales_headers(), $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'sale_id');
$sort = $this->sanitizeSortColumn(SALES_HEADERS, $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'sale_id');
$order = $this->request->getGet('order', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$filters = [
@@ -606,7 +606,7 @@ class Sales extends Secure_Controller
}
else
{
if($item_id_or_number_or_item_kit_or_receipt == '' || !$this->sale_lib->add_item($item_id_or_number_or_item_kit_or_receipt, $item_location, $quantity, $discount, $discount_type, PRICE_MODE_STANDARD, null, null, $price))
if(!$this->sale_lib->add_item($item_id_or_number_or_item_kit_or_receipt, $item_location, $quantity, $discount, $discount_type, PRICE_MODE_STANDARD, null, null, $price))
{
$data['error'] = lang('Sales.unable_to_add_item');
}
@@ -984,21 +984,21 @@ class Sales extends Secure_Controller
if(!empty($sale_data['customer_email']))
{
$to = $sale_data['customer_email'];
$number = array_key_exists($type."_number", $sale_data) ? $sale_data[$type."_number"] : "";
$number = $sale_data[$type."_number"];
$subject = lang('Sales.' . $type) . ' ' . $number;
$text = $this->config['invoice_email_message'];
$tokens = [
new Token_invoice_sequence($sale_data['invoice_number']),
new Token_invoice_count('POS ' . $sale_data['sale_id']),
new Token_customer((array)$sale_data)
new Token_customer((object)$sale_data)
];
$text = $this->token_lib->render($text, $tokens);
$sale_data['mimetype'] = mime_content_type(FCPATH . 'uploads/' . $this->config['company_logo']);
// generate email attachment: invoice in pdf format
$view = Services::renderer();
$html = $view->setData($sale_data)->render("sales/$type" . '_email', $sale_data);
$html = $view->render("sales/$type" . '_email', $sale_data);
// load pdf helper
helper (['dompdf', 'file']);
@@ -1040,7 +1040,7 @@ class Sales extends Secure_Controller
$subject = lang('Sales.receipt');
$view = Services::renderer();
$text = $view->setData($sale_data)->render('sales/receipt_email');
$text = $view->render('sales/receipt_email', $sale_data);
$result = $this->email_lib->sendEmail($to, $subject, $text);

View File

@@ -48,7 +48,7 @@ class Suppliers extends Persons
$search = $this->request->getGet('search');
$limit = $this->request->getGet('limit', FILTER_SANITIZE_NUMBER_INT);
$offset = $this->request->getGet('offset', FILTER_SANITIZE_NUMBER_INT);
$sort = $this->sanitizeSortColumn(supplier_headers(), $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'people.person_id');
$sort = $this->sanitizeSortColumn(SUPPLIER_HEADERS, $this->request->getGet('sort', FILTER_SANITIZE_FULL_SPECIAL_CHARS), 'people.person_id');
$order = $this->request->getGet('order', FILTER_SANITIZE_FULL_SPECIAL_CHARS);
$suppliers = $this->supplier->search($search, $limit, $offset, $sort, $order);

View File

@@ -18,15 +18,7 @@ class fix_duplicate_attributes extends Migration
helper('migration');
$foreignKeys = [
'ospos_attribute_links_ibfk_1',
'ospos_attribute_links_ibfk_2',
'ospos_attribute_links_ibfk_3',
'ospos_attribute_links_ibfk_4',
'ospos_attribute_links_ibfk_5'
];
drop_foreign_key_constraints($foreignKeys, 'ospos_attribute_links');
$this->drop_foreign_key_constraints();
execute_script(APPPATH . 'Database/Migrations/sqlscripts/3.4.0_attribute_links_unique_constraint.sql');
}
@@ -65,6 +57,44 @@ class fix_duplicate_attributes extends Migration
}
}
/**
* Drops the foreign key constraints from the attribute_links table.
* This is required to successfully create the generated unique constraint.
*
* @return void
*/
private function drop_foreign_key_constraints(): void
{
$foreignKeys = [
'ospos_attribute_links_ibfk_1',
'ospos_attribute_links_ibfk_2',
'ospos_attribute_links_ibfk_3',
'ospos_attribute_links_ibfk_4',
'ospos_attribute_links_ibfk_5'
];
$current_prefix = $this->db->getPrefix();
$this->db->setPrefix('');
$database_name = $this->db->database;
foreach ($foreignKeys as $fk)
{
$builder = $this->db->table('INFORMATION_SCHEMA.TABLE_CONSTRAINTS');
$builder->select('CONSTRAINT_NAME');
$builder->where('TABLE_SCHEMA', $database_name);
$builder->where('TABLE_NAME', 'ospos_attribute_links');
$builder->where('CONSTRAINT_TYPE', 'FOREIGN KEY');
$builder->where('CONSTRAINT_NAME', $fk);
$query = $builder->get();
if($query->getNumRows() > 0)
{
$this->db->query("ALTER TABLE `ospos_attribute_links` DROP FOREIGN KEY `$fk`");
}
}
$this->db->setPrefix($current_prefix);
}
/**
* Revert a migration step.

View File

@@ -1,29 +0,0 @@
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
use App\Models\Attribute;
use CodeIgniter\Database\ResultInterface;
class Migration_Attributes_fix_cascading_delete extends Migration
{
/**
* Perform a migration step.
*/
public function up(): void
{
helper('migration');
drop_foreign_key_constraints(['ospos_attribute_links_ibfk_1', 'ospos_attribute_links_ibfk_2'], 'ospos_attribute_links');
$this->db->query("ALTER TABLE `ospos_attribute_links` ADD CONSTRAINT `ospos_attribute_links_ibfk_1` FOREIGN KEY (`definition_id`) REFERENCES `ospos_attribute_definitions` (`definition_id`) ON DELETE CASCADE;");
$this->db->query("ALTER TABLE `ospos_attribute_links` ADD CONSTRAINT `ospos_attribute_links_ibfk_2` FOREIGN KEY (`attribute_id`) REFERENCES `ospos_attribute_values` (`attribute_id`) ON DELETE CASCADE;");
}
/**
* Revert a migration step.
*/
public function down(): void
{
}
}

View File

@@ -30,37 +30,4 @@ function execute_script(string $path): void
}
error_log("Migrated to $version");
}
/**
* Drops the foreign key constraints from the attribute_links table.
* This is required to successfully create the generated unique constraint.
*
* @return void
*/
function drop_foreign_key_constraints(array $foreignKeys, string $table): void
{
$db = Database::connect();
$current_prefix = $db->getPrefix();
$db->setPrefix('');
$database_name = $db->database;
foreach ($foreignKeys as $fk)
{
$builder = $db->table('INFORMATION_SCHEMA.TABLE_CONSTRAINTS');
$builder->select('CONSTRAINT_NAME');
$builder->where('TABLE_SCHEMA', $database_name);
$builder->where('TABLE_NAME', $table);
$builder->where('CONSTRAINT_TYPE', 'FOREIGN KEY');
$builder->where('CONSTRAINT_NAME', $fk);
$query = $builder->get();
if($query->getNumRows() > 0)
{
$db->query("ALTER TABLE `$table` DROP FOREIGN KEY `$fk`");
}
}
$db->setPrefix($current_prefix);
}
}

View File

@@ -63,26 +63,22 @@ function transform_headers(array $headers, bool $readonly = false, bool $editabl
return json_encode($result);
}
function sales_headers(): array
{
return [
['sale_id' => lang('Common.id')],
['sale_time' => lang('Sales.sale_time')],
['customer_name' => lang('Customers.customer')],
['amount_due' => lang('Sales.amount_due')],
['amount_tendered' => lang('Sales.amount_tendered')],
['change_due' => lang('Sales.change_due')],
['payment_type' => lang('Sales.payment_type')]
];
}
define("SALES_HEADERS", [
['sale_id' => lang('Common.id')],
['sale_time' => lang('Sales.sale_time')],
['customer_name' => lang('Customers.customer')],
['amount_due' => lang('Sales.amount_due')],
['amount_tendered' => lang('Sales.amount_tendered')],
['change_due' => lang('Sales.change_due')],
['payment_type' => lang('Sales.payment_type')]
]);
/**
* Get the header for the sales tabular view
*/
function get_sales_manage_table_headers(): string
{
$headers = sales_headers();
$headers = SALES_HEADERS;
$config = config(OSPOS::class)->settings;
if($config['invoice_enable'])
@@ -193,24 +189,20 @@ function get_sales_manage_payments_summary(array $payments): string
return $table;
}
function person_headers(): array
{
return [
['people.person_id' => lang('Common.id')],
['last_name' => lang('Common.last_name')],
['first_name' => lang('Common.first_name')],
['email' => lang('Common.email')],
['phone_number' => lang('Common.phone_number')]
];
}
define('PERSON_HEADERS', [
['people.person_id' => lang('Common.id')],
['last_name' => lang('Common.last_name')],
['first_name' => lang('Common.first_name')],
['email' => lang('Common.email')],
['phone_number' => lang('Common.phone_number')]
]);
/**
* Get the header for the people tabular view
*/
function get_people_manage_table_headers(): string
{
$headers = person_headers();
$headers = PERSON_HEADERS;
$employee = model(Employee::class);
$session = session();
@@ -259,25 +251,21 @@ function get_person_data_row(object $person): array
];
}
function customer_headers(): array
{
return [
['people.person_id' => lang('Common.id')],
['last_name' => lang('Common.last_name')],
['first_name' => lang('Common.first_name')],
['email' => lang('Common.email')],
['phone_number' => lang('Common.phone_number')],
['total' => lang('Common.total_spent'), 'sortable' => false]
];
}
define('CUSTOMER_HEADERS', [
['people.person_id' => lang('Common.id')],
['last_name' => lang('Common.last_name')],
['first_name' => lang('Common.first_name')],
['email' => lang('Common.email')],
['phone_number' => lang('Common.phone_number')],
['total' => lang('Common.total_spent'), 'sortable' => false]
]);
/**
* Get the header for the customer tabular view
*/
function get_customer_manage_table_headers(): string
{
$headers = customer_headers();
$headers = CUSTOMER_HEADERS;
$employee = model(Employee::class);
$session = session();
@@ -327,26 +315,23 @@ function get_customer_data_row(object $person, object $stats): array
];
}
function supplier_headers(): array
{
return [
['people.person_id' => lang('Common.id')],
['company_name' => lang('Suppliers.company_name')],
['agency_name' => lang('Suppliers.agency_name')],
['category' => lang('Suppliers.category')],
['last_name' => lang('Common.last_name')],
['first_name' => lang('Common.first_name')],
['email' => lang('Common.email')],
['phone_number' => lang('Common.phone_number')]
];
}
define('SUPPLIER_HEADERS', [
['people.person_id' => lang('Common.id')],
['company_name' => lang('Suppliers.company_name')],
['agency_name' => lang('Suppliers.agency_name')],
['category' => lang('Suppliers.category')],
['last_name' => lang('Common.last_name')],
['first_name' => lang('Common.first_name')],
['email' => lang('Common.email')],
['phone_number' => lang('Common.phone_number')]
]);
/**
* Get the header for the suppliers tabular view
*/
function get_suppliers_manage_table_headers(): string
{
$headers = supplier_headers();
$headers = SUPPLIER_HEADERS;
$employee = model(Employee::class);
$session = session();
@@ -398,19 +383,16 @@ function get_supplier_data_row(object $supplier): array
];
}
function item_headers(): array
{
return [
['items.item_id' => lang('Common.id')],
['item_number' => lang('Items.item_number')],
['name' => lang('Items.name')],
['category' => lang('Items.category')],
['company_name' => lang('Suppliers.company_name')],
['cost_price' => lang('Items.cost_price')],
['unit_price' => lang('Items.unit_price')],
['quantity' => lang('Items.quantity')]
];
}
define('ITEM_HEADERS', [
['items.item_id' => lang('Common.id')],
['item_number' => lang('Items.item_number')],
['name' => lang('Items.name')],
['category' => lang('Items.category')],
['company_name' => lang('Suppliers.company_name')],
['cost_price' => lang('Items.cost_price')],
['unit_price' => lang('Items.unit_price')],
['quantity' => lang('Items.quantity')]
]);
/**
* Get the header for the items tabular view
@@ -421,7 +403,7 @@ function get_items_manage_table_headers(): string
$config = config(OSPOS::class)->settings;
$definition_names = $attribute->get_definitions_by_flags($attribute::SHOW_IN_ITEMS); //TODO: this should be made into a constant in constants.php
$headers = item_headers();
$headers = ITEM_HEADERS;
if($config['use_destination_based_tax'])
{
@@ -551,23 +533,20 @@ function get_item_data_row(object $item): array
return $columns + expand_attribute_values($definition_names, (array) $item) + $icons;
}
function giftcard_headers(): array
{
return [
['giftcard_id' => lang('Common.id')],
['last_name' => lang('Common.last_name')],
['first_name' => lang('Common.first_name')],
['giftcard_number' => lang('Giftcards.giftcard_number')],
['value' => lang('Giftcards.card_value')]
];
}
define('GIFTCARD_HEADERS', [
['giftcard_id' => lang('Common.id')],
['last_name' => lang('Common.last_name')],
['first_name' => lang('Common.first_name')],
['giftcard_number' => lang('Giftcards.giftcard_number')],
['value' => lang('Giftcards.card_value')]
]);
/**
* Get the header for the giftcard tabular view
*/
function get_giftcards_manage_table_headers(): string
{
return transform_headers(giftcard_headers());
return transform_headers(GIFTCARD_HEADERS);
}
/**
@@ -595,24 +574,21 @@ function get_giftcard_data_row(object $giftcard): array
];
}
function item_kit_headers(): array
{
return [
['item_kit_id' => lang('Item_kits.kit')],
['item_kit_number' => lang('Item_kits.item_kit_number')],
['name' => lang('Item_kits.name')],
['description' => lang('Item_kits.description')],
['total_cost_price' => lang('Items.cost_price'), 'sortable' => FALSE],
['total_unit_price' => lang('Items.unit_price'), 'sortable' => FALSE]
];
}
define('ITEM_KIT_HEADERS', [
['item_kit_id' => lang('Item_kits.kit')],
['item_kit_number' => lang('Item_kits.item_kit_number')],
['name' => lang('Item_kits.name')],
['description' => lang('Item_kits.description')],
['total_cost_price' => lang('Items.cost_price'), 'sortable' => false],
['total_unit_price' => lang('Items.unit_price'), 'sortable' => false]
]);
/**
* Get the header for the item kits tabular view
*/
function get_item_kits_manage_table_headers(): string
{
return transform_headers(item_kit_headers());
return transform_headers(ITEM_KIT_HEADERS);
}
/**
@@ -696,23 +672,20 @@ function expand_attribute_values(array $definition_names, array $row): array
return $attribute_values;
}
function attribute_definition_headers(): array
{
return [
['definition_id' => lang('Attributes.definition_id')],
['definition_name' => lang('Attributes.definition_name')],
['definition_type' => lang('Attributes.definition_type')],
['definition_flags' => lang('Attributes.definition_flags')],
['definition_group' => lang('Attributes.definition_group')],
];
}
define('ATTRIBUTE_DEFINITION_HEADERS', [
['definition_id' => lang('Attributes.definition_id')],
['definition_name' => lang('Attributes.definition_name')],
['definition_type' => lang('Attributes.definition_type')],
['definition_flags' => lang('Attributes.definition_flags')],
['definition_group' => lang('Attributes.definition_group')],
]);
/**
* @return string
*/
function get_attribute_definition_manage_table_headers(): string
{
return transform_headers(attribute_definition_headers());
return transform_headers(ATTRIBUTE_DEFINITION_HEADERS);
}
/**
@@ -756,21 +729,18 @@ function get_attribute_definition_data_row(object $attribute_row): array
];
}
function expense_category_headers(): array
{
return [
['expense_category_id' => lang('Expenses_categories.category_id')],
['category_name' => lang('Expenses_categories.name')],
['category_description' => lang('Expenses_categories.description')]
];
}
define('EXPENSE_CATEGORY_HEADERS', [
['expense_category_id' => lang('Expenses_categories.category_id')],
['category_name' => lang('Expenses_categories.name')],
['category_description' => lang('Expenses_categories.description')]
]);
/**
* Get the header for the expense categories tabular view
*/
function get_expense_category_manage_table_headers(): string
{
return transform_headers(expense_category_headers());
return transform_headers(EXPENSE_CATEGORY_HEADERS);
}
/**
@@ -796,28 +766,25 @@ function get_expense_category_data_row(object $expense_category): array
];
}
function expense_headers(): array
{
return [
['expense_id' => lang('Expenses.expense_id')],
['date' => lang('Expenses.date')],
['supplier_name' => lang('Expenses.supplier_name')],
['supplier_tax_code' => lang('Expenses.supplier_tax_code')],
['amount' => lang('Expenses.amount')],
['tax_amount' => lang('Expenses.tax_amount')],
['payment_type' => lang('Expenses.payment')],
['category_name' => lang('Expenses_categories.name')],
['description' => lang('Expenses.description')],
['created_by' => lang('Expenses.employee')]
];
}
define('EXPENSE_HEADERS', [
['expense_id' => lang('Expenses.expense_id')],
['date' => lang('Expenses.date')],
['supplier_name' => lang('Expenses.supplier_name')],
['supplier_tax_code' => lang('Expenses.supplier_tax_code')],
['amount' => lang('Expenses.amount')],
['tax_amount' => lang('Expenses.tax_amount')],
['payment_type' => lang('Expenses.payment')],
['category_name' => lang('Expenses_categories.name')],
['description' => lang('Expenses.description')],
['created_by' => lang('Expenses.employee')]
]);
/**
* Get the header for the expenses tabular view
*/
function get_expenses_manage_table_headers(): string
{
return transform_headers(expense_headers());
return transform_headers(EXPENSE_HEADERS);
}
/**
@@ -891,9 +858,7 @@ function get_expenses_manage_payments_summary(array $payments, ResultInterface $
return $table;
}
function cashup_headers(): array
{
return [
define('CASHUPS_HEADERS', [
['cashup_id' => lang('Cashups.id')],
['open_date' => lang('Cashups.opened_date')],
['open_employee_id' => lang('Cashups.open_employee')],
@@ -907,8 +872,8 @@ function cashup_headers(): array
['closed_amount_card' => lang('Cashups.closed_amount_card')],
['closed_amount_check' => lang('Cashups.closed_amount_check')],
['closed_amount_total' => lang('Cashups.closed_amount_total')]
];
}
]
);
/**
@@ -916,7 +881,7 @@ function cashup_headers(): array
*/
function get_cashups_manage_table_headers(): string
{
$headers = cashup_headers();
$headers = CASHUPS_HEADERS;
return transform_headers($headers);
}

View File

@@ -1,89 +1,88 @@
<?php
return [
'address_1' => "Dirección 1",
'address_2' => "Dirección 2",
'admin' => "",
'city' => "Ciudad",
'clerk' => "",
'close' => "Cerrar",
'color' => "",
'comments' => "Comentarios",
'common' => "común",
'confirm_search' => "Ha seleccionado una o más filas, éstas no estarán seleccionadas después de su búsqueda. ¿Está seguro(a) de enviar su búsqueda?",
'copyrights' => "© 2010 - {0}",
'correct_errors' => "Por favor verifique que no hay errores antes de guardar",
'country' => "País",
'dashboard' => "",
'date' => "Fecha",
'delete' => "Eliminar",
'det' => "detalles",
'download_import_template' => "Descargar Plantilla para Importar desde CSV (CSV)",
'edit' => "editar",
'email' => "Correo-e",
'email_invalid_format' => "La dirección de correo-e no tiene el formato correcto.",
'export_csv' => "Exportar a CSV",
'export_csv_no' => "No",
'export_csv_yes' => "Si",
'fields_required_message' => "Los campos en rojo son requeridos",
'fields_required_message_unique' => "",
'first_name' => "Nombre",
'first_name_required' => "El nombre es un campo requerido.",
'first_page' => "Primero",
'gender' => "Género",
'gender_female' => "M",
'gender_male' => "H",
'gender_undefined' => "",
'icon' => "Ícono",
'id' => "Id",
'import' => "Importar",
'import_change_file' => "Cambiar",
'import_csv' => "Importar de CSV",
'import_full_path' => "Se requiere la ruta completa del archivo de CSV",
'import_remove_file' => "Eliminar",
'import_select_file' => "Seleccionar archivo",
'inv' => "Inv",
'last_name' => "Apellido(s)",
'last_name_required' => "El/Los Apellido(s) es un campo requerido.",
'last_page' => "Último",
'learn_about_project' => "para conocer la última información sobre el proyecto.",
'list_of' => "Lista de",
'logo' => "Logo",
'logo_mark' => "Marca",
'logout' => "Cerrar Sesión",
'manager' => "",
'migration_needed' => "La migración de la base de datos a {0} comenzará luego de acceder.",
'new' => "Nuevo(a)",
'no' => "",
'no_persons_to_display' => "No existen personas para mostrar.",
'none_selected_text' => "[Seleccionar]",
'or' => "O",
'people' => "",
'phone_number' => "Número Tel",
'phone_number_required' => "",
'please_visit_my' => "Por favor visite",
'position' => "",
'powered_by' => "Ejecutando sobre",
'price' => "Precio",
'print' => "Imprimir",
'remove' => "Elliminar",
'required' => "Requerido",
'restore' => "Restaurar",
'return_policy' => "Política de Devoluciones",
'search' => "Buscar",
'search_options' => "Opciones de búsqueda",
'searched_for' => "Buscado por",
'software_short' => "OSPOS",
'software_title' => "Punto de Venta de Código Abierto (Open Source Point of Sale)",
'state' => "Estado",
'submit' => "Enviar",
'total_spent' => "Total Gastado",
'unknown' => "Desconocido",
'view_recent_sales' => "Ver Ventas Recientes",
'website' => "sitio web",
'welcome' => "Bienvenido(a)",
'welcome_message' => "Bienvenido(a) a OSPOS, haga clic en un módulo para comenzar.",
'yes' => "Si",
'you_are_using_ospos' => "Está utilizando la versión de Código Abierto de Punto de Venta",
'zip' => "CP",
"address_1" => "Dirección 1",
"address_2" => "Dirección 2",
"admin" => "",
"city" => "Ciudad",
"clerk" => "",
"close" => "Cerrar",
"color" => "",
"comments" => "Comentarios",
"common" => "común",
"confirm_search" => "Ha seleccionado una o más filas, éstas no estarán seleccionadas después de su búsqueda. ¿Está seguro(a) de enviar su búsqueda?",
"copyrights" => "© 2010 - {0}",
"correct_errors" => "Por favor verifique que no hay errores antes de guardar",
"country" => "País",
"dashboard" => "",
"date" => "Fecha",
"delete" => "Eliminar",
"det" => "detalles",
"download_import_template" => "Descargar Plantilla para Importar desde CSV (CSV)",
"edit" => "editar",
"email" => "Correo-e",
"email_invalid_format" => "La dirección de correo-e no tiene el formato correcto.",
"export_csv" => "Exportar a CSV",
"export_csv_no" => "No",
"export_csv_yes" => "Si",
"fields_required_message" => "Los campos en rojo son requeridos",
"fields_required_message_unique" => "",
"first_name" => "Nombre",
"first_name_required" => "El nombre es un campo requerido.",
"first_page" => "Primero",
"gender" => "Género",
"gender_female" => "M",
"gender_male" => "H",
"gender_undefined" => "",
"icon" => "Ícono",
"id" => "Id",
"import" => "Importar",
"import_change_file" => "Cambiar",
"import_csv" => "Importar de CSV",
"import_full_path" => "Se requiere la ruta completa del archivo de CSV",
"import_remove_file" => "Eliminar",
"import_select_file" => "Seleccionar archivo",
"inv" => "Inv",
"last_name" => "Apellido(s)",
"last_name_required" => "El/Los Apellido(s) es un campo requerido.",
"last_page" => "Último",
"learn_about_project" => "para conocer la última información sobre el proyecto.",
"list_of" => "Lista de",
"logo" => "Logo",
"logo_mark" => "Marca",
"logout" => "Cerrar Sesión",
"manager" => "",
"migration_needed" => "La migración de la base de datos a {0} comenzará luego de acceder.",
"new" => "Nuevo(a)",
"no" => "",
"no_persons_to_display" => "No existen personas para mostrar.",
"none_selected_text" => "[Seleccionar]",
"or" => "O",
"people" => "",
"phone_number" => "Número Tel",
"phone_number_required" => "",
"please_visit_my" => "Por favor visite",
"position" => "",
"powered_by" => "Ejecutando sobre",
"price" => "Precio",
"print" => "Imprimir",
"remove" => "Elliminar",
"required" => "Requerido",
"restore" => "Restaurar",
"return_policy" => "Política de Devoluciones",
"search" => "Buscar",
"search_options" => "Opciones de búsqueda",
"searched_for" => "Buscado por",
"software_short" => "OSPOS",
"software_title" => "Punto de Venta de Código Abierto (Open Source Point of Sale)",
"state" => "Estado",
"submit" => "Enviar",
"total_spent" => "Total Gastado",
"unknown" => "Desconocido",
"view_recent_sales" => "Ver Ventas Recientes",
"website" => "sitio web",
"welcome" => "Bienvenido(a)",
"welcome_message" => "Bienvenido(a) a OSPOS, haga clic en un módulo para comenzar.",
"yes" => "",
"you_are_using_ospos" => "Está utilizando la versión de Código Abierto de Punto de Venta",
"zip" => "CP",
];

View File

@@ -1,331 +1,330 @@
<?php
return [
'address' => "Dirección de la Empresa",
'address_required' => "La Dirección de la Empresa es un campo requerido.",
'all_set' => "Todos los permisos han sido establecidos correctamente!",
'allow_duplicate_barcodes' => "Permitir Códigos de Barra Duplicados",
'apostrophe' => "apostrofé",
'backup_button' => "Respaldar",
'backup_database' => "Respaldar Base de Datos",
'barcode' => "Código de Barras",
'barcode_company' => "Nombre de la Empresa",
'barcode_configuration' => "Configuración del Código de Barras",
'barcode_content' => "Contenido del Código de Barras",
'barcode_first_row' => "Fila 1",
'barcode_font' => "Tipo de Letra",
'barcode_formats' => "Formatos de Entrada",
'barcode_generate_if_empty' => "Generar si está vacío.",
'barcode_height' => "Alto (px)",
'barcode_id' => "Id Artículo/Nombre",
'barcode_info' => "Información de Configuración para Códigos de Barras",
'barcode_layout' => "Formato Código de Barras",
'barcode_name' => "Nombre",
'barcode_number' => "Código de Barras",
'barcode_number_in_row' => "Número en renglón",
'barcode_page_cellspacing' => "Mostrar espaciado de celda de la página.",
'barcode_page_width' => "Ancho de página",
'barcode_price' => "Precio",
'barcode_second_row' => "Renglón 2",
'barcode_third_row' => "Renglón 3",
'barcode_tooltip' => "Advertencia: Esta función puede hacer que se importen o creen elementos duplicados. No lo use si no desea códigos de barras duplicados.",
'barcode_type' => "Tipo de código de barras",
'barcode_width' => "Ancho (px)",
'bottom' => "Final",
'cash_button' => "",
'cash_button_1' => "",
'cash_button_2' => "",
'cash_button_3' => "",
'cash_button_4' => "",
'cash_button_5' => "",
'cash_button_6' => "",
'cash_decimals' => "decimales en efectivo",
'cash_decimals_tooltip' => "Si los decimales son iguales entonces no tendrá redondeo.",
'cash_rounding' => "Redondeo de efectivo",
'category_dropdown' => "Mostrar categoría como un menú desplegable",
'center' => "Centro",
'change_apperance_tooltip' => "",
'comma' => "coma",
'company' => "Nombre de la Compañía",
'company_avatar' => "",
'company_change_image' => "Cambiar Imagen",
'company_logo' => "Logo de la Compañía",
'company_remove_image' => "Eliminar Imagen",
'company_required' => "Nombre de la compañia es un campo requerido",
'company_select_image' => "Seleccionar Imagen",
'company_website_url' => "Website de la compañía no es una URL valida (http://...).",
'country_codes' => "Códigos de Países",
'country_codes_tooltip' => "Lista separada por comas de códigos de países para la búsqueda de direcciones nominatim.",
'currency_code' => "código de moneda",
'currency_decimals' => "Decimales de moneda",
'currency_symbol' => "Símbolo de moneda",
'current_employee_only' => "",
'customer_reward' => "Recompensa",
'customer_reward_duplicate' => "Recompensa debe ser única.",
'customer_reward_enable' => "Habilita recompensas para los clientes",
'customer_reward_invalid_chars' => "Recompensa no debe tener '_'",
'customer_reward_required' => "Recompensa es un campo requerido",
'customer_sales_tax_support' => "",
'date_or_time_format' => "Filtro Fecha y Hora",
'datetimeformat' => "Formato de Fecha y Hora",
'decimal_point' => "Punto Decimal",
'default_barcode_font_size_number' => "El tamaño de fuente del código de barras predeterminado debe ser un número.",
'default_barcode_font_size_required' => "El tamaño de fuente predeterminado del código de barras es un campo obligatorio.",
'default_barcode_height_number' => "La altura predeterminada del código de barras debe ser un número.",
'default_barcode_height_required' => "La altura predeterminada del código de barras es un campo obligatorio.",
'default_barcode_num_in_row_number' => "El número de código de barras predeterminado en la fila debe ser un número.",
'default_barcode_num_in_row_required' => "El número de código de barras predeterminado en la fila es un campo obligatorio.",
'default_barcode_page_cellspacing_number' => "El espacio entre celdas predeterminado de la página de código de barras debe ser un número.",
'default_barcode_page_cellspacing_required' => "El espaciado entre celdas de página de código de barras predeterminado es un campo obligatorio.",
'default_barcode_page_width_number' => "La anchura del código de barras debe ser un número.",
'default_barcode_page_width_required' => "El ancho predeterminado del código de barras es un campo obligatorio.",
'default_barcode_width_number' => "El Ancho del código de barra debe ser un número.",
'default_barcode_width_required' => "El ancho predeterminado del código de barras es un campo obligatorio.",
'default_item_columns' => "Número de artículos por columna predeterminado",
'default_origin_tax_code' => "Código de Impuesto predeterminado",
'default_receivings_discount' => "Descuentos de recibos predeterminados",
'default_receivings_discount_number' => "Descuentos de recibos deben ser números.",
'default_receivings_discount_required' => "Descuentos de recibos es un campo requerido.",
'default_sales_discount' => "% Descuentos en ventas",
'default_sales_discount_number' => "El descuento predeterminado debe ser un número.",
'default_sales_discount_required' => "Descuento de Ventas por Defecto es un campo requerido.",
'default_tax_category' => "Categoría de Impuesto Predeterminada",
'default_tax_code' => "Código de Impuesto Predeterminado",
'default_tax_jurisdiction' => "Jurisdicción de Impuesto Predeterminada",
'default_tax_name_number' => "Nombre de Impuesto Predeterminado debe ser una cadena de texto.",
'default_tax_name_required' => "Nombre de Impuesto Predeterminado es un campo requerido.",
'default_tax_rate' => "Tasa impositiva predeterminada %",
'default_tax_rate_1' => "Tasa de Impuestos 1",
'default_tax_rate_2' => "Tasa de Impuestos 2",
'default_tax_rate_3' => "",
'default_tax_rate_number' => "La tasa impositiva predeterminada debe ser un número.",
'default_tax_rate_required' => "Tasa de impuestos predeterminada es un campo obligatorio.",
'derive_sale_quantity' => "Permitir cantidad de venta derivada",
'derive_sale_quantity_tooltip' => "Si se marca, se proporcionará un nuevo tipo de artículo para los artículos pedidos por cantidad extendida",
'dinner_table' => "Mesa",
'dinner_table_duplicate' => "La tabla debe ser única.",
'dinner_table_enable' => "Habilitar Mesa de Alimentos",
'dinner_table_invalid_chars' => "El nombre de la tabla no puede llevar '_'.",
'dinner_table_required' => "Tabla es requerida.",
'dot' => "punto(.)",
'email' => "Email",
'email_configuration' => "Configuración Email",
'email_mailpath' => "Ruta a Sendmail",
'email_protocol' => "Protocolo",
'email_receipt_check_behaviour' => "Email Receipt checkbox",
'email_receipt_check_behaviour_always' => "Siempre selecionado",
'email_receipt_check_behaviour_last' => "Recuerda la última selección",
'email_receipt_check_behaviour_never' => "Núnca seleccionado",
'email_smtp_crypto' => "Encriptación SMTP",
'email_smtp_host' => "Servidor SMTP",
'email_smtp_pass' => "Contraseña del Servidor SMTP",
'email_smtp_port' => "Puerto del Servidor SMTP",
'email_smtp_timeout' => "Expiró Tiempo de Espera del Servidor SMTP",
'email_smtp_user' => "Nombre de Usuario del Servidor SMTP",
'enable_avatar' => "",
'enable_avatar_tooltip' => "",
'enable_dropdown_tooltip' => "",
'enable_new_look' => "",
'enable_right_bar' => "",
'enable_right_bar_tooltip' => "",
'enforce_privacy' => "Enforce privacy",
'enforce_privacy_tooltip' => "Protect Customers privacy enforcing data scrambling in case of their data being deleted",
'fax' => "Fax",
'file_perm' => "Hay problemas con los permisos de archivo, por favor corríjalos y recargue esta página.",
'financial_year' => "Inicio del Año Fiscal",
'financial_year_apr' => "1.º de Abril",
'financial_year_aug' => "1.º de Agosto",
'financial_year_dec' => "1.º de Diciembre",
'financial_year_feb' => "1.º de Febrero",
'financial_year_jan' => "1.º de Enero",
'financial_year_jul' => "1.º de Julio",
'financial_year_jun' => "1.º de Junio",
'financial_year_mar' => "1.º de Marzo",
'financial_year_may' => "1.º de Mayo",
'financial_year_nov' => "1.º de Noviembre",
'financial_year_oct' => "1.º de Octubre",
'financial_year_sep' => "1º. de Septiembre",
'floating_labels' => "Etiquetas Flotantes",
'gcaptcha_enable' => "reCAPTCHA de Página de Ingreso",
'gcaptcha_secret_key' => "reCAPTCHA Secret Key",
'gcaptcha_secret_key_required' => "reCAPTCHA Llave Secreta es un campo requerido",
'gcaptcha_site_key' => "reCAPTCHA Site Key",
'gcaptcha_site_key_required' => "reCAPTCHA Site Key is a required field",
'gcaptcha_tooltip' => "Protect the Login page with Google reCAPTCHA, click the icon for an API key pair.",
'general' => "General",
'general_configuration' => "General Configuration",
'giftcard_number' => "Gift Card Number",
'giftcard_random' => "Generate Random",
'giftcard_series' => "Generate in Series",
'image_allowed_file_types' => "Tipo de archivos permitidos",
'image_max_height_tooltip' => "Altura máxima permitida de imágenes en píxeles (px).",
'image_max_size_tooltip' => "Tamaño máximo permitido de archivo de imágenes en kilobytes (kb).",
'image_max_width_tooltip' => "Ancho máximo permitido para imágenes en píxeles (px).",
'image_restrictions' => "Restricciones de carga de imágenes",
'include_hsn' => "Include Support for HSN Codes",
'info' => "Information",
'info_configuration' => "Store Information",
'input_groups' => "Grupos de Entrada",
'integrations' => "Integraciones",
'integrations_configuration' => "Integraciones Externas",
'invoice' => "Invoice",
'invoice_configuration' => "Invoice Print Settings",
'invoice_default_comments' => "Default Invoice Comments",
'invoice_email_message' => "Invoice Email Template",
'invoice_enable' => "Enable Invoicing",
'invoice_printer' => "Invoice Printer",
'invoice_type' => "Invoice Type",
'is_readable' => "es legible, pero los permisos están configurados incorrectamente. Configúrelo en 640 o 660 y actualice.",
'is_writable' => "se puede escribir, pero los permisos están configurados incorrectamente. Configúrelo en 750 y actualice.",
'item_markup' => "",
'jsprintsetup_required' => "Warning: This functionality will only work if you have the FireFox jsPrintSetup addon installed. Save anyway?",
'language' => "Language",
'last_used_invoice_number' => "Last used Invoice Number",
'last_used_quote_number' => "Last used Quote Number",
'last_used_work_order_number' => "Last used W/O Number",
'left' => "Left",
'license' => "License",
'license_configuration' => "License Statement",
'line_sequence' => "Line Sequence",
'lines_per_page' => "Lines per Page",
'lines_per_page_number' => "Lines per Page must be a number.",
'lines_per_page_required' => "Lines per Page is a required field.",
'locale' => "Localization",
'locale_configuration' => "Localization Configuration",
'locale_info' => "Localization Configuration Information",
'location' => "Stock",
'location_configuration' => "Stock Locations",
'location_info' => "Location Configuration Information",
'login_form' => "Estilo de formulario de inicio de sesión",
'logout' => "Do you want to make a backup before logging out? Click [OK] to backup or [Cancel] to logout.",
'mailchimp' => "Mailchimp",
'mailchimp_api_key' => "Mailchimp Clave API",
'mailchimp_configuration' => "Configuración de MailChimp",
'mailchimp_key_successfully' => "API Key is valid.",
'mailchimp_key_unsuccessfully' => "API Key is invalid.",
'mailchimp_lists' => "Lista (s) de MailChimp",
'mailchimp_tooltip' => "Click the icon for an API Key.",
'message' => "Message",
'message_configuration' => "Message Configuration",
'msg_msg' => "Saved Text Message",
'msg_msg_placeholder' => "If you wish to use a SMS template save your message here, otherwise leave the box blank.",
'msg_pwd' => "SMS-API Password",
'msg_pwd_required' => "SMS-API Password is a required field",
'msg_src' => "SMS-API Sender ID",
'msg_src_required' => "SMS-API Sender ID is a required field",
'msg_uid' => "SMS-API Username",
'msg_uid_required' => "SMS-API Username is a required field",
'multi_pack_enabled' => "Multiple Packages per Item",
'no_risk' => "No security/vulnerability risks.",
'none' => "none",
'notify_alignment' => "Notification Popup Position",
'number_format' => "Number Format",
'number_locale' => "Localization",
'number_locale_invalid' => "The entered locale is invalid. Check the link in the tooltip to find a valid locale.",
'number_locale_required' => "Number Locale is a required field.",
'number_locale_tooltip' => "Find a suitable locale through this link.",
'os_timezone' => "Zona horaria OSPOS:",
'ospos_info' => "Información de instalación OSPOS",
'payment_options_order' => "Payment Options Order",
'perm_risk' => "Los permisos incorrectos ponen en riesgo este software.",
'phone' => "Company Phone",
'phone_required' => "Company Phone is a required field.",
'print_bottom_margin' => "Margin Bottom",
'print_bottom_margin_number' => "Margin Bottom must be a number.",
'print_bottom_margin_required' => "Margin Bottom is a required field.",
'print_delay_autoreturn' => "Autoreturn to Sale delay",
'print_delay_autoreturn_number' => "Autoreturn to Sale delay is a required field.",
'print_delay_autoreturn_required' => "Autoreturn to Sale delay must be a number.",
'print_footer' => "Print Browser Footer",
'print_header' => "Print Browser Header",
'print_left_margin' => "Margin Left",
'print_left_margin_number' => "Margin Left must be a number.",
'print_left_margin_required' => "Margin Left is a required field.",
'print_receipt_check_behaviour' => "Print Receipt checkbox",
'print_receipt_check_behaviour_always' => "Always checked",
'print_receipt_check_behaviour_last' => "Remember last selection",
'print_receipt_check_behaviour_never' => "Always unchecked",
'print_right_margin' => "Margin Right",
'print_right_margin_number' => "Margin Right must be a number.",
'print_right_margin_required' => "Margin Right is a required field.",
'print_silently' => "Show Print Dialog",
'print_top_margin' => "Margin Top",
'print_top_margin_number' => "Margin Top must be a number.",
'print_top_margin_required' => "Margin Top is a required field.",
'quantity_decimals' => "Quantity Decimals",
'quick_cash_enable' => "",
'quote_default_comments' => "Default Quote Comments",
'receipt' => "Receipt",
'receipt_category' => "",
'receipt_configuration' => "Receipt Print Settings",
'receipt_default' => "Default",
'receipt_font_size' => "Font Size",
'receipt_font_size_number' => "Font Size must be a number.",
'receipt_font_size_required' => "Font Size is a required field.",
'receipt_info' => "Receipt Configuration Information",
'receipt_printer' => "Ticket Printer",
'receipt_short' => "Short",
'receipt_show_company_name' => "Show Company Name",
'receipt_show_description' => "Show Description",
'receipt_show_serialnumber' => "Show Serial Number",
'receipt_show_tax_ind' => "Mostrar indicador de impuestos",
'receipt_show_taxes' => "Show Taxes",
'receipt_show_total_discount' => "Show Total Discount",
'receipt_template' => "Receipt Template",
'receiving_calculate_average_price' => "Calcular promedio, Precio (Recepción)",
'recv_invoice_format' => "Receivings Invoice Format",
'register_mode_default' => "Default Register Mode",
'report_an_issue' => "Reportar un problema",
'return_policy_required' => "Return policy is a required field.",
'reward' => "Reward",
'reward_configuration' => "Reward Configuration",
'right' => "Right",
'sales_invoice_format' => "Sales Invoice Format",
'sales_quote_format' => "Sales Quote Format",
'saved_successfully' => "Configuration save successful.",
'saved_unsuccessfully' => "Configuration save failed.",
'security_issue' => "Security Vulnerability Warning",
'server_notice' => "Please use the below info for issue reporting.",
'service_charge' => "",
'show_due_enable' => "",
'show_office_group' => "Show office icon",
'statistics' => "Send Statistics",
'statistics_tooltip' => "Send statistics for development and feature improvement purposes.",
'stock_location' => "Ubicación del inventario",
'stock_location_duplicate' => "Stock Location must be unique.",
'stock_location_invalid_chars' => "Stock Location can not contain '_'.",
'stock_location_required' => "Stock location is a required field.",
'suggestions_fifth_column' => "",
'suggestions_first_column' => "Column 1",
'suggestions_fourth_column' => "",
'suggestions_layout' => "Search Suggestions Layout",
'suggestions_second_column' => "Column 2",
'suggestions_third_column' => "Column 3",
'system_conf' => "Setup & Conf",
'system_info' => "System Info",
'table' => "Table",
'table_configuration' => "Table Configuration",
'takings_printer' => "Receipt Printer",
'tax' => "Tax",
'tax_category' => "Tax Category",
'tax_category_duplicate' => "The entered tax category already exists.",
'tax_category_invalid_chars' => "The entered tax category is invalid.",
'tax_category_required' => "The tax category is required.",
'tax_category_used' => "Tax category cannot be deleted because it is being used.",
'tax_configuration' => "Tax Configuration",
'tax_decimals' => "Tax Decimals",
'tax_id' => "Tax Id",
'tax_included' => "Tax Included",
'theme' => "Theme",
'theme_preview' => "Vista Previa del Tema:",
'thousands_separator' => "Thousands Separator",
'timezone' => "Timezone",
'timezone_error' => "La zona horaria de OSPOS es diferente a su zona horaria local.",
'top' => "Top",
'use_destination_based_tax' => "Use Destination Based Tax",
'user_timezone' => "Zona horaria local:",
'website' => "Website",
'wholesale_markup' => "",
'work_order_enable' => "Work Order Support",
'work_order_format' => "Work Order Format",
"address" => "Dirección de la Empresa",
"address_required" => "La Dirección de la Empresa es un campo requerido.",
"all_set" => "Todos los permisos han sido establecidos correctamente!",
"allow_duplicate_barcodes" => "Permitir Códigos de Barra Duplicados",
"apostrophe" => "apostrofé",
"backup_button" => "Respaldar",
"backup_database" => "Respaldar Base de Datos",
"barcode" => "Código de Barras",
"barcode_company" => "Nombre de la Empresa",
"barcode_configuration" => "Configuración del Código de Barras",
"barcode_content" => "Contenido del Código de Barras",
"barcode_first_row" => "Fila 1",
"barcode_font" => "Tipo de Letra",
"barcode_formats" => "Formatos de Entrada",
"barcode_generate_if_empty" => "Generar si está vacío.",
"barcode_height" => "Alto (px)",
"barcode_id" => "Id Artículo/Nombre",
"barcode_info" => "Información de Configuración para Códigos de Barras",
"barcode_layout" => "Formato Código de Barras",
"barcode_name" => "Nombre",
"barcode_number" => "Código de Barras",
"barcode_number_in_row" => "Número en renglón",
"barcode_page_cellspacing" => "Mostrar espaciado de celda de la página.",
"barcode_page_width" => "Ancho de página",
"barcode_price" => "Precio",
"barcode_second_row" => "Renglón 2",
"barcode_third_row" => "Renglón 3",
"barcode_tooltip" => "Advertencia: Esta función puede hacer que se importen o creen elementos duplicados. No lo use si no desea códigos de barras duplicados.",
"barcode_type" => "Tipo de código de barras",
"barcode_width" => "Ancho (px)",
"bottom" => "Final",
"cash_button" => "",
"cash_button_1" => "",
"cash_button_2" => "",
"cash_button_3" => "",
"cash_button_4" => "",
"cash_button_5" => "",
"cash_button_6" => "",
"cash_decimals" => "decimales en efectivo",
"cash_decimals_tooltip" => "Si los decimales son iguales entonces no tendrá redondeo.",
"cash_rounding" => "Redondeo de efectivo",
"category_dropdown" => "Mostrar categoría como un menú desplegable",
"center" => "Centro",
"change_apperance_tooltip" => "",
"comma" => "coma",
"company" => "Nombre de la Compañía",
"company_avatar" => "",
"company_change_image" => "Cambiar Imagen",
"company_logo" => "Logo de la Compañía",
"company_remove_image" => "Eliminar Imagen",
"company_required" => "Nombre de la compañia es un campo requerido",
"company_select_image" => "Seleccionar Imagen",
"company_website_url" => "Website de la compañía no es una URL valida (http://...).",
"country_codes" => "Códigos de Países",
"country_codes_tooltip" => "Lista separada por comas de códigos de países para la búsqueda de direcciones nominatim.",
"currency_code" => "código de moneda",
"currency_decimals" => "Decimales de moneda",
"currency_symbol" => "Símbolo de moneda",
"current_employee_only" => "",
"customer_reward" => "Recompensa",
"customer_reward_duplicate" => "Recompensa debe ser única.",
"customer_reward_enable" => "Habilita recompensas para los clientes",
"customer_reward_invalid_chars" => "Recompensa no debe tener '_'",
"customer_reward_required" => "Recompensa es un campo requerido",
"customer_sales_tax_support" => "",
"date_or_time_format" => "Filtro Fecha y Hora",
"datetimeformat" => "Formato de Fecha y Hora",
"decimal_point" => "Punto Decimal",
"default_barcode_font_size_number" => "El tamaño de fuente del código de barras predeterminado debe ser un número.",
"default_barcode_font_size_required" => "El tamaño de fuente predeterminado del código de barras es un campo obligatorio.",
"default_barcode_height_number" => "La altura predeterminada del código de barras debe ser un número.",
"default_barcode_height_required" => "La altura predeterminada del código de barras es un campo obligatorio.",
"default_barcode_num_in_row_number" => "El número de código de barras predeterminado en la fila debe ser un número.",
"default_barcode_num_in_row_required" => "El número de código de barras predeterminado en la fila es un campo obligatorio.",
"default_barcode_page_cellspacing_number" => "El espacio entre celdas predeterminado de la página de código de barras debe ser un número.",
"default_barcode_page_cellspacing_required" => "El espaciado entre celdas de página de código de barras predeterminado es un campo obligatorio.",
"default_barcode_page_width_number" => "La anchura del código de barras debe ser un número.",
"default_barcode_page_width_required" => "El ancho predeterminado del código de barras es un campo obligatorio.",
"default_barcode_width_number" => "El Ancho del código de barra debe ser un número.",
"default_barcode_width_required" => "El ancho predeterminado del código de barras es un campo obligatorio.",
"default_item_columns" => "Número de artículos por columna predeterminado",
"default_origin_tax_code" => "Código de Impuesto predeterminado",
"default_receivings_discount" => "Descuentos de recibos predeterminados",
"default_receivings_discount_number" => "Descuentos de recibos deben ser números.",
"default_receivings_discount_required" => "Descuentos de recibos es un campo requerido.",
"default_sales_discount" => "% Descuentos en ventas",
"default_sales_discount_number" => "El descuento predeterminado debe ser un número.",
"default_sales_discount_required" => "Descuento de Ventas por Defecto es un campo requerido.",
"default_tax_category" => "Categoría de Impuesto Predeterminada",
"default_tax_code" => "Código de Impuesto Predeterminado",
"default_tax_jurisdiction" => "Jurisdicción de Impuesto Predeterminada",
"default_tax_name_number" => "Nombre de Impuesto Predeterminado debe ser una cadena de texto.",
"default_tax_name_required" => "Nombre de Impuesto Predeterminado es un campo requerido.",
"default_tax_rate" => "Tasa impositiva predeterminada %",
"default_tax_rate_1" => "Tasa de Impuestos 1",
"default_tax_rate_2" => "Tasa de Impuestos 2",
"default_tax_rate_3" => "",
"default_tax_rate_number" => "La tasa impositiva predeterminada debe ser un número.",
"default_tax_rate_required" => "Tasa de impuestos predeterminada es un campo obligatorio.",
"derive_sale_quantity" => "Permitir cantidad de venta derivada",
"derive_sale_quantity_tooltip" => "Si se marca, se proporcionará un nuevo tipo de artículo para los artículos pedidos por cantidad extendida",
"dinner_table" => "Mesa",
"dinner_table_duplicate" => "La tabla debe ser única.",
"dinner_table_enable" => "Habilitar Mesa de Alimentos",
"dinner_table_invalid_chars" => "El nombre de la tabla no puede llevar '_'.",
"dinner_table_required" => "Tabla es requerida.",
"dot" => "punto(.)",
"email" => "Email",
"email_configuration" => "Configuración Email",
"email_mailpath" => "Ruta a Sendmail",
"email_protocol" => "Protocolo",
"email_receipt_check_behaviour" => "Email Receipt checkbox",
"email_receipt_check_behaviour_always" => "Siempre selecionado",
"email_receipt_check_behaviour_last" => "Recuerda la última selección",
"email_receipt_check_behaviour_never" => "Núnca seleccionado",
"email_smtp_crypto" => "Encriptación SMTP",
"email_smtp_host" => "Servidor SMTP",
"email_smtp_pass" => "Contraseña del Servidor SMTP",
"email_smtp_port" => "Puerto del Servidor SMTP",
"email_smtp_timeout" => "Expiró Tiempo de Espera del Servidor SMTP",
"email_smtp_user" => "Nombre de Usuario del Servidor SMTP",
"enable_avatar" => "",
"enable_avatar_tooltip" => "",
"enable_dropdown_tooltip" => "",
"enable_new_look" => "",
"enable_right_bar" => "",
"enable_right_bar_tooltip" => "",
"enforce_privacy" => "Enforce privacy",
"enforce_privacy_tooltip" => "Protect Customers privacy enforcing data scrambling in case of their data being deleted",
"fax" => "Fax",
"file_perm" => "Hay problemas con los permisos de archivo, por favor corríjalos y recargue esta página.",
"financial_year" => "Inicio del Año Fiscal",
"financial_year_apr" => "1.º de Abril",
"financial_year_aug" => "1.º de Agosto",
"financial_year_dec" => "1.º de Diciembre",
"financial_year_feb" => "1.º de Febrero",
"financial_year_jan" => "1.º de Enero",
"financial_year_jul" => "1.º de Julio",
"financial_year_jun" => "1.º de Junio",
"financial_year_mar" => "1.º de Marzo",
"financial_year_may" => "1.º de Mayo",
"financial_year_nov" => "1.º de Noviembre",
"financial_year_oct" => "1.º de Octubre",
"financial_year_sep" => "1º. de Septiembre",
"floating_labels" => "Etiquetas Flotantes",
"gcaptcha_enable" => "reCAPTCHA de Página de Ingreso",
"gcaptcha_secret_key" => "reCAPTCHA Secret Key",
"gcaptcha_secret_key_required" => "reCAPTCHA Llave Secreta es un campo requerido",
"gcaptcha_site_key" => "reCAPTCHA Site Key",
"gcaptcha_site_key_required" => "reCAPTCHA Site Key is a required field",
"gcaptcha_tooltip" => "Protect the Login page with Google reCAPTCHA, click the icon for an API key pair.",
"general" => "General",
"general_configuration" => "General Configuration",
"giftcard_number" => "Gift Card Number",
"giftcard_random" => "Generate Random",
"giftcard_series" => "Generate in Series",
"image_allowed_file_types" => "Tipo de archivos permitidos",
"image_max_height_tooltip" => "Altura máxima permitida de imágenes en píxeles (px).",
"image_max_size_tooltip" => "Tamaño máximo permitido de archivo de imágenes en kilobytes (kb).",
"image_max_width_tooltip" => "Ancho máximo permitido para imágenes en píxeles (px).",
"image_restrictions" => "Restricciones de carga de imágenes",
"include_hsn" => "Include Support for HSN Codes",
"info" => "Information",
"info_configuration" => "Store Information",
"input_groups" => "Grupos de Entrada",
"integrations" => "Integraciones",
"integrations_configuration" => "Integraciones Externas",
"invoice" => "Invoice",
"invoice_configuration" => "Invoice Print Settings",
"invoice_default_comments" => "Default Invoice Comments",
"invoice_email_message" => "Invoice Email Template",
"invoice_enable" => "Enable Invoicing",
"invoice_printer" => "Invoice Printer",
"invoice_type" => "Invoice Type",
"is_readable" => "es legible, pero los permisos están configurados incorrectamente. Configúrelo en 640 o 660 y actualice.",
"is_writable" => "se puede escribir, pero los permisos están configurados incorrectamente. Configúrelo en 750 y actualice.",
"item_markup" => "",
"jsprintsetup_required" => "Warning: This functionality will only work if you have the FireFox jsPrintSetup addon installed. Save anyway?",
"language" => "Language",
"last_used_invoice_number" => "Last used Invoice Number",
"last_used_quote_number" => "Last used Quote Number",
"last_used_work_order_number" => "Last used W/O Number",
"left" => "Left",
"license" => "License",
"license_configuration" => "License Statement",
"line_sequence" => "Line Sequence",
"lines_per_page" => "Lines per Page",
"lines_per_page_number" => "Lines per Page must be a number.",
"lines_per_page_required" => "Lines per Page is a required field.",
"locale" => "Localization",
"locale_configuration" => "Localization Configuration",
"locale_info" => "Localization Configuration Information",
"location" => "Stock",
"location_configuration" => "Stock Locations",
"location_info" => "Location Configuration Information",
"login_form" => "Estilo de formulario de inicio de sesión",
"logout" => "Do you want to make a backup before logging out? Click [OK] to backup or [Cancel] to logout.",
"mailchimp" => "Mailchimp",
"mailchimp_api_key" => "Mailchimp Clave API",
"mailchimp_configuration" => "Configuración de MailChimp",
"mailchimp_key_successfully" => "API Key is valid.",
"mailchimp_key_unsuccessfully" => "API Key is invalid.",
"mailchimp_lists" => "Lista (s) de MailChimp",
"mailchimp_tooltip" => "Click the icon for an API Key.",
"message" => "Message",
"message_configuration" => "Message Configuration",
"msg_msg" => "Saved Text Message",
"msg_msg_placeholder" => "If you wish to use a SMS template save your message here, otherwise leave the box blank.",
"msg_pwd" => "SMS-API Password",
"msg_pwd_required" => "SMS-API Password is a required field",
"msg_src" => "SMS-API Sender ID",
"msg_src_required" => "SMS-API Sender ID is a required field",
"msg_uid" => "SMS-API Username",
"msg_uid_required" => "SMS-API Username is a required field",
"multi_pack_enabled" => "Multiple Packages per Item",
"no_risk" => "No security/vulnerability risks.",
"none" => "none",
"notify_alignment" => "Notification Popup Position",
"number_format" => "Number Format",
"number_locale" => "Localization",
"number_locale_invalid" => "The entered locale is invalid. Check the link in the tooltip to find a valid locale.",
"number_locale_required" => "Number Locale is a required field.",
"number_locale_tooltip" => "Find a suitable locale through this link.",
"os_timezone" => "Zona horaria OSPOS:",
"ospos_info" => "Información de instalación OSPOS",
"payment_options_order" => "Payment Options Order",
"perm_risk" => "Los permisos incorrectos ponen en riesgo este software.",
"phone" => "Company Phone",
"phone_required" => "Company Phone is a required field.",
"print_bottom_margin" => "Margin Bottom",
"print_bottom_margin_number" => "Margin Bottom must be a number.",
"print_bottom_margin_required" => "Margin Bottom is a required field.",
"print_delay_autoreturn" => "Autoreturn to Sale delay",
"print_delay_autoreturn_number" => "Autoreturn to Sale delay is a required field.",
"print_delay_autoreturn_required" => "Autoreturn to Sale delay must be a number.",
"print_footer" => "Print Browser Footer",
"print_header" => "Print Browser Header",
"print_left_margin" => "Margin Left",
"print_left_margin_number" => "Margin Left must be a number.",
"print_left_margin_required" => "Margin Left is a required field.",
"print_receipt_check_behaviour" => "Print Receipt checkbox",
"print_receipt_check_behaviour_always" => "Always checked",
"print_receipt_check_behaviour_last" => "Remember last selection",
"print_receipt_check_behaviour_never" => "Always unchecked",
"print_right_margin" => "Margin Right",
"print_right_margin_number" => "Margin Right must be a number.",
"print_right_margin_required" => "Margin Right is a required field.",
"print_silently" => "Show Print Dialog",
"print_top_margin" => "Margin Top",
"print_top_margin_number" => "Margin Top must be a number.",
"print_top_margin_required" => "Margin Top is a required field.",
"quantity_decimals" => "Quantity Decimals",
"quick_cash_enable" => "",
"quote_default_comments" => "Default Quote Comments",
"receipt" => "Receipt",
"receipt_category" => "",
"receipt_configuration" => "Receipt Print Settings",
"receipt_default" => "Default",
"receipt_font_size" => "Font Size",
"receipt_font_size_number" => "Font Size must be a number.",
"receipt_font_size_required" => "Font Size is a required field.",
"receipt_info" => "Receipt Configuration Information",
"receipt_printer" => "Ticket Printer",
"receipt_short" => "Short",
"receipt_show_company_name" => "Show Company Name",
"receipt_show_description" => "Show Description",
"receipt_show_serialnumber" => "Show Serial Number",
"receipt_show_tax_ind" => "Mostrar indicador de impuestos",
"receipt_show_taxes" => "Show Taxes",
"receipt_show_total_discount" => "Show Total Discount",
"receipt_template" => "Receipt Template",
"receiving_calculate_average_price" => "Calcular promedio, Precio (Recepción)",
"recv_invoice_format" => "Receivings Invoice Format",
"register_mode_default" => "Default Register Mode",
"report_an_issue" => "Reportar un problema",
"return_policy_required" => "Return policy is a required field.",
"reward" => "Reward",
"reward_configuration" => "Reward Configuration",
"right" => "Right",
"sales_invoice_format" => "Sales Invoice Format",
"sales_quote_format" => "Sales Quote Format",
"saved_successfully" => "Configuration save successful.",
"saved_unsuccessfully" => "Configuration save failed.",
"security_issue" => "Security Vulnerability Warning",
"server_notice" => "Please use the below info for issue reporting.",
"service_charge" => "",
"show_due_enable" => "",
"show_office_group" => "Show office icon",
"statistics" => "Send Statistics",
"statistics_tooltip" => "Send statistics for development and feature improvement purposes.",
"stock_location" => "Stock location",
"stock_location_duplicate" => "Stock Location must be unique.",
"stock_location_invalid_chars" => "Stock Location can not contain '_'.",
"stock_location_required" => "Stock location is a required field.",
"suggestions_fifth_column" => "",
"suggestions_first_column" => "Column 1",
"suggestions_fourth_column" => "",
"suggestions_layout" => "Search Suggestions Layout",
"suggestions_second_column" => "Column 2",
"suggestions_third_column" => "Column 3",
"system_conf" => "Setup & Conf",
"system_info" => "System Info",
"table" => "Table",
"table_configuration" => "Table Configuration",
"takings_printer" => "Receipt Printer",
"tax" => "Tax",
"tax_category" => "Tax Category",
"tax_category_duplicate" => "The entered tax category already exists.",
"tax_category_invalid_chars" => "The entered tax category is invalid.",
"tax_category_required" => "The tax category is required.",
"tax_category_used" => "Tax category cannot be deleted because it is being used.",
"tax_configuration" => "Tax Configuration",
"tax_decimals" => "Tax Decimals",
"tax_id" => "Tax Id",
"tax_included" => "Tax Included",
"theme" => "Theme",
"theme_preview" => "Vista Previa del Tema:",
"thousands_separator" => "Thousands Separator",
"timezone" => "Timezone",
"timezone_error" => "La zona horaria de OSPOS es diferente a su zona horaria local.",
"top" => "Top",
"use_destination_based_tax" => "Use Destination Based Tax",
"user_timezone" => "Zona horaria local:",
"website" => "Website",
"wholesale_markup" => "",
"work_order_enable" => "Work Order Support",
"work_order_format" => "Work Order Format",
];

View File

@@ -1,57 +1,56 @@
<?php
return [
'account_number' => "Cuenta #",
'account_number_duplicate' => "El Número de Cuenta ya se encuentra en la base de datos.",
'available_points' => "Puntos Disponibles",
'available_points_value' => "",
'average' => "Gasto Promedio",
'avg_discount' => "Descuento Promedio",
'basic_information' => "Información",
'cannot_be_deleted' => "No se pueden borrar los Clientes seleccionados, uno o más tienen ventas.",
'company_name' => "Compañia",
'confirm_delete' => "¿Está seguro que quiere borrar los Clientes seleccionados?",
'confirm_restore' => "¿Está seguro que quiere restaurar los clientes seleccionados?",
'consent' => "Consentimiento de registro",
'consent_required' => "Consentimiento de registro es un campo requerido.",
'csv_import_failed' => "Fallo al importar a CSV",
'csv_import_nodata_wrongformat' => "El archivo subido no contiene datos o no está formado correctamente.",
'csv_import_partially_failed' => "La importación del Cliente fue exitosa pero con algunos errores:",
'csv_import_success' => "Cliente importado exitosamente.",
'customer' => "Cliente",
'date' => "Fecha",
'discount' => "Descuento",
'discount_fixed' => "Descuento Fijo",
'discount_percent' => "Porcentaje de Descuento",
'discount_type' => "Tipo de Descuento",
'email_duplicate' => "El correo electrónico ya se encuentra en la base de datos.",
'employee' => "Empleado",
'error_adding_updating' => "Fallo al agregar o actualizar el Cliente.",
'import_items_csv' => "Importar Cliente desde CSV",
'mailchimp_activity_click' => "Click Correo Electrónico",
'mailchimp_activity_lastopen' => "Último correo electrónico abierto",
'mailchimp_activity_open' => "Correo electrónico abierto",
'mailchimp_activity_total' => "Correo electrónico enviado",
'mailchimp_activity_unopen' => "Correo electrónico sin abrir",
'mailchimp_email_client' => "cliente de correo electrónico",
'mailchimp_info' => "Mailchimp",
'mailchimp_member_rating' => "Puntaje",
'mailchimp_status' => "Estado",
'mailchimp_vip' => "VIP",
'max' => "Gasto Máximo",
'min' => "Gasto Mínimo",
'new' => "Nuevo Cliente",
'none_selected' => "No ha seleccionado un Cliente para borrar.",
'one_or_multiple' => "Cliente(s)",
'quantity' => "Cantidad",
'stats_info' => "Estadísticas",
'successful_adding' => "Ha agregado un Cliente con éxito",
'successful_deleted' => "Se ha borrado correctamente",
'successful_updating' => "Ha actualizado un Cliente exitosamente",
'tax_code' => "Código de Impuesto",
'tax_id' => "Id Impuesto",
'taxable' => "Impuestable",
'total' => "Gasto total",
'update' => "Actualizar Cliente",
'rewards_package' => "Paquete de Recompensas",
"account_number" => "Cuenta #",
"account_number_duplicate" => "El Número de Cuenta ya se encuentra en la base de datos.",
"available_points" => "Puntos Disponibles",
"available_points_value" => "",
"average" => "Gasto Promedio",
"avg_discount" => "Descuento Promedio",
"basic_information" => "Información",
"cannot_be_deleted" => "No se pueden borrar los Clientes seleccionados, uno o más tienen ventas.",
"company_name" => "Compañia",
"confirm_delete" => "¿Está seguro que quiere borrar los Clientes seleccionados?",
"confirm_restore" => "¿Está seguro que quiere restaurar los clientes seleccionados?",
"consent" => "Consentimiento de registro",
"consent_required" => "Consentimiento de registro es un campo requerido.",
"csv_import_failed" => "Fallo al importar a CSV",
"csv_import_nodata_wrongformat" => "El archivo subido no contiene datos o no está formado correctamente.",
"csv_import_partially_failed" => "La importación del Cliente fue exitosa pero con algunos errores:",
"csv_import_success" => "Cliente importado exitosamente.",
"customer" => "Cliente",
"date" => "Fecha",
"discount" => "Descuento",
"discount_fixed" => "Descuento Fijo",
"discount_percent" => "Porcentaje de Descuento",
"discount_type" => "Tipo de Descuento",
"email_duplicate" => "El correo electrónico ya se encuentra en la base de datos.",
"employee" => "Empleado",
"error_adding_updating" => "Fallo al agregar o actualizar el Cliente.",
"import_items_csv" => "Importar Cliente desde CSV",
"mailchimp_activity_click" => "Click Correo Electrónico",
"mailchimp_activity_lastopen" => "Último correo electrónico abierto",
"mailchimp_activity_open" => "Correo electrónico abierto",
"mailchimp_activity_total" => "Correo electrónico enviado",
"mailchimp_activity_unopen" => "Correo electrónico sin abrir",
"mailchimp_email_client" => "cliente de correo electrónico",
"mailchimp_info" => "Mailchimp",
"mailchimp_member_rating" => "Puntaje",
"mailchimp_status" => "Estado",
"mailchimp_vip" => "VIP",
"max" => "Gasto Máximo",
"min" => "Gasto Mínimo",
"new" => "Nuevo Cliente",
"none_selected" => "No ha seleccionado un Cliente para borrar.",
"one_or_multiple" => "Cliente(s)",
"quantity" => "Cantidad",
"stats_info" => "Estadísticas",
"successful_adding" => "Ha agregado un Cliente con éxito",
"successful_deleted" => "Lo ha borrado exitosamente",
"successful_updating" => "Ha actualizado un Cliente exitosamente",
"tax_code" => "Código de Impuesto",
"tax_id" => "Id Impuesto",
"taxable" => "Impuestable",
"total" => "Gasto total",
"update" => "Actualizar Cliente",
"rewards_package" => "Paquete de Recompensas",
];

View File

@@ -1,45 +1,44 @@
<?php
return [
'administrator' => "",
'basic_information' => "Información",
'cannot_be_deleted' => "No se puede borrar los empleados seleccionados, uno o más de ellos tienen ventas registradas ó intentas borrar tu propia cuenta.",
'change_employee' => "",
'change_password' => "Cambiar contraseña",
'clerk' => "",
'commission' => "",
'confirm_delete' => "¿Estás seguro que deseas borrar los empleados seleccionados?",
'confirm_restore' => "¿Estás seguro que deseas restaurar los empleados seleccionados?",
'current_password' => "Contraseña Actual",
'current_password_invalid' => "La contraseña actual es inválida.",
'employee' => "Empleado",
'error_adding_updating' => "Agregar ó Actualizar empleado ha fallado.",
'error_deleting_demo_admin' => "No puede borrar el usuario demo de administrador.",
'error_updating_demo_admin' => "No puede cambiar el usuario demo de administrador.",
'language' => "Idioma",
'login_info' => "Iniciar sesión",
'manager' => "",
'new' => "Nuevo Empleado",
'none_selected' => "No ha seleccionado empleados a borrar.",
'one_or_multiple' => "Empleado(s)",
'password' => "Contraseña",
'password_minlength' => "La contraseña debe tener por lo menos 8 letras.",
'password_must_match' => "Las contraseñas no coinciden.",
'password_not_must_match' => "La contraseña actual y nueva contraseña deben ser distintas.",
'password_required' => "Se requiere contraseña.",
'permission_desc' => "Selecciona las casillas para otorgar acceso a los módulos.",
'permission_info' => "Permisos",
'repeat_password' => "Contraseña otra vez",
'subpermission_required' => "Concede por lo menos un permiso para cada módulo.",
'successful_adding' => "Empleado agregado exitosamente.",
'successful_change_password' => "Cambio de contraseña exitoso.",
'successful_deleted' => "Se ha borrado correctamente",
'successful_updating' => "Empleado actualizado exitosamente",
'system_language' => "Idioma del sistema",
'unsuccessful_change_password' => "El cambio de contraseña ha fallado.",
'update' => "Actualizar Empleado",
'username' => "Nombre de Usuario",
'username_duplicate' => "El usuario del empleado ya esta en uso. Favor de escoger otro.",
'username_minlength' => "Nombre de usuario debe tener por lo menos 5 letras.",
'username_required' => "Es necesario el nombre de usuario.",
"administrator" => "",
"basic_information" => "Información",
"cannot_be_deleted" => "No se puede borrar los empleados seleccionados, uno o más de ellos tienen ventas registradas ó intentas borrar tu propia cuenta.",
"change_employee" => "",
"change_password" => "Cambiar contraseña",
"clerk" => "",
"commission" => "",
"confirm_delete" => "¿Estás seguro que deseas borrar los empleados seleccionados?",
"confirm_restore" => "¿Estás seguro que deseas restaurar los empleados seleccionados?",
"current_password" => "Contraseña Actual",
"current_password_invalid" => "La contraseña actual es inválida.",
"employee" => "Empleado",
"error_adding_updating" => "Agregar ó Actualizar empleado ha fallado.",
"error_deleting_demo_admin" => "No puede borrar el usuario demo de administrador.",
"error_updating_demo_admin" => "No puede cambiar el usuario demo de administrador.",
"language" => "Idioma",
"login_info" => "Iniciar sesión",
"manager" => "",
"new" => "Nuevo Empleado",
"none_selected" => "No ha seleccionado empleados a borrar.",
"one_or_multiple" => "Empleado(s)",
"password" => "Contraseña",
"password_minlength" => "La contraseña debe tener por lo menos 8 letras.",
"password_must_match" => "Las contraseñas no coinciden.",
"password_not_must_match" => "La contraseña actual y nueva contraseña deben ser distintas.",
"password_required" => "Se requiere contraseña.",
"permission_desc" => "Selecciona las casillas para otorgar acceso a los módulos.",
"permission_info" => "Permisos",
"repeat_password" => "Contraseña otra vez",
"subpermission_required" => "Concede por lo menos un permiso para cada módulo.",
"successful_adding" => "Empleado agregado exitosamente.",
"successful_change_password" => "Cambio de contraseña exitoso.",
"successful_deleted" => "Eliminado Satisfactoriamente",
"successful_updating" => "Empleado actualizado exitosamente",
"system_language" => "Idioma del sistema",
"unsuccessful_change_password" => "El cambio de contraseña ha fallado.",
"update" => "Actualizar Empleado",
"username" => "Nombre de Usuario",
"username_duplicate" => "El usuario del empleado ya esta en uso. Favor de escoger otro.",
"username_minlength" => "Nombre de usuario debe tener por lo menos 5 letras.",
"username_required" => "Es necesario el nombre de usuario.",
];

View File

@@ -1,72 +1,71 @@
<?php
return [
'add_minus' => "Inventario para agregar o restar.",
'allow_alt_description' => "Permitir Descripción Alterna",
'bulk_edit' => "Editor Masivo",
'cannot_be_deleted' => "No se puede borrar la tarjeta (s) de regalo seleccionada(s), una o mas de las Tarjetas de Regalo ya tuvo ventas.",
'cannot_find_giftcard' => "Tarjeta de Regalo no encontrada.",
'cannot_use' => "Tarjeta de Regalo {0} no puede ser usada para esta venta: Cliente incorrecto.",
'card_value' => "Valor",
'category' => "Categoría",
'change_all_to_allow_alt_desc' => "Permitir descripción alternativa para todos.",
'change_all_to_not_allow_allow_desc' => "No permitir descripción alternativa para todos.",
'change_all_to_serialized' => "Cambiar Todos a Serializados",
'change_all_to_unserialized' => "Cambiar Todos a Sin Serializar",
'confirm_bulk_edit' => "¿Estas seguro que deseas editar las Tarjeta(s) de regalo seleccionadas?",
'confirm_delete' => "¿Estas seguro que deseas borrar las Tarjetas(s) de regalo seleccionadas?",
'confirm_restore' => "¿Estas seguro que deseas restaurar las Tarjeta(s) de regalo seleccionadas?",
'cost_price' => "Precio mayoreo.",
'count' => "Actualizar inventario",
'csv_import_failed' => "Fallo en la importación de CSV.",
'current_quantity' => "Cantidad actual",
'description' => "Descripción",
'details_count' => "Detalles del Inventario",
'do_nothing' => "No hacer Nada",
'edit_fields_you_want_to_update' => "Editar campos para las Tarjeta(s) de regalo seleccionadas.",
'edit_multiple_giftcards' => "Editar Multiples Tarjetas de regalo.",
'error_adding_updating' => "Error al agregar o actualizar la Tarjeta de Regalo.",
'error_updating_multiple' => "Fallo en la actualización de la(s) Tarjeta(s) de regalo.",
'generate_barcodes' => "Generar Códigos de Barra",
'giftcard' => "Tarjeta de Regalo",
'giftcard_number' => "Numero de la Tarjeta de Regalo",
'info_provided_by' => "Información provista por",
'inventory_comments' => "Comentarios",
'is_serialized' => "La Tarjeta de Regalo tiene Numero de Serie",
'low_inventory_giftcards' => "Tarjetas de Regalo con Inventario Bajo",
'manually_editing_of_quantity' => "Editor Manual de Cantidad",
'must_select_giftcard_for_barcode' => "Debes seleccionar al menos (1) Tarjeta de Regalo para generar Códigos de Barra.",
'new' => "Nueva Tarjeta de Regalo",
'no_description_giftcards' => "Gif Cards sin Descripción",
'no_giftcards_to_display' => "No hay Gift Cards para mostrar.",
'none' => "Ninguno",
'none_selected' => "",
'number' => "",
'number_information' => "Numero de tarjeta de regalo",
'number_required' => "",
'one_or_multiple' => "Tarjeta de regalo",
'person_id' => "",
'quantity' => "Cantidad",
'quantity_required' => "",
'remaining_balance' => "",
'reorder_level' => "Cantidad minima",
'retrive_giftcard_info' => "",
'sales_tax_1' => "Impuesto de Ventas 1",
'sales_tax_2' => "Impuesto de Ventas 2",
'serialized_giftcards' => "",
'successful_adding' => "",
'successful_bulk_edit' => "La tarjeta de regalo seleccionada ha sido actualizada",
'successful_deleted' => "Se ha borrado correctamente",
'successful_updating' => "",
'supplier' => "",
'tax_1' => "",
'tax_2' => "",
'tax_percent' => "",
'tax_percents' => "",
'unit_price' => "",
'upc_database' => "",
'update' => "",
'use_inventory_menu' => "",
'value' => "",
'value_required' => "",
"add_minus" => "Inventario para agregar o restar.",
"allow_alt_description" => "Permitir Descripción Alterna",
"bulk_edit" => "Editor Masivo",
"cannot_be_deleted" => "No se puede borrar la tarjeta (s) de regalo seleccionada(s), una o mas de las Tarjetas de Regalo ya tuvo ventas.",
"cannot_find_giftcard" => "Tarjeta de Regalo no encontrada.",
"cannot_use" => "Tarjeta de Regalo {0} no puede ser usada para esta venta: Cliente incorrecto.",
"card_value" => "Valor",
"category" => "Categoría",
"change_all_to_allow_alt_desc" => "Permitir descripción alternativa para todos.",
"change_all_to_not_allow_allow_desc" => "No permitir descripción alternativa para todos.",
"change_all_to_serialized" => "Cambiar Todos a Serializados",
"change_all_to_unserialized" => "Cambiar Todos a Sin Serializar",
"confirm_bulk_edit" => "¿Estas seguro que deseas editar las Tarjeta(s) de regalo seleccionadas?",
"confirm_delete" => "¿Estas seguro que deseas borrar las Tarjetas(s) de regalo seleccionadas?",
"confirm_restore" => "¿Estas seguro que deseas restaurar las Tarjeta(s) de regalo seleccionadas?",
"cost_price" => "Precio de Mayoreo",
"count" => "Actualizar Inventario",
"csv_import_failed" => "Fallo en la importación de CSV.",
"current_quantity" => "Cantidad Actual",
"description" => "Descripción",
"details_count" => "Detalles del Inventario",
"do_nothing" => "No hacer Nada",
"edit_fields_you_want_to_update" => "Editar campos para las Tarjeta(s) de regalo seleccionadas.",
"edit_multiple_giftcards" => "Editar Multiples Tarjetas de regalo.",
"error_adding_updating" => "Error al agregar o actualizar la Tarjeta de Regalo.",
"error_updating_multiple" => "Fallo en la actualización de la(s) Tarjeta(s) de regalo.",
"generate_barcodes" => "Generar Códigos de Barra",
"giftcard" => "Tarjeta de Regalo",
"giftcard_number" => "Numero de la Tarjeta de Regalo",
"info_provided_by" => "Información provista por",
"inventory_comments" => "Comentarios",
"is_serialized" => "La Tarjeta de Regalo tiene Numero de Serie",
"low_inventory_giftcards" => "Tarjetas de Regalo con Inventario Bajo",
"manually_editing_of_quantity" => "Editor Manual de Cantidad",
"must_select_giftcard_for_barcode" => "Debes seleccionar al menos (1) Tarjeta de Regalo para generar Códigos de Barra.",
"new" => "Nueva Tarjeta de Regalo",
"no_description_giftcards" => "Gif Cards sin Descripción",
"no_giftcards_to_display" => "No hay Gift Cards para mostrar.",
"none" => "Ninguno",
"none_selected" => "",
"number" => "",
"number_information" => "",
"number_required" => "",
"one_or_multiple" => "",
"person_id" => "",
"quantity" => "",
"quantity_required" => "",
"remaining_balance" => "",
"reorder_level" => "",
"retrive_giftcard_info" => "",
"sales_tax_1" => "",
"sales_tax_2" => "",
"serialized_giftcards" => "",
"successful_adding" => "",
"successful_bulk_edit" => "",
"successful_deleted" => "",
"successful_updating" => "",
"supplier" => "",
"tax_1" => "",
"tax_2" => "",
"tax_percent" => "",
"tax_percents" => "",
"unit_price" => "",
"upc_database" => "",
"update" => "",
"use_inventory_menu" => "",
"value" => "",
"value_required" => "",
];

View File

@@ -1,42 +1,41 @@
<?php
return [
'add_item' => "Agregar Artículo",
'all' => "Todo",
'cannot_be_deleted' => "Borrado de Kit(s) de Artículos fallido.",
'confirm_delete' => "¿Estás seguro(a) de querer borrar los kits seleccionados?",
'confirm_restore' => "¿Está seguro de querer restaurar lo(s) kit(s) seleccionado(s)?",
'description' => "Descripción del Kit de Artículos",
'discount' => "Descuento",
'discount_fixed' => "Descuento Fijo",
'discount_percent' => "Porcentaje de descuento",
'discount_type' => "Tipo de Descuento",
'error_adding_updating' => "Error agregando/actualizando Kit de Artículos.",
'find_kit_item' => "Kit de Artículos",
'info' => "Información del kit de artículos",
'item' => "Articulo",
'item_kit_number' => "Código de barras",
'item_kit_number_duplicate' => "El Número del Kit de Artículo ya está presente en la base de datos.",
'item_number' => "",
'item_number_duplicate' => "",
'items' => "Artículos",
'kit' => "ID del Kit",
'kit_and_components' => "Kits y Componentes",
'kit_and_stock' => "Kit y Stock",
'kit_only' => "Sólo kit",
'name' => "Nombre del Kit de Artículos",
'new' => "Nuevo Kit de Artículos",
'no_item_kits_to_display' => "Sin kit de artículos para mostrar.",
'none_selected' => "No ha seleccionado ningún kit de artículos.",
'one_or_multiple' => "Kit(s) de Artículos",
'price_option' => "Opciones de precio",
'priced_only' => "Sólo precio",
'print_option' => "Opciones de impresión",
'quantity' => "Cantidad",
'sequence' => "Secuencia",
'successful_adding' => "Has agregado un kit de artículos",
'successful_deleted' => "Se ha borrado correctamente",
'successful_updating' => "Kit de Artículos actualizado",
'unit_price' => "",
'update' => "Actualizar Kit de Artículos",
"add_item" => "Agregar Artículo",
"all" => "Todo",
"cannot_be_deleted" => "Borrado de Kit(s) de Artículos fallido.",
"confirm_delete" => "¿Estás seguro(a) de querer borrar los kits seleccionados?",
"confirm_restore" => "¿Está seguro de querer restaurar lo(s) kit(s) seleccionado(s)?",
"description" => "Descripción del Kit de Artículos",
"discount" => "Descuento",
"discount_fixed" => "Descuento Fijo",
"discount_percent" => "Porcentaje de descuento",
"discount_type" => "Tipo de Descuento",
"error_adding_updating" => "Error agregando/actualizando Kit de Artículos.",
"find_kit_item" => "Kit de Artículos",
"info" => "Información del kit de artículos",
"item" => "Artículo",
"item_kit_number" => "Código de barras",
"item_kit_number_duplicate" => "El Número del Kit de Artículo ya está presente en la base de datos.",
"item_number" => "",
"item_number_duplicate" => "",
"items" => "Artículos",
"kit" => "ID del Kit",
"kit_and_components" => "Kits y Componentes",
"kit_and_stock" => "Kit y Stock",
"kit_only" => "Sólo kit",
"name" => "Nombre del Kit de Artículos",
"new" => "Nuevo Kit de Artículos",
"no_item_kits_to_display" => "Sin kit de artículos para mostrar.",
"none_selected" => "No ha seleccionado ningún kit de artículos.",
"one_or_multiple" => "Kit(s) de Artículos",
"price_option" => "Opciones de precio",
"priced_only" => "Sólo precio",
"print_option" => "Opciones de impresión",
"quantity" => "Cantidad",
"sequence" => "Secuencia",
"successful_adding" => "Has agregado un kit de artículos",
"successful_deleted" => "Borrado completo",
"successful_updating" => "Kit de Artículos actualizado",
"unit_price" => "",
"update" => "Actualizar Kit de Artículos",
];

View File

@@ -1,121 +1,120 @@
<?php
return [
'add_minus' => "Inventario a agregar o disminuir.",
'allow_alt_description' => "Permitir Descripción Alternativa",
'amount_entry' => "Ingrese Cantidad",
'bulk_edit' => "Edición Masiva",
'buy_price_required' => "Precio de Compra es un campo requerido.",
'cannot_be_deleted' => "No se puede borrar el item(s) seleccionado, uno a mas de los items seleccionados tienen ventas.",
'cannot_find_item' => "Articulo no encontrado.",
'categories' => "",
'category' => "Categoría",
'category_new' => "",
'category_required' => "Categoría es un campo requerido.",
'change_all_to_allow_alt_desc' => "Permitir Descripción Alternativa para todo.",
'change_all_to_not_allow_allow_desc' => "No permitir Descripción Alternativa para todo.",
'change_all_to_serialized' => "Cambiar todo a Serializado",
'change_all_to_unserialized' => "Cambiar todo a No-Serializado",
'change_image' => "Cambiar Imagen",
'confirm_bulk_edit' => "¿Esta seguro que quiere editar los artículos seleccionados?",
'confirm_bulk_edit_wipe_taxes' => "Toda la información de Impuestos de los Artículos será reemplazada.",
'confirm_delete' => "¿Esta seguro que quiere eliminar los artículos seleccionados?",
'confirm_restore' => "¿Esta seguro de restaurar los articulos seleccionado?",
'cost_price' => "Precio mayoreo.",
'cost_price_number' => "El precio de mayoreo debe ser números.",
'cost_price_required' => "El precio de mayoreo es requerido.",
'count' => "Actualizar inventario",
'csv_import_failed' => "",
'csv_import_nodata_wrongformat' => "",
'csv_import_partially_failed' => "",
'csv_import_success' => "",
'current_quantity' => "Cantidad actual",
'default_pack_name' => "",
'description' => "Descripción",
'details_count' => "",
'do_nothing' => "",
'edit' => "",
'edit_fields_you_want_to_update' => "",
'edit_multiple_items' => "Edición de varios elementos",
'empty_upc_items' => "",
'error_adding_updating' => "",
'error_updating_multiple' => "",
'generate_barcodes' => "",
'hsn_code' => "",
'image' => "",
'import_items_csv' => "",
'info_provided_by' => "",
'inventory' => "Inventario",
'inventory_CSV_import_quantity' => "",
'inventory_comments' => "Comentarios",
'inventory_data_tracking' => "",
'inventory_date' => "Fecha",
'inventory_employee' => "Empleado",
'inventory_in_out_quantity' => "",
'inventory_remarks' => "",
'is_deleted' => "",
'is_printed' => "",
'is_serialized' => "el articulo tiene número de serie",
'item' => "Articulo",
'item_id' => "",
'item_number' => "Código de barras",
'item_number_duplicate' => "El código del artículo ya está presente en la base de datos.",
'kit' => "Kit",
'location' => "Ubicación",
'low_inventory_items' => "",
'low_sell_item' => "",
'manually_editing_of_quantity' => "",
'markup' => "",
'name' => "",
'name_required' => "",
'new' => "Nuevo articulo",
'no_description_items' => "",
'no_items_to_display' => "Sin artículos.",
'none' => "",
'none_selected' => "Debe elegir algún articulo para poder modificarlo",
'nonstock' => "",
'number_information' => "",
'number_required' => "",
'one_or_multiple' => "Articulos",
'pack_name' => "",
'qty_per_pack' => "Cantidad por paquete",
'quantity' => "Cantidad",
'quantity_number' => "Cantidad debe ser número.",
'quantity_required' => "Especifique la cantidad.",
'receiving_quantity' => "Cantidad recibida",
'remove_image' => "Quitar imagen",
'reorder_level' => "Cantidad minima",
'reorder_level_number' => "Cantidad minima deber ser numero.",
'reorder_level_required' => "Cantidad minima no puede estar vacío.",
'retrive_item_info' => "Obtener información del articulo",
'sales_tax_1' => "Impuesto de Ventas 1",
'sales_tax_2' => "Impuesto de Ventas 2",
'search_attributes' => "Atributos de Búsqueda",
'select_image' => "Seleccionar imagen",
'serialized_items' => "Artículos con número de serie",
'standard' => "Estándar",
'stock' => "Existencia",
'stock_location' => "Ubicación del inventario",
'stock_type' => "",
'successful_adding' => "",
'successful_bulk_edit' => "",
'successful_deleted' => "Se ha borrado correctamente",
'successful_updating' => "",
'supplier' => "",
'tax_1' => "",
'tax_2' => "",
'tax_3' => "",
'tax_category' => "",
'tax_percent' => "",
'tax_percent_number' => "",
'tax_percent_required' => "",
'tax_percents' => "",
'temp' => "",
'type' => "",
'unit_price' => "",
'unit_price_number' => "",
'unit_price_required' => "",
'upc_database' => "",
'update' => "",
'use_inventory_menu' => "",
"add_minus" => "Inventario a agregar o disminuir.",
"allow_alt_description" => "Permitir Descripción Alternativa",
"amount_entry" => "Ingrese Cantidad",
"bulk_edit" => "Edición Masiva",
"buy_price_required" => "Precio de Compra es un campo requerido.",
"cannot_be_deleted" => "No se puede borrar el item(s) seleccionado, uno a mas de los items seleccionados tienen ventas.",
"cannot_find_item" => "Articulo no encontrado.",
"categories" => "",
"category" => "Categoría",
"category_new" => "",
"category_required" => "Categoría es un campo requerido.",
"change_all_to_allow_alt_desc" => "Permitir Descripción Alternativa para todo.",
"change_all_to_not_allow_allow_desc" => "No permitir Descripción Alternativa para todo.",
"change_all_to_serialized" => "Cambiar todo a Serializado",
"change_all_to_unserialized" => "Cambiar todo a No-Serializado",
"change_image" => "Cambiar Imagen",
"confirm_bulk_edit" => "¿Esta seguro que quiere editar los artículos seleccionados?",
"confirm_bulk_edit_wipe_taxes" => "Toda la información de Impuestos de los Artículos será reemplazada.",
"confirm_delete" => "¿Esta seguro que quiere eliminar los artículos seleccionados?",
"confirm_restore" => "¿Esta seguro de restaurar los articulos seleccionado?",
"cost_price" => "",
"cost_price_number" => "",
"cost_price_required" => "",
"count" => "",
"csv_import_failed" => "",
"csv_import_nodata_wrongformat" => "",
"csv_import_partially_failed" => "",
"csv_import_success" => "",
"current_quantity" => "",
"default_pack_name" => "",
"description" => "",
"details_count" => "",
"do_nothing" => "",
"edit" => "",
"edit_fields_you_want_to_update" => "",
"edit_multiple_items" => "",
"empty_upc_items" => "",
"error_adding_updating" => "",
"error_updating_multiple" => "",
"generate_barcodes" => "",
"hsn_code" => "",
"image" => "",
"import_items_csv" => "",
"info_provided_by" => "",
"inventory" => "",
"inventory_CSV_import_quantity" => "",
"inventory_comments" => "",
"inventory_data_tracking" => "",
"inventory_date" => "",
"inventory_employee" => "",
"inventory_in_out_quantity" => "",
"inventory_remarks" => "",
"is_deleted" => "",
"is_printed" => "",
"is_serialized" => "",
"item" => "",
"item_id" => "",
"item_number" => "",
"item_number_duplicate" => "",
"kit" => "",
"location" => "",
"low_inventory_items" => "",
"low_sell_item" => "",
"manually_editing_of_quantity" => "",
"markup" => "",
"name" => "",
"name_required" => "",
"new" => "",
"no_description_items" => "",
"no_items_to_display" => "",
"none" => "",
"none_selected" => "",
"nonstock" => "",
"number_information" => "",
"number_required" => "",
"one_or_multiple" => "",
"pack_name" => "",
"qty_per_pack" => "",
"quantity" => "",
"quantity_number" => "",
"quantity_required" => "",
"receiving_quantity" => "",
"remove_image" => "",
"reorder_level" => "",
"reorder_level_number" => "",
"reorder_level_required" => "",
"retrive_item_info" => "",
"sales_tax_1" => "",
"sales_tax_2" => "",
"search_attributes" => "",
"select_image" => "",
"serialized_items" => "",
"standard" => "",
"stock" => "",
"stock_location" => "",
"stock_type" => "",
"successful_adding" => "",
"successful_bulk_edit" => "",
"successful_deleted" => "",
"successful_updating" => "",
"supplier" => "",
"tax_1" => "",
"tax_2" => "",
"tax_3" => "",
"tax_category" => "",
"tax_percent" => "",
"tax_percent_number" => "",
"tax_percent_required" => "",
"tax_percents" => "",
"temp" => "",
"type" => "",
"unit_price" => "",
"unit_price_number" => "",
"unit_price_required" => "",
"upc_database" => "",
"update" => "",
"use_inventory_menu" => "",
];

View File

@@ -1,16 +1,15 @@
<?php
return [
'gcaptcha' => "No soy un robot.",
'go' => "Entrar",
'invalid_gcaptcha' => "Por favor compruebe que usted no es un robot.",
'invalid_installation' => "La instalacion no es correcta, revise el archivo php.ini.",
'invalid_username_and_password' => "Usuario y/o Password Invalido.",
'login' => "Login",
'logout' => "Salir",
'migration_needed' => "Una migración de base de datos a {0} empezara después de entrar.",
'password' => "Contraseña",
'required_username' => "El nombre de usuario es obligatorio.",
'username' => "Usuario",
'welcome' => "Bienvenido a {0}!",
"gcaptcha" => "No soy un robot.",
"go" => "Entrar",
"invalid_gcaptcha" => "Por favor compruebe que usted no es un robot.",
"invalid_installation" => "La instalacion no es correcta, revise el archivo php.ini.",
"invalid_username_and_password" => "Usuario y/o Password Invalido.",
"login" => "Login",
"logout" => "Salir",
"migration_needed" => "Una migración de base de datos a {0} empezara después de entrar.",
"password" => "Contraseña",
"required_username" => "",
"username" => "Usuario",
"welcome" => "Bienvenido a {0}!",
];

View File

@@ -1,59 +1,58 @@
<?php
return [
'amount_due' => "",
'cancel_receiving' => "Cancelar",
'cannot_be_deleted' => "Falló al borrar Entrada(s).",
'comments' => "Comentarios",
'complete_receiving' => "Completado",
'confirm_cancel_receiving' => "Esta seguro que quiere eliminar esta recepción? Todos los items se borraran.",
'confirm_delete' => "Esta seguro que quiere borrar esta recepción? Esta acción no se puede deshacer.",
'confirm_finish_receiving' => "Esta seguro que quiere enviar esta recepción? Esto no se puede deshacer.",
'confirm_restore' => "",
'cost' => "Costo",
'daily' => "",
'date' => "Fecha de Recibido",
'date_required' => "Se debe de agregar la fecha correcta.",
'date_type' => "Fecha es un campo obligatorio.",
'delete_entire_sale' => "Borrar Venta Completa",
'discount' => "Descuento",
'edit' => "Editar",
'edit_sale' => "Editar Recepción",
'employee' => "Empleado",
'error_editing_item' => "Fallo la edición del item.",
'error_requisition' => "No se puede mover el inventario desde o hacia la misma Ubicación.",
'find_or_scan_item' => "Encontrar o Escanear Articulo",
'find_or_scan_item_or_receipt' => "Encontrar o Escanear Articulo o Recibo",
'id' => "ID de Recepción",
'item_name' => "Nombre del Articulo",
'mode' => "Modo de Recepción",
'new_supplier' => "Nuevo Proveedor",
'one_or_multiple' => "recepción(es)",
'print_after_sale' => "Imprimir después de la Venta",
'quantity' => "Cant.",
'receipt' => "Recibo de Recepcion",
'receipt_number' => "Recepción #",
'receiving' => "Recibir",
'reference' => "Referencia",
'register' => "Recepción de Artículos",
'requisition' => "Requisición",
'return' => "Devolución",
'select_supplier' => "Seleccionar Proveedor (Opcional)",
'ship_pack' => "Empaque de Envio",
'start_typing_supplier_name' => "Empiece a escribir el nombre del Proveedor...",
'stock' => "Existencia",
'stock_destination' => "Destino del Inventario",
'stock_locaiton' => "Ubicación del Inventario",
'stock_source' => "Origen del Inventario",
'successfully_deleted' => "Se ha borrado exitosamente",
'successfully_updated' => "Recepción actualizada exitosamente",
'supplier' => "Proveedor",
'supplier_address' => "Dirección",
'supplier_email' => "Email",
'supplier_location' => "Ubicación",
'total' => "Total",
'transaction_failed' => "Transacción de Recepción falló.",
'unable_to_add_item' => "Agregar Articulo a Recepción falló.",
'unsuccessfully_updated' => "Actualización de Recepción falló.",
'update' => "Actualizar",
"amount_due" => "",
"cancel_receiving" => "Cancelar",
"cannot_be_deleted" => "Falló al borrar Entrada(s).",
"comments" => "Comentarios",
"complete_receiving" => "Completado",
"confirm_cancel_receiving" => "Esta seguro que quiere eliminar esta recepción? Todos los items se borraran.",
"confirm_delete" => "Esta seguro que quiere borrar esta recepción? Esta acción no se puede deshacer.",
"confirm_finish_receiving" => "Esta seguro que quiere enviar esta recepción? Esto no se puede deshacer.",
"confirm_restore" => "",
"cost" => "Costo",
"daily" => "",
"date" => "Fecha de Recibido",
"date_required" => "Se debe de agregar la fecha correcta.",
"date_type" => "Fecha es un campo obligatorio.",
"delete_entire_sale" => "Borrar Venta Completa",
"discount" => "Descuento",
"edit" => "Editar",
"edit_sale" => "Editar Recepción",
"employee" => "Empleado",
"error_editing_item" => "Fallo la edición del item.",
"error_requisition" => "No se puede mover el inventario desde o hacia la misma Ubicación.",
"find_or_scan_item" => "Encontrar o Escanear Articulo",
"find_or_scan_item_or_receipt" => "Encontrar o Escanear Articulo o Recibo",
"id" => "ID de Recepción",
"item_name" => "Nombre del Articulo",
"mode" => "Modo de Recepción",
"new_supplier" => "Nuevo Proveedor",
"one_or_multiple" => "recepción(es)",
"print_after_sale" => "Imprimir después de la Venta",
"quantity" => "Cant.",
"receipt" => "Recibo de Recepcion",
"receipt_number" => "Recepción #",
"receiving" => "Recibir",
"reference" => "Referencia",
"register" => "Recepción de Artículos",
"requisition" => "Requisición",
"return" => "Devolución",
"select_supplier" => "Seleccionar Proveedor (Opcional)",
"ship_pack" => "Empaque de Envio",
"start_typing_supplier_name" => "Empiece a escribir el nombre del Proveedor...",
"stock" => "Inventario",
"stock_destination" => "Destino del Inventario",
"stock_locaiton" => "Ubicación del Inventario",
"stock_source" => "Origen del Inventario",
"successfully_deleted" => "Se ha borrado exitosamente",
"successfully_updated" => "Recepción actualizada exitosamente",
"supplier" => "Proveedor",
"supplier_address" => "Dirección",
"supplier_email" => "Email",
"supplier_location" => "Ubicación",
"total" => "Total",
"transaction_failed" => "Transacción de Recepción falló.",
"unable_to_add_item" => "Agregar Articulo a Recepción falló.",
"unsuccessfully_updated" => "Actualización de Recepción falló.",
"update" => "Actualizar",
];

View File

@@ -1,149 +1,148 @@
<?php
return [
'all' => "Todas",
'authority' => "Autoridad",
'canceled' => "Cancelado",
'categories' => "Categorías",
'categories_summary_report' => "Informe resumido de categorías",
'category' => "Categoría",
'code_canceled' => "CNL",
'code_invoice' => "INV",
'code_pos' => "POS",
'code_quote' => "Q",
'code_return' => "RET",
'code_type' => "Tipo",
'code_work_order' => "OT",
'comments' => "Comentarios",
'commission' => "",
'complete' => "Ventas y Devoluciones Completadas",
'completed_sales' => "Ventas Completadas",
'confirm_delete' => "Está seguro que quiere borrar la(s) entrada(s) seleccionada(s)?",
'confirm_restore' => "Está seguro que quiere restaurar la(s) entrada(s) seleccionada(s)?",
'cost' => "Al por mayor",
'cost_price' => "Precio mayoreo.",
'count' => "Contar",
'customer' => "Cliente",
'customers' => "Clientes",
'customers_summary_report' => "Reporte Resumido de Clientes",
'date' => "Fecha",
'date_range' => "Rango de Fecha",
'description' => "Descripción",
'detailed_receivings_report' => "Reporte Detallado de Recepciones",
'detailed_receivings_report_input' => "",
'detailed_reports' => "Reportes detallados",
'detailed_requisition_report' => "",
'detailed_sales_report' => "Reporte Detallado de Transacciones",
'discount' => "Descuento",
'discount_fixed' => "Descuento Fijo",
'discount_percent' => "Porcentaje de Descuento",
'discount_type' => "Tipo de Descuento",
'discounts' => "Descuentos",
'discounts_summary_report' => "Reporte Resumido de Descuentos",
'earned' => "Puntos ganados",
'employee' => "Empleado",
'employees' => "Empleados",
'employees_summary_report' => "Reporte Resumido de Empleados",
'expenses' => "Gastos",
'expenses_amount' => "Cantidad",
'expenses_categories' => "Gastos",
'expenses_categories_summary_report' => "Reporte Resumido de Gastos por Categoría",
'expenses_category' => "Categoría",
'expenses_payment_amount' => "",
'expenses_tax_amount' => "Impuesto",
'expenses_total_amount' => "Monto Total",
'expenses_total_tax_amount' => "Impuesto Total",
'graphical_reports' => "Reportes Gráficos",
'inventory' => "Inventario",
'inventory_low' => "Inventario Bajo",
'inventory_low_report' => "Reporte de Inventario Bajo",
'inventory_reports' => "Reportes de Inventario",
'inventory_summary' => "Resumen de Inventario",
'inventory_summary_report' => "Reporte Resumido de Inventario",
'item' => "Articulo",
'item_count' => "Filtrar Recuento de Artículos",
'item_name' => "Nombre del Artículo",
'item_number' => "Código de barras",
'items' => "Artículos",
'items_purchased' => "Artículos Comprados",
'items_received' => "Artículos Recibidos",
'items_summary_report' => "Reporte Resumido de Artículos",
'jurisdiction' => "Jurisdicción",
'low_inventory' => "",
'low_inventory_report' => "",
'low_sell_quantity' => "Cantidad Venta Baja",
'more_than_zero' => "Más que cero",
'name' => "Nombre",
'no_reports_to_display' => "No hay Artículos para mostrar.",
'payment_type' => "Tipo de Pago",
'payments' => "Pagos",
'payments_summary_report' => "Reporte Resumido de Pagos",
'profit' => "Ganancias",
'quantity' => "Cantidad",
'quantity_purchased' => "Cantidad Comprada",
'quotes' => "Presupuesto",
'received_by' => "Recepcionado por",
'receiving_id' => "Id de Recepción",
'receiving_type' => "Tipo de Recepción",
'receivings' => "Recepciones",
'reorder_level' => "Cantidad minima",
'report' => "Reporte",
'report_input' => "Entrada de Reporte",
'reports' => "Reportes",
'requisition' => "",
'requisition_by' => "",
'requisition_id' => "",
'requisition_item' => "",
'requisition_item_quantity' => "",
'requisition_related_item' => "",
'requisition_related_item_total_quantity' => "",
'requisition_related_item_unit_quantity' => "",
'requisitions' => "Requisiciones",
'returns' => "Devoluciones",
'revenue' => "Ingresos",
'sale_id' => "Id de Transacciones",
'sale_type' => "Tipo de Transacción",
'sales' => "Transacciones",
'sales_amount' => "Monto de Transacciones",
'sales_summary_report' => "Reporte Resumido de Transacciones",
'sales_taxes' => "Impuesto sobre las Ventas",
'sales_taxes_summary_report' => "Reporte Resumido de Impuestos sobre las Ventas",
'serial_number' => "Número de Serie",
'service_charge' => "",
'sold_by' => "Vendido por",
'sold_items' => "",
'sold_to' => "Vendido a",
'stock_location' => "Ubicación de Stock",
'sub_total_value' => "el Subtotal",
'subtotal' => "el Subtotal",
'summary_reports' => "Reportes Resumidos",
'supplied_by' => "Suministrado por",
'supplier' => "Proveedor",
'suppliers' => "Proveedores",
'suppliers_summary_report' => "Reporte Resumido de Proveedores",
'tax' => "Impuesto",
'tax_category' => "Categoría de Impuesto",
'tax_name' => "Nombre de Impuesto",
'tax_percent' => "Porcentaje de Impuesto",
'tax_rate' => "Tarifa de Impuesto",
'taxes' => "Impuestos",
'taxes_summary_report' => "Reporte Resumido de Impuestos",
'total' => "Total",
'total_inventory_value' => "Valor Total del Inventario",
'total_low_sell_quantity' => "Cantidad Total de Venta Baja",
'total_quantity' => "Cantidad Total",
'total_retail' => "Valor Menor Total del Inventario",
'trans_amount' => "Monto de Transacción",
'trans_due' => "Debido",
'trans_group' => "Grupo de Transacción",
'trans_nopay_sales' => "Ventas sin pago",
'trans_payments' => "Pagos",
'trans_refunded' => "Reembolsado",
'trans_sales' => "Ventas",
'trans_type' => "Tipo de Transacción",
'type' => "Tipo",
'unit_price' => "Precio de Venta",
'used' => "Puntos Usados",
'work_orders' => "Órdenes de Trabajo",
'zero_and_less' => "Cero y menos",
"all" => "Todas",
"authority" => "Autoridad",
"canceled" => "Cancelado",
"categories" => "Categorías",
"categories_summary_report" => "Informe resumido de categorías",
"category" => "Categoría",
"code_canceled" => "CNL",
"code_invoice" => "INV",
"code_pos" => "POS",
"code_quote" => "Q",
"code_return" => "RET",
"code_type" => "Tipo",
"code_work_order" => "OT",
"comments" => "Comentarios",
"commission" => "",
"complete" => "Ventas y Devoluciones Completadas",
"completed_sales" => "Ventas Completadas",
"confirm_delete" => "Está seguro que quiere borrar la(s) entrada(s) seleccionada(s)?",
"confirm_restore" => "Está seguro que quiere restaurar la(s) entrada(s) seleccionada(s)?",
"cost" => "Al por mayor",
"cost_price" => "Precio al por mayor",
"count" => "Contar",
"customer" => "Cliente",
"customers" => "Clientes",
"customers_summary_report" => "Reporte Resumido de Clientes",
"date" => "Fecha",
"date_range" => "Rango de Fecha",
"description" => "Descripción",
"detailed_receivings_report" => "Reporte Detallado de Recepciones",
"detailed_receivings_report_input" => "",
"detailed_reports" => "Reportes detallados",
"detailed_requisition_report" => "",
"detailed_sales_report" => "Reporte Detallado de Transacciones",
"discount" => "Descuento",
"discount_fixed" => "Descuento Fijo",
"discount_percent" => "Porcentaje de Descuento",
"discount_type" => "Tipo de Descuento",
"discounts" => "Descuentos",
"discounts_summary_report" => "Reporte Resumido de Descuentos",
"earned" => "Puntos ganados",
"employee" => "Empleado",
"employees" => "Empleados",
"employees_summary_report" => "Reporte Resumido de Empleados",
"expenses" => "Gastos",
"expenses_amount" => "Cantidad",
"expenses_categories" => "Gastos",
"expenses_categories_summary_report" => "Reporte Resumido de Gastos por Categoría",
"expenses_category" => "Categoría",
"expenses_payment_amount" => "",
"expenses_tax_amount" => "Impuesto",
"expenses_total_amount" => "Monto Total",
"expenses_total_tax_amount" => "Impuesto Total",
"graphical_reports" => "Reportes Gráficos",
"inventory" => "Inventario",
"inventory_low" => "Inventario Bajo",
"inventory_low_report" => "Reporte de Inventario Bajo",
"inventory_reports" => "Reportes de Inventario",
"inventory_summary" => "Resumen de Inventario",
"inventory_summary_report" => "Reporte Resumido de Inventario",
"item" => "Artículo",
"item_count" => "Filtrar Recuento de Artículos",
"item_name" => "Nombre del Artículo",
"item_number" => "Código de barras",
"items" => "Artículos",
"items_purchased" => "Artículos Comprados",
"items_received" => "Artículos Recibidos",
"items_summary_report" => "Reporte Resumido de Artículos",
"jurisdiction" => "Jurisdicción",
"low_inventory" => "",
"low_inventory_report" => "",
"low_sell_quantity" => "Cantidad Venta Baja",
"more_than_zero" => "Más que cero",
"name" => "Nombre",
"no_reports_to_display" => "No hay Artículos para mostrar.",
"payment_type" => "Tipo de Pago",
"payments" => "Pagos",
"payments_summary_report" => "Reporte Resumido de Pagos",
"profit" => "Ganancias",
"quantity" => "Cantidad",
"quantity_purchased" => "Cantidad Comprada",
"quotes" => "Presupuesto",
"received_by" => "Recepcionado por",
"receiving_id" => "Id de Recepción",
"receiving_type" => "Tipo de Recepción",
"receivings" => "Recepciones",
"reorder_level" => "Cantidad nima",
"report" => "Reporte",
"report_input" => "Entrada de Reporte",
"reports" => "Reportes",
"requisition" => "",
"requisition_by" => "",
"requisition_id" => "",
"requisition_item" => "",
"requisition_item_quantity" => "",
"requisition_related_item" => "",
"requisition_related_item_total_quantity" => "",
"requisition_related_item_unit_quantity" => "",
"requisitions" => "Requisiciones",
"returns" => "Devoluciones",
"revenue" => "Ingresos",
"sale_id" => "Id de Transacciones",
"sale_type" => "Tipo de Transacción",
"sales" => "Transacciones",
"sales_amount" => "Monto de Transacciones",
"sales_summary_report" => "Reporte Resumido de Transacciones",
"sales_taxes" => "Impuesto sobre las Ventas",
"sales_taxes_summary_report" => "Reporte Resumido de Impuestos sobre las Ventas",
"serial_number" => "Número de Serie",
"service_charge" => "",
"sold_by" => "Vendido por",
"sold_items" => "",
"sold_to" => "Vendido a",
"stock_location" => "Ubicación de Stock",
"sub_total_value" => "el Subtotal",
"subtotal" => "el Subtotal",
"summary_reports" => "Reportes Resumidos",
"supplied_by" => "Suministrado por",
"supplier" => "Proveedor",
"suppliers" => "Proveedores",
"suppliers_summary_report" => "Reporte Resumido de Proveedores",
"tax" => "Impuesto",
"tax_category" => "Categoría de Impuesto",
"tax_name" => "Nombre de Impuesto",
"tax_percent" => "Porcentaje de Impuesto",
"tax_rate" => "Tarifa de Impuesto",
"taxes" => "Impuestos",
"taxes_summary_report" => "Reporte Resumido de Impuestos",
"total" => "Total",
"total_inventory_value" => "Valor Total del Inventario",
"total_low_sell_quantity" => "Cantidad Total de Venta Baja",
"total_quantity" => "Cantidad Total",
"total_retail" => "Valor Menor Total del Inventario",
"trans_amount" => "Monto de Transacción",
"trans_due" => "Debido",
"trans_group" => "Grupo de Transacción",
"trans_nopay_sales" => "Ventas sin pago",
"trans_payments" => "Pagos",
"trans_refunded" => "Reembolsado",
"trans_sales" => "Ventas",
"trans_type" => "Tipo de Transacción",
"type" => "Tipo",
"unit_price" => "Precio de Venta",
"used" => "Puntos Usados",
"work_orders" => "Órdenes de Trabajo",
"zero_and_less" => "Cero y menos",
];

View File

@@ -1,225 +1,224 @@
<?php
return [
'customers_available_points' => "Puntos Disponibles",
'rewards_package' => "Premios",
'rewards_remaining_balance' => "Puntos de recompensa sobrante son: ",
'account_number' => "Cuenta #",
'add_payment' => "Agregar Pago",
'amount_due' => "Monto de adeudo",
'amount_tendered' => "Cantidad Recibida",
'authorized_signature' => "Firma Autorizada",
'cancel_sale' => "Cancelar",
'cash' => "Efectivo",
'cash_1' => "",
'cash_2' => "",
'cash_3' => "",
'cash_4' => "",
'cash_adjustment' => "Ajuste de efectivo",
'cash_deposit' => "Deposito en Efectivo",
'cash_filter' => "Efectivo",
'change_due' => "Cambio",
'change_price' => "Cambiar precio de venta",
'check' => "Cheque",
'check_balance' => "Balance de Cheque",
'check_filter' => "Comprobar",
'close' => "",
'comment' => "Comentario",
'comments' => "Comentarios",
'company_name' => "",
'complete' => "",
'complete_sale' => "Completar",
'confirm_cancel_sale' => "¿Está seguro que desea limpiar la venta? Todos los artículos serán borrados.",
'confirm_delete' => "¿Está seguro que desea borrar todas las ventas seleccionadas?",
'confirm_restore' => "¿Está seguro de desear restaurar las ventas seleccionadas?",
'credit' => "Tarjeta de Crédito",
'credit_deposit' => "Deposito de crédito",
'credit_filter' => "Tarjeta de crédito",
'current_table' => "",
'customer' => "Cliente",
'customer_address' => "Dirección",
'customer_discount' => "Descuento",
'customer_email' => "Correo electrónico",
'customer_location' => "Ubicación",
'customer_mailchimp_status' => "Estado de MailChimp",
'customer_optional' => "(Obligatorio para pagos vencidos)",
'customer_required' => "(Obligatorio)",
'customer_total' => "Total",
'customer_total_spent' => "",
'daily_sales' => "",
'date' => "Fecha de venta",
'date_range' => "Rango de fechas",
'date_required' => "Ingresar una fecha correcta.",
'date_type' => "La fecha es un campo requerido.",
'debit' => "Tarjeta de débito",
'debit_filter' => "",
'delete' => "Permitir borrar",
'delete_confirmation' => "¿Seguro(a) de querer borrar esta venta? Esta acción no se puede deshacer.",
'delete_entire_sale' => "Eliminar la venta completa",
'delete_successful' => "Venta borrada correctamente.",
'delete_unsuccessful' => "Fallo al borrar la venta.",
'description_abbrv' => "Descrip.",
'discard' => "Descartar",
'discard_quote' => "",
'discount' => "Desc.",
'discount_included' => "% Descuento",
'discount_short' => "%",
'due' => "Adeudo",
'due_filter' => "Adeudo",
'edit' => "Editar",
'edit_item' => "Editar artículo",
'edit_sale' => "Editar venta",
'email_receipt' => "Enviar ticket",
'employee' => "Empleado",
'entry' => "Entrada",
'error_editing_item' => "Error editando el artículo",
'find_or_scan_item' => "Buscar o escanear artículo",
'find_or_scan_item_or_receipt' => "Buscar o escanear artículo o recibo",
'giftcard' => "Tarjeta de regalo",
'giftcard_balance' => "Balance de Tarjeta de Regalo",
'giftcard_filter' => "",
'giftcard_number' => "Número de Tarjeta de Regalo",
'group_by_category' => "Grupo por Categoría",
'group_by_type' => "Grupo por Tipo",
'hsn' => "HSN",
'id' => "ID de Venta",
'include_prices' => "¿Incluir precios?",
'invoice' => "Factura de venta",
'invoice_confirm' => "Esta factura sera enviada a",
'invoice_enable' => "Crear factura",
'invoice_filter' => "Facturas",
'invoice_no_email' => "Este cliente no tiene un correo electrónico válido.",
'invoice_number' => "Factura #",
'invoice_number_duplicate' => "Por favor ingrese un número de factura único.",
'invoice_sent' => "Factura enviada a",
'invoice_total' => "Total Facturado",
'invoice_type_custom_invoice' => "Factura Personalizada (custom_invoice.php)",
'invoice_type_custom_tax_invoice' => "Factura de Impuesto personalizada (custom_tax_invoice.php)",
'invoice_type_invoice' => "Factura",
'invoice_type_tax_invoice' => "Factura de Impuestos",
'invoice_unsent' => "Fallo el envio de la factura a",
'invoice_update' => "Recuento",
'item_insufficient_of_stock' => "Cantidad insuficiente en inventario.",
'item_name' => "Nombre del Artículo",
'item_number' => "Artículo #",
'item_out_of_stock' => "El artículo está agotado.",
'key_browser' => "Atajos Útiles",
'key_cancel' => "Cancelar actual Cotización/Factura/Venta",
'key_customer_search' => "Buscar Cliente",
'key_finish_quote' => "Finalizar Cotización/Factura sin pago",
'key_finish_sale' => "Agregar pago y Completar la Factura/Venta",
'key_full' => "Abrir en modo Pantalla Completa",
'key_function' => "Function",
'key_help' => "Atajos",
'key_help_modal' => "Abrir Ventana de Atajos",
'key_in' => "Acercar",
'key_item_search' => "Buscar Artículo",
'key_out' => "Alejar",
'key_payment' => "Agregar Pago",
'key_print' => "Imprimir Página Actual",
'key_restore' => "Restaurar Vista",
'key_search' => "Buscar Tablas de Reporte",
'key_suspend' => "Suspender Venta Actual",
'key_suspended' => "Mostrar Ventas Suspendidas",
'key_system' => "Atajos del Sistema",
'key_tendered' => "Editar Importe Licitado",
'key_title' => "Atajos de Teclado para Ventas",
'mc' => "",
'mode' => "Registrar Modo",
'must_enter_numeric' => "Cantidad recibida debe ser un número.",
'must_enter_numeric_giftcard' => "Número de Tarjeta de Regalo debe ser un número.",
'new_customer' => "Cliente Nuevo",
'new_item' => "Artículo Nuevo",
'no_description' => "Sin descripción",
'no_filter' => "Todos",
'no_items_in_cart' => "No hay artículos en el carrito.",
'no_sales_to_display' => "No hay ventas que mostrar.",
'none_selected' => "No has seleccionado alguna venta para borrar.",
'nontaxed_ind' => " ' ",
'not_authorized' => "Esta acción no esta autorizada.",
'one_or_multiple' => "Venta(s)",
'payment' => "Tipo de pago",
'payment_amount' => "Cantidad",
'payment_not_cover_total' => "La cantidad pagada debe ser mayor o igual al Total.",
'payment_type' => "Tipo",
'payments' => "",
'payments_total' => "Total de pagado",
'price' => "Precio",
'print_after_sale' => "Imprimir recibo después de una venta",
'quantity' => "Cantidad",
'quantity_less_than_reorder_level' => "Advertencia. La cantidad deseada es insuficiente.",
'quantity_less_than_zero' => "Advertencia. La cantidad deseada es insuficiente. Puedes procesar la venta, pero verifica tu inventario.",
'quantity_of_items' => "Cantidad de {0} artículos",
'quote' => "Cotizar",
'quote_number' => "Número de presupuesto",
'quote_number_duplicate' => "El número de cotización debe ser único.",
'quote_sent' => "Cotización enviada a",
'quote_unsent' => "La cotización no se pudo enviar a",
'receipt' => "Recibo de venta",
'receipt_no_email' => "Este cliente no tiene una dirección de correo válida.",
'receipt_number' => "Venta #",
'receipt_sent' => "Recibo enviado a",
'receipt_unsent' => "Falló el envío del recibo a",
'refund' => "Modo de Reembolso",
'register' => "Registro de ventas",
'remove_customer' => "Borrar cliente",
'remove_discount' => "",
'return' => "Devolución",
'rewards' => "Puntos de recompensa",
'rewards_balance' => "Balance de puntos de recompensa",
'sale' => "Venta",
'sale_by_invoice' => "Venta por factura",
'sale_for_customer' => "Cliente:",
'sale_time' => "Hora",
'sales_tax' => "Impuestos",
'sales_total' => "",
'select_customer' => "Seleccionar cliente",
'send_invoice' => "Enviar factura",
'send_quote' => "Enviar cotización",
'send_receipt' => "Enviar recibo",
'send_work_order' => "Enviar orden de trabajo",
'serial' => "Serie",
'service_charge' => "",
'show_due' => "",
'show_invoice' => "Mostrar factura",
'show_receipt' => "Mostrar recibo",
'start_typing_customer_name' => "Empiece a escribir los detalles del cliente...",
'start_typing_item_name' => "Escriba el nombre del artículo o escanea el código de barras...",
'stock' => "Existencia",
'stock_location' => "Localización del inventario",
'sub_total' => "el subtotal",
'successfully_deleted' => "Se ha eliminado",
'successfully_restored' => "Se ha restuarado satisfactoriamente",
'successfully_suspended_sale' => "La venta se ha suspendido.",
'successfully_updated' => "Venta actualizada.",
'suspend_sale' => "Suspender",
'suspended_doc_id' => "Documento",
'suspended_sale_id' => "ID",
'suspended_sales' => "Suspendidas",
'table' => "Datos",
'takings' => "Ventas diarias",
'tax' => "Impuestos",
'tax_id' => "ID Impuesto",
'tax_invoice' => "Impuesto de la factura",
'tax_percent' => "Impuesto %",
'taxed_ind' => "T",
'total' => "Total",
'total_tax_exclusive' => "Sin impuesto",
'transaction_failed' => "Ha fallado la venta.",
'unable_to_add_item' => "Falló al agregar artículos para venta",
'unsuccessfully_deleted' => "La eliminación de venta falló.",
'unsuccessfully_restored' => "La restauración de la venta falló.",
'unsuccessfully_suspended_sale' => "La suspensión de venta falló.",
'unsuccessfully_updated' => "Ha fallado la actualización de la venta.",
'unsuspend' => "Retomar",
'unsuspend_and_delete' => "Acción",
'update' => "Actualizar",
'upi' => "UPI",
'visa' => "",
'wholesale' => "",
'work_order' => "Orden de trabajo",
'work_order_number' => "Número de orden de trabajo",
'work_order_number_duplicate' => "El número de orden de trabajo debe ser único.",
'work_order_sent' => "Orden de trabajo enviada a",
'work_order_unsent' => "Falló la Orden de Trabajo al enviar a",
"customers_available_points" => "Puntos Disponibles",
"rewards_package" => "Premios",
"rewards_remaining_balance" => "Puntos de recompensa sobrante son: ",
"account_number" => "Cuenta #",
"add_payment" => "Agregar Pago",
"amount_due" => "Monto de adeudo",
"amount_tendered" => "Cantidad Recibida",
"authorized_signature" => "Firma Autorizada",
"cancel_sale" => "Cancelar",
"cash" => "Efectivo",
"cash_1" => "",
"cash_2" => "",
"cash_3" => "",
"cash_4" => "",
"cash_adjustment" => "Ajuste de efectivo",
"cash_deposit" => "Deposito en Efectivo",
"cash_filter" => "Efectivo",
"change_due" => "Cambio",
"change_price" => "Cambiar precio de venta",
"check" => "Cheque",
"check_balance" => "Balance de Cheque",
"check_filter" => "Comprobar",
"close" => "",
"comment" => "Comentario",
"comments" => "Comentarios",
"company_name" => "",
"complete" => "",
"complete_sale" => "Completar",
"confirm_cancel_sale" => "¿Está seguro que desea limpiar la venta? Todos los artículos serán borrados.",
"confirm_delete" => "¿Está seguro que desea borrar todas las ventas seleccionadas?",
"confirm_restore" => "¿Está seguro de desear restaurar las ventas seleccionadas?",
"credit" => "Tarjeta de Crédito",
"credit_deposit" => "Deposito de crédito",
"credit_filter" => "Tarjeta de crédito",
"current_table" => "",
"customer" => "Cliente",
"customer_address" => "Dirección",
"customer_discount" => "Descuento",
"customer_email" => "Correo electrónico",
"customer_location" => "Ubicación",
"customer_mailchimp_status" => "Estado de MailChimp",
"customer_optional" => "(Obligatorio para pagos vencidos)",
"customer_required" => "(Obligatorio)",
"customer_total" => "Total",
"customer_total_spent" => "",
"daily_sales" => "",
"date" => "Fecha de venta",
"date_range" => "Rango de fechas",
"date_required" => "Ingresar una fecha correcta.",
"date_type" => "La fecha es un campo requerido.",
"debit" => "Tarjeta de débito",
"debit_filter" => "",
"delete" => "Permitir borrar",
"delete_confirmation" => "¿Seguro(a) de querer borrar esta venta? Esta acción no se puede deshacer.",
"delete_entire_sale" => "Eliminar la venta completa",
"delete_successful" => "Venta borrada correctamente.",
"delete_unsuccessful" => "Fallo al borrar la venta.",
"description_abbrv" => "Descrip.",
"discard" => "Descartar",
"discard_quote" => "",
"discount" => "Desc.",
"discount_included" => "% Descuento",
"discount_short" => "%",
"due" => "Adeudo",
"due_filter" => "Adeudo",
"edit" => "Editar",
"edit_item" => "Editar artículo",
"edit_sale" => "Editar venta",
"email_receipt" => "Enviar ticket",
"employee" => "Empleado",
"entry" => "Entrada",
"error_editing_item" => "Error editando el artículo",
"find_or_scan_item" => "Buscar o escanear artículo",
"find_or_scan_item_or_receipt" => "Buscar o escanear artículo o recibo",
"giftcard" => "Tarjeta de regalo",
"giftcard_balance" => "Balance de Tarjeta de Regalo",
"giftcard_filter" => "",
"giftcard_number" => "Número de Tarjeta de Regalo",
"group_by_category" => "Grupo por Categoría",
"group_by_type" => "Grupo por Tipo",
"hsn" => "HSN",
"id" => "ID de Venta",
"include_prices" => "¿Incluir precios?",
"invoice" => "Factura de venta",
"invoice_confirm" => "Esta factura sera enviada a",
"invoice_enable" => "Crear factura",
"invoice_filter" => "Facturas",
"invoice_no_email" => "Este cliente no tiene un correo electrónico válido.",
"invoice_number" => "Factura #",
"invoice_number_duplicate" => "Por favor ingrese un número de factura único.",
"invoice_sent" => "Factura enviada a",
"invoice_total" => "Total Facturado",
"invoice_type_custom_invoice" => "Factura Personalizada (custom_invoice.php)",
"invoice_type_custom_tax_invoice" => "Factura de Impuesto personalizada (custom_tax_invoice.php)",
"invoice_type_invoice" => "Factura",
"invoice_type_tax_invoice" => "Factura de Impuestos",
"invoice_unsent" => "Fallo el envio de la factura a",
"invoice_update" => "Recuento",
"item_insufficient_of_stock" => "Cantidad insuficiente en inventario.",
"item_name" => "Nombre del Artículo",
"item_number" => "Artículo #",
"item_out_of_stock" => "El artículo está agotado.",
"key_browser" => "Atajos Útiles",
"key_cancel" => "Cancelar actual Cotización/Factura/Venta",
"key_customer_search" => "Buscar Cliente",
"key_finish_quote" => "Finalizar Cotización/Factura sin pago",
"key_finish_sale" => "Agregar pago y Completar la Factura/Venta",
"key_full" => "Abrir en modo Pantalla Completa",
"key_function" => "Function",
"key_help" => "Atajos",
"key_help_modal" => "Abrir Ventana de Atajos",
"key_in" => "Acercar",
"key_item_search" => "Buscar Artículo",
"key_out" => "Alejar",
"key_payment" => "Agregar Pago",
"key_print" => "Imprimir Página Actual",
"key_restore" => "Restaurar Vista",
"key_search" => "Buscar Tablas de Reporte",
"key_suspend" => "Suspender Venta Actual",
"key_suspended" => "Mostrar Ventas Suspendidas",
"key_system" => "Atajos del Sistema",
"key_tendered" => "Editar Importe Licitado",
"key_title" => "Atajos de Teclado para Ventas",
"mc" => "",
"mode" => "Registrar Modo",
"must_enter_numeric" => "Cantidad recibida debe ser un número.",
"must_enter_numeric_giftcard" => "Número de Tarjeta de Regalo debe ser un número.",
"new_customer" => "Cliente Nuevo",
"new_item" => "Artículo Nuevo",
"no_description" => "Sin descripción",
"no_filter" => "Todos",
"no_items_in_cart" => "No hay artículos en el carrito.",
"no_sales_to_display" => "No hay ventas que mostrar.",
"none_selected" => "No has seleccionado alguna venta para borrar.",
"nontaxed_ind" => " ' ",
"not_authorized" => "Esta acción no esta autorizada.",
"one_or_multiple" => "Venta(s)",
"payment" => "Tipo de pago",
"payment_amount" => "Cantidad",
"payment_not_cover_total" => "La cantidad pagada debe ser mayor o igual al Total.",
"payment_type" => "Tipo",
"payments" => "",
"payments_total" => "Total de pagado",
"price" => "Precio",
"print_after_sale" => "Imprimir recibo después de una venta",
"quantity" => "Cantidad",
"quantity_less_than_reorder_level" => "Advertencia. La cantidad deseada es insuficiente.",
"quantity_less_than_zero" => "Advertencia. La cantidad deseada es insuficiente. Puedes procesar la venta, pero verifica tu inventario.",
"quantity_of_items" => "Cantidad de {0} artículos",
"quote" => "Cotizar",
"quote_number" => "Número de presupuesto",
"quote_number_duplicate" => "El número de cotización debe ser único.",
"quote_sent" => "Cotización enviada a",
"quote_unsent" => "La cotización no se pudo enviar a",
"receipt" => "Recibo de venta",
"receipt_no_email" => "Este cliente no tiene una dirección de correo válida.",
"receipt_number" => "Venta #",
"receipt_sent" => "Recibo enviado a",
"receipt_unsent" => "Falló el envío del recibo a",
"refund" => "Modo de Reembolso",
"register" => "Registro de ventas",
"remove_customer" => "Borrar cliente",
"remove_discount" => "",
"return" => "Devolución",
"rewards" => "Puntos de recompensa",
"rewards_balance" => "Balance de puntos de recompensa",
"sale" => "Venta",
"sale_by_invoice" => "Venta por factura",
"sale_for_customer" => "Cliente:",
"sale_time" => "Hora",
"sales_tax" => "Impuestos",
"sales_total" => "",
"select_customer" => "Seleccionar cliente",
"send_invoice" => "Enviar factura",
"send_quote" => "Enviar cotización",
"send_receipt" => "Enviar recibo",
"send_work_order" => "Enviar orden de trabajo",
"serial" => "Serie",
"service_charge" => "",
"show_due" => "",
"show_invoice" => "Mostrar factura",
"show_receipt" => "Mostrar recibo",
"start_typing_customer_name" => "Empiece a escribir los detalles del cliente...",
"start_typing_item_name" => "Escriba el nombre del artículo o escanea el código de barras...",
"stock" => "Inventario",
"stock_location" => "Localización del inventario",
"sub_total" => "el subtotal",
"successfully_deleted" => "Se ha eliminado",
"successfully_restored" => "Se ha restuarado satisfactoriamente",
"successfully_suspended_sale" => "La venta se ha suspendido.",
"successfully_updated" => "Venta actualizada.",
"suspend_sale" => "Suspender",
"suspended_doc_id" => "Documento",
"suspended_sale_id" => "ID",
"suspended_sales" => "Suspendidas",
"table" => "Datos",
"takings" => "Ventas diarias",
"tax" => "Impuestos",
"tax_id" => "ID Impuesto",
"tax_invoice" => "Impuesto de la factura",
"tax_percent" => "Impuesto %",
"taxed_ind" => "T",
"total" => "Total",
"total_tax_exclusive" => "Sin impuesto",
"transaction_failed" => "Ha fallado la venta.",
"unable_to_add_item" => "Falló al agregar artículos para venta",
"unsuccessfully_deleted" => "La eliminación de venta falló.",
"unsuccessfully_restored" => "La restauración de la venta falló.",
"unsuccessfully_suspended_sale" => "La suspensión de venta falló.",
"unsuccessfully_updated" => "Ha fallado la actualización de la venta.",
"unsuspend" => "Retomar",
"unsuspend_and_delete" => "Acción",
"update" => "Actualizar",
"upi" => "UPI",
"visa" => "",
"wholesale" => "",
"work_order" => "Orden de trabajo",
"work_order_number" => "Número de orden de trabajo",
"work_order_number_duplicate" => "El número de orden de trabajo debe ser único.",
"work_order_sent" => "Orden de trabajo enviada a",
"work_order_unsent" => "Falló la Orden de Trabajo al enviar a",
];

View File

@@ -1,25 +1,24 @@
<?php
return [
'account_number' => "Número de Cuenta",
'agency_name' => "Nombre de Agencia",
'cannot_be_deleted' => "No se puede borrar el/los Proveedor(es) seleccionado(s). Uno o más tienen Ventas.",
'category' => "Categoría",
'company_name' => "Nombre de la Compañía",
'company_name_required' => "Nombre de la Compañía es un campo requerido.",
'confirm_delete' => "¿Está seguro que quiere borrar al/los Proveedor(es) seleccionados?",
'confirm_restore' => "¿Esá seguro que quiere restaurar al o los Proveedores seleccionados?",
'cost' => "Costo del Proveedor",
'error_adding_updating' => "Fallo al actualizar o agregar un Proveedor.",
'goods' => "Proveedor de Materiales",
'new' => "Nuevo Proveedor",
'none_selected' => "No ha seleccionado Proveedor(es) para borrar.",
'one_or_multiple' => "Proveedor(es)",
'successful_adding' => "Usted ha agregado un Proveedor exitosamente",
'successful_deleted' => "Se ha borrado correctamente",
'successful_updating' => "Ha actualizado un Proveedor con éxito",
'supplier' => "Proveedor",
'supplier_id' => "Id",
'tax_id' => "Id Impuesto",
'update' => "Actualizar Proveedor",
"account_number" => "Número de Cuenta",
"agency_name" => "Nombre de Agencia",
"cannot_be_deleted" => "No se puede borrar el/los Proveedor(es) seleccionado(s). Uno o más tienen Ventas.",
"category" => "Categoría",
"company_name" => "Nombre de la Compañía",
"company_name_required" => "Nombre de la Compañía es un campo requerido.",
"confirm_delete" => "¿Está seguro que quiere borrar al/los Proveedor(es) seleccionados?",
"confirm_restore" => "¿Esá seguro que quiere restaurar al o los Proveedores seleccionados?",
"cost" => "Costo del Proveedor",
"error_adding_updating" => "Fallo al actualizar o agregar un Proveedor.",
"goods" => "Proveedor de Materiales",
"new" => "Nuevo Proveedor",
"none_selected" => "No ha seleccionado Proveedor(es) para borrar.",
"one_or_multiple" => "Proveedor(es)",
"successful_adding" => "Usted ha agregado un Proveedor exitosamente",
"successful_deleted" => "Ha borrado con éxito",
"successful_updating" => "Ha actualizado un Proveedor con éxito",
"supplier" => "Proveedor",
"supplier_id" => "Id",
"tax_id" => "Id Impuesto",
"update" => "Actualizar Proveedor",
];

View File

@@ -1,83 +1,82 @@
<?php
return [
'add_exception' => "Agregar Excepcion",
'cascade' => "Cascada",
'cascade_sequence' => "Secuencia de Cascada",
'city' => "Ciudad",
'code' => "Codigo",
'confirm_delete' => "Estas seguro que deseas eliminar este código de impuesto? Esta acción es irreversible",
'confirm_restore' => "Estas seguro que deseas restaurar los códigos de impuestos?",
'default_tax_category' => "Impuesto por Default",
'default_tax_rate' => "Tarifa de impuesto por default",
'error_adding_updating' => "Código de impuesto agregado o error en actualización",
'group_seq' => "Secuencia de Grupo",
'jurisdiction_name' => "Nombre de la Jurisdicción",
'name' => "Nombre",
'new' => "Impuesto Nuevo",
'no_taxes' => "",
'no_taxes_to_display' => "Códigos de impuestos no disponible",
'reporting_authority' => "Imformacion de Autoridad",
'round_half_down' => "a número entero inferior",
'round_half_even' => "a numero par entero más próximo",
'round_half_odd' => "a numero entero impar mas próximo",
'round_half_up' => "a numero entero superior",
'rounding_code' => "código de redondeo",
'sales_tax' => "Impuesto de Venta",
'sales_tax_by_invoice' => "Impuesto de Ventas por factura",
'sequence' => "Secuencia",
'state' => "Estado",
'successful_deleted' => "Se ha borrado correctamente",
'tax_categories' => "Categorias de Impuestos",
'tax_categories_configuration' => "Configuración de Categorías de Impuestos",
'tax_categories_saved_successfully' => "Las categorías de impuestos han sido guardados",
'tax_categories_saved_unsuccessfully' => "Categorías de impuestos no han sido guardados",
'tax_category' => "Categoria de Impuesto",
'tax_category_code' => "codigo de categoria de impuesto",
'tax_category_duplicate' => "duplicar categoria de impuesto",
'tax_category_invalid_chars' => "caracteres invalidos en el nombre de la categoria de impuesto",
'tax_category_name' => "nombre de la categoria de impuesto",
'tax_category_new' => "nueva categoria de impuesto",
'tax_category_required' => "Categoría de impuesto es requerida",
'tax_code' => "codigo de impuesto",
'tax_code_cannot_be_deleted' => "error al eliminar codigo de impuesto",
'tax_code_duplicate' => "Código de impuesto duplicado",
'tax_code_invalid_chars' => "Caracteres inválidos en el código de impuesto",
'tax_code_name' => "nombre del codigo de impuesto",
'tax_code_required' => "codigo de impuesto es un campo requerido",
'tax_code_successful_deleted' => "has eliminado satisfactoriamente el codigo de impuesto",
'tax_code_successful_updated' => "has actualizado satisfactoriamente",
'tax_code_successful_updating' => "has actualizado satisfactoriamente el codigo de impuesto",
'tax_code_successfully_added' => "has agregado satisfactoriamente",
'tax_code_type' => "tipo de codigo de impuesto",
'tax_codes' => "codigos de impuesto",
'tax_codes_configuration' => "configuracion de codigos de impuesto",
'tax_codes_saved_successfully' => "cambios guardados en codigo de impuesto",
'tax_codes_saved_unsuccessfully' => "no se guardaron los cambios en el codigo de impuesto",
'tax_excluded' => "impuesto excluido",
'tax_group' => "grupo de impuesto",
'tax_group_not_unique' => "Grupo de impuestos {0} no es el unico",
'tax_group_sequence' => "secuencia de grupo de impuesto",
'tax_included' => "impuesto incluido",
'tax_jurisdiction' => "impuesto por ley",
'tax_jurisdiction_duplicate' => "Impuesto por ley duplicado",
'tax_jurisdiction_invalid_chars' => "Caracteres inválidos en el nombre por ley",
'tax_jurisdiction_required' => "impuesto por ley es requerido",
'tax_jurisdictions' => "impuestos por leyes",
'tax_jurisdictions_configuration' => "configuracion de impuestos por leyes",
'tax_jurisdictions_saved_successfully' => "cambios guardados en los impuestos por leyes",
'tax_jurisdictions_saved_unsuccessfully' => "no se guardaron los cambios en los impuestos por leyes",
'tax_rate' => "tarifa de impuesto",
'tax_rate_configuration' => "configuracion de tarifa de impuesto",
'tax_rate_error_adding_updating' => "tarifa de impuesto agregado o actualizacion fallida",
'tax_rate_numeric' => "tarifa de impuesto debe ser numero",
'tax_rate_required' => "tarifa de impuesto es requerida",
'tax_rate_successful_updated' => "has actualizado satisfactoriamente",
'tax_rate_successfully_added' => "has agregado satisfactoriamente",
'tax_rates' => "tarifas de impuestos",
'tax_rates_configuration' => "configuracion de tarifas de impuestos",
'tax_rounding' => "impuesto redondeado",
'tax_type' => "tipo de impuesto",
'update' => "Actualizar tarifa de impuesto",
'vat_tax' => "Impuesto IVA",
"add_exception" => "Agregar Excepcion",
"cascade" => "Cascada",
"cascade_sequence" => "Secuencia de Cascada",
"city" => "Ciudad",
"code" => "Codigo",
"confirm_delete" => "Estas seguro que deseas eliminar este código de impuesto? Esta acción es irreversible",
"confirm_restore" => "Estas seguro que deseas restaurar los códigos de impuestos?",
"default_tax_category" => "Impuesto por Default",
"default_tax_rate" => "Tarifa de impuesto por default",
"error_adding_updating" => "Código de impuesto agregado o error en actualización",
"group_seq" => "Secuencia de Grupo",
"jurisdiction_name" => "Nombre de la Jurisdicción",
"name" => "Nombre",
"new" => "Impuesto Nuevo",
"no_taxes" => "",
"no_taxes_to_display" => "Códigos de impuestos no disponible",
"reporting_authority" => "Imformacion de Autoridad",
"round_half_down" => "a número entero inferior",
"round_half_even" => "a numero par entero más próximo",
"round_half_odd" => "a numero entero impar mas próximo",
"round_half_up" => "a numero entero superior",
"rounding_code" => "código de redondeo",
"sales_tax" => "Impuesto de Venta",
"sales_tax_by_invoice" => "Impuesto de Ventas por factura",
"sequence" => "Secuencia",
"state" => "Estado",
"successful_deleted" => "Eliminado Satisfactoriamente",
"tax_categories" => "Categorias de Impuestos",
"tax_categories_configuration" => "Configuración de Categorías de Impuestos",
"tax_categories_saved_successfully" => "Las categorías de impuestos han sido guardados",
"tax_categories_saved_unsuccessfully" => "Categorías de impuestos no han sido guardados",
"tax_category" => "Categoria de Impuesto",
"tax_category_code" => "codigo de categoria de impuesto",
"tax_category_duplicate" => "duplicar categoria de impuesto",
"tax_category_invalid_chars" => "caracteres invalidos en el nombre de la categoria de impuesto",
"tax_category_name" => "nombre de la categoria de impuesto",
"tax_category_new" => "nueva categoria de impuesto",
"tax_category_required" => "Categoría de impuesto es requerida",
"tax_code" => "codigo de impuesto",
"tax_code_cannot_be_deleted" => "error al eliminar codigo de impuesto",
"tax_code_duplicate" => "Código de impuesto duplicado",
"tax_code_invalid_chars" => "Caracteres inválidos en el código de impuesto",
"tax_code_name" => "nombre del codigo de impuesto",
"tax_code_required" => "codigo de impuesto es un campo requerido",
"tax_code_successful_deleted" => "has eliminado satisfactoriamente el codigo de impuesto",
"tax_code_successful_updated" => "has actualizado satisfactoriamente",
"tax_code_successful_updating" => "has actualizado satisfactoriamente el codigo de impuesto",
"tax_code_successfully_added" => "has agregado satisfactoriamente",
"tax_code_type" => "tipo de codigo de impuesto",
"tax_codes" => "codigos de impuesto",
"tax_codes_configuration" => "configuracion de codigos de impuesto",
"tax_codes_saved_successfully" => "cambios guardados en codigo de impuesto",
"tax_codes_saved_unsuccessfully" => "no se guardaron los cambios en el codigo de impuesto",
"tax_excluded" => "impuesto excluido",
"tax_group" => "grupo de impuesto",
"tax_group_not_unique" => "Grupo de impuestos {0} no es el unico",
"tax_group_sequence" => "secuencia de grupo de impuesto",
"tax_included" => "impuesto incluido",
"tax_jurisdiction" => "impuesto por ley",
"tax_jurisdiction_duplicate" => "Impuesto por ley duplicado",
"tax_jurisdiction_invalid_chars" => "Caracteres inválidos en el nombre por ley",
"tax_jurisdiction_required" => "impuesto por ley es requerido",
"tax_jurisdictions" => "impuestos por leyes",
"tax_jurisdictions_configuration" => "configuracion de impuestos por leyes",
"tax_jurisdictions_saved_successfully" => "cambios guardados en los impuestos por leyes",
"tax_jurisdictions_saved_unsuccessfully" => "no se guardaron los cambios en los impuestos por leyes",
"tax_rate" => "tarifa de impuesto",
"tax_rate_configuration" => "configuracion de tarifa de impuesto",
"tax_rate_error_adding_updating" => "tarifa de impuesto agregado o actualizacion fallida",
"tax_rate_numeric" => "tarifa de impuesto debe ser numero",
"tax_rate_required" => "tarifa de impuesto es requerida",
"tax_rate_successful_updated" => "has actualizado satisfactoriamente",
"tax_rate_successfully_added" => "has agregado satisfactoriamente",
"tax_rates" => "tarifas de impuestos",
"tax_rates_configuration" => "configuracion de tarifas de impuestos",
"tax_rounding" => "impuesto redondeado",
"tax_type" => "tipo de impuesto",
"update" => "Actualizar tarifa de impuesto",
"vat_tax" => "Impuesto IVA",
];

View File

@@ -1,16 +1,15 @@
<?php
return [
'gcaptcha' => "Je ne suis pas un robot.",
'go' => "Lancer",
'invalid_gcaptcha' => "Veuillez vérifier que vous n'êtes pas un robot.",
'invalid_installation' => "Cette installation est incorrecte, veuillez vérifier votre fichier php.ini.",
'invalid_username_and_password' => "Nom d'utilisateur et/ou mot de passe invalide.",
'login' => "Login",
'logout' => "Déconnexion",
'migration_needed' => "Une migration de base de données vers {0} débutera après l'ouverture de session.",
'password' => "Mot de passe",
'required_username' => "Le champ nom utilisateur est obligatoire.",
'username' => "Nom d'utilisateur",
'welcome' => "Bienvenue à {0} !",
"gcaptcha" => "Je ne suis pas un robot.",
"go" => "Lancer",
"invalid_gcaptcha" => "Veuillez vérifier que vous n'êtes pas un robot.",
"invalid_installation" => "Cette installation est incorrecte, veuillez vérifier votre fichier php.ini.",
"invalid_username_and_password" => "Nom d'utilisateur et/ou mot de passe invalide.",
"login" => "Login",
"logout" => "Déconnexion",
"migration_needed" => "Une migration de base de données vers {0} débutera après l'ouverture de session.",
"password" => "Mot de passe",
"required_username" => "",
"username" => "Nom d'utilisateur",
"welcome" => "Bienvenue à {0} !",
];

View File

@@ -26,26 +26,27 @@ class Email_lib
$this->config = config(OSPOS::class)->settings;
$encrypter = Services::encrypter();
$smtp_pass = $this->config['smtp_pass'];
if(!empty($smtp_pass))
{
$smtp_pass = $encrypter->decrypt($smtp_pass);
$smtp_pass = $encrypter->decrypt($smtp_pass);
}
$email_config = [
'mailType' => 'html',
'userAgent' => 'OSPOS',
'validate' => true,
'protocol' => $this->config['protocol'],
'mailPath' => $this->config['mailpath'],
'SMTPHost' => $this->config['smtp_host'],
'SMTPUser' => $this->config['smtp_user'],
'SMTPPass' => $smtp_pass,
'SMTPPort' => (int)$this->config['smtp_port'],
'SMTPTimeout' => (int)$this->config['smtp_timeout'],
'SMTPCrypto' => $this->config['smtp_crypto']
'mailtype' => 'html',
'useragent' => 'OSPOS',
'validate' => true,
'protocol' => $this->config['protocol'],
'mailpath' => $this->config['mailpath'],
'smtp_host' => $this->config['smtp_host'],
'smtp_user' => $this->config['smtp_user'],
'smtp_pass' => $smtp_pass,
'smtp_port' => $this->config['smtp_port'],
'smtp_timeout' => $this->config['smtp_timeout'],
'smtp_crypto' => $this->config['smtp_crypto']
];
$this->email->initialize($email_config);
}

View File

@@ -6,11 +6,13 @@ use App\Models\Attribute;
use App\Models\Item;
use App\Models\Item_kit_items;
use App\Models\Item_quantity;
use App\Models\Enums\Rounding_mode;
use App\Models\Receiving;
use App\Models\Stock_location;
use CodeIgniter\Session\Session;
use Config\OSPOS;
use ReflectionException;
/**
* Receiving library
@@ -26,6 +28,7 @@ class Receiving_lib
private Receiving $receiving;
private Stock_location $stock_location;
private Session $session;
private array $config;
public function __construct()
{
@@ -35,6 +38,7 @@ class Receiving_lib
$this->item_quantity = model(Item_quantity::class);
$this->receiving = model(Receiving::class);
$this->stock_location = model(Stock_location::class);
$this->config = config(OSPOS::class)->settings;
$this->session = session();
}
@@ -194,6 +198,31 @@ class Receiving_lib
$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
*/
@@ -246,7 +275,7 @@ class Receiving_lib
* @param string $stock_destination
* @return void
*/
public function set_stock_destination(?string $stock_destination): void
public function set_stock_destination(string $stock_destination): void
{
$this->session->set('recv_stock_destination', $stock_destination);
}
@@ -516,6 +545,7 @@ class Receiving_lib
$this->remove_supplier();
$this->clear_comment();
$this->clear_reference();
$this->clear_term_days();
}
/**
@@ -554,4 +584,200 @@ class Receiving_lib
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

@@ -70,7 +70,7 @@ class Attribute extends Model
* @param int|bool $definition_id Attribute definition ID to check.
* @return bool returns true if at least one attribute_link exists or false if no attributes exist for that item and attribute.
*/
public function attributeLinkExists(?int $item_id, int|bool $definition_id = false): bool
public function attributeLinkExists(int $item_id, int|bool $definition_id = false): bool
{
$builder = $this->db->table('attribute_links');
$builder->where('item_id', $item_id);
@@ -547,7 +547,7 @@ class Attribute extends Model
{
$builder = $this->db->table('attribute_definitions');
$success = $builder->insert($definition_data);
$definition_data['definition_id'] = $this->db->insertID();
$definition_data['definition_id'] = $this->getInsertID();
}
}
@@ -875,7 +875,7 @@ class Attribute extends Model
$builder->set(["attribute_$data_type" => $attribute_value]);
$builder->insert();
$attribute_id = $this->db->insertID();
$attribute_id = $this->getInsertID();
}
$data = [

View File

@@ -42,7 +42,7 @@ class Giftcard extends Model
{
$builder = $this->db->table('giftcards');
$builder->select('CAST(giftcard_number AS UNSIGNED) AS giftcard_number');
$builder->where('giftcard_number REGEXP \'^[0-9]+$\'');
$builder->where('giftcard_number REGEXP \'^[0-9]+$\' = 0');
$builder->orderBy("giftcard_number","desc");
$builder->limit(1);

View File

@@ -104,7 +104,7 @@ class Receiving extends Model
/**
* @throws ReflectionException
*/
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.
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.
{
$attribute = model(Attribute::class);
$inventory = model('Inventory');
@@ -123,7 +123,8 @@ class Receiving extends Model
'employee_id' => $employee_id,
'payment_type' => $payment_type,
'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
@@ -187,6 +188,7 @@ class Receiving extends Model
$inventory->insert($inv_data, false);
$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.
}
$this->db->transComplete();
@@ -194,6 +196,153 @@ class Receiving extends Model
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
@@ -363,4 +512,9 @@ class Receiving extends Model
$this->db->query($sql);
}
public function save_payment(array $payment_data): bool
{
return $this->db->table('ospos_receivings_payments')->insert($payment_data);
}
}

View File

@@ -61,7 +61,7 @@ class Summary_sales_taxes extends Summary_report
}
else
{
$builder->where('sale_time BETWEEN ' . $this->db->escape(rawurldecode($inputs['start_date'])) . ' AND ' . $this->db->escape(rawurldecode($inputs['end_date'])));
$builder->where('sale_time BETWEEN ' . rawurldecode($inputs['start_date']) . ' AND ' . rawurldecode($inputs['end_date']));
}
$builder->select('reporting_authority, jurisdiction_name, tax_category, tax_rate, SUM(sale_tax_amount) AS tax');

View File

@@ -11,13 +11,13 @@ use App\Models\Customer;
**/
class Token_customer extends Token
{
private array $customer_info;
private string $customer_info;
private Sale_lib $sale_lib;
/**
* @param string $customer_info
*/
public function __construct(array $customer_info = [])
public function __construct(string $customer_info = '')
{
parent::__construct();
$this->customer_info = $customer_info;

View File

@@ -296,7 +296,7 @@ $(document).ready(function()
data['currency_symbol'] = $('#currency_symbol').val();
data['currency_code'] = $('#currency_code').val();
data['thousands_separator'] = $('#thousands_separator').is(":checked")
$.post("<?= "$controller_name/checkNumberLocale" ?>",
$.post("<?= "$controller_name /checkNumberLocale" ?>",
data,
function(response) {
$("input[name='save_number_locale']").val(response.save_number_locale);

View File

@@ -42,7 +42,6 @@ use Config\OSPOS;
echo "&#187; OpenSSL: ", extension_loaded('openssl') ? '<span style="color: green;">Enabled &#x2713</span>' : '<span style="color: red">Disabled &#x2717</span>', '<br>';
echo "&#187; MBString: ", extension_loaded('mbstring') ? '<span style="color: green;">Enabled &#x2713</span>' : '<span style="color: red">Disabled &#x2717</span>', '<br>';
echo "&#187; Curl: ", extension_loaded('curl') ? '<span style="color: green;">Enabled &#x2713</span>' : '<span style="color: red">Disabled &#x2717</span>', '<br>';
echo "&#187; Json: ", extension_loaded('json') ? '<span style="color: green;">Enabled &#x2713</span>' : '<span style="color: red">Disabled &#x2717</span>', '<br><br>';
echo "&#187; Xml: ", extension_loaded('xml') ? '<span style="color: green;">Enabled &#x2713</span>' : '<span style="color: red">Disabled &#x2717</span>', '<br><br>';
?>
User Configuration:<br>
@@ -78,11 +77,13 @@ use Config\OSPOS;
}
echo esc(getBrowserNameAndVersion($_SERVER['HTTP_USER_AGENT']));
?><br>
Server Software: <?= esc($_SERVER['SERVER_SOFTWARE']) ?><br>
PHP Version: <?= PHP_VERSION ?><br>
DB Version: <?= esc($dbVersion) ?><br>
Server Port: <?= esc($_SERVER['SERVER_PORT']) ?><br>
OS: <?= php_uname('s') .' '. php_uname('r') ?><br><br>
.Server Software: <?= esc($_SERVER['SERVER_SOFTWARE']) ?><br>
.PHP Version: <?= PHP_VERSION ?><br>
.DB Version: <?= esc($dbVersion) ?><br>
.Server Port: <?= esc($_SERVER['SERVER_PORT']) ?><br>
.OS: <?= php_uname('s') .' '. php_uname('r') ?><br><br>
.OS Time Zone: <span id="timezone" style="font-weight:600"></span><br>
.OSPOS Time Zone: <span id="ostimezone" style="font-weight:600;" ><?= esc($config['timezone']) ?></span>
<br><br>
File Permissions:<br>
@@ -113,7 +114,7 @@ use Config\OSPOS;
clearstatcache();
?>
<br>
&#187; [writable/uploads:]
&#187; [public/uploads:]
<?php
if (is_writable($uploads))
{
@@ -228,14 +229,13 @@ use Config\OSPOS;
document.getSelection().removeAllRanges();
});
document.getElementById("timezone").innerText = Intl.DateTimeFormat().resolvedOptions().timeZone;
$(function() {
$('#timezone').clone().appendTo('#timezoneE');
});
if($('#timezone').html() !== $('#ostimezone').html()) {
document.getElementById("timezone").innerText = Intl.DateTimeFormat().resolvedOptions().timeZone;
document.getElementById("TimeError").innerHTML = '<span style="color: red;"><?= lang('Config.timezone_error') ?></span><br><br><?= lang('Config.user_timezone') ?><div id="timezoneE" style="font-weight:600;"></div><br><?= lang('Config.os_timezone') ?><div id="ostimezoneE" style="font-weight:600;"><?= esc($config['timezone']) ?></div><br>';
}
if($('#timezone').html() !== $('#ostimezone').html())
document.getElementById("TimeError").innerHTML = '<span style="color: red;"><?= lang('Config.timezone_error') ?></span><br><br><?= lang('Config.user_timezone') ?><div id="timezoneE" style="font-weight:600;"></div><br><?= lang('Config.os_timezone') ?><div id="ostimezoneE" style="font-weight:600;"><?= esc($config['timezone']) ?></div><br>';
</script>
</div>

View File

@@ -13,7 +13,7 @@
<html lang="<?= current_language_code() ?>">
<head>
<meta charset="utf-8">
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<base href="<?= base_url() ?>">
<title><?= $config['company'] . '&nbsp;|&nbsp;' . lang('Common.software_short') . '&nbsp;|&nbsp;' . lang('Login.login') ?></title>
<meta name="viewport" content="width=device-width, initial-scale=1">
@@ -26,7 +26,7 @@
? 'flatly'
: $config['theme']);
?>
<link rel="stylesheet" type="text/css" href="resources/bootswatch5/<?= "$theme" ?>/bootstrap.min.css">
<link rel="stylesheet" type="text/css" href="<?= "resources/bootswatch5/$theme/bootstrap.min.css" ?>">
<!-- inject:login:css -->
<link rel="stylesheet" href="css/login.min.css">
<!-- endinject -->
@@ -107,11 +107,10 @@
<footer class="d-flex justify-content-center flex-shrink-0 text-center">
<div class="footer container-fluid bg-body rounded shadow p-3 mb-md-4 mx-md-3">
<span class="text-primary">
<svg height="1.25em" role="img" viewBox="0 0 308.57998 308.57997" xmlns="http://www.w3.org/2000/svg">
<title><?= lang('Common.software_title') . '&nbsp;' . lang('Common.logo') ?></title>
<circle cx="154.28999" cy="154.28999" r="154.28999" fill="currentColor"/>
<path fill="#fff" d="M154.88998 145.66999c-.03-1.26-.03-3.29.19-4.29 4.6-11.1 15.57-18.82 28.3-18.82h.41v58.3c0 .12-.03.78-.04.9-.54 16.46-14.01 29.7-30.59 29.7v27.08c21 0 39.17-11.27 49.29-28.07l.07-.11c2.9.45 5.86.75 8.9.75 31.95 0 57.81-26 57.81-57.81 0-30.87-24.37-56.46-55.1-57.81h-30.74c-17.18 0-32.61 7.64-43.22 19.63-10.59-11.92-25.86-19.59-43.02-19.59-31.86 0-57.77 25.91-57.77 57.77 0 31.86 25.91 57.77 57.77 57.77 31.86 0 57.77-25.91 57.77-57.77v-3.68c-.01.01-.02-3.31-.03-3.95zm-57.75 38.33c-16.92 0-30.69-13.77-30.69-30.69s13.77-30.69 30.69-30.69 30.69 13.77 30.69 30.69-13.77 30.69-30.69 30.69zm142.96-19.87c-4.33 11.64-15.57 19.9-28.7 19.9h-.54v-61.47h.54c13.13 0 24.37 8.26 28.7 19.9 1.35 3.25 2.03 6.91 2.03 10.83s-.67 7.59-2.03 10.84z"/>
<span class="text-body-secondary">
<svg height="1em" role="img" viewBox="0 0 229.85 143.05001" xmlns="http://www.w3.org/2000/svg">
<title><?= lang('Common.software_short') . '&nbsp;' . lang('Common.logo_mark') ?></title>
<path fill="currentColor" d="M115.51 50.18c-.03-1.26-.03-3.29.19-4.29 4.6-11.1 15.57-18.82 28.3-18.82h.41v58.3c0 .12-.03.78-.04.9-.54 16.46-14.01 29.7-30.59 29.7v27.08c21 0 39.17-11.27 49.29-28.07l.07-.11c2.9.45 5.86.75 8.9.75 31.95 0 57.81-26 57.81-57.81 0-30.87-24.37-56.46-55.1-57.81h-30.74c-17.18 0-32.61 7.64-43.22 19.63C90.2 7.71 74.93.04 57.77.04 25.91.04 0 25.95 0 57.81c0 31.86 25.91 57.77 57.77 57.77 31.86 0 57.77-25.91 57.77-57.77v-3.68c-.01.01-.02-3.31-.03-3.95zM57.76 88.51c-16.92 0-30.69-13.77-30.69-30.69s13.77-30.69 30.69-30.69S88.45 40.9 88.45 57.82 74.68 88.51 57.76 88.51zm142.96-19.87c-4.33 11.64-15.57 19.9-28.7 19.9h-.54V27.07h.54c13.13 0 24.37 8.26 28.7 19.9 1.35 3.25 2.03 6.91 2.03 10.83s-.67 7.59-2.03 10.84z"/>
</svg>
</span>
<span><?= lang('Common.software_title') ?></span>

View File

@@ -56,7 +56,7 @@ $request = Services::request();
<div class="navbar-right" style="margin:0">
<?= anchor("home/changePassword/$user_info->person_id", "$user_info->first_name $user_info->last_name", ['class' => 'modal-dlg', 'data-btn-submit' => lang('Common.submit'), 'title' => lang('Employees.change_password')]) ?>
<span>&nbsp;|&nbsp;</span>
<?= ' | ' . ((ENVIRONMENT == 'development' || $request->getGet('debugdebug') == 'true') ? session('session_sha1') . ' | ' : '') ?>
<?= anchor('home/logout', lang('Login.logout')) ?>
</div>

View File

@@ -37,9 +37,7 @@
if ($config['company_logo'] != '')
{
?>
<div id="company_name">
<img id="image" src="<?= base_url('uploads/' . esc($config['company_logo'], 'url')) ?>" alt="company_logo" />
</div>
<div id="company_name"><img id="image" src="<?= esc(base_url('uploads/' . $config['company_logo']), 'url') ?>" alt="company_logo" /></div>
<?php
}
?>
@@ -145,7 +143,7 @@
?>
<tr>
<td colspan="3" style='text-align:right;'><?= lang('Sales.amount_tendered') ?></td>
<td><div class="total-value"><?= to_currency($amount_tendered) ?></div></td>
<td><div class="total-value">0.00</div></td>
</tr>
<tr>

View File

@@ -155,77 +155,76 @@ if (isset($success))
<td><?= anchor("$controller_name/deleteItem/$line", '<span class="glyphicon glyphicon-trash"></span>') ?></td>
<td><?= esc($item['item_number']) ?></td>
<td style="text-align:center;">
<?= esc($item['name'] . ' '. implode(' ', [$item['attribute_values'], $item['attribute_dtvalues']])) ?><br /> <?= '[' . to_quantity_decimals($item['in_stock']) . ' in ' . $item['stock_name'] . ']' ?>
<?= esc($item['name'] . ' ' . implode(' ', [$item['attribute_values'], $item['attribute_dtvalues']])) ?><br />
<?= '[' . to_quantity_decimals($item['in_stock']) . ' in ' . $item['stock_name'] . ']' ?>
<?= form_hidden('location', (string)$item['item_location']) ?>
</td>
<?php
if ($items_module_allowed && $mode != 'requisition')
{
?>
<td><?= form_input ([
<?php if ($items_module_allowed && $mode != 'requisition') { ?>
<td><?= form_input([
'name' => 'price',
'class' => 'form-control input-sm',
'value' => to_currency_no_money($item['price']),
'value' => (string)to_currency_no_money($item['price']),
'onClick' => 'this.select();'
]) ?></td>
<?php
}
else
{
?>
<?php } else { ?>
<td>
<?= $item['price'] ?>
<?= form_hidden('price', to_currency_no_money($item['price'])) ?>
<?= (string)$item['price'] ?>
<?= form_hidden('price', (string)to_currency_no_money($item['price'])) ?>
</td>
<?php
}
?>
<?php } ?>
<td><?= form_input (['name' => 'quantity', 'class' => 'form-control input-sm', 'value' => to_quantity_decimals($item['quantity']),'onClick' => 'this.select();']) ?></td>
<td><?= form_input([
'name' => 'quantity',
'class' => 'form-control input-sm',
'value' => (string)to_quantity_decimals($item['quantity']),
'onClick' => 'this.select();'
]) ?></td>
<td><?= form_dropdown(
'receiving_quantity',
$item['receiving_quantity_choices'],
$item['receiving_quantity'],
['class' => 'form-control input-sm']
) ?></td>
'receiving_quantity',
$item['receiving_quantity_choices'],
(string)$item['receiving_quantity'],
['class' => 'form-control input-sm']
) ?></td>
<?php
if ($items_module_allowed && $mode != 'requisition')
{
?>
<?php if ($items_module_allowed && $mode != 'requisition') { ?>
<td>
<div class="input-group">
<?= 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();']) ?>
<span class="input-group-btn">
<?= form_checkbox ([
'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
<div class="input-group">
<?= form_input([
'name' => 'discount',
'class' => 'form-control input-sm',
'value' => (string)($item['discount_type'] ? to_currency_no_money($item['discount']) : to_decimals($item['discount'])),
'onClick' => 'this.select();'
]) ?>
</span>
</div>
</td>
<?php
}
else
{
?>
<td><?= $item['discount'] ?></td>
<span class="input-group-btn">
<?= form_checkbox([
'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
}
?>
<?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>
<?= 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>
<?php
@@ -375,6 +374,53 @@ if (isset($success))
</tr>
</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
if(count($cart) > 0)
{

View File

@@ -255,7 +255,8 @@ $(document).ready(function()
<div id="sale_return_policy">
<h5>
<span><?= nl2br(esc($config['payment_message'])) ?></span>
<span style='padding:4%;'><?= empty($comments) ? esc($config['invoice_default_comments']) : lang('Sales.comments') . ': ' . esc($comments) ?></span>
<span style='padding:4%;'><?= empty($comments) ? '' : lang('Sales.comments') . ': ' . esc($comments) ?></span>
<span style='padding:4%;'><?= esc($config['invoice_default_comments']) ?></span>
</h5>
<div style='padding:2%;'><?= nl2br(esc($config['return_policy'])) ?></div>
</div>

View File

@@ -19,6 +19,7 @@
*/
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html lang="<?= $this->request->getLocale() ?>">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
<link rel="stylesheet" type="text/css" href="<?= base_url('css/invoice_email.css') ?>"/>
@@ -207,7 +208,7 @@ if(isset($error_message))
<?= nl2br($config['return_policy']) ?>
</div>
<div id='barcode'>
<img alt=<?='$sale_id'?> src='data:image/svg+xml;base64,<?= base64_encode($barcode) ?>' /><br>
<img alt='<?= esc($barcode, 'attr') ?>' src='data:image/png;base64,<?= esc($barcode, 'attr') ?>' /><br>
<?= $sale_id ?>
</div>
</div>

View File

@@ -24,7 +24,7 @@ if (isset($error_message))
{
var send_email = function()
{
$.get('<?= site_url() . esc("/sales/sendPdf/$sale_id_num/receipt") ?>',
$.get('<?= site_url() . esc("/sales/sendReceipt/$sale_id_num", 'url') ?>',
function(response)
{
$.notify( { message: response.message }, { type: response.success ? 'success' : 'danger'} )

View File

@@ -116,7 +116,7 @@
<?php
}
?>
<td class="total-value" style="text-align:right;"><?= to_currency($item['discounted_total']) ?></td>
<td class="total-value"><?= to_currency($item['discounted_total']) ?></td>
</tr>
<?php
}
@@ -170,6 +170,10 @@
<td style="<?= $border ? 'border-top: 2px solid black;' : '' ?>text-align:right"><?= to_currency($total) ?></td>
</tr>
<tr>
<td colspan="4">&nbsp;</td>
</tr>
<?php
$only_sale_check = false;
$show_giftcard_remainder = false;
@@ -186,7 +190,11 @@
<?php
}
?>
<tr>
<td colspan="4">&nbsp;</td>
</tr>
<?php
if(isset($cur_giftcard_value) && $show_giftcard_remainder)
{
@@ -208,14 +216,14 @@
</tr>
</table>
<div id="terms">
<div id="sale_return_policy" style="text-align:center">
<?= nl2br(esc($config['return_policy'])) ?>
</div>
<div id='barcode' style="text-align:center">
<img alt=<?='$sale_id'?> src='data:image/svg+xml;base64,<?= base64_encode($barcode) ?>' /><br>
<?= $sale_id ?>
</div>
<div id="sale_return_policy" style="text-align:center">
<?= nl2br(esc($config['return_policy'])) ?>
</div>
<br>
<div id="barcode" style="text-align:center">
<?= $barcode ?><br>
<?= $sale_id ?>
</div>
</div>

View File

@@ -23,8 +23,8 @@ services:
networks:
- app_net
volumes:
- uploads:/app/writable/uploads
- logs:/app/writable/logs
- uploads:/app/public/uploads
- logs:/app/application/logs
environment:
- CI_ENVIRONMENT=${OSPOS_CI_ENV}
- FORCE_HTTPS=true

View File

@@ -11,12 +11,12 @@ services:
depends_on:
- mysql
ports:
- "80:80"
- "127.0.0.1:80:80"
networks:
- app_net
volumes:
- uploads:/app/writable/uploads
- logs:/app/writable/logs
- uploads:/app/public/uploads
- logs:/app/application/logs
environment:
- CI_ENVIRONMENT=production
- FORCE_HTTPS=false

View File

@@ -14,7 +14,6 @@ import header from 'gulp-header'
import tar from 'gulp-tar'
import gzip from 'gulp-gzip'
import zip from 'gulp-zip'
import run from 'gulp-run'
import { Stream } from 'readable-stream'
const {finished, pipeline} = Stream.promises
@@ -249,13 +248,6 @@ gulp.task('inject-login', function() {
);
});
gulp.task('update-licenses', function() {
run('composer licenses --format=json --no-dev > public/license/composer.LICENSES').exec();
return pipeline(gulp.src('LICENSE'),gulp.dest('public/license'));
});
gulp.task('build-database', function() {
return gulp.src(['./app/Database/tables.sql','./app/Database/constraints.sql'])
.pipe(header('-- >> This file is autogenerated from tables.sql and constraints.sql. Do not modify directly << --'))
@@ -274,6 +266,5 @@ gulp.task('default',
'prod-css',
'copy-fonts',
'inject-login',
'update-licenses',
'build-database'
));

4510
package-lock.json generated
View File

File diff suppressed because it is too large Load Diff

View File

@@ -10,9 +10,7 @@
"objecttothis <objecttothis - at - gmail.com>",
"SteveIreland <stevei - at - ruledomain.com>"
],
"files": [
"dist/opensourcepos.$version.tgz"
],
"files": ["dist/opensourcepos.$version.tgz"],
"publishConfig": {
"registry": "https://npm.pkg.github.com/"
},
@@ -21,8 +19,8 @@
"POS"
],
"repository": {
"type": "git",
"url": "https://github.com/opensourcepos/opensourcepos"
"type": "git",
"url": "https://github.com/opensourcepos/opensourcepos"
},
"scripts": {
"build": "gulp default",
@@ -51,6 +49,9 @@
"coffeescript": "^2.7.0",
"es6-promise": "^4.2.8",
"file-saver": "^2.0.5",
"gulp-gzip": "^1.4.2",
"gulp-tar": "^4.0.0",
"gulp-zip": "^6.0.0",
"html2canvas": "^1.4.1",
"jasny-bootstrap": "^3.1.3",
"jquery": "^3.7.1",
@@ -68,16 +69,12 @@
"gulp-clean-css": "^4.3.0",
"gulp-concat": "^2.6.1",
"gulp-debug": "^5.0.1",
"gulp-gzip": "^1.4.2",
"gulp-header": "^2.0.9",
"gulp-inject": "^5.0.5",
"gulp-rename": "^2.0.0",
"gulp-rev": "^10.0.0",
"gulp-run": "^1.7.1",
"gulp-tar": "^4.0.0",
"gulp-uglify": "^3.0.2",
"gulp-zip": "^6.1.0",
"npm-check-updates": "^17.1.14",
"npm-check-updates": "^16.14.11",
"readable-stream": "^4.4.2",
"stream-series": "^0.1.1"
}

View File

@@ -21,7 +21,7 @@
if (button_id == 'submit' && (!submitted && btn_id != "btnNew")) {
form.submit();
validator.valid() && $('#submit').prop('disabled', true).css('opacity', 0.5);
$('#submit').prop('disabled', true).css('opacity', 0.5);
}
return false;
}

View File

@@ -1,30 +1,30 @@
MIT License
Copyright (c) 2013-2024 jekkos
Copyright (c) 2017-2024 objecttothis
Copyright (c) 2017-2024 Steve Ireland
Copyright (c) 2017-2024 odiea
Copyright (c) 2018-2024 WebShells
Copyright (c) 2021-2024 BudsieBuds
Copyright (c) 2015-2023 FrancescoUK (aka daN4cat)
Copyright (c) 2015-2022 Aamir Shahzad (aka asakpke), RoshanTech, eSite.pk
Copyright (c) 2019-2020 Andriux1990
Copyright (c) 2018-2019 Erasto Marroquin (aka Erastus)
Copyright (c) 2013-2022 jekkos
Copyright (c) 2015-2021 FrancescoUK (aka daN4cat)
Copyright (c) 2017-2021 Steve Ireland
Copyright (c) 2017-2022 objecttothis
Copyright (c) 2017-2021 odiea
Copyright (c) 2017-2021 WebShells
Copyright (c) 2020-2021 Andriux1990
Copyright (c) 2021 BudsieBuds
Copyright (c) 2019 Loyd Jayme (aka loydjayme25)
Copyright (c) 2018 Erasto Marroquin (aka Erastus)
Copyright (c) 2018 Nathan Sas (aka nathanzky)
Copyright (c) 2018 Emilio Silva (aka emi-silva)
Copyright (c) 2016-2017 Ramkrishna Mondal (aka RamkrishnaMondal)
Copyright (c) 2016-2017 Jorge Colmenarez (aka jlctmaster), frontuari.com
Copyright (c) 2016-2017 Jesus Guerrero Botella (aka i92guboj)
Copyright (c) 2017 Jesus Guerrero Botella (aka i92guboj)
Copyright (c) 2017 Deep Shah (aka deepshah)
Copyright (c) 2017 Joshua Fernandez (aka joshua1234511)
Copyright (c) 2017 asadjaved63
Copyright (c) 2016-2017 Ramkrishna Mondal (aka RamkrishnaMondal)
Copyright (c) 2016-2017 Jorge Colmenarez (aka jlctmaster), frontuari.com
Copyright (c) 2016 Rinaldy@dbarber (aka rnld26)
Copyright (c) 2015-2022 Aamir Shahzad (aka asakpke), RoshanTech, eSite.pk
Copyright (c) 2015 Toni Haryanto (aka yllumi)
Copyright (c) 2012-2014 pappastech
Copyright (c) 2013 Rob Garrison
Copyright (c) 2013 Parq
Copyright (c) 2013 Ramel
Copyright (c) 2012-2014 pappastech
Copyright (c) 2012 Alain
Permission is hereby granted, free of charge, to any person obtaining a copy
@@ -34,16 +34,16 @@ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Additionally, you cannot claim copyright or ownership of the Software.

View File

@@ -1,6 +1,7 @@
The MIT License (MIT)
Copyright (c) 2011-2024 The Bootstrap Authors
Copyright (c) 2011-2021 Twitter, Inc.
Copyright (c) 2011-2021 The Bootstrap Authors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1 +1 @@
Bootstrap 5.3.3
Bootstrap 5.0.1

View File

@@ -1,6 +1,6 @@
The MIT License (MIT)
Copyright (c) 2019-2024 The Bootstrap Authors
Copyright (c) 2019-2020 The Bootstrap Authors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal

View File

@@ -1 +1 @@
Bootstrap Icons 1.11.3
Bootstrap Icons 1.5.0

View File

@@ -0,0 +1,21 @@
The MIT License (MIT)
Copyright (c) 2013 Thomas Park
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@@ -0,0 +1 @@
Bootswatch 5.0.1

View File

@@ -1 +1 @@
Bootswatch 3.4.1+1 & 5.3.3
Bootswatch 3.4.1+1

View File

@@ -1,87 +1,63 @@
{
"name": "opensourcepos/opensourcepos",
"version": "dev-master",
"name": "OpenSourcePOS",
"version": "3.4.0",
"license": [
"MIT"
],
"dependencies": {
"codeigniter4/framework": {
"version": "v4.5.5",
"codeigniter/framework": {
"version": "4.1.3",
"license": [
"MIT"
]
},
"dompdf/dompdf": {
"version": "v2.0.4",
"license": [
"LGPL-2.1"
]
},
"ezyang/htmlpurifier": {
"version": "v4.17.0",
"version": "v0.8.6",
"license": [
"LGPL-2.1-or-later"
]
},
"laminas/laminas-escaper": {
"version": "2.13.0",
"mikey179/vfsStream": {
"version": "v1.1.0",
"license": [
"BSD-3-Clause"
]
},
"masterminds/html5": {
"version": "2.8.1",
"license": [
"MIT"
"BSD"
]
},
"paragonie/random_compat": {
"version": "v2.0.21",
"version": "2.0.19",
"license": [
"MIT"
]
},
"phenx/php-font-lib": {
"version": "0.5.6",
"license": [
"LGPL-2.1-or-later"
]
},
"phenx/php-svg-lib": {
"version": "0.5.2",
"license": [
"LGPL-3.0"
]
},
"picqer/php-barcode-generator": {
"version": "v2.4.0",
"license": [
"LGPL-3.0-or-later"
]
},
"sabberworm/php-css-parser": {
"version": "v8.5.1",
"phenx/php-svg-lib": {
"version": "0.3.3",
"license": [
"MIT"
]
},
"symfony/polyfill-ctype": {
"version": "v1.31.0",
"license": [
"MIT"
]
},
"symfony/polyfill-mbstring": {
"version": "v1.31.0",
"license": [
"MIT"
"LGPL-3.0-or-later"
]
},
"tamtamchik/namecase": {
"version": "3.0.0",
"version": "1.0.6",
"license": [
"MIT"
]
},
"vlucas/phpdotenv": {
"version": "2.6.6",
"license": [
"BSD-3-Clause-Attribution"
]
},
"symfony/polyfill-ctype": {
"version": "v1.20.0",
"license": [
"MIT"
]
}
}
}