diff --git a/VERSION.txt b/VERSION.txt index 57ebcacf2c5b..097c041f2526 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.7.34 \ No newline at end of file +5.7.35 \ No newline at end of file diff --git a/app/Console/Commands/MobileLocalization.php b/app/Console/Commands/MobileLocalization.php index 482cf9042ade..ddc8c4e3b409 100644 --- a/app/Console/Commands/MobileLocalization.php +++ b/app/Console/Commands/MobileLocalization.php @@ -63,10 +63,12 @@ class MobileLocalization extends Command { $resources = $this->getResources(); - foreach ($resources as $key => $val) { - $transKey = "texts.{$key}"; - if (trans($transKey) == $transKey) { - echo "'$key' => '$val',\n"; + if(is_iterable($resources)){ + foreach ($resources as $key => $val) { + $transKey = "texts.{$key}"; + if (trans($transKey) == $transKey) { + echo "'$key' => '$val',\n"; + } } } } diff --git a/app/Helpers/Invoice/InvoiceItemSum.php b/app/Helpers/Invoice/InvoiceItemSum.php index c7d444b9c522..4f95d5c7a2ae 100644 --- a/app/Helpers/Invoice/InvoiceItemSum.php +++ b/app/Helpers/Invoice/InvoiceItemSum.php @@ -399,8 +399,8 @@ class InvoiceItemSum $item_tax = 0; - //$amount = $this->item->line_total - ($this->item->line_total * ($this->invoice->discount / $this->sub_total)); - $amount = ($this->sub_total > 0) ? $this->item->line_total - ($this->invoice->discount * ($this->item->line_total / $this->sub_total)) : 0; + $amount = $this->item->line_total - ($this->item->line_total * ($this->invoice->discount / $this->sub_total)); + //$amount = ($this->sub_total > 0) ? $this->item->line_total - ($this->invoice->discount * ($this->item->line_total / $this->sub_total)) : 0; $item_tax_rate1_total = $this->calcAmountLineTax($this->item->tax_rate1, $amount); diff --git a/app/Helpers/Invoice/InvoiceItemSumInclusive.php b/app/Helpers/Invoice/InvoiceItemSumInclusive.php index 7ca6fb5e2717..af7e98b382ba 100644 --- a/app/Helpers/Invoice/InvoiceItemSumInclusive.php +++ b/app/Helpers/Invoice/InvoiceItemSumInclusive.php @@ -353,7 +353,7 @@ class InvoiceItemSumInclusive if ($this->sub_total == 0) { $amount = $this->item->line_total; } else { - $amount = ($this->sub_total > 0) ? $this->item->line_total - ($this->invoice->discount * ($this->item->line_total / $this->sub_total)) : 0; + $amount = $this->item->line_total - ($this->invoice->discount * ($this->item->line_total / $this->sub_total)); // $amount = $this->item->line_total - ($this->item->line_total * ($this->invoice->discount / $this->sub_total)); } diff --git a/app/Http/Controllers/Bank/YodleeController.php b/app/Http/Controllers/Bank/YodleeController.php index 30e322a74891..e17769be4eb4 100644 --- a/app/Http/Controllers/Bank/YodleeController.php +++ b/app/Http/Controllers/Bank/YodleeController.php @@ -51,6 +51,8 @@ class YodleeController extends BaseController $this->getAccounts($company, $token); } + $redirect_url = isset($request->getTokenContent()['is_react']) && $request->getTokenContent()['is_react'] ? 'https://app.invoicing.co/#/' : 'https://invoicing.co/'; + $data = [ 'access_token' => $yodlee->getAccessToken(), 'fasttrack_url' => $yodlee->getFastTrackUrl(), @@ -59,6 +61,7 @@ class YodleeController extends BaseController 'company' => $company, 'account' => $company->account, 'completed' => $request->has('window_closed') ? true : false, + 'redirect_url' => $redirect_url, ]; return view('bank.yodlee.auth', $data); diff --git a/app/Http/Controllers/Reports/ARDetailReportController.php b/app/Http/Controllers/Reports/ARDetailReportController.php index 1d3784822299..1d3183a41d29 100644 --- a/app/Http/Controllers/Reports/ARDetailReportController.php +++ b/app/Http/Controllers/Reports/ARDetailReportController.php @@ -11,11 +11,12 @@ namespace App\Http\Controllers\Reports; +use App\Utils\Traits\MakesHash; +use App\Jobs\Report\SendToAdmin; +use App\Jobs\Report\PreviewReport; +use App\Services\Report\ARDetailReport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\GenericReportRequest; -use App\Jobs\Report\SendToAdmin; -use App\Services\Report\ARDetailReport; -use App\Utils\Traits\MakesHash; class ARDetailReportController extends BaseController { @@ -61,24 +62,21 @@ class ARDetailReportController extends BaseController */ public function __invoke(GenericReportRequest $request) { + + /** @var \App\Models\User $user */ + $user = auth()->user(); + if ($request->has('send_email') && $request->get('send_email')) { - SendToAdmin::dispatch(auth()->user()->company(), $request->all(), ARDetailReport::class, $this->filename); + SendToAdmin::dispatch($user->company(), $request->all(), ARDetailReport::class, $this->filename); return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - $export = new ARDetailReport(auth()->user()->company(), $request->all()); + $hash = \Illuminate\Support\Str::uuid(); - $csv = $export->run(); + PreviewReport::dispatch($user->company(), $request->all(), ARDetailReport::class, $hash); - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; + return response()->json(['message' => $hash], 200); - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/ARSummaryReportController.php b/app/Http/Controllers/Reports/ARSummaryReportController.php index cde4779451e3..0898c9e408ae 100644 --- a/app/Http/Controllers/Reports/ARSummaryReportController.php +++ b/app/Http/Controllers/Reports/ARSummaryReportController.php @@ -11,11 +11,12 @@ namespace App\Http\Controllers\Reports; -use App\Http\Controllers\BaseController; -use App\Http\Requests\Report\GenericReportRequest; -use App\Jobs\Report\SendToAdmin; -use App\Services\Report\ARSummaryReport; use App\Utils\Traits\MakesHash; +use App\Jobs\Report\SendToAdmin; +use App\Jobs\Report\PreviewReport; +use App\Http\Controllers\BaseController; +use App\Services\Report\ARSummaryReport; +use App\Http\Requests\Report\GenericReportRequest; class ARSummaryReportController extends BaseController { @@ -71,17 +72,11 @@ class ARSummaryReportController extends BaseController } // expect a list of visible fields, or use the default - $export = new ARSummaryReport($user->company(), $request->all()); + $hash = \Illuminate\Support\Str::uuid(); - $csv = $export->run(); + PreviewReport::dispatch($user->company(), $request->all(), ARSummaryReport::class, $hash); - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; + return response()->json(['message' => $hash], 200); - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/ClientBalanceReportController.php b/app/Http/Controllers/Reports/ClientBalanceReportController.php index c29b0a213a10..d3b1859dd07c 100644 --- a/app/Http/Controllers/Reports/ClientBalanceReportController.php +++ b/app/Http/Controllers/Reports/ClientBalanceReportController.php @@ -11,11 +11,12 @@ namespace App\Http\Controllers\Reports; -use App\Http\Controllers\BaseController; -use App\Http\Requests\Report\GenericReportRequest; -use App\Jobs\Report\SendToAdmin; -use App\Services\Report\ClientBalanceReport; use App\Utils\Traits\MakesHash; +use App\Jobs\Report\SendToAdmin; +use App\Jobs\Report\PreviewReport; +use App\Http\Controllers\BaseController; +use App\Services\Report\ClientBalanceReport; +use App\Http\Requests\Report\GenericReportRequest; class ClientBalanceReportController extends BaseController { @@ -61,24 +62,20 @@ class ClientBalanceReportController extends BaseController */ public function __invoke(GenericReportRequest $request) { + /** @var \App\Models\User $user */ + $user = auth()->user(); + if ($request->has('send_email') && $request->get('send_email')) { - SendToAdmin::dispatch(auth()->user()->company(), $request->all(), ClientBalanceReport::class, $this->filename); + SendToAdmin::dispatch($user->company(), $request->all(), ClientBalanceReport::class, $this->filename); return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - $export = new ClientBalanceReport(auth()->user()->company(), $request->all()); + $hash = \Illuminate\Support\Str::uuid(); - $csv = $export->run(); + PreviewReport::dispatch($user->company(), $request->all(), ClientBalanceReport::class, $hash); - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; + return response()->json(['message' => $hash], 200); - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/ClientSalesReportController.php b/app/Http/Controllers/Reports/ClientSalesReportController.php index 63c0ac69fe3c..612986f42123 100644 --- a/app/Http/Controllers/Reports/ClientSalesReportController.php +++ b/app/Http/Controllers/Reports/ClientSalesReportController.php @@ -11,11 +11,12 @@ namespace App\Http\Controllers\Reports; -use App\Http\Controllers\BaseController; -use App\Http\Requests\Report\GenericReportRequest; -use App\Jobs\Report\SendToAdmin; -use App\Services\Report\ClientSalesReport; use App\Utils\Traits\MakesHash; +use App\Jobs\Report\SendToAdmin; +use App\Jobs\Report\PreviewReport; +use App\Http\Controllers\BaseController; +use App\Services\Report\ClientSalesReport; +use App\Http\Requests\Report\GenericReportRequest; class ClientSalesReportController extends BaseController { @@ -61,24 +62,20 @@ class ClientSalesReportController extends BaseController */ public function __invoke(GenericReportRequest $request) { + /** @var \App\Models\User $user */ + $user = auth()->user(); + if ($request->has('send_email') && $request->get('send_email')) { - SendToAdmin::dispatch(auth()->user()->company(), $request->all(), ClientSalesReport::class, $this->filename); + SendToAdmin::dispatch($user->company(), $request->all(), ClientSalesReport::class, $this->filename); return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - $export = new ClientSalesReport(auth()->user()->company(), $request->all()); + $hash = \Illuminate\Support\Str::uuid(); - $csv = $export->run(); + PreviewReport::dispatch($user->company(), $request->all(), ClientSalesReport::class, $hash); - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; + return response()->json(['message' => $hash], 200); - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/ProductSalesReportController.php b/app/Http/Controllers/Reports/ProductSalesReportController.php index f27de4b19343..a2b8902db852 100644 --- a/app/Http/Controllers/Reports/ProductSalesReportController.php +++ b/app/Http/Controllers/Reports/ProductSalesReportController.php @@ -11,13 +11,14 @@ namespace App\Http\Controllers\Reports; +use App\Models\Client; +use Illuminate\Http\Response; +use App\Utils\Traits\MakesHash; +use App\Jobs\Report\SendToAdmin; +use App\Jobs\Report\PreviewReport; use App\Export\CSV\ProductSalesExport; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\ProductSalesReportRequest; -use App\Jobs\Report\SendToAdmin; -use App\Models\Client; -use App\Utils\Traits\MakesHash; -use Illuminate\Http\Response; class ProductSalesReportController extends BaseController { @@ -63,24 +64,20 @@ class ProductSalesReportController extends BaseController */ public function __invoke(ProductSalesReportRequest $request) { + /** @var \App\Models\User $user */ + $user = auth()->user(); + if ($request->has('send_email') && $request->get('send_email')) { - SendToAdmin::dispatch(auth()->user()->company(), $request->all(), ProductSalesExport::class, $this->filename); + SendToAdmin::dispatch($user->company(), $request->all(), ProductSalesExport::class, $this->filename); return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - $export = new ProductSalesExport(auth()->user()->company(), $request->all()); + $hash = \Illuminate\Support\Str::uuid(); - $csv = $export->run(); + PreviewReport::dispatch($user->company(), $request->all(), ProductSalesExport::class, $hash); - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; + return response()->json(['message' => $hash], 200); - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/ProfitAndLossController.php b/app/Http/Controllers/Reports/ProfitAndLossController.php index 26e860f16bd5..18e575dd8d7c 100644 --- a/app/Http/Controllers/Reports/ProfitAndLossController.php +++ b/app/Http/Controllers/Reports/ProfitAndLossController.php @@ -11,13 +11,14 @@ namespace App\Http\Controllers\Reports; +use App\Models\Client; +use Illuminate\Http\Response; +use App\Utils\Traits\MakesHash; +use App\Jobs\Report\SendToAdmin; +use App\Jobs\Report\PreviewReport; +use App\Services\Report\ProfitLoss; use App\Http\Controllers\BaseController; use App\Http\Requests\Report\ProfitLossRequest; -use App\Jobs\Report\SendToAdmin; -use App\Models\Client; -use App\Services\Report\ProfitLoss; -use App\Utils\Traits\MakesHash; -use Illuminate\Http\Response; class ProfitAndLossController extends BaseController { @@ -71,18 +72,13 @@ class ProfitAndLossController extends BaseController return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - $pnl = new ProfitLoss($user->company(), $request->all()); - $csv = $pnl->run(); + $hash = \Illuminate\Support\Str::uuid(); + + PreviewReport::dispatch($user->company(), $request->all(), ProfitLoss::class, $hash); + + return response()->json(['message' => $hash], 200); - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/TaxSummaryReportController.php b/app/Http/Controllers/Reports/TaxSummaryReportController.php index b199eadcc1f2..08b978a0037d 100644 --- a/app/Http/Controllers/Reports/TaxSummaryReportController.php +++ b/app/Http/Controllers/Reports/TaxSummaryReportController.php @@ -11,11 +11,12 @@ namespace App\Http\Controllers\Reports; -use App\Http\Controllers\BaseController; -use App\Http\Requests\Report\GenericReportRequest; -use App\Jobs\Report\SendToAdmin; -use App\Services\Report\TaxSummaryReport; use App\Utils\Traits\MakesHash; +use App\Jobs\Report\SendToAdmin; +use App\Jobs\Report\PreviewReport; +use App\Http\Controllers\BaseController; +use App\Services\Report\TaxSummaryReport; +use App\Http\Requests\Report\GenericReportRequest; class TaxSummaryReportController extends BaseController { @@ -61,24 +62,21 @@ class TaxSummaryReportController extends BaseController */ public function __invoke(GenericReportRequest $request) { + + /** @var \App\Models\User $user */ + $user = auth()->user(); + if ($request->has('send_email') && $request->get('send_email')) { - SendToAdmin::dispatch(auth()->user()->company(), $request->all(), TaxSummaryReport::class, $this->filename); + SendToAdmin::dispatch($user->company(), $request->all(), TaxSummaryReport::class, $this->filename); return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - $export = new TaxSummaryReport(auth()->user()->company(), $request->all()); + $hash = \Illuminate\Support\Str::uuid(); - $csv = $export->run(); + PreviewReport::dispatch($user->company(), $request->all(), TaxSummaryReport::class, $hash); - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; + return response()->json(['message' => $hash], 200); - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Controllers/Reports/UserSalesReportController.php b/app/Http/Controllers/Reports/UserSalesReportController.php index 2d80995791aa..c26e7dd35d3e 100644 --- a/app/Http/Controllers/Reports/UserSalesReportController.php +++ b/app/Http/Controllers/Reports/UserSalesReportController.php @@ -11,11 +11,12 @@ namespace App\Http\Controllers\Reports; -use App\Http\Controllers\BaseController; -use App\Http\Requests\Report\GenericReportRequest; -use App\Jobs\Report\SendToAdmin; -use App\Services\Report\UserSalesReport; use App\Utils\Traits\MakesHash; +use App\Jobs\Report\SendToAdmin; +use App\Jobs\Report\PreviewReport; +use App\Http\Controllers\BaseController; +use App\Services\Report\UserSalesReport; +use App\Http\Requests\Report\GenericReportRequest; class UserSalesReportController extends BaseController { @@ -61,24 +62,20 @@ class UserSalesReportController extends BaseController */ public function __invoke(GenericReportRequest $request) { + /** @var \App\Models\User $user */ + $user = auth()->user(); + if ($request->has('send_email') && $request->get('send_email')) { - SendToAdmin::dispatch(auth()->user()->company(), $request->all(), UserSalesReport::class, $this->filename); + SendToAdmin::dispatch($user->company(), $request->all(), UserSalesReport::class, $this->filename); return response()->json(['message' => 'working...'], 200); } - // expect a list of visible fields, or use the default - $export = new UserSalesReport(auth()->user()->company(), $request->all()); + $hash = \Illuminate\Support\Str::uuid(); - $csv = $export->run(); + PreviewReport::dispatch($user->company(), $request->all(), UserSalesReport::class, $hash); - $headers = [ - 'Content-Disposition' => 'attachment', - 'Content-Type' => 'text/csv', - ]; + return response()->json(['message' => $hash], 200); - return response()->streamDownload(function () use ($csv) { - echo $csv; - }, $this->filename, $headers); } } diff --git a/app/Http/Middleware/Locale.php b/app/Http/Middleware/Locale.php index cea5b9b8f7b6..5f7f2006f3e5 100644 --- a/app/Http/Middleware/Locale.php +++ b/app/Http/Middleware/Locale.php @@ -27,8 +27,8 @@ class Locale public function handle($request, Closure $next) { /*LOCALE SET */ - if ($request->has('lang')) { - $locale = $request->input('lang'); + if ($request->has('lang') && is_string($request->input('lang'))) { + $locale = $request->string('lang','en'); App::setLocale($locale); } elseif (auth()->guard('contact')->user()) { App::setLocale(auth()->guard('contact')->user()->client()->setEagerLoads([])->first()->locale()); diff --git a/app/Http/Middleware/SetEmailDb.php b/app/Http/Middleware/SetEmailDb.php index d2dd3190c246..fa02b2c7592b 100644 --- a/app/Http/Middleware/SetEmailDb.php +++ b/app/Http/Middleware/SetEmailDb.php @@ -32,7 +32,7 @@ class SetEmailDb 'errors' => new stdClass, ]; - if ($request->input('email') && config('ninja.db.multi_db_enabled')) { + if ($request->input('email') && is_string($request->input('email')) && config('ninja.db.multi_db_enabled')) { if (! MultiDB::userFindAndSetDb($request->input('email'))) { return response()->json($error, 400); } diff --git a/app/Http/Middleware/VendorLocale.php b/app/Http/Middleware/VendorLocale.php index abca08b9e3d7..17ae99c62e3f 100644 --- a/app/Http/Middleware/VendorLocale.php +++ b/app/Http/Middleware/VendorLocale.php @@ -32,7 +32,7 @@ class VendorLocale } /*LOCALE SET */ - if ($request->has('lang')) { + if ($request->has('lang') && is_string($request->input('lang'))) { $locale = $request->input('lang'); App::setLocale($locale); } elseif (auth()->guard('vendor')->user()) { diff --git a/app/PaymentDrivers/GoCardless/DirectDebit.php b/app/PaymentDrivers/GoCardless/DirectDebit.php index f27696d8627d..c99ef060d10f 100644 --- a/app/PaymentDrivers/GoCardless/DirectDebit.php +++ b/app/PaymentDrivers/GoCardless/DirectDebit.php @@ -108,7 +108,8 @@ class DirectDebit implements MethodInterface $response = $this->go_cardless->gateway->billingRequests()->create([ "params" => [ "mandate_request" => [ - "currency" => auth()->guard('contact')->user()->client->currency()->code + "currency" => auth()->guard('contact')->user()->client->currency()->code, + "verify" => "recommended" ] ] ]); diff --git a/app/PaymentDrivers/GoCardlessPaymentDriver.php b/app/PaymentDrivers/GoCardlessPaymentDriver.php index 3201890465bc..c91cd68d1fea 100644 --- a/app/PaymentDrivers/GoCardlessPaymentDriver.php +++ b/app/PaymentDrivers/GoCardlessPaymentDriver.php @@ -144,11 +144,18 @@ class GoCardlessPaymentDriver extends BaseDriver $this->init(); + if ($payment_hash->fee_invoice) { + $description = "Invoice {$payment_hash->fee_invoice->number} for {$amount} for client {$this->client->present()->name()}"; + } else { + $description = "Amount {$amount} from client {$this->client->present()->name()}"; + } + try { $payment = $this->gateway->payments()->create([ 'params' => [ 'amount' => $converted_amount, 'currency' => $this->client->getCurrencyCode(), + 'description' => $description, 'metadata' => [ 'payment_hash' => $this->payment_hash->hash, ], diff --git a/app/Services/Pdf/PdfBuilder.php b/app/Services/Pdf/PdfBuilder.php index 7a496e17578b..d6df412c4213 100644 --- a/app/Services/Pdf/PdfBuilder.php +++ b/app/Services/Pdf/PdfBuilder.php @@ -652,7 +652,7 @@ class PdfBuilder /** * Formats the line items for display. * - * @param array<\App\DataMapper\InvoiceItem> $items + * @param array $items * @param string $table_type * * @return array @@ -662,10 +662,10 @@ class PdfBuilder $data = []; $locale_info = localeconv(); - - // $this->service->config->entity_currency = $this->service->config->currency; - + foreach ($items as $key => $item) { + /** @var \App\DataMapper\InvoiceItem $item */ + if ($table_type == '$product' && $item->type_id != 1) { if ($item->type_id != 4 && $item->type_id != 6 && $item->type_id != 5) { continue; @@ -980,7 +980,7 @@ class PdfBuilder return [ ['element' => 'div', 'properties' => ['style' => 'display: flex; flex-direction: column;'], 'elements' => [ ['element' => 'div', 'properties' => ['style' => 'margin-top: 1.5rem; display: block; align-items: flex-start; page-break-inside: avoid; visible !important;'], 'elements' => [ - ['element' => 'img', 'properties' => ['src' => '$invoiceninja.whitelabel', 'style' => 'height: 2.5rem;', 'hidden' => 'false', 'id' => 'invoiceninja-whitelabel-logo']], + ['element' => 'img', 'properties' => ['src' => '$invoiceninja.whitelabel', 'style' => 'height: 2.5rem;', 'hidden' => $this->service->company->account->isPaid() ? 'true' : 'false', 'id' => 'invoiceninja-whitelabel-logo']], ]], ]], ]; @@ -1052,7 +1052,7 @@ class PdfBuilder ]], ['element' => 'img', 'properties' => ['style' => 'max-width: 50%; height: auto;', 'src' => '$contact.signature', 'id' => 'contact-signature']], ['element' => 'div', 'properties' => ['style' => 'margin-top: 1.5rem; display: flex; align-items: flex-start; page-break-inside: auto;'], 'elements' => [ - ['element' => 'img', 'properties' => ['src' => '$invoiceninja.whitelabel', 'style' => 'height: 2.5rem;', 'hidden' => 'false', 'id' => 'invoiceninja-whitelabel-logo']], + ['element' => 'img', 'properties' => ['src' => '$invoiceninja.whitelabel', 'style' => 'height: 2.5rem;', 'hidden' => $this->service->company->account->isPaid() ? 'true' : 'false', 'id' => 'invoiceninja-whitelabel-logo']], ]], ]], ['element' => 'div', 'properties' => ['class' => 'totals-table-right-side', 'dir' => '$dir'], 'elements' => []], diff --git a/app/Services/Report/TaxSummaryReport.php b/app/Services/Report/TaxSummaryReport.php index aaf313eaf23a..3f1b67512e7f 100644 --- a/app/Services/Report/TaxSummaryReport.php +++ b/app/Services/Report/TaxSummaryReport.php @@ -113,12 +113,15 @@ class TaxSummaryReport extends BaseExport if(in_array($invoice->status_id, [Invoice::STATUS_PARTIAL,Invoice::STATUS_PAID])) { - if($invoice->status_id == Invoice::STATUS_PAID) { - $cash_map[$key]['tax_amount'] += $tax['total']; - } else { - $cash_map[$key]['tax_amount'] += (($invoice->amount - $invoice->balance) / $invoice->balance) * $tax['total'] ?? 0; + try { + if($invoice->status_id == Invoice::STATUS_PAID) { + $cash_map[$key]['tax_amount'] += $tax['total']; + } else { + $cash_map[$key]['tax_amount'] += (($invoice->amount - $invoice->balance) / $invoice->balance) * $tax['total'] ?? 0; + } + } catch(\DivisionByZeroError $e) { + $cash_map[$key]['tax_amount'] += 0; } - } } diff --git a/config/ninja.php b/config/ninja.php index b6801e5f61f6..52bcd06fbdd7 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -15,8 +15,8 @@ return [ 'require_https' => env('REQUIRE_HTTPS', true), 'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'), - 'app_version' => env('APP_VERSION','5.7.34'), - 'app_tag' => env('APP_TAG','5.7.34'), + 'app_version' => env('APP_VERSION','5.7.35'), + 'app_tag' => env('APP_TAG','5.7.35'), 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', ''), diff --git a/lang/de/texts.php b/lang/de/texts.php index 51496ae6b371..c1b62d6a1b69 100644 --- a/lang/de/texts.php +++ b/lang/de/texts.php @@ -203,7 +203,7 @@ $LANG = array( 'limit_clients' => 'Entschuldigung aber das wird das Limit von :count Kunden überschreiten. Bitte führen Sie ein kostenpflichtiges Upgrade durch.', 'payment_error' => 'Es ist ein Fehler während der Zahlung aufgetreten. Bitte versuche es später noch einmal.', 'registration_required' => 'Registrierung erforderlich', - 'confirmation_required' => 'Bitte verifiziere deine E-Mail Adresse, :link um die E-Mail Bestätigung erneut zu senden.', + 'confirmation_required' => 'Bitte verifiziern Sie Ihre E-Mail-Adresse, :link um die E-Mail-Bestätigung erneut zu senden.', 'updated_client' => 'Kunde erfolgreich aktualisiert', 'archived_client' => 'Kunde erfolgreich archiviert', 'archived_clients' => ':count Kunden erfolgreich archiviert', @@ -239,7 +239,7 @@ $LANG = array( 'deleted_vendors' => ':count Lieferanten erfolgreich gelöscht', 'confirmation_subject' => 'Kontobestätigung', 'confirmation_header' => 'Kontobestätigung', - 'confirmation_message' => 'Bitte klicke auf den folgenden Link um dein Konto zu bestätigen.', + 'confirmation_message' => 'Bitte klicken Sie auf den folgenden Link, um Ihr Konto zu bestätigen.', 'invoice_subject' => 'Neue Rechnung :number von :account', 'invoice_message' => 'Um Ihre Rechnung über :amount einzusehen, klicken Sie bitte auf den folgenden Link:', 'payment_subject' => 'Zahlungseingang', @@ -247,7 +247,7 @@ $LANG = array( 'email_salutation' => 'Sehr geehrte/r :name,', 'email_signature' => 'Mit freundlichen Grüßen', 'email_from' => 'Das InvoiceNinja Team', - 'invoice_link_message' => 'Um deine Kundenrechnung anzuschauen, klicke auf den folgenden Link:', + 'invoice_link_message' => 'Um die Rechnung anzuschauen, bitte auf den folgenden Link klicken:', 'notification_invoice_paid_subject' => 'Die Rechnung :invoice wurde von :client bezahlt.', 'notification_invoice_sent_subject' => 'Rechnung :invoice wurde an :client versendet.', 'notification_invoice_viewed_subject' => 'Die Rechnung :invoice wurde von :client angeschaut.', @@ -256,20 +256,20 @@ $LANG = array( 'notification_invoice_viewed' => 'Der Kunde :client hat sich die Rechnung :invoice über :amount angesehen.', 'stripe_payment_text' => 'Rechnung :invoicenumber in Höhe von :amount für Kunde :client', 'stripe_payment_text_without_invoice' => 'Zahlung ohne Rechnung in Höhe von :amount für Kunde :client', - 'reset_password' => 'Du kannst dein Passwort zurücksetzen, indem du auf den folgenden Link klickst:', + 'reset_password' => 'Sie können Ihr Passwort zurücksetzen, indem Sie auf den folgenden Link klicken:', 'secure_payment' => 'Sichere Zahlung', 'card_number' => 'Kartennummer', 'expiration_month' => 'Ablaufmonat', 'expiration_year' => 'Ablaufjahr', 'cvv' => 'Kartenprüfziffer', 'logout' => 'Abmelden', - 'sign_up_to_save' => 'Melde dich an, um deine Arbeit zu speichern', + 'sign_up_to_save' => 'Melden Sie sich an, um Ihre Arbeit zu speichern', 'agree_to_terms' => 'Ich stimme den :terms zu', 'terms_of_service' => 'Service-Bedingungen', 'email_taken' => 'Diese E-Mail-Adresse ist bereits registriert', 'working' => 'Wird bearbeitet', 'success' => 'Erfolg', - 'success_message' => 'Du hast dich erfolgreich registriert. Bitte besuche den Link in deiner Bestätigungsmail um deine E-Mail-Adresse zu verifizieren.', + 'success_message' => 'Sie haben sich erfolgreich registriert. Bitte rufen Sie den Link in der Bestätigungs-Mail auf, um Ihre E-Mail-Adresse zu verifizieren.', 'erase_data' => 'Ihr Konto ist nicht registriert, diese Aktion wird Ihre Daten unwiderruflich löschen.', 'password' => 'Passwort', 'pro_plan_product' => 'Pro Plan', @@ -343,12 +343,12 @@ $LANG = array( 'converted_to_invoice' => 'Angebot erfolgreich in Rechnung umgewandelt', 'quote_subject' => 'Neues Angebot :number von :account', 'quote_message' => 'Klicken Sie auf den folgenden Link um das Angebot über :amount anzuschauen.', - 'quote_link_message' => 'Klicke auf den folgenden Link um das Angebot deines Kunden anzuschauen:', + 'quote_link_message' => 'Um das Angebot anzuschauen, bitte auf den folgenden Link klicken:', 'notification_quote_sent_subject' => 'Angebot :invoice wurde an :client versendet', 'notification_quote_viewed_subject' => 'Angebot :invoice wurde von :client angeschaut', 'notification_quote_sent' => 'Der folgende Kunde :client erhielt das Angebot :invoice über :amount.', 'notification_quote_viewed' => 'Der folgende Kunde :client hat sich das Angebot :client über :amount angesehen.', - 'session_expired' => 'Deine Sitzung ist abgelaufen.', + 'session_expired' => 'Ihre Sitzung ist abgelaufen.', 'invoice_fields' => 'Rechnungsfelder', 'invoice_options' => 'Rechnungsoptionen', 'hide_paid_to_date' => '"Bereits gezahlt" ausblenden', @@ -372,7 +372,7 @@ $LANG = array( 'confirm_recurring_email_invoice' => 'Wiederkehrende Rechnung ist aktiv. Bis du sicher, dass du diese Rechnung weiterhin als E-Mail verschicken möchtest?', 'confirm_recurring_email_invoice_not_sent' => 'Sind Sie sicher, dass Sie diese wiederkehrende Rechnung aktivieren wollen?', 'cancel_account' => 'Konto kündigen', - 'cancel_account_message' => 'Warnung: Diese Aktion wird dein Konto unwiderruflich löschen.', + 'cancel_account_message' => 'Warnung: Diese Aktion wird Ihr Konto unwiderruflich löschen.', 'go_back' => 'Zurück', 'data_visualizations' => 'Datenvisualisierungen', 'sample_data' => 'Beispieldaten werden angezeigt', @@ -591,7 +591,7 @@ $LANG = array( 'pro_plan_call_to_action' => 'Jetzt Upgraden!', 'pro_plan_feature1' => 'Unlimitierte Anzahl Kunden erstellen', 'pro_plan_feature2' => 'Zugriff auf 10 schöne Rechnungsdesigns', - 'pro_plan_feature3' => 'Benutzerdefinierte URLs - "DeineFirma.InvoiceNinja.com"', + 'pro_plan_feature3' => 'Benutzerdefinierte URLs - "IhreFirma.InvoiceNinja.com"', 'pro_plan_feature4' => '"Erstellt durch Invoice Ninja" entfernen', 'pro_plan_feature5' => 'Multi-Benutzer Zugriff & Aktivitätstracking', 'pro_plan_feature6' => 'Angebote & pro-forma Rechnungen erstellen', @@ -601,7 +601,7 @@ $LANG = array( 'break_duration' => 'Pause', 'edit_details' => 'Details bearbeiten', 'work' => 'Arbeiten', - 'timezone_unset' => 'Bitte :link um deine Zeitzone zu setzen', + 'timezone_unset' => 'Bitte :link um Ihre Zeitzone zu setzen', 'click_here' => 'hier klicken', 'email_receipt' => 'Zahlungsbestätigung an Kunden per E-Mail senden', 'created_payment_emailed_client' => 'Zahlung erfolgreich erstellt und Kunde per E-Mail benachrichtigt', @@ -659,7 +659,7 @@ $LANG = array( 'primary_user' => 'Primärer Benutzer', 'help' => 'Hilfe', 'playground' => 'Spielplatz', - 'support_forum' => 'Support Forums', + 'support_forum' => 'Support-Foren', 'invoice_due_date' => 'Fälligkeitsdatum', 'quote_due_date' => 'Gültig bis', 'valid_until' => 'Gültig bis', @@ -676,7 +676,7 @@ $LANG = array( 'status_all' => 'Alle', 'show_line_item_tax' => 'Steuern für Belegpositionen in der jeweiligen Zeile anzeigen', 'iframe_url' => 'Webseite', - 'iframe_url_help1' => 'Kopiere den folgenden Code in eine Seite auf deiner Website.', + 'iframe_url_help1' => 'Kopieren Sie den folgenden Code auf eine Seite Ihrer Website.', 'iframe_url_help2' => 'Du kannst diese Funktion testen, in dem du für eine Rechnung \'Als Empfänger betrachten\'. anklickst.', 'auto_bill' => 'Automatische Verrechnung', 'military_time' => '24-Stunden-Zeit', @@ -753,7 +753,7 @@ $LANG = array( 'activity_7' => ':contact schaute Rechnung :invoice für :client an', 'activity_8' => ':user archivierte Rechnung :invoice', 'activity_9' => ':user löschte Rechnung :invoice', - 'activity_10' => ':user entered payment :payment for :payment_amount on invoice :invoice for :client', + 'activity_10' => ':user hat die Zahlung :payment für :payment _amount der Rechnung :invoice für Kunde :client eingegeben', 'activity_11' => ':user aktualisierte Zahlung :payment', 'activity_12' => ':user archivierte Zahlung :payment', 'activity_13' => ':user löschte Zahlung :payment', @@ -866,13 +866,13 @@ $LANG = array( 'template_help_title' => 'Vorlagen Hilfe', 'template_help_1' => 'Verfügbare Variablen:', 'email_design_id' => 'E-Mail-Stil', - 'email_design_help' => 'Lass deine E-Mails durch die Verwendung von HTML Layouts professioneller aussehen.', + 'email_design_help' => 'Lassen Sie Ihre E-Mails durch die Verwendung von HTML-Layouts professioneller aussehen.', 'plain' => 'Einfach', 'light' => 'Hell', 'dark' => 'Dunkel', 'industry_help' => 'Wird genutzt um Vergleiche zwischen den Durchschnittswerten von Firmen ähnlicher Größe und Branche ermitteln zu können.', 'subdomain_help' => 'Passen Sie die Rechnungslink-Subdomäne an oder stellen Sie die Rechnung auf Ihrer eigenen Webseite zur Verfügung.', - 'website_help' => 'Zeige die Rechnung als iFrame auf deiner eigenen Webseite an', + 'website_help' => 'Zeigt die Rechnung als Iframe auf Ihrer eigenen Webseite an', 'invoice_number_help' => 'Geben Sie einen Präfix oder ein benutzerdefiniertes Schema an, um die Rechnungsnummer dynamisch zu erzeugen.', 'quote_number_help' => 'Geben Sie einen Präfix oder ein benutzerdefiniertes Schema an, um die Angebotsnummer dynamisch zu erzeugen.', 'custom_client_fields_helps' => 'Füge ein Kundenfeld hinzu. Optional kann die Feldbezeichnung und der Feldwert auch in PDF-Dokumenten ausgegeben werden.', @@ -881,7 +881,7 @@ $LANG = array( 'custom_invoice_charges_helps' => 'Füge ein Rechnungsgebührenfeld hinzu. Erfasse die Kosten, wenn eine neue Rechnung erstellt wird und addiere sie in den Zwischensummen der Rechnung.', 'token_expired' => 'Validierungstoken ist abgelaufen. Bitte probieren Sie es erneut.', 'invoice_link' => 'Link zur Rechnung', - 'button_confirmation_message' => 'Bestätige deine E-Mail-Adresse.', + 'button_confirmation_message' => 'Bestätigen Sie Ihre E-Mail-Adresse.', 'confirm' => 'Bestätigen', 'email_preferences' => 'E-Mail-Einstellungen', 'created_invoices' => ':count Rechnung(en) erfolgreich erstellt', @@ -1013,9 +1013,9 @@ $LANG = array( 'enable_https' => 'Wir empfehlen dringend HTTPS zu verwenden, um Kreditkarten online zu akzeptieren.', 'quote_issued_to' => 'Angebot ausgefertigt an', 'show_currency_code' => 'Währungscode', - 'free_year_message' => 'Dein Account wurde für ein Jahr kostenlos auf den PRO-Tarif hochgestuft.', + 'free_year_message' => 'Ihr Account wurde für ein Jahr kostenlos auf den Pro-Tarif hochgestuft.', 'trial_message' => 'Ihr Account erhält zwei Wochen Probemitgliedschaft für unseren Pro-Plan.', - 'trial_footer' => 'Die Testversion deines Pro-Tarifs endet in :count Tagen. :link jetzt hochstufen.', + 'trial_footer' => 'Die Testversion Ihres Pro-Tarifs endet in :count Tagen. :link jetzt upgraden.', 'trial_footer_last_day' => 'Heute ist der letzte Tag Ihrer kostenlosen Probezeit, :link um das Upgrade jetzt durchzuführen.', 'trial_call_to_action' => 'Kostenlose Probezeit starten', 'trial_success' => 'Erfolgreich eine 2-Wochen Testversion aktiviert', @@ -1023,7 +1023,7 @@ $LANG = array( 'white_label_text' => 'Kaufen Sie eine Ein-Jahres-"White Label"-Lizenz für $:price um das Invoice Ninja Branding von den Rechnungen und dem Kundenportal zu entfernen.', - 'user_email_footer' => 'Um deine E-Mail-Benachrichtigungen anzupassen besuche bitte :link', + 'user_email_footer' => 'Um Ihre E-Mail-Benachrichtigungen anzupassen, klicken Sie bitte auf :link', 'reset_password_footer' => 'Wenn du das Zurücksetzen des Passworts nicht beantragt hast, benachrichtige bitte unseren Support: :email', 'limit_users' => 'Entschuldige, das würde das Limit von :limit Benutzern überschreiten', 'more_designs_self_host_header' => 'Erhalte 6 zusätzliche Rechnungsdesigns für nur $:price', @@ -1149,7 +1149,7 @@ $LANG = array( 'plan_status' => 'Plan Status', 'plan_upgrade' => 'Upgraden', - 'plan_change' => 'Manage Plan', + 'plan_change' => 'Tarif verwalten', 'pending_change_to' => 'Änderungen zu', 'plan_changes_to' => ':plan am :date', 'plan_term_changes_to' => ':plan (:term) am :date', @@ -1821,8 +1821,8 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'bot_emailed_notify_paid' => 'Ich schicke Ihnen nach der Zahlung eine E-Mail.', 'add_product_to_invoice' => 'Füge 1 :product hinzu', 'not_authorized' => 'Du bist nicht autorisiert', - 'bot_get_code' => 'Danke! Ich habe dir eine E-Mail mit deinem Sicherheitscode geschickt.', - 'bot_welcome' => 'Das war es schon, dein Account ist verifiziert.
', + 'bot_get_code' => 'Danke! Ich habe Ihnen eine E-Mail mit Ihrem Sicherheitscode gesendet.', + 'bot_welcome' => 'Das war es schon, Ihr Account ist verifiziert.
', 'email_not_found' => 'Ich konnte keinen verfügbaren Account für :email finden', 'invalid_code' => 'Der Code ist nicht korrekt', 'security_code_email_subject' => 'Sicherheitscode für Invoice Ninja Bot', @@ -1968,7 +1968,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'realtime_preview' => 'Echtzeit Vorschau', 'realtime_preview_help' => 'Echtzeit Aktualisierung der PDF Vorschau während der Rechnungs-Bearbeitung.
Deaktivieren um die Performance während des Bearbeitens zu verbessern.', 'live_preview_help' => 'Live PDF Vorschau auf Rechnungsseite anzeigen.', - 'force_pdfjs_help' => 'Ersetze den eingebauten PDF-Viewer in :chrome_link und :firefox_link.
Aktiviere dies, wenn dein Browser die PDFs automatisch herunterlädt.', + 'force_pdfjs_help' => 'Ersetze den eingebauten PDF-Viewer in :chrome_link und :firefox_link.
Aktivieren Sie dies, wenn Ihr Browser die PDFs automatisch herunterlädt.', 'force_pdfjs' => 'Verhindere Download', 'redirect_url' => 'Umleitungs-URL', 'redirect_url_help' => 'Gebe optional eine URL an, zu der umgeleitet werden soll, wenn eine Zahlung getätigt wurde.', @@ -2003,8 +2003,8 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'https' => 'HTTPS', 'require' => 'Benötigt', 'license_expiring' => 'Anmerkung: Ihre Lizenz läuftin :count Tagen ab, :link um sie zu erneuern.', - 'security_confirmation' => 'Deine E-Mail Adresse wurde bestätigt.', - 'white_label_expired' => 'Deine White Label Lizenz ist ausgelaufen, bitte denke darüber nach diese zu verlängern um unser Projekt zu unterstützen.', + 'security_confirmation' => 'Ihre E-Mail Adresse wurde bestätigt.', + 'white_label_expired' => 'Ihre White-Label-Lizenz ist ausgelaufen. Bitte denken Sie darüber nach, diese zu verlängern, um unser Projekt zu unterstützen.', 'renew_license' => 'Verlängere die Lizenz', 'iphone_app_message' => 'Berücksichtigen Sie unsere :link herunterzuladen', 'iphone_app' => 'iPhone-App', @@ -2094,7 +2094,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'profile' => 'Profil', 'payment_type_help' => 'Setze die Standard manuelle Zahlungsmethode.', 'industry_Construction' => 'Bauwesen', - 'your_statement' => 'Deine Abrechnung', + 'your_statement' => 'Ihre Abrechnung', 'statement_issued_to' => 'Abrechnung ausgestellt für', 'statement_to' => 'Abrechnung für', 'customize_options' => 'Optionen anpassen', @@ -2269,7 +2269,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'product_notes' => 'Produktnotizen', 'app_version' => 'App-Version', 'ofx_version' => 'OFX-Version', - 'error_app_key_set_to_default' => 'Fehler: APP_KEY ist auf einen Standardwert gesetzt. Um ihn zu aktualisieren, sichere deine Datenbank und führe dann php artisan ninja:update-key aus', + 'error_app_key_set_to_default' => 'Fehler: APP_KEY ist auf einen Standardwert gesetzt. Um ihn zu aktualisieren, sicheren Sie Ihre Datenbank und führen dann php artisan ninja:update-key aus', 'charge_late_fee' => 'Verspätungszuschlag berechnen', 'late_fee_amount' => 'Höhe des Verspätungszuschlags', 'late_fee_percent' => 'Verspätungszuschlag Prozent', @@ -2401,8 +2401,11 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'currency_cuban_peso' => 'Kubanischer Peso', 'currency_bz_dollar' => 'Belize-Dollar', 'currency_libyan_dinar' => 'Libyscher Dinar', - 'currency_silver_troy_ounce' => 'Silver Troy Ounce', - 'currency_gold_troy_ounce' => 'Gold Troy Ounce', + 'currency_silver_troy_ounce' => 'Silberne Feinunze', + 'currency_gold_troy_ounce' => 'Goldene Feinunze', + 'currency_nicaraguan_córdoba' => 'Nicaraguan Córdoba', + 'currency_malagasy_ariary' => 'Malagasy ariary', + "currency_tongan_pa_anga" => "Tongan Pa'anga", 'review_app_help' => 'Wir hoffen, dass Ihnen die App gefällt. Wenn Sie :link in Betracht ziehen würden, wären wir Ihnen sehr dankbar!', 'writing_a_review' => 'Schreiben einer Rezension', @@ -2426,10 +2429,10 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'item_notes' => 'Beschreibung', 'item_cost' => 'Preis', 'item_quantity' => 'Menge', - 'item_tax_rate' => 'Steuern für Position', - 'item_tax_name' => 'Steuern', - 'item_tax1' => 'Position Steuern 1', - 'item_tax2' => 'Position Steuern 2', + 'item_tax_rate' => 'Steuersatz für Position', + 'item_tax_name' => 'Name der Steuer für Position', + 'item_tax1' => 'Positions-Steuer 1', + 'item_tax2' => 'Positions-Steuer 2', 'delete_company' => 'Firma löschen', 'delete_company_help' => 'Die Firma unwiderruflich mit allen Daten löschen.', @@ -2451,7 +2454,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'deleted_company' => 'Unternehmen erfolgreich gelöscht', 'deleted_account' => 'Konto erfolgreich gelöscht', 'deleted_company_details' => 'Ihre Firma (:account) wurde erfolgreich gelöscht.', - 'deleted_account_details' => 'Dein Konto (:account) wurde erfolgreich gelöscht.', + 'deleted_account_details' => 'Ihr Konto (:account) wurde erfolgreich gelöscht.', 'alipay' => 'Alipay', 'sofort' => 'SOFORT-Überweisung', @@ -2517,7 +2520,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'custom_value1' => 'Benutzerdefinierter Wert 1', 'custom_value2' => 'Benutzerdefinierter Wert 2', 'enable_two_factor' => 'Zwei-Faktor-Authentifizierung', - 'enable_two_factor_help' => 'Bestätige beim Anmelden mit deinem Telefon deine Identität', + 'enable_two_factor_help' => 'Bestätigen Sie beim Anmelden mit Ihrem Telefon Ihre Identität', 'two_factor_setup' => 'Zwei-Faktor Einrichtung', 'two_factor_setup_help' => 'Barcode mit :link kompatibler App scannen.', 'one_time_password' => 'Einmaliges Passwort', @@ -2529,7 +2532,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'self_host_login' => 'Eigenes-Hosting Anmeldung', 'set_self_hoat_url' => 'Eigenes-Hosting URL', 'local_storage_required' => 'Fehler: Lokaler Speicherplatz ist nicht verfügbar.', - 'your_password_reset_link' => 'Dein Passwort zurücksetzen Link', + 'your_password_reset_link' => 'Ihr Passwort-zurücksetzen-Link', 'subdomain_taken' => 'Die Subdomäne wird bereits verwendet', 'client_login' => 'Kundenanmeldung', 'converted_amount' => 'Umgerechneter Betrag', @@ -2744,7 +2747,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'purging' => 'Bereinigung', 'warning_local_refund' => 'Die Rückerstattung wird in der App erfasst, aber NICHT vom Zahlungs-Gateway verarbeitet.', 'email_address_changed' => 'E-Mail Adresse wurde geändert', - 'email_address_changed_message' => 'Die E-Mail-Adresse für dein Konto wurde von :old_email auf :new_email geändert.', + 'email_address_changed_message' => 'Die E-Mail-Adresse für Ihr Konto wurde von :old_email auf :new_email geändert.', 'test' => 'Test', 'beta' => 'Beta', 'gmp_required' => 'Exportieren zu ZIP benötigt die GMP Erweiterung', @@ -3210,7 +3213,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'welcome_to_the_new_version' => 'Herzlich willkommen zur neuen Version von Invoice Ninja', 'next_step_data_download' => 'Im nächsten Schritt können Sie Ihre Daten für die Migration herunterladen.', 'download_data' => 'Drücke den Button darunter, um die Daten herunterzuladen.', - 'migration_import' => 'Fantastisch! Jetzt bist du bereit, die Migrationsdaten zu importieren. Gehe zu deiner neuen Installation, um deine Daten zu importieren.', + 'migration_import' => 'Fantastisch! Jetzt sind Sie bereit, die Migrationsdaten zu importieren. Gehen Sie zu Ihrer neuen Installation, um Ihre Daten zu importieren.', 'continue' => 'Weiter', 'company1' => 'Benutzerdefinierte Firma 1', 'company2' => 'Benutzerdefinierte Firma 2', @@ -3321,7 +3324,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese 'three_tax_rates' => 'Drei Steuersätze', 'default_tax_rate' => 'Standard-Steuersatz', 'invoice_tax' => 'Rechnungssteuer', - 'line_item_tax' => 'Belegposition Steuer', + 'line_item_tax' => 'Belegpositions-Steuer', 'inclusive_taxes' => 'Inklusive Steuern', 'invoice_tax_rates' => 'Rechnungs-Steuersätze', 'item_tax_rates' => 'Element-Steuersätze', @@ -3681,9 +3684,9 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'send_date' => 'Versanddatum', 'auto_bill_on' => 'Automatische Rechnungsstellung zum', 'minimum_under_payment_amount' => 'Minimaler Unterzahlungsbetrag', - 'allow_over_payment' => 'Überzahlung zulassen', + 'allow_over_payment' => 'Überbezahlung erlauben', 'allow_over_payment_help' => 'Überzahlungen zulassen, beispielsweise Trinkgelder', - 'allow_under_payment' => 'Unterzahlung zulassen', + 'allow_under_payment' => 'Unterbezahlung erlauben', 'allow_under_payment_help' => 'Teilzahlungen zulassen', 'test_mode' => 'Test Modus', 'calculated_rate' => 'Berechneter Satz', @@ -3748,12 +3751,12 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'activity_66' => ':user mailte endlose Mahnung für Rechnung :invoice an :contact', 'expense_category_id' => 'Ausgabenkategorie ID', 'view_licenses' => 'Lizenzen anzeigen', - 'fullscreen_editor' => 'Vollbild Editor', - 'sidebar_editor' => 'Seitenmenü Editor', + 'fullscreen_editor' => 'Vollbild-Editor', + 'sidebar_editor' => 'Seitenmenü-Editor', 'please_type_to_confirm' => 'Bitte geben Sie ":value" zur Bestätigung ein', 'purge' => 'Bereinigen', 'clone_to' => 'Duplizieren zu', - 'clone_to_other' => 'Zu anderen duplizieren', + 'clone_to_other' => 'Als anderen Typ duplizieren', 'labels' => 'Beschriftung', 'add_custom' => 'Beschriftung hinzufügen', 'payment_tax' => 'Steuer-Zahlung', @@ -3762,9 +3765,9 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'paid_invoices_are_locked' => 'Bezahlte Rechnungen sind gesperrt', 'source_code' => 'Quellcode', 'app_platforms' => 'App-Plattformen', - 'archived_task_statuses' => ' :value Aufgaben Stati erfolgreich archiviert', - 'deleted_task_statuses' => ' :value Aufgaben Stati erfolgreich gelöscht', - 'restored_task_statuses' => ' :value Aufgaben Stati erfolgreich wiederhergestellt', + 'archived_task_statuses' => ' :value Aufgaben-Status erfolgreich archiviert', + 'deleted_task_statuses' => ' :value Aufgaben-Status erfolgreich gelöscht', + 'restored_task_statuses' => ' :value Aufgaben-Status erfolgreich wiederhergestellt', 'deleted_expense_categories' => ' :value Ausgabenkategorien erfolgreich gelöscht', 'restored_expense_categories' => ':value Ausgabenkategorien erfolgreich wiederhergestellt', 'archived_recurring_invoices' => ':value Wiederkehrende Rechnung erfolgreich archiviert', @@ -4070,7 +4073,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'self_update_not_available' => 'Integrierter Updater auf diesem System nicht verfügbar.', 'user_detached' => 'Nutzer wurden vom Unternehmen entkoppelt', 'create_webhook_failure' => 'Webhook konnte nicht erstellt werden', - 'payment_message_extended' => 'Vielen Dank für deine Zahlung von :amount für die Rechnung :invoice', + 'payment_message_extended' => 'Vielen Dank für Ihre Zahlung von :amount für die Rechnung :invoice', 'online_payments_minimum_note' => 'Hinweis: Online-Zahlungen werden nur unterstützt, wenn der Betrag größer als 1€ oder der entsprechende Währungsbetrag ist.', 'payment_token_not_found' => 'Zahlungstoken nicht gefunden, bitte versuchen Sie es erneut. Wenn das Problem weiterhin besteht, versuchen Sie es mit einer anderen Zahlungsmethode', 'vendor_address1' => 'Straße Lieferant', @@ -4121,7 +4124,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'activate_company_help' => 'E-Mails, wiederkehrende Rechnungen und Benachrichtigungen aktivieren', 'an_error_occurred_try_again' => 'Ein Fehler ist aufgetreten, bitte versuchen Sie es erneut.', 'please_first_set_a_password' => 'Bitte vergeben Sie zuerst ein Passwort.', - 'changing_phone_disables_two_factor' => 'Achtung: Das Ändern deiner Telefonnummer wird die Zwei-Faktor-Authentifizierung deaktivieren', + 'changing_phone_disables_two_factor' => 'Achtung: Das Ändern Ihrer Telefonnummer wird die Zwei-Faktor-Authentifizierung deaktivieren', 'help_translate' => 'Hilf mit beim Übersetzen', 'please_select_a_country' => 'Bitte wählen Sie ein Land', 'disabled_two_factor' => '2FA erfolgreich deaktiviert', @@ -4327,7 +4330,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'include_drafts' => 'Entwürfe einschließen', 'include_drafts_help' => 'Entwürfe von Aufzeichnungen in Berichte einbeziehen', 'is_invoiced' => 'Ist in Rechnung gestellt', - 'change_plan' => 'Manage Plan', + 'change_plan' => 'Tarif verwalten', 'persist_data' => 'Daten aufbewahren', 'customer_count' => 'Kundenzahl', 'verify_customers' => 'Kunden überprüfen', @@ -4488,17 +4491,17 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'client_currency' => 'Kundenwährung', 'company_currency' => 'Firmenwährung', 'custom_emails_disabled_help' => 'Um Spam zu verhindern braucht es ein Upgrade zu einem bezahlten Account um das E-Mail anzupassen.', - 'upgrade_to_add_company' => 'Upgrade deinen Tarif um weitere Firmen hinzuzufügen', + 'upgrade_to_add_company' => 'Wechseln Sie Ihren Tarif, um weitere Firmen hinzufügen zu können', 'file_saved_in_downloads_folder' => 'Die Datei wurde im Downloads-Ordner gespeichert', 'small' => 'Klein', - 'quotes_backup_subject' => 'Deine Angebote stehen zum Download bereit', + 'quotes_backup_subject' => 'Ihre Angebote stehen zum Download bereit', 'credits_backup_subject' => 'Die Gutschriften stehen zum Download bereit', - 'document_download_subject' => 'Deine Dokumente stehen zum Download bereit', + 'document_download_subject' => 'Ihre Dokumente stehen zum Download bereit', 'reminder_message' => 'Mahnung für Rechnung :number über :balance', 'gmail_credentials_invalid_subject' => 'Senden mit ungültigen GMail-Anmeldedaten', 'gmail_credentials_invalid_body' => 'Ihre GMail-Anmeldedaten sind nicht korrekt. Bitte melden Sie sich im Administratorportal an und navigieren Sie zu Einstellungen > Benutzerdetails und trennen Sie Ihr GMail-Konto und verbinden Sie es erneut. Wir werden Ihnen diese Benachrichtigung täglich senden, bis das Problem behoben ist', 'total_columns' => 'Felder insgesamt', - 'view_task' => 'Aufgabe anzeugen', + 'view_task' => 'Aufgabe anzeigen', 'cancel_invoice' => 'Stornieren', 'changed_status' => 'Erfolgreich Aufgabenstatus geändert', 'change_status' => 'Status ändern', @@ -4511,7 +4514,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'enable_pdf_markdown' => 'Markdown in PDFs verwenden', 'json_help' => 'Achtung: JSON-Dateien, die mit v4 der App erstellt wurden, werden nicht unterstützt', 'release_notes' => 'Versionshinweise', - 'upgrade_to_view_reports' => 'Upgrade deinen Tarif um Berichte anzusehen', + 'upgrade_to_view_reports' => 'Wechseln Sie Ihren Tarif, um Berichte ansehen zu können', 'started_tasks' => ':value Aufgaben erfolgreich gestartet', 'stopped_tasks' => ':value Aufgaben erfolgreich angehalten', 'approved_quote' => 'Angebot erfolgreich angenommen', @@ -4656,8 +4659,8 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'search_purchase_order' => 'Bestellung suchen', 'search_purchase_orders' => 'Bestellungen suchen', 'login_url' => 'Login-URL', - 'enable_applying_payments' => 'Aktivieren Sie die Anwendung von Zahlungen', - 'enable_applying_payments_help' => 'Unterstützung bei der separaten Erstellung und Anwendung von Zahlungen', + 'enable_applying_payments' => 'Manuelle Überbezahlungen', + 'enable_applying_payments_help' => 'Erlaubt das manuellen Hinzufügen eines Betrags, der über dem Betrag zur Zahlung liegt', 'stock_quantity' => 'Lagerbestand', 'notification_threshold' => 'Mindesbestandsmeldung', 'track_inventory' => 'Inventar verwalten', @@ -4714,7 +4717,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'enter_phone_number' => 'Bitte geben Sie eine Telefonnummer an', 'invalid_phone_number' => 'Ungültige Telefonnummer', 'verify_phone_number' => 'Telefonnummer verifizieren', - 'verify_phone_number_help' => 'Bitte verifiziere deine Telefonnummer, um E-Mails versenden zu können.', + 'verify_phone_number_help' => 'Bitte verifizieren Sie Ihre Telefonnummer, um E-Mails versenden zu können.', 'merged_clients' => 'Erfolgreich Kunden zusammengefasst', 'merge_into' => 'Zusammenführen in', 'php81_required' => 'Hinweis: v5.5 benötigt PHP 8.1', @@ -4952,7 +4955,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'sync_from' => 'Synchronisieren von', 'gateway_payment_text' => 'Rechnungen: :invoices über :amount für Kunde :client', 'gateway_payment_text_no_invoice' => 'Zahlung ohne Rechnung für Kunde :client über :amount', - 'click_to_variables' => 'Click here to see all variables.', + 'click_to_variables' => 'Hier klicken, um alle Variablen zu sehen.', 'ship_to' => 'Liefern an', 'stripe_direct_debit_details' => 'Bitte überweisen Sie den Betrag an obenstehende Bankverbindung', 'branch_name' => 'Zweigstelle', @@ -5076,7 +5079,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'e_invoice' => 'E-Rechnung', 'light_dark_mode' => 'Tag-/Nachtmodus', 'activities' => 'Aktivitäten', - 'recent_transactions' => "Here are your company's most recent transactions:", + 'recent_transactions' => "Hier sind die aktuellsten Transaktionen Ihrer Firma:", 'country_Palestine' => "Palestinensa", 'country_Taiwan' => 'Taiwan', 'duties' => 'Aufgaben', @@ -5087,7 +5090,7 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'enable_auto_bill' => 'Automatische Bezahlung aktivieren', 'email_count_invoices' => ':count Rechnungen versenden', 'invoice_task_item_description' => 'Rechnungspositionsbeschreibung', - 'invoice_task_item_description_help' => 'Add the item description to the invoice line items', + 'invoice_task_item_description_help' => 'Element-Beschreibung zu den Rechnungs-Positionen hinzufügen', 'next_send_time' => 'Nächster Versandzeitpunkt', 'uploaded_certificate' => 'Das Zertifikat wurde erfolgreich hochgeladen', 'certificate_set' => 'Zertifikat hochgeladen', @@ -5097,8 +5100,8 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'upload_certificate' => 'Zertifikat hochladen', 'certificate_passphrase' => 'Zertifikat Passwort', 'valid_vat_number' => 'Gültige USt-ID', - 'react_notification_link' => 'React Notification Links', - 'react_notification_link_help' => 'Admin emails will contain links to the react application', + 'react_notification_link' => 'React-Benachrichtigungslinks', + 'react_notification_link_help' => 'Admin-E-Mails werden Links zur React-Applikation beinhalten', 'show_task_billable' => 'Abrechenbare Aufgaben anzeigen', 'credit_item' => 'Gutschriftsposition', 'drop_file_here' => 'Datei hier hineinziehen', @@ -5106,38 +5109,38 @@ https://invoiceninja.github.io/docs/migration/#troubleshooting', 'camera' => 'Kamera', 'gallery' => 'Gallerie', 'project_location' => 'Projektstandort', - 'add_gateway_help_message' => 'Add a payment gateway (ie. Stripe, WePay or PayPal) to accept online payments', + 'add_gateway_help_message' => 'Payment-Gateway hinzufügen (z. B. Stripe, WePay oder PayPal), um Online-Zahlungen anbieten zu können', 'lang_Hungarian' => 'Ungarisch', - 'use_mobile_to_manage_plan' => 'Use your phone subscription settings to manage your plan', - 'item_tax3' => 'Item Tax3', - 'item_tax_rate1' => 'Item Tax Rate 1', - 'item_tax_rate2' => 'Item Tax Rate 2', - 'item_tax_rate3' => 'Item Tax Rate 3', + 'use_mobile_to_manage_plan' => 'Verwenden der Telefon-Abonnementeinstellungen, um Ihren Tarif zu verwalten', + 'item_tax3' => 'Positions-Steuer 3', + 'item_tax_rate1' => 'Positions-Steuersatz 1', + 'item_tax_rate2' => 'Positions-Steuersatz 2', + 'item_tax_rate3' => 'Positions-Steuersatz 3', 'buy_price' => 'Einkaufspreis', 'country_Macedonia' => 'Mazedonien', - 'admin_initiated_payments' => 'Admin Initiated Payments', - 'admin_initiated_payments_help' => 'Support entering a payment in the admin portal without an invoice', - 'paid_date' => 'Paid Date', - 'downloaded_entities' => 'An email will be sent with the PDFs', + 'admin_initiated_payments' => 'Administrator-initiierte Zahlungen', + 'admin_initiated_payments_help' => 'Aktivieren von Zahlungen ohne Rechnung im Admin-Portal', + 'paid_date' => 'Zahlungsdatum', + 'downloaded_entities' => 'Die PDFs werden per E-Mail versendet', 'lang_French - Swiss' => 'Französisch - Schweiz', 'currency_swazi_lilangeni' => 'Lilangeni', - 'income' => 'Income', + 'income' => 'Einnahmen', 'amount_received_help' => 'Enter a value here if the total amount received was MORE than the invoice amount, or when recording a payment with no invoices. Otherwise this field should be left blank.', 'vendor_phone' => 'Lieferanten-Telefonnummer', 'mercado_pago' => 'Mercado Pago', - 'mybank' => 'MyBank', - 'paypal_paylater' => 'Pay in 4', - 'paid_date' => 'Paid Date', - 'district' => 'District', + 'mybank' => 'MeineBank', + 'paypal_paylater' => 'In vier Schritten bezahlen', + 'paid_date' => 'Zahlungsdatum', + 'district' => 'Bezirk', 'region' => 'Region', - 'county' => 'County', + 'county' => 'Landkreis', 'tax_details' => 'Steuerdetails', - 'activity_10_online' => ':contact entered payment :payment for invoice :invoice for :client', - 'activity_10_manual' => ':user entered payment :payment for invoice :invoice for :client', + 'activity_10_online' => ':contact hat die Zahlung :payment für die Rechnung :invoice des Kunden :client eingegeben', + 'activity_10_manual' => ':user hat die Zahlung :payment für die Rechnung :invoice des Kunden :client eingegeben', 'default_payment_type' => 'Standard Zahlungsart', - 'number_precision' => 'Number precision', - 'number_precision_help' => 'Controls the number of decimals supported in the interface', - 'is_tax_exempt' => 'Tax Exempt', + 'number_precision' => 'Genauigkeit der Nummern', + 'number_precision_help' => 'Steuert die Anzahl Dezimalstellen in der Schnittstelle', + 'is_tax_exempt' => 'Steuerbefreit', 'drop_files_here' => 'Datei hier hineinziehen', 'upload_files' => 'Dateien hochladen', 'download_e_invoice' => 'E-Rechnung herunterladen', @@ -5149,28 +5152,47 @@ Leistungsempfängers', 'currency_nicaraguan_cordoba' => 'Córdoba Oro', 'public' => 'Öffentlich', 'private' => 'Privat', - 'image' => 'Image', + 'image' => 'Bild', 'other' => 'Andere', - 'linked_to' => 'Linked To', - 'file_saved_in_path' => 'The file has been saved in :path', - 'unlinked_transactions' => 'Successfully unlinked :count transactions', - 'unlinked_transaction' => 'Successfully unlinked transaction', - 'view_dashboard_permission' => 'Allow user to access the dashboard, data is limited to available permissions', - 'marked_sent_credits' => 'Successfully marked credits sent', - 'show_document_preview' => 'Show Document Preview', - 'cash_accounting' => 'Cash accounting', - 'click_or_drop_files_here' => 'Click or drop files here', - 'set_public' => 'Set public', - 'set_private' => 'Set private', - 'individual' => 'Individual', + 'linked_to' => 'Verknüpft mit', + 'file_saved_in_path' => 'Die Datei wurde unter :path gespeichert', + 'unlinked_transactions' => 'Verknüpfung zu :count Transaktionen wurde erfolgreich entfernt', + 'unlinked_transaction' => 'Verknüpfung zu einer Transaktion wurde erfolgreich entfernt', + 'view_dashboard_permission' => 'Nutzern erlauben, auf das Dashboard zuzugreifen. Die Berechtigungen der Nutzer limitieren die angezeigten Daten.', + 'marked_sent_credits' => 'Gutschrift erfolgreich als versendet markiert', + 'show_document_preview' => 'Dokumentenvorschau anzeigen', + 'cash_accounting' => 'Kassenbuchführung', + 'click_or_drop_files_here' => 'Hier klicken oder Dateien ablegen', + 'set_public' => 'Als "öffentlich" setzen', + 'set_private' => 'Als "privat" setzen', + 'individual' => 'Indiviuell', 'business' => 'Business', - 'partnership' => 'partnership', - 'trust' => 'Trust', + 'partnership' => 'Partnerschaft', + 'trust' => 'Vertrauen', 'charity' => 'Charity', - 'government' => 'Government', - 'in_stock_quantity' => 'Stock quantity', - 'vendor_contact' => 'Vendor Contact', - + 'government' => 'Regierung', + 'in_stock_quantity' => 'Lagerbestand', + 'vendor_contact' => 'Lieferantenkontakt', + 'expense_status_4' => 'Unbezahlt', + 'expense_status_5' => 'Bezahlt', + 'ziptax_help' => 'Note: this feature requires a Zip-Tax API key to lookup US sales tax by address', + 'cache_data' => 'Cache Data', + 'unknown' => 'Unbekannt', + 'webhook_failure' => 'Webhook-Fehler', + 'email_opened' => 'E-Mail geöffnet', + 'email_delivered' => 'E-Mail zugestellt', + 'log' => 'Log', + 'classification' => 'Klassifizierung', + 'stock_quantity_number' => 'Stock :quantity', + 'upcoming' => 'Bevorstehend', + 'client_contact' => 'Kundenkontakt', + 'uncategorized' => 'Unkategorisiert', + 'login_notification' => 'Login Notification', + 'login_notification_help' => 'Sends an email notifying that a login has taken place.', + 'payment_refund_receipt' => 'Payment Refund Receipt # :number', + 'payment_receipt' => 'Payment Receipt # :number', + 'load_template_description' => 'The template will be applied to following:', + 'run_template' => 'Run template', ); return $LANG; diff --git a/lang/es_ES/texts.php b/lang/es_ES/texts.php index 0246635c8928..8b8904e3f243 100644 --- a/lang/es_ES/texts.php +++ b/lang/es_ES/texts.php @@ -652,7 +652,7 @@ $LANG = array( 'primary_user' => 'Usuario Principal', 'help' => 'Ayuda', 'playground' => 'playground', - 'support_forum' => 'Support Forums', + 'support_forum' => 'Foros de soporte', 'invoice_due_date' => 'Fecha Límite de Pago', 'quote_due_date' => 'Válido hasta', 'valid_until' => 'Válido hasta', @@ -1138,7 +1138,7 @@ $LANG = array( 'plan_status' => 'Estado del Plan', 'plan_upgrade' => 'Mejorar', - 'plan_change' => 'Manage Plan', + 'plan_change' => 'Gestionar plan', 'pending_change_to' => 'Cambios para', 'plan_changes_to' => ':plan en :date', 'plan_term_changes_to' => ':plan (:term) el :date', @@ -2392,6 +2392,9 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c 'currency_libyan_dinar' => 'dinar libio', 'currency_silver_troy_ounce' => 'Onza troy de plata', 'currency_gold_troy_ounce' => 'Onza troy de oro', + 'currency_nicaraguan_córdoba' => 'Córdoba nicaragüense', + 'currency_malagasy_ariary' => 'Ariary malgache', + "currency_tongan_pa_anga" => "Pa'anga tongano", 'review_app_help' => 'Esperamos que estés disfrutando con la app.
Si consideras :link ¡te lo agraderemos enormemente!', 'writing_a_review' => 'escribir una reseña', @@ -3669,9 +3672,9 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c 'send_date' => 'Fecha de Envío', 'auto_bill_on' => 'Facturación Automática Activa', 'minimum_under_payment_amount' => 'Cantidad Mínima de Pago', - 'allow_over_payment' => 'Permitir Sobrepago', + 'allow_over_payment' => 'Permitir pago en exceso', 'allow_over_payment_help' => 'Permitir pagos extra para aceptar propinas', - 'allow_under_payment' => 'Permitir Pago de Menos', + 'allow_under_payment' => 'Permitir pago insuficiente', 'allow_under_payment_help' => 'Permitir pagar como mínimo la cantidad parcial/depósito', 'test_mode' => 'Modo Test', 'calculated_rate' => 'Tasa Calculada', @@ -3968,8 +3971,8 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c 'account_balance' => 'Saldo de cuenta', 'thanks' => 'Gracias', 'minimum_required_payment' => 'El mínimo pago requerido es :amount', - 'under_payments_disabled' => 'La compañía no permite pagar por debajo.', - 'over_payments_disabled' => 'La compañía no permite sobrepagos.', + 'under_payments_disabled' => 'La empresa no admite pagos insuficientes.', + 'over_payments_disabled' => 'La empresa no admite pagos en exceso.', 'saved_at' => 'Guardado el :time', 'credit_payment' => 'Crédito aplicado a la factura :invoice_number', 'credit_subject' => 'Nuevo crédito :number de :account', @@ -4315,7 +4318,7 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c 'include_drafts' => 'Incluir borradores', 'include_drafts_help' => 'Incluir borradores de registros en informes', 'is_invoiced' => 'Es facturado', - 'change_plan' => 'Manage Plan', + 'change_plan' => 'Gestionar plan', 'persist_data' => 'Persistir datos', 'customer_count' => 'Número de clientes', 'verify_customers' => 'Verificar clientes', @@ -4644,8 +4647,8 @@ Una vez que tenga los montos, vuelva a esta página de métodos de pago y haga c 'search_purchase_order' => 'Buscar orden de compra', 'search_purchase_orders' => 'Buscar órdenes de compra', 'login_url' => 'URL de acceso', - 'enable_applying_payments' => 'Habilitar la aplicación de pagos', - 'enable_applying_payments_help' => 'Admite la creación y aplicación de pagos por separado', + 'enable_applying_payments' => 'Sobrepagos manuales', + 'enable_applying_payments_help' => 'Admite agregar un monto de sobrepago manualmente en un pago', 'stock_quantity' => 'Cantidad de stock', 'notification_threshold' => 'Umbral de notificación', 'track_inventory' => 'Seguimiento de inventario', @@ -5144,20 +5147,39 @@ De lo contrario, este campo deberá dejarse en blanco.', 'unlinked_transaction' => 'Transacción desvinculada exitosamente', 'view_dashboard_permission' => 'Permitir que el usuario acceda al panel, los datos están limitados a los permisos disponibles', 'marked_sent_credits' => 'Créditos enviados, marcados con éxito', - 'show_document_preview' => 'Show Document Preview', - 'cash_accounting' => 'Cash accounting', - 'click_or_drop_files_here' => 'Click or drop files here', - 'set_public' => 'Set public', - 'set_private' => 'Set private', + 'show_document_preview' => 'Mostrar vista previa del documento', + 'cash_accounting' => 'Contabilidad de caja', + 'click_or_drop_files_here' => 'Haga clic o suelte archivos aquí', + 'set_public' => 'Establecer público', + 'set_private' => 'Establecer privado', 'individual' => 'Individual', - 'business' => 'Business', - 'partnership' => 'partnership', - 'trust' => 'Trust', - 'charity' => 'Charity', - 'government' => 'Government', - 'in_stock_quantity' => 'Stock quantity', - 'vendor_contact' => 'Vendor Contact', - + 'business' => 'Negocio', + 'partnership' => 'asociación', + 'trust' => 'Confianza', + 'charity' => 'Caridad', + 'government' => 'Gobierno', + 'in_stock_quantity' => 'Cantidad de stock', + 'vendor_contact' => 'Contacto del proveedor', + 'expense_status_4' => 'No pagado', + 'expense_status_5' => 'Pagado', + 'ziptax_help' => 'Nota: esta función requiere una clave API Zip-Tax para buscar impuestos sobre las ventas de EE. UU. por dirección', + 'cache_data' => 'Datos de caché', + 'unknown' => 'Desconocido', + 'webhook_failure' => 'Fallo del webhook', + 'email_opened' => 'Email abierto', + 'email_delivered' => 'Email entregado', + 'log' => 'Registro', + 'classification' => 'Clasificación', + 'stock_quantity_number' => 'Stock :quantity', + 'upcoming' => 'Próximo', + 'client_contact' => 'Contacto del cliente', + 'uncategorized' => 'Sin categoría', + 'login_notification' => 'Notificación de inicio de sesión', + 'login_notification_help' => 'Envía un correo electrónico notificando que se ha realizado un inicio de sesión.', + 'payment_refund_receipt' => 'Recibo de reembolso de pago Nº :number', + 'payment_receipt' => 'Recibo de pago Nº :number', + 'load_template_description' => 'La plantilla se aplicará a lo siguiente:', + 'run_template' => 'Ejecutar plantilla', ); return $LANG; diff --git a/lang/fr_CA/texts.php b/lang/fr_CA/texts.php index fa47b7c1da3f..2dcde6905751 100644 --- a/lang/fr_CA/texts.php +++ b/lang/fr_CA/texts.php @@ -651,8 +651,6 @@ $LANG = array( 'created_by_invoice' => 'Créée par :invoice', 'primary_user' => 'Utilisateur principal', 'help' => 'Aide', - 'customize_help' => '

Nous utilisons :pdfmake_link pour définir la présentation graphique des factures de manière déclarative. Pdfmake playground_link fournit une excellente façon de voir la librairie en action.

-

Si vous avez besoin d\'aide à ce sujet, vous pouvez publier une question sur notre :forum_link avec la présentation graphique que vous utilisez.

', 'playground' => 'environnement', 'support_forum' => 'Forums de support', 'invoice_due_date' => 'Échéance', @@ -1813,7 +1811,6 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'bot_emailed_notify_paid' => 'Recevez un courriel lorsqu\'elle sera payée.', 'add_product_to_invoice' => 'Ajouter 1 :product', 'not_authorized' => 'Vous n\'êtes pas autorisé', - 'bot_get_email' => 'Bonjour! (wave)
Thanks for trying the Invoice Ninja Bot.
Vous devez vous créer un compte gratuit pour utiliser ce bot.
Veuillez envoyer votre adresse courriel associée à votre compte pour démarrer.', 'bot_get_code' => 'Merci! Je vous ai envoyé un courriel avec votre code de sécurité.', 'bot_welcome' => 'Ça y est, votre compte est maintenant vérifié.>br/>', 'email_not_found' => 'Je n\'ai pas pu trouver un compte disponible pour :email', @@ -1821,7 +1818,6 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'security_code_email_subject' => 'Code de sécurité pour le Bot de Invoice Ninja', 'security_code_email_line1' => 'Ceci est votre code de sécurité pour le Bot de Invoice Ninja.', 'security_code_email_line2' => 'Note: il expirera dans 10 minutes.', - 'bot_help_message' => 'Je supporte actuellement:
• Créer\mettre à jour\envoyer une facture
• Lister les produits
Par exemple:
Facturer 2 billets à Simon, définir la date d\'échéance au prochain jeudi et le rabais à 10 %', 'list_products' => 'Liste des produits', 'include_item_taxes_inline' => 'Inclure lestaxes par ligne dans le total des lignes', @@ -1834,7 +1830,6 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'update_invoiceninja_warning' => 'Invoice Ninja crée une sauvegarde de votre base de données et de vos fichiers avant la mise à jour.', 'update_invoiceninja_available' => 'Une nouvelle version de Invoice Ninja est disponible.', 'update_invoiceninja_unavailable' => 'Aucune mise à jour de Invoice Ninja disponible.', - 'update_invoiceninja_instructions' => 'Veuillez installer la nouvelle version :version en cliquant sur le bouton Mettre à jour ci-dessous. Ensuite, vous serez redirigé vers le tableau de bord.', 'update_invoiceninja_update_start' => 'Mettre à jour', 'update_invoiceninja_download_start' => 'Télécharger :version', 'create_new' => 'Créer', @@ -2399,6 +2394,9 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'currency_libyan_dinar' => 'Dinar libyen', 'currency_silver_troy_ounce' => 'Once troy d\'argent', 'currency_gold_troy_ounce' => 'Once troy d\'or', + 'currency_nicaraguan_córdoba' => 'Cordoba nicaraguayen', + 'currency_malagasy_ariary' => 'Ariary malgache', + "currency_tongan_pa_anga" => "Pa'anga tongien", 'review_app_help' => 'Nous espérons que votre utilisation de cette application vous est agréable.
Un commentaire de votre part serait grandement apprécié!', 'writing_a_review' => 'rédiger un commentaire', @@ -3676,9 +3674,9 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'send_date' => 'Date d\'envoi', 'auto_bill_on' => 'Facturer automatiquement le', 'minimum_under_payment_amount' => 'Montant minimum de sous-paiement', - 'allow_over_payment' => 'Accepter Sur-paiement', + 'allow_over_payment' => 'Autoriser le surpaiement', 'allow_over_payment_help' => 'Accepter paiement supplémentaire pour pourboire', - 'allow_under_payment' => 'Accepter Sous-paiement', + 'allow_under_payment' => 'Autoriser le souspaiement', 'allow_under_payment_help' => 'Accepter paiement au minimum le montant partiel/dépôt', 'test_mode' => 'Mode test', 'calculated_rate' => 'Taux calculé', @@ -3975,8 +3973,8 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'account_balance' => 'Solde de compte', 'thanks' => 'Merci', 'minimum_required_payment' => 'Le paiement minimum requis est :amount', - 'under_payments_disabled' => 'L\'entreprise ne tolère pas le sous-paiement.', - 'over_payments_disabled' => 'L\'entreprise ne tolère pas le sur-paiement.', + 'under_payments_disabled' => 'L\'entreprise d\'autorise pas les surpaiements.', + 'over_payments_disabled' => 'L\'entreprise d\'autorise pas les souspaiements.', 'saved_at' => 'Enregistré à :time', 'credit_payment' => 'Le crédit a été appliqué à la facture :invoice_number', 'credit_subject' => 'Nouveau crédit :credit de :account', @@ -4651,8 +4649,8 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'search_purchase_order' => 'Rechercher un bon de commande', 'search_purchase_orders' => 'Rechercher des bons de commande', 'login_url' => 'URL de connexion', - 'enable_applying_payments' => 'Activer les paiements applicables', - 'enable_applying_payments_help' => 'Activer la création et l\'application de paiement séparément', + 'enable_applying_payments' => 'Surpaiements manuels', + 'enable_applying_payments_help' => 'Prise en charge de l\'ajout manuel d\'un montant de surpaiement sur un paiement', 'stock_quantity' => 'Quantité en stock', 'notification_threshold' => 'Seuil de notification', 'track_inventory' => 'Gérer l\'inventaire', @@ -5153,6 +5151,36 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'show_document_preview' => 'Afficher la visualisation de document', 'cash_accounting' => 'Comptabilité de caisse', 'click_or_drop_files_here' => 'Cliquez ou déposez les fichiers ici', + 'set_public' => 'Public', + 'set_private' => 'Privé', + 'individual' => 'Individuel', + 'business' => 'Entreprise', + 'partnership' => 'partenaire', + 'trust' => 'Fiducie', + 'charity' => 'Organisation caritative', + 'government' => 'Gouvernement', + 'in_stock_quantity' => 'Quantité en stock', + 'vendor_contact' => 'Contact du fournisseur', + 'expense_status_4' => 'Impayé', + 'expense_status_5' => 'Payé', + 'ziptax_help' => 'Note: Cette fonctionnalité requiert une clé API Zip-Tax pour obtenir les taux de taxes de vente par adresse pour les États-Unis', + 'cache_data' => 'Données en cache', + 'unknown' => 'Inconnu', + 'webhook_failure' => 'Échec du webhook', + 'email_opened' => 'Courriel ouvert', + 'email_delivered' => 'Courriel livré', + 'log' => 'Journal', + 'classification' => 'Classification', + 'stock_quantity_number' => 'Stock :quantity', + 'upcoming' => 'À venir', + 'client_contact' => 'Contact client', + 'uncategorized' => 'Non catégorisé', + 'login_notification' => 'Notification de connexion', + 'login_notification_help' => 'Envoie un message par courriel lorsqu\'une connexion a été réalisée', + 'payment_refund_receipt' => 'Reçu de remboursement de paiement #', + 'payment_receipt' => 'Reçu de paiement #', + 'load_template_description' => 'Le modèle s\'appliquera à:', + 'run_template' => 'Exécuter le modèle', ); return $LANG; diff --git a/resources/views/bank/yodlee/auth.blade.php b/resources/views/bank/yodlee/auth.blade.php index 906e0e6c1748..27738d5c809b 100644 --- a/resources/views/bank/yodlee/auth.blade.php +++ b/resources/views/bank/yodlee/auth.blade.php @@ -68,7 +68,7 @@
- Return to admin portal. + Return to admin portal.
diff --git a/tests/Unit/InvoiceItemTest.php b/tests/Unit/InvoiceItemTest.php index 802c825531cc..67fa80662e5e 100644 --- a/tests/Unit/InvoiceItemTest.php +++ b/tests/Unit/InvoiceItemTest.php @@ -11,11 +11,13 @@ namespace Tests\Unit; +use Tests\TestCase; +use Tests\MockAccountData; +use App\DataMapper\InvoiceItem; +use App\Factory\InvoiceFactory; use App\Factory\InvoiceItemFactory; use App\Helpers\Invoice\InvoiceItemSum; use Illuminate\Foundation\Testing\DatabaseTransactions; -use Tests\MockAccountData; -use Tests\TestCase; /** * @test @@ -33,6 +35,272 @@ class InvoiceItemTest extends TestCase $this->makeTestData(); } + + public function testDiscountsWithInclusiveTaxes() + { + $invoice = InvoiceFactory::create($this->company->id, $this->user->id); + $invoice->client_id = $this->client->id; + $invoice->uses_inclusive_taxes = true; + $invoice->is_amount_discount =true; + $invoice->discount = 10; + + $line_items = []; + + $line_item = new InvoiceItem; + $line_item->quantity = 1; + $line_item->cost = 100; + $line_item->tax_rate1 = 10; + $line_item->tax_name1 = 'GST'; + $line_item->product_key = 'Test'; + $line_item->notes = 'Test'; + $line_items[] = $line_item; + + $invoice->line_items = $line_items; + $invoice->save(); + + $invoice = $invoice->calc()->getInvoice(); + + $this->assertEquals(90, $invoice->amount); + $this->assertEquals(8.18, $invoice->total_taxes); + } + + + public function testDiscountsWithInclusiveTaxesNegativeInvoice() + { + $invoice = InvoiceFactory::create($this->company->id, $this->user->id); + $invoice->client_id = $this->client->id; + $invoice->uses_inclusive_taxes = true; + $invoice->is_amount_discount =true; + $invoice->discount = -10; + + $line_items = []; + + $line_item = new InvoiceItem; + $line_item->quantity = -1; + $line_item->cost = 100; + $line_item->tax_rate1 = 10; + $line_item->tax_name1 = 'GST'; + $line_item->product_key = 'Test'; + $line_item->notes = 'Test'; + $line_items[] = $line_item; + + $invoice->line_items = $line_items; + $invoice->save(); + + $invoice = $invoice->calc()->getInvoice(); + + $this->assertEquals(-90, $invoice->amount); + $this->assertEquals(-8.18, $invoice->total_taxes); + } + + public function testDicountsWithTaxes() + { + $invoice = InvoiceFactory::create($this->company->id, $this->user->id); + $invoice->client_id = $this->client->id; + $invoice->uses_inclusive_taxes = false; + $invoice->is_amount_discount =true; + $invoice->discount = 10; + + $line_items = []; + + $line_item = new InvoiceItem; + $line_item->quantity = 1; + $line_item->cost = 100; + $line_item->tax_rate1 = 10; + $line_item->tax_name1 = 'GST'; + $line_item->product_key = 'Test'; + $line_item->notes = 'Test'; + $line_items[] = $line_item; + + $invoice->line_items = $line_items; + $invoice->save(); + + $invoice = $invoice->calc()->getInvoice(); + + $this->assertEquals(99, $invoice->amount); + $this->assertEquals(9, $invoice->total_taxes); + } + + + public function testDicountsWithTaxesNegativeInvoice() + { + $invoice = InvoiceFactory::create($this->company->id, $this->user->id); + $invoice->client_id = $this->client->id; + $invoice->uses_inclusive_taxes = false; + $invoice->is_amount_discount =true; + $invoice->discount = -10; + + $line_items = []; + + $line_item = new InvoiceItem; + $line_item->quantity = -1; + $line_item->cost = 100; + $line_item->tax_rate1 = 10; + $line_item->tax_name1 = 'GST'; + $line_item->product_key = 'Test'; + $line_item->notes = 'Test'; + $line_items[] = $line_item; + + $invoice->line_items = $line_items; + $invoice->save(); + + $invoice = $invoice->calc()->getInvoice(); + + $this->assertEquals(-99, $invoice->amount); + $this->assertEquals(-9, $invoice->total_taxes); + } + + public function testDicountsWithTaxesPercentage() + { + $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 = 10; + + $line_items = []; + + $line_item = new InvoiceItem; + $line_item->quantity = 1; + $line_item->cost = 100; + $line_item->tax_rate1 = 10; + $line_item->tax_name1 = 'GST'; + $line_item->product_key = 'Test'; + $line_item->notes = 'Test'; + $line_items[] = $line_item; + + $invoice->line_items = $line_items; + $invoice->save(); + + $invoice = $invoice->calc()->getInvoice(); + + $this->assertEquals(99, $invoice->amount); + $this->assertEquals(9, $invoice->total_taxes); + } + + public function testDicountsWithTaxesPercentageOnLine() + { + $invoice = InvoiceFactory::create($this->company->id, $this->user->id); + $invoice->client_id = $this->client->id; + $invoice->uses_inclusive_taxes = true; + $invoice->is_amount_discount =false; + $invoice->discount = 10; + + $line_items = []; + + $line_item = new InvoiceItem; + $line_item->quantity = 1; + $line_item->cost = 100; + $line_item->is_amount_discount = false; + $line_item->discount = 10; + $line_item->tax_rate1 = 10; + $line_item->tax_name1 = 'GST'; + $line_item->product_key = 'Test'; + $line_item->notes = 'Test'; + $line_items[] = $line_item; + + $invoice->line_items = $line_items; + $invoice->save(); + + $invoice = $invoice->calc()->getInvoice(); + + $this->assertEquals(81, $invoice->amount); + $this->assertEquals(7.36, $invoice->total_taxes); + } + + public function testDicountsWithExclusiveTaxesPercentageOnLine() + { + $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 = -10; + + $line_items = []; + + $line_item = new InvoiceItem; + $line_item->quantity = -1; + $line_item->cost = 100; + $line_item->is_amount_discount = false; + $line_item->discount = -10; + $line_item->tax_rate1 = 10; + $line_item->tax_name1 = 'GST'; + $line_item->product_key = 'Test'; + $line_item->notes = 'Test'; + $line_items[] = $line_item; + + $invoice->line_items = $line_items; + $invoice->save(); + + $invoice = $invoice->calc()->getInvoice(); + + $this->assertEquals(-133.1, $invoice->amount); + $this->assertEquals(-12.1, $invoice->total_taxes); + } + + + public function testDicountsWithTaxesNegativeInvoicePercentage() + { + $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 = -10; + + $line_items = []; + + $line_item = new InvoiceItem; + $line_item->quantity = -1; + $line_item->cost = 100; + $line_item->tax_rate1 = 10; + $line_item->tax_name1 = 'GST'; + $line_item->product_key = 'Test'; + $line_item->notes = 'Test'; + $line_items[] = $line_item; + + $invoice->line_items = $line_items; + $invoice->save(); + + $invoice = $invoice->calc()->getInvoice(); + + $this->assertEquals(-121, $invoice->amount); + $this->assertEquals(-10, $invoice->discount); + $this->assertEquals(-11, $invoice->total_taxes); + } + + + + public function testDicountPercentageWithTaxes() + { + $invoice = InvoiceFactory::create($this->company->id, $this->user->id); + $invoice->client_id = $this->client->id; + $invoice->uses_inclusive_taxes = false; + $invoice->is_amount_discount =true; + $invoice->discount = 10; + + $line_items = []; + + $line_item = new InvoiceItem; + $line_item->quantity = 1; + $line_item->cost = 100; + $line_item->tax_rate1 = 10; + $line_item->tax_name1 = 'GST'; + $line_item->product_key = 'Test'; + $line_item->notes = 'Test'; + $line_items[] = $line_item; + + $invoice->line_items = $line_items; + $invoice->save(); + + $invoice = $invoice->calc()->getInvoice(); + + $this->assertEquals(99, $invoice->amount); + $this->assertEquals(9, $invoice->total_taxes); + } + + + + public function testInvoiceItemTotalSimple() { $item = InvoiceItemFactory::create(); diff --git a/tests/Unit/InvoiceTest.php b/tests/Unit/InvoiceTest.php index cb6f15da138c..5becdabb8055 100644 --- a/tests/Unit/InvoiceTest.php +++ b/tests/Unit/InvoiceTest.php @@ -49,6 +49,8 @@ class InvoiceTest extends TestCase $this->invoice_calc = new InvoiceSum($this->invoice); } + + public function testMarkPaidWithPartial() { $item = InvoiceItemFactory::create();