Compare commits

...

20 Commits

Author SHA1 Message Date
Joe Williams
43ebe2169a Fixed naming issue:
Nullable tax category ID migration now runs the correct script.
2025-10-15 22:22:15 -07:00
Joe Williams
3f82ac179a Added transaction to Migration_MissingConfigKeys.up(). 2025-09-16 12:14:05 -07:00
Joe Williams
73dab4f347 execute_script() now returns a boolean for error handling. 2025-09-16 12:10:32 -07:00
jekkos
b1f6ae6d35 Fix mount path for uploads (#4308)
Remove duplicated compose sections in nginx version.  We will include
parts of the main file instead of duplicating it here.
2025-08-29 09:12:02 +02:00
dependabot[bot]
4153c69ccd Bump jspdf from 3.0.1 to 3.0.2 (#4309)
Bumps [jspdf](https://github.com/parallax/jsPDF) from 3.0.1 to 3.0.2.
- [Release notes](https://github.com/parallax/jsPDF/releases)
- [Changelog](https://github.com/parallax/jsPDF/blob/master/RELEASE.md)
- [Commits](https://github.com/parallax/jsPDF/compare/v3.0.1...v3.0.2)

---
updated-dependencies:
- dependency-name: jspdf
  dependency-version: 3.0.2
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-08-29 07:32:54 +02:00
jekkos
87fbd72478 Add generic try/catch in import (#4302) 2025-08-28 00:05:58 +02:00
jekkos
a4ac42b4ad Fix reference to uploads folder (#4270) (#4286) 2025-08-18 21:19:36 +02:00
jekkos
2eff79a8b6 Fix for suspended sales (#4283) (#4303) 2025-08-15 23:12:35 +02:00
Aril Apria Susanto
880fb8faef Translated using Weblate (Indonesian)
Currently translated at 100.0% (327 of 327 strings)

Translation: opensourcepos/config
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/config/id/
2025-08-11 10:27:22 +02:00
Aril Apria Susanto
4d2347173b Translated using Weblate (Indonesian)
Currently translated at 100.0% (85 of 85 strings)

Translation: opensourcepos/common
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/common/id/
2025-08-11 10:27:22 +02:00
Aril Apria Susanto
82d36d01fb Translated using Weblate (Indonesian)
Currently translated at 100.0% (45 of 45 strings)

Translation: opensourcepos/module
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/module/id/
2025-08-11 10:27:22 +02:00
Aril Apria Susanto
13314b7da1 Translated using Weblate (Indonesian)
Currently translated at 100.0% (53 of 53 strings)

Translation: opensourcepos/customers
Translate-URL: https://translate.opensourcepos.org/projects/opensourcepos/customers/id/
2025-08-11 10:27:22 +02:00
jekkos
43808c5970 Revert toast message sanitization (#4302) 2025-08-07 23:49:54 +02:00
jekkos
1615ef3832 Set release version to 3.4.2 2025-08-07 21:06:11 +02:00
jekkos
e089dc5e2c Fix item kits update (#4294) 2025-08-06 23:40:00 +02:00
jekkos
4cf70a95e6 Fix security incident email address (#4298) 2025-07-30 08:05:58 +02:00
jekkos
e08367aaae Allow empty tax category id (#4285) (#4288) 2025-07-29 23:59:23 +02:00
jekkos
9cd2f685ff Fix barcode generation in items (#4270) 2025-07-29 23:56:50 +02:00
jekkos
6800f338e7 Upgrade to ci 4.6.2 (#4296) (#4298) 2025-07-29 23:20:24 +02:00
jekkos
d4ab56b742 Fix migration 20250522000000 (#4284)
* Fix migration errors

Add dropColumnIfExists to migration_helper

* Add config key/values if missing (#4282)
2025-07-16 23:28:24 +02:00
27 changed files with 1086 additions and 4173 deletions

View File

@@ -1,4 +1,5 @@
[unreleased]: https://github.com/opensourcepos/opensourcepos/compare/3.4.0...HEAD
[3.4.2]: https://github.com/opensourcepos/opensourcepos/compare/3.4.1...3.4.2
[3.4.1]: https://github.com/opensourcepos/opensourcepos/compare/3.4.0...3.4.1
[3.4.0]: https://github.com/opensourcepos/opensourcepos/compare/3.3.9...3.4.0
[3.3.9]: https://github.com/opensourcepos/opensourcepos/compare/3.3.8...3.3.9

View File

@@ -21,4 +21,4 @@ We release patches for security vulnerabilities. Which versions are eligible to
## Reporting a Vulnerability
Please report (suspected) security vulnerabilities to **[jekkos@opensourcepos.org](mailto:jekkos@opensourcepos.org)**. You will receive a response from us within 48 hours. If the issue is confirmed, we will release a patch as soon as possible depending on complexity but historically within a few days.
Please report (suspected) security vulnerabilities to **[jekkos@steganos.dev](mailto:jekkos@steganos.dev)**. You will receive a response from us within 48 hours. If the issue is confirmed, we will release a patch as soon as possible depending on complexity but historically within a few days.

View File

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

View File

@@ -165,7 +165,7 @@ class Item_kits extends Secure_Controller
$item_kit_data = [
'name' => $this->request->getPost('name'),
'item_kit_number' => $this->request->getPost('item_kit_number'),
'item_id' => $this->request->getPost('kit_item_id') ? null : intval($this->request->getPost('kit_item_id')),
'item_id' => $this->request->getPost('kit_item_id') ? intval($this->request->getPost('kit_item_id')) : null,
'kit_discount' => parse_decimals($this->request->getPost('kit_discount')),
'kit_discount_type' => $this->request->getPost('kit_discount_type') === null ? PERCENT : intval($this->request->getPost('kit_discount_type')),
'price_option' => $this->request->getPost('price_option') === null ? PRICE_ALL : intval($this->request->getPost('price_option')),

View File

@@ -19,6 +19,7 @@ use CodeIgniter\Images\Handlers\BaseHandler;
use CodeIgniter\HTTP\DownloadResponse;
use Config\OSPOS;
use Config\Services;
use Exception;
use ReflectionException;
require_once('Secure_Controller.php');
@@ -635,10 +636,10 @@ class Items extends Secure_Controller
$item_data['reorder_level'] = 0;
}
$tax_category_id = intval($this->request->getPost('tax_category_id'));
$tax_category_id = $this->request->getPost('tax_category_id');
if (!isset($tax_category_id)) {
$item_data['tax_category_id'] = '';
$item_data['tax_category_id'] = null;
} else {
$item_data['tax_category_id'] = empty($this->request->getPost('tax_category_id')) ? null : intval($this->request->getPost('tax_category_id'));
}
@@ -944,107 +945,113 @@ class Items extends Secure_Controller
public function postImportCsvFile(): void
{
helper('importfile_helper');
if ($_FILES['file_path']['error'] !== UPLOAD_ERR_OK) {
echo json_encode(['success' => false, 'message' => lang('Items.csv_import_failed')]);
} else {
if (file_exists($_FILES['file_path']['tmp_name'])) {
set_time_limit(240);
try {
if ($_FILES['file_path']['error'] !== UPLOAD_ERR_OK) {
echo json_encode(['success' => false, 'message' => lang('Items.csv_import_failed')]);
} else {
if (file_exists($_FILES['file_path']['tmp_name'])) {
set_time_limit(240);
$failCodes = [];
$csv_rows = get_csv_file($_FILES['file_path']['tmp_name']);
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$allowed_stock_locations = $this->stock_location->get_allowed_locations();
$attribute_definition_names = $this->attribute->get_definition_names();
$failCodes = [];
$csv_rows = get_csv_file($_FILES['file_path']['tmp_name']);
$employee_id = $this->employee->get_logged_in_employee_info()->person_id;
$allowed_stock_locations = $this->stock_location->get_allowed_locations();
$attribute_definition_names = $this->attribute->get_definition_names();
unset($attribute_definition_names[NEW_ENTRY]); // Removes the common_none_selected_text from the array
unset($attribute_definition_names[NEW_ENTRY]); // Removes the common_none_selected_text from the array
$attribute_data = [];
$attribute_data = [];
foreach ($attribute_definition_names as $definition_name) {
$attribute_data[$definition_name] = $this->attribute->get_definition_by_name($definition_name)[0];
foreach ($attribute_definition_names as $definition_name) {
$attribute_data[$definition_name] = $this->attribute->get_definition_by_name($definition_name)[0];
if ($attribute_data[$definition_name]['definition_type'] === DROPDOWN) {
$attribute_data[$definition_name]['dropdown_values'] = $this->attribute->get_definition_values($attribute_data[$definition_name]['definition_id']);
if ($attribute_data[$definition_name]['definition_type'] === DROPDOWN) {
$attribute_data[$definition_name]['dropdown_values'] = $this->attribute->get_definition_values($attribute_data[$definition_name]['definition_id']);
}
}
}
$db = db_connect();
$db->transBegin(); // TODO: This section needs to be reworked so that the data array is being created then passed to the Item model because $db doesn't exist in the controller without being instantiated, but database operations should be restricted to the model
$db = db_connect();
$db->transBegin(); // TODO: This section needs to be reworked so that the data array is being created then passed to the Item model because $db doesn't exist in the controller without being instantiated, but database operations should be restricted to the model
foreach ($csv_rows as $key => $row) {
$is_failed_row = false;
$item_id = (int)$row['Id'];
$is_update = ($item_id > 0);
$item_data = [
'item_id' => $item_id,
'name' => $row['Item Name'],
'description' => $row['Description'],
'category' => $row['Category'],
'cost_price' => $row['Cost Price'],
'unit_price' => $row['Unit Price'],
'reorder_level' => $row['Reorder Level'],
'deleted' => false,
'hsn_code' => $row['HSN'],
'pic_filename' => $row['Image']
];
foreach ($csv_rows as $key => $row) {
$is_failed_row = false;
$item_id = (int)$row['Id'];
$is_update = ($item_id > 0);
$item_data = [
'item_id' => $item_id,
'name' => $row['Item Name'],
'description' => $row['Description'],
'category' => $row['Category'],
'cost_price' => $row['Cost Price'],
'unit_price' => $row['Unit Price'],
'reorder_level' => $row['Reorder Level'],
'deleted' => false,
'hsn_code' => $row['HSN'],
'pic_filename' => $row['Image']
];
if (!empty($row['supplier ID'])) {
$item_data['supplier_id'] = $this->supplier->exists($row['Supplier ID']) ? $row['Supplier ID'] : null;
}
if ($is_update) {
$item_data['allow_alt_description'] = empty($row['Allow Alt Description']) ? null : $row['Allow Alt Description'];
$item_data['is_serialized'] = empty($row['Item has Serial Number']) ? null : $row['Item has Serial Number'];
} else {
$item_data['allow_alt_description'] = empty($row['Allow Alt Description']) ? '0' : '1';
$item_data['is_serialized'] = empty($row['Item has Serial Number']) ? '0' : '1';
}
if (!empty($row['Barcode']) && !$is_update) {
$item_data['item_number'] = $row['Barcode'];
$is_failed_row = $this->item->item_number_exists($item_data['item_number']);
}
if (!$is_failed_row) {
$is_failed_row = $this->data_error_check($row, $item_data, $allowed_stock_locations, $attribute_definition_names, $attribute_data);
}
// Remove false, null, '' and empty strings but keep 0
$item_data = array_filter($item_data, function ($value) {
return $value !== null && strlen($value);
});
if (!$is_failed_row && $this->item->save_value($item_data, $item_id)) {
$this->save_tax_data($row, $item_data);
$this->save_inventory_quantities($row, $item_data, $allowed_stock_locations, $employee_id);
$is_failed_row = $this->save_attribute_data($row, $item_data, $attribute_data); // TODO: $is_failed_row never gets used after this.
if (!empty($row['supplier ID'])) {
$item_data['supplier_id'] = $this->supplier->exists($row['Supplier ID']) ? $row['Supplier ID'] : null;
}
if ($is_update) {
$item_data = array_merge($item_data, get_object_vars($this->item->get_info_by_id_or_number($item_id)));
$item_data['allow_alt_description'] = empty($row['Allow Alt Description']) ? null : $row['Allow Alt Description'];
$item_data['is_serialized'] = empty($row['Item has Serial Number']) ? null : $row['Item has Serial Number'];
} else {
$item_data['allow_alt_description'] = empty($row['Allow Alt Description']) ? '0' : '1';
$item_data['is_serialized'] = empty($row['Item has Serial Number']) ? '0' : '1';
}
} else {
$failed_row = $key + 2;
$failCodes[] = $failed_row;
log_message('error', "CSV Item import failed on line $failed_row. This item was not imported.");
if (!empty($row['Barcode']) && !$is_update) {
$item_data['item_number'] = $row['Barcode'];
$is_failed_row = $this->item->item_number_exists($item_data['item_number']);
}
if (!$is_failed_row) {
$is_failed_row = $this->data_error_check($row, $item_data, $allowed_stock_locations, $attribute_definition_names, $attribute_data);
}
// Remove false, null, '' and empty strings but keep 0
$item_data = array_filter($item_data, function ($value) {
return $value !== null && strlen($value);
});
if (!$is_failed_row && $this->item->save_value($item_data, $item_id)) {
$this->save_tax_data($row, $item_data);
$this->save_inventory_quantities($row, $item_data, $allowed_stock_locations, $employee_id);
$is_failed_row = $this->save_attribute_data($row, $item_data, $attribute_data); // TODO: $is_failed_row never gets used after this.
if ($is_update) {
$item_data = array_merge($item_data, get_object_vars($this->item->get_info_by_id_or_number($item_id)));
}
} else {
$failed_row = $key + 2;
$failCodes[] = $failed_row;
log_message('error', "CSV Item import failed on line $failed_row. This item was not imported.");
}
unset($csv_rows[$key]);
}
unset($csv_rows[$key]);
}
$csv_rows = null;
$csv_rows = null;
if (count($failCodes) > 0) {
$message = lang('Items.csv_import_partially_failed', [count($failCodes), implode(', ', $failCodes)]);
$db->transRollback();
echo json_encode(['success' => false, 'message' => $message]);
} else {
$db->transCommit();
if (count($failCodes) > 0) {
$message = lang('Items.csv_import_partially_failed', [count($failCodes), implode(', ', $failCodes)]);
$db->transRollback();
echo json_encode(['success' => false, 'message' => $message]);
echo json_encode(['success' => true, 'message' => lang('Items.csv_import_success')]);
}
} else {
$db->transCommit();
echo json_encode(['success' => true, 'message' => lang('Items.csv_import_success')]);
echo json_encode(['success' => false, 'message' => lang('Items.csv_import_nodata_wrongformat')]);
}
} else {
echo json_encode(['success' => false, 'message' => lang('Items.csv_import_nodata_wrongformat')]);
}
} catch (Exception $e) {
echo json_encode(['success' => false, 'message' => $e->getMessage()]);
return;
}
}
/**

View File

@@ -13,6 +13,14 @@ class AttributeLinksUniqueConstraint extends Migration
public function up(): void
{
error_log('Migrating attribute_links unique constraint started');
helper('migration');
$foreignKeys = [
'ospos_attribute_links_ibfk_1',
'ospos_attribute_links_ibfk_2',
];
dropForeignKeyConstraints($foreignKeys, 'attribute_links');
dropColumnIfExists('ospos_attribute_links', 'generated_unique_column');
execute_script(APPPATH . 'Database/Migrations/sqlscripts/3.4.1_attribute_links_unique_constraint.sql');
}

View File

@@ -0,0 +1,38 @@
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class Migration_MissingConfigKeys extends Migration
{
/**
* Perform a migration step.
*/
public function up(): void
{
error_log('Starting transaction...');
$db = db_connect();
$db->transStart();
helper('migration');
// execute_script returns whether everything executed successfully
if (execute_script(APPPATH . 'Database/Migrations/sqlscripts/3.4.2_missing_config_keys.sql')) {
error_log('Migrated config table.');
}
else {
error_log('Failed to migrate config table.');
}
error_log('Transaction completed.');
$db->transComplete();
}
/**
* Revert a migration step.
*/
public function down(): void
{
}
}

View File

@@ -0,0 +1,28 @@
<?php
namespace App\Database\Migrations;
use CodeIgniter\Database\Migration;
class Migration_NullableTaxCategoryId extends Migration
{
/**
* Perform a migration step.
*/
public function up(): void
{
error_log('Migrating nullable tax category ID');
helper('migration');
execute_script(APPPATH . 'Database/Migrations/sqlscripts/3.4.2_nullable_tax_category_id.sql');
error_log('Migrated nullable tax category ID');
}
/**
* Revert a migration step.
*/
public function down(): void
{
}
}

View File

@@ -1,8 +1,6 @@
ALTER TABLE `ospos_attribute_links` DROP CONSTRAINT `ospos_attribute_links_ibfk_1`;
ALTER TABLE `ospos_attribute_links` DROP CONSTRAINT `ospos_attribute_links_ibfk_2`;
# Prevents duplicate attribute links with the same definition_id and item_id.
# This accounts for dropdown rows (null item_id) and rows associated with sales or receivings.
ALTER TABLE `ospos_attribute_links`
ADD COLUMN `generated_unique_column` VARCHAR(255) GENERATED ALWAYS AS (
CASE

View File

@@ -0,0 +1,35 @@
INSERT INTO ospos_app_config (`key`, `value`)
SELECT 'msg_msg', ''
WHERE NOT EXISTS (SELECT 1 FROM ospos_app_config WHERE `key` = 'msg_msg');
INSERT INTO ospos_app_config (`key`, `value`)
SELECT 'msg_pwd', ''
WHERE NOT EXISTS (SELECT 1 FROM ospos_app_config WHERE `key` = 'msg_pwd');
INSERT INTO ospos_app_config (`key`, `value`)
SELECT 'msg_uid', ''
WHERE NOT EXISTS (SELECT 1 FROM ospos_app_config WHERE `key` = 'msg_uid');
INSERT INTO ospos_app_config (`key`, `value`)
SELECT 'msg_src', ''
WHERE NOT EXISTS (SELECT 1 FROM ospos_app_config WHERE `key` = 'msg_src');
INSERT INTO ospos_app_config (`key`, `value`)
SELECT 'smtp_timeout', 5000
WHERE NOT EXISTS (SELECT 1 FROM ospos_app_config WHERE `key` = 'smtp_timeout');
INSERT INTO ospos_app_config (`key`, `value`)
SELECT 'smtp_crypto', 'tls'
WHERE NOT EXISTS (SELECT 1 FROM ospos_app_config WHERE `key` = 'smtp_crypto');
INSERT INTO ospos_app_config (`key`, `value`)
SELECT 'smtp_port', 587
WHERE NOT EXISTS (SELECT 1 FROM ospos_app_config WHERE `key` = 'smtp_port');
INSERT INTO ospos_app_config (`key`, `value`)
SELECT 'mailpath', '/usr/bin/sendmail'
WHERE NOT EXISTS (SELECT 1 FROM ospos_app_config WHERE `key` = 'mailpath');
INSERT INTO ospos_app_config (`key`, `value`)
SELECT 'protocol', 'sendmail'
WHERE NOT EXISTS (SELECT 1 FROM ospos_app_config WHERE `key` = 'protocol');

View File

@@ -0,0 +1,3 @@
-- Migration to make tax_category_id nullable in ospos_items
ALTER TABLE ospos_items
MODIFY COLUMN tax_category_id INT NULL;

View File

@@ -3,9 +3,11 @@
use Config\Database;
/**
* Migration helper
* Migration helper.
* @param string $path Path to migration script.
* @return bool Whether the migration executed successfully.
*/
function execute_script(string $path): void
function execute_script(string $path): bool
{
$version = preg_replace("/(.*_)?(.*).sql/", "$2", $path);
error_log("Migrating to $version (file: $path)");
@@ -16,17 +18,27 @@ function execute_script(string $path): void
$db = Database::connect();
$success = true; // whether *all* queries succeeded
foreach ($sqls as $statement) {
$statement = "$statement;";
$hadError = !$db->simpleQuery($statement);
if (!$db->simpleQuery($statement)) {
if ($hadError) {
$success = false;
foreach ($db->error() as $error) {
error_log("error: $error");
}
}
}
error_log("Migrated to $version");
if ($success) {
error_log("Successfully migrated to $version");
}
else {
error_log("Could not migrate to $version.");
}
return $success;
}
/**
@@ -212,6 +224,36 @@ function foreignKeyExists(string $constraintName, string $tableName): bool {
return $query->getNumRows() > 0;
}
/**
* Drops a column from a table if it exists.
*
* @param string $table The name of the table.
* @param string $column The name of the column to drop.
* @return void
*/
function dropColumnIfExists(string $table, string $column): void
{
$prefix = overridePrefix();
$db = Database::connect();
$builder = $db->table('information_schema.COLUMNS');
// Check if the column exists in the table
$builder->select('COLUMN_NAME')
->where('TABLE_SCHEMA', $db->database)
->where('TABLE_NAME', $prefix . $table)
->where('COLUMN_NAME', $column);
$query = $builder->get();
if ($query->getNumRows() > 0)
{
// Drop the column if it exists
$db->query("ALTER TABLE `" . $prefix . "$table` DROP COLUMN `$column`");
}
overridePrefix($prefix);
}
/**
* Checks if the current database is MariaDB.
*

View File

@@ -1,89 +1,89 @@
<?php
return [
"address_1" => "Alamat 1",
"address_2" => "Alamat 2",
"admin" => "",
"city" => "Kota",
"clerk" => "",
"close" => "Tutup",
"color" => "",
"comments" => "Komentar",
"common" => "umum",
"confirm_search" => "Anda telah memilih satu atau beberapa baris, ini tidak akan dipilih lagi setelah pencarian Anda. Apakah Anda yakin ingin mengirimkan pencarian ini?",
"copyrights" => "© 2010 - {0}",
"correct_errors" => "Silahkan perbaiki kesalahan sebelum menyimpan",
"country" => "Negara",
"dashboard" => "",
"date" => "Tanggal",
"delete" => "Hapus",
"det" => "detil",
"download_import_template" => "Unduh yang Diimpor dalam format CSV (CSV)",
"edit" => "ubah",
"email" => "Email",
"email_invalid_format" => "Alamat email tidak dalam format yang benar.",
"export_csv" => "Ekspor ke CSV",
"export_csv_no" => "Tidak",
"export_csv_yes" => "Ya",
"fields_required_message" => "Bagian yang berwarna merah harus diisi",
"fields_required_message_unique" => "",
"first_name" => "Nama Depan",
"first_name_required" => "Nama Depan harus diisi.",
"first_page" => "Pertama",
"gender" => "Jenis Kelamin",
"gender_female" => "P",
"gender_male" => "L",
"gender_undefined" => "",
"icon" => "ikon",
"id" => "Nomor ID",
"import" => "Impor",
"import_change_file" => "Ubah",
"import_csv" => "Impor dari CSV",
"import_full_path" => "Diperlukan alamat lengkap file CSV",
"import_remove_file" => "Hapus",
"import_select_file" => "Pilih file",
"inv" => "Persediaan",
"last_name" => "Nama Belakang",
"last_name_required" => "Nama belakang harus diisi.",
"last_page" => "Akhir",
"learn_about_project" => "Untuk mempelajari informasi terbaru tentang proyek ini.",
"list_of" => "Daftar",
"logo" => "Logo",
"logo_mark" => "Tanda",
"logout" => "Keluar",
"manager" => "",
"migration_needed" => "Migrasi data ke {0} akan dimulai setelah masuk.",
"new" => "Baru",
"no" => "Tidak",
"no_persons_to_display" => "Tidak ada orang yang ditampilkan.",
"none_selected_text" => "[Pilih]",
"or" => "ATAU",
"people" => "",
"phone_number" => "Nomor Telepon",
"phone_number_required" => "Nomer Telepon Wajib Diisi",
"please_visit_my" => "Silahkan kunjungi",
"position" => "",
"powered_by" => "Diberdayakan oleh",
"price" => "Harga",
"print" => "Cetak",
"remove" => "Hapus",
"required" => "Diperlukan",
"restore" => "Kembalikan",
"return_policy" => "Kebijakan Retur",
"search" => "Cari",
"search_options" => "Pilihan pencarian",
"searched_for" => "Mencari untuk",
"software_short" => "OSPOS",
"software_title" => "Sumber Terbuka Titik Penjualan",
"state" => "Provinsi",
"submit" => "Kirim",
"total_spent" => "Total",
"unknown" => "Tidak diketahui",
"view_recent_sales" => "Lihat Penjualan Terkini",
"website" => "Situs",
"welcome" => "Selamat Datang",
"welcome_message" => "Selamat Datang di OSPOS, klik modul di bawah ini untuk memulai.",
"yes" => "Iya",
"you_are_using_ospos" => "Anda menggunakan Open Source Point Of Sale Versi",
"zip" => "Kode POS",
'address_1' => "Alamat 1",
'address_2' => "Alamat 2",
'admin' => "",
'city' => "Kota",
'clerk' => "",
'close' => "Tutup",
'color' => "",
'comments' => "Komentar",
'common' => "umum",
'confirm_search' => "Anda telah memilih satu atau beberapa baris, ini tidak akan dipilih lagi setelah pencarian Anda. Apakah Anda yakin ingin mengirimkan pencarian ini?",
'copyrights' => "© 2010 - {0}",
'correct_errors' => "Silahkan perbaiki kesalahan sebelum menyimpan",
'country' => "Negara",
'dashboard' => "",
'date' => "Tanggal",
'delete' => "Hapus",
'det' => "detail",
'download_import_template' => "Unduh yang Diimpor dalam format CSV (CSV)",
'edit' => "ubah",
'email' => "Surel",
'email_invalid_format' => "Alamat surel tidak dalam format yang benar.",
'export_csv' => "Ekspor ke CSV",
'export_csv_no' => "Tidak",
'export_csv_yes' => "Ya",
'fields_required_message' => "Bagian yang berwarna merah harus diisi",
'fields_required_message_unique' => "",
'first_name' => "Nama Depan",
'first_name_required' => "Nama Depan harus diisi.",
'first_page' => "Pertama",
'gender' => "Jenis Kelamin",
'gender_female' => "P",
'gender_male' => "L",
'gender_undefined' => "",
'icon' => "Ikon",
'id' => "ID",
'import' => "Impor",
'import_change_file' => "Ubah",
'import_csv' => "Impor dari CSV",
'import_full_path' => "Diperlukan alamat lengkap file CSV",
'import_remove_file' => "Hapus",
'import_select_file' => "Pilih file",
'inv' => "Persediaan",
'last_name' => "Nama Belakang",
'last_name_required' => "Nama belakang harus diisi.",
'last_page' => "Akhir",
'learn_about_project' => "Untuk mempelajari informasi terbaru tentang proyek ini.",
'list_of' => "Daftar",
'logo' => "Logo",
'logo_mark' => "Tanda",
'logout' => "Keluar",
'manager' => "",
'migration_needed' => "Migrasi data ke {0} akan dimulai setelah masuk.",
'new' => "Baru",
'no' => "Tidak",
'no_persons_to_display' => "Tidak ada orang yang ditampilkan.",
'none_selected_text' => "[Pilih]",
'or' => "ATAU",
'people' => "",
'phone_number' => "Nomor Telepon",
'phone_number_required' => "Nomer Telepon Wajib Diisi",
'please_visit_my' => "Silahkan kunjungi",
'position' => "",
'powered_by' => "Diberdayakan oleh",
'price' => "Harga",
'print' => "Cetak",
'remove' => "Hapus",
'required' => "Diperlukan",
'restore' => "Kembalikan",
'return_policy' => "Kebijakan Retur",
'search' => "Cari",
'search_options' => "Pilihan pencarian",
'searched_for' => "Mencari untuk",
'software_short' => "OSPOS",
'software_title' => "Sumber Terbuka Titik Penjualan",
'state' => "Provinsi",
'submit' => "Kirim",
'total_spent' => "Total",
'unknown' => "Tidak diketahui",
'view_recent_sales' => "Lihat Penjualan Terkini",
'website' => "Situs",
'welcome' => "Selamat Datang",
'welcome_message' => "Selamat Datang di OSPOS, klik modul di bawah ini untuk memulai.",
'yes' => "Iya",
'you_are_using_ospos' => "Anda menggunakan Open Source Point Of Sale Versi",
'zip' => "Kode POS",
];

View File

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

View File

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

View File

@@ -1,49 +1,49 @@
<?php
return [
"admin_cashups" => "",
"admin_cashups_desc" => "",
"attributes" => "Atribut",
"attributes_desc" => "Tambah, Perbaharui, Hapus dan Cari atribut.",
"both" => "Keduanya",
"cashups" => "Kasir",
"cashups_desc" => "Tambah, Perbaharui, Hapus dan Cari Uang Tunai.",
"config" => "Konfigurasi",
"config_desc" => "Ubah Konfigurasi Toko.",
"customers" => "Pelanggan",
"customers_desc" => "Tambah, ubah, hapus, dan cari Pelanggan.",
"employees" => "Karyawan",
"employees_desc" => "Tambah, ubah, hapus, dan cari Karyawan.",
"expenses" => "Biaya",
"expenses_categories" => "Kategori Biaya",
"expenses_categories_desc" => "Tambah, Edit, dan Hapus Kategori Biaya.",
"expenses_desc" => "Tambah, ubah, hapus, dan cari Biaya.",
"giftcards" => "Gift Card",
"giftcards_desc" => "Tambah, ubah, hapus dan cari Gift Card.",
"home" => "Beranda",
"home_desc" => "Daftar modul menu Beranda.",
"item_kits" => "Item Paket",
"item_kits_desc" => "Tambah, ubah, hapus, dan cari Item Paket.",
"items" => "Item Barang",
"items_desc" => "Tambah, ubah, hapus, dan cari Item.",
"messages" => "Messages",
"messages_desc" => "Kirim pesan pada Pelanggan, Pemasok, dan Karyawan.",
"migrate" => "Migrasi",
"migrate_desc" => "Perbaharui basis data OSPOS.",
"office" => "Kantor",
"office_desc" => "Daftar modul menu Kantor.",
"receivings" => "Penerimaan",
"receivings_desc" => "Proses Pesanan Pembelian.",
"reports" => "Laporan",
"reports_desc" => "Lihat dan Cetak Laporan.",
"sales" => "Penjualan",
"sales_desc" => "Proses Penjualan dan Retur.",
"suppliers" => "Pemasok",
"suppliers_desc" => "Tambah, ubah, hapus dan cari Pemasok.",
"taxes" => "Pajak",
"taxes_desc" => "Konfigurasi Pajak Penjualan.",
"timeclocks" => "",
"timeclocks_categories" => "",
"timeclocks_categories_desc" => "",
"timeclocks_desc" => "",
'admin_cashups' => "",
'admin_cashups_desc' => "",
'attributes' => "Atribut",
'attributes_desc' => "Tambah, Perbaharui, Hapus dan Cari atribut.",
'both' => "Keduanya",
'cashups' => "Kasir",
'cashups_desc' => "Tambah, Perbaharui, Hapus dan Cari Uang Tunai.",
'config' => "Konfigurasi",
'config_desc' => "Ubah Konfigurasi Toko.",
'customers' => "Pelanggan",
'customers_desc' => "Tambah, ubah, hapus, dan cari Pelanggan.",
'employees' => "Karyawan",
'employees_desc' => "Tambah, ubah, hapus, dan cari Karyawan.",
'expenses' => "Biaya",
'expenses_categories' => "Kategori Biaya",
'expenses_categories_desc' => "Tambah, Edit, dan Hapus Kategori Biaya.",
'expenses_desc' => "Tambah, ubah, hapus, dan cari Biaya.",
'giftcards' => "Kartu Hadiah",
'giftcards_desc' => "Tambah, ubah, hapus dan cari Gift Card.",
'home' => "Beranda",
'home_desc' => "Daftar modul menu Beranda.",
'item_kits' => "Item Paket",
'item_kits_desc' => "Tambah, ubah, hapus, dan cari Item Paket.",
'items' => "Item Barang",
'items_desc' => "Tambah, ubah, hapus, dan cari Item.",
'messages' => "Pesan",
'messages_desc' => "Kirim pesan pada Pelanggan, Pemasok, dan Karyawan.",
'migrate' => "Migrasi",
'migrate_desc' => "Perbaharui basis data OSPOS.",
'office' => "Kantor",
'office_desc' => "Daftar modul menu Kantor.",
'receivings' => "Penerimaan",
'receivings_desc' => "Proses Pesanan Pembelian.",
'reports' => "Laporan",
'reports_desc' => "Lihat dan Cetak Laporan.",
'sales' => "Penjualan",
'sales_desc' => "Proses Penjualan dan Retur.",
'suppliers' => "Pemasok",
'suppliers_desc' => "Tambah, ubah, hapus dan cari Pemasok.",
'taxes' => "Pajak",
'taxes_desc' => "Konfigurasi Pajak Penjualan.",
'timeclocks' => "",
'timeclocks_categories' => "",
'timeclocks_categories_desc' => "",
'timeclocks_desc' => "",
];

View File

@@ -147,7 +147,7 @@ class Barcode_lib
$barcode = $this->generate_barcode($item, $barcode_config);
$display_table = '<table>';
$display_table .= '<tr><td style="text-align: center;">' . $this->manage_display_layout($barcode_config['barcode_first_row'], $item, $barcode_config) . '</td></tr>';
$display_table .= '<tr><td style="text-align: center;"><div class="barcode">$barcode</div></td></tr>';
$display_table .= '<tr><td style="text-align: center;"><div class="barcode">'.$barcode.'</div></td></tr>';
$display_table .= '<tr><td style="text-align: center;">' . $this->manage_display_layout($barcode_config['barcode_second_row'], $item, $barcode_config) . '</td></tr>';
$display_table .= '<tr><td style="text-align: center;">' . $this->manage_display_layout($barcode_config['barcode_third_row'], $item, $barcode_config) . '</td></tr>';
$display_table .= '</table>';

View File

@@ -75,7 +75,7 @@ class Dinner_table extends Model
* @param int $dinner_table_id
* @return string
*/
public function get_name(int $dinner_table_id): string
public function get_name(?string $dinner_table_id): string
{
if (empty($dinner_table_id)) {
return '';

View File

@@ -90,8 +90,8 @@ use Config\OSPOS;
File Permissions:<br>
&#187; [writable/logs:]
<?php $logs = WRITEPATH . 'logs/';
$uploads = WRITEPATH . 'uploads/';
$images = WRITEPATH . 'uploads/item_pics/';
$uploads = FCPATH. 'uploads/';
$images = FCPATH. 'uploads/item_pics/';
$importCustomers = WRITEPATH . '/uploads/importCustomers.csv'; // TODO: This variable does not follow naming conventions for the project.
if (is_writable($logs)) {
@@ -109,7 +109,7 @@ use Config\OSPOS;
clearstatcache();
?>
<br>
&#187; [writable/uploads:]
&#187; [public/uploads:]
<?php
if (is_writable($uploads)) {
echo ' - ' . substr(sprintf("%o", fileperms($uploads)), -4) . ' | ' . '<span style="color: green;"> Writable &#x2713 </span>';
@@ -128,7 +128,7 @@ use Config\OSPOS;
clearstatcache();
?>
<br>
&#187; [writable/uploads/item_pics:]
&#187; [public/uploads/item_pics:]
<?php
if (is_writable($images)) {
echo ' - ' . substr(sprintf("%o", fileperms($images)), -4) . ' | ' . '<span style="color: green;"> Writable &#x2713 </span>';

View File

@@ -6,7 +6,7 @@
use App\Models\Employee;
use App\Models\Customer;
$this->dinner_table = model(Dinner_table::class);
?>
<style>
@@ -37,7 +37,7 @@ use App\Models\Customer;
<td><?= $suspended_sale['doc_id'] ?></td>
<td><?= date($config['dateformat'], strtotime($suspended_sale['sale_time'])) ?></td>
<?php if ($config['dinner_table_enable']) { ?>
<td><?= esc($this->Dinner_table->get_name($suspended_sale['dinner_table_id'])) ?></td>
<td><?= esc($this->dinner_table->get_name($suspended_sale['dinner_table_id'])) ?></td>
<?php } ?>
<td>
<?php

View File

@@ -33,25 +33,23 @@
"require": {
"ext-intl": "*",
"php": "^8.1",
"codeigniter4/framework": "4.6.0",
"codeigniter4/framework": "4.6.2",
"dompdf/dompdf": "^2.0.3",
"ezyang/htmlpurifier": "^4.17",
"laminas/laminas-escaper": "2.16.0",
"laminas/laminas-escaper": "2.17.0",
"paragonie/random_compat": "^2.0.21",
"picqer/php-barcode-generator": "^2.4.0",
"tamtamchik/namecase": "^3.0.0"
},
"require-dev": {
"codeigniter/coding-standard": "^1.8",
"codeigniter4/devkit": "^1.3",
"fakerphp/faker": "^1.23.0",
"friendsofphp/php-cs-fixer": "^3.47.1",
"kint-php/kint": "^5.0.4",
"mikey179/vfsstream": "^1.6",
"nexusphp/cs-config": "^3.6",
"phpunit/phpunit": "^10.5.16 || ^11.2",
"predis/predis": "^1.1 || ^2.0",
"roave/security-advisories": "dev-latest"
"predis/predis": "^1.1 || ^2.0"
},
"replace": {
"psr/log": "*"

3720
composer.lock generated
View File

File diff suppressed because it is too large Load Diff

View File

@@ -1,79 +1,14 @@
version: '2.2'
volumes:
uploads:
driver: local
logs:
driver: local
mysql:
driver: local
networks:
app_net:
db_net:
include:
- docker-compose.yaml
services:
ospos:
image: jekkos/opensourcepos:3.4.1
restart: always
depends_on:
- mysql
expose:
- "80"
networks:
- app_net
volumes:
- uploads:/app/writable/uploads
- logs:/app/writable/logs
environment:
- CI_ENVIRONMENT=${OSPOS_CI_ENV}
- FORCE_HTTPS=true
- PHP_TIMEZONE=UTC
- MYSQL_USERNAME=${OSPOS_MYSQL_USERNAME}
- MYSQL_PASSWORD=${OSPOS_MYSQL_PASSWORD}
- MYSQL_DB_NAME=ospos
- MYSQL_HOST_NAME=mysql
mysql:
image: mariadb:10.5
container_name: mysql
restart: always
expose:
- "3306"
networks:
- db_net
volumes:
- ./database/database.sql:/docker-entrypoint-initdb.d/database.sql
- mysql:/var/lib/mysql:rw
environment:
- MYSQL_ROOT_PASSWORD=${OSPOS_MYSQL_ROOT_PASSWORD}
- MYSQL_DATABASE=ospos
- MYSQL_USER=${OSPOS_MYSQL_USERNAME}
- MYSQL_PASSWORD=${OSPOS_MYSQL_PASSWORD}
phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
restart: always
depends_on:
- mysql
expose:
- "80"
networks:
- app_net
environment:
- MYSQL_USERNAME=${OSPOS_MYSQL_USERNAME}
- MYSQL_ROOT_PASSWORD=${OSPOS_MYSQL_ROOT_PASSWORD}
- PMA_HOST=mysql
nginx:
image: nginx:1.19-alpine
container_name: nginx
restart: always
depends_on:
- ospos
- phpmyadmin
- certbot
volumes:
- ./docker/data/nginx/nginx.tmpl:/etc/nginx/nginx.tmpl:ro

View File

@@ -15,7 +15,7 @@ services:
networks:
- app_net
volumes:
- uploads:/app/writable/uploads
- uploads:/app/public/uploads
- logs:/app/writable/logs
environment:
- CI_ENVIRONMENT=production

68
package-lock.json generated
View File

@@ -1,12 +1,12 @@
{
"name": "@opensourcepos/opensourcepos",
"version": "3.4.1",
"version": "3.4.2",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "@opensourcepos/opensourcepos",
"version": "3.4.1",
"version": "3.4.2",
"license": "MIT",
"dependencies": {
"bootstrap": "^3.4.1",
@@ -38,7 +38,7 @@
"jquery-ui-dist": "^1.12.1",
"jquery-validation": "^1.19.5",
"js-cookie": "^2.2.1",
"jspdf": "^3.0.1",
"jspdf": "^3.0.2",
"jspdf-autotable": "^5.0.2",
"tableexport.jquery.plugin": "^1.30.0"
},
@@ -176,6 +176,12 @@
"undici-types": "~5.26.4"
}
},
"node_modules/@types/pako": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/@types/pako/-/pako-2.0.4.tgz",
"integrity": "sha512-VWDCbrLeVXJM9fihYodcLiIv0ku+AlOa/TQ1SvYOaBuyrSKgEcro95LJyIsJ4vSo6BXIxOKxiJAat04CmST9Fw==",
"license": "MIT"
},
"node_modules/@types/raf": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/@types/raf/-/raf-3.4.3.tgz",
@@ -539,17 +545,6 @@
"node": ">= 10.13.0"
}
},
"node_modules/atob": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
"integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
"bin": {
"atob": "bin/atob.js"
},
"engines": {
"node": ">= 4.5.0"
}
},
"node_modules/available-typed-arrays": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz",
@@ -794,17 +789,6 @@
"base64-js": "^1.1.2"
}
},
"node_modules/btoa": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/btoa/-/btoa-1.2.1.tgz",
"integrity": "sha512-SB4/MIGlsiVkMcHmT+pSmIPoNDoHg+7cMzmt3Uxt628MTz2487DKSqK/fuhFBrkuqrYv5UCEnACpF4dTFNKc/g==",
"bin": {
"btoa": "bin/btoa.js"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/buffer": {
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
@@ -1747,6 +1731,23 @@
"fastest-levenshtein": "^1.0.7"
}
},
"node_modules/fast-png": {
"version": "6.4.0",
"resolved": "https://registry.npmjs.org/fast-png/-/fast-png-6.4.0.tgz",
"integrity": "sha512-kAqZq1TlgBjZcLr5mcN6NP5Rv4V2f22z00c3g8vRrwkcqjerx7BEhPbOnWCPqaHUl2XWQBJQvOT/FQhdMT7X/Q==",
"license": "MIT",
"dependencies": {
"@types/pako": "^2.0.3",
"iobuffer": "^5.3.2",
"pako": "^2.1.0"
}
},
"node_modules/fast-png/node_modules/pako": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/pako/-/pako-2.1.0.tgz",
"integrity": "sha512-w+eufiZ1WuJYgPXbV/PO3NCMEc3xqylkKHzp8bxp1uW4qaSNQUkwmLLEc3kKsfz8lpV1F8Ht3U1Cm+9Srog2ug==",
"license": "(MIT AND Zlib)"
},
"node_modules/fastest-levenshtein": {
"version": "1.0.16",
"resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz",
@@ -3237,6 +3238,12 @@
"node": ">=10.13.0"
}
},
"node_modules/iobuffer": {
"version": "5.4.0",
"resolved": "https://registry.npmjs.org/iobuffer/-/iobuffer-5.4.0.tgz",
"integrity": "sha512-DRebOWuqDvxunfkNJAlc3IzWIPD5xVxwUNbHr7xKB8E6aLJxIPfNX3CoMJghcFjpv6RWQsrcJbghtEwSPoJqMA==",
"license": "MIT"
},
"node_modules/irregular-plurals": {
"version": "3.5.0",
"resolved": "https://registry.npmjs.org/irregular-plurals/-/irregular-plurals-3.5.0.tgz",
@@ -3729,14 +3736,13 @@
"license": "MIT"
},
"node_modules/jspdf": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/jspdf/-/jspdf-3.0.1.tgz",
"integrity": "sha512-qaGIxqxetdoNnFQQXxTKUD9/Z7AloLaw94fFsOiJMxbfYdBbrBuhWmbzI8TVjrw7s3jBY1PFHofBKMV/wZPapg==",
"version": "3.0.2",
"resolved": "https://registry.npmjs.org/jspdf/-/jspdf-3.0.2.tgz",
"integrity": "sha512-G0fQDJ5fAm6UW78HG6lNXyq09l0PrA1rpNY5i+ly17Zb1fMMFSmS+3lw4cnrAPGyouv2Y0ylujbY2Ieq3DSlKA==",
"license": "MIT",
"dependencies": {
"@babel/runtime": "^7.26.7",
"atob": "^2.1.2",
"btoa": "^1.2.1",
"@babel/runtime": "^7.26.9",
"fast-png": "^6.2.0",
"fflate": "^0.8.1"
},
"optionalDependencies": {

View File

@@ -1,7 +1,7 @@
{
"name": "@opensourcepos/opensourcepos",
"version": "3.4.1",
"description": "Open Source Point of Sale is a web based point of sale system written in the PHP language. It uses MySQL as the data storage back-end and has a simple user interface.",
"version": "3.4.2",
"description": "pen Source Point of Sale is a web based point of sale system written in the PHP language. It uses MySQL as the data storage back-end and has a simple user interface.",
"main": "index.php",
"license": "MIT",
"authors": [
@@ -59,7 +59,7 @@
"jquery-ui-dist": "^1.12.1",
"jquery-validation": "^1.19.5",
"js-cookie": "^2.2.1",
"jspdf": "^3.0.1",
"jspdf": "^3.0.2",
"jspdf-autotable": "^5.0.2",
"tableexport.jquery.plugin": "^1.30.0"
},

View File

@@ -284,7 +284,7 @@
return function (resource, response) {
var id = response.id !== undefined ? response.id.toString() : "";
if (!response.success) {
$.notify($.text(response.message).html(), { type: 'danger' });
$.notify(response.message, { type: 'danger' });
} else {
var message = response.message;
var selector = rows_selector(response.id);