1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-09-20 16:31:33 +02:00

Merge pull request #9496 from turbo124/v5-develop

v5.8.52
This commit is contained in:
David Bomba 2024-05-02 13:14:28 +10:00 committed by GitHub
commit 7c18185167
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
122 changed files with 1496 additions and 788 deletions

View File

@ -1 +1 @@
5.8.51
5.8.52

View File

@ -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){

View File

@ -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',

View File

@ -1,290 +0,0 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2022. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\DataProviders;
class EDocRules
{
// [
// "key" => "",
// "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,
],
],
],
],
];
}
}

View File

@ -67,7 +67,6 @@ class Handler extends ExceptionHandler
];
protected $hostedDontReport = [
PDOException::class,
MaxAttemptsExceededException::class,
CommandNotFoundException::class,
ValidationException::class,

View File

@ -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());

View File

@ -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);
}

View File

@ -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());

View File

@ -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());

View File

@ -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());

View File

@ -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());

View File

@ -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());

View File

@ -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);
// }

View File

@ -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());

View File

@ -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());

View File

@ -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());

View File

@ -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]);

View File

@ -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());

View File

@ -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();

View File

@ -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();

View File

@ -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();

View File

@ -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());

View File

@ -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());

View File

@ -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);

View File

@ -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)) {

View File

@ -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;
}
}

View File

@ -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') {

View File

@ -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);
}

View File

@ -59,13 +59,13 @@ class EpcQrGenerator
<rect x='0' y='0' width='100%'' height='100%' />{$qr}</svg>";
} 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 '';
}

View File

@ -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) {

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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');

View File

@ -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'],
];
}

View File

@ -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'];
}

View File

@ -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',

View File

@ -229,6 +229,11 @@ class CompanyImport implements ShouldQueue
'is_template',
]
],
'5.8.51' => [
CompanyGateway::class => [
'always_show_required_fields',
]
]
];
/**

View File

@ -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',

View File

@ -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

View File

@ -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()
{

View File

@ -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 = [

View File

@ -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()
{

View File

@ -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;
}
}

View File

@ -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(),
],
]

View File

@ -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'];
}

View File

@ -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;

View File

@ -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]);
}
}

View File

@ -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)
{

View File

@ -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)));
}

View File

@ -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'));

View File

@ -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',

View File

@ -73,7 +73,7 @@ class ApplyPayment extends AbstractService
$this->payment
->ledger()
->updatePaymentBalance($amount_paid);
->updatePaymentBalance($amount_paid, "ApplyPaymentInvoice");
$this->invoice
->client

View File

@ -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();

View File

@ -213,7 +213,7 @@ class AutoBillInvoice extends AbstractService
}
$payment->ledger()
->updatePaymentBalance($amount * -1)
->updatePaymentBalance($amount * -1, "AutoBill")
->save();
$this->invoice

View File

@ -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

View File

@ -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();

View File

@ -69,7 +69,7 @@ class PaymentService
$this->payment
->ledger()
->updatePaymentBalance($this->payment->amount);
->updatePaymentBalance($this->payment->amount, "PaymentService");
$client->service()
->updateBalance($this->payment->amount)

View File

@ -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;

View File

@ -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();

View File

@ -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([]);

View File

@ -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([]);

View File

@ -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([]);

View File

@ -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([]);

View File

@ -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([]);

View File

@ -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()

View File

@ -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,
];
}

View File

@ -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 = '<br><br>';
@ -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
*

View File

@ -127,6 +127,10 @@ class Statics
$data['templates'] = Cache::get('templates');
}
$data['bulk_updates'] = [
'client' => \App\Models\Client::$bulk_update_columns,
];
return $data;
}
}

View File

@ -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);

View File

@ -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",

259
composer.lock generated
View File

@ -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",

View File

@ -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),

View File

@ -0,0 +1,28 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('company_gateways', function (Blueprint $table) {
$table->boolean('always_show_required_fields')->default(true);
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
//
}
};

View File

@ -0,0 +1,148 @@
<?php
use App\Models\Timezone;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
private array $timezones = [
'Pacific/Midway' => '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
{
//
}
};

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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 &quot;Sendt&quot;-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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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 &quot;Enviado&quot;.',
'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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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' => 'ניתן לאשר רק ציטוטים בסטטוס &quot;נשלח&quot;.',
'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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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' => 'មានតែសម្រង់ដែលមានស្ថានភាព &quot;បានផ្ញើ&quot; ប៉ុណ្ណោះដែលអាចយល់ព្រមបាន។',
'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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

View File

@ -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;

Some files were not shown because too many files have changed in this diff Show More