Files
opensourcepos/app/Language/el/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
18 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' => 'Λογαριασμός #',
'add_payment' => 'Προσθήκη Πληρωμής',
'amount_due' => 'Ποσό επιστροφής',
'amount_tendered' => 'Ποσό Είσπραξης',
'authorized_signature' => 'Εγκεκριμένη Υπογραφή',
'cancel_sale' => 'Ακύρωση',
'cash' => 'Μετρητά',
'cash_1' => '',
'cash_2' => '',
'cash_3' => '',
'cash_4' => '',
'cash_adjustment' => '',
'cash_deposit' => 'Προκαταβολή Μετρητών',
'cash_filter' => 'Μετρητά',
'change_due' => 'Ποσό Επιστροφής',
'change_price' => '',
'check' => 'Επιταγή',
'check_balance' => 'Υπόλοιπο Επιταγής',
'check_filter' => 'Επιταγή',
'close' => '',
'comment' => 'Σχόλιο',
'comments' => 'Σχόλια',
'company_name' => '',
'complete' => '',
'complete_sale' => 'Ολοκλήρωση',
'confirm_cancel_sale' => 'Είστε σίγουροι πως θέλετε να ακυρώσετε την συναλλαγή? Όλα τα είδη θα χαθούν.',
'confirm_delete' => 'Είστε σίγουροι πως θέλετε να διαγράψετε την/τις επιλεγμένες Πωλήσεις?',
'confirm_restore' => 'Είστε σίγουροι πως θέλετε να επαναφέρετε την/τις επιλεγμένες Πωλήσεις?',
'credit' => 'Πιστωτική Κάρτα',
'credit_deposit' => 'Ποσό Πίστωσης',
'credit_filter' => '',
'current_table' => '',
'customer' => 'Όνομα',
'customer_address' => 'Διεύθυνση',
'customer_discount' => 'Έκπτωση',
'customer_email' => 'Διεύθυνση ηλεκτρονικού ταχυδρομείου',
'customer_location' => 'Τοποθεσία',
'customer_mailchimp_status' => 'Κατάσταση Mailchimp',
'customer_optional' => '(Απαραίτητο για πληρωμές επί Πιστώσει)',
'customer_required' => '(Απαραίτητο)',
'customer_total' => 'Σύνολο',
'customer_total_spent' => '',
'customers_available_points' => 'Διαθέσιμοι Πόντοι',
'daily_sales' => '',
'date' => 'Ημερομηνία Πώλησης',
'date_range' => 'Εύρος Ημερομηνιών',
'date_required' => 'Πρέπει να εισάγετε μια σωστή ημερομηνία.',
'date_type' => 'Ημερομηνία είναι απαραίτητο πεδίο.',
'debit' => 'Χρεωστική Κάρτα',
'debit_filter' => '',
'delete' => 'Επιτρέπεται Διαγραφή',
'delete_confirmation' => 'Είστε σίγουροι πως θέλετε να διαγράψετε την πώληση? Η διαγραφή δε αναιρείται.',
'delete_entire_sale' => 'Διαγραφή Ολόκληρης Πώλησης',
'delete_successful' => 'Διαγραφή Πώλησης επιτυχής.',
'delete_unsuccessful' => 'Αποτυχία διαγραφής Πώλησης.',
'description_abbrv' => 'Περιγρ.',
'discard' => 'Απόρριψη',
'discard_quote' => '',
'discount' => 'Έκπτ.',
'discount_exceeds_item_total' => '',
'discount_included' => '% Έκπτωσης',
'discount_percent_exceeds_100' => '',
'discount_short' => '%',
'due' => 'Πρέπει να πληρωθεί',
'due_filter' => 'Πρέπει να πληρωθεί',
'edit' => 'Επεξεργασία',
'edit_item' => 'Επεξεργασία είδους',
'edit_sale' => 'Επεξεργασία Πώλησης',
'email_receipt' => 'Απόδειξη Ηλεκτρονικού Ταχυδρομείου',
'employee' => 'Υπάλληλος',
'entry' => 'Εγγραφή',
'error_editing_item' => 'Σφάλμα επεξεργασίας είδους',
'find_or_scan_item' => 'Εύρεση ή Σκανάρισμα Είδους',
'find_or_scan_item_or_receipt' => 'Εύρεση ή Σκανάρισμα είδους ή Απόδειξης',
'giftcard' => 'Δωροκάρτα',
'giftcard_balance' => 'Υπόλοιπο Δωροκάρτας',
'giftcard_filter' => '',
'giftcard_number' => 'Αριθμός Δωροκάρτας',
'group_by_category' => 'Ομαδοποίηση ανά Κατηγορία',
'group_by_type' => 'Ομαδοποίηση ανά Είδος',
'hsn' => 'HSN',
'id' => 'ID Πώλησης',
'include_prices' => 'Συμπερίληψη Τιμών?',
'invoice' => 'Τιμολόγιο',
'invoice_confirm' => 'Το τιμολόγιο θα αποσταλεί σε',
'invoice_enable' => 'Δημιουργία Τιμολογίου',
'invoice_filter' => 'Τιμολόγια',
'invoice_no_email' => 'Ο Πελάτης δεν έχει έγκυρο λογαριασμό ταχυδρομείου.',
'invoice_number' => 'Τιμολόγιο #',
'invoice_number_duplicate' => 'Ο Αριθμός Τιμολογίου πρέπει να είναι μοναδικός.',
'invoice_sent' => 'Το Τιμολόγιο απεστάλη σε',
'invoice_total' => 'Σύνολο Τιμολογίου',
'invoice_type_custom_invoice' => 'Προσαρμοσμένο Τιμολόγιο (custom_invoice.php)',
'invoice_type_custom_tax_invoice' => 'Προσαρμοσμένο Φορολογικό Τιμολόγιο (custom_tax_invoice.php)',
'invoice_type_invoice' => 'Τιμολόγιο (invoice.php)',
'invoice_type_tax_invoice' => 'Φορολογικό Τιμολόγιο (tax_invoice.php)',
'invoice_unsent' => 'Ανεπιτυχής αποστολή Τιμολογίου σε',
'invoice_update' => 'Επαναμέτρηση',
'item_insufficient_of_stock' => 'Το είδος έχει ανεπαρκή απόθεμα.',
'item_name' => 'Όνομα Είδους',
'item_number' => '# Είδους',
'item_out_of_stock' => 'Το είδος δεν υπάρχει σε απόθεμα.',
'key_browser' => '',
'key_cancel' => 'Cancels Current Quote/Invoice/Sale',
'key_customer_search' => 'Customer Search',
'key_finish_quote' => 'Finish Quote/Invoice witdout payment',
'key_finish_sale' => 'Add Payment and Complete Invoice/Sale',
'key_full' => '',
'key_function' => 'Function',
'key_help' => 'Shortcuts',
'key_help_modal' => 'Open Shortcuts Window',
'key_in' => '',
'key_item_search' => 'Item Search',
'key_out' => '',
'key_payment' => 'Add Payment',
'key_print' => '',
'key_restore' => '',
'key_search' => '',
'key_suspend' => 'Suspend Current Sale',
'key_suspended' => 'Show Suspended Sales',
'key_system' => '',
'key_tendered' => 'Edit Amount Tendered',
'key_title' => 'Sales Keyboard Shortcuts',
'mc' => '',
'mode' => 'Λειτουργία Ταμείου',
'must_enter_numeric' => 'Το Ποσό Είσπραξης πρέπει να είναι Αριθμός.',
'must_enter_numeric_giftcard' => 'Ο Αριθμός της Δωροκάρτας πρέπει να είναι αριθμός.',
'must_enter_reference_code' => 'Πρέπει να εισαχθεί αριθμός αναφοράς/ανάκτησης.',
'negative_discount_invalid' => '',
'negative_price_invalid' => '',
'negative_quantity_invalid' => '',
'negative_total_invalid' => '',
'new_customer' => 'Νέος Πελάτης',
'new_item' => 'Νέο Είδος',
'no_description' => 'Δεν έχει περιγραφή',
'no_filter' => 'Όλα',
'no_items_in_cart' => 'Δεν υπάρχουν είδη στο καλάθι.',
'no_sales_to_display' => 'Δεν υπάρχουν Πωλήσεις προς προβολή.',
'none_selected' => 'Δεν έχετε επιλέξει Πώληση/σεις για διαγραφή.',
'nontaxed_ind' => '',
'not_authorized' => 'Αυτή η ενέργεια δεν είναι εξουσιοδοτημένη.',
'one_or_multiple' => 'Πώληση/εις',
'payment' => 'Τύπος Πληρωμής',
'payment_amount' => 'Ποσό',
'payment_not_cover_total' => 'Το Ποσό πρέπει να είναι μεγαλύτερο ή ίσο του Συνόλου.',
'payment_type' => 'Τύπος',
'payments' => '',
'payments_total' => 'Συνολικό Ποσό',
'price' => 'Τιμή',
'print_after_sale' => 'Εκτύπωση μετά την Πώληση',
'quantity' => 'Ποσότητα',
'quantity_less_than_reorder_level' => 'Προσοχή: Επιθυμητή Ποσότητα είναι λιγότερη από την τιμή Επαναπαραγγελίας για το είδος.',
'quantity_less_than_zero' => 'Προσοχή: Επιθυμητή Ποσότητα είναι ανεπαρκής. Μπορείτε να επεξεργαστείτε την πώληση, αλλά ελέγξτε το απόθεμα.',
'quantity_of_items' => 'Ποσότητα των {0} Ειδών',
'quote' => 'Παράθεση',
'quote_number' => 'Αριθμός Παράθεσης',
'quote_number_duplicate' => 'Ο Αριθμός Παράθεσης πρέπει να είναι μοναδικός.',
'quote_sent' => 'Η Παράθεση απεστάλη σε',
'quote_unsent' => 'Αποτυχία αποστολής Παράθεσης σε',
'receipt' => 'Απόδειξη Πώλησης',
'receipt_no_email' => 'Ο πελάτης δεν έχει έγκυρη διεύθυνση ηλεκτρονικού ταχυδρομείου.',
'receipt_number' => 'Πώληση #',
'receipt_sent' => 'Η Απόδειξη εστάλη σε',
'receipt_unsent' => 'Αποτυχία αποστολής Απόδειξης σε',
'reference_code' => 'Κωδικός αναφοράς πληρωμής',
'reference_code_invalid_characters' => 'Ο κωδικός αναφοράς πρέπει να περιέχει μόνο γράμματα και αριθμούς.',
'reference_code_length_error' => 'Το μήκος του κωδικού αναφοράς δεν είναι έγκυρο.',
'refund' => '',
'register' => 'Μητρώο Πωλήσεων',
'remove_customer' => 'Αφαίρεση Πελάτη',
'remove_discount' => '',
'return' => 'Επιστροφή',
'rewards' => 'Πόντοι Ανταμοιβής',
'rewards_balance' => 'Υπόλοιπο Πόντων Ανταμοιβής',
'rewards_package' => 'Ανταμοιβές',
'rewards_remaining_balance' => 'Η αξία των υπολειπόμενων πόντων ανταμοιβής είναι ',
'sale' => 'Πώληση',
'sale_by_invoice' => 'Πώληση ανά Τιμολόγιο',
'sale_for_customer' => 'Πελάτης:',
'sale_time' => 'Ώρα',
'sales_tax' => 'Φόρος Πώλησης',
'sales_total' => '',
'select_customer' => 'Επιλογή Πελάτη',
'send_invoice' => 'Αποστολή Τιμολογίου',
'send_quote' => 'Αποστολή Παράθεσης',
'send_receipt' => 'Αποστολή Απόδειξης',
'send_work_order' => 'Αποστολή Εντολής Εργασίας',
'serial' => 'Σειριακός',
'service_charge' => '',
'show_due' => '',
'show_invoice' => 'Εμφάνιση Τιμολογίου',
'show_receipt' => 'Εμφάνιση Απόδειξης',
'start_typing_customer_name' => 'Πληκτρολογήστε τις λεπτομέρειες πελάτη...',
'start_typing_item_name' => 'Πληκτρολογήστε το είδος ή σκανάρετε το Barcode...',
'stock' => 'Απόθεμα',
'stock_location' => 'Τοποθεσία Αποθέματος',
'sub_total' => 'Υποσύνολο',
'successfully_deleted' => 'Έχετε διαγράψει επιτυχώς',
'successfully_restored' => 'Έχετε επαναφέρει επιτυχώς',
'successfully_suspended_sale' => 'Αναμονή Πώλησης επιτυχής.',
'successfully_updated' => 'Ενημέρωση Πώλησης επιτυχής.',
'suspend_sale' => 'Αναμονή',
'suspended_doc_id' => 'Έγγραφο',
'suspended_sale_id' => 'ID',
'suspended_sales' => 'Ανεστάλη',
'table' => 'Πίνακας',
'takings' => 'Ημερήσιες Πωλήσεις',
'tax' => 'Φόρος',
'tax_id' => 'Id Φόρου',
'tax_invoice' => 'Φόρος τιμολογίου',
'tax_percent' => '% Φόρου',
'taxed_ind' => '',
'total' => 'Σύνολο',
'total_tax_exclusive' => 'Εξαιρουμένου Φόρου',
'transaction_failed' => 'Συναλλαγή Πώλησης απέτυχε.',
'unable_to_add_item' => 'Προσθήκη είδους στην Πώληση απέτυχε',
'unsuccessfully_deleted' => 'Διαγραφή Πώλησης/εων απέτυχε.',
'unsuccessfully_restored' => 'Επαναφορά Πώλησης/εων απέτυχε.',
'unsuccessfully_suspended_sale' => 'Αναμονή Πώλησης απέτυχε.',
'unsuccessfully_updated' => 'Ενημέρωση πώλησης απέτυχε.',
'unsuspend' => 'Επαναφορά από Αναμονή',
'unsuspend_and_delete' => 'Ενέργεια',
'update' => 'Ενημέρωση',
'upi' => 'UPI',
'visa' => '',
'wholesale' => '',
'work_order' => 'Παραγγελία Εργασίας',
'work_order_number' => 'Αριθμός Παραγγελίας Εργασίας',
'work_order_number_duplicate' => 'Ο Αριθμός της Παραγγελίας Εργασίας πρέπει να είναι μοναδικός.',
'work_order_sent' => 'Εντολή Εργασίας απεστάλη σε',
'work_order_unsent' => 'Ανεπιτυχής αποστολή Εντολής Εργασίας',
];