This commit is contained in:
David Bomba 2022-07-25 15:28:06 +10:00
commit 8e654c21ce
22 changed files with 255110 additions and 253420 deletions

View File

@ -1 +1 @@
5.4.11
5.4.12

View File

@ -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;
}

View File

@ -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);
}
}

View File

@ -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);
}
}

View File

@ -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;

View File

@ -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

View File

@ -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}");

View 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()

View File

@ -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;
}

View File

@ -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)

View File

@ -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) {

View File

@ -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
*

View File

@ -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' => ''];

View File

@ -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', ''),

View File

@ -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;

View File

@ -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

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

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -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