mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-05-24 02:14:21 -04:00
Merge pull request #4449 from turbo124/v5-stable
5.0.34 Enhancments, bug fixes and improvements in app stability
This commit is contained in:
commit
b74d80e091
1
.php_cs
1
.php_cs
@ -4,6 +4,7 @@ $finder = Symfony\Component\Finder\Finder::create()
|
||||
->notPath('vendor')
|
||||
->notPath('bootstrap')
|
||||
->notPath('storage')
|
||||
->notPath('node_modules')
|
||||
->in(__DIR__)
|
||||
->name('*.php')
|
||||
->notName('*.blade.php');
|
||||
|
18
README.md
18
README.md
@ -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)
|
||||
|
||||
## 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
|
||||
|
||||
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.
|
||||
|
||||
## License
|
||||
Invoice Ninja is released under the Attribution Assurance License.
|
||||
See [LICENSE](LICENSE) for details.
|
@ -1 +1 @@
|
||||
5.0.33
|
||||
5.0.34
|
@ -617,7 +617,6 @@ class CompanySettings extends BaseSettings
|
||||
'$quote.po_number',
|
||||
'$quote.date',
|
||||
'$quote.valid_until',
|
||||
'$quote.balance_due',
|
||||
'$quote.total',
|
||||
],
|
||||
'credit_details' => [
|
||||
@ -636,7 +635,7 @@ class CompanySettings extends BaseSettings
|
||||
'$product.line_total',
|
||||
],
|
||||
'task_columns' =>[
|
||||
'$task.product_key',
|
||||
'$task.service',
|
||||
'$task.description',
|
||||
'$task.rate',
|
||||
'$task.hours',
|
||||
|
@ -13,7 +13,14 @@ class PaymentFailed extends Exception
|
||||
|
||||
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(),
|
||||
'code' => $this->getCode(),
|
||||
]);
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
@ -314,7 +314,7 @@ class CreditController extends BaseController
|
||||
*
|
||||
* @throws \ReflectionException
|
||||
* @OA\Put(
|
||||
* path="/api/v1/Credits/{id}",
|
||||
* path="/api/v1/credits/{id}",
|
||||
* operationId="updateCredit",
|
||||
* tags={"Credits"},
|
||||
* summary="Updates an Credit",
|
||||
|
@ -843,8 +843,13 @@ class InvoiceController extends BaseController
|
||||
{
|
||||
$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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -13,8 +13,6 @@
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Requests\Payments\PaymentWebhookRequest;
|
||||
use App\Models\Payment;
|
||||
use Illuminate\Support\Arr;
|
||||
|
||||
class PaymentWebhookController extends Controller
|
||||
{
|
||||
@ -23,36 +21,10 @@ class PaymentWebhookController extends Controller
|
||||
$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);
|
||||
|
||||
$payment = Payment::where('transaction_reference', $transaction_reference)->first();
|
||||
|
||||
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
|
||||
}
|
||||
return $request->getCompanyGateway()
|
||||
->driver($request->getClient())
|
||||
->processWebhookRequest($request, $request->getPayment());
|
||||
}
|
||||
}
|
||||
|
@ -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. */
|
||||
}
|
||||
|
||||
$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');
|
||||
|
||||
if (substr($url, -1) != '/') {
|
||||
@ -84,8 +106,8 @@ class SetupController extends Controller
|
||||
'REQUIRE_HTTPS' => $request->input('https') ? 'true' : 'false',
|
||||
'APP_DEBUG' => $request->input('debug') ? 'true' : 'false',
|
||||
|
||||
'DB_HOST1' => $request->input('host'),
|
||||
'DB_DATABASE1' => $request->input('database'),
|
||||
'DB_HOST1' => $request->input('db_host'),
|
||||
'DB_DATABASE1' => $request->input('db_database'),
|
||||
'DB_USERNAME1' => $request->input('db_username'),
|
||||
'DB_PASSWORD1' => $request->input('db_password'),
|
||||
|
||||
@ -171,12 +193,12 @@ class SetupController extends Controller
|
||||
public function checkMail(CheckMailRequest $request)
|
||||
{
|
||||
try {
|
||||
$response_array = SystemHealth::testMailServer($request);
|
||||
$response = SystemHealth::testMailServer($request);
|
||||
|
||||
if (count($response_array) == 0) {
|
||||
if ($response['success']) {
|
||||
return response([], 200);
|
||||
} else {
|
||||
return response()->json(['message' => $response_array[0]], 400);
|
||||
return response()->json(['message' => $response['message']], 400);
|
||||
}
|
||||
} catch (Exception $e) {
|
||||
info(['message' => $e->getMessage(), 'action' => 'SetupController::checkMail()']);
|
||||
@ -187,10 +209,10 @@ class SetupController extends Controller
|
||||
|
||||
private function failsafeMailCheck($request)
|
||||
{
|
||||
$response_array = SystemHealth::testMailServer($request);
|
||||
$response = SystemHealth::testMailServer($request);
|
||||
|
||||
if ($response_array instanceof Response) {
|
||||
return true;
|
||||
if ($response['success']) {
|
||||
true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
@ -372,7 +372,7 @@ class UserController extends BaseController
|
||||
|
||||
$user = $this->user_repo->save($request->all(), $user);
|
||||
|
||||
if ($user) {
|
||||
if ($old_email != $new_email) {
|
||||
UserEmailChanged::dispatch($new_email, $old_email, auth()->user()->company());
|
||||
}
|
||||
|
||||
|
@ -1,5 +1,15 @@
|
||||
<?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;
|
||||
|
||||
use App\Models\Credit;
|
||||
|
@ -1,5 +1,15 @@
|
||||
<?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;
|
||||
|
||||
use App\Models\Invoice;
|
||||
@ -8,9 +18,6 @@ use Carbon\Carbon;
|
||||
use Livewire\Component;
|
||||
use Livewire\WithPagination;
|
||||
|
||||
/**
|
||||
* @todo: Integrate InvoiceFilters
|
||||
*/
|
||||
class InvoicesTable extends Component
|
||||
{
|
||||
use WithPagination, WithSorting;
|
||||
|
@ -1,5 +1,8 @@
|
||||
<?php
|
||||
|
||||
|
||||
|
||||
|
||||
namespace App\Http\Livewire;
|
||||
|
||||
use App\Models\ClientGatewayToken;
|
||||
|
@ -1,5 +1,15 @@
|
||||
<?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;
|
||||
|
||||
use App\Models\Payment;
|
||||
|
@ -1,5 +1,15 @@
|
||||
<?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;
|
||||
|
||||
use App\Models\Quote;
|
||||
|
@ -1,5 +1,15 @@
|
||||
<?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;
|
||||
|
||||
use App\Models\RecurringInvoice;
|
||||
|
@ -34,9 +34,10 @@ class QueryLogging
|
||||
$timeStart = microtime(true);
|
||||
|
||||
// Enable query logging for development
|
||||
if (config('ninja.app_env') != 'production') {
|
||||
DB::enableQueryLog();
|
||||
}
|
||||
if (config('ninja.app_env') == 'production')
|
||||
return $next($request);
|
||||
|
||||
DB::enableQueryLog();
|
||||
|
||||
$response = $next($request);
|
||||
|
||||
|
@ -1,4 +1,5 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Invoice Ninja (https://invoiceninja.com).
|
||||
*
|
||||
@ -9,12 +10,14 @@
|
||||
* @license https://opensource.org/licenses/AAL
|
||||
*/
|
||||
|
||||
|
||||
namespace App\Http\Requests\Payments;
|
||||
|
||||
use App\Http\Requests\Request;
|
||||
use App\Models\Client;
|
||||
use App\Models\Company;
|
||||
use App\Models\CompanyGateway;
|
||||
use App\Models\Payment;
|
||||
use App\Models\PaymentHash;
|
||||
|
||||
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 false;
|
||||
}
|
||||
|
||||
return Company::query()
|
||||
->where('company_key', $this->company_key)
|
||||
->firstOrFail();
|
||||
return CompanyGateway::where('gateway_key', $this->gateway_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) {
|
||||
return false;
|
||||
if ($this->query('hash')) {
|
||||
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()
|
||||
->where('gateway_key', $this->gateway_key)
|
||||
->where('company_id', $company->id)
|
||||
->firstOrFail();
|
||||
return $hash->payment;
|
||||
}
|
||||
|
||||
/**
|
||||
* 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();
|
||||
}
|
||||
}
|
||||
|
@ -34,9 +34,9 @@ class CheckDatabaseRequest extends Request
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'host' => ['required'],
|
||||
'database' => ['required'],
|
||||
'username' => ['required'],
|
||||
'db_host' => ['required'],
|
||||
'db_database' => ['required'],
|
||||
'db_username' => ['required'],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -36,14 +36,13 @@ class CheckMailRequest extends Request
|
||||
info($this->driver);
|
||||
|
||||
return [
|
||||
'driver' => ['required', 'in:smtp,mail,sendmail,log'],
|
||||
'from_name' => ['required_unless:driver,log'],
|
||||
'from_address' => ['required_unless:driver,log'],
|
||||
'username' => ['required_unless:driver,log'],
|
||||
'host' => ['required_unless:driver,log'],
|
||||
'port' => ['required_unless:driver,log'],
|
||||
'encryption' => ['required_unless:driver,log'],
|
||||
'password' => ['required_unless:driver,log'],
|
||||
'mail_driver' => 'required',
|
||||
'encryption' => 'required_unless:mail_driver,log',
|
||||
'mail_host' => 'required_unless:mail_driver,log',
|
||||
'mail_username' => 'required_unless:mail_driver,log',
|
||||
'mail_name' => 'required_unless:mail_driver,log',
|
||||
'mail_address' => 'required_unless:mail_driver,log',
|
||||
'mail_password' => 'required_unless:mail_driver,log',
|
||||
];
|
||||
}
|
||||
}
|
||||
|
@ -31,8 +31,8 @@ class StoreSetupRequest extends Request
|
||||
/*System*/
|
||||
'url' => 'required',
|
||||
/*Database*/
|
||||
'host' => 'required',
|
||||
'database' => 'required',
|
||||
'db_host' => 'required',
|
||||
'db_database' => 'required',
|
||||
'db_username' => 'required',
|
||||
'db_password' => '',
|
||||
/*Mail driver*/
|
||||
|
@ -16,6 +16,7 @@ use App\Events\Invoice\InvoiceWasEmailed;
|
||||
use App\Jobs\Entity\EmailEntity;
|
||||
use App\Libraries\MultiDB;
|
||||
use App\Models\Invoice;
|
||||
use App\Models\Webhook;
|
||||
use App\Utils\Ninja;
|
||||
use App\Utils\Traits\MakesDates;
|
||||
use App\Utils\Traits\MakesReminders;
|
||||
@ -25,6 +26,7 @@ use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Support\Carbon;
|
||||
use App\Jobs\Util\WebHookHandler;
|
||||
|
||||
class SendReminders implements ShouldQueue
|
||||
{
|
||||
@ -81,6 +83,7 @@ class SendReminders implements ShouldQueue
|
||||
|
||||
if (in_array($reminder_template, ['reminder1', 'reminder2', 'reminder3', 'endless_reminder'])) {
|
||||
$this->sendReminder($invoice, $reminder_template);
|
||||
WebHookHandler::dispatch(Webhook::EVENT_REMIND_INVOICE, $invoice, $invoice->company);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
@ -30,7 +30,6 @@ class DownloadInvoices extends Mailable
|
||||
*/
|
||||
public function build()
|
||||
{
|
||||
|
||||
return $this->from(config('mail.from.address'), config('mail.from.name'))
|
||||
|
||||
->subject(ctrans('texts.download_files'))
|
||||
|
@ -27,7 +27,6 @@ class ExistingMigration extends Mailable
|
||||
*/
|
||||
public function build()
|
||||
{
|
||||
|
||||
return $this->from(config('mail.from.address'), config('mail.from.name'))
|
||||
|
||||
->view('email.migration.existing');
|
||||
|
@ -31,7 +31,6 @@ class MigrationFailed extends Mailable
|
||||
*/
|
||||
public function build()
|
||||
{
|
||||
|
||||
return $this->from(config('mail.from.address'), config('mail.from.name'))
|
||||
|
||||
->view('email.migration.failed');
|
||||
|
@ -207,6 +207,6 @@ class ClientContact extends Authenticatable implements HasLocalePreference
|
||||
{
|
||||
$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;
|
||||
}
|
||||
}
|
||||
|
@ -81,4 +81,9 @@ class Expense extends BaseModel
|
||||
{
|
||||
return $this->belongsTo(Company::class);
|
||||
}
|
||||
|
||||
public function vendor()
|
||||
{
|
||||
return $this->belongsTo(Vendor::class);
|
||||
}
|
||||
}
|
||||
|
@ -92,7 +92,7 @@ class InvoiceSentNotification extends Notification implements ShouldQueue
|
||||
'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'),
|
||||
'signature' => $this->settings->email_signature,
|
||||
'logo' => $this->company->present()->logo(),
|
||||
|
@ -92,7 +92,7 @@ class InvoiceViewedNotification extends Notification implements ShouldQueue
|
||||
'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'),
|
||||
'signature' => $this->settings->email_signature,
|
||||
'logo' => $this->company->present()->logo(),
|
||||
|
@ -89,7 +89,7 @@ class NewPartialPaymentNotification extends Notification implements ShouldQueue
|
||||
'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'),
|
||||
'signature' => $this->settings->email_signature,
|
||||
'logo' => $this->company->present()->logo(),
|
||||
|
@ -92,7 +92,7 @@ class NewPaymentNotification extends Notification implements ShouldQueue
|
||||
'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'),
|
||||
'signature' => $this->settings->email_signature,
|
||||
'logo' => $this->company->present()->logo(),
|
||||
|
@ -82,6 +82,7 @@ class CreditCard
|
||||
'currency' => $request->currency,
|
||||
'payment_hash' => $request->payment_hash,
|
||||
'reference' => $request->payment_hash,
|
||||
'client_id' => $this->checkout->client->id,
|
||||
];
|
||||
|
||||
$state = array_merge($state, $request->all());
|
||||
@ -121,8 +122,17 @@ class CreditCard
|
||||
$payment->amount = $this->checkout->payment_hash->data->value;
|
||||
$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') {
|
||||
$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 {
|
||||
|
@ -29,6 +29,11 @@ trait Utilities
|
||||
return $this->company_gateway->getConfigField('publicApiKey');
|
||||
}
|
||||
|
||||
public function getParent()
|
||||
{
|
||||
return static::class == 'App\PaymentDrivers\CheckoutComPaymentDriver' ? $this : $this->checkout;
|
||||
}
|
||||
|
||||
public function convertToCheckoutAmount($amount, $currency)
|
||||
{
|
||||
$cases = [
|
||||
@ -52,42 +57,42 @@ trait Utilities
|
||||
|
||||
private function processSuccessfulPayment(Payment $_payment)
|
||||
{
|
||||
if ($this->checkout->payment_hash->data->store_card) {
|
||||
if ($this->getParent()->payment_hash->data->store_card) {
|
||||
$this->storePaymentMethod($_payment);
|
||||
}
|
||||
|
||||
$data = [
|
||||
'payment_method' => $_payment->source['id'],
|
||||
'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,
|
||||
];
|
||||
|
||||
$payment = $this->checkout->createPayment($data, \App\Models\Payment::STATUS_COMPLETED);
|
||||
$payment = $this->getParent()->createPayment($data, \App\Models\Payment::STATUS_COMPLETED);
|
||||
|
||||
SystemLogger::dispatch(
|
||||
['response' => $_payment, 'data' => $data],
|
||||
SystemLog::CATEGORY_GATEWAY_RESPONSE,
|
||||
SystemLog::EVENT_GATEWAY_SUCCESS,
|
||||
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)
|
||||
{
|
||||
PaymentFailureMailer::dispatch(
|
||||
$this->checkout->client,
|
||||
$this->getParent()->client,
|
||||
$_payment,
|
||||
$this->checkout->client->company,
|
||||
$this->checkout->payment_hash->data->value
|
||||
$this->getParent()->client->company,
|
||||
$this->getParent()->payment_hash->data->value
|
||||
);
|
||||
|
||||
$message = [
|
||||
'server_response' => $_payment,
|
||||
'data' => $this->checkout->payment_hash->data,
|
||||
'data' => $this->getParent()->payment_hash->data,
|
||||
];
|
||||
|
||||
SystemLogger::dispatch(
|
||||
@ -95,7 +100,7 @@ trait Utilities
|
||||
SystemLog::CATEGORY_GATEWAY_RESPONSE,
|
||||
SystemLog::EVENT_GATEWAY_FAILURE,
|
||||
SystemLog::TYPE_CHECKOUT,
|
||||
$this->checkout->client
|
||||
$this->getParent()->client
|
||||
);
|
||||
|
||||
throw new PaymentFailed($_payment->status, $_payment->http_code);
|
||||
@ -103,27 +108,10 @@ trait Utilities
|
||||
|
||||
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 {
|
||||
return redirect($_payment->_links['redirect']['href']);
|
||||
} catch (Exception $e) {
|
||||
return $this->processInternallyFailedPayment($this->checkout, $e);
|
||||
return $this->processInternallyFailedPayment($this->getParent(), $e);
|
||||
}
|
||||
}
|
||||
|
||||
@ -140,10 +128,10 @@ trait Utilities
|
||||
$data = [
|
||||
'payment_meta' => $payment_meta,
|
||||
'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) {
|
||||
session()->flash('message', ctrans('texts.payment_method_saving_failed'));
|
||||
}
|
||||
|
@ -12,7 +12,9 @@
|
||||
|
||||
namespace App\PaymentDrivers;
|
||||
|
||||
use App\Http\Requests\Payments\PaymentWebhookRequest;
|
||||
use App\Models\ClientGatewayToken;
|
||||
use App\Models\Company;
|
||||
use App\Models\GatewayType;
|
||||
use App\Models\Payment;
|
||||
use App\Models\PaymentHash;
|
||||
@ -23,6 +25,7 @@ use App\Utils\Traits\SystemLogTrait;
|
||||
use Checkout\CheckoutApi;
|
||||
use Checkout\Library\Exceptions\CheckoutHttpException;
|
||||
use Checkout\Models\Payments\Refund;
|
||||
use Exception;
|
||||
|
||||
class CheckoutComPaymentDriver extends BaseDriver
|
||||
{
|
||||
@ -209,5 +212,24 @@ class CheckoutComPaymentDriver extends BaseDriver
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -86,8 +86,7 @@ class InvoiceRepository extends BaseRepository
|
||||
public function restore($invoice) :Invoice
|
||||
{
|
||||
//if we have just archived, only perform a soft restore
|
||||
if(!$invoice->is_deleted) {
|
||||
|
||||
if (!$invoice->is_deleted) {
|
||||
parent::restore($invoice);
|
||||
|
||||
return $invoice;
|
||||
|
@ -13,11 +13,9 @@ namespace App\Services\Invoice;
|
||||
|
||||
use App\Models\Invoice;
|
||||
use App\Services\AbstractService;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
class HandleRestore extends AbstractService
|
||||
{
|
||||
|
||||
private $invoice;
|
||||
|
||||
private $payment_total = 0;
|
||||
@ -29,14 +27,13 @@ class HandleRestore extends AbstractService
|
||||
|
||||
public function run()
|
||||
{
|
||||
|
||||
if(!$this->invoice->is_deleted)
|
||||
if (!$this->invoice->is_deleted) {
|
||||
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
|
||||
$payment->restore();
|
||||
|
||||
@ -58,15 +55,12 @@ class HandleRestore extends AbstractService
|
||||
|
||||
info($payment->amount . " == " . $payment_amount);
|
||||
|
||||
if($payment->amount == $payment_amount) {
|
||||
|
||||
if ($payment->amount == $payment_amount) {
|
||||
$payment->is_deleted = false;
|
||||
$payment->save();
|
||||
|
||||
$this->payment_total += $payment_amount;
|
||||
}
|
||||
else {
|
||||
|
||||
} else {
|
||||
$payment->is_deleted = false;
|
||||
$payment->amount += ($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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//adjust ledger balance
|
||||
$this->invoice->ledger()->updateInvoiceBalance($this->invoice->balance, 'Restored invoice {$this->invoice->number}')->save();
|
||||
//adjust ledger balance
|
||||
$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()->updateBalance($this->invoice->balance)->save();
|
||||
@ -95,7 +88,6 @@ class HandleRestore extends AbstractService
|
||||
|
||||
private function windBackInvoiceNumber()
|
||||
{
|
||||
|
||||
$findme = '_' . ctrans('texts.deleted');
|
||||
|
||||
$pos = strpos($this->invoice->number, $findme);
|
||||
@ -105,11 +97,8 @@ class HandleRestore extends AbstractService
|
||||
try {
|
||||
$this->invoice->number = $new_invoice_number;
|
||||
$this->invoice->save();
|
||||
}
|
||||
catch(\Exception $e){
|
||||
} catch (\Exception $e) {
|
||||
info("I could not wind back the invoice number");
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -33,8 +33,9 @@ class MarkInvoiceDeleted extends AbstractService
|
||||
|
||||
public function run()
|
||||
{
|
||||
if($this->invoice->is_deleted)
|
||||
if ($this->invoice->is_deleted) {
|
||||
return $this->invoice;
|
||||
}
|
||||
|
||||
// if(in_array($this->invoice->status_id, ['currencies', 'industries', 'languages', 'countries', 'banks']))
|
||||
// return $this->
|
||||
@ -47,7 +48,7 @@ class MarkInvoiceDeleted extends AbstractService
|
||||
->adjustBalance()
|
||||
->adjustLedger();
|
||||
|
||||
return $this->invoice;
|
||||
return $this->invoice;
|
||||
}
|
||||
|
||||
private function adjustLedger()
|
||||
@ -75,16 +76,12 @@ class MarkInvoiceDeleted extends AbstractService
|
||||
{
|
||||
//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]);
|
||||
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
//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
|
||||
->where('paymentable_type', '=', 'invoices')
|
||||
->where('paymentable_id', $this->invoice->id)
|
||||
@ -93,7 +90,6 @@ class MarkInvoiceDeleted extends AbstractService
|
||||
$payment->amount -= $payment_adjustment;
|
||||
$payment->applied -= $payment_adjustment;
|
||||
$payment->save();
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
@ -102,7 +98,6 @@ class MarkInvoiceDeleted extends AbstractService
|
||||
|
||||
private function setAdjustmentAmount()
|
||||
{
|
||||
|
||||
foreach ($this->invoice->payments as $payment) {
|
||||
$this->adjustment_amount += $payment->paymentables
|
||||
->where('paymentable_type', '=', 'invoices')
|
||||
@ -118,7 +113,6 @@ class MarkInvoiceDeleted extends AbstractService
|
||||
|
||||
private function cleanup()
|
||||
{
|
||||
|
||||
$check = false;
|
||||
|
||||
$x=0;
|
||||
@ -136,7 +130,6 @@ class MarkInvoiceDeleted extends AbstractService
|
||||
$this->invoice->expenses()->update(['invoice_id' => null]);
|
||||
|
||||
return $this;
|
||||
|
||||
}
|
||||
|
||||
private function calcNumber($x)
|
||||
@ -153,8 +146,7 @@ class MarkInvoiceDeleted extends AbstractService
|
||||
|
||||
private function deletePaymentables()
|
||||
{
|
||||
|
||||
$this->invoice->payments->each(function ($payment){
|
||||
$this->invoice->payments->each(function ($payment) {
|
||||
$payment->paymentables()
|
||||
->where('paymentable_type', '=', 'invoices')
|
||||
->where('paymentable_id', $this->invoice->id)
|
||||
|
@ -192,6 +192,13 @@ class Design extends BaseDesign
|
||||
|
||||
$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) {
|
||||
$_variable = explode('.', $variable)[1];
|
||||
$_customs = ['custom1', 'custom2', 'custom3', 'custom4'];
|
||||
@ -293,9 +300,7 @@ class Design extends BaseDesign
|
||||
$elements = [];
|
||||
|
||||
// Some of column can be aliased. This is simple workaround for these.
|
||||
$aliases = [
|
||||
'$task.product_key' => '$task.service',
|
||||
];
|
||||
$aliases = [];
|
||||
|
||||
foreach ($this->context['pdf_variables']["{$type}_columns"] as $column) {
|
||||
if (array_key_exists($column, $aliases)) {
|
||||
|
@ -23,7 +23,7 @@ class CompanyUserTransformer extends EntityTransformer
|
||||
* @var array
|
||||
*/
|
||||
protected $defaultIncludes = [
|
||||
'user',
|
||||
// 'user',
|
||||
];
|
||||
|
||||
/**
|
||||
|
@ -26,8 +26,7 @@ class UserTransformer extends EntityTransformer
|
||||
* @var array
|
||||
*/
|
||||
protected $defaultIncludes = [
|
||||
//'company_users',
|
||||
// 'token',
|
||||
//'company_user'
|
||||
];
|
||||
|
||||
/**
|
||||
|
@ -156,10 +156,10 @@ class HtmlEngine
|
||||
$data['$balance_due'] = ['value' => Number::formatMoney($this->entity->balance, $this->client) ?: ' ', 'label' => ctrans('texts.balance_due')];
|
||||
}
|
||||
|
||||
$data['$quote.balance_due'] = &$data['$balance_due'];
|
||||
$data['$invoice.balance_due'] = &$data['$balance_due'];
|
||||
$data['$balance_due'] = &$data['$balance_due'];
|
||||
$data['$outstanding'] = &$data['$balance_due'];
|
||||
$data['$quote.balance_due'] = $data['$balance_due'];
|
||||
$data['$invoice.balance_due'] = $data['$balance_due'];
|
||||
$data['$balance_due'] = $data['$balance_due'];
|
||||
$data['$outstanding'] = $data['$balance_due'];
|
||||
$data['$partial_due'] = ['value' => Number::formatMoney($this->entity->partial, $this->client) ?: ' ', 'label' => ctrans('texts.partial_due')];
|
||||
$data['$total'] = ['value' => Number::formatMoney($this->entity_calc->getTotal(), $this->client) ?: ' ', 'label' => ctrans('texts.total')];
|
||||
$data['$amount'] = &$data['$total'];
|
||||
@ -307,7 +307,7 @@ class HtmlEngine
|
||||
|
||||
$data['$task.date'] = ['value' => '', 'label' => ctrans('texts.date')];
|
||||
$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.rate'] = ['value' => '', 'label' => ctrans('texts.rate')];
|
||||
$data['$task.hours'] = ['value' => '', 'label' => ctrans('texts.hours')];
|
||||
@ -343,6 +343,8 @@ class HtmlEngine
|
||||
$data['$item'] = ['value' => '', 'label' => ctrans('texts.item')];
|
||||
$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_label2'] = ['value' => '', 'label' => ctrans('texts.')];
|
||||
// $data['custom_label3'] = ['value' => '', 'label' => ctrans('texts.')];
|
||||
|
@ -103,7 +103,9 @@ class Number
|
||||
$value = number_format($value, $precision, $decimal, $thousand);
|
||||
$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}";
|
||||
} elseif ($swapSymbol) {
|
||||
return "{$value} ".trim($symbol);
|
||||
|
@ -68,7 +68,7 @@ class Phantom
|
||||
|
||||
$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);
|
||||
|
||||
$key = config('ninja.phantomjs_key');
|
||||
|
@ -11,8 +11,6 @@
|
||||
|
||||
namespace App\Utils;
|
||||
|
||||
use App\Http\Requests\Setup\CheckDatabaseRequest;
|
||||
use App\Http\Requests\Setup\CheckMailRequest;
|
||||
use App\Libraries\MultiDB;
|
||||
use App\Mail\TestMailServer;
|
||||
use Exception;
|
||||
@ -160,11 +158,11 @@ class SystemHealth
|
||||
{
|
||||
$result = ['success' => false];
|
||||
|
||||
if ($request && $request instanceof CheckDatabaseRequest) {
|
||||
config(['database.connections.db-ninja-01.host'=> $request->input('host')]);
|
||||
config(['database.connections.db-ninja-01.database'=> $request->input('database')]);
|
||||
config(['database.connections.db-ninja-01.username'=> $request->input('username')]);
|
||||
config(['database.connections.db-ninja-01.password'=> $request->input('password')]);
|
||||
if ($request) {
|
||||
config(['database.connections.db-ninja-01.host'=> $request->input('db_host')]);
|
||||
config(['database.connections.db-ninja-01.database'=> $request->input('db_database')]);
|
||||
config(['database.connections.db-ninja-01.username'=> $request->input('db_username')]);
|
||||
config(['database.connections.db-ninja-01.password'=> $request->input('db_password')]);
|
||||
config(['database.default' => 'db-ninja-01']);
|
||||
|
||||
DB::purge('db-ninja-01');
|
||||
@ -191,6 +189,7 @@ class SystemHealth
|
||||
} catch (Exception $e) {
|
||||
$result[] = [config('database.connections.'.config('database.default').'.database') => false];
|
||||
$result['success'] = false;
|
||||
$result['message'] = $e->getMessage();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -209,35 +208,24 @@ class SystemHealth
|
||||
return [];
|
||||
}
|
||||
|
||||
if ($request && $request instanceof CheckMailRequest) {
|
||||
config(['mail.driver' => $request->input('driver')]);
|
||||
config(['mail.host' => $request->input('host')]);
|
||||
config(['mail.port' => $request->input('port')]);
|
||||
config(['mail.from.address' => $request->input('from_address')]);
|
||||
config(['mail.from.name' => $request->input('from_name')]);
|
||||
if ($request) {
|
||||
config(['mail.driver' => $request->input('mail_driver')]);
|
||||
config(['mail.host' => $request->input('mail_host')]);
|
||||
config(['mail.port' => $request->input('mail_port')]);
|
||||
config(['mail.from.address' => $request->input('mail_address')]);
|
||||
config(['mail.from.name' => $request->input('mail_name')]);
|
||||
config(['mail.encryption' => $request->input('encryption')]);
|
||||
config(['mail.username' => $request->input('username')]);
|
||||
config(['mail.password' => $request->input('password')]);
|
||||
config(['mail.username' => $request->input('mail_username')]);
|
||||
config(['mail.password' => $request->input('mail_password')]);
|
||||
}
|
||||
|
||||
try {
|
||||
Mail::to(config('mail.from.address'))->send(new TestMailServer('Email Server Works!', config('mail.from.address')));
|
||||
} catch (Exception $e) {
|
||||
return [$e->getMessage()];
|
||||
return ['success' => false, 'message' => $e->getMessage()];
|
||||
}
|
||||
|
||||
/*
|
||||
* '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);
|
||||
return ['success' => true];
|
||||
}
|
||||
|
||||
private static function checkEnvWritable()
|
||||
|
@ -601,22 +601,37 @@ trait GeneratesCounter
|
||||
$replace[] = str_replace($format, $date, $matches[1]);
|
||||
}
|
||||
|
||||
if ($entity instanceof Client || $entity instanceof Vendor) {
|
||||
$search[] = '{$client_custom1}';
|
||||
$replace[] = $entity->custom_value1;
|
||||
if ($entity instanceof Vendor) {
|
||||
|
||||
$search[] = '{$client_custom2}';
|
||||
$replace[] = $entity->custom_value2;
|
||||
|
||||
$search[] = '{$client_custom3}';
|
||||
$replace[] = $entity->custom_value3;
|
||||
|
||||
$search[] = '{$client_custom4}';
|
||||
$replace[] = $entity->custom_value4;
|
||||
|
||||
$search[] = '{$id_number}';
|
||||
$search[] = '{$vendor_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}';
|
||||
$replace[] = $entity->client->custom_value1;
|
||||
|
||||
@ -629,7 +644,7 @@ trait GeneratesCounter
|
||||
$search[] = '{$client_custom4}';
|
||||
$replace[] = $entity->client->custom_value4;
|
||||
|
||||
$search[] = '{$id_number}';
|
||||
$search[] = '{$client_id_number}';
|
||||
$replace[] = $entity->client->id_number;
|
||||
}
|
||||
|
||||
|
@ -50,14 +50,14 @@ trait Inviteable
|
||||
|
||||
switch ($this->company->portal_mode) {
|
||||
case 'subdomain':
|
||||
return $domain.'client/'.$entity_type.'/'.$this->key;
|
||||
return $domain.'/client/'.$entity_type.'/'.$this->key;
|
||||
break;
|
||||
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;
|
||||
break;
|
||||
case 'domain':
|
||||
return $domain.'client/'.$entity_type.'/'.$this->key;
|
||||
return $domain.'/client/'.$entity_type.'/'.$this->key;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -617,6 +617,7 @@ trait MakesInvoiceValues
|
||||
}
|
||||
|
||||
$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.'.description'] = $item->notes;
|
||||
$data[$key][$table_type.'.custom_value1'] = $item->custom_value1;
|
||||
|
@ -191,7 +191,7 @@ trait MakesTemplateData
|
||||
$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.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.rate'] = ['value' => '$100.00', 'label' => ctrans('texts.rate')];
|
||||
$data['$task.hours'] = ['value' => '1', 'label' => ctrans('texts.hours')];
|
||||
|
@ -51,9 +51,9 @@
|
||||
"league/flysystem-cached-adapter": "^1.1",
|
||||
"league/fractal": "^0.17.0",
|
||||
"league/omnipay": "^3.0",
|
||||
"livewire/livewire": "^1.3",
|
||||
"livewire/livewire": "^2.0",
|
||||
"maennchen/zipstream-php": "^1.2",
|
||||
"nwidart/laravel-modules": "^6.0",
|
||||
"nwidart/laravel-modules": "^8.0",
|
||||
"omnipay/paypal": "^3.0",
|
||||
"predis/predis": "^1.1",
|
||||
"sentry/sentry-laravel": "^2",
|
||||
|
35
composer.lock
generated
35
composer.lock
generated
@ -4,7 +4,7 @@
|
||||
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
|
||||
"This file is @generated automatically"
|
||||
],
|
||||
"content-hash": "ef60a891b86ee73c6f31b73f0e778e09",
|
||||
"content-hash": "a96274475177046a99ed701ae4148a3d",
|
||||
"packages": [
|
||||
{
|
||||
"name": "asgrim/ofxparser",
|
||||
@ -3712,30 +3712,32 @@
|
||||
},
|
||||
{
|
||||
"name": "livewire/livewire",
|
||||
"version": "v1.3.5",
|
||||
"version": "v2.3.5",
|
||||
"source": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/livewire/livewire.git",
|
||||
"reference": "b1673ff9fc78a3296ca4a3b0d1ca26da0a5cdf82"
|
||||
"reference": "781a1250dc8eab9121fd856ff0b6efca8c32756f"
|
||||
},
|
||||
"dist": {
|
||||
"type": "zip",
|
||||
"url": "https://api.github.com/repos/livewire/livewire/zipball/b1673ff9fc78a3296ca4a3b0d1ca26da0a5cdf82",
|
||||
"reference": "b1673ff9fc78a3296ca4a3b0d1ca26da0a5cdf82",
|
||||
"url": "https://api.github.com/repos/livewire/livewire/zipball/781a1250dc8eab9121fd856ff0b6efca8c32756f",
|
||||
"reference": "781a1250dc8eab9121fd856ff0b6efca8c32756f",
|
||||
"shasum": ""
|
||||
},
|
||||
"require": {
|
||||
"illuminate/database": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0|^8.0",
|
||||
"illuminate/support": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0|^8.0",
|
||||
"illuminate/validation": "~5.6.0|~5.7.0|~5.8.0|^6.0|^7.0|^8.0",
|
||||
"php": "^7.1.3",
|
||||
"symfony/http-kernel": "^4.0|^5.0"
|
||||
"illuminate/database": "^7.0|^8.0",
|
||||
"illuminate/support": "^7.0|^8.0",
|
||||
"illuminate/validation": "^7.0|^8.0",
|
||||
"php": "^7.2.5|^8.0",
|
||||
"symfony/http-kernel": "^5.0"
|
||||
},
|
||||
"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",
|
||||
"orchestra/testbench": "~3.6.0|~3.7.0|~3.8.0|^4.0|^5.0",
|
||||
"phpunit/phpunit": "^7.5.15|^8.4|^9.0",
|
||||
"orchestra/testbench": "^5.0|^6.0",
|
||||
"orchestra/testbench-dusk": "^5.2|^6.0",
|
||||
"phpunit/phpunit": "^8.4|^9.0",
|
||||
"psy/psysh": "@stable"
|
||||
},
|
||||
"type": "library",
|
||||
@ -3750,6 +3752,9 @@
|
||||
}
|
||||
},
|
||||
"autoload": {
|
||||
"files": [
|
||||
"src/helpers.php"
|
||||
],
|
||||
"psr-4": {
|
||||
"Livewire\\": "src/"
|
||||
}
|
||||
@ -3767,7 +3772,7 @@
|
||||
"description": "A front-end framework for Laravel.",
|
||||
"support": {
|
||||
"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": [
|
||||
{
|
||||
@ -3775,7 +3780,7 @@
|
||||
"type": "github"
|
||||
}
|
||||
],
|
||||
"time": "2020-09-17T04:38:16+00:00"
|
||||
"time": "2020-12-01T20:51:29+00:00"
|
||||
},
|
||||
{
|
||||
"name": "maennchen/zipstream-php",
|
||||
|
@ -10,9 +10,9 @@ return [
|
||||
'app_name' => env('APP_NAME'),
|
||||
'app_env' => env('APP_ENV', 'selfhosted'),
|
||||
'require_https' => env('REQUIRE_HTTPS', true),
|
||||
'app_url' => rtrim(env('APP_URL', ''), '/').'/',
|
||||
'app_url' => rtrim(env('APP_URL', ''), '/'),
|
||||
'app_domain' => env('APP_DOMAIN', ''),
|
||||
'app_version' => '5.0.33',
|
||||
'app_version' => '5.0.34',
|
||||
'minimum_client_version' => '5.0.16',
|
||||
'terms_version' => '1.0.1',
|
||||
'api_secret' => env('API_SECRET', false),
|
||||
|
81
package-lock.json
generated
81
package-lock.json
generated
@ -1508,64 +1508,22 @@
|
||||
"integrity": "sha1-DeiJpgEgOQmw++B7iTjcIdLpZ7w="
|
||||
},
|
||||
"adjust-sourcemap-loader": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-2.0.0.tgz",
|
||||
"integrity": "sha512-4hFsTsn58+YjrU9qKzML2JSSDqKvN8mUGQ0nNIrfPi8hmIONT4L3uUaT6MKdMsZ9AjsU6D2xDkZxCkbQPxChrA==",
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/adjust-sourcemap-loader/-/adjust-sourcemap-loader-3.0.0.tgz",
|
||||
"integrity": "sha512-YBrGyT2/uVQ/c6Rr+t6ZJXniY03YtHGMJQYal368burRGYKqhx9qGTWqcBU5s1CwYY9E/ri63RYyG1IacMZtqw==",
|
||||
"requires": {
|
||||
"assert": "1.4.1",
|
||||
"camelcase": "5.0.0",
|
||||
"loader-utils": "1.2.3",
|
||||
"object-path": "0.11.4",
|
||||
"regex-parser": "2.2.10"
|
||||
"loader-utils": "^2.0.0",
|
||||
"regex-parser": "^2.2.11"
|
||||
},
|
||||
"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": {
|
||||
"version": "1.2.3",
|
||||
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-1.2.3.tgz",
|
||||
"integrity": "sha512-fkpz8ejdnEMG3s37wGL07iSBDg99O9D5yflE9RGNH3hRdx9SOwYfnGYdZOUIZitN8E+E2vkq3MUMYMvPYl5ZZA==",
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.0.tgz",
|
||||
"integrity": "sha512-rP4F0h2RaWSvPEkD7BLDFQnvSf+nK+wr3ESUjNTyAGobqrijmW92zc+SO6d4p4B1wh7+B/Jg1mkQe5NYUEHtHQ==",
|
||||
"requires": {
|
||||
"big.js": "^5.2.2",
|
||||
"emojis-list": "^2.0.0",
|
||||
"json5": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"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"
|
||||
"emojis-list": "^3.0.0",
|
||||
"json5": "^2.1.2"
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -6698,11 +6656,6 @@
|
||||
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
|
||||
"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": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
|
||||
@ -8192,9 +8145,9 @@
|
||||
}
|
||||
},
|
||||
"regex-parser": {
|
||||
"version": "2.2.10",
|
||||
"resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.10.tgz",
|
||||
"integrity": "sha512-8t6074A68gHfU8Neftl0Le6KTDwfGAj7IyjPIMSfikI2wJUTHDMaIq42bUsfVnj8mhx0R+45rdUXHGpN164avA=="
|
||||
"version": "2.2.11",
|
||||
"resolved": "https://registry.npmjs.org/regex-parser/-/regex-parser-2.2.11.tgz",
|
||||
"integrity": "sha512-jbD/FT0+9MBU2XAZluI7w2OBs1RBi6p9M83nkoZayQXXU9e8Robt69FcZc7wU4eJD/YFTjn1JdCk3rbMJajz8Q=="
|
||||
},
|
||||
"regexp.prototype.flags": {
|
||||
"version": "1.3.0",
|
||||
@ -8355,11 +8308,11 @@
|
||||
"integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo="
|
||||
},
|
||||
"resolve-url-loader": {
|
||||
"version": "3.1.1",
|
||||
"resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.1.tgz",
|
||||
"integrity": "sha512-K1N5xUjj7v0l2j/3Sgs5b8CjrrgtC70SmdCuZiJ8tSyb5J+uk3FoeZ4b7yTnH6j7ngI+Bc5bldHJIa8hYdu2gQ==",
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-3.1.2.tgz",
|
||||
"integrity": "sha512-QEb4A76c8Mi7I3xNKXlRKQSlLBwjUV/ULFMP+G7n3/7tJZ8MG5wsZ3ucxP1Jz8Vevn6fnJsxDx9cIls+utGzPQ==",
|
||||
"requires": {
|
||||
"adjust-sourcemap-loader": "2.0.0",
|
||||
"adjust-sourcemap-loader": "3.0.0",
|
||||
"camelcase": "5.3.1",
|
||||
"compose-function": "3.0.3",
|
||||
"convert-source-map": "1.7.0",
|
||||
|
@ -28,7 +28,7 @@
|
||||
"jsignature": "^2.1.3",
|
||||
"laravel-mix": "^5.0.7",
|
||||
"lodash": "^4.17.20",
|
||||
"resolve-url-loader": "^3.1.0",
|
||||
"resolve-url-loader": "^3.1.2",
|
||||
"sass": "^1.26.10",
|
||||
"sass-loader": "^8.0.0",
|
||||
"tailwindcss": "^1.6.2"
|
||||
|
2
public/css/app.css
vendored
2
public/css/app.css
vendored
File diff suppressed because one or more lines are too long
44
public/flutter_service_worker.js
vendored
44
public/flutter_service_worker.js
vendored
@ -3,36 +3,36 @@ const MANIFEST = 'flutter-app-manifest';
|
||||
const TEMP = 'flutter-temp-cache';
|
||||
const CACHE_NAME = 'flutter-app-cache';
|
||||
const RESOURCES = {
|
||||
"version.json": "32afcc2282ccf7746c00708ef0601017",
|
||||
"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",
|
||||
"version.json": "aeea8a1fbb79cee45facc28ba9a6baf7",
|
||||
"assets/assets/images/logo.png": "090f69e23311a4b6d851b3880ae52541",
|
||||
"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/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/visa.png": "3ddc4a4d25c946e8ad7e6998f30fd4e3",
|
||||
"assets/assets/images/payment_types/laser.png": "b4e6e93dd35517ac429301119ff05868",
|
||||
"assets/assets/images/payment_types/switch.png": "4fa11c45327f5fdc20205821b2cfd9cc",
|
||||
"assets/assets/images/payment_types/jcb.png": "07e0942d16c5592118b72e74f2f7198c",
|
||||
"assets/assets/images/payment_types/amex.png": "c49a4247984b3732a4af50a3390aa978",
|
||||
"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/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/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",
|
||||
"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
|
||||
|
2
public/js/setup/setup.js
vendored
2
public/js/setup/setup.js
vendored
File diff suppressed because one or more lines are too long
1686
public/js/vendor/alpinejs/alpine.js
vendored
1686
public/js/vendor/alpinejs/alpine.js
vendored
File diff suppressed because it is too large
Load Diff
205993
public/main.dart.js
vendored
205993
public/main.dart.js
vendored
File diff suppressed because one or more lines are too long
@ -1,6 +1,6 @@
|
||||
{
|
||||
"/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/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",
|
||||
@ -15,6 +15,6 @@
|
||||
"/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/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"
|
||||
}
|
||||
|
14
public/vendor/livewire/livewire.js
vendored
14
public/vendor/livewire/livewire.js
vendored
File diff suppressed because one or more lines are too long
2
public/vendor/livewire/livewire.js.map
vendored
2
public/vendor/livewire/livewire.js.map
vendored
File diff suppressed because one or more lines are too long
2
public/vendor/livewire/manifest.json
vendored
2
public/vendor/livewire/manifest.json
vendored
@ -1 +1 @@
|
||||
{"/livewire.js":"/livewire.js?id=d7d975b5d122717a1ee0"}
|
||||
{"/livewire.js":"/livewire.js?id=eb510e851dceb24afd36"}
|
@ -1 +1 @@
|
||||
{"app_name":"invoiceninja_flutter","version":"5.0.27","build_number":"27"}
|
||||
{"app_name":"invoiceninja_flutter","version":"5.0.28","build_number":"28"}
|
22
resources/js/setup/setup.js
vendored
22
resources/js/setup/setup.js
vendored
@ -24,10 +24,10 @@ class Setup {
|
||||
|
||||
handleDatabaseCheck() {
|
||||
let data = {
|
||||
host: document.querySelector('input[name="host"]').value,
|
||||
database: document.querySelector('input[name="database"]').value,
|
||||
username: document.querySelector('input[name="db_username"]').value,
|
||||
password: document.querySelector('input[name="db_password"]').value,
|
||||
db_host: document.querySelector('input[name="db_host"]').value,
|
||||
db_database: document.querySelector('input[name="db_database"]').value,
|
||||
db_username: document.querySelector('input[name="db_username"]').value,
|
||||
db_password: document.querySelector('input[name="db_password"]').value,
|
||||
};
|
||||
|
||||
Axios.post('/setup/check_db', data)
|
||||
@ -39,17 +39,17 @@ class Setup {
|
||||
|
||||
handleSmtpCheck() {
|
||||
let data = {
|
||||
driver: document.querySelector('select[name="mail_driver"]').value,
|
||||
from_name: document.querySelector('input[name="mail_name"]').value,
|
||||
from_address: document.querySelector('input[name="mail_address"]')
|
||||
mail_driver: document.querySelector('select[name="mail_driver"]').value,
|
||||
mail_name: document.querySelector('input[name="mail_name"]').value,
|
||||
mail_address: document.querySelector('input[name="mail_address"]')
|
||||
.value,
|
||||
username: document.querySelector('input[name="mail_username"]')
|
||||
mail_username: document.querySelector('input[name="mail_username"]')
|
||||
.value,
|
||||
host: document.querySelector('input[name="mail_host"]').value,
|
||||
port: document.querySelector('input[name="mail_port"]').value,
|
||||
mail_host: document.querySelector('input[name="mail_host"]').value,
|
||||
mail_port: document.querySelector('input[name="mail_port"]').value,
|
||||
encryption: document.querySelector('select[name="encryption"]')
|
||||
.value,
|
||||
password: document.querySelector('input[name="mail_password"]')
|
||||
mail_password: document.querySelector('input[name="mail_password"]')
|
||||
.value,
|
||||
};
|
||||
|
||||
|
@ -68,8 +68,8 @@ $LANG = [
|
||||
'tax_rates' => 'Steuersätze',
|
||||
'rate' => 'Satz',
|
||||
'settings' => 'Einstellungen',
|
||||
'enable_invoice_tax' => 'Ermögliche das Bestimmen einer <strong>Rechnungssteuer</strong>',
|
||||
'enable_line_item_tax' => 'Ermögliche das Bestimmen von <strong>Steuern für Belegpositionen</strong>',
|
||||
'enable_invoice_tax' => 'Ermögliche das Bestimmen einer Rechnungssteuer',
|
||||
'enable_line_item_tax' => 'Ermögliche das Bestimmen von Steuern für Belegpositionen',
|
||||
'dashboard' => 'Dashboard',
|
||||
'clients' => 'Kunden',
|
||||
'invoices' => 'Rechnungen',
|
||||
@ -95,9 +95,9 @@ $LANG = [
|
||||
'powered_by' => 'Unterstützt durch',
|
||||
'no_items' => 'Keine Objekte',
|
||||
'recurring_invoices' => 'Wiederkehrende Rechnungen',
|
||||
'recurring_help' => '<p>Automatically send clients the same invoices weekly, bi-monthly, monthly, quarterly or annually. </p>
|
||||
<p>Use :MONTH, :QUARTER or :YEAR for dynamic dates. Basic math works as well, for example :MONTH-1.</p>
|
||||
<p>Examples of dynamic invoice variables:</p>
|
||||
'recurring_help' => 'Automatically send clients the same invoices weekly, bi-monthly, monthly, quarterly or annually.
|
||||
Use :MONTH, :QUARTER or :YEAR for dynamic dates. Basic math works as well, for example :MONTH-1.
|
||||
Examples of dynamic invoice variables:
|
||||
<ul>
|
||||
<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>
|
||||
@ -172,9 +172,9 @@ $LANG = [
|
||||
'payment_gateway' => 'Zahlungseingang',
|
||||
'gateway_id' => 'Zahlungsanbieter',
|
||||
'email_notifications' => 'E-Mail Benachrichtigungen',
|
||||
'email_sent' => 'Benachrichtigen, wenn eine Rechnung <strong>versendet</strong> wurde',
|
||||
'email_viewed' => 'Benachrichtigen, wenn eine Rechnung <strong>betrachtet</strong> wurde',
|
||||
'email_paid' => 'Benachrichtigen, wenn eine Rechnung <strong>bezahlt</strong> wurde',
|
||||
'email_sent' => 'Benachrichtigen, wenn eine Rechnung versendet wurde',
|
||||
'email_viewed' => 'Benachrichtigen, wenn eine Rechnung betrachtet wurde',
|
||||
'email_paid' => 'Benachrichtigen, wenn eine Rechnung bezahlt wurde',
|
||||
'site_updates' => 'Webseitenaktualisierungen',
|
||||
'custom_messages' => 'Benutzerdefinierte Nachrichten',
|
||||
'default_email_footer' => 'Standard-E-Mail Signatur',
|
||||
@ -271,7 +271,7 @@ $LANG = [
|
||||
'password' => 'Passwort',
|
||||
'pro_plan_product' => 'Pro Plan',
|
||||
'pro_plan_success' => 'Danke, dass Sie Invoice Ninja\'s Pro gewählt haben!<p/> <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
|
||||
Pro Funktionen freizuschalten, folgen Sie bitte den Anweisungen in der Rechnung um ein Jahr
|
||||
die Pro Funktionen zu nutzen.
|
||||
@ -290,9 +290,9 @@ $LANG = [
|
||||
'product' => 'Produkt',
|
||||
'products' => 'Produkte',
|
||||
'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_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',
|
||||
'edit_product' => 'Produkt bearbeiten',
|
||||
'archive_product' => 'Produkt archivieren',
|
||||
@ -498,7 +498,7 @@ $LANG = [
|
||||
'send_email' => 'E-Mail senden',
|
||||
'set_password' => 'Passwort festlegen',
|
||||
'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' => 'Der folgende Kunde :client nahm das Angebot :invoice über :amount an.',
|
||||
'resend_confirmation' => 'Bestätigungsmail erneut senden',
|
||||
@ -617,7 +617,7 @@ $LANG = [
|
||||
'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_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' => 'Trennen',
|
||||
'show_address' => 'Adresse anzeigen',
|
||||
@ -660,8 +660,8 @@ $LANG = [
|
||||
'created_by_invoice' => 'Erstellt durch :invoice',
|
||||
'primary_user' => 'Primärer Benutzer',
|
||||
'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>
|
||||
<p>If you need help figuring something out post a question to our :forum_link with the design you\'re using.</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.
|
||||
If you need help figuring something out post a question to our :forum_link with the design you\'re using.',
|
||||
'playground' => 'Spielplatz',
|
||||
'support_forum' => 'Support-Forum',
|
||||
'invoice_due_date' => 'Fälligkeitsdatum',
|
||||
@ -678,7 +678,7 @@ $LANG = [
|
||||
'status_paid' => 'Bezahlt',
|
||||
'status_unpaid' => 'Unbezahlt',
|
||||
'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_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.',
|
||||
@ -934,15 +934,15 @@ $LANG = [
|
||||
'edit_payment_term' => 'Bearbeite Zahlungsbedingungen',
|
||||
'archive_payment_term' => 'Archiviere Zahlungsbedingungen',
|
||||
'recurring_due_dates' => 'Wiederkehrende Rechnungen Fälligkeitsdatum',
|
||||
'recurring_due_date_help' => '<p>Legt automatisch ein Fälligkeitsdatem für die Rechnung fest.</p>
|
||||
<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>
|
||||
<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>
|
||||
<p>Zum Beispiel:</p>
|
||||
'recurring_due_date_help' => 'Legt automatisch ein Fälligkeitsdatem für die Rechnung fest.
|
||||
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.
|
||||
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.
|
||||
Zum Beispiel:
|
||||
<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 letzte Tag eines Monats. Das nächste Fälligkeitsdatum entspricht dem letzten Tag des aktuellen Monats, also dem 31. Januar.
|
||||
</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>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>
|
||||
@ -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',
|
||||
'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.',
|
||||
'enable_second_tax_rate' => 'Aktiviere Spezifizierung einer <b>zweiten Steuerrate</b>',
|
||||
'enable_second_tax_rate' => 'Aktiviere Spezifizierung einer zweiten Steuerrate',
|
||||
'payment_file' => 'Zahlungsdatei',
|
||||
'expense_file' => 'Ausgabenakte',
|
||||
'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_line1' => 'Dies ist Ihr Invoice Ninja Bot Sicherheitscode.',
|
||||
'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',
|
||||
|
||||
'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',
|
||||
'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_available' => 'Eine neue Version von Invoice Ninja ist 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_download_start' => 'Download :version',
|
||||
'create_new' => 'Neu...',
|
||||
@ -1963,7 +1963,7 @@ Sobald Sie die Beträge erhalten haben, kommen Sie bitte wieder zurück zu diese
|
||||
// BlueVine
|
||||
'bluevine_promo' => 'Factoring und Bonitätsauskünfte von BlueVine bestellen.',
|
||||
'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>',
|
||||
'bluevine_create_account' => 'Konto erstellen',
|
||||
'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',
|
||||
'save_as_default' => 'Als Standard speichern',
|
||||
'template' => 'Vorlage',
|
||||
'start_of_week_help' => 'Verwendet von <b>Datums</b>selektoren',
|
||||
'financial_year_start_help' => 'Verwendet von <b>Datum-Bereichs</b>selektoren',
|
||||
'start_of_week_help' => 'Verwendet von Datumsselektoren',
|
||||
'financial_year_start_help' => 'Verwendet von Datum-Bereichsselektoren',
|
||||
'reports_help' => 'Shift + Click to sort by multiple columns, Ctrl + Click to clear the grouping.',
|
||||
'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_yearly' => 'Jährlich',
|
||||
'profile' => 'Profil',
|
||||
'payment_type_help' => 'Setze die Standard <b>manuelle Zahlungsmethode</b>.',
|
||||
'payment_type_help' => 'Setze die Standard manuelle Zahlungsmethode.',
|
||||
'industry_Construction' => 'Bauwesen',
|
||||
'your_statement' => 'Deine Abrechnung',
|
||||
'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_Money Order' => 'Zahlunganweisung',
|
||||
'archived_products' => 'Archivierung erfolgreich :Produktzähler',
|
||||
'recommend_on' => 'Wir empfehlen diese Einstellung zu <b>aktivieren</b>.',
|
||||
'recommend_off' => 'Wir empfehlen diese Einstellung zu <b>deaktivieren</b>.',
|
||||
'recommend_on' => 'Wir empfehlen diese Einstellung zu aktivieren.',
|
||||
'recommend_off' => 'Wir empfehlen diese Einstellung zu deaktivieren.',
|
||||
'notes_auto_billed' => 'Automatisch verrechnet',
|
||||
'surcharge_label' => 'Aufschlagsfeldbezeichnung',
|
||||
'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',
|
||||
'ofx_version' => 'OFX-Version',
|
||||
'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',
|
||||
'late_fee_amount' => 'Höhe des Verspätungszuschlags',
|
||||
'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',
|
||||
'verification_file' => 'Verifizierungsdatei',
|
||||
'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',
|
||||
'optional_payment_methods' => 'Optionale Zahlungsmethoden',
|
||||
'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',
|
||||
'mcrypt_warning' => 'Warning: Mcrypt is deprecated, run :command to update your cipher.',
|
||||
'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_warning' => 'Warning: existing invoices will need to be resaved',
|
||||
'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',
|
||||
'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.',
|
||||
'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',
|
||||
'updated_client_details' => 'Successfully updated client details',
|
||||
'auto' => 'Auto',
|
||||
|
@ -72,8 +72,8 @@ return [
|
||||
'tax_rates' => 'Tax Rates',
|
||||
'rate' => 'Rate',
|
||||
'settings' => 'Settings',
|
||||
'enable_invoice_tax' => 'Enable specifying an <b>invoice tax</b>',
|
||||
'enable_line_item_tax' => 'Enable specifying <b>line item taxes</b>',
|
||||
'enable_invoice_tax' => 'Enable specifying an invoice tax',
|
||||
'enable_line_item_tax' => 'Enable specifying line item taxes',
|
||||
'dashboard' => 'Dashboard',
|
||||
'dashboard_totals_in_all_currencies_help' => 'Note: add a :link named ":name" to show the totals using a single base currency.',
|
||||
'clients' => 'Clients',
|
||||
@ -100,9 +100,9 @@ return [
|
||||
'powered_by' => 'Powered by',
|
||||
'no_items' => 'No items',
|
||||
'recurring_invoices' => 'Recurring Invoices',
|
||||
'recurring_help' => '<p>Automatically send clients the same invoices weekly, bi-monthly, monthly, quarterly or annually. </p>
|
||||
<p>Use :MONTH, :QUARTER or :YEAR for dynamic dates. Basic math works as well, for example :MONTH-1.</p>
|
||||
<p>Examples of dynamic invoice variables:</p>
|
||||
'recurring_help' => 'Automatically send clients the same invoices weekly, bi-monthly, monthly, quarterly or annually.
|
||||
Use :MONTH, :QUARTER or :YEAR for dynamic dates. Basic math works as well, for example :MONTH-1.
|
||||
Examples of dynamic invoice variables:
|
||||
<ul>
|
||||
<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>
|
||||
@ -177,12 +177,12 @@ return [
|
||||
'payment_gateway' => 'Payment Gateway',
|
||||
'gateway_id' => 'Gateway',
|
||||
'email_notifications' => 'Email Notifications',
|
||||
'email_sent' => 'Email me when an invoice is <b>sent</b>',
|
||||
'email_viewed' => 'Email me when an invoice is <b>viewed</b>',
|
||||
'email_paid' => 'Email me when an invoice is <b>paid</b>',
|
||||
'email_sent' => 'Email me when an invoice is sent',
|
||||
'email_viewed' => 'Email me when an invoice is viewed',
|
||||
'email_paid' => 'Email me when an invoice is paid',
|
||||
'site_updates' => 'Site Updates',
|
||||
'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',
|
||||
'first_row_headers' => 'Use first row as headers',
|
||||
'column' => 'Column',
|
||||
@ -285,11 +285,11 @@ return [
|
||||
'erase_data' => 'Your account is not registered, this will permanently erase your data.',
|
||||
'password' => 'Password',
|
||||
'pro_plan_product' => 'Pro Plan',
|
||||
'pro_plan_success' => 'Thanks for choosing Invoice Ninja\'s Pro plan!<p/> <br/>
|
||||
<b>Next Steps</b><p/>A payable invoice has been sent to the email
|
||||
'pro_plan_success' => 'Thanks for choosing Invoice Ninja\'s Pro plan! <br/>
|
||||
Next StepsA payable invoice has been sent to the email
|
||||
address associated with your account. To unlock all of the awesome
|
||||
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
|
||||
-- email us at contact@invoiceninja.com',
|
||||
'unsaved_changes' => 'You have unsaved changes',
|
||||
@ -305,9 +305,9 @@ return [
|
||||
'product' => 'Product',
|
||||
'products' => '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_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',
|
||||
'edit_product' => 'Edit Product',
|
||||
'archive_product' => 'Archive Product',
|
||||
@ -514,7 +514,7 @@ return [
|
||||
'send_email' => 'Send Email',
|
||||
'set_password' => 'Set Password',
|
||||
'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' => 'The following client :client approved Quote :invoice for :amount.',
|
||||
'resend_confirmation' => 'Resend confirmation email',
|
||||
@ -634,7 +634,7 @@ return [
|
||||
'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_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' => 'Unlink',
|
||||
'show_address' => 'Show Address',
|
||||
@ -677,8 +677,8 @@ return [
|
||||
'created_by_invoice' => 'Created by :invoice',
|
||||
'primary_user' => 'Primary User',
|
||||
'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>
|
||||
<p>If you need help figuring something out post a question to our :forum_link with the design you\'re using.</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.
|
||||
If you need help figuring something out post a question to our :forum_link with the design you\'re using.',
|
||||
'playground' => 'playground',
|
||||
'support_forum' => 'support forum',
|
||||
'invoice_due_date' => 'Due Date',
|
||||
@ -695,7 +695,7 @@ return [
|
||||
'status_paid' => 'Paid',
|
||||
'status_unpaid' => 'Unpaid',
|
||||
'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_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.',
|
||||
@ -965,10 +965,10 @@ return [
|
||||
'edit_payment_term' => 'Edit Payment Term',
|
||||
'archive_payment_term' => 'Archive Payment Term',
|
||||
'recurring_due_dates' => 'Recurring Invoice Due Dates',
|
||||
'recurring_due_date_help' => '<p>Automatically sets a due date for the invoice.</p>
|
||||
<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>
|
||||
<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>
|
||||
<p>For example:</p>
|
||||
'recurring_due_date_help' => 'Automatically sets a due date for the invoice.
|
||||
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.
|
||||
Invoices on a weekly cycle set to be due on the day of the week they are created will be due the next week.
|
||||
For example:
|
||||
<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 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',
|
||||
'wait_for_upload' => 'Please wait for the document upload to complete.',
|
||||
'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',
|
||||
'expense_file' => 'Expense File',
|
||||
'product_file' => 'Product File',
|
||||
@ -1885,10 +1885,10 @@ return [
|
||||
'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_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',
|
||||
|
||||
'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)',
|
||||
'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_available' => 'A new version of Invoice Ninja is 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_download_start' => 'Download :version',
|
||||
'create_new' => 'Create New',
|
||||
@ -1999,7 +1999,7 @@ return [
|
||||
// BlueVine
|
||||
'bluevine_promo' => 'Get flexible business lines of credit and invoice factoring using 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>',
|
||||
'bluevine_create_account' => 'Create an account',
|
||||
'quote_types' => 'Get a quote for',
|
||||
@ -2155,8 +2155,8 @@ return [
|
||||
'recipients' => 'Recipients',
|
||||
'save_as_default' => 'Save as default',
|
||||
'template' => 'Template',
|
||||
'start_of_week_help' => 'Used by <b>date</b> selectors',
|
||||
'financial_year_start_help' => 'Used by <b>date range</b> selectors',
|
||||
'start_of_week_help' => 'Used by date 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.',
|
||||
'this_year' => 'This Year',
|
||||
|
||||
@ -2180,7 +2180,7 @@ return [
|
||||
'freq_two_months' => 'Two months',
|
||||
'freq_yearly' => 'Annually',
|
||||
'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',
|
||||
'your_statement' => 'Your Statement',
|
||||
'statement_issued_to' => 'Statement issued to',
|
||||
@ -2273,8 +2273,8 @@ return [
|
||||
'payment_type_Venmo' => 'Venmo',
|
||||
'payment_type_Money Order' => 'Money Order',
|
||||
'archived_products' => 'Successfully archived :count products',
|
||||
'recommend_on' => 'We recommend <b>enabling</b> this setting.',
|
||||
'recommend_off' => 'We recommend <b>disabling</b> this setting.',
|
||||
'recommend_on' => 'We recommend enabling this setting.',
|
||||
'recommend_off' => 'We recommend disabling this setting.',
|
||||
'notes_auto_billed' => 'Auto-billed',
|
||||
'surcharge_label' => 'Surcharge Label',
|
||||
'contact_fields' => 'Contact Fields',
|
||||
@ -2362,7 +2362,7 @@ return [
|
||||
'app_version' => 'App Version',
|
||||
'ofx_version' => 'OFX Version',
|
||||
'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',
|
||||
'late_fee_amount' => 'Late Fee Amount',
|
||||
'late_fee_percent' => 'Late Fee Percent',
|
||||
@ -2622,7 +2622,7 @@ return [
|
||||
'subdomain_is_set' => 'subdomain is set',
|
||||
'verification_file' => 'Verification File',
|
||||
'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',
|
||||
'optional_payment_methods' => 'Optional Payment Methods',
|
||||
'add_subscription' => 'Add Subscription',
|
||||
@ -2674,7 +2674,7 @@ return [
|
||||
'processing_request' => 'Processing request',
|
||||
'mcrypt_warning' => 'Warning: Mcrypt is deprecated, run :command to update your cipher.',
|
||||
'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_warning' => 'Warning: existing invoices will need to be resaved',
|
||||
'copy_shipping' => 'Copy Shipping',
|
||||
@ -2706,7 +2706,7 @@ return [
|
||||
'return_to_login' => 'Return to Login',
|
||||
'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.',
|
||||
'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_text' => 'Use a permanent address where you can receive mail.',
|
||||
'updated_client_details' => 'Successfully updated client details',
|
||||
@ -3233,7 +3233,7 @@ return [
|
||||
'test_pdf' => 'Test PDF',
|
||||
'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',
|
||||
'npm_status' => 'NPM status',
|
||||
|
@ -36,7 +36,7 @@
|
||||
<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/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://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>
|
||||
|
@ -57,7 +57,7 @@
|
||||
<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/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') }}">
|
||||
<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>
|
||||
|
@ -206,4 +206,4 @@
|
||||
<table id="delivery-note-table" cellspacing="0"></table>
|
||||
</div>
|
||||
|
||||
<div id="footer"></div>
|
||||
<div id="footer">$entity_footer</div>
|
||||
|
@ -248,4 +248,4 @@
|
||||
<table id="delivery-note-table" cellspacing="0"></table>
|
||||
</div>
|
||||
|
||||
<div id="footer"></div>
|
||||
<div id="footer">$entity_footer</div>
|
||||
|
@ -189,4 +189,4 @@
|
||||
<table id="delivery-note-table" cellspacing="0"></table>
|
||||
</div>
|
||||
|
||||
<div id="footer"></div>
|
||||
<div id="footer">$entity_footer</div>
|
||||
|
@ -213,4 +213,4 @@
|
||||
<table id="delivery-note-table" cellspacing="0"></table>
|
||||
</div>
|
||||
|
||||
<div id="footer"></div>
|
||||
<div id="footer">$entity_footer</div>
|
||||
|
@ -217,5 +217,5 @@
|
||||
<p class="thanks-label">$thanks_label!</p>
|
||||
<hr class="double-border"/>
|
||||
|
||||
<div id="footer"></div>
|
||||
<div id="footer">$entity_footer</div>
|
||||
|
||||
|
@ -243,4 +243,4 @@
|
||||
<table id="delivery-note-table" cellspacing="0"></table>
|
||||
</div>
|
||||
|
||||
<div id="footer"></div>
|
||||
<div id="footer">$entity_footer</div>
|
||||
|
@ -217,7 +217,7 @@
|
||||
<div style="margin-top: 195px"></div>
|
||||
<div class="footer-wrapper" id="footer">
|
||||
<div class="footer-content">
|
||||
<div></div>
|
||||
<div>$entity_footer</div>
|
||||
<div id="company-details"></div>
|
||||
<div id="company-address"></div>
|
||||
</div>
|
||||
|
@ -162,4 +162,4 @@
|
||||
<table id="delivery-note-table" cellspacing="0"></table>
|
||||
</div>
|
||||
|
||||
<div id="footer"></div>
|
||||
<div id="footer">$entity_footer</div>
|
||||
|
@ -231,5 +231,5 @@
|
||||
<table id="delivery-note-table" cellspacing="0"></table>
|
||||
</div>
|
||||
|
||||
<div id="footer"></div>
|
||||
<div id="footer">$entity_footer</div>
|
||||
|
||||
|
@ -76,6 +76,6 @@
|
||||
{{ ctrans('texts.showing_x_of', ['first' => $credits->firstItem(), 'last' => $credits->lastItem(), 'total' => $credits->total()]) }}
|
||||
</span>
|
||||
@endif
|
||||
{{ $credits->links() }}
|
||||
{{ $credits->links('portal/ninja2020/vendor/pagination') }}
|
||||
</div>
|
||||
</div>
|
@ -104,6 +104,6 @@
|
||||
{{ ctrans('texts.showing_x_of', ['first' => $documents->firstItem(), 'last' => $documents->lastItem(), 'total' => $documents->total()]) }}
|
||||
</span>
|
||||
@endif
|
||||
{{ $documents->links() }}
|
||||
{{ $documents->links('portal/ninja2020/vendor/pagination') }}
|
||||
</div>
|
||||
</div>
|
@ -122,11 +122,11 @@
|
||||
</div>
|
||||
<div class="flex justify-center mt-6 mb-6 md:justify-between">
|
||||
@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()]) }}
|
||||
</span>
|
||||
@endif
|
||||
{{ $invoices->links() }}
|
||||
{{ $invoices->links('portal/ninja2020/vendor/pagination') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -116,6 +116,6 @@
|
||||
</span>
|
||||
@endif
|
||||
|
||||
{{ $payment_methods->links() }}
|
||||
{{ $payment_methods->links('portal/ninja2020/vendor/pagination') }}
|
||||
</div>
|
||||
</div>
|
||||
|
@ -82,6 +82,6 @@
|
||||
{{ ctrans('texts.showing_x_of', ['first' => $payments->firstItem(), 'last' => $payments->lastItem(), 'total' => $payments->total()]) }}
|
||||
</span>
|
||||
@endif
|
||||
{{ $payments->links() }}
|
||||
{{ $payments->links('portal/ninja2020/vendor/pagination') }}
|
||||
</div>
|
||||
</div>
|
@ -112,7 +112,7 @@
|
||||
{{ ctrans('texts.showing_x_of', ['first' => $quotes->firstItem(), 'last' => $quotes->lastItem(), 'total' => $quotes->total()]) }}
|
||||
</span>
|
||||
@endif
|
||||
{{ $quotes->links() }}
|
||||
{{ $quotes->links('portal/ninja2020/vendor/pagination') }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
@ -84,6 +84,6 @@
|
||||
{{ ctrans('texts.showing_x_of', ['first' => $invoices->firstItem(), 'last' => $invoices->lastItem(), 'total' => $invoices->total()]) }}
|
||||
</span>
|
||||
@endif
|
||||
{{ $invoices->links() }}
|
||||
{{ $invoices->links('portal/ninja2020/vendor/pagination') }}
|
||||
</div>
|
||||
</div>
|
||||
|
@ -49,7 +49,7 @@
|
||||
|
||||
<!-- Scripts -->
|
||||
<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 -->
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com">
|
||||
|
@ -48,7 +48,7 @@
|
||||
|
||||
<!-- Scripts -->
|
||||
<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 -->
|
||||
<link rel="dns-prefetch" href="https://fonts.gstatic.com">
|
||||
@ -58,7 +58,7 @@
|
||||
<link href="{{ mix('css/app.css') }}" rel="stylesheet">
|
||||
{{-- <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') --}}
|
||||
@stack('head')
|
||||
|
@ -1,67 +1,56 @@
|
||||
<div class="border-t border-gray-200 px-4 flex items-center justify-between sm:px-0">
|
||||
<div class="w-0 flex-1 flex">
|
||||
<a href="{{ $paginator->previousPageUrl() }}"
|
||||
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">
|
||||
<svg class="mr-3 h-5 w-5 text-gray-400" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd"
|
||||
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"
|
||||
clip-rule="evenodd"/>
|
||||
</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">
|
||||
...
|
||||
@if ($paginator->hasPages())
|
||||
<ul class="pagination" role="navigation">
|
||||
{{-- Previous Page Link --}}
|
||||
@if ($paginator->onFirstPage())
|
||||
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
|
||||
<span class="page-link" aria-hidden="true">
|
||||
<span class="d-none d-md-block">‹</span>
|
||||
<span class="d-block d-md-none">@lang('pagination.previous')</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">‹</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
|
||||
|
||||
{{-- Array Of Links --}}
|
||||
@if (is_array($element))
|
||||
@foreach ($element as $page => $url)
|
||||
@if ($page == $paginator->currentPage())
|
||||
<a href="#" disabled
|
||||
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>
|
||||
<li class="page-item active d-none d-md-block" aria-current="page"><span class="page-link">{{ $page }}</span></li>
|
||||
@else
|
||||
<a href="{{ $url }}"
|
||||
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>
|
||||
<li class="page-item d-none d-md-block"><button type="button" class="page-link" wire:click="gotoPage({{ $page }})">{{ $page }}</button></li>
|
||||
@endif
|
||||
@endforeach
|
||||
@endif
|
||||
|
||||
@endforeach
|
||||
</div>
|
||||
|
||||
@if ($paginator->hasMorePages())
|
||||
<div class="w-0 flex-1 flex justify-end">
|
||||
<a href="{{ $paginator->nextPageUrl() }}"
|
||||
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">
|
||||
@lang('texts.next')
|
||||
<svg class="ml-3 h-5 w-5 text-gray-400" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd"
|
||||
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"
|
||||
clip-rule="evenodd"/>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
{{-- Next Page Link --}}
|
||||
@if ($paginator->hasMorePages())
|
||||
<li class="page-item">
|
||||
<button type="button" class="page-link" wire:click="nextPage" rel="next" aria-label="@lang('pagination.next')">
|
||||
<span class="d-block d-md-none">@lang('pagination.next')</span>
|
||||
<span class="d-none d-md-block">›</span>
|
||||
</button>
|
||||
</li>
|
||||
@else
|
||||
<div class="w-0 flex-1 flex justify-end">
|
||||
<a href="#"
|
||||
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">
|
||||
@lang('texts.next')
|
||||
<svg class="ml-3 h-5 w-5 text-gray-400" fill="currentColor" viewBox="0 0 20 20">
|
||||
<path fill-rule="evenodd"
|
||||
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"
|
||||
clip-rule="evenodd"/>
|
||||
</svg>
|
||||
</a>
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
|
||||
<span class="page-link" aria-hidden="true">
|
||||
<span class="d-block d-md-none">@lang('pagination.next')</span>
|
||||
<span class="d-none d-md-block">›</span>
|
||||
</span>
|
||||
</li>
|
||||
@endif
|
||||
</ul>
|
||||
@endif
|
@ -38,7 +38,7 @@ FLUSH PRIVILEGES;
|
||||
{{ ctrans('texts.host') }}*
|
||||
</dt>
|
||||
<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>
|
||||
</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">
|
||||
@ -46,7 +46,7 @@ FLUSH PRIVILEGES;
|
||||
{{ ctrans('texts.database') }}*
|
||||
</dt>
|
||||
<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>
|
||||
</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">
|
||||
|
@ -3,7 +3,7 @@
|
||||
@push('head')
|
||||
<meta name="pdf-url" content="{{ asset($entity->pdf_file_path()) }}">
|
||||
<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
|
||||
|
||||
@section('body')
|
||||
|
@ -180,6 +180,6 @@ Route::group(['middleware' => ['api_db', 'token_auth', 'locale'], 'prefix' => 'a
|
||||
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');
|
||||
|
@ -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('client/switch_company/{contact}', 'ClientPortal\SwitchCompanyController')->name('switch_company');
|
||||
|
||||
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('{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('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');
|
||||
|
@ -45,7 +45,6 @@ class DeleteInvoiceTest extends TestCase
|
||||
*/
|
||||
public function testInvoiceDeletion()
|
||||
{
|
||||
|
||||
$data = [
|
||||
'name' => 'A Nice Client',
|
||||
];
|
||||
@ -148,7 +147,6 @@ class DeleteInvoiceTest extends TestCase
|
||||
$this->assertFalse((bool)$invoice->is_deleted);
|
||||
$this->assertNull($invoice->deleted_at);
|
||||
$this->assertEquals(20, $invoice->client->fresh()->balance);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
Loading…
x
Reference in New Issue
Block a user