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)