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

This commit is contained in:
Benjamin Beganović 2024-03-04 17:32:23 +01:00
commit 0c0e652245
64 changed files with 1391 additions and 219 deletions

View File

@ -1 +1 @@
5.8.27 5.8.32

View File

@ -947,7 +947,35 @@ class CheckData extends Command
}); });
Company::whereDoesntHave('company_users', function ($query){
$query->where('is_owner', 1);
})
->cursor()
->when(Ninja::isHosted())
->each(function ($c){
$this->logMessage("Orphan Account # {$c->account_id}");
});
CompanyUser::whereDoesntHave('tokens')
->cursor()
->when(Ninja::isHosted())
->each(function ($cu){
$this->logMessage("Missing tokens for Company User # {$cu->id}");
});
CompanyUser::whereDoesntHave('user')
->cursor()
->when(Ninja::isHosted())
->each(function ($cu) {
$this->logMessage("Missing user for Company User # {$cu->id}");
});
} }

View File

@ -264,14 +264,14 @@ class BaseRule implements RuleInterface
return USStates::getState(strlen($this->client->postal_code) > 1 ? $this->client->postal_code : $this->client->shipping_postal_code); return USStates::getState(strlen($this->client->postal_code) > 1 ? $this->client->postal_code : $this->client->shipping_postal_code);
} catch (\Exception $e) { } catch (\Exception $e) {
return $this->client->company->country()->iso_3166_2 == 'US' ? $this->client->company->tax_data->seller_subregion : 'CA'; return 'CA';
} }
} }
public function isTaxableRegion(): bool public function isTaxableRegion(): bool
{ {
return $this->client->company->tax_data->regions->{$this->client_region}->tax_all_subregions || return $this->client->company->tax_data->regions->{$this->client_region}->tax_all_subregions ||
(property_exists($this->client->company->tax_data->regions->{$this->client_region}->subregions, $this->client_subregion) && $this->client->company->tax_data->regions->{$this->client_region}->subregions->{$this->client_subregion}->apply_tax); (property_exists($this->client->company->tax_data->regions->{$this->client_region}->subregions, $this->client_subregion) && ($this->client->company->tax_data->regions->{$this->client_region}->subregions->{$this->client_subregion}->apply_tax ?? false));
} }
public function defaultForeign(): self public function defaultForeign(): self

View File

@ -36,4 +36,10 @@ interface RuleInterface
public function override($item); public function override($item);
public function calculateRates(); public function calculateRates();
public function regionWithNoTaxCoverage(string $iso_3166_2): bool;
public function setEntity($entity): self;
public function shouldCalcTax(): bool;
} }

View File

@ -29,11 +29,13 @@ class DocumentFilters extends QueryFilters
*/ */
public function filter(string $filter = ''): Builder public function filter(string $filter = ''): Builder
{ {
if (strlen($filter) == 0) { if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
} }
return $this->builder; return $this->builder->where('name', 'like', '%'.$filter.'%');
} }
/** /**
@ -47,6 +49,43 @@ class DocumentFilters extends QueryFilters
*/ */
public function client_id(string $client_id = ''): Builder public function client_id(string $client_id = ''): Builder
{ {
return $this->builder->where(function ($query) use ($client_id) {
$query->whereHasMorph('documentable', [
\App\Models\Invoice::class,
\App\Models\Quote::class,
\App\Models\Credit::class,
\App\Models\Expense::class,
\App\Models\Payment::class,
\App\Models\Task::class,
\App\Models\RecurringExpense::class,
\App\Models\RecurringInvoice::class,
\App\Models\Project::class,
], function ($q2) use ($client_id) {
$q2->where('client_id', $this->decodePrimaryKey($client_id));
})->orWhereHasMorph('documentable', [\App\Models\Client::class], function ($q3) use ($client_id) {
$q3->where('id', $this->decodePrimaryKey($client_id));
});
});
}
public function type(string $types = '')
{
$types = explode(',', $types);
foreach ($types as $type)
{
match($type) {
'private' => $this->builder->where('is_public', 0),
'public' => $this->builder->where('is_public', 1),
'pdf' => $this->builder->where('type', 'pdf'),
'image' => $this->builder->whereIn('type', ['png','jpeg','jpg','gif','svg']),
'other' => $this->builder->whereNotIn('type', ['pdf','png','jpeg','jpg','gif','svg']),
default => $this->builder,
};
}
return $this->builder; return $this->builder;
} }

View File

@ -164,7 +164,7 @@ class PaymentFilters extends QueryFilters
{ {
$sort_col = explode('|', $sort); $sort_col = explode('|', $sort);
if (!is_array($sort_col) || count($sort_col) != 2 || !in_array($sort_col, Schema::getColumnListing('payments'))) { if (!is_array($sort_col) || count($sort_col) != 2 || !in_array($sort_col[0], Schema::getColumnListing('payments'))) {
return $this->builder; return $this->builder;
} }

View File

@ -50,7 +50,7 @@ class UserFilters extends QueryFilters
{ {
$sort_col = explode('|', $sort); $sort_col = explode('|', $sort);
if (!is_array($sort_col) || count($sort_col) != 2 || !in_array($sort_col, \Illuminate\Support\Facades\Schema::getColumnListing('users'))) { if (!is_array($sort_col) || count($sort_col) != 2 || !in_array($sort_col[0], \Illuminate\Support\Facades\Schema::getColumnListing('users'))) {
return $this->builder; return $this->builder;
} }

View File

@ -177,6 +177,8 @@ class InvoiceItemSum
if (in_array($this->client->company->country()->iso_3166_2, $this->tax_jurisdictions)) { //only calculate for supported tax jurisdictions if (in_array($this->client->company->country()->iso_3166_2, $this->tax_jurisdictions)) { //only calculate for supported tax jurisdictions
/** @var \App\DataMapper\Tax\BaseRule $class */
$class = "App\DataMapper\Tax\\".$this->client->company->country()->iso_3166_2."\\Rule"; $class = "App\DataMapper\Tax\\".$this->client->company->country()->iso_3166_2."\\Rule";
$this->rule = new $class(); $this->rule = new $class();

View File

@ -122,7 +122,7 @@ class InvoiceSum
private function calculateInvoiceTaxes(): self private function calculateInvoiceTaxes(): self
{ {
if (is_string($this->invoice->tax_name1) && strlen($this->invoice->tax_name1) > 1) { if (is_string($this->invoice->tax_name1) && strlen($this->invoice->tax_name1) >= 2) {
$tax = $this->taxer($this->total, $this->invoice->tax_rate1); $tax = $this->taxer($this->total, $this->invoice->tax_rate1);
$tax += $this->getSurchargeTaxTotalForKey($this->invoice->tax_name1, $this->invoice->tax_rate1); $tax += $this->getSurchargeTaxTotalForKey($this->invoice->tax_name1, $this->invoice->tax_rate1);
@ -130,7 +130,7 @@ class InvoiceSum
$this->total_tax_map[] = ['name' => $this->invoice->tax_name1.' '.floatval($this->invoice->tax_rate1).'%', 'total' => $tax]; $this->total_tax_map[] = ['name' => $this->invoice->tax_name1.' '.floatval($this->invoice->tax_rate1).'%', 'total' => $tax];
} }
if (is_string($this->invoice->tax_name2) && strlen($this->invoice->tax_name2) > 1) { if (is_string($this->invoice->tax_name2) && strlen($this->invoice->tax_name2) >= 2) {
$tax = $this->taxer($this->total, $this->invoice->tax_rate2); $tax = $this->taxer($this->total, $this->invoice->tax_rate2);
$tax += $this->getSurchargeTaxTotalForKey($this->invoice->tax_name2, $this->invoice->tax_rate2); $tax += $this->getSurchargeTaxTotalForKey($this->invoice->tax_name2, $this->invoice->tax_rate2);
@ -138,7 +138,7 @@ class InvoiceSum
$this->total_tax_map[] = ['name' => $this->invoice->tax_name2.' '.floatval($this->invoice->tax_rate2).'%', 'total' => $tax]; $this->total_tax_map[] = ['name' => $this->invoice->tax_name2.' '.floatval($this->invoice->tax_rate2).'%', 'total' => $tax];
} }
if (is_string($this->invoice->tax_name3) && strlen($this->invoice->tax_name3) > 1) { if (is_string($this->invoice->tax_name3) && strlen($this->invoice->tax_name3) >= 2) {
$tax = $this->taxer($this->total, $this->invoice->tax_rate3); $tax = $this->taxer($this->total, $this->invoice->tax_rate3);
$tax += $this->getSurchargeTaxTotalForKey($this->invoice->tax_name3, $this->invoice->tax_rate3); $tax += $this->getSurchargeTaxTotalForKey($this->invoice->tax_name3, $this->invoice->tax_rate3);
@ -242,9 +242,9 @@ class InvoiceSum
if ($this->invoice->status_id != Invoice::STATUS_DRAFT) { if ($this->invoice->status_id != Invoice::STATUS_DRAFT) {
if ($this->invoice->amount != $this->invoice->balance) { if ($this->invoice->amount != $this->invoice->balance) {
$paid_to_date = $this->invoice->amount - $this->invoice->balance; // $paid_to_date = $this->invoice->amount - $this->invoice->balance;
$this->invoice->balance = Number::roundValue($this->getTotal(), $this->precision) - $paid_to_date; $this->invoice->balance = Number::roundValue($this->getTotal(), $this->precision) - $this->invoice->paid_to_date; //21-02-2024 cannot use the calculated $paid_to_date here as it could send the balance backward.
} else { } else {
$this->invoice->balance = Number::roundValue($this->getTotal(), $this->precision); $this->invoice->balance = Number::roundValue($this->getTotal(), $this->precision);
} }

View File

@ -131,20 +131,20 @@ class InvoiceSumInclusive
$amount = $this->formatValue(($this->sub_total - ($this->sub_total * ($this->invoice->discount / 100))), 2); $amount = $this->formatValue(($this->sub_total - ($this->sub_total * ($this->invoice->discount / 100))), 2);
} }
if ($this->invoice->tax_rate1 > 0) { if (is_string($this->invoice->tax_name1) && strlen($this->invoice->tax_name1) > 1) {
$tax = $this->calcInclusiveLineTax($this->invoice->tax_rate1, $amount); $tax = $this->calcInclusiveLineTax($this->invoice->tax_rate1, $amount);
$this->total_taxes += $tax; $this->total_taxes += $tax;
$this->total_tax_map[] = ['name' => $this->invoice->tax_name1.' '.floatval($this->invoice->tax_rate1).'%', 'total' => $tax]; $this->total_tax_map[] = ['name' => $this->invoice->tax_name1.' '.floatval($this->invoice->tax_rate1).'%', 'total' => $tax];
} }
if ($this->invoice->tax_rate2 > 0) { if (is_string($this->invoice->tax_name2) && strlen($this->invoice->tax_name2) > 1) {
$tax = $this->calcInclusiveLineTax($this->invoice->tax_rate2, $amount); $tax = $this->calcInclusiveLineTax($this->invoice->tax_rate2, $amount);
$this->total_taxes += $tax; $this->total_taxes += $tax;
$this->total_tax_map[] = ['name' => $this->invoice->tax_name2.' '.floatval($this->invoice->tax_rate2).'%', 'total' => $tax]; $this->total_tax_map[] = ['name' => $this->invoice->tax_name2.' '.floatval($this->invoice->tax_rate2).'%', 'total' => $tax];
} }
if ($this->invoice->tax_rate3 > 0) { if (is_string($this->invoice->tax_name3) && strlen($this->invoice->tax_name3) > 1) {
$tax = $this->calcInclusiveLineTax($this->invoice->tax_rate3, $amount); $tax = $this->calcInclusiveLineTax($this->invoice->tax_rate3, $amount);
$this->total_taxes += $tax; $this->total_taxes += $tax;
$this->total_tax_map[] = ['name' => $this->invoice->tax_name3.' '.floatval($this->invoice->tax_rate3).'%', 'total' => $tax]; $this->total_tax_map[] = ['name' => $this->invoice->tax_name3.' '.floatval($this->invoice->tax_rate3).'%', 'total' => $tax];
@ -259,9 +259,9 @@ class InvoiceSumInclusive
/* If amount != balance then some money has been paid on the invoice, need to subtract this difference from the total to set the new balance */ /* If amount != balance then some money has been paid on the invoice, need to subtract this difference from the total to set the new balance */
if ($this->invoice->status_id != Invoice::STATUS_DRAFT) { if ($this->invoice->status_id != Invoice::STATUS_DRAFT) {
if ($this->invoice->amount != $this->invoice->balance) { if ($this->invoice->amount != $this->invoice->balance) {
$paid_to_date = $this->invoice->amount - $this->invoice->balance; // $paid_to_date = $this->invoice->amount - $this->invoice->balance;
$this->invoice->balance = $this->formatValue($this->getTotal(), $this->precision) - $paid_to_date; $this->invoice->balance = $this->formatValue($this->getTotal(), $this->precision) - $this->invoice->paid_to_date;
} else { } else {
$this->invoice->balance = $this->formatValue($this->getTotal(), $this->precision); $this->invoice->balance = $this->formatValue($this->getTotal(), $this->precision);
} }

View File

@ -49,6 +49,9 @@ use App\Http\Requests\Client\ClientDocumentsRequest;
use App\Http\Requests\Client\ReactivateClientEmailRequest; use App\Http\Requests\Client\ReactivateClientEmailRequest;
use App\Models\Expense; use App\Models\Expense;
use App\Models\Payment; use App\Models\Payment;
use App\Models\Project;
use App\Models\RecurringExpense;
use App\Models\RecurringInvoice;
use App\Models\Task; use App\Models\Task;
use App\Transformers\DocumentTransformer; use App\Transformers\DocumentTransformer;
@ -421,7 +424,7 @@ class ClientController extends BaseController
$documents = Document::query() $documents = Document::query()
->company() ->company()
->whereHasMorph('documentable', [Invoice::class, Quote::class, Credit::class, Expense::class, Payment::class, Task::class], function ($query) use ($client) { ->whereHasMorph('documentable', [Invoice::class, Quote::class, Credit::class, Expense::class, Payment::class, Task::class, RecurringInvoice::class, RecurringExpense::class, Project::class], function ($query) use ($client) {
$query->where('client_id', $client->id); $query->where('client_id', $client->id);
}) })
->orWhereHasMorph('documentable', [Client::class], function ($query) use ($client) { ->orWhereHasMorph('documentable', [Client::class], function ($query) use ($client) {

View File

@ -236,7 +236,6 @@ class InvoiceController extends Controller
'hashed_ids' => $invoices->pluck('hashed_id'), 'hashed_ids' => $invoices->pluck('hashed_id'),
'total' => $total, 'total' => $total,
'variables' => $variables, 'variables' => $variables,
]; ];
return $this->render('invoices.payment', $data); return $this->render('invoices.payment', $data);

View File

@ -89,6 +89,8 @@ class PrePaymentController extends Controller
$total = $invoice->balance; $total = $invoice->balance;
$invitation = $invoice->invitations->first();
//format totals //format totals
$formatted_total = Number::formatMoney($invoice->amount, auth()->guard('contact')->user()->client); $formatted_total = Number::formatMoney($invoice->amount, auth()->guard('contact')->user()->client);
@ -121,7 +123,8 @@ class PrePaymentController extends Controller
'frequency_id' => $request->frequency_id, 'frequency_id' => $request->frequency_id,
'remaining_cycles' => $request->remaining_cycles, 'remaining_cycles' => $request->remaining_cycles,
'is_recurring' => $request->is_recurring == 'on' ? true : false, 'is_recurring' => $request->is_recurring == 'on' ? true : false,
'variables' => $variables, 'variables' => $variables = ($invitation && auth()->guard('contact')->user()->client->getSetting('show_accept_invoice_terms')) ? (new HtmlEngine($invitation))->generateLabelsAndValues() : false,
]; ];
return $this->render('invoices.payment', $data); return $this->render('invoices.payment', $data);

View File

@ -260,6 +260,8 @@ class ImportController extends Controller
} }
} }
/** @phpstan-ignore-next-line **/
return $bestDelimiter ?? ','; return $bestDelimiter ?? ',';
} }

View File

@ -30,18 +30,24 @@ class SmtpController extends BaseController
$user = auth()->user(); $user = auth()->user();
$company = $user->company(); $company = $user->company();
$smtp_host = $request->input('smtp_host', $company->smtp_host);
$smtp_port = $request->input('smtp_port', $company->smtp_port);
$smtp_username = $request->input('smtp_username', $company->smtp_username);
$smtp_password = $request->input('smtp_password', $company->smtp_password);
$smtp_encryption = $request->input('smtp_encryption', $company->smtp_encryption ?? 'tls');
$smtp_local_domain = $request->input('smtp_local_domain', strlen($company->smtp_local_domain) > 2 ? $company->smtp_local_domain : null);
$smtp_verify_peer = $request->input('verify_peer', $company->smtp_verify_peer ?? true);
config([ config([
'mail.mailers.smtp' => [ 'mail.mailers.smtp' => [
'transport' => 'smtp', 'transport' => 'smtp',
'host' => $request->input('smtp_host', $company->smtp_host), 'host' => $smtp_host,
'port' => $request->input('smtp_port', $company->smtp_port), 'port' => $smtp_port,
'username' => $request->input('smtp_username', $company->smtp_username), 'username' => $smtp_username,
'password' => $request->input('smtp_password', $company->smtp_password), 'password' => $smtp_password,
'encryption' => $request->input('smtp_encryption', $company->smtp_encryption ?? 'tls'), 'encryption' => $smtp_encryption,
'local_domain' => $request->input('smtp_local_domain', strlen($company->smtp_local_domain) > 2 ? $company->smtp_local_domain : null), 'local_domain' => $smtp_local_domain,
'verify_peer' => $request->input('verify_peer', $company->smtp_verify_peer ?? true), 'verify_peer' => $smtp_verify_peer,
'timeout' => 5, 'timeout' => 5,
], ],
]); ]);

View File

@ -54,6 +54,8 @@ class StripeConnectController extends BaseController
$redirect_uri = config('ninja.app_url').'/stripe/completed'; $redirect_uri = config('ninja.app_url').'/stripe/completed';
$endpoint = "https://connect.stripe.com/oauth/authorize?response_type=code&client_id={$stripe_client_id}&redirect_uri={$redirect_uri}&scope=read_write&state={$token}"; $endpoint = "https://connect.stripe.com/oauth/authorize?response_type=code&client_id={$stripe_client_id}&redirect_uri={$redirect_uri}&scope=read_write&state={$token}";
\Illuminate\Support\Facades\Cache::pull($token);
return redirect($endpoint); return redirect($endpoint);
} }
@ -65,6 +67,8 @@ class StripeConnectController extends BaseController
return view('auth.connect.access_denied'); return view('auth.connect.access_denied');
} }
$response = false;
try { try {
/** @class \stdClass $response /** @class \stdClass $response
* @property string $scope * @property string $scope
@ -88,6 +92,11 @@ class StripeConnectController extends BaseController
nlog($response); nlog($response);
} catch (\Exception $e) { } catch (\Exception $e) {
}
if(!$response) {
return view('auth.connect.access_denied'); return view('auth.connect.access_denied');
} }
@ -144,11 +153,12 @@ class StripeConnectController extends BaseController
if(isset($request->getTokenContent()['is_react']) && $request->getTokenContent()['is_react']) { if(isset($request->getTokenContent()['is_react']) && $request->getTokenContent()['is_react']) {
$redirect_uri = config('ninja.react_url').'/#/settings/online_payments'; $redirect_uri = config('ninja.react_url').'/#/settings/online_payments';
} else { } else {
$redirect_uri = config('ninja.app_url').'/stripe/completed'; $redirect_uri = config('ninja.app_url');
} }
//response here //response here
return view('auth.connect.completed', ['url' => $redirect_uri]); return view('auth.connect.completed', ['url' => $redirect_uri]);
// return redirect($redirect_uri);
} }
} }

View File

@ -72,6 +72,10 @@ class TwoFactorController extends BaseController
return response()->json(['message' => ctrans('texts.enabled_two_factor')], 200); return response()->json(['message' => ctrans('texts.enabled_two_factor')], 200);
} elseif (! $secret || ! $google2fa->verifyKey($secret, $oneTimePassword)) { } elseif (! $secret || ! $google2fa->verifyKey($secret, $oneTimePassword)) {
return response()->json(['message' => ctrans('texts.invalid_one_time_password')], 400); return response()->json(['message' => ctrans('texts.invalid_one_time_password')], 400);
}elseif (! $user->phone) {
return response()->json(['message' => ctrans('texts.set_phone_for_two_factor')], 400);
} elseif (! $user->isVerified()) {
return response()->json(['message' => 'Please confirm your account first'], 400);
} }
return response()->json(['message' => 'No phone record or user is not confirmed'], 400); return response()->json(['message' => 'No phone record or user is not confirmed'], 400);

View File

@ -36,18 +36,46 @@ class CheckSmtpRequest extends Request
public function rules() public function rules()
{ {
return [ return [
'smtp_host' => 'sometimes|nullable|string|min:3',
'smtp_port' => 'sometimes|nullable|integer',
'smtp_username' => 'sometimes|nullable|string|min:3',
'smtp_password' => 'sometimes|nullable|string|min:3',
]; ];
} }
public function prepareForValidation() public function prepareForValidation()
{ {
/** @var \App\Models\User $user */
$user = auth()->user();
$company = $user->company();
$input = $this->input(); $input = $this->input();
if(isset($input['smtp_username']) && $input['smtp_username'] == '********') if(isset($input['smtp_username']) && $input['smtp_username'] == '********'){
unset($input['smtp_username']); // unset($input['smtp_username']);
$input['smtp_username'] = $company->smtp_username;
}
if(isset($input['smtp_password'])&& $input['smtp_password'] == '********'){
// unset($input['smtp_password']);
$input['smtp_password'] = $company->smtp_password;
}
if(isset($input['smtp_host']) && strlen($input['smtp_host']) >=3){
}
else {
$input['smtp_host'] = $company->smtp_host;
}
if(isset($input['smtp_port']) && strlen($input['smtp_port']) >= 3) {
} else {
$input['smtp_port'] = $company->smtp_port;
}
if(isset($input['smtp_password'])&& $input['smtp_password'] == '********')
unset($input['smtp_password']);
$this->replace($input); $this->replace($input);
} }

View File

@ -153,6 +153,7 @@ class BaseImport
} }
/** @phpstan-ignore-next-line **/
return $bestDelimiter ?? ','; return $bestDelimiter ?? ',';
} }

View File

@ -69,10 +69,9 @@ class CompanyExport implements ShouldQueue
{ {
MultiDB::setDb($this->company->db); MultiDB::setDb($this->company->db);
$this->file_name = date('Y-m-d') . '_' . str_replace([" ", "/"], ["_",""], $this->company->present()->name() . '_' . $this->company->company_key . '.json'); $this->file_name = date('Y-m-d') . '_' . str_replace([" ", "/"], ["_",""], $this->company->present()->name() . '_' . $this->company->company_key . '.json');
$this->writer = new File($this->file_name); $this->writer = new File(sys_get_temp_dir().'/'.$this->file_name);
set_time_limit(0); set_time_limit(0);
@ -114,8 +113,6 @@ class CompanyExport implements ShouldQueue
return $user; return $user;
})->all(); })->all();
$x = $this->writer->collection('users'); $x = $this->writer->collection('users');
$x->addItems($this->export_data['users']); $x->addItems($this->export_data['users']);
$this->export_data = null; $this->export_data = null;
@ -667,7 +664,7 @@ class CompanyExport implements ShouldQueue
private function zipAndSend() private function zipAndSend()
{ {
$zip_path = \Illuminate\Support\Str::ascii(str_replace(".json", ".zip", $this->file_name)); $zip_path = sys_get_temp_dir().'/'.\Illuminate\Support\Str::ascii(str_replace(".json", ".zip", $this->file_name));
$zip = new \ZipArchive(); $zip = new \ZipArchive();
@ -675,8 +672,8 @@ class CompanyExport implements ShouldQueue
nlog("cannot open {$zip_path}"); nlog("cannot open {$zip_path}");
} }
$zip->addFile($this->file_name); $zip->addFile(sys_get_temp_dir().'/'.$this->file_name, 'backup.json');
$zip->renameName($this->file_name, 'backup.json'); // $zip->renameName($this->file_name, 'backup.json');
$zip->close(); $zip->close();
@ -686,8 +683,8 @@ class CompanyExport implements ShouldQueue
unlink($zip_path); unlink($zip_path);
} }
if(file_exists($this->file_name)) { if(file_exists(sys_get_temp_dir().'/'.$this->file_name)) {
unlink($this->file_name); unlink(sys_get_temp_dir().'/'.$this->file_name);
} }
if(Ninja::isSelfHost()) { if(Ninja::isSelfHost()) {
@ -717,8 +714,8 @@ class CompanyExport implements ShouldQueue
if (Ninja::isHosted()) { if (Ninja::isHosted()) {
sleep(3); sleep(3);
if(file_exists($zip_path)) { if(file_exists(sys_get_temp_dir().'/'.$zip_path)) {
unlink($zip_path); unlink(sys_get_temp_dir().'/'.$zip_path);
} }
} }
} }

View File

@ -26,7 +26,6 @@ use App\Utils\Traits\MakesReminders;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Spatie\OpenTelemetry\Jobs\TraceAware;
use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable; use Illuminate\Foundation\Bus\Dispatchable;

View File

@ -208,6 +208,29 @@ class Document extends BaseModel
return ctrans('texts.document'); return ctrans('texts.document');
} }
public function link()
{
$entity_id = $this->encodePrimaryKey($this->documentable_id);
$link = '';
match($this->documentable_type) {
'App\Models\Vendor' => $link = "/vendors/{$entity_id}",
'App\Models\Project' => $link = "/projects/{$entity_id}",
'invoices' => $link = "/invoices/{$entity_id}/edit",
'App\Models\Quote' => $link = "/quotes/{$entity_id}/edit",
'App\Models\Credit' => $link = "/credits/{$entity_id}/edit",
'App\Models\Expense' => $link = "/expenses/{$entity_id}/edit",
'App\Models\Payment' => $link = "/payments/{$entity_id}/edit",
'App\Models\Task' => $link = "/tasks/{$entity_id}/edit",
'App\Models\Client' => $link = "/clients/{$entity_id}",
'App\Models\RecurringExpense' => $link = "/recurring_expenses/{$entity_id}/edit",
'App\Models\RecurringInvoice' => $link = "/recurring_invoices/{$entity_id}/edit",
default => $link = '',
};
return $link;
}
public function compress(): mixed public function compress(): mixed
{ {

View File

@ -90,7 +90,7 @@ class InvoiceService
if ($company_currency != $client_currency) { if ($company_currency != $client_currency) {
$exchange_rate = new CurrencyApi(); $exchange_rate = new CurrencyApi();
$this->invoice->exchange_rate = $exchange_rate->exchangeRate($client_currency, $company_currency, now()); $this->invoice->exchange_rate = 1/$exchange_rate->exchangeRate($client_currency, $company_currency, now());
} }
return $this; return $this;

View File

@ -90,6 +90,9 @@ class ARDetailReport extends BaseExport
$query = Invoice::query() $query = Invoice::query()
->withTrashed() ->withTrashed()
->whereHas('client', function ($query){
$query->where('is_deleted', 0);
})
->where('company_id', $this->company->id) ->where('company_id', $this->company->id)
->where('is_deleted', 0) ->where('is_deleted', 0)
->where('balance', '>', 0) ->where('balance', '>', 0)

View File

@ -125,9 +125,9 @@ class ARSummaryReport extends BaseExport
$amount = Invoice::withTrashed() $amount = Invoice::withTrashed()
->where('client_id', $this->client->id) ->where('client_id', $this->client->id)
->where('company_id', $this->client->company_id) ->where('company_id', $this->client->company_id)
->where('is_deleted', 0)
->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]) ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL])
->where('balance', '>', 0) ->where('balance', '>', 0)
->where('is_deleted', 0)
->where(function ($query) { ->where(function ($query) {
$query->where('due_date', '>', now()->startOfDay()) $query->where('due_date', '>', now()->startOfDay())
->orWhereNull('due_date'); ->orWhereNull('due_date');

View File

@ -25,6 +25,8 @@ use Illuminate\Support\Facades\App;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use League\Csv\Writer; use League\Csv\Writer;
use function Sentry\continueTrace;
class ProfitLoss class ProfitLoss
{ {
private bool $is_income_billed = true; private bool $is_income_billed = true;
@ -280,27 +282,36 @@ class ProfitLoss
$tax_amount_credit = 0; $tax_amount_credit = 0;
$tax_amount_credit_converted = $tax_amount_credit_converted = 0; $tax_amount_credit_converted = $tax_amount_credit_converted = 0;
$invoice = false;
foreach ($payment->paymentables as $pivot) { foreach ($payment->paymentables as $pivot) {
if ($pivot->paymentable_type == 'invoices') { if ($pivot->paymentable_type == 'invoices') {
$invoice = Invoice::query()->withTrashed()->find($pivot->paymentable_id); $invoice = Invoice::query()->withTrashed()->find($pivot->paymentable_id);
if(!$invoice)
continue;
$pivot_diff = $pivot->amount - $pivot->refunded; $pivot_diff = $pivot->amount - $pivot->refunded;
$amount_payment_paid += $pivot_diff; $amount_payment_paid += $pivot_diff;
$amount_payment_paid_converted += $pivot_diff / ($payment->exchange_rate ?: 1); $amount_payment_paid_converted += $pivot_diff * ($payment->exchange_rate ?: 1);
if ($invoice->amount > 0) { if ($invoice->amount > 0) {
$tax_amount += ($pivot_diff / $invoice->amount) * $invoice->total_taxes; $tax_amount += ($pivot_diff / $invoice->amount) * $invoice->total_taxes;
$tax_amount_converted += (($pivot_diff / $invoice->amount) * $invoice->total_taxes) / $payment->exchange_rate; $tax_amount_converted += (($pivot_diff / $invoice->amount) * $invoice->total_taxes) / $invoice->exchange_rate;
} }
} }
if(!$invoice) {
continue;
}
if ($pivot->paymentable_type == 'credits') { if ($pivot->paymentable_type == 'credits') {
$amount_credit_paid += $pivot->amount - $pivot->refunded; $amount_credit_paid += $pivot->amount - $pivot->refunded;
$amount_credit_paid_converted += $pivot_diff / ($payment->exchange_rate ?: 1); $amount_credit_paid_converted += $pivot_diff * ($payment->exchange_rate ?: 1);
$tax_amount_credit += ($pivot_diff / $invoice->amount) * $invoice->total_taxes; $tax_amount_credit += ($pivot_diff / $invoice->amount) * $invoice->total_taxes;
$tax_amount_credit_converted += (($pivot_diff / $invoice->amount) * $invoice->total_taxes) / $payment->exchange_rate; $tax_amount_credit_converted += (($pivot_diff / $invoice->amount) * $invoice->total_taxes) / $invoice->exchange_rate;
} }
} }
@ -340,6 +351,10 @@ class ProfitLoss
*/ */
public function getCsv() public function getCsv()
{ {
nlog($this->income);
nlog($this->income_taxes);
nlog(array_sum(array_column($this->expense_break_down, 'total')));
MultiDB::setDb($this->company->db); MultiDB::setDb($this->company->db);
App::forgetInstance('translator'); App::forgetInstance('translator');
App::setLocale($this->company->locale()); App::setLocale($this->company->locale());
@ -356,7 +371,7 @@ class ProfitLoss
$csv->insertOne(['--------------------']); $csv->insertOne(['--------------------']);
$csv->insertOne([ctrans('texts.total_revenue'), Number::formatMoney($this->income, $this->company)]); $csv->insertOne([ctrans('texts.total_revenue'). "[".ctrans('texts.tax')." " .ctrans('texts.exclusive'). "]", Number::formatMoney($this->income, $this->company)]);
//total taxes //total taxes
@ -371,12 +386,12 @@ class ProfitLoss
//total expense taxes //total expense taxes
$csv->insertOne(['--------------------']); $csv->insertOne(['--------------------']);
$csv->insertOne([ctrans('texts.total_expenses'), Number::formatMoney(array_sum(array_column($this->expense_break_down, 'total')), $this->company)]); $csv->insertOne([ctrans('texts.total_expenses'). "[".ctrans('texts.tax')." " .ctrans('texts.exclusive'). "]", Number::formatMoney(array_sum(array_column($this->expense_break_down, 'total')), $this->company)]);
$csv->insertOne([ctrans('texts.total_taxes'), Number::formatMoney(array_sum(array_column($this->expense_break_down, 'tax')), $this->company)]); $csv->insertOne([ctrans('texts.total_taxes'), Number::formatMoney(array_sum(array_column($this->expense_break_down, 'tax')), $this->company)]);
$csv->insertOne(['--------------------']); $csv->insertOne(['--------------------']);
$csv->insertOne([ctrans('texts.total_profit'), Number::formatMoney($this->income - $this->income_taxes - array_sum(array_column($this->expense_break_down, 'total')) - array_sum(array_column($this->expense_break_down, 'tax')), $this->company)]); $csv->insertOne([ctrans('texts.total_profit'), Number::formatMoney($this->income - array_sum(array_column($this->expense_break_down, 'total')), $this->company)]);
//net profit //net profit
@ -384,11 +399,25 @@ class ProfitLoss
$csv->insertOne(['']); $csv->insertOne(['']);
$csv->insertOne(['']); $csv->insertOne(['']);
$csv->insertOne(['--------------------']);
$csv->insertOne([ctrans('texts.revenue')]);
$csv->insertOne(['--------------------']);
$csv->insertOne([ctrans('texts.currency'), ctrans('texts.amount'), ctrans('texts.total_taxes')]); $csv->insertOne([ctrans('texts.currency'), ctrans('texts.amount'), ctrans('texts.total_taxes')]);
foreach ($this->foreign_income as $foreign_income) { foreach ($this->foreign_income as $foreign_income) {
$csv->insertOne([$foreign_income['currency'], ($foreign_income['amount'] - $foreign_income['total_taxes']), $foreign_income['total_taxes']]); $csv->insertOne([$foreign_income['currency'], ($foreign_income['amount'] - $foreign_income['total_taxes']), $foreign_income['total_taxes']]);
} }
$csv->insertOne(['']);
$csv->insertOne(['']);
$csv->insertOne(['--------------------']);
$csv->insertOne([ctrans('texts.expenses')]);
$csv->insertOne(['--------------------']);
foreach($this->expenses as $expense){
$csv->insertOne([$expense->currency, ($expense->total - $expense->foreign_tax_amount), $expense->foreign_tax_amount]);
}
return $csv->toString(); return $csv->toString();
} }
@ -421,6 +450,11 @@ class ProfitLoss
private function expenseData() private function expenseData()
{ {
$expenses = Expense::query()->where('company_id', $this->company->id) $expenses = Expense::query()->where('company_id', $this->company->id)
->where(function ($query){
$query->whereNull('client_id')->orWhereHas('client', function ($q){
$q->where('is_deleted', 0);
});
})
->where('is_deleted', 0) ->where('is_deleted', 0)
->withTrashed() ->withTrashed()
->whereBetween('date', [$this->start_date, $this->end_date]) ->whereBetween('date', [$this->start_date, $this->end_date])
@ -428,19 +462,21 @@ class ProfitLoss
$this->expenses = []; $this->expenses = [];
$company_currency_code = $this->company->currency()->code;
foreach ($expenses as $expense) { foreach ($expenses as $expense) {
$map = new \stdClass(); $map = new \stdClass();
$amount = $expense->amount; $expense_tax_total = $this->getTax($expense);
$map->total = $expense->amount; $map->total = $expense->amount;
$map->converted_total = $converted_total = $this->getConvertedTotal($expense->amount, $expense->exchange_rate); $map->converted_total = $converted_total = $this->getConvertedTotal($expense->amount, $expense->exchange_rate); //converted to company currency
$map->tax = $tax = $this->getTax($expense); $map->tax = $tax = $this->getConvertedTotal($expense_tax_total, $expense->exchange_rate); //tax component
$map->net_converted_total = $expense->uses_inclusive_taxes ? ($converted_total - $tax) : $converted_total; $map->net_converted_total = $expense->uses_inclusive_taxes ? ($converted_total - $tax) : $converted_total; //excludes all taxes
$map->category_id = $expense->category_id; $map->category_id = $expense->category_id;
$map->category_name = $expense->category ? $expense->category->name : 'No Category Defined'; $map->category_name = $expense->category ? $expense->category->name : 'No Category Defined';
$map->currency_id = $expense->currency_id ?: $expense->company->settings->currency_id; $map->currency_id = $expense->currency_id ?: $expense->company->settings->currency_id;
$map->currency = $expense->currency ? $expense->currency->code : $company_currency_code;
$map->foreign_tax_amount = $expense_tax_total;
$this->expenses[] = $map; $this->expenses[] = $map;
} }
@ -480,10 +516,6 @@ class ProfitLoss
//is amount tax //is amount tax
if ($expense->calculate_tax_by_amount) { if ($expense->calculate_tax_by_amount) {
nlog($expense->tax_amount1);
nlog($expense->tax_amount2);
nlog($expense->tax_amount3);
return $expense->tax_amount1 + $expense->tax_amount2 + $expense->tax_amount3; return $expense->tax_amount1 + $expense->tax_amount2 + $expense->tax_amount3;
} }

View File

@ -75,8 +75,8 @@ class TaxSummaryReport extends BaseExport
$query = Invoice::query() $query = Invoice::query()
->withTrashed() ->withTrashed()
->whereIn('status_id', [2,3,4])
->where('company_id', $this->company->id) ->where('company_id', $this->company->id)
->whereIn('status_id', [2,3,4])
->where('is_deleted', 0) ->where('is_deleted', 0)
->orderBy('balance', 'desc'); ->orderBy('balance', 'desc');

View File

@ -52,6 +52,7 @@ class DocumentTransformer extends EntityTransformer
'created_at' => (int) $document->created_at, 'created_at' => (int) $document->created_at,
'is_deleted' => (bool) false, 'is_deleted' => (bool) false,
'is_public' => (bool) $document->is_public, 'is_public' => (bool) $document->is_public,
'link' => (string) $document->link(),
]; ];
} }
} }

View File

@ -397,6 +397,7 @@ class HtmlEngine
$data['$credit.date'] = ['value' => $this->translateDate($this->entity->date, $this->client->date_format(), $this->client->locale()), 'label' => ctrans('texts.credit_date')]; $data['$credit.date'] = ['value' => $this->translateDate($this->entity->date, $this->client->date_format(), $this->client->locale()), 'label' => ctrans('texts.credit_date')];
$data['$balance'] = ['value' => Number::formatMoney($this->getBalance(), $this->client) ?: ' ', 'label' => ctrans('texts.balance')]; $data['$balance'] = ['value' => Number::formatMoney($this->getBalance(), $this->client) ?: ' ', 'label' => ctrans('texts.balance')];
$data['$credit.balance'] = ['value' => Number::formatMoney($this->entity_calc->getBalance(), $this->client) ?: ' ', 'label' => ctrans('texts.credit_balance')]; $data['$credit.balance'] = ['value' => Number::formatMoney($this->entity_calc->getBalance(), $this->client) ?: ' ', 'label' => ctrans('texts.credit_balance')];
$data['$client.credit_balance'] = &$data['$credit.balance'];
$data['$invoice.balance'] = &$data['$balance']; $data['$invoice.balance'] = &$data['$balance'];
$data['$taxes'] = ['value' => Number::formatMoney($this->entity_calc->getItemTotalTaxes(), $this->client) ?: ' ', 'label' => ctrans('texts.taxes')]; $data['$taxes'] = ['value' => Number::formatMoney($this->entity_calc->getItemTotalTaxes(), $this->client) ?: ' ', 'label' => ctrans('texts.taxes')];

View File

@ -93,35 +93,102 @@ class Number
* @param string $value The formatted number to be converted back to float * @param string $value The formatted number to be converted back to float
* @return float The formatted value * @return float The formatted value
*/ */
public static function parseFloat($value) public static function parseFloat2($value)
{ {
if(!$value) if(!$value)
return 0; return 0;
$multiplier = false; //remove everything except for numbers, decimals, commas and hyphens
$value = preg_replace('/[^0-9.,-]+/', '', $value);
if(substr($value, 0,1) == '-') $decimal = strpos($value, '.');
$multiplier = -1; $comma = strpos($value, ',');
// convert "," to "." if($comma === false) //no comma must be a decimal number already
$s = str_replace(',', '.', $value); return (float) $value;
// remove everything except numbers and dot "." if($decimal < $comma){ //decimal before a comma = euro
$s = preg_replace("/[^0-9\.]/", '', $s); $value = str_replace(['.',','], ['','.'], $value);
// $value = str_replace(',', '.', $value);
if ($s < 1) { return (float) $value;
return (float) $s;
} }
// remove all separators from first part and keep the end //comma first = traditional thousan separator
$s = str_replace('.', '', substr($s, 0, -3)).substr($s, -3); $value = str_replace(',', '', $value);
if($multiplier) return (float)$value;
$s = floatval($s)*-1;
return (float) $s;
// if(!$value)
// return 0;
// $multiplier = false;
// if(substr($value, 0,1) == '-')
// $multiplier = -1;
// $s = str_replace(',', '.', $value);
// $s = preg_replace("/[^0-9\.]/", '', $s);
// if ($s < 1) {
// return (float) $s;
// }
// $s = str_replace('.', '', substr($s, 0, -3)).substr($s, -3);
// if($multiplier)
// $s = floatval($s)*-1;
// return (float) $s;
} }
//next iteration of float parsing
public static function parseFloat($value)
{
if(!$value) {
return 0;
}
//remove everything except for numbers, decimals, commas and hyphens
$value = preg_replace('/[^0-9.,-]+/', '', $value);
$decimal = strpos($value, '.');
$comma = strpos($value, ',');
//check the 3rd last character
if(!in_array(substr($value, -3, 1), [".", ","])) {
if($comma && (substr($value, -3, 1) != ".")) {
$value .= ".00";
} elseif($decimal && (substr($value, -3, 1) != ",")) {
$value .= ",00";
}
}
$decimal = strpos($value, '.');
$comma = strpos($value, ',');
if($comma === false) { //no comma must be a decimal number already
return (float) $value;
}
if($decimal < $comma) { //decimal before a comma = euro
$value = str_replace(['.',','], ['','.'], $value);
return (float) $value;
}
//comma first = traditional thousan separator
$value = str_replace(',', '', $value);
return (float)$value;
}
public static function parseStringFloat($value) public static function parseStringFloat($value)
{ {
$value = preg_replace('/[^0-9-.]+/', '', $value); $value = preg_replace('/[^0-9-.]+/', '', $value);

View File

@ -84,6 +84,7 @@ class SystemHealth
'trailing_slash' => (bool) self::checkUrlState(), 'trailing_slash' => (bool) self::checkUrlState(),
'file_permissions' => (string) self::checkFileSystem(), 'file_permissions' => (string) self::checkFileSystem(),
'exchange_rate_api_not_configured' => (bool)self::checkCurrencySanity(), 'exchange_rate_api_not_configured' => (bool)self::checkCurrencySanity(),
'api_version' => (string) config('ninja.app_version'),
]; ];
} }

View File

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

View File

@ -19,7 +19,7 @@ return new class extends Migration
$table->text('smtp_username')->nullable(); $table->text('smtp_username')->nullable();
$table->text('smtp_password')->nullable(); $table->text('smtp_password')->nullable();
$table->string('smtp_local_domain')->nullable(); $table->string('smtp_local_domain')->nullable();
$table->boolean('smtp_verify_peer')->default(0); $table->boolean('smtp_verify_peer')->default(true);
}); });
} }

View File

@ -3849,7 +3849,7 @@ $lang = array(
'cancellation_pending' => 'الإلغاء معلق ، سنكون على اتصال!', 'cancellation_pending' => 'الإلغاء معلق ، سنكون على اتصال!',
'list_of_payments' => 'قائمة المدفوعات', 'list_of_payments' => 'قائمة المدفوعات',
'payment_details' => 'تفاصيل الدفع', 'payment_details' => 'تفاصيل الدفع',
'list_of_payment_invoices' => 'قائمة الفواتير المتأثرة بالدفع', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'قائمة طرق الدفع', 'list_of_payment_methods' => 'قائمة طرق الدفع',
'payment_method_details' => 'تفاصيل طريقة الدفع', 'payment_method_details' => 'تفاصيل طريقة الدفع',
'permanently_remove_payment_method' => 'قم بإزالة طريقة الدفع هذه بشكل دائم.', 'permanently_remove_payment_method' => 'قم بإزالة طريقة الدفع هذه بشكل دائم.',
@ -4906,7 +4906,7 @@ $lang = array(
'no_assigned_tasks' => 'لا توجد مهام قابلة للفوترة لهذا المشروع', 'no_assigned_tasks' => 'لا توجد مهام قابلة للفوترة لهذا المشروع',
'authorization_failure' => 'أذونات غير كافية لتنفيذ هذا الإجراء', 'authorization_failure' => 'أذونات غير كافية لتنفيذ هذا الإجراء',
'authorization_sms_failure' => 'يرجى التحقق من حسابك لإرسال رسائل البريد الإلكتروني.', 'authorization_sms_failure' => 'يرجى التحقق من حسابك لإرسال رسائل البريد الإلكتروني.',
'white_label_body' => 'شكرا لشرائك رخصة البطاقة البيضاء.<br><br> مفتاح الترخيص الخاص بك هو:<br><br> :license_key', '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',
'payment_type_Klarna' => 'كلارنا', 'payment_type_Klarna' => 'كلارنا',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'مستحق الدفع paydate: صافي أيام الدفع payeddue: تاريخ الدفع', 'xinvoice_payable' => 'مستحق الدفع paydate: صافي أيام الدفع payeddue: تاريخ الدفع',
@ -5101,7 +5101,7 @@ $lang = array(
'set_private' => 'تعيين خاص', 'set_private' => 'تعيين خاص',
'individual' => 'فردي', 'individual' => 'فردي',
'business' => 'عمل', 'business' => 'عمل',
'partnership' => 'شراكة', 'partnership' => 'Partnership',
'trust' => 'يثق', 'trust' => 'يثق',
'charity' => 'صدقة', 'charity' => 'صدقة',
'government' => 'حكومة', 'government' => 'حكومة',
@ -5202,7 +5202,22 @@ $lang = array(
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3868,7 +3868,7 @@ $lang = array(
'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!', 'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!',
'list_of_payments' => 'List of payments', 'list_of_payments' => 'List of payments',
'payment_details' => 'Details of the payment', 'payment_details' => 'Details of the payment',
'list_of_payment_invoices' => 'List of invoices affected by the payment', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'List of payment methods', 'list_of_payment_methods' => 'List of payment methods',
'payment_method_details' => 'Details of payment method', 'payment_method_details' => 'Details of payment method',
'permanently_remove_payment_method' => 'Permanently remove this payment method.', 'permanently_remove_payment_method' => 'Permanently remove this payment method.',
@ -4925,7 +4925,7 @@ $lang = array(
'no_assigned_tasks' => 'No hi ha cap tasca cobrable a aquest projecte', 'no_assigned_tasks' => 'No hi ha cap tasca cobrable a aquest projecte',
'authorization_failure' => 'Permisos insuficients per a realitzar aquesta acció', 'authorization_failure' => 'Permisos insuficients per a realitzar aquesta acció',
'authorization_sms_failure' => 'Verifiqueu el vostre compte per a poder enviar missatges de correu.', 'authorization_sms_failure' => 'Verifiqueu el vostre compte per a poder enviar missatges de correu.',
'white_label_body' => 'Gràcies per comprar una llicència de marca blanca. <br><br>La vostra clau de llicència és: <br><br>:license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Transferència Interac E', 'payment_type_Interac E Transfer' => 'Transferència Interac E',
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate', 'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
@ -5120,7 +5120,7 @@ $lang = array(
'set_private' => 'Set private', 'set_private' => 'Set private',
'individual' => 'Individual', 'individual' => 'Individual',
'business' => 'Business', 'business' => 'Business',
'partnership' => 'partnership', 'partnership' => 'Partnership',
'trust' => 'Trust', 'trust' => 'Trust',
'charity' => 'Charity', 'charity' => 'Charity',
'government' => 'Government', 'government' => 'Government',
@ -5221,7 +5221,22 @@ $lang = array(
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3869,7 +3869,7 @@ $lang = array(
'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!', 'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!',
'list_of_payments' => 'Seznam plateb', 'list_of_payments' => 'Seznam plateb',
'payment_details' => 'Detaily platby', 'payment_details' => 'Detaily platby',
'list_of_payment_invoices' => 'List of invoices affected by the payment', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Seznam platebních metod', 'list_of_payment_methods' => 'Seznam platebních metod',
'payment_method_details' => 'Detail platební metody', 'payment_method_details' => 'Detail platební metody',
'permanently_remove_payment_method' => 'Trvale odstranit tuto platební metodu.', 'permanently_remove_payment_method' => 'Trvale odstranit tuto platební metodu.',
@ -4926,7 +4926,7 @@ $lang = array(
'no_assigned_tasks' => 'No billable tasks for this project', 'no_assigned_tasks' => 'No billable tasks for this project',
'authorization_failure' => 'Insufficient permissions to perform this action', 'authorization_failure' => 'Insufficient permissions to perform this action',
'authorization_sms_failure' => 'Please verify your account to send emails.', 'authorization_sms_failure' => 'Please verify your account to send emails.',
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate', 'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
@ -5121,7 +5121,7 @@ $lang = array(
'set_private' => 'Nastavit jako soukromé', 'set_private' => 'Nastavit jako soukromé',
'individual' => 'Jednotlivec', 'individual' => 'Jednotlivec',
'business' => 'Podnik', 'business' => 'Podnik',
'partnership' => 'Partnerství', 'partnership' => 'Partnership',
'trust' => 'Trust', 'trust' => 'Trust',
'charity' => 'Charita', 'charity' => 'Charita',
'government' => 'Vláda', 'government' => 'Vláda',
@ -5222,7 +5222,22 @@ $lang = array(
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3867,7 +3867,7 @@ $lang = array(
'cancellation_pending' => 'Aflysning afventer, vi kontakter dig!', 'cancellation_pending' => 'Aflysning afventer, vi kontakter dig!',
'list_of_payments' => 'Liste over Betalinger', 'list_of_payments' => 'Liste over Betalinger',
'payment_details' => 'Detaljer om Betaling', 'payment_details' => 'Detaljer om Betaling',
'list_of_payment_invoices' => 'Liste over Fakturaer berørt af Betaling', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Liste over Betaling', 'list_of_payment_methods' => 'Liste over Betaling',
'payment_method_details' => 'Detaljer om Betaling', 'payment_method_details' => 'Detaljer om Betaling',
'permanently_remove_payment_method' => 'Fjern denne Betaling permanent.', 'permanently_remove_payment_method' => 'Fjern denne Betaling permanent.',
@ -4924,7 +4924,7 @@ $lang = array(
'no_assigned_tasks' => 'Ingen fakturerbare opgaver for dette projekt', 'no_assigned_tasks' => 'Ingen fakturerbare opgaver for dette projekt',
'authorization_failure' => 'Utilstrækkelige tilladelser til at udføre denne handling', 'authorization_failure' => 'Utilstrækkelige tilladelser til at udføre denne handling',
'authorization_sms_failure' => 'Bekræft venligst din konto for at sende e-mails.', 'authorization_sms_failure' => 'Bekræft venligst din konto for at sende e-mails.',
'white_label_body' => 'Tak fordi du har købt en Hvidmærke licens.<br><br> Din licensnøgle er:<br><br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Betales inden for :payeddue dage netto indtil :paydate', 'xinvoice_payable' => 'Betales inden for :payeddue dage netto indtil :paydate',
@ -5119,7 +5119,7 @@ $lang = array(
'set_private' => 'Indstil privat', 'set_private' => 'Indstil privat',
'individual' => 'Individuel', 'individual' => 'Individuel',
'business' => 'Forretning', 'business' => 'Forretning',
'partnership' => 'partnerskab', 'partnership' => 'Partnership',
'trust' => 'Tillid', 'trust' => 'Tillid',
'charity' => 'Velgørenhed', 'charity' => 'Velgørenhed',
'government' => 'Regering', 'government' => 'Regering',
@ -5220,7 +5220,22 @@ $lang = array(
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -694,9 +694,9 @@ $lang = array(
'disable' => 'Deaktivieren', 'disable' => 'Deaktivieren',
'invoice_quote_number' => 'Rechnungs- und Angebotsnummern', 'invoice_quote_number' => 'Rechnungs- und Angebotsnummern',
'invoice_charges' => 'Rechnungsgebühren', 'invoice_charges' => 'Rechnungsgebühren',
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact. <br><br> :error', 'notification_invoice_bounced' => 'Wir waren nicht in der Lage, die Rechnung :invoice an :contact zu liefern. \n :error',
'notification_invoice_bounced_subject' => 'Rechnung :invoice nicht zugestellt.', 'notification_invoice_bounced_subject' => 'Rechnung :invoice nicht zugestellt.',
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact. <br><br> :error', 'notification_quote_bounced' => 'Wir waren nicht in der Lage, das Angebot :invoice an :contact zu liefern. \n :error',
'notification_quote_bounced_subject' => 'Angebot :invoice wurde nicht zugestellt.', 'notification_quote_bounced_subject' => 'Angebot :invoice wurde nicht zugestellt.',
'custom_invoice_link' => 'Manueller Rechnungs-Link', 'custom_invoice_link' => 'Manueller Rechnungs-Link',
'total_invoiced' => 'Rechnungs-Betrag', 'total_invoiced' => 'Rechnungs-Betrag',
@ -3870,7 +3870,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
'cancellation_pending' => 'Kündigung in Bearbeitung! Wir melden uns bei Ihnen...', 'cancellation_pending' => 'Kündigung in Bearbeitung! Wir melden uns bei Ihnen...',
'list_of_payments' => 'Liste der Zahlungen', 'list_of_payments' => 'Liste der Zahlungen',
'payment_details' => 'Details zu der Zahlung', 'payment_details' => 'Details zu der Zahlung',
'list_of_payment_invoices' => 'Liste der Rechnungen die von dieser Zahlung betroffenen sind', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Liste der Zahlungsmethoden', 'list_of_payment_methods' => 'Liste der Zahlungsmethoden',
'payment_method_details' => 'Details zu der Zahlungsmethode', 'payment_method_details' => 'Details zu der Zahlungsmethode',
'permanently_remove_payment_method' => 'Zahlungsmethode endgültig entfernen.', 'permanently_remove_payment_method' => 'Zahlungsmethode endgültig entfernen.',
@ -4927,7 +4927,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting',
'no_assigned_tasks' => 'Keine abzurechenden Aufgaben für diese Rechnung', 'no_assigned_tasks' => 'Keine abzurechenden Aufgaben für diese Rechnung',
'authorization_failure' => 'Unzureichende Berechtigungen um diese Aktion auszuführen', 'authorization_failure' => 'Unzureichende Berechtigungen um diese Aktion auszuführen',
'authorization_sms_failure' => 'Bitte bestätigen Sie Ihr Konto um E-Mails zu versenden', 'authorization_sms_failure' => 'Bitte bestätigen Sie Ihr Konto um E-Mails zu versenden',
'white_label_body' => 'Vielen Dank für den Kauf einer White-Label-Lizenz. <br> <br> Ihr Lizenzschlüssel lautet: <br> <br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Interac E-Übertragung', 'payment_type_Interac E Transfer' => 'Interac E-Übertragung',
'xinvoice_payable' => 'Zahlbar innerhalb von :payeddue Tagen netto bis :paydate', 'xinvoice_payable' => 'Zahlbar innerhalb von :payeddue Tagen netto bis :paydate',
@ -5151,14 +5151,14 @@ Leistungsempfängers',
'load_template_description' => 'Das Template wird auf Folgendes angewendet:', 'load_template_description' => 'Das Template wird auf Folgendes angewendet:',
'run_template' => 'Template anwenden', 'run_template' => 'Template anwenden',
'statement_design' => 'Statement Design', 'statement_design' => 'Statement Design',
'delivery_note_design' => 'Delivery Note Design', 'delivery_note_design' => 'Lieferschein Design',
'payment_receipt_design' => 'Payment Receipt Design', 'payment_receipt_design' => 'Zahlungsbeleg Design',
'payment_refund_design' => 'Payment Refund Design', 'payment_refund_design' => 'Gutschrift Design',
'task_extension_banner' => 'Add the Chrome extension to manage your tasks', 'task_extension_banner' => 'Die Chrome Erweiterung hinzufügen, um Aufgaben zu bearbeiten',
'watch_video' => 'Video ansehen', 'watch_video' => 'Video ansehen',
'view_extension' => 'View Extension', 'view_extension' => 'Erweiterung ansehen',
'reactivate_email' => 'E-Mail reaktivieren', 'reactivate_email' => 'E-Mail reaktivieren',
'email_reactivated' => 'Successfully reactivated email', 'email_reactivated' => 'Email erfolgreich reaktiviert',
'template_help' => 'Enable using the design as a template', 'template_help' => 'Enable using the design as a template',
'quarter' => 'Quartal', 'quarter' => 'Quartal',
'item_description' => 'Item Description', 'item_description' => 'Item Description',
@ -5225,7 +5225,22 @@ Leistungsempfängers',
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'venmo' => 'Venmo',
'my_bank' => 'MyBank',
'pay_later' => 'Später Zahlen',
'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',
); );
return $lang; return $lang;

View File

@ -5249,6 +5249,11 @@ $lang = array(
'add_step' => 'Add step', 'add_step' => 'Add step',
'steps' => 'Steps', 'steps' => 'Steps',
'steps_order_help' => 'The order of the steps is important. The first step should not depend on any other step. The second step should depend on the first step, and so on.', 'steps_order_help' => 'The order of the steps is important. The first step should not depend on any other step. The second step should depend on the first step, and so on.',
'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'
); );
return $lang; return $lang;

View File

@ -3867,7 +3867,7 @@ $lang = array(
'cancellation_pending' => 'Cancelación pendiente, ¡nos pondremos en contacto!', 'cancellation_pending' => 'Cancelación pendiente, ¡nos pondremos en contacto!',
'list_of_payments' => 'Lista de pagos', 'list_of_payments' => 'Lista de pagos',
'payment_details' => 'Detalles del pago', 'payment_details' => 'Detalles del pago',
'list_of_payment_invoices' => 'Lista de facturas afectadas por el pago', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Lista de métodos de pago', 'list_of_payment_methods' => 'Lista de métodos de pago',
'payment_method_details' => 'Detalles del método de pago', 'payment_method_details' => 'Detalles del método de pago',
'permanently_remove_payment_method' => 'Eliminar permanentemente este método de pago.', 'permanently_remove_payment_method' => 'Eliminar permanentemente este método de pago.',
@ -4924,7 +4924,7 @@ $lang = array(
'no_assigned_tasks' => 'No hay tareas facturables para este proyecto', 'no_assigned_tasks' => 'No hay tareas facturables para este proyecto',
'authorization_failure' => 'Permisos insuficientes para realizar esta acción', 'authorization_failure' => 'Permisos insuficientes para realizar esta acción',
'authorization_sms_failure' => 'Por favor verifique su cuenta para enviar correos electrónicos.', 'authorization_sms_failure' => 'Por favor verifique su cuenta para enviar correos electrónicos.',
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Transferencia Interac E', 'payment_type_Interac E Transfer' => 'Transferencia Interac E',
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate', 'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
@ -5119,7 +5119,7 @@ $lang = array(
'set_private' => 'Establecer privado', 'set_private' => 'Establecer privado',
'individual' => 'Individual', 'individual' => 'Individual',
'business' => 'Negocio', 'business' => 'Negocio',
'partnership' => 'camaradería', 'partnership' => 'Partnership',
'trust' => 'Confianza', 'trust' => 'Confianza',
'charity' => 'Caridad', 'charity' => 'Caridad',
'government' => 'Gobierno', 'government' => 'Gobierno',
@ -5220,7 +5220,22 @@ $lang = array(
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -693,9 +693,9 @@ $lang = array(
'disable' => 'Deshabilitado', 'disable' => 'Deshabilitado',
'invoice_quote_number' => 'Números de Factura y Presupuesto', 'invoice_quote_number' => 'Números de Factura y Presupuesto',
'invoice_charges' => 'Recargos de Factura', 'invoice_charges' => 'Recargos de Factura',
'notification_invoice_bounced' => 'We were unable to deliver Invoice :invoice to :contact. <br><br> :error', 'notification_invoice_bounced' => 'No pudimos entregar la factura :invoice a :contact. <br><br> :error',
'notification_invoice_bounced_subject' => 'No se puede entregar la factura :invoice', 'notification_invoice_bounced_subject' => 'No se puede entregar la factura :invoice',
'notification_quote_bounced' => 'We were unable to deliver Quote :invoice to :contact. <br><br> :error', 'notification_quote_bounced' => 'No pudimos entregar el presupuesto :invoice a :contact. <br><br> :error',
'notification_quote_bounced_subject' => 'No se puede entregar el presupuesto :invoice', 'notification_quote_bounced_subject' => 'No se puede entregar el presupuesto :invoice',
'custom_invoice_link' => 'Enlace a Factura personalizado', 'custom_invoice_link' => 'Enlace a Factura personalizado',
'total_invoiced' => 'Total Facturado', 'total_invoiced' => 'Total Facturado',
@ -3006,7 +3006,7 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c
'hosted_login' => 'Acceso alojado', 'hosted_login' => 'Acceso alojado',
'selfhost_login' => 'Acceso auto alojado', 'selfhost_login' => 'Acceso auto alojado',
'google_login' => 'Acceso con Google', 'google_login' => 'Acceso con Google',
'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' => 'Gracias por su paciencia mientras trabajamos para implementar estas funciones.<br><br>Esperamos completarlas en los próximos meses.<br><br>Hasta entonces, continuaremos brindando soporte',
'legacy_mobile_app' => 'app móvil heredada', 'legacy_mobile_app' => 'app móvil heredada',
'today' => 'Hoy', 'today' => 'Hoy',
'current' => 'Actual', 'current' => 'Actual',
@ -3864,7 +3864,7 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c
'cancellation_pending' => 'Cancelación pendiente, ¡estaremos en contacto!', 'cancellation_pending' => 'Cancelación pendiente, ¡estaremos en contacto!',
'list_of_payments' => 'Listado de pagos', 'list_of_payments' => 'Listado de pagos',
'payment_details' => 'Detalles del pago', 'payment_details' => 'Detalles del pago',
'list_of_payment_invoices' => 'Lista de facturas afectadas por el pago', 'list_of_payment_invoices' => 'Facturas asociadas',
'list_of_payment_methods' => 'Lista de medios de pago', 'list_of_payment_methods' => 'Lista de medios de pago',
'payment_method_details' => 'Detalles del medio de pago', 'payment_method_details' => 'Detalles del medio de pago',
'permanently_remove_payment_method' => 'Eliminar permanentemente este medio de pago.', 'permanently_remove_payment_method' => 'Eliminar permanentemente este medio de pago.',
@ -4921,7 +4921,7 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c
'no_assigned_tasks' => 'No hay tareas facturables para este proyecto', 'no_assigned_tasks' => 'No hay tareas facturables para este proyecto',
'authorization_failure' => 'Permisos insuficientes para realizar esta acción', 'authorization_failure' => 'Permisos insuficientes para realizar esta acción',
'authorization_sms_failure' => 'Por favor verifique su cuenta para enviar correos electrónicos.', 'authorization_sms_failure' => 'Por favor verifique su cuenta para enviar correos electrónicos.',
'white_label_body' => 'Gracias por comprar una licencia de marca blanca.<br><br> Su clave de licencia es:<br><br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Pagadero dentro de :payeddue días de pago vencido neto hasta :paydate', 'xinvoice_payable' => 'Pagadero dentro de :payeddue días de pago vencido neto hasta :paydate',
@ -5117,7 +5117,7 @@ De lo contrario, este campo deberá dejarse en blanco.',
'set_private' => 'Establecer privado', 'set_private' => 'Establecer privado',
'individual' => 'Individual', 'individual' => 'Individual',
'business' => 'Negocio', 'business' => 'Negocio',
'partnership' => 'asociación', 'partnership' => 'Asociación',
'trust' => 'Confianza', 'trust' => 'Confianza',
'charity' => 'Caridad', 'charity' => 'Caridad',
'government' => 'Gobierno', 'government' => 'Gobierno',
@ -5210,15 +5210,30 @@ De lo contrario, este campo deberá dejarse en blanco.',
'nordigen_requisition_body' => 'El acceso a los feeds de cuentas bancarias ha caducado según lo establecido en el Acuerdo de usuario final. <br><br>Inicie sesión en Invoice Ninja y vuelva a autenticarse con sus bancos para continuar recibiendo transacciones.', 'nordigen_requisition_body' => 'El acceso a los feeds de cuentas bancarias ha caducado según lo establecido en el Acuerdo de usuario final. <br><br>Inicie sesión en Invoice Ninja y vuelva a autenticarse con sus bancos para continuar recibiendo transacciones.',
'participant' => 'Participante', 'participant' => 'Participante',
'participant_name' => 'Nombre del participante', 'participant_name' => 'Nombre del participante',
'client_unsubscribed' => 'Client unsubscribed from emails.', 'client_unsubscribed' => 'El cliente se dio de baja de los correos electrónicos.',
'client_unsubscribed_help' => 'Client :client has unsubscribed from your e-mails. The client needs to consent to receive future emails from you.', 'client_unsubscribed_help' => 'El cliente :client se ha dado de baja de sus correos electrónicos. El cliente debe dar su consentimiento para recibir futuros correos electrónicos.',
'resubscribe' => 'Resubscribe', 'resubscribe' => 'Volver a suscribirse',
'subscribe' => 'Subscribe', 'subscribe' => 'Suscribirse',
'subscribe_help' => 'You are currently subscribed and will continue to receive email communications.', 'subscribe_help' => 'Actualmente está suscrito y seguirá recibiendo comunicaciones por correo electrónico.',
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', 'unsubscribe_help' => 'Actualmente no estás suscrito y, por lo tanto, no recibirás correos electrónicos en este momento.',
'notification_purchase_order_bounced' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error', 'notification_purchase_order_bounced' => 'No pudimos entregar la orden de compra :invoice a :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', 'notification_purchase_order_bounced_subject' => 'No se puede entregar la orden de compra :invoice',
'show_pdfhtml_on_mobile' => 'Mostrar la versión HTML de la entidad cuando se visualiza en un dispositivo móvil',
'show_pdfhtml_on_mobile_help' => 'Para una visualización mejorada, muestra una versión HTML de la factura/presupuesto cuando se visualiza en el dispositivo móvil.',
'please_select_an_invoice_or_credit' => 'Por favor seleccione una factura o crédito',
'mobile_version' => 'Version móvil',
'venmo' => 'Venmo',
'my_bank' => 'MyBank',
'pay_later' => 'Paga después',
'local_domain' => 'Dominio local',
'verify_peer' => 'Verificar par',
'nordigen_help' => 'Nota: conectar una cuenta requiere una clave API de GoCardless/Nordigen',
'ar_detailed' => 'Cuentas por cobrar detalladas',
'ar_summary' => 'Resumen de cuentas por cobrar',
'client_sales' => 'Ventas al cliente',
'user_sales' => 'Ventas de usuarios',
'iframe_url' => 'iFrame URL',
'user_unsubscribed' => 'Usuario dado de baja de los correos electrónicos :link',
); );
return $lang; return $lang;

View File

@ -3868,7 +3868,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'cancellation_pending' => 'Annulation en cours, nous vous contacterons !', 'cancellation_pending' => 'Annulation en cours, nous vous contacterons !',
'list_of_payments' => 'Liste des paiements', 'list_of_payments' => 'Liste des paiements',
'payment_details' => 'Détails du paiement', 'payment_details' => 'Détails du paiement',
'list_of_payment_invoices' => 'Liste des factures affectées par le paiement', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Liste des moyens de paiement', 'list_of_payment_methods' => 'Liste des moyens de paiement',
'payment_method_details' => 'Détails du mode de paiement', 'payment_method_details' => 'Détails du mode de paiement',
'permanently_remove_payment_method' => 'Supprimer définitivement ce mode de paiement.', 'permanently_remove_payment_method' => 'Supprimer définitivement ce mode de paiement.',
@ -4925,7 +4925,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'no_assigned_tasks' => 'Aucune tâche facturable pour ce projet', 'no_assigned_tasks' => 'Aucune tâche facturable pour ce projet',
'authorization_failure' => 'Autorisations insuffisantes pour effectuer cette action', 'authorization_failure' => 'Autorisations insuffisantes pour effectuer cette action',
'authorization_sms_failure' => 'Veuillez vérifier votre compte pour envoyer des e-mails.', 'authorization_sms_failure' => 'Veuillez vérifier votre compte pour envoyer des e-mails.',
'white_label_body' => 'Merci d\'avoir acheté une licence en marque blanche. <br> <br> Votre clé de licence est : <br> <br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Virement Interac E', 'payment_type_Interac E Transfer' => 'Virement Interac E',
'xinvoice_payable' => 'Payable sous :payeddue days net jusqu\'au :paydate', 'xinvoice_payable' => 'Payable sous :payeddue days net jusqu\'au :paydate',
@ -5120,7 +5120,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'set_private' => 'Définir comme privé', 'set_private' => 'Définir comme privé',
'individual' => 'Individuel', 'individual' => 'Individuel',
'business' => 'Entreprise', 'business' => 'Entreprise',
'partnership' => 'Partenariat', 'partnership' => 'Partnership',
'trust' => 'Confiance', 'trust' => 'Confiance',
'charity' => 'Charité', 'charity' => 'Charité',
'government' => 'Gouvernement', 'government' => 'Gouvernement',
@ -5221,7 +5221,22 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3865,7 +3865,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'cancellation_pending' => 'Annulation en attente. Nous vous tiendrons au courant.', 'cancellation_pending' => 'Annulation en attente. Nous vous tiendrons au courant.',
'list_of_payments' => 'Liste des paiements', 'list_of_payments' => 'Liste des paiements',
'payment_details' => 'Détails du paiement', 'payment_details' => 'Détails du paiement',
'list_of_payment_invoices' => 'Liste des factures affectées par le paiement', 'list_of_payment_invoices' => 'Associer les factures',
'list_of_payment_methods' => 'Liste des modes de paiement', 'list_of_payment_methods' => 'Liste des modes de paiement',
'payment_method_details' => 'Détails du mode de paiement', 'payment_method_details' => 'Détails du mode de paiement',
'permanently_remove_payment_method' => 'Supprimer de façon définitive ce mode de paiement', 'permanently_remove_payment_method' => 'Supprimer de façon définitive ce mode de paiement',
@ -4295,7 +4295,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'expense_tax_help' => 'Les taxes par article sont désactivées', 'expense_tax_help' => 'Les taxes par article sont désactivées',
'enable_markdown' => 'Activer Markdown', 'enable_markdown' => 'Activer Markdown',
'enable_markdown_help' => 'Convertir Markdown en HTML dans le PDF', 'enable_markdown_help' => 'Convertir Markdown en HTML dans le PDF',
'add_second_contact' => 'Ajouter un dexième contact', 'add_second_contact' => 'Ajouter un deuxième contact',
'previous_page' => 'Page précédente', 'previous_page' => 'Page précédente',
'next_page' => 'Page suivante', 'next_page' => 'Page suivante',
'export_colors' => 'Exporter les couleurs', 'export_colors' => 'Exporter les couleurs',
@ -4922,7 +4922,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'no_assigned_tasks' => 'Aucune tâche facturable pour ce projet.', 'no_assigned_tasks' => 'Aucune tâche facturable pour ce projet.',
'authorization_failure' => 'Permissions insuffisantes pour accomplir cette action', 'authorization_failure' => 'Permissions insuffisantes pour accomplir cette action',
'authorization_sms_failure' => 'Veuillez vérifier votre compte pour l\'envoi de courriel.', 'authorization_sms_failure' => 'Veuillez vérifier votre compte pour l\'envoi de courriel.',
'white_label_body' => 'Merci d\'avoir acheté une licence. <br><br> Votre clé de licence est: <br><br> :license_key', 'white_label_body' => 'Merci d\'avoir acheté une licence sans marque. <br><br> Votre clé de licence est : <br><br> :license_key <br><br> Vous pouvez gérer votre licence ici : https://invoiceninja.invoicing.co/client/login',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Transfert Interac', 'payment_type_Interac E Transfer' => 'Transfert Interac',
'xinvoice_payable' => 'Payable d\'ici :payeddue jours jusqu\'à :paydate', 'xinvoice_payable' => 'Payable d\'ici :payeddue jours jusqu\'à :paydate',
@ -5117,7 +5117,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'set_private' => 'Privé', 'set_private' => 'Privé',
'individual' => 'Individuel', 'individual' => 'Individuel',
'business' => 'Entreprise', 'business' => 'Entreprise',
'partnership' => 'partenaire', 'partnership' => 'Partenariat',
'trust' => 'Fiducie', 'trust' => 'Fiducie',
'charity' => 'Organisation caritative', 'charity' => 'Organisation caritative',
'government' => 'Gouvernement', 'government' => 'Gouvernement',
@ -5218,7 +5218,26 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'unsubscribe_help' => 'Vous n\'êtes actuellement pas abonné et vous ne recevrez pas de courriels pour le moment.', 'unsubscribe_help' => 'Vous n\'êtes actuellement pas abonné et vous ne recevrez pas de courriels pour le moment.',
'notification_purchase_order_bounced' => 'Nous n\'avons pas pu émettre le bon de commande :invoice à :contact. <br><br> :error', 'notification_purchase_order_bounced' => 'Nous n\'avons pas pu émettre le bon de commande :invoice à :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Impossible de livrer le bon de commande :invoice', 'notification_purchase_order_bounced_subject' => 'Impossible de livrer le bon de commande :invoice',
'show_pdfhtml_on_mobile' => 'Afficher la version HTML lors de la visualisation sur mobile.',
'show_pdfhtml_on_mobile_help' => 'Pour une meilleure visualisation, affiche une version HTML de la facture/soumission lors de la consultation sur mobile.',
'please_select_an_invoice_or_credit' => 'Veuillez sélectionner une facture ou un crédit.',
'mobile_version' => 'Version mobile',
'venmo' => 'Venmo',
'my_bank' => 'MyBank',
'pay_later' => 'Payer plus tard',
'local_domain' => 'Domaine local',
'verify_peer' => 'Vérifier le pair',
'nordigen_help' => 'Note: la connexion d\'un compte nécessite une clé d\'API GoCardless/Nordigen.',
'ar_detailed' => 'Détails des comptes clients',
'ar_summary' => 'Résumé des comptes clients',
'client_sales' => 'Ventes du client',
'user_sales' => 'Ventes de l\'utilisateur',
'iframe_url' => 'URL de l\'iFrame',
'user_unsubscribed' => 'Utilisateur désabonné des courriels :link',
'use_available_payments' => 'Utilisez les paiements disponibles',
'test_email_sent' => 'Le courriel a été envoyé',
'gateway_type' => 'Type de passerelle',
'save_template_body' => 'Souhaitez-vous enregistrer cette correspondance d\'importation en tant que modèle pour une utilisation future ?',
); );
return $lang; return $lang;

View File

@ -3865,7 +3865,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'cancellation_pending' => 'Annulation en attente. Nous vous tiendrons au courant.', 'cancellation_pending' => 'Annulation en attente. Nous vous tiendrons au courant.',
'list_of_payments' => 'Liste des paiements', 'list_of_payments' => 'Liste des paiements',
'payment_details' => 'Détails du paiement', 'payment_details' => 'Détails du paiement',
'list_of_payment_invoices' => 'Liste des factures affectées par le paiement', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Liste des modes de paiement', 'list_of_payment_methods' => 'Liste des modes de paiement',
'payment_method_details' => 'Détails du mode de paiement', 'payment_method_details' => 'Détails du mode de paiement',
'permanently_remove_payment_method' => 'Supprimer de façon définitive ce mode de paiement', 'permanently_remove_payment_method' => 'Supprimer de façon définitive ce mode de paiement',
@ -4922,7 +4922,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'no_assigned_tasks' => 'Aucune intervetion facturable pour ce projet', 'no_assigned_tasks' => 'Aucune intervetion facturable pour ce projet',
'authorization_failure' => 'Insufficient permissions to perform this action', 'authorization_failure' => 'Insufficient permissions to perform this action',
'authorization_sms_failure' => 'Please verify your account to send emails.', 'authorization_sms_failure' => 'Please verify your account to send emails.',
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Payable sous :payeddue jours net jusqu&#39;à :paydate', 'xinvoice_payable' => 'Payable sous :payeddue jours net jusqu&#39;à :paydate',
@ -5117,7 +5117,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'set_private' => 'Définir comme privé', 'set_private' => 'Définir comme privé',
'individual' => 'Individuel', 'individual' => 'Individuel',
'business' => 'Entreprise', 'business' => 'Entreprise',
'partnership' => 'partenaire', 'partnership' => 'Partnership',
'trust' => 'Confiance', 'trust' => 'Confiance',
'charity' => 'Charité', 'charity' => 'Charité',
'government' => 'Gouvernement', 'government' => 'Gouvernement',
@ -5218,7 +5218,22 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3866,7 +3866,7 @@ $lang = array(
'cancellation_pending' => 'הביטול בהמתנה, ניצור איתך קשר!', 'cancellation_pending' => 'הביטול בהמתנה, ניצור איתך קשר!',
'list_of_payments' => 'רשימת תשלומים', 'list_of_payments' => 'רשימת תשלומים',
'payment_details' => 'פרטי התשלום', 'payment_details' => 'פרטי התשלום',
'list_of_payment_invoices' => 'רשימת חשבוניות שיושפעו מהתשלום', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'רשימת אמצעי תשלום', 'list_of_payment_methods' => 'רשימת אמצעי תשלום',
'payment_method_details' => 'פרטים על אמצעי תשלום', 'payment_method_details' => 'פרטים על אמצעי תשלום',
'permanently_remove_payment_method' => 'הסר לצמיתות את אמצעי התשלום הזה.', 'permanently_remove_payment_method' => 'הסר לצמיתות את אמצעי התשלום הזה.',
@ -4923,7 +4923,7 @@ $lang = array(
'no_assigned_tasks' => 'אין משימות שניתנות לחיוב עבור הפרויקט הזה', 'no_assigned_tasks' => 'אין משימות שניתנות לחיוב עבור הפרויקט הזה',
'authorization_failure' => 'אין מספיק הרשאות לביצוע פעולה זו', 'authorization_failure' => 'אין מספיק הרשאות לביצוע פעולה זו',
'authorization_sms_failure' => 'אנא אמת את חשבונך כדי לשלוח אימיילים.', 'authorization_sms_failure' => 'אנא אמת את חשבונך כדי לשלוח אימיילים.',
'white_label_body' => 'תודה שרכשת רישיון לבן תווית.<br><br> מפתח הרישיון שלך הוא:<br><br> :license_key', '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',
'payment_type_Klarna' => 'קלרנה', 'payment_type_Klarna' => 'קלרנה',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'ניתן לשלם תוך :payeddue ימים נטו עד :paydate', 'xinvoice_payable' => 'ניתן לשלם תוך :payeddue ימים נטו עד :paydate',
@ -5118,7 +5118,7 @@ $lang = array(
'set_private' => 'הגדר פרטי', 'set_private' => 'הגדר פרטי',
'individual' => 'אִישִׁי', 'individual' => 'אִישִׁי',
'business' => 'עֵסֶק', 'business' => 'עֵסֶק',
'partnership' => 'שׁוּתָפוּת', 'partnership' => 'Partnership',
'trust' => 'אמון', 'trust' => 'אמון',
'charity' => 'צדקה', 'charity' => 'צדקה',
'government' => 'מֶמְשָׁלָה', 'government' => 'מֶמְשָׁלָה',
@ -5219,7 +5219,22 @@ $lang = array(
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3852,7 +3852,7 @@ adva :date',
'cancellation_pending' => 'Lemondás folyamatban', 'cancellation_pending' => 'Lemondás folyamatban',
'list_of_payments' => 'Fizetések listája', 'list_of_payments' => 'Fizetések listája',
'payment_details' => 'Fizetési részletek', 'payment_details' => 'Fizetési részletek',
'list_of_payment_invoices' => 'Fizetési számlák listája', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Fizetési módok listája', 'list_of_payment_methods' => 'Fizetési módok listája',
'payment_method_details' => 'Fizetési mód részletei', 'payment_method_details' => 'Fizetési mód részletei',
'permanently_remove_payment_method' => 'Fizetési mód végleges eltávolítása', 'permanently_remove_payment_method' => 'Fizetési mód végleges eltávolítása',
@ -4909,7 +4909,7 @@ adva :date',
'no_assigned_tasks' => 'nincsenek hozzárendelt feladatok', 'no_assigned_tasks' => 'nincsenek hozzárendelt feladatok',
'authorization_failure' => 'engedélyezési hiba', 'authorization_failure' => 'engedélyezési hiba',
'authorization_sms_failure' => 'engedélyezési SMS-hiba', 'authorization_sms_failure' => 'engedélyezési SMS-hiba',
'white_label_body' => 'fehér címke szövege', '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',
'payment_type_Klarna' => 'fizetési típus: Klarna', 'payment_type_Klarna' => 'fizetési típus: Klarna',
'payment_type_Interac E Transfer' => 'fizetési típus: Interac E átutalás', 'payment_type_Interac E Transfer' => 'fizetési típus: Interac E átutalás',
'xinvoice_payable' => 'XInvoice fizetendő', 'xinvoice_payable' => 'XInvoice fizetendő',
@ -5104,7 +5104,7 @@ adva :date',
'set_private' => 'Privát beállítás', 'set_private' => 'Privát beállítás',
'individual' => 'Egyedi', 'individual' => 'Egyedi',
'business' => 'Üzleti', 'business' => 'Üzleti',
'partnership' => 'partnerség', 'partnership' => 'Partnership',
'trust' => 'Bizalom', 'trust' => 'Bizalom',
'charity' => 'Adomány', 'charity' => 'Adomány',
'government' => 'Kormány', 'government' => 'Kormány',
@ -5205,7 +5205,22 @@ adva :date',
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3859,7 +3859,7 @@ $lang = array(
'cancellation_pending' => 'Cancellazione in corso, ci metteremo in contatto!', 'cancellation_pending' => 'Cancellazione in corso, ci metteremo in contatto!',
'list_of_payments' => 'Elenco dei pagamenti', 'list_of_payments' => 'Elenco dei pagamenti',
'payment_details' => 'Dettagli del pagamento', 'payment_details' => 'Dettagli del pagamento',
'list_of_payment_invoices' => 'Elenco delle fatture interessate dal pagamento', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Elenco dei metodi di pagamento', 'list_of_payment_methods' => 'Elenco dei metodi di pagamento',
'payment_method_details' => 'Dettagli del metodo di pagamento', 'payment_method_details' => 'Dettagli del metodo di pagamento',
'permanently_remove_payment_method' => 'Rimuovi definitivamente questo metodo di pagamento.', 'permanently_remove_payment_method' => 'Rimuovi definitivamente questo metodo di pagamento.',
@ -4916,7 +4916,7 @@ $lang = array(
'no_assigned_tasks' => 'Nessuna attività fatturabile per questo progetto', 'no_assigned_tasks' => 'Nessuna attività fatturabile per questo progetto',
'authorization_failure' => 'Autorizzazioni insufficienti per eseguire questa azione', 'authorization_failure' => 'Autorizzazioni insufficienti per eseguire questa azione',
'authorization_sms_failure' => 'Verifica il tuo account per inviare e-mail.', 'authorization_sms_failure' => 'Verifica il tuo account per inviare e-mail.',
'white_label_body' => 'Grazie per aver acquistato una licenza white label.<br><br> La tua chiave di licenza è:<br><br> :license_key', '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',
'payment_type_Klarna' => 'Clarna', 'payment_type_Klarna' => 'Clarna',
'payment_type_Interac E Transfer' => 'Interac E Trasferimento', 'payment_type_Interac E Transfer' => 'Interac E Trasferimento',
'xinvoice_payable' => 'Pagabile entro :payeddue giorni netti fino :paydate', 'xinvoice_payable' => 'Pagabile entro :payeddue giorni netti fino :paydate',
@ -5111,7 +5111,7 @@ $lang = array(
'set_private' => 'Imposta privato', 'set_private' => 'Imposta privato',
'individual' => 'Individuale', 'individual' => 'Individuale',
'business' => 'Attività commerciale', 'business' => 'Attività commerciale',
'partnership' => 'associazione', 'partnership' => 'Partnership',
'trust' => 'Fiducia', 'trust' => 'Fiducia',
'charity' => 'Beneficenza', 'charity' => 'Beneficenza',
'government' => 'Governo', 'government' => 'Governo',
@ -5212,7 +5212,22 @@ $lang = array(
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3868,7 +3868,7 @@ $lang = array(
'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!', 'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!',
'list_of_payments' => 'List of payments', 'list_of_payments' => 'List of payments',
'payment_details' => 'Details of the payment', 'payment_details' => 'Details of the payment',
'list_of_payment_invoices' => 'List of invoices affected by the payment', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'List of payment methods', 'list_of_payment_methods' => 'List of payment methods',
'payment_method_details' => 'Details of payment method', 'payment_method_details' => 'Details of payment method',
'permanently_remove_payment_method' => 'Permanently remove this payment method.', 'permanently_remove_payment_method' => 'Permanently remove this payment method.',
@ -4925,7 +4925,7 @@ $lang = array(
'no_assigned_tasks' => 'No billable tasks for this project', 'no_assigned_tasks' => 'No billable tasks for this project',
'authorization_failure' => 'Insufficient permissions to perform this action', 'authorization_failure' => 'Insufficient permissions to perform this action',
'authorization_sms_failure' => 'Please verify your account to send emails.', 'authorization_sms_failure' => 'Please verify your account to send emails.',
'white_label_body' => 'ホワイトレーベルライセンスをお買い上げいただき、誠にありがとうございます。<br><br>ライセンス キーは次のとおりです。<br><br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => ':paydate まで正味 :payeddue 日以内に支払い可能', 'xinvoice_payable' => ':paydate まで正味 :payeddue 日以内に支払い可能',
@ -5120,7 +5120,7 @@ $lang = array(
'set_private' => 'Set private', 'set_private' => 'Set private',
'individual' => 'Individual', 'individual' => 'Individual',
'business' => 'Business', 'business' => 'Business',
'partnership' => 'partnership', 'partnership' => 'Partnership',
'trust' => 'Trust', 'trust' => 'Trust',
'charity' => 'Charity', 'charity' => 'Charity',
'government' => 'Government', 'government' => 'Government',
@ -5221,7 +5221,22 @@ $lang = array(
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3848,7 +3848,7 @@ $lang = array(
'cancellation_pending' => 'រង់ចាំការលុបចោល យើងនឹងទាក់ទងទៅ!', 'cancellation_pending' => 'រង់ចាំការលុបចោល យើងនឹងទាក់ទងទៅ!',
'list_of_payments' => 'បញ្ជីនៃការទូទាត់', 'list_of_payments' => 'បញ្ជីនៃការទូទាត់',
'payment_details' => 'ព័ត៌មានលម្អិតនៃការទូទាត់', 'payment_details' => 'ព័ត៌មានលម្អិតនៃការទូទាត់',
'list_of_payment_invoices' => 'បញ្ជីវិក្កយបត្រដែលរងផលប៉ះពាល់ដោយការទូទាត់', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'បញ្ជីវិធីបង់ប្រាក់', 'list_of_payment_methods' => 'បញ្ជីវិធីបង់ប្រាក់',
'payment_method_details' => 'ព័ត៌មានលម្អិតអំពីវិធីបង់ប្រាក់', 'payment_method_details' => 'ព័ត៌មានលម្អិតអំពីវិធីបង់ប្រាក់',
'permanently_remove_payment_method' => 'លុបវិធីបង់ប្រាក់នេះចេញជាអចិន្ត្រៃយ៍។', 'permanently_remove_payment_method' => 'លុបវិធីបង់ប្រាក់នេះចេញជាអចិន្ត្រៃយ៍។',
@ -4905,7 +4905,7 @@ $lang = array(
'no_assigned_tasks' => 'មិនមានកិច្ចការដែលអាចទូទាត់បានសម្រាប់គម្រោងនេះទេ។', 'no_assigned_tasks' => 'មិនមានកិច្ចការដែលអាចទូទាត់បានសម្រាប់គម្រោងនេះទេ។',
'authorization_failure' => 'ការអនុញ្ញាតមិនគ្រប់គ្រាន់ដើម្បីអនុវត្តសកម្មភាពនេះ។', 'authorization_failure' => 'ការអនុញ្ញាតមិនគ្រប់គ្រាន់ដើម្បីអនុវត្តសកម្មភាពនេះ។',
'authorization_sms_failure' => 'សូមផ្ទៀងផ្ទាត់គណនីរបស់អ្នក ដើម្បីផ្ញើអ៊ីមែល។', 'authorization_sms_failure' => 'សូមផ្ទៀងផ្ទាត់គណនីរបស់អ្នក ដើម្បីផ្ញើអ៊ីមែល។',
'white_label_body' => 'សូមអរគុណសម្រាប់ការទិញអាជ្ញាប័ណ្ណស្លាកពណ៌ស។<br><br> លេខកូដអាជ្ញាប័ណ្ណរបស់អ្នកគឺ៖<br><br> :license_key', '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',
'payment_type_Klarna' => 'ក្លាណា', 'payment_type_Klarna' => 'ក្លាណា',
'payment_type_Interac E Transfer' => 'ការផ្ទេរ Interac E', 'payment_type_Interac E Transfer' => 'ការផ្ទេរ Interac E',
'xinvoice_payable' => 'អាចបង់បានក្នុងរយៈពេល :payeddue ថ្ងៃសុទ្ធរហូតដល់ :paydate', 'xinvoice_payable' => 'អាចបង់បានក្នុងរយៈពេល :payeddue ថ្ងៃសុទ្ធរហូតដល់ :paydate',
@ -5100,7 +5100,7 @@ $lang = array(
'set_private' => 'កំណត់ឯកជន', 'set_private' => 'កំណត់ឯកជន',
'individual' => 'បុគ្គល', 'individual' => 'បុគ្គល',
'business' => 'អាជីវកម្ម', 'business' => 'អាជីវកម្ម',
'partnership' => 'ភាពជាដៃគូ', 'partnership' => 'Partnership',
'trust' => 'ទុកចិត្ត', 'trust' => 'ទុកចិត្ត',
'charity' => 'សប្បុរសធម៌', 'charity' => 'សប្បុរសធម៌',
'government' => 'រដ្ឋាភិបាល', 'government' => 'រដ្ឋាភិបាល',
@ -5201,7 +5201,22 @@ $lang = array(
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3868,7 +3868,7 @@ $lang = array(
'cancellation_pending' => 'ລໍຖ້າການຍົກເລີກ, ພວກເຮົາຈະຕິດຕໍ່ຫາ!', 'cancellation_pending' => 'ລໍຖ້າການຍົກເລີກ, ພວກເຮົາຈະຕິດຕໍ່ຫາ!',
'list_of_payments' => 'ລາຍຊື່ການຈ່າຍເງິນ', 'list_of_payments' => 'ລາຍຊື່ການຈ່າຍເງິນ',
'payment_details' => 'ລາຍລະອຽດຂອງການຈ່າຍເງິນ', 'payment_details' => 'ລາຍລະອຽດຂອງການຈ່າຍເງິນ',
'list_of_payment_invoices' => 'ລາຍຊື່ໃບແຈ້ງໜີ້ທີ່ໄດ້ຮັບຜົນກະທົບຈາກການຈ່າຍເງິນ', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'ລາຍຊື່ວິທີຈ່າຍເງິນ', 'list_of_payment_methods' => 'ລາຍຊື່ວິທີຈ່າຍເງິນ',
'payment_method_details' => 'ລາຍລະອຽດຂອງວິທີການຊໍາລະ', 'payment_method_details' => 'ລາຍລະອຽດຂອງວິທີການຊໍາລະ',
'permanently_remove_payment_method' => 'ລຶບວິທີການຈ່າຍເງິນນີ້ອອກຖາວອນ.', 'permanently_remove_payment_method' => 'ລຶບວິທີການຈ່າຍເງິນນີ້ອອກຖາວອນ.',
@ -4925,7 +4925,7 @@ $lang = array(
'no_assigned_tasks' => 'ບໍ່ມີໜ້າວຽກທີ່ສາມາດເກັບເງິນໄດ້ສຳລັບໂຄງການນີ້', 'no_assigned_tasks' => 'ບໍ່ມີໜ້າວຽກທີ່ສາມາດເກັບເງິນໄດ້ສຳລັບໂຄງການນີ້',
'authorization_failure' => 'ການອະນຸຍາດບໍ່ພຽງພໍເພື່ອປະຕິບັດການນີ້', 'authorization_failure' => 'ການອະນຸຍາດບໍ່ພຽງພໍເພື່ອປະຕິບັດການນີ້',
'authorization_sms_failure' => 'ກະລຸນາກວດສອບບັນຊີຂອງທ່ານເພື່ອສົ່ງອີເມວ.', 'authorization_sms_failure' => 'ກະລຸນາກວດສອບບັນຊີຂອງທ່ານເພື່ອສົ່ງອີເມວ.',
'white_label_body' => 'ຂອບໃຈທີ່ຊື້ໃບຂັບຂີ່ປ້າຍຂາວ. <br><br> ກະແຈໃບອະນຸຍາດຂອງທ່ານແມ່ນ: <br><br> :license_key', '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',
'payment_type_Klarna' => 'ຄລານາ', 'payment_type_Klarna' => 'ຄລານາ',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'ຊໍາລະພາຍໃນ: payeddue ວັນສຸດທິຈົນກ່ວາ: paydate', 'xinvoice_payable' => 'ຊໍາລະພາຍໃນ: payeddue ວັນສຸດທິຈົນກ່ວາ: paydate',
@ -5120,7 +5120,7 @@ $lang = array(
'set_private' => 'ຕັ້ງເປັນສ່ວນຕົວ', 'set_private' => 'ຕັ້ງເປັນສ່ວນຕົວ',
'individual' => 'ບຸກຄົນ', 'individual' => 'ບຸກຄົນ',
'business' => 'ທຸລະກິດ', 'business' => 'ທຸລະກິດ',
'partnership' => 'ຫຸ້ນສ່ວນ', 'partnership' => 'Partnership',
'trust' => 'ຄວາມໄວ້ວາງໃຈ', 'trust' => 'ຄວາມໄວ້ວາງໃຈ',
'charity' => 'ການກຸສົນ', 'charity' => 'ການກຸສົນ',
'government' => 'ລັດຖະບານ', 'government' => 'ລັດຖະບານ',
@ -5221,7 +5221,22 @@ $lang = array(
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3865,7 +3865,7 @@ Kom terug naar deze betalingsmethode pagina zodra u de bedragen heeft ontvangen
'cancellation_pending' => 'Annulatie in aanvraag, we nemen contact met u op!', 'cancellation_pending' => 'Annulatie in aanvraag, we nemen contact met u op!',
'list_of_payments' => 'Lijst met betalingen', 'list_of_payments' => 'Lijst met betalingen',
'payment_details' => 'Details van de betaling', 'payment_details' => 'Details van de betaling',
'list_of_payment_invoices' => 'Lijst met facturen waarop de betaling betrekking heeft', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Lijst met betalingsmethodes', 'list_of_payment_methods' => 'Lijst met betalingsmethodes',
'payment_method_details' => 'Details van betalingsmethodes', 'payment_method_details' => 'Details van betalingsmethodes',
'permanently_remove_payment_method' => 'Verwijder deze betalingsmethode definitief', 'permanently_remove_payment_method' => 'Verwijder deze betalingsmethode definitief',
@ -4925,7 +4925,7 @@ Email: :email<b><br><b>',
'no_assigned_tasks' => 'Geen factureerbare taken voor dit project', 'no_assigned_tasks' => 'Geen factureerbare taken voor dit project',
'authorization_failure' => 'Onvoldoende machtigingen om deze actie uit te voeren', 'authorization_failure' => 'Onvoldoende machtigingen om deze actie uit te voeren',
'authorization_sms_failure' => 'Verifieer uw account om e-mails te verzenden.', 'authorization_sms_failure' => 'Verifieer uw account om e-mails te verzenden.',
'white_label_body' => 'Bedankt voor het aanschaffen van een white label licentie. <br> <br> Uw licentiesleutel is: <br> <br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Interac E-overdracht', 'payment_type_Interac E Transfer' => 'Interac E-overdracht',
'xinvoice_payable' => 'Te betalen binnen :payeddue vervaldagen netto tot :paydate', 'xinvoice_payable' => 'Te betalen binnen :payeddue vervaldagen netto tot :paydate',
@ -5120,7 +5120,7 @@ Email: :email<b><br><b>',
'set_private' => 'Privé instellen', 'set_private' => 'Privé instellen',
'individual' => 'Individueel', 'individual' => 'Individueel',
'business' => 'Bedrijf', 'business' => 'Bedrijf',
'partnership' => 'vennootschap', 'partnership' => 'Partnership',
'trust' => 'Vertrouwen', 'trust' => 'Vertrouwen',
'charity' => 'Goed doel', 'charity' => 'Goed doel',
'government' => 'Regering', 'government' => 'Regering',
@ -5221,7 +5221,22 @@ Email: :email<b><br><b>',
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3866,7 +3866,7 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik
'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!', 'cancellation_pending' => 'Cancellation pending, we\'ll be in touch!',
'list_of_payments' => 'Lista płatności', 'list_of_payments' => 'Lista płatności',
'payment_details' => 'Szczegóły płatności', 'payment_details' => 'Szczegóły płatności',
'list_of_payment_invoices' => 'Lista faktur, których dotyczy płatność', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Lista metod płatności', 'list_of_payment_methods' => 'Lista metod płatności',
'payment_method_details' => 'Szczegóły metody płatności', 'payment_method_details' => 'Szczegóły metody płatności',
'permanently_remove_payment_method' => 'Trwale usuń tę metodę płatności.', 'permanently_remove_payment_method' => 'Trwale usuń tę metodę płatności.',
@ -4923,7 +4923,7 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik
'no_assigned_tasks' => 'No billable tasks for this project', 'no_assigned_tasks' => 'No billable tasks for this project',
'authorization_failure' => 'Niewystarczające uprawnienia do wykonania tej czynności', 'authorization_failure' => 'Niewystarczające uprawnienia do wykonania tej czynności',
'authorization_sms_failure' => 'Zweryfikuj swoje konto, aby wysyłać e-maile.', 'authorization_sms_failure' => 'Zweryfikuj swoje konto, aby wysyłać e-maile.',
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate', 'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
@ -5118,7 +5118,7 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik
'set_private' => 'Set private', 'set_private' => 'Set private',
'individual' => 'Individual', 'individual' => 'Individual',
'business' => 'Business', 'business' => 'Business',
'partnership' => 'partnership', 'partnership' => 'Partnership',
'trust' => 'Trust', 'trust' => 'Trust',
'charity' => 'Charity', 'charity' => 'Charity',
'government' => 'Government', 'government' => 'Government',
@ -5219,7 +5219,22 @@ Gdy przelewy zostaną zaksięgowane na Twoim koncie, wróć do tej strony i klik
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3865,7 +3865,7 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique "
'cancellation_pending' => 'Cancelamento pendente, entraremos em contato!', 'cancellation_pending' => 'Cancelamento pendente, entraremos em contato!',
'list_of_payments' => 'Lista de pagamentos', 'list_of_payments' => 'Lista de pagamentos',
'payment_details' => 'Detalhes do pagamento', 'payment_details' => 'Detalhes do pagamento',
'list_of_payment_invoices' => 'Lista de faturas afetadas pelo pagamento', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Lista de métodos de pagamento', 'list_of_payment_methods' => 'Lista de métodos de pagamento',
'payment_method_details' => 'Detalhes da forma de pagamento', 'payment_method_details' => 'Detalhes da forma de pagamento',
'permanently_remove_payment_method' => 'Remova permanentemente esta forma de pagamento.', 'permanently_remove_payment_method' => 'Remova permanentemente esta forma de pagamento.',
@ -4922,7 +4922,7 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique "
'no_assigned_tasks' => 'Nenhuma tarefa faturável para este projeto', 'no_assigned_tasks' => 'Nenhuma tarefa faturável para este projeto',
'authorization_failure' => 'Permissões insuficientes para executar esta ação', 'authorization_failure' => 'Permissões insuficientes para executar esta ação',
'authorization_sms_failure' => 'Verifique sua conta para enviar e-mails.', 'authorization_sms_failure' => 'Verifique sua conta para enviar e-mails.',
'white_label_body' => 'Obrigado por adquirir uma licença de marca branca.<br><br> Sua chave de licença é:<br><br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Transferência Interac E', 'payment_type_Interac E Transfer' => 'Transferência Interac E',
'xinvoice_payable' => 'A pagar dentro de :payeddue dias líquidos até :paydate', 'xinvoice_payable' => 'A pagar dentro de :payeddue dias líquidos até :paydate',
@ -5117,7 +5117,7 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique "
'set_private' => 'Definir como privado', 'set_private' => 'Definir como privado',
'individual' => 'Individual', 'individual' => 'Individual',
'business' => 'Negócios', 'business' => 'Negócios',
'partnership' => 'parceria', 'partnership' => 'Partnership',
'trust' => 'Confiar', 'trust' => 'Confiar',
'charity' => 'Caridade', 'charity' => 'Caridade',
'government' => 'Governo', 'government' => 'Governo',
@ -5218,7 +5218,22 @@ Quando tiver as quantias, volte a esta página de formas de pagamento e clique "
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3867,7 +3867,7 @@ debitar da sua conta de acordo com essas instruções. Está elegível a um reem
'cancellation_pending' => 'Cancelamento pendente, entraremos em contacto muito brevemente!', 'cancellation_pending' => 'Cancelamento pendente, entraremos em contacto muito brevemente!',
'list_of_payments' => 'Lista de pagamentos', 'list_of_payments' => 'Lista de pagamentos',
'payment_details' => 'Detalhes do pagamento', 'payment_details' => 'Detalhes do pagamento',
'list_of_payment_invoices' => 'Lista de notas de pagamento afetadas pelo pagamento', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Lista de métodos de pagamento', 'list_of_payment_methods' => 'Lista de métodos de pagamento',
'payment_method_details' => 'Detalhes do método de pagamento', 'payment_method_details' => 'Detalhes do método de pagamento',
'permanently_remove_payment_method' => 'Eliminar permanentemente este método de pagamento.', 'permanently_remove_payment_method' => 'Eliminar permanentemente este método de pagamento.',
@ -4925,7 +4925,7 @@ O envio de E-mails foi suspenso. Será retomado às 23:00 UTC.',
'no_assigned_tasks' => 'Nenhuma tarefa faturável para este projeto', 'no_assigned_tasks' => 'Nenhuma tarefa faturável para este projeto',
'authorization_failure' => 'Permissões insuficientes para executar esta ação', 'authorization_failure' => 'Permissões insuficientes para executar esta ação',
'authorization_sms_failure' => 'Verifique sua conta para enviar e-mails.', 'authorization_sms_failure' => 'Verifique sua conta para enviar e-mails.',
'white_label_body' => 'Obrigado por adquirir uma licença de marca branca.<br><br> Sua chave de licença é:<br><br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Pagável dentro de :payeddue dias líquidos até :paydate', 'xinvoice_payable' => 'Pagável dentro de :payeddue dias líquidos até :paydate',
@ -5120,7 +5120,7 @@ O envio de E-mails foi suspenso. Será retomado às 23:00 UTC.',
'set_private' => 'Definir como privado', 'set_private' => 'Definir como privado',
'individual' => 'Individual', 'individual' => 'Individual',
'business' => 'Negócios', 'business' => 'Negócios',
'partnership' => 'parceria', 'partnership' => 'Partnership',
'trust' => 'Confiar', 'trust' => 'Confiar',
'charity' => 'Caridade', 'charity' => 'Caridade',
'government' => 'Governo', 'government' => 'Governo',
@ -5221,7 +5221,22 @@ O envio de E-mails foi suspenso. Será retomado às 23:00 UTC.',
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3869,7 +3869,7 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl
'cancellation_pending' => 'Anulare în așteptare. Vă vom contacta.', 'cancellation_pending' => 'Anulare în așteptare. Vă vom contacta.',
'list_of_payments' => 'Listă plăți', 'list_of_payments' => 'Listă plăți',
'payment_details' => 'Detalii plată', 'payment_details' => 'Detalii plată',
'list_of_payment_invoices' => 'Listă facturi afectate de plată', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Listă metode de plată', 'list_of_payment_methods' => 'Listă metode de plată',
'payment_method_details' => 'Detalii metodă de plată', 'payment_method_details' => 'Detalii metodă de plată',
'permanently_remove_payment_method' => 'Îndepărtați permanent această metodă de plată.', 'permanently_remove_payment_method' => 'Îndepărtați permanent această metodă de plată.',
@ -4926,7 +4926,7 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl
'no_assigned_tasks' => 'No billable tasks for this project', 'no_assigned_tasks' => 'No billable tasks for this project',
'authorization_failure' => 'Insufficient permissions to perform this action', 'authorization_failure' => 'Insufficient permissions to perform this action',
'authorization_sms_failure' => 'Please verify your account to send emails.', 'authorization_sms_failure' => 'Please verify your account to send emails.',
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate', 'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
@ -5121,7 +5121,7 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl
'set_private' => 'Set private', 'set_private' => 'Set private',
'individual' => 'Individual', 'individual' => 'Individual',
'business' => 'Business', 'business' => 'Business',
'partnership' => 'partnership', 'partnership' => 'Partnership',
'trust' => 'Trust', 'trust' => 'Trust',
'charity' => 'Charity', 'charity' => 'Charity',
'government' => 'Government', 'government' => 'Government',
@ -5222,7 +5222,22 @@ Odată ce sumele au ajuns la dumneavoastră, reveniți la pagina cu metode de pl
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3855,7 +3855,7 @@ $lang = array(
'cancellation_pending' => 'Čaká sa na zrušenie, budeme vás kontaktovať!', 'cancellation_pending' => 'Čaká sa na zrušenie, budeme vás kontaktovať!',
'list_of_payments' => 'Zoznam platieb', 'list_of_payments' => 'Zoznam platieb',
'payment_details' => 'Podrobnosti o platbe', 'payment_details' => 'Podrobnosti o platbe',
'list_of_payment_invoices' => 'Zoznam faktúr ovplyvnených platbou', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Zoznam spôsobov platby', 'list_of_payment_methods' => 'Zoznam spôsobov platby',
'payment_method_details' => 'Podrobnosti o spôsobe platby', 'payment_method_details' => 'Podrobnosti o spôsobe platby',
'permanently_remove_payment_method' => 'Natrvalo odstrániť tento spôsob platby.', 'permanently_remove_payment_method' => 'Natrvalo odstrániť tento spôsob platby.',
@ -4912,7 +4912,7 @@ $lang = array(
'no_assigned_tasks' => 'Žiadne fakturovateľné úlohy pre tento projekt', 'no_assigned_tasks' => 'Žiadne fakturovateľné úlohy pre tento projekt',
'authorization_failure' => 'Nedostatočné povolenia na vykonanie tejto akcie', 'authorization_failure' => 'Nedostatočné povolenia na vykonanie tejto akcie',
'authorization_sms_failure' => 'Ak chcete odosielať e-maily, overte svoj účet.', 'authorization_sms_failure' => 'Ak chcete odosielať e-maily, overte svoj účet.',
'white_label_body' => 'Ďakujeme, že ste si zakúpili licenciu s bielym štítkom.<br><br> Váš licenčný kľúč je:<br><br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Splatné do :payeddue dní netto do :paydate', 'xinvoice_payable' => 'Splatné do :payeddue dní netto do :paydate',
@ -5107,7 +5107,7 @@ $lang = array(
'set_private' => 'Nastaviť ako súkromné', 'set_private' => 'Nastaviť ako súkromné',
'individual' => 'Individuálne', 'individual' => 'Individuálne',
'business' => 'Podnikanie', 'business' => 'Podnikanie',
'partnership' => 'partnerstvo', 'partnership' => 'Partnership',
'trust' => 'Dôvera', 'trust' => 'Dôvera',
'charity' => 'Dobročinnosť', 'charity' => 'Dobročinnosť',
'government' => 'vláda', 'government' => 'vláda',
@ -5208,7 +5208,22 @@ $lang = array(
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3868,7 +3868,7 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k
'cancellation_pending' => 'Otkazivanje je na čekanju, u kontaktu smo!', 'cancellation_pending' => 'Otkazivanje je na čekanju, u kontaktu smo!',
'list_of_payments' => 'Spisak uplata', 'list_of_payments' => 'Spisak uplata',
'payment_details' => 'Detalji o uplati', 'payment_details' => 'Detalji o uplati',
'list_of_payment_invoices' => 'Spisak računa na koje utiče plaćanje', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Spisak metoda plaćanja', 'list_of_payment_methods' => 'Spisak metoda plaćanja',
'payment_method_details' => 'Detalji o metodu plaćanja', 'payment_method_details' => 'Detalji o metodu plaćanja',
'permanently_remove_payment_method' => 'Trajno uklonite ovaj način plaćanja.', 'permanently_remove_payment_method' => 'Trajno uklonite ovaj način plaćanja.',
@ -4925,7 +4925,7 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k
'no_assigned_tasks' => 'No billable tasks for this project', 'no_assigned_tasks' => 'No billable tasks for this project',
'authorization_failure' => 'Insufficient permissions to perform this action', 'authorization_failure' => 'Insufficient permissions to perform this action',
'authorization_sms_failure' => 'Please verify your account to send emails.', 'authorization_sms_failure' => 'Please verify your account to send emails.',
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate', 'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
@ -5120,7 +5120,7 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k
'set_private' => 'Set private', 'set_private' => 'Set private',
'individual' => 'Individual', 'individual' => 'Individual',
'business' => 'Business', 'business' => 'Business',
'partnership' => 'partnership', 'partnership' => 'Partnership',
'trust' => 'Trust', 'trust' => 'Trust',
'charity' => 'Charity', 'charity' => 'Charity',
'government' => 'Government', 'government' => 'Government',
@ -5221,7 +5221,22 @@ Kada budete imali iznose, vratite se na ovu stranicu sa načinima plaćanja i k
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3876,7 +3876,7 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k
'cancellation_pending' => 'Väntande avslut, vi hör av oss!', 'cancellation_pending' => 'Väntande avslut, vi hör av oss!',
'list_of_payments' => 'Lista över betalningar', 'list_of_payments' => 'Lista över betalningar',
'payment_details' => 'Detaljer om betalningen', 'payment_details' => 'Detaljer om betalningen',
'list_of_payment_invoices' => 'Lista över fakturor som påverkas av betalningen', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => 'Lista över betalningsmetoder', 'list_of_payment_methods' => 'Lista över betalningsmetoder',
'payment_method_details' => 'Information om betalningsmetod', 'payment_method_details' => 'Information om betalningsmetod',
'permanently_remove_payment_method' => 'Ta bort denna betalningsmetod permanent.', 'permanently_remove_payment_method' => 'Ta bort denna betalningsmetod permanent.',
@ -4933,7 +4933,7 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k
'no_assigned_tasks' => 'No billable tasks for this project', 'no_assigned_tasks' => 'No billable tasks for this project',
'authorization_failure' => 'Insufficient permissions to perform this action', 'authorization_failure' => 'Insufficient permissions to perform this action',
'authorization_sms_failure' => 'Please verify your account to send emails.', 'authorization_sms_failure' => 'Please verify your account to send emails.',
'white_label_body' => 'Thank you for purchasing a white label license. <br><br> Your license key is: <br><br> :license_key', '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',
'payment_type_Klarna' => 'Klarna', 'payment_type_Klarna' => 'Klarna',
'payment_type_Interac E Transfer' => 'Interac E Transfer', 'payment_type_Interac E Transfer' => 'Interac E Transfer',
'xinvoice_payable' => 'Payable within :payeddue days net until :paydate', 'xinvoice_payable' => 'Payable within :payeddue days net until :paydate',
@ -5128,7 +5128,7 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k
'set_private' => 'Set private', 'set_private' => 'Set private',
'individual' => 'Individual', 'individual' => 'Individual',
'business' => 'Business', 'business' => 'Business',
'partnership' => 'partnership', 'partnership' => 'Partnership',
'trust' => 'Trust', 'trust' => 'Trust',
'charity' => 'Charity', 'charity' => 'Charity',
'government' => 'Government', 'government' => 'Government',
@ -5229,7 +5229,22 @@ Den här funktionen kräver att en produkt skapas och en betalningsgateway är k
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -3868,7 +3868,7 @@ $lang = array(
'cancellation_pending' => '取消待定,我們會聯絡您!', 'cancellation_pending' => '取消待定,我們會聯絡您!',
'list_of_payments' => '付款清單', 'list_of_payments' => '付款清單',
'payment_details' => '付款詳情', 'payment_details' => '付款詳情',
'list_of_payment_invoices' => '受付款影響的發票列表', 'list_of_payment_invoices' => 'Associate invoices',
'list_of_payment_methods' => '付款方式一覽', 'list_of_payment_methods' => '付款方式一覽',
'payment_method_details' => '付款方式詳情', 'payment_method_details' => '付款方式詳情',
'permanently_remove_payment_method' => '永久刪除此付款方式。', 'permanently_remove_payment_method' => '永久刪除此付款方式。',
@ -4925,7 +4925,7 @@ $lang = array(
'no_assigned_tasks' => '該項目沒有計費任務', 'no_assigned_tasks' => '該項目沒有計費任務',
'authorization_failure' => '權限不足,無法執行此操作', 'authorization_failure' => '權限不足,無法執行此操作',
'authorization_sms_failure' => '請驗證您的帳戶以發送電子郵件。', 'authorization_sms_failure' => '請驗證您的帳戶以發送電子郵件。',
'white_label_body' => '感謝您購買白標許可證。<br><br>您的許可證密鑰是:<br><br> :license_key', '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',
'payment_type_Klarna' => '克拉納', 'payment_type_Klarna' => '克拉納',
'payment_type_Interac E Transfer' => 'Interac E 傳輸', 'payment_type_Interac E Transfer' => 'Interac E 傳輸',
'xinvoice_payable' => '在:payeddue天內支付直至:paydate', 'xinvoice_payable' => '在:payeddue天內支付直至:paydate',
@ -5120,7 +5120,7 @@ $lang = array(
'set_private' => '設定私人', 'set_private' => '設定私人',
'individual' => '個人', 'individual' => '個人',
'business' => '商業', 'business' => '商業',
'partnership' => '合夥', 'partnership' => 'Partnership',
'trust' => '相信', 'trust' => '相信',
'charity' => '慈善機構', 'charity' => '慈善機構',
'government' => '政府', 'government' => '政府',
@ -5221,7 +5221,22 @@ $lang = array(
'unsubscribe_help' => 'You are currently not subscribed, and therefore, will not receive emails at this time.', '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' => 'We were unable to deliver Purchase Order :invoice to :contact. <br><br> :error',
'notification_purchase_order_bounced_subject' => 'Unable to deliver Purchase Order :invoice', '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',
'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',
); );
return $lang; return $lang;

View File

@ -11,13 +11,14 @@
namespace Tests\Feature; namespace Tests\Feature;
use Tests\TestCase;
use App\Models\Task;
use App\Models\Document; use App\Models\Document;
use Tests\MockAccountData;
use App\Utils\Traits\MakesHash; use App\Utils\Traits\MakesHash;
use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Model;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Illuminate\Support\Facades\Session; use Illuminate\Support\Facades\Session;
use Tests\MockAccountData; use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\TestCase;
/** /**
* @test * @test
@ -44,6 +45,135 @@ class DocumentsApiTest extends TestCase
Model::reguard(); Model::reguard();
} }
public function testDocumentFilters()
{
Document::query()->withTrashed()->cursor()->each(function ($d){
$d->forceDelete();
});
$d = Document::factory()->create([
'company_id' => $this->company->id,
'user_id' => $this->user->id,
'name' => 'searchable.jpg',
'type' => 'jpg',
]);
$this->client->documents()->save($d);
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->get("/api/v1/documents/{$d->hashed_id}?client_id={$this->client->hashed_id}");
$response->assertStatus(200);
$this->assertCount(1, $response->json());
}
public function testDocumentFilters2()
{
Document::query()->withTrashed()->cursor()->each(function ($d){
$d->forceDelete();
});
$d = Document::factory()->create([
'company_id' => $this->company->id,
'user_id' => $this->user->id,
'name' => 'searchable.jpg',
'type' => 'jpg',
]);
$this->task->documents()->save($d);
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->get("/api/v1/documents/{$d->hashed_id}?client_id={$this->client->hashed_id}");
$response->assertStatus(200);
$this->assertCount(1, $response->json());
}
public function testDocumentFilters3()
{
Document::query()->withTrashed()->cursor()->each(function ($d){
$d->forceDelete();
});
$d = Document::factory()->create([
'company_id' => $this->company->id,
'user_id' => $this->user->id,
'name' => 'searchable.jpg',
'type' => 'jpg',
]);
$t = Task::factory()->create([
'company_id' => $this->company->id,
'user_id' => $this->user->id,
'client_id' => $this->client->id,
]);
$t->documents()->save($d);
$dd = Document::factory()->create([
'company_id' => $this->company->id,
'user_id' => $this->user->id,
'name' => 'searchable2.jpg',
'type' => 'jpg',
]);
$this->client->documents()->save($dd);
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->get("/api/v1/documents?client_id={$this->client->hashed_id}");
$response->assertStatus(200);
$this->assertCount(2, $response->json()['data']);
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->get("/api/v1/documents?client_id={$this->client->hashed_id}&filter=craycray");
$response->assertStatus(200);
$this->assertCount(0, $response->json()['data']);
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->get("/api/v1/documents?client_id={$this->client->hashed_id}&filter=s");
$response->assertStatus(200);
$this->assertCount(2, $response->json()['data']);
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->get("/api/v1/documents?client_id={$this->client->hashed_id}&filter=searchable");
$response->assertStatus(200);
$this->assertCount(2, $response->json()['data']);
$response = $this->withHeaders([
'X-API-SECRET' => config('ninja.api_secret'),
'X-API-TOKEN' => $this->token,
])->get("/api/v1/documents?client_id={$this->client->hashed_id}&filter=searchable2");
$response->assertStatus(200);
$this->assertCount(1, $response->json()['data']);
}
public function testIsPublicTypesForDocumentRequest() public function testIsPublicTypesForDocumentRequest()
{ {
$d = Document::factory()->create([ $d = Document::factory()->create([

View File

@ -0,0 +1,241 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2021. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://www.elastic.co/licensing/elastic-license
*/
namespace Tests\Unit;
use App\DataMapper\InvoiceItem;
use App\Models\Invoice;
use App\Models\PurchaseOrder;
use Illuminate\Foundation\Testing\DatabaseTransactions;
use Tests\MockAccountData;
use Tests\TestCase;
/**
* @test
* @covers App\Helpers\Invoice\InvoiceSum
*/
class InvoiceBalanceTest extends TestCase
{
use MockAccountData;
protected function setUp(): void
{
parent::setUp();
$this->makeTestData();
}
public function testInvoiceBalances()
{
$item = new InvoiceItem();
$item->quantity = 1;
$item->cost = 100;
$item->type_id = '1';
$i = Invoice::factory()->create([
'company_id' => $this->company->id,
'user_id' => $this->user->id,
'client_id' => $this->client->id,
'line_items' => [$item],
'status_id' => 1,
'tax_rate1' => 0,
'tax_rate2' => 0,
'tax_rate3' => 0,
'tax_name1' => '',
'tax_name2' => '',
'tax_name3' => '',
'discount' => 0,
'paid_to_date' => 0,
]);
$this->assertEquals(1, $i->status_id);
$i = $i->calc()->getInvoice()->service()->markSent()->save();
$this->assertEquals(100, $i->amount);
$this->assertEquals(100, $i->balance);
$this->assertEquals(2, $i->status_id);
$this->assertEquals(0, $i->paid_to_date);
$item = new InvoiceItem();
$item->quantity = 1;
$item->cost = 30.37;
$item->type_id = '1';
$i->line_items = [$item];
$i = $i->calc()->getInvoice();
// nlog($i->withoutRelations()->toArray());
$this->assertEquals(30.37, $i->amount);
$this->assertEquals(30.37, $i->balance);
$this->assertEquals(2, $i->status_id);
$this->assertEquals(0, $i->paid_to_date);
$i = $i->service()->applyPaymentAmount(10.37, 'paid')->save();
// nlog($i->withoutRelations()->toArray());
$this->assertEquals(30.37, $i->amount);
$this->assertEquals(20.00, $i->balance);
$this->assertEquals(3, $i->status_id);
$this->assertEquals(10.37, $i->paid_to_date);
$item = new InvoiceItem();
$item->quantity = 1;
$item->cost = 15;
$item->type_id = '1';
$i->line_items = [$item];
$i = $i->calc()->getInvoice();
$this->assertEquals(15, $i->amount);
$this->assertEquals(15-10.37, $i->balance);
$this->assertEquals(3, $i->status_id);
$this->assertEquals(10.37, $i->paid_to_date);
}
public function testInvoiceBalancesWithNegatives()
{
$item = new InvoiceItem();
$item->quantity = 1;
$item->cost = -100;
$item->type_id = '1';
$i = Invoice::factory()->create([
'company_id' => $this->company->id,
'user_id' => $this->user->id,
'client_id' => $this->client->id,
'line_items' => [$item],
'status_id' => 1,
'tax_rate1' => 0,
'tax_rate2' => 0,
'tax_rate3' => 0,
'tax_name1' => '',
'tax_name2' => '',
'tax_name3' => '',
'discount' => 0,
'paid_to_date' => 0,
]);
$this->assertEquals(1, $i->status_id);
$i = $i->calc()->getInvoice()->service()->markSent()->save();
$this->assertEquals(-100, $i->amount);
$this->assertEquals(-100, $i->balance);
$this->assertEquals(2, $i->status_id);
$this->assertEquals(0, $i->paid_to_date);
$item = new InvoiceItem();
$item->quantity = 1;
$item->cost = -30.37;
$item->type_id = '1';
$i->line_items = [$item];
$i = $i->calc()->getInvoice();
$this->assertEquals(-30.37, $i->amount);
$this->assertEquals(-30.37, $i->balance);
$this->assertEquals(2, $i->status_id);
$this->assertEquals(0, $i->paid_to_date);
$i = $i->service()->markPaid()->save();
$this->assertEquals(0, $i->balance);
$this->assertEquals(-30.37, $i->paid_to_date);
}
public function testPurchaseOrderBalances()
{
$item = new InvoiceItem();
$item->quantity = 1;
$item->cost = 100;
$item->type_id = '1';
$i = PurchaseOrder::factory()->create([
'company_id' => $this->company->id,
'user_id' => $this->user->id,
'vendor_id' => $this->vendor->id,
'line_items' => [$item],
'status_id' => 1,
'tax_rate1' => 0,
'tax_rate2' => 0,
'tax_rate3' => 0,
'tax_name1' => '',
'tax_name2' => '',
'tax_name3' => '',
'discount' => 0,
'paid_to_date' => 0,
]);
$this->assertEquals(1, $i->status_id);
$i = $i->calc()->getPurchaseOrder();
$i = $i->service()->markSent()->save();
$this->assertEquals(100, $i->amount);
$this->assertEquals(100, $i->balance);
$this->assertEquals(2, $i->status_id);
$this->assertEquals(0, $i->paid_to_date);
$item = new InvoiceItem();
$item->quantity = 1;
$item->cost = 30.37;
$item->type_id = '1';
$i->line_items = [$item];
$i = $i->calc()->getPurchaseOrder();
$i = $i->service()->markSent()->save();
$this->assertEquals(30.37, $i->amount);
$this->assertEquals(30.37, $i->balance);
$this->assertEquals(2, $i->status_id);
$this->assertEquals(0, $i->paid_to_date);
$item = new InvoiceItem();
$item->quantity = 1;
$item->cost =10.37;
$item->type_id = '1';
$i->line_items = [$item];
$i = $i->calc()->getPurchaseOrder();
$i = $i->service()->markSent()->save();
$this->assertEquals(10.37, $i->amount);
$this->assertEquals(10.37, $i->balance);
$this->assertEquals(2, $i->status_id);
$this->assertEquals(0, $i->paid_to_date);
}
}

View File

@ -66,6 +66,8 @@ class InvoiceInclusiveTest extends TestCase
public function testInvoiceTotals() public function testInvoiceTotals()
{ {
$this->invoice_calc = new InvoiceSumInclusive($this->invoice);
$this->invoice_calc->build(); $this->invoice_calc->build();
$this->assertEquals($this->invoice_calc->getSubTotal(), 20); $this->assertEquals($this->invoice_calc->getSubTotal(), 20);
@ -76,6 +78,8 @@ class InvoiceInclusiveTest extends TestCase
{ {
$this->invoice->discount = 5; $this->invoice->discount = 5;
$this->invoice_calc = new InvoiceSumInclusive($this->invoice);
$this->invoice_calc->build(); $this->invoice_calc->build();
$this->assertEquals($this->invoice_calc->getSubTotal(), 20); $this->assertEquals($this->invoice_calc->getSubTotal(), 20);
@ -88,6 +92,8 @@ class InvoiceInclusiveTest extends TestCase
$this->invoice->discount = 5; $this->invoice->discount = 5;
$this->invoice->custom_surcharge1 = 5; $this->invoice->custom_surcharge1 = 5;
$this->invoice_calc = new InvoiceSumInclusive($this->invoice);
$this->invoice_calc->build(); $this->invoice_calc->build();
$this->assertEquals($this->invoice_calc->getSubTotal(), 20); $this->assertEquals($this->invoice_calc->getSubTotal(), 20);
@ -103,6 +109,8 @@ class InvoiceInclusiveTest extends TestCase
$this->invoice->tax_rate1 = 10; $this->invoice->tax_rate1 = 10;
$this->invoice->is_amount_discount = true; $this->invoice->is_amount_discount = true;
$this->invoice_calc = new InvoiceSumInclusive($this->invoice);
$this->invoice_calc->build(); $this->invoice_calc->build();
$this->assertEquals($this->invoice_calc->getSubTotal(), 20); $this->assertEquals($this->invoice_calc->getSubTotal(), 20);
@ -119,6 +127,7 @@ class InvoiceInclusiveTest extends TestCase
$this->invoice->tax_rate1 = 10; $this->invoice->tax_rate1 = 10;
$this->invoice->is_amount_discount = false; $this->invoice->is_amount_discount = false;
$this->invoice_calc = new InvoiceSumInclusive($this->invoice);
$this->invoice_calc->build(); $this->invoice_calc->build();
$this->assertEquals($this->invoice_calc->getSubTotal(), 20); $this->assertEquals($this->invoice_calc->getSubTotal(), 20);
@ -135,6 +144,7 @@ class InvoiceInclusiveTest extends TestCase
$this->invoice->uses_inclusive_taxes = true; $this->invoice->uses_inclusive_taxes = true;
$this->invoice->is_amount_discount = true; $this->invoice->is_amount_discount = true;
$this->invoice_calc = new InvoiceSumInclusive($this->invoice);
$this->invoice_calc->build(); $this->invoice_calc->build();
$this->assertEquals($this->invoice_calc->getSubTotal(), 20); $this->assertEquals($this->invoice_calc->getSubTotal(), 20);
@ -154,6 +164,8 @@ class InvoiceInclusiveTest extends TestCase
$this->invoice->uses_inclusive_taxes = true; $this->invoice->uses_inclusive_taxes = true;
$this->invoice->is_amount_discount = true; $this->invoice->is_amount_discount = true;
$this->invoice_calc = new InvoiceSumInclusive($this->invoice);
$this->invoice_calc->build(); $this->invoice_calc->build();
$this->assertEquals($this->invoice_calc->getSubTotal(), 20); $this->assertEquals($this->invoice_calc->getSubTotal(), 20);
@ -170,7 +182,10 @@ class InvoiceInclusiveTest extends TestCase
$item->cost = 10; $item->cost = 10;
$item->tax_rate1 = 10; $item->tax_rate1 = 10;
$item->tax_name1 = 10; $item->tax_name1 = 10;
$item->tax_rate2 = 0;
$item->tax_name2 = '';
$item->tax_rate3 = 0;
$item->tax_name3 = '';
$line_items[] = $item; $line_items[] = $item;
$item = InvoiceItemFactory::create(); $item = InvoiceItemFactory::create();
@ -178,6 +193,10 @@ class InvoiceInclusiveTest extends TestCase
$item->cost = 10; $item->cost = 10;
$item->tax_rate1 = 10; $item->tax_rate1 = 10;
$item->tax_name1 = 10; $item->tax_name1 = 10;
$item->tax_rate2 = 0;
$item->tax_name2 = '';
$item->tax_rate3 = 0;
$item->tax_name3 = '';
$line_items[] = $item; $line_items[] = $item;
@ -223,14 +242,17 @@ class InvoiceInclusiveTest extends TestCase
$this->invoice->discount = 0; $this->invoice->discount = 0;
$this->invoice->custom_surcharge1 = 0; $this->invoice->custom_surcharge1 = 0;
$this->invoice->tax_name1 = 'dog';
$this->invoice->tax_name2 = 'cat';
$this->invoice->tax_rate1 = 10; $this->invoice->tax_rate1 = 10;
$this->invoice->tax_rate2 = 10; $this->invoice->tax_rate2 = 10;
$this->invoice_calc = null;
$this->invoice_calc = new InvoiceSumInclusive($this->invoice, $this->settings); $this->invoice_calc = new InvoiceSumInclusive($this->invoice, $this->settings);
$this->invoice_calc->build(); $this->invoice_calc->build();
$this->assertEquals($this->invoice_calc->getSubTotal(), 20); $this->assertEquals(20, $this->invoice_calc->getSubTotal());
$this->assertEquals($this->invoice_calc->getTotalTaxes(), 5.46); $this->assertEquals(5.46, $this->invoice_calc->getTotalTaxes());
$this->assertEquals(count($this->invoice_calc->getTaxMap()), 1); $this->assertEquals(count($this->invoice_calc->getTaxMap()), 1);
$this->assertEquals($this->invoice_calc->getTotal(), 20); $this->assertEquals($this->invoice_calc->getTotal(), 20);
$this->assertEquals($this->invoice_calc->getBalance(), 20); $this->assertEquals($this->invoice_calc->getBalance(), 20);
@ -244,7 +266,7 @@ class InvoiceInclusiveTest extends TestCase
$item->quantity = 1; $item->quantity = 1;
$item->cost = 10; $item->cost = 10;
$item->tax_rate1 = 10; $item->tax_rate1 = 10;
$item->tax_name1 = 10; $item->tax_name1 = 'a10';
$item->discount = 5; $item->discount = 5;
$line_items[] = $item; $line_items[] = $item;
@ -253,7 +275,7 @@ class InvoiceInclusiveTest extends TestCase
$item->quantity = 1; $item->quantity = 1;
$item->cost = 10; $item->cost = 10;
$item->tax_rate1 = 10; $item->tax_rate1 = 10;
$item->tax_name1 = 10; $item->tax_name1 = 'a10';
$item->discount = 5; $item->discount = 5;
$line_items[] = $item; $line_items[] = $item;
@ -267,17 +289,20 @@ class InvoiceInclusiveTest extends TestCase
$this->invoice->tax_rate1 = 10; $this->invoice->tax_rate1 = 10;
$this->invoice->tax_rate2 = 10; $this->invoice->tax_rate2 = 10;
$this->invoice->tax_name1 = 'VAT';
$this->invoice->tax_name2 = 'VAT';
$this->invoice_calc = null;
$this->invoice_calc = new InvoiceSumInclusive($this->invoice, $this->settings); $this->invoice_calc = new InvoiceSumInclusive($this->invoice, $this->settings);
$this->invoice_calc->build(); $this->invoice_calc->build();
$line_items = $this->invoice_calc->invoice_items->getLineItems(); $line_items = $this->invoice_calc->invoice_items->getLineItems();
nlog($this->invoice_calc->getTaxMap());
$this->assertEquals($this->invoice_calc->getSubTotal(), 19); $this->assertEquals(19, $this->invoice_calc->getSubTotal());
$this->assertEquals($this->invoice_calc->getTotalDiscount(), 0.95); $this->assertEquals(0.95, $this->invoice_calc->getTotalDiscount());
$this->assertEquals($this->invoice_calc->getTotalTaxes(), 4.92); $this->assertEquals(4.92, $this->invoice_calc->getTotalTaxes());
// nlog($this->invoice_calc->getTaxMap());
$this->assertEquals(count($this->invoice_calc->getTaxMap()), 1); $this->assertEquals(count($this->invoice_calc->getTaxMap()), 1);
$this->assertEquals($this->invoice_calc->getTotal(), 18.05); $this->assertEquals($this->invoice_calc->getTotal(), 18.05);
@ -316,6 +341,9 @@ class InvoiceInclusiveTest extends TestCase
$this->invoice->tax_rate1 = 10; $this->invoice->tax_rate1 = 10;
$this->invoice->tax_rate2 = 10; $this->invoice->tax_rate2 = 10;
$this->invoice->tax_name1 = 'dog';
$this->invoice->tax_name2 = 'cat';
$this->invoice_calc = new InvoiceSumInclusive($this->invoice, $this->settings); $this->invoice_calc = new InvoiceSumInclusive($this->invoice, $this->settings);
$this->invoice_calc->build(); $this->invoice_calc->build();
@ -361,6 +389,9 @@ class InvoiceInclusiveTest extends TestCase
$this->invoice->tax_rate1 = 10; $this->invoice->tax_rate1 = 10;
$this->invoice->tax_rate2 = 10; $this->invoice->tax_rate2 = 10;
$this->invoice->tax_name1 = 'dog';
$this->invoice->tax_name2 = 'cat';
$this->invoice_calc = new InvoiceSumInclusive($this->invoice, $this->settings); $this->invoice_calc = new InvoiceSumInclusive($this->invoice, $this->settings);
$this->invoice_calc->build(); $this->invoice_calc->build();

View File

@ -36,6 +36,42 @@ class InvoiceItemTest extends TestCase
} }
public function testEdgeCasewithDiscountsPercentageAndTaxCalculations()
{
$invoice = InvoiceFactory::create($this->company->id, $this->user->id);
$invoice->client_id = $this->client->id;
$invoice->uses_inclusive_taxes = false;
$invoice->is_amount_discount =false;
$invoice->discount = 0;
$invoice->tax_rate1 = 0;
$invoice->tax_rate2 = 0;
$invoice->tax_rate3 = 0;
$invoice->tax_name1 = '';
$invoice->tax_name2 = '';
$invoice->tax_name3 = '';
$line_items = [];
$line_item = new InvoiceItem;
$line_item->quantity = 1;
$line_item->cost = 100;
$line_item->tax_rate1 = 22;
$line_item->tax_name1 = 'Km';
$line_item->product_key = 'Test';
$line_item->notes = 'Test';
$line_item->is_amount_discount = false;
$line_items[] = $line_item;
$invoice->line_items = $line_items;
$invoice->save();
$invoice = $invoice->calc()->getInvoice();
$this->assertEquals(122, $invoice->amount);
$this->assertEquals(22, $invoice->total_taxes);
}
public function testDiscountsWithInclusiveTaxes() public function testDiscountsWithInclusiveTaxes()
{ {
$invoice = InvoiceFactory::create($this->company->id, $this->user->id); $invoice = InvoiceFactory::create($this->company->id, $this->user->id);

View File

@ -21,6 +21,83 @@ use Tests\TestCase;
class NumberTest extends TestCase class NumberTest extends TestCase
{ {
public function testRangeOfNumberFormats()
{
$floatvals = [
"22000.76" =>"22 000,76",
"22000.76" =>"22.000,76",
"22000.76" =>"22,000.76",
"22000" =>"22 000",
"22000" =>"22,000",
"22000" =>"22.000",
"22000.76" =>"22000.76",
"22000.76" =>"22000,76",
"1022000.76" =>"1.022.000,76",
"1022000.76" =>"1,022,000.76",
"1000000" =>"1,000,000",
"1000000" =>"1.000.000",
"1022000.76" =>"1022000.76",
"1022000.76" =>"1022000,76",
"1022000" =>"1022000",
"0.76" =>"0.76",
"0.76" =>"0,76",
"0" =>"0.00",
"0" =>"0,00",
"1" =>"1.00",
"1" =>"1,00",
"423545" =>"423545 €",
"423545" =>"423,545 €",
"423545" =>"423.545 €",
"1" =>"1,00 €",
"1.02" =>"€ 1.02",
"1000.02" =>"1'000,02 EUR",
"1000.02" =>"1 000.02$",
"1000.02" =>"1,000.02$",
"1000.02" =>"1.000,02 EURO"
];
foreach($floatvals as $key => $value) {
$this->assertEquals($key, Number::parseFloat($value));
}
}
public function testNegativeFloatParse()
{
$value = '-22,00';
$res = Number::parseFloat($value);
$this->assertEquals(-22.0, $res);
$value = '-22.00';
$res = Number::parseFloat($value);
$this->assertEquals(-22.0, $res);
$value = '-2200,00';
$res = Number::parseFloat($value);
$this->assertEquals(-2200.0, $res);
$value = '-2.200,00';
$res = Number::parseFloat($value);
$this->assertEquals(-2200.0, $res);
$this->assertEquals(-2200, $res);
}
public function testConvertDecimalCommaFloats() public function testConvertDecimalCommaFloats()
{ {
$value = '22,00'; $value = '22,00';
@ -123,4 +200,22 @@ class NumberTest extends TestCase
$this->assertEquals(7.99, $converted_amount); $this->assertEquals(7.99, $converted_amount);
} }
public function testMultiCommaNumber()
{
$amount = '100,100.00';
$converted_amount = Number::parseFloat($amount);
$this->assertEquals(100100, $converted_amount);
}
public function testMultiDecimalNumber()
{
$amount = '100.1000.000,00';
$converted_amount = Number::parseFloat($amount);
$this->assertEquals(1001000000, $converted_amount);
}
} }