diff --git a/VERSION.txt b/VERSION.txt index 7a2658070e..b96e850061 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.8.51 \ No newline at end of file +5.8.52 \ No newline at end of file diff --git a/app/Console/Commands/CheckData.php b/app/Console/Commands/CheckData.php index 6ddd7abb53..17a450aeb6 100644 --- a/app/Console/Commands/CheckData.php +++ b/app/Console/Commands/CheckData.php @@ -479,7 +479,7 @@ class CheckData extends Command $this->logMessage("No contact present, so cannot add invitation for {$entity_key} - {$entity->id}"); try{ - $entity->service()->createInvitations()->save(); + $entity->service()->createInvitations()->save(); } catch(\Exception $e){ diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index a35cd1e63c..39662af39b 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -503,7 +503,13 @@ class CompanySettings extends BaseSettings public $enable_rappen_rounding = false; + public bool $task_round_up = true; + + public int $task_round_to_nearest = 1; + public static $casts = [ + 'task_round_up' => 'bool', + 'task_round_to_nearest' => 'int', 'e_quote_type' => 'string', 'enable_rappen_rounding' => 'bool', 'use_unapplied_payment' => 'string', diff --git a/app/DataProviders/EDocRules.php b/app/DataProviders/EDocRules.php deleted file mode 100644 index 6fdcc65c20..0000000000 --- a/app/DataProviders/EDocRules.php +++ /dev/null @@ -1,290 +0,0 @@ - "", - // "label" => "", - // "type" => "dropdown/date/string/text", - // "resource" => "resource.json", - // "required" => true, - // ] - public function rules() - { - - return [ - 'FatturaPA' => $this->FatturaPADefaults(), - ]; - - } - - - private function FatturaPADefaults() - { - return [ - [ - "key" => "RegimeFiscale", - "label" => "Regime Fiscale", - "type" => "dropdown", - "resource" => "RegimeFiscale.json", - "required" => true, - ], - [ - "key" => "TipoDocumento", - "label" => "Tipo Documento", - "type" => "dropdown", - "resource" => "TipoDocumento.json", - "required" => true, - ], - [ - "key" => "ModalitaPagamento", - "label" => "Modalita Pagamento", - "type" => "dropdown", - "resource" => "ModalitaPagamento.json", - "required" => true, - ], - [ - "key" => "CondizioniPagamento", - "label" => "Condizioni Pagamento", - "type" => "dropdown", - "resource" => "CondizioniPagamento.json", - "required" => true, - ], - [ - "key" => "DatiRicezione", - "label" => "Dati Ricezione", - "type" => "dropdown", - "resource" => "CondizioniPagamento", - "required" => false, - "children" => [], - ], - [ - "key" => "DatiContratto", - "label" => "Dati Contratto", - "type" => "object", - "resource" => "DatiContratto", - "required" => false, - "children" => [ - [ - "key"=> "RiferimentoNumeroLinea", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], - [ - "key"=> "IdDocumento", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], - [ - "key"=> "Data", - "validation" => [ - "string","date","required", - "type" => "date", - "resource" => "", - "required" => true, - ], - ], - [ - "key"=> "NumItem", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], - [ - "key"=> "CodiceCommessaConvenzione", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], - [ - "key"=> "CodiceCUP", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], -[ - "key"=> "CodiceCIG", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], - ], - ], - [ - "key" => "DatiOrdineAcquisto", - "label" => "Dati Ordine Acquisto", - "type" => "object", - "resource" => "DatiOrdineAcquisto", - "required" => false, - "children" => [ - [ - "key"=> "RiferimentoNumeroLinea", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], - [ - "key"=> "IdDocumento", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], - [ - "key"=> "Data", - "validation" => [ - "string","date","required", - "type" => "date", - "resource" => "", - "required" => true, - ], - ], - [ - "key"=> "NumItem", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], - [ - "key"=> "CodiceCommessaConvenzione", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], - [ - "key"=> "CodiceCUP", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], -[ - "key"=> "CodiceCIG", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], - ], - ], - [ - "key" => "DatiAnagraficiVettore", - "label" => "Dati Anagrafici Vettore", - "type" => "object", - "resource" => "DatiAnagraficiVettore", - "required" => false, - "children" => [ - [ - "key"=> "RiferimentoNumeroLinea", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], - [ - "key"=> "IdDocumento", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], - [ - "key"=> "Data", - "validation" => [ - "string","date","required", - "type" => "date", - "resource" => "", - "required" => true, - ], - ], - [ - "key"=> "NumItem", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], - [ - "key"=> "CodiceCommessaConvenzione", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], - [ - "key"=> "CodiceCUP", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], -[ - "key"=> "CodiceCIG", - "validation" => [ - "string","min:1","max:10","required", - "type" => "string", - "resource" => "", - "required" => true, - ], - ], - ], - ], - ]; - } -} \ No newline at end of file diff --git a/app/Exceptions/Handler.php b/app/Exceptions/Handler.php index 6e5e242a45..6587ef6d02 100644 --- a/app/Exceptions/Handler.php +++ b/app/Exceptions/Handler.php @@ -67,7 +67,6 @@ class Handler extends ExceptionHandler ]; protected $hostedDontReport = [ - PDOException::class, MaxAttemptsExceededException::class, CommandNotFoundException::class, ValidationException::class, diff --git a/app/Export/CSV/ActivityExport.php b/app/Export/CSV/ActivityExport.php index 8de1176153..81c531cb46 100644 --- a/app/Export/CSV/ActivityExport.php +++ b/app/Export/CSV/ActivityExport.php @@ -122,6 +122,7 @@ class ActivityExport extends BaseExport //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); //insert the header $this->csv->insertOne($this->buildHeader()); diff --git a/app/Export/CSV/BaseExport.php b/app/Export/CSV/BaseExport.php index 15fec0b116..84c003d7c0 100644 --- a/app/Export/CSV/BaseExport.php +++ b/app/Export/CSV/BaseExport.php @@ -879,10 +879,7 @@ class BaseExport $transformed_clients = $this->transformKeys($clients); - nlog($transformed_clients); - if(count($transformed_clients) > 0) { - nlog("yus"); $query->whereIn('client_id', $transformed_clients); } diff --git a/app/Export/CSV/ClientExport.php b/app/Export/CSV/ClientExport.php index 5a5b439129..736b2285c0 100644 --- a/app/Export/CSV/ClientExport.php +++ b/app/Export/CSV/ClientExport.php @@ -144,6 +144,7 @@ class ClientExport extends BaseExport //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); //insert the header $this->csv->insertOne($this->buildHeader()); diff --git a/app/Export/CSV/ContactExport.php b/app/Export/CSV/ContactExport.php index 45a239beee..b7e2c0e52d 100644 --- a/app/Export/CSV/ContactExport.php +++ b/app/Export/CSV/ContactExport.php @@ -58,7 +58,10 @@ class ContactExport extends BaseExport } $query = ClientContact::query() - ->where('company_id', $this->company->id); + ->where('company_id', $this->company->id) + ->whereHas('client', function ($q){ + $q->where('is_deleted', false); + }); $query = $this->addDateRange($query); @@ -73,6 +76,7 @@ class ContactExport extends BaseExport //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); //insert the header $this->csv->insertOne($this->buildHeader()); diff --git a/app/Export/CSV/CreditExport.php b/app/Export/CSV/CreditExport.php index 43a8b1ecb3..a549f274ef 100644 --- a/app/Export/CSV/CreditExport.php +++ b/app/Export/CSV/CreditExport.php @@ -102,6 +102,9 @@ class CreditExport extends BaseExport $query = Credit::query() ->withTrashed() ->with('client') + ->whereHas('client', function ($q){ + $q->where('is_deleted', false); + }) ->where('company_id', $this->company->id) ->where('is_deleted', $this->input['include_deleted'] ?? false); @@ -129,6 +132,7 @@ class CreditExport extends BaseExport $query = $this->init(); //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); //insert the header $this->csv->insertOne($this->buildHeader()); diff --git a/app/Export/CSV/DocumentExport.php b/app/Export/CSV/DocumentExport.php index 72929ffbaa..52757287cb 100644 --- a/app/Export/CSV/DocumentExport.php +++ b/app/Export/CSV/DocumentExport.php @@ -92,6 +92,7 @@ class DocumentExport extends BaseExport //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); //insert the header $this->csv->insertOne($this->buildHeader()); diff --git a/app/Export/CSV/ExpenseExport.php b/app/Export/CSV/ExpenseExport.php index 07ba62c88a..fe1db16d1b 100644 --- a/app/Export/CSV/ExpenseExport.php +++ b/app/Export/CSV/ExpenseExport.php @@ -121,6 +121,7 @@ class ExpenseExport extends BaseExport //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); //insert the header $this->csv->insertOne($this->buildHeader()); diff --git a/app/Export/CSV/InvoiceExport.php b/app/Export/CSV/InvoiceExport.php index 0ea3e916ae..5d9fd44422 100644 --- a/app/Export/CSV/InvoiceExport.php +++ b/app/Export/CSV/InvoiceExport.php @@ -57,6 +57,9 @@ class InvoiceExport extends BaseExport $query = Invoice::query() ->withTrashed() ->with('client') + ->whereHas('client', function ($q){ + $q->where('is_deleted', false); + }) ->where('company_id', $this->company->id) ->where('is_deleted', $this->input['include_deleted'] ?? false); @@ -105,6 +108,7 @@ class InvoiceExport extends BaseExport //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); //insert the header $this->csv->insertOne($this->buildHeader()); @@ -141,18 +145,6 @@ class InvoiceExport extends BaseExport private function decorateAdvancedFields(Invoice $invoice, array $entity): array { - // if (in_array('invoice.country_id', $this->input['report_keys'])) { - // $entity['invoice.country_id'] = $invoice->client->country ? ctrans("texts.country_{$invoice->client->country->name}") : ''; - // } - - // if (in_array('invoice.currency_id', $this->input['report_keys'])) { - // $entity['invoice.currency_id'] = $invoice->client->currency() ? $invoice->client->currency()->code : $invoice->company->currency()->code; - // } - - // if (in_array('invoice.client_id', $this->input['report_keys'])) { - // $entity['invoice.client_id'] = $invoice->client->present()->name(); - // } - // if (in_array('invoice.status', $this->input['report_keys'])) { // $entity['invoice.status'] = $invoice->stringStatus($invoice->status_id); // } diff --git a/app/Export/CSV/InvoiceItemExport.php b/app/Export/CSV/InvoiceItemExport.php index fda1737e1a..fcc0470400 100644 --- a/app/Export/CSV/InvoiceItemExport.php +++ b/app/Export/CSV/InvoiceItemExport.php @@ -70,6 +70,9 @@ class InvoiceItemExport extends BaseExport $query = Invoice::query() ->withTrashed() ->with('client') + ->whereHas('client', function ($q){ + $q->where('is_deleted', false); + }) ->where('company_id', $this->company->id) ->where('is_deleted', $this->input['include_deleted'] ?? false); @@ -128,6 +131,7 @@ class InvoiceItemExport extends BaseExport //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); //insert the header $this->csv->insertOne($this->buildHeader()); diff --git a/app/Export/CSV/PaymentExport.php b/app/Export/CSV/PaymentExport.php index 8c1242aa54..18c25feb02 100644 --- a/app/Export/CSV/PaymentExport.php +++ b/app/Export/CSV/PaymentExport.php @@ -56,6 +56,9 @@ class PaymentExport extends BaseExport $query = Payment::query() ->withTrashed() + ->whereHas('client', function ($q){ + $q->where('is_deleted', false); + }) ->where('company_id', $this->company->id) ->where('is_deleted', 0); @@ -102,6 +105,7 @@ class PaymentExport extends BaseExport $query = $this->init(); //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); //insert the header $this->csv->insertOne($this->buildHeader()); diff --git a/app/Export/CSV/ProductExport.php b/app/Export/CSV/ProductExport.php index bcbe6290ff..b1ef871c25 100644 --- a/app/Export/CSV/ProductExport.php +++ b/app/Export/CSV/ProductExport.php @@ -93,6 +93,7 @@ class ProductExport extends BaseExport //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); //insert the header $this->csv->insertOne($this->buildHeader()); diff --git a/app/Export/CSV/ProductSalesExport.php b/app/Export/CSV/ProductSalesExport.php index 5b36547505..9a0fed92a0 100644 --- a/app/Export/CSV/ProductSalesExport.php +++ b/app/Export/CSV/ProductSalesExport.php @@ -112,6 +112,7 @@ class ProductSalesExport extends BaseExport //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); if (count($this->input['report_keys']) == 0) { $this->input['report_keys'] = array_values($this->entity_keys); @@ -120,6 +121,9 @@ class ProductSalesExport extends BaseExport //insert the header $query = Invoice::query() ->withTrashed() + ->whereHas('client', function ($q){ + $q->where('is_deleted', false); + }) ->where('company_id', $this->company->id) ->where('is_deleted', 0) ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL, Invoice::STATUS_PAID]); diff --git a/app/Export/CSV/PurchaseOrderExport.php b/app/Export/CSV/PurchaseOrderExport.php index 8d676879c9..ff092f3fbd 100644 --- a/app/Export/CSV/PurchaseOrderExport.php +++ b/app/Export/CSV/PurchaseOrderExport.php @@ -58,6 +58,9 @@ class PurchaseOrderExport extends BaseExport $query = PurchaseOrder::query() ->withTrashed() ->with('vendor') + ->whereHas('vendor', function ($q){ + $q->where('is_deleted', false); + }) ->where('company_id', $this->company->id) ->where('is_deleted', $this->input['include_deleted'] ?? false); @@ -105,6 +108,7 @@ class PurchaseOrderExport extends BaseExport //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); //insert the header $this->csv->insertOne($this->buildHeader()); diff --git a/app/Export/CSV/PurchaseOrderItemExport.php b/app/Export/CSV/PurchaseOrderItemExport.php index 8d891fc879..d7839448bc 100644 --- a/app/Export/CSV/PurchaseOrderItemExport.php +++ b/app/Export/CSV/PurchaseOrderItemExport.php @@ -62,6 +62,9 @@ class PurchaseOrderItemExport extends BaseExport $query = PurchaseOrder::query() ->withTrashed() + ->whereHas('vendor', function ($q){ + $q->where('is_deleted', false); + }) ->with('vendor')->where('company_id', $this->company->id) ->where('is_deleted', $this->input['include_deleted'] ?? false); @@ -112,6 +115,7 @@ class PurchaseOrderItemExport extends BaseExport { //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); $query = $this->init(); diff --git a/app/Export/CSV/QuoteExport.php b/app/Export/CSV/QuoteExport.php index e4eb6b0387..ceaafeffce 100644 --- a/app/Export/CSV/QuoteExport.php +++ b/app/Export/CSV/QuoteExport.php @@ -64,6 +64,9 @@ class QuoteExport extends BaseExport $query = Quote::query() ->withTrashed() ->with('client') + ->whereHas('client', function ($q){ + $q->where('is_deleted', false); + }) ->where('company_id', $this->company->id) ->where('is_deleted', $this->input['include_deleted'] ?? false); @@ -110,6 +113,7 @@ class QuoteExport extends BaseExport { //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); $query = $this->init(); diff --git a/app/Export/CSV/QuoteItemExport.php b/app/Export/CSV/QuoteItemExport.php index 34853b3432..d3c004c1c2 100644 --- a/app/Export/CSV/QuoteItemExport.php +++ b/app/Export/CSV/QuoteItemExport.php @@ -65,6 +65,9 @@ class QuoteItemExport extends BaseExport $query = Quote::query() ->withTrashed() + ->whereHas('client', function ($q){ + $q->where('is_deleted', false); + }) ->with('client')->where('company_id', $this->company->id) ->where('is_deleted', $this->input['include_deleted'] ?? false); @@ -118,6 +121,7 @@ class QuoteItemExport extends BaseExport //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); $query = $this->init(); diff --git a/app/Export/CSV/RecurringInvoiceExport.php b/app/Export/CSV/RecurringInvoiceExport.php index 35ad60c654..df80d2d2a9 100644 --- a/app/Export/CSV/RecurringInvoiceExport.php +++ b/app/Export/CSV/RecurringInvoiceExport.php @@ -56,6 +56,9 @@ class RecurringInvoiceExport extends BaseExport $query = RecurringInvoice::query() ->withTrashed() ->with('client') + ->whereHas('client', function ($q){ + $q->where('is_deleted', false); + }) ->where('company_id', $this->company->id) ->where('is_deleted', $this->input['include_deleted'] ?? false); @@ -80,6 +83,7 @@ class RecurringInvoiceExport extends BaseExport //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); //insert the header $this->csv->insertOne($this->buildHeader()); diff --git a/app/Export/CSV/TaskExport.php b/app/Export/CSV/TaskExport.php index a604eed73f..7830114f26 100644 --- a/app/Export/CSV/TaskExport.php +++ b/app/Export/CSV/TaskExport.php @@ -94,6 +94,7 @@ class TaskExport extends BaseExport //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); //insert the header $this->csv->insertOne($this->buildHeader()); diff --git a/app/Export/CSV/VendorExport.php b/app/Export/CSV/VendorExport.php index 000f806a05..5037e4d43b 100644 --- a/app/Export/CSV/VendorExport.php +++ b/app/Export/CSV/VendorExport.php @@ -54,6 +54,7 @@ class VendorExport extends BaseExport //load the CSV document from a string $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); if (count($this->input['report_keys']) == 0) { $this->input['report_keys'] = array_values($this->vendor_report_keys); diff --git a/app/Export/Decorators/ContactDecorator.php b/app/Export/Decorators/ContactDecorator.php index a8fdcbd17e..71707e9b08 100644 --- a/app/Export/Decorators/ContactDecorator.php +++ b/app/Export/Decorators/ContactDecorator.php @@ -23,8 +23,13 @@ class ContactDecorator implements DecoratorInterface $contact = $entity; } elseif($entity->contacts) { $contact = $entity->contacts()->first(); + } elseif($entity->client) { + $contact = $entity->client->primary_contact->first() ?? $entity->client->contacts()->whereNotNull('email')->first(); + } elseif($entity->vendor) { + $contact = $entity->vendor->primary_contact->first() ?? $entity->vendor->contacts()->whereNotNull('email')->first(); } + if($contact && method_exists($this, $key)) { return $this->{$key}($contact); } elseif($contact && ($contact->{$key} ?? false)) { diff --git a/app/Factory/CompanyGatewayFactory.php b/app/Factory/CompanyGatewayFactory.php index c131d534b0..ecb7b39340 100644 --- a/app/Factory/CompanyGatewayFactory.php +++ b/app/Factory/CompanyGatewayFactory.php @@ -23,7 +23,8 @@ class CompanyGatewayFactory $company_gateway->require_billing_address = false; $company_gateway->require_shipping_address = false; $company_gateway->config = encrypt(json_encode(new \stdClass())); - + $company_gateway->always_show_required_fields = true; + return $company_gateway; } } diff --git a/app/Filters/RecurringExpenseFilters.php b/app/Filters/RecurringExpenseFilters.php index 53fdf0c444..cfd8258d6a 100644 --- a/app/Filters/RecurringExpenseFilters.php +++ b/app/Filters/RecurringExpenseFilters.php @@ -146,14 +146,14 @@ class RecurringExpenseFilters extends QueryFilters return $this->builder ->orderByRaw('ISNULL(client_id), client_id '. $sort_col[1]) ->orderBy(\App\Models\Client::select('name') - ->whereColumn('clients.id', 'expenses.client_id'), $sort_col[1]); + ->whereColumn('clients.id', 'recurring_expenses.client_id'), $sort_col[1]); } if ($sort_col[0] == 'vendor_id' && in_array($sort_col[1], ['asc', 'desc'])) { return $this->builder ->orderByRaw('ISNULL(vendor_id), vendor_id '. $sort_col[1]) ->orderBy(\App\Models\Vendor::select('name') - ->whereColumn('vendors.id', 'expenses.vendor_id'), $sort_col[1]); + ->whereColumn('vendors.id', 'recurring_expenses.vendor_id'), $sort_col[1]); } @@ -161,7 +161,7 @@ class RecurringExpenseFilters extends QueryFilters return $this->builder ->orderByRaw('ISNULL(category_id), category_id '. $sort_col[1]) ->orderBy(\App\Models\ExpenseCategory::select('name') - ->whereColumn('expense_categories.id', 'expenses.category_id'), $sort_col[1]); + ->whereColumn('expense_categories.id', 'recurring_expenses.category_id'), $sort_col[1]); } if($sort_col[0] == 'number') { diff --git a/app/Filters/RecurringInvoiceFilters.php b/app/Filters/RecurringInvoiceFilters.php index 4917a12a1f..b9124c9168 100644 --- a/app/Filters/RecurringInvoiceFilters.php +++ b/app/Filters/RecurringInvoiceFilters.php @@ -133,6 +133,10 @@ class RecurringInvoiceFilters extends QueryFilters return $this->builder->orderByRaw("REGEXP_REPLACE(number,'[^0-9]+','')+0 " . $dir); } + if($sort_col[0] == 'next_send_datetime'){ + $sort_col[0] = 'next_send_date'; + } + return $this->builder->orderBy($sort_col[0], $dir); } diff --git a/app/Helpers/Epc/EpcQrGenerator.php b/app/Helpers/Epc/EpcQrGenerator.php index 520ec11ea9..07bfc9080c 100644 --- a/app/Helpers/Epc/EpcQrGenerator.php +++ b/app/Helpers/Epc/EpcQrGenerator.php @@ -59,13 +59,13 @@ class EpcQrGenerator {$qr}"; } catch(\Throwable $e) { - nlog("EPC QR failure => ".$e->getMessage()); + // nlog("EPC QR failure => ".$e->getMessage()); return ''; } catch(\Exception $e) { - nlog("EPC QR failure => ".$e->getMessage()); + // nlog("EPC QR failure => ".$e->getMessage()); return ''; } catch(InvalidArgumentException $e) { - nlog("EPC QR failure => ".$e->getMessage()); + // nlog("EPC QR failure => ".$e->getMessage()); return ''; } diff --git a/app/Helpers/Invoice/CustomValuer.php b/app/Helpers/Invoice/CustomValuer.php index 20f01f3b31..7ef81f074f 100644 --- a/app/Helpers/Invoice/CustomValuer.php +++ b/app/Helpers/Invoice/CustomValuer.php @@ -35,7 +35,7 @@ trait CustomValuer return 0; } - public function multiInclusiveTax($value, $has_custom_invoice_taxes) { + public function multiInclusiveTax($custom_value, $has_custom_invoice_taxes) { if (isset($custom_value) && is_numeric($custom_value) && $has_custom_invoice_taxes !== false) { diff --git a/app/Helpers/Invoice/InvoiceSum.php b/app/Helpers/Invoice/InvoiceSum.php index b05a7b9c8e..75a6139d92 100644 --- a/app/Helpers/Invoice/InvoiceSum.php +++ b/app/Helpers/Invoice/InvoiceSum.php @@ -245,12 +245,11 @@ class InvoiceSum */ private function setCalculatedAttributes(): self { - /* If amount != balance then some money has been paid on the invoice, need to subtract this difference from the total to set the new balance */ - - if ($this->invoice->status_id != Invoice::STATUS_DRAFT) { + if($this->invoice->status_id == Invoice::STATUS_CANCELLED){ + $this->invoice->balance = 0; + } + elseif ($this->invoice->status_id != Invoice::STATUS_DRAFT) { if ($this->invoice->amount != $this->invoice->balance) { - // $paid_to_date = $this->invoice->amount - $this->invoice->balance; - $this->invoice->balance = Number::roundValue($this->getTotal(), $this->precision) - $this->invoice->paid_to_date; //21-02-2024 cannot use the calculated $paid_to_date here as it could send the balance backward. } else { $this->invoice->balance = Number::roundValue($this->getTotal(), $this->precision); diff --git a/app/Helpers/Invoice/InvoiceSumInclusive.php b/app/Helpers/Invoice/InvoiceSumInclusive.php index de47a59147..aa2dcdcfa9 100644 --- a/app/Helpers/Invoice/InvoiceSumInclusive.php +++ b/app/Helpers/Invoice/InvoiceSumInclusive.php @@ -74,8 +74,8 @@ class InvoiceSumInclusive { $this->calculateLineItems() ->calculateDiscount() - ->calculateCustomValues() ->calculateInvoiceTaxes() + ->calculateCustomValues() ->setTaxMap() ->calculateTotals() //just don't add the taxes!! ->calculateBalance() @@ -119,7 +119,6 @@ class InvoiceSumInclusive $this->total_taxes += $this->multiInclusiveTax($this->invoice->custom_surcharge4, $this->invoice->custom_surcharge_tax4); $this->total_custom_values += $this->valuer($this->invoice->custom_surcharge4); - $this->total += $this->total_custom_values; return $this; @@ -138,21 +137,21 @@ class InvoiceSumInclusive } //Handles cases where the surcharge is not taxed - if(is_numeric($this->invoice->custom_surcharge1) && $this->invoice->custom_surcharge1 > 0 && $this->invoice->custom_surcharge_tax1) { - $amount += $this->invoice->custom_surcharge1; - } + // if(is_numeric($this->invoice->custom_surcharge1) && $this->invoice->custom_surcharge1 > 0 && !$this->invoice->custom_surcharge_tax1) { + // $amount += $this->invoice->custom_surcharge1; + // } - if(is_numeric($this->invoice->custom_surcharge2) && $this->invoice->custom_surcharge2 > 0 && $this->invoice->custom_surcharge_tax2) { - $amount += $this->invoice->custom_surcharge2; - } + // if(is_numeric($this->invoice->custom_surcharge2) && $this->invoice->custom_surcharge2 > 0 && !$this->invoice->custom_surcharge_tax2) { + // $amount += $this->invoice->custom_surcharge2; + // } - if(is_numeric($this->invoice->custom_surcharge3) && $this->invoice->custom_surcharge3 > 0 && $this->invoice->custom_surcharge_tax3) { - $amount += $this->invoice->custom_surcharge3; - } + // if(is_numeric($this->invoice->custom_surcharge3) && $this->invoice->custom_surcharge3 > 0 && !$this->invoice->custom_surcharge_tax3) { + // $amount += $this->invoice->custom_surcharge3; + // } - if(is_numeric($this->invoice->custom_surcharge4) && $this->invoice->custom_surcharge4 > 0 && $this->invoice->custom_surcharge_tax4) { - $amount += $this->invoice->custom_surcharge4; - } + // if(is_numeric($this->invoice->custom_surcharge4) && $this->invoice->custom_surcharge4 > 0 && !$this->invoice->custom_surcharge_tax4) { + // $amount += $this->invoice->custom_surcharge4; + // } if (is_string($this->invoice->tax_name1) && strlen($this->invoice->tax_name1) > 1) { $tax = $this->calcInclusiveLineTax($this->invoice->tax_rate1, $amount); @@ -172,7 +171,7 @@ class InvoiceSumInclusive $this->total_taxes += $tax; $this->total_tax_map[] = ['name' => $this->invoice->tax_name3.' '.floatval($this->invoice->tax_rate3).'%', 'total' => $tax]; } - + return $this; } @@ -280,10 +279,11 @@ class InvoiceSumInclusive private function setCalculatedAttributes() { /* If amount != balance then some money has been paid on the invoice, need to subtract this difference from the total to set the new balance */ - if ($this->invoice->status_id != Invoice::STATUS_DRAFT) { + if($this->invoice->status_id == Invoice::STATUS_CANCELLED){ + $this->invoice->balance = 0; + } + elseif ($this->invoice->status_id != Invoice::STATUS_DRAFT) { if ($this->invoice->amount != $this->invoice->balance) { - // $paid_to_date = $this->invoice->amount - $this->invoice->balance; - $this->invoice->balance = $this->formatValue($this->getTotal(), $this->precision) - $this->invoice->paid_to_date; } else { $this->invoice->balance = $this->formatValue($this->getTotal(), $this->precision); diff --git a/app/Http/Controllers/ClientController.php b/app/Http/Controllers/ClientController.php index e9e733191d..ffe011a6e3 100644 --- a/app/Http/Controllers/ClientController.php +++ b/app/Http/Controllers/ClientController.php @@ -258,6 +258,18 @@ class ClientController extends BaseController } + if($action == 'bulk_update' && $user->can('edit', $clients->first())){ + + $clients = Client::withTrashed() + ->company() + ->whereIn('id', $request->ids); + + $this->client_repo->bulkUpdate($clients, $request->column, $request->new_value); + + return $this->listResponse(Client::query()->withTrashed()->company()->whereIn('id', $request->ids)); + + } + $clients->each(function ($client) use ($action, $user) { if ($user->can('edit', $client)) { $this->client_repo->{$action}($client); diff --git a/app/Http/Controllers/SelfUpdateController.php b/app/Http/Controllers/SelfUpdateController.php index dce587cc41..4af43a2a12 100644 --- a/app/Http/Controllers/SelfUpdateController.php +++ b/app/Http/Controllers/SelfUpdateController.php @@ -64,6 +64,9 @@ class SelfUpdateController extends BaseController $file_headers = @get_headers($this->getDownloadUrl()); + if(!is_array($file_headers)) + return response()->json(['message' => 'There was a problem reaching the update server, please try again in a little while.'], 410); + if (stripos($file_headers[0], "404 Not Found") > 0 || (stripos($file_headers[0], "302 Found") > 0 && stripos($file_headers[7], "404 Not Found") > 0)) { return response()->json(['message' => 'Download not yet available. Please try again shortly.'], 410); } @@ -99,6 +102,9 @@ class SelfUpdateController extends BaseController } } + if(Storage::disk('base')->directoryExists('resources/lang')) + Storage::disk('base')->deleteDirectory('resources/lang'); + nlog('Removing cache files'); Artisan::call('clear-compiled'); diff --git a/app/Http/Requests/Client/BulkClientRequest.php b/app/Http/Requests/Client/BulkClientRequest.php index 1d61c0ddc7..31870f0e27 100644 --- a/app/Http/Requests/Client/BulkClientRequest.php +++ b/app/Http/Requests/Client/BulkClientRequest.php @@ -18,7 +18,7 @@ use Illuminate\Validation\Rule; class BulkClientRequest extends Request { use MakesHash; - + /** * Determine if the user is authorized to make this request. * @@ -35,12 +35,14 @@ class BulkClientRequest extends Request $user = auth()->user(); return [ - 'action' => 'required|string|in:archive,restore,delete,template,assign_group', + 'action' => 'required|string|in:archive,restore,delete,template,assign_group,bulk_update', 'ids' => ['required','bail','array',Rule::exists('clients', 'id')->where('company_id', $user->company()->id)], 'template' => 'sometimes|string', 'template_id' => 'sometimes|string', 'group_settings_id' => ['required_if:action,assign_group',Rule::exists('group_settings', 'id')->where('company_id', $user->company()->id)], - 'send_email' => 'sometimes|bool' + 'send_email' => 'sometimes|bool', + 'column' => ['required_if:action,bulk_update', 'string', Rule::in(\App\Models\Client::$bulk_update_columns)], + 'new_value' => ['required_if:action,bulk_update|string'], ]; } diff --git a/app/Http/Requests/Payment/StorePaymentRequest.php b/app/Http/Requests/Payment/StorePaymentRequest.php index 8e40f0b347..152a8aecff 100644 --- a/app/Http/Requests/Payment/StorePaymentRequest.php +++ b/app/Http/Requests/Payment/StorePaymentRequest.php @@ -45,12 +45,12 @@ class StorePaymentRequest extends Request $rules = [ 'client_id' => ['bail','required',Rule::exists('clients','id')->where('company_id',$user->company()->id)->where('is_deleted', 0)], - 'amount' => ['bail', 'numeric', new PaymentAmountsBalanceRule()], + 'invoices' => ['bail','sometimes', 'nullable', 'array', new ValidPayableInvoicesRule()], 'invoices.*.amount' => ['bail','required'], 'invoices.*.invoice_id' => ['bail','required','distinct', new ValidInvoicesRules($this->all()),Rule::exists('invoices','id')->where('company_id', $user->company()->id)->where('client_id', $this->client_id)], 'credits.*.credit_id' => ['bail','required','distinct', new ValidCreditsRules($this->all()),Rule::exists('credits','id')->where('company_id', $user->company()->id)->where('client_id', $this->client_id)], 'credits.*.amount' => ['bail','required', new CreditsSumRule($this->all())], - 'invoices' => ['bail','sometimes', 'nullable', 'array', new ValidPayableInvoicesRule()], + 'amount' => ['bail', 'numeric', new PaymentAmountsBalanceRule()], 'number' => ['bail', 'nullable', Rule::unique('payments')->where('company_id', $user->company()->id)], 'idempotency_key' => ['nullable', 'bail', 'string','max:64', Rule::unique('payments')->where('company_id', $user->company()->id)], ]; @@ -94,7 +94,7 @@ class StorePaymentRequest extends Request if (isset($input['invoices']) && is_array($input['invoices']) !== false) { foreach ($input['invoices'] as $key => $value) { - if (is_string($value['invoice_id'])) { + if (isset($value['invoice_id']) && is_string($value['invoice_id'])) { $input['invoices'][$key]['invoice_id'] = $this->decodePrimaryKey($value['invoice_id']); } @@ -110,7 +110,7 @@ class StorePaymentRequest extends Request if (isset($input['credits']) && is_array($input['credits']) !== false) { foreach ($input['credits'] as $key => $value) { - if (array_key_exists('credit_id', $input['credits'][$key])) { + if (isset($value['credit_id']) && is_string($value['credit_id'])) { $input['credits'][$key]['credit_id'] = $this->decodePrimaryKey($value['credit_id']); $credits_total += $value['amount']; } diff --git a/app/Http/ValidationRules/Account/BlackListRule.php b/app/Http/ValidationRules/Account/BlackListRule.php index 736d82065f..1d65de052f 100644 --- a/app/Http/ValidationRules/Account/BlackListRule.php +++ b/app/Http/ValidationRules/Account/BlackListRule.php @@ -21,6 +21,8 @@ class BlackListRule implements ValidationRule { /** Bad domains +/- dispoable email domains */ private array $blacklist = [ + 'anonaddy.me', + 'nqmo.com', 'wireconnected.com', 'secure-coinspot.com', 'casasotombo.com', diff --git a/app/Jobs/Company/CompanyImport.php b/app/Jobs/Company/CompanyImport.php index ac3dde2092..e1249a6727 100644 --- a/app/Jobs/Company/CompanyImport.php +++ b/app/Jobs/Company/CompanyImport.php @@ -229,6 +229,11 @@ class CompanyImport implements ShouldQueue 'is_template', ] ], + '5.8.51' => [ + CompanyGateway::class => [ + 'always_show_required_fields', + ] + ] ]; /** diff --git a/app/Jobs/Mail/NinjaMailerJob.php b/app/Jobs/Mail/NinjaMailerJob.php index c02a751f61..22a9069c5a 100644 --- a/app/Jobs/Mail/NinjaMailerJob.php +++ b/app/Jobs/Mail/NinjaMailerJob.php @@ -77,6 +77,8 @@ class NinjaMailerJob implements ShouldQueue /*Set the correct database*/ MultiDB::setDb($this->nmo->company->db); +nlog("nn"); + /* Serializing models from other jobs wipes the primary key */ $this->company = Company::query()->where('company_key', $this->nmo->company->company_key)->first(); @@ -87,7 +89,6 @@ class NinjaMailerJob implements ShouldQueue if (!$this->company || $this->preFlightChecksFail()) { return; } - /* Run time we set Reply To Email*/ if (strlen($this->nmo->settings->reply_to_email) > 1) { if (property_exists($this->nmo->settings, 'reply_to_name')) { @@ -362,7 +363,7 @@ class NinjaMailerJob implements ShouldQueue return $this; } - private function configureSmtpMailer(): void + private function configureSmtpMailer() { $company = $this->company; @@ -375,6 +376,16 @@ class NinjaMailerJob implements ShouldQueue $smtp_local_domain = strlen($company->smtp_local_domain) > 2 ? $company->smtp_local_domain : null; $smtp_verify_peer = $company->smtp_verify_peer ?? true; + if(strlen($smtp_host ?? '') <= 1 || + strlen($smtp_username ?? '') <= 1 || + strlen($smtp_password ?? '') <= 1 + ) + { + $this->nmo->settings->email_sending_method = 'default'; + return $this->setMailDriver(); + } + + config([ 'mail.mailers.smtp' => [ 'transport' => 'smtp', diff --git a/app/Livewire/RequiredClientInfo.php b/app/Livewire/RequiredClientInfo.php index 909c3462d3..a4327f95fa 100644 --- a/app/Livewire/RequiredClientInfo.php +++ b/app/Livewire/RequiredClientInfo.php @@ -79,7 +79,8 @@ class RequiredClientInfo extends Component public $client_custom_value2; public $client_custom_value3; public $client_custom_value4; - + private ?CompanyGateway $company_gateway; + private int $unfilled_fields = 0; /** * Mappings for updating the database. Left side is mapping from gateway, @@ -194,6 +195,7 @@ class RequiredClientInfo extends Component MultiDB::setDb($this->db); $contact = ClientContact::withTrashed()->find($this->contact_id); $company = $contact->company; + $this->company_gateway = CompanyGateway::withTrashed()->find($this->company_gateway_id); $this->client_name = $contact->client->name; $this->contact_first_name = $contact->first_name; @@ -215,8 +217,6 @@ class RequiredClientInfo extends Component $this->client_custom_value3 = $contact->client->custom_value3; $this->client_custom_value4 = $contact->client->custom_value4; - // $this->client = $this->contact->client; - if ($company->settings->show_accept_invoice_terms && request()->query('hash')) { $this->show_terms = true; $this->terms_accepted = false; @@ -230,18 +230,12 @@ class RequiredClientInfo extends Component $this->invoice_terms = $invoice->terms; } - count($this->fields) > 0 || $this->show_terms - ? $this->checkFields() - : $this->show_form = false; + if(!$this->company_gateway->always_show_required_fields) + $this->checkFields(); - if (request()->query('source') === 'subscriptions') { - $this->show_form = false; + if($this->unfilled_fields > 0 || $this->company_gateway->always_show_required_fields) + $this->show_form = true; - $this->dispatch( - 'passed-required-fields-check', - client_postal_code: $this->contact->client->postal_code - ); - } } #[Computed] @@ -327,26 +321,26 @@ class RequiredClientInfo extends Component } -$_contact->first_name = $this->contact_first_name; -$_contact->last_name = $this->contact_last_name; -$_contact->client->name = $this->client_name; -$_contact->email = $this->contact_email; -$_contact->client->phone = $this->client_phone; -$_contact->client->address1 = $this->client_address_line_1; -$_contact->client->city = $this->client_city; -$_contact->client->state = $this->client_state; -$_contact->client->country_id = $this->client_country_id; -$_contact->client->postal_code = $this->client_postal_code; -$_contact->client->shipping_address1 = $this->client_shipping_address_line_1; -$_contact->client->shipping_city = $this->client_shipping_city; -$_contact->client->shipping_state = $this->client_shipping_state; -$_contact->client->shipping_postal_code = $this->client_shipping_postal_code; -$_contact->client->shipping_country_id = $this->client_shipping_country_id; -$_contact->client->custom_value1 = $this->client_custom_value1; -$_contact->client->custom_value2 = $this->client_custom_value2; -$_contact->client->custom_value3 = $this->client_custom_value3; -$_contact->client->custom_value4 = $this->client_custom_value4; -$_contact->push(); + $_contact->first_name = $this->contact_first_name; + $_contact->last_name = $this->contact_last_name; + $_contact->client->name = $this->client_name; + $_contact->email = $this->contact_email; + $_contact->client->phone = $this->client_phone; + $_contact->client->address1 = $this->client_address_line_1; + $_contact->client->city = $this->client_city; + $_contact->client->state = $this->client_state; + $_contact->client->country_id = $this->client_country_id; + $_contact->client->postal_code = $this->client_postal_code; + $_contact->client->shipping_address1 = $this->client_shipping_address_line_1; + $_contact->client->shipping_city = $this->client_shipping_city; + $_contact->client->shipping_state = $this->client_shipping_state; + $_contact->client->shipping_postal_code = $this->client_shipping_postal_code; + $_contact->client->shipping_country_id = $this->client_shipping_country_id; + $_contact->client->custom_value1 = $this->client_custom_value1; + $_contact->client->custom_value2 = $this->client_custom_value2; + $_contact->client->custom_value3 = $this->client_custom_value3; + $_contact->client->custom_value4 = $this->client_custom_value4; + $_contact->push(); $contact_update = $_contact @@ -378,44 +372,39 @@ $_contact->push(); public function checkFields() { - $this->show_form = true; -//@todo - need to make this optional - // MultiDB::setDb($this->db); - // $_contact = ClientContact::withTrashed()->find($this->contact_id); + MultiDB::setDb($this->db); + $_contact = ClientContact::withTrashed()->find($this->contact_id); - // foreach ($this->fields as $index => $field) { - // $_field = $this->mappings[$field['name']]; + foreach ($this->fields as $index => $field) { + $_field = $this->mappings[$field['name']]; - // if (Str::startsWith($field['name'], 'client_')) { - // if (empty($_contact->client->{$_field}) - // || is_null($_contact->client->{$_field}) - // // || in_array($_field, $this->client_address_array) - // ) { - // $this->show_form = true; - // } else { - // $this->fields[$index]['filled'] = true; - // } - // } + if (Str::startsWith($field['name'], 'client_')) { + if (empty($_contact->client->{$_field}) + || is_null($_contact->client->{$_field}) + ) { + // $this->show_form = true; + $this->unfilled_fields++; + } else { + // $this->fields[$index]['filled'] = true; + } + } - // if (Str::startsWith($field['name'], 'contact_')) { - // if (empty($_contact->{$_field}) || is_null($_contact->{$_field}) || str_contains($_contact->{$_field}, '@example.com')) { - // $this->show_form = true; - // } else { - // $this->fields[$index]['filled'] = true; - // } - // } - // } + if (Str::startsWith($field['name'], 'contact_')) { + if (empty($_contact->{$_field}) || is_null($_contact->{$_field}) || str_contains($_contact->{$_field}, '@example.com')) { + $this->unfilled_fields++; + } else { + // $this->fields[$index]['filled'] = true; + } + } + } - // $left = collect($this->fields) - // ->filter(fn ($field) => !array_key_exists('filled', $field)) - // ->count(); + if ($this->unfilled_fields === 0 && !$this->company_gateway->always_show_required_fields) { + $this->dispatch( + 'passed-required-fields-check', + client_postal_code: $this->contact->client->postal_code + ); + } - // if ($left === 0) { - // $this->dispatch( - // 'passed-required-fields-check', - // client_postal_code: $this->contact->client->postal_code - // ); - // } } public function showCopyBillingCheckbox(): bool diff --git a/app/Models/Client.php b/app/Models/Client.php index 826b86ef19..c34c16bf67 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -220,12 +220,17 @@ class Client extends BaseModel implements HasLocalePreference 'routing_id', ]; - // public function scopeExclude($query) - // { - // $query->makeHidden(['balance','paid_to_date']); + public static array $bulk_update_columns = [ + 'public_notes', + 'industry_id', + 'size_id', + 'country_id', + 'custom_value1', + 'custom_value2', + 'custom_value3', + 'custom_value4', + ]; - // return $query; - // } public function getEntityType() { diff --git a/app/Models/CompanyGateway.php b/app/Models/CompanyGateway.php index 5a3fd2ebaa..530c0bb461 100644 --- a/app/Models/CompanyGateway.php +++ b/app/Models/CompanyGateway.php @@ -47,6 +47,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property bool $require_custom_value2 * @property bool $require_custom_value3 * @property bool $require_custom_value4 + * @property bool $always_show_required_fields * @property-read int|null $client_gateway_tokens_count * @property-read \App\Models\Company $company * @property-read \App\Models\Gateway $gateway @@ -77,6 +78,7 @@ class CompanyGateway extends BaseModel 'updated_at' => 'timestamp', 'created_at' => 'timestamp', 'deleted_at' => 'timestamp', + 'always_show_required_fields' => 'bool', ]; protected $with = [ @@ -107,6 +109,7 @@ class CompanyGateway extends BaseModel 'custom_value4', 'token_billing', 'label', + 'always_show_required_fields', ]; public static $credit_cards = [ diff --git a/app/Models/Gateway.php b/app/Models/Gateway.php index f862caf91f..0faadebd68 100644 --- a/app/Models/Gateway.php +++ b/app/Models/Gateway.php @@ -75,14 +75,14 @@ class Gateway extends StaticModel return $this->getMethods(); } - /** - * Test if gateway is custom. - * @return bool TRUE|FALSE - */ - public function isCustom(): bool - { - return in_array($this->id, [62, 67, 68]); //static table ids of the custom gateways - } + // /** + // * Test if gateway is custom. + // * @return bool TRUE|FALSE + // */ + // public function isCustom(): bool + // { + // return in_array($this->id, [62, 67, 68]); //static table ids of the custom gateways + // } public function getHelp() { diff --git a/app/PaymentDrivers/PayFastPaymentDriver.php b/app/PaymentDrivers/PayFastPaymentDriver.php index cfa77b4f01..07267339b7 100644 --- a/app/PaymentDrivers/PayFastPaymentDriver.php +++ b/app/PaymentDrivers/PayFastPaymentDriver.php @@ -68,18 +68,18 @@ class PayFastPaymentDriver extends BaseDriver public function init() { - try { - $this->payfast = new \Payfast\PayFastPayment( - [ - 'merchantId' => $this->company_gateway->getConfigField('merchantId'), - 'merchantKey' => $this->company_gateway->getConfigField('merchantKey'), - 'passPhrase' => $this->company_gateway->getConfigField('passphrase'), - 'testMode' => $this->company_gateway->getConfigField('testMode'), - ] - ); - } catch (\Exception $e) { - nlog('##PAYFAST## There was an exception: '.$e->getMessage()); - } + // try { + // $this->payfast = new \Payfast\PayFastPayment( + // [ + // 'merchantId' => $this->company_gateway->getConfigField('merchantId'), + // 'merchantKey' => $this->company_gateway->getConfigField('merchantKey'), + // 'passPhrase' => $this->company_gateway->getConfigField('passphrase'), + // 'testMode' => $this->company_gateway->getConfigField('testMode'), + // ] + // ); + // } catch (\Exception $e) { + // nlog('##PAYFAST## There was an exception: '.$e->getMessage()); + // } return $this; } @@ -211,7 +211,6 @@ class PayFastPaymentDriver extends BaseDriver return response()->json([], 200); - break; default: @@ -223,7 +222,6 @@ class PayFastPaymentDriver extends BaseDriver return response()->json([], 200); - break; } } diff --git a/app/PaymentDrivers/PayPalPPCPPaymentDriver.php b/app/PaymentDrivers/PayPalPPCPPaymentDriver.php index 080251af00..12758fa101 100644 --- a/app/PaymentDrivers/PayPalPPCPPaymentDriver.php +++ b/app/PaymentDrivers/PayPalPPCPPaymentDriver.php @@ -233,8 +233,8 @@ class PayPalPPCPPaymentDriver extends BaseDriver /** * Presents the Payment View to the client * - * @param mixed $data - * @return void + * @param array $data + * @return \Illuminate\Contracts\View\Factory|\Illuminate\View\View */ public function processPaymentView($data) { @@ -251,7 +251,6 @@ class PayPalPPCPPaymentDriver extends BaseDriver $data['gateway_type_id'] = $this->gateway_type_id; $data['merchantId'] = $this->company_gateway->getConfigField('merchantId'); $data['currency'] = $this->client->currency()->code; - // nlog($data['merchantId']); return render('gateways.paypal.ppcp.pay', $data); @@ -279,11 +278,11 @@ class PayPalPPCPPaymentDriver extends BaseDriver "op" => "replace", "path" => "/purchase_units/@reference_id=='default'/shipping/address", "value" => [ - "address_line_1" => strlen($this->client->shipping_address1) > 1 ? $this->client->shipping_address1 : $this->client->address1, + "address_line_1" => strlen($this->client->shipping_address1 ?? '') > 1 ? $this->client->shipping_address1 : $this->client->address1, "address_line_2" => $this->client->shipping_address2, - "admin_area_2" => strlen($this->client->shipping_city) > 1 ? $this->client->shipping_city : $this->client->city, - "admin_area_1" => strlen($this->client->shipping_state) > 1 ? $this->client->shipping_state : $this->client->state, - "postal_code" => strlen($this->client->shipping_postal_code) > 1 ? $this->client->shipping_postal_code : $this->client->postal_code, + "admin_area_2" => strlen($this->client->shipping_city ?? '') > 1 ? $this->client->shipping_city : $this->client->city, + "admin_area_1" => strlen($this->client->shipping_state ?? '') > 1 ? $this->client->shipping_state : $this->client->state, + "postal_code" => strlen($this->client->shipping_postal_code ?? '') > 1 ? $this->client->shipping_postal_code : $this->client->postal_code, "country_code" => $this->client->present()->shipping_country_code(), ], ]]; @@ -406,21 +405,32 @@ class PayPalPPCPPaymentDriver extends BaseDriver private function injectPayPalPaymentSource(): array { - return [ + $order = [ "paypal" => [ - "name" => [ "given_name" => $this->client->present()->first_name(), "surname" => $this->client->present()->last_name(), ], "email_address" => $this->client->present()->email(), - "address" => $this->getBillingAddress(), "experience_context" => [ "user_action" => "PAY_NOW" ], ], ]; + if( + strlen($this->client->address1 ?? '') > 2 && + strlen($this->client->city ?? '') > 2 && + strlen($this->client->state ?? '') >= 2 && + strlen($this->client->postal_code ?? '') > 2 && + strlen($this->client->country->iso_3166_2 ?? '') >= 2 + ) + { + $order["paypal"]["address"] = $this->getBillingAddress(); + } + + return $order; + } /** @@ -488,8 +498,6 @@ class PayPalPPCPPaymentDriver extends BaseDriver $r = $this->gatewayRequest('/v2/checkout/orders', 'post', $order); - // nlog($r->json()); - return $r->json()['id']; } @@ -497,14 +505,14 @@ class PayPalPPCPPaymentDriver extends BaseDriver private function getBillingAddress(): array { return - [ - "address_line_1" => $this->client->address1, - "address_line_2" => $this->client->address2, - "admin_area_2" => $this->client->city, - "admin_area_1" => $this->client->state, - "postal_code" => $this->client->postal_code, - "country_code" => $this->client->country->iso_3166_2, - ]; + [ + "address_line_1" => $this->client->address1, + "address_line_2" => $this->client->address2, + "admin_area_2" => $this->client->city, + "admin_area_1" => $this->client->state, + "postal_code" => $this->client->postal_code, + "country_code" => $this->client->country->iso_3166_2, + ]; } private function getShippingAddress(): ?array @@ -513,11 +521,11 @@ class PayPalPPCPPaymentDriver extends BaseDriver [ "address" => [ - "address_line_1" => strlen($this->client->shipping_address1) > 1 ? $this->client->shipping_address1 : $this->client->address1, + "address_line_1" => strlen($this->client->shipping_address1 ?? '') > 1 ? $this->client->shipping_address1 : $this->client->address1, "address_line_2" => $this->client->shipping_address2, - "admin_area_2" => strlen($this->client->shipping_city) > 1 ? $this->client->shipping_city : $this->client->city, - "admin_area_1" => strlen($this->client->shipping_state) > 1 ? $this->client->shipping_state : $this->client->state, - "postal_code" => strlen($this->client->shipping_postal_code) > 1 ? $this->client->shipping_postal_code : $this->client->postal_code, + "admin_area_2" => strlen($this->client->shipping_city ?? '') > 1 ? $this->client->shipping_city : $this->client->city, + "admin_area_1" => strlen($this->client->shipping_state ?? '') > 1 ? $this->client->shipping_state : $this->client->state, + "postal_code" => strlen($this->client->shipping_postal_code ?? '') > 1 ? $this->client->shipping_postal_code : $this->client->postal_code, "country_code" => $this->client->present()->shipping_country_code(), ], ] diff --git a/app/PaymentDrivers/PayPalRestPaymentDriver.php b/app/PaymentDrivers/PayPalRestPaymentDriver.php index dd3c5475f3..6583e99489 100644 --- a/app/PaymentDrivers/PayPalRestPaymentDriver.php +++ b/app/PaymentDrivers/PayPalRestPaymentDriver.php @@ -478,26 +478,55 @@ return render('gateways.paypal.pay', $data); } - return [ + $order = [ "paypal" => [ "name" => [ "given_name" => $this->client->present()->first_name(), "surname" => $this->client->present()->last_name(), ], "email_address" => $this->client->present()->email(), - "address" => [ + "experience_context" => [ + "user_action" => "PAY_NOW" + ], + ], + ]; + + /** If we have a complete address, add it to the order, otherwise leave it blank! */ + if( + strlen($this->client->shipping_address1 ?? '') > 2 && + strlen($this->client->shipping_city ?? '') > 2 && + strlen($this->client->shipping_state ?? '') >= 2 && + strlen($this->client->shipping_postal_code ?? '') > 2 && + strlen($this->client->shipping_country->iso_3166_2 ?? '') >= 2 + ) { + $order['paypal']['address'] = [ + "address_line_1" => $this->client->shipping_address1, + "address_line_2" => $this->client->shipping_address2, + "admin_area_2" => $this->client->shipping_city, + "admin_area_1" => $this->client->shipping_state, + "postal_code" => $this->client->shipping_postal_code, + "country_code" => $this->client->present()->shipping_country_code(), + ]; + } + elseif( + strlen($this->client->address1 ?? '') > 2 && + strlen($this->client->city ?? '') > 2 && + strlen($this->client->state ?? '') >= 2 && + strlen($this->client->postal_code ?? '') > 2 && + strlen($this->client->country->iso_3166_2 ?? '') >= 2 + ) + { + $order['paypal']['address'] = [ "address_line_1" => $this->client->address1, "address_line_2" => $this->client->address2, "admin_area_2" => $this->client->city, "admin_area_1" => $this->client->state, "postal_code" => $this->client->postal_code, "country_code" => $this->client->country->iso_3166_2, - ], - "experience_context" => [ - "user_action" => "PAY_NOW" - ], - ], - ]; + ]; + } + + return $order; } @@ -521,7 +550,6 @@ return render('gateways.paypal.pay', $data); "custom_id" => $this->payment_hash->hash, "description" => ctrans('texts.invoice_number') . '# ' . $invoice->number, "invoice_id" => $invoice->number, - $this->getShippingAddress(), "amount" => [ "value" => (string) $data['amount_with_fee'], "currency_code" => $this->client->currency()->code, @@ -554,13 +582,9 @@ return render('gateways.paypal.pay', $data); if(isset($data['payment_source'])) $order['payment_source'] = $data['payment_source']; - - nlog($order); $r = $this->gatewayRequest('/v2/checkout/orders', 'post', $order); - // nlog($r->json()); - return $r->json()['id']; } diff --git a/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php b/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php index acb5514834..7777da7b7e 100644 --- a/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php +++ b/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php @@ -145,7 +145,7 @@ class UpdatePaymentMethods public function importBankAccounts($customer, $client) { - $sources = $customer->sources; + $sources = $customer->sources ?? false; if (!$customer || is_null($sources) || !property_exists($sources, 'data')) { return; diff --git a/app/Repositories/BaseRepository.php b/app/Repositories/BaseRepository.php index be0bfbf31b..ff2c6e1f88 100644 --- a/app/Repositories/BaseRepository.php +++ b/app/Repositories/BaseRepository.php @@ -379,4 +379,9 @@ class BaseRepository return $model->fresh(); } + + public function bulkUpdate(\Illuminate\Database\Eloquent\Builder $model, string $column, mixed $new_value) :void + { + $model->update([$column => $new_value]); + } } diff --git a/app/Repositories/TaskRepository.php b/app/Repositories/TaskRepository.php index 31e680fa9d..1778c83ea8 100644 --- a/app/Repositories/TaskRepository.php +++ b/app/Repositories/TaskRepository.php @@ -27,6 +27,10 @@ class TaskRepository extends BaseRepository private $completed = true; + private bool $task_round_up = true; + + private int $task_round_to_nearest = 1; + /** * Saves the task and its contacts. * @@ -44,6 +48,8 @@ class TaskRepository extends BaseRepository $task->fill($data); $task->saveQuietly(); + $this->init($task); + if ($this->new_task && ! $task->status_id) { $task->status_id = $this->setDefaultStatus($task); } @@ -105,6 +111,11 @@ class TaskRepository extends BaseRepository $key_values = array_column($time_log, 0); array_multisort($key_values, SORT_ASC, $time_log); + foreach($time_log as $key => $value) + { + $time_log[$key][1] = $this->roundTimeLog($time_log[$key][1]); + } + if (isset($data['action'])) { if ($data['action'] == 'start') { $task->is_running = true; @@ -126,8 +137,6 @@ class TaskRepository extends BaseRepository $task->time_log = json_encode($time_log); - - $task->saveQuietly(); if (array_key_exists('documents', $data)) { @@ -243,14 +252,27 @@ class TaskRepository extends BaseRepository return $task; } + public function roundTimeLog(int $end_time): int + { + if($this->task_round_to_nearest == 1) + return $end_time; + + if($this->task_round_up) + return (int)ceil($end_time/$this->task_round_to_nearest)*$this->task_round_to_nearest; + + return (int)floor($end_time/$this->task_round_to_nearest) * $this->task_round_to_nearest; + } + public function stop(Task $task) { + $this->init($task); + $log = json_decode($task->time_log, true); $last = end($log); if (is_array($last) && $last[1] === 0) { - $last[1] = time(); + $last[1] = $this->roundTimeLog(time()); array_pop($log); $log = array_merge($log, [$last]);//check at this point, it may be prepending here. @@ -275,6 +297,15 @@ class TaskRepository extends BaseRepository return $task; } + private function init(Task $task): self + { + + $this->task_round_up = $task->client ? $task->client->getSetting('task_round_up') : $task->company->getSetting('task_round_up'); + $this->task_round_to_nearest = $task->client ? $task->client->getSetting('task_round_to_nearest') : $task->company->getSetting('task_round_to_nearest'); + + return $this; + + } private function trySaving(Task $task) { diff --git a/app/Services/Credit/ApplyPayment.php b/app/Services/Credit/ApplyPayment.php index dea98654f3..284450b1c0 100644 --- a/app/Services/Credit/ApplyPayment.php +++ b/app/Services/Credit/ApplyPayment.php @@ -122,7 +122,7 @@ class ApplyPayment $this->payment ->ledger() - ->updatePaymentBalance($this->amount_applied * -1); + ->updatePaymentBalance($this->amount_applied * -1, "ApplyPaymentCredit"); $this->payment ->client @@ -137,7 +137,6 @@ class ApplyPayment ->updateBalance($this->amount_applied * -1) ->updatePaidToDate($this->amount_applied) ->updateStatus() - // ->deletePdf() ->save(); $this->credit @@ -147,7 +146,6 @@ class ApplyPayment event(new InvoiceWasUpdated($this->invoice, $this->invoice->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); if ((int) $this->invoice->balance == 0) { - // $this->invoice->service()->deletePdf(); $this->invoice = $this->invoice->fresh(); event(new InvoiceWasPaid($this->invoice, $this->payment, $this->payment->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); } diff --git a/app/Services/EDocument/Standards/ZugferdEDokument.php b/app/Services/EDocument/Standards/ZugferdEDokument.php index ddb362bbee..4128251094 100644 --- a/app/Services/EDocument/Standards/ZugferdEDokument.php +++ b/app/Services/EDocument/Standards/ZugferdEDokument.php @@ -102,7 +102,12 @@ class ZugferdEDokument extends AbstractService $this->xdocument->setDocumentShipToAddress($client->shipping_address1, $client->shipping_address2, "", $client->shipping_postal_code, $client->shipping_city, $client->shipping_country->iso_3166_2, $client->shipping_state); } - $this->xdocument->addDocumentPaymentMean(68, ctrans("texts.xinvoice_online_payment")); + //Payment Means - Switcher + if($company->settings->custom_value1 == '42'){ + $this->xdocument->addDocumentPaymentMean(typecode: 42, payeeIban: $company->settings->custom_value2, payeeAccountName: $company->settings->custom_value4, payeeBic: $company->settings->custom_value3); + } + else + $this->xdocument->addDocumentPaymentMean(68, ctrans("texts.xinvoice_online_payment")); if (str_contains($company->getSetting('vat_number'), "/")) { $this->xdocument->addDocumentSellerTaxRegistration("FC", $company->getSetting('vat_number')); diff --git a/app/Services/Email/Email.php b/app/Services/Email/Email.php index 7136952972..661b8aef52 100644 --- a/app/Services/Email/Email.php +++ b/app/Services/Email/Email.php @@ -589,7 +589,7 @@ $this->entityEmailFailed($message); return $this; } - private function configureSmtpMailer(): void + private function configureSmtpMailer() { $company = $this->company; @@ -602,6 +602,14 @@ $this->entityEmailFailed($message); $smtp_local_domain = strlen($company->smtp_local_domain) > 2 ? $company->smtp_local_domain : null; $smtp_verify_peer = $company->smtp_verify_peer ?? true; + if(strlen($smtp_host ?? '') <= 1 || + strlen($smtp_username ?? '') <= 1 || + strlen($smtp_password ?? '') <= 1 + ) { + $this->email_object->settings->email_sending_method = 'default'; + return $this->setMailDriver(); + } + config([ 'mail.mailers.smtp' => [ 'transport' => 'smtp', diff --git a/app/Services/Invoice/ApplyPayment.php b/app/Services/Invoice/ApplyPayment.php index 7a26a3c9d2..2fdcc6c7b3 100644 --- a/app/Services/Invoice/ApplyPayment.php +++ b/app/Services/Invoice/ApplyPayment.php @@ -73,7 +73,7 @@ class ApplyPayment extends AbstractService $this->payment ->ledger() - ->updatePaymentBalance($amount_paid); + ->updatePaymentBalance($amount_paid, "ApplyPaymentInvoice"); $this->invoice ->client diff --git a/app/Services/Invoice/ApplyPaymentAmount.php b/app/Services/Invoice/ApplyPaymentAmount.php index dfd44d3690..11241b09a0 100644 --- a/app/Services/Invoice/ApplyPaymentAmount.php +++ b/app/Services/Invoice/ApplyPaymentAmount.php @@ -101,7 +101,7 @@ class ApplyPaymentAmount extends AbstractService /* Update Invoice balance */ $payment->ledger() - ->updatePaymentBalance($payment->amount * -1); + ->updatePaymentBalance($payment->amount * -1, "ApplyPaymentInvoice-"); $this->invoice->service()->workFlow()->save(); diff --git a/app/Services/Invoice/AutoBillInvoice.php b/app/Services/Invoice/AutoBillInvoice.php index 341d6990ef..67fe56aacf 100644 --- a/app/Services/Invoice/AutoBillInvoice.php +++ b/app/Services/Invoice/AutoBillInvoice.php @@ -213,7 +213,7 @@ class AutoBillInvoice extends AbstractService } $payment->ledger() - ->updatePaymentBalance($amount * -1) + ->updatePaymentBalance($amount * -1, "AutoBill") ->save(); $this->invoice diff --git a/app/Services/Invoice/MarkPaid.php b/app/Services/Invoice/MarkPaid.php index 49b757ccdc..30d8311c7a 100644 --- a/app/Services/Invoice/MarkPaid.php +++ b/app/Services/Invoice/MarkPaid.php @@ -107,7 +107,7 @@ class MarkPaid extends AbstractService ->save(); $payment->ledger() - ->updatePaymentBalance($this->payable_balance * -1); + ->updatePaymentBalance($this->payable_balance * -1, "Marked Paid Activity"); //06-09-2022 $this->invoice diff --git a/app/Services/Payment/DeletePayment.php b/app/Services/Payment/DeletePayment.php index 7c5a775a99..c7d0a63270 100644 --- a/app/Services/Payment/DeletePayment.php +++ b/app/Services/Payment/DeletePayment.php @@ -70,7 +70,6 @@ class DeletePayment /** @return $this */ private function deletePaymentables() { - // $this->payment->paymentables()->update(['deleted_at' => now()]); $this->payment->paymentables() ->each(function ($pp) { @@ -156,7 +155,7 @@ class DeletePayment $paymentable_credit->service() ->updateBalance($paymentable_credit->pivot->amount * $multiplier * -1) - ->updatePaidToDate($paymentable_credit->pivot->amount * $multiplier) + ->updatePaidToDate($paymentable_credit->pivot->amount * $multiplier * -1) ->setStatus(Credit::STATUS_SENT) ->save(); diff --git a/app/Services/Payment/PaymentService.php b/app/Services/Payment/PaymentService.php index ed4e165a3d..0fdf542dd0 100644 --- a/app/Services/Payment/PaymentService.php +++ b/app/Services/Payment/PaymentService.php @@ -69,7 +69,7 @@ class PaymentService $this->payment ->ledger() - ->updatePaymentBalance($this->payment->amount); + ->updatePaymentBalance($this->payment->amount, "PaymentService"); $client->service() ->updateBalance($this->payment->amount) diff --git a/app/Services/Payment/UpdateInvoicePayment.php b/app/Services/Payment/UpdateInvoicePayment.php index a73fb578f9..1000086b69 100644 --- a/app/Services/Payment/UpdateInvoicePayment.php +++ b/app/Services/Payment/UpdateInvoicePayment.php @@ -78,19 +78,18 @@ class UpdateInvoicePayment //caution what if we amount paid was less than partial - we wipe it! $invoice->balance -= $paid_amount; $invoice->paid_to_date += $paid_amount; - $invoice->save(); + $invoice->saveQuietly(); - $invoice_service = $invoice->service() + $invoice = $invoice->service() ->clearPartial() ->updateStatus() - ->workFlow(); + ->workFlow() + ->save(); if ($has_partial) { - $invoice_service->checkReminderStatus(); + $invoice->service()->checkReminderStatus()->save(); } - $invoice = $invoice_service->save(); - if ($invoice->is_proforma) { //keep proforma's hidden if (property_exists($this->payment_hash->data, 'pre_payment') && $this->payment_hash->data->pre_payment == "1") { @@ -145,7 +144,7 @@ class UpdateInvoicePayment /* Updates the company ledger */ $this->payment ->ledger() - ->updatePaymentBalance($paid_amount * -1); + ->updatePaymentBalance($paid_amount * -1, "UpdateInvoicePayment"); $pivot_invoice = $this->payment->invoices->first(function ($inv) use ($paid_invoice) { return $inv->hashed_id == $paid_invoice->invoice_id; diff --git a/app/Services/PurchaseOrder/CreateInvitations.php b/app/Services/PurchaseOrder/CreateInvitations.php index 7db470ed94..12bdfc60cf 100644 --- a/app/Services/PurchaseOrder/CreateInvitations.php +++ b/app/Services/PurchaseOrder/CreateInvitations.php @@ -41,7 +41,7 @@ class CreateInvitations extends AbstractService public function run() { - $contacts = $this->purchase_order->vendor->contacts()->get(); + $contacts = $this->purchase_order?->vendor?->contacts()->get(); if ($contacts->count() == 0) { $this->createBlankContact(); diff --git a/app/Services/Report/ARDetailReport.php b/app/Services/Report/ARDetailReport.php index 8a4b47592d..8b937b495d 100644 --- a/app/Services/Report/ARDetailReport.php +++ b/app/Services/Report/ARDetailReport.php @@ -74,6 +74,7 @@ class ARDetailReport extends BaseExport $t->replace(Ninja::transformTranslations($this->company->settings)); $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); $this->csv->insertOne([]); $this->csv->insertOne([]); diff --git a/app/Services/Report/ARSummaryReport.php b/app/Services/Report/ARSummaryReport.php index 974059783c..3ba32b3bea 100644 --- a/app/Services/Report/ARSummaryReport.php +++ b/app/Services/Report/ARSummaryReport.php @@ -70,6 +70,7 @@ class ARSummaryReport extends BaseExport $t->replace(Ninja::transformTranslations($this->company->settings)); $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); $this->csv->insertOne([]); $this->csv->insertOne([]); diff --git a/app/Services/Report/ClientBalanceReport.php b/app/Services/Report/ClientBalanceReport.php index cf8a5716bd..c5ca05c5fa 100644 --- a/app/Services/Report/ClientBalanceReport.php +++ b/app/Services/Report/ClientBalanceReport.php @@ -64,6 +64,7 @@ class ClientBalanceReport extends BaseExport $t->replace(Ninja::transformTranslations($this->company->settings)); $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); $this->csv->insertOne([]); $this->csv->insertOne([]); diff --git a/app/Services/Report/ClientSalesReport.php b/app/Services/Report/ClientSalesReport.php index b59e54337a..c2bd9346bd 100644 --- a/app/Services/Report/ClientSalesReport.php +++ b/app/Services/Report/ClientSalesReport.php @@ -68,6 +68,7 @@ class ClientSalesReport extends BaseExport $t->replace(Ninja::transformTranslations($this->company->settings)); $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); $this->csv->insertOne([]); $this->csv->insertOne([]); diff --git a/app/Services/Report/TaxSummaryReport.php b/app/Services/Report/TaxSummaryReport.php index c593d93ca8..b44b795570 100644 --- a/app/Services/Report/TaxSummaryReport.php +++ b/app/Services/Report/TaxSummaryReport.php @@ -63,6 +63,7 @@ class TaxSummaryReport extends BaseExport $t->replace(Ninja::transformTranslations($this->company->settings)); $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); $this->csv->insertOne([]); $this->csv->insertOne([]); diff --git a/app/Services/Report/UserSalesReport.php b/app/Services/Report/UserSalesReport.php index e4bd03249f..9b3dec875f 100644 --- a/app/Services/Report/UserSalesReport.php +++ b/app/Services/Report/UserSalesReport.php @@ -61,6 +61,7 @@ class UserSalesReport extends BaseExport $t->replace(Ninja::transformTranslations($this->company->settings)); $this->csv = Writer::createFromString(); + \League\Csv\CharsetConverter::addTo($this->csv, 'UTF-8', 'UTF-8'); $query = Invoice::query() ->withTrashed() diff --git a/app/Transformers/CompanyGatewayTransformer.php b/app/Transformers/CompanyGatewayTransformer.php index aad31e10d3..d4143faf58 100644 --- a/app/Transformers/CompanyGatewayTransformer.php +++ b/app/Transformers/CompanyGatewayTransformer.php @@ -80,6 +80,7 @@ class CompanyGatewayTransformer extends EntityTransformer 'label' => (string) $company_gateway->label ?: '', 'token_billing' => (string) $company_gateway->token_billing, 'test_mode' => (bool) $company_gateway->isTestMode(), + 'always_show_required_fields' => (bool) $company_gateway->always_show_required_fields, ]; } diff --git a/app/Utils/HtmlEngine.php b/app/Utils/HtmlEngine.php index 226f824902..c3946d6193 100644 --- a/app/Utils/HtmlEngine.php +++ b/app/Utils/HtmlEngine.php @@ -720,7 +720,7 @@ class HtmlEngine $data['$payment.date'] = ['value' => '', 'label' => ctrans('texts.payment_date')]; $data['$payment.number'] = ['value' => '', 'label' => ctrans('texts.payment_number')]; $data['$payment.transaction_reference'] = ['value' => '', 'label' => ctrans('texts.transaction_reference')]; - + $data['$payment.refunded'] = ['value' => '', 'label' => ctrans('texts.refund')]; if ($this->entity_string == 'invoice' && $this->entity->net_payments()->exists()) { $payment_list = '

'; @@ -742,6 +742,7 @@ class HtmlEngine $data['$payment.date'] = ['value' => $this->formatDate($payment->date, $this->client->date_format()), 'label' => ctrans('texts.payment_date')]; $data['$payment.number'] = ['value' => $payment->number, 'label' => ctrans('texts.payment_number')]; $data['$payment.transaction_reference'] = ['value' => $payment->transaction_reference, 'label' => ctrans('texts.transaction_reference')]; + $data['$payment.refunded'] = ['value' => $this->getPaymentMeta($payment), 'label' => ctrans('texts.refund')]; } @@ -755,6 +756,35 @@ class HtmlEngine return $data; } + private function getPaymentMeta(\App\Models\Payment $payment) { + + if(!is_array($payment->refund_meta)) + return ''; + + return + collect($payment->refund_meta) + ->map(function ($refund) use ($payment) { + + $date = \Carbon\Carbon::parse($refund['date'] ?? $payment->date)->addSeconds($payment->client->timezone_offset()); + $date = $this->translateDate($date, $payment->client->date_format(), $payment->client->locale()); + $entity = ctrans('texts.invoice'); + + $map = []; + + foreach($refund['invoices'] as $refunded_invoice) { + $invoice = \App\Models\Invoice::withTrashed()->find($refunded_invoice['invoice_id']); + $amount = Number::formatMoney($refunded_invoice['amount'], $payment->client); + $notes = ctrans('texts.status_partially_refunded_amount', ['amount' => $amount]); + + array_push($map, "{$date} {$entity} #{$invoice->number} {$notes}\n"); + + } + + return $map; + + })->flatten()->implode("\n"); + + } /** * Returns a localized string for tax compliance purposes * diff --git a/app/Utils/Statics.php b/app/Utils/Statics.php index 54a32dd6d2..ee36bbd80b 100644 --- a/app/Utils/Statics.php +++ b/app/Utils/Statics.php @@ -127,6 +127,10 @@ class Statics $data['templates'] = Cache::get('templates'); } + $data['bulk_updates'] = [ + 'client' => \App\Models\Client::$bulk_update_columns, + ]; + return $data; } } diff --git a/app/Utils/Traits/GeneratesCounter.php b/app/Utils/Traits/GeneratesCounter.php index 3c7b3bb7c7..731e39a504 100644 --- a/app/Utils/Traits/GeneratesCounter.php +++ b/app/Utils/Traits/GeneratesCounter.php @@ -288,6 +288,7 @@ trait GeneratesCounter */ public function getNextProjectNumber(Project $project): string { + $entity_number = $this->getNextEntityNumber(Project::class, $project->client, false); return $this->replaceUserVars($project, $entity_number); diff --git a/composer.json b/composer.json index 85d724d6ba..cd273d7f6e 100644 --- a/composer.json +++ b/composer.json @@ -77,7 +77,6 @@ "nordigen/nordigen-php": "^1.1", "nwidart/laravel-modules": "^10.0", "omnipay/paypal": "^3.0", - "payfast/payfast-php-sdk": "^1.1", "phpoffice/phpspreadsheet": "^1.29", "pragmarx/google2fa": "^8.0", "predis/predis": "^2", diff --git a/composer.lock b/composer.lock index 698624de85..b148de8315 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "853c952c9b8cc2c562748aaaa293c3ea", + "content-hash": "c3572d1d9feb7c78007521d6c07b8f42", "packages": [ { "name": "adrienrn/php-mimetyper", @@ -1330,16 +1330,16 @@ }, { "name": "aws/aws-crt-php", - "version": "v1.2.4", + "version": "v1.2.5", "source": { "type": "git", "url": "https://github.com/awslabs/aws-crt-php.git", - "reference": "eb0c6e4e142224a10b08f49ebf87f32611d162b2" + "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/eb0c6e4e142224a10b08f49ebf87f32611d162b2", - "reference": "eb0c6e4e142224a10b08f49ebf87f32611d162b2", + "url": "https://api.github.com/repos/awslabs/aws-crt-php/zipball/0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", + "reference": "0ea1f04ec5aa9f049f97e012d1ed63b76834a31b", "shasum": "" }, "require": { @@ -1378,22 +1378,22 @@ ], "support": { "issues": "https://github.com/awslabs/aws-crt-php/issues", - "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.4" + "source": "https://github.com/awslabs/aws-crt-php/tree/v1.2.5" }, - "time": "2023-11-08T00:42:13+00:00" + "time": "2024-04-19T21:30:56+00:00" }, { "name": "aws/aws-sdk-php", - "version": "3.304.8", + "version": "3.305.4", "source": { "type": "git", "url": "https://github.com/aws/aws-sdk-php.git", - "reference": "0079eaa0a0eaef2d73d0a4a11389cdfce1d33189" + "reference": "fc26a2ebf720e0b75a353d7e8fe206796671e00b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/0079eaa0a0eaef2d73d0a4a11389cdfce1d33189", - "reference": "0079eaa0a0eaef2d73d0a4a11389cdfce1d33189", + "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/fc26a2ebf720e0b75a353d7e8fe206796671e00b", + "reference": "fc26a2ebf720e0b75a353d7e8fe206796671e00b", "shasum": "" }, "require": { @@ -1473,9 +1473,9 @@ "support": { "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "issues": "https://github.com/aws/aws-sdk-php/issues", - "source": "https://github.com/aws/aws-sdk-php/tree/3.304.8" + "source": "https://github.com/aws/aws-sdk-php/tree/3.305.4" }, - "time": "2024-04-19T18:13:09+00:00" + "time": "2024-04-26T18:06:31+00:00" }, { "name": "bacon/bacon-qr-code", @@ -2289,16 +2289,16 @@ }, { "name": "doctrine/dbal", - "version": "3.8.3", + "version": "3.8.4", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "db922ba9436b7b18a23d1653a0b41ff2369ca41c" + "reference": "b05e48a745f722801f55408d0dbd8003b403dbbd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/db922ba9436b7b18a23d1653a0b41ff2369ca41c", - "reference": "db922ba9436b7b18a23d1653a0b41ff2369ca41c", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/b05e48a745f722801f55408d0dbd8003b403dbbd", + "reference": "b05e48a745f722801f55408d0dbd8003b403dbbd", "shasum": "" }, "require": { @@ -2382,7 +2382,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.8.3" + "source": "https://github.com/doctrine/dbal/tree/3.8.4" }, "funding": [ { @@ -2398,7 +2398,7 @@ "type": "tidelift" } ], - "time": "2024-03-03T15:55:06+00:00" + "time": "2024-04-25T07:04:44+00:00" }, { "name": "doctrine/deprecations", @@ -3473,31 +3473,31 @@ }, { "name": "google/apiclient", - "version": "v2.15.3", + "version": "v2.16.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client.git", - "reference": "e70273c06d18824de77e114247ae3102f8aec64d" + "reference": "017400f609c1fb71ab5ad824c50eabd4c3eaf779" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/e70273c06d18824de77e114247ae3102f8aec64d", - "reference": "e70273c06d18824de77e114247ae3102f8aec64d", + "url": "https://api.github.com/repos/googleapis/google-api-php-client/zipball/017400f609c1fb71ab5ad824c50eabd4c3eaf779", + "reference": "017400f609c1fb71ab5ad824c50eabd4c3eaf779", "shasum": "" }, "require": { "firebase/php-jwt": "~6.0", - "google/apiclient-services": "~0.200", - "google/auth": "^1.33", + "google/apiclient-services": "~0.350", + "google/auth": "^1.37", "guzzlehttp/guzzle": "^6.5.8||^7.4.5", - "guzzlehttp/psr7": "^1.8.4||^2.2.1", + "guzzlehttp/psr7": "^1.9.1||^2.2.1", "monolog/monolog": "^2.9||^3.0", "php": "^7.4|^8.0", - "phpseclib/phpseclib": "^3.0.34" + "phpseclib/phpseclib": "^3.0.36" }, "require-dev": { "cache/filesystem-adapter": "^1.1", - "composer/composer": "^1.10.22", + "composer/composer": "^1.10.23", "phpcompatibility/php-compatibility": "^9.2", "phpspec/prophecy-phpunit": "^2.0", "phpunit/phpunit": "^9.5", @@ -3536,22 +3536,22 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client/issues", - "source": "https://github.com/googleapis/google-api-php-client/tree/v2.15.3" + "source": "https://github.com/googleapis/google-api-php-client/tree/v2.16.0" }, - "time": "2024-01-04T19:15:22+00:00" + "time": "2024-04-24T00:59:47+00:00" }, { "name": "google/apiclient-services", - "version": "v0.345.0", + "version": "v0.350.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-api-php-client-services.git", - "reference": "a975dae4c06d304b020eda3f53e7c3402b32132d" + "reference": "a053f7dd118e46845fcefa9036c5b97b1050dfaa" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/a975dae4c06d304b020eda3f53e7c3402b32132d", - "reference": "a975dae4c06d304b020eda3f53e7c3402b32132d", + "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/a053f7dd118e46845fcefa9036c5b97b1050dfaa", + "reference": "a053f7dd118e46845fcefa9036c5b97b1050dfaa", "shasum": "" }, "require": { @@ -3580,40 +3580,42 @@ ], "support": { "issues": "https://github.com/googleapis/google-api-php-client-services/issues", - "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.345.0" + "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.350.0" }, - "time": "2024-04-21T01:02:15+00:00" + "time": "2024-04-23T21:58:18+00:00" }, { "name": "google/auth", - "version": "v1.37.1", + "version": "v1.38.0", "source": { "type": "git", "url": "https://github.com/googleapis/google-auth-library-php.git", - "reference": "1a7de77b72e6ac60dccf0e6478c4c1005bb0ff46" + "reference": "5d0c47368fc644d98d0a6299362d4ce03a0ef250" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/1a7de77b72e6ac60dccf0e6478c4c1005bb0ff46", - "reference": "1a7de77b72e6ac60dccf0e6478c4c1005bb0ff46", + "url": "https://api.github.com/repos/googleapis/google-auth-library-php/zipball/5d0c47368fc644d98d0a6299362d4ce03a0ef250", + "reference": "5d0c47368fc644d98d0a6299362d4ce03a0ef250", "shasum": "" }, "require": { "firebase/php-jwt": "^6.0", - "guzzlehttp/guzzle": "^6.5.8||^7.4.5", + "guzzlehttp/guzzle": "^7.4.5", "guzzlehttp/psr7": "^2.4.5", - "php": "^7.4||^8.0", - "psr/cache": "^1.0||^2.0||^3.0", + "php": "^8.0", + "psr/cache": "^2.0||^3.0", "psr/http-message": "^1.1||^2.0" }, "require-dev": { "guzzlehttp/promises": "^2.0", "kelvinmo/simplejwt": "0.7.1", - "phpseclib/phpseclib": "^3.0", - "phpspec/prophecy-phpunit": "^2.0", - "phpunit/phpunit": "^9.0.0", + "phpseclib/phpseclib": "^3.0.35", + "phpspec/prophecy-phpunit": "^2.1", + "phpunit/phpunit": "^9.6", "sebastian/comparator": ">=1.2.3", - "squizlabs/php_codesniffer": "^3.5" + "squizlabs/php_codesniffer": "^3.5", + "symfony/process": "^6.0||^7.0", + "webmozart/assert": "^1.11" }, "suggest": { "phpseclib/phpseclib": "May be used in place of OpenSSL for signing strings or for token management. Please require version ^2." @@ -3638,9 +3640,9 @@ "support": { "docs": "https://googleapis.github.io/google-auth-library-php/main/", "issues": "https://github.com/googleapis/google-auth-library-php/issues", - "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.37.1" + "source": "https://github.com/googleapis/google-auth-library-php/tree/v1.38.0" }, - "time": "2024-04-03T18:41:12+00:00" + "time": "2024-04-24T18:36:53+00:00" }, { "name": "graham-campbell/result-type", @@ -5527,16 +5529,16 @@ }, { "name": "laravel/framework", - "version": "v10.48.8", + "version": "v10.48.9", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "8e9ab6da362f268170fe815127aed5ec7d303697" + "reference": "ad758500b47964d022addf119600a1b1b0230733" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/8e9ab6da362f268170fe815127aed5ec7d303697", - "reference": "8e9ab6da362f268170fe815127aed5ec7d303697", + "url": "https://api.github.com/repos/laravel/framework/zipball/ad758500b47964d022addf119600a1b1b0230733", + "reference": "ad758500b47964d022addf119600a1b1b0230733", "shasum": "" }, "require": { @@ -5730,20 +5732,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2024-04-16T14:26:04+00:00" + "time": "2024-04-23T15:01:33+00:00" }, { "name": "laravel/prompts", - "version": "v0.1.19", + "version": "v0.1.20", "source": { "type": "git", "url": "https://github.com/laravel/prompts.git", - "reference": "0ab75ac3434d9f610c5691758a6146a3d1940c18" + "reference": "bf9a360c484976692de0f3792f30066f4f4b34a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/prompts/zipball/0ab75ac3434d9f610c5691758a6146a3d1940c18", - "reference": "0ab75ac3434d9f610c5691758a6146a3d1940c18", + "url": "https://api.github.com/repos/laravel/prompts/zipball/bf9a360c484976692de0f3792f30066f4f4b34a2", + "reference": "bf9a360c484976692de0f3792f30066f4f4b34a2", "shasum": "" }, "require": { @@ -5785,9 +5787,9 @@ ], "support": { "issues": "https://github.com/laravel/prompts/issues", - "source": "https://github.com/laravel/prompts/tree/v0.1.19" + "source": "https://github.com/laravel/prompts/tree/v0.1.20" }, - "time": "2024-04-16T14:20:35+00:00" + "time": "2024-04-18T00:45:25+00:00" }, { "name": "laravel/serializable-closure", @@ -5912,16 +5914,16 @@ }, { "name": "laravel/socialite", - "version": "v5.13.0", + "version": "v5.13.1", "source": { "type": "git", "url": "https://github.com/laravel/socialite.git", - "reference": "a03e9b2f63d8125f61952fe4f5b75d70fd7c8286" + "reference": "feed1c1ccfd991bc12af59de4aa24f657d9c5cbe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/socialite/zipball/a03e9b2f63d8125f61952fe4f5b75d70fd7c8286", - "reference": "a03e9b2f63d8125f61952fe4f5b75d70fd7c8286", + "url": "https://api.github.com/repos/laravel/socialite/zipball/feed1c1ccfd991bc12af59de4aa24f657d9c5cbe", + "reference": "feed1c1ccfd991bc12af59de4aa24f657d9c5cbe", "shasum": "" }, "require": { @@ -5980,7 +5982,7 @@ "issues": "https://github.com/laravel/socialite/issues", "source": "https://github.com/laravel/socialite" }, - "time": "2024-04-15T18:09:46+00:00" + "time": "2024-04-24T20:36:50+00:00" }, { "name": "laravel/tinker", @@ -7181,16 +7183,16 @@ }, { "name": "livewire/livewire", - "version": "v3.4.10", + "version": "v3.4.11", "source": { "type": "git", "url": "https://github.com/livewire/livewire.git", - "reference": "6f90e2d7f8e80a97a7406c22a0fbc61ca1256ed9" + "reference": "8a78d0c3ae9b4c96a2d8932ea4ac0dc782325de0" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/livewire/livewire/zipball/6f90e2d7f8e80a97a7406c22a0fbc61ca1256ed9", - "reference": "6f90e2d7f8e80a97a7406c22a0fbc61ca1256ed9", + "url": "https://api.github.com/repos/livewire/livewire/zipball/8a78d0c3ae9b4c96a2d8932ea4ac0dc782325de0", + "reference": "8a78d0c3ae9b4c96a2d8932ea4ac0dc782325de0", "shasum": "" }, "require": { @@ -7245,7 +7247,7 @@ "description": "A front-end framework for Laravel.", "support": { "issues": "https://github.com/livewire/livewire/issues", - "source": "https://github.com/livewire/livewire/tree/v3.4.10" + "source": "https://github.com/livewire/livewire/tree/v3.4.11" }, "funding": [ { @@ -7253,7 +7255,7 @@ "type": "github" } ], - "time": "2024-04-02T14:22:50+00:00" + "time": "2024-04-24T12:14:15+00:00" }, { "name": "maennchen/zipstream-php", @@ -8809,16 +8811,16 @@ }, { "name": "paragonie/sodium_compat", - "version": "v1.21.0", + "version": "v1.21.1", "source": { "type": "git", "url": "https://github.com/paragonie/sodium_compat.git", - "reference": "102bcf2312dc21c16c7c93fd44a6d2a2e1343e26" + "reference": "bb312875dcdd20680419564fe42ba1d9564b9e37" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/102bcf2312dc21c16c7c93fd44a6d2a2e1343e26", - "reference": "102bcf2312dc21c16c7c93fd44a6d2a2e1343e26", + "url": "https://api.github.com/repos/paragonie/sodium_compat/zipball/bb312875dcdd20680419564fe42ba1d9564b9e37", + "reference": "bb312875dcdd20680419564fe42ba1d9564b9e37", "shasum": "" }, "require": { @@ -8889,63 +8891,9 @@ ], "support": { "issues": "https://github.com/paragonie/sodium_compat/issues", - "source": "https://github.com/paragonie/sodium_compat/tree/v1.21.0" + "source": "https://github.com/paragonie/sodium_compat/tree/v1.21.1" }, - "time": "2024-04-19T09:18:28+00:00" - }, - { - "name": "payfast/payfast-php-sdk", - "version": "v1.1.6", - "source": { - "type": "git", - "url": "https://github.com/Payfast/payfast-php-sdk.git", - "reference": "015efcd2df3e580e023dae6e16c943328d38bb78" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/Payfast/payfast-php-sdk/zipball/015efcd2df3e580e023dae6e16c943328d38bb78", - "reference": "015efcd2df3e580e023dae6e16c943328d38bb78", - "shasum": "" - }, - "require": { - "ext-json": "*", - "guzzlehttp/guzzle": ">=6.0.0", - "php": ">=8.1" - }, - "require-dev": { - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^9", - "squizlabs/php_codesniffer": "^3.8" - }, - "type": "library", - "autoload": { - "psr-4": { - "PayFast\\": "lib/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Payfast", - "email": "support@payfast.help" - } - ], - "description": "Payfast PHP Library", - "keywords": [ - "api", - "onsite", - "payfast", - "php" - ], - "support": { - "issues": "https://github.com/Payfast/payfast-php-sdk/issues", - "source": "https://github.com/Payfast/payfast-php-sdk/tree/v1.1.6" - }, - "abandoned": true, - "time": "2024-02-28T09:54:10+00:00" + "time": "2024-04-22T22:05:04+00:00" }, { "name": "php-http/client-common", @@ -11868,20 +11816,20 @@ }, { "name": "spatie/laravel-data", - "version": "3.11.2", + "version": "3.12.0", "source": { "type": "git", "url": "https://github.com/spatie/laravel-data.git", - "reference": "21b4d115a502dfd96ab2b11c62746325e9a28924" + "reference": "d44e04839407bc32b029be59ba80090a5f720e91" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/laravel-data/zipball/21b4d115a502dfd96ab2b11c62746325e9a28924", - "reference": "21b4d115a502dfd96ab2b11c62746325e9a28924", + "url": "https://api.github.com/repos/spatie/laravel-data/zipball/d44e04839407bc32b029be59ba80090a5f720e91", + "reference": "d44e04839407bc32b029be59ba80090a5f720e91", "shasum": "" }, "require": { - "illuminate/contracts": "^9.30|^10.0", + "illuminate/contracts": "^9.30|^10.0|^11.0", "php": "^8.1", "phpdocumentor/type-resolver": "^1.5", "spatie/laravel-package-tools": "^1.9.0", @@ -11941,7 +11889,7 @@ ], "support": { "issues": "https://github.com/spatie/laravel-data/issues", - "source": "https://github.com/spatie/laravel-data/tree/3.11.2" + "source": "https://github.com/spatie/laravel-data/tree/3.12.0" }, "funding": [ { @@ -11949,7 +11897,7 @@ "type": "github" } ], - "time": "2024-02-22T08:34:10+00:00" + "time": "2024-04-24T09:27:45+00:00" }, { "name": "spatie/laravel-package-tools", @@ -18129,16 +18077,16 @@ }, { "name": "phpunit/phpunit", - "version": "10.5.19", + "version": "10.5.20", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c726f0de022368f6ed103e452a765d3304a996a4" + "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c726f0de022368f6ed103e452a765d3304a996a4", - "reference": "c726f0de022368f6ed103e452a765d3304a996a4", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/547d314dc24ec1e177720d45c6263fb226cc2ae3", + "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3", "shasum": "" }, "require": { @@ -18210,7 +18158,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.19" + "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.20" }, "funding": [ { @@ -18226,7 +18174,7 @@ "type": "tidelift" } ], - "time": "2024-04-17T14:06:18+00:00" + "time": "2024-04-24T06:32:35+00:00" }, { "name": "sebastian/cli-parser", @@ -19146,16 +19094,16 @@ }, { "name": "spatie/backtrace", - "version": "1.5.3", + "version": "1.6.1", "source": { "type": "git", "url": "https://github.com/spatie/backtrace.git", - "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab" + "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/backtrace/zipball/483f76a82964a0431aa836b6ed0edde0c248e3ab", - "reference": "483f76a82964a0431aa836b6ed0edde0c248e3ab", + "url": "https://api.github.com/repos/spatie/backtrace/zipball/8373b9d51638292e3bfd736a9c19a654111b4a23", + "reference": "8373b9d51638292e3bfd736a9c19a654111b4a23", "shasum": "" }, "require": { @@ -19163,6 +19111,7 @@ }, "require-dev": { "ext-json": "*", + "laravel/serializable-closure": "^1.3", "phpunit/phpunit": "^9.3", "spatie/phpunit-snapshot-assertions": "^4.2", "symfony/var-dumper": "^5.1" @@ -19192,7 +19141,7 @@ "spatie" ], "support": { - "source": "https://github.com/spatie/backtrace/tree/1.5.3" + "source": "https://github.com/spatie/backtrace/tree/1.6.1" }, "funding": [ { @@ -19204,7 +19153,7 @@ "type": "other" } ], - "time": "2023-06-28T12:59:17+00:00" + "time": "2024-04-24T13:22:11+00:00" }, { "name": "spatie/flare-client-php", @@ -19277,16 +19226,16 @@ }, { "name": "spatie/ignition", - "version": "1.13.2", + "version": "1.14.0", "source": { "type": "git", "url": "https://github.com/spatie/ignition.git", - "reference": "952798e239d9969e4e694b124c2cc222798dbb28" + "reference": "80385994caed328f6f9c9952926932e65b9b774c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/spatie/ignition/zipball/952798e239d9969e4e694b124c2cc222798dbb28", - "reference": "952798e239d9969e4e694b124c2cc222798dbb28", + "url": "https://api.github.com/repos/spatie/ignition/zipball/80385994caed328f6f9c9952926932e65b9b774c", + "reference": "80385994caed328f6f9c9952926932e65b9b774c", "shasum": "" }, "require": { @@ -19356,7 +19305,7 @@ "type": "github" } ], - "time": "2024-04-16T08:49:17+00:00" + "time": "2024-04-26T08:45:51+00:00" }, { "name": "spatie/laravel-ignition", diff --git a/config/ninja.php b/config/ninja.php index c0749919e0..fc12f803c3 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -17,8 +17,8 @@ return [ 'require_https' => env('REQUIRE_HTTPS', true), 'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'), - 'app_version' => env('APP_VERSION', '5.8.51'), - 'app_tag' => env('APP_TAG', '5.8.51'), + 'app_version' => env('APP_VERSION', '5.8.52'), + 'app_tag' => env('APP_TAG', '5.8.52'), 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', false), diff --git a/database/migrations/2024_04_24_064301_optional_display_required_fields_payment_gateways.php b/database/migrations/2024_04_24_064301_optional_display_required_fields_payment_gateways.php new file mode 100644 index 0000000000..3a16f3b79c --- /dev/null +++ b/database/migrations/2024_04_24_064301_optional_display_required_fields_payment_gateways.php @@ -0,0 +1,28 @@ +boolean('always_show_required_fields')->default(true); + }); + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // + } +}; diff --git a/database/migrations/2024_05_02_030103_2024_05_02_update_timezones.php b/database/migrations/2024_05_02_030103_2024_05_02_update_timezones.php new file mode 100644 index 0000000000..fca1e519c8 --- /dev/null +++ b/database/migrations/2024_05_02_030103_2024_05_02_update_timezones.php @@ -0,0 +1,148 @@ + 'Pacific/Midway', + 'US/Samoa' => 'Pacific/Pago_Pago', + 'US/Hawaii' => 'Pacific/Honolulu', + 'US/Alaska' => 'America/Anchorage', + 'US/Pacific' => 'America/Los_Angeles', + 'America/Tijuana' => 'America/Tijuana', + 'US/Arizona' => 'America/Phoenix', + 'US/Mountain' => 'America/Denver', + 'America/Chihuahua' => 'America/Chihuahua', + 'America/Mazatlan' => 'America/Mazatlan', + 'America/Mexico_City' => 'America/Mexico_City', + 'America/Monterrey' => 'America/Monterrey', + 'Canada/Saskatchewan' => 'America/Regina', + 'US/Central' => 'America/Chicago', + 'US/Eastern' => 'America/New_York', + 'US/East-Indiana' => 'America/Indiana/Indianapolis', + 'America/Bogota' => 'America/Bogota', + 'America/Lima' => 'America/Lima', + 'America/Caracas' => 'America/Caracas', + 'Canada/Atlantic' => 'America/Halifax', + 'America/La_Paz' => 'America/La_Paz', + 'America/Santiago' => 'America/Santiago', + 'Canada/Newfoundland' => 'America/St_Johns', + 'America/Buenos_Aires' => 'America/Argentina/Buenos_Aires', + 'America/Godthab' => 'America/Godthab', + 'America/Sao_Paulo' => 'America/Sao_Paulo', + 'Atlantic/Stanley' => 'Atlantic/Stanley', + 'Atlantic/Azores' => 'Atlantic/Azores', + 'Atlantic/Cape_Verde' => 'Atlantic/Cape_Verde', + 'Africa/Casablanca' => 'Africa/Casablanca', + 'Europe/Dublin' => 'Europe/Dublin', + 'Europe/Lisbon' => 'Europe/Lisbon', + 'Europe/London' => 'Europe/London', + 'Africa/Monrovia' => 'Africa/Monrovia', + 'Europe/Amsterdam' => 'Europe/Amsterdam', + 'Europe/Belgrade' => 'Europe/Belgrade', + 'Europe/Berlin' => 'Europe/Berlin', + 'Europe/Bratislava' => 'Europe/Bratislava', + 'Europe/Brussels' => 'Europe/Brussels', + 'Europe/Budapest' => 'Europe/Budapest', + 'Europe/Copenhagen' => 'Europe/Copenhagen', + 'Europe/Ljubljana' => 'Europe/Ljubljana', + 'Europe/Madrid' => 'Europe/Madrid', + 'Europe/Paris' => 'Europe/Paris', + 'Europe/Prague' => 'Europe/Prague', + 'Europe/Rome' => 'Europe/Rome', + 'Europe/Sarajevo' => 'Europe/Sarajevo', + 'Europe/Skopje' => 'Europe/Skopje', + 'Europe/Stockholm' => 'Europe/Stockholm', + 'Europe/Vienna' => 'Europe/Vienna', + 'Europe/Warsaw' => 'Europe/Warsaw', + 'Europe/Zagreb' => 'Europe/Zagreb', + 'Europe/Athens' => 'Europe/Athens', + 'Europe/Bucharest' => 'Europe/Bucharest', + 'Africa/Cairo' => 'Africa/Cairo', + 'Africa/Harare' => 'Africa/Harare', + 'Europe/Helsinki' => 'Europe/Helsinki', + 'Asia/Jerusalem' => 'Asia/Jerusalem', + 'Europe/Kiev' => 'Europe/Kiev', + 'Europe/Minsk' => 'Europe/Minsk', + 'Europe/Riga' => 'Europe/Riga', + 'Europe/Sofia' => 'Europe/Sofia', + 'Europe/Tallinn' => 'Europe/Tallinn', + 'Europe/Vilnius' => 'Europe/Vilnius', + 'Europe/Istanbul' => 'Europe/Istanbul', + 'Asia/Baghdad' => 'Asia/Baghdad', + 'Asia/Kuwait' => 'Asia/Kuwait', + 'Africa/Nairobi' => 'Africa/Nairobi', + 'Asia/Riyadh' => 'Asia/Riyadh', + 'Asia/Tehran' => 'Asia/Tehran', + 'Europe/Moscow' => 'Europe/Moscow', + 'Asia/Baku' => 'Asia/Baku', + 'Europe/Volgograd' => 'Europe/Volgograd', + 'Asia/Muscat' => 'Asia/Muscat', + 'Asia/Tbilisi' => 'Asia/Tbilisi', + 'Asia/Yerevan' => 'Asia/Yerevan', + 'Asia/Kabul' => 'Asia/Kabul', + 'Asia/Karachi' => 'Asia/Karachi', + 'Asia/Tashkent' => 'Asia/Tashkent', + 'Asia/Kolkata' => 'Asia/Kolkata', + 'Asia/Kathmandu' => 'Asia/Kathmandu', + 'Asia/Yekaterinburg' => 'Asia/Yekaterinburg', + 'Asia/Almaty' => 'Asia/Almaty', + 'Asia/Dhaka' => 'Asia/Dhaka', + 'Asia/Novosibirsk' => 'Asia/Novosibirsk', + 'Asia/Bangkok' => 'Asia/Bangkok', + 'Asia/Ho_Chi_Minh' => 'Asia/Ho_Chi_Minh', + 'Asia/Jakarta' => 'Asia/Jakarta', + 'Asia/Krasnoyarsk' => 'Asia/Krasnoyarsk', + 'Asia/Chongqing' => 'Asia/Chongqing', + 'Asia/Hong_Kong' => 'Asia/Hong_Kong', + 'Asia/Kuala_Lumpur' => 'Asia/Kuala_Lumpur', + 'Australia/Perth' => 'Australia/Perth', + 'Asia/Singapore' => 'Asia/Singapore', + 'Asia/Taipei' => 'Asia/Taipei', + 'Asia/Ulaanbaatar' => 'Asia/Ulaanbaatar', + 'Asia/Urumqi' => 'Asia/Urumqi', + 'Asia/Irkutsk' => 'Asia/Irkutsk', + 'Asia/Seoul' => 'Asia/Seoul', + 'Asia/Tokyo' => 'Asia/Tokyo', + 'Australia/Adelaide' => 'Australia/Adelaide', + 'Australia/Darwin' => 'Australia/Darwin', + 'Asia/Yakutsk' => 'Asia/Yakutsk', + 'Australia/Brisbane' => 'Australia/Brisbane', + 'Australia/Canberra' => 'Australia/Sydney', + 'Pacific/Guam' => 'Pacific/Guam', + 'Australia/Hobart' => 'Australia/Hobart', + 'Australia/Melbourne' => 'Australia/Melbourne', + 'Pacific/Port_Moresby' => 'Pacific/Port_Moresby', + 'Australia/Sydney' => 'Australia/Sydney', + 'Asia/Vladivostok' => 'Asia/Vladivostok', + 'Asia/Magadan' => 'Asia/Magadan', + 'Pacific/Auckland' => 'Pacific/Auckland', + 'Pacific/Fiji' => 'Pacific/Fiji' +]; + + /** + * Run the migrations. + */ + public function up(): void + { + foreach($this->timezones as $key => $value){ + + Timezone::where('name', $key)->update(['name' => $value]); + + } + + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + // + } +}; diff --git a/lang/ar/texts.php b/lang/ar/texts.php index 6e99681055..e9f2e6bd72 100644 --- a/lang/ar/texts.php +++ b/lang/ar/texts.php @@ -2178,7 +2178,7 @@ $lang = array( 'mailgun_private_key' => 'مفتاح Mailgun الخاص', 'brevo_domain' => 'مجال بريفو', 'brevo_private_key' => 'مفتاح بريفو الخاص', - 'send_test_email' => 'إرسال بريد إلكتروني تجريبي', + 'send_test_email' => 'Send Test Email', 'select_label' => 'حدد تسمية', 'label' => 'ملصق', 'service' => 'خدمة', @@ -4151,7 +4151,7 @@ $lang = array( 'one_time_purchases' => 'عملية شراء لمرة واحدة', 'recurring_purchases' => 'مشتريات متكررة', 'you_might_be_interested_in_following' => 'قد ترغب في الاطلاع على التالي', - 'quotes_with_status_sent_can_be_approved' => 'فقط عروض الاسعار المرسلة يمكن التاكيد عليها', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'لاتوجد عروض اسعار للتنزيل', 'copyright' => 'حقوق النشر', 'user_created_user' => ':user انشاء حساب للمستخدم :created_user في :time', @@ -5277,6 +5277,7 @@ $lang = array( 'rappen_rounding' => 'تقريب رابين', 'rappen_rounding_help' => 'جولة المبلغ إلى 5 سنتات', 'assign_group' => 'تعيين المجموعة', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/bg/texts.php b/lang/bg/texts.php index 602ace3c55..af87cbbca4 100644 --- a/lang/bg/texts.php +++ b/lang/bg/texts.php @@ -5296,6 +5296,8 @@ $lang = array( 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', 'rappen_rounding' => 'Rappen Rounding', 'rappen_rounding_help' => 'Round amount to 5 cents', + 'always_show_required_fields' => 'Always display required fields', + 'always_show_required_fields_help' => 'Will show the form regards if the fields are filled or not' ); return $lang; diff --git a/lang/ca/texts.php b/lang/ca/texts.php index cca4776db3..5c5438884a 100644 --- a/lang/ca/texts.php +++ b/lang/ca/texts.php @@ -2197,7 +2197,7 @@ $lang = array( 'mailgun_private_key' => 'Mailgun Private Key', 'brevo_domain' => 'Domini Brevo', 'brevo_private_key' => 'Clau privada Brevo', - 'send_test_email' => 'Send test email', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Select Label', 'label' => 'Label', 'service' => 'Service', @@ -4170,7 +4170,7 @@ $lang = array( 'one_time_purchases' => 'One time purchases', 'recurring_purchases' => 'Recurring purchases', 'you_might_be_interested_in_following' => 'You might be interested in the following', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No quotes available for download.', 'copyright' => 'Copyright', 'user_created_user' => ':user created :created_user at :time', @@ -5296,6 +5296,7 @@ $lang = array( 'rappen_rounding' => 'Arrodoniment de Rappen', 'rappen_rounding_help' => 'Import rodó a 5 cèntims', 'assign_group' => 'Assigna un grup', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/cs/texts.php b/lang/cs/texts.php index f951f69b88..3423a6b4de 100644 --- a/lang/cs/texts.php +++ b/lang/cs/texts.php @@ -2198,7 +2198,7 @@ $lang = array( 'mailgun_private_key' => 'Mailgun Private Key', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'Odeslat zkušební e-mail', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Vybrat štítek', 'label' => 'Štítek', 'service' => 'Služba', @@ -4171,7 +4171,7 @@ $lang = array( 'one_time_purchases' => 'Jednorázové nákupy', 'recurring_purchases' => 'Pravidelné nákupy', 'you_might_be_interested_in_following' => 'Mohlo by vás zajímat', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No quotes available for download.', 'copyright' => 'Copyright', 'user_created_user' => ':user vytvořil uživatgele :created_user v :time', @@ -5296,6 +5296,8 @@ $lang = array( 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', 'rappen_rounding' => 'Rappen Rounding', 'rappen_rounding_help' => 'Round amount to 5 cents', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/da/texts.php b/lang/da/texts.php index 436c108256..7b3c4fa0fb 100644 --- a/lang/da/texts.php +++ b/lang/da/texts.php @@ -2196,7 +2196,7 @@ $lang = array( 'mailgun_private_key' => 'Mailgun privat nøgle', 'brevo_domain' => 'Brevo domæne', 'brevo_private_key' => 'Brevo privat nøgle', - 'send_test_email' => 'Send test e-mail', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Vælg Label', 'label' => 'Etiket', 'service' => 'Service', @@ -4169,7 +4169,7 @@ $lang = array( 'one_time_purchases' => 'Engangskøb', 'recurring_purchases' => 'Gentagen indkøb', 'you_might_be_interested_in_following' => 'Du kan være interesseret i følgende', - 'quotes_with_status_sent_can_be_approved' => 'Kun citater med "Sendt"-status kan være Godkendt .', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'Ingen tilbud tilgængelige for download.', 'copyright' => 'ophavsret', 'user_created_user' => ':user oprettet :created_user på :time', @@ -5295,6 +5295,7 @@ $lang = array( 'rappen_rounding' => 'Rappen afrunding', 'rappen_rounding_help' => 'Rund Beløb til 5 øre', 'assign_group' => 'Tildel gruppe', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/de/texts.php b/lang/de/texts.php index c64e3770f3..1c1a2dadeb 100644 --- a/lang/de/texts.php +++ b/lang/de/texts.php @@ -2198,7 +2198,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'mailgun_private_key' => 'Mailgun privater Schlüssel', 'brevo_domain' => 'Brevo-Domäne', 'brevo_private_key' => 'Privater Brevo-Schlüssel', - 'send_test_email' => 'Test-E-Mail verschicken', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Bezeichnung wählen', 'label' => 'Label', 'service' => 'Leistung', @@ -4172,7 +4172,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'one_time_purchases' => 'Einmalzahlungen', 'recurring_purchases' => 'Wiederkehrende Käufe', 'you_might_be_interested_in_following' => 'Das könnte Sie interessieren', - 'quotes_with_status_sent_can_be_approved' => 'Nur Angebote mit dem Status "Gesendet" können genehmigt werden.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'Keine Angebote zum Herunterladen verfügbar.', 'copyright' => 'Copyright', 'user_created_user' => ':user erstellt :created_user zu :time', @@ -5300,6 +5300,7 @@ Leistungsempfängers', 'rappen_rounding' => 'Rappenrundung', 'rappen_rounding_help' => 'Betrag auf 5 Cent aufrunden', 'assign_group' => 'Gruppe zuweisen', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/el/texts.php b/lang/el/texts.php index 2754f67933..025735402c 100644 --- a/lang/el/texts.php +++ b/lang/el/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Επιτυχής διαγραφή λογότυπου', 'sent_message' => 'Επιτυχής αποστολή μηνύματος', 'invoice_error' => 'Παρακαλώ σιγουρευτείτε ότι επιλέξατε ένα πελάτη και διορθώσατε τυχόν σφάλματα', - 'limit_clients' => 'Sorry, this will exceed the limit of :count clients. Please upgrade to a paid plan.', + 'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!.', 'payment_error' => 'Προέκυψε ένα σφάλμα κατά τη διαδικασία της πληρωμής. Παρακαλώ, δοκιμάστε ξανά σε λίγο.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Παρακαλώ επιβεβαιώστε τη διεύθυνση email, :link για να ξαναστείλετε το email επιβεβαίωσης.', @@ -2197,7 +2197,7 @@ $lang = array( 'mailgun_private_key' => 'Ιδιωτικό Κλειδί Mailgun', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'Αποστολή δοκιμαστικού email', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Επιλογή Ετικέτας', 'label' => 'Ετικέτα', 'service' => 'Υπηρεσία', @@ -4170,7 +4170,7 @@ $lang = array( 'one_time_purchases' => 'One time purchases', 'recurring_purchases' => 'Recurring purchases', 'you_might_be_interested_in_following' => 'You might be interested in the following', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No quotes available for download.', 'copyright' => 'Copyright', 'user_created_user' => ':user created :created_user at :time', @@ -5277,8 +5277,6 @@ $lang = array( 'accept_payments_online' => 'Accept Payments Online', 'all_payment_gateways' => 'View all payment gateways', 'product_cost' => 'Product cost', - 'enable_rappen_roudning' => 'Enable Rappen Rounding', - 'enable_rappen_rounding_help' => 'Rounds totals to nearest 5', 'duration_words' => 'Duration in words', 'upcoming_recurring_invoices' => 'Upcoming Recurring Invoices', 'shipping_country_id' => 'Shipping Country', @@ -5292,6 +5290,13 @@ $lang = array( 'e_credit' => 'E-Credit', 'e_purchase_order' => 'E-Purchase Order', 'e_quote_type' => 'E-Quote Type', + 'unlock_unlimited_clients' => 'Please upgrade to unlock unlimited clients!', + 'download_e_purchase_order' => 'Download E-Purchase Order', + 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', + 'rappen_rounding' => 'Rappen Rounding', + 'rappen_rounding_help' => 'Round amount to 5 cents', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/en/texts.php b/lang/en/texts.php index 970d5f6c83..ddaefd6017 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -4029,7 +4029,7 @@ $lang = array( 'user_detached' => 'User detached from company', 'create_webhook_failure' => 'Failed to create Webhook', 'payment_message_extended' => 'Thank you for your payment of :amount for :invoice', - 'online_payments_minimum_note' => 'Note: Online payments are supported only if amount is bigger than $1 or currency equivalent.', + 'online_payments_minimum_note' => 'Note: Online payments are supported only if amount is larger than $1 or currency equivalent.', 'payment_token_not_found' => 'Payment token not found, please try again. If an issue still persist, try with another payment method', 'vendor_address1' => 'Vendor Street', 'vendor_address2' => 'Vendor Apt/Suite', @@ -5297,6 +5297,9 @@ $lang = array( 'rappen_rounding_help' => 'Round amount to 5 cents', 'assign_group' => 'Assign group', 'paypal_advanced_cards' => 'Advanced Card Payments', + 'local_domain_help' => 'EHLO domain (optional)', + 'port_help' => 'ie. 25,587,465', + 'host_help' => 'ie. smtp.gmail.com', ); return $lang; diff --git a/lang/es/texts.php b/lang/es/texts.php index f7bc588e50..488ef1cea6 100644 --- a/lang/es/texts.php +++ b/lang/es/texts.php @@ -2196,7 +2196,7 @@ $lang = array( 'mailgun_private_key' => 'Llave Privada de Mailgun', 'brevo_domain' => 'Dominio Brevo', 'brevo_private_key' => 'Clave privada de Brevo', - 'send_test_email' => 'Enviar correo de prueba', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Seleccionar Etiqueta', 'label' => 'Etiqueta', 'service' => 'Servicio', @@ -4169,7 +4169,7 @@ $lang = array( 'one_time_purchases' => 'Compras únicas', 'recurring_purchases' => 'compras recurrentes', 'you_might_be_interested_in_following' => 'Usted podría estar interesado en lo siguiente', - 'quotes_with_status_sent_can_be_approved' => 'Solo se pueden aprobar cotizaciones con estado "Enviado".', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No hay cotizaciones disponibles para descargar.', 'copyright' => 'Derechos de autor', 'user_created_user' => ':user creó :created_user en :time', @@ -5295,6 +5295,7 @@ $lang = array( 'rappen_rounding' => 'Redondeo de rappen', 'rappen_rounding_help' => 'Monto redondo a 5 centavos', 'assign_group' => 'Asignar grupo', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/es_ES/texts.php b/lang/es_ES/texts.php index cb9b256e50..153050804d 100644 --- a/lang/es_ES/texts.php +++ b/lang/es_ES/texts.php @@ -2193,7 +2193,7 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c 'mailgun_private_key' => 'Mailgun Private Key', 'brevo_domain' => 'Dominio Brevo', 'brevo_private_key' => 'Clave privada de Brevo', - 'send_test_email' => 'Enviar email de prueba', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Seleccionar etiqueta', 'label' => 'Etiqueta', 'service' => 'Servicio', @@ -4166,7 +4166,7 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c 'one_time_purchases' => 'Compras únicas', 'recurring_purchases' => 'Pagos recurrentes', 'you_might_be_interested_in_following' => 'Puede que te interese lo siguiente', - 'quotes_with_status_sent_can_be_approved' => 'Solo se pueden aprobar presupuestos con el estado "Enviado".', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No hay presupuestos disponibles para descargar.', 'copyright' => 'Derechos de autor', 'user_created_user' => ':user creó :created_user a las :time', @@ -5292,6 +5292,8 @@ De lo contrario, este campo deberá dejarse en blanco.', 'flutter_web_warning' => 'Recomendamos utilizar la nueva aplicación web o la aplicación de escritorio para obtener el mejor rendimiento.', 'rappen_rounding' => 'Redondeo de rappen', 'rappen_rounding_help' => 'Cantidad redonda a 5 centimos', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/et/texts.php b/lang/et/texts.php index d60bb461d8..0db32759e3 100644 --- a/lang/et/texts.php +++ b/lang/et/texts.php @@ -200,7 +200,7 @@ $lang = array( 'removed_logo' => 'Logo edukalt eemaldatud', 'sent_message' => 'Sõnum edukalt saadetud', 'invoice_error' => 'Valige kindlasti klient ja parandage kõik vead', - 'limit_clients' => 'Sorry, this will exceed the limit of :count clients. Please upgrade to a paid plan.', + 'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!.', 'payment_error' => 'Teie makse töötlemisel ilmnes viga. Palun proovi hiljem uuesti.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Palun kinnitage oma meiliaadress, :link kinnitusmeili uuesti saatmiseks.', @@ -2197,7 +2197,7 @@ $lang = array( 'mailgun_private_key' => 'Mailgun Privaatvõti', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'Saada test e-kiri', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Vali Silt', 'label' => 'Silt', 'service' => 'Teenus', @@ -4170,7 +4170,7 @@ $lang = array( 'one_time_purchases' => 'Ühekordsed ostud', 'recurring_purchases' => 'Korduvad ostud', 'you_might_be_interested_in_following' => 'Teid võib huvitada järgmine', - 'quotes_with_status_sent_can_be_approved' => 'Kinnitada saab ainult hinnapakkumisi, mille olek on "Saadetud".', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'Hinapakkumist pole võimalik alla laadida', 'copyright' => 'Autoriõigus', 'user_created_user' => ':user lõi kasutaja :created_user kell :time', @@ -5277,8 +5277,6 @@ $lang = array( 'accept_payments_online' => 'Accept Payments Online', 'all_payment_gateways' => 'View all payment gateways', 'product_cost' => 'Product cost', - 'enable_rappen_roudning' => 'Enable Rappen Rounding', - 'enable_rappen_rounding_help' => 'Rounds totals to nearest 5', 'duration_words' => 'Duration in words', 'upcoming_recurring_invoices' => 'Upcoming Recurring Invoices', 'shipping_country_id' => 'Shipping Country', @@ -5292,6 +5290,13 @@ $lang = array( 'e_credit' => 'E-Credit', 'e_purchase_order' => 'E-Purchase Order', 'e_quote_type' => 'E-Quote Type', + 'unlock_unlimited_clients' => 'Please upgrade to unlock unlimited clients!', + 'download_e_purchase_order' => 'Download E-Purchase Order', + 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', + 'rappen_rounding' => 'Rappen Rounding', + 'rappen_rounding_help' => 'Round amount to 5 cents', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/fa/texts.php b/lang/fa/texts.php index e8359be163..c07313ce65 100644 --- a/lang/fa/texts.php +++ b/lang/fa/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Successfully removed logo', 'sent_message' => 'Successfully sent message', 'invoice_error' => 'Please make sure to select a client and correct any errors', - 'limit_clients' => 'Sorry, this will exceed the limit of :count clients. Please upgrade to a paid plan.', + 'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!.', 'payment_error' => 'There was an error processing your payment. Please try again later.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Please confirm your email address, :link to resend the confirmation email.', @@ -2197,7 +2197,7 @@ $lang = array( 'mailgun_private_key' => 'Mailgun Private Key', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'Send test email', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Select Label', 'label' => 'Label', 'service' => 'Service', @@ -4170,7 +4170,7 @@ $lang = array( 'one_time_purchases' => 'One time purchases', 'recurring_purchases' => 'Recurring purchases', 'you_might_be_interested_in_following' => 'You might be interested in the following', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No quotes available for download.', 'copyright' => 'Copyright', 'user_created_user' => ':user created :created_user at :time', @@ -5277,8 +5277,6 @@ $lang = array( 'accept_payments_online' => 'Accept Payments Online', 'all_payment_gateways' => 'View all payment gateways', 'product_cost' => 'Product cost', - 'enable_rappen_roudning' => 'Enable Rappen Rounding', - 'enable_rappen_rounding_help' => 'Rounds totals to nearest 5', 'duration_words' => 'Duration in words', 'upcoming_recurring_invoices' => 'Upcoming Recurring Invoices', 'shipping_country_id' => 'Shipping Country', @@ -5292,6 +5290,13 @@ $lang = array( 'e_credit' => 'E-Credit', 'e_purchase_order' => 'E-Purchase Order', 'e_quote_type' => 'E-Quote Type', + 'unlock_unlimited_clients' => 'Please upgrade to unlock unlimited clients!', + 'download_e_purchase_order' => 'Download E-Purchase Order', + 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', + 'rappen_rounding' => 'Rappen Rounding', + 'rappen_rounding_help' => 'Round amount to 5 cents', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/fi/texts.php b/lang/fi/texts.php index ac4cd5bbe6..6c1c6174df 100644 --- a/lang/fi/texts.php +++ b/lang/fi/texts.php @@ -2197,7 +2197,7 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta 'mailgun_private_key' => 'Mailgun Private Key', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'lähetä testisähköposti', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Valitse kenttä', 'label' => 'Label', 'service' => 'Service', @@ -4170,7 +4170,7 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta 'one_time_purchases' => 'One time purchases', 'recurring_purchases' => 'Recurring purchases', 'you_might_be_interested_in_following' => 'You might be interested in the following', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No quotes available for download.', 'copyright' => 'Copyright', 'user_created_user' => ':user created :created_user at :time', @@ -5295,6 +5295,8 @@ Kun saat summat, palaa tälle maksutapasivulle ja klikkaa "Saata loppuun todenta 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', 'rappen_rounding' => 'Rappen Rounding', 'rappen_rounding_help' => 'Round amount to 5 cents', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/fr/texts.php b/lang/fr/texts.php index 038542936b..16d27ea6d3 100644 --- a/lang/fr/texts.php +++ b/lang/fr/texts.php @@ -2197,7 +2197,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'mailgun_private_key' => 'Mailgun Private Key', 'brevo_domain' => 'Domaine de Brevo', 'brevo_private_key' => 'Clé privée Brevo', - 'send_test_email' => 'Envoyer un courriel de test', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Sélectionnez le label', 'label' => 'Intitulé', 'service' => 'Service', @@ -4170,7 +4170,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'one_time_purchases' => 'Achat une fois seulement', 'recurring_purchases' => 'Achat récurrent', 'you_might_be_interested_in_following' => 'Ceci pourrait vous intéresser', - 'quotes_with_status_sent_can_be_approved' => 'Seuls les devis avec le statut "Envoyé" peuvent être approuvés.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'Aucun devis disponible au téléchargement.', 'copyright' => 'droits d\'auteur', 'user_created_user' => ':user a créé :created_user à :time', @@ -5296,6 +5296,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'rappen_rounding' => 'Arrondi de Rappen', 'rappen_rounding_help' => 'Montant rond à 5 centimes', 'assign_group' => 'Attribuer un groupe', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/fr_CA/texts.php b/lang/fr_CA/texts.php index d9b7418b35..013f171057 100644 --- a/lang/fr_CA/texts.php +++ b/lang/fr_CA/texts.php @@ -4167,7 +4167,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'one_time_purchases' => 'Achat définitif', 'recurring_purchases' => 'Achat récurrent', 'you_might_be_interested_in_following' => 'Ceci pourrait vous intéresser', - 'quotes_with_status_sent_can_be_approved' => 'Seules les soumissions avec l\'état "Envoyée" peuvent être approuvées', + 'quotes_with_status_sent_can_be_approved' => 'Seules les soumission avec l\'état "Envoyée" peuvent être approuvées. Les soumission expires ne peuvent pas être approuvées.', 'no_quotes_available_for_download' => 'Aucune soumission disponible pour le téléchargement.', 'copyright' => 'Droits d\'auteur', 'user_created_user' => ':user a créé :created_user à :time', @@ -5293,6 +5293,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'rappen_rounding' => 'Arrondir au cents', 'rappen_rounding_help' => 'Arrondir au 5 cents', 'assign_group' => 'Assigner un groupe', + 'paypal_advanced_cards' => 'Paiements avancés pour carte', ); return $lang; diff --git a/lang/fr_CH/texts.php b/lang/fr_CH/texts.php index 9108b92fc8..748f848f6b 100644 --- a/lang/fr_CH/texts.php +++ b/lang/fr_CH/texts.php @@ -2194,7 +2194,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'mailgun_private_key' => 'Clé privée Mailgun', 'brevo_domain' => 'Domaine de Brevo', 'brevo_private_key' => 'Clé privée Brevo', - 'send_test_email' => 'Envoyer un courriel test', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Sélectionnez le libellé', 'label' => 'Libellé', 'service' => 'Service', @@ -4167,7 +4167,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'one_time_purchases' => 'Achat définitif', 'recurring_purchases' => 'Achat récurrent', 'you_might_be_interested_in_following' => 'Ceci pourrait vous intéresser', - 'quotes_with_status_sent_can_be_approved' => 'Seulement les soumissions avant la mention envoyé peuvent être approuvé.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'Aucune offre disponible pour le téléchargement.', 'copyright' => 'Droits d\'auteur', 'user_created_user' => ':user a créé :created_user à :time', @@ -5293,6 +5293,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'rappen_rounding' => 'Arrondi de Rappen', 'rappen_rounding_help' => 'Montant rond à 5 centimes', 'assign_group' => 'Attribuer un groupe', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/he/texts.php b/lang/he/texts.php index 248ad51fc8..31c19c8941 100644 --- a/lang/he/texts.php +++ b/lang/he/texts.php @@ -2195,7 +2195,7 @@ $lang = array( 'mailgun_private_key' => 'Mailgun Private Key', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'מפתח פרטי Brevo', - 'send_test_email' => 'Send test email', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Select Label', 'label' => 'Label', 'service' => 'Service', @@ -4168,7 +4168,7 @@ $lang = array( 'one_time_purchases' => 'רכישות חד פעמיות', 'recurring_purchases' => 'רכישות חוזרות', 'you_might_be_interested_in_following' => 'אולי יעניין אותך בדברים הבאים', - 'quotes_with_status_sent_can_be_approved' => 'ניתן לאשר רק ציטוטים בסטטוס "נשלח".', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'אין הצעות מחיר זמינות להורדה.', 'copyright' => 'זכויות יוצרים', 'user_created_user' => ':user נוצר :created_user ב-:time', @@ -5294,6 +5294,7 @@ $lang = array( 'rappen_rounding' => 'עיגול רפן', 'rappen_rounding_help' => 'סכום עגול עד 5 סנט', 'assign_group' => 'הקצה קבוצה', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/hr/texts.php b/lang/hr/texts.php index 59c44ded52..56a7db783f 100644 --- a/lang/hr/texts.php +++ b/lang/hr/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Logo je uspješno uklonjen', 'sent_message' => 'Poruka je uspješno poslana', 'invoice_error' => 'Molimo provjerite da odaberete klijenta i korigirate greške', - 'limit_clients' => 'Sorry, this will exceed the limit of :count clients. Please upgrade to a paid plan.', + 'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!.', 'payment_error' => 'Došlo je do greške pri procesuiranju vaše uplate. Molimo pokušajte kasnije.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Please confirm your email address, :link to resend the confirmation email.', @@ -2198,7 +2198,7 @@ Nevažeći kontakt email', 'mailgun_private_key' => 'Mailgun Private Key', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'Send test email', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Select Label', 'label' => 'Label', 'service' => 'Service', @@ -4171,7 +4171,7 @@ Nevažeći kontakt email', 'one_time_purchases' => 'One time purchases', 'recurring_purchases' => 'Recurring purchases', 'you_might_be_interested_in_following' => 'You might be interested in the following', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No quotes available for download.', 'copyright' => 'Copyright', 'user_created_user' => ':user created :created_user at :time', @@ -5278,8 +5278,6 @@ Nevažeći kontakt email', 'accept_payments_online' => 'Accept Payments Online', 'all_payment_gateways' => 'View all payment gateways', 'product_cost' => 'Product cost', - 'enable_rappen_roudning' => 'Enable Rappen Rounding', - 'enable_rappen_rounding_help' => 'Rounds totals to nearest 5', 'duration_words' => 'Duration in words', 'upcoming_recurring_invoices' => 'Upcoming Recurring Invoices', 'shipping_country_id' => 'Shipping Country', @@ -5293,6 +5291,13 @@ Nevažeći kontakt email', 'e_credit' => 'E-Credit', 'e_purchase_order' => 'E-Purchase Order', 'e_quote_type' => 'E-Quote Type', + 'unlock_unlimited_clients' => 'Please upgrade to unlock unlimited clients!', + 'download_e_purchase_order' => 'Download E-Purchase Order', + 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', + 'rappen_rounding' => 'Rappen Rounding', + 'rappen_rounding_help' => 'Round amount to 5 cents', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/hu/texts.php b/lang/hu/texts.php index 55d22a6907..dea3c16eed 100644 --- a/lang/hu/texts.php +++ b/lang/hu/texts.php @@ -2181,7 +2181,7 @@ adva :date', 'mailgun_private_key' => 'Mailgun privát kulcs', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo privát kulcs', - 'send_test_email' => 'Teszt e-mail küldése', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Címke kiválasztása', 'label' => 'Címke', 'service' => 'Szolgáltatás', @@ -4154,7 +4154,7 @@ adva :date', 'one_time_purchases' => 'Egyszeri vásárlások', 'recurring_purchases' => 'Ismétlődő vásárlások', 'you_might_be_interested_in_following' => 'Lehet, hogy érdekli a következő', - 'quotes_with_status_sent_can_be_approved' => 'Az elküldött státuszú idézetek jóváhagyhatók', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'Nincs letölthető idézet', 'copyright' => 'Szerzői jog', 'user_created_user' => 'Felhasználó létrehozott felhasználót', @@ -5280,6 +5280,7 @@ adva :date', 'rappen_rounding' => 'Rappen kerekítés', 'rappen_rounding_help' => 'Kerek összeg 5 cent', 'assign_group' => 'Csoport hozzárendelése', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/it/texts.php b/lang/it/texts.php index 62e6ee4022..73a6897648 100644 --- a/lang/it/texts.php +++ b/lang/it/texts.php @@ -2188,7 +2188,7 @@ $lang = array( 'mailgun_private_key' => 'Chiave privata Mailgun', 'brevo_domain' => 'Dominio Brevo', 'brevo_private_key' => 'Chiave privata Brevo', - 'send_test_email' => 'Invia email di test', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Seleziona etichetta', 'label' => 'Etichetta', 'service' => 'Servizio', @@ -4161,7 +4161,7 @@ $lang = array( 'one_time_purchases' => 'Acquisti singoli', 'recurring_purchases' => 'Acquisti ricorrenti', 'you_might_be_interested_in_following' => 'Potresti essere interessato a quanto segue', - 'quotes_with_status_sent_can_be_approved' => 'Solo i preventivi in stato "inviato" possono essere approvati.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'Nessuna citazione disponibile per il download.', 'copyright' => 'Copyright', 'user_created_user' => ':user creato :created_user a :time', @@ -5287,6 +5287,7 @@ $lang = array( 'rappen_rounding' => 'Arrotondamento rapido', 'rappen_rounding_help' => 'Ammontare tondo a 5 centesimi', 'assign_group' => 'Assegna gruppo', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/km_KH/texts.php b/lang/km_KH/texts.php index 3c4a5c50f3..2e92ffd91c 100644 --- a/lang/km_KH/texts.php +++ b/lang/km_KH/texts.php @@ -2177,7 +2177,7 @@ $lang = array( 'mailgun_private_key' => 'សោឯកជន Mailgun', 'brevo_domain' => 'ដែន Brevo', 'brevo_private_key' => 'សោឯកជន Brevo', - 'send_test_email' => 'ផ្ញើអ៊ីមែលសាកល្បង', + 'send_test_email' => 'Send Test Email', 'select_label' => 'ជ្រើសរើសស្លាក', 'label' => 'ស្លាក​សញ្ញា', 'service' => 'សេវាកម្ម', @@ -4150,7 +4150,7 @@ $lang = array( 'one_time_purchases' => 'ការទិញតែម្តង', 'recurring_purchases' => 'ការទិញដដែលៗ', 'you_might_be_interested_in_following' => 'អ្នក​ប្រហែល​ជា​ចាប់​អារម្មណ៍​នឹង​ចំណុច​ខាង​ក្រោម', - 'quotes_with_status_sent_can_be_approved' => 'មានតែសម្រង់ដែលមានស្ថានភាព "បានផ្ញើ" ប៉ុណ្ណោះដែលអាចយល់ព្រមបាន។', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'មិនមានសម្រង់សម្រាប់ទាញយកទេ។', 'copyright' => 'រក្សាសិទ្ធិ', 'user_created_user' => ':user បានបង្កើត :created_user នៅ :time', @@ -5276,6 +5276,7 @@ $lang = array( 'rappen_rounding' => 'Rappen Rounding', 'rappen_rounding_help' => 'ចំនួនទឹកប្រាក់ជុំដល់ 5 សេន', 'assign_group' => 'ចាត់តាំងក្រុម', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/lo_LA/texts.php b/lang/lo_LA/texts.php index fc5e4e77b9..a2c6a5da83 100644 --- a/lang/lo_LA/texts.php +++ b/lang/lo_LA/texts.php @@ -2197,7 +2197,7 @@ $lang = array( 'mailgun_private_key' => 'ກະແຈສ່ວນຕົວຂອງ Mailgun', 'brevo_domain' => 'ໂດເມນ Brevo', 'brevo_private_key' => 'ກະແຈສ່ວນຕົວ Brevo', - 'send_test_email' => 'ສົ່ງອີເມວທົດສອບ', + 'send_test_email' => 'Send Test Email', 'select_label' => 'ເລືອກປ້າຍກຳກັບ', 'label' => 'ປ້າຍກຳກັບ', 'service' => 'ບໍລິການ', @@ -4170,7 +4170,7 @@ $lang = array( 'one_time_purchases' => 'ຊື້ຄັ້ງດຽວ', 'recurring_purchases' => 'ການຊື້ຊໍ້າ', 'you_might_be_interested_in_following' => 'ເຈົ້າອາດຈະສົນໃຈສິ່ງຕໍ່ໄປນີ້', - 'quotes_with_status_sent_can_be_approved' => 'ພຽງແຕ່ວົງຢືມທີ່ມີສະຖານະ "ສົ່ງ" ສາມາດອະນຸມັດໄດ້.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'ບໍ່ມີວົງຢືມທີ່ສາມາດດາວໂຫລດໄດ້.', 'copyright' => 'ລິຂະສິດ', 'user_created_user' => ':ຜູ້ໃຊ້ສ້າງ :created_user at :time', @@ -5296,6 +5296,7 @@ $lang = array( 'rappen_rounding' => 'Rappen Rounding', 'rappen_rounding_help' => 'ຈໍານວນຮອບເປັນ 5 ເຊັນ', 'assign_group' => 'ກຳນົດກຸ່ມ', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/lv_LV/texts.php b/lang/lv_LV/texts.php index 87ce8813f4..b0a80cbf4f 100644 --- a/lang/lv_LV/texts.php +++ b/lang/lv_LV/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Veiksmīgi noņemts logotips', 'sent_message' => 'Veiksmīgi nosūtīts ziņojums', 'invoice_error' => 'Please make sure to select a client and correct any errors', - 'limit_clients' => 'Sorry, this will exceed the limit of :count clients. Please upgrade to a paid plan.', + 'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!.', 'payment_error' => 'There was an error processing your payment. Please try again later.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Please confirm your email address, :link to resend the confirmation email.', @@ -2197,7 +2197,7 @@ $lang = array( 'mailgun_private_key' => 'Mailgun Private Key', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'Send test email', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Select Label', 'label' => 'Label', 'service' => 'Serviss', @@ -4170,7 +4170,7 @@ $lang = array( 'one_time_purchases' => 'One time purchases', 'recurring_purchases' => 'Recurring purchases', 'you_might_be_interested_in_following' => 'You might be interested in the following', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No quotes available for download.', 'copyright' => 'Copyright', 'user_created_user' => ':user created :created_user at :time', @@ -5277,8 +5277,6 @@ $lang = array( 'accept_payments_online' => 'Accept Payments Online', 'all_payment_gateways' => 'View all payment gateways', 'product_cost' => 'Product cost', - 'enable_rappen_roudning' => 'Enable Rappen Rounding', - 'enable_rappen_rounding_help' => 'Rounds totals to nearest 5', 'duration_words' => 'Duration in words', 'upcoming_recurring_invoices' => 'Upcoming Recurring Invoices', 'shipping_country_id' => 'Shipping Country', @@ -5292,6 +5290,13 @@ $lang = array( 'e_credit' => 'E-Credit', 'e_purchase_order' => 'E-Purchase Order', 'e_quote_type' => 'E-Quote Type', + 'unlock_unlimited_clients' => 'Please upgrade to unlock unlimited clients!', + 'download_e_purchase_order' => 'Download E-Purchase Order', + 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', + 'rappen_rounding' => 'Rappen Rounding', + 'rappen_rounding_help' => 'Round amount to 5 cents', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/mk_MK/texts.php b/lang/mk_MK/texts.php index 89f9ab9d67..59e8fc47c9 100644 --- a/lang/mk_MK/texts.php +++ b/lang/mk_MK/texts.php @@ -200,7 +200,7 @@ $lang = array( 'removed_logo' => 'Успешно отстранување на лого', 'sent_message' => 'Успешно пратена порака', 'invoice_error' => 'Ве молиме одберете клиент и поправете можни грешки', - 'limit_clients' => 'Sorry, this will exceed the limit of :count clients. Please upgrade to a paid plan.', + 'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!.', 'payment_error' => 'Има грешка при процесирањето на плаќањето. Ве молиме обидете се повторно подоцна.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Ве молиме потврдете ја Вашата адреса за е-пошта, :link за повторно испраќање на е-пошта за потврда.', @@ -2198,7 +2198,7 @@ $lang = array( 'mailgun_private_key' => 'Mailgun приватен клуч', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'Прати тест е-пошта', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Избери назнака', 'label' => 'Назнака', 'service' => 'Услуга', @@ -4171,7 +4171,7 @@ $lang = array( 'one_time_purchases' => 'One time purchases', 'recurring_purchases' => 'Recurring purchases', 'you_might_be_interested_in_following' => 'You might be interested in the following', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No quotes available for download.', 'copyright' => 'Copyright', 'user_created_user' => ':user created :created_user at :time', @@ -5278,8 +5278,6 @@ $lang = array( 'accept_payments_online' => 'Accept Payments Online', 'all_payment_gateways' => 'View all payment gateways', 'product_cost' => 'Product cost', - 'enable_rappen_roudning' => 'Enable Rappen Rounding', - 'enable_rappen_rounding_help' => 'Rounds totals to nearest 5', 'duration_words' => 'Duration in words', 'upcoming_recurring_invoices' => 'Upcoming Recurring Invoices', 'shipping_country_id' => 'Shipping Country', @@ -5293,6 +5291,13 @@ $lang = array( 'e_credit' => 'E-Credit', 'e_purchase_order' => 'E-Purchase Order', 'e_quote_type' => 'E-Quote Type', + 'unlock_unlimited_clients' => 'Please upgrade to unlock unlimited clients!', + 'download_e_purchase_order' => 'Download E-Purchase Order', + 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', + 'rappen_rounding' => 'Rappen Rounding', + 'rappen_rounding_help' => 'Round amount to 5 cents', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/nb_NO/texts.php b/lang/nb_NO/texts.php index aa2874d0ae..e7ad9200e0 100644 --- a/lang/nb_NO/texts.php +++ b/lang/nb_NO/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Logoen ble fjernet', 'sent_message' => 'Melding ble sendt', 'invoice_error' => 'Vennligst sørg for å velge en kunde og rette eventuelle feil', - 'limit_clients' => 'Sorry, this will exceed the limit of :count clients. Please upgrade to a paid plan.', + 'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!.', 'payment_error' => 'Det oppstod en feil under din betaling. Vennligst prøv igjen senere.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Vennligst bekreft e-postadressen din, :link for å sende bekreftelses-e-posten på nytt.', @@ -2197,7 +2197,7 @@ $lang = array( 'mailgun_private_key' => 'Mailgun Privat Nøkkel', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'Send test-e-post', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Select Label', 'label' => 'Label', 'service' => 'Service', @@ -4170,7 +4170,7 @@ $lang = array( 'one_time_purchases' => 'One time purchases', 'recurring_purchases' => 'Recurring purchases', 'you_might_be_interested_in_following' => 'You might be interested in the following', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No quotes available for download.', 'copyright' => 'Copyright', 'user_created_user' => ':user created :created_user at :time', @@ -5277,8 +5277,6 @@ $lang = array( 'accept_payments_online' => 'Accept Payments Online', 'all_payment_gateways' => 'View all payment gateways', 'product_cost' => 'Product cost', - 'enable_rappen_roudning' => 'Enable Rappen Rounding', - 'enable_rappen_rounding_help' => 'Rounds totals to nearest 5', 'duration_words' => 'Duration in words', 'upcoming_recurring_invoices' => 'Upcoming Recurring Invoices', 'shipping_country_id' => 'Shipping Country', @@ -5292,6 +5290,13 @@ $lang = array( 'e_credit' => 'E-Credit', 'e_purchase_order' => 'E-Purchase Order', 'e_quote_type' => 'E-Quote Type', + 'unlock_unlimited_clients' => 'Please upgrade to unlock unlimited clients!', + 'download_e_purchase_order' => 'Download E-Purchase Order', + 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', + 'rappen_rounding' => 'Rappen Rounding', + 'rappen_rounding_help' => 'Round amount to 5 cents', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/nl/texts.php b/lang/nl/texts.php index a4fcc1f02e..d28699596f 100644 --- a/lang/nl/texts.php +++ b/lang/nl/texts.php @@ -2194,7 +2194,7 @@ Kom terug naar deze betalingsmethode pagina zodra u de bedragen heeft ontvangen 'mailgun_private_key' => 'Mailgun privésleutel', 'brevo_domain' => 'Brevo-domein', 'brevo_private_key' => 'Brevo-privésleutel', - 'send_test_email' => 'Verstuur test-e-mail', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Selecteer label', 'label' => 'Label', 'service' => 'Service', @@ -4170,7 +4170,7 @@ Email: :email
', 'one_time_purchases' => 'Eenmalige aankopen', 'recurring_purchases' => 'Terugkerende aankopen', 'you_might_be_interested_in_following' => 'Misschien bent u geïnteresseerd in het volgende', - 'quotes_with_status_sent_can_be_approved' => 'Alleen offertes met de status "Verzonden" kunnen worden goedgekeurd.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'Geen offertes beschikbaar om te downloaden.', 'copyright' => 'Copyright', 'user_created_user' => ':user heeft :created_user aangemaakt om :time', @@ -5296,6 +5296,7 @@ Email: :email
', 'rappen_rounding' => 'Rappenafronding', 'rappen_rounding_help' => 'Rond het bedrag af op 5 cent', 'assign_group' => 'Groep toewijzen', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/pl/texts.php b/lang/pl/texts.php index 1dc4f30fdb..778c05b550 100644 --- a/lang/pl/texts.php +++ b/lang/pl/texts.php @@ -2195,7 +2195,7 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik 'mailgun_private_key' => 'Klucz prywatny Mailgun', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'Wyślij wiadomość testową', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Wybierz etykietę', 'label' => 'Etykieta', 'service' => 'Usługa', @@ -4168,7 +4168,7 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik 'one_time_purchases' => 'One time purchases', 'recurring_purchases' => 'Recurring purchases', 'you_might_be_interested_in_following' => 'You might be interested in the following', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'Brak ofert do pobrania.', 'copyright' => 'Copyright', 'user_created_user' => ':user created :created_user at :time', @@ -5293,6 +5293,8 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', 'rappen_rounding' => 'Rappen Rounding', 'rappen_rounding_help' => 'Round amount to 5 cents', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/pt_BR/texts.php b/lang/pt_BR/texts.php index d8bf4b5a26..077fbe4bce 100644 --- a/lang/pt_BR/texts.php +++ b/lang/pt_BR/texts.php @@ -2194,7 +2194,7 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique " 'mailgun_private_key' => 'Chave Privada do Mailgun', 'brevo_domain' => 'Domínio Brevo', 'brevo_private_key' => 'Chave privada Brevo', - 'send_test_email' => 'Enviar email de teste', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Selecione o Rótulo', 'label' => 'Rótulo', 'service' => 'Serviço', @@ -4167,7 +4167,7 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique " 'one_time_purchases' => 'Compras únicas', 'recurring_purchases' => 'Compras recorrentes', 'you_might_be_interested_in_following' => 'Você pode estar interessado no seguinte', - 'quotes_with_status_sent_can_be_approved' => 'Somente cotações com status "Enviado" poderão ser aprovadas.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'Não há cotações disponíveis para download.', 'copyright' => 'direito autoral', 'user_created_user' => ':user criou :created_user em :time', @@ -5293,6 +5293,7 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique " 'rappen_rounding' => 'Arredondamento de Rappen', 'rappen_rounding_help' => 'Montante redondo para 5 centavos', 'assign_group' => 'Atribuir grupo', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/pt_PT/texts.php b/lang/pt_PT/texts.php index 152d63d220..116e3887dd 100644 --- a/lang/pt_PT/texts.php +++ b/lang/pt_PT/texts.php @@ -2195,7 +2195,7 @@ Quando tiver os valores dos depósitos, volte a esta página e conclua a verific 'mailgun_private_key' => 'Chave Privada do Mailgun', 'brevo_domain' => 'Domínio Brevo', 'brevo_private_key' => 'Chave privada Brevo', - 'send_test_email' => 'Enviar e-mail de teste', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Selecione a Legenda', 'label' => 'Legenda', 'service' => 'Serviço', @@ -4169,7 +4169,7 @@ debitar da sua conta de acordo com essas instruções. Está elegível a um reem 'one_time_purchases' => 'Compras únicas', 'recurring_purchases' => 'Compras recorrentes', 'you_might_be_interested_in_following' => 'Pode estar interessado no seguinte', - 'quotes_with_status_sent_can_be_approved' => 'Apenas os orçamentos com o estado "Enviado" podem ser aprovados.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'Nenhum orçamento disponível para transferência', 'copyright' => 'Copyright', 'user_created_user' => ':user criado :created_user em :time', @@ -5296,6 +5296,7 @@ O envio de E-mails foi suspenso. Será retomado às 23:00 UTC.', 'rappen_rounding' => 'Arredondamento de Rappen', 'rappen_rounding_help' => 'Montante redondo para 5 centavos', 'assign_group' => 'Atribuir grupo', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/ro/texts.php b/lang/ro/texts.php index f12c9396cd..4b62393e37 100644 --- a/lang/ro/texts.php +++ b/lang/ro/texts.php @@ -2197,7 +2197,7 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl 'mailgun_private_key' => 'Cheie privată Mailgun', 'brevo_domain' => 'Domeniul Brevo', 'brevo_private_key' => 'Cheie privată Brevo', - 'send_test_email' => 'Trimiteți un email de test', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Selectați eticheta', 'label' => 'Etichetă', 'service' => 'Serviciu', @@ -4171,7 +4171,7 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl 'one_time_purchases' => 'Achiziții unice', 'recurring_purchases' => 'Achiziții recurente', 'you_might_be_interested_in_following' => 'S-ar putea să vă intereseze și', - 'quotes_with_status_sent_can_be_approved' => 'Doar ofertele marcate ca „Trimise” pot fi aprovate.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'Nu există oferte pregătite pentru descărcare.', 'copyright' => 'Copyright', 'user_created_user' => ':user a creat :created_user la :time', @@ -5297,6 +5297,7 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl 'rappen_rounding' => 'Rappen rotunjire', 'rappen_rounding_help' => 'Suma rotundă la 5 cenți', 'assign_group' => 'Atribuiți grup', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/ru_RU/texts.php b/lang/ru_RU/texts.php index db7666115a..935fcf1855 100644 --- a/lang/ru_RU/texts.php +++ b/lang/ru_RU/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Логотип успешно удалён', 'sent_message' => 'Сообщение успешно отправлено', 'invoice_error' => 'Обязательно выберите клиента и исправьте ошибки.', - 'limit_clients' => 'Sorry, this will exceed the limit of :count clients. Please upgrade to a paid plan.', + 'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!.', 'payment_error' => 'Произошла ошибка при обработке вашего платежа. Пожалуйста, повторите попытку позже.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Пожалуйста, подтвердите свой адрес электронной почты, :link, чтобы отправить письмо с подтверждением ещё раз.', @@ -2198,7 +2198,7 @@ $lang = array( 'mailgun_private_key' => 'Ключ почтовой рассылки', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'Отправить тестовое сообщение', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Выбрать ярлык', 'label' => 'Label', 'service' => 'Услуга', @@ -4171,7 +4171,7 @@ $lang = array( 'one_time_purchases' => 'One time purchases', 'recurring_purchases' => 'Recurring purchases', 'you_might_be_interested_in_following' => 'You might be interested in the following', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No quotes available for download.', 'copyright' => 'Copyright', 'user_created_user' => ':user created :created_user at :time', @@ -5278,8 +5278,6 @@ $lang = array( 'accept_payments_online' => 'Accept Payments Online', 'all_payment_gateways' => 'View all payment gateways', 'product_cost' => 'Product cost', - 'enable_rappen_roudning' => 'Enable Rappen Rounding', - 'enable_rappen_rounding_help' => 'Rounds totals to nearest 5', 'duration_words' => 'Duration in words', 'upcoming_recurring_invoices' => 'Upcoming Recurring Invoices', 'shipping_country_id' => 'Shipping Country', @@ -5293,6 +5291,13 @@ $lang = array( 'e_credit' => 'E-Credit', 'e_purchase_order' => 'E-Purchase Order', 'e_quote_type' => 'E-Quote Type', + 'unlock_unlimited_clients' => 'Please upgrade to unlock unlimited clients!', + 'download_e_purchase_order' => 'Download E-Purchase Order', + 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', + 'rappen_rounding' => 'Rappen Rounding', + 'rappen_rounding_help' => 'Round amount to 5 cents', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/sk/texts.php b/lang/sk/texts.php index bb972ec7c7..c2ded8d8e4 100644 --- a/lang/sk/texts.php +++ b/lang/sk/texts.php @@ -2184,7 +2184,7 @@ $lang = array( 'mailgun_private_key' => 'Privátny kľúč Mailgun', 'brevo_domain' => 'Doména Brevo', 'brevo_private_key' => 'Súkromný kľúč Brevo', - 'send_test_email' => 'Odoslať skúšobný email', + 'send_test_email' => 'Odoslať testovací email', 'select_label' => 'Vybrať štítok', 'label' => 'Štítok', 'service' => 'Služba', @@ -4157,7 +4157,7 @@ $lang = array( 'one_time_purchases' => 'Jednorázové nákupy', 'recurring_purchases' => 'Opakované nákupy', 'you_might_be_interested_in_following' => 'Mohlo by vás zaujímať nasledovné', - 'quotes_with_status_sent_can_be_approved' => 'Schválené môžu byť iba ponuky so stavom „Odoslané“.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'Žiadne ponuky na stiahnutie.', 'copyright' => 'Autorské práva', 'user_created_user' => ':user vytvoril :created_user o :time', @@ -5283,6 +5283,7 @@ $lang = array( 'rappen_rounding' => 'Rappen zaokrúhľovanie', 'rappen_rounding_help' => 'Okrúhla suma do 5 centov', 'assign_group' => 'Priradiť skupinu', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/sl/texts.php b/lang/sl/texts.php index d9f82782a7..b0a5869073 100644 --- a/lang/sl/texts.php +++ b/lang/sl/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Uspešno odstranjen logotip', 'sent_message' => 'Sporočilo uspešno poslano', 'invoice_error' => 'Prosim izberite stranko in popravite napake', - 'limit_clients' => 'Sorry, this will exceed the limit of :count clients. Please upgrade to a paid plan.', + 'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!.', 'payment_error' => 'Pri izvedbi plačila je prišlo do napake. Prosim poizkusite ponovno.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Prosim potrdite vaš elektronski naslov, :link za ponovno pošiljanje potrditvenega sporočila.', @@ -2198,7 +2198,7 @@ Ko imate zneske, se vrnite na to stran plačilnega sredstva in kliknite na "Comp 'mailgun_private_key' => 'Mailgun zasebni ključ', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'Pošlji testno sporočilo', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Izberi oznako', 'label' => 'Oznaka', 'service' => 'Storitev', @@ -4171,7 +4171,7 @@ Ko imate zneske, se vrnite na to stran plačilnega sredstva in kliknite na "Comp 'one_time_purchases' => 'One time purchases', 'recurring_purchases' => 'Recurring purchases', 'you_might_be_interested_in_following' => 'You might be interested in the following', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No quotes available for download.', 'copyright' => 'Copyright', 'user_created_user' => ':user created :created_user at :time', @@ -5278,8 +5278,6 @@ Ko imate zneske, se vrnite na to stran plačilnega sredstva in kliknite na "Comp 'accept_payments_online' => 'Accept Payments Online', 'all_payment_gateways' => 'View all payment gateways', 'product_cost' => 'Product cost', - 'enable_rappen_roudning' => 'Enable Rappen Rounding', - 'enable_rappen_rounding_help' => 'Rounds totals to nearest 5', 'duration_words' => 'Duration in words', 'upcoming_recurring_invoices' => 'Upcoming Recurring Invoices', 'shipping_country_id' => 'Shipping Country', @@ -5293,6 +5291,13 @@ Ko imate zneske, se vrnite na to stran plačilnega sredstva in kliknite na "Comp 'e_credit' => 'E-Credit', 'e_purchase_order' => 'E-Purchase Order', 'e_quote_type' => 'E-Quote Type', + 'unlock_unlimited_clients' => 'Please upgrade to unlock unlimited clients!', + 'download_e_purchase_order' => 'Download E-Purchase Order', + 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', + 'rappen_rounding' => 'Rappen Rounding', + 'rappen_rounding_help' => 'Round amount to 5 cents', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/sr/texts.php b/lang/sr/texts.php index 1b2c993dc1..48302c06ae 100644 --- a/lang/sr/texts.php +++ b/lang/sr/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'Logo je uspešno uklonjen', 'sent_message' => 'Poruka je uspešno poslata', 'invoice_error' => 'Molimo proverite da li ste odaberali klijenta i korigujte greške', - 'limit_clients' => 'Sorry, this will exceed the limit of :count clients. Please upgrade to a paid plan.', + 'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!.', 'payment_error' => 'Došlo je do greške pri procesiranju vaše uplate. Molimo pokušajte kasnije.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'Molimo Vas da potvrdite adresu vaše e-pošte, :link za ponovno slanje konfirmacione e-poruke.', @@ -2197,7 +2197,7 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k 'mailgun_private_key' => 'Mailgun privatni ključ', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'Pošalji probnu e-poštu', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Izaberi oznaku', 'label' => 'Oznaka', 'service' => 'Usluga', @@ -4170,7 +4170,7 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k 'one_time_purchases' => 'Jednokratne kupovine', 'recurring_purchases' => 'Redovne kupovine', 'you_might_be_interested_in_following' => 'Možda će vas zanimati sledeće', - 'quotes_with_status_sent_can_be_approved' => 'Mogu se odobriti samo ponude sa statusom „Poslato“.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'Nema dostupnih ponuda za preuzimanje.', 'copyright' => 'Autorsko pravo', 'user_created_user' => ':user kreirao :created_user u :time', @@ -5277,8 +5277,6 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k 'accept_payments_online' => 'Accept Payments Online', 'all_payment_gateways' => 'View all payment gateways', 'product_cost' => 'Product cost', - 'enable_rappen_roudning' => 'Enable Rappen Rounding', - 'enable_rappen_rounding_help' => 'Rounds totals to nearest 5', 'duration_words' => 'Duration in words', 'upcoming_recurring_invoices' => 'Upcoming Recurring Invoices', 'shipping_country_id' => 'Shipping Country', @@ -5292,6 +5290,13 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k 'e_credit' => 'E-Credit', 'e_purchase_order' => 'E-Purchase Order', 'e_quote_type' => 'E-Quote Type', + 'unlock_unlimited_clients' => 'Please upgrade to unlock unlimited clients!', + 'download_e_purchase_order' => 'Download E-Purchase Order', + 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', + 'rappen_rounding' => 'Rappen Rounding', + 'rappen_rounding_help' => 'Round amount to 5 cents', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/sv/texts.php b/lang/sv/texts.php index 8be952cd56..2405b3adaf 100644 --- a/lang/sv/texts.php +++ b/lang/sv/texts.php @@ -2205,7 +2205,7 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k 'mailgun_private_key' => 'Mailgun Private Key', 'brevo_domain' => 'Brevo-domän', 'brevo_private_key' => 'Brevo privat nyckel', - 'send_test_email' => 'Skicka test meddelande', + 'send_test_email' => 'Send Test Email', 'select_label' => 'Välj rubrik', 'label' => 'Rubrik', 'service' => 'Service', @@ -4178,7 +4178,7 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k 'one_time_purchases' => 'Engångsköp', 'recurring_purchases' => 'Återkommande köp', 'you_might_be_interested_in_following' => 'Du kanske är intresserad av följande', - 'quotes_with_status_sent_can_be_approved' => 'Endast offerter med status "Skickat" kan godkännas.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'Inga offerter tillgängliga för nedladdning.', 'copyright' => 'Copyright', 'user_created_user' => ':user skapade :created_user klockan :time', @@ -5303,6 +5303,8 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', 'rappen_rounding' => 'Rappen Rounding', 'rappen_rounding_help' => 'Round amount to 5 cents', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/th/texts.php b/lang/th/texts.php index f4be7ace24..bbda859ab2 100644 --- a/lang/th/texts.php +++ b/lang/th/texts.php @@ -199,7 +199,7 @@ $lang = array( 'removed_logo' => 'ลบโลโก้เรียบร้อยแล้ว', 'sent_message' => 'ส่งข้อความเรียบร้อยแล้ว', 'invoice_error' => 'โปรดเลือกลูกค้าและแก้ไขข้อผิดพลาด', - 'limit_clients' => 'Sorry, this will exceed the limit of :count clients. Please upgrade to a paid plan.', + 'limit_clients' => 'You\'ve hit the :count client limit on Free accounts. Congrats on your success!.', 'payment_error' => 'มีข้อผิดพลาดในการประมวลผลการชำระเงินของคุณ กรุณาลองใหม่อีกครั้งในภายหลัง.', 'registration_required' => 'Registration Required', 'confirmation_required' => 'โปรดยืนยันที่อยู่อีเมลของคุณ คลิกที่นี่ เพื่อส่งอีเมลยืนยันอีกครั้ง', @@ -2198,7 +2198,7 @@ $lang = array( 'mailgun_private_key' => 'Mailgun Private Key', 'brevo_domain' => 'Brevo Domain', 'brevo_private_key' => 'Brevo Private Key', - 'send_test_email' => 'ส่งอีเมล์ทดสอบ', + 'send_test_email' => 'Send Test Email', 'select_label' => 'เลือกป้ายกำกับ', 'label' => 'ป้ายกำกับ', 'service' => 'การบริการ', @@ -4171,7 +4171,7 @@ $lang = array( 'one_time_purchases' => 'One time purchases', 'recurring_purchases' => 'Recurring purchases', 'you_might_be_interested_in_following' => 'You might be interested in the following', - 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved.', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => 'No quotes available for download.', 'copyright' => 'Copyright', 'user_created_user' => ':user created :created_user at :time', @@ -5278,8 +5278,6 @@ $lang = array( 'accept_payments_online' => 'Accept Payments Online', 'all_payment_gateways' => 'View all payment gateways', 'product_cost' => 'Product cost', - 'enable_rappen_roudning' => 'Enable Rappen Rounding', - 'enable_rappen_rounding_help' => 'Rounds totals to nearest 5', 'duration_words' => 'Duration in words', 'upcoming_recurring_invoices' => 'Upcoming Recurring Invoices', 'shipping_country_id' => 'Shipping Country', @@ -5293,6 +5291,13 @@ $lang = array( 'e_credit' => 'E-Credit', 'e_purchase_order' => 'E-Purchase Order', 'e_quote_type' => 'E-Quote Type', + 'unlock_unlimited_clients' => 'Please upgrade to unlock unlimited clients!', + 'download_e_purchase_order' => 'Download E-Purchase Order', + 'flutter_web_warning' => 'We recommend using the new web app or the desktop app for the best performance', + 'rappen_rounding' => 'Rappen Rounding', + 'rappen_rounding_help' => 'Round amount to 5 cents', + 'assign_group' => 'Assign group', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/lang/zh_TW/texts.php b/lang/zh_TW/texts.php index 0a89bc8242..aab264a09e 100644 --- a/lang/zh_TW/texts.php +++ b/lang/zh_TW/texts.php @@ -2197,7 +2197,7 @@ $lang = array( 'mailgun_private_key' => 'Mailgun 私密金鑰', 'brevo_domain' => '布雷沃域', 'brevo_private_key' => '布雷沃私鑰', - 'send_test_email' => '寄送測試郵件', + 'send_test_email' => 'Send Test Email', 'select_label' => '選擇標籤', 'label' => '標籤', 'service' => '服務', @@ -4170,7 +4170,7 @@ $lang = array( 'one_time_purchases' => '一次性購買', 'recurring_purchases' => '經常性購買', 'you_might_be_interested_in_following' => '您可能對以下內容感興趣', - 'quotes_with_status_sent_can_be_approved' => '只有狀態為「已發送」的報價才能獲得批准。', + 'quotes_with_status_sent_can_be_approved' => 'Only quotes with "Sent" status can be approved. Expired quotes cannot be approved.', 'no_quotes_available_for_download' => '沒有可供下載的報價。', 'copyright' => '版權', 'user_created_user' => ':user在:time創建了:created_user', @@ -5296,6 +5296,7 @@ $lang = array( 'rappen_rounding' => '拉彭舍入', 'rappen_rounding_help' => '金額為 5 美分', 'assign_group' => '分配群組', + 'paypal_advanced_cards' => 'Advanced Card Payments', ); return $lang; diff --git a/resources/views/portal/ninja2020/components/livewire/required-client-info.blade.php b/resources/views/portal/ninja2020/components/livewire/required-client-info.blade.php index fd5b6b8bbf..39aa9e1d4f 100644 --- a/resources/views/portal/ninja2020/components/livewire/required-client-info.blade.php +++ b/resources/views/portal/ninja2020/components/livewire/required-client-info.blade.php @@ -125,7 +125,7 @@ @if(!$show_form)