Merge pull request #4449 from turbo124/v5-stable

5.0.34 Enhancments, bug fixes and improvements in app stability
This commit is contained in:
David Bomba 2020-12-09 07:41:12 +11:00 committed by GitHub
commit b74d80e091
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
93 changed files with 103680 additions and 105132 deletions

View File

@ -4,6 +4,7 @@ $finder = Symfony\Component\Finder\Finder::create()
->notPath('vendor') ->notPath('vendor')
->notPath('bootstrap') ->notPath('bootstrap')
->notPath('storage') ->notPath('storage')
->notPath('node_modules')
->in(__DIR__) ->in(__DIR__)
->name('*.php') ->name('*.php')
->notName('*.blade.php'); ->notName('*.blade.php');

View File

@ -74,8 +74,26 @@ To improve chances of PRs being merged please include tests to ensure your code
API documentation is hosted using Swagger and can be found [HERE](https://app.swaggerhub.com/apis/invoiceninja/invoiceninja) API documentation is hosted using Swagger and can be found [HERE](https://app.swaggerhub.com/apis/invoiceninja/invoiceninja)
## Credits
* [Hillel Coren](https://hillelcoren.com/)
* [David Bomba](https://github.com/turbo124)
* [All contributors](https://github.com/invoiceninja/invoiceninja/graphs/contributors)
**Special thanks to:**
* [Holger Lösken](https://github.com/codedge) - [codedge](http://codedge.de)
* [Samuel Laulhau](https://github.com/lalop) - [Lalop](http://lalop.co/)
* [Alexander Vanderveen](https://blog.technicallycomputers.ca/) - [Technically Computers](https://www.technicallycomputers.ca/)
* [Efthymios Sarmpanis](https://github.com/esarbanis)
* [Gianfranco Gasbarri](https://github.com/gincos)
* [Clemens Mol](https://github.com/clemensmol)
* [Benjamin Beganović](https://github.com/beganovich)
## Current work in progress ## Current work in progress
Invoice Ninja is currently being written in a combination of Laravel for the API and Client Portal and Flutter for the front end management console. This will allow an immersive and consistent experience across any device: mobile, tablet or desktop. Invoice Ninja is currently being written in a combination of Laravel for the API and Client Portal and Flutter for the front end management console. This will allow an immersive and consistent experience across any device: mobile, tablet or desktop.
To manage our workflow we will be creating separate branches for the client (Flutter) and server (Laravel API / Client Portal) and merge these into a release branch for deployments. To manage our workflow we will be creating separate branches for the client (Flutter) and server (Laravel API / Client Portal) and merge these into a release branch for deployments.
## License
Invoice Ninja is released under the Attribution Assurance License.
See [LICENSE](LICENSE) for details.

View File

@ -1 +1 @@
5.0.33 5.0.34

View File

@ -617,7 +617,6 @@ class CompanySettings extends BaseSettings
'$quote.po_number', '$quote.po_number',
'$quote.date', '$quote.date',
'$quote.valid_until', '$quote.valid_until',
'$quote.balance_due',
'$quote.total', '$quote.total',
], ],
'credit_details' => [ 'credit_details' => [
@ -636,7 +635,7 @@ class CompanySettings extends BaseSettings
'$product.line_total', '$product.line_total',
], ],
'task_columns' =>[ 'task_columns' =>[
'$task.product_key', '$task.service',
'$task.description', '$task.description',
'$task.rate', '$task.rate',
'$task.hours', '$task.hours',

View File

@ -13,7 +13,14 @@ class PaymentFailed extends Exception
public function render($request) public function render($request)
{ {
return render('gateways.unsuccessful', [ if (auth()->user()) {
return render('gateways.unsuccessful', [
'message' => $this->getMessage(),
'code' => $this->getCode(),
]);
}
return response([
'message' => $this->getMessage(), 'message' => $this->getMessage(),
'code' => $this->getCode(), 'code' => $this->getCode(),
]); ]);

View File

@ -1,26 +0,0 @@
<?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2020. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Http\Controllers\ClientPortal;
use App\Http\Controllers\Controller;
use App\Models\Gateway;
use Illuminate\Http\Request;
class PaymentHookController extends Controller
{
public function process($company_gateway_id, $gateway_type_id)
{
$gateway = Gateway::find($company_gateway_id);
dd(request()->input());
}
}

View File

@ -314,7 +314,7 @@ class CreditController extends BaseController
* *
* @throws \ReflectionException * @throws \ReflectionException
* @OA\Put( * @OA\Put(
* path="/api/v1/Credits/{id}", * path="/api/v1/credits/{id}",
* operationId="updateCredit", * operationId="updateCredit",
* tags={"Credits"}, * tags={"Credits"},
* summary="Updates an Credit", * summary="Updates an Credit",

View File

@ -843,8 +843,13 @@ class InvoiceController extends BaseController
{ {
$file_path = $invoice->service()->getInvoiceDeliveryNote($invoice, $invoice->invitations->first()->contact); $file_path = $invoice->service()->getInvoiceDeliveryNote($invoice, $invoice->invitations->first()->contact);
$file = base_path("storage/app/public/{$file_path}"); try {
$file = public_path("storage/{$file_path}");
return response()->download($file, basename($file));
return response()->download($file, basename($file));
} catch (\Exception $e) {
return response(['message' => 'Oops, something went wrong. Make sure you have symlink to storage/ in public/ directory.'], 500);
}
} }
} }

View File

@ -13,8 +13,6 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Http\Requests\Payments\PaymentWebhookRequest; use App\Http\Requests\Payments\PaymentWebhookRequest;
use App\Models\Payment;
use Illuminate\Support\Arr;
class PaymentWebhookController extends Controller class PaymentWebhookController extends Controller
{ {
@ -23,36 +21,10 @@ class PaymentWebhookController extends Controller
$this->middleware('guest'); $this->middleware('guest');
} }
public function __invoke(PaymentWebhookRequest $request, string $company_key = null, string $gateway_key = null) public function __invoke(PaymentWebhookRequest $request, string $gateway_key, string $company_key)
{ {
$transaction_reference = $this->getTransactionReference($request->all(), $request); return $request->getCompanyGateway()
->driver($request->getClient())
$payment = Payment::where('transaction_reference', $transaction_reference)->first(); ->processWebhookRequest($request, $request->getPayment());
if (is_null($payment)) {
return response([
'message' => 'Sorry, we couldn\'t find requested payment.',
'status_code' => 404,
], 404); /* Record event, throw an exception.. */
}
return $request
->companyGateway()
->driver($payment->client)
->setPaymentMethod($payment->gateway_type_id)
->processWebhookRequest($request->all(), $request->company(), $request->companyGateway(), $payment);
}
public function getTransactionReference(array $data, PaymentWebhookRequest $request)
{
$flatten = Arr::dot($data);
if (isset($flatten['data.object.id'])) {
return $flatten['data.object.id']; // stripe.com
}
if ($request->has('cko-session-id')) {
// checkout.com
}
} }
} }

View File

@ -67,12 +67,34 @@ class SetupController extends Controller
return response('Oops, something went wrong. Check your logs.'); /* We should never reach this block, but just in case. */ return response('Oops, something went wrong. Check your logs.'); /* We should never reach this block, but just in case. */
} }
$mail_driver = $request->input('mail_driver'); try {
$db = SystemHealth::dbCheck($request);
if (!$this->failsafeMailCheck($request)) {
$mail_driver = 'log'; if ($db['success'] == false) {
throw new \Exception($db['message']);
}
} catch (\Exception $e) {
return response([
'message' => 'Oops, connection to database was not successful.',
'error' => $e->getMessage(),
]);
} }
try {
$smtp = SystemHealth::testMailServer($request);
if ($smtp['success'] == false) {
throw new \Exception($smtp['message']);
}
} catch (\Exception $e) {
return response([
'message' => 'Oops, connection to mail server was not successful.',
'error' => $e->getMessage(),
]);
}
$mail_driver = $request->input('mail_driver');
$url = $request->input('url'); $url = $request->input('url');
if (substr($url, -1) != '/') { if (substr($url, -1) != '/') {
@ -84,8 +106,8 @@ class SetupController extends Controller
'REQUIRE_HTTPS' => $request->input('https') ? 'true' : 'false', 'REQUIRE_HTTPS' => $request->input('https') ? 'true' : 'false',
'APP_DEBUG' => $request->input('debug') ? 'true' : 'false', 'APP_DEBUG' => $request->input('debug') ? 'true' : 'false',
'DB_HOST1' => $request->input('host'), 'DB_HOST1' => $request->input('db_host'),
'DB_DATABASE1' => $request->input('database'), 'DB_DATABASE1' => $request->input('db_database'),
'DB_USERNAME1' => $request->input('db_username'), 'DB_USERNAME1' => $request->input('db_username'),
'DB_PASSWORD1' => $request->input('db_password'), 'DB_PASSWORD1' => $request->input('db_password'),
@ -171,12 +193,12 @@ class SetupController extends Controller
public function checkMail(CheckMailRequest $request) public function checkMail(CheckMailRequest $request)
{ {
try { try {
$response_array = SystemHealth::testMailServer($request); $response = SystemHealth::testMailServer($request);
if (count($response_array) == 0) { if ($response['success']) {
return response([], 200); return response([], 200);
} else { } else {
return response()->json(['message' => $response_array[0]], 400); return response()->json(['message' => $response['message']], 400);
} }
} catch (Exception $e) { } catch (Exception $e) {
info(['message' => $e->getMessage(), 'action' => 'SetupController::checkMail()']); info(['message' => $e->getMessage(), 'action' => 'SetupController::checkMail()']);
@ -187,10 +209,10 @@ class SetupController extends Controller
private function failsafeMailCheck($request) private function failsafeMailCheck($request)
{ {
$response_array = SystemHealth::testMailServer($request); $response = SystemHealth::testMailServer($request);
if ($response_array instanceof Response) { if ($response['success']) {
return true; true;
} }
return false; return false;

View File

@ -372,7 +372,7 @@ class UserController extends BaseController
$user = $this->user_repo->save($request->all(), $user); $user = $this->user_repo->save($request->all(), $user);
if ($user) { if ($old_email != $new_email) {
UserEmailChanged::dispatch($new_email, $old_email, auth()->user()->company()); UserEmailChanged::dispatch($new_email, $old_email, auth()->user()->company());
} }

View File

@ -1,5 +1,15 @@
<?php <?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2020. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Http\Livewire; namespace App\Http\Livewire;
use App\Models\Credit; use App\Models\Credit;

View File

@ -1,5 +1,15 @@
<?php <?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2020. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Http\Livewire; namespace App\Http\Livewire;
use App\Models\Invoice; use App\Models\Invoice;
@ -8,9 +18,6 @@ use Carbon\Carbon;
use Livewire\Component; use Livewire\Component;
use Livewire\WithPagination; use Livewire\WithPagination;
/**
* @todo: Integrate InvoiceFilters
*/
class InvoicesTable extends Component class InvoicesTable extends Component
{ {
use WithPagination, WithSorting; use WithPagination, WithSorting;

View File

@ -1,5 +1,8 @@
<?php <?php
namespace App\Http\Livewire; namespace App\Http\Livewire;
use App\Models\ClientGatewayToken; use App\Models\ClientGatewayToken;

View File

@ -1,5 +1,15 @@
<?php <?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2020. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Http\Livewire; namespace App\Http\Livewire;
use App\Models\Payment; use App\Models\Payment;

View File

@ -1,5 +1,15 @@
<?php <?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2020. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Http\Livewire; namespace App\Http\Livewire;
use App\Models\Quote; use App\Models\Quote;

View File

@ -1,5 +1,15 @@
<?php <?php
/**
* Invoice Ninja (https://invoiceninja.com).
*
* @link https://github.com/invoiceninja/invoiceninja source repository
*
* @copyright Copyright (c) 2020. Invoice Ninja LLC (https://invoiceninja.com)
*
* @license https://opensource.org/licenses/AAL
*/
namespace App\Http\Livewire; namespace App\Http\Livewire;
use App\Models\RecurringInvoice; use App\Models\RecurringInvoice;

View File

@ -34,9 +34,10 @@ class QueryLogging
$timeStart = microtime(true); $timeStart = microtime(true);
// Enable query logging for development // Enable query logging for development
if (config('ninja.app_env') != 'production') { if (config('ninja.app_env') == 'production')
DB::enableQueryLog(); return $next($request);
}
DB::enableQueryLog();
$response = $next($request); $response = $next($request);

View File

@ -1,4 +1,5 @@
<?php <?php
/** /**
* Invoice Ninja (https://invoiceninja.com). * Invoice Ninja (https://invoiceninja.com).
* *
@ -9,12 +10,14 @@
* @license https://opensource.org/licenses/AAL * @license https://opensource.org/licenses/AAL
*/ */
namespace App\Http\Requests\Payments; namespace App\Http\Requests\Payments;
use App\Http\Requests\Request; use App\Http\Requests\Request;
use App\Models\Client;
use App\Models\Company; use App\Models\Company;
use App\Models\CompanyGateway; use App\Models\CompanyGateway;
use App\Models\Payment;
use App\Models\PaymentHash;
class PaymentWebhookRequest extends Request class PaymentWebhookRequest extends Request
{ {
@ -30,28 +33,61 @@ class PaymentWebhookRequest extends Request
]; ];
} }
public function company() /**
* Resolve company gateway.
*
* @param mixed $id
* @return null|\App\Models\CompanyGateway
*/
public function getCompanyGateway(): ?CompanyGateway
{ {
if (! $this->company_key) { return CompanyGateway::where('gateway_key', $this->gateway_key)->firstOrFail();
return false;
}
return Company::query()
->where('company_key', $this->company_key)
->firstOrFail();
} }
public function companyGateway() /**
* Resolve payment hash.
*
* @param string $hash
* @return null|\App\Http\Requests\Payments\PaymentHash
*/
public function getPaymentHash(): ?PaymentHash
{ {
if (! $this->gateway_key || ! $this->company_key) { if ($this->query('hash')) {
return false; return PaymentHash::where('hash', $this->query('hash'))->firstOrFail();
} }
}
$company = $this->company(); /**
* Resolve possible payment in the request.
*
* @return null|\App\Models\Payment
*/
public function getPayment(): ?Payment
{
$hash = $this->getPaymentHash();
return CompanyGateway::query() return $hash->payment;
->where('gateway_key', $this->gateway_key) }
->where('company_id', $company->id)
->firstOrFail(); /**
* Resolve client from payment hash.
*
* @return null|\App\Models\Client
*/
public function getClient(): ?Client
{
$hash = $this->getPaymentHash();
return Client::find($hash->data->client_id)->firstOrFail();
}
/**
* Resolve company from company_key parameter.
*
* @return null|\App\Models\Company
*/
public function getCompany(): ?Company
{
return Company::where('company_key', $this->company_key)->firstOrFail();
} }
} }

View File

@ -34,9 +34,9 @@ class CheckDatabaseRequest extends Request
public function rules() public function rules()
{ {
return [ return [
'host' => ['required'], 'db_host' => ['required'],
'database' => ['required'], 'db_database' => ['required'],
'username' => ['required'], 'db_username' => ['required'],
]; ];
} }
} }

View File

@ -36,14 +36,13 @@ class CheckMailRequest extends Request
info($this->driver); info($this->driver);
return [ return [
'driver' => ['required', 'in:smtp,mail,sendmail,log'], 'mail_driver' => 'required',
'from_name' => ['required_unless:driver,log'], 'encryption' => 'required_unless:mail_driver,log',
'from_address' => ['required_unless:driver,log'], 'mail_host' => 'required_unless:mail_driver,log',
'username' => ['required_unless:driver,log'], 'mail_username' => 'required_unless:mail_driver,log',
'host' => ['required_unless:driver,log'], 'mail_name' => 'required_unless:mail_driver,log',
'port' => ['required_unless:driver,log'], 'mail_address' => 'required_unless:mail_driver,log',
'encryption' => ['required_unless:driver,log'], 'mail_password' => 'required_unless:mail_driver,log',
'password' => ['required_unless:driver,log'],
]; ];
} }
} }

View File

@ -31,8 +31,8 @@ class StoreSetupRequest extends Request
/*System*/ /*System*/
'url' => 'required', 'url' => 'required',
/*Database*/ /*Database*/
'host' => 'required', 'db_host' => 'required',
'database' => 'required', 'db_database' => 'required',
'db_username' => 'required', 'db_username' => 'required',
'db_password' => '', 'db_password' => '',
/*Mail driver*/ /*Mail driver*/

View File

@ -16,6 +16,7 @@ use App\Events\Invoice\InvoiceWasEmailed;
use App\Jobs\Entity\EmailEntity; use App\Jobs\Entity\EmailEntity;
use App\Libraries\MultiDB; use App\Libraries\MultiDB;
use App\Models\Invoice; use App\Models\Invoice;
use App\Models\Webhook;
use App\Utils\Ninja; use App\Utils\Ninja;
use App\Utils\Traits\MakesDates; use App\Utils\Traits\MakesDates;
use App\Utils\Traits\MakesReminders; use App\Utils\Traits\MakesReminders;
@ -25,6 +26,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue; use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
use App\Jobs\Util\WebHookHandler;
class SendReminders implements ShouldQueue class SendReminders implements ShouldQueue
{ {
@ -81,6 +83,7 @@ class SendReminders implements ShouldQueue
if (in_array($reminder_template, ['reminder1', 'reminder2', 'reminder3', 'endless_reminder'])) { if (in_array($reminder_template, ['reminder1', 'reminder2', 'reminder3', 'endless_reminder'])) {
$this->sendReminder($invoice, $reminder_template); $this->sendReminder($invoice, $reminder_template);
WebHookHandler::dispatch(Webhook::EVENT_REMIND_INVOICE, $invoice, $invoice->company);
} }
}); });
} }

View File

@ -30,7 +30,6 @@ class DownloadInvoices extends Mailable
*/ */
public function build() public function build()
{ {
return $this->from(config('mail.from.address'), config('mail.from.name')) return $this->from(config('mail.from.address'), config('mail.from.name'))
->subject(ctrans('texts.download_files')) ->subject(ctrans('texts.download_files'))

View File

@ -27,7 +27,6 @@ class ExistingMigration extends Mailable
*/ */
public function build() public function build()
{ {
return $this->from(config('mail.from.address'), config('mail.from.name')) return $this->from(config('mail.from.address'), config('mail.from.name'))
->view('email.migration.existing'); ->view('email.migration.existing');

View File

@ -31,7 +31,6 @@ class MigrationFailed extends Mailable
*/ */
public function build() public function build()
{ {
return $this->from(config('mail.from.address'), config('mail.from.name')) return $this->from(config('mail.from.address'), config('mail.from.name'))
->view('email.migration.failed'); ->view('email.migration.failed');

View File

@ -207,6 +207,6 @@ class ClientContact extends Authenticatable implements HasLocalePreference
{ {
$domain = isset($this->company->portal_domain) ?: $this->company->domain(); $domain = isset($this->company->portal_domain) ?: $this->company->domain();
return $domain . 'client/key_login/' . $this->contact_key; return $domain . '/client/key_login/' . $this->contact_key;
} }
} }

View File

@ -81,4 +81,9 @@ class Expense extends BaseModel
{ {
return $this->belongsTo(Company::class); return $this->belongsTo(Company::class);
} }
public function vendor()
{
return $this->belongsTo(Vendor::class);
}
} }

View File

@ -92,7 +92,7 @@ class InvoiceSentNotification extends Notification implements ShouldQueue
'invoice' => $this->invoice->number, 'invoice' => $this->invoice->number,
] ]
), ),
'url' => config('ninja.app_url').'invoices/'.$this->invoice->hashed_id, 'url' => config('ninja.app_url').'/invoices/'.$this->invoice->hashed_id,
'button' => ctrans('texts.view_invoice'), 'button' => ctrans('texts.view_invoice'),
'signature' => $this->settings->email_signature, 'signature' => $this->settings->email_signature,
'logo' => $this->company->present()->logo(), 'logo' => $this->company->present()->logo(),

View File

@ -92,7 +92,7 @@ class InvoiceViewedNotification extends Notification implements ShouldQueue
'invoice' => $this->invoice->number, 'invoice' => $this->invoice->number,
] ]
), ),
'url' => config('ninja.app_url').'invoices/'.$this->invoice->hashed_id, 'url' => config('ninja.app_url').'/invoices/'.$this->invoice->hashed_id,
'button' => ctrans('texts.view_invoice'), 'button' => ctrans('texts.view_invoice'),
'signature' => $this->settings->email_signature, 'signature' => $this->settings->email_signature,
'logo' => $this->company->present()->logo(), 'logo' => $this->company->present()->logo(),

View File

@ -89,7 +89,7 @@ class NewPartialPaymentNotification extends Notification implements ShouldQueue
'invoice' => $invoice_texts, 'invoice' => $invoice_texts,
] ]
), ),
'url' => config('ninja.app_url').'payments/'.$this->payment->hashed_id, 'url' => config('ninja.app_url').'/payments/'.$this->payment->hashed_id,
'button' => ctrans('texts.view_payment'), 'button' => ctrans('texts.view_payment'),
'signature' => $this->settings->email_signature, 'signature' => $this->settings->email_signature,
'logo' => $this->company->present()->logo(), 'logo' => $this->company->present()->logo(),

View File

@ -92,7 +92,7 @@ class NewPaymentNotification extends Notification implements ShouldQueue
'invoice' => $invoice_texts, 'invoice' => $invoice_texts,
] ]
), ),
'url' => config('ninja.app_url').'payments/'.$this->payment->hashed_id, 'url' => config('ninja.app_url').'/payments/'.$this->payment->hashed_id,
'button' => ctrans('texts.view_payment'), 'button' => ctrans('texts.view_payment'),
'signature' => $this->settings->email_signature, 'signature' => $this->settings->email_signature,
'logo' => $this->company->present()->logo(), 'logo' => $this->company->present()->logo(),

View File

@ -82,6 +82,7 @@ class CreditCard
'currency' => $request->currency, 'currency' => $request->currency,
'payment_hash' => $request->payment_hash, 'payment_hash' => $request->payment_hash,
'reference' => $request->payment_hash, 'reference' => $request->payment_hash,
'client_id' => $this->checkout->client->id,
]; ];
$state = array_merge($state, $request->all()); $state = array_merge($state, $request->all());
@ -121,8 +122,17 @@ class CreditCard
$payment->amount = $this->checkout->payment_hash->data->value; $payment->amount = $this->checkout->payment_hash->data->value;
$payment->reference = $this->checkout->payment_hash->data->reference; $payment->reference = $this->checkout->payment_hash->data->reference;
$this->checkout->payment_hash->data = array_merge((array) $this->checkout->payment_hash->data, ['checkout_payment_ref' => $payment]);
$this->checkout->payment_hash->save();
if ($this->checkout->client->currency()->code === 'EUR') { if ($this->checkout->client->currency()->code === 'EUR') {
$payment->{'3ds'} = ['enabled' => true]; $payment->{'3ds'} = ['enabled' => true];
$payment->{'success_url'} = route('payment_webhook', [
'gateway_key' => $this->checkout->company_gateway->gateway_key,
'company_key' => $this->checkout->client->company->company_key,
'hash' => $this->checkout->payment_hash->hash,
]);
} }
try { try {

View File

@ -29,6 +29,11 @@ trait Utilities
return $this->company_gateway->getConfigField('publicApiKey'); return $this->company_gateway->getConfigField('publicApiKey');
} }
public function getParent()
{
return static::class == 'App\PaymentDrivers\CheckoutComPaymentDriver' ? $this : $this->checkout;
}
public function convertToCheckoutAmount($amount, $currency) public function convertToCheckoutAmount($amount, $currency)
{ {
$cases = [ $cases = [
@ -52,42 +57,42 @@ trait Utilities
private function processSuccessfulPayment(Payment $_payment) private function processSuccessfulPayment(Payment $_payment)
{ {
if ($this->checkout->payment_hash->data->store_card) { if ($this->getParent()->payment_hash->data->store_card) {
$this->storePaymentMethod($_payment); $this->storePaymentMethod($_payment);
} }
$data = [ $data = [
'payment_method' => $_payment->source['id'], 'payment_method' => $_payment->source['id'],
'payment_type' => PaymentType::parseCardType(strtolower($_payment->source['scheme'])), 'payment_type' => PaymentType::parseCardType(strtolower($_payment->source['scheme'])),
'amount' => $this->checkout->payment_hash->data->raw_value, 'amount' => $this->getParent()->payment_hash->data->raw_value,
'transaction_reference' => $_payment->id, 'transaction_reference' => $_payment->id,
]; ];
$payment = $this->checkout->createPayment($data, \App\Models\Payment::STATUS_COMPLETED); $payment = $this->getParent()->createPayment($data, \App\Models\Payment::STATUS_COMPLETED);
SystemLogger::dispatch( SystemLogger::dispatch(
['response' => $_payment, 'data' => $data], ['response' => $_payment, 'data' => $data],
SystemLog::CATEGORY_GATEWAY_RESPONSE, SystemLog::CATEGORY_GATEWAY_RESPONSE,
SystemLog::EVENT_GATEWAY_SUCCESS, SystemLog::EVENT_GATEWAY_SUCCESS,
SystemLog::TYPE_CHECKOUT, SystemLog::TYPE_CHECKOUT,
$this->checkout->client $this->getParent()->client
); );
return redirect()->route('client.payments.show', ['payment' => $this->checkout->encodePrimaryKey($payment->id)]); return redirect()->route('client.payments.show', ['payment' => $this->getParent()->encodePrimaryKey($payment->id)]);
} }
public function processUnsuccessfulPayment(Payment $_payment) public function processUnsuccessfulPayment(Payment $_payment)
{ {
PaymentFailureMailer::dispatch( PaymentFailureMailer::dispatch(
$this->checkout->client, $this->getParent()->client,
$_payment, $_payment,
$this->checkout->client->company, $this->getParent()->client->company,
$this->checkout->payment_hash->data->value $this->getParent()->payment_hash->data->value
); );
$message = [ $message = [
'server_response' => $_payment, 'server_response' => $_payment,
'data' => $this->checkout->payment_hash->data, 'data' => $this->getParent()->payment_hash->data,
]; ];
SystemLogger::dispatch( SystemLogger::dispatch(
@ -95,7 +100,7 @@ trait Utilities
SystemLog::CATEGORY_GATEWAY_RESPONSE, SystemLog::CATEGORY_GATEWAY_RESPONSE,
SystemLog::EVENT_GATEWAY_FAILURE, SystemLog::EVENT_GATEWAY_FAILURE,
SystemLog::TYPE_CHECKOUT, SystemLog::TYPE_CHECKOUT,
$this->checkout->client $this->getParent()->client
); );
throw new PaymentFailed($_payment->status, $_payment->http_code); throw new PaymentFailed($_payment->status, $_payment->http_code);
@ -103,27 +108,10 @@ trait Utilities
private function processPendingPayment(Payment $_payment) private function processPendingPayment(Payment $_payment)
{ {
$data = [
'payment_method' => $_payment->source->id,
'payment_type' => PaymentType::CREDIT_CARD_OTHER,
'amount' => $this->checkout->payment_hash->data->value,
'transaction_reference' => $_payment->id,
];
$payment = $this->checkout->createPayment($data, \App\Models\Payment::STATUS_PENDING);
SystemLogger::dispatch(
['response' => $_payment, 'data' => $data],
SystemLog::CATEGORY_GATEWAY_RESPONSE,
SystemLog::EVENT_GATEWAY_SUCCESS,
SystemLog::TYPE_CHECKOUT,
$this->checkout->client
);
try { try {
return redirect($_payment->_links['redirect']['href']); return redirect($_payment->_links['redirect']['href']);
} catch (Exception $e) { } catch (Exception $e) {
return $this->processInternallyFailedPayment($this->checkout, $e); return $this->processInternallyFailedPayment($this->getParent(), $e);
} }
} }
@ -140,10 +128,10 @@ trait Utilities
$data = [ $data = [
'payment_meta' => $payment_meta, 'payment_meta' => $payment_meta,
'token' => $response->source['id'], 'token' => $response->source['id'],
'payment_method_id' => $this->checkout->payment_hash->data->payment_method_id, 'payment_method_id' => $this->getParent()->payment_hash->data->payment_method_id,
]; ];
return $this->checkout->storePaymentMethod($data); return $this->getParent()->storePaymentMethod($data);
} catch (Exception $e) { } catch (Exception $e) {
session()->flash('message', ctrans('texts.payment_method_saving_failed')); session()->flash('message', ctrans('texts.payment_method_saving_failed'));
} }

View File

@ -12,7 +12,9 @@
namespace App\PaymentDrivers; namespace App\PaymentDrivers;
use App\Http\Requests\Payments\PaymentWebhookRequest;
use App\Models\ClientGatewayToken; use App\Models\ClientGatewayToken;
use App\Models\Company;
use App\Models\GatewayType; use App\Models\GatewayType;
use App\Models\Payment; use App\Models\Payment;
use App\Models\PaymentHash; use App\Models\PaymentHash;
@ -23,6 +25,7 @@ use App\Utils\Traits\SystemLogTrait;
use Checkout\CheckoutApi; use Checkout\CheckoutApi;
use Checkout\Library\Exceptions\CheckoutHttpException; use Checkout\Library\Exceptions\CheckoutHttpException;
use Checkout\Models\Payments\Refund; use Checkout\Models\Payments\Refund;
use Exception;
class CheckoutComPaymentDriver extends BaseDriver class CheckoutComPaymentDriver extends BaseDriver
{ {
@ -134,7 +137,7 @@ class CheckoutComPaymentDriver extends BaseDriver
->route('client.profile.edit', ['client_contact' => auth()->user()->hashed_id]) ->route('client.profile.edit', ['client_contact' => auth()->user()->hashed_id])
->with('missing_required_fields', $this->required_fields); ->with('missing_required_fields', $this->required_fields);
} }
return $this->payment_method->authorizeResponse($data); return $this->payment_method->authorizeResponse($data);
} }
@ -209,5 +212,24 @@ class CheckoutComPaymentDriver extends BaseDriver
public function tokenBilling(ClientGatewayToken $cgt, PaymentHash $payment_hash) public function tokenBilling(ClientGatewayToken $cgt, PaymentHash $payment_hash)
{ {
// ..
}
public function processWebhookRequest(PaymentWebhookRequest $request, Payment $payment = null)
{
$this->init();
$this->setPaymentHash($request->getPaymentHash());
try {
$payment = $this->gateway->payments()->details($request->query('cko-session-id'));
if ($payment->approved) {
return $this->processSuccessfulPayment($payment);
} else {
return $this->processUnsuccessfulPayment($payment);
}
} catch (CheckoutHttpException | Exception $e) {
return $this->processInternallyFailedPayment($this, $e);
}
} }
} }

View File

@ -79,15 +79,14 @@ class InvoiceRepository extends BaseRepository
/** /**
* Handles the restoration on a deleted invoice. * Handles the restoration on a deleted invoice.
* *
* @param [type] $invoice [description] * @param [type] $invoice [description]
* @return [type] [description] * @return [type] [description]
*/ */
public function restore($invoice) :Invoice public function restore($invoice) :Invoice
{ {
//if we have just archived, only perform a soft restore //if we have just archived, only perform a soft restore
if(!$invoice->is_deleted) { if (!$invoice->is_deleted) {
parent::restore($invoice); parent::restore($invoice);
return $invoice; return $invoice;

View File

@ -13,11 +13,9 @@ namespace App\Services\Invoice;
use App\Models\Invoice; use App\Models\Invoice;
use App\Services\AbstractService; use App\Services\AbstractService;
use Illuminate\Support\Facades\DB;
class HandleRestore extends AbstractService class HandleRestore extends AbstractService
{ {
private $invoice; private $invoice;
private $payment_total = 0; private $payment_total = 0;
@ -29,14 +27,13 @@ class HandleRestore extends AbstractService
public function run() public function run()
{ {
if (!$this->invoice->is_deleted) {
if(!$this->invoice->is_deleted)
return $this->invoice; return $this->invoice;
}
//determine whether we need to un-delete payments OR just modify the payment amount /applied balances. //determine whether we need to un-delete payments OR just modify the payment amount /applied balances.
foreach($this->invoice->payments as $payment) foreach ($this->invoice->payments as $payment) {
{
//restore the payment record //restore the payment record
$payment->restore(); $payment->restore();
@ -58,15 +55,12 @@ class HandleRestore extends AbstractService
info($payment->amount . " == " . $payment_amount); info($payment->amount . " == " . $payment_amount);
if($payment->amount == $payment_amount) { if ($payment->amount == $payment_amount) {
$payment->is_deleted = false; $payment->is_deleted = false;
$payment->save(); $payment->save();
$this->payment_total += $payment_amount; $this->payment_total += $payment_amount;
} } else {
else {
$payment->is_deleted = false; $payment->is_deleted = false;
$payment->amount += ($payment_amount - $pre_restore_amount); $payment->amount += ($payment_amount - $pre_restore_amount);
$payment->applied += ($payment_amount - $pre_restore_amount); $payment->applied += ($payment_amount - $pre_restore_amount);
@ -74,13 +68,12 @@ class HandleRestore extends AbstractService
$this->payment_total += ($payment_amount - $pre_restore_amount); $this->payment_total += ($payment_amount - $pre_restore_amount);
} }
} }
//adjust ledger balance //adjust ledger balance
$this->invoice->ledger()->updateInvoiceBalance($this->invoice->balance, 'Restored invoice {$this->invoice->number}')->save(); $this->invoice->ledger()->updateInvoiceBalance($this->invoice->balance, 'Restored invoice {$this->invoice->number}')->save();
//adjust paid to dates //adjust paid to dates
$this->invoice->client->service()->updatePaidToDate($this->payment_total)->save(); $this->invoice->client->service()->updatePaidToDate($this->payment_total)->save();
$this->invoice->client->service()->updateBalance($this->invoice->balance)->save(); $this->invoice->client->service()->updateBalance($this->invoice->balance)->save();
@ -89,13 +82,12 @@ class HandleRestore extends AbstractService
$this->windBackInvoiceNumber(); $this->windBackInvoiceNumber();
return $this->invoice; return $this->invoice;
} }
private function windBackInvoiceNumber() private function windBackInvoiceNumber()
{ {
$findme = '_' . ctrans('texts.deleted'); $findme = '_' . ctrans('texts.deleted');
$pos = strpos($this->invoice->number, $findme); $pos = strpos($this->invoice->number, $findme);
@ -105,11 +97,8 @@ class HandleRestore extends AbstractService
try { try {
$this->invoice->number = $new_invoice_number; $this->invoice->number = $new_invoice_number;
$this->invoice->save(); $this->invoice->save();
} } catch (\Exception $e) {
catch(\Exception $e){
info("I could not wind back the invoice number"); info("I could not wind back the invoice number");
} }
} }
} }

View File

@ -33,8 +33,9 @@ class MarkInvoiceDeleted extends AbstractService
public function run() public function run()
{ {
if($this->invoice->is_deleted) if ($this->invoice->is_deleted) {
return $this->invoice; return $this->invoice;
}
// if(in_array($this->invoice->status_id, ['currencies', 'industries', 'languages', 'countries', 'banks'])) // if(in_array($this->invoice->status_id, ['currencies', 'industries', 'languages', 'countries', 'banks']))
// return $this-> // return $this->
@ -47,7 +48,7 @@ class MarkInvoiceDeleted extends AbstractService
->adjustBalance() ->adjustBalance()
->adjustLedger(); ->adjustLedger();
return $this->invoice; return $this->invoice;
} }
private function adjustLedger() private function adjustLedger()
@ -61,7 +62,7 @@ class MarkInvoiceDeleted extends AbstractService
{ {
$this->invoice->client->service()->updatePaidToDate($this->adjustment_amount * -1)->save(); $this->invoice->client->service()->updatePaidToDate($this->adjustment_amount * -1)->save();
return $this; return $this;
} }
private function adjustBalance() private function adjustBalance()
@ -75,16 +76,12 @@ class MarkInvoiceDeleted extends AbstractService
{ {
//if total payments = adjustment amount - that means we need to delete the payments as well. //if total payments = adjustment amount - that means we need to delete the payments as well.
if($this->adjustment_amount == $this->total_payments) { if ($this->adjustment_amount == $this->total_payments) {
$this->invoice->payments()->update(['payments.deleted_at' => now(), 'payments.is_deleted' => true]); $this->invoice->payments()->update(['payments.deleted_at' => now(), 'payments.is_deleted' => true]);
} else {
}
else {
//adjust payments down by the amount applied to the invoice payment. //adjust payments down by the amount applied to the invoice payment.
$this->invoice->payments->each(function ($payment){ $this->invoice->payments->each(function ($payment) {
$payment_adjustment = $payment->paymentables $payment_adjustment = $payment->paymentables
->where('paymentable_type', '=', 'invoices') ->where('paymentable_type', '=', 'invoices')
->where('paymentable_id', $this->invoice->id) ->where('paymentable_id', $this->invoice->id)
@ -93,7 +90,6 @@ class MarkInvoiceDeleted extends AbstractService
$payment->amount -= $payment_adjustment; $payment->amount -= $payment_adjustment;
$payment->applied -= $payment_adjustment; $payment->applied -= $payment_adjustment;
$payment->save(); $payment->save();
}); });
} }
@ -102,8 +98,7 @@ class MarkInvoiceDeleted extends AbstractService
private function setAdjustmentAmount() private function setAdjustmentAmount()
{ {
foreach ($this->invoice->payments as $payment) {
foreach ($this->invoice->payments as $payment) {
$this->adjustment_amount += $payment->paymentables $this->adjustment_amount += $payment->paymentables
->where('paymentable_type', '=', 'invoices') ->where('paymentable_type', '=', 'invoices')
->where('paymentable_id', $this->invoice->id) ->where('paymentable_id', $this->invoice->id)
@ -118,7 +113,6 @@ class MarkInvoiceDeleted extends AbstractService
private function cleanup() private function cleanup()
{ {
$check = false; $check = false;
$x=0; $x=0;
@ -136,7 +130,6 @@ class MarkInvoiceDeleted extends AbstractService
$this->invoice->expenses()->update(['invoice_id' => null]); $this->invoice->expenses()->update(['invoice_id' => null]);
return $this; return $this;
} }
private function calcNumber($x) private function calcNumber($x)
@ -153,8 +146,7 @@ class MarkInvoiceDeleted extends AbstractService
private function deletePaymentables() private function deletePaymentables()
{ {
$this->invoice->payments->each(function ($payment) {
$this->invoice->payments->each(function ($payment){
$payment->paymentables() $payment->paymentables()
->where('paymentable_type', '=', 'invoices') ->where('paymentable_type', '=', 'invoices')
->where('paymentable_id', $this->invoice->id) ->where('paymentable_id', $this->invoice->id)

View File

@ -192,6 +192,13 @@ class Design extends BaseDesign
$elements = []; $elements = [];
// We don't want to show account balance or invoice total on PDF.. or any amount with currency.
if ($this->type == 'delivery_note') {
$variables = array_filter($variables, function ($m) {
return !in_array($m, ['$invoice.balance_due', '$invoice.total']);
});
}
foreach ($variables as $variable) { foreach ($variables as $variable) {
$_variable = explode('.', $variable)[1]; $_variable = explode('.', $variable)[1];
$_customs = ['custom1', 'custom2', 'custom3', 'custom4']; $_customs = ['custom1', 'custom2', 'custom3', 'custom4'];
@ -293,9 +300,7 @@ class Design extends BaseDesign
$elements = []; $elements = [];
// Some of column can be aliased. This is simple workaround for these. // Some of column can be aliased. This is simple workaround for these.
$aliases = [ $aliases = [];
'$task.product_key' => '$task.service',
];
foreach ($this->context['pdf_variables']["{$type}_columns"] as $column) { foreach ($this->context['pdf_variables']["{$type}_columns"] as $column) {
if (array_key_exists($column, $aliases)) { if (array_key_exists($column, $aliases)) {

View File

@ -23,7 +23,7 @@ class CompanyUserTransformer extends EntityTransformer
* @var array * @var array
*/ */
protected $defaultIncludes = [ protected $defaultIncludes = [
'user', // 'user',
]; ];
/** /**

View File

@ -26,8 +26,7 @@ class UserTransformer extends EntityTransformer
* @var array * @var array
*/ */
protected $defaultIncludes = [ protected $defaultIncludes = [
//'company_users', //'company_user'
// 'token',
]; ];
/** /**

View File

@ -156,10 +156,10 @@ class HtmlEngine
$data['$balance_due'] = ['value' => Number::formatMoney($this->entity->balance, $this->client) ?: '&nbsp;', 'label' => ctrans('texts.balance_due')]; $data['$balance_due'] = ['value' => Number::formatMoney($this->entity->balance, $this->client) ?: '&nbsp;', 'label' => ctrans('texts.balance_due')];
} }
$data['$quote.balance_due'] = &$data['$balance_due']; $data['$quote.balance_due'] = $data['$balance_due'];
$data['$invoice.balance_due'] = &$data['$balance_due']; $data['$invoice.balance_due'] = $data['$balance_due'];
$data['$balance_due'] = &$data['$balance_due']; $data['$balance_due'] = $data['$balance_due'];
$data['$outstanding'] = &$data['$balance_due']; $data['$outstanding'] = $data['$balance_due'];
$data['$partial_due'] = ['value' => Number::formatMoney($this->entity->partial, $this->client) ?: '&nbsp;', 'label' => ctrans('texts.partial_due')]; $data['$partial_due'] = ['value' => Number::formatMoney($this->entity->partial, $this->client) ?: '&nbsp;', 'label' => ctrans('texts.partial_due')];
$data['$total'] = ['value' => Number::formatMoney($this->entity_calc->getTotal(), $this->client) ?: '&nbsp;', 'label' => ctrans('texts.total')]; $data['$total'] = ['value' => Number::formatMoney($this->entity_calc->getTotal(), $this->client) ?: '&nbsp;', 'label' => ctrans('texts.total')];
$data['$amount'] = &$data['$total']; $data['$amount'] = &$data['$total'];
@ -307,7 +307,7 @@ class HtmlEngine
$data['$task.date'] = ['value' => '', 'label' => ctrans('texts.date')]; $data['$task.date'] = ['value' => '', 'label' => ctrans('texts.date')];
$data['$task.discount'] = ['value' => '', 'label' => ctrans('texts.discount')]; $data['$task.discount'] = ['value' => '', 'label' => ctrans('texts.discount')];
$data['$task.product_key'] = ['value' => '', 'label' => ctrans('texts.product_key')]; $data['$task.service'] = ['value' => '', 'label' => ctrans('texts.service')];
$data['$task.description'] = ['value' => '', 'label' => ctrans('texts.description')]; $data['$task.description'] = ['value' => '', 'label' => ctrans('texts.description')];
$data['$task.rate'] = ['value' => '', 'label' => ctrans('texts.rate')]; $data['$task.rate'] = ['value' => '', 'label' => ctrans('texts.rate')];
$data['$task.hours'] = ['value' => '', 'label' => ctrans('texts.hours')]; $data['$task.hours'] = ['value' => '', 'label' => ctrans('texts.hours')];
@ -343,6 +343,8 @@ class HtmlEngine
$data['$item'] = ['value' => '', 'label' => ctrans('texts.item')]; $data['$item'] = ['value' => '', 'label' => ctrans('texts.item')];
$data['$description'] = ['value' => '', 'label' => ctrans('texts.description')]; $data['$description'] = ['value' => '', 'label' => ctrans('texts.description')];
$data['$entity_footer'] = ['value' => $this->client->getSetting("{$this->entity_string}_footer"), 'label' => ''];
// $data['custom_label1'] = ['value' => '', 'label' => ctrans('texts.')]; // $data['custom_label1'] = ['value' => '', 'label' => ctrans('texts.')];
// $data['custom_label2'] = ['value' => '', 'label' => ctrans('texts.')]; // $data['custom_label2'] = ['value' => '', 'label' => ctrans('texts.')];
// $data['custom_label3'] = ['value' => '', 'label' => ctrans('texts.')]; // $data['custom_label3'] = ['value' => '', 'label' => ctrans('texts.')];

View File

@ -103,7 +103,9 @@ class Number
$value = number_format($value, $precision, $decimal, $thousand); $value = number_format($value, $precision, $decimal, $thousand);
$symbol = $currency->symbol; $symbol = $currency->symbol;
if ($client->getSetting('show_currency_code') === true) { if ($client->getSetting('show_currency_code') === true && $currency->code == 'CHF'){
return "{$code} {$value}";
} elseif ($client->getSetting('show_currency_code') === true) {
return "{$value} {$code}"; return "{$value} {$code}";
} elseif ($swapSymbol) { } elseif ($swapSymbol) {
return "{$value} ".trim($symbol); return "{$value} ".trim($symbol);

View File

@ -68,7 +68,7 @@ class Phantom
$file_path = $path.$entity_obj->number.'.pdf'; $file_path = $path.$entity_obj->number.'.pdf';
$url = config('ninja.app_url').'phantom/'.$entity.'/'.$invitation->key.'?phantomjs_secret='.config('ninja.phantomjs_secret'); $url = config('ninja.app_url').'/phantom/'.$entity.'/'.$invitation->key.'?phantomjs_secret='.config('ninja.phantomjs_secret');
info($url); info($url);
$key = config('ninja.phantomjs_key'); $key = config('ninja.phantomjs_key');

View File

@ -11,8 +11,6 @@
namespace App\Utils; namespace App\Utils;
use App\Http\Requests\Setup\CheckDatabaseRequest;
use App\Http\Requests\Setup\CheckMailRequest;
use App\Libraries\MultiDB; use App\Libraries\MultiDB;
use App\Mail\TestMailServer; use App\Mail\TestMailServer;
use Exception; use Exception;
@ -160,11 +158,11 @@ class SystemHealth
{ {
$result = ['success' => false]; $result = ['success' => false];
if ($request && $request instanceof CheckDatabaseRequest) { if ($request) {
config(['database.connections.db-ninja-01.host'=> $request->input('host')]); config(['database.connections.db-ninja-01.host'=> $request->input('db_host')]);
config(['database.connections.db-ninja-01.database'=> $request->input('database')]); config(['database.connections.db-ninja-01.database'=> $request->input('db_database')]);
config(['database.connections.db-ninja-01.username'=> $request->input('username')]); config(['database.connections.db-ninja-01.username'=> $request->input('db_username')]);
config(['database.connections.db-ninja-01.password'=> $request->input('password')]); config(['database.connections.db-ninja-01.password'=> $request->input('db_password')]);
config(['database.default' => 'db-ninja-01']); config(['database.default' => 'db-ninja-01']);
DB::purge('db-ninja-01'); DB::purge('db-ninja-01');
@ -191,6 +189,7 @@ class SystemHealth
} catch (Exception $e) { } catch (Exception $e) {
$result[] = [config('database.connections.'.config('database.default').'.database') => false]; $result[] = [config('database.connections.'.config('database.default').'.database') => false];
$result['success'] = false; $result['success'] = false;
$result['message'] = $e->getMessage();
} }
} }
} }
@ -209,35 +208,24 @@ class SystemHealth
return []; return [];
} }
if ($request && $request instanceof CheckMailRequest) { if ($request) {
config(['mail.driver' => $request->input('driver')]); config(['mail.driver' => $request->input('mail_driver')]);
config(['mail.host' => $request->input('host')]); config(['mail.host' => $request->input('mail_host')]);
config(['mail.port' => $request->input('port')]); config(['mail.port' => $request->input('mail_port')]);
config(['mail.from.address' => $request->input('from_address')]); config(['mail.from.address' => $request->input('mail_address')]);
config(['mail.from.name' => $request->input('from_name')]); config(['mail.from.name' => $request->input('mail_name')]);
config(['mail.encryption' => $request->input('encryption')]); config(['mail.encryption' => $request->input('encryption')]);
config(['mail.username' => $request->input('username')]); config(['mail.username' => $request->input('mail_username')]);
config(['mail.password' => $request->input('password')]); config(['mail.password' => $request->input('mail_password')]);
} }
try { try {
Mail::to(config('mail.from.address'))->send(new TestMailServer('Email Server Works!', config('mail.from.address'))); Mail::to(config('mail.from.address'))->send(new TestMailServer('Email Server Works!', config('mail.from.address')));
} catch (Exception $e) { } catch (Exception $e) {
return [$e->getMessage()]; return ['success' => false, 'message' => $e->getMessage()];
} }
/* return ['success' => true];
* 'message' => 'count(): Parameter must be an array or an object that implements Countable',
* 'action' => 'SetupController::checkMail()',
*
* count(Mail::failures())
*/
if (Mail::failures() > 0) {
return Mail::failures();
}
return response()->json(['message' => 'Success'], 200);
} }
private static function checkEnvWritable() private static function checkEnvWritable()

View File

@ -601,22 +601,37 @@ trait GeneratesCounter
$replace[] = str_replace($format, $date, $matches[1]); $replace[] = str_replace($format, $date, $matches[1]);
} }
if ($entity instanceof Client || $entity instanceof Vendor) { if ($entity instanceof Vendor) {
$search[] = '{$client_custom1}';
$replace[] = $entity->custom_value1;
$search[] = '{$client_custom2}'; $search[] = '{$vendor_id_number}';
$replace[] = $entity->custom_value2;
$search[] = '{$client_custom3}';
$replace[] = $entity->custom_value3;
$search[] = '{$client_custom4}';
$replace[] = $entity->custom_value4;
$search[] = '{$id_number}';
$replace[] = $entity->id_number; $replace[] = $entity->id_number;
} else {
}
if ($entity instanceof Expense) {
if($entity->vendor){
$search[] = '{$vendor_id_number}';
$replace[] = $entity->vendor->id_number;
$search[] = '{$vendor_custom1}';
$replace[] = $entity->vendor->custom_value1;
$search[] = '{$vendor_custom2}';
$replace[] = $entity->vendor->custom_value2;
$search[] = '{$vendor_custom3}';
$replace[] = $entity->vendor->custom_value3;
$search[] = '{$vendor_custom4}';
$replace[] = $entity->vendor->custom_value4;
}
$search[] = '{$expense_id_number}';
$replace[] = $entity->id_number;
}
if ($entity->client) {
$search[] = '{$client_custom1}'; $search[] = '{$client_custom1}';
$replace[] = $entity->client->custom_value1; $replace[] = $entity->client->custom_value1;
@ -629,7 +644,7 @@ trait GeneratesCounter
$search[] = '{$client_custom4}'; $search[] = '{$client_custom4}';
$replace[] = $entity->client->custom_value4; $replace[] = $entity->client->custom_value4;
$search[] = '{$id_number}'; $search[] = '{$client_id_number}';
$replace[] = $entity->client->id_number; $replace[] = $entity->client->id_number;
} }

View File

@ -50,14 +50,14 @@ trait Inviteable
switch ($this->company->portal_mode) { switch ($this->company->portal_mode) {
case 'subdomain': case 'subdomain':
return $domain.'client/'.$entity_type.'/'.$this->key; return $domain.'/client/'.$entity_type.'/'.$this->key;
break; break;
case 'iframe': case 'iframe':
return $domain.'client/'.$entity_type.'/'.$this->key; return $domain.'/client/'.$entity_type.'/'.$this->key;
//return $domain . $entity_type .'/'. $this->contact->client->client_hash .'/'. $this->key; //return $domain . $entity_type .'/'. $this->contact->client->client_hash .'/'. $this->key;
break; break;
case 'domain': case 'domain':
return $domain.'client/'.$entity_type.'/'.$this->key; return $domain.'/client/'.$entity_type.'/'.$this->key;
break; break;
default: default:

View File

@ -617,6 +617,7 @@ trait MakesInvoiceValues
} }
$data[$key][$table_type.'.product_key'] = $item->product_key; $data[$key][$table_type.'.product_key'] = $item->product_key;
$data[$key][$table_type.'.service'] = is_null(optional($item)->service) ? $item->product_key : $item->service;
$data[$key][$table_type.'.notes'] = $item->notes; $data[$key][$table_type.'.notes'] = $item->notes;
$data[$key][$table_type.'.description'] = $item->notes; $data[$key][$table_type.'.description'] = $item->notes;
$data[$key][$table_type.'.custom_value1'] = $item->custom_value1; $data[$key][$table_type.'.custom_value1'] = $item->custom_value1;

View File

@ -191,7 +191,7 @@ trait MakesTemplateData
$data['$product.line_total'] = ['value' => '$20.00', 'label' => ctrans('texts.line_total')]; $data['$product.line_total'] = ['value' => '$20.00', 'label' => ctrans('texts.line_total')];
$data['$task.date'] = ['value' => '2010-02-03', 'label' => ctrans('texts.date')]; $data['$task.date'] = ['value' => '2010-02-03', 'label' => ctrans('texts.date')];
$data['$task.discount'] = ['value' => '5%', 'label' => ctrans('texts.discount')]; $data['$task.discount'] = ['value' => '5%', 'label' => ctrans('texts.discount')];
$data['$task.product_key'] = ['value' => 'key', 'label' => ctrans('texts.product_key')]; $data['$task.service'] = ['value' => 'key', 'label' => ctrans('texts.service')];
$data['$task.notes'] = ['value' => 'Note for Tasks', 'label' => ctrans('texts.notes')]; $data['$task.notes'] = ['value' => 'Note for Tasks', 'label' => ctrans('texts.notes')];
$data['$task.rate'] = ['value' => '$100.00', 'label' => ctrans('texts.rate')]; $data['$task.rate'] = ['value' => '$100.00', 'label' => ctrans('texts.rate')];
$data['$task.hours'] = ['value' => '1', 'label' => ctrans('texts.hours')]; $data['$task.hours'] = ['value' => '1', 'label' => ctrans('texts.hours')];

View File

@ -51,9 +51,9 @@
"league/flysystem-cached-adapter": "^1.1", "league/flysystem-cached-adapter": "^1.1",
"league/fractal": "^0.17.0", "league/fractal": "^0.17.0",
"league/omnipay": "^3.0", "league/omnipay": "^3.0",
"livewire/livewire": "^1.3", "livewire/livewire": "^2.0",
"maennchen/zipstream-php": "^1.2", "maennchen/zipstream-php": "^1.2",
"nwidart/laravel-modules": "^6.0", "nwidart/laravel-modules": "^8.0",
"omnipay/paypal": "^3.0", "omnipay/paypal": "^3.0",
"predis/predis": "^1.1", "predis/predis": "^1.1",
"sentry/sentry-laravel": "^2", "sentry/sentry-laravel": "^2",

35
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically" "This file is @generated automatically"
], ],
"content-hash": "ef60a891b86ee73c6f31b73f0e778e09", "content-hash": "a96274475177046a99ed701ae4148a3d",
"packages": [ "packages": [
{ {
"name": "asgrim/ofxparser", "name": "asgrim/ofxparser",
@ -3712,30 +3712,32 @@
}, },
{ {
"name": "livewire/livewire", "name": "livewire/livewire",
"version": "v1.3.5", "version": "v2.3.5",
"source": { "source": {
"type": "git", "type": "git",
"url": "https://github.com/livewire/livewire.git", "url": "https://github.com/livewire/livewire.git",
"reference": "b1673ff9fc78a3296ca4a3b0d1ca26da0a5cdf82" "reference": "781a1250dc8eab9121fd856ff0b6efca8c32756f"
}, },
"dist": { "dist": {
"type": "zip", "type": "zip",
"url": "https://api.github.com/repos/livewire/livewire/zipball/b1673ff9fc78a3296ca4a3b0d1ca26da0a5cdf82", "url": "https://api.github.com/repos/livewire/livewire/zipball/781a1250dc8eab9121fd856ff0b6efca8c32756f",
"reference": "b1673ff9fc78a3296ca4a3b0d1ca26da0a5cdf82", "reference": "781a1250dc8eab9121fd856ff0b6efca8c32756f",
"shasum": "" "shasum": ""
}, },
"require": { "require": {
"illuminate/database": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0|^8.0", "illuminate/database": "^7.0|^8.0",
"illuminate/support": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0|^8.0", "illuminate/support": "^7.0|^8.0",
"illuminate/validation": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0|^8.0", "illuminate/validation": "^7.0|^8.0",
"php": "^7.1.3", "php": "^7.2.5|^8.0",
"symfony/http-kernel": "^4.0|^5.0" "symfony/http-kernel": "^5.0"
}, },
"require-dev": { "require-dev": {
"laravel/framework": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0", "calebporzio/sushi": "^2.1",
"laravel/framework": "^7.0|^8.0",
"mockery/mockery": "^1.3.1", "mockery/mockery": "^1.3.1",
"orchestra/testbench": "~3.6.0|~3.7.0|~3.8.0|^4.0|^5.0", "orchestra/testbench": "^5.0|^6.0",
"phpunit/phpunit": "^7.5.15|^8.4|^9.0", "orchestra/testbench-dusk": "^5.2|^6.0",
"phpunit/phpunit": "^8.4|^9.0",
"psy/psysh": "@stable" "psy/psysh": "@stable"
}, },
"type": "library", "type": "library",
@ -3750,6 +3752,9 @@
} }
}, },
"autoload": { "autoload": {
"files": [
"src/helpers.php"
],
"psr-4": { "psr-4": {
"Livewire\\": "src/" "Livewire\\": "src/"
} }
@ -3767,7 +3772,7 @@
"description": "A front-end framework for Laravel.", "description": "A front-end framework for Laravel.",
"support": { "support": {
"issues": "https://github.com/livewire/livewire/issues", "issues": "https://github.com/livewire/livewire/issues",
"source": "https://github.com/livewire/livewire/tree/v1.3.5" "source": "https://github.com/livewire/livewire/tree/v2.3.5"
}, },
"funding": [ "funding": [
{ {
@ -3775,7 +3780,7 @@
"type": "github" "type": "github"
} }
], ],
"time": "2020-09-17T04:38:16+00:00" "time": "2020-12-01T20:51:29+00:00"
}, },
{ {
"name": "maennchen/zipstream-php", "name": "maennchen/zipstream-php",

View File

@ -10,9 +10,9 @@ return [
'app_name' => env('APP_NAME'), 'app_name' => env('APP_NAME'),
'app_env' => env('APP_ENV', 'selfhosted'), 'app_env' => env('APP_ENV', 'selfhosted'),
'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', ''), 'app_domain' => env('APP_DOMAIN', ''),
'app_version' => '5.0.33', 'app_version' => '5.0.34',
'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),

81
package-lock.json generated
View File

@ -1508,64 +1508,22 @@
"integrity": "sha1-DeiJpgEgOQmw++B7iTjcIdLpZ7w=" "integrity": "sha1-DeiJpgEgOQmw++B7iTjcIdLpZ7w="
}, },
"adjust-sourcemap-loader": { "adjust-sourcemap-loader": {
"version": "2.0.0", "version": "3.0.0",
"resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz", "resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz",
"integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==", "integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==",
"requires": { "requires": {
"assert": "1.4.1", "loader-utils": "^2.0.0",
"camelcase": "5.0.0", "regex-parser": "^2.2.11"
"loader-utils": "1.2.3",
"object-path": "0.11.4",
"regex-parser": "2.2.10"
}, },
"dependencies": { "dependencies": {
"assert": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz",
"integrity": "sha1-mZEtWRg2tab1s0XA8H7vwI/GXZE=",
"requires": {
"util": "0.10.3"
}
},
"camelcase": {
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.0.0.tgz",
"integrity": "sha512-faqwZqnWxbxn+F1d399ygeamQNy3lPp/H9H6rNrqYh4FSVCtcY+3cub1MxA8o9mDd55mM8Aghuu/kuyYA6VTsA=="
},
"emojis-list": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz",
"integrity": "sha1-TapNnbAPmBmIDHn6RXrlsJof04k="
},
"inherits": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
"integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE="
},
"json5": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
"integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
"requires": {
"minimist": "^1.2.0"
}
},
"loader-utils": { "loader-utils": {
"version": "1.2.3", "version": "2.0.0",
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz", "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
"integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==", "integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
"requires": { "requires": {
"big.js": "^5.2.2", "big.js": "^5.2.2",
"emojis-list": "^2.0.0", "emojis-list": "^3.0.0",
"json5": "^1.0.1" "json5": "^2.1.2"
}
},
"util": {
"version": "0.10.3",
"resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
"integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
"requires": {
"inherits": "2.0.1"
} }
} }
} }
@ -6698,11 +6656,6 @@
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4=" "integrity": "sha1-HEfyct8nfzsdrwYWd9nILiMixg4="
}, },
"object-path": {
"version": "0.11.4",
"resolved": "https://registry.npmjs.org/object-path/-/object-path-0.11.4.tgz",
"integrity": "sha1-NwrnUvvzfePqcKhhwju6iRVpGUk="
},
"object-visit": { "object-visit": {
"version": "1.0.1", "version": "1.0.1",
"resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
@ -8192,9 +8145,9 @@
} }
}, },
"regex-parser": { "regex-parser": {
"version": "2.2.10", "version": "2.2.11",
"resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz", "resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz",
"integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA==" "integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q=="
}, },
"regexp.prototype.flags": { "regexp.prototype.flags": {
"version": "1.3.0", "version": "1.3.0",
@ -8355,11 +8308,11 @@
"integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=" "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
}, },
"resolve-url-loader": { "resolve-url-loader": {
"version": "3.1.1", "version": "3.1.2",
"resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz",
"integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==", "integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==",
"requires": { "requires": {
"adjust-sourcemap-loader": "2.0.0", "adjust-sourcemap-loader": "3.0.0",
"camelcase": "5.3.1", "camelcase": "5.3.1",
"compose-function": "3.0.3", "compose-function": "3.0.3",
"convert-source-map": "1.7.0", "convert-source-map": "1.7.0",

View File

@ -28,7 +28,7 @@
"jsignature": "^2.1.3", "jsignature": "^2.1.3",
"laravel-mix": "^5.0.7", "laravel-mix": "^5.0.7",
"lodash": "^4.17.20", "lodash": "^4.17.20",
"resolve-url-loader": "^3.1.0", "resolve-url-loader": "^3.1.2",
"sass": "^1.26.10", "sass": "^1.26.10",
"sass-loader": "^8.0.0", "sass-loader": "^8.0.0",
"tailwindcss": "^1.6.2" "tailwindcss": "^1.6.2"

2
public/css/app.css vendored

File diff suppressed because one or more lines are too long

View File

@ -3,36 +3,36 @@ const MANIFEST = 'flutter-app-manifest';
const TEMP = 'flutter-temp-cache'; const TEMP = 'flutter-temp-cache';
const CACHE_NAME = 'flutter-app-cache'; const CACHE_NAME = 'flutter-app-cache';
const RESOURCES = { const RESOURCES = {
"version.json": "32afcc2282ccf7746c00708ef0601017", "version.json": "aeea8a1fbb79cee45facc28ba9a6baf7",
"favicon.ico": "51636d3a390451561744c42188ccd628",
"main.dart.js": "b3c0b8b130688ccb988a28e1ec1f4a26",
"/": "23224b5e03519aaa87594403d54412cf",
"favicon.png": "dca91c54388f52eded692718d5a98b8b",
"assets/AssetManifest.json": "659dcf9d1baf3aed3ab1b9c42112bf8f",
"assets/fonts/MaterialIcons-Regular.otf": "1288c9e28052e028aba623321f7826ac",
"assets/FontManifest.json": "cf3c681641169319e61b61bd0277378f",
"assets/packages/material_design_icons_flutter/lib/fonts/materialdesignicons-webfont.ttf": "c1242726c7eac4eb5e843d826f78fb1b",
"assets/assets/images/logo.png": "090f69e23311a4b6d851b3880ae52541", "assets/assets/images/logo.png": "090f69e23311a4b6d851b3880ae52541",
"assets/assets/images/google-icon.png": "0f118259ce403274f407f5e982e681c3", "assets/assets/images/google-icon.png": "0f118259ce403274f407f5e982e681c3",
"assets/assets/images/payment_types/carteblanche.png": "d936e11fa3884b8c9f1bd5c914be8629",
"assets/assets/images/payment_types/solo.png": "2030c3ccaccf5d5e87916a62f5b084d6",
"assets/assets/images/payment_types/paypal.png": "8e06c094c1871376dfea1da8088c29d1", "assets/assets/images/payment_types/paypal.png": "8e06c094c1871376dfea1da8088c29d1",
"assets/assets/images/payment_types/ach.png": "7433f0aff779dc98a649b7a2daf777cf",
"assets/assets/images/payment_types/unionpay.png": "7002f52004e0ab8cc0b7450b0208ccb2",
"assets/assets/images/payment_types/dinerscard.png": "06d85186ba858c18ab7c9caa42c92024",
"assets/assets/images/payment_types/mastercard.png": "6f6cdc29ee2e22e06b1ac029cb52ef71",
"assets/assets/images/payment_types/amex.png": "c49a4247984b3732a4af50a3390aa978",
"assets/assets/images/payment_types/other.png": "d936e11fa3884b8c9f1bd5c914be8629",
"assets/assets/images/payment_types/maestro.png": "e533b92bfb50339fdbfa79e3dfe81f08", "assets/assets/images/payment_types/maestro.png": "e533b92bfb50339fdbfa79e3dfe81f08",
"assets/assets/images/payment_types/visa.png": "3ddc4a4d25c946e8ad7e6998f30fd4e3",
"assets/assets/images/payment_types/laser.png": "b4e6e93dd35517ac429301119ff05868", "assets/assets/images/payment_types/laser.png": "b4e6e93dd35517ac429301119ff05868",
"assets/assets/images/payment_types/switch.png": "4fa11c45327f5fdc20205821b2cfd9cc", "assets/assets/images/payment_types/amex.png": "c49a4247984b3732a4af50a3390aa978",
"assets/assets/images/payment_types/jcb.png": "07e0942d16c5592118b72e74f2f7198c", "assets/assets/images/payment_types/dinerscard.png": "06d85186ba858c18ab7c9caa42c92024",
"assets/assets/images/payment_types/ach.png": "7433f0aff779dc98a649b7a2daf777cf",
"assets/assets/images/payment_types/other.png": "d936e11fa3884b8c9f1bd5c914be8629",
"assets/assets/images/payment_types/solo.png": "2030c3ccaccf5d5e87916a62f5b084d6",
"assets/assets/images/payment_types/discover.png": "6c0a386a00307f87db7bea366cca35f5", "assets/assets/images/payment_types/discover.png": "6c0a386a00307f87db7bea366cca35f5",
"assets/assets/images/payment_types/jcb.png": "07e0942d16c5592118b72e74f2f7198c",
"assets/assets/images/payment_types/switch.png": "4fa11c45327f5fdc20205821b2cfd9cc",
"assets/assets/images/payment_types/carteblanche.png": "d936e11fa3884b8c9f1bd5c914be8629",
"assets/assets/images/payment_types/visa.png": "3ddc4a4d25c946e8ad7e6998f30fd4e3",
"assets/assets/images/payment_types/mastercard.png": "6f6cdc29ee2e22e06b1ac029cb52ef71",
"assets/assets/images/payment_types/unionpay.png": "7002f52004e0ab8cc0b7450b0208ccb2",
"assets/fonts/MaterialIcons-Regular.otf": "1288c9e28052e028aba623321f7826ac",
"assets/AssetManifest.json": "659dcf9d1baf3aed3ab1b9c42112bf8f",
"assets/FontManifest.json": "cf3c681641169319e61b61bd0277378f",
"assets/NOTICES": "7d8f2aa600c3ae24c9efdad38c9f53b4", "assets/NOTICES": "7d8f2aa600c3ae24c9efdad38c9f53b4",
"assets/packages/material_design_icons_flutter/lib/fonts/materialdesignicons-webfont.ttf": "c1242726c7eac4eb5e843d826f78fb1b",
"main.dart.js": "d361e1c5411cf7fe77a39c60139a0073",
"favicon.png": "dca91c54388f52eded692718d5a98b8b",
"/": "23224b5e03519aaa87594403d54412cf",
"favicon.ico": "51636d3a390451561744c42188ccd628",
"manifest.json": "77215c1737c7639764e64a192be2f7b8", "manifest.json": "77215c1737c7639764e64a192be2f7b8",
"icons/Icon-192.png": "bb1cf5f6982006952211c7c8404ffbed", "icons/Icon-512.png": "0f9aff01367f0a0c69773d25ca16ef35",
"icons/Icon-512.png": "0f9aff01367f0a0c69773d25ca16ef35" "icons/Icon-192.png": "bb1cf5f6982006952211c7c8404ffbed"
}; };
// The application shell files that are downloaded before a service worker can // The application shell files that are downloaded before a service worker can

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

205993
public/main.dart.js vendored

File diff suppressed because one or more lines are too long

View File

@ -1,6 +1,6 @@
{ {
"/js/app.js": "/js/app.js?id=a33a5a58bfc6e2174841", "/js/app.js": "/js/app.js?id=a33a5a58bfc6e2174841",
"/css/app.css": "/css/app.css?id=2fee89354bd20f89bf73", "/css/app.css": "/css/app.css?id=fb5c591f4280af2b670a",
"/js/clients/invoices/action-selectors.js": "/js/clients/invoices/action-selectors.js?id=a09bb529b8e1826f13b4", "/js/clients/invoices/action-selectors.js": "/js/clients/invoices/action-selectors.js?id=a09bb529b8e1826f13b4",
"/js/clients/invoices/payment.js": "/js/clients/invoices/payment.js?id=8ce8955ba775ea5f47d1", "/js/clients/invoices/payment.js": "/js/clients/invoices/payment.js?id=8ce8955ba775ea5f47d1",
"/js/clients/payment_methods/authorize-authorize-card.js": "/js/clients/payment_methods/authorize-authorize-card.js?id=cddcd46c630c71737bda", "/js/clients/payment_methods/authorize-authorize-card.js": "/js/clients/payment_methods/authorize-authorize-card.js?id=cddcd46c630c71737bda",
@ -15,6 +15,6 @@
"/js/clients/quotes/approve.js": "/js/clients/quotes/approve.js?id=85bcae0a646882e56b12", "/js/clients/quotes/approve.js": "/js/clients/quotes/approve.js?id=85bcae0a646882e56b12",
"/js/clients/shared/multiple-downloads.js": "/js/clients/shared/multiple-downloads.js?id=5c35d28cf0a3286e7c45", "/js/clients/shared/multiple-downloads.js": "/js/clients/shared/multiple-downloads.js?id=5c35d28cf0a3286e7c45",
"/js/clients/shared/pdf.js": "/js/clients/shared/pdf.js?id=fa54bb4229aba6b0817c", "/js/clients/shared/pdf.js": "/js/clients/shared/pdf.js?id=fa54bb4229aba6b0817c",
"/js/setup/setup.js": "/js/setup/setup.js?id=34b53878aeaca14a2b33", "/js/setup/setup.js": "/js/setup/setup.js?id=725362f2ed393909fc8b",
"/css/card-js.min.css": "/css/card-js.min.css?id=62afeb675235451543ad" "/css/card-js.min.css": "/css/card-js.min.css?id=62afeb675235451543ad"
} }

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"/livewire.js":"/livewire.js?id=d7d975b5d122717a1ee0"} {"/livewire.js":"/livewire.js?id=eb510e851dceb24afd36"}

View File

@ -1 +1 @@
{"app_name":"invoiceninja_flutter","version":"5.0.27","build_number":"27"} {"app_name":"invoiceninja_flutter","version":"5.0.28","build_number":"28"}

View File

@ -24,10 +24,10 @@ class Setup {
handleDatabaseCheck() { handleDatabaseCheck() {
let data = { let data = {
host: document.querySelector('input[name="host"]').value, db_host: document.querySelector('input[name="db_host"]').value,
database: document.querySelector('input[name="database"]').value, db_database: document.querySelector('input[name="db_database"]').value,
username: document.querySelector('input[name="db_username"]').value, db_username: document.querySelector('input[name="db_username"]').value,
password: document.querySelector('input[name="db_password"]').value, db_password: document.querySelector('input[name="db_password"]').value,
}; };
Axios.post('/setup/check_db', data) Axios.post('/setup/check_db', data)
@ -39,17 +39,17 @@ class Setup {
handleSmtpCheck() { handleSmtpCheck() {
let data = { let data = {
driver: document.querySelector('select[name="mail_driver"]').value, mail_driver: document.querySelector('select[name="mail_driver"]').value,
from_name: document.querySelector('input[name="mail_name"]').value, mail_name: document.querySelector('input[name="mail_name"]').value,
from_address: document.querySelector('input[name="mail_address"]') mail_address: document.querySelector('input[name="mail_address"]')
.value, .value,
username: document.querySelector('input[name="mail_username"]') mail_username: document.querySelector('input[name="mail_username"]')
.value, .value,
host: document.querySelector('input[name="mail_host"]').value, mail_host: document.querySelector('input[name="mail_host"]').value,
port: document.querySelector('input[name="mail_port"]').value, mail_port: document.querySelector('input[name="mail_port"]').value,
encryption: document.querySelector('select[name="encryption"]') encryption: document.querySelector('select[name="encryption"]')
.value, .value,
password: document.querySelector('input[name="mail_password"]') mail_password: document.querySelector('input[name="mail_password"]')
.value, .value,
}; };

View File

@ -68,8 +68,8 @@ $LANG = [
'tax_rates' => 'Steuersätze', 'tax_rates' => 'Steuersätze',
'rate' => 'Satz', 'rate' => 'Satz',
'settings' => 'Einstellungen', 'settings' => 'Einstellungen',
'enable_invoice_tax' => 'Ermögliche das Bestimmen einer <strong>Rechnungssteuer</strong>', 'enable_invoice_tax' => 'Ermögliche das Bestimmen einer Rechnungssteuer',
'enable_line_item_tax' => 'Ermögliche das Bestimmen von <strong>Steuern für Belegpositionen</strong>', 'enable_line_item_tax' => 'Ermögliche das Bestimmen von Steuern für Belegpositionen',
'dashboard' => 'Dashboard', 'dashboard' => 'Dashboard',
'clients' => 'Kunden', 'clients' => 'Kunden',
'invoices' => 'Rechnungen', 'invoices' => 'Rechnungen',
@ -95,9 +95,9 @@ $LANG = [
'powered_by' => 'Unterstützt durch', 'powered_by' => 'Unterstützt durch',
'no_items' => 'Keine Objekte', 'no_items' => 'Keine Objekte',
'recurring_invoices' => 'Wiederkehrende Rechnungen', 'recurring_invoices' => 'Wiederkehrende Rechnungen',
'recurring_help' => '<p>Automatically send clients the same invoices weekly, bi-monthly, monthly, quarterly or annually. </p> 'recurring_help' => 'Automatically send clients the same invoices weekly, bi-monthly, monthly, quarterly or annually.
<p>Use :MONTH, :QUARTER or :YEAR for dynamic dates. Basic math works as well, for example :MONTH-1.</p> Use :MONTH, :QUARTER or :YEAR for dynamic dates. Basic math works as well, for example :MONTH-1.
<p>Examples of dynamic invoice variables:</p> Examples of dynamic invoice variables:
<ul> <ul>
<li>"Gym membership for the month of :MONTH" >> "Gym membership for the month of July"</li> <li>"Gym membership for the month of :MONTH" >> "Gym membership for the month of July"</li>
<li>":YEAR+1 yearly subscription" >> "2015 Yearly Subscription"</li> <li>":YEAR+1 yearly subscription" >> "2015 Yearly Subscription"</li>
@ -172,9 +172,9 @@ $LANG = [
'payment_gateway' => 'Zahlungseingang', 'payment_gateway' => 'Zahlungseingang',
'gateway_id' => 'Zahlungsanbieter', 'gateway_id' => 'Zahlungsanbieter',
'email_notifications' => 'E-Mail Benachrichtigungen', 'email_notifications' => 'E-Mail Benachrichtigungen',
'email_sent' => 'Benachrichtigen, wenn eine Rechnung <strong>versendet</strong> wurde', 'email_sent' => 'Benachrichtigen, wenn eine Rechnung versendet wurde',
'email_viewed' => 'Benachrichtigen, wenn eine Rechnung <strong>betrachtet</strong> wurde', 'email_viewed' => 'Benachrichtigen, wenn eine Rechnung betrachtet wurde',
'email_paid' => 'Benachrichtigen, wenn eine Rechnung <strong>bezahlt</strong> wurde', 'email_paid' => 'Benachrichtigen, wenn eine Rechnung bezahlt wurde',
'site_updates' => 'Webseitenaktualisierungen', 'site_updates' => 'Webseitenaktualisierungen',
'custom_messages' => 'Benutzerdefinierte Nachrichten', 'custom_messages' => 'Benutzerdefinierte Nachrichten',
'default_email_footer' => 'Standard-E-Mail Signatur', 'default_email_footer' => 'Standard-E-Mail Signatur',
@ -271,7 +271,7 @@ $LANG = [
'password' => 'Passwort', 'password' => 'Passwort',
'pro_plan_product' => 'Pro Plan', 'pro_plan_product' => 'Pro Plan',
'pro_plan_success' => 'Danke, dass Sie Invoice Ninja\'s Pro gewählt haben!<p/>&nbsp;<br/> 'pro_plan_success' => 'Danke, dass Sie Invoice Ninja\'s Pro gewählt haben!<p/>&nbsp;<br/>
<b>Nächste Schritte</b>Eine bezahlbare Rechnung wurde an die Mailadresse, Nächste SchritteEine bezahlbare Rechnung wurde an die Mailadresse,
welche mit Ihrem Account verbunden ist, geschickt. Um alle der umfangreichen welche mit Ihrem Account verbunden ist, geschickt. Um alle der umfangreichen
Pro Funktionen freizuschalten, folgen Sie bitte den Anweisungen in der Rechnung um ein Jahr Pro Funktionen freizuschalten, folgen Sie bitte den Anweisungen in der Rechnung um ein Jahr
die Pro Funktionen zu nutzen. die Pro Funktionen zu nutzen.
@ -290,9 +290,9 @@ $LANG = [
'product' => 'Produkt', 'product' => 'Produkt',
'products' => 'Produkte', 'products' => 'Produkte',
'fill_products' => 'Produkte automatisch ausfüllen', 'fill_products' => 'Produkte automatisch ausfüllen',
'fill_products_help' => 'Beim Auswählen eines Produktes werden automatisch <strong>Beschreibung und Kosten ausgefüllt</strong>', 'fill_products_help' => 'Beim Auswählen eines Produktes werden automatisch Beschreibung und Kosten ausgefüllt',
'update_products' => 'Produkte automatisch aktualisieren', 'update_products' => 'Produkte automatisch aktualisieren',
'update_products_help' => 'Beim Aktualisieren einer Rechnung werden die <strong>Produkte automatisch aktualisiert</strong>', 'update_products_help' => 'Beim Aktualisieren einer Rechnung werden die Produkte automatisch aktualisiert',
'create_product' => 'Produkt erstellen', 'create_product' => 'Produkt erstellen',
'edit_product' => 'Produkt bearbeiten', 'edit_product' => 'Produkt bearbeiten',
'archive_product' => 'Produkt archivieren', 'archive_product' => 'Produkt archivieren',
@ -498,7 +498,7 @@ $LANG = [
'send_email' => 'E-Mail senden', 'send_email' => 'E-Mail senden',
'set_password' => 'Passwort festlegen', 'set_password' => 'Passwort festlegen',
'converted' => 'Umgewandelt', 'converted' => 'Umgewandelt',
'email_approved' => 'Per E-Mail benachrichtigen, wenn ein Angebot <b>angenommen</b> wurde', 'email_approved' => 'Per E-Mail benachrichtigen, wenn ein Angebot angenommen wurde',
'notification_quote_approved_subject' => 'Angebot :invoice wurde von :client angenommen.', 'notification_quote_approved_subject' => 'Angebot :invoice wurde von :client angenommen.',
'notification_quote_approved' => 'Der folgende Kunde :client nahm das Angebot :invoice über :amount an.', 'notification_quote_approved' => 'Der folgende Kunde :client nahm das Angebot :invoice über :amount an.',
'resend_confirmation' => 'Bestätigungsmail erneut senden', 'resend_confirmation' => 'Bestätigungsmail erneut senden',
@ -617,7 +617,7 @@ $LANG = [
'email_error' => 'Es gab ein Problem beim Senden dieser E-Mail.', 'email_error' => 'Es gab ein Problem beim Senden dieser E-Mail.',
'confirm_recurring_timing' => 'Beachten Sie: E-Mails werden zu jeder vollen Stunde versendet.', 'confirm_recurring_timing' => 'Beachten Sie: E-Mails werden zu jeder vollen Stunde versendet.',
'confirm_recurring_timing_not_sent' => 'Beachten Sie: E-Mails werden zu jeder vollen Stunde versendet.', 'confirm_recurring_timing_not_sent' => 'Beachten Sie: E-Mails werden zu jeder vollen Stunde versendet.',
'payment_terms_help' => 'Setzt das <b>Standardfälligkeitsdatum</b>', 'payment_terms_help' => 'Setzt das Standardfälligkeitsdatum',
'unlink_account' => 'Konten trennen', 'unlink_account' => 'Konten trennen',
'unlink' => 'Trennen', 'unlink' => 'Trennen',
'show_address' => 'Adresse anzeigen', 'show_address' => 'Adresse anzeigen',
@ -660,8 +660,8 @@ $LANG = [
'created_by_invoice' => 'Erstellt durch :invoice', 'created_by_invoice' => 'Erstellt durch :invoice',
'primary_user' => 'Primärer Benutzer', 'primary_user' => 'Primärer Benutzer',
'help' => 'Hilfe', 'help' => 'Hilfe',
'customize_help' => '<p>We use :pdfmake_link to define the invoice designs declaratively. The pdfmake :playground_link provides a great way to see the library in action.</p> 'customize_help' => 'We use :pdfmake_link to define the invoice designs declaratively. The pdfmake :playground_link provides a great way to see the library in action.
<p>If you need help figuring something out post a question to our :forum_link with the design you\'re using.</p>', If you need help figuring something out post a question to our :forum_link with the design you\'re using.',
'playground' => 'Spielplatz', 'playground' => 'Spielplatz',
'support_forum' => 'Support-Forum', 'support_forum' => 'Support-Forum',
'invoice_due_date' => 'Fälligkeitsdatum', 'invoice_due_date' => 'Fälligkeitsdatum',
@ -678,7 +678,7 @@ $LANG = [
'status_paid' => 'Bezahlt', 'status_paid' => 'Bezahlt',
'status_unpaid' => 'Unbezahlt', 'status_unpaid' => 'Unbezahlt',
'status_all' => 'Alle', 'status_all' => 'Alle',
'show_line_item_tax' => '<b>Steuern für Belegpositionen</b> in der jeweiligen Zeile anzeigen', 'show_line_item_tax' => 'Steuern für Belegpositionen in der jeweiligen Zeile anzeigen',
'iframe_url' => 'Webseite', 'iframe_url' => 'Webseite',
'iframe_url_help1' => 'Kopiere den folgenden Code in eine Seite auf deiner Website.', 'iframe_url_help1' => 'Kopiere den folgenden Code in eine Seite auf deiner Website.',
'iframe_url_help2' => 'Du kannst diese Funktion testen, in dem du für eine Rechnung \'Als Empfänger betrachten\'. anklickst.', 'iframe_url_help2' => 'Du kannst diese Funktion testen, in dem du für eine Rechnung \'Als Empfänger betrachten\'. anklickst.',
@ -934,15 +934,15 @@ $LANG = [
'edit_payment_term' => 'Bearbeite Zahlungsbedingungen', 'edit_payment_term' => 'Bearbeite Zahlungsbedingungen',
'archive_payment_term' => 'Archiviere Zahlungsbedingungen', 'archive_payment_term' => 'Archiviere Zahlungsbedingungen',
'recurring_due_dates' => 'Wiederkehrende Rechnungen Fälligkeitsdatum', 'recurring_due_dates' => 'Wiederkehrende Rechnungen Fälligkeitsdatum',
'recurring_due_date_help' => '<p>Legt automatisch ein Fälligkeitsdatem für die Rechnung fest.</p> 'recurring_due_date_help' => 'Legt automatisch ein Fälligkeitsdatem für die Rechnung fest.
<p>Auf einen monatlichen oder jährlichen Wiederkehrungszyklus eingestellte Rechnungen werden erst im nächsten Monat bzw. Jahr fällig, sofern das Fälligkeitsdatum älter oder gleich dem Erstellungsdatum der Rechnung ist. Am 29. oder 30. eines Monats fällige Rechnungen werden stattdessen am letzten vorhandenen Tag eines Monats fällig, wenn er diese Tage nicht beinhaltet.</p> Auf einen monatlichen oder jährlichen Wiederkehrungszyklus eingestellte Rechnungen werden erst im nächsten Monat bzw. Jahr fällig, sofern das Fälligkeitsdatum älter oder gleich dem Erstellungsdatum der Rechnung ist. Am 29. oder 30. eines Monats fällige Rechnungen werden stattdessen am letzten vorhandenen Tag eines Monats fällig, wenn er diese Tage nicht beinhaltet.
<p>Auf einen wöchentlichen Wiederkehrungszyklus eingestellte Rechnungen, werden erst in der nächsten Woche fällig, wenn der Wochentag mit dem Wochentag des Erstellungsdatums übereinstimmt.</p> Auf einen wöchentlichen Wiederkehrungszyklus eingestellte Rechnungen, werden erst in der nächsten Woche fällig, wenn der Wochentag mit dem Wochentag des Erstellungsdatums übereinstimmt.
<p>Zum Beispiel:</p> Zum Beispiel:
<ul> <ul>
<li>Heute ist der 15. Januar, das Fälligkeitsdatum ist der 1. eines Monats. Das nächste Fälligkeitsdatum entspricht dem 1. des nächsten Monats, also dem 1. Februar.</li> <li>Heute ist der 15. Januar, das Fälligkeitsdatum ist der 1. eines Monats. Das nächste Fälligkeitsdatum entspricht dem 1. des nächsten Monats, also dem 1. Februar.</li>
<li>Heute ist der 15. Januar, das Fälligkeitsdatum ist der letzte Tag eines Monats. Das nächste Fälligkeitsdatum entspricht dem letzten Tag des aktuellen Monats, also dem 31. Januar. <li>Heute ist der 15. Januar, das Fälligkeitsdatum ist der letzte Tag eines Monats. Das nächste Fälligkeitsdatum entspricht dem letzten Tag des aktuellen Monats, also dem 31. Januar.
</li> </li>
<li>Heute ist der 15. Januar, das Fälligkeitsdatum ist der 15. eines Moants. Das nächste Fälligkeitsdatum entspricht dem 15. des <strong>nächsten</strong> Monats, also dem 15. Februar. <li>Heute ist der 15. Januar, das Fälligkeitsdatum ist der 15. eines Moants. Das nächste Fälligkeitsdatum entspricht dem 15. des nächsten Monats, also dem 15. Februar.
</li> </li>
<li>Heute ist Freitag, das Fälligkeitsdatum ist der Freitag einer jeden Woche. Das nächste Fälligkeitsdatum entspricht dem nächsten Freitag, also nicht heute. <li>Heute ist Freitag, das Fälligkeitsdatum ist der Freitag einer jeden Woche. Das nächste Fälligkeitsdatum entspricht dem nächsten Freitag, also nicht heute.
</li> </li>
@ -1342,7 +1342,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
'see_whats_new' => 'Neu in v:version', 'see_whats_new' => 'Neu in v:version',
'wait_for_upload' => 'Bitte warten Sie bis der Dokumentenupload abgeschlossen wurde.', 'wait_for_upload' => 'Bitte warten Sie bis der Dokumentenupload abgeschlossen wurde.',
'upgrade_for_permissions' => 'Führen Sie ein Upgrade auf unseren Enterprise-Plan durch um Zugriffsrechte zu aktivieren.', 'upgrade_for_permissions' => 'Führen Sie ein Upgrade auf unseren Enterprise-Plan durch um Zugriffsrechte zu aktivieren.',
'enable_second_tax_rate' => 'Aktiviere Spezifizierung einer <b>zweiten Steuerrate</b>', 'enable_second_tax_rate' => 'Aktiviere Spezifizierung einer zweiten Steuerrate',
'payment_file' => 'Zahlungsdatei', 'payment_file' => 'Zahlungsdatei',
'expense_file' => 'Ausgabenakte', 'expense_file' => 'Ausgabenakte',
'product_file' => 'Produktdatei', 'product_file' => 'Produktdatei',
@ -1850,10 +1850,10 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
'security_code_email_subject' => 'Sicherheitscode für Invoice Ninja Bot', 'security_code_email_subject' => 'Sicherheitscode für Invoice Ninja Bot',
'security_code_email_line1' => 'Dies ist Ihr Invoice Ninja Bot Sicherheitscode.', 'security_code_email_line1' => 'Dies ist Ihr Invoice Ninja Bot Sicherheitscode.',
'security_code_email_line2' => 'Anmerkung: Er wird in 10 Minuten ablaufen.', 'security_code_email_line2' => 'Anmerkung: Er wird in 10 Minuten ablaufen.',
'bot_help_message' => 'Ich unterstütze derzeit:<br/>• Erstellung\Aktualisierung\E-Mail-Versand von Rechnungen<br/>• Auflistung von Produkten<br/>Zum Beispiel:<br/><i>invoice bob for 2 tickets, set the due date to next thursday and the discount to 10 percent</i>', 'bot_help_message' => 'Ich unterstütze derzeit:<br/>• Erstellung\Aktualisierung\E-Mail-Versand von Rechnungen<br/>• Auflistung von Produkten<br/>Zum Beispiel:<br/>invoice bob for 2 tickets, set the due date to next thursday and the discount to 10 percent</i>',
'list_products' => 'Produkte anzeigen', 'list_products' => 'Produkte anzeigen',
'include_item_taxes_inline' => 'Steuern für Belegpositionen <b>in der Summe anzeigen</b>', 'include_item_taxes_inline' => 'Steuern für Belegpositionen in der Summe anzeigen',
'created_quotes' => 'Erfolgreich :count Angebot(e) erstellt', 'created_quotes' => 'Erfolgreich :count Angebot(e) erstellt',
'limited_gateways' => 'Anmerkung: Wir unterstützen ein Kreditkarten-Gateway pro Unternehmen.', 'limited_gateways' => 'Anmerkung: Wir unterstützen ein Kreditkarten-Gateway pro Unternehmen.',
@ -1863,7 +1863,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
'update_invoiceninja_warning' => 'Vor dem Update von Invoice Ninja sollte ein Backup der Datenbank und der Dateien erstellt werden!', 'update_invoiceninja_warning' => 'Vor dem Update von Invoice Ninja sollte ein Backup der Datenbank und der Dateien erstellt werden!',
'update_invoiceninja_available' => 'Eine neue Version von Invoice Ninja ist verfügbar.', 'update_invoiceninja_available' => 'Eine neue Version von Invoice Ninja ist verfügbar.',
'update_invoiceninja_unavailable' => 'Keine neue Version von Invoice Ninja verfügbar.', 'update_invoiceninja_unavailable' => 'Keine neue Version von Invoice Ninja verfügbar.',
'update_invoiceninja_instructions' => 'Bitte benutze den <em>Update durchführen</em>-Button, um die neue Version <strong>:version</strong> zu installieren. Du wirst danach zum Dashboard weitergeleitet.', 'update_invoiceninja_instructions' => 'Bitte benutze den <em>Update durchführen</em>-Button, um die neue Version :version zu installieren. Du wirst danach zum Dashboard weitergeleitet.',
'update_invoiceninja_update_start' => 'Update durchführen', 'update_invoiceninja_update_start' => 'Update durchführen',
'update_invoiceninja_download_start' => 'Download :version', 'update_invoiceninja_download_start' => 'Download :version',
'create_new' => 'Neu...', 'create_new' => 'Neu...',
@ -1963,7 +1963,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
// BlueVine // BlueVine
'bluevine_promo' => 'Factoring und Bonitätsauskünfte von BlueVine bestellen.', 'bluevine_promo' => 'Factoring und Bonitätsauskünfte von BlueVine bestellen.',
'bluevine_modal_label' => 'Anmelden mit BlueVine', 'bluevine_modal_label' => 'Anmelden mit BlueVine',
'bluevine_modal_text' => '<h3>Schnelle Finanzierung ohne Papierkram.</h3> 'bluevine_modal_text' => 'Schnelle Finanzierung ohne Papierkram.
<ul><li>Flexible Bonitätsprüfung und Factoring.</li></ul>', <ul><li>Flexible Bonitätsprüfung und Factoring.</li></ul>',
'bluevine_create_account' => 'Konto erstellen', 'bluevine_create_account' => 'Konto erstellen',
'quote_types' => 'Angebot erhalten für', 'quote_types' => 'Angebot erhalten für',
@ -2119,8 +2119,8 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
'recipients' => 'Empfänger', 'recipients' => 'Empfänger',
'save_as_default' => 'Als Standard speichern', 'save_as_default' => 'Als Standard speichern',
'template' => 'Vorlage', 'template' => 'Vorlage',
'start_of_week_help' => 'Verwendet von <b>Datums</b>selektoren', 'start_of_week_help' => 'Verwendet von Datumsselektoren',
'financial_year_start_help' => 'Verwendet von <b>Datum-Bereichs</b>selektoren', 'financial_year_start_help' => 'Verwendet von Datum-Bereichsselektoren',
'reports_help' => 'Shift + Click to sort by multiple columns, Ctrl + Click to clear the grouping.', 'reports_help' => 'Shift + Click to sort by multiple columns, Ctrl + Click to clear the grouping.',
'this_year' => 'Dieses Jahr', 'this_year' => 'Dieses Jahr',
@ -2144,7 +2144,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
'freq_two_months' => 'Zwei Monate', 'freq_two_months' => 'Zwei Monate',
'freq_yearly' => 'Jährlich', 'freq_yearly' => 'Jährlich',
'profile' => 'Profil', 'profile' => 'Profil',
'payment_type_help' => 'Setze die Standard <b>manuelle Zahlungsmethode</b>.', 'payment_type_help' => 'Setze die Standard manuelle Zahlungsmethode.',
'industry_Construction' => 'Bauwesen', 'industry_Construction' => 'Bauwesen',
'your_statement' => 'Deine Abrechnung', 'your_statement' => 'Deine Abrechnung',
'statement_issued_to' => 'Abrechnung ausgestellt für', 'statement_issued_to' => 'Abrechnung ausgestellt für',
@ -2236,8 +2236,8 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
'payment_type_Venmo' => 'Venmo', 'payment_type_Venmo' => 'Venmo',
'payment_type_Money Order' => 'Zahlunganweisung', 'payment_type_Money Order' => 'Zahlunganweisung',
'archived_products' => 'Archivierung erfolgreich :Produktzähler', 'archived_products' => 'Archivierung erfolgreich :Produktzähler',
'recommend_on' => 'Wir empfehlen diese Einstellung zu <b>aktivieren</b>.', 'recommend_on' => 'Wir empfehlen diese Einstellung zu aktivieren.',
'recommend_off' => 'Wir empfehlen diese Einstellung zu <b>deaktivieren</b>.', 'recommend_off' => 'Wir empfehlen diese Einstellung zu deaktivieren.',
'notes_auto_billed' => 'Automatisch verrechnet', 'notes_auto_billed' => 'Automatisch verrechnet',
'surcharge_label' => 'Aufschlagsfeldbezeichnung', 'surcharge_label' => 'Aufschlagsfeldbezeichnung',
'contact_fields' => 'Kontaktfelder', 'contact_fields' => 'Kontaktfelder',
@ -2325,7 +2325,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
'app_version' => 'App-Version', 'app_version' => 'App-Version',
'ofx_version' => 'OFX-Version', 'ofx_version' => 'OFX-Version',
'gateway_help_23' => ':link um Ihre Stripe API-Keys zu erhalten.', 'gateway_help_23' => ':link um Ihre Stripe API-Keys zu erhalten.',
'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 <code>php artisan ninja:update-key</code> aus', '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',
'charge_late_fee' => 'Verspätungszuschlag berechnen', 'charge_late_fee' => 'Verspätungszuschlag berechnen',
'late_fee_amount' => 'Höhe des Verspätungszuschlags', 'late_fee_amount' => 'Höhe des Verspätungszuschlags',
'late_fee_percent' => 'Verspätungszuschlag Prozent', 'late_fee_percent' => 'Verspätungszuschlag Prozent',
@ -2584,7 +2584,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
'subdomain_is_set' => 'subdomain is set', 'subdomain_is_set' => 'subdomain is set',
'verification_file' => 'Verifizierungsdatei', 'verification_file' => 'Verifizierungsdatei',
'verification_file_missing' => 'The verification file is needed to accept payments.', 'verification_file_missing' => 'The verification file is needed to accept payments.',
'apple_pay_domain' => 'Use <code>:domain</code> as the domain in :link.', 'apple_pay_domain' => 'Use :domain as the domain in :link.',
'apple_pay_not_supported' => 'Sorry, Apple/Google Pay isn\'t supported by your browser', 'apple_pay_not_supported' => 'Sorry, Apple/Google Pay isn\'t supported by your browser',
'optional_payment_methods' => 'Optionale Zahlungsmethoden', 'optional_payment_methods' => 'Optionale Zahlungsmethoden',
'add_subscription' => 'Abonnement hinzufügen', 'add_subscription' => 'Abonnement hinzufügen',
@ -2635,7 +2635,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
'processing_request' => 'Anfrage verarbeiten', 'processing_request' => 'Anfrage verarbeiten',
'mcrypt_warning' => 'Warning: Mcrypt is deprecated, run :command to update your cipher.', 'mcrypt_warning' => 'Warning: Mcrypt is deprecated, run :command to update your cipher.',
'edit_times' => 'Zeiten bearbeiten', 'edit_times' => 'Zeiten bearbeiten',
'inclusive_taxes_help' => 'Include <b>taxes in the cost</b>', 'inclusive_taxes_help' => 'Include taxes in the cost',
'inclusive_taxes_notice' => 'This setting can not be changed once an invoice has been created.', 'inclusive_taxes_notice' => 'This setting can not be changed once an invoice has been created.',
'inclusive_taxes_warning' => 'Warning: existing invoices will need to be resaved', 'inclusive_taxes_warning' => 'Warning: existing invoices will need to be resaved',
'copy_shipping' => 'Copy Shipping', 'copy_shipping' => 'Copy Shipping',
@ -2667,7 +2667,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
'return_to_login' => 'Zurück zum Login', 'return_to_login' => 'Zurück zum Login',
'convert_products_tip' => 'Note: add a :link named ":name" to see the exchange rate.', 'convert_products_tip' => 'Note: add a :link named ":name" to see the exchange rate.',
'amount_greater_than_balance' => 'The amount is greater than the invoice balance, a credit will be created with the remaining amount.', 'amount_greater_than_balance' => 'The amount is greater than the invoice balance, a credit will be created with the remaining amount.',
'custom_fields_tip' => 'Use <code>Label|Option1,Option2</code> to show a select box.', 'custom_fields_tip' => 'Use Label|Option1,Option2 to show a select box.',
'client_information' => 'Client Information', 'client_information' => 'Client Information',
'updated_client_details' => 'Successfully updated client details', 'updated_client_details' => 'Successfully updated client details',
'auto' => 'Auto', 'auto' => 'Auto',

View File

@ -72,8 +72,8 @@ return [
'tax_rates' => 'Tax Rates', 'tax_rates' => 'Tax Rates',
'rate' => 'Rate', 'rate' => 'Rate',
'settings' => 'Settings', 'settings' => 'Settings',
'enable_invoice_tax' => 'Enable specifying an <b>invoice tax</b>', 'enable_invoice_tax' => 'Enable specifying an invoice tax',
'enable_line_item_tax' => 'Enable specifying <b>line item taxes</b>', 'enable_line_item_tax' => 'Enable specifying line item taxes',
'dashboard' => 'Dashboard', 'dashboard' => 'Dashboard',
'dashboard_totals_in_all_currencies_help' => 'Note: add a :link named ":name" to show the totals using a single base currency.', 'dashboard_totals_in_all_currencies_help' => 'Note: add a :link named ":name" to show the totals using a single base currency.',
'clients' => 'Clients', 'clients' => 'Clients',
@ -100,9 +100,9 @@ return [
'powered_by' => 'Powered by', 'powered_by' => 'Powered by',
'no_items' => 'No items', 'no_items' => 'No items',
'recurring_invoices' => 'Recurring Invoices', 'recurring_invoices' => 'Recurring Invoices',
'recurring_help' => '<p>Automatically send clients the same invoices weekly, bi-monthly, monthly, quarterly or annually. </p> 'recurring_help' => 'Automatically send clients the same invoices weekly, bi-monthly, monthly, quarterly or annually.
<p>Use :MONTH, :QUARTER or :YEAR for dynamic dates. Basic math works as well, for example :MONTH-1.</p> Use :MONTH, :QUARTER or :YEAR for dynamic dates. Basic math works as well, for example :MONTH-1.
<p>Examples of dynamic invoice variables:</p> Examples of dynamic invoice variables:
<ul> <ul>
<li>"Gym membership for the month of :MONTH" >> "Gym membership for the month of July"</li> <li>"Gym membership for the month of :MONTH" >> "Gym membership for the month of July"</li>
<li>":YEAR+1 yearly subscription" >> "2015 Yearly Subscription"</li> <li>":YEAR+1 yearly subscription" >> "2015 Yearly Subscription"</li>
@ -177,12 +177,12 @@ return [
'payment_gateway' => 'Payment Gateway', 'payment_gateway' => 'Payment Gateway',
'gateway_id' => 'Gateway', 'gateway_id' => 'Gateway',
'email_notifications' => 'Email Notifications', 'email_notifications' => 'Email Notifications',
'email_sent' => 'Email me when an invoice is <b>sent</b>', 'email_sent' => 'Email me when an invoice is sent',
'email_viewed' => 'Email me when an invoice is <b>viewed</b>', 'email_viewed' => 'Email me when an invoice is viewed',
'email_paid' => 'Email me when an invoice is <b>paid</b>', 'email_paid' => 'Email me when an invoice is paid',
'site_updates' => 'Site Updates', 'site_updates' => 'Site Updates',
'custom_messages' => 'Custom Messages', 'custom_messages' => 'Custom Messages',
'default_email_footer' => 'Set default <b>email signature</b>', 'default_email_footer' => 'Set default email signature',
'select_file' => 'Please select a file', 'select_file' => 'Please select a file',
'first_row_headers' => 'Use first row as headers', 'first_row_headers' => 'Use first row as headers',
'column' => 'Column', 'column' => 'Column',
@ -285,11 +285,11 @@ return [
'erase_data' => 'Your account is not registered, this will permanently erase your data.', 'erase_data' => 'Your account is not registered, this will permanently erase your data.',
'password' => 'Password', 'password' => 'Password',
'pro_plan_product' => 'Pro Plan', 'pro_plan_product' => 'Pro Plan',
'pro_plan_success' => 'Thanks for choosing Invoice Ninja\'s Pro plan!<p/>&nbsp;<br/> 'pro_plan_success' => 'Thanks for choosing Invoice Ninja\'s Pro plan!&nbsp;<br/>
<b>Next Steps</b><p/>A payable invoice has been sent to the email Next StepsA payable invoice has been sent to the email
address associated with your account. To unlock all of the awesome address associated with your account. To unlock all of the awesome
Pro features, please follow the instructions on the invoice to pay Pro features, please follow the instructions on the invoice to pay
for a year of Pro-level invoicing.<p/> for a year of Pro-level invoicing.
Can\'t find the invoice? Need further assistance? We\'re happy to help Can\'t find the invoice? Need further assistance? We\'re happy to help
-- email us at contact@invoiceninja.com', -- email us at contact@invoiceninja.com',
'unsaved_changes' => 'You have unsaved changes', 'unsaved_changes' => 'You have unsaved changes',
@ -305,9 +305,9 @@ return [
'product' => 'Product', 'product' => 'Product',
'products' => 'Products', 'products' => 'Products',
'fill_products' => 'Auto-fill products', 'fill_products' => 'Auto-fill products',
'fill_products_help' => 'Selecting a product will automatically <b>fill in the description and cost</b>', 'fill_products_help' => 'Selecting a product will automatically fill in the description and cost',
'update_products' => 'Auto-update products', 'update_products' => 'Auto-update products',
'update_products_help' => 'Updating an invoice will automatically <b>update the product library</b>', 'update_products_help' => 'Updating an invoice will automatically update the product library',
'create_product' => 'Add Product', 'create_product' => 'Add Product',
'edit_product' => 'Edit Product', 'edit_product' => 'Edit Product',
'archive_product' => 'Archive Product', 'archive_product' => 'Archive Product',
@ -514,7 +514,7 @@ return [
'send_email' => 'Send Email', 'send_email' => 'Send Email',
'set_password' => 'Set Password', 'set_password' => 'Set Password',
'converted' => 'Converted', 'converted' => 'Converted',
'email_approved' => 'Email me when a quote is <b>approved</b>', 'email_approved' => 'Email me when a quote is approved',
'notification_quote_approved_subject' => 'Quote :invoice was approved by :client', 'notification_quote_approved_subject' => 'Quote :invoice was approved by :client',
'notification_quote_approved' => 'The following client :client approved Quote :invoice for :amount.', 'notification_quote_approved' => 'The following client :client approved Quote :invoice for :amount.',
'resend_confirmation' => 'Resend confirmation email', 'resend_confirmation' => 'Resend confirmation email',
@ -634,7 +634,7 @@ return [
'email_error' => 'There was a problem sending the email', 'email_error' => 'There was a problem sending the email',
'confirm_recurring_timing' => 'Note: emails are sent at the start of the hour.', 'confirm_recurring_timing' => 'Note: emails are sent at the start of the hour.',
'confirm_recurring_timing_not_sent' => 'Note: invoices are created at the start of the hour.', 'confirm_recurring_timing_not_sent' => 'Note: invoices are created at the start of the hour.',
'payment_terms_help' => 'Sets the default <b>invoice due date</b>', 'payment_terms_help' => 'Sets the default invoice due date',
'unlink_account' => 'Unlink Account', 'unlink_account' => 'Unlink Account',
'unlink' => 'Unlink', 'unlink' => 'Unlink',
'show_address' => 'Show Address', 'show_address' => 'Show Address',
@ -677,8 +677,8 @@ return [
'created_by_invoice' => 'Created by :invoice', 'created_by_invoice' => 'Created by :invoice',
'primary_user' => 'Primary User', 'primary_user' => 'Primary User',
'help' => 'Help', 'help' => 'Help',
'customize_help' => '<p>We use :pdfmake_link to define the invoice designs declaratively. The pdfmake :playground_link provides a great way to see the library in action.</p> 'customize_help' => 'We use :pdfmake_link to define the invoice designs declaratively. The pdfmake :playground_link provides a great way to see the library in action.
<p>If you need help figuring something out post a question to our :forum_link with the design you\'re using.</p>', If you need help figuring something out post a question to our :forum_link with the design you\'re using.',
'playground' => 'playground', 'playground' => 'playground',
'support_forum' => 'support forum', 'support_forum' => 'support forum',
'invoice_due_date' => 'Due Date', 'invoice_due_date' => 'Due Date',
@ -695,7 +695,7 @@ return [
'status_paid' => 'Paid', 'status_paid' => 'Paid',
'status_unpaid' => 'Unpaid', 'status_unpaid' => 'Unpaid',
'status_all' => 'All', 'status_all' => 'All',
'show_line_item_tax' => 'Display <b>line item taxes inline</b>', 'show_line_item_tax' => 'Display line item taxes inline',
'iframe_url' => 'Website', 'iframe_url' => 'Website',
'iframe_url_help1' => 'Copy the following code to a page on your site.', 'iframe_url_help1' => 'Copy the following code to a page on your site.',
'iframe_url_help2' => 'You can test the feature by clicking \'View as recipient\' for an invoice.', 'iframe_url_help2' => 'You can test the feature by clicking \'View as recipient\' for an invoice.',
@ -965,10 +965,10 @@ return [
'edit_payment_term' => 'Edit Payment Term', 'edit_payment_term' => 'Edit Payment Term',
'archive_payment_term' => 'Archive Payment Term', 'archive_payment_term' => 'Archive Payment Term',
'recurring_due_dates' => 'Recurring Invoice Due Dates', 'recurring_due_dates' => 'Recurring Invoice Due Dates',
'recurring_due_date_help' => '<p>Automatically sets a due date for the invoice.</p> 'recurring_due_date_help' => 'Automatically sets a due date for the invoice.
<p>Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.</p> Invoices on a monthly or yearly cycle set to be due on or before the day they are created will be due the next month. Invoices set to be due on the 29th or 30th in months that don\'t have that day will be due the last day of the month.
<p>Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.</p> Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.
<p>For example:</p> For example:
<ul> <ul>
<li>Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.</li> <li>Today is the 15th, due date is 1st of the month. The due date should likely be the 1st of the next month.</li>
<li>Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month. <li>Today is the 15th, due date is the last day of the month. The due date will be the last day of the this month.
@ -1377,7 +1377,7 @@ return [
'see_whats_new' => 'See what\'s new in v:version', 'see_whats_new' => 'See what\'s new in v:version',
'wait_for_upload' => 'Please wait for the document upload to complete.', 'wait_for_upload' => 'Please wait for the document upload to complete.',
'upgrade_for_permissions' => 'Upgrade to our Enterprise plan to enable permissions.', 'upgrade_for_permissions' => 'Upgrade to our Enterprise plan to enable permissions.',
'enable_second_tax_rate' => 'Enable specifying a <b>second tax rate</b>', 'enable_second_tax_rate' => 'Enable specifying a second tax rate',
'payment_file' => 'Payment File', 'payment_file' => 'Payment File',
'expense_file' => 'Expense File', 'expense_file' => 'Expense File',
'product_file' => 'Product File', 'product_file' => 'Product File',
@ -1885,10 +1885,10 @@ return [
'security_code_email_subject' => 'Security code for Invoice Ninja Bot', 'security_code_email_subject' => 'Security code for Invoice Ninja Bot',
'security_code_email_line1' => 'This is your Invoice Ninja Bot security code.', 'security_code_email_line1' => 'This is your Invoice Ninja Bot security code.',
'security_code_email_line2' => 'Note: it will expire in 10 minutes.', 'security_code_email_line2' => 'Note: it will expire in 10 minutes.',
'bot_help_message' => 'I currently support:<br/>• Create\update\email an invoice<br/>• List products<br/>For example:<br/><i>invoice bob for 2 tickets, set the due date to next thursday and the discount to 10 percent</i>', 'bot_help_message' => 'I currently support:<br/>• Create\update\email an invoice<br/>• List products<br/>For example:<br/>invoice bob for 2 tickets, set the due date to next thursday and the discount to 10 percent',
'list_products' => 'List Products', 'list_products' => 'List Products',
'include_item_taxes_inline' => 'Include <b>line item taxes in line total</b>', 'include_item_taxes_inline' => 'Include line item taxes in line total',
'created_quotes' => 'Successfully created :count quotes(s)', 'created_quotes' => 'Successfully created :count quotes(s)',
'limited_gateways' => 'Note: we support one credit card gateway per company.', 'limited_gateways' => 'Note: we support one credit card gateway per company.',
@ -1898,7 +1898,7 @@ return [
'update_invoiceninja_warning' => 'Before start upgrading Invoice Ninja create a backup of your database and files!', 'update_invoiceninja_warning' => 'Before start upgrading Invoice Ninja create a backup of your database and files!',
'update_invoiceninja_available' => 'A new version of Invoice Ninja is available.', 'update_invoiceninja_available' => 'A new version of Invoice Ninja is available.',
'update_invoiceninja_unavailable' => 'No new version of Invoice Ninja available.', 'update_invoiceninja_unavailable' => 'No new version of Invoice Ninja available.',
'update_invoiceninja_instructions' => 'Please install the new version <strong>:version</strong> by clicking the <em>Update now</em> button below. Afterwards you\'ll be redirected to the dashboard.', 'update_invoiceninja_instructions' => 'Please install the new version <strong>:version</strong> by clicking the Update now button below. Afterwards you\'ll be redirected to the dashboard.',
'update_invoiceninja_update_start' => 'Update now', 'update_invoiceninja_update_start' => 'Update now',
'update_invoiceninja_download_start' => 'Download :version', 'update_invoiceninja_download_start' => 'Download :version',
'create_new' => 'Create New', 'create_new' => 'Create New',
@ -1999,7 +1999,7 @@ return [
// BlueVine // BlueVine
'bluevine_promo' => 'Get flexible business lines of credit and invoice factoring using BlueVine.', 'bluevine_promo' => 'Get flexible business lines of credit and invoice factoring using BlueVine.',
'bluevine_modal_label' => 'Sign up with BlueVine', 'bluevine_modal_label' => 'Sign up with BlueVine',
'bluevine_modal_text' => '<h3>Fast funding for your business. No paperwork.</h3> 'bluevine_modal_text' => 'Fast funding for your business. No paperwork.
<ul><li>Flexible business lines of credit and invoice factoring.</li></ul>', <ul><li>Flexible business lines of credit and invoice factoring.</li></ul>',
'bluevine_create_account' => 'Create an account', 'bluevine_create_account' => 'Create an account',
'quote_types' => 'Get a quote for', 'quote_types' => 'Get a quote for',
@ -2155,8 +2155,8 @@ return [
'recipients' => 'Recipients', 'recipients' => 'Recipients',
'save_as_default' => 'Save as default', 'save_as_default' => 'Save as default',
'template' => 'Template', 'template' => 'Template',
'start_of_week_help' => 'Used by <b>date</b> selectors', 'start_of_week_help' => 'Used by date selectors',
'financial_year_start_help' => 'Used by <b>date range</b> selectors', 'financial_year_start_help' => 'Used by date range selectors',
'reports_help' => 'Shift + Click to sort by multiple columns, Ctrl + Click to clear the grouping.', 'reports_help' => 'Shift + Click to sort by multiple columns, Ctrl + Click to clear the grouping.',
'this_year' => 'This Year', 'this_year' => 'This Year',
@ -2180,7 +2180,7 @@ return [
'freq_two_months' => 'Two months', 'freq_two_months' => 'Two months',
'freq_yearly' => 'Annually', 'freq_yearly' => 'Annually',
'profile' => 'Profile', 'profile' => 'Profile',
'payment_type_help' => 'Sets the default <b>manual payment type</b>.', 'payment_type_help' => 'Sets the default manual payment type.',
'industry_Construction' => 'Construction', 'industry_Construction' => 'Construction',
'your_statement' => 'Your Statement', 'your_statement' => 'Your Statement',
'statement_issued_to' => 'Statement issued to', 'statement_issued_to' => 'Statement issued to',
@ -2273,8 +2273,8 @@ return [
'payment_type_Venmo' => 'Venmo', 'payment_type_Venmo' => 'Venmo',
'payment_type_Money Order' => 'Money Order', 'payment_type_Money Order' => 'Money Order',
'archived_products' => 'Successfully archived :count products', 'archived_products' => 'Successfully archived :count products',
'recommend_on' => 'We recommend <b>enabling</b> this setting.', 'recommend_on' => 'We recommend enabling this setting.',
'recommend_off' => 'We recommend <b>disabling</b> this setting.', 'recommend_off' => 'We recommend disabling this setting.',
'notes_auto_billed' => 'Auto-billed', 'notes_auto_billed' => 'Auto-billed',
'surcharge_label' => 'Surcharge Label', 'surcharge_label' => 'Surcharge Label',
'contact_fields' => 'Contact Fields', 'contact_fields' => 'Contact Fields',
@ -2362,7 +2362,7 @@ return [
'app_version' => 'App Version', 'app_version' => 'App Version',
'ofx_version' => 'OFX Version', 'ofx_version' => 'OFX Version',
'gateway_help_23' => ':link to get your Stripe API keys.', 'gateway_help_23' => ':link to get your Stripe API keys.',
'error_app_key_set_to_default' => 'Error: APP_KEY is set to a default value, to update it backup your database and then run <code>php artisan ninja:update-key</code>', 'error_app_key_set_to_default' => 'Error: APP_KEY is set to a default value, to update it backup your database and then run php artisan ninja:update-key',
'charge_late_fee' => 'Charge Late Fee', 'charge_late_fee' => 'Charge Late Fee',
'late_fee_amount' => 'Late Fee Amount', 'late_fee_amount' => 'Late Fee Amount',
'late_fee_percent' => 'Late Fee Percent', 'late_fee_percent' => 'Late Fee Percent',
@ -2622,7 +2622,7 @@ return [
'subdomain_is_set' => 'subdomain is set', 'subdomain_is_set' => 'subdomain is set',
'verification_file' => 'Verification File', 'verification_file' => 'Verification File',
'verification_file_missing' => 'The verification file is needed to accept payments.', 'verification_file_missing' => 'The verification file is needed to accept payments.',
'apple_pay_domain' => 'Use <code>:domain</code> as the domain in :link.', 'apple_pay_domain' => 'Use :domain as the domain in :link.',
'apple_pay_not_supported' => 'Sorry, Apple/Google Pay isn\'t supported by your browser', 'apple_pay_not_supported' => 'Sorry, Apple/Google Pay isn\'t supported by your browser',
'optional_payment_methods' => 'Optional Payment Methods', 'optional_payment_methods' => 'Optional Payment Methods',
'add_subscription' => 'Add Subscription', 'add_subscription' => 'Add Subscription',
@ -2674,7 +2674,7 @@ return [
'processing_request' => 'Processing request', 'processing_request' => 'Processing request',
'mcrypt_warning' => 'Warning: Mcrypt is deprecated, run :command to update your cipher.', 'mcrypt_warning' => 'Warning: Mcrypt is deprecated, run :command to update your cipher.',
'edit_times' => 'Edit Times', 'edit_times' => 'Edit Times',
'inclusive_taxes_help' => 'Include <b>taxes in the cost</b>', 'inclusive_taxes_help' => 'Include taxes in the cost',
'inclusive_taxes_notice' => 'This setting can not be changed once an invoice has been created.', 'inclusive_taxes_notice' => 'This setting can not be changed once an invoice has been created.',
'inclusive_taxes_warning' => 'Warning: existing invoices will need to be resaved', 'inclusive_taxes_warning' => 'Warning: existing invoices will need to be resaved',
'copy_shipping' => 'Copy Shipping', 'copy_shipping' => 'Copy Shipping',
@ -2706,7 +2706,7 @@ return [
'return_to_login' => 'Return to Login', 'return_to_login' => 'Return to Login',
'convert_products_tip' => 'Note: add a :link named ":name" to see the exchange rate.', 'convert_products_tip' => 'Note: add a :link named ":name" to see the exchange rate.',
'amount_greater_than_balance' => 'The amount is greater than the invoice balance, a credit will be created with the remaining amount.', 'amount_greater_than_balance' => 'The amount is greater than the invoice balance, a credit will be created with the remaining amount.',
'custom_fields_tip' => 'Use <code>Label|Option1,Option2</code> to show a select box.', 'custom_fields_tip' => 'Use Label|Option1,Option2 to show a select box.',
'client_information' => 'Client Information', 'client_information' => 'Client Information',
'client_information_text' => 'Use a permanent address where you can receive mail.', 'client_information_text' => 'Use a permanent address where you can receive mail.',
'updated_client_details' => 'Successfully updated client details', 'updated_client_details' => 'Successfully updated client details',
@ -3233,7 +3233,7 @@ return [
'test_pdf' => 'Test PDF', 'test_pdf' => 'Test PDF',
'status_cancelled' => 'Cancelled', 'status_cancelled' => 'Cancelled',
'checkout_authorize_label' => 'Checkout.com can be can saved as payment method for future use, once you complete your first transaction. Don\'t forget to check "Save card" during payment process.', 'checkout_authorize_label' => 'Checkout.com can be can saved as payment method for future use, once you complete your first transaction. Don\'t forget to check "Store credit card details" during payment process.',
'node_status' => 'Node status', 'node_status' => 'Node status',
'npm_status' => 'NPM status', 'npm_status' => 'NPM status',

View File

@ -36,7 +36,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/simple-line-icons/2.4.1/css/simple-line-icons.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/simple-line-icons/2.4.1/css/simple-line-icons.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css">
<link rel="canonical" href="{{ config('ninja.app_url') }}{{ request()->path() }}"/> <link rel="canonical" href="{{ config('ninja.app_url') }}/{{ request()->path() }}"/>
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>
<script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script>

View File

@ -57,7 +57,7 @@
<meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta http-equiv="X-UA-Compatible" content="IE=edge">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/simple-line-icons/2.4.1/css/simple-line-icons.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/simple-line-icons/2.4.1/css/simple-line-icons.css">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css"> <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.css">
<link rel="canonical" href="{{ config('ninja.app_url') }}{{ request()->path() }}"/> <link rel="canonical" href="{{ config('ninja.app_url') }}/{{ request()->path() }}"/>
<link rel="stylesheet" href="{{ mix('/css/ninja.min.css') }}"> <link rel="stylesheet" href="{{ mix('/css/ninja.min.css') }}">
<script src="https://code.jquery.com/jquery-3.2.1.min.js"></script> <script src="https://code.jquery.com/jquery-3.2.1.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script>

View File

@ -206,4 +206,4 @@
<table id="delivery-note-table" cellspacing="0"></table> <table id="delivery-note-table" cellspacing="0"></table>
</div> </div>
<div id="footer"></div> <div id="footer">$entity_footer</div>

View File

@ -248,4 +248,4 @@
<table id="delivery-note-table" cellspacing="0"></table> <table id="delivery-note-table" cellspacing="0"></table>
</div> </div>
<div id="footer"></div> <div id="footer">$entity_footer</div>

View File

@ -189,4 +189,4 @@
<table id="delivery-note-table" cellspacing="0"></table> <table id="delivery-note-table" cellspacing="0"></table>
</div> </div>
<div id="footer"></div> <div id="footer">$entity_footer</div>

View File

@ -213,4 +213,4 @@
<table id="delivery-note-table" cellspacing="0"></table> <table id="delivery-note-table" cellspacing="0"></table>
</div> </div>
<div id="footer"></div> <div id="footer">$entity_footer</div>

View File

@ -217,5 +217,5 @@
<p class="thanks-label">$thanks_label!</p> <p class="thanks-label">$thanks_label!</p>
<hr class="double-border"/> <hr class="double-border"/>
<div id="footer"></div> <div id="footer">$entity_footer</div>

View File

@ -243,4 +243,4 @@
<table id="delivery-note-table" cellspacing="0"></table> <table id="delivery-note-table" cellspacing="0"></table>
</div> </div>
<div id="footer"></div> <div id="footer">$entity_footer</div>

View File

@ -217,7 +217,7 @@
<div style="margin-top: 195px"></div> <div style="margin-top: 195px"></div>
<div class="footer-wrapper" id="footer"> <div class="footer-wrapper" id="footer">
<div class="footer-content"> <div class="footer-content">
<div></div> <div>$entity_footer</div>
<div id="company-details"></div> <div id="company-details"></div>
<div id="company-address"></div> <div id="company-address"></div>
</div> </div>

View File

@ -162,4 +162,4 @@
<table id="delivery-note-table" cellspacing="0"></table> <table id="delivery-note-table" cellspacing="0"></table>
</div> </div>
<div id="footer"></div> <div id="footer">$entity_footer</div>

View File

@ -231,5 +231,5 @@
<table id="delivery-note-table" cellspacing="0"></table> <table id="delivery-note-table" cellspacing="0"></table>
</div> </div>
<div id="footer"></div> <div id="footer">$entity_footer</div>

View File

@ -76,6 +76,6 @@
{{ ctrans('texts.showing_x_of', ['first' => $credits->firstItem(), 'last' => $credits->lastItem(), 'total' => $credits->total()]) }} {{ ctrans('texts.showing_x_of', ['first' => $credits->firstItem(), 'last' => $credits->lastItem(), 'total' => $credits->total()]) }}
</span> </span>
@endif @endif
{{ $credits->links() }} {{ $credits->links('portal/ninja2020/vendor/pagination') }}
</div> </div>
</div> </div>

View File

@ -104,6 +104,6 @@
{{ ctrans('texts.showing_x_of', ['first' => $documents->firstItem(), 'last' => $documents->lastItem(), 'total' => $documents->total()]) }} {{ ctrans('texts.showing_x_of', ['first' => $documents->firstItem(), 'last' => $documents->lastItem(), 'total' => $documents->total()]) }}
</span> </span>
@endif @endif
{{ $documents->links() }} {{ $documents->links('portal/ninja2020/vendor/pagination') }}
</div> </div>
</div> </div>

View File

@ -122,11 +122,11 @@
</div> </div>
<div class="flex justify-center mt-6 mb-6 md:justify-between"> <div class="flex justify-center mt-6 mb-6 md:justify-between">
@if($invoices->total() > 0) @if($invoices->total() > 0)
<span class="hidden text-sm text-gray-700 md:block"> <span class="hidden text-sm text-gray-700 md:block mr-2">
{{ ctrans('texts.showing_x_of', ['first' => $invoices->firstItem(), 'last' => $invoices->lastItem(), 'total' => $invoices->total()]) }} {{ ctrans('texts.showing_x_of', ['first' => $invoices->firstItem(), 'last' => $invoices->lastItem(), 'total' => $invoices->total()]) }}
</span> </span>
@endif @endif
{{ $invoices->links() }} {{ $invoices->links('portal/ninja2020/vendor/pagination') }}
</div> </div>
</div> </div>

View File

@ -116,6 +116,6 @@
</span> </span>
@endif @endif
{{ $payment_methods->links() }} {{ $payment_methods->links('portal/ninja2020/vendor/pagination') }}
</div> </div>
</div> </div>

View File

@ -82,6 +82,6 @@
{{ ctrans('texts.showing_x_of', ['first' => $payments->firstItem(), 'last' => $payments->lastItem(), 'total' => $payments->total()]) }} {{ ctrans('texts.showing_x_of', ['first' => $payments->firstItem(), 'last' => $payments->lastItem(), 'total' => $payments->total()]) }}
</span> </span>
@endif @endif
{{ $payments->links() }} {{ $payments->links('portal/ninja2020/vendor/pagination') }}
</div> </div>
</div> </div>

View File

@ -112,7 +112,7 @@
{{ ctrans('texts.showing_x_of', ['first' => $quotes->firstItem(), 'last' => $quotes->lastItem(), 'total' => $quotes->total()]) }} {{ ctrans('texts.showing_x_of', ['first' => $quotes->firstItem(), 'last' => $quotes->lastItem(), 'total' => $quotes->total()]) }}
</span> </span>
@endif @endif
{{ $quotes->links() }} {{ $quotes->links('portal/ninja2020/vendor/pagination') }}
</div> </div>
</div> </div>

View File

@ -84,6 +84,6 @@
{{ ctrans('texts.showing_x_of', ['first' => $invoices->firstItem(), 'last' => $invoices->lastItem(), 'total' => $invoices->total()]) }} {{ ctrans('texts.showing_x_of', ['first' => $invoices->firstItem(), 'last' => $invoices->lastItem(), 'total' => $invoices->total()]) }}
</span> </span>
@endif @endif
{{ $invoices->links() }} {{ $invoices->links('portal/ninja2020/vendor/pagination') }}
</div> </div>
</div> </div>

View File

@ -49,7 +49,7 @@
<!-- Scripts --> <!-- Scripts -->
<script src="{{ mix('js/app.js') }}" defer></script> <script src="{{ mix('js/app.js') }}" defer></script>
<script src="{{ asset('js/vendor/alpinejs/alpine.js') }}" defer></script> <script src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.7.x/dist/alpine.min.js" defer></script>
<!-- Fonts --> <!-- Fonts -->
<link rel="dns-prefetch" href="https://fonts.gstatic.com"> <link rel="dns-prefetch" href="https://fonts.gstatic.com">

View File

@ -48,7 +48,7 @@
<!-- Scripts --> <!-- Scripts -->
<script src="{{ mix('js/app.js') }}" defer></script> <script src="{{ mix('js/app.js') }}" defer></script>
<script src="{{ asset('js/vendor/alpinejs/alpine.js') }}" defer></script> <script src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.7.x/dist/alpine.min.js" defer></script>
<!-- Fonts --> <!-- Fonts -->
<link rel="dns-prefetch" href="https://fonts.gstatic.com"> <link rel="dns-prefetch" href="https://fonts.gstatic.com">
@ -58,7 +58,7 @@
<link href="{{ mix('css/app.css') }}" rel="stylesheet"> <link href="{{ mix('css/app.css') }}" rel="stylesheet">
{{-- <link href="{{ mix('favicon.png') }}" rel="shortcut icon" type="image/png"> --}} {{-- <link href="{{ mix('favicon.png') }}" rel="shortcut icon" type="image/png"> --}}
<link rel="canonical" href="{{ config('ninja.app_url') }}{{ request()->path() }}"/> <link rel="canonical" href="{{ config('ninja.app_url') }}/{{ request()->path() }}"/>
{{-- Feel free to push anything to header using @push('header') --}} {{-- Feel free to push anything to header using @push('header') --}}
@stack('head') @stack('head')

View File

@ -1,67 +1,56 @@
<div class="border-t border-gray-200 px-4 flex items-center justify-between sm:px-0"> @if ($paginator->hasPages())
<div class="w-0 flex-1 flex"> <ul class="pagination" role="navigation">
<a href="{{ $paginator->previousPageUrl() }}" {{-- Previous Page Link --}}
class="-mt-px border-t-2 border-transparent pt-4 pr-1 inline-flex items-center text-sm leading-5 font-medium text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-400 transition ease-in-out duration-150"> @if ($paginator->onFirstPage())
<svg class="mr-3 h-5 w-5 text-gray-400" fill="currentColor" viewBox="0 0 20 20"> <li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
<path fill-rule="evenodd" <span class="page-link" aria-hidden="true">
d="M7.707 14.707a1 1 0 01-1.414 0l-4-4a1 1 0 010-1.414l4-4a1 1 0 011.414 1.414L5.414 9H17a1 1 0 110 2H5.414l2.293 2.293a1 1 0 010 1.414z" <span class="d-none d-md-block">&lsaquo;</span>
clip-rule="evenodd"/> <span class="d-block d-md-none">@lang('pagination.previous')</span>
</svg>
@lang('texts.previous')
</a>
</div>
<div class="hidden md:flex">
@foreach ($elements as $element)
@if (is_string($element))
<span
class="-mt-px border-t-2 border-transparent pt-4 px-4 inline-flex items-center text-sm leading-5 font-medium text-gray-500">
...
</span> </span>
</li>
@else
<li class="page-item">
<button type="button" class="page-link" wire:click="previousPage" rel="prev" aria-label="@lang('pagination.previous')">
<span class="d-none d-md-block">&lsaquo;</span>
<span class="d-block d-md-none">@lang('pagination.previous')</span>
</button>
</li>
@endif
{{-- Pagination Elements --}}
@foreach ($elements as $element)
{{-- "Three Dots" Separator --}}
@if (is_string($element))
<li class="page-item disabled d-none d-md-block" aria-disabled="true"><span class="page-link">{{ $element }}</span></li>
@endif @endif
{{-- Array Of Links --}}
@if (is_array($element)) @if (is_array($element))
@foreach ($element as $page => $url) @foreach ($element as $page => $url)
@if ($page == $paginator->currentPage()) @if ($page == $paginator->currentPage())
<a href="#" disabled <li class="page-item active d-none d-md-block" aria-current="page"><span class="page-link">{{ $page }}</span></li>
class="-mt-px border-t-2 border-blue-600 pt-4 px-4 inline-flex items-center text-sm leading-5 font-medium text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-400 transition ease-in-out duration-150"
aria-current="page">
{{ $page }}
</a>
@else @else
<a href="{{ $url }}" <li class="page-item d-none d-md-block"><button type="button" class="page-link" wire:click="gotoPage({{ $page }})">{{ $page }}</button></li>
class="-mt-px border-t-2 border-transparent pt-4 px-4 inline-flex items-center text-sm leading-5 font-medium text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-400 transition ease-in-out duration-150">
{{ $page }}
</a>
@endif @endif
@endforeach @endforeach
@endif @endif
@endforeach @endforeach
</div>
@if ($paginator->hasMorePages()) {{-- Next Page Link --}}
<div class="w-0 flex-1 flex justify-end"> @if ($paginator->hasMorePages())
<a href="{{ $paginator->nextPageUrl() }}" <li class="page-item">
class="-mt-px border-t-2 border-transparent pt-4 pl-1 inline-flex items-center text-sm leading-5 font-medium text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-400 transition ease-in-out duration-150"> <button type="button" class="page-link" wire:click="nextPage" rel="next" aria-label="@lang('pagination.next')">
@lang('texts.next') <span class="d-block d-md-none">@lang('pagination.next')</span>
<svg class="ml-3 h-5 w-5 text-gray-400" fill="currentColor" viewBox="0 0 20 20"> <span class="d-none d-md-block">&rsaquo;</span>
<path fill-rule="evenodd" </button>
d="M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z" </li>
clip-rule="evenodd"/>
</svg>
</a>
</div>
@else @else
<div class="w-0 flex-1 flex justify-end"> <li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
<a href="#" <span class="page-link" aria-hidden="true">
class="-mt-px border-t-2 border-transparent pt-4 pl-1 inline-flex items-center text-sm leading-5 font-medium text-gray-500 hover:text-gray-700 hover:border-gray-300 focus:outline-none focus:text-gray-700 focus:border-gray-400 transition ease-in-out duration-150"> <span class="d-block d-md-none">@lang('pagination.next')</span>
@lang('texts.next') <span class="d-none d-md-block">&rsaquo;</span>
<svg class="ml-3 h-5 w-5 text-gray-400" fill="currentColor" viewBox="0 0 20 20"> </span>
<path fill-rule="evenodd" </li>
d="M12.293 5.293a1 1 0 011.414 0l4 4a1 1 0 010 1.414l-4 4a1 1 0 01-1.414-1.414L14.586 11H3a1 1 0 110-2h11.586l-2.293-2.293a1 1 0 010-1.414z" @endif
clip-rule="evenodd"/> </ul>
</svg> @endif
</a>
</div>
@endif
</div>

View File

@ -38,7 +38,7 @@ FLUSH PRIVILEGES;
{{ ctrans('texts.host') }}* {{ ctrans('texts.host') }}*
</dt> </dt>
<dd class="text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2"> <dd class="text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
<input type="text" class="input w-full" name="host" required value="{{ old('host') ?: 'localhost'}}"> <input type="text" class="input w-full" name="db_host" required value="{{ old('host') ?: 'localhost'}}">
</dd> </dd>
</div> </div>
<div class="bg-white px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center"> <div class="bg-white px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center">
@ -46,7 +46,7 @@ FLUSH PRIVILEGES;
{{ ctrans('texts.database') }}* {{ ctrans('texts.database') }}*
</dt> </dt>
<dd class="text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2"> <dd class="text-sm leading-5 text-gray-900 sm:mt-0 sm:col-span-2">
<input type="text" class="input w-full" name="database" required value="{{ old('database') ?: 'db-ninja-01'}}"> <input type="text" class="input w-full" name="db_database" required value="{{ old('database') ?: 'db-ninja-01'}}">
</dd> </dd>
</div> </div>
<div class="bg-gray-50 px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center"> <div class="bg-gray-50 px-4 py-5 sm:grid sm:grid-cols-3 sm:gap-4 sm:px-6 sm:flex sm:items-center">

View File

@ -3,7 +3,7 @@
@push('head') @push('head')
<meta name="pdf-url" content="{{ asset($entity->pdf_file_path()) }}"> <meta name="pdf-url" content="{{ asset($entity->pdf_file_path()) }}">
<script src="{{ asset('js/vendor/pdf.js/pdf.min.js') }}"></script> <script src="{{ asset('js/vendor/pdf.js/pdf.min.js') }}"></script>
<script src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.x.x/dist/alpine.min.js" defer></script> <script src="https://cdn.jsdelivr.net/gh/alpinejs/alpine@v2.7.x/dist/alpine.min.js" defer></script>
@endpush @endpush
@section('body') @section('body')

View File

@ -180,6 +180,6 @@ Route::group(['middleware' => ['api_db', 'token_auth', 'locale'], 'prefix' => 'a
Route::post('support/messages/send', 'Support\Messages\SendingController'); Route::post('support/messages/send', 'Support\Messages\SendingController');
}); });
Route::match(['get', 'post'], 'payment_webhook/{company_key?}/{gateway_key?}', 'PaymentWebhookController'); Route::match(['get', 'post'], 'payment_webhook/{gateway_key}/{company_key}', 'PaymentWebhookController')->name('payment_webhook');
Route::fallback('BaseController@notFound'); Route::fallback('BaseController@notFound');

View File

@ -64,7 +64,6 @@ Route::group(['middleware' => ['auth:contact', 'locale', 'check_client_existence
Route::get('credits/{credit_invitation}', 'ClientPortal\CreditController@show')->name('credits.show_invitation'); Route::get('credits/{credit_invitation}', 'ClientPortal\CreditController@show')->name('credits.show_invitation');
Route::get('client/switch_company/{contact}', 'ClientPortal\SwitchCompanyController')->name('switch_company'); Route::get('client/switch_company/{contact}', 'ClientPortal\SwitchCompanyController')->name('switch_company');
Route::post('documents/download_multiple', 'ClientPortal\DocumentController@downloadMultiple')->name('documents.download_multiple'); Route::post('documents/download_multiple', 'ClientPortal\DocumentController@downloadMultiple')->name('documents.download_multiple');
@ -84,8 +83,6 @@ Route::group(['middleware' => ['invite_db'], 'prefix' => 'client', 'as' => 'clie
Route::get('credit/{invitation_key}/download_pdf', 'CreditController@downloadPdf')->name('credit.download_invitation_key'); Route::get('credit/{invitation_key}/download_pdf', 'CreditController@downloadPdf')->name('credit.download_invitation_key');
Route::get('{entity}/{invitation_key}/download', 'ClientPortal\InvitationController@routerForDownload'); Route::get('{entity}/{invitation_key}/download', 'ClientPortal\InvitationController@routerForDownload');
Route::get('{entity}/{client_hash}/{invitation_key}', 'ClientPortal\InvitationController@routerForIframe')->name('invoice.client_hash_and_invitation_key'); //should never need this Route::get('{entity}/{client_hash}/{invitation_key}', 'ClientPortal\InvitationController@routerForIframe')->name('invoice.client_hash_and_invitation_key'); //should never need this
Route::get('payment_hook/{company_gateway_id}/{gateway_type_id}', 'ClientPortal\PaymentHookController@process');
}); });
Route::get('phantom/{entity}/{invitation_key}', '\App\Utils\PhantomJS\Phantom@displayInvitation')->middleware(['invite_db', 'phantom_secret'])->name('phantom_view'); Route::get('phantom/{entity}/{invitation_key}', '\App\Utils\PhantomJS\Phantom@displayInvitation')->middleware(['invite_db', 'phantom_secret'])->name('phantom_view');

View File

@ -45,7 +45,6 @@ class DeleteInvoiceTest extends TestCase
*/ */
public function testInvoiceDeletion() public function testInvoiceDeletion()
{ {
$data = [ $data = [
'name' => 'A Nice Client', 'name' => 'A Nice Client',
]; ];
@ -148,7 +147,6 @@ class DeleteInvoiceTest extends TestCase
$this->assertFalse((bool)$invoice->is_deleted); $this->assertFalse((bool)$invoice->is_deleted);
$this->assertNull($invoice->deleted_at); $this->assertNull($invoice->deleted_at);
$this->assertEquals(20, $invoice->client->fresh()->balance); $this->assertEquals(20, $invoice->client->fresh()->balance);
} }
/** /**