diff --git a/.env.ci b/.env.ci index 486d20cfd0f1..1fde559c0b81 100644 --- a/.env.ci +++ b/.env.ci @@ -19,4 +19,5 @@ DB_HOST=127.0.0.1 NINJA_ENVIRONMENT=hosted COMPOSER_AUTH='{"github-oauth": {"github.com": "${{ secrets.GITHUB_TOKEN }}"}}' TRAVIS=true -API_SECRET=superdoopersecrethere \ No newline at end of file +API_SECRET=superdoopersecrethere +PHANTOMJS_PDF_GENERATION=false diff --git a/CHANGELOG.md b/CHANGELOG.md index 07c686d2a0be..84e6958f773c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ ### Fixed: - Fixes for counters where patterns without {$counter} could causes endless recursion. - Fixes for surcharge tax displayed amount on PDF. +- Fixes for custom designs not rendering the custom template +- Fixes for missing bulk actions on Subscriptions - Fixes CSS padding on the show page for recurring invoices (#5412) - Fixes for rendering invalid HTML & parsing invalid XML (#5395) diff --git a/app/Console/Commands/CreateSingleAccount.php b/app/Console/Commands/CreateSingleAccount.php index 8ec26e7238ef..080a95b2ceaa 100644 --- a/app/Console/Commands/CreateSingleAccount.php +++ b/app/Console/Commands/CreateSingleAccount.php @@ -236,6 +236,7 @@ class CreateSingleAccount extends Command $webhook_config = [ 'post_purchase_url' => 'http://ninja.test:8000/api/admin/plan', 'post_purchase_rest_method' => 'POST', + 'post_purchase_headers' => [], ]; $sub = SubscriptionFactory::create($company->id, $user->id); @@ -243,6 +244,7 @@ class CreateSingleAccount extends Command $sub->group_id = $gs->id; $sub->recurring_product_ids = "{$p1->hashed_id}"; $sub->webhook_configuration = $webhook_config; + $sub->allow_plan_changes = true; $sub->save(); $sub = SubscriptionFactory::create($company->id, $user->id); @@ -250,6 +252,7 @@ class CreateSingleAccount extends Command $sub->group_id = $gs->id; $sub->recurring_product_ids = "{$p2->hashed_id}"; $sub->webhook_configuration = $webhook_config; + $sub->allow_plan_changes = true; $sub->save(); } diff --git a/app/Events/Subscription/SubscriptionWasArchived.php b/app/Events/Subscription/SubscriptionWasArchived.php new file mode 100644 index 000000000000..1ac9cfd387dc --- /dev/null +++ b/app/Events/Subscription/SubscriptionWasArchived.php @@ -0,0 +1,47 @@ +subscription = $subscription; + $this->company = $company; + $this->event_vars = $event_vars; + } +} diff --git a/app/Events/Subscription/SubscriptionWasDeleted.php b/app/Events/Subscription/SubscriptionWasDeleted.php new file mode 100644 index 000000000000..8a07faca3e11 --- /dev/null +++ b/app/Events/Subscription/SubscriptionWasDeleted.php @@ -0,0 +1,47 @@ +subscription = $subscription; + $this->company = $company; + $this->event_vars = $event_vars; + } +} diff --git a/app/Events/Subscription/SubscriptionWasRestored.php b/app/Events/Subscription/SubscriptionWasRestored.php new file mode 100644 index 000000000000..a4af59333153 --- /dev/null +++ b/app/Events/Subscription/SubscriptionWasRestored.php @@ -0,0 +1,49 @@ +subscription = $subscription; + $this->fromDeleted = $fromDeleted; + $this->company = $company; + $this->event_vars = $event_vars; + } +} diff --git a/app/Events/Subscription/SubscriptionWasUpdated.php b/app/Events/Subscription/SubscriptionWasUpdated.php new file mode 100644 index 000000000000..b271458c0b99 --- /dev/null +++ b/app/Events/Subscription/SubscriptionWasUpdated.php @@ -0,0 +1,47 @@ +subscription = $subscription; + $this->company = $company; + $this->event_vars = $event_vars; + } +} diff --git a/app/Exceptions/FilePermissionsFailure.php b/app/Exceptions/FilePermissionsFailure.php new file mode 100644 index 000000000000..760a3b2d7500 --- /dev/null +++ b/app/Exceptions/FilePermissionsFailure.php @@ -0,0 +1,10 @@ +expectsJson()) { return response()->json(['message'=>$exception->getMessage()], 400); + }elseif($exception instanceof InternalPDFFailure && $request->expectsJson()){ + return response()->json(['message' => $exception->getMessage()], 500); + }elseif($exception instanceof PhantomPDFFailure && $request->expectsJson()){ + return response()->json(['message' => $exception->getMessage()], 500); + }elseif($exception instanceof FilePermissionsFailure) { + return response()->json(['message' => $exception->getMessage()], 500); } elseif ($exception instanceof ThrottleRequestsException && $request->expectsJson()) { return response()->json(['message'=>'Too many requests'], 429); } elseif ($exception instanceof FatalThrowableError && $request->expectsJson()) { @@ -152,8 +161,7 @@ class Handler extends ExceptionHandler } elseif ($exception instanceof MethodNotAllowedHttpException && $request->expectsJson()) { return response()->json(['message'=>'Method not support for this route'], 404); } elseif ($exception instanceof ValidationException && $request->expectsJson()) { - info(print_r($exception->validator->getMessageBag(), 1)); - + nlog($exception->validator->getMessageBag()); return response()->json(['message' => 'The given data was invalid.', 'errors' => $exception->validator->getMessageBag()], 422); } elseif ($exception instanceof RelationNotFoundException && $request->expectsJson()) { return response()->json(['message' => $exception->getMessage()], 400); @@ -161,9 +169,7 @@ class Handler extends ExceptionHandler return response()->json(['message' => $exception->getMessage()], 400); } elseif ($exception instanceof GenericPaymentDriverFailure) { $data['message'] = $exception->getMessage(); - //dd($data); - // return view('errors.layout', $data); - } + } return parent::render($request, $exception); } diff --git a/app/Exceptions/InternalPDFFailure.php b/app/Exceptions/InternalPDFFailure.php new file mode 100644 index 000000000000..ce85ad3c7ebb --- /dev/null +++ b/app/Exceptions/InternalPDFFailure.php @@ -0,0 +1,10 @@ +uploadLogo($request->file('company_logo'), $client->company, $client); - event(new ClientWasUpdated($client, $client->company, Ninja::eventVars())); + event(new ClientWasUpdated($client, $client->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($client->fresh()); } @@ -380,7 +380,7 @@ class ClientController extends BaseController $this->uploadLogo($request->file('company_logo'), $client->company, $client); - event(new ClientWasCreated($client, $client->company, Ninja::eventVars())); + event(new ClientWasCreated($client, $client->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($client); } diff --git a/app/Http/Controllers/ClientPortal/PaymentMethodController.php b/app/Http/Controllers/ClientPortal/PaymentMethodController.php index 53fde312a8e1..12a60bbd50a8 100644 --- a/app/Http/Controllers/ClientPortal/PaymentMethodController.php +++ b/app/Http/Controllers/ClientPortal/PaymentMethodController.php @@ -125,7 +125,7 @@ class PaymentMethodController extends Controller ->detach($payment_method); try { - event(new MethodDeleted($payment_method, auth('contact')->user()->company, Ninja::eventVars())); + event(new MethodDeleted($payment_method, auth('contact')->user()->company, Ninja::eventVars(auth('contact')->user()->id))); $payment_method->delete(); } catch (Exception $e) { diff --git a/app/Http/Controllers/ClientPortal/SubscriptionPlanSwitchController.php b/app/Http/Controllers/ClientPortal/SubscriptionPlanSwitchController.php index 2a185cf82fad..d745f61630b3 100644 --- a/app/Http/Controllers/ClientPortal/SubscriptionPlanSwitchController.php +++ b/app/Http/Controllers/ClientPortal/SubscriptionPlanSwitchController.php @@ -30,12 +30,24 @@ class SubscriptionPlanSwitchController extends Controller */ public function index(ShowPlanSwitchRequest $request, RecurringInvoice $recurring_invoice, Subscription $target) { - //calculate whether a payment is required or whether we pass through a credit for this. - $amount = $recurring_invoice->subscription->service()->calculateUpgradePrice($recurring_invoice, $target); + $amount = $recurring_invoice->subscription + ->service() + ->calculateUpgradePrice($recurring_invoice, $target); + + /** + * + * Null value here is a proxy for + * denying the user a change plan option + * + */ + if(is_null($amount)) + render('subscriptions.denied'); + return render('subscriptions.switch', [ - 'subscription' => $subscription, + 'subscription' => $recurring_invoice->subscription, + 'recurring_invoice' => $recurring_invoice, 'target' => $target, 'amount' => $amount, ]); diff --git a/app/Http/Controllers/ClientSubscriptionController.php b/app/Http/Controllers/ClientSubscriptionController.php index bf0a9b39b167..5052231b3771 100644 --- a/app/Http/Controllers/ClientSubscriptionController.php +++ b/app/Http/Controllers/ClientSubscriptionController.php @@ -173,7 +173,7 @@ class ClientSubscriptionController extends BaseController { $client_subscription = $this->client_subscription_repo->save($request->all(), ClientSubscriptionFactory::create(auth()->user()->company()->id, auth()->user()->id)); - event(new ClientsubscriptionWasCreated($client_subscription, $client_subscription->company, Ninja::eventVars())); + event(new ClientsubscriptionWasCreated($client_subscription, $client_subscription->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($client_subscription); } diff --git a/app/Http/Controllers/CreditController.php b/app/Http/Controllers/CreditController.php index 7a7dcc6cb104..0c48504bf405 100644 --- a/app/Http/Controllers/CreditController.php +++ b/app/Http/Controllers/CreditController.php @@ -201,7 +201,7 @@ class CreditController extends BaseController ->fillDefaults() ->save(); - event(new CreditWasCreated($credit, $credit->company, Ninja::eventVars())); + event(new CreditWasCreated($credit, $credit->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($credit); } @@ -378,7 +378,7 @@ class CreditController extends BaseController $credit->service()->deletePdf(); - event(new CreditWasUpdated($credit, $credit->company, Ninja::eventVars())); + event(new CreditWasUpdated($credit, $credit->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($credit); } diff --git a/app/Http/Controllers/EmailController.php b/app/Http/Controllers/EmailController.php index cdd13ea89094..0d10c051306a 100644 --- a/app/Http/Controllers/EmailController.php +++ b/app/Http/Controllers/EmailController.php @@ -157,7 +157,7 @@ class EmailController extends BaseController $this->entity_transformer = QuoteTransformer::class; if ($entity_obj->invitations->count() >= 1) - event(new QuoteWasEmailed($entity_obj->invitations->first(), $entity_obj->company, Ninja::eventVars(), 'quote')); + event(new QuoteWasEmailed($entity_obj->invitations->first(), $entity_obj->company, Ninja::eventVars(auth()->user()->id), 'quote')); } @@ -166,7 +166,7 @@ class EmailController extends BaseController $this->entity_transformer = CreditTransformer::class; if ($entity_obj->invitations->count() >= 1) - event(new CreditWasEmailed($entity_obj->invitations->first(), $entity_obj->company, Ninja::eventVars(), 'credit')); + event(new CreditWasEmailed($entity_obj->invitations->first(), $entity_obj->company, Ninja::eventVars(auth()->user()->id), 'credit')); } diff --git a/app/Http/Controllers/ExpenseController.php b/app/Http/Controllers/ExpenseController.php index b1b5e9db9c35..35984b3d5282 100644 --- a/app/Http/Controllers/ExpenseController.php +++ b/app/Http/Controllers/ExpenseController.php @@ -279,7 +279,7 @@ class ExpenseController extends BaseController $this->uploadLogo($request->file('company_logo'), $expense->company, $expense); - event(new ExpenseWasUpdated($expense, $expense->company, Ninja::eventVars())); + event(new ExpenseWasUpdated($expense, $expense->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($expense->fresh()); } @@ -373,7 +373,7 @@ class ExpenseController extends BaseController { $expense = $this->expense_repo->save($request->all(), ExpenseFactory::create(auth()->user()->company()->id, auth()->user()->id)); - event(new ExpenseWasCreated($expense, $expense->company, Ninja::eventVars())); + event(new ExpenseWasCreated($expense, $expense->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($expense); } diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index 3379ecf4a763..306f7745fb4d 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -218,7 +218,7 @@ class InvoiceController extends BaseController ->triggeredActions($request) ->save(); - event(new InvoiceWasCreated($invoice, $invoice->company, Ninja::eventVars())); + event(new InvoiceWasCreated($invoice, $invoice->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($invoice); } @@ -399,7 +399,7 @@ class InvoiceController extends BaseController $invoice->service()->deletePdf(); - event(new InvoiceWasUpdated($invoice, $invoice->company, Ninja::eventVars())); + event(new InvoiceWasUpdated($invoice, $invoice->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($invoice); } diff --git a/app/Http/Controllers/PaymentController.php b/app/Http/Controllers/PaymentController.php index a4265f800f9b..480a0816ee43 100644 --- a/app/Http/Controllers/PaymentController.php +++ b/app/Http/Controllers/PaymentController.php @@ -382,7 +382,7 @@ class PaymentController extends BaseController $payment = $this->payment_repo->save($request->all(), $payment); - event(new PaymentWasUpdated($payment, $payment->company, Ninja::eventVars())); + event(new PaymentWasUpdated($payment, $payment->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($payment); } diff --git a/app/Http/Controllers/QuoteController.php b/app/Http/Controllers/QuoteController.php index f4a0c7e675ab..b570c8ede058 100644 --- a/app/Http/Controllers/QuoteController.php +++ b/app/Http/Controllers/QuoteController.php @@ -211,7 +211,7 @@ class QuoteController extends BaseController $quote = $quote->service()->fillDefaults()->save(); - event(new QuoteWasCreated($quote, $quote->company, Ninja::eventVars())); + event(new QuoteWasCreated($quote, $quote->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($quote); } @@ -389,7 +389,7 @@ class QuoteController extends BaseController $quote->service()->deletePdf(); - event(new QuoteWasUpdated($quote, $quote->company, Ninja::eventVars())); + event(new QuoteWasUpdated($quote, $quote->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($quote); } diff --git a/app/Http/Controllers/SelfUpdateController.php b/app/Http/Controllers/SelfUpdateController.php index 7c666fad7d54..bbe4926ca739 100644 --- a/app/Http/Controllers/SelfUpdateController.php +++ b/app/Http/Controllers/SelfUpdateController.php @@ -11,6 +11,7 @@ namespace App\Http\Controllers; +use App\Exceptions\FilePermissionsFailure; use App\Utils\Ninja; use Illuminate\Foundation\Bus\DispatchesJobs; use Illuminate\Support\Facades\Artisan; @@ -61,6 +62,9 @@ class SelfUpdateController extends BaseController return response()->json(['message' => ctrans('texts.self_update_not_available')], 403); } + if(!$this->testWritable()) + throw new FilePermissionsFailure('Cannot update system because files are not writable!'); + // Check if new version is available if($updater->source()->isNewVersionAvailable()) { @@ -90,6 +94,19 @@ class SelfUpdateController extends BaseController } + private function testWritable() + { + $directoryIterator = new \RecursiveDirectoryIterator(base_path()); + + foreach (new \RecursiveIteratorIterator($directoryIterator) as $file) { + if ($file->isFile() && ! $file->isWritable()) { + return false; + } + } + + return true; + } + public function checkVersion() { return trim(file_get_contents(config('ninja.version_url'))); diff --git a/app/Http/Controllers/Shop/ClientController.php b/app/Http/Controllers/Shop/ClientController.php index 3bc3e8b72dd7..a6db57a47dd4 100644 --- a/app/Http/Controllers/Shop/ClientController.php +++ b/app/Http/Controllers/Shop/ClientController.php @@ -85,7 +85,7 @@ class ClientController extends BaseController $this->uploadLogo($request->file('company_logo'), $company, $client); - event(new ClientWasCreated($client, $company, Ninja::eventVars())); + event(new ClientWasCreated($client, $company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); return $this->itemResponse($client); } diff --git a/app/Http/Controllers/Shop/InvoiceController.php b/app/Http/Controllers/Shop/InvoiceController.php index e8c58b92273e..4d7219392dd8 100644 --- a/app/Http/Controllers/Shop/InvoiceController.php +++ b/app/Http/Controllers/Shop/InvoiceController.php @@ -85,7 +85,7 @@ class InvoiceController extends BaseController $invoice = $invoice->service()->triggeredActions($request)->save(); - event(new InvoiceWasCreated($invoice, $company, Ninja::eventVars())); + event(new InvoiceWasCreated($invoice, $company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); return $this->itemResponse($invoice); } diff --git a/app/Http/Controllers/SubscriptionController.php b/app/Http/Controllers/SubscriptionController.php index a3a82c09fdc9..f7662aad50ff 100644 --- a/app/Http/Controllers/SubscriptionController.php +++ b/app/Http/Controllers/SubscriptionController.php @@ -13,6 +13,7 @@ namespace App\Http\Controllers; use App\Events\Subscription\SubscriptionWasCreated; +use App\Events\Subscription\SubscriptionWasUpdated; use App\Factory\SubscriptionFactory; use App\Http\Requests\Subscription\CreateSubscriptionRequest; use App\Http\Requests\Subscription\DestroySubscriptionRequest; @@ -176,7 +177,7 @@ class SubscriptionController extends BaseController { $subscription = $this->subscription_repo->save($request->all(), SubscriptionFactory::create(auth()->user()->company()->id, auth()->user()->id)); - event(new SubscriptionWasCreated($subscription, $subscription->company, Ninja::eventVars())); + event(new SubscriptionWasCreated($subscription, $subscription->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($subscription); } @@ -351,6 +352,8 @@ class SubscriptionController extends BaseController $subscription = $this->subscription_repo->save($request->all(), $subscription); + event(new SubscriptionWasUpdated($subscription, $subscription->company, Ninja::eventVars(auth()->user()->id))); + return $this->itemResponse($subscription); } diff --git a/app/Http/Controllers/TaskController.php b/app/Http/Controllers/TaskController.php index 247c20e444ed..28efb452caf1 100644 --- a/app/Http/Controllers/TaskController.php +++ b/app/Http/Controllers/TaskController.php @@ -282,7 +282,7 @@ class TaskController extends BaseController if($task->status_order != $old_task->status_order) $this->task_repo->sortStatuses($old_task, $task); - event(new TaskWasUpdated($task, $task->company, Ninja::eventVars())); + event(new TaskWasUpdated($task, $task->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($task->fresh()); } @@ -376,7 +376,7 @@ class TaskController extends BaseController { $task = $this->task_repo->save($request->all(), TaskFactory::create(auth()->user()->company()->id, auth()->user()->id)); - event(new TaskWasCreated($task, $task->company, Ninja::eventVars())); + event(new TaskWasCreated($task, $task->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($task); } diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index 3b91f594de4c..6f9fa7a56a82 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -211,7 +211,7 @@ class UserController extends BaseController nlog("in the store method of the usercontroller class"); - event(new UserWasCreated($user, auth()->user(), $company, Ninja::eventVars())); + event(new UserWasCreated($user, auth()->user(), $company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($user->fresh()); } @@ -401,7 +401,7 @@ class UserController extends BaseController $user->company_user()->update(["permissions_updated_at" => now()]); } - event(new UserWasUpdated($user, auth()->user(), auth()->user()->company, Ninja::eventVars())); + event(new UserWasUpdated($user, auth()->user(), auth()->user()->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($user); } @@ -474,7 +474,7 @@ class UserController extends BaseController /* If the user passes the company user we archive the company user */ $user = $this->user_repo->delete($request->all(), $user); - event(new UserWasDeleted($user, auth()->user(), auth()->user()->company, Ninja::eventVars())); + event(new UserWasDeleted($user, auth()->user(), auth()->user()->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($user->fresh()); } diff --git a/app/Http/Controllers/VendorController.php b/app/Http/Controllers/VendorController.php index 375f82eb6bfc..01ddf93bd4e6 100644 --- a/app/Http/Controllers/VendorController.php +++ b/app/Http/Controllers/VendorController.php @@ -278,7 +278,7 @@ class VendorController extends BaseController $this->uploadLogo($request->file('company_logo'), $vendor->company, $vendor); - event(new VendorWasUpdated($vendor, $vendor->company, Ninja::eventVars())); + event(new VendorWasUpdated($vendor, $vendor->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($vendor->fresh()); } @@ -376,7 +376,7 @@ class VendorController extends BaseController $this->uploadLogo($request->file('company_logo'), $vendor->company, $vendor); - event(new VendorWasCreated($vendor, $vendor->company, Ninja::eventVars())); + event(new VendorWasCreated($vendor, $vendor->company, Ninja::eventVars(auth()->user()->id))); return $this->itemResponse($vendor); } diff --git a/app/Http/Livewire/SubscriptionPlanSwitch.php b/app/Http/Livewire/SubscriptionPlanSwitch.php index a6afc69c445c..b08ebb24617c 100644 --- a/app/Http/Livewire/SubscriptionPlanSwitch.php +++ b/app/Http/Livewire/SubscriptionPlanSwitch.php @@ -19,11 +19,21 @@ use Livewire\Component; class SubscriptionPlanSwitch extends Component { + /** + * @var RecurringInvoice + */ + public $recurring_invoice; + /** * @var Subscription */ public $subscription; + /** + * @var ?float + */ + public $amount; + /** * @var Subscription */ @@ -62,7 +72,7 @@ class SubscriptionPlanSwitch extends Component public function mount() { - $this->total = $this->subscription->service()->getPriceBetweenSubscriptions($this->subscription, $this->target); + $this->total = $this->amount; $this->methods = $this->contact->client->service()->getPaymentMethods(100); @@ -74,6 +84,7 @@ class SubscriptionPlanSwitch extends Component $this->state['show_loading_bar'] = true; $this->state['invoice'] = $this->subscription->service()->createChangePlanInvoice([ + 'recurring_invoice' => $this->recurring_invoice, 'subscription' => $this->subscription, 'target' => $this->target, ]); diff --git a/app/Http/Requests/ClientPortal/Subscriptions/ShowPlanSwitchRequest.php b/app/Http/Requests/ClientPortal/Subscriptions/ShowPlanSwitchRequest.php index 8877fb060e88..4c05a0fbab6f 100644 --- a/app/Http/Requests/ClientPortal/Subscriptions/ShowPlanSwitchRequest.php +++ b/app/Http/Requests/ClientPortal/Subscriptions/ShowPlanSwitchRequest.php @@ -17,7 +17,7 @@ class ShowPlanSwitchRequest extends FormRequest */ public function authorize() { - return (bool)$this->subscription->allow_plan_changes; + return (bool)$this->recurring_invoice->subscription->allow_plan_changes; } /** diff --git a/app/Jobs/Entity/CreateEntityPdf.php b/app/Jobs/Entity/CreateEntityPdf.php index edaa6776ea8b..79a479ac9840 100644 --- a/app/Jobs/Entity/CreateEntityPdf.php +++ b/app/Jobs/Entity/CreateEntityPdf.php @@ -12,6 +12,7 @@ namespace App\Jobs\Entity; +use App\Exceptions\FilePermissionsFailure; use App\Models\Account; use App\Models\Credit; use App\Models\CreditInvitation; @@ -168,6 +169,7 @@ class CreateEntityPdf implements ShouldQueue else { $pdf = $this->makePdf(null, null, $maker->getCompiledHTML(true)); } + } catch (\Exception $e) { nlog(print_r($e->getMessage(), 1)); } @@ -176,8 +178,20 @@ class CreateEntityPdf implements ShouldQueue info($maker->getCompiledHTML()); } + if ($pdf) { - Storage::disk($this->disk)->put($file_path, $pdf); + + try{ + + Storage::disk($this->disk)->put($file_path, $pdf); + + } + catch(\Exception $e) + { + + throw new FilePermissionsFailure('Could not write the PDF, permission issues!'); + + } } return $file_path; diff --git a/app/Jobs/Entity/EmailEntity.php b/app/Jobs/Entity/EmailEntity.php index d6e6c1235817..3dd8118d8c34 100644 --- a/app/Jobs/Entity/EmailEntity.php +++ b/app/Jobs/Entity/EmailEntity.php @@ -142,7 +142,7 @@ class EmailEntity implements ShouldQueue { switch ($this->entity_string) { case 'invoice': - event(new InvoiceWasEmailedAndFailed($this->invitation, $this->company, $message, $this->reminder_template, Ninja::eventVars())); + event(new InvoiceWasEmailedAndFailed($this->invitation, $this->company, $message, $this->reminder_template, Ninja::eventVars(auth()->user()->id))); break; default: diff --git a/app/Jobs/Mail/NinjaMailerJob.php b/app/Jobs/Mail/NinjaMailerJob.php index af1b42f525f2..23aafa6c51ea 100644 --- a/app/Jobs/Mail/NinjaMailerJob.php +++ b/app/Jobs/Mail/NinjaMailerJob.php @@ -105,10 +105,10 @@ class NinjaMailerJob implements ShouldQueue switch ($class) { case Invoice::class: - event(new InvoiceWasEmailedAndFailed($this->nmo->invitation, $this->nmo->company, $message, $this->nmo->reminder_template, Ninja::eventVars())); + event(new InvoiceWasEmailedAndFailed($this->nmo->invitation, $this->nmo->company, $message, $this->nmo->reminder_template, Ninja::eventVars(auth()->user()->id))); break; case Payment::class: - event(new PaymentWasEmailedAndFailed($this->nmo->entity, $this->nmo->company, $message, Ninja::eventVars())); + event(new PaymentWasEmailedAndFailed($this->nmo->entity, $this->nmo->company, $message, Ninja::eventVars(auth()->user()->id))); break; default: # code... diff --git a/app/Jobs/Payment/EmailPayment.php b/app/Jobs/Payment/EmailPayment.php index 2abdfd802af6..6c00e8b5638d 100644 --- a/app/Jobs/Payment/EmailPayment.php +++ b/app/Jobs/Payment/EmailPayment.php @@ -91,7 +91,7 @@ class EmailPayment implements ShouldQueue NinjaMailerJob::dispatch($nmo); - event(new PaymentWasEmailed($this->payment, $this->payment->company, Ninja::eventVars())); + event(new PaymentWasEmailed($this->payment, $this->payment->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); } } } diff --git a/app/Jobs/User/CreateUser.php b/app/Jobs/User/CreateUser.php index da3209994584..351af1ec0333 100644 --- a/app/Jobs/User/CreateUser.php +++ b/app/Jobs/User/CreateUser.php @@ -84,7 +84,7 @@ class CreateUser if(!Ninja::isSelfHost()){ nlog("in the create user class"); - event(new UserWasCreated($user, $user, $this->company, Ninja::eventVars())); + event(new UserWasCreated($user, $user, $this->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); } return $user; diff --git a/app/Libraries/MultiDB.php b/app/Libraries/MultiDB.php index dd5237f35ec9..7b69e223894b 100644 --- a/app/Libraries/MultiDB.php +++ b/app/Libraries/MultiDB.php @@ -192,6 +192,7 @@ class MultiDB return true; } + self::setDefaultDatabase(); return false; } @@ -205,6 +206,7 @@ class MultiDB return true; } } + self::setDefaultDatabase(); return false; } @@ -218,6 +220,7 @@ class MultiDB return true; } } + self::setDefaultDatabase(); return false; } @@ -230,6 +233,7 @@ class MultiDB return true; } } + self::setDefaultDatabase(); return false; } @@ -242,16 +246,20 @@ class MultiDB return true; } } + self::setDefaultDatabase(); return false; } public static function findAndSetDbByDomain($subdomain) :bool { + + if (! config('ninja.db.multi_db_enabled')) + return (Company::whereSubdomain($subdomain)->exists() === true); + foreach (self::$dbs as $db) { if ($company = Company::on($db)->whereSubdomain($subdomain)->first()) { self::setDb($company->db); - return true; } } diff --git a/app/Listeners/Activity/ArchivedClientActivity.php b/app/Listeners/Activity/ArchivedClientActivity.php index 06c5289ea810..3823c6ac4125 100644 --- a/app/Listeners/Activity/ArchivedClientActivity.php +++ b/app/Listeners/Activity/ArchivedClientActivity.php @@ -43,8 +43,10 @@ class ArchivedClientActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->client->user_id; + $fields->client_id = $event->client->id; - $fields->user_id = $event->client->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->client->company_id; $fields->activity_type_id = Activity::ARCHIVE_CLIENT; diff --git a/app/Listeners/Activity/ClientUpdatedActivity.php b/app/Listeners/Activity/ClientUpdatedActivity.php index 066cc27211c8..7013d020209a 100644 --- a/app/Listeners/Activity/ClientUpdatedActivity.php +++ b/app/Listeners/Activity/ClientUpdatedActivity.php @@ -45,8 +45,10 @@ class ClientUpdatedActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->client->user_id; + $fields->client_id = $client->id; - $fields->user_id = $client->user_id; + $fields->user_id = $user_id; $fields->company_id = $client->company_id; $fields->activity_type_id = Activity::UPDATE_CLIENT; diff --git a/app/Listeners/Activity/CreatedClientActivity.php b/app/Listeners/Activity/CreatedClientActivity.php index 8602966f3819..c3c13bf26b7e 100644 --- a/app/Listeners/Activity/CreatedClientActivity.php +++ b/app/Listeners/Activity/CreatedClientActivity.php @@ -43,8 +43,10 @@ class CreatedClientActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->client->user_id; + $fields->client_id = $event->client->id; - $fields->user_id = $event->client->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->client->company_id; $fields->activity_type_id = Activity::CREATE_CLIENT; diff --git a/app/Listeners/Activity/CreatedCreditActivity.php b/app/Listeners/Activity/CreatedCreditActivity.php index c6fbb77f705f..e190d9eff8b4 100644 --- a/app/Listeners/Activity/CreatedCreditActivity.php +++ b/app/Listeners/Activity/CreatedCreditActivity.php @@ -43,8 +43,10 @@ class CreatedCreditActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->credit->user_id; + $fields->credit_id = $event->credit->id; - $fields->user_id = $event->credit->user_id; + $fields->user_id = $user_id; $fields->client_id = $event->credit->client_id; $fields->company_id = $event->credit->company_id; diff --git a/app/Listeners/Activity/CreatedExpenseActivity.php b/app/Listeners/Activity/CreatedExpenseActivity.php index a32737e0b1fd..f78e6a86e33a 100644 --- a/app/Listeners/Activity/CreatedExpenseActivity.php +++ b/app/Listeners/Activity/CreatedExpenseActivity.php @@ -43,8 +43,11 @@ class CreatedExpenseActivity implements ShouldQueue $fields = new stdClass; + + $user_id = $event->event_vars['user_id'] ?: $event->expense->user_id; + $fields->expense_id = $event->expense->id; - $fields->user_id = $event->expense->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->expense->company_id; $fields->activity_type_id = Activity::CREATE_EXPENSE; diff --git a/app/Listeners/Activity/CreatedQuoteActivity.php b/app/Listeners/Activity/CreatedQuoteActivity.php index 06f96b9a4f0d..f647c0d8ea71 100644 --- a/app/Listeners/Activity/CreatedQuoteActivity.php +++ b/app/Listeners/Activity/CreatedQuoteActivity.php @@ -43,9 +43,11 @@ class CreatedQuoteActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->quote->user_id; + $fields->quote_id = $event->quote->id; $fields->client_id = $event->quote->client_id; - $fields->user_id = $event->quote->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->quote->company_id; $fields->activity_type_id = Activity::CREATE_QUOTE; diff --git a/app/Listeners/Activity/CreatedSubscriptionActivity.php b/app/Listeners/Activity/CreatedSubscriptionActivity.php new file mode 100644 index 000000000000..83df729fc64c --- /dev/null +++ b/app/Listeners/Activity/CreatedSubscriptionActivity.php @@ -0,0 +1,55 @@ +activity_repo = $activity_repo; + } + + /** + * Handle the event. + * + * @param object $event + * @return void + */ + public function handle($event) + { + MultiDB::setDb($event->company->db); + + $fields = new stdClass; + + $user_id = $event->event_vars['user_id'] ?: $event->subscription->user_id; + + $fields->subscription_id = $event->subscription->id; + $fields->user_id = $user_id; + $fields->company_id = $event->subscription->company_id; + $fields->activity_type_id = Activity::CREATE_SUBSCRIPTION; + + $this->activity_repo->save($fields, $event->subscription, $event->event_vars); + } +} diff --git a/app/Listeners/Activity/CreatedTaskActivity.php b/app/Listeners/Activity/CreatedTaskActivity.php index 97d4917885f0..2250c9e2f63f 100644 --- a/app/Listeners/Activity/CreatedTaskActivity.php +++ b/app/Listeners/Activity/CreatedTaskActivity.php @@ -43,8 +43,10 @@ class CreatedTaskActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->task->user_id; + $fields->task_id = $event->task->id; - $fields->user_id = $event->task->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->task->company_id; $fields->activity_type_id = Activity::CREATE_TASK; diff --git a/app/Listeners/Activity/CreatedVendorActivity.php b/app/Listeners/Activity/CreatedVendorActivity.php index 7e2d73149aa0..0b732ef00703 100644 --- a/app/Listeners/Activity/CreatedVendorActivity.php +++ b/app/Listeners/Activity/CreatedVendorActivity.php @@ -43,8 +43,10 @@ class CreatedVendorActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->vendor->user_id; + $fields->vendor_id = $event->vendor->id; - $fields->user_id = $event->vendor->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->vendor->company_id; $fields->activity_type_id = Activity::CREATE_VENDOR; diff --git a/app/Listeners/Activity/CreditArchivedActivity.php b/app/Listeners/Activity/CreditArchivedActivity.php index 239082c81f39..de26e7441d90 100644 --- a/app/Listeners/Activity/CreditArchivedActivity.php +++ b/app/Listeners/Activity/CreditArchivedActivity.php @@ -43,9 +43,11 @@ class CreditArchivedActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->credit->user_id; + $fields->payment_id = $event->credit->id; $fields->client_id = $event->credit->client_id; - $fields->user_id = $event->credit->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->credit->company_id; $fields->activity_type_id = Activity::ARCHIVE_CREDIT; diff --git a/app/Listeners/Activity/DeleteClientActivity.php b/app/Listeners/Activity/DeleteClientActivity.php index aa22255860da..410651fa095c 100644 --- a/app/Listeners/Activity/DeleteClientActivity.php +++ b/app/Listeners/Activity/DeleteClientActivity.php @@ -43,8 +43,10 @@ class DeleteClientActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->client->user_id; + $fields->client_id = $event->client->id; - $fields->user_id = $event->client->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->client->company_id; $fields->activity_type_id = Activity::DELETE_CLIENT; diff --git a/app/Listeners/Activity/DeleteCreditActivity.php b/app/Listeners/Activity/DeleteCreditActivity.php index 5739ce4f7a8a..9d6d3faea98e 100644 --- a/app/Listeners/Activity/DeleteCreditActivity.php +++ b/app/Listeners/Activity/DeleteCreditActivity.php @@ -43,9 +43,11 @@ class DeleteCreditActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->credit->user_id; + $fields->client_id = $event->credit->client_id; $fields->credit_id = $event->credit->id; - $fields->user_id = $event->credit->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->credit->company_id; $fields->activity_type_id = Activity::DELETE_CREDIT; diff --git a/app/Listeners/Activity/ExpenseArchivedActivity.php b/app/Listeners/Activity/ExpenseArchivedActivity.php index 876d56a7dda1..4cbefebf4c50 100644 --- a/app/Listeners/Activity/ExpenseArchivedActivity.php +++ b/app/Listeners/Activity/ExpenseArchivedActivity.php @@ -45,8 +45,10 @@ class ExpenseArchivedActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->expense->user_id; + $fields->expense_id = $expense->id; - $fields->user_id = $expense->user_id; + $fields->user_id = $user_id; $fields->company_id = $expense->company_id; $fields->activity_type_id = Activity::ARCHIVE_EXPENSE; diff --git a/app/Listeners/Activity/ExpenseDeletedActivity.php b/app/Listeners/Activity/ExpenseDeletedActivity.php index 7b7a6e6ebfa7..da9dc00932fd 100644 --- a/app/Listeners/Activity/ExpenseDeletedActivity.php +++ b/app/Listeners/Activity/ExpenseDeletedActivity.php @@ -43,8 +43,10 @@ class ExpenseDeletedActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->expense->user_id; + $fields->expense_id = $event->expense->id; - $fields->user_id = $event->expense->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->expense->company_id; $fields->activity_type_id = Activity::DELETE_VENDOR; diff --git a/app/Listeners/Activity/ExpenseRestoredActivity.php b/app/Listeners/Activity/ExpenseRestoredActivity.php index 77c5e66a6b3c..d20b13bf60c6 100644 --- a/app/Listeners/Activity/ExpenseRestoredActivity.php +++ b/app/Listeners/Activity/ExpenseRestoredActivity.php @@ -43,8 +43,10 @@ class ExpenseRestoredActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->expense->user_id; + $fields->expense_id = $event->expense->id; - $fields->user_id = $event->expense->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->expense->company_id; $fields->activity_type_id = Activity::RESTORE_EXPENSE; diff --git a/app/Listeners/Activity/ExpenseUpdatedActivity.php b/app/Listeners/Activity/ExpenseUpdatedActivity.php index fae44f9c77dd..69d3390e44b2 100644 --- a/app/Listeners/Activity/ExpenseUpdatedActivity.php +++ b/app/Listeners/Activity/ExpenseUpdatedActivity.php @@ -43,10 +43,12 @@ class ExpenseUpdatedActivity implements ShouldQueue $expense = $event->expense; + $user_id = $event->event_vars['user_id'] ?: $event->expense->user_id; + $fields = new stdClass; $fields->expense_id = $expense->id; - $fields->user_id = $expense->user_id; + $fields->user_id = $user_id; $fields->company_id = $expense->company_id; $fields->activity_type_id = Activity::UPDATE_EXPENSE; diff --git a/app/Listeners/Activity/PaymentArchivedActivity.php b/app/Listeners/Activity/PaymentArchivedActivity.php index f2e3e17fdf98..aa7f4f3d680b 100644 --- a/app/Listeners/Activity/PaymentArchivedActivity.php +++ b/app/Listeners/Activity/PaymentArchivedActivity.php @@ -48,9 +48,11 @@ class PaymentArchivedActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->payment->user_id; + $fields->payment_id = $payment->id; $fields->client_id = $payment->client_id; - $fields->user_id = $payment->user_id; + $fields->user_id = $user_id; $fields->company_id = $payment->company_id; $fields->activity_type_id = Activity::ARCHIVE_PAYMENT; diff --git a/app/Listeners/Activity/PaymentCreatedActivity.php b/app/Listeners/Activity/PaymentCreatedActivity.php index 5adca5b0d17d..c21dc7ce1d7f 100644 --- a/app/Listeners/Activity/PaymentCreatedActivity.php +++ b/app/Listeners/Activity/PaymentCreatedActivity.php @@ -43,13 +43,15 @@ class PaymentCreatedActivity implements ShouldQueue $payment = $event->payment; + $user_id = $event->event_vars['user_id'] ?: $event->payment->user_id; + $invoices = $payment->invoices; $fields = new stdClass; $fields->payment_id = $payment->id; $fields->client_id = $payment->client_id; - $fields->user_id = $payment->user_id; + $fields->user_id = $user_id; $fields->company_id = $payment->company_id; $fields->activity_type_id = Activity::CREATE_PAYMENT; diff --git a/app/Listeners/Activity/PaymentDeletedActivity.php b/app/Listeners/Activity/PaymentDeletedActivity.php index acc7aa2619d4..38a27181eab3 100644 --- a/app/Listeners/Activity/PaymentDeletedActivity.php +++ b/app/Listeners/Activity/PaymentDeletedActivity.php @@ -43,13 +43,15 @@ class PaymentDeletedActivity implements ShouldQueue $payment = $event->payment; + $user_id = $event->event_vars['user_id'] ?: $event->payment->user_id; + $invoices = $payment->invoices; $fields = new stdClass; $fields->payment_id = $payment->id; $fields->client_id = $payment->client_id; - $fields->user_id = $payment->user_id; + $fields->user_id = $user_id; $fields->company_id = $payment->company_id; $fields->activity_type_id = Activity::DELETE_PAYMENT; diff --git a/app/Listeners/Activity/PaymentRefundedActivity.php b/app/Listeners/Activity/PaymentRefundedActivity.php index 8ce9fcc956c8..095fe8391965 100644 --- a/app/Listeners/Activity/PaymentRefundedActivity.php +++ b/app/Listeners/Activity/PaymentRefundedActivity.php @@ -43,9 +43,11 @@ class PaymentRefundedActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->payment->user_id; + $fields->client_id = $event->payment->id; $fields->client_id = $event->payment->client_id; - $fields->user_id = $event->payment->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->payment->company_id; $fields->activity_type_id = Activity::REFUNDED_PAYMENT; $fields->payment_id = $event->payment->id; diff --git a/app/Listeners/Activity/PaymentUpdatedActivity.php b/app/Listeners/Activity/PaymentUpdatedActivity.php index 3e349972c945..2802c74a7ce0 100644 --- a/app/Listeners/Activity/PaymentUpdatedActivity.php +++ b/app/Listeners/Activity/PaymentUpdatedActivity.php @@ -48,9 +48,11 @@ class PaymentUpdatedActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->payment->user_id; + $fields->payment_id = $payment->id; $fields->client_id = $payment->client_id; - $fields->user_id = $payment->user_id; + $fields->user_id = $user_id; $fields->company_id = $payment->company_id; $fields->activity_type_id = Activity::UPDATE_PAYMENT; diff --git a/app/Listeners/Activity/PaymentVoidedActivity.php b/app/Listeners/Activity/PaymentVoidedActivity.php index 480e6caa26a6..f10d4ac01c46 100644 --- a/app/Listeners/Activity/PaymentVoidedActivity.php +++ b/app/Listeners/Activity/PaymentVoidedActivity.php @@ -43,8 +43,10 @@ class PaymentVoidedActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->payment->user_id; + $fields->client_id = $event->payment->id; - $fields->user_id = $event->payment->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->payment->company_id; $fields->activity_type_id = Activity::VOIDED_PAYMENT; $fields->payment_id = $event->payment->id; diff --git a/app/Listeners/Activity/QuoteUpdatedActivity.php b/app/Listeners/Activity/QuoteUpdatedActivity.php index ac13c8c5e172..9506c8ae2291 100644 --- a/app/Listeners/Activity/QuoteUpdatedActivity.php +++ b/app/Listeners/Activity/QuoteUpdatedActivity.php @@ -45,9 +45,11 @@ class QuoteUpdatedActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->quote->user_id; + $fields->quote_id = $quote->id; $fields->client_id = $quote->client_id; - $fields->user_id = $quote->user_id; + $fields->user_id = $user_id; $fields->company_id = $quote->company_id; $fields->activity_type_id = Activity::UPDATE_QUOTE; diff --git a/app/Listeners/Activity/RestoreClientActivity.php b/app/Listeners/Activity/RestoreClientActivity.php index 05fb909bfd6d..93b1b83ba4d5 100644 --- a/app/Listeners/Activity/RestoreClientActivity.php +++ b/app/Listeners/Activity/RestoreClientActivity.php @@ -43,8 +43,10 @@ class RestoreClientActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->client->user_id; + $fields->client_id = $event->client->id; - $fields->user_id = $event->client->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->client->company_id; $fields->activity_type_id = Activity::RESTORE_CLIENT; diff --git a/app/Listeners/Activity/SubscriptionArchivedActivity.php b/app/Listeners/Activity/SubscriptionArchivedActivity.php new file mode 100644 index 000000000000..ec793416ca2b --- /dev/null +++ b/app/Listeners/Activity/SubscriptionArchivedActivity.php @@ -0,0 +1,57 @@ +activity_repo = $activity_repo; + } + + /** + * Handle the event. + * + * @param object $event + * @return void + */ + public function handle($event) + { + MultiDB::setDb($event->company->db); + + $subscription = $event->subscription; + + $fields = new stdClass; + + $user_id = $event->event_vars['user_id'] ?: $event->subscription->user_id; + + $fields->subscription_id = $subscription->id; + $fields->user_id = $user_id; + $fields->company_id = $subscription->company_id; + $fields->activity_type_id = Activity::ARCHIVE_SUBSCRIPTIOn; + + $this->activity_repo->save($fields, $subscription, $event->event_vars); + } +} diff --git a/app/Listeners/Activity/SubscriptionDeletedActivity.php b/app/Listeners/Activity/SubscriptionDeletedActivity.php new file mode 100644 index 000000000000..73a9e749f916 --- /dev/null +++ b/app/Listeners/Activity/SubscriptionDeletedActivity.php @@ -0,0 +1,55 @@ +activity_repo = $activity_repo; + } + + /** + * Handle the event. + * + * @param object $event + * @return void + */ + public function handle($event) + { + MultiDB::setDb($event->company->db); + + $fields = new stdClass; + + $user_id = $event->event_vars['user_id'] ?: $event->subscription->user_id; + + $fields->subscription_id = $event->subscription->id; + $fields->user_id = $user_id; + $fields->company_id = $event->subscription->company_id; + $fields->activity_type_id = Activity::DELETE_SUBSCRIPTION; + + $this->activity_repo->save($fields, $event->subscription, $event->event_vars); + } +} diff --git a/app/Listeners/Activity/SubscriptionRestoredActivity.php b/app/Listeners/Activity/SubscriptionRestoredActivity.php new file mode 100644 index 000000000000..09b6b860cb62 --- /dev/null +++ b/app/Listeners/Activity/SubscriptionRestoredActivity.php @@ -0,0 +1,55 @@ +activity_repo = $activity_repo; + } + + /** + * Handle the event. + * + * @param object $event + * @return void + */ + public function handle($event) + { + MultiDB::setDb($event->company->db); + + $fields = new stdClass; + + $user_id = $event->event_vars['user_id'] ?: $event->subscription->user_id; + + $fields->subscription_id = $event->subscription->id; + $fields->user_id = $user_id; + $fields->company_id = $event->subscription->company_id; + $fields->activity_type_id = Activity::RESTORE_SUBSCRIPTION; + + $this->activity_repo->save($fields, $event->subscription, $event->event_vars); + } +} diff --git a/app/Listeners/Activity/SubscriptionUpdatedActivity.php b/app/Listeners/Activity/SubscriptionUpdatedActivity.php new file mode 100644 index 000000000000..a07f4a78ff4c --- /dev/null +++ b/app/Listeners/Activity/SubscriptionUpdatedActivity.php @@ -0,0 +1,57 @@ +activity_repo = $activity_repo; + } + + /** + * Handle the event. + * + * @param object $event + * @return void + */ + public function handle($event) + { + MultiDB::setDb($event->company->db); + + $subscription = $event->subscription; + + $fields = new stdClass; + + $user_id = $event->event_vars['user_id'] ?: $event->subscription->user_id; + + $fields->subscription_id = $subscription->id; + $fields->user_id = $user_id; + $fields->company_id = $subscription->company_id; + $fields->activity_type_id = Activity::UPDATE_SUBSCRIPTION; + + $this->activity_repo->save($fields, $subscription, $event->event_vars); + } +} diff --git a/app/Listeners/Activity/TaskArchivedActivity.php b/app/Listeners/Activity/TaskArchivedActivity.php index d8610a71867b..83cf0d6bd62f 100644 --- a/app/Listeners/Activity/TaskArchivedActivity.php +++ b/app/Listeners/Activity/TaskArchivedActivity.php @@ -45,8 +45,10 @@ class TaskArchivedActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->task->user_id; + $fields->task_id = $task->id; - $fields->user_id = $task->user_id; + $fields->user_id = $user_id; $fields->company_id = $task->company_id; $fields->activity_type_id = Activity::ARCHIVE_TASK; diff --git a/app/Listeners/Activity/TaskDeletedActivity.php b/app/Listeners/Activity/TaskDeletedActivity.php index 3989601b1562..61d9797484eb 100644 --- a/app/Listeners/Activity/TaskDeletedActivity.php +++ b/app/Listeners/Activity/TaskDeletedActivity.php @@ -43,8 +43,10 @@ class TaskDeletedActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->task->user_id; + $fields->task_id = $event->task->id; - $fields->user_id = $event->task->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->task->company_id; $fields->activity_type_id = Activity::DELETE_TASK; diff --git a/app/Listeners/Activity/TaskRestoredActivity.php b/app/Listeners/Activity/TaskRestoredActivity.php index c932480139a5..19d0a4cf39da 100644 --- a/app/Listeners/Activity/TaskRestoredActivity.php +++ b/app/Listeners/Activity/TaskRestoredActivity.php @@ -43,8 +43,10 @@ class TaskRestoredActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->task->user_id; + $fields->task_id = $event->task->id; - $fields->user_id = $event->task->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->task->company_id; $fields->activity_type_id = Activity::RESTORE_TASK; diff --git a/app/Listeners/Activity/TaskUpdatedActivity.php b/app/Listeners/Activity/TaskUpdatedActivity.php index f761b4a71289..11a5ace8ca2f 100644 --- a/app/Listeners/Activity/TaskUpdatedActivity.php +++ b/app/Listeners/Activity/TaskUpdatedActivity.php @@ -45,8 +45,10 @@ class TaskUpdatedActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->task->user_id; + $fields->task_id = $task->id; - $fields->user_id = $task->user_id; + $fields->user_id = $user_id; $fields->company_id = $task->company_id; $fields->activity_type_id = Activity::UPDATE_TASK; diff --git a/app/Listeners/Activity/UpdatedCreditActivity.php b/app/Listeners/Activity/UpdatedCreditActivity.php index 88d256e3f7e5..9974fbd5fef1 100644 --- a/app/Listeners/Activity/UpdatedCreditActivity.php +++ b/app/Listeners/Activity/UpdatedCreditActivity.php @@ -43,9 +43,11 @@ class UpdatedCreditActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->credit->user_id; + $fields->credit_id = $event->credit->id; $fields->client_id = $event->credit->client_id; - $fields->user_id = $event->credit->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->credit->company_id; $fields->activity_type_id = Activity::UPDATE_CREDIT; diff --git a/app/Listeners/Activity/VendorArchivedActivity.php b/app/Listeners/Activity/VendorArchivedActivity.php index 7dd24eb44dd1..262de59ce29b 100644 --- a/app/Listeners/Activity/VendorArchivedActivity.php +++ b/app/Listeners/Activity/VendorArchivedActivity.php @@ -45,8 +45,10 @@ class VendorArchivedActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->vendor->user_id; + $fields->vendor_id = $vendor->id; - $fields->user_id = $vendor->user_id; + $fields->user_id = $user_id; $fields->company_id = $vendor->company_id; $fields->activity_type_id = Activity::ARCHIVE_VENDOR; diff --git a/app/Listeners/Activity/VendorDeletedActivity.php b/app/Listeners/Activity/VendorDeletedActivity.php index ad60c2d21d2e..b63f76d0f2ef 100644 --- a/app/Listeners/Activity/VendorDeletedActivity.php +++ b/app/Listeners/Activity/VendorDeletedActivity.php @@ -43,8 +43,10 @@ class VendorDeletedActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->vendor->user_id; + $fields->vendor_id = $event->vendor->id; - $fields->user_id = $event->vendor->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->vendor->company_id; $fields->activity_type_id = Activity::DELETE_VENDOR; diff --git a/app/Listeners/Activity/VendorRestoredActivity.php b/app/Listeners/Activity/VendorRestoredActivity.php index 86a7d5dbb68c..a6927cddfdfb 100644 --- a/app/Listeners/Activity/VendorRestoredActivity.php +++ b/app/Listeners/Activity/VendorRestoredActivity.php @@ -43,8 +43,10 @@ class VendorRestoredActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->vendor->user_id; + $fields->vendor_id = $event->vendor->id; - $fields->user_id = $event->vendor->user_id; + $fields->user_id = $user_id; $fields->company_id = $event->vendor->company_id; $fields->activity_type_id = Activity::RESTORE_VENDOR; diff --git a/app/Listeners/Activity/VendorUpdatedActivity.php b/app/Listeners/Activity/VendorUpdatedActivity.php index 8a2198abdd85..2b1d7bab0262 100644 --- a/app/Listeners/Activity/VendorUpdatedActivity.php +++ b/app/Listeners/Activity/VendorUpdatedActivity.php @@ -45,8 +45,10 @@ class VendorUpdatedActivity implements ShouldQueue $fields = new stdClass; + $user_id = $event->event_vars['user_id'] ?: $event->vendor->user_id; + $fields->vendor_id = $vendor->id; - $fields->user_id = $vendor->user_id; + $fields->user_id = $user_id; $fields->company_id = $vendor->company_id; $fields->activity_type_id = Activity::UPDATE_VENDOR; diff --git a/app/Models/Activity.php b/app/Models/Activity.php index afeda7e23c5f..9f42edac178e 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -84,6 +84,12 @@ class Activity extends StaticModel const INVOICE_REMINDER3_SENT = 65; const INVOICE_REMINDER_ENDLESS_SENT = 66; + const CREATE_SUBSCRIPTION = 80; + const UPDATE_SUBSCRIPTION = 81; + const ARCHIVE_SUBSCRIPTION = 82; + const DELETE_SUBSCRIPTION = 83; + const RESTORE_SUBSCRIPTION = 84; + protected $casts = [ 'is_system' => 'boolean', 'updated_at' => 'timestamp', diff --git a/app/Models/Credit.php b/app/Models/Credit.php index aca29955edbb..3890fe7c9b91 100644 --- a/app/Models/Credit.php +++ b/app/Models/Credit.php @@ -255,10 +255,10 @@ class Credit extends BaseModel } if (! $invitation) { - event(new CreditWasUpdated($this, $this->company, Ninja::eventVars())); + event(new CreditWasUpdated($this, $this->company, Ninja::eventVars(auth()->user()->id))); CreateEntityPdf::dispatchNow($this->invitations->first()); } else { - event(new CreditWasUpdated($this, $this->company, Ninja::eventVars())); + event(new CreditWasUpdated($this, $this->company, Ninja::eventVars(auth()->user()->id))); CreateEntityPdf::dispatchNow($invitation); } diff --git a/app/Models/CreditInvitation.php b/app/Models/CreditInvitation.php index 8f5f9f7744f4..d8938f702dac 100644 --- a/app/Models/CreditInvitation.php +++ b/app/Models/CreditInvitation.php @@ -129,7 +129,7 @@ class CreditInvitation extends BaseModel $storage_path = Storage::url($this->credit->client->quote_filepath().$this->credit->numberFormatter().'.pdf'); if (! Storage::exists($this->credit->client->credit_filepath().$this->credit->numberFormatter().'.pdf')) { - event(new CreditWasUpdated($this, $this->company, Ninja::eventVars())); + event(new CreditWasUpdated($this, $this->company, Ninja::eventVars(auth()->user()->id))); CreateEntityPdf::dispatchNow($this); } diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 177137e13409..b15649d23866 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -397,7 +397,7 @@ class Invoice extends BaseModel $storage_path = Storage::$type($this->client->invoice_filepath().$this->numberFormatter().'.pdf'); if (! Storage::exists($this->client->invoice_filepath().$this->numberFormatter().'.pdf')) { - event(new InvoiceWasUpdated($this, $this->company, Ninja::eventVars())); + event(new InvoiceWasUpdated($this, $this->company, Ninja::eventVars(auth()->user()->id))); CreateEntityPdf::dispatchNow($invitation); } diff --git a/app/Models/InvoiceInvitation.php b/app/Models/InvoiceInvitation.php index 17417106e0bb..51042e7d70fa 100644 --- a/app/Models/InvoiceInvitation.php +++ b/app/Models/InvoiceInvitation.php @@ -143,7 +143,7 @@ class InvoiceInvitation extends BaseModel $storage_path = Storage::url($this->invoice->client->invoice_filepath().$this->invoice->numberFormatter().'.pdf'); if (! Storage::exists($this->invoice->client->invoice_filepath().$this->invoice->numberFormatter().'.pdf')) { - event(new InvoiceWasUpdated($this->invoice, $this->company, Ninja::eventVars())); + event(new InvoiceWasUpdated($this->invoice, $this->company, Ninja::eventVars(auth()->user()->id))); CreateEntityPdf::dispatchNow($this); } diff --git a/app/Models/Payment.php b/app/Models/Payment.php index f1ab6e08c87e..123cddd6615e 100644 --- a/app/Models/Payment.php +++ b/app/Models/Payment.php @@ -243,7 +243,7 @@ class Payment extends BaseModel $this->status_id = $this->refunded == $this->amount ? self::STATUS_REFUNDED : self::STATUS_PARTIALLY_REFUNDED; $this->save(); - event(new PaymentWasRefunded($this, $refund_change, $this->company, Ninja::eventVars())); + event(new PaymentWasRefunded($this, $refund_change, $this->company, Ninja::eventVars(auth()->user()->id))); } return true; @@ -280,7 +280,7 @@ class Payment extends BaseModel $this->status_id = self::STATUS_CANCELLED; $this->save(); - event(new PaymentWasVoided($this, $this->company, Ninja::eventVars())); + event(new PaymentWasVoided($this, $this->company, Ninja::eventVars(auth()->user()->id))); } public function getLink() diff --git a/app/Models/Quote.php b/app/Models/Quote.php index aa9720a505a5..68d37826847f 100644 --- a/app/Models/Quote.php +++ b/app/Models/Quote.php @@ -213,7 +213,7 @@ class Quote extends BaseModel nlog($storage_path); if (! Storage::exists($this->client->quote_filepath().$this->numberFormatter().'.pdf')) { - event(new QuoteWasUpdated($this, $this->company, Ninja::eventVars())); + event(new QuoteWasUpdated($this, $this->company, Ninja::eventVars(auth()->user()->id))); CreateEntityPdf::dispatchNow($invitation); } diff --git a/app/Models/QuoteInvitation.php b/app/Models/QuoteInvitation.php index 74871dd05da0..8506a80f23fd 100644 --- a/app/Models/QuoteInvitation.php +++ b/app/Models/QuoteInvitation.php @@ -133,7 +133,7 @@ class QuoteInvitation extends BaseModel $storage_path = Storage::url($this->quote->client->quote_filepath().$this->quote->numberFormatter().'.pdf'); if (! Storage::exists($this->quote->client->quote_filepath().$this->quote->numberFormatter().'.pdf')) { - event(new QuoteWasUpdated($this->quote, $this->company, Ninja::eventVars())); + event(new QuoteWasUpdated($this->quote, $this->company, Ninja::eventVars(auth()->user()->id))); CreateEntityPdf::dispatchNow($this); } diff --git a/app/Models/RecurringInvoice.php b/app/Models/RecurringInvoice.php index 6727e0285c5c..3790ca91cfbf 100644 --- a/app/Models/RecurringInvoice.php +++ b/app/Models/RecurringInvoice.php @@ -184,7 +184,7 @@ class RecurringInvoice extends BaseModel public function invoices() { - return $this->hasMany(Invoice::class, 'id', 'recurring_id')->withTrashed(); + return $this->hasMany(Invoice::class, 'recurring_id', 'id')->withTrashed(); } public function invitations() diff --git a/app/PaymentDrivers/CheckoutCom/CreditCard.php b/app/PaymentDrivers/CheckoutCom/CreditCard.php index a1deb8422044..0a03f639aa75 100644 --- a/app/PaymentDrivers/CheckoutCom/CreditCard.php +++ b/app/PaymentDrivers/CheckoutCom/CreditCard.php @@ -141,7 +141,7 @@ class CreditCard $this->checkout->payment_hash->data = array_merge((array)$this->checkout->payment_hash->data, ['checkout_payment_ref' => $payment]); $this->checkout->payment_hash->save(); - if ($this->checkout->client->currency()->code === 'EUR') { + if ($this->checkout->client->currency()->code == 'EUR') { $payment->{'3ds'} = ['enabled' => true]; $payment->{'success_url'} = route('payment_webhook', [ diff --git a/app/PaymentDrivers/CheckoutComPaymentDriver.php b/app/PaymentDrivers/CheckoutComPaymentDriver.php index ed38ba8abd8c..ab8a41ab4a3d 100644 --- a/app/PaymentDrivers/CheckoutComPaymentDriver.php +++ b/app/PaymentDrivers/CheckoutComPaymentDriver.php @@ -209,7 +209,8 @@ class CheckoutComPaymentDriver extends BaseDriver $payment = new \Checkout\Models\Payments\Payment($method, $this->client->getCurrencyCode()); $payment->amount = $this->convertToCheckoutAmount($amount, $this->client->getCurrencyCode()); - $payment->reference = $cgt->meta->last4 . '-' . now(); + //$payment->reference = $cgt->meta->last4 . '-' . now(); + $payment->reference = $invoice->number . '-' . now(); $request = new PaymentResponseRequest(); $request->setMethod('POST'); diff --git a/app/PaymentDrivers/DriverTemplate.php b/app/PaymentDrivers/DriverTemplate.php index cd79f68c67ba..f747bacfe3fd 100644 --- a/app/PaymentDrivers/DriverTemplate.php +++ b/app/PaymentDrivers/DriverTemplate.php @@ -11,6 +11,12 @@ namespace App\PaymentDrivers; +use App\Models\ClientGatewayToken; +use App\Models\GatewayType; +use App\Models\Payment; +use App\Models\PaymentHash; +use App\Models\SystemLog; +use App\PaymentDrivers\Stripe\CreditCard; use App\Utils\Traits\MakesHash; class DriverTemplate extends BaseDriver diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 8728ecb8d81c..144710dbb598 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -67,6 +67,11 @@ use App\Events\Quote\QuoteWasEmailed; use App\Events\Quote\QuoteWasRestored; use App\Events\Quote\QuoteWasUpdated; use App\Events\Quote\QuoteWasViewed; +use App\Events\Subscription\SubscriptionWasArchived; +use App\Events\Subscription\SubscriptionWasCreated; +use App\Events\Subscription\SubscriptionWasDeleted; +use App\Events\Subscription\SubscriptionWasRestored; +use App\Events\Subscription\SubscriptionWasUpdated; use App\Events\Task\TaskWasArchived; use App\Events\Task\TaskWasCreated; use App\Events\Task\TaskWasDeleted; @@ -89,6 +94,7 @@ use App\Listeners\Activity\CreatedClientActivity; use App\Listeners\Activity\CreatedCreditActivity; use App\Listeners\Activity\CreatedExpenseActivity; use App\Listeners\Activity\CreatedQuoteActivity; +use App\Listeners\Activity\CreatedSubscriptionActivity; use App\Listeners\Activity\CreatedTaskActivity; use App\Listeners\Activity\CreatedVendorActivity; use App\Listeners\Activity\CreditArchivedActivity; @@ -106,6 +112,10 @@ use App\Listeners\Activity\PaymentUpdatedActivity; use App\Listeners\Activity\PaymentVoidedActivity; use App\Listeners\Activity\QuoteUpdatedActivity; use App\Listeners\Activity\RestoreClientActivity; +use App\Listeners\Activity\SubscriptionArchivedActivity; +use App\Listeners\Activity\SubscriptionDeletedActivity; +use App\Listeners\Activity\SubscriptionRestoredActivity; +use App\Listeners\Activity\SubscriptionUpdatedActivity; use App\Listeners\Activity\TaskArchivedActivity; use App\Listeners\Activity\TaskDeletedActivity; use App\Listeners\Activity\TaskRestoredActivity; @@ -396,6 +406,21 @@ class EventServiceProvider extends ServiceProvider TaskWasRestored::class => [ TaskRestoredActivity::class, ], + SubscriptionWasCreated::class => [ + CreatedSubscriptionActivity::class, + ], + SubscriptionWasUpdated::class => [ + SubscriptionUpdatedActivity::class, + ], + SubscriptionWasArchived::class => [ + SubscriptionArchivedActivity::class, + ], + SubscriptionWasDeleted::class => [ + SubscriptionDeletedActivity::class, + ], + SubscriptionWasRestored::class => [ + SubscriptionRestoredActivity::class, + ], VendorWasCreated::class => [ CreatedVendorActivity::class, ], diff --git a/app/Repositories/BaseRepository.php b/app/Repositories/BaseRepository.php index 6b182baf56cd..ddf2645d9051 100644 --- a/app/Repositories/BaseRepository.php +++ b/app/Repositories/BaseRepository.php @@ -55,7 +55,7 @@ class BaseRepository $className = $this->getEventClass($entity, 'Archived'); if (class_exists($className)) { - event(new $className($entity, $entity->company, Ninja::eventVars())); + event(new $className($entity, $entity->company, Ninja::eventVars(auth()->user()->id))); } } @@ -81,7 +81,7 @@ class BaseRepository $className = $this->getEventClass($entity, 'Restored'); if (class_exists($className)) { - event(new $className($entity, $fromDeleted, $entity->company, Ninja::eventVars())); + event(new $className($entity, $fromDeleted, $entity->company, Ninja::eventVars(auth()->user()->id))); } } @@ -102,7 +102,7 @@ class BaseRepository $className = $this->getEventClass($entity, 'Deleted'); if (class_exists($className) && ! ($entity instanceof Company)) { - event(new $className($entity, $entity->company, Ninja::eventVars())); + event(new $className($entity, $entity->company, Ninja::eventVars(auth()->user()->id))); } } diff --git a/app/Repositories/PaymentRepository.php b/app/Repositories/PaymentRepository.php index b94161609fcc..ae9f7733b37c 100644 --- a/app/Repositories/PaymentRepository.php +++ b/app/Repositories/PaymentRepository.php @@ -155,7 +155,7 @@ class PaymentRepository extends BaseRepository { } if ( ! $is_existing_payment && ! $this->import_mode ) { - event( new PaymentWasCreated( $payment, $payment->company, Ninja::eventVars() ) ); + event( new PaymentWasCreated( $payment, $payment->company, Ninja::eventVars(auth()->user()->id) ) ); } nlog("payment amount = {$payment->amount}"); @@ -205,7 +205,7 @@ class PaymentRepository extends BaseRepository { $payment = $payment->service()->deletePayment(); - event(new PaymentWasDeleted($payment, $payment->company, Ninja::eventVars())); + event(new PaymentWasDeleted($payment, $payment->company, Ninja::eventVars(auth()->user()->id))); return $payment; //return parent::delete($payment); diff --git a/app/Repositories/UserRepository.php b/app/Repositories/UserRepository.php index 826eebb568ab..19c7535c2824 100644 --- a/app/Repositories/UserRepository.php +++ b/app/Repositories/UserRepository.php @@ -123,7 +123,7 @@ class UserRepository extends BaseRepository $cu->forceDelete(); } - event(new UserWasDeleted($user, $company, Ninja::eventVars())); + event(new UserWasDeleted($user, $company, Ninja::eventVars(auth()->user()->id))); $user->delete(); @@ -146,7 +146,7 @@ class UserRepository extends BaseRepository $cu->delete(); } - event(new UserWasDeleted($user, auth()->user(), $company, Ninja::eventVars())); + event(new UserWasDeleted($user, auth()->user(), $company, Ninja::eventVars(auth()->user()->id))); $user->is_deleted = true; $user->save(); @@ -164,7 +164,7 @@ class UserRepository extends BaseRepository $user->delete(); - event(new UserWasArchived($user, auth()->user(), auth()->user()->company, Ninja::eventVars())); + event(new UserWasArchived($user, auth()->user(), auth()->user()->company, Ninja::eventVars(auth()->user()->id))); } @@ -189,7 +189,7 @@ class UserRepository extends BaseRepository $cu->restore(); - event(new UserWasRestored($user, auth()->user(), auth()->user()->company, Ninja::eventVars())); + event(new UserWasRestored($user, auth()->user(), auth()->user()->company, Ninja::eventVars(auth()->user()->id))); } } diff --git a/app/Services/Credit/ApplyPayment.php b/app/Services/Credit/ApplyPayment.php index e97e38c3854b..d7a91a924559 100644 --- a/app/Services/Credit/ApplyPayment.php +++ b/app/Services/Credit/ApplyPayment.php @@ -144,11 +144,11 @@ class ApplyPayment ->ledger() ->updateCreditBalance(($this->amount_applied * -1), "Credit payment applied to Invoice {$this->invoice->number}"); - event(new InvoiceWasUpdated($this->invoice, $this->invoice->company, Ninja::eventVars())); + event(new InvoiceWasUpdated($this->invoice, $this->invoice->company, Ninja::eventVars(auth()->user()->id))); if ((int)$this->invoice->balance == 0) { $this->invoice->service()->deletePdf(); - event(new InvoiceWasPaid($this->invoice, $payment, $this->payment->company, Ninja::eventVars())); + event(new InvoiceWasPaid($this->invoice, $payment, $this->payment->company, Ninja::eventVars(auth()->user()->id))); } } } diff --git a/app/Services/Credit/MarkSent.php b/app/Services/Credit/MarkSent.php index 5b9418e02416..0b39f19a868e 100644 --- a/app/Services/Credit/MarkSent.php +++ b/app/Services/Credit/MarkSent.php @@ -37,7 +37,7 @@ class MarkSent $this->credit->markInvitationsSent(); - event(new CreditWasMarkedSent($this->credit, $this->credit->company, Ninja::eventVars())); + event(new CreditWasMarkedSent($this->credit, $this->credit->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); $this->credit ->service() diff --git a/app/Services/Invoice/HandleCancellation.php b/app/Services/Invoice/HandleCancellation.php index d18c76e5a803..b937ee846694 100644 --- a/app/Services/Invoice/HandleCancellation.php +++ b/app/Services/Invoice/HandleCancellation.php @@ -50,7 +50,7 @@ class HandleCancellation extends AbstractService //adjust client balance $this->invoice->client->service()->updateBalance($adjustment)->save(); - event(new InvoiceWasCancelled($this->invoice, $this->invoice->company, Ninja::eventVars())); + event(new InvoiceWasCancelled($this->invoice, $this->invoice->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); return $this->invoice; } diff --git a/app/Services/Invoice/MarkPaid.php b/app/Services/Invoice/MarkPaid.php index 7f827a5fd842..f325fbf68700 100644 --- a/app/Services/Invoice/MarkPaid.php +++ b/app/Services/Invoice/MarkPaid.php @@ -81,8 +81,8 @@ class MarkPaid extends AbstractService $payment->service()->sendEmail(); /* Update Invoice balance */ - event(new PaymentWasCreated($payment, $payment->company, Ninja::eventVars())); - event(new InvoiceWasPaid($this->invoice, $payment, $payment->company, Ninja::eventVars())); + event(new PaymentWasCreated($payment, $payment->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); + event(new InvoiceWasPaid($this->invoice, $payment, $payment->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); $payment->ledger() ->updatePaymentBalance($payment->amount * -1); diff --git a/app/Services/Invoice/MarkSent.php b/app/Services/Invoice/MarkSent.php index c5149a462577..f212666fd27a 100644 --- a/app/Services/Invoice/MarkSent.php +++ b/app/Services/Invoice/MarkSent.php @@ -54,7 +54,7 @@ class MarkSent extends AbstractService $this->invoice->ledger()->updateInvoiceBalance($this->invoice->balance, "Invoice {$this->invoice->number} marked as sent."); - event(new InvoiceWasUpdated($this->invoice, $this->invoice->company, Ninja::eventVars())); + event(new InvoiceWasUpdated($this->invoice, $this->invoice->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); return $this->invoice->fresh(); } diff --git a/app/Services/Payment/RefundPayment.php b/app/Services/Payment/RefundPayment.php index 2e7de5277a91..74803a8e7f1d 100644 --- a/app/Services/Payment/RefundPayment.php +++ b/app/Services/Payment/RefundPayment.php @@ -112,10 +112,10 @@ class RefundPayment if (isset($this->refund_data['invoices'])) { foreach ($this->refund_data['invoices'] as $invoice) { $fields->invoice_id = $invoice['invoice_id']; - $activity_repo->save($fields, $this->payment, Ninja::eventVars()); + $activity_repo->save($fields, $this->payment, Ninja::eventVars(auth()->user()->id)); } } else { - $activity_repo->save($fields, $this->payment, Ninja::eventVars()); + $activity_repo->save($fields, $this->payment, Ninja::eventVars(auth()->user()->id)); } return $this; diff --git a/app/Services/Quote/MarkSent.php b/app/Services/Quote/MarkSent.php index d91617324708..7a4417ee6e31 100644 --- a/app/Services/Quote/MarkSent.php +++ b/app/Services/Quote/MarkSent.php @@ -45,7 +45,7 @@ class MarkSent $this->quote->due_date = Carbon::parse($this->quote->date)->addDays($this->quote->client->getSetting('valid_until')); } - event(new QuoteWasMarkedSent($this->quote, $this->quote->company, Ninja::eventVars())); + event(new QuoteWasMarkedSent($this->quote, $this->quote->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); $this->quote ->service() diff --git a/app/Services/Subscription/SubscriptionService.php b/app/Services/Subscription/SubscriptionService.php index 494e53d2b141..651d4a8b84a1 100644 --- a/app/Services/Subscription/SubscriptionService.php +++ b/app/Services/Subscription/SubscriptionService.php @@ -183,20 +183,21 @@ class SubscriptionService return redirect('/client/recurring_invoices/'.$recurring_invoice->hashed_id); } - public function calculateUpgradePrice(RecurringInvoice $recurring_invoice, Subscription $target) + public function calculateUpgradePrice(RecurringInvoice $recurring_invoice, Subscription $target) :?float { //calculate based on daily prices $current_amount = $recurring_invoice->amount; $currency_frequency = $recurring_invoice->frequency_id; - $outstanding = $recurring_invoice->invoices + $outstanding = $recurring_invoice->invoices() ->where('is_deleted', 0) ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]) ->where('balance', '>', 0); $outstanding_amounts = $outstanding->sum('balance'); - $outstanding_invoices = $outstanding->get(); + // $outstanding_invoices = $outstanding->get(); + $outstanding_invoices = $outstanding; if ($outstanding->count() == 0){ //nothing outstanding @@ -206,14 +207,17 @@ class SubscriptionService //user has multiple amounts outstanding return $target->price - $this->calculateProRataRefund($outstanding->first()); } - elseif ($outstanding->count > 1) { + elseif ($outstanding->count() > 1) { //user is changing plan mid frequency cycle //we cannot handle this if there are more than one invoice outstanding. + return null; } + return null; + } - private function calculateProRataRefund($invoice) + private function calculateProRataRefund($invoice) :float { //determine the start date @@ -234,11 +238,25 @@ class SubscriptionService //Data array structure /** * [ + * 'recurring_invoice' => RecurringInvoice::class, * 'subscription' => Subscription::class, * 'target' => Subscription::class * ] */ + $outstanding_invoice = $recurring_invoice->invoices() + ->where('is_deleted', 0) + ->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]) + ->where('balance', '>', 0) + ->first(); + + + // we calculate the pro rata refund for this invoice. + if($outstanding_invoice) + { + + } + //logic // Is the user paid up to date? ie are there any outstanding invoices for this subscription diff --git a/app/Utils/Ninja.php b/app/Utils/Ninja.php index e5b55d90b9cd..4107c3cdacd7 100644 --- a/app/Utils/Ninja.php +++ b/app/Utils/Ninja.php @@ -111,12 +111,13 @@ class Ninja curl_close($ch); } - public static function eventVars() + public static function eventVars($user_id = null) { return [ 'ip' => request()->getClientIp(), 'token' => request()->header('X-API-TOKEN'), 'is_system' => app()->runningInConsole(), + 'user_id' => $user_id, ]; } diff --git a/app/Utils/PhantomJS/Phantom.php b/app/Utils/PhantomJS/Phantom.php index 3f2945cfbb42..a9efb57941fd 100644 --- a/app/Utils/PhantomJS/Phantom.php +++ b/app/Utils/PhantomJS/Phantom.php @@ -11,6 +11,7 @@ namespace App\Utils\PhantomJS; +use App\Exceptions\PhantomPDFFailure; use App\Jobs\Util\SystemLogger; use App\Models\CreditInvitation; use App\Models\Design; @@ -91,8 +92,6 @@ class Phantom $instance = Storage::disk(config('filesystems.default'))->put($file_path, $pdf); -// nlog($instance); -// nlog($file_path); return $file_path; } @@ -128,6 +127,8 @@ class Phantom SystemLog::TYPE_PDF_FAILURE, $invitation->contact->client ); + + throw new PhantomPDFFailure('There was an error generating the PDF with Phantom JS'); } else { diff --git a/app/Utils/Traits/Payment/Refundable.php b/app/Utils/Traits/Payment/Refundable.php index 39636065f01a..5d9e8f6e82b7 100644 --- a/app/Utils/Traits/Payment/Refundable.php +++ b/app/Utils/Traits/Payment/Refundable.php @@ -211,10 +211,10 @@ trait Refundable foreach ($data['invoices'] as $invoice) { $fields->invoice_id = $invoice->id; - $activity_repo->save($fields, $this, Ninja::eventVars()); + $activity_repo->save($fields, $this, Ninja::eventVars(auth()->user()->id)); } } else { - $activity_repo->save($fields, $this, Ninja::eventVars()); + $activity_repo->save($fields, $this, Ninja::eventVars(auth()->user()->id)); } } diff --git a/app/Utils/Traits/Pdf/PdfMaker.php b/app/Utils/Traits/Pdf/PdfMaker.php index 95343e425703..0d26f5eff0df 100644 --- a/app/Utils/Traits/Pdf/PdfMaker.php +++ b/app/Utils/Traits/Pdf/PdfMaker.php @@ -12,6 +12,7 @@ namespace App\Utils\Traits\Pdf; +use App\Exceptions\InternalPDFFailure; use Beganovich\Snappdf\Snappdf; trait PdfMaker @@ -33,8 +34,14 @@ trait PdfMaker $pdf->setChromiumPath(config('ninja.snappdf_chromium_path')); } - return $pdf - ->setHtml($html) - ->generate(); + $generated = $pdf + ->setHtml($html) + ->generate(); + + if($generated) + return $generated; + + + throw new InternalPDFFailure('There was an issue generating the PDF locally'); } } diff --git a/composer.json b/composer.json index 9b29fe5258b5..29da3c0fb585 100644 --- a/composer.json +++ b/composer.json @@ -77,9 +77,9 @@ "brianium/paratest": "^6.1", "darkaonline/l5-swagger": "^8.0", "facade/ignition": "^2.3.6", + "fakerphp/faker": "^1.14", "filp/whoops": "^2.7", "friendsofphp/php-cs-fixer": "^2.16", - "fakerphp/faker": "^1.14", "mockery/mockery": "^1.3.1", "nunomaduro/collision": "^5.0", "phpunit/phpunit": "^9.0", diff --git a/composer.lock b/composer.lock index e426f659b282..27906d3c6663 100644 --- a/composer.lock +++ b/composer.lock @@ -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": "56b8467dfddd19762a9124d0624a5003", + "content-hash": "7ccb8d2434343dfb0ba62866f0ee919a", "packages": [ { "name": "authorizenet/authorizenet", @@ -11718,6 +11718,103 @@ ], "time": "2021-01-25T15:34:13+00:00" }, + { + "name": "nunomaduro/larastan", + "version": "v0.7.3", + "source": { + "type": "git", + "url": "https://github.com/nunomaduro/larastan.git", + "reference": "9c515d46851dca5a99fc82c0a69392c362b7affd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nunomaduro/larastan/zipball/9c515d46851dca5a99fc82c0a69392c362b7affd", + "reference": "9c515d46851dca5a99fc82c0a69392c362b7affd", + "shasum": "" + }, + "require": { + "composer/composer": "^1.0 || ^2.0", + "ext-json": "*", + "illuminate/console": "^6.0 || ^7.0 || ^8.0 || ^9.0", + "illuminate/container": "^6.0 || ^7.0 || ^8.0 || ^9.0", + "illuminate/contracts": "^6.0 || ^7.0 || ^8.0 || ^9.0", + "illuminate/database": "^6.0 || ^7.0 || ^8.0 || ^9.0", + "illuminate/http": "^6.0 || ^7.0 || ^8.0 || ^9.0", + "illuminate/pipeline": "^6.0 || ^7.0 || ^8.0 || ^9.0", + "illuminate/support": "^6.0 || ^7.0 || ^8.0 || ^9.0", + "mockery/mockery": "^0.9 || ^1.0", + "php": "^7.2 || ^8.0", + "phpstan/phpstan": "^0.12.83", + "symfony/process": "^4.3 || ^5.0" + }, + "require-dev": { + "orchestra/testbench": "^4.0 || ^5.0 || ^6.0 || ^7.0", + "phpunit/phpunit": "^7.3 || ^8.2 || ^9.3" + }, + "suggest": { + "orchestra/testbench": "^4.0 || ^5.0" + }, + "type": "phpstan-extension", + "extra": { + "branch-alias": { + "dev-master": "0.6-dev" + }, + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "NunoMaduro\\Larastan\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nuno Maduro", + "email": "enunomaduro@gmail.com" + } + ], + "description": "Larastan - Discover bugs in your code without running it. A phpstan/phpstan wrapper for Laravel", + "keywords": [ + "PHPStan", + "code analyse", + "code analysis", + "larastan", + "laravel", + "package", + "php", + "static analysis" + ], + "support": { + "issues": "https://github.com/nunomaduro/larastan/issues", + "source": "https://github.com/nunomaduro/larastan/tree/v0.7.3" + }, + "funding": [ + { + "url": "https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=66BYDWAT92N6L", + "type": "custom" + }, + { + "url": "https://github.com/canvural", + "type": "github" + }, + { + "url": "https://github.com/nunomaduro", + "type": "github" + }, + { + "url": "https://www.patreon.com/nunomaduro", + "type": "patreon" + } + ], + "time": "2021-04-12T11:01:46+00:00" + }, { "name": "openlss/lib-array2xml", "version": "1.0.0", @@ -12162,6 +12259,66 @@ }, "time": "2021-03-17T13:42:18+00:00" }, + { + "name": "phpstan/phpstan", + "version": "0.12.83", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpstan.git", + "reference": "4a967cec6efb46b500dd6d768657336a3ffe699f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpstan/zipball/4a967cec6efb46b500dd6d768657336a3ffe699f", + "reference": "4a967cec6efb46b500dd6d768657336a3ffe699f", + "shasum": "" + }, + "require": { + "php": "^7.1|^8.0" + }, + "conflict": { + "phpstan/phpstan-shim": "*" + }, + "bin": [ + "phpstan", + "phpstan.phar" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "0.12-dev" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPStan - PHP Static Analysis Tool", + "support": { + "issues": "https://github.com/phpstan/phpstan/issues", + "source": "https://github.com/phpstan/phpstan/tree/0.12.83" + }, + "funding": [ + { + "url": "https://github.com/ondrejmirtes", + "type": "github" + }, + { + "url": "https://www.patreon.com/phpstan", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpstan/phpstan", + "type": "tidelift" + } + ], + "time": "2021-04-03T15:35:45+00:00" + }, { "name": "phpunit/php-code-coverage", "version": "9.2.6", diff --git a/database/migrations/2021_04_13_013424_add_subscription_id_to_activities_table.php b/database/migrations/2021_04_13_013424_add_subscription_id_to_activities_table.php new file mode 100644 index 000000000000..9b8a389ac5b4 --- /dev/null +++ b/database/migrations/2021_04_13_013424_add_subscription_id_to_activities_table.php @@ -0,0 +1,32 @@ +unsignedInteger('subscription_id')->nullable(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('activities', function (Blueprint $table) { + // + }); + } +} diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index f1668102b436..76df1c0f39f1 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -4203,6 +4203,12 @@ $LANG = array( 'promo_code' => 'Promo code', 'recurring_invoice_issued_to' => 'Recurring invoice issued to', 'subscription' => 'Subscription', + + 'activity_80' => ':user created subscription :subscription', + 'activity_81' => ':user updated subscription :subscription', + 'activity_82' => ':user archived subscription :subscription', + 'activity_83' => ':user deleted subscription :subscription', + 'activity_84' => ':user restored subscription :subscription', ); return $LANG; diff --git a/resources/views/portal/ninja2020/subscriptions/denied.blade.php b/resources/views/portal/ninja2020/subscriptions/denied.blade.php new file mode 100644 index 000000000000..e7bc71bee704 --- /dev/null +++ b/resources/views/portal/ninja2020/subscriptions/denied.blade.php @@ -0,0 +1,25 @@ +@extends('portal.ninja2020.layout.app') +@section('meta_title', ctrans('texts.subscriptions')) + +@section('body') +
{{ $subscription->name }}
+Cannot upgrade / downgrade as you have one of more invoices outstanding
+Placeholder text for plan notes, some text.
+ {{ ctrans('texts.current') }} +{{ $subscription->name }}
Placeholder text for plan notes, some text.
+ {{ ctrans('texts.change') }} +{{ $target->name }}