mirror of
https://github.com/invoiceninja/invoiceninja.git
synced 2025-05-24 02:14:21 -04:00
Merge v5
This commit is contained in:
commit
8e654c21ce
@ -1 +1 @@
|
||||
5.4.11
|
||||
5.4.12
|
@ -47,6 +47,7 @@ class CompanyFactory
|
||||
$company->enabled_modules = config('ninja.enabled_modules'); //32767;//8191; //4095
|
||||
$company->default_password_timeout = 1800000;
|
||||
$company->markdown_email_enabled = false;
|
||||
$company->markdown_enabled = false;
|
||||
|
||||
return $company;
|
||||
}
|
||||
|
@ -70,9 +70,9 @@ class InvitationController extends Controller
|
||||
|
||||
private function genericRouter(string $entity, string $invitation_key)
|
||||
{
|
||||
if (! in_array($entity, ['invoice', 'credit', 'quote', 'recurring_invoice'])) {
|
||||
|
||||
if(!in_array($entity, ['invoice', 'credit', 'quote', 'recurring_invoice']))
|
||||
return response()->json(['message' => 'Invalid resource request']);
|
||||
}
|
||||
|
||||
$is_silent = 'false';
|
||||
|
||||
@ -81,70 +81,72 @@ class InvitationController extends Controller
|
||||
$entity_obj = 'App\Models\\'.ucfirst(Str::camel($entity)).'Invitation';
|
||||
|
||||
$invitation = $entity_obj::withTrashed()
|
||||
->with($entity)
|
||||
->where('key', $invitation_key)
|
||||
->whereHas($entity, function ($query) {
|
||||
$query->where('is_deleted', 0);
|
||||
})
|
||||
// ->whereHas($entity, function ($query) {
|
||||
// $query->where('is_deleted',0);
|
||||
// })
|
||||
->with('contact.client')
|
||||
->first();
|
||||
|
||||
if (! $invitation) {
|
||||
return abort(404, 'The resource is no longer available.');
|
||||
}
|
||||
if($invitation->{$entity}->is_deleted)
|
||||
return $this->render('generic.not_available', ['account' => $invitation->company->account, 'company' => $invitation->company]);
|
||||
|
||||
/* 12/01/2022 Clean up an edge case where if the contact is trashed, restore if a invitation comes back. */
|
||||
if ($invitation->contact->trashed()) {
|
||||
if($invitation->contact->trashed())
|
||||
$invitation->contact->restore();
|
||||
}
|
||||
|
||||
/* Return early if we have the correct client_hash embedded */
|
||||
$client_contact = $invitation->contact;
|
||||
|
||||
if (empty($client_contact->email)) {
|
||||
$client_contact->email = Str::random(15).'@example.com';
|
||||
}
|
||||
$client_contact->save();
|
||||
if(empty($client_contact->email))
|
||||
$client_contact->email = Str::random(15) . "@example.com"; $client_contact->save();
|
||||
|
||||
if (request()->has('client_hash') && request()->input('client_hash') == $invitation->contact->client->client_hash) {
|
||||
request()->session()->invalidate();
|
||||
auth()->guard('contact')->loginUsingId($client_contact->id, true);
|
||||
|
||||
} elseif ((bool) $invitation->contact->client->getSetting('enable_client_portal_password') !== false) {
|
||||
|
||||
//if no contact password has been set - allow user to set password - then continue to view entity
|
||||
if (empty($invitation->contact->password)) {
|
||||
return $this->render('view_entity.set_password', [
|
||||
'root' => 'themes',
|
||||
'entity_type' => $entity,
|
||||
'invitation_key' => $invitation_key,
|
||||
]);
|
||||
if(empty($invitation->contact->password)){
|
||||
|
||||
return $this->render('view_entity.set_password', [
|
||||
'root' => 'themes',
|
||||
'entity_type' => $entity,
|
||||
'invitation_key' => $invitation_key
|
||||
]);
|
||||
}
|
||||
|
||||
$this->middleware('auth:contact');
|
||||
|
||||
return redirect()->route('client.login');
|
||||
|
||||
} else {
|
||||
nlog('else - default - login contact');
|
||||
nlog("else - default - login contact");
|
||||
request()->session()->invalidate();
|
||||
auth()->guard('contact')->loginUsingId($client_contact->id, true);
|
||||
}
|
||||
|
||||
|
||||
if (auth()->guard('contact')->user() && ! request()->has('silent') && ! $invitation->viewed_date) {
|
||||
$invitation->markViewed();
|
||||
|
||||
if (! session()->get('is_silent')) {
|
||||
if(!session()->get('is_silent'))
|
||||
event(new InvitationWasViewed($invitation->{$entity}, $invitation, $invitation->{$entity}->company, Ninja::eventVars()));
|
||||
}
|
||||
|
||||
if (! session()->get('is_silent')) {
|
||||
if(!session()->get('is_silent'))
|
||||
$this->fireEntityViewedEvent($invitation, $entity);
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else{
|
||||
$is_silent = 'true';
|
||||
|
||||
return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key}), 'silent' => $is_silent]);
|
||||
|
||||
}
|
||||
|
||||
return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key})]);
|
||||
|
||||
|
||||
}
|
||||
|
||||
private function fireEntityViewedEvent($invitation, $entity_string)
|
||||
@ -167,20 +169,20 @@ class InvitationController extends Controller
|
||||
|
||||
public function routerForDownload(string $entity, string $invitation_key)
|
||||
{
|
||||
|
||||
set_time_limit(45);
|
||||
|
||||
if (Ninja::isHosted()) {
|
||||
if(Ninja::isHosted())
|
||||
return $this->returnRawPdf($entity, $invitation_key);
|
||||
}
|
||||
|
||||
return redirect('client/'.$entity.'/'.$invitation_key.'/download_pdf');
|
||||
}
|
||||
|
||||
private function returnRawPdf(string $entity, string $invitation_key)
|
||||
{
|
||||
if (! in_array($entity, ['invoice', 'credit', 'quote', 'recurring_invoice'])) {
|
||||
|
||||
if(!in_array($entity, ['invoice', 'credit', 'quote', 'recurring_invoice']))
|
||||
return response()->json(['message' => 'Invalid resource request']);
|
||||
}
|
||||
|
||||
$key = $entity.'_id';
|
||||
|
||||
@ -191,23 +193,22 @@ class InvitationController extends Controller
|
||||
->with('contact.client')
|
||||
->firstOrFail();
|
||||
|
||||
if (! $invitation) {
|
||||
return response()->json(['message' => 'no record found'], 400);
|
||||
}
|
||||
if(!$invitation)
|
||||
return response()->json(["message" => "no record found"], 400);
|
||||
|
||||
$file_name = $invitation->{$entity}->numberFormatter().'.pdf';
|
||||
|
||||
$file = (new CreateRawPdf($invitation, $invitation->company->db))->handle();
|
||||
$file = CreateRawPdf::dispatchNow($invitation, $invitation->company->db);
|
||||
|
||||
$headers = ['Content-Type' => 'application/pdf'];
|
||||
|
||||
if (request()->input('inline') == 'true') {
|
||||
if(request()->input('inline') == 'true')
|
||||
$headers = array_merge($headers, ['Content-Disposition' => 'inline']);
|
||||
}
|
||||
|
||||
return response()->streamDownload(function () use ($file) {
|
||||
echo $file;
|
||||
}, $file_name, $headers);
|
||||
return response()->streamDownload(function () use($file) {
|
||||
echo $file;
|
||||
}, $file_name, $headers);
|
||||
|
||||
}
|
||||
|
||||
public function routerForIframe(string $entity, string $client_hash, string $invitation_key)
|
||||
@ -219,13 +220,13 @@ class InvitationController extends Controller
|
||||
$contact = ClientContact::withTrashed()->where('contact_key', $contact_key)->firstOrFail();
|
||||
$payment = Payment::find($this->decodePrimaryKey($payment_id));
|
||||
|
||||
if ($payment->client_id != $contact->client_id) {
|
||||
if($payment->client_id != $contact->client_id)
|
||||
abort(403, 'You are not authorized to view this resource');
|
||||
}
|
||||
|
||||
auth()->guard('contact')->loginUsingId($contact->id, true);
|
||||
|
||||
return redirect()->route('client.payments.show', $payment->hashed_id);
|
||||
|
||||
}
|
||||
|
||||
public function payInvoice(Request $request, string $invitation_key)
|
||||
@ -242,22 +243,23 @@ class InvitationController extends Controller
|
||||
|
||||
$invoice = $invitation->invoice;
|
||||
|
||||
if ($invoice->partial > 0) {
|
||||
$amount = round($invoice->partial, (int) $invoice->client->currency()->precision);
|
||||
} else {
|
||||
$amount = round($invoice->balance, (int) $invoice->client->currency()->precision);
|
||||
}
|
||||
if($invoice->partial > 0)
|
||||
$amount = round($invoice->partial, (int)$invoice->client->currency()->precision);
|
||||
else
|
||||
$amount = round($invoice->balance, (int)$invoice->client->currency()->precision);
|
||||
|
||||
$gateways = $invitation->contact->client->service()->getPaymentMethods($amount);
|
||||
|
||||
if (is_array($gateways) && count($gateways) >= 1) {
|
||||
if(is_array($gateways) && count($gateways) >=1)
|
||||
{
|
||||
|
||||
$data = [
|
||||
'company_gateway_id' => $gateways[0]['company_gateway_id'],
|
||||
'payment_method_id' => $gateways[0]['gateway_type_id'],
|
||||
'payable_invoices' => [
|
||||
['invoice_id' => $invitation->invoice->hashed_id, 'amount' => $amount],
|
||||
],
|
||||
'signature' => false,
|
||||
'signature' => false
|
||||
];
|
||||
|
||||
$request->replace($data);
|
||||
@ -267,37 +269,38 @@ class InvitationController extends Controller
|
||||
|
||||
$entity = 'invoice';
|
||||
|
||||
if ($invoice && is_array($gateways) && count($gateways) == 0) {
|
||||
if($invoice && is_array($gateways) && count($gateways) == 0)
|
||||
return redirect()->route('client.invoice.show', ['invoice' => $this->encodePrimaryKey($invitation->invoice_id)]);
|
||||
}
|
||||
|
||||
abort(404, 'Invoice not found');
|
||||
abort(404, "Invoice not found");
|
||||
}
|
||||
|
||||
public function unsubscribe(Request $request, string $entity, string $invitation_key)
|
||||
{
|
||||
if ($entity == 'invoice') {
|
||||
if($entity == 'invoice'){
|
||||
$invite = InvoiceInvitation::withTrashed()->where('key', $invitation_key)->first();
|
||||
$invite->contact->send_email = false;
|
||||
$invite->contact->save();
|
||||
} elseif ($entity == 'quote') {
|
||||
}elseif($entity == 'quote'){
|
||||
$invite = QuoteInvitation::withTrashed()->where('key', $invitation_key)->first();
|
||||
$invite->contact->send_email = false;
|
||||
$invite->contact->save();
|
||||
} elseif ($entity == 'credit') {
|
||||
}elseif($entity == 'credit'){
|
||||
$invite = CreditInvitation::withTrashed()->where('key', $invitation_key)->first();
|
||||
$invite->contact->send_email = false;
|
||||
$invite->contact->save();
|
||||
} elseif ($entity == 'purchase_order') {
|
||||
}elseif($entity == 'purchase_order'){
|
||||
$invite = PurchaseOrderInvitation::withTrashed()->where('key', $invitation_key)->first();
|
||||
$invite->contact->send_email = false;
|
||||
$invite->contact->save();
|
||||
} else {
|
||||
return abort(404);
|
||||
}
|
||||
else
|
||||
return abort(404);
|
||||
|
||||
$data['logo'] = $invite->company->present()->logo();
|
||||
|
||||
return $this->render('generic.unsubscribe', $data);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -67,6 +67,8 @@ class UpdateVendorRequest extends Request
|
||||
$input['assigned_user_id'] = $this->decodePrimaryKey($input['assigned_user_id']);
|
||||
}
|
||||
|
||||
$input = $this->decodePrimaryKeys($input);
|
||||
|
||||
$this->replace($input);
|
||||
}
|
||||
}
|
||||
|
@ -329,6 +329,16 @@ class NinjaMailerJob implements ShouldQueue
|
||||
if(Ninja::isHosted() && $this->company->account && $this->company->account->is_flagged)
|
||||
return true;
|
||||
|
||||
/* If the account is verified, we allow emails to flow */
|
||||
if(Ninja::isHosted() && $this->company->account && $this->company->account->is_verified_account) {
|
||||
|
||||
/* Continue to analyse verified accounts in case they later start sending poor quality emails*/
|
||||
if(class_exists(\Modules\Admin\Jobs\Account\EmailQuality::class))
|
||||
(new \Modules\Admin\Jobs\Account\EmailQuality($this->nmo, $this->company))->run();
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Ensure the user has a valid email address */
|
||||
if(!str_contains($this->nmo->to_user->email, "@"))
|
||||
return true;
|
||||
|
@ -44,9 +44,6 @@ class UploadAvatar implements ShouldQueue
|
||||
|
||||
$path = Storage::putFile($this->directory, new File(sys_get_temp_dir().'/'.$tmp_file));
|
||||
|
||||
// info($path);
|
||||
// info($tmp_file);
|
||||
|
||||
$url = Storage::url($path);
|
||||
|
||||
//return file path
|
||||
|
@ -35,7 +35,7 @@ class VersionCheck implements ShouldQueue
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$version_file = trim(file_get_contents(config('ninja.version_url')));
|
||||
$version_file = trim(@file_get_contents(config('ninja.version_url')));
|
||||
|
||||
nlog("latest version = {$version_file}");
|
||||
|
||||
|
@ -227,6 +227,9 @@ class Account extends BaseModel
|
||||
return false;
|
||||
}
|
||||
|
||||
if($this->plan_expires && Carbon::parse($this->plan_expires)->lt(now()))
|
||||
return false;
|
||||
|
||||
return $this->plan == 'pro' || $this->plan == 'enterprise';
|
||||
}
|
||||
|
||||
@ -236,7 +239,10 @@ class Account extends BaseModel
|
||||
return false;
|
||||
}
|
||||
|
||||
return $this->plan == 'free' || is_null($this->plan);
|
||||
if($this->plan_expires && Carbon::parse($this->plan_expires)->lt(now()))
|
||||
return true;
|
||||
|
||||
return $this->plan == 'free' || is_null($this->plan) || empty($this->plan);
|
||||
}
|
||||
|
||||
public function isEnterpriseClient()
|
||||
|
@ -13,6 +13,7 @@ namespace App\Models\Presenters;
|
||||
|
||||
use App\Models\Country;
|
||||
use Illuminate\Support\Str;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
/**
|
||||
* Class CompanyPresenter.
|
||||
@ -27,21 +28,41 @@ class CompanyPresenter extends EntityPresenter
|
||||
$settings = $this->entity->settings;
|
||||
|
||||
return $this->settings->name ?: ctrans('texts.untitled_account');
|
||||
|
||||
}
|
||||
|
||||
|
||||
public function logo($settings = null)
|
||||
{
|
||||
if (! $settings) {
|
||||
$settings = $this->entity->settings;
|
||||
}
|
||||
|
||||
if (strlen($settings->company_logo) >= 1 && (strpos($settings->company_logo, 'http') !== false)) {
|
||||
if(strlen($settings->company_logo) >= 1 && (strpos($settings->company_logo, 'http') !== false))
|
||||
return $settings->company_logo;
|
||||
} elseif (strlen($settings->company_logo) >= 1) {
|
||||
return url('').$settings->company_logo;
|
||||
} else {
|
||||
else if(strlen($settings->company_logo) >= 1)
|
||||
return url('') . $settings->company_logo;
|
||||
else
|
||||
return asset('images/new_logo.png');
|
||||
|
||||
}
|
||||
|
||||
public function logoDocker($settings = null)
|
||||
{
|
||||
|
||||
if (! $settings) {
|
||||
$settings = $this->entity->settings;
|
||||
}
|
||||
|
||||
$basename = basename($this->settings->company_logo);
|
||||
|
||||
$logo = Storage::get("{$this->company_key}/{$basename}");
|
||||
|
||||
if(!$logo)
|
||||
return $this->logo($settings);
|
||||
|
||||
return "data:image/png;base64, ". base64_encode($logo);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -53,24 +74,23 @@ class CompanyPresenter extends EntityPresenter
|
||||
$settings = $this->entity->settings;
|
||||
}
|
||||
|
||||
if (config('ninja.is_docker') || config('ninja.local_download')) {
|
||||
return $this->logo($settings);
|
||||
}
|
||||
if(config('ninja.is_docker') || config('ninja.local_download'))
|
||||
return $this->logoDocker($settings);
|
||||
|
||||
$context_options = [
|
||||
'ssl'=>[
|
||||
'verify_peer'=>false,
|
||||
'verify_peer_name'=>false,
|
||||
],
|
||||
];
|
||||
$context_options =array(
|
||||
"ssl"=>array(
|
||||
"verify_peer"=>false,
|
||||
"verify_peer_name"=>false,
|
||||
),
|
||||
);
|
||||
|
||||
if(strlen($settings->company_logo) >= 1 && (strpos($settings->company_logo, 'http') !== false))
|
||||
return "data:image/png;base64, ". base64_encode(@file_get_contents($settings->company_logo, false, stream_context_create($context_options)));
|
||||
else if(strlen($settings->company_logo) >= 1)
|
||||
return "data:image/png;base64, ". base64_encode(@file_get_contents(url('') . $settings->company_logo, false, stream_context_create($context_options)));
|
||||
else
|
||||
return "data:image/png;base64, ". base64_encode(@file_get_contents(asset('images/new_logo.png'), false, stream_context_create($context_options)));
|
||||
|
||||
if (strlen($settings->company_logo) >= 1 && (strpos($settings->company_logo, 'http') !== false)) {
|
||||
return 'data:image/png;base64, '.base64_encode(@file_get_contents($settings->company_logo, false, stream_context_create($context_options)));
|
||||
} elseif (strlen($settings->company_logo) >= 1) {
|
||||
return 'data:image/png;base64, '.base64_encode(@file_get_contents(url('').$settings->company_logo, false, stream_context_create($context_options)));
|
||||
} else {
|
||||
return 'data:image/png;base64, '.base64_encode(@file_get_contents(asset('images/new_logo.png'), false, stream_context_create($context_options)));
|
||||
}
|
||||
}
|
||||
|
||||
public function address($settings = null)
|
||||
@ -161,13 +181,13 @@ class CompanyPresenter extends EntityPresenter
|
||||
|
||||
/**
|
||||
* Return company website URL.
|
||||
*
|
||||
* @return string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function website(): string
|
||||
{
|
||||
$website = $this->entity->getSetting('website');
|
||||
|
||||
|
||||
if (empty($website)) {
|
||||
return $website;
|
||||
}
|
||||
|
@ -148,6 +148,17 @@ class PaymentIntentWebhook implements ShouldQueue
|
||||
|
||||
}
|
||||
|
||||
|
||||
SystemLogger::dispatch(
|
||||
['response' => $this->stripe_request, 'data' => []],
|
||||
SystemLog::CATEGORY_GATEWAY_RESPONSE,
|
||||
SystemLog::EVENT_GATEWAY_SUCCESS,
|
||||
SystemLog::TYPE_STRIPE,
|
||||
null,
|
||||
$company,
|
||||
);
|
||||
|
||||
|
||||
}
|
||||
|
||||
private function updateCreditCardPayment($payment_hash, $client)
|
||||
|
@ -32,7 +32,7 @@ class VendorContactRepository extends BaseRepository
|
||||
}
|
||||
|
||||
/* Get array of IDs which have been removed from the contacts array and soft delete each contact */
|
||||
$vendor->contacts->pluck('hashed_id')->diff($contacts->pluck('id'))->each(function ($contact) {
|
||||
$vendor->contacts->pluck('id')->diff($contacts->pluck('id'))->each(function ($contact) {
|
||||
VendorContact::destroy($contact);
|
||||
});
|
||||
|
||||
@ -50,7 +50,7 @@ class VendorContactRepository extends BaseRepository
|
||||
$update_contact = null;
|
||||
|
||||
if (isset($contact['id'])) {
|
||||
$update_contact = VendorContact::find($this->decodePrimaryKey($contact['id']));
|
||||
$update_contact = VendorContact::find($contact['id']);
|
||||
}
|
||||
|
||||
if (! $update_contact) {
|
||||
|
@ -13,8 +13,10 @@ namespace App\Transformers;
|
||||
|
||||
use App\Models\Document;
|
||||
use App\Models\Expense;
|
||||
use App\Models\Vendor;
|
||||
use App\Utils\Traits\MakesHash;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use League\Fractal\Resource\Item;
|
||||
|
||||
/**
|
||||
* class ExpenseTransformer.
|
||||
@ -31,7 +33,10 @@ class ExpenseTransformer extends EntityTransformer
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $availableIncludes = [];
|
||||
protected $availableIncludes = [
|
||||
'client',
|
||||
'vendor',
|
||||
];
|
||||
|
||||
public function includeDocuments(Expense $expense)
|
||||
{
|
||||
@ -40,6 +45,28 @@ class ExpenseTransformer extends EntityTransformer
|
||||
return $this->includeCollection($expense->documents, $transformer, Document::class);
|
||||
}
|
||||
|
||||
public function includeClient(Expense $expense): ?Item
|
||||
{
|
||||
$transformer = new ClientTransformer($this->serializer);
|
||||
|
||||
if (!$expense->client) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $this->includeItem($expense->client, $transformer, Client::class);
|
||||
}
|
||||
|
||||
public function includeVendor(Expense $expense): ?Item
|
||||
{
|
||||
$transformer = new VendorTransformer($this->serializer);
|
||||
|
||||
if (!$expense->vendor) {
|
||||
return null;
|
||||
}
|
||||
|
||||
return $this->includeItem($expense->vendor, $transformer, Vendor::class);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Expense $expense
|
||||
*
|
||||
|
@ -540,8 +540,8 @@ class HtmlEngine
|
||||
/*Payment Aliases*/
|
||||
$data['$paymentLink'] = &$data['$payment_link'];
|
||||
$data['$payment_url'] = &$data['$payment_link'];
|
||||
$data['$portalButton'] = &$data['$paymentLink'];
|
||||
|
||||
$data['$portalButton'] = &$data['$portal_button'];
|
||||
|
||||
$data['$dir'] = ['value' => in_array(optional($this->client->language())->locale, ['ar', 'he']) ? 'rtl' : 'ltr', 'label' => ''];
|
||||
$data['$dir_text_align'] = ['value' => in_array(optional($this->client->language())->locale, ['ar', 'he']) ? 'right' : 'left', 'label' => ''];
|
||||
|
||||
|
@ -14,8 +14,8 @@ return [
|
||||
'require_https' => env('REQUIRE_HTTPS', true),
|
||||
'app_url' => rtrim(env('APP_URL', ''), '/'),
|
||||
'app_domain' => env('APP_DOMAIN', 'invoicing.co'),
|
||||
'app_version' => '5.4.11',
|
||||
'app_tag' => '5.4.11',
|
||||
'app_version' => '5.4.12',
|
||||
'app_tag' => '5.4.12',
|
||||
'minimum_client_version' => '5.0.16',
|
||||
'terms_version' => '1.0.1',
|
||||
'api_secret' => env('API_SECRET', ''),
|
||||
|
@ -4717,7 +4717,19 @@ $LANG = array(
|
||||
'delete_task_status' => 'Delete Task Status',
|
||||
'restore_task_status' => 'Restore Task Status',
|
||||
'lang_Hebrew' => 'Hebrew',
|
||||
|
||||
'price_change_accepted' => 'Price change accepted',
|
||||
'price_change_failed' => 'Price change failed with code',
|
||||
'restore_purchases' => 'Restore Purchases',
|
||||
'activate' => 'Activate',
|
||||
'connect_apple' => 'Connect Apple',
|
||||
'disconnect_apple' => 'Disconnect Apple',
|
||||
'disconnected_apple' => 'Successfully disconnected Apple',
|
||||
'send_now' => 'Send Now',
|
||||
'received' => 'Received',
|
||||
'converted_to_expense' => 'Successfully converted to expense',
|
||||
'converted_to_expenses' => 'Successfully converted to expenses',
|
||||
'entity_removed' => 'This document has been removed, please contact the vendor for further information',
|
||||
'entity_removed_title' => 'Document no longer available',
|
||||
);
|
||||
|
||||
return $LANG;
|
||||
|
64
public/flutter_service_worker.js
vendored
64
public/flutter_service_worker.js
vendored
@ -3,43 +3,43 @@ const MANIFEST = 'flutter-app-manifest';
|
||||
const TEMP = 'flutter-temp-cache';
|
||||
const CACHE_NAME = 'flutter-app-cache';
|
||||
const RESOURCES = {
|
||||
"favicon.ico": "51636d3a390451561744c42188ccd628",
|
||||
"canvaskit/profiling/canvaskit.js": "ae2949af4efc61d28a4a80fffa1db900",
|
||||
"canvaskit/profiling/canvaskit.wasm": "95e736ab31147d1b2c7b25f11d4c32cd",
|
||||
"canvaskit/canvaskit.js": "c2b4e5f3d7a3d82aed024e7249a78487",
|
||||
"canvaskit/canvaskit.wasm": "4b83d89d9fecbea8ca46f2f760c5a9ba",
|
||||
"/": "65c331698e2385058f39e15f03b9bcbe",
|
||||
"favicon.png": "dca91c54388f52eded692718d5a98b8b",
|
||||
"main.dart.js": "27ecc9b834fa80934aee1b265c46db02",
|
||||
"manifest.json": "ef43d90e57aa7682d7e2cfba2f484a40",
|
||||
"assets/assets/images/logo_light.png": "e5f46d5a78e226e7a9553d4ca6f69219",
|
||||
"assets/assets/images/payment_types/paypal.png": "8e06c094c1871376dfea1da8088c29d1",
|
||||
"assets/assets/images/payment_types/visa.png": "3ddc4a4d25c946e8ad7e6998f30fd4e3",
|
||||
"assets/assets/images/payment_types/solo.png": "2030c3ccaccf5d5e87916a62f5b084d6",
|
||||
"assets/assets/images/payment_types/mastercard.png": "6f6cdc29ee2e22e06b1ac029cb52ef71",
|
||||
"assets/assets/images/payment_types/discover.png": "6c0a386a00307f87db7bea366cca35f5",
|
||||
"assets/assets/images/payment_types/maestro.png": "e533b92bfb50339fdbfa79e3dfe81f08",
|
||||
"assets/assets/images/payment_types/carteblanche.png": "d936e11fa3884b8c9f1bd5c914be8629",
|
||||
"assets/assets/images/payment_types/dinerscard.png": "06d85186ba858c18ab7c9caa42c92024",
|
||||
"assets/assets/images/payment_types/amex.png": "c49a4247984b3732a4af50a3390aa978",
|
||||
"assets/assets/images/payment_types/unionpay.png": "7002f52004e0ab8cc0b7450b0208ccb2",
|
||||
"assets/assets/images/payment_types/jcb.png": "07e0942d16c5592118b72e74f2f7198c",
|
||||
"assets/assets/images/payment_types/other.png": "d936e11fa3884b8c9f1bd5c914be8629",
|
||||
"assets/assets/images/payment_types/switch.png": "4fa11c45327f5fdc20205821b2cfd9cc",
|
||||
"assets/assets/images/payment_types/ach.png": "7433f0aff779dc98a649b7a2daf777cf",
|
||||
"assets/assets/images/payment_types/laser.png": "b4e6e93dd35517ac429301119ff05868",
|
||||
"assets/assets/images/google_logo.png": "0f118259ce403274f407f5e982e681c3",
|
||||
"assets/assets/images/logo_dark.png": "a233ed1d4d0f7414bf97a9a10f11fb0a",
|
||||
"assets/assets/images/icon.png": "090f69e23311a4b6d851b3880ae52541",
|
||||
"assets/packages/material_design_icons_flutter/lib/fonts/materialdesignicons-webfont.ttf": "b62641afc9ab487008e996a5c5865e56",
|
||||
"assets/NOTICES": "c6e3ca05e75eaf4b48a1de0f34708ab4",
|
||||
"assets/AssetManifest.json": "38d9aea341601f3a5c6fa7b5a1216ea5",
|
||||
"assets/FontManifest.json": "cf3c681641169319e61b61bd0277378f",
|
||||
"assets/fonts/MaterialIcons-Regular.otf": "95db9098c58fd6db106f1116bae85a0b",
|
||||
"version.json": "4dfad0f7098e523184a2f58aff0e3940",
|
||||
"flutter.js": "eb2682e33f25cd8f1fc59011497c35f8",
|
||||
"icons/Icon-512.png": "0f9aff01367f0a0c69773d25ca16ef35",
|
||||
"icons/Icon-192.png": "bb1cf5f6982006952211c7c8404ffbed",
|
||||
"canvaskit/canvaskit.wasm": "4b83d89d9fecbea8ca46f2f760c5a9ba",
|
||||
"canvaskit/canvaskit.js": "c2b4e5f3d7a3d82aed024e7249a78487",
|
||||
"canvaskit/profiling/canvaskit.wasm": "95e736ab31147d1b2c7b25f11d4c32cd",
|
||||
"canvaskit/profiling/canvaskit.js": "ae2949af4efc61d28a4a80fffa1db900",
|
||||
"/": "f0472d186e41814a028b5ca7814378c4",
|
||||
"favicon.png": "dca91c54388f52eded692718d5a98b8b",
|
||||
"main.dart.js": "fe987ef50f1a627038a89c1f4f1dabb0"
|
||||
"favicon.ico": "51636d3a390451561744c42188ccd628",
|
||||
"assets/FontManifest.json": "cf3c681641169319e61b61bd0277378f",
|
||||
"assets/NOTICES": "c6e3ca05e75eaf4b48a1de0f34708ab4",
|
||||
"assets/fonts/MaterialIcons-Regular.otf": "95db9098c58fd6db106f1116bae85a0b",
|
||||
"assets/assets/images/icon.png": "090f69e23311a4b6d851b3880ae52541",
|
||||
"assets/assets/images/payment_types/mastercard.png": "6f6cdc29ee2e22e06b1ac029cb52ef71",
|
||||
"assets/assets/images/payment_types/other.png": "d936e11fa3884b8c9f1bd5c914be8629",
|
||||
"assets/assets/images/payment_types/ach.png": "7433f0aff779dc98a649b7a2daf777cf",
|
||||
"assets/assets/images/payment_types/carteblanche.png": "d936e11fa3884b8c9f1bd5c914be8629",
|
||||
"assets/assets/images/payment_types/solo.png": "2030c3ccaccf5d5e87916a62f5b084d6",
|
||||
"assets/assets/images/payment_types/amex.png": "c49a4247984b3732a4af50a3390aa978",
|
||||
"assets/assets/images/payment_types/switch.png": "4fa11c45327f5fdc20205821b2cfd9cc",
|
||||
"assets/assets/images/payment_types/unionpay.png": "7002f52004e0ab8cc0b7450b0208ccb2",
|
||||
"assets/assets/images/payment_types/dinerscard.png": "06d85186ba858c18ab7c9caa42c92024",
|
||||
"assets/assets/images/payment_types/discover.png": "6c0a386a00307f87db7bea366cca35f5",
|
||||
"assets/assets/images/payment_types/laser.png": "b4e6e93dd35517ac429301119ff05868",
|
||||
"assets/assets/images/payment_types/visa.png": "3ddc4a4d25c946e8ad7e6998f30fd4e3",
|
||||
"assets/assets/images/payment_types/paypal.png": "8e06c094c1871376dfea1da8088c29d1",
|
||||
"assets/assets/images/payment_types/jcb.png": "07e0942d16c5592118b72e74f2f7198c",
|
||||
"assets/assets/images/payment_types/maestro.png": "e533b92bfb50339fdbfa79e3dfe81f08",
|
||||
"assets/assets/images/logo_light.png": "e5f46d5a78e226e7a9553d4ca6f69219",
|
||||
"assets/assets/images/logo_dark.png": "a233ed1d4d0f7414bf97a9a10f11fb0a",
|
||||
"assets/assets/images/google_logo.png": "0f118259ce403274f407f5e982e681c3",
|
||||
"assets/packages/material_design_icons_flutter/lib/fonts/materialdesignicons-webfont.ttf": "b62641afc9ab487008e996a5c5865e56",
|
||||
"assets/AssetManifest.json": "38d9aea341601f3a5c6fa7b5a1216ea5"
|
||||
};
|
||||
|
||||
// The application shell files that are downloaded before a service worker can
|
||||
|
275599
public/main.dart.js
vendored
275599
public/main.dart.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
225856
public/main.foss.dart.js
vendored
225856
public/main.foss.dart.js
vendored
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
6677
public/main.profile.dart.js
vendored
6677
public/main.profile.dart.js
vendored
File diff suppressed because one or more lines are too long
@ -0,0 +1,31 @@
|
||||
@extends('portal.ninja2020.layout.clean')
|
||||
@section('meta_title', ctrans('texts.error'))
|
||||
|
||||
@section('body')
|
||||
|
||||
<div class="flex h-screen">
|
||||
<div class="m-auto md:w-1/2 lg:w-1/2">
|
||||
<div class="flex flex-col items-center">
|
||||
|
||||
@if($account && !$account->isPaid())
|
||||
<div>
|
||||
<img src="{{ asset('images/invoiceninja-black-logo-2.png') }}"
|
||||
class="border-b border-gray-100 h-18 pb-4" alt="Invoice Ninja logo">
|
||||
</div>
|
||||
@elseif(isset($company) && !is_null($company))
|
||||
<div>
|
||||
<img src="{{ $company->present()->logo() }}"
|
||||
class="mx-auto border-b border-gray-100 h-18 pb-4" alt="{{ $company->present()->name() }} logo">
|
||||
</div>
|
||||
@endif
|
||||
<h1 class="text-center text-3xl mt-10">{{ ctrans("texts.entity_removed_title") }}</h1>
|
||||
<p class="text-center opacity-75 mt-10">{{ ctrans('texts.entity_removed') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@stop
|
||||
|
||||
@push('footer')
|
||||
|
||||
@endpush
|
Loading…
x
Reference in New Issue
Block a user