Files
opensourcepos/app/Language/az/Sales.php
objecttothis 9c542efaf6 Feature: Payment reference code (#4587)
* Add `reference_code` to sale payment queries and group by statements

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* Refactor `Sales` controller to improve payment handling readability and replace snake_case with camelCase variables

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* Add missing translations for `Sales` language file and include new keys like `must_enter_rrn` and `reference_code`

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* Refactor `Sales` payment handling to use camelCase and extend `addPayment` with `referenceCode` support

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* Refactor `Sales` models, controllers, and libraries to adopt camelCase naming conventions and improve readability

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* Add translations and updates for `must_enter_reference_code` and `reference_code` across language files and update `Sales` controller to replace `must_enter_rrn` with the new key

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* feat(sales): add reference code input and payment type helper

- Add `get_reference_code_payment_types()` to locale_helper as single
  source of truth for card-requiring payment types
- Add reference code row to register view, shown/hidden via JS based
  on selected payment type
- Fix payment type dropdown width to 100% for consistent layout
- Add min-width to payment buttons and right-padding to button group

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* feat(config): add payment reference code length configuration

- Add payment_reference_code_min and payment_reference_code_max fields
  to Config controller save logic
- Add translation keys for reference code length limits across all
  language files (min/max label + section header)
- Align array key formatting in Config controller for readability

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* style(lang): normalize string delimiters to single quotes across all language files

Convert double-quoted array keys and values to single quotes in all
app/Language/*/Config.php and app/Language/*/Sales.php variants.
No translation content changed — formatting only.

Also add Localization section to AGENTS.md documenting language file
conventions for new keys and fallback behavior.

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* feat(lang): add payment reference code length translations

Add localized strings for payment_reference_code_length_limits,
payment_reference_code_length_max_label, and
payment_reference_code_length_min_label across all supported locales.

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* test(config,sales): add payment reference code min/max validation tests

- Add baseLocalePayload() helper in ConfigTest for postSaveLocale tests
- Add testSaveLocale_AcceptsValidReferenceCodeMinMax and related boundary tests
- Add Sale_libPaymentTest for payment reference code validation in Sale_lib

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* fix(sales): add type-specific validation for amount_tendered

Gift card payments use amount_tendered as giftcard number (integer);
cash/other payments require decimal_locale format. Apply correct
validation rule per payment type instead of generic required.

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* fix(lang): replace self-closing </br> with <br> in all locales

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* fix(sales): use configurable precision in discount comparison

Replace hardcoded precision 2 with totals_decimals() when comparing
discount against item total via bccomp/bcmul, so discount validation
respects the configured decimal precision setting.

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* fix(lang): correct Azerbaijani translations in Config.php

Replace placeholder/mismatched strings with accurate translations:
- email_mailpath, email_smtp_pass, invoice_email_message
- number_locale_invalid/required, receipt_template
- reward_configuration, right, tax_decimals, theme

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* feat(sales): add reference code support to payment edit flow

- Add reference_code field to new payment row in sale edit form
- Persist reference_code on insert in Sale model
- Validate reference_code_new in Sales controller using configurable min/max length rules

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* feat(lang): add Georgian (ka) language stubs for Config and Sales

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* Match the fallback maximum reference_code length to the maximum of the field in the db

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

* Bug fixes

- Add validation of UI settings to prevent overridden values from being passed.
- Correct maximum value in JS for payment_reference_code maximum length to 40.
- Fix bug causing copy_entire_sale() to incorrectly copy the reference code and cash_adjustment

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>

---------

Signed-off-by: Travis Garrison <travis@chiraqbookstore.com>
Co-authored-by: Travis Garrison <travis@chiraqbookstore.com>
2026-07-10 13:49:05 +04:00

236 lines
15 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
return [
'account_number' => 'Hesab #',
'add_payment' => 'Ödəniş Əlavə Etmək',
'amount_due' => 'Qalıq',
'amount_tendered' => 'Ödənilən məbləğ',
'authorized_signature' => 'Səlahiyyətli İmza',
'cancel_sale' => 'İmtina',
'cash' => 'Nəğd pullar',
'cash_1' => '',
'cash_2' => '',
'cash_3' => '',
'cash_4' => '',
'cash_adjustment' => 'Nağd pulun tənzimlənməsi',
'cash_deposit' => 'Nağd depozit',
'cash_filter' => 'Nəğd Pul',
'change_due' => 'Qalıq',
'change_price' => 'Satış qiymətini dəyiş',
'check' => 'Çek',
'check_balance' => 'Çek Xatırladan',
'check_filter' => 'Çek',
'close' => '',
'comment' => 'Şərh',
'comments' => 'Şərhlər',
'company_name' => '',
'complete' => '',
'complete_sale' => 'Tamamlayın',
'confirm_cancel_sale' => 'Siz əminsiniz ki,satışı ləğv etmək istəyirsiniz? Bütün detallar silinəcək.',
'confirm_delete' => 'Siz əminsiniz ki seçilmiş satışı (lar) silmək istəyirsiz?',
'confirm_restore' => 'Seçilmiş Satışları bərpa etmək istədiyinizə əminsinizmi?',
'credit' => 'Kredit kartı',
'credit_deposit' => 'Kredit Depoziti',
'credit_filter' => 'Kredit kartı',
'current_table' => '',
'customer' => 'Ad',
'customer_address' => 'Ünvan',
'customer_discount' => 'Endirim',
'customer_email' => 'E-poçt',
'customer_location' => 'Yer',
'customer_mailchimp_status' => 'Mailchimp Statusu',
'customer_optional' => '(Ödənişlərdə tələb olunur)',
'customer_required' => '(Vacib)',
'customer_total' => 'Cəmi',
'customer_total_spent' => '',
'customers_available_points' => 'Mövcud ballar',
'daily_sales' => '',
'date' => 'Satış Tarixi',
'date_range' => 'Tarix Aralığı',
'date_required' => 'Düzgün tarix daxil edilməlidir.',
'date_type' => 'Boşluğa tarix əlavə edilməlidir.',
'debit' => 'Debit kart',
'debit_filter' => '',
'delete' => 'Silməyə izin ver',
'delete_confirmation' => 'Siz bu satışı silmək istəyinizə əminsiniz? Bu əməlliyat bərpa edilməyəcək.',
'delete_entire_sale' => 'Bütün Satışı Silmək',
'delete_successful' => 'Siz uğurla satışı sildiniz.',
'delete_unsuccessful' => 'Satışın silinməsi uğursuz oldu.',
'description_abbrv' => 'Təsvir.',
'discard' => 'İmtina',
'discard_quote' => '',
'discount' => 'Disk',
'discount_exceeds_item_total' => '',
'discount_included' => '% Endirim',
'discount_percent_exceeds_100' => '',
'discount_short' => '%',
'due' => 'Görə',
'due_filter' => 'Görə',
'edit' => 'Redaktə',
'edit_item' => 'Malın Redaktəsi',
'edit_sale' => 'Satışın Redaktəsi',
'email_receipt' => 'E-poçt Qəbz',
'employee' => 'Əməkdaş',
'entry' => 'Daxil',
'error_editing_item' => 'XƏTA Malın redaktəsində',
'find_or_scan_item' => 'Malın axtarışı',
'find_or_scan_item_or_receipt' => 'Tapmaq skan etmək və ya kvitansiya',
'giftcard' => 'Hədiyyə Kartı',
'giftcard_balance' => 'Hədiyyə Kartı Balansı',
'giftcard_filter' => '',
'giftcard_number' => 'Hədiyyə kartının nömrəsi',
'group_by_category' => 'Bölməyə görə grup',
'group_by_type' => 'Növə görə qrup',
'hsn' => 'HSN',
'id' => 'Satış İD',
'include_prices' => 'Qiymətlər daxildir?',
'invoice' => 'Qaimə',
'invoice_confirm' => 'Bu qaimə göndəriləcək',
'invoice_enable' => 'Qaimə Yarat',
'invoice_filter' => 'Qaimələr',
'invoice_no_email' => 'Bu müştərinin elektron ünvanı düzgün deyil.',
'invoice_number' => 'Qaimə #',
'invoice_number_duplicate' => 'Qaimə nömrəsi unikal olmalıdır.',
'invoice_sent' => 'Qaimə göndərildi',
'invoice_total' => 'Qaimə Çəmi',
'invoice_type_custom_invoice' => 'Fərqli Qaimə (custom_invoice.php)',
'invoice_type_custom_tax_invoice' => 'Fərqli Vergi Qaiməsi (custom_tax_invoice.php)',
'invoice_type_invoice' => 'Qaimə (invoice.php)',
'invoice_type_tax_invoice' => 'Vergi Qaiməsi (tax_invoice.php)',
'invoice_unsent' => 'Qaimə göndərilə bilmədi',
'invoice_update' => 'Yeniden say',
'item_insufficient_of_stock' => 'Anbarda kifayət qədər mal yoxdur.',
'item_name' => 'Malın adı',
'item_number' => 'Mal #',
'item_out_of_stock' => 'Mal satılıb.',
'key_browser' => 'Faydalı Qısayollar',
'key_cancel' => 'Cari Kotirovka/Fatura/Satışı ləğv edir',
'key_customer_search' => 'Müştəri Axtarışı',
'key_finish_quote' => 'Ödəniş etmədən Kotirovka/Faturanı tamamlayın',
'key_finish_sale' => 'Ödəniş əlavə edib, faktura/satışı tamamlayın',
'key_full' => 'Tam Ekran rejimində açın',
'key_function' => 'Function',
'key_help' => 'Qısa yollar',
'key_help_modal' => 'Qısa yollar pəncərəsini açın',
'key_in' => 'Yaxınlaşdır',
'key_item_search' => 'Element Axtarışı',
'key_out' => 'Uzaqlaşdır',
'key_payment' => 'Ödəniş əlavə et',
'key_print' => 'Cari səhifəni çap et',
'key_restore' => 'Orjinal ekran ölçüsünə qayıt',
'key_search' => 'Axtarışın hesabat cədvəlləri',
'key_suspend' => 'Cari satışı dayandırın',
'key_suspended' => 'Dayandırılmış Satışları göstər',
'key_system' => 'Sistem Qısayolları',
'key_tendered' => 'Təklif olunan məbləği dəyişdirin',
'key_title' => 'Satış üçün klaviatura qısa yolları',
'mc' => '',
'mode' => 'Qeydiyyat Rejimi',
'must_enter_numeric' => 'Ödəniş məbləği rəqəm ilə olmalıdır.',
'must_enter_numeric_giftcard' => 'Hədiyyə Kartın nömrəsi rəqəmlə olmalıdır.',
'must_enter_reference_code' => 'İstinad/Axtarış nömrəsi daxil edilməlidir.',
'negative_discount_invalid' => '',
'negative_price_invalid' => '',
'negative_quantity_invalid' => '',
'negative_total_invalid' => '',
'new_customer' => 'Yeni Müştəri',
'new_item' => 'Yeni Mal',
'no_description' => 'Heç Biri',
'no_filter' => 'Hamısı',
'no_items_in_cart' => 'Səbətdə heç bir mal yoxdur.',
'no_sales_to_display' => 'Satış yoxdur.',
'none_selected' => 'Silmək üçün hər hansı bir Satış (lar) seçmədiniz.',
'nontaxed_ind' => ' . ',
'not_authorized' => 'Bu hərəkət səlahiyyətli deyil.',
'one_or_multiple' => 'Satış (lar)',
'payment' => 'Ödəniş Növü',
'payment_amount' => 'Məbləğ',
'payment_not_cover_total' => 'Ödəmə məbləği Toplamdan çox və ya bərabər olmalıdır.',
'payment_type' => 'Növ',
'payments' => '',
'payments_total' => 'Cəmi Ödənilənlər',
'price' => 'Qiymət',
'print_after_sale' => 'Satışdan sonra Çap edin',
'quantity' => 'Miqdarı',
'quantity_less_than_reorder_level' => 'Diqqət: İstədiyinizin Miqdarı bu Öhdəlik üçün Yenidən Səviyyə səviyyəsindən aşağıdadır.',
'quantity_less_than_zero' => 'Xəbərdarlıq: İstədiyiniz miqdar kifayət deyil. Siz hələ də satışı edə bilərsiniz, lakin malın sayını yoxlayın.',
'quantity_of_items' => '{0} Məhsulların miqdarı',
'quote' => 'Qiymət ver',
'quote_number' => 'Sitat Nömrəsi',
'quote_number_duplicate' => 'Sitatın nömrəsi unikal olmalıdır.',
'quote_sent' => 'Sitat göndərildi',
'quote_unsent' => 'Sitat göndırilə bilmədi',
'receipt' => 'malın çeki',
'receipt_no_email' => 'Bu müştərinin etibarlı bir e-poçt ünvanı yoxdur.',
'receipt_number' => 'Satış №',
'receipt_sent' => 'Çek Göndərildi',
'receipt_unsent' => 'Çek göndərilə Bilmədi',
'reference_code' => 'Ödəniş İstinad Kodu',
'reference_code_invalid_characters' => 'İstinad kodu yalnız hərf və rəqəmlərdən ibarət olmalıdır.',
'reference_code_length_error' => 'İstinad kodunun uzunluğu etibarsızdır.',
'refund' => 'Qaytarılma növü',
'register' => 'jurnal satışı',
'remove_customer' => 'müştəriləri silmək',
'remove_discount' => '',
'return' => 'qaytarmaq',
'rewards' => 'Mükafat Balları',
'rewards_balance' => 'Mükafat Balları Balansı',
'rewards_package' => 'Mükafatlar',
'rewards_remaining_balance' => 'Mükafatın yerdə qalan bal dəyəri ',
'sale' => 'satış',
'sale_by_invoice' => 'Faktura ilə Satış',
'sale_for_customer' => 'Müştəri:',
'sale_time' => 'Vaxt',
'sales_tax' => 'Satış Vergisi',
'sales_total' => '',
'select_customer' => 'Müştəri seçmək',
'send_invoice' => 'Faktura Göndər',
'send_quote' => 'Sitat Göndər',
'send_receipt' => 'Çek Göndər',
'send_work_order' => 'İş Sifarişini Göndərin',
'serial' => 'seriya nömrəsi',
'service_charge' => '',
'show_due' => '',
'show_invoice' => 'Fakturanı Göstər',
'show_receipt' => 'Çek Göstər',
'start_typing_customer_name' => 'müştəri adını çap etməyə başlayın...',
'start_typing_item_name' => 'Malın adın başlayın çap etməyə yada skan edin şifrəni...',
'stock' => 'Anbar',
'stock_location' => 'Ehtiyyatın Yeri',
'sub_total' => 'yekun',
'successfully_deleted' => 'satış',
'successfully_restored' => 'Siz uğurla bərpa etdimiz',
'successfully_suspended_sale' => 'Sizin satışınız uğurla dayandırıldı.',
'successfully_updated' => 'Satış uğurla yeniləndi.',
'suspend_sale' => 'Dayandırmaq',
'suspended_doc_id' => 'Sənəd',
'suspended_sale_id' => 'Satış dayandırıldı İD',
'suspended_sales' => 'satış dayandırıldı',
'table' => 'Masa',
'takings' => 'Gündəlik Satışlar',
'tax' => 'vergi',
'tax_id' => 'Vergi İD',
'tax_invoice' => 'Vergi Qaimə',
'tax_percent' => 'vergi %',
'taxed_ind' => 'T',
'total' => 'cəm',
'total_tax_exclusive' => 'Vergi Xaric',
'transaction_failed' => 'Satış əməliyyatı uğursuz oldu.',
'unable_to_add_item' => 'Satışa əlavə edilən məhsul uğursuz oldu',
'unsuccessfully_deleted' => 'Satış (lar) silmək uğursuz oldu.',
'unsuccessfully_restored' => 'Satış (lar) bərpa olunmadı.',
'unsuccessfully_suspended_sale' => 'Satış dayandırıla bilmədi.',
'unsuccessfully_updated' => 'Satış yeniləməsi uğursuz oldu.',
'unsuspend' => 'blok etmək',
'unsuspend_and_delete' => 'blok etmək və silmək',
'update' => 'Yenilə',
'upi' => 'UPI',
'visa' => '',
'wholesale' => '',
'work_order' => 'İş Sifarişi',
'work_order_number' => 'Sifariş nömrəsi',
'work_order_number_duplicate' => 'İş sifarişinin nömrəsi unikal olmalıdır.',
'work_order_sent' => 'İş sifarişi göndərildi',
'work_order_unsent' => 'İş Sifarişi göndərilməmişdi',
];