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

Merge branch 'v5-develop' of https://github.com/invoiceninja/invoiceninja into feature-inbound-email-expenses

This commit is contained in:
paulwer 2024-04-01 16:07:30 +02:00
commit 60861e0afa
157 changed files with 7554 additions and 3066 deletions

View File

@ -1 +1 @@
5.8.37
5.8.39

View File

@ -169,26 +169,21 @@ class CheckData extends Command
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) {
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) {
$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 {
// $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 {
$this->logMessage("No contact present, so cannot add invitation for {$entity_key} - {$entity->id}");
try{
$entity->service()->createInvitations()->save();
}
catch(\Exception $e){
}
}
try {

View File

@ -168,7 +168,6 @@ class BaseRule implements RuleInterface
/* We should only apply taxes for configured states */
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("With new logic, we should never see this");
}
/** Harvest the client_region */

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -72,10 +72,16 @@ class TaskExport extends BaseExport
->where('is_deleted', $this->input['include_deleted'] ?? false);
$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);
}
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'])) {
$seconds = $task->calcDuration();
$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);

View File

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

View File

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

View File

@ -137,6 +137,7 @@ class ClientFilters extends QueryFilters
$query->where('first_name', 'like', '%'.$filter.'%');
$query->orWhere('last_name', 'like', '%'.$filter.'%');
$query->orWhere('email', 'like', '%'.$filter.'%');
$query->orWhere('phone', 'like', '%'.$filter.'%');
})
->orWhere('custom_value1', 'like', '%'.$filter.'%')
->orWhere('custom_value2', 'like', '%'.$filter.'%')
@ -166,7 +167,7 @@ class ClientFilters extends QueryFilters
$dir = ($sort_col[1] == 'asc') ? 'asc' : 'desc';
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);

View File

@ -148,7 +148,7 @@ class CreditFilters extends QueryFilters
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);

View File

@ -197,7 +197,7 @@ class ExpenseFilters extends QueryFilters
}
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'])) {

View File

@ -176,7 +176,7 @@ class PaymentFilters extends QueryFilters
}
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);

View File

@ -72,7 +72,7 @@ class ProjectFilters extends QueryFilters
}
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);

View File

@ -131,7 +131,7 @@ class PurchaseOrderFilters extends QueryFilters
}
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);

View File

@ -156,7 +156,7 @@ class QuoteFilters extends QueryFilters
}
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') {

View File

@ -130,7 +130,7 @@ class RecurringInvoiceFilters extends QueryFilters
}
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);

View File

@ -144,7 +144,7 @@ class TaskFilters extends QueryFilters
}
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);

View File

@ -72,7 +72,7 @@ class VendorFilters extends QueryFilters
$dir = ($sort_col[1] == 'asc') ? 'asc' : 'desc';
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);

View File

@ -246,6 +246,8 @@ class InvoiceSum
if ($this->invoice->status_id != Invoice::STATUS_DRAFT) {
if ($this->invoice->amount != $this->invoice->balance) {
// $paid_to_date = $this->invoice->amount - $this->invoice->balance;
$this->invoice->balance = Number::roundValue($this->getTotal(), $this->precision) - $this->invoice->paid_to_date; //21-02-2024 cannot use the calculated $paid_to_date here as it could send the balance backward.
} else {
$this->invoice->balance = Number::roundValue($this->getTotal(), $this->precision);

View File

@ -271,11 +271,14 @@ class BankIntegrationController extends BaseController
$nordigen = new 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);
if (!$account) {
$bank_integration->disabled_upstream = true;
if (!$is_account_active || !$account) {
$bank_integration->disabled_upstream = true;
$bank_integration->save();
$nordigen->disabledAccountEmail($bank_integration);
return;
}
@ -304,10 +307,10 @@ class BankIntegrationController extends BaseController
$account = $user->account;
$bank_integration = BankIntegration::withTrashed()
->where('bank_account_id', $acc_id)
->orWhere('nordigen_account_id', $acc_id)
->company()
->firstOrFail();
->where('bank_account_id', $acc_id)
->orWhere('nordigen_account_id', $acc_id)
->company()
->firstOrFail();
if ($bank_integration->integration_type == BankIntegration::INTEGRATION_TYPE_YODLEE) {
$this->removeAccountYodlee($account, $bank_integration);

View File

@ -328,9 +328,12 @@ class ClientController extends BaseController
->first();
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();
return $this->itemResponse($merged_client);

View File

@ -17,8 +17,12 @@ use App\Models\Invoice;
class DashboardController extends Controller
{
public function index(): \Illuminate\View\View
public function index(): \Illuminate\View\View|\Illuminate\Http\RedirectResponse
{
if (auth()->guard('contact')->user()->client->getSetting('enable_client_portal_dashboard') === false) {
return redirect()->route('client.invoices.index');
}
$total_invoices = Invoice::withTrashed()
->where('client_id', auth()->guard('contact')->user()->client_id)
->where('is_deleted', 0)

View File

@ -87,7 +87,7 @@ class InvitationController extends Controller
->firstOrFail();
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()) {
@ -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])->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})])->header('Cache-Control', 'no-store, no-cache, must-revalidate, post-check=0, pre-check=0');
}
private function fireEntityViewedEvent($invitation, $entity_string)
@ -278,7 +277,7 @@ class InvitationController extends Controller
auth()->guard('contact')->loginUsingId($invitation->contact->id, true);
$invoice = $invitation->invoice;
$invoice = $invitation->invoice->service()->removeUnpaidGatewayFees()->save();
if ($invoice->partial > 0) {
$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;
$data = [
'invoice' => $invoice,
'invoice' => $invoice->service()->removeUnpaidGatewayFees()->save(),
'invitation' => $invitation ?: $invoice->invitations->first(),
'key' => $invitation ? $invitation->key : false,
'hash' => $hash,

View File

@ -26,7 +26,7 @@ class SubscriptionPurchaseController extends Controller
App::setLocale($subscription->company->locale());
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 */

View File

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

View File

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

View File

@ -66,7 +66,7 @@ class ARDetailReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -65,7 +65,7 @@ class ARSummaryReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -36,7 +36,7 @@ class ActivityReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -65,7 +65,7 @@ class ClientBalanceReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,7 @@ class ClientContactReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -67,7 +67,7 @@ class ClientReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -65,7 +65,7 @@ class ClientSalesReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,7 @@ class CreditReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -67,7 +67,7 @@ class DocumentReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -68,7 +68,7 @@ class ExpenseReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,7 @@ class InvoiceItemReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,7 @@ class InvoiceReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -67,7 +67,7 @@ class PaymentReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -68,7 +68,7 @@ class ProductReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -67,7 +67,7 @@ class ProductSalesReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -67,7 +67,7 @@ class ProfitAndLossController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -34,7 +34,7 @@ class PurchaseOrderItemReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -36,7 +36,7 @@ class PurchaseOrderReportController extends BaseController
$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);
return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,7 @@ class QuoteItemReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,7 @@ class QuoteReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -34,7 +34,7 @@ class RecurringInvoiceReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,8 @@ class TaskReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -66,7 +66,7 @@ class TaxSummaryReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -65,7 +65,7 @@ class UserSalesReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -34,7 +34,7 @@ class VendorReportController extends BaseController
/** @var \App\Models\User $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);
return response()->json(['message' => 'working...'], 200);

View File

@ -59,6 +59,7 @@ class ShowChartRequest extends Request
}
if (! isset($input['end_date'])) {
// $input['end_date'] = now()->lastOfMonth()->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.
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']);
$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);

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;
use App\Utils\Ninja;
use App\Http\Requests\Request;
use Illuminate\Auth\Access\AuthorizationException;
class GenericReportRequest extends Request
{
private string $error_message = '';
/**
* Determine if the user is authorized to make this request.
*
@ -22,11 +26,7 @@ class GenericReportRequest extends Request
*/
public function authorize(): bool
{
/** @var \App\Models\User $user */
$user = auth()->user();
return $user->isAdmin() || $user->hasPermission('view_reports');
return $this->checkAuthority();
}
public function rules()
@ -70,4 +70,25 @@ class GenericReportRequest extends Request
$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;
use App\Utils\Ninja;
use App\Http\Requests\Request;
use App\Utils\Traits\MakesHash;
use Illuminate\Auth\Access\AuthorizationException;
class ProductSalesReportRequest extends Request
{
use MakesHash;
private string $error_message = '';
/**
* Determine if the user is authorized to make this request.
*
@ -25,18 +29,22 @@ class ProductSalesReportRequest extends Request
*/
public function authorize(): bool
{
return auth()->user()->isAdmin();
return $this->checkAuthority();
}
public function rules()
{
/** @var \App\Models\User $user */
$user = auth()->user();
return [
'date_range' => 'bail|required|string',
'end_date' => 'bail|required_if:date_range,custom|nullable|date',
'start_date' => 'bail|required_if:date_range,custom|nullable|date',
'report_keys' => 'bail|present|array',
'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);
}
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;
use App\Utils\Ninja;
use App\Http\Requests\Request;
use Illuminate\Auth\Access\AuthorizationException;
class ProfitLossRequest extends Request
{
private string $error_message = '';
/**
* Determine if the user is authorized to make this request.
*
@ -22,10 +27,7 @@ class ProfitLossRequest extends Request
*/
public function authorize(): bool
{
/** @var \App\Models\User $user */
$user = auth()->user();
return $user->isAdmin();
return $this->checkAuthority();
}
public function rules()
@ -51,4 +53,26 @@ class ProfitLossRequest extends Request
$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;
use App\Utils\Ninja;
use App\Http\Requests\Request;
use Illuminate\Auth\Access\AuthorizationException;
class ReportPreviewRequest extends Request
{
private string $error_message = '';
/**
* Determine if the user is authorized to make this request.
*
@ -22,11 +26,7 @@ class ReportPreviewRequest extends Request
*/
public function authorize(): bool
{
/** @var \App\Models\User $user */
$user = auth()->user();
return $user->isAdmin() || $user->hasPermission('view_reports');
return $this->checkAuthority();
}
public function rules()
@ -38,4 +38,26 @@ class ReportPreviewRequest extends Request
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,7 +101,9 @@ class PortalComposer
$enabled_modules = auth()->guard('contact')->user()->company->enabled_modules;
$data = [];
$data[] = [ 'title' => ctrans('texts.dashboard'), 'url' => 'client.dashboard', 'icon' => 'activity'];
if ($this->settings->enable_client_portal_dashboard) {
$data[] = [ 'title' => ctrans('texts.dashboard'), 'url' => 'client.dashboard', 'icon' => 'activity'];
}
if (self::MODULE_INVOICES & $enabled_modules) {
$data[] = ['title' => ctrans('texts.invoices'), 'url' => 'client.invoices.index', 'icon' => 'file-text'];

View File

@ -11,11 +11,12 @@
namespace App\Jobs\Cron;
use App\Libraries\MultiDB;
use App\Models\Company;
use App\Models\Invoice;
use App\Libraries\MultiDB;
use Illuminate\Support\Facades\Auth;
use App\Utils\Traits\SubscriptionHooker;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Support\Facades\Auth;
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);
$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;
}
@ -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 = 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(',');
$subject = $messageDetail->subject ?? '';

View File

@ -59,15 +59,12 @@ class CleanStaleInvoiceOrder implements ShouldQueue
Invoice::query()
->withTrashed()
->where('status_id', Invoice::STATUS_SENT)
->whereBetween('created_at', [now()->subHours(1), now()->subMinutes(30)])
->where('created_at', '<', now()->subMinutes(30))
->where('balance', '>', 0)
->whereJsonContains('line_items', ['type_id' => '3'])
->cursor()
->each(function ($invoice) {
if (collect($invoice->line_items)->contains('type_id', 3)) {
$invoice->service()->removeUnpaidGatewayFees();
}
$invoice->service()->removeUnpaidGatewayFees();
});
return;
@ -86,6 +83,18 @@ class CleanStaleInvoiceOrder implements ShouldQueue
$invoice->is_proforma = false;
$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']}";
nlog($invoice->id);
$this->ids['invoices'][$key] = [
'old' => $resource['id'],
'new' => $invoice->id,
@ -1527,10 +1525,11 @@ class Import implements ShouldQueue
}
}
// 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)) {
$expense_id = $this->transformId('expenses', $resource['expense_id']);
$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';

View File

@ -796,15 +796,18 @@ class Client extends BaseModel implements HasLocalePreference
{
$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');
} elseif (array_key_exists('terms', $data)) {
} elseif ($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');
} elseif (array_key_exists('footer', $data)) {
} elseif ($footer) {
$defaults['footer'] = $data['footer'];
}

View File

@ -2,6 +2,7 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\SoftDeletes;
use Laracasts\Presenter\PresentableTrait;
@ -121,6 +122,22 @@ class Project extends BaseModel
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()
{
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'];
}
// if ($this->company_gateway->require_contact_name) {
$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'];
// }
// if ($this->company_gateway->require_contact_email) {
$fields[] = ['name' => 'contact_email', 'label' => ctrans('texts.email'), 'type' => 'text', 'validation' => 'required,email:rfc'];
// }
$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'];
if ($this->company_gateway->require_client_phone) {
$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'];
}
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'];
}
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'];
}
@ -797,19 +790,24 @@ class BaseDriver extends AbstractPaymentDriver
'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.
*
* @return void
* @return bool
*/
public function disconnect()
{
return true;
}
/**
* Stub for checking authentication.
*
* @return bool
*/
public function auth(): bool
{
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)
{
$validator = Validator::make($request->all(), [

View File

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

View File

@ -165,8 +165,10 @@ class StripePaymentDriver extends BaseDriver
}
if ($this->client
&& 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'])) {
&& $this->client->currency()
&& 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;
}

View File

@ -167,7 +167,8 @@ class BaseRepository
$company_defaults = $client->setCompanyDefaults($data, lcfirst($resource));
$data['exchange_rate'] = $company_defaults['exchange_rate'];
$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

View File

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

View File

@ -80,18 +80,29 @@ class PdfMaker
$replacements = [];
$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 {
$entity = $this->data['template']['entity'];
$ts->setCompany($entity->company);
$ts->setCompany($client->company);
$ts->addGlobal(['currency_code' => $client->company->currency()->code]);
} 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;
foreach ($contents as $content) {

View File

@ -57,6 +57,13 @@ class PurchaseOrderExpense
$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();
event('eloquent.created: App\Models\Expense', $expense);

View File

@ -79,7 +79,7 @@ class TemplateAction implements ShouldQueue
*/
public function handle()
{
// nlog("inside template action");
nlog("inside template action");
MultiDB::setDb($this->db);
@ -108,7 +108,14 @@ class TemplateAction implements ShouldQueue
->where('company_id', $this->company->id)
->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) {
$data[$key] = collect($result);
@ -118,10 +125,9 @@ class TemplateAction implements ShouldQueue
$ts = $template_service
->setCompany($this->company)
->addGlobal(['currency_code' => $currency_code])
->build($data);
// nlog($ts->getHtml());
if($this->send_email) {
$pdf = $ts->getPdf();
$this->sendEmail($pdf, $template);

View File

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

View File

@ -12,10 +12,13 @@
namespace App\Transformers;
use App\Models\Client;
use App\Models\Document;
use App\Models\Project;
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;
/**
@ -35,6 +38,9 @@ class ProjectTransformer extends EntityTransformer
protected array $availableIncludes = [
'client',
'tasks',
'invoices',
'expenses',
'quotes',
];
public function includeDocuments(Project $project)
@ -67,6 +73,27 @@ class ProjectTransformer extends EntityTransformer
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)
{
return [

View File

@ -42,6 +42,7 @@ class TaskTransformer extends EntityTransformer
'project',
'user',
'invoice',
'assigned_user',
];
public function includeDocuments(Task $task)
@ -73,6 +74,16 @@ class TaskTransformer extends EntityTransformer
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
{

View File

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

View File

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

View File

@ -46,6 +46,7 @@ class PurchaseOrderFactory extends Factory
'due_date' => $this->faker->date(),
'line_items' => InvoiceItemFactory::generate(5),
'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' => 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' => 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) {

View File

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

View File

@ -462,8 +462,8 @@ $lang = array(
'delete_token' => 'Изтриване на токън',
'token' => 'Токън',
'add_gateway' => 'Add Payment Gateway',
'delete_gateway' => 'Изтриване на Gateway',
'edit_gateway' => 'Редакция на Gateway',
'delete_gateway' => 'Delete Payment Gateway',
'edit_gateway' => 'Edit Payment Gateway',
'updated_gateway' => 'Успешно актуализиран Gateway',
'created_gateway' => 'Успешно създаден Gateway',
'deleted_gateway' => 'Успешно изтрит Gateway',
@ -2198,6 +2198,8 @@ $lang = array(
'encryption' => 'Криптиране',
'mailgun_domain' => 'Mailgun домейн',
'mailgun_private_key' => 'Mailgun частен ключ',
'brevo_domain' => 'Brevo Domain',
'brevo_private_key' => 'Brevo Private Key',
'send_test_email' => 'Изпращане на тестов имейл',
'select_label' => 'Избор на етикет',
'label' => 'Етикет',
@ -4848,6 +4850,7 @@ $lang = array(
'email_alignment' => 'Email Alignment',
'pdf_preview_location' => 'PDF Preview Location',
'mailgun' => 'Mailgun',
'brevo' => 'Brevo',
'postmark' => 'Postmark',
'microsoft' => 'Microsoft',
'click_plus_to_create_record' => 'Click + to create a record',
@ -5100,6 +5103,8 @@ $lang = array(
'drop_files_here' => 'Drop files here',
'upload_files' => 'Upload Files',
'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',
'intracommunity_tax_info' => 'Tax-free intra-community delivery',
'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',
'paylater' => 'Pay in 4',
'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;

View File

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

View File

@ -461,8 +461,8 @@ $lang = array(
'delete_token' => 'Smazat Token',
'token' => 'Token',
'add_gateway' => 'Add Payment Gateway',
'delete_gateway' => 'Smazat platební bránu',
'edit_gateway' => 'Editovat bránu',
'delete_gateway' => 'Delete Payment Gateway',
'edit_gateway' => 'Edit Payment Gateway',
'updated_gateway' => 'Brána úspěšně změněna',
'created_gateway' => 'Brána úspěšně vytvořena',
'deleted_gateway' => 'Brána úspěšně smazána',
@ -2198,6 +2198,8 @@ $lang = array(
'encryption' => 'Šifrování',
'mailgun_domain' => 'Mailgun Domain',
'mailgun_private_key' => 'Mailgun Private Key',
'brevo_domain' => 'Brevo Domain',
'brevo_private_key' => 'Brevo Private Key',
'send_test_email' => 'Odeslat zkušební e-mail',
'select_label' => 'Vybrat štítek',
'label' => 'Štítek',
@ -4848,6 +4850,7 @@ $lang = array(
'email_alignment' => 'Email Alignment',
'pdf_preview_location' => 'PDF Preview Location',
'mailgun' => 'Mailgun',
'brevo' => 'Brevo',
'postmark' => 'Postmark',
'microsoft' => 'Microsoft',
'click_plus_to_create_record' => 'Click + to create a record',
@ -5100,6 +5103,8 @@ $lang = array(
'drop_files_here' => 'Drop files here',
'upload_files' => 'Upload Files',
'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',
'intracommunity_tax_info' => 'Tax-free intra-community delivery',
'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',
'paylater' => 'Pay in 4',
'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;

View File

@ -460,9 +460,9 @@ $lang = array(
'edit_token' => 'Redigér token',
'delete_token' => 'Slet token',
'token' => 'Token',
'add_gateway' => 'Add Payment Gateway',
'delete_gateway' => 'Slet gateway',
'edit_gateway' => 'Redigér gateway',
'add_gateway' => 'Tilføj Betalingsgateway',
'delete_gateway' => 'Slet Betalingsgateway',
'edit_gateway' => 'Redigér Betalingsgateway',
'updated_gateway' => 'Gateway blev opdateret',
'created_gateway' => 'Gateway blev oprettet',
'deleted_gateway' => 'Gateway blev slettet',
@ -506,8 +506,8 @@ $lang = array(
'auto_wrap' => 'Automatisk linie ombrydning',
'duplicate_post' => 'Advarsel: den foregående side blev sendt to gange. Den anden afsendelse er blevet ignoreret.',
'view_documentation' => 'Vis dokumentation',
'app_title' => 'Free Online Invoicing',
'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_title' => 'Gratis online Fakturering',
'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',
'www' => 'www',
'logo' => 'Logo',
@ -693,9 +693,9 @@ $lang = array(
'disable' => 'Disable',
'invoice_quote_number' => 'Invoice and Quote Numbers',
'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_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',
'custom_invoice_link' => 'Custom Invoice Link',
'total_invoiced' => 'Faktureret i alt',
@ -1900,7 +1900,7 @@ $lang = array(
'require_quote_signature_help' => 'Kræv at klienten giver deres underskrift.',
'i_agree' => 'Jeg accepterer betingelserne',
'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',
'signed' => 'Underskrevet',
@ -2196,6 +2196,8 @@ $lang = array(
'encryption' => 'Kryptering',
'mailgun_domain' => 'Mailgun domæne',
'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',
'select_label' => 'Vælg Label',
'label' => 'Etiket',
@ -3009,7 +3011,7 @@ $lang = array(
'hosted_login' => 'Hostet login',
'selfhost_login' => 'Selfhost 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',
'today' => 'I dag',
'current' => 'Nuværende',
@ -3327,7 +3329,7 @@ $lang = array(
'credit_number_counter' => 'Kreditnummertæller',
'reset_counter_date' => 'Nulstil tællerdato',
'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_rate_1' => 'Standardafgiftssats 1',
'default_tax_name_2' => 'Standard skattenavn 2',
@ -3867,7 +3869,7 @@ $lang = array(
'cancellation_pending' => 'Aflysning afventer, vi kontakter dig!',
'list_of_payments' => 'Liste over Betalinger',
'payment_details' => 'Detaljer om Betaling',
'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_invoices' => 'Associate Fakturaer',
'list_of_payment_methods' => 'Liste over Betaling',
'payment_method_details' => 'Detaljer om Betaling',
'permanently_remove_payment_method' => 'Fjern denne Betaling permanent.',
@ -4216,7 +4218,7 @@ $lang = array(
'direct_debit' => 'Direkte debitering',
'clone_to_expense' => 'Klon til Udgift',
'checkout' => 'Checkout',
'acss' => 'ACSS Debit',
'acss' => 'ACSS debet',
'invalid_amount' => 'Ugyldigt Beløb . Kun tal/decimalværdier.',
'client_payment_failure_body' => 'Betaling for Faktura :invoice for Beløb :amount mislykkedes.',
'browser_pay' => 'Google Pay, Apple Pay, Microsoft Pay',
@ -4846,6 +4848,7 @@ $lang = array(
'email_alignment' => 'e-mail justering',
'pdf_preview_location' => 'PDF eksempelplacering',
'mailgun' => 'Mailgun',
'brevo' => 'Brevo',
'postmark' => 'Poststempel',
'microsoft' => 'Microsoft',
'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',
'authorization_failure' => 'Utilstrækkelige tilladelser til at udføre denne handling',
'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_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Betales inden for :payeddue dage netto indtil :paydate',
@ -5089,7 +5092,7 @@ $lang = array(
'region' => 'Område',
'county' => 'Amt',
'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',
'default_payment_type' => 'Standard Betaling',
'number_precision' => 'Nummerpræcision',
@ -5098,6 +5101,8 @@ $lang = array(
'drop_files_here' => 'Slip filer her',
'upload_files' => 'Upload filer',
'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',
'intracommunity_tax_info' => 'Skattefri levering inden for samfundet',
'reverse_tax_info' => 'Bemærk venligst, at denne levering er underlagt omvendt betalingspligt',
@ -5119,7 +5124,7 @@ $lang = array(
'set_private' => 'Indstil privat',
'individual' => 'Individuel',
'business' => 'Forretning',
'partnership' => 'Partnership',
'partnership' => 'Partnerskab',
'trust' => 'Tillid',
'charity' => 'Velgørenhed',
'government' => 'Regering',
@ -5146,113 +5151,123 @@ $lang = array(
'load_template_description' => 'Skabelonen vil blive anvendt på følgende:',
'run_template' => 'Kør skabelon',
'statement_design' => 'Statement Design',
'delivery_note_design' => 'Delivery Note Design',
'payment_receipt_design' => 'Payment Receipt Design',
'payment_refund_design' => 'Payment Refund Design',
'task_extension_banner' => 'Add the Chrome extension to manage your tasks',
'watch_video' => 'Watch Video',
'view_extension' => 'View Extension',
'reactivate_email' => 'Reactivate Email',
'email_reactivated' => 'Successfully reactivated email',
'template_help' => 'Enable using the design as a template',
'quarter' => 'Quarter',
'item_description' => 'Item Description',
'task_item' => 'Task Item',
'record_state' => 'Record State',
'save_files_to_this_folder' => 'Save files to this folder',
'downloads_folder' => 'Downloads Folder',
'total_invoiced_quotes' => 'Invoiced Quotes',
'total_invoice_paid_quotes' => 'Invoice Paid Quotes',
'downloads_folder_does_not_exist' => 'The downloads folder does not exist :value',
'user_logged_in_notification' => 'User Logged in Notification',
'user_logged_in_notification_help' => 'Send an email when logging in from a new location',
'payment_email_all_contacts' => 'Payment Email To All Contacts',
'payment_email_all_contacts_help' => 'Sends the payment email to all contacts when enabled',
'add_line' => 'Add Line',
'activity_139' => 'Expense :expense notification sent to :contact',
'vendor_notification_subject' => 'Confirmation of payment :amount sent to :vendor',
'vendor_notification_body' => 'Payment processed for :amount dated :payment_date. <br>[Transaction Reference: :transaction_reference]',
'receipt' => 'Receipt',
'charges' => 'Charges',
'email_report' => 'Email Report',
'payment_type_Pay Later' => 'Pay Later',
'payment_type_credit' => 'Payment Type Credit',
'payment_type_debit' => 'Payment Type Debit',
'send_emails_to' => 'Send Emails To',
'primary_contact' => 'Primary Contact',
'all_contacts' => 'All Contacts',
'insert_below' => 'Insert Below',
'nordigen_handler_subtitle' => 'Bank account authentication. Selecting your institution to complete the request with your account credentials.',
'nordigen_handler_error_heading_unknown' => 'An error has occured',
'nordigen_handler_error_contents_unknown' => 'An unknown error has occurred! Reason:',
'nordigen_handler_error_heading_token_invalid' => 'Invalid Token',
'nordigen_handler_error_contents_token_invalid' => 'The provided token was invalid. Contact support for help, if this issue persists.',
'nordigen_handler_error_heading_account_config_invalid' => 'Missing Credentials',
'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_heading_not_available' => 'Not Available',
'nordigen_handler_error_contents_not_available' => 'Feature unavailable, enterprise plan only.',
'nordigen_handler_error_heading_institution_invalid' => 'Invalid Institution',
'nordigen_handler_error_contents_institution_invalid' => 'The provided institution-id is invalid or no longer valid.',
'nordigen_handler_error_heading_ref_invalid' => 'Invalid 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_heading_not_found' => 'Invalid Requisition',
'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_heading_requisition_invalid_status' => 'Not Ready',
'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_heading_requisition_no_accounts' => 'No Accounts selected',
'nordigen_handler_error_contents_requisition_no_accounts' => 'The service has not returned any valid accounts. Consider restarting the flow.',
'nordigen_handler_restart' => 'Restart flow.',
'nordigen_handler_return' => 'Return to application.',
'delivery_note_design' => 'Levering Bemærk Design',
'payment_receipt_design' => 'Betaling Kvittering Design',
'payment_refund_design' => 'Betaling Refusion Design',
'task_extension_banner' => 'Tilføj Chrome-udvidelsen for at administrere dine opgaver',
'watch_video' => 'Se video',
'view_extension' => 'Vis forlængelse',
'reactivate_email' => 'Genaktiver e-mail',
'email_reactivated' => 'Succesfuldt genaktiveret e-mail',
'template_help' => 'Aktiver brug af designet som skabelon',
'quarter' => 'Kvarter',
'item_description' => 'Varebeskrivelse',
'task_item' => 'Opgave Genstand',
'record_state' => 'Rekordtilstand',
'save_files_to_this_folder' => 'Gem filer til denne mappe',
'downloads_folder' => 'Downloads mappe',
'total_invoiced_quotes' => 'Fakturerede tilbud',
'total_invoice_paid_quotes' => 'Faktura betalte tilbud',
'downloads_folder_does_not_exist' => 'Mappen downloads findes ikke :value',
'user_logged_in_notification' => 'Bruger Logget ind Notifikation',
'user_logged_in_notification_help' => 'Send en e-mail , når du logger ind fra et nyt sted',
'payment_email_all_contacts' => 'Betaling e-mail Til alle kontakter',
'payment_email_all_contacts_help' => 'Sender Betaling e-mail til alle kontakter, når den er aktiveret',
'add_line' => 'Tilføj linje',
'activity_139' => 'Udgift :expense meddelelse sendt til :contact',
'vendor_notification_subject' => 'Bekræftelse af Betaling :amount sendt til :vendor',
'vendor_notification_body' => 'Betaling behandlet for :amount dateret :payment _dato.<br> [Transaktionsreference: :transaction_reference ]',
'receipt' => 'Kvittering',
'charges' => 'Afgifter',
'email_report' => 'e-mail rapport',
'payment_type_Pay Later' => 'Betal senere',
'payment_type_credit' => 'Betaling Type Kredit',
'payment_type_debit' => 'Betaling Type Debet',
'send_emails_to' => 'Send e-mails til',
'primary_contact' => 'Primær kontakt',
'all_contacts' => 'Alle kontakter',
'insert_below' => 'Indsæt nedenfor',
'nordigen_handler_subtitle' => 'Bankkontogodkendelse. Vælg din institution for at fuldføre anmodningen med dine kontooplysninger.',
'nordigen_handler_error_heading_unknown' => 'Der er opstået en fejl',
'nordigen_handler_error_contents_unknown' => 'En ukendt fejl er sket! Grund:',
'nordigen_handler_error_heading_token_invalid' => 'Ugyldig Token',
'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' => 'Manglende legitimationsoplysninger',
'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' => 'Ikke tilgængelig',
'nordigen_handler_error_contents_not_available' => 'Funktionen er ikke tilgængelig, kun virksomhedsplan.',
'nordigen_handler_error_heading_institution_invalid' => 'Ugyldig institution',
'nordigen_handler_error_contents_institution_invalid' => 'Det angivne institutions-id er ugyldigt eller ikke længere gyldigt.',
'nordigen_handler_error_heading_ref_invalid' => 'Ugyldig reference',
'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' => 'Ugyldig rekvisition',
'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' => 'Ikke klar',
'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' => 'Ingen konti valgt',
'nordigen_handler_error_contents_requisition_no_accounts' => 'Tjenesten har ikke returneret nogen gyldige konti. Overvej at genstarte flowet.',
'nordigen_handler_restart' => 'Genstart flow.',
'nordigen_handler_return' => 'Vend tilbage til ansøgning.',
'lang_Lao' => 'Lao',
'currency_lao_kip' => 'Lao kip',
'yodlee_regions' => 'Regions: USA, UK, Australia & India',
'nordigen_regions' => 'Regions: Europe & UK',
'select_provider' => 'Select Provider',
'nordigen_requisition_subject' => 'Requisition expired, please reauthenticate.',
'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.',
'participant' => 'Participant',
'participant_name' => 'Participant name',
'client_unsubscribed' => 'Client unsubscribed from emails.',
'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.',
'resubscribe' => 'Resubscribe',
'subscribe' => 'Subscribe',
'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.',
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.',
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice',
'show_pdfhtml_on_mobile' => 'Display HTML version of entity when viewing on mobile',
'show_pdfhtml_on_mobile_help' => 'For improved visualization, displays a HTML version of the invoice/quote when viewing on mobile.',
'please_select_an_invoice_or_credit' => 'Please select an invoice or credit',
'mobile_version' => 'Mobile Version',
'yodlee_regions' => 'Regioner: USA, Storbritannien, Australien og Indien',
'nordigen_regions' => 'Regioner: Europa og Storbritannien',
'select_provider' => 'Vælg udbyder',
'nordigen_requisition_subject' => 'Rekvisitionen er udløbet. Genautentificer venligst.',
'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' => 'Deltager',
'participant_name' => 'Navn på deltager',
'client_unsubscribed' => 'Klient afmeldte e-mails.',
'client_unsubscribed_help' => 'Klient :client har afmeldt dine e-mails. Klient skal give samtykke til at modtage fremtidige e-mails fra dig.',
'resubscribe' => 'Gentilmeld',
'subscribe' => 'Abonner',
'subscribe_help' => 'Du er i øjeblikket tilmeldt og vil fortsat modtage e-mail kommunikation.',
'unsubscribe_help' => 'Du er i øjeblikket ikke tilmeldt, og vil derfor ikke modtage e-mails på nuværende tidspunkt.',
'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' => 'Kan ikke levere indkøbsordre :invoice',
'show_pdfhtml_on_mobile' => 'Vis HTML-version af enheden, når du ser på mobilen',
'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' => 'Vælg venligst en Faktura eller kredit',
'mobile_version' => 'Mobil version',
'venmo' => 'Venmo',
'my_bank' => 'MyBank',
'pay_later' => 'Pay Later',
'local_domain' => 'Local Domain',
'verify_peer' => 'Verify Peer',
'nordigen_help' => 'Note: connecting an account requires a GoCardless/Nordigen API key',
'ar_detailed' => 'Accounts Receivable Detailed',
'ar_summary' => 'Accounts Receivable Summary',
'client_sales' => 'Client Sales',
'user_sales' => 'User Sales',
'pay_later' => 'Betal senere',
'local_domain' => 'Lokalt domæne',
'verify_peer' => 'Bekræft Peer',
'nordigen_help' => 'Bemærk : tilslutning af en konto kræver en GoCardless/Norden API-nøgle',
'ar_detailed' => 'Debitorer detaljeret',
'ar_summary' => 'Debitoroversigt',
'client_sales' => 'Klient',
'user_sales' => 'Bruger Salg',
'iframe_url' => 'iFrame URL',
'user_unsubscribed' => 'User unsubscribed from emails :link',
'use_available_payments' => 'Use Available Payments',
'test_email_sent' => 'Successfully sent email',
'gateway_type' => 'Gateway Type',
'save_template_body' => 'Would you like to save this import mapping as a template for future use?',
'save_as_template' => 'Save Template Mapping',
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
'use_unapplied_payments' => 'Use unapplied payments',
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
'user_unsubscribed' => 'Bruger afmeldte e-mails :link',
'use_available_payments' => 'Brug tilgængelig Betalinger',
'test_email_sent' => 'Succesfuldt sendt e-mail',
'gateway_type' => 'Gateway type',
'save_template_body' => 'Vil du gerne Gem denne importkortlægning som en skabelon til fremtidig brug?',
'save_as_template' => 'Gem skabelon kortlægning',
'auto_bill_standard_invoices_help' => 'Autofaktura standard Fakturaer på forfaldsdatoen',
'auto_bill_on_help' => 'Automatisk regning på afsendelsesdato ELLER forfaldsdato ( Gentagen Fakturaer )',
'use_available_credits_help' => 'Anvend eventuelle kreditsaldi til Betaling er inden opkrævning af en Betaling',
'use_unapplied_payments' => 'Brug uanvendt Betalinger',
'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_type_help' => 'Indstiller den <b>manuelle Betaling</b> som standard.',
'quote_valid_until_help' => 'The number of days that the quote is valid for',
'expense_payment_type_help' => 'The default expense payment type to be used',
'paylater' => 'Pay in 4',
'payment_provider' => 'Payment Provider',
'quote_valid_until_help' => 'Det antal dage, som tilbuddet er gyldigt i',
'expense_payment_type_help' => 'Standard Udgift Betaling , der skal bruges',
'paylater' => 'Indbetal 4',
'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;

View File

@ -175,7 +175,7 @@ $lang = array(
'payment_gateway' => 'Zahlungs-Gateway',
'gateway_id' => 'Zahlungsanbieter',
'email_notifications' => 'E-Mail Benachrichtigungen',
'email_viewed' => 'Benachrichtigen, wenn eine Rechnung <strong>betrachtet</strong> wurde',
'email_viewed' => 'Benachrichtigen, wenn eine Rechnung <strong>angesehen</strong> wurde',
'email_paid' => 'Benachrichtigen, wenn eine Rechnung <strong>bezahlt</strong> wurde',
'site_updates' => 'Website-Aktualisierungen',
'custom_messages' => 'Benutzerdefinierte Nachrichten',
@ -241,16 +241,16 @@ $lang = array(
'confirmation_header' => 'Kontobestätigung',
'confirmation_message' => 'Bitte klicken Sie auf den folgenden Link, um Ihr Konto zu bestätigen.',
'invoice_subject' => 'Neue Rechnung :number von :account',
'invoice_message' => 'Um Ihre Rechnung über :amount einzusehen, klicken Sie bitte auf den folgenden Link:',
'invoice_message' => 'Um Ihre Rechnung über :amount anzusehen, klicken Sie bitte auf den folgenden Link:',
'payment_subject' => 'Zahlungseingang',
'payment_message' => 'Vielen Dank für Ihre Zahlung von :amount.',
'email_salutation' => 'Sehr geehrte/r :name,',
'email_signature' => 'Mit freundlichen Grüßen',
'email_from' => 'Das InvoiceNinja Team',
'invoice_link_message' => 'Um die Rechnung anzuschauen, bitte auf den folgenden Link klicken:',
'invoice_link_message' => 'Um die Rechnung anzusehen, bitte auf den folgenden Link klicken:',
'notification_invoice_paid_subject' => 'Die Rechnung :invoice wurde von :client bezahlt.',
'notification_invoice_sent_subject' => 'Rechnung :invoice wurde an :client versendet.',
'notification_invoice_viewed_subject' => 'Die Rechnung :invoice wurde von :client angeschaut.',
'notification_invoice_viewed_subject' => 'Die Rechnung :invoice wurde von :client angesehen.',
'notification_invoice_paid' => 'Eine Zahlung von :amount wurde von :client bezüglich Rechnung :invoice getätigt.',
'notification_invoice_sent' => 'Rechnung :invoice über :amount wurde an den Kunden :client versendet.',
'notification_invoice_viewed' => 'Der Kunde :client hat sich die Rechnung :invoice über :amount angesehen.',
@ -281,7 +281,7 @@ $lang = array(
'field_value' => 'Feldwert',
'edit' => 'Bearbeiten',
'set_name' => 'Den Firmennamen setzen',
'view_as_recipient' => 'Als Empfänger betrachten',
'view_as_recipient' => 'Als Empfänger ansehen',
'product_library' => 'Produktbibliothek',
'product' => 'Produkt',
'products' => 'Produkte',
@ -322,9 +322,9 @@ $lang = array(
'email_quote' => 'Angebot per E-Mail senden',
'clone_quote' => 'Als Angebot kopieren',
'convert_to_invoice' => 'In Rechnung umwandeln',
'view_invoice' => 'Rechnung anschauen',
'view_client' => 'Kunde anschauen',
'view_quote' => 'Angebot anschauen',
'view_invoice' => 'Rechnung ansehen',
'view_client' => 'Kunde ansehen',
'view_quote' => 'Angebot ansehen',
'updated_quote' => 'Angebot erfolgreich aktualisiert',
'created_quote' => 'Angebot erfolgreich erstellt',
'cloned_quote' => 'Angebot erfolgreich dupliziert',
@ -335,10 +335,10 @@ $lang = array(
'deleted_quotes' => ':count Angebote erfolgreich gelöscht',
'converted_to_invoice' => 'Angebot erfolgreich in Rechnung umgewandelt',
'quote_subject' => 'Neues Angebot :number von :account',
'quote_message' => 'Klicken Sie auf den folgenden Link um das Angebot über :amount anzuschauen.',
'quote_link_message' => 'Um das Angebot anzuschauen, bitte auf den folgenden Link klicken:',
'quote_message' => 'Klicken Sie auf den folgenden Link um das Angebot für Sie über :amount anzusehen.',
'quote_link_message' => 'Um das Angebot anzusehen, bitte auf den folgenden Link klicken:',
'notification_quote_sent_subject' => 'Angebot :invoice wurde an :client versendet',
'notification_quote_viewed_subject' => 'Angebot :invoice wurde von :client angeschaut',
'notification_quote_viewed_subject' => 'Angebot :invoice wurde von :client angesehen',
'notification_quote_sent' => 'Der folgende Kunde :client erhielt das Angebot :invoice über :amount.',
'notification_quote_viewed' => 'Der folgende Kunde :client hat sich das Angebot :client über :amount angesehen.',
'session_expired' => 'Ihre Sitzung ist abgelaufen.',
@ -461,9 +461,9 @@ $lang = array(
'edit_token' => 'Token bearbeiten',
'delete_token' => 'Token löschen',
'token' => 'Token',
'add_gateway' => 'Add Payment Gateway',
'delete_gateway' => 'Zahlungsanbieter löschen',
'edit_gateway' => 'Zahlungsanbieter bearbeiten',
'add_gateway' => 'Zahlungsanbieter hinzufügen',
'delete_gateway' => 'Zahlungsgateway löschen',
'edit_gateway' => 'Zahlungsgateway bearbeiten',
'updated_gateway' => 'Zahlungsanbieter aktualisiert',
'created_gateway' => 'Zahlungsanbieter erfolgreich hinzugefügt',
'deleted_gateway' => 'Zahlungsanbieter erfolgreich gelöscht',
@ -737,7 +737,7 @@ $lang = array(
'activity_4' => ':user erstellte Rechnung :invoice',
'activity_5' => ':user aktualisierte Rechnung :invoice',
'activity_6' => ':user mailte Rechnung :invoice für :client an :contact',
'activity_7' => ':contact schaute Rechnung :invoice für :client an',
'activity_7' => ':contact hat Rechnung :invoice für :client angesehen',
'activity_8' => ':user archivierte Rechnung :invoice',
'activity_9' => ':user löschte Rechnung :invoice',
'activity_10' => ':user hat die Zahlung :payment für :payment _amount der Rechnung :invoice für Kunde :client eingegeben',
@ -751,7 +751,7 @@ $lang = array(
'activity_18' => ':user erstellte Angebot :quote',
'activity_19' => ':user aktualisierte Angebot :quote',
'activity_20' => ':user mailte Angebot :quote für :client an :contact',
'activity_21' => ':contact schaute Angebot :quote an',
'activity_21' => ':contact hat Angebot :quote angesehen',
'activity_22' => ':user archiviertes Angebot :quote',
'activity_23' => ':user löschte Angebot :quote',
'activity_24' => ':user stellte Angebot :quote wieder her',
@ -957,8 +957,8 @@ $lang = array(
'color_font_help' => 'Info: Die primäre Farbe und Schriftarten werden auch im Kundenportal und im individuellen E-Mail-Design verwendet.',
'live_preview' => 'Live-Vorschau',
'invalid_mail_config' => 'E-Mails können nicht gesendet werden. Bitte überprüfen Sie, ob die E-Mail-Einstellungen korrekt sind.',
'invoice_message_button' => 'Um Ihre Rechnung über :amount zu sehen, klicken Sie die Schaltfläche unten.',
'quote_message_button' => 'Um Ihr Angebot über :amount zu sehen, klicken Sie die Schaltfläche unten.',
'invoice_message_button' => 'Um Ihre Rechnung über :amount anzusehen, klicken Sie die Schaltfläche unten.',
'quote_message_button' => 'Um Ihr Angebot über :amount anzusehen, klicken Sie die Schaltfläche unten.',
'payment_message_button' => 'Vielen Dank für Ihre Zahlung von :amount.',
'payment_type_direct_debit' => 'Überweisung',
'bank_accounts' => 'Kreditkarten & Banken',
@ -2198,6 +2198,8 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
'encryption' => 'Verschlüsselung',
'mailgun_domain' => 'Mailgun Domäne',
'mailgun_private_key' => 'Mailgun privater Schlüssel',
'brevo_domain' => 'Brevo-Domäne',
'brevo_private_key' => 'Privater Brevo-Schlüssel',
'send_test_email' => 'Test-E-Mail verschicken',
'select_label' => 'Bezeichnung wählen',
'label' => 'Label',
@ -4849,6 +4851,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
'email_alignment' => 'E-Mail Ausrichtung',
'pdf_preview_location' => 'PDF Vorschau Ort',
'mailgun' => 'Mailgun',
'brevo' => 'Brevo',
'postmark' => 'Postmark',
'microsoft' => 'Microsoft',
'click_plus_to_create_record' => 'Klicke + um einen Eintrag hinzuzufügen',
@ -5101,6 +5104,8 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
'drop_files_here' => 'Datei hier hineinziehen',
'upload_files' => 'Dateien hochladen',
'download_e_invoice' => 'E-Rechnung herunterladen',
'download_e_credit' => 'E-Credit herunterladen',
'download_e_quote' => 'E- Angebot / Kostenvoranschlag herunterladen',
'triangular_tax_info' => 'innergemeinschaftliches Dreiecksgeschäft',
'intracommunity_tax_info' => 'Steuerfreie innergemeinschaftliche Lieferung',
'reverse_tax_info' => 'Steuerschuldnerschaft des
@ -5205,7 +5210,7 @@ Leistungsempfängers',
'nordigen_handler_error_heading_requisition_invalid_status' => 'Nicht bereit',
'nordigen_handler_error_contents_requisition_invalid_status' => 'Sie haben diese Seite zu früh aufgerufen. Bitte schließen Sie die Autorisierung ab und aktualisieren Sie diese Seite. Wenn das Problem weiterhin besteht, wenden Sie sich an den Support.',
'nordigen_handler_error_heading_requisition_no_accounts' => 'Keine Konten ausgewählt',
'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' => 'Der Dienst hat keine gültigen Konten zurückgegeben. Erwägen Sie, den Flow neu zu starten.',
'nordigen_handler_restart' => 'Fluss neu starten.',
'nordigen_handler_return' => 'Zurück zur Bewerbung.',
'lang_Lao' => 'Laotisch',
@ -5246,18 +5251,28 @@ Leistungsempfängers',
'gateway_type' => 'Gateway-Typ',
'save_template_body' => 'Möchten Sie diese Importzuordnung als Vorlage für die zukünftige Verwendung speichern?',
'save_as_template' => 'Vorlagenzuordnung speichern',
'auto_bill_standard_invoices_help' => 'Auto bill standard invoices on the due date',
'auto_bill_on_help' => 'Auto bill on send date OR due date (recurring invoices)',
'use_available_credits_help' => 'Apply any credit balances to payments prior to charging a payment method',
'use_unapplied_payments' => 'Use unapplied payments',
'use_unapplied_payments_help' => 'Apply any payment balances prior to charging a payment method',
'auto_bill_standard_invoices_help' => 'Standardrechnungen automatisch am Fälligkeitsdatum abrechnen',
'auto_bill_on_help' => 'Automatische Rechnung am Sendedatum ODER Fälligkeitsdatum (wiederkehrende Rechnungen)',
'use_available_credits_help' => 'Wenden Sie etwaige Guthaben auf Zahlungen an, bevor Sie eine Zahlungsmethode belasten',
'use_unapplied_payments' => 'Verwenden Sie nicht angewendete Zahlungen',
'use_unapplied_payments_help' => 'Rechnen Sie etwaige Zahlungssalden ab, bevor Sie eine Zahlungsmethode belasten',
'payment_terms_help' => 'Setzt das <b>Standardfälligkeitsdatum</b>',
'payment_type_help' => 'Setze die Standard <b>manuelle Zahlungsmethode</b>.',
'quote_valid_until_help' => 'The number of days that the quote is valid for',
'expense_payment_type_help' => 'The default expense payment type to be used',
'paylater' => 'Pay in 4',
'payment_provider' => 'Payment Provider',
'quote_valid_until_help' => 'Die Anzahl der Tage, für die das Angebot / Kostenvoranschlag gültig ist',
'expense_payment_type_help' => 'Der standardmäßig zu verwendende Ausgabe Zahlungstyp',
'paylater' => 'Zahlen in 4',
'payment_provider' => 'Zahlungsanbieter',
'select_email_provider' => 'Legen Sie Ihre E-Mail-Adresse als sendenden Benutzer fest',
'purchase_order_items' => 'Bestellpositionen',
'csv_rows_length' => 'In dieser CSV-Datei wurden keine Daten gefunden',
'accept_payments_online' => 'Akzeptieren Sie Zahlungen online',
'all_payment_gateways' => 'Alle Zahlungsgateways anzeigen',
'product_cost' => 'Produktkosten',
'enable_rappen_roudning' => 'Aktivieren Sie die Rappen-Rundung',
'enable_rappen_rounding_help' => 'Rundet die Gesamtsumme auf die nächste 5',
'duration_words' => 'Dauer in Worten',
'upcoming_recurring_invoices' => 'Kommende wiederkehrende Rechnungen',
'total_invoices' => 'Gesamtrechnungen',
);
return $lang;

View File

@ -461,8 +461,8 @@ $lang = array(
'delete_token' => 'Διαγραφή Διακριτικού',
'token' => 'Διακριτικό',
'add_gateway' => 'Add Payment Gateway',
'delete_gateway' => 'Διαγραφή Πύλης Πληρωμών (Gateway)',
'edit_gateway' => 'Επεξεργασία Πύλης Πληρωμών (Gateway)',
'delete_gateway' => 'Delete Payment Gateway',
'edit_gateway' => 'Edit Payment Gateway',
'updated_gateway' => 'Επιτυχής ενημέρωση πύλης πληρωμών (Gateway)',
'created_gateway' => 'Επιτυχής δημιουργία πύλης πληρωμών (Gateway)',
'deleted_gateway' => 'Επιτυχής διαγραφή πύλης πληρωμών (Gateway)',
@ -2197,6 +2197,8 @@ $lang = array(
'encryption' => 'Κρυπτογράφηση',
'mailgun_domain' => 'Όνομα χώρου Mailgun',
'mailgun_private_key' => 'Ιδιωτικό Κλειδί Mailgun',
'brevo_domain' => 'Brevo Domain',
'brevo_private_key' => 'Brevo Private Key',
'send_test_email' => 'Αποστολή δοκιμαστικού email',
'select_label' => 'Επιλογή Ετικέτας',
'label' => 'Ετικέτα',
@ -4847,6 +4849,7 @@ $lang = array(
'email_alignment' => 'Email Alignment',
'pdf_preview_location' => 'PDF Preview Location',
'mailgun' => 'Mailgun',
'brevo' => 'Brevo',
'postmark' => 'Postmark',
'microsoft' => 'Microsoft',
'click_plus_to_create_record' => 'Click + to create a record',
@ -5099,6 +5102,8 @@ $lang = array(
'drop_files_here' => 'Drop files here',
'upload_files' => 'Upload Files',
'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',
'intracommunity_tax_info' => 'Tax-free intra-community delivery',
'reverse_tax_info' => 'Please note that this supply is subject to reverse charge',
@ -5253,7 +5258,17 @@ $lang = array(
'expense_payment_type_help' => 'The default expense payment type to be used',
'paylater' => 'Pay in 4',
'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;

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