1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-12 22:22:32 +01:00

Merge remote-tracking branch 'upstream/v5-develop' into 1314-subscriptions-v3

This commit is contained in:
Benjamin Beganović 2024-04-01 19:09:13 +02:00
commit fa5827eb44
163 changed files with 7898 additions and 3308 deletions

View File

@ -1 +1 @@
5.8.37 5.8.39

View File

@ -169,26 +169,21 @@ class CheckData extends Command
private function checkCompanyTokens() private function checkCompanyTokens()
{ {
// CompanyUser::whereDoesntHave('token', function ($query){
// return $query->where('is_system', 1);
// })->cursor()->each(function ($cu){
// if ($cu->user) {
// $this->logMessage("Creating missing company token for user # {$cu->user->id} for company id # {$cu->company->id}");
// (new CreateCompanyToken($cu->company, $cu->user, 'System'))->handle();
// } else {
// $this->logMessage("Dangling User ID # {$cu->id}");
// }
// });
CompanyUser::query()->cursor()->each(function ($cu) { CompanyUser::query()->cursor()->each(function ($cu) {
if (CompanyToken::where('user_id', $cu->user_id)->where('company_id', $cu->company_id)->where('is_system', 1)->doesntExist()) { if (CompanyToken::where('user_id', $cu->user_id)->where('company_id', $cu->company_id)->where('is_system', 1)->doesntExist()) {
$this->logMessage("Creating missing company token for user # {$cu->user_id} for company id # {$cu->company_id}");
if ($cu->company && $cu->user) { if ($cu->company && $cu->user) {
$this->logMessage("Creating missing company token for user # {$cu->user_id} for company id # {$cu->company_id}");
(new CreateCompanyToken($cu->company, $cu->user, 'System'))->handle(); (new CreateCompanyToken($cu->company, $cu->user, 'System'))->handle();
} else { }
// $cu->forceDelete();
if (!$cu->user) {
$this->logMessage("No user found for company user - removing company user");
$cu->forceDelete();
} }
} }
}); });
} }
@ -482,6 +477,14 @@ class CheckData extends Command
} }
} else { } else {
$this->logMessage("No contact present, so cannot add invitation for {$entity_key} - {$entity->id}"); $this->logMessage("No contact present, so cannot add invitation for {$entity_key} - {$entity->id}");
try{
$entity->service()->createInvitations()->save();
}
catch(\Exception $e){
}
} }
try { try {

View File

@ -168,7 +168,6 @@ class BaseRule implements RuleInterface
/* We should only apply taxes for configured states */ /* We should only apply taxes for configured states */
if(!array_key_exists($this->client->country->iso_3166_2, $this->region_codes)) { if(!array_key_exists($this->client->country->iso_3166_2, $this->region_codes)) {
nlog('Automatic tax calculations not supported for this country - defaulting to company country'); nlog('Automatic tax calculations not supported for this country - defaulting to company country');
nlog("With new logic, we should never see this");
} }
/** Harvest the client_region */ /** Harvest the client_region */

View File

@ -12,6 +12,9 @@
namespace App\DataProviders; namespace App\DataProviders;
/**
* Class Domain.
*/
class Domains class Domains
{ {
private static array $verify_domains = [ private static array $verify_domains = [

View File

@ -134,6 +134,7 @@ class BaseExport
protected array $invoice_report_keys = [ protected array $invoice_report_keys = [
'name' => 'client.name', 'name' => 'client.name',
"currency" => "client.currency_id",
"invoice_number" => "invoice.number", "invoice_number" => "invoice.number",
"amount" => "invoice.amount", "amount" => "invoice.amount",
"balance" => "invoice.balance", "balance" => "invoice.balance",
@ -174,6 +175,8 @@ class BaseExport
]; ];
protected array $recurring_invoice_report_keys = [ protected array $recurring_invoice_report_keys = [
'name' => 'client.name',
"currency" => "client.currency_id",
"invoice_number" => "recurring_invoice.number", "invoice_number" => "recurring_invoice.number",
"amount" => "recurring_invoice.amount", "amount" => "recurring_invoice.amount",
"balance" => "recurring_invoice.balance", "balance" => "recurring_invoice.balance",
@ -298,6 +301,8 @@ class BaseExport
]; ];
protected array $quote_report_keys = [ protected array $quote_report_keys = [
'name' => 'client.name',
"currency" => "client.currency_id",
'custom_value1' => 'quote.custom_value1', 'custom_value1' => 'quote.custom_value1',
'custom_value2' => 'quote.custom_value2', 'custom_value2' => 'quote.custom_value2',
'custom_value3' => 'quote.custom_value3', 'custom_value3' => 'quote.custom_value3',
@ -336,6 +341,8 @@ class BaseExport
]; ];
protected array $credit_report_keys = [ protected array $credit_report_keys = [
'name' => 'client.name',
"currency" => "client.currency_id",
"credit_number" => "credit.number", "credit_number" => "credit.number",
"amount" => "credit.amount", "amount" => "credit.amount",
"balance" => "credit.balance", "balance" => "credit.balance",
@ -368,6 +375,7 @@ class BaseExport
]; ];
protected array $payment_report_keys = [ protected array $payment_report_keys = [
'name' => 'client.name',
"date" => "payment.date", "date" => "payment.date",
"amount" => "payment.amount", "amount" => "payment.amount",
"refunded" => "payment.refunded", "refunded" => "payment.refunded",
@ -385,7 +393,6 @@ class BaseExport
"custom_value4" => "payment.custom_value4", "custom_value4" => "payment.custom_value4",
"user" => "payment.user_id", "user" => "payment.user_id",
"assigned_user" => "payment.assigned_user_id", "assigned_user" => "payment.assigned_user_id",
]; ];
protected array $expense_report_keys = [ protected array $expense_report_keys = [
@ -867,15 +874,15 @@ class BaseExport
protected function addClientFilter(Builder $query, $clients): Builder protected function addClientFilter(Builder $query, $clients): Builder
{ {
if(is_string($clients)) { if(is_string($clients)) {
$clients = explode(',', $clients); $clients = explode(',', $clients);
} }
$transformed_clients = $this->transformKeys($clients); $transformed_clients = $this->transformKeys($clients);
nlog($clients);
nlog($transformed_clients); nlog($transformed_clients);
if(count($transformed_clients) > 0) { if(count($transformed_clients) > 0) {
nlog("yus");
$query->whereIn('client_id', $transformed_clients); $query->whereIn('client_id', $transformed_clients);
} }
@ -1573,7 +1580,7 @@ class BaseExport
public function queueDocuments(Builder $query) public function queueDocuments(Builder $query)
{ {
nlog("queue docs pls");
if($query->getModel() instanceof Document) { if($query->getModel() instanceof Document) {
$documents = $query->pluck('id')->toArray(); $documents = $query->pluck('id')->toArray();
} else { } else {
@ -1584,8 +1591,6 @@ class BaseExport
->toArray(); ->toArray();
} }
nlog($documents);
if(count($documents) > 0) { if(count($documents) > 0) {
$user = $this->company->owner(); $user = $this->company->owner();

View File

@ -107,6 +107,12 @@ class CreditExport extends BaseExport
$query = $this->addDateRange($query); $query = $this->addDateRange($query);
$clients = &$this->input['client_id'];
if($clients) {
$query = $this->addClientFilter($query, $clients);
}
if($this->input['status'] ?? false) { if($this->input['status'] ?? false) {
$query = $this->addCreditStatusFilter($query, $this->input['status']); $query = $this->addCreditStatusFilter($query, $this->input['status']);
} }

View File

@ -62,6 +62,12 @@ class InvoiceExport extends BaseExport
$query = $this->addDateRange($query); $query = $this->addDateRange($query);
$clients = &$this->input['client_id'];
if($clients) {
$query = $this->addClientFilter($query, $clients);
}
if($this->input['status'] ?? false) { if($this->input['status'] ?? false) {
$query = $this->addInvoiceStatusFilter($query, $this->input['status']); $query = $this->addInvoiceStatusFilter($query, $this->input['status']);
} }

View File

@ -75,6 +75,12 @@ class InvoiceItemExport extends BaseExport
$query = $this->addDateRange($query); $query = $this->addDateRange($query);
$clients = &$this->input['client_id'];
if($clients) {
$query = $this->addClientFilter($query, $clients);
}
if($this->input['status'] ?? false) { if($this->input['status'] ?? false) {
$query = $this->addInvoiceStatusFilter($query, $this->input['status']); $query = $this->addInvoiceStatusFilter($query, $this->input['status']);
} }

View File

@ -61,6 +61,12 @@ class PaymentExport extends BaseExport
$query = $this->addDateRange($query); $query = $this->addDateRange($query);
$clients = &$this->input['client_id'];
if($clients) {
$query = $this->addClientFilter($query, $clients);
}
$query = $this->addPaymentStatusFilters($query, $this->input['status'] ?? ''); $query = $this->addPaymentStatusFilters($query, $this->input['status'] ?? '');
if($this->input['document_email_attachment'] ?? false) { if($this->input['document_email_attachment'] ?? false) {

View File

@ -63,6 +63,12 @@ class PurchaseOrderExport extends BaseExport
$query = $this->addDateRange($query); $query = $this->addDateRange($query);
$clients = &$this->input['client_id'];
if($clients)
$query = $this->addClientFilter($query, $clients);
$query = $this->addPurchaseOrderStatusFilter($query, $this->input['status'] ?? ''); $query = $this->addPurchaseOrderStatusFilter($query, $this->input['status'] ?? '');
if($this->input['document_email_attachment'] ?? false) { if($this->input['document_email_attachment'] ?? false) {

View File

@ -67,6 +67,12 @@ class PurchaseOrderItemExport extends BaseExport
$query = $this->addDateRange($query); $query = $this->addDateRange($query);
$clients = &$this->input['client_id'];
if($clients) {
$query = $this->addClientFilter($query, $clients);
}
$query = $this->addPurchaseOrderStatusFilter($query, $this->input['status'] ?? ''); $query = $this->addPurchaseOrderStatusFilter($query, $this->input['status'] ?? '');
if($this->input['document_email_attachment'] ?? false) { if($this->input['document_email_attachment'] ?? false) {

View File

@ -69,6 +69,12 @@ class QuoteExport extends BaseExport
$query = $this->addDateRange($query); $query = $this->addDateRange($query);
$clients = &$this->input['client_id'];
if($clients) {
$query = $this->addClientFilter($query, $clients);
}
$query = $this->addQuoteStatusFilter($query, $this->input['status'] ?? ''); $query = $this->addQuoteStatusFilter($query, $this->input['status'] ?? '');
if($this->input['document_email_attachment'] ?? false) { if($this->input['document_email_attachment'] ?? false) {

View File

@ -70,6 +70,12 @@ class QuoteItemExport extends BaseExport
$query = $this->addDateRange($query); $query = $this->addDateRange($query);
$clients = &$this->input['client_id'];
if($clients) {
$query = $this->addClientFilter($query, $clients);
}
$query = $this->addQuoteStatusFilter($query, $this->input['status'] ?? ''); $query = $this->addQuoteStatusFilter($query, $this->input['status'] ?? '');
if($this->input['document_email_attachment'] ?? false) { if($this->input['document_email_attachment'] ?? false) {

View File

@ -61,6 +61,12 @@ class RecurringInvoiceExport extends BaseExport
$query = $this->addDateRange($query); $query = $this->addDateRange($query);
$clients = &$this->input['client_id'];
if($clients) {
$query = $this->addClientFilter($query, $clients);
}
$query = $this->addRecurringInvoiceStatusFilter($query, $this->input['status'] ?? ''); $query = $this->addRecurringInvoiceStatusFilter($query, $this->input['status'] ?? '');
return $query; return $query;

View File

@ -72,10 +72,16 @@ class TaskExport extends BaseExport
->where('is_deleted', $this->input['include_deleted'] ?? false); ->where('is_deleted', $this->input['include_deleted'] ?? false);
$query = $this->addDateRange($query); $query = $this->addDateRange($query);
$clients = &$this->input['client_id'];
if($this->input['document_email_attachment'] ?? false) { if($clients)
$query = $this->addClientFilter($query, $clients);
$document_attachments = &$this->input['document_email_attachment'];
if($document_attachments)
$this->queueDocuments($query); $this->queueDocuments($query);
}
return $query; return $query;
@ -197,7 +203,7 @@ class TaskExport extends BaseExport
if (in_array('task.duration', $this->input['report_keys']) || in_array('duration', $this->input['report_keys'])) { if (in_array('task.duration', $this->input['report_keys']) || in_array('duration', $this->input['report_keys'])) {
$seconds = $task->calcDuration(); $seconds = $task->calcDuration();
$entity['task.duration'] = $seconds; $entity['task.duration'] = $seconds;
$entity['task.duration_words'] = CarbonInterval::seconds($seconds)->locale($this->company->locale())->cascade()->forHumans(); $entity['task.duration_words'] = $seconds > 86400 ? CarbonInterval::seconds($seconds)->locale($this->company->locale())->cascade()->forHumans() : now()->startOfDay()->addSeconds($seconds)->format('H:i:s');
} }
$entity = $this->decorateAdvancedFields($task, $entity); $entity = $this->decorateAdvancedFields($task, $entity);

View File

@ -42,6 +42,7 @@ class ExpenseFactory
$expense->tax_amount1 = 0; $expense->tax_amount1 = 0;
$expense->tax_amount2 = 0; $expense->tax_amount2 = 0;
$expense->tax_amount3 = 0; $expense->tax_amount3 = 0;
$expense->uses_inclusive_taxes = false;
return $expense; return $expense;
} }

View File

@ -51,7 +51,8 @@ class PurchaseOrderFactory
$purchase_order->recurring_id = null; $purchase_order->recurring_id = null;
$purchase_order->exchange_rate = 1; $purchase_order->exchange_rate = 1;
$purchase_order->total_taxes = 0; $purchase_order->total_taxes = 0;
$purchase_order->uses_inclusive_taxes = false;
return $purchase_order; return $purchase_order;
} }
} }

View File

@ -137,6 +137,7 @@ class ClientFilters extends QueryFilters
$query->where('first_name', 'like', '%'.$filter.'%'); $query->where('first_name', 'like', '%'.$filter.'%');
$query->orWhere('last_name', 'like', '%'.$filter.'%'); $query->orWhere('last_name', 'like', '%'.$filter.'%');
$query->orWhere('email', 'like', '%'.$filter.'%'); $query->orWhere('email', 'like', '%'.$filter.'%');
$query->orWhere('phone', 'like', '%'.$filter.'%');
}) })
->orWhere('custom_value1', 'like', '%'.$filter.'%') ->orWhere('custom_value1', 'like', '%'.$filter.'%')
->orWhere('custom_value2', 'like', '%'.$filter.'%') ->orWhere('custom_value2', 'like', '%'.$filter.'%')
@ -166,7 +167,7 @@ class ClientFilters extends QueryFilters
$dir = ($sort_col[1] == 'asc') ? 'asc' : 'desc'; $dir = ($sort_col[1] == 'asc') ? 'asc' : 'desc';
if($sort_col[0] == 'number') { if($sort_col[0] == 'number') {
return $this->builder->orderByRaw('ABS(number) ' . $dir); return $this->builder->orderByRaw("REGEXP_REPLACE(number,'[^0-9]+','')+0 " . $dir);
} }
return $this->builder->orderBy($sort_col[0], $dir); return $this->builder->orderBy($sort_col[0], $dir);

View File

@ -148,7 +148,7 @@ class CreditFilters extends QueryFilters
if($sort_col[0] == 'number') { if($sort_col[0] == 'number') {
return $this->builder->orderByRaw('ABS(number) ' . $dir); return $this->builder->orderByRaw("REGEXP_REPLACE(number,'[^0-9]+','')+0 " . $dir);
} }
return $this->builder->orderBy($sort_col[0], $dir); return $this->builder->orderBy($sort_col[0], $dir);

View File

@ -197,7 +197,7 @@ class ExpenseFilters extends QueryFilters
} }
if($sort_col[0] == 'number') { if($sort_col[0] == 'number') {
return $this->builder->orderByRaw('ABS(number) ' . $dir); return $this->builder->orderByRaw("REGEXP_REPLACE(number,'[^0-9]+','')+0 " . $dir);
} }
if (is_array($sort_col) && in_array($sort_col[1], ['asc', 'desc']) && in_array($sort_col[0], ['public_notes', 'date', 'id_number', 'custom_value1', 'custom_value2', 'custom_value3', 'custom_value4'])) { if (is_array($sort_col) && in_array($sort_col[1], ['asc', 'desc']) && in_array($sort_col[0], ['public_notes', 'date', 'id_number', 'custom_value1', 'custom_value2', 'custom_value3', 'custom_value4'])) {

View File

@ -176,7 +176,7 @@ class PaymentFilters extends QueryFilters
} }
if($sort_col[0] == 'number') { if($sort_col[0] == 'number') {
return $this->builder->orderByRaw('ABS(number) ' . $dir); return $this->builder->orderByRaw("REGEXP_REPLACE(number,'[^0-9]+','')+0 " . $dir);
} }
return $this->builder->orderBy($sort_col[0], $dir); return $this->builder->orderBy($sort_col[0], $dir);

View File

@ -72,7 +72,7 @@ class ProjectFilters extends QueryFilters
} }
if($sort_col[0] == 'number') { if($sort_col[0] == 'number') {
return $this->builder->orderByRaw('ABS(number) ' . $dir); return $this->builder->orderByRaw("REGEXP_REPLACE(number,'[^0-9]+','')+0 " . $dir);
} }
return $this->builder->orderBy($sort_col[0], $dir); return $this->builder->orderBy($sort_col[0], $dir);

View File

@ -131,7 +131,7 @@ class PurchaseOrderFilters extends QueryFilters
} }
if($sort_col[0] == 'number') { if($sort_col[0] == 'number') {
return $this->builder->orderByRaw('ABS(number) ' . $dir); return $this->builder->orderByRaw("REGEXP_REPLACE(number,'[^0-9]+','')+0 " . $dir);
} }
return $this->builder->orderBy($sort_col[0], $dir); return $this->builder->orderBy($sort_col[0], $dir);

View File

@ -156,7 +156,7 @@ class QuoteFilters extends QueryFilters
} }
if($sort_col[0] == 'number') { if($sort_col[0] == 'number') {
return $this->builder->orderByRaw('ABS(number) ' . $dir); return $this->builder->orderByRaw("REGEXP_REPLACE(number,'[^0-9]+','')+0 " . $dir);
} }
if ($sort_col[0] == 'valid_until') { if ($sort_col[0] == 'valid_until') {

View File

@ -130,7 +130,7 @@ class RecurringInvoiceFilters extends QueryFilters
} }
if($sort_col[0] == 'number') { if($sort_col[0] == 'number') {
return $this->builder->orderByRaw("ABS(number) {$dir}"); return $this->builder->orderByRaw("REGEXP_REPLACE(number,'[^0-9]+','')+0 " . $dir);
} }
return $this->builder->orderBy($sort_col[0], $dir); return $this->builder->orderBy($sort_col[0], $dir);

View File

@ -144,7 +144,7 @@ class TaskFilters extends QueryFilters
} }
if($sort_col[0] == 'number') { if($sort_col[0] == 'number') {
return $this->builder->orderByRaw('ABS(number) ' . $dir); return $this->builder->orderByRaw("REGEXP_REPLACE(number,'[^0-9]+','')+0 " . $dir);
} }
return $this->builder->orderBy($sort_col[0], $dir); return $this->builder->orderBy($sort_col[0], $dir);

View File

@ -72,7 +72,7 @@ class VendorFilters extends QueryFilters
$dir = ($sort_col[1] == 'asc') ? 'asc' : 'desc'; $dir = ($sort_col[1] == 'asc') ? 'asc' : 'desc';
if($sort_col[0] == 'number') { if($sort_col[0] == 'number') {
return $this->builder->orderByRaw('ABS(number) ' . $dir); return $this->builder->orderByRaw("REGEXP_REPLACE(number,'[^0-9]+','')+0 " . $dir);
} }
return $this->builder->orderBy($sort_col[0], $dir); return $this->builder->orderBy($sort_col[0], $dir);

View File

@ -246,6 +246,8 @@ class InvoiceSum
if ($this->invoice->status_id != Invoice::STATUS_DRAFT) { if ($this->invoice->status_id != Invoice::STATUS_DRAFT) {
if ($this->invoice->amount != $this->invoice->balance) { 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. $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 { } else {
$this->invoice->balance = Number::roundValue($this->getTotal(), $this->precision); $this->invoice->balance = Number::roundValue($this->getTotal(), $this->precision);

View File

@ -271,11 +271,14 @@ class BankIntegrationController extends BaseController
$nordigen = new Nordigen(); $nordigen = new Nordigen();
BankIntegration::where("integration_type", BankIntegration::INTEGRATION_TYPE_NORDIGEN)->whereNotNull('nordigen_account_id')->each(function (BankIntegration $bank_integration) use ($nordigen) { BankIntegration::where("integration_type", BankIntegration::INTEGRATION_TYPE_NORDIGEN)->whereNotNull('nordigen_account_id')->each(function (BankIntegration $bank_integration) use ($nordigen) {
$is_account_active = $nordigen->isAccountActive($bank_integration->nordigen_account_id);
$account = $nordigen->getAccount($bank_integration->nordigen_account_id); $account = $nordigen->getAccount($bank_integration->nordigen_account_id);
if (!$account) {
$bank_integration->disabled_upstream = true;
if (!$is_account_active || !$account) {
$bank_integration->disabled_upstream = true;
$bank_integration->save(); $bank_integration->save();
$nordigen->disabledAccountEmail($bank_integration);
return; return;
} }
@ -304,10 +307,10 @@ class BankIntegrationController extends BaseController
$account = $user->account; $account = $user->account;
$bank_integration = BankIntegration::withTrashed() $bank_integration = BankIntegration::withTrashed()
->where('bank_account_id', $acc_id) ->where('bank_account_id', $acc_id)
->orWhere('nordigen_account_id', $acc_id) ->orWhere('nordigen_account_id', $acc_id)
->company() ->company()
->firstOrFail(); ->firstOrFail();
if ($bank_integration->integration_type == BankIntegration::INTEGRATION_TYPE_YODLEE) { if ($bank_integration->integration_type == BankIntegration::INTEGRATION_TYPE_YODLEE) {
$this->removeAccountYodlee($account, $bank_integration); $this->removeAccountYodlee($account, $bank_integration);

View File

@ -328,9 +328,12 @@ class ClientController extends BaseController
->first(); ->first();
if (!$m_client) { if (!$m_client) {
return response()->json(['message' => "Client not found"]); return response()->json(['message' => "Client not found"], 400);
} }
if($m_client->id == $client->id)
return response()->json(['message' => "Attempting to merge the same client is not possible."], 400);
$merged_client = $client->service()->merge($m_client)->save(); $merged_client = $client->service()->merge($m_client)->save();
return $this->itemResponse($merged_client); return $this->itemResponse($merged_client);

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Invoice Ninja (https://invoiceninja.com). * Invoice Ninja (https://invoiceninja.com).
* *
@ -12,17 +13,24 @@
namespace App\Http\Controllers\ClientPortal; namespace App\Http\Controllers\ClientPortal;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use Illuminate\Contracts\View\Factory; use App\Models\Invoice;
use Illuminate\View\View;
class DashboardController extends Controller class DashboardController extends Controller
{ {
/** public function index(): \Illuminate\View\View|\Illuminate\Http\RedirectResponse
* @return Factory|View
*/
public function index()
{ {
return redirect()->route('client.invoices.index'); if (auth()->guard('contact')->user()->client->getSetting('enable_client_portal_dashboard') === false) {
//return $this->render('dashboard.index'); return redirect()->route('client.invoices.index');
}
$total_invoices = Invoice::withTrashed()
->where('client_id', auth()->guard('contact')->user()->client_id)
->where('is_deleted', 0)
->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL, Invoice::STATUS_PAID])
->sum('amount');
return $this->render('dashboard.index', [
'total_invoices' => $total_invoices,
]);
} }
} }

View File

@ -87,7 +87,7 @@ class InvitationController extends Controller
->firstOrFail(); ->firstOrFail();
if ($invitation->trashed() || $invitation->{$entity}->is_deleted) { if ($invitation->trashed() || $invitation->{$entity}->is_deleted) {
return $this->render('generic.not_available', ['account' => $invitation->company->account, 'company' => $invitation->company]); return $this->render('generic.not_available', ['passed_account' => $invitation->company->account, 'passed_company' => $invitation->company]);
} }
if ($invitation->contact->trashed()) { if ($invitation->contact->trashed()) {
@ -138,11 +138,10 @@ class InvitationController extends Controller
return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key}), 'silent' => $is_silent]); return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key}), 'silent' => $is_silent]);
return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key}), 'silent' => $is_silent])->header('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
} }
return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key})]); return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key})]);
return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key})])->header('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
} }
private function fireEntityViewedEvent($invitation, $entity_string) private function fireEntityViewedEvent($invitation, $entity_string)
@ -278,7 +277,7 @@ class InvitationController extends Controller
auth()->guard('contact')->loginUsingId($invitation->contact->id, true); auth()->guard('contact')->loginUsingId($invitation->contact->id, true);
$invoice = $invitation->invoice; $invoice = $invitation->invoice->service()->removeUnpaidGatewayFees()->save();
if ($invoice->partial > 0) { if ($invoice->partial > 0) {
$amount = round($invoice->partial, (int)$invoice->client->currency()->precision); $amount = round($invoice->partial, (int)$invoice->client->currency()->precision);

View File

@ -72,7 +72,7 @@ class InvoiceController extends Controller
$variables = ($invitation && auth()->guard('contact')->user()->client->getSetting('show_accept_invoice_terms')) ? (new HtmlEngine($invitation))->generateLabelsAndValues() : false; $variables = ($invitation && auth()->guard('contact')->user()->client->getSetting('show_accept_invoice_terms')) ? (new HtmlEngine($invitation))->generateLabelsAndValues() : false;
$data = [ $data = [
'invoice' => $invoice, 'invoice' => $invoice->service()->removeUnpaidGatewayFees()->save(),
'invitation' => $invitation ?: $invoice->invitations->first(), 'invitation' => $invitation ?: $invoice->invitations->first(),
'key' => $invitation ? $invitation->key : false, 'key' => $invitation ? $invitation->key : false,
'hash' => $hash, 'hash' => $hash,

View File

@ -26,7 +26,7 @@ class SubscriptionPurchaseController extends Controller
App::setLocale($subscription->company->locale()); App::setLocale($subscription->company->locale());
if ($subscription->trashed()) { if ($subscription->trashed()) {
return $this->render('generic.not_available', ['account' => $subscription->company->account, 'company' => $subscription->company]); return $this->render('generic.not_available', ['passed_account' => $subscription->company->account, 'passed_company' => $subscription->company]);
} }
/* Make sure the contact is logged into the correct company for this subscription */ /* Make sure the contact is logged into the correct company for this subscription */

View File

@ -14,6 +14,7 @@ namespace App\Http\Controllers;
use App\DataMapper\Analytics\LivePreview; use App\DataMapper\Analytics\LivePreview;
use App\Http\Requests\Preview\DesignPreviewRequest; use App\Http\Requests\Preview\DesignPreviewRequest;
use App\Http\Requests\Preview\PreviewInvoiceRequest; use App\Http\Requests\Preview\PreviewInvoiceRequest;
use App\Http\Requests\Preview\ShowPreviewRequest;
use App\Jobs\Util\PreviewPdf; use App\Jobs\Util\PreviewPdf;
use App\Models\Client; use App\Models\Client;
use App\Models\ClientContact; use App\Models\ClientContact;
@ -131,9 +132,9 @@ class PreviewController extends BaseController
* Used in the Custom Designer to preview design changes * Used in the Custom Designer to preview design changes
* @return mixed * @return mixed
*/ */
public function show() public function show(ShowPreviewRequest $request)
{ {
if(request()->has('template')) { if($request->input('design.is_template')) {
return $this->template(); return $this->template();
} }
@ -238,7 +239,6 @@ class PreviewController extends BaseController
private function liveTemplate(array $request_data) private function liveTemplate(array $request_data)
{ {
nlog($request_data['entity_type']);
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
@ -292,8 +292,6 @@ class PreviewController extends BaseController
->setTemplate($design_object) ->setTemplate($design_object)
->mock(); ->mock();
} catch(SyntaxError $e) { } catch(SyntaxError $e) {
// return response()->json(['message' => 'Twig syntax is invalid.', 'errors' => new \stdClass], 422);
} }
if (request()->query('html') == 'true') { if (request()->query('html') == 'true') {

View File

@ -914,7 +914,7 @@ class QuoteController extends BaseController
$contact = $invitation->contact; $contact = $invitation->contact;
$quote = $invitation->quote; $quote = $invitation->quote;
$file = $quote->service()->getEInvoice($contact); $file = $quote->service()->getEQuote($contact);
$file_name = $quote->getFileName("xml"); $file_name = $quote->getFileName("xml");
$headers = ['Content-Type' => 'application/xml']; $headers = ['Content-Type' => 'application/xml'];

View File

@ -66,7 +66,7 @@ class ARDetailReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), ARDetailReport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), ARDetailReport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -65,7 +65,7 @@ class ARSummaryReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), ARSummaryReport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), ARSummaryReport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -36,7 +36,7 @@ class ActivityReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), ActivityExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), ActivityExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -65,7 +65,7 @@ class ClientBalanceReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), ClientBalanceReport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), ClientBalanceReport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,7 @@ class ClientContactReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), ContactExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), ContactExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -67,7 +67,7 @@ class ClientReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), ClientExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), ClientExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -65,7 +65,7 @@ class ClientSalesReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), ClientSalesReport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), ClientSalesReport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,7 @@ class CreditReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), CreditExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), CreditExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -67,7 +67,7 @@ class DocumentReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), DocumentExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), DocumentExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -68,7 +68,7 @@ class ExpenseReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), ExpenseExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), ExpenseExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,7 @@ class InvoiceItemReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), InvoiceItemExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), InvoiceItemExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,7 @@ class InvoiceReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), InvoiceExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), InvoiceExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -67,7 +67,7 @@ class PaymentReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), PaymentExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), PaymentExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -68,7 +68,7 @@ class ProductReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), ProductExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), ProductExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -67,7 +67,7 @@ class ProductSalesReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), ProductSalesExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), ProductSalesExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -67,7 +67,7 @@ class ProfitAndLossController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), ProfitLoss::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), ProfitLoss::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -34,7 +34,7 @@ class PurchaseOrderItemReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), PurchaseOrderItemExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), PurchaseOrderItemExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -36,7 +36,7 @@ class PurchaseOrderReportController extends BaseController
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), PurchaseOrderExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), PurchaseOrderExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,7 @@ class QuoteItemReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), QuoteItemExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), QuoteItemExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,7 @@ class QuoteReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), QuoteExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), QuoteExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -34,7 +34,7 @@ class RecurringInvoiceReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), RecurringInvoiceExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), RecurringInvoiceExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,8 @@ class TaskReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output'))
{
SendToAdmin::dispatch($user->company(), $request->all(), TaskExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), TaskExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,7 @@ class TaxSummaryReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), TaxSummaryReport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), TaxSummaryReport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -65,7 +65,7 @@ class UserSalesReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), UserSalesReport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), UserSalesReport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -34,7 +34,7 @@ class VendorReportController extends BaseController
/** @var \App\Models\User $user */ /** @var \App\Models\User $user */
$user = auth()->user(); $user = auth()->user();
if ($request->has('send_email') && $request->get('send_email')) { if ($request->has('send_email') && $request->get('send_email') && $request->missing('output')) {
SendToAdmin::dispatch($user->company(), $request->all(), VendorExport::class, $this->filename); SendToAdmin::dispatch($user->company(), $request->all(), VendorExport::class, $this->filename);
return response()->json(['message' => 'working...'], 200); return response()->json(['message' => 'working...'], 200);

View File

@ -59,6 +59,7 @@ class ShowChartRequest extends Request
} }
if (! isset($input['end_date'])) { if (! isset($input['end_date'])) {
// $input['end_date'] = now()->lastOfMonth()->format('Y-m-d');
$input['end_date'] = now()->format('Y-m-d'); $input['end_date'] = now()->format('Y-m-d');
} }

View File

@ -116,7 +116,9 @@ class StoreInvoiceRequest extends Request
//handles edge case where we need for force set the due date of the invoice. //handles edge case where we need for force set the due date of the invoice.
if((isset($input['partial_due_date']) && strlen($input['partial_due_date']) > 1) && (!array_key_exists('due_date', $input) || (empty($input['due_date']) && empty($this->invoice->due_date)))) { if((isset($input['partial_due_date']) && strlen($input['partial_due_date']) > 1) && (!array_key_exists('due_date', $input) || (empty($input['due_date']) && empty($this->invoice->due_date)))) {
$client = \App\Models\Client::withTrashed()->find($input['client_id']); $client = \App\Models\Client::withTrashed()->find($input['client_id']);
$input['due_date'] = \Illuminate\Support\Carbon::parse($input['date'])->addDays($client->getSetting('payment_terms'))->format('Y-m-d');
if($client)
$input['due_date'] = \Illuminate\Support\Carbon::parse($input['date'])->addDays($client->getSetting('payment_terms'))->format('Y-m-d');
} }
$this->replace($input); $this->replace($input);

View File

@ -0,0 +1,45 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2023. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace App\Http\Requests\Preview;
use App\Http\Requests\Request;
use App\Utils\Traits\MakesHash;
class ShowPreviewRequest extends Request
{
use MakesHash;
/**
* Determine if the user is authorized to make this request.
*
* @return bool
*/
public function authorize(): bool
{
return true;
}
public function rules()
{
$rules = [
];
return $rules;
}
public function prepareForValidation()
{
$input = $this->all();
$this->replace($input);
}
}

View File

@ -11,10 +11,14 @@
namespace App\Http\Requests\Report; namespace App\Http\Requests\Report;
use App\Utils\Ninja;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use Illuminate\Auth\Access\AuthorizationException;
class GenericReportRequest extends Request class GenericReportRequest extends Request
{ {
private string $error_message = '';
/** /**
* Determine if the user is authorized to make this request. * Determine if the user is authorized to make this request.
* *
@ -22,11 +26,7 @@ class GenericReportRequest extends Request
*/ */
public function authorize(): bool public function authorize(): bool
{ {
/** @var \App\Models\User $user */ return $this->checkAuthority();
$user = auth()->user();
return $user->isAdmin() || $user->hasPermission('view_reports');
} }
public function rules() public function rules()
@ -70,4 +70,25 @@ class GenericReportRequest extends Request
$this->replace($input); $this->replace($input);
} }
private function checkAuthority()
{
$this->error_message = ctrans('texts.authorization_failure');
/** @var \App\Models\User $user */
$user = auth()->user();
if(Ninja::isHosted() && $user->account->isFreeHostedClient()){
$this->error_message = ctrans('texts.upgrade_to_view_reports');
return false;
}
return $user->isAdmin() || $user->hasPermission('view_reports');
}
protected function failedAuthorization()
{
throw new AuthorizationException($this->error_message);
}
} }

View File

@ -11,13 +11,17 @@
namespace App\Http\Requests\Report; namespace App\Http\Requests\Report;
use App\Utils\Ninja;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesHash;
use Illuminate\Auth\Access\AuthorizationException;
class ProductSalesReportRequest extends Request class ProductSalesReportRequest extends Request
{ {
use MakesHash; use MakesHash;
private string $error_message = '';
/** /**
* Determine if the user is authorized to make this request. * Determine if the user is authorized to make this request.
* *
@ -25,18 +29,22 @@ class ProductSalesReportRequest extends Request
*/ */
public function authorize(): bool public function authorize(): bool
{ {
return auth()->user()->isAdmin(); return $this->checkAuthority();
} }
public function rules() public function rules()
{ {
/** @var \App\Models\User $user */
$user = auth()->user();
return [ return [
'date_range' => 'bail|required|string', 'date_range' => 'bail|required|string',
'end_date' => 'bail|required_if:date_range,custom|nullable|date', 'end_date' => 'bail|required_if:date_range,custom|nullable|date',
'start_date' => 'bail|required_if:date_range,custom|nullable|date', 'start_date' => 'bail|required_if:date_range,custom|nullable|date',
'report_keys' => 'bail|present|array', 'report_keys' => 'bail|present|array',
'send_email' => 'bail|required|bool', 'send_email' => 'bail|required|bool',
'client_id' => 'bail|nullable|sometimes|exists:clients,id,company_id,'.auth()->user()->company()->id.',is_deleted,0', 'client_id' => 'bail|nullable|sometimes|exists:clients,id,company_id,'.$user->company()->id.',is_deleted,0',
]; ];
} }
@ -67,4 +75,26 @@ class ProductSalesReportRequest extends Request
$this->replace($input); $this->replace($input);
} }
private function checkAuthority()
{
$this->error_message = ctrans('texts.authorization_failure');
/** @var \App\Models\User $user */
$user = auth()->user();
if(Ninja::isHosted() && $user->account->isFreeHostedClient()){
$this->error_message = ctrans('texts.upgrade_to_view_reports');
return false;
}
return $user->isAdmin() || $user->hasPermission('view_reports');
}
protected function failedAuthorization()
{
throw new AuthorizationException($this->error_message);
}
} }

View File

@ -11,10 +11,15 @@
namespace App\Http\Requests\Report; namespace App\Http\Requests\Report;
use App\Utils\Ninja;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use Illuminate\Auth\Access\AuthorizationException;
class ProfitLossRequest extends Request class ProfitLossRequest extends Request
{ {
private string $error_message = '';
/** /**
* Determine if the user is authorized to make this request. * Determine if the user is authorized to make this request.
* *
@ -22,10 +27,7 @@ class ProfitLossRequest extends Request
*/ */
public function authorize(): bool public function authorize(): bool
{ {
/** @var \App\Models\User $user */ return $this->checkAuthority();
$user = auth()->user();
return $user->isAdmin();
} }
public function rules() public function rules()
@ -51,4 +53,26 @@ class ProfitLossRequest extends Request
$this->replace($input); $this->replace($input);
} }
private function checkAuthority()
{
$this->error_message = ctrans('texts.authorization_failure');
/** @var \App\Models\User $user */
$user = auth()->user();
if(Ninja::isHosted() && $user->account->isFreeHostedClient()){
$this->error_message = ctrans('texts.upgrade_to_view_reports');
return false;
}
return $user->isAdmin() || $user->hasPermission('view_reports');
}
protected function failedAuthorization()
{
throw new AuthorizationException($this->error_message);
}
} }

View File

@ -11,10 +11,14 @@
namespace App\Http\Requests\Report; namespace App\Http\Requests\Report;
use App\Utils\Ninja;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use Illuminate\Auth\Access\AuthorizationException;
class ReportPreviewRequest extends Request class ReportPreviewRequest extends Request
{ {
private string $error_message = '';
/** /**
* Determine if the user is authorized to make this request. * Determine if the user is authorized to make this request.
* *
@ -22,11 +26,7 @@ class ReportPreviewRequest extends Request
*/ */
public function authorize(): bool public function authorize(): bool
{ {
/** @var \App\Models\User $user */ return $this->checkAuthority();
$user = auth()->user();
return $user->isAdmin() || $user->hasPermission('view_reports');
} }
public function rules() public function rules()
@ -38,4 +38,26 @@ class ReportPreviewRequest extends Request
public function prepareForValidation() public function prepareForValidation()
{ {
} }
private function checkAuthority()
{
$this->error_message = ctrans('texts.authorization_failure');
/** @var \App\Models\User $user */
$user = auth()->user();
if(Ninja::isHosted() && $user->account->isFreeHostedClient()){
$this->error_message = ctrans('texts.upgrade_to_view_reports');
return false;
}
return $user->isAdmin() || $user->hasPermission('view_reports');
}
protected function failedAuthorization()
{
throw new AuthorizationException($this->error_message);
}
} }

View File

@ -101,9 +101,9 @@ class PortalComposer
$enabled_modules = auth()->guard('contact')->user()->company->enabled_modules; $enabled_modules = auth()->guard('contact')->user()->company->enabled_modules;
$data = []; $data = [];
// TODO: Enable dashboard once it's completed. if ($this->settings->enable_client_portal_dashboard) {
// $this->settings->enable_client_portal_dashboard $data[] = [ 'title' => ctrans('texts.dashboard'), 'url' => 'client.dashboard', 'icon' => 'activity'];
// $data[] = [ 'title' => ctrans('texts.dashboard'), 'url' => 'client.dashboard', 'icon' => 'activity']; }
if (self::MODULE_INVOICES & $enabled_modules) { if (self::MODULE_INVOICES & $enabled_modules) {
$data[] = ['title' => ctrans('texts.invoices'), 'url' => 'client.invoices.index', 'icon' => 'file-text']; $data[] = ['title' => ctrans('texts.invoices'), 'url' => 'client.invoices.index', 'icon' => 'file-text'];

View File

@ -11,11 +11,12 @@
namespace App\Jobs\Cron; namespace App\Jobs\Cron;
use App\Libraries\MultiDB; use App\Models\Company;
use App\Models\Invoice; use App\Models\Invoice;
use App\Libraries\MultiDB;
use Illuminate\Support\Facades\Auth;
use App\Utils\Traits\SubscriptionHooker; use App\Utils\Traits\SubscriptionHooker;
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Auth;
class SubscriptionCron class SubscriptionCron
{ {
@ -97,4 +98,61 @@ class SubscriptionCron
} }
} }
} }
//Requires the crons to be updated and set to hourly @ 00:01
private function timezoneAware()
{
$grouped_company_ids =
Invoice::select('company_id')
->where('is_deleted', 0)
->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL])
->where('balance', '>', 0)
->where('is_proforma', 0)
->whereDate('due_date', '<=', now()->addDay()->startOfDay())
->whereNull('deleted_at')
->whereNotNull('subscription_id')
->groupBy('company_id')
->cursor()
->each(function ($company_id){
$company = Company::find($company_id);
$timezone_now = now()->setTimezone($company->timezone()->name);
//Capture companies within the window of 00:00 and 00:30
if($timezone_now->gt($timezone_now->copy()->startOfDay()) && $timezone_now->lt($timezone_now->copy()->startOfDay()->addMinutes(30))) {
Invoice::query()
->where('company_id', $company->id)
->whereNull('deleted_at')
->where('is_deleted', 0)
->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL])
->where('is_proforma', 0)
->whereNotNull('subscription_id')
->where('balance', '>', 0)
->whereDate('due_date', '<=', now()->setTimezone($company->timezone()->name)->addDay()->startOfDay())
->cursor()
->each(function (Invoice $invoice) {
$subscription = $invoice->subscription;
$body = [
'context' => 'plan_expired',
'client' => $invoice->client->hashed_id,
'invoice' => $invoice->hashed_id,
'subscription' => $subscription->hashed_id,
];
$this->sendLoad($subscription, $body);
//This will send the notification daily.
//We'll need to handle this by performing some action on the invoice to either archive it or delete it?
});
}
});
}
} }

View File

@ -359,6 +359,17 @@ class ProcessPostmarkWebhook implements ShouldQueue
$postmark = new PostmarkClient($postmark_secret); $postmark = new PostmarkClient($postmark_secret);
$messageDetail = $postmark->getOutboundMessageDetails($message_id); $messageDetail = $postmark->getOutboundMessageDetails($message_id);
try {
$messageDetail = $postmark->getOutboundMessageDetails($message_id);
} catch(\Exception $e) {
$postmark_secret = config('services.postmark-outlook.token');
$postmark = new PostmarkClient($postmark_secret);
$messageDetail = $postmark->getOutboundMessageDetails($message_id);
}
return $messageDetail; return $messageDetail;
} }
@ -391,7 +402,17 @@ class ProcessPostmarkWebhook implements ShouldQueue
$postmark_secret = !empty($this->company->settings->postmark_secret) ? $this->company->settings->postmark_secret : config('services.postmark.token'); $postmark_secret = !empty($this->company->settings->postmark_secret) ? $this->company->settings->postmark_secret : config('services.postmark.token');
$postmark = new PostmarkClient($postmark_secret); $postmark = new PostmarkClient($postmark_secret);
$messageDetail = $postmark->getOutboundMessageDetails($this->request['MessageID']);
try {
$messageDetail = $postmark->getOutboundMessageDetails($this->request['MessageID']);
}
catch(\Exception $e){
$postmark_secret = config('services.postmark-outlook.token');
$postmark = new PostmarkClient($postmark_secret);
$messageDetail = $postmark->getOutboundMessageDetails($this->request['MessageID']);
}
$recipients = collect($messageDetail['recipients'])->flatten()->implode(','); $recipients = collect($messageDetail['recipients'])->flatten()->implode(',');
$subject = $messageDetail->subject ?? ''; $subject = $messageDetail->subject ?? '';

View File

@ -59,15 +59,12 @@ class CleanStaleInvoiceOrder implements ShouldQueue
Invoice::query() Invoice::query()
->withTrashed() ->withTrashed()
->where('status_id', Invoice::STATUS_SENT) ->where('status_id', Invoice::STATUS_SENT)
->whereBetween('created_at', [now()->subHours(1), now()->subMinutes(30)]) ->where('created_at', '<', now()->subMinutes(30))
->where('balance', '>', 0) ->where('balance', '>', 0)
->whereJsonContains('line_items', ['type_id' => '3'])
->cursor() ->cursor()
->each(function ($invoice) { ->each(function ($invoice) {
$invoice->service()->removeUnpaidGatewayFees();
if (collect($invoice->line_items)->contains('type_id', 3)) {
$invoice->service()->removeUnpaidGatewayFees();
}
}); });
return; return;
@ -86,6 +83,18 @@ class CleanStaleInvoiceOrder implements ShouldQueue
$invoice->is_proforma = false; $invoice->is_proforma = false;
$repo->delete($invoice); $repo->delete($invoice);
}); });
Invoice::query()
->withTrashed()
->where('status_id', Invoice::STATUS_SENT)
->where('created_at', '<', now()->subMinutes(30))
->where('balance', '>', 0)
->whereJsonContains('line_items', ['type_id' => '3'])
->cursor()
->each(function ($invoice) {
$invoice->service()->removeUnpaidGatewayFees();
});
} }
} }

View File

@ -1144,8 +1144,6 @@ class Import implements ShouldQueue
$key = "invoices_{$resource['id']}"; $key = "invoices_{$resource['id']}";
nlog($invoice->id);
$this->ids['invoices'][$key] = [ $this->ids['invoices'][$key] = [
'old' => $resource['id'], 'old' => $resource['id'],
'new' => $invoice->id, 'new' => $invoice->id,
@ -1527,10 +1525,11 @@ class Import implements ShouldQueue
} }
} }
// throw new Exception("Resource invoice/quote document not available."); // throw new Exception("Resource invoice/quote document not available.");
} }
$entity = false;
if (array_key_exists('expense_id', $resource) && $resource['expense_id'] && array_key_exists('expenses', $this->ids)) { if (array_key_exists('expense_id', $resource) && $resource['expense_id'] && array_key_exists('expenses', $this->ids)) {
$expense_id = $this->transformId('expenses', $resource['expense_id']); $expense_id = $this->transformId('expenses', $resource['expense_id']);
$entity = Expense::query()->where('id', $expense_id)->withTrashed()->first(); $entity = Expense::query()->where('id', $expense_id)->withTrashed()->first();

View File

@ -108,7 +108,7 @@ class PdfSlot extends Component
} }
public function downloadEInvoice() public function downloadEDocument()
{ {
$file_name = $this->entity->numberFormatter().'.xml'; $file_name = $this->entity->numberFormatter().'.xml';

View File

@ -796,15 +796,18 @@ class Client extends BaseModel implements HasLocalePreference
{ {
$defaults = []; $defaults = [];
if (! (array_key_exists('terms', $data) && is_string($data['terms']) && strlen($data['terms']) > 1)) { $terms = &$data['terms'];
$footer = &$data['footer'];
if (!$terms || ($terms && strlen((string)$terms) == 0)) {
$defaults['terms'] = $this->getSetting($entity_name.'_terms'); $defaults['terms'] = $this->getSetting($entity_name.'_terms');
} elseif (array_key_exists('terms', $data)) { } elseif ($terms) {
$defaults['terms'] = $data['terms']; $defaults['terms'] = $data['terms'];
} }
if (! (array_key_exists('footer', $data) && is_string($data['footer']) && strlen($data['footer']) > 1)) { if (!$footer || ($footer && strlen((string)$footer) == 0)) {
$defaults['footer'] = $this->getSetting($entity_name.'_footer'); $defaults['footer'] = $this->getSetting($entity_name.'_footer');
} elseif (array_key_exists('footer', $data)) { } elseif ($footer) {
$defaults['footer'] = $data['footer']; $defaults['footer'] = $data['footer'];
} }

View File

@ -2,6 +2,7 @@
namespace App\Models; namespace App\Models;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Database\Eloquent\SoftDeletes;
use Laracasts\Presenter\PresentableTrait; use Laracasts\Presenter\PresentableTrait;
@ -121,6 +122,22 @@ class Project extends BaseModel
return $this->hasMany(Task::class); return $this->hasMany(Task::class);
} }
public function expenses(): HasMany
{
return $this->hasMany(Expense::class);
}
public function invoices(): HasMany
{
return $this->hasMany(Invoice::class);
}
public function quotes(): HasMany
{
return $this->hasMany(Quote::class);
}
public function translate_entity() public function translate_entity()
{ {
return ctrans('texts.project'); return ctrans('texts.project');

View File

@ -126,14 +126,9 @@ class BaseDriver extends AbstractPaymentDriver
$fields[] = ['name' => 'client_name', 'label' => ctrans('texts.client_name'), 'type' => 'text', 'validation' => 'required']; $fields[] = ['name' => 'client_name', 'label' => ctrans('texts.client_name'), 'type' => 'text', 'validation' => 'required'];
} }
// if ($this->company_gateway->require_contact_name) { $fields[] = ['name' => 'contact_first_name', 'label' => ctrans('texts.first_name'), 'type' => 'text', 'validation' => 'required'];
$fields[] = ['name' => 'contact_first_name', 'label' => ctrans('texts.first_name'), 'type' => 'text', 'validation' => 'required']; $fields[] = ['name' => 'contact_last_name', 'label' => ctrans('texts.last_name'), 'type' => 'text', 'validation' => 'required'];
$fields[] = ['name' => 'contact_last_name', 'label' => ctrans('texts.last_name'), 'type' => 'text', 'validation' => 'required']; $fields[] = ['name' => 'contact_email', 'label' => ctrans('texts.email'), 'type' => 'text', 'validation' => 'required,email:rfc'];
// }
// if ($this->company_gateway->require_contact_email) {
$fields[] = ['name' => 'contact_email', 'label' => ctrans('texts.email'), 'type' => 'text', 'validation' => 'required,email:rfc'];
// }
if ($this->company_gateway->require_client_phone) { if ($this->company_gateway->require_client_phone) {
$fields[] = ['name' => 'client_phone', 'label' => ctrans('texts.client_phone'), 'type' => 'tel', 'validation' => 'required']; $fields[] = ['name' => 'client_phone', 'label' => ctrans('texts.client_phone'), 'type' => 'tel', 'validation' => 'required'];
@ -166,12 +161,10 @@ class BaseDriver extends AbstractPaymentDriver
$fields[] = ['name' => 'client_custom_value2', 'label' => $this->helpers->makeCustomField($this->client->company->custom_fields, 'client2'), 'type' => 'text', 'validation' => 'required']; $fields[] = ['name' => 'client_custom_value2', 'label' => $this->helpers->makeCustomField($this->client->company->custom_fields, 'client2'), 'type' => 'text', 'validation' => 'required'];
} }
if ($this->company_gateway->require_custom_value3) { if ($this->company_gateway->require_custom_value3) {
$fields[] = ['name' => 'client_custom_value3', 'label' => $this->helpers->makeCustomField($this->client->company->custom_fields, 'client3'), 'type' => 'text', 'validation' => 'required']; $fields[] = ['name' => 'client_custom_value3', 'label' => $this->helpers->makeCustomField($this->client->company->custom_fields, 'client3'), 'type' => 'text', 'validation' => 'required'];
} }
if ($this->company_gateway->require_custom_value4) { if ($this->company_gateway->require_custom_value4) {
$fields[] = ['name' => 'client_custom_value4', 'label' => $this->helpers->makeCustomField($this->client->company->custom_fields, 'client4'), 'type' => 'text', 'validation' => 'required']; $fields[] = ['name' => 'client_custom_value4', 'label' => $this->helpers->makeCustomField($this->client->company->custom_fields, 'client4'), 'type' => 'text', 'validation' => 'required'];
} }
@ -797,19 +790,24 @@ class BaseDriver extends AbstractPaymentDriver
'client' => $this->client->present()->name(), 'client' => $this->client->present()->name(),
]); ]);
return sprintf('%s: %s', ctrans('texts.invoices'), \implode(', ', collect($this->payment_hash->invoices())->pluck('invoice_number')->toArray())); // return sprintf('%s: %s', ctrans('texts.invoices'), \implode(', ', collect($this->payment_hash->invoices())->pluck('invoice_number')->toArray()));
} }
/** /**
* Stub for disconnecting from the gateway. * Stub for disconnecting from the gateway.
* *
* @return void * @return bool
*/ */
public function disconnect() public function disconnect()
{ {
return true; return true;
} }
/**
* Stub for checking authentication.
*
* @return bool
*/
public function auth(): bool public function auth(): bool
{ {
return true; return true;

View File

@ -287,6 +287,27 @@ class BraintreePaymentDriver extends BaseDriver
} }
} }
/**
* Required fields for client to fill, to proceed with gateway actions.
*
* @return array[]
*/
public function getClientRequiredFields(): array
{
$fields = [];
$fields[] = ['name' => 'contact_first_name', 'label' => ctrans('texts.first_name'), 'type' => 'text', 'validation' => 'required'];
$fields[] = ['name' => 'contact_last_name', 'label' => ctrans('texts.last_name'), 'type' => 'text', 'validation' => 'required'];
$fields[] = ['name' => 'contact_email', 'label' => ctrans('texts.email'), 'type' => 'text', 'validation' => 'required,email:rfc'];
$fields[] = ['name' => 'client_address_line_1', 'label' => ctrans('texts.address1'), 'type' => 'text', 'validation' => 'required'];
$fields[] = ['name' => 'client_city', 'label' => ctrans('texts.city'), 'type' => 'text', 'validation' => 'required'];
$fields[] = ['name' => 'client_state', 'label' => ctrans('texts.state'), 'type' => 'text', 'validation' => 'required'];
$fields[] = ['name' => 'client_country_id', 'label' => ctrans('texts.country'), 'type' => 'text', 'validation' => 'required'];
return $fields;
}
public function processWebhookRequest($request) public function processWebhookRequest($request)
{ {
$validator = Validator::make($request->all(), [ $validator = Validator::make($request->all(), [

View File

@ -61,9 +61,9 @@ class CreditCard
'State' => $this->eway_driver->client->state, 'State' => $this->eway_driver->client->state,
'PostalCode' => $this->eway_driver->client->postal_code, 'PostalCode' => $this->eway_driver->client->postal_code,
'Country' => $this->eway_driver->client->country->iso_3166_2, 'Country' => $this->eway_driver->client->country->iso_3166_2,
'Phone' => $this->eway_driver->client->phone, 'Phone' => $this->eway_driver->client->phone ?? '',
'Email' => $this->eway_driver->client->contacts()->first()->email, 'Email' => $this->eway_driver->client->contacts()->first()->email ?? '',
'Url' => $this->eway_driver->client->website, 'Url' => $this->eway_driver->client->website ?? '',
'Method' => \Eway\Rapid\Enum\PaymentMethod::CREATE_TOKEN_CUSTOMER, 'Method' => \Eway\Rapid\Enum\PaymentMethod::CREATE_TOKEN_CUSTOMER,
'SecuredCardData' => $securefieldcode, 'SecuredCardData' => $securefieldcode,
]; ];

View File

@ -165,8 +165,10 @@ class StripePaymentDriver extends BaseDriver
} }
if ($this->client if ($this->client
&& isset($this->client->country) && $this->client->currency()
&& in_array($this->client->country->iso_3166_3, ['AUS', 'DNK', 'DEU', 'ITA', 'LUX', 'NOR', 'SVN', 'GBR', 'AUT', 'EST', 'GRC', 'JPN', 'MYS', 'PRT', 'ESP', 'USA', 'BEL', 'FIN', 'HKG', 'LVA', 'NLD', 'SGP', 'SWE', 'CAN', 'FRA', 'IRL', 'LTU', 'NZL', 'SVK', 'CHE'])) { && in_array($this->client->currency()->code, ['CNY', 'AUD', 'CAD', 'EUR', 'GBP', 'HKD', 'JPY', 'SGD', 'MYR', 'NZD', 'USD'])) {
// && isset($this->client->country)
// && in_array($this->client->country->iso_3166_3, ['AUS', 'DNK', 'DEU', 'ITA', 'LUX', 'NOR', 'SVN', 'GBR', 'AUT', 'EST', 'GRC', 'JPN', 'MYS', 'PRT', 'ESP', 'USA', 'BEL', 'FIN', 'HKG', 'LVA', 'NLD', 'SGP', 'SWE', 'CAN', 'FRA', 'IRL', 'LTU', 'NZL', 'SVK', 'CHE'])) {
$types[] = GatewayType::ALIPAY; $types[] = GatewayType::ALIPAY;
} }

View File

@ -167,7 +167,8 @@ class BaseRepository
$company_defaults = $client->setCompanyDefaults($data, lcfirst($resource)); $company_defaults = $client->setCompanyDefaults($data, lcfirst($resource));
$data['exchange_rate'] = $company_defaults['exchange_rate']; $data['exchange_rate'] = $company_defaults['exchange_rate'];
$model->uses_inclusive_taxes = $client->getSetting('inclusive_taxes'); $model->uses_inclusive_taxes = $client->getSetting('inclusive_taxes');
$data = array_merge($company_defaults, $data); // $data = array_merge($company_defaults, $data);
$data = array_merge($data, $company_defaults);
} }
$tmp_data = $data; //preserves the $data array $tmp_data = $data; //preserves the $data array

View File

@ -453,12 +453,6 @@ class InvoiceService
if ((int) $pre_count != (int) $post_count) { if ((int) $pre_count != (int) $post_count) {
$adjustment = $balance - $new_balance; $adjustment = $balance - $new_balance;
// $this->invoice
// ->client
// ->service()
// ->updateBalance($adjustment * -1)
// ->save();
$this->invoice $this->invoice
->ledger() ->ledger()
->updateInvoiceBalance($adjustment * -1, 'Adjustment for removing gateway fee'); ->updateInvoiceBalance($adjustment * -1, 'Adjustment for removing gateway fee');

View File

@ -80,18 +80,29 @@ class PdfMaker
$replacements = []; $replacements = [];
$contents = $this->document->getElementsByTagName('ninja'); $contents = $this->document->getElementsByTagName('ninja');
$ts = new TemplateService(); $ts = new TemplateService();
if(isset($this->data['template']['entity'])) { if(isset($this->options['client'])) {
$client = $this->options['client'];
try { try {
$entity = $this->data['template']['entity']; $ts->setCompany($client->company);
$ts->setCompany($entity->company); $ts->addGlobal(['currency_code' => $client->company->currency()->code]);
} catch(\Exception $e) { } catch(\Exception $e) {
nlog($e->getMessage());
}
}
if(isset($this->options['vendor'])) {
$vendor = $this->options['vendor'];
try {
$ts->setCompany($vendor->company);
$ts->addGlobal(['currency_code' => $vendor->company->currency()->code]);
} catch(\Exception $e) {
nlog($e->getMessage());
} }
} }
$data = $ts->processData($this->options)->getData(); $data = $ts->processData($this->options)->setGlobals()->getData();
$twig = $ts->twig; $twig = $ts->twig;
foreach ($contents as $content) { foreach ($contents as $content) {

View File

@ -57,6 +57,13 @@ class PurchaseOrderExpense
$expense->number = empty($expense->number) ? $this->getNextExpenseNumber($expense) : $expense->number; $expense->number = empty($expense->number) ? $this->getNextExpenseNumber($expense) : $expense->number;
if($this->purchase_order->project_id){
$expense->project_id = $this->purchase_order->project_id;
$expense->client_id = $this->purchase_order->project->client_id;
}
elseif($this->purchase_order->client_id)
$expense->client_id = $this->purchase_order->client_id;
$expense->saveQuietly(); $expense->saveQuietly();
event('eloquent.created: App\Models\Expense', $expense); event('eloquent.created: App\Models\Expense', $expense);

View File

@ -79,7 +79,7 @@ class TemplateAction implements ShouldQueue
*/ */
public function handle() public function handle()
{ {
// nlog("inside template action"); nlog("inside template action");
MultiDB::setDb($this->db); MultiDB::setDb($this->db);
@ -108,7 +108,14 @@ class TemplateAction implements ShouldQueue
->where('company_id', $this->company->id) ->where('company_id', $this->company->id)
->get(); ->get();
// nlog($result->toArray()); /** Set a global currency_code */
$first_entity = $result->first();
if($first_entity->client)
$currency_code = $first_entity->client->currency()->code;
elseif($first_entity instanceof Client)
$currency_code = $first_entity->currency()->code;
else
$currency_code = $this->company->currency()->code;
if($result->count() <= 1) { if($result->count() <= 1) {
$data[$key] = collect($result); $data[$key] = collect($result);
@ -118,10 +125,9 @@ class TemplateAction implements ShouldQueue
$ts = $template_service $ts = $template_service
->setCompany($this->company) ->setCompany($this->company)
->addGlobal(['currency_code' => $currency_code])
->build($data); ->build($data);
// nlog($ts->getHtml());
if($this->send_email) { if($this->send_email) {
$pdf = $ts->getPdf(); $pdf = $ts->getPdf();
$this->sendEmail($pdf, $template); $this->sendEmail($pdf, $template);

View File

@ -157,9 +157,9 @@ class TemplateService
return $this; return $this;
} }
private function setGlobals(): self public function setGlobals(): self
{ {
foreach($this->global_vars as $key => $value) { foreach($this->global_vars as $key => $value) {
$this->twig->addGlobal($key, $value); $this->twig->addGlobal($key, $value);
} }
@ -241,8 +241,6 @@ class TemplateService
public function getPdf(): string public function getPdf(): string
{ {
// nlog($this->getHtml());
if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') {
$pdf = (new NinjaPdf())->build($this->compiled_html); $pdf = (new NinjaPdf())->build($this->compiled_html);
} else { } else {
@ -273,7 +271,7 @@ class TemplateService
{ {
$this->data = $this->preProcessDataBlocks($data); $this->data = $this->preProcessDataBlocks($data);
// nlog($this->data); // nlog(json_encode($this->data));
return $this; return $this;
} }

View File

@ -12,10 +12,13 @@
namespace App\Transformers; namespace App\Transformers;
use App\Models\Client;
use App\Models\Document;
use App\Models\Project;
use App\Models\Task; use App\Models\Task;
use App\Models\Quote;
use App\Models\Client;
use App\Models\Project;
use App\Models\Document;
use App\Models\Expense;
use App\Models\Invoice;
use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesHash;
/** /**
@ -35,6 +38,9 @@ class ProjectTransformer extends EntityTransformer
protected array $availableIncludes = [ protected array $availableIncludes = [
'client', 'client',
'tasks', 'tasks',
'invoices',
'expenses',
'quotes',
]; ];
public function includeDocuments(Project $project) public function includeDocuments(Project $project)
@ -67,6 +73,27 @@ class ProjectTransformer extends EntityTransformer
return $this->includeCollection($project->tasks, $transformer, Task::class); return $this->includeCollection($project->tasks, $transformer, Task::class);
} }
public function includeInvoices(Project $project): \League\Fractal\Resource\Collection
{
$transformer = new InvoiceTransformer($this->serializer);
return $this->includeCollection($project->invoices, $transformer, Invoice::class);
}
public function includeExpenses(Project $project): \League\Fractal\Resource\Collection
{
$transformer = new ExpenseTransformer($this->serializer);
return $this->includeCollection($project->expenses, $transformer, Expense::class);
}
public function includeQuotes(Project $project): \League\Fractal\Resource\Collection
{
$transformer = new QuoteTransformer($this->serializer);
return $this->includeCollection($project->quotes, $transformer, Quote::class);
}
public function transform(Project $project) public function transform(Project $project)
{ {
return [ return [

View File

@ -42,6 +42,7 @@ class TaskTransformer extends EntityTransformer
'project', 'project',
'user', 'user',
'invoice', 'invoice',
'assigned_user',
]; ];
public function includeDocuments(Task $task) public function includeDocuments(Task $task)
@ -73,6 +74,16 @@ class TaskTransformer extends EntityTransformer
return $this->includeItem($task->user, $transformer, User::class); return $this->includeItem($task->user, $transformer, User::class);
} }
public function includeAssignedUser(Task $task): ?Item
{
$transformer = new UserTransformer($this->serializer);
if (!$task->assigned_user) {
return null;
}
return $this->includeItem($task->assigned_user, $transformer, User::class);
}
public function includeClient(Task $task): ?Item public function includeClient(Task $task): ?Item
{ {

View File

@ -70,7 +70,7 @@
"league/flysystem-aws-s3-v3": "^3.0", "league/flysystem-aws-s3-v3": "^3.0",
"league/fractal": "^0.20.0", "league/fractal": "^0.20.0",
"league/omnipay": "^3.1", "league/omnipay": "^3.1",
"livewire/livewire": "^3.4", "livewire/livewire": "^3",
"microsoft/microsoft-graph": "^1.69", "microsoft/microsoft-graph": "^1.69",
"mollie/mollie-api-php": "^2.36", "mollie/mollie-api-php": "^2.36",
"nelexa/zip": "^4.0", "nelexa/zip": "^4.0",

270
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "b5347cd9ca42d75b5c80691e6b64dae5", "content-hash": "853c952c9b8cc2c562748aaaa293c3ea",
"packages": [ "packages": [
{ {
"name": "adrienrn/php-mimetyper", "name": "adrienrn/php-mimetyper",
@ -409,16 +409,16 @@
}, },
{ {
"name": "amphp/parallel", "name": "amphp/parallel",
"version": "v2.2.8", "version": "v2.2.9",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/amphp/parallel.git", "url": "https://github.com/amphp/parallel.git",
"reference": "efd71b342b64c2e46d904e4eb057ed5ab20f8e2d" "reference": "73d293f1fc4df1bebc3c4fce1432e82dd7032238"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/amphp/parallel/zipball/efd71b342b64c2e46d904e4eb057ed5ab20f8e2d", "url": "https://api.github.com/repos/amphp/parallel/zipball/73d293f1fc4df1bebc3c4fce1432e82dd7032238",
"reference": "efd71b342b64c2e46d904e4eb057ed5ab20f8e2d", "reference": "73d293f1fc4df1bebc3c4fce1432e82dd7032238",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -481,7 +481,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/amphp/parallel/issues", "issues": "https://github.com/amphp/parallel/issues",
"source": "https://github.com/amphp/parallel/tree/v2.2.8" "source": "https://github.com/amphp/parallel/tree/v2.2.9"
}, },
"funding": [ "funding": [
{ {
@ -489,20 +489,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-19T16:09:34+00:00" "time": "2024-03-24T18:27:44+00:00"
}, },
{ {
"name": "amphp/parser", "name": "amphp/parser",
"version": "v1.1.0", "version": "v1.1.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/amphp/parser.git", "url": "https://github.com/amphp/parser.git",
"reference": "ff1de4144726c5dad5fab97f66692ebe8de3e151" "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/amphp/parser/zipball/ff1de4144726c5dad5fab97f66692ebe8de3e151", "url": "https://api.github.com/repos/amphp/parser/zipball/3cf1f8b32a0171d4b1bed93d25617637a77cded7",
"reference": "ff1de4144726c5dad5fab97f66692ebe8de3e151", "reference": "3cf1f8b32a0171d4b1bed93d25617637a77cded7",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -543,7 +543,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/amphp/parser/issues", "issues": "https://github.com/amphp/parser/issues",
"source": "https://github.com/amphp/parser/tree/v1.1.0" "source": "https://github.com/amphp/parser/tree/v1.1.1"
}, },
"funding": [ "funding": [
{ {
@ -551,7 +551,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2022-12-30T18:08:47+00:00" "time": "2024-03-21T19:16:53+00:00"
}, },
{ {
"name": "amphp/pipeline", "name": "amphp/pipeline",
@ -1384,16 +1384,16 @@
}, },
{ {
"name": "aws/aws-sdk-php", "name": "aws/aws-sdk-php",
"version": "3.301.3", "version": "3.301.8",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/aws/aws-sdk-php.git", "url": "https://github.com/aws/aws-sdk-php.git",
"reference": "6b21e34d24a73ea66492869be90443069034fdb3" "reference": "a6ad44dd7bc4ace137d583c91439fa9c16331b01"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/6b21e34d24a73ea66492869be90443069034fdb3", "url": "https://api.github.com/repos/aws/aws-sdk-php/zipball/a6ad44dd7bc4ace137d583c91439fa9c16331b01",
"reference": "6b21e34d24a73ea66492869be90443069034fdb3", "reference": "a6ad44dd7bc4ace137d583c91439fa9c16331b01",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1473,9 +1473,9 @@
"support": { "support": {
"forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80", "forum": "https://forums.aws.amazon.com/forum.jspa?forumID=80",
"issues": "https://github.com/aws/aws-sdk-php/issues", "issues": "https://github.com/aws/aws-sdk-php/issues",
"source": "https://github.com/aws/aws-sdk-php/tree/3.301.3" "source": "https://github.com/aws/aws-sdk-php/tree/3.301.8"
}, },
"time": "2024-03-19T18:05:04+00:00" "time": "2024-03-26T18:14:03+00:00"
}, },
{ {
"name": "bacon/bacon-qr-code", "name": "bacon/bacon-qr-code",
@ -1585,16 +1585,16 @@
}, },
{ {
"name": "braintree/braintree_php", "name": "braintree/braintree_php",
"version": "6.17.0", "version": "6.18.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/braintree/braintree_php.git", "url": "https://github.com/braintree/braintree_php.git",
"reference": "37c187c91416003708632a58c230d03dbe88fb67" "reference": "8ca67004fe2405ef0b6b33a5897594fdcf417e0e"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/braintree/braintree_php/zipball/37c187c91416003708632a58c230d03dbe88fb67", "url": "https://api.github.com/repos/braintree/braintree_php/zipball/8ca67004fe2405ef0b6b33a5897594fdcf417e0e",
"reference": "37c187c91416003708632a58c230d03dbe88fb67", "reference": "8ca67004fe2405ef0b6b33a5897594fdcf417e0e",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1628,9 +1628,9 @@
"description": "Braintree PHP Client Library", "description": "Braintree PHP Client Library",
"support": { "support": {
"issues": "https://github.com/braintree/braintree_php/issues", "issues": "https://github.com/braintree/braintree_php/issues",
"source": "https://github.com/braintree/braintree_php/tree/6.17.0" "source": "https://github.com/braintree/braintree_php/tree/6.18.0"
}, },
"time": "2024-03-06T20:01:30+00:00" "time": "2024-03-26T21:08:13+00:00"
}, },
{ {
"name": "brick/math", "name": "brick/math",
@ -1758,16 +1758,16 @@
}, },
{ {
"name": "checkout/checkout-sdk-php", "name": "checkout/checkout-sdk-php",
"version": "3.0.21", "version": "3.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/checkout/checkout-sdk-php.git", "url": "https://github.com/checkout/checkout-sdk-php.git",
"reference": "0195aa0153b79b3f8350509e54a5654e57f62bd3" "reference": "dc1b71009f2456cabde720ee38d225c7e177adfb"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/checkout/checkout-sdk-php/zipball/0195aa0153b79b3f8350509e54a5654e57f62bd3", "url": "https://api.github.com/repos/checkout/checkout-sdk-php/zipball/dc1b71009f2456cabde720ee38d225c7e177adfb",
"reference": "0195aa0153b79b3f8350509e54a5654e57f62bd3", "reference": "dc1b71009f2456cabde720ee38d225c7e177adfb",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -1820,9 +1820,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/checkout/checkout-sdk-php/issues", "issues": "https://github.com/checkout/checkout-sdk-php/issues",
"source": "https://github.com/checkout/checkout-sdk-php/tree/3.0.21" "source": "https://github.com/checkout/checkout-sdk-php/tree/3.1.0"
}, },
"time": "2024-02-08T17:30:23+00:00" "time": "2024-03-26T12:27:04+00:00"
}, },
{ {
"name": "clue/stream-filter", "name": "clue/stream-filter",
@ -3542,16 +3542,16 @@
}, },
{ {
"name": "google/apiclient-services", "name": "google/apiclient-services",
"version": "v0.340.0", "version": "v0.341.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/googleapis/google-api-php-client-services.git", "url": "https://github.com/googleapis/google-api-php-client-services.git",
"reference": "c89999ea477da2b0803b2b4f14c9e7fc23b6344a" "reference": "50dad3cd4a3902bd2df0d96e7dc09cdaa2ba79b9"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/c89999ea477da2b0803b2b4f14c9e7fc23b6344a", "url": "https://api.github.com/repos/googleapis/google-api-php-client-services/zipball/50dad3cd4a3902bd2df0d96e7dc09cdaa2ba79b9",
"reference": "c89999ea477da2b0803b2b4f14c9e7fc23b6344a", "reference": "50dad3cd4a3902bd2df0d96e7dc09cdaa2ba79b9",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -3580,9 +3580,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/googleapis/google-api-php-client-services/issues", "issues": "https://github.com/googleapis/google-api-php-client-services/issues",
"source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.340.0" "source": "https://github.com/googleapis/google-api-php-client-services/tree/v0.341.0"
}, },
"time": "2024-03-17T00:56:17+00:00" "time": "2024-03-24T01:08:16+00:00"
}, },
{ {
"name": "google/auth", "name": "google/auth",
@ -4404,16 +4404,16 @@
}, },
{ {
"name": "horstoeko/orderx", "name": "horstoeko/orderx",
"version": "v1.0.19", "version": "v1.0.20",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/horstoeko/orderx.git", "url": "https://github.com/horstoeko/orderx.git",
"reference": "7b4ed00ca98df5a88c916733d31728a16a3845b4" "reference": "d8957cc0fea19b098d799a0c438a73504e7b326c"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/horstoeko/orderx/zipball/7b4ed00ca98df5a88c916733d31728a16a3845b4", "url": "https://api.github.com/repos/horstoeko/orderx/zipball/d8957cc0fea19b098d799a0c438a73504e7b326c",
"reference": "7b4ed00ca98df5a88c916733d31728a16a3845b4", "reference": "d8957cc0fea19b098d799a0c438a73504e7b326c",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4466,9 +4466,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/horstoeko/orderx/issues", "issues": "https://github.com/horstoeko/orderx/issues",
"source": "https://github.com/horstoeko/orderx/tree/v1.0.19" "source": "https://github.com/horstoeko/orderx/tree/v1.0.20"
}, },
"time": "2024-03-20T04:07:11+00:00" "time": "2024-03-21T04:28:54+00:00"
}, },
{ {
"name": "horstoeko/stringmanagement", "name": "horstoeko/stringmanagement",
@ -4526,16 +4526,16 @@
}, },
{ {
"name": "horstoeko/zugferd", "name": "horstoeko/zugferd",
"version": "v1.0.36", "version": "v1.0.37",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/horstoeko/zugferd.git", "url": "https://github.com/horstoeko/zugferd.git",
"reference": "0d15c305328c137365648fe1c34a584d877127fa" "reference": "05f58ad4dbcc23d767fceb15f46b46097ffd43f1"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/horstoeko/zugferd/zipball/0d15c305328c137365648fe1c34a584d877127fa", "url": "https://api.github.com/repos/horstoeko/zugferd/zipball/05f58ad4dbcc23d767fceb15f46b46097ffd43f1",
"reference": "0d15c305328c137365648fe1c34a584d877127fa", "reference": "05f58ad4dbcc23d767fceb15f46b46097ffd43f1",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -4553,6 +4553,7 @@
}, },
"require-dev": { "require-dev": {
"goetas-webservices/xsd2php": "^0", "goetas-webservices/xsd2php": "^0",
"nette/php-generator": "*",
"pdepend/pdepend": "^2", "pdepend/pdepend": "^2",
"phploc/phploc": "^7", "phploc/phploc": "^7",
"phpmd/phpmd": "^2", "phpmd/phpmd": "^2",
@ -4593,9 +4594,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/horstoeko/zugferd/issues", "issues": "https://github.com/horstoeko/zugferd/issues",
"source": "https://github.com/horstoeko/zugferd/tree/v1.0.36" "source": "https://github.com/horstoeko/zugferd/tree/v1.0.37"
}, },
"time": "2024-03-11T04:34:59+00:00" "time": "2024-03-24T11:31:03+00:00"
}, },
{ {
"name": "http-interop/http-factory-guzzle", "name": "http-interop/http-factory-guzzle",
@ -5526,16 +5527,16 @@
}, },
{ {
"name": "laravel/framework", "name": "laravel/framework",
"version": "v10.48.3", "version": "v10.48.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/framework.git", "url": "https://github.com/laravel/framework.git",
"reference": "5791c052b41c6b593556adc687076bfbdd13c501" "reference": "7e0701bf59cb76a51f7c1f7bea51c0c0c29c0b72"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/framework/zipball/5791c052b41c6b593556adc687076bfbdd13c501", "url": "https://api.github.com/repos/laravel/framework/zipball/7e0701bf59cb76a51f7c1f7bea51c0c0c29c0b72",
"reference": "5791c052b41c6b593556adc687076bfbdd13c501", "reference": "7e0701bf59cb76a51f7c1f7bea51c0c0c29c0b72",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5640,7 +5641,7 @@
"league/flysystem-sftp-v3": "^3.0", "league/flysystem-sftp-v3": "^3.0",
"mockery/mockery": "^1.5.1", "mockery/mockery": "^1.5.1",
"nyholm/psr7": "^1.2", "nyholm/psr7": "^1.2",
"orchestra/testbench-core": "^8.18", "orchestra/testbench-core": "^8.23.4",
"pda/pheanstalk": "^4.0", "pda/pheanstalk": "^4.0",
"phpstan/phpstan": "^1.4.7", "phpstan/phpstan": "^1.4.7",
"phpunit/phpunit": "^10.0.7", "phpunit/phpunit": "^10.0.7",
@ -5729,20 +5730,20 @@
"issues": "https://github.com/laravel/framework/issues", "issues": "https://github.com/laravel/framework/issues",
"source": "https://github.com/laravel/framework" "source": "https://github.com/laravel/framework"
}, },
"time": "2024-03-15T10:17:07+00:00" "time": "2024-03-21T13:36:36+00:00"
}, },
{ {
"name": "laravel/prompts", "name": "laravel/prompts",
"version": "v0.1.16", "version": "v0.1.17",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/prompts.git", "url": "https://github.com/laravel/prompts.git",
"reference": "ca6872ab6aec3ab61db3a61f83a6caf764ec7781" "reference": "8ee9f87f7f9eadcbe21e9e72cd4176b2f06cd5b5"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/prompts/zipball/ca6872ab6aec3ab61db3a61f83a6caf764ec7781", "url": "https://api.github.com/repos/laravel/prompts/zipball/8ee9f87f7f9eadcbe21e9e72cd4176b2f06cd5b5",
"reference": "ca6872ab6aec3ab61db3a61f83a6caf764ec7781", "reference": "8ee9f87f7f9eadcbe21e9e72cd4176b2f06cd5b5",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -5784,9 +5785,9 @@
], ],
"support": { "support": {
"issues": "https://github.com/laravel/prompts/issues", "issues": "https://github.com/laravel/prompts/issues",
"source": "https://github.com/laravel/prompts/tree/v0.1.16" "source": "https://github.com/laravel/prompts/tree/v0.1.17"
}, },
"time": "2024-02-21T19:25:27+00:00" "time": "2024-03-13T16:05:43+00:00"
}, },
{ {
"name": "laravel/serializable-closure", "name": "laravel/serializable-closure",
@ -6047,16 +6048,16 @@
}, },
{ {
"name": "laravel/ui", "name": "laravel/ui",
"version": "v4.5.0", "version": "v4.5.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/laravel/ui.git", "url": "https://github.com/laravel/ui.git",
"reference": "da3811f409297d13feccd5858ce748e7474b3d11" "reference": "a3562953123946996a503159199d6742d5534e61"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/laravel/ui/zipball/da3811f409297d13feccd5858ce748e7474b3d11", "url": "https://api.github.com/repos/laravel/ui/zipball/a3562953123946996a503159199d6742d5534e61",
"reference": "da3811f409297d13feccd5858ce748e7474b3d11", "reference": "a3562953123946996a503159199d6742d5534e61",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6064,7 +6065,8 @@
"illuminate/filesystem": "^9.21|^10.0|^11.0", "illuminate/filesystem": "^9.21|^10.0|^11.0",
"illuminate/support": "^9.21|^10.0|^11.0", "illuminate/support": "^9.21|^10.0|^11.0",
"illuminate/validation": "^9.21|^10.0|^11.0", "illuminate/validation": "^9.21|^10.0|^11.0",
"php": "^8.0" "php": "^8.0",
"symfony/console": "^6.0|^7.0"
}, },
"require-dev": { "require-dev": {
"orchestra/testbench": "^7.35|^8.15|^9.0", "orchestra/testbench": "^7.35|^8.15|^9.0",
@ -6103,9 +6105,9 @@
"ui" "ui"
], ],
"support": { "support": {
"source": "https://github.com/laravel/ui/tree/v4.5.0" "source": "https://github.com/laravel/ui/tree/v4.5.1"
}, },
"time": "2024-03-04T13:58:27+00:00" "time": "2024-03-21T18:12:29+00:00"
}, },
{ {
"name": "lcobucci/clock", "name": "lcobucci/clock",
@ -6524,16 +6526,16 @@
}, },
{ {
"name": "league/flysystem", "name": "league/flysystem",
"version": "3.25.1", "version": "3.26.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/flysystem.git", "url": "https://github.com/thephpleague/flysystem.git",
"reference": "abbd664eb4381102c559d358420989f835208f18" "reference": "072735c56cc0da00e10716dd90d5a7f7b40b36be"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem/zipball/abbd664eb4381102c559d358420989f835208f18", "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/072735c56cc0da00e10716dd90d5a7f7b40b36be",
"reference": "abbd664eb4381102c559d358420989f835208f18", "reference": "072735c56cc0da00e10716dd90d5a7f7b40b36be",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6598,7 +6600,7 @@
], ],
"support": { "support": {
"issues": "https://github.com/thephpleague/flysystem/issues", "issues": "https://github.com/thephpleague/flysystem/issues",
"source": "https://github.com/thephpleague/flysystem/tree/3.25.1" "source": "https://github.com/thephpleague/flysystem/tree/3.26.0"
}, },
"funding": [ "funding": [
{ {
@ -6610,20 +6612,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-16T12:53:19+00:00" "time": "2024-03-25T11:49:53+00:00"
}, },
{ {
"name": "league/flysystem-aws-s3-v3", "name": "league/flysystem-aws-s3-v3",
"version": "3.25.1", "version": "3.26.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git", "url": "https://github.com/thephpleague/flysystem-aws-s3-v3.git",
"reference": "6a5be0e6d6a93574e80805c9cc108a4b63c824d8" "reference": "885d0a758c71ae3cd6c503544573a1fdb8dc754f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/6a5be0e6d6a93574e80805c9cc108a4b63c824d8", "url": "https://api.github.com/repos/thephpleague/flysystem-aws-s3-v3/zipball/885d0a758c71ae3cd6c503544573a1fdb8dc754f",
"reference": "6a5be0e6d6a93574e80805c9cc108a4b63c824d8", "reference": "885d0a758c71ae3cd6c503544573a1fdb8dc754f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -6663,7 +6665,7 @@
"storage" "storage"
], ],
"support": { "support": {
"source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.25.1" "source": "https://github.com/thephpleague/flysystem-aws-s3-v3/tree/3.26.0"
}, },
"funding": [ "funding": [
{ {
@ -6675,7 +6677,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2024-03-15T19:58:44+00:00" "time": "2024-03-24T21:11:18+00:00"
}, },
{ {
"name": "league/flysystem-local", "name": "league/flysystem-local",
@ -7003,16 +7005,16 @@
}, },
{ {
"name": "league/uri", "name": "league/uri",
"version": "7.4.0", "version": "7.4.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/uri.git", "url": "https://github.com/thephpleague/uri.git",
"reference": "bf414ba956d902f5d98bf9385fcf63954f09dce5" "reference": "bedb6e55eff0c933668addaa7efa1e1f2c417cc4"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/uri/zipball/bf414ba956d902f5d98bf9385fcf63954f09dce5", "url": "https://api.github.com/repos/thephpleague/uri/zipball/bedb6e55eff0c933668addaa7efa1e1f2c417cc4",
"reference": "bf414ba956d902f5d98bf9385fcf63954f09dce5", "reference": "bedb6e55eff0c933668addaa7efa1e1f2c417cc4",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -7081,7 +7083,7 @@
"docs": "https://uri.thephpleague.com", "docs": "https://uri.thephpleague.com",
"forum": "https://thephpleague.slack.com", "forum": "https://thephpleague.slack.com",
"issues": "https://github.com/thephpleague/uri-src/issues", "issues": "https://github.com/thephpleague/uri-src/issues",
"source": "https://github.com/thephpleague/uri/tree/7.4.0" "source": "https://github.com/thephpleague/uri/tree/7.4.1"
}, },
"funding": [ "funding": [
{ {
@ -7089,20 +7091,20 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-12-01T06:24:25+00:00" "time": "2024-03-23T07:42:40+00:00"
}, },
{ {
"name": "league/uri-interfaces", "name": "league/uri-interfaces",
"version": "7.4.0", "version": "7.4.1",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/thephpleague/uri-interfaces.git", "url": "https://github.com/thephpleague/uri-interfaces.git",
"reference": "bd8c487ec236930f7bbc42b8d374fa882fbba0f3" "reference": "8d43ef5c841032c87e2de015972c06f3865ef718"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/bd8c487ec236930f7bbc42b8d374fa882fbba0f3", "url": "https://api.github.com/repos/thephpleague/uri-interfaces/zipball/8d43ef5c841032c87e2de015972c06f3865ef718",
"reference": "bd8c487ec236930f7bbc42b8d374fa882fbba0f3", "reference": "8d43ef5c841032c87e2de015972c06f3865ef718",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -7165,7 +7167,7 @@
"docs": "https://uri.thephpleague.com", "docs": "https://uri.thephpleague.com",
"forum": "https://thephpleague.slack.com", "forum": "https://thephpleague.slack.com",
"issues": "https://github.com/thephpleague/uri-src/issues", "issues": "https://github.com/thephpleague/uri-src/issues",
"source": "https://github.com/thephpleague/uri-interfaces/tree/7.4.0" "source": "https://github.com/thephpleague/uri-interfaces/tree/7.4.1"
}, },
"funding": [ "funding": [
{ {
@ -7173,7 +7175,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-11-24T15:40:42+00:00" "time": "2024-03-23T07:42:40+00:00"
}, },
{ {
"name": "livewire/livewire", "name": "livewire/livewire",
@ -9843,16 +9845,16 @@
}, },
{ {
"name": "phpstan/phpdoc-parser", "name": "phpstan/phpdoc-parser",
"version": "1.26.0", "version": "1.27.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpstan/phpdoc-parser.git", "url": "https://github.com/phpstan/phpdoc-parser.git",
"reference": "231e3186624c03d7e7c890ec662b81e6b0405227" "reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/231e3186624c03d7e7c890ec662b81e6b0405227", "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/86e4d5a4b036f8f0be1464522f4c6b584c452757",
"reference": "231e3186624c03d7e7c890ec662b81e6b0405227", "reference": "86e4d5a4b036f8f0be1464522f4c6b584c452757",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -9884,9 +9886,9 @@
"description": "PHPDoc parser with support for nullable, intersection and generic types", "description": "PHPDoc parser with support for nullable, intersection and generic types",
"support": { "support": {
"issues": "https://github.com/phpstan/phpdoc-parser/issues", "issues": "https://github.com/phpstan/phpdoc-parser/issues",
"source": "https://github.com/phpstan/phpdoc-parser/tree/1.26.0" "source": "https://github.com/phpstan/phpdoc-parser/tree/1.27.0"
}, },
"time": "2024-02-23T16:05:55+00:00" "time": "2024-03-21T13:14:53+00:00"
}, },
{ {
"name": "pragmarx/google2fa", "name": "pragmarx/google2fa",
@ -10966,16 +10968,16 @@
}, },
{ {
"name": "rmccue/requests", "name": "rmccue/requests",
"version": "v2.0.10", "version": "v2.0.11",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/WordPress/Requests.git", "url": "https://github.com/WordPress/Requests.git",
"reference": "bcf1ac7fe8c0b2b18c1df6d24694cfc96b44b391" "reference": "31435a468e2357e68df743f2527bda32556a0818"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/WordPress/Requests/zipball/bcf1ac7fe8c0b2b18c1df6d24694cfc96b44b391", "url": "https://api.github.com/repos/WordPress/Requests/zipball/31435a468e2357e68df743f2527bda32556a0818",
"reference": "bcf1ac7fe8c0b2b18c1df6d24694cfc96b44b391", "reference": "31435a468e2357e68df743f2527bda32556a0818",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -11049,7 +11051,7 @@
"issues": "https://github.com/WordPress/Requests/issues", "issues": "https://github.com/WordPress/Requests/issues",
"source": "https://github.com/WordPress/Requests" "source": "https://github.com/WordPress/Requests"
}, },
"time": "2024-01-08T11:14:32+00:00" "time": "2024-03-25T10:48:46+00:00"
}, },
{ {
"name": "sabre/uri", "name": "sabre/uri",
@ -16721,16 +16723,16 @@
}, },
{ {
"name": "composer/xdebug-handler", "name": "composer/xdebug-handler",
"version": "3.0.3", "version": "3.0.4",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/composer/xdebug-handler.git", "url": "https://github.com/composer/xdebug-handler.git",
"reference": "ced299686f41dce890debac69273b47ffe98a40c" "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/composer/xdebug-handler/zipball/ced299686f41dce890debac69273b47ffe98a40c", "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/4f988f8fdf580d53bdb2d1278fe93d1ed5462255",
"reference": "ced299686f41dce890debac69273b47ffe98a40c", "reference": "4f988f8fdf580d53bdb2d1278fe93d1ed5462255",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -16741,7 +16743,7 @@
"require-dev": { "require-dev": {
"phpstan/phpstan": "^1.0", "phpstan/phpstan": "^1.0",
"phpstan/phpstan-strict-rules": "^1.1", "phpstan/phpstan-strict-rules": "^1.1",
"symfony/phpunit-bridge": "^6.0" "phpunit/phpunit": "^8.5 || ^9.6 || ^10.5"
}, },
"type": "library", "type": "library",
"autoload": { "autoload": {
@ -16765,9 +16767,9 @@
"performance" "performance"
], ],
"support": { "support": {
"irc": "irc://irc.freenode.org/composer", "irc": "ircs://irc.libera.chat:6697/composer",
"issues": "https://github.com/composer/xdebug-handler/issues", "issues": "https://github.com/composer/xdebug-handler/issues",
"source": "https://github.com/composer/xdebug-handler/tree/3.0.3" "source": "https://github.com/composer/xdebug-handler/tree/3.0.4"
}, },
"funding": [ "funding": [
{ {
@ -16783,7 +16785,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2022-02-25T21:32:43+00:00" "time": "2024-03-26T18:29:49+00:00"
}, },
{ {
"name": "fidry/cpu-core-counter", "name": "fidry/cpu-core-counter",
@ -17289,16 +17291,16 @@
}, },
{ {
"name": "mockery/mockery", "name": "mockery/mockery",
"version": "1.6.10", "version": "1.6.11",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/mockery/mockery.git", "url": "https://github.com/mockery/mockery.git",
"reference": "47065d1be1fa05def58dc14c03cf831d3884ef0b" "reference": "81a161d0b135df89951abd52296adf97deb0723d"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/mockery/mockery/zipball/47065d1be1fa05def58dc14c03cf831d3884ef0b", "url": "https://api.github.com/repos/mockery/mockery/zipball/81a161d0b135df89951abd52296adf97deb0723d",
"reference": "47065d1be1fa05def58dc14c03cf831d3884ef0b", "reference": "81a161d0b135df89951abd52296adf97deb0723d",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -17368,7 +17370,7 @@
"security": "https://github.com/mockery/mockery/security/advisories", "security": "https://github.com/mockery/mockery/security/advisories",
"source": "https://github.com/mockery/mockery" "source": "https://github.com/mockery/mockery"
}, },
"time": "2024-03-19T16:15:45+00:00" "time": "2024-03-21T18:34:15+00:00"
}, },
{ {
"name": "myclabs/deep-copy", "name": "myclabs/deep-copy",
@ -17733,16 +17735,16 @@
}, },
{ {
"name": "phpstan/phpstan", "name": "phpstan/phpstan",
"version": "1.10.63", "version": "1.10.65",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/phpstan/phpstan.git", "url": "https://github.com/phpstan/phpstan.git",
"reference": "ad12836d9ca227301f5fb9960979574ed8628339" "reference": "3c657d057a0b7ecae19cb12db446bbc99d8839c6"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/phpstan/phpstan/zipball/ad12836d9ca227301f5fb9960979574ed8628339", "url": "https://api.github.com/repos/phpstan/phpstan/zipball/3c657d057a0b7ecae19cb12db446bbc99d8839c6",
"reference": "ad12836d9ca227301f5fb9960979574ed8628339", "reference": "3c657d057a0b7ecae19cb12db446bbc99d8839c6",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -17791,7 +17793,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-03-18T16:53:53+00:00" "time": "2024-03-23T10:30:26+00:00"
}, },
{ {
"name": "phpunit/php-code-coverage", "name": "phpunit/php-code-coverage",
@ -18116,16 +18118,16 @@
}, },
{ {
"name": "phpunit/phpunit", "name": "phpunit/phpunit",
"version": "10.5.13", "version": "10.5.15",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/phpunit.git", "url": "https://github.com/sebastianbergmann/phpunit.git",
"reference": "20a63fc1c6db29b15da3bd02d4b6cf59900088a7" "reference": "86376e05e8745ed81d88232ff92fee868247b07b"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/20a63fc1c6db29b15da3bd02d4b6cf59900088a7", "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/86376e05e8745ed81d88232ff92fee868247b07b",
"reference": "20a63fc1c6db29b15da3bd02d4b6cf59900088a7", "reference": "86376e05e8745ed81d88232ff92fee868247b07b",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -18197,7 +18199,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/phpunit/issues", "issues": "https://github.com/sebastianbergmann/phpunit/issues",
"security": "https://github.com/sebastianbergmann/phpunit/security/policy", "security": "https://github.com/sebastianbergmann/phpunit/security/policy",
"source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.13" "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.15"
}, },
"funding": [ "funding": [
{ {
@ -18213,7 +18215,7 @@
"type": "tidelift" "type": "tidelift"
} }
], ],
"time": "2024-03-12T15:37:41+00:00" "time": "2024-03-22T04:17:47+00:00"
}, },
{ {
"name": "sebastian/cli-parser", "name": "sebastian/cli-parser",
@ -18587,16 +18589,16 @@
}, },
{ {
"name": "sebastian/environment", "name": "sebastian/environment",
"version": "6.0.1", "version": "6.1.0",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/sebastianbergmann/environment.git", "url": "https://github.com/sebastianbergmann/environment.git",
"reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951" "reference": "8074dbcd93529b357029f5cc5058fd3e43666984"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/43c751b41d74f96cbbd4e07b7aec9675651e2951", "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984",
"reference": "43c751b41d74f96cbbd4e07b7aec9675651e2951", "reference": "8074dbcd93529b357029f5cc5058fd3e43666984",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
@ -18611,7 +18613,7 @@
"type": "library", "type": "library",
"extra": { "extra": {
"branch-alias": { "branch-alias": {
"dev-main": "6.0-dev" "dev-main": "6.1-dev"
} }
}, },
"autoload": { "autoload": {
@ -18639,7 +18641,7 @@
"support": { "support": {
"issues": "https://github.com/sebastianbergmann/environment/issues", "issues": "https://github.com/sebastianbergmann/environment/issues",
"security": "https://github.com/sebastianbergmann/environment/security/policy", "security": "https://github.com/sebastianbergmann/environment/security/policy",
"source": "https://github.com/sebastianbergmann/environment/tree/6.0.1" "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0"
}, },
"funding": [ "funding": [
{ {
@ -18647,7 +18649,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2023-04-11T05:39:26+00:00" "time": "2024-03-23T08:47:14+00:00"
}, },
{ {
"name": "sebastian/exporter", "name": "sebastian/exporter",

View File

@ -17,8 +17,8 @@ return [
'require_https' => env('REQUIRE_HTTPS', true), 'require_https' => env('REQUIRE_HTTPS', true),
'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_url' => rtrim(env('APP_URL', ''), '/'),
'app_domain' => env('APP_DOMAIN', 'invoicing.co'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
'app_version' => env('APP_VERSION', '5.8.37'), 'app_version' => env('APP_VERSION', '5.8.39'),
'app_tag' => env('APP_TAG', '5.8.37'), 'app_tag' => env('APP_TAG', '5.8.39'),
'minimum_client_version' => '5.0.16', 'minimum_client_version' => '5.0.16',
'terms_version' => '1.0.1', 'terms_version' => '1.0.1',
'api_secret' => env('API_SECRET', false), 'api_secret' => env('API_SECRET', false),

View File

@ -35,6 +35,7 @@ class ExpenseFactory extends Factory
'private_notes' => $this->faker->text(50), 'private_notes' => $this->faker->text(50),
'transaction_reference' => $this->faker->text(5), 'transaction_reference' => $this->faker->text(5),
'invoice_id' => null, 'invoice_id' => null,
'uses_inclusive_taxes' => false,
]; ];
} }
} }

View File

@ -46,6 +46,7 @@ class PurchaseOrderFactory extends Factory
'due_date' => $this->faker->date(), 'due_date' => $this->faker->date(),
'line_items' => InvoiceItemFactory::generate(5), 'line_items' => InvoiceItemFactory::generate(5),
'terms' => $this->faker->text(500), 'terms' => $this->faker->text(500),
'uses_inclusive_taxes' => false,
]; ];
} }
} }

View File

@ -0,0 +1,53 @@
<?php
use App\Models\Currency;
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
$cur = Currency::find(122);
if(!$cur) {
$cur = new \App\Models\Currency();
$cur->id = 122;
$cur->code = 'BTN';
$cur->name = "Bhutan Ngultrum";
$cur->symbol = 'Nu';
$cur->thousand_separator = ',';
$cur->decimal_separator = '.';
$cur->precision = 2;
$cur->save();
}
$cur = Currency::find(123);
if(!$cur) {
$cur = new \App\Models\Currency();
$cur->id = 123;
$cur->code = 'MRU';
$cur->name = "Mauritanian Ouguiya";
$cur->symbol = 'UM';
$cur->thousand_separator = ',';
$cur->decimal_separator = '.';
$cur->precision = 2;
$cur->save();
}
}
/**
* Reverse the migrations.
*/
public function down(): void
{
//
}
};

View File

@ -144,6 +144,8 @@ class CurrenciesSeeder extends Seeder
['id' => 119, 'name' => 'Malagasy ariary', 'code' => 'MGA', 'symbol' => 'Ar', 'precision' => '0', 'thousand_separator' => ',', 'decimal_separator' => '.'], ['id' => 119, 'name' => 'Malagasy ariary', 'code' => 'MGA', 'symbol' => 'Ar', 'precision' => '0', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['id' => 120, 'name' => "Tongan Pa anga", 'code' => 'TOP', 'symbol' => 'T$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'], ['id' => 120, 'name' => "Tongan Pa anga", 'code' => 'TOP', 'symbol' => 'T$', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['id' => 121, 'name' => "Lao kip", 'code' => 'LAK', 'symbol' => '₭', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'], ['id' => 121, 'name' => "Lao kip", 'code' => 'LAK', 'symbol' => '₭', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['id' => 122, 'name' => "Bhutan Ngultrum", 'code' => 'BTN', 'symbol' => 'Nu', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
['id' => 123, 'name' => "Mauritanian Ouguiya", 'code' => 'MRU', 'symbol' => 'UM', 'precision' => '2', 'thousand_separator' => ',', 'decimal_separator' => '.'],
]; ];
foreach ($currencies as $currency) { foreach ($currencies as $currency) {

View File

@ -453,9 +453,9 @@ $lang = array(
'edit_token' => 'تحرير الرمز', 'edit_token' => 'تحرير الرمز',
'delete_token' => 'حذف الرمز المميز', 'delete_token' => 'حذف الرمز المميز',
'token' => 'رمز', 'token' => 'رمز',
'add_gateway' => 'Add Payment Gateway', 'add_gateway' => 'اضافة بوابة الدفع',
'delete_gateway' => 'حذف البوابة', 'delete_gateway' => 'حذف بوابة الدفع',
'edit_gateway' => 'تحرير البوابة', 'edit_gateway' => 'تحرير بوابة الدفع',
'updated_gateway' => 'تم تحديث البوابة بنجاح', 'updated_gateway' => 'تم تحديث البوابة بنجاح',
'created_gateway' => 'تم إنشاء البوابة بنجاح', 'created_gateway' => 'تم إنشاء البوابة بنجاح',
'deleted_gateway' => 'تم حذف البوابة بنجاح', 'deleted_gateway' => 'تم حذف البوابة بنجاح',
@ -2178,6 +2178,8 @@ $lang = array(
'encryption' => 'التشفير', 'encryption' => 'التشفير',
'mailgun_domain' => 'مجال Mailgun', 'mailgun_domain' => 'مجال Mailgun',
'mailgun_private_key' => 'مفتاح Mailgun الخاص', 'mailgun_private_key' => 'مفتاح Mailgun الخاص',
'brevo_domain' => 'مجال بريفو',
'brevo_private_key' => 'مفتاح بريفو الخاص',
'send_test_email' => 'إرسال بريد إلكتروني تجريبي', 'send_test_email' => 'إرسال بريد إلكتروني تجريبي',
'select_label' => 'حدد تسمية', 'select_label' => 'حدد تسمية',
'label' => 'ملصق', 'label' => 'ملصق',
@ -4828,6 +4830,7 @@ $lang = array(
'email_alignment' => 'محاذاة البريد الإلكتروني', 'email_alignment' => 'محاذاة البريد الإلكتروني',
'pdf_preview_location' => 'موقع معاينة PDF', 'pdf_preview_location' => 'موقع معاينة PDF',
'mailgun' => 'Mailgun', 'mailgun' => 'Mailgun',
'brevo' => 'بريفو',
'postmark' => 'ختم البريد', 'postmark' => 'ختم البريد',
'microsoft' => 'مايكروسوفت', 'microsoft' => 'مايكروسوفت',
'click_plus_to_create_record' => 'انقر فوق + لإنشاء سجل', 'click_plus_to_create_record' => 'انقر فوق + لإنشاء سجل',
@ -5080,6 +5083,8 @@ $lang = array(
'drop_files_here' => 'قم بوضع الملفات هنا', 'drop_files_here' => 'قم بوضع الملفات هنا',
'upload_files' => 'تحميل الملفات', 'upload_files' => 'تحميل الملفات',
'download_e_invoice' => 'تحميل الفاتورة الإلكترونية', 'download_e_invoice' => 'تحميل الفاتورة الإلكترونية',
'download_e_credit' => 'تحميل الائتمان الالكتروني',
'download_e_quote' => 'تحميل الاقتباس الإلكتروني',
'triangular_tax_info' => 'المعاملات الثلاثية داخل المجتمع', 'triangular_tax_info' => 'المعاملات الثلاثية داخل المجتمع',
'intracommunity_tax_info' => 'التوصيل داخل المجتمع معفي من الضرائب', 'intracommunity_tax_info' => 'التوصيل داخل المجتمع معفي من الضرائب',
'reverse_tax_info' => 'يرجى ملاحظة أن هذا العرض يخضع لرسوم عكسية', 'reverse_tax_info' => 'يرجى ملاحظة أن هذا العرض يخضع لرسوم عكسية',
@ -5182,7 +5187,7 @@ $lang = array(
'nordigen_handler_error_heading_requisition_invalid_status' => 'غير جاهز', 'nordigen_handler_error_heading_requisition_invalid_status' => 'غير جاهز',
'nordigen_handler_error_contents_requisition_invalid_status' => 'لقد اتصلت بهذا الموقع مبكرًا جدًا. الرجاء إنهاء الترخيص وتحديث هذه الصفحة. اتصل بالدعم للحصول على المساعدة، إذا استمرت هذه المشكلة.', 'nordigen_handler_error_contents_requisition_invalid_status' => 'لقد اتصلت بهذا الموقع مبكرًا جدًا. الرجاء إنهاء الترخيص وتحديث هذه الصفحة. اتصل بالدعم للحصول على المساعدة، إذا استمرت هذه المشكلة.',
'nordigen_handler_error_heading_requisition_no_accounts' => 'لم يتم تحديد أي حسابات', 'nordigen_handler_error_heading_requisition_no_accounts' => 'لم يتم تحديد أي حسابات',
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.', 'nordigen_handler_error_contents_requisition_no_accounts' => 'لم تقم الخدمة بإرجاع أي حسابات صالحة. فكر في إعادة تشغيل التدفق.',
'nordigen_handler_restart' => 'إعادة تشغيل التدفق.', 'nordigen_handler_restart' => 'إعادة تشغيل التدفق.',
'nordigen_handler_return' => 'العودة إلى التطبيق.', 'nordigen_handler_return' => 'العودة إلى التطبيق.',
'lang_Lao' => 'لاو', 'lang_Lao' => 'لاو',
@ -5223,18 +5228,28 @@ $lang = array(
'gateway_type' => 'نوع البوابة', 'gateway_type' => 'نوع البوابة',
'save_template_body' => 'هل ترغب في حفظ تعيين الاستيراد هذا كقالب لاستخدامه في المستقبل؟', 'save_template_body' => 'هل ترغب في حفظ تعيين الاستيراد هذا كقالب لاستخدامه في المستقبل؟',
'save_as_template' => 'حفظ تعيين القالب', 'save_as_template' => 'حفظ تعيين القالب',
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date', 'auto_bill_standard_invoices_help' => 'فواتير تلقائية قياسية في تاريخ الاستحقاق',
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)', 'auto_bill_on_help' => 'فاتورة تلقائية في تاريخ الإرسال أو تاريخ الاستحقاق (الفواتير المتكررة)',
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method', 'use_available_credits_help' => 'قم بتطبيق أي أرصدة دائنة على الدفعات قبل تحصيل رسوم طريقة الدفع',
'use_unapplied_payments' => 'Use unapplied payments', 'use_unapplied_payments' => 'استخدم الدفعات غير المطبقة',
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method', 'use_unapplied_payments_help' => 'قم بتطبيق أي أرصدة دفع قبل فرض رسوم على طريقة الدفع',
'payment_terms_help' => 'يضبط <b>تاريخ استحقاق الفاتورة</b> الافتراضي', 'payment_terms_help' => 'يضبط <b>تاريخ استحقاق الفاتورة</b> الافتراضي',
'payment_type_help' => 'يعيّن <b>نوع الدفع اليدوي</b> الافتراضي.', 'payment_type_help' => 'يعيّن <b>نوع الدفع اليدوي</b> الافتراضي.',
'quote_valid_until_help' => 'The number of days that the quote is valid for', 'quote_valid_until_help' => 'عدد الأيام التي يكون عرض الأسعار صالحًا لها',
'expense_payment_type_help' => 'The default expense payment type to be used', 'expense_payment_type_help' => 'نوع دفع النفقات الافتراضي الذي سيتم استخدامه',
'paylater' => 'Pay in 4', 'paylater' => 'الدفع في 4',
'payment_provider' => 'Payment Provider', 'payment_provider' => 'مزود الدفع',
'select_email_provider' => 'قم بتعيين بريدك الإلكتروني كمستخدم مرسل',
'purchase_order_items' => 'عناصر أمر الشراء',
'csv_rows_length' => 'لم يتم العثور على بيانات في ملف CSV هذا',
'accept_payments_online' => 'قبول المدفوعات عبر الإنترنت',
'all_payment_gateways' => 'عرض جميع بوابات الدفع',
'product_cost' => 'تكلفة المنتج',
'enable_rappen_roudning' => 'تمكين تقريب Rappen',
'enable_rappen_rounding_help' => 'تقريب الإجماليات إلى أقرب 5',
'duration_words' => 'المدة بالكلمات',
'upcoming_recurring_invoices' => 'الفواتير المتكررة القادمة',
'total_invoices' => 'إجمالي الفواتير',
); );
return $lang; return $lang;

View File

@ -462,8 +462,8 @@ $lang = array(
'delete_token' => 'Изтриване на токън', 'delete_token' => 'Изтриване на токън',
'token' => 'Токън', 'token' => 'Токън',
'add_gateway' => 'Add Payment Gateway', 'add_gateway' => 'Add Payment Gateway',
'delete_gateway' => 'Изтриване на Gateway', 'delete_gateway' => 'Delete Payment Gateway',
'edit_gateway' => 'Редакция на Gateway', 'edit_gateway' => 'Edit Payment Gateway',
'updated_gateway' => 'Успешно актуализиран Gateway', 'updated_gateway' => 'Успешно актуализиран Gateway',
'created_gateway' => 'Успешно създаден Gateway', 'created_gateway' => 'Успешно създаден Gateway',
'deleted_gateway' => 'Успешно изтрит Gateway', 'deleted_gateway' => 'Успешно изтрит Gateway',
@ -2198,6 +2198,8 @@ $lang = array(
'encryption' => 'Криптиране', 'encryption' => 'Криптиране',
'mailgun_domain' => 'Mailgun домейн', 'mailgun_domain' => 'Mailgun домейн',
'mailgun_private_key' => 'Mailgun частен ключ', 'mailgun_private_key' => 'Mailgun частен ключ',
'brevo_domain' => 'Brevo Domain',
'brevo_private_key' => 'Brevo Private Key',
'send_test_email' => 'Изпращане на тестов имейл', 'send_test_email' => 'Изпращане на тестов имейл',
'select_label' => 'Избор на етикет', 'select_label' => 'Избор на етикет',
'label' => 'Етикет', 'label' => 'Етикет',
@ -4848,6 +4850,7 @@ $lang = array(
'email_alignment' => 'Email Alignment', 'email_alignment' => 'Email Alignment',
'pdf_preview_location' => 'PDF Preview Location', 'pdf_preview_location' => 'PDF Preview Location',
'mailgun' => 'Mailgun', 'mailgun' => 'Mailgun',
'brevo' => 'Brevo',
'postmark' => 'Postmark', 'postmark' => 'Postmark',
'microsoft' => 'Microsoft', 'microsoft' => 'Microsoft',
'click_plus_to_create_record' => 'Click + to create a record', 'click_plus_to_create_record' => 'Click + to create a record',
@ -5100,6 +5103,8 @@ $lang = array(
'drop_files_here' => 'Drop files here', 'drop_files_here' => 'Drop files here',
'upload_files' => 'Upload Files', 'upload_files' => 'Upload Files',
'download_e_invoice' => 'Download E-Invoice', 'download_e_invoice' => 'Download E-Invoice',
'download_e_credit' => 'Download E-Credit',
'download_e_quote' => 'Download E-Quote',
'triangular_tax_info' => 'Intra-community triangular transaction', 'triangular_tax_info' => 'Intra-community triangular transaction',
'intracommunity_tax_info' => 'Tax-free intra-community delivery', 'intracommunity_tax_info' => 'Tax-free intra-community delivery',
'reverse_tax_info' => 'Please note that this supply is subject to reverse charge', 'reverse_tax_info' => 'Please note that this supply is subject to reverse charge',
@ -5254,7 +5259,17 @@ $lang = array(
'expense_payment_type_help' => 'The default expense payment type to be used', 'expense_payment_type_help' => 'The default expense payment type to be used',
'paylater' => 'Pay in 4', 'paylater' => 'Pay in 4',
'payment_provider' => 'Payment Provider', 'payment_provider' => 'Payment Provider',
'select_email_provider' => 'Set your email as the sending user',
'purchase_order_items' => 'Purchase Order Items',
'csv_rows_length' => 'No data found in this CSV file',
'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',
'total_invoices' => 'Total Invoices',
); );
return $lang; return $lang;

View File

@ -460,9 +460,9 @@ $lang = array(
'edit_token' => 'Edit Token', 'edit_token' => 'Edit Token',
'delete_token' => 'Delete Token', 'delete_token' => 'Delete Token',
'token' => 'Token', 'token' => 'Token',
'add_gateway' => 'Add Payment Gateway', 'add_gateway' => 'Afegiu passarel·la de pagament',
'delete_gateway' => 'Delete Gateway', 'delete_gateway' => 'Suprimeix la passarel·la de pagament',
'edit_gateway' => 'Edit Gateway', 'edit_gateway' => 'Edita la passarel·la de pagament',
'updated_gateway' => 'Successfully updated gateway', 'updated_gateway' => 'Successfully updated gateway',
'created_gateway' => 'Successfully created gateway', 'created_gateway' => 'Successfully created gateway',
'deleted_gateway' => 'Successfully deleted gateway', 'deleted_gateway' => 'Successfully deleted gateway',
@ -506,8 +506,8 @@ $lang = array(
'auto_wrap' => 'Auto Line Wrap', 'auto_wrap' => 'Auto Line Wrap',
'duplicate_post' => 'Warning: the previous page was submitted twice. The second submission had been ignored.', 'duplicate_post' => 'Warning: the previous page was submitted twice. The second submission had been ignored.',
'view_documentation' => 'View Documentation', 'view_documentation' => 'View Documentation',
'app_title' => 'Free Online Invoicing', 'app_title' => 'Facturació en línia gratuïta',
'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.', 'app_description' => 'Invoice Ninja és una solució gratuïta de codi obert per a la facturació i facturació dels clients. Amb Invoice Ninja, podeu crear i enviar factures precioses fàcilment des de qualsevol dispositiu que tingui accés al web. Els vostres clients poden imprimir les vostres factures, descarregar-les com a fitxers pdf i fins i tot pagar-vos en línia des del sistema.',
'rows' => 'rows', 'rows' => 'rows',
'www' => 'www', 'www' => 'www',
'logo' => 'Logo', 'logo' => 'Logo',
@ -693,9 +693,9 @@ $lang = array(
'disable' => 'Disable', 'disable' => 'Disable',
'invoice_quote_number' => 'Invoice and Quote Numbers', 'invoice_quote_number' => 'Invoice and Quote Numbers',
'invoice_charges' => 'Invoice Surcharges', 'invoice_charges' => 'Invoice Surcharges',
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact. <br><br> :error', 'notification_invoice_bounced' => 'No hem pogut lliurar la factura :invoice a :contact .<br><br> :error',
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice', 'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact. <br><br> :error', 'notification_quote_bounced' => 'No hem pogut lliurar el pressupost :invoice a :contact .<br><br> :error',
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice', 'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
'custom_invoice_link' => 'Custom Invoice Link', 'custom_invoice_link' => 'Custom Invoice Link',
'total_invoiced' => 'Total Invoiced', 'total_invoiced' => 'Total Invoiced',
@ -2197,6 +2197,8 @@ $lang = array(
'encryption' => 'Encryption', 'encryption' => 'Encryption',
'mailgun_domain' => 'Mailgun Domain', 'mailgun_domain' => 'Mailgun Domain',
'mailgun_private_key' => 'Mailgun Private Key', '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', 'select_label' => 'Select Label',
'label' => 'Label', 'label' => 'Label',
@ -2362,9 +2364,9 @@ $lang = array(
'currency_libyan_dinar' => 'Dinar libi', 'currency_libyan_dinar' => 'Dinar libi',
'currency_silver_troy_ounce' => 'Unça Troia de plata', 'currency_silver_troy_ounce' => 'Unça Troia de plata',
'currency_gold_troy_ounce' => 'Unça Troia d&#39;or', 'currency_gold_troy_ounce' => 'Unça Troia d&#39;or',
'currency_nicaraguan_córdoba' => 'Nicaraguan Córdoba', 'currency_nicaraguan_córdoba' => 'Còrdova nicaragüenca',
'currency_malagasy_ariary' => 'Malagasy ariary', 'currency_malagasy_ariary' => 'ariary malgaix',
"currency_tongan_pa_anga" => "Tongan Pa'anga", "currency_tongan_pa_anga" => "Pa&#39;anga de Tonga",
'review_app_help' => 'We hope you\'re enjoying using the app.<br/>If you\'d consider :link we\'d greatly appreciate it!', 'review_app_help' => 'We hope you\'re enjoying using the app.<br/>If you\'d consider :link we\'d greatly appreciate it!',
'writing_a_review' => 'escriu una ressenya', 'writing_a_review' => 'escriu una ressenya',
@ -2475,8 +2477,8 @@ $lang = array(
'partial_due_date' => 'Data venciment parcial', 'partial_due_date' => 'Data venciment parcial',
'task_fields' => 'Task Fields', 'task_fields' => 'Task Fields',
'product_fields_help' => 'Drag and drop fields to change their order', 'product_fields_help' => 'Drag and drop fields to change their order',
'custom_value1' => 'Custom Value 1', 'custom_value1' => 'Valor personalitzat 1',
'custom_value2' => 'Custom Value 2', 'custom_value2' => 'Valor personalitzat 2',
'enable_two_factor' => 'Two-Factor Authentication', 'enable_two_factor' => 'Two-Factor Authentication',
'enable_two_factor_help' => 'Use your phone to confirm your identity when logging in', 'enable_two_factor_help' => 'Use your phone to confirm your identity when logging in',
'two_factor_setup' => 'Two-Factor Setup', 'two_factor_setup' => 'Two-Factor Setup',
@ -3010,7 +3012,7 @@ $lang = array(
'hosted_login' => 'Hosted Login', 'hosted_login' => 'Hosted Login',
'selfhost_login' => 'Selfhost Login', 'selfhost_login' => 'Selfhost Login',
'google_login' => 'Google Login', 'google_login' => 'Google Login',
'thanks_for_patience' => 'Thank for your patience while we work to implement these features.<br><br>We hope to have them completed in the next few months.<br><br>Until then we\'ll continue to support the', 'thanks_for_patience' => 'Gràcies per la vostra paciència mentre treballem per implementar aquestes funcions.<br><br> Esperem tenir-les enllestides en els propers mesos.<br><br> Fins aleshores continuarem donant suport a',
'legacy_mobile_app' => 'legacy mobile app', 'legacy_mobile_app' => 'legacy mobile app',
'today' => 'Avui', 'today' => 'Avui',
'current' => 'Actual', 'current' => 'Actual',
@ -3297,9 +3299,9 @@ $lang = array(
'freq_three_years' => 'Three Years', 'freq_three_years' => 'Three Years',
'military_time_help' => '24 Hour Display', 'military_time_help' => '24 Hour Display',
'click_here_capital' => 'Click here', 'click_here_capital' => 'Click here',
'marked_invoice_as_paid' => 'Successfully marked invoice as paid', 'marked_invoice_as_paid' => 'La factura s&#39;ha marcat correctament com a pagada',
'marked_invoices_as_sent' => 'Successfully marked invoices as sent', 'marked_invoices_as_sent' => 'Successfully marked invoices as sent',
'marked_invoices_as_paid' => 'Successfully marked invoices as paid', 'marked_invoices_as_paid' => 'S&#39;han marcat correctament les factures com a pagades',
'activity_57' => 'System failed to email invoice :invoice', 'activity_57' => 'System failed to email invoice :invoice',
'custom_value3' => 'Custom Value 3', 'custom_value3' => 'Custom Value 3',
'custom_value4' => 'Custom Value 4', 'custom_value4' => 'Custom Value 4',
@ -3328,7 +3330,7 @@ $lang = array(
'credit_number_counter' => 'Credit Number Counter', 'credit_number_counter' => 'Credit Number Counter',
'reset_counter_date' => 'Reset Counter Date', 'reset_counter_date' => 'Reset Counter Date',
'counter_padding' => 'Counter Padding', 'counter_padding' => 'Counter Padding',
'shared_invoice_quote_counter' => 'Share Invoice/Quote Counter', 'shared_invoice_quote_counter' => 'Comparteix factura/comptador de pressupostos',
'default_tax_name_1' => 'Default Tax Name 1', 'default_tax_name_1' => 'Default Tax Name 1',
'default_tax_rate_1' => 'Default Tax Rate 1', 'default_tax_rate_1' => 'Default Tax Rate 1',
'default_tax_name_2' => 'Default Tax Name 2', 'default_tax_name_2' => 'Default Tax Name 2',
@ -3639,9 +3641,9 @@ $lang = array(
'send_date' => 'Send Date', 'send_date' => 'Send Date',
'auto_bill_on' => 'Auto Bill On', 'auto_bill_on' => 'Auto Bill On',
'minimum_under_payment_amount' => 'Minimum Under Payment Amount', 'minimum_under_payment_amount' => 'Minimum Under Payment Amount',
'allow_over_payment' => 'Allow Overpayment', 'allow_over_payment' => 'Permetre el pagament en excés',
'allow_over_payment_help' => 'Support paying extra to accept tips', 'allow_over_payment_help' => 'Support paying extra to accept tips',
'allow_under_payment' => 'Allow Underpayment', 'allow_under_payment' => 'Permetre el pagament insuficient',
'allow_under_payment_help' => 'Support paying at minimum the partial/deposit amount', 'allow_under_payment_help' => 'Support paying at minimum the partial/deposit amount',
'test_mode' => 'Test Mode', 'test_mode' => 'Test Mode',
'calculated_rate' => 'Calculated Rate', 'calculated_rate' => 'Calculated Rate',
@ -3821,7 +3823,7 @@ $lang = array(
'notification_credit_viewed' => 'The following client :client viewed Credit :credit for :amount.', 'notification_credit_viewed' => 'The following client :client viewed Credit :credit for :amount.',
'reset_password_text' => 'Enter your email to reset your password.', 'reset_password_text' => 'Enter your email to reset your password.',
'password_reset' => 'Password reset', 'password_reset' => 'Password reset',
'account_login_text' => 'Welcome! Glad to see you.', 'account_login_text' => 'Benvingut! Content de veure&#39;t.',
'request_cancellation' => 'Request cancellation', 'request_cancellation' => 'Request cancellation',
'delete_payment_method' => 'Delete Payment Method', 'delete_payment_method' => 'Delete Payment Method',
'about_to_delete_payment_method' => 'You are about to delete the payment method.', 'about_to_delete_payment_method' => 'You are about to delete the payment method.',
@ -3868,7 +3870,7 @@ $lang = array(
'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!', 'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!',
'list_of_payments' => 'List of payments', 'list_of_payments' => 'List of payments',
'payment_details' => 'Details of the payment', 'payment_details' => 'Details of the payment',
'list_of_payment_invoices' => 'Associate invoices', 'list_of_payment_invoices' => 'Factures associades',
'list_of_payment_methods' => 'List of payment methods', 'list_of_payment_methods' => 'List of payment methods',
'payment_method_details' => 'Details of payment method', 'payment_method_details' => 'Details of payment method',
'permanently_remove_payment_method' => 'Permanently remove this payment method.', 'permanently_remove_payment_method' => 'Permanently remove this payment method.',
@ -3935,11 +3937,11 @@ $lang = array(
'add_payment_method_first' => 'add payment method', 'add_payment_method_first' => 'add payment method',
'no_items_selected' => 'No items selected.', 'no_items_selected' => 'No items selected.',
'payment_due' => 'Payment due', 'payment_due' => 'Payment due',
'account_balance' => 'Account Balance', 'account_balance' => 'Saldo del compte',
'thanks' => 'Thanks', 'thanks' => 'Thanks',
'minimum_required_payment' => 'Minimum required payment is :amount', 'minimum_required_payment' => 'Minimum required payment is :amount',
'under_payments_disabled' => 'Company doesn\'t support underpayments.', 'under_payments_disabled' => 'L&#39;empresa no admet pagaments insuficients.',
'over_payments_disabled' => 'Company doesn\'t support overpayments.', 'over_payments_disabled' => 'L&#39;empresa no admet pagaments en excés.',
'saved_at' => 'Saved at :time', 'saved_at' => 'Saved at :time',
'credit_payment' => 'Credit applied to Invoice :invoice_number', 'credit_payment' => 'Credit applied to Invoice :invoice_number',
'credit_subject' => 'New credit :number from :account', 'credit_subject' => 'New credit :number from :account',
@ -3960,7 +3962,7 @@ $lang = array(
'notification_invoice_reminder1_sent_subject' => 'Reminder 1 for Invoice :invoice was sent to :client', 'notification_invoice_reminder1_sent_subject' => 'Reminder 1 for Invoice :invoice was sent to :client',
'notification_invoice_reminder2_sent_subject' => 'Reminder 2 for Invoice :invoice was sent to :client', 'notification_invoice_reminder2_sent_subject' => 'Reminder 2 for Invoice :invoice was sent to :client',
'notification_invoice_reminder3_sent_subject' => 'Reminder 3 for Invoice :invoice was sent to :client', 'notification_invoice_reminder3_sent_subject' => 'Reminder 3 for Invoice :invoice was sent to :client',
'notification_invoice_custom_sent_subject' => 'Custom reminder for Invoice :invoice was sent to :client', 'notification_invoice_custom_sent_subject' => 'S&#39;ha enviat un recordatori personalitzat per a la factura :invoice a :client',
'notification_invoice_reminder_endless_sent_subject' => 'Endless reminder for Invoice :invoice was sent to :client', 'notification_invoice_reminder_endless_sent_subject' => 'Endless reminder for Invoice :invoice was sent to :client',
'assigned_user' => 'Assigned User', 'assigned_user' => 'Assigned User',
'setup_steps_notice' => 'To proceed to next step, make sure you test each section.', 'setup_steps_notice' => 'To proceed to next step, make sure you test each section.',
@ -4217,7 +4219,7 @@ $lang = array(
'direct_debit' => 'Direct Debit', 'direct_debit' => 'Direct Debit',
'clone_to_expense' => 'Clone to Expense', 'clone_to_expense' => 'Clone to Expense',
'checkout' => 'Checkout', 'checkout' => 'Checkout',
'acss' => 'ACSS Debit', 'acss' => 'Dèbit ACSS',
'invalid_amount' => 'Invalid amount. Number/Decimal values only.', 'invalid_amount' => 'Invalid amount. Number/Decimal values only.',
'client_payment_failure_body' => 'Payment for Invoice :invoice for amount :amount failed.', 'client_payment_failure_body' => 'Payment for Invoice :invoice for amount :amount failed.',
'browser_pay' => 'Google Pay, Apple Pay, Microsoft Pay', 'browser_pay' => 'Google Pay, Apple Pay, Microsoft Pay',
@ -4285,7 +4287,7 @@ $lang = array(
'include_drafts' => 'Include Drafts', 'include_drafts' => 'Include Drafts',
'include_drafts_help' => 'Include draft records in reports', 'include_drafts_help' => 'Include draft records in reports',
'is_invoiced' => 'Is Invoiced', 'is_invoiced' => 'Is Invoiced',
'change_plan' => 'Manage Plan', 'change_plan' => 'Gestionar el Pla',
'persist_data' => 'Persist Data', 'persist_data' => 'Persist Data',
'customer_count' => 'Customer Count', 'customer_count' => 'Customer Count',
'verify_customers' => 'Verify Customers', 'verify_customers' => 'Verify Customers',
@ -4614,8 +4616,8 @@ $lang = array(
'search_purchase_order' => 'Search Purchase Order', 'search_purchase_order' => 'Search Purchase Order',
'search_purchase_orders' => 'Search Purchase Orders', 'search_purchase_orders' => 'Search Purchase Orders',
'login_url' => 'Login URL', 'login_url' => 'Login URL',
'enable_applying_payments' => 'Manual Overpayments', 'enable_applying_payments' => 'Pagaments excessius manuals',
'enable_applying_payments_help' => 'Support adding an overpayment amount manually on a payment', 'enable_applying_payments_help' => 'Admet l&#39;addició manual d&#39;un import de sobrepagament en un pagament',
'stock_quantity' => 'Stock Quantity', 'stock_quantity' => 'Stock Quantity',
'notification_threshold' => 'Notification Threshold', 'notification_threshold' => 'Notification Threshold',
'track_inventory' => 'Track Inventory', 'track_inventory' => 'Track Inventory',
@ -4847,6 +4849,7 @@ $lang = array(
'email_alignment' => 'Email Alignment', 'email_alignment' => 'Email Alignment',
'pdf_preview_location' => 'PDF Preview Location', 'pdf_preview_location' => 'PDF Preview Location',
'mailgun' => 'Mailgun', 'mailgun' => 'Mailgun',
'brevo' => 'Brevo',
'postmark' => 'Postmark', 'postmark' => 'Postmark',
'microsoft' => 'Microsoft', 'microsoft' => 'Microsoft',
'click_plus_to_create_record' => 'Click + to create a record', 'click_plus_to_create_record' => 'Click + to create a record',
@ -4866,8 +4869,8 @@ $lang = array(
'all_clients' => 'Tots els clients', 'all_clients' => 'Tots els clients',
'show_aging_table' => 'Veure taula de compliment', 'show_aging_table' => 'Veure taula de compliment',
'show_payments_table' => 'Veure taula de pagaments', 'show_payments_table' => 'Veure taula de pagaments',
'only_clients_with_invoices' => 'Only Clients with Invoices', 'only_clients_with_invoices' => 'Només Clients amb Factures',
'email_statement' => 'Email Statement', 'email_statement' => 'Declaració de correu electrònic',
'once' => 'Una volta', 'once' => 'Una volta',
'schedules' => 'Calendaris', 'schedules' => 'Calendaris',
'new_schedule' => 'Nou calendari', 'new_schedule' => 'Nou calendari',
@ -4910,7 +4913,7 @@ $lang = array(
'sync_from' => 'Sincronitza de', 'sync_from' => 'Sincronitza de',
'gateway_payment_text' => 'Factures: :invoices de :amount per al client :client', 'gateway_payment_text' => 'Factures: :invoices de :amount per al client :client',
'gateway_payment_text_no_invoice' => 'Pagament sense factura de :amount per al client :client', 'gateway_payment_text_no_invoice' => 'Pagament sense factura de :amount per al client :client',
'click_to_variables' => 'Click here to see all variables.', 'click_to_variables' => 'Feu clic aquí per veure totes les variables.',
'ship_to' => 'Envia a', 'ship_to' => 'Envia a',
'stripe_direct_debit_details' => 'Transferiu al compte bancari especificat a dalt, si us plau.', 'stripe_direct_debit_details' => 'Transferiu al compte bancari especificat a dalt, si us plau.',
'branch_name' => 'Nom de l\'oficina', 'branch_name' => 'Nom de l\'oficina',
@ -4925,335 +4928,347 @@ $lang = array(
'no_assigned_tasks' => 'No hi ha cap tasca cobrable a aquest projecte', 'no_assigned_tasks' => 'No hi ha cap tasca cobrable a aquest projecte',
'authorization_failure' => 'Permisos insuficients per a realitzar aquesta acció', 'authorization_failure' => 'Permisos insuficients per a realitzar aquesta acció',
'authorization_sms_failure' => 'Verifiqueu el vostre compte per a poder enviar missatges de correu.', 'authorization_sms_failure' => 'Verifiqueu el vostre compte per a poder enviar missatges de correu.',
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key <br><br> You can manage your license here: https://invoiceninja.invoicing.co/client/login', 'white_label_body' => 'Gràcies per comprar una llicència de marca blanca.<br><br> La vostra clau de llicència és:<br><br> :license_key<br><br> Podeu gestionar la vostra llicència aquí: https://invoiceninja.invoicing.co/client/login',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Transferència Interac E', 'payment_type_Interac E Transfer' => 'Transferència Interac E',
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate', 'xinvoice_payable' => 'Pagament dins de :payeddue dies nets fins a :paydate',
'xinvoice_no_buyers_reference' => "No buyer's reference given", 'xinvoice_no_buyers_reference' => "No s&#39;ha donat cap referència del comprador",
'xinvoice_online_payment' => 'The invoice needs to be paid online via the provided link', 'xinvoice_online_payment' => 'La factura s&#39;ha de pagar en línia mitjançant l&#39;enllaç proporcionat',
'pre_payment' => 'Pre Payment', 'pre_payment' => 'Prepagament',
'number_of_payments' => 'Number of payments', 'number_of_payments' => 'Nombre de pagaments',
'number_of_payments_helper' => 'The number of times this payment will be made', 'number_of_payments_helper' => 'El nombre de vegades que es farà aquest pagament',
'pre_payment_indefinitely' => 'Continue until cancelled', 'pre_payment_indefinitely' => 'Continueu fins que es cancel·li',
'notification_payment_emailed' => 'Payment :payment was emailed to :client', 'notification_payment_emailed' => 'El pagament :payment s&#39;ha enviat per correu electrònic a :client',
'notification_payment_emailed_subject' => 'Payment :payment was emailed', 'notification_payment_emailed_subject' => 'El pagament :payment s&#39;ha enviat per correu electrònic',
'record_not_found' => 'Record not found', 'record_not_found' => 'No s&#39;ha trobat el registre',
'minimum_payment_amount' => 'Minimum Payment Amount', 'minimum_payment_amount' => 'Import mínim de pagament',
'client_initiated_payments' => 'Client Initiated Payments', 'client_initiated_payments' => 'Pagaments iniciats pel client',
'client_initiated_payments_help' => 'Support making a payment in the client portal without an invoice', 'client_initiated_payments_help' => 'Suport per realitzar un pagament al portal del client sense factura',
'share_invoice_quote_columns' => 'Share Invoice/Quote Columns', 'share_invoice_quote_columns' => 'Comparteix les columnes de la factura/de la cotització',
'cc_email' => 'CC Email', 'cc_email' => 'Correu electrònic CC',
'payment_balance' => 'Payment Balance', 'payment_balance' => 'Balanç de pagament',
'view_report_permission' => 'Allow user to access the reports, data is limited to available permissions', 'view_report_permission' => 'Permet a l&#39;usuari accedir als informes, les dades es limiten als permisos disponibles',
'activity_138' => 'Payment :payment was emailed to :client', 'activity_138' => 'El pagament :payment s&#39;ha enviat per correu electrònic a :client',
'one_time_products' => 'One-Time Products', 'one_time_products' => 'Productes únics',
'optional_one_time_products' => 'Optional One-Time Products', 'optional_one_time_products' => 'Productes opcionals d&#39;una sola vegada',
'required' => 'Required', 'required' => 'Obligatori',
'hidden' => 'Hidden', 'hidden' => 'Ocult',
'payment_links' => 'Payment Links', 'payment_links' => 'Enllaços de pagament',
'payment_link' => 'Payment Link', 'payment_link' => 'Enllaç de pagament',
'new_payment_link' => 'New Payment Link', 'new_payment_link' => 'Nou enllaç de pagament',
'edit_payment_link' => 'Edit Payment Link', 'edit_payment_link' => 'Edita l&#39;enllaç de pagament',
'created_payment_link' => 'Successfully created payment link', 'created_payment_link' => 'L&#39;enllaç de pagament s&#39;ha creat correctament',
'updated_payment_link' => 'Successfully updated payment link', 'updated_payment_link' => 'L&#39;enllaç de pagament s&#39;ha actualitzat correctament',
'archived_payment_link' => 'Successfully archived payment link', 'archived_payment_link' => 'L&#39;enllaç de pagament s&#39;ha arxivat correctament',
'deleted_payment_link' => 'Successfully deleted payment link', 'deleted_payment_link' => 'L&#39;enllaç de pagament s&#39;ha suprimit correctament',
'removed_payment_link' => 'Successfully removed payment link', 'removed_payment_link' => 'L&#39;enllaç de pagament s&#39;ha eliminat correctament',
'restored_payment_link' => 'Successfully restored payment link', 'restored_payment_link' => 'L&#39;enllaç de pagament s&#39;ha restaurat correctament',
'search_payment_link' => 'Search 1 Payment Link', 'search_payment_link' => 'Cerca 1 enllaç de pagament',
'search_payment_links' => 'Search :count Payment Links', 'search_payment_links' => 'Cerca :count Enllaços de pagament',
'increase_prices' => 'Increase Prices', 'increase_prices' => 'Augmentar els preus',
'update_prices' => 'Update Prices', 'update_prices' => 'Actualitzar preus',
'incresed_prices' => 'Successfully queued prices to be increased', 'incresed_prices' => 'Els preus s&#39;han fet cua amb èxit per augmentar',
'updated_prices' => 'Successfully queued prices to be updated', 'updated_prices' => 'Els preus s&#39;han fet a la cua correctament per actualitzar-los',
'api_token' => 'API Token', 'api_token' => 'Token API',
'api_key' => 'API Key', 'api_key' => 'Clau de l&#39;API',
'endpoint' => 'Endpoint', 'endpoint' => 'Punt final',
'not_billable' => 'Not Billable', 'not_billable' => 'No facturable',
'allow_billable_task_items' => 'Allow Billable Task Items', 'allow_billable_task_items' => 'Permetre elements de tasques facturables',
'allow_billable_task_items_help' => 'Enable configuring which task items are billed', 'allow_billable_task_items_help' => 'Habiliteu la configuració de quins elements de la tasca es facturaran',
'show_task_item_description' => 'Show Task Item Description', 'show_task_item_description' => 'Mostra la descripció de l&#39;element de la tasca',
'show_task_item_description_help' => 'Enable specifying task item descriptions', 'show_task_item_description_help' => 'Habiliteu l&#39;especificació de descripcions d&#39;elements de tasca',
'email_record' => 'Email Record', 'email_record' => 'Registre de correu electrònic',
'invoice_product_columns' => 'Invoice Product Columns', 'invoice_product_columns' => 'Columnes de producte de factura',
'quote_product_columns' => 'Quote Product Columns', 'quote_product_columns' => 'Cotitzar les columnes del producte',
'vendors' => 'Vendors', 'vendors' => 'Venedors',
'product_sales' => 'Product Sales', 'product_sales' => 'Venda de productes',
'user_sales_report_header' => 'User sales report for client/s :client from :start_date to :end_date', 'user_sales_report_header' => 'Informe de vendes d&#39;usuari per al client/s :client de :start _date a :end _date',
'client_balance_report' => 'Customer balance report', 'client_balance_report' => 'Informe del saldo del client',
'client_sales_report' => 'Customer sales report', 'client_sales_report' => 'Informe de vendes al client',
'user_sales_report' => 'User sales report', 'user_sales_report' => 'Informe de vendes dels usuaris',
'aged_receivable_detailed_report' => 'Aged Receivable Detailed Report', 'aged_receivable_detailed_report' => 'Informe detallat d&#39;antiguitat',
'aged_receivable_summary_report' => 'Aged Receivable Summary Report', 'aged_receivable_summary_report' => 'Informe resum de comptes a cobrar antics',
'taxable_amount' => 'Taxable Amount', 'taxable_amount' => 'Import imposable',
'tax_summary' => 'Tax Summary', 'tax_summary' => 'Resum fiscal',
'oauth_mail' => 'OAuth / Mail', 'oauth_mail' => 'OAuth/Correu',
'preferences' => 'Preferences', 'preferences' => 'Preferències',
'analytics' => 'Analytics', 'analytics' => 'Analítica',
'reduced_rate' => 'Reduced Rate', 'reduced_rate' => 'Tarifa reduïda',
'tax_all' => 'Tax All', 'tax_all' => 'Impostos tots',
'tax_selected' => 'Tax Selected', 'tax_selected' => 'Impost seleccionat',
'version' => 'version', 'version' => 'versió',
'seller_subregion' => 'Seller Subregion', 'seller_subregion' => 'Subregió del venedor',
'calculate_taxes' => 'Calculate Taxes', 'calculate_taxes' => 'Calcula els impostos',
'calculate_taxes_help' => 'Automatically calculate taxes when saving invoices', 'calculate_taxes_help' => 'Calcula automàticament els impostos en desar les factures',
'link_expenses' => 'Link Expenses', 'link_expenses' => 'Despeses d&#39;enllaç',
'converted_client_balance' => 'Converted Client Balance', 'converted_client_balance' => 'Saldo de client convertit',
'converted_payment_balance' => 'Converted Payment Balance', 'converted_payment_balance' => 'Saldo de pagament convertit',
'total_hours' => 'Total Hours', 'total_hours' => 'Total Hores',
'date_picker_hint' => 'Use +days to set the date in the future', 'date_picker_hint' => 'Utilitzeu +dies per establir la data en el futur',
'app_help_link' => 'More information ', 'app_help_link' => 'Més informació ',
'here' => 'here', 'here' => 'aquí',
'industry_Restaurant & Catering' => 'Restaurant & Catering', 'industry_Restaurant & Catering' => 'Restauració i càtering',
'show_credits_table' => 'Show Credits Table', 'show_credits_table' => 'Mostra la taula de crèdits',
'manual_payment' => 'Payment Manual', 'manual_payment' => 'Manual de pagament',
'tax_summary_report' => 'Tax Summary Report', 'tax_summary_report' => 'Informe resum fiscal',
'tax_category' => 'Tax Category', 'tax_category' => 'Categoria Tributària',
'physical_goods' => 'Physical Goods', 'physical_goods' => 'Béns físics',
'digital_products' => 'Digital Products', 'digital_products' => 'Productes digitals',
'services' => 'Services', 'services' => 'Serveis',
'shipping' => 'Shipping', 'shipping' => 'Enviament',
'tax_exempt' => 'Tax Exempt', 'tax_exempt' => 'Exempt d&#39;impostos',
'late_fee_added_locked_invoice' => 'Late fee for invoice :invoice added on :date', 'late_fee_added_locked_invoice' => 'Comissió de retard per a la factura :invoice afegit a :date',
'lang_Khmer' => 'Khmer', 'lang_Khmer' => 'Khmer',
'routing_id' => 'Routing ID', 'routing_id' => 'ID d&#39;encaminament',
'enable_e_invoice' => 'Enable E-Invoice', 'enable_e_invoice' => 'Activa la factura electrònica',
'e_invoice_type' => 'E-Invoice Type', 'e_invoice_type' => 'Tipus de factura electrònica',
'reduced_tax' => 'Reduced Tax', 'reduced_tax' => 'Impost reduït',
'override_tax' => 'Override Tax', 'override_tax' => 'Anul·lar l&#39;impost',
'zero_rated' => 'Zero Rated', 'zero_rated' => 'Valoració zero',
'reverse_tax' => 'Reverse Tax', 'reverse_tax' => 'Impost invers',
'updated_tax_category' => 'Successfully updated the tax category', 'updated_tax_category' => 'S&#39;ha actualitzat correctament la categoria fiscal',
'updated_tax_categories' => 'Successfully updated the tax categories', 'updated_tax_categories' => 'S&#39;han actualitzat correctament les categories fiscals',
'set_tax_category' => 'Set Tax Category', 'set_tax_category' => 'Estableix la categoria fiscal',
'payment_manual' => 'Payment Manual', 'payment_manual' => 'Manual de pagament',
'expense_payment_type' => 'Expense Payment Type', 'expense_payment_type' => 'Tipus de pagament de despeses',
'payment_type_Cash App' => 'Cash App', 'payment_type_Cash App' => 'Aplicació Cash',
'rename' => 'Rename', 'rename' => 'Canvia el nom',
'renamed_document' => 'Successfully renamed document', 'renamed_document' => 'S&#39;ha canviat de nom el document correctament',
'e_invoice' => 'E-Invoice', 'e_invoice' => 'Factura electrònica',
'light_dark_mode' => 'Light/Dark Mode', 'light_dark_mode' => 'Mode clar/fosc',
'activities' => 'Activities', 'activities' => 'Activitats',
'recent_transactions' => "Here are your company's most recent transactions:", 'recent_transactions' => "Aquestes són les transaccions més recents de la vostra empresa:",
'country_Palestine' => "Palestine", 'country_Palestine' => "Palestina",
'country_Taiwan' => 'Taiwan', 'country_Taiwan' => 'Taiwan',
'duties' => 'Duties', 'duties' => 'Deures',
'order_number' => 'Order Number', 'order_number' => 'Número d&#39;ordre',
'order_id' => 'Order', 'order_id' => 'Ordre',
'total_invoices_outstanding' => 'Total Invoices Outstanding', 'total_invoices_outstanding' => 'Total de factures pendents',
'recent_activity' => 'Recent Activity', 'recent_activity' => 'Activitat recent',
'enable_auto_bill' => 'Enable auto billing', 'enable_auto_bill' => 'Activa la facturació automàtica',
'email_count_invoices' => 'Email :count invoices', 'email_count_invoices' => 'Correu electrònic :count factures',
'invoice_task_item_description' => 'Invoice Task Item Description', 'invoice_task_item_description' => 'Descripció de l&#39;element de la tasca de la factura',
'invoice_task_item_description_help' => 'Add the item description to the invoice line items', 'invoice_task_item_description_help' => 'Afegiu la descripció de l&#39;article a les línies de la factura',
'next_send_time' => 'Next Send Time', 'next_send_time' => 'Pròxima hora d&#39;enviament',
'uploaded_certificate' => 'Successfully uploaded certificate', 'uploaded_certificate' => 'Certificat carregat correctament',
'certificate_set' => 'Certificate set', 'certificate_set' => 'Conjunt de certificats',
'certificate_not_set' => 'Certificate not set', 'certificate_not_set' => 'Certificat no establert',
'passphrase_set' => 'Passphrase set', 'passphrase_set' => 'Conjunt de frase de contrasenya',
'passphrase_not_set' => 'Passphrase not set', 'passphrase_not_set' => 'No s&#39;ha definit la contrasenya',
'upload_certificate' => 'Upload Certificate', 'upload_certificate' => 'Carrega el certificat',
'certificate_passphrase' => 'Certificate Passphrase', 'certificate_passphrase' => 'Frase de contrasenya del certificat',
'valid_vat_number' => 'Valid VAT Number', 'valid_vat_number' => 'Número d&#39;IVA vàlid',
'react_notification_link' => 'React Notification Links', 'react_notification_link' => 'Enllaços de notificació de reacció',
'react_notification_link_help' => 'Admin emails will contain links to the react application', 'react_notification_link_help' => 'Els correus electrònics de l&#39;administrador contindran enllaços a l&#39;aplicació react',
'show_task_billable' => 'Show Task Billable', 'show_task_billable' => 'Mostra la tasca facturable',
'credit_item' => 'Credit Item', 'credit_item' => 'Partida de crèdit',
'drop_file_here' => 'Drop file here', 'drop_file_here' => 'Deixa anar el fitxer aquí',
'files' => 'Files', 'files' => 'Fitxers',
'camera' => 'Camera', 'camera' => 'Càmera',
'gallery' => 'Gallery', 'gallery' => 'Galeria',
'project_location' => 'Project Location', 'project_location' => 'Localització del projecte',
'add_gateway_help_message' => 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments', 'add_gateway_help_message' => 'Afegiu una passarel·la de pagament (és a dir, Stripe, WePay o PayPal) per acceptar pagaments en línia',
'lang_Hungarian' => 'Hungarian', 'lang_Hungarian' => 'hongarès',
'use_mobile_to_manage_plan' => 'Use your phone subscription settings to manage your plan', 'use_mobile_to_manage_plan' => 'Utilitzeu la configuració de la vostra subscripció telefònica per gestionar el vostre pla',
'item_tax3' => 'Item Tax3', 'item_tax3' => 'Article Impost3',
'item_tax_rate1' => 'Item Tax Rate 1', 'item_tax_rate1' => 'Tipus impositiu de l&#39;article 1',
'item_tax_rate2' => 'Item Tax Rate 2', 'item_tax_rate2' => 'Tipus impositiu de l&#39;article 2',
'item_tax_rate3' => 'Item Tax Rate 3', 'item_tax_rate3' => 'Tipus impositiu de l&#39;article 3',
'buy_price' => 'Buy Price', 'buy_price' => 'Preu de compra',
'country_Macedonia' => 'Macedonia', 'country_Macedonia' => 'Macedònia',
'admin_initiated_payments' => 'Admin Initiated Payments', 'admin_initiated_payments' => 'Pagaments iniciats per l&#39;administració',
'admin_initiated_payments_help' => 'Support entering a payment in the admin portal without an invoice', 'admin_initiated_payments_help' => 'Suport per introduir un pagament al portal d&#39;administració sense factura',
'paid_date' => 'Paid Date', 'paid_date' => 'Data de pagament',
'downloaded_entities' => 'An email will be sent with the PDFs', 'downloaded_entities' => 'S&#39;enviarà un correu electrònic amb els PDF',
'lang_French - Swiss' => 'French - Swiss', 'lang_French - Swiss' => 'francès - suís',
'currency_swazi_lilangeni' => 'Swazi Lilangeni', 'currency_swazi_lilangeni' => 'Swazi Lilangeni',
'income' => 'Income', 'income' => 'Ingressos',
'amount_received_help' => 'Enter a value here if the total amount received was MORE than the invoice amount, or when recording a payment with no invoices. Otherwise this field should be left blank.', 'amount_received_help' => 'Introduïu un valor aquí si l&#39;import total rebut era MÉS que l&#39;import de la factura o quan registreu un pagament sense factures. En cas contrari, aquest camp s&#39;ha de deixar en blanc.',
'vendor_phone' => 'Vendor Phone', 'vendor_phone' => 'Telèfon del venedor',
'mercado_pago' => 'Mercado Pago', 'mercado_pago' => 'Mercat Pago',
'mybank' => 'MyBank', 'mybank' => 'MyBank',
'paypal_paylater' => 'Pay in 4', 'paypal_paylater' => 'Paga en 4',
'paid_date' => 'Paid Date', 'paid_date' => 'Data de pagament',
'district' => 'District', 'district' => 'Districte',
'region' => 'Region', 'region' => 'Regió',
'county' => 'County', 'county' => 'comtat',
'tax_details' => 'Tax Details', 'tax_details' => 'Detalls fiscals',
'activity_10_online' => ':contact made payment :payment for invoice :invoice for :client', 'activity_10_online' => ':contact ha fet el pagament :payment per a la factura :invoice per a :client',
'activity_10_manual' => ':user entered payment :payment for invoice :invoice for :client', 'activity_10_manual' => ':user ha introduït el pagament :payment per a la factura :invoice per a :client',
'default_payment_type' => 'Default Payment Type', 'default_payment_type' => 'Tipus de pagament predeterminat',
'number_precision' => 'Number precision', 'number_precision' => 'Precisió numèrica',
'number_precision_help' => 'Controls the number of decimals supported in the interface', 'number_precision_help' => 'Controla el nombre de decimals admesos a la interfície',
'is_tax_exempt' => 'Tax Exempt', 'is_tax_exempt' => 'Exempt d&#39;impostos',
'drop_files_here' => 'Drop files here', 'drop_files_here' => 'Deixeu fitxers aquí',
'upload_files' => 'Upload Files', 'upload_files' => 'Carregar fitxers',
'download_e_invoice' => 'Download E-Invoice', 'download_e_invoice' => 'Descarrega la factura electrònica',
'triangular_tax_info' => 'Intra-community triangular transaction', 'download_e_credit' => 'Descarrega E-Credit',
'intracommunity_tax_info' => 'Tax-free intra-community delivery', 'download_e_quote' => 'Descarregar E-Quote',
'reverse_tax_info' => 'Please note that this supply is subject to reverse charge', 'triangular_tax_info' => 'Transacció triangular intracomunitària',
'currency_nicaraguan_cordoba' => 'Nicaraguan Córdoba', 'intracommunity_tax_info' => 'Lliurament intracomunitari lliure d&#39;impostos',
'public' => 'Public', 'reverse_tax_info' => 'Tingueu en compte que aquest subministrament està subjecte a càrrec invers',
'private' => 'Private', 'currency_nicaraguan_cordoba' => 'Còrdova nicaragüenca',
'image' => 'Image', 'public' => 'Públic',
'other' => 'Other', 'private' => 'Privat',
'linked_to' => 'Linked To', 'image' => 'Imatge',
'file_saved_in_path' => 'The file has been saved in :path', 'other' => 'Altres',
'unlinked_transactions' => 'Successfully unlinked :count transactions', 'linked_to' => 'Vinculat a',
'unlinked_transaction' => 'Successfully unlinked transaction', 'file_saved_in_path' => 'El fitxer s&#39;ha desat a :path',
'view_dashboard_permission' => 'Allow user to access the dashboard, data is limited to available permissions', 'unlinked_transactions' => 'Transaccions :count desenllaçades correctament',
'marked_sent_credits' => 'Successfully marked credits sent', 'unlinked_transaction' => 'La transacció s&#39;ha desenllaçat correctament',
'show_document_preview' => 'Show Document Preview', 'view_dashboard_permission' => 'Permet a l&#39;usuari accedir al tauler, les dades es limiten als permisos disponibles',
'cash_accounting' => 'Cash accounting', 'marked_sent_credits' => 'S&#39;han enviat crèdits marcats correctament',
'click_or_drop_files_here' => 'Click or drop files here', 'show_document_preview' => 'Mostra la vista prèvia del document',
'set_public' => 'Set public', 'cash_accounting' => 'Comptabilitat de caixa',
'set_private' => 'Set private', 'click_or_drop_files_here' => 'Feu clic o deixeu anar els fitxers aquí',
'set_public' => 'Establir públic',
'set_private' => 'Estableix privat',
'individual' => 'Individual', 'individual' => 'Individual',
'business' => 'Business', 'business' => 'Negocis',
'partnership' => 'Partnership', 'partnership' => 'Associació',
'trust' => 'Trust', 'trust' => 'Confia',
'charity' => 'Charity', 'charity' => 'Caritat',
'government' => 'Government', 'government' => 'Govern',
'in_stock_quantity' => 'Stock quantity', 'in_stock_quantity' => 'Quantitat d&#39;estoc',
'vendor_contact' => 'Vendor Contact', 'vendor_contact' => 'Contacte del venedor',
'expense_status_4' => 'Unpaid', 'expense_status_4' => 'Sense pagar',
'expense_status_5' => 'Paid', 'expense_status_5' => 'Pagat',
'ziptax_help' => 'Note: this feature requires a Zip-Tax API key to lookup US sales tax by address', 'ziptax_help' => 'Nota: aquesta funció requereix una clau API Zip-Tax per cercar l&#39;impost de vendes dels EUA per adreça',
'cache_data' => 'Cache Data', 'cache_data' => 'Dades de la memòria cau',
'unknown' => 'Unknown', 'unknown' => 'Desconegut',
'webhook_failure' => 'Webhook Failure', 'webhook_failure' => 'Error del webhook',
'email_opened' => 'Email Opened', 'email_opened' => 'Correu electrònic obert',
'email_delivered' => 'Email Delivered', 'email_delivered' => 'Correu electrònic lliurat',
'log' => 'Log', 'log' => 'Registre',
'classification' => 'Classification', 'classification' => 'Classificació',
'stock_quantity_number' => 'Stock :quantity', 'stock_quantity_number' => 'Stock: quantitat',
'upcoming' => 'Upcoming', 'upcoming' => 'Properament',
'client_contact' => 'Client Contact', 'client_contact' => 'Contacte amb el client',
'uncategorized' => 'Uncategorized', 'uncategorized' => 'Sense categoria',
'login_notification' => 'Login Notification', 'login_notification' => 'Notificació d&#39;inici de sessió',
'login_notification_help' => 'Sends an email notifying that a login has taken place.', 'login_notification_help' => 'Envia un correu electrònic notificant que s&#39;ha iniciat una sessió.',
'payment_refund_receipt' => 'Payment Refund Receipt # :number', 'payment_refund_receipt' => 'Rebut de devolució del pagament # :number',
'payment_receipt' => 'Payment Receipt # :number', 'payment_receipt' => 'Rebut de pagament # :number',
'load_template_description' => 'The template will be applied to following:', 'load_template_description' => 'La plantilla s&#39;aplicarà a:',
'run_template' => 'Run template', 'run_template' => 'Executar plantilla',
'statement_design' => 'Statement Design', 'statement_design' => 'Disseny de declaracions',
'delivery_note_design' => 'Delivery Note Design', 'delivery_note_design' => 'Disseny de albarans',
'payment_receipt_design' => 'Payment Receipt Design', 'payment_receipt_design' => 'Disseny del rebut de pagament',
'payment_refund_design' => 'Payment Refund Design', 'payment_refund_design' => 'Disseny de devolució de pagament',
'task_extension_banner' => 'Add the Chrome extension to manage your tasks', 'task_extension_banner' => 'Afegiu l&#39;extensió de Chrome per gestionar les vostres tasques',
'watch_video' => 'Watch Video', 'watch_video' => 'Mira el vídeo',
'view_extension' => 'View Extension', 'view_extension' => 'Visualitza l&#39;extensió',
'reactivate_email' => 'Reactivate Email', 'reactivate_email' => 'Reactiva el correu electrònic',
'email_reactivated' => 'Successfully reactivated email', 'email_reactivated' => 'Correu electrònic reactivat correctament',
'template_help' => 'Enable using the design as a template', 'template_help' => 'Habiliteu l&#39;ús del disseny com a plantilla',
'quarter' => 'Quarter', 'quarter' => 'Quarter',
'item_description' => 'Item Description', 'item_description' => 'Descripció de l&#39;Article',
'task_item' => 'Task Item', 'task_item' => 'Element de la tasca',
'record_state' => 'Record State', 'record_state' => 'Estat de registre',
'save_files_to_this_folder' => 'Save files to this folder', 'save_files_to_this_folder' => 'Desa els fitxers en aquesta carpeta',
'downloads_folder' => 'Downloads Folder', 'downloads_folder' => 'Carpeta de descàrregues',
'total_invoiced_quotes' => 'Invoiced Quotes', 'total_invoiced_quotes' => 'Pressupostos facturats',
'total_invoice_paid_quotes' => 'Invoice Paid Quotes', 'total_invoice_paid_quotes' => 'Facturar pressupostos pagats',
'downloads_folder_does_not_exist' => 'The downloads folder does not exist :value', 'downloads_folder_does_not_exist' => 'La carpeta de descàrregues no existeix :value',
'user_logged_in_notification' => 'User Logged in Notification', 'user_logged_in_notification' => 'Notificació d&#39;inici de sessió d&#39;usuari',
'user_logged_in_notification_help' => 'Send an email when logging in from a new location', 'user_logged_in_notification_help' => 'Envieu un correu electrònic quan inicieu sessió des d&#39;una ubicació nova',
'payment_email_all_contacts' => 'Payment Email To All Contacts', 'payment_email_all_contacts' => 'Correu electrònic de pagament a tots els contactes',
'payment_email_all_contacts_help' => 'Sends the payment email to all contacts when enabled', 'payment_email_all_contacts_help' => 'Envia el correu electrònic de pagament a tots els contactes quan està activat',
'add_line' => 'Add Line', 'add_line' => 'Afegeix una línia',
'activity_139' => 'Expense :expense notification sent to :contact', 'activity_139' => 'Notificació de despeses :expense enviada a :contact',
'vendor_notification_subject' => 'Confirmation of payment :amount sent to :vendor', 'vendor_notification_subject' => 'Confirmació de pagament :amount enviada a :vendor',
'vendor_notification_body' => 'Payment processed for :amount dated :payment_date. <br>[Transaction Reference: :transaction_reference]', 'vendor_notification_body' => 'Pagament processat per a :amount amb data :payment _data.<br> [Referència de la transacció: :transaction_reference ]',
'receipt' => 'Receipt', 'receipt' => 'Rebut',
'charges' => 'Charges', 'charges' => 'Càrrecs',
'email_report' => 'Email Report', 'email_report' => 'Informe per correu electrònic',
'payment_type_Pay Later' => 'Pay Later', 'payment_type_Pay Later' => 'Paga més tard',
'payment_type_credit' => 'Payment Type Credit', 'payment_type_credit' => 'Tipus de pagament Crèdit',
'payment_type_debit' => 'Payment Type Debit', 'payment_type_debit' => 'Tipus de pagament Dèbit',
'send_emails_to' => 'Send Emails To', 'send_emails_to' => 'Enviar correus electrònics a',
'primary_contact' => 'Primary Contact', 'primary_contact' => 'Contacte principal',
'all_contacts' => 'All Contacts', 'all_contacts' => 'Tots els contactes',
'insert_below' => 'Insert Below', 'insert_below' => 'Insereix a continuació',
'nordigen_handler_subtitle' => 'Bank account authentication. Selecting your institution to complete the request with your account credentials.', 'nordigen_handler_subtitle' => 'Autenticació del compte bancari. Seleccioneu la vostra institució per completar la sol·licitud amb les credencials del vostre compte.',
'nordigen_handler_error_heading_unknown' => 'An error has occured', 'nordigen_handler_error_heading_unknown' => 'S&#39;ha produït un error',
'nordigen_handler_error_contents_unknown' => 'An unknown error has occurred! Reason:', 'nordigen_handler_error_contents_unknown' => 'Ha ocorregut un error desconegut! Motiu:',
'nordigen_handler_error_heading_token_invalid' => 'Invalid Token', 'nordigen_handler_error_heading_token_invalid' => 'token invàlid',
'nordigen_handler_error_contents_token_invalid' => 'The provided token was invalid. Contact support for help, if this issue persists.', 'nordigen_handler_error_contents_token_invalid' => 'El testimoni proporcionat no era vàlid. Contacteu amb l&#39;assistència per obtenir ajuda, si aquest problema persisteix.',
'nordigen_handler_error_heading_account_config_invalid' => 'Missing Credentials', 'nordigen_handler_error_heading_account_config_invalid' => 'Falten credencials',
'nordigen_handler_error_contents_account_config_invalid' => 'Invalid or missing credentials for Gocardless Bank Account Data. Contact support for help, if this issue persists.', 'nordigen_handler_error_contents_account_config_invalid' => 'Les credencials no són vàlides o falten per a les dades del compte bancari de Gocardless. Contacteu amb l&#39;assistència per obtenir ajuda, si aquest problema persisteix.',
'nordigen_handler_error_heading_not_available' => 'Not Available', 'nordigen_handler_error_heading_not_available' => 'No disponible',
'nordigen_handler_error_contents_not_available' => 'Feature unavailable, enterprise plan only.', 'nordigen_handler_error_contents_not_available' => 'Funció no disponible, només pla d&#39;empresa.',
'nordigen_handler_error_heading_institution_invalid' => 'Invalid Institution', 'nordigen_handler_error_heading_institution_invalid' => 'Institució no vàlida',
'nordigen_handler_error_contents_institution_invalid' => 'The provided institution-id is invalid or no longer valid.', 'nordigen_handler_error_contents_institution_invalid' => 'L&#39;identificador d&#39;institució proporcionat no és vàlid o ja no és vàlid.',
'nordigen_handler_error_heading_ref_invalid' => 'Invalid Reference', 'nordigen_handler_error_heading_ref_invalid' => 'Referència no vàlida',
'nordigen_handler_error_contents_ref_invalid' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.', 'nordigen_handler_error_contents_ref_invalid' => 'GoCardless no ha proporcionat una referència vàlida. Si us plau, torneu a executar el flux i contacteu amb el servei d&#39;assistència si aquest problema persisteix.',
'nordigen_handler_error_heading_not_found' => 'Invalid Requisition', 'nordigen_handler_error_heading_not_found' => 'Requisit no vàlid',
'nordigen_handler_error_contents_not_found' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.', 'nordigen_handler_error_contents_not_found' => 'GoCardless no ha proporcionat una referència vàlida. Si us plau, torneu a executar el flux i contacteu amb el servei d&#39;assistència si aquest problema persisteix.',
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready', 'nordigen_handler_error_heading_requisition_invalid_status' => 'No està llest',
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.', 'nordigen_handler_error_contents_requisition_invalid_status' => 'Has trucat a aquest lloc massa aviat. Finalitzeu l&#39;autorització i actualitzeu aquesta pàgina. Contacteu amb l&#39;assistència per obtenir ajuda, si aquest problema persisteix.',
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected', 'nordigen_handler_error_heading_requisition_no_accounts' => 'No s&#39;ha seleccionat cap compte',
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.', 'nordigen_handler_error_contents_requisition_no_accounts' => 'El servei no ha retornat cap compte vàlid. Penseu en reiniciar el flux.',
'nordigen_handler_restart' => 'Restart flow.', 'nordigen_handler_restart' => 'Reinicieu el flux.',
'nordigen_handler_return' => 'Return to application.', 'nordigen_handler_return' => 'Tornar a l&#39;aplicació.',
'lang_Lao' => 'Lao', 'lang_Lao' => 'Lao',
'currency_lao_kip' => 'Lao kip', 'currency_lao_kip' => 'Lao kip',
'yodlee_regions' => 'Regions: USA, UK, Australia & India', 'yodlee_regions' => 'Regions: EUA, Regne Unit, Austràlia i Índia',
'nordigen_regions' => 'Regions: Europe & UK', 'nordigen_regions' => 'Regions: Europa i Regne Unit',
'select_provider' => 'Select Provider', 'select_provider' => 'Seleccioneu Proveïdor',
'nordigen_requisition_subject' => 'Requisition expired, please reauthenticate.', 'nordigen_requisition_subject' => 'La sol·licitud ha caducat, torneu a autenticar.',
'nordigen_requisition_body' => 'Access to bank account feeds has expired as set in End User Agreement. <br><br>Please log into Invoice Ninja and re-authenticate with your banks to continue receiving transactions.', 'nordigen_requisition_body' => 'L&#39;accés als feeds del compte bancari ha caducat tal com s&#39;estableix a l&#39;Acord d&#39;usuari final.<br><br> Inicieu sessió a Invoice Ninja i torneu a autenticar-vos amb els vostres bancs per continuar rebent transaccions.',
'participant' => 'Participant', 'participant' => 'Participant',
'participant_name' => 'Participant name', 'participant_name' => 'Nom del participant',
'client_unsubscribed' => 'Client unsubscribed from emails.', 'client_unsubscribed' => 'Client cancel·lat la subscripció dels correus electrònics.',
'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.', 'client_unsubscribed_help' => 'El client :client s&#39;ha cancel·lat la subscripció dels vostres correus electrònics. El client ha de donar el seu consentiment per rebre futurs correus electrònics de la teva part.',
'resubscribe' => 'Resubscribe', 'resubscribe' => 'Torna a subscriure&#39;t',
'subscribe' => 'Subscribe', 'subscribe' => 'Subscriu-te',
'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.', 'subscribe_help' => 'Actualment esteu subscrit i continuareu rebent comunicacions per correu electrònic.',
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', 'unsubscribe_help' => 'Actualment no estàs subscrit i, per tant, no rebràs correus electrònics en aquest moment.',
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error', 'notification_purchase_order_bounced' => 'No hem pogut lliurar la comanda de compra :invoice a :contact .<br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', 'notification_purchase_order_bounced_subject' => 'No es pot lliurar la comanda de compra :invoice',
'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile', 'show_pdfhtml_on_mobile' => 'Mostra la versió HTML de l&#39;entitat quan la visualitzes al mòbil',
'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.', 'show_pdfhtml_on_mobile_help' => 'Per millorar la visualització, mostra una versió HTML de la factura/de l&#39;oferta quan la visualitzeu al mòbil.',
'please_select_an_invoice_or_credit' => 'Please select an invoice or credit', 'please_select_an_invoice_or_credit' => 'Seleccioneu una factura o crèdit',
'mobile_version' => 'Mobile Version', 'mobile_version' => 'Versió mòbil',
'venmo' => 'Venmo', 'venmo' => 'Venmo',
'my_bank' => 'MyBank', 'my_bank' => 'MyBank',
'pay_later' => 'Pay Later', 'pay_later' => 'Paga més tard',
'local_domain' => 'Local Domain', 'local_domain' => 'Domini local',
'verify_peer' => 'Verify Peer', 'verify_peer' => 'Verifiqueu Peer',
'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key', 'nordigen_help' => 'Nota: per connectar un compte, cal una clau d&#39;API GoCardless/Nordigen',
'ar_detailed' => 'Accounts Receivable Detailed', 'ar_detailed' => 'Comptes a cobrar detallats',
'ar_summary' => 'Accounts Receivable Summary', 'ar_summary' => 'Resum de comptes a cobrar',
'client_sales' => 'Client Sales', 'client_sales' => 'Vendes al client',
'user_sales' => 'User Sales', 'user_sales' => 'Vendes d&#39;usuaris',
'iframe_url' => 'iFrame URL', 'iframe_url' => 'URL iFrame',
'user_unsubscribed' => 'User unsubscribed from emails :link', 'user_unsubscribed' => 'L&#39;usuari ha cancel·lat la subscripció als correus electrònics :link',
'use_available_payments' => 'Use Available Payments', 'use_available_payments' => 'Utilitzeu els pagaments disponibles',
'test_email_sent' => 'Successfully sent email', 'test_email_sent' => 'Correu electrònic enviat correctament',
'gateway_type' => 'Gateway Type', 'gateway_type' => 'Tipus de passarel·la',
'save_template_body' => 'Would you like to save this import mapping as a template for future use?', 'save_template_body' => 'Voleu desar aquesta assignació d&#39;importació com a plantilla per a un ús futur?',
'save_as_template' => 'Save Template Mapping', 'save_as_template' => 'Desa el mapatge de plantilles',
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date', 'auto_bill_standard_invoices_help' => 'Factura automàticament les factures estàndard en la data de venciment',
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)', 'auto_bill_on_help' => 'Factura automàtica a la data d&#39;enviament O data de venciment (factures recurrents)',
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method', 'use_available_credits_help' => 'Apliqueu qualsevol saldo de crèdit als pagaments abans de cobrar un mètode de pagament',
'use_unapplied_payments' => 'Use unapplied payments', 'use_unapplied_payments' => 'Utilitzeu pagaments no aplicats',
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method', 'use_unapplied_payments_help' => 'Apliqueu qualsevol saldo de pagament abans de cobrar un mètode de pagament',
'payment_terms_help' => 'Sets the default <b>invoice due date</b>', 'payment_terms_help' => 'Sets the default <b>invoice due date</b>',
'payment_type_help' => 'Sets the default <b>manual payment type</b>.', 'payment_type_help' => 'Sets the default <b>manual payment type</b>.',
'quote_valid_until_help' => 'The number of days that the quote is valid for', 'quote_valid_until_help' => 'El nombre de dies durant els quals el pressupost és vàlid',
'expense_payment_type_help' => 'The default expense payment type to be used', 'expense_payment_type_help' => 'El tipus de pagament de despeses predeterminat que s&#39;utilitzarà',
'paylater' => 'Pay in 4', 'paylater' => 'Paga en 4',
'payment_provider' => 'Payment Provider', 'payment_provider' => 'Proveïdor de pagament',
'select_email_provider' => 'Estableix el teu correu electrònic com a usuari remitent',
'purchase_order_items' => 'Articles de la comanda de compra',
'csv_rows_length' => 'No s&#39;han trobat dades en aquest fitxer CSV',
'accept_payments_online' => 'Accepteu pagaments en línia',
'all_payment_gateways' => 'Veure totes les passarel·les de pagament',
'product_cost' => 'Cost del producte',
'enable_rappen_roudning' => 'Activa l&#39;arrodoniment de Rappen',
'enable_rappen_rounding_help' => 'Arrodoneix els totals al 5 més proper',
'duration_words' => 'Durada en paraules',
'upcoming_recurring_invoices' => 'Pròximes factures recurrents',
'total_invoices' => 'Total de factures',
); );
return $lang; return $lang;

View File

@ -461,8 +461,8 @@ $lang = array(
'delete_token' => 'Smazat Token', 'delete_token' => 'Smazat Token',
'token' => 'Token', 'token' => 'Token',
'add_gateway' => 'Add Payment Gateway', 'add_gateway' => 'Add Payment Gateway',
'delete_gateway' => 'Smazat platební bránu', 'delete_gateway' => 'Delete Payment Gateway',
'edit_gateway' => 'Editovat bránu', 'edit_gateway' => 'Edit Payment Gateway',
'updated_gateway' => 'Brána úspěšně změněna', 'updated_gateway' => 'Brána úspěšně změněna',
'created_gateway' => 'Brána úspěšně vytvořena', 'created_gateway' => 'Brána úspěšně vytvořena',
'deleted_gateway' => 'Brána úspěšně smazána', 'deleted_gateway' => 'Brána úspěšně smazána',
@ -2198,6 +2198,8 @@ $lang = array(
'encryption' => 'Šifrování', 'encryption' => 'Šifrování',
'mailgun_domain' => 'Mailgun Domain', 'mailgun_domain' => 'Mailgun Domain',
'mailgun_private_key' => 'Mailgun Private Key', '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' => 'Odeslat zkušební e-mail',
'select_label' => 'Vybrat štítek', 'select_label' => 'Vybrat štítek',
'label' => 'Štítek', 'label' => 'Štítek',
@ -4848,6 +4850,7 @@ $lang = array(
'email_alignment' => 'Email Alignment', 'email_alignment' => 'Email Alignment',
'pdf_preview_location' => 'PDF Preview Location', 'pdf_preview_location' => 'PDF Preview Location',
'mailgun' => 'Mailgun', 'mailgun' => 'Mailgun',
'brevo' => 'Brevo',
'postmark' => 'Postmark', 'postmark' => 'Postmark',
'microsoft' => 'Microsoft', 'microsoft' => 'Microsoft',
'click_plus_to_create_record' => 'Click + to create a record', 'click_plus_to_create_record' => 'Click + to create a record',
@ -5100,6 +5103,8 @@ $lang = array(
'drop_files_here' => 'Drop files here', 'drop_files_here' => 'Drop files here',
'upload_files' => 'Upload Files', 'upload_files' => 'Upload Files',
'download_e_invoice' => 'Download E-Invoice', 'download_e_invoice' => 'Download E-Invoice',
'download_e_credit' => 'Download E-Credit',
'download_e_quote' => 'Download E-Quote',
'triangular_tax_info' => 'Intra-community triangular transaction', 'triangular_tax_info' => 'Intra-community triangular transaction',
'intracommunity_tax_info' => 'Tax-free intra-community delivery', 'intracommunity_tax_info' => 'Tax-free intra-community delivery',
'reverse_tax_info' => 'Please note that this supply is subject to reverse charge', 'reverse_tax_info' => 'Please note that this supply is subject to reverse charge',
@ -5254,7 +5259,17 @@ $lang = array(
'expense_payment_type_help' => 'The default expense payment type to be used', 'expense_payment_type_help' => 'The default expense payment type to be used',
'paylater' => 'Pay in 4', 'paylater' => 'Pay in 4',
'payment_provider' => 'Payment Provider', 'payment_provider' => 'Payment Provider',
'select_email_provider' => 'Set your email as the sending user',
'purchase_order_items' => 'Purchase Order Items',
'csv_rows_length' => 'No data found in this CSV file',
'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',
'total_invoices' => 'Total Invoices',
); );
return $lang; return $lang;

View File

@ -460,9 +460,9 @@ $lang = array(
'edit_token' => 'Redigér token', 'edit_token' => 'Redigér token',
'delete_token' => 'Slet token', 'delete_token' => 'Slet token',
'token' => 'Token', 'token' => 'Token',
'add_gateway' => 'Add Payment Gateway', 'add_gateway' => 'Tilføj Betalingsgateway',
'delete_gateway' => 'Slet gateway', 'delete_gateway' => 'Slet Betalingsgateway',
'edit_gateway' => 'Redigér gateway', 'edit_gateway' => 'Redigér Betalingsgateway',
'updated_gateway' => 'Gateway blev opdateret', 'updated_gateway' => 'Gateway blev opdateret',
'created_gateway' => 'Gateway blev oprettet', 'created_gateway' => 'Gateway blev oprettet',
'deleted_gateway' => 'Gateway blev slettet', 'deleted_gateway' => 'Gateway blev slettet',
@ -506,8 +506,8 @@ $lang = array(
'auto_wrap' => 'Automatisk linie ombrydning', 'auto_wrap' => 'Automatisk linie ombrydning',
'duplicate_post' => 'Advarsel: den foregående side blev sendt to gange. Den anden afsendelse er blevet ignoreret.', 'duplicate_post' => 'Advarsel: den foregående side blev sendt to gange. Den anden afsendelse er blevet ignoreret.',
'view_documentation' => 'Vis dokumentation', 'view_documentation' => 'Vis dokumentation',
'app_title' => 'Free Online Invoicing', 'app_title' => 'Gratis online Fakturering',
'app_description' => 'Invoice Ninja is a free, open-code solution for invoicing and billing customers. With Invoice Ninja, you can easily build and send beautiful invoices from any device that has access to the web. Your clients can print your invoices, download them as pdf files, and even pay you online from within the system.', 'app_description' => 'Faktura Ninja er en gratis, åben kodeløsning til Fakturering og faktureringskunder. Med Faktura Ninja kan du nemt bygge og sende smukke Faktura er fra enhver enhed, der har adgang til nettet. Din Klienter kan udskrive din Faktura er, downloade dem som PDF filer og endda betale dig online inde fra systemet.',
'rows' => 'rækker', 'rows' => 'rækker',
'www' => 'www', 'www' => 'www',
'logo' => 'Logo', 'logo' => 'Logo',
@ -693,9 +693,9 @@ $lang = array(
'disable' => 'Disable', 'disable' => 'Disable',
'invoice_quote_number' => 'Invoice and Quote Numbers', 'invoice_quote_number' => 'Invoice and Quote Numbers',
'invoice_charges' => 'Faktura tillægsgebyr', 'invoice_charges' => 'Faktura tillægsgebyr',
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact. <br><br> :error', 'notification_invoice_bounced' => 'Vi var ikke i stand til at levere Faktura :invoice til :contact .<br><br> :error',
'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice', 'notification_invoice_bounced_subject' => 'Unable to deliver Invoice :invoice',
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact. <br><br> :error', 'notification_quote_bounced' => 'Vi var ikke i stand til at levere tilbud :invoice til :contact .<br><br> :error',
'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice', 'notification_quote_bounced_subject' => 'Unable to deliver Quote :invoice',
'custom_invoice_link' => 'Custom Invoice Link', 'custom_invoice_link' => 'Custom Invoice Link',
'total_invoiced' => 'Faktureret i alt', 'total_invoiced' => 'Faktureret i alt',
@ -1900,7 +1900,7 @@ $lang = array(
'require_quote_signature_help' => 'Kræv at klienten giver deres underskrift.', 'require_quote_signature_help' => 'Kræv at klienten giver deres underskrift.',
'i_agree' => 'Jeg accepterer betingelserne', 'i_agree' => 'Jeg accepterer betingelserne',
'sign_here' => 'Underskriv venligst her (Denne underskrift er juridisk bindende):', 'sign_here' => 'Underskriv venligst her (Denne underskrift er juridisk bindende):',
'sign_here_ux_tip' => 'Use the mouse or your touchpad to trace your signature.', 'sign_here_ux_tip' => 'Brug musen eller din touchpad til at spore din signatur.',
'authorization' => 'Autorisation', 'authorization' => 'Autorisation',
'signed' => 'Underskrevet', 'signed' => 'Underskrevet',
@ -2196,6 +2196,8 @@ $lang = array(
'encryption' => 'Kryptering', 'encryption' => 'Kryptering',
'mailgun_domain' => 'Mailgun domæne', 'mailgun_domain' => 'Mailgun domæne',
'mailgun_private_key' => 'Mailgun privat nøgle', '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 e-mail',
'select_label' => 'Vælg Label', 'select_label' => 'Vælg Label',
'label' => 'Etiket', 'label' => 'Etiket',
@ -3009,7 +3011,7 @@ $lang = array(
'hosted_login' => 'Hostet login', 'hosted_login' => 'Hostet login',
'selfhost_login' => 'Selfhost Login', 'selfhost_login' => 'Selfhost Login',
'google_login' => 'Google login', 'google_login' => 'Google login',
'thanks_for_patience' => 'Thank for your patience while we work to implement these features.<br><br>We hope to have them completed in the next few months.<br><br>Until then we\'ll continue to support the', 'thanks_for_patience' => 'Tak for din tålmodighed, mens vi arbejder på at implementere disse funktioner.<br><br> Vi håber at få dem færdige i løbet af de næste par måneder.<br><br> Indtil da vil vi fortsætte med at støtte',
'legacy_mobile_app' => 'ældre mobilapp', 'legacy_mobile_app' => 'ældre mobilapp',
'today' => 'I dag', 'today' => 'I dag',
'current' => 'Nuværende', 'current' => 'Nuværende',
@ -3327,7 +3329,7 @@ $lang = array(
'credit_number_counter' => 'Kreditnummertæller', 'credit_number_counter' => 'Kreditnummertæller',
'reset_counter_date' => 'Nulstil tællerdato', 'reset_counter_date' => 'Nulstil tællerdato',
'counter_padding' => 'Bordpolstring', 'counter_padding' => 'Bordpolstring',
'shared_invoice_quote_counter' => 'Share Invoice/Quote Counter', 'shared_invoice_quote_counter' => 'Del Faktura /Citat tæller',
'default_tax_name_1' => 'Standard skattenavn 1', 'default_tax_name_1' => 'Standard skattenavn 1',
'default_tax_rate_1' => 'Standardafgiftssats 1', 'default_tax_rate_1' => 'Standardafgiftssats 1',
'default_tax_name_2' => 'Standard skattenavn 2', 'default_tax_name_2' => 'Standard skattenavn 2',
@ -3867,7 +3869,7 @@ $lang = array(
'cancellation_pending' => 'Aflysning afventer, vi kontakter dig!', 'cancellation_pending' => 'Aflysning afventer, vi kontakter dig!',
'list_of_payments' => 'Liste over Betalinger', 'list_of_payments' => 'Liste over Betalinger',
'payment_details' => 'Detaljer om Betaling', 'payment_details' => 'Detaljer om Betaling',
'list_of_payment_invoices' => 'Associate invoices', 'list_of_payment_invoices' => 'Associate Fakturaer',
'list_of_payment_methods' => 'Liste over Betaling', 'list_of_payment_methods' => 'Liste over Betaling',
'payment_method_details' => 'Detaljer om Betaling', 'payment_method_details' => 'Detaljer om Betaling',
'permanently_remove_payment_method' => 'Fjern denne Betaling permanent.', 'permanently_remove_payment_method' => 'Fjern denne Betaling permanent.',
@ -4216,7 +4218,7 @@ $lang = array(
'direct_debit' => 'Direkte debitering', 'direct_debit' => 'Direkte debitering',
'clone_to_expense' => 'Klon til Udgift', 'clone_to_expense' => 'Klon til Udgift',
'checkout' => 'Checkout', 'checkout' => 'Checkout',
'acss' => 'ACSS Debit', 'acss' => 'ACSS debet',
'invalid_amount' => 'Ugyldigt Beløb . Kun tal/decimalværdier.', 'invalid_amount' => 'Ugyldigt Beløb . Kun tal/decimalværdier.',
'client_payment_failure_body' => 'Betaling for Faktura :invoice for Beløb :amount mislykkedes.', 'client_payment_failure_body' => 'Betaling for Faktura :invoice for Beløb :amount mislykkedes.',
'browser_pay' => 'Google Pay, Apple Pay, Microsoft Pay', 'browser_pay' => 'Google Pay, Apple Pay, Microsoft Pay',
@ -4846,6 +4848,7 @@ $lang = array(
'email_alignment' => 'e-mail justering', 'email_alignment' => 'e-mail justering',
'pdf_preview_location' => 'PDF eksempelplacering', 'pdf_preview_location' => 'PDF eksempelplacering',
'mailgun' => 'Mailgun', 'mailgun' => 'Mailgun',
'brevo' => 'Brevo',
'postmark' => 'Poststempel', 'postmark' => 'Poststempel',
'microsoft' => 'Microsoft', 'microsoft' => 'Microsoft',
'click_plus_to_create_record' => 'Klik på + for at Opret en post', 'click_plus_to_create_record' => 'Klik på + for at Opret en post',
@ -4924,7 +4927,7 @@ $lang = array(
'no_assigned_tasks' => 'Ingen fakturerbare opgaver for dette projekt', 'no_assigned_tasks' => 'Ingen fakturerbare opgaver for dette projekt',
'authorization_failure' => 'Utilstrækkelige tilladelser til at udføre denne handling', 'authorization_failure' => 'Utilstrækkelige tilladelser til at udføre denne handling',
'authorization_sms_failure' => 'Bekræft venligst din konto for at sende e-mails.', 'authorization_sms_failure' => 'Bekræft venligst din konto for at sende e-mails.',
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key <br><br> You can manage your license here: https://invoiceninja.invoicing.co/client/login', 'white_label_body' => 'Tak fordi du har købt en Hvidmærke licens.<br><br> Din licensnøgle er:<br><br> :license_key<br><br> Du kan administrere din licens her: https://invoiceninja. Fakturering .co/ Klient /login',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Betales inden for :payeddue dage netto indtil :paydate', 'xinvoice_payable' => 'Betales inden for :payeddue dage netto indtil :paydate',
@ -5089,7 +5092,7 @@ $lang = array(
'region' => 'Område', 'region' => 'Område',
'county' => 'Amt', 'county' => 'Amt',
'tax_details' => 'Skatteoplysninger', 'tax_details' => 'Skatteoplysninger',
'activity_10_online' => ':contact made payment :payment for invoice :invoice for :client', 'activity_10_online' => ':contact lavet Betaling :payment for Faktura :invoice for :client',
'activity_10_manual' => ':user indtastet Betaling :payment for Faktura :invoice for :client', 'activity_10_manual' => ':user indtastet Betaling :payment for Faktura :invoice for :client',
'default_payment_type' => 'Standard Betaling', 'default_payment_type' => 'Standard Betaling',
'number_precision' => 'Nummerpræcision', 'number_precision' => 'Nummerpræcision',
@ -5098,6 +5101,8 @@ $lang = array(
'drop_files_here' => 'Slip filer her', 'drop_files_here' => 'Slip filer her',
'upload_files' => 'Upload filer', 'upload_files' => 'Upload filer',
'download_e_invoice' => 'Download E- Faktura', 'download_e_invoice' => 'Download E- Faktura',
'download_e_credit' => 'Download e-kredit',
'download_e_quote' => 'Download e-citat',
'triangular_tax_info' => 'Trekantet transaktion inden for fællesskabet', 'triangular_tax_info' => 'Trekantet transaktion inden for fællesskabet',
'intracommunity_tax_info' => 'Skattefri levering inden for samfundet', 'intracommunity_tax_info' => 'Skattefri levering inden for samfundet',
'reverse_tax_info' => 'Bemærk venligst, at denne levering er underlagt omvendt betalingspligt', 'reverse_tax_info' => 'Bemærk venligst, at denne levering er underlagt omvendt betalingspligt',
@ -5119,7 +5124,7 @@ $lang = array(
'set_private' => 'Indstil privat', 'set_private' => 'Indstil privat',
'individual' => 'Individuel', 'individual' => 'Individuel',
'business' => 'Forretning', 'business' => 'Forretning',
'partnership' => 'Partnership', 'partnership' => 'Partnerskab',
'trust' => 'Tillid', 'trust' => 'Tillid',
'charity' => 'Velgørenhed', 'charity' => 'Velgørenhed',
'government' => 'Regering', 'government' => 'Regering',
@ -5146,113 +5151,123 @@ $lang = array(
'load_template_description' => 'Skabelonen vil blive anvendt på følgende:', 'load_template_description' => 'Skabelonen vil blive anvendt på følgende:',
'run_template' => 'Kør skabelon', 'run_template' => 'Kør skabelon',
'statement_design' => 'Statement Design', 'statement_design' => 'Statement Design',
'delivery_note_design' => 'Delivery Note Design', 'delivery_note_design' => 'Levering Bemærk Design',
'payment_receipt_design' => 'Payment Receipt Design', 'payment_receipt_design' => 'Betaling Kvittering Design',
'payment_refund_design' => 'Payment Refund Design', 'payment_refund_design' => 'Betaling Refusion Design',
'task_extension_banner' => 'Add the Chrome extension to manage your tasks', 'task_extension_banner' => 'Tilføj Chrome-udvidelsen for at administrere dine opgaver',
'watch_video' => 'Watch Video', 'watch_video' => 'Se video',
'view_extension' => 'View Extension', 'view_extension' => 'Vis forlængelse',
'reactivate_email' => 'Reactivate Email', 'reactivate_email' => 'Genaktiver e-mail',
'email_reactivated' => 'Successfully reactivated email', 'email_reactivated' => 'Succesfuldt genaktiveret e-mail',
'template_help' => 'Enable using the design as a template', 'template_help' => 'Aktiver brug af designet som skabelon',
'quarter' => 'Quarter', 'quarter' => 'Kvarter',
'item_description' => 'Item Description', 'item_description' => 'Varebeskrivelse',
'task_item' => 'Task Item', 'task_item' => 'Opgave Genstand',
'record_state' => 'Record State', 'record_state' => 'Rekordtilstand',
'save_files_to_this_folder' => 'Save files to this folder', 'save_files_to_this_folder' => 'Gem filer til denne mappe',
'downloads_folder' => 'Downloads Folder', 'downloads_folder' => 'Downloads mappe',
'total_invoiced_quotes' => 'Invoiced Quotes', 'total_invoiced_quotes' => 'Fakturerede tilbud',
'total_invoice_paid_quotes' => 'Invoice Paid Quotes', 'total_invoice_paid_quotes' => 'Faktura betalte tilbud',
'downloads_folder_does_not_exist' => 'The downloads folder does not exist :value', 'downloads_folder_does_not_exist' => 'Mappen downloads findes ikke :value',
'user_logged_in_notification' => 'User Logged in Notification', 'user_logged_in_notification' => 'Bruger Logget ind Notifikation',
'user_logged_in_notification_help' => 'Send an email when logging in from a new location', 'user_logged_in_notification_help' => 'Send en e-mail , når du logger ind fra et nyt sted',
'payment_email_all_contacts' => 'Payment Email To All Contacts', 'payment_email_all_contacts' => 'Betaling e-mail Til alle kontakter',
'payment_email_all_contacts_help' => 'Sends the payment email to all contacts when enabled', 'payment_email_all_contacts_help' => 'Sender Betaling e-mail til alle kontakter, når den er aktiveret',
'add_line' => 'Add Line', 'add_line' => 'Tilføj linje',
'activity_139' => 'Expense :expense notification sent to :contact', 'activity_139' => 'Udgift :expense meddelelse sendt til :contact',
'vendor_notification_subject' => 'Confirmation of payment :amount sent to :vendor', 'vendor_notification_subject' => 'Bekræftelse af Betaling :amount sendt til :vendor',
'vendor_notification_body' => 'Payment processed for :amount dated :payment_date. <br>[Transaction Reference: :transaction_reference]', 'vendor_notification_body' => 'Betaling behandlet for :amount dateret :payment _dato.<br> [Transaktionsreference: :transaction_reference ]',
'receipt' => 'Receipt', 'receipt' => 'Kvittering',
'charges' => 'Charges', 'charges' => 'Afgifter',
'email_report' => 'Email Report', 'email_report' => 'e-mail rapport',
'payment_type_Pay Later' => 'Pay Later', 'payment_type_Pay Later' => 'Betal senere',
'payment_type_credit' => 'Payment Type Credit', 'payment_type_credit' => 'Betaling Type Kredit',
'payment_type_debit' => 'Payment Type Debit', 'payment_type_debit' => 'Betaling Type Debet',
'send_emails_to' => 'Send Emails To', 'send_emails_to' => 'Send e-mails til',
'primary_contact' => 'Primary Contact', 'primary_contact' => 'Primær kontakt',
'all_contacts' => 'All Contacts', 'all_contacts' => 'Alle kontakter',
'insert_below' => 'Insert Below', 'insert_below' => 'Indsæt nedenfor',
'nordigen_handler_subtitle' => 'Bank account authentication. Selecting your institution to complete the request with your account credentials.', 'nordigen_handler_subtitle' => 'Bankkontogodkendelse. Vælg din institution for at fuldføre anmodningen med dine kontooplysninger.',
'nordigen_handler_error_heading_unknown' => 'An error has occured', 'nordigen_handler_error_heading_unknown' => 'Der er opstået en fejl',
'nordigen_handler_error_contents_unknown' => 'An unknown error has occurred! Reason:', 'nordigen_handler_error_contents_unknown' => 'En ukendt fejl er sket! Grund:',
'nordigen_handler_error_heading_token_invalid' => 'Invalid Token', 'nordigen_handler_error_heading_token_invalid' => 'Ugyldig Token',
'nordigen_handler_error_contents_token_invalid' => 'The provided token was invalid. Contact support for help, if this issue persists.', 'nordigen_handler_error_contents_token_invalid' => 'Det angivne token var ugyldigt. kontakt support for at få hjælp, hvis dette problem fortsætter.',
'nordigen_handler_error_heading_account_config_invalid' => 'Missing Credentials', 'nordigen_handler_error_heading_account_config_invalid' => 'Manglende legitimationsoplysninger',
'nordigen_handler_error_contents_account_config_invalid' => 'Invalid or missing credentials for Gocardless Bank Account Data. Contact support for help, if this issue persists.', 'nordigen_handler_error_contents_account_config_invalid' => 'Ugyldige eller manglende legitimationsoplysninger for Gocardless bankkontodata. kontakt support for at få hjælp, hvis dette problem fortsætter.',
'nordigen_handler_error_heading_not_available' => 'Not Available', 'nordigen_handler_error_heading_not_available' => 'Ikke tilgængelig',
'nordigen_handler_error_contents_not_available' => 'Feature unavailable, enterprise plan only.', 'nordigen_handler_error_contents_not_available' => 'Funktionen er ikke tilgængelig, kun virksomhedsplan.',
'nordigen_handler_error_heading_institution_invalid' => 'Invalid Institution', 'nordigen_handler_error_heading_institution_invalid' => 'Ugyldig institution',
'nordigen_handler_error_contents_institution_invalid' => 'The provided institution-id is invalid or no longer valid.', 'nordigen_handler_error_contents_institution_invalid' => 'Det angivne institutions-id er ugyldigt eller ikke længere gyldigt.',
'nordigen_handler_error_heading_ref_invalid' => 'Invalid Reference', 'nordigen_handler_error_heading_ref_invalid' => 'Ugyldig reference',
'nordigen_handler_error_contents_ref_invalid' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.', 'nordigen_handler_error_contents_ref_invalid' => 'GoCardless leverede ikke en gyldig reference. Kør venligst flow igen og kontakt support, hvis dette problem fortsætter.',
'nordigen_handler_error_heading_not_found' => 'Invalid Requisition', 'nordigen_handler_error_heading_not_found' => 'Ugyldig rekvisition',
'nordigen_handler_error_contents_not_found' => 'GoCardless did not provide a valid reference. Please run flow again and contact support, if this issue persists.', 'nordigen_handler_error_contents_not_found' => 'GoCardless leverede ikke en gyldig reference. Kør venligst flow igen og kontakt support, hvis dette problem fortsætter.',
'nordigen_handler_error_heading_requisition_invalid_status' => 'Not Ready', 'nordigen_handler_error_heading_requisition_invalid_status' => 'Ikke klar',
'nordigen_handler_error_contents_requisition_invalid_status' => 'You called this site too early. Please finish authorization and refresh this page. Contact support for help, if this issue persists.', 'nordigen_handler_error_contents_requisition_invalid_status' => 'Du ringede til dette websted for tidligt. Afslut venligst godkendelsen og opdater denne side. kontakt support for at få hjælp, hvis dette problem fortsætter.',
'nordigen_handler_error_heading_requisition_no_accounts' => 'No Accounts selected', 'nordigen_handler_error_heading_requisition_no_accounts' => 'Ingen konti valgt',
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.', 'nordigen_handler_error_contents_requisition_no_accounts' => 'Tjenesten har ikke returneret nogen gyldige konti. Overvej at genstarte flowet.',
'nordigen_handler_restart' => 'Restart flow.', 'nordigen_handler_restart' => 'Genstart flow.',
'nordigen_handler_return' => 'Return to application.', 'nordigen_handler_return' => 'Vend tilbage til ansøgning.',
'lang_Lao' => 'Lao', 'lang_Lao' => 'Lao',
'currency_lao_kip' => 'Lao kip', 'currency_lao_kip' => 'Lao kip',
'yodlee_regions' => 'Regions: USA, UK, Australia & India', 'yodlee_regions' => 'Regioner: USA, Storbritannien, Australien og Indien',
'nordigen_regions' => 'Regions: Europe & UK', 'nordigen_regions' => 'Regioner: Europa og Storbritannien',
'select_provider' => 'Select Provider', 'select_provider' => 'Vælg udbyder',
'nordigen_requisition_subject' => 'Requisition expired, please reauthenticate.', 'nordigen_requisition_subject' => 'Rekvisitionen er udløbet. Genautentificer venligst.',
'nordigen_requisition_body' => 'Access to bank account feeds has expired as set in End User Agreement. <br><br>Please log into Invoice Ninja and re-authenticate with your banks to continue receiving transactions.', 'nordigen_requisition_body' => 'Adgang til bankkontofeeds er udløbet som angivet i End Bruger aftalen.<br><br> Log venligst ind på Faktura Ninja og genautentificer med dine banker for at fortsætte med at modtage transaktioner.',
'participant' => 'Participant', 'participant' => 'Deltager',
'participant_name' => 'Participant name', 'participant_name' => 'Navn på deltager',
'client_unsubscribed' => 'Client unsubscribed from emails.', 'client_unsubscribed' => 'Klient afmeldte e-mails.',
'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.', 'client_unsubscribed_help' => 'Klient :client har afmeldt dine e-mails. Klient skal give samtykke til at modtage fremtidige e-mails fra dig.',
'resubscribe' => 'Resubscribe', 'resubscribe' => 'Gentilmeld',
'subscribe' => 'Subscribe', 'subscribe' => 'Abonner',
'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.', 'subscribe_help' => 'Du er i øjeblikket tilmeldt og vil fortsat modtage e-mail kommunikation.',
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', 'unsubscribe_help' => 'Du er i øjeblikket ikke tilmeldt, og vil derfor ikke modtage e-mails på nuværende tidspunkt.',
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error', 'notification_purchase_order_bounced' => 'Vi var ikke i stand til at levere indkøbsordre :invoice til :contact .<br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', 'notification_purchase_order_bounced_subject' => 'Kan ikke levere indkøbsordre :invoice',
'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile', 'show_pdfhtml_on_mobile' => 'Vis HTML-version af enheden, når du ser på mobilen',
'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.', 'show_pdfhtml_on_mobile_help' => 'For forbedret visualisering, viser en HTML-version af Faktura /citatet, når du ser på mobilen.',
'please_select_an_invoice_or_credit' => 'Please select an invoice or credit', 'please_select_an_invoice_or_credit' => 'Vælg venligst en Faktura eller kredit',
'mobile_version' => 'Mobile Version', 'mobile_version' => 'Mobil version',
'venmo' => 'Venmo', 'venmo' => 'Venmo',
'my_bank' => 'MyBank', 'my_bank' => 'MyBank',
'pay_later' => 'Pay Later', 'pay_later' => 'Betal senere',
'local_domain' => 'Local Domain', 'local_domain' => 'Lokalt domæne',
'verify_peer' => 'Verify Peer', 'verify_peer' => 'Bekræft Peer',
'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key', 'nordigen_help' => 'Bemærk : tilslutning af en konto kræver en GoCardless/Norden API-nøgle',
'ar_detailed' => 'Accounts Receivable Detailed', 'ar_detailed' => 'Debitorer detaljeret',
'ar_summary' => 'Accounts Receivable Summary', 'ar_summary' => 'Debitoroversigt',
'client_sales' => 'Client Sales', 'client_sales' => 'Klient',
'user_sales' => 'User Sales', 'user_sales' => 'Bruger Salg',
'iframe_url' => 'iFrame URL', 'iframe_url' => 'iFrame URL',
'user_unsubscribed' => 'User unsubscribed from emails :link', 'user_unsubscribed' => 'Bruger afmeldte e-mails :link',
'use_available_payments' => 'Use Available Payments', 'use_available_payments' => 'Brug tilgængelig Betalinger',
'test_email_sent' => 'Successfully sent email', 'test_email_sent' => 'Succesfuldt sendt e-mail',
'gateway_type' => 'Gateway Type', 'gateway_type' => 'Gateway type',
'save_template_body' => 'Would you like to save this import mapping as a template for future use?', 'save_template_body' => 'Vil du gerne Gem denne importkortlægning som en skabelon til fremtidig brug?',
'save_as_template' => 'Save Template Mapping', 'save_as_template' => 'Gem skabelon kortlægning',
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date', 'auto_bill_standard_invoices_help' => 'Autofaktura standard Fakturaer på forfaldsdatoen',
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)', 'auto_bill_on_help' => 'Automatisk regning på afsendelsesdato ELLER forfaldsdato ( Gentagen Fakturaer )',
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method', 'use_available_credits_help' => 'Anvend eventuelle kreditsaldi til Betaling er inden opkrævning af en Betaling',
'use_unapplied_payments' => 'Use unapplied payments', 'use_unapplied_payments' => 'Brug uanvendt Betalinger',
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method', 'use_unapplied_payments_help' => 'Anvend eventuelle Betaling inden opkrævning af en Betaling',
'payment_terms_help' => 'Sætter standard <b>faktura forfalds dato</b>', 'payment_terms_help' => 'Sætter standard <b>faktura forfalds dato</b>',
'payment_type_help' => 'Indstiller den <b>manuelle Betaling</b> som standard.', 'payment_type_help' => 'Indstiller den <b>manuelle Betaling</b> som standard.',
'quote_valid_until_help' => 'The number of days that the quote is valid for', 'quote_valid_until_help' => 'Det antal dage, som tilbuddet er gyldigt i',
'expense_payment_type_help' => 'The default expense payment type to be used', 'expense_payment_type_help' => 'Standard Udgift Betaling , der skal bruges',
'paylater' => 'Pay in 4', 'paylater' => 'Indbetal 4',
'payment_provider' => 'Payment Provider', 'payment_provider' => 'Betaling',
'select_email_provider' => 'Indstil din e-mail som den afsendende Bruger',
'purchase_order_items' => 'Indkøbsordrevarer',
'csv_rows_length' => 'Ingen data fundet i denne CSV-fil',
'accept_payments_online' => 'Accepter Betalinger Online',
'all_payment_gateways' => 'Vis alle Betaling gateways',
'product_cost' => 'Produktomkostninger',
'enable_rappen_roudning' => 'Aktiver Rappen-afrunding',
'enable_rappen_rounding_help' => 'Afrunder i alt til nærmeste 5',
'duration_words' => 'Varighed i ord',
'upcoming_recurring_invoices' => 'Kommende Gentagen Fakturaer',
'total_invoices' => 'Total Fakturaer',
); );
return $lang; return $lang;

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