From e5d5b9d25ca1046b4e1767ba2b26aa41edbec156 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 11 Aug 2023 14:18:58 +1000 Subject: [PATCH] Static analysis --- app/DataMapper/CompanySettings.php | 2 + app/Filters/PaymentFilters.php | 5 +- app/Http/Controllers/MigrationController.php | 1 + .../Controllers/OneTimeTokenController.php | 1 + .../PreviewPurchaseOrderController.php | 4 +- .../Controllers/StripeConnectController.php | 58 ++++++----------- app/Jobs/PurchaseOrder/ZipPurchaseOrders.php | 3 - app/Models/BaseModel.php | 11 +++- app/Models/Credit.php | 47 +++++++------- app/Models/CreditInvitation.php | 10 +-- app/Models/Invoice.php | 7 +- app/Models/InvoiceInvitation.php | 10 +-- app/Models/PurchaseOrder.php | 29 +++++---- app/Models/PurchaseOrderInvitation.php | 10 +-- app/Models/Quote.php | 7 +- app/Models/QuoteInvitation.php | 10 +-- app/Models/RecurringInvoice.php | 1 + app/Models/RecurringInvoiceInvitation.php | 10 +-- app/Models/User.php | 1 + app/Models/Vendor.php | 43 ++++--------- .../Jobs/PaymentIntentFailureWebhook.php | 4 +- .../Stripe/UpdatePaymentMethods.php | 27 +++++--- app/Services/Client/ClientService.php | 3 +- app/Services/Pdf/PdfMock.php | 18 +++--- app/Services/Preview/StubBuilder.php | 15 ++++- .../BankIntegrationTransformer.php | 1 + .../CompanyGatewayTransformer.php | 5 +- composer.json | 1 + composer.lock | 64 ++++++++++++++++++- phpstan.neon | 1 + .../views/auth/connect/completed.blade.php | 2 +- 31 files changed, 238 insertions(+), 173 deletions(-) diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index 91871e2ae6e3..141762d8ed91 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -820,6 +820,8 @@ class CompanySettings extends BaseSettings { $company_settings = (object) get_class_vars(self::class); + $settings = new \stdClass; + foreach ($company_settings as $key => $value) { if (! property_exists($settings, $key)) { $settings->{$key} = self::castAttribute($key, $company_settings->{$key}); diff --git a/app/Filters/PaymentFilters.php b/app/Filters/PaymentFilters.php index 92c1a7827812..38381ed786bb 100644 --- a/app/Filters/PaymentFilters.php +++ b/app/Filters/PaymentFilters.php @@ -12,6 +12,7 @@ namespace App\Filters; use App\Models\Payment; +use Illuminate\Contracts\Database\Eloquent\Builder as EloquentBuilder; use Illuminate\Database\Eloquent\Builder; /** @@ -117,6 +118,8 @@ class PaymentFilters extends QueryFilters /** * Returns a list of payments that can be matched to bank transactions + * @param ?string $value + * @return Builder */ public function match_transactions($value = 'true'): Builder { @@ -124,7 +127,7 @@ class PaymentFilters extends QueryFilters if ($value == 'true') { return $this->builder ->where('is_deleted', 0) - ->where(function ($query) { + ->where(function (Builder $query) { $query->whereNull('transaction_id') ->orWhere("transaction_id", "") ->company(); diff --git a/app/Http/Controllers/MigrationController.php b/app/Http/Controllers/MigrationController.php index 55f8979d8737..217d29ed5e64 100644 --- a/app/Http/Controllers/MigrationController.php +++ b/app/Http/Controllers/MigrationController.php @@ -301,6 +301,7 @@ class MigrationController extends BaseController $user = auth()->user(); $company_count = $user->account->companies()->count(); + $fresh_company = false; // Look for possible existing company (based on company keys). $existing_company = Company::whereRaw('BINARY `company_key` = ?', [$company['company_key']])->first(); diff --git a/app/Http/Controllers/OneTimeTokenController.php b/app/Http/Controllers/OneTimeTokenController.php index 2d387a0fc998..b065a50529ac 100644 --- a/app/Http/Controllers/OneTimeTokenController.php +++ b/app/Http/Controllers/OneTimeTokenController.php @@ -74,6 +74,7 @@ class OneTimeTokenController extends BaseController 'user_id' => $user->id, 'company_key'=> $user->company()->company_key, 'context' => $request->input('context'), + 'is_react' => $request->has('react') && $request->query('react') == 'true' ? true : false, ]; Cache::put($hash, $data, 3600); diff --git a/app/Http/Controllers/PreviewPurchaseOrderController.php b/app/Http/Controllers/PreviewPurchaseOrderController.php index 8ef2da0d514f..81d823cf254a 100644 --- a/app/Http/Controllers/PreviewPurchaseOrderController.php +++ b/app/Http/Controllers/PreviewPurchaseOrderController.php @@ -181,8 +181,8 @@ class PreviewPurchaseOrderController extends BaseController DB::connection(config('database.default'))->beginTransaction(); if ($request->has('entity_id')) { - /** @var \App\Models\PurchaseOrder|\Illuminate\Database\Eloquent\Builder $entity_obj **/ - $entity_obj = $class::on(config('database.default')) + /** @var \App\Models\PurchaseOrder|\Illuminate\Contracts\Database\Eloquent\Builder $entity_obj **/ + $entity_obj = \App\Models\PurchaseOrder::on(config('database.default')) ->with('vendor.company') ->where('id', $this->decodePrimaryKey($request->input('entity_id'))) ->where('company_id', $company->id) diff --git a/app/Http/Controllers/StripeConnectController.php b/app/Http/Controllers/StripeConnectController.php index 691d8602fd3a..b2e2bf70d421 100644 --- a/app/Http/Controllers/StripeConnectController.php +++ b/app/Http/Controllers/StripeConnectController.php @@ -32,7 +32,6 @@ class StripeConnectController extends BaseController */ public function initialize(InitializeStripeConnectRequest $request, string $token) { - // Should we check if company has set country in the ap? Otherwise this will fail. if (! is_array($request->getTokenContent())) { abort(400, 'Invalid token'); @@ -40,8 +39,6 @@ class StripeConnectController extends BaseController MultiDB::findAndSetDbByCompanyKey($request->getTokenContent()['company_key']); - $company = Company::where('company_key', $request->getTokenContent()['company_key'])->first(); - $company_gateway = CompanyGateway::query() ->where('gateway_key', 'd14dd26a47cecc30fdd65700bfb67b34') ->where('company_id', $request->getCompany()->id) @@ -71,6 +68,20 @@ class StripeConnectController extends BaseController } try { + /** @class \stdClass $response + * @property string $scope + * @property string $stripe_user_id + * @property string $stripe_publishable_key + * @property string $refresh_token + * @property string $livemode + * @property string $access_token + * @property string $token_type + * @property string $stripe_user + * @property string $stripe_account + * @property string $error + */ + + /** @var \stdClass $response */ $response = \Stripe\OAuth::token([ 'grant_type' => 'authorization_code', 'code' => $request->input('code'), @@ -81,8 +92,7 @@ class StripeConnectController extends BaseController MultiDB::findAndSetDbByCompanyKey($request->getTokenContent()['company_key']); - /** @var \App\Models\Company $company */ - $company = Company::where('company_key', $request->getTokenContent()['company_key'])->first(); + $company = Company::query()->where('company_key', $request->getTokenContent()['company_key'])->first(); $company_gateway = CompanyGateway::query() ->where('gateway_key', 'd14dd26a47cecc30fdd65700bfb67b34') @@ -97,7 +107,6 @@ class StripeConnectController extends BaseController $company_gateway->fees_and_limits = $fees_and_limits; $company_gateway->setConfig([]); $company_gateway->token_billing = 'always'; - // $company_gateway->save(); } $payload = [ @@ -116,39 +125,14 @@ class StripeConnectController extends BaseController $company_gateway->save(); // StripeWebhook::dispatch($company->company_key, $company_gateway->id); - - //response here - return view('auth.connect.completed'); - } - - private function checkAccountAlreadyLinkToEmail($company_gateway, $email) - { - $client = Client::first() ? Client::first() : new Client; - - //Pull the list of Stripe Accounts and see if we match - $accounts = $company_gateway->driver($client)->getAllConnectedAccounts()->data; - - foreach ($accounts as $account) { - if ($account['email'] == $email) { - return $account['id']; - } + if(isset($request->getTokenContent()['is_react']) && $request->getTokenContent()['is_react']) { + $redirect_uri = 'https://app.invoicing.co/#/settings/online_payments'; + } else { + $redirect_uri = 'https://invoicing.co/stripe/completed'; } - return false; + //response here + return view('auth.connect.completed', ['url' => $redirect_uri]); } - /********************************* - * Stripe OAuth - */ - - // public function initialize(InitializeStripeConnectRequest $request, string $token) - // { - - // $stripe_key = config('ninja.ninja_stripe_key'); - - // $endpoint = "https://connect.stripe.com/oauth/authorize?response_type=code&client_id={$stripe_key}&scope=read_write"; - - // return redirect($endpoint); - - // } } diff --git a/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php b/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php index 8d9a14a76026..ae545c66626c 100644 --- a/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php +++ b/app/Jobs/PurchaseOrder/ZipPurchaseOrders.php @@ -62,9 +62,6 @@ class ZipPurchaseOrders implements ShouldQueue * Execute the job. * * @return void - * @throws \ZipStream\Exception\FileNotFoundException - * @throws \ZipStream\Exception\FileNotReadableException - * @throws \ZipStream\Exception\OverflowException */ public function handle() { diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index 09f5571565df..f216635c28d1 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -37,7 +37,6 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @property int $assigned_user_id * @method BaseModel service() * @property \App\Models\Company $company - * @property \App\Models\Vendor $vendor * @method static BaseModel find($value) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel|Illuminate\Database\Eloquent\Relations\BelongsTo|\Awobaz\Compoships\Database\Eloquent\Relations\BelongsTo|\App\Models\Company company() @@ -63,11 +62,15 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @method int companyId() * @method createInvitations() * @method Builder scopeCompany(Builder $builder) + * @method static \Illuminate\Database\Eloquent\Builder company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel|\Illuminate\Database\Query\Builder withTrashed(bool $withTrashed = true) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel|\Illuminate\Database\Query\Builder onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel|\Illuminate\Database\Query\Builder withoutTrashed() * @mixin \Eloquent * @mixin \Illuminate\Database\Eloquent\Builder + * + * @property \Illuminate\Support\Collection $tax_map + * @property array $total_tax_map */ class BaseModel extends Model { @@ -119,7 +122,11 @@ class BaseModel extends Model return parent::__call($method, $params); } - + /** + * @param \Illuminate\Database\Eloquent\Builder $query + * @extends \Illuminate\Database\Eloquent\Builder + * @return \Illuminate\Database\Eloquent\Builder + */ public function scopeCompany($query): \Illuminate\Database\Eloquent\Builder { /** @var \App\Models\User $user */ diff --git a/app/Models/Credit.php b/app/Models/Credit.php index 8a4dc2ea642d..a9a849dd74d1 100644 --- a/app/Models/Credit.php +++ b/app/Models/Credit.php @@ -93,29 +93,30 @@ use Illuminate\Database\Eloquent\Relations\MorphMany; * @property string|null $reminder_last_sent * @property float $paid_to_date * @property int|null $subscription_id - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read int|null $activities_count - * @property-read \App\Models\User|null $assigned_user - * @property-read \App\Models\Client $client - * @property-read \App\Models\Company $company - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read int|null $company_ledger_count - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read int|null $documents_count - * @property-read mixed $hashed_id - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read int|null $history_count - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read int|null $invitations_count - * @property-read \App\Models\Invoice|null $invoice - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read int|null $invoices_count - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read int|null $payments_count - * @property-read \App\Models\Project|null $project - * @property-read \App\Models\User $user - * @property-read \App\Models\Client $client - * @property-read \App\Models\Vendor|null $vendor + * @property \Illuminate\Database\Eloquent\Collection $activities + * @property int|null $activities_count + * @property \App\Models\User|null $assigned_user + * @property \App\Models\Client $client + * @property \App\Models\Company $company + * @property \App\Models\CreditInvitation $invitation + * @property \Illuminate\Database\Eloquent\Collection $company_ledger + * @property int|null $company_ledger_count + * @property \Illuminate\Database\Eloquent\Collection $documents + * @property int|null $documents_count + * @property mixed $hashed_id + * @property \Illuminate\Database\Eloquent\Collection $history + * @property int|null $history_count + * @property \Illuminate\Database\Eloquent\Collection $invitations + * @property int|null $invitations_count + * @property \App\Models\Invoice|null $invoice + * @property \Illuminate\Database\Eloquent\Collection $invoices + * @property int|null $invoices_count + * @property \Illuminate\Database\Eloquent\Collection $payments + * @property int|null $payments_count + * @property \App\Models\Project|null $project + * @property \App\Models\User $user + * @property \App\Models\Client $client + * @property \App\Models\Vendor|null $vendor * @property-read mixed $pivot * @property-read \Illuminate\Database\Eloquent\Collection $activities * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger diff --git a/app/Models/CreditInvitation.php b/app/Models/CreditInvitation.php index 1c29cd73b75a..ca5d8a2fb27b 100644 --- a/app/Models/CreditInvitation.php +++ b/app/Models/CreditInvitation.php @@ -41,11 +41,11 @@ use Illuminate\Support\Facades\Storage; * @property int|null $deleted_at * @property string|null $signature_ip * @property string|null $email_status - * @property-read \App\Models\Company $company - * @property-read \App\Models\ClientContact $contact - * @property-read \App\Models\Credit $credit - * @property-read mixed $hashed_id - * @property-read \App\Models\User $user + * @property \App\Models\Company $company + * @property \App\Models\ClientContact $contact + * @property \App\Models\Credit $credit + * @property mixed $hashed_id + * @property \App\Models\User $user * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) * @method static \Database\Factories\CreditInvitationFactory factory($count = null, $state = []) diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 6f03027ad6af..b160ff0be709 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -99,12 +99,13 @@ use App\Events\Invoice\InvoiceReminderWasEmailed; * @property int $auto_bill_tries * @property bool $is_proforma * @property-read int|null $activities_count - * @property-read \App\Models\User|null $assigned_user + * @property \App\Models\User|null $assigned_user * @property \App\Models\Client $client - * @property-read \App\Models\Company $company + * @property \App\Models\InvoiceInvitation $invitation + * @property \App\Models\Company $company * @property-read int|null $company_ledger_count * @property-read int|null $credits_count - * @property-read \App\Models\Design|null $design + * @property \App\Models\Design|null $design * @property-read int|null $documents_count * @property-read \App\Models\Expense|null $expense * @property-read int|null $expenses_count diff --git a/app/Models/InvoiceInvitation.php b/app/Models/InvoiceInvitation.php index bd4e24f75d1a..08513619b003 100644 --- a/app/Models/InvoiceInvitation.php +++ b/app/Models/InvoiceInvitation.php @@ -43,11 +43,11 @@ use Illuminate\Support\Facades\Storage; * @property int|null $deleted_at * @property string|null $signature_ip * @property string|null $email_status - * @property-read \App\Models\Company $company - * @property-read \App\Models\ClientContact $contact - * @property-read mixed $hashed_id - * @property-read \App\Models\Invoice $invoice - * @property-read \App\Models\User $user + * @property \App\Models\Company $company + * @property \App\Models\ClientContact $contact + * @property mixed $hashed_id + * @property \App\Models\Invoice $invoice + * @property \App\Models\User $user * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) * @method static \Database\Factories\InvoiceInvitationFactory factory($count = null, $state = []) diff --git a/app/Models/PurchaseOrder.php b/app/Models/PurchaseOrder.php index 932d2ba9b935..cf4841147e6e 100644 --- a/app/Models/PurchaseOrder.php +++ b/app/Models/PurchaseOrder.php @@ -87,17 +87,17 @@ use Illuminate\Support\Facades\Storage; * @property int|null $expense_id * @property int|null $currency_id * @property-read int|null $activities_count - * @property-read \App\Models\User|null $assigned_user - * @property-read \App\Models\Client|null $client - * @property-read \App\Models\Company $company + * @property \App\Models\User|null $assigned_user + * @property \App\Models\Client|null $client + * @property \App\Models\Company $company * @property-read int|null $documents_count - * @property-read \App\Models\Expense|null $expense - * @property-read mixed $hashed_id - * @property-read \App\Models\Invoice|null $invoice - * @property-read \App\Models\Project|null $project - * @property-read \App\Models\User $user - * @property \App\Models\Vendor|null $vendor - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder company() + * @property \App\Models\Expense|null $expense + * @property string $hashed_id + * @property \App\Models\Invoice|null $invoice + * @property \App\Models\Project|null $project + * @property \App\Models\User $user + * @property \App\Models\Vendor $vendor + * @property \App\Models\PurchaseOrderInvitation $invitation * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder exclude($columns) * @method static \Database\Factories\PurchaseOrderFactory factory($count = null, $state = []) * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder filter(\App\Filters\QueryFilters $filters) @@ -110,10 +110,8 @@ use Illuminate\Support\Facades\Storage; * @property-read \Illuminate\Database\Eloquent\Collection $documents * @property-read \Illuminate\Database\Eloquent\Collection $history * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @method static \Illuminate\Database\Eloquent\Builder|Task withTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|Task withoutTrashed() + * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder withTrashed() + * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder withoutTrashed() * @mixin \Eloquent */ class PurchaseOrder extends BaseModel @@ -236,6 +234,9 @@ class PurchaseOrder extends BaseModel return $this->belongsTo(User::class, 'assigned_user_id', 'id')->withTrashed(); } + /** + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ public function vendor(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Vendor::class)->withTrashed(); diff --git a/app/Models/PurchaseOrderInvitation.php b/app/Models/PurchaseOrderInvitation.php index be8e8f4dee80..8599090ed286 100644 --- a/app/Models/PurchaseOrderInvitation.php +++ b/app/Models/PurchaseOrderInvitation.php @@ -40,11 +40,11 @@ use Illuminate\Support\Str; * @property int|null $updated_at * @property int|null $deleted_at * @property string|null $email_status - * @property-read \App\Models\Company $company - * @property-read \App\Models\VendorContact $contact - * @property-read mixed $hashed_id - * @property-read \App\Models\PurchaseOrder $purchase_order - * @property-read \App\Models\User $user + * @property \App\Models\Company $company + * @property \App\Models\VendorContact $contact + * @property string $hashed_id + * @property \App\Models\PurchaseOrder $purchase_order + * @property \App\Models\User $user * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) * @method static \Database\Factories\PurchaseOrderInvitationFactory factory($count = null, $state = []) diff --git a/app/Models/Quote.php b/app/Models/Quote.php index 38a3443460da..551d6b3a45a2 100644 --- a/app/Models/Quote.php +++ b/app/Models/Quote.php @@ -91,9 +91,10 @@ use Laracasts\Presenter\PresentableTrait; * @property string|null $reminder_last_sent * @property string $paid_to_date * @property int|null $subscription_id - * @property-read \App\Models\User|null $assigned_user - * @property-read \App\Models\Client $client - * @property-read \App\Models\Company $company + * @property \App\Models\User|null $assigned_user + * @property \App\Models\Client $client + * @property \App\Models\Company $company + * @property \App\Models\QuoteInvitation $invitation * @property-read mixed $balance_due * @property-read mixed $hashed_id * @property-read mixed $total diff --git a/app/Models/QuoteInvitation.php b/app/Models/QuoteInvitation.php index fcd20852f77c..a183d3d5b63f 100644 --- a/app/Models/QuoteInvitation.php +++ b/app/Models/QuoteInvitation.php @@ -41,11 +41,11 @@ use Illuminate\Support\Facades\Storage; * @property int|null $deleted_at * @property string|null $signature_ip * @property string|null $email_status - * @property-read \App\Models\Company $company - * @property-read \App\Models\ClientContact $contact - * @property-read mixed $hashed_id - * @property-read \App\Models\Quote $quote - * @property-read \App\Models\User $user + * @property \App\Models\Company $company + * @property \App\Models\ClientContact $contact + * @property mixed $hashed_id + * @property \App\Models\Quote $quote + * @property \App\Models\User $user * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) * @method static \Database\Factories\QuoteInvitationFactory factory($count = null, $state = []) diff --git a/app/Models/RecurringInvoice.php b/app/Models/RecurringInvoice.php index 248f946fe9ce..44e8c61265cf 100644 --- a/app/Models/RecurringInvoice.php +++ b/app/Models/RecurringInvoice.php @@ -91,6 +91,7 @@ use Laracasts\Presenter\PresentableTrait; * @property-read \App\Models\User|null $assigned_user * @property-read \App\Models\Client $client * @property-read \App\Models\Company $company + * @property \App\Models\RecurringInvoiceInvitation $invitation * @property-read \Illuminate\Database\Eloquent\Collection $documents * @property-read int|null $documents_count * @property-read mixed $hashed_id diff --git a/app/Models/RecurringInvoiceInvitation.php b/app/Models/RecurringInvoiceInvitation.php index 01e2c088ce73..34928a155c1d 100644 --- a/app/Models/RecurringInvoiceInvitation.php +++ b/app/Models/RecurringInvoiceInvitation.php @@ -37,11 +37,11 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property string|null $viewed_date * @property string|null $opened_date * @property string|null $email_status - * @property-read \App\Models\Company $company - * @property-read \App\Models\ClientContact $contact - * @property-read mixed $hashed_id - * @property-read \App\Models\RecurringInvoice $recurring_invoice - * @property-read \App\Models\User $user + * @property \App\Models\Company $company + * @property \App\Models\ClientContact $contact + * @property string $hashed_id + * @property \App\Models\RecurringInvoice $recurring_invoice + * @property \App\Models\User $user * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) * @method static \Illuminate\Database\Eloquent\Builder|RecurringInvoiceInvitation newModelQuery() diff --git a/app/Models/User.php b/app/Models/User.php index 4e9a2864d69b..98a11089042b 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -95,6 +95,7 @@ use Illuminate\Foundation\Auth\User as Authenticatable; * @property-read \Illuminate\Database\Eloquent\Collection $company_users * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications * @property-read \Illuminate\Database\Eloquent\Collection $tokens + * @property-read \Illuminate\Database\Eloquent\Collection $companies * @method bool hasPermissionTo(string $permission) * @method \App\Models\Company getCompany() * @method \App\Models\Company company() diff --git a/app/Models/Vendor.php b/app/Models/Vendor.php index d72061bad7fa..a055ed7992b4 100644 --- a/app/Models/Vendor.php +++ b/app/Models/Vendor.php @@ -66,7 +66,6 @@ use Laracasts\Presenter\PresentableTrait; * @property-read \Illuminate\Database\Eloquent\Collection $primary_contact * @property-read int|null $primary_contact_count * @property-read \App\Models\User $user - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) * @method static \Database\Factories\VendorFactory factory($count = null, $state = []) * @method static \Illuminate\Database\Eloquent\Builder|Vendor filter(\App\Filters\QueryFilters $filters) @@ -75,35 +74,6 @@ use Laracasts\Presenter\PresentableTrait; * @method static \Illuminate\Database\Eloquent\Builder|Vendor onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Vendor query() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereAddress1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereAddress2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereAssignedUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereCity($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereCompanyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereCountryId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereCurrencyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereCustomValue1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereCustomValue2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereCustomValue3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereCustomValue4($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereDeletedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereIdNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereIsDeleted($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor wherePhone($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor wherePostalCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor wherePrivateNotes($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor wherePublicNotes($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereState($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereTransactionName($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereVatNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereVendorHash($value) - * @method static \Illuminate\Database\Eloquent\Builder|Vendor whereWebsite($value) * @method static \Illuminate\Database\Eloquent\Builder|Vendor withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Vendor withoutTrashed() * @property-read \Illuminate\Database\Eloquent\Collection $activities @@ -215,6 +185,9 @@ class Vendor extends BaseModel return $this->company->timezone(); } + /** + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ public function company(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Company::class); @@ -225,7 +198,7 @@ class Vendor extends BaseModel return $this->belongsTo(User::class)->withTrashed(); } - public function translate_entity() + public function translate_entity(): string { return ctrans('texts.vendor'); } @@ -253,7 +226,13 @@ class Vendor extends BaseModel return $defaults; } - public function getSetting($setting) + /** + * Returns a vendor settings proxying company setting + * + * @param string $setting + * @return string + */ + public function getSetting($setting): string { if ((property_exists($this->company->settings, $setting) != false) && (isset($this->company->settings->{$setting}) !== false)) { return $this->company->settings->{$setting}; diff --git a/app/PaymentDrivers/Stripe/Jobs/PaymentIntentFailureWebhook.php b/app/PaymentDrivers/Stripe/Jobs/PaymentIntentFailureWebhook.php index 466c0c49dbf0..38e9da662e39 100644 --- a/app/PaymentDrivers/Stripe/Jobs/PaymentIntentFailureWebhook.php +++ b/app/PaymentDrivers/Stripe/Jobs/PaymentIntentFailureWebhook.php @@ -50,7 +50,7 @@ class PaymentIntentFailureWebhook implements ShouldQueue { MultiDB::findAndSetDbByCompanyKey($this->company_key); - $company = Company::where('company_key', $this->company_key)->first(); + $company = Company::query()->where('company_key', $this->company_key)->first(); foreach ($this->stripe_request as $transaction) { if (array_key_exists('payment_intent', $transaction)) { @@ -78,7 +78,7 @@ class PaymentIntentFailureWebhook implements ShouldQueue $payment->status_id = Payment::STATUS_FAILED; $payment->save(); - $payment_hash = PaymentHash::where('payment_id', $payment->id)->first(); + $payment_hash = PaymentHash::query()->where('payment_id', $payment->id)->first(); if ($payment_hash) { $error = ctrans('texts.client_payment_failure_body', [ diff --git a/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php b/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php index 8cbaaf95757c..58ff84400fcc 100644 --- a/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php +++ b/app/PaymentDrivers/Stripe/UpdatePaymentMethods.php @@ -208,17 +208,24 @@ class UpdatePaymentMethods switch ($type_id) { case GatewayType::CREDIT_CARD: - $payment_meta = new \stdClass; - $payment_meta->exp_month = (string) $method->card->exp_month; - $payment_meta->exp_year = (string) $method->card->exp_year; - $payment_meta->brand = (string) $method->card->brand; - $payment_meta->last4 = (string) $method->card->last4; - $payment_meta->type = GatewayType::CREDIT_CARD; - - return $payment_meta; - - break; + /** + * @class \Stripe\PaymentMethod $method + * @property \Stripe\StripeObject $card + * @class \Stripe\StripeObject $card + * @property string $exp_year + * @property string $exp_month + * @property string $brand + * @property string $last4 + */ + + $payment_meta = new \stdClass; + $payment_meta->exp_month = (string) $method->card->exp_month; + $payment_meta->exp_year = (string) $method->card->exp_year; + $payment_meta->brand = (string) $method->card->brand; + $payment_meta->last4 = (string) $method->card->last4; + $payment_meta->type = GatewayType::CREDIT_CARD; + return $payment_meta; case GatewayType::ALIPAY: case GatewayType::SOFORT: diff --git a/app/Services/Client/ClientService.php b/app/Services/Client/ClientService.php index 81cd527c615f..66ec70ed1355 100644 --- a/app/Services/Client/ClientService.php +++ b/app/Services/Client/ClientService.php @@ -155,7 +155,8 @@ class ClientService return false; } - return $this->emailStatement($pdf, $statement->options); + $this->emailStatement($pdf, $statement->options); + return; } return $pdf; diff --git a/app/Services/Pdf/PdfMock.php b/app/Services/Pdf/PdfMock.php index 67ceaa42d82e..3ee76fbaed5a 100644 --- a/app/Services/Pdf/PdfMock.php +++ b/app/Services/Pdf/PdfMock.php @@ -133,7 +133,7 @@ class PdfMock $entity->vendor = Vendor::factory()->make(); break; default: - # code... + $entity = false; break; } @@ -152,11 +152,12 @@ class PdfMock */ public function getMergedSettings() :object { + $settings = $this->company->settings; + match ($this->request['settings_type']) { 'group' => $settings = ClientSettings::buildClientSettings($this->company->settings, $this->request['settings']), 'client' => $settings = ClientSettings::buildClientSettings($this->company->settings, $this->request['settings']), - 'company' => $settings = (object)$this->request['settings'], - default => $settings = $this->company->settings, + 'company' => $settings = (object)$this->request['settings'] }; $settings = CompanySettings::setProperties($settings); @@ -168,9 +169,9 @@ class PdfMock /** * getTaxMap * - * @return void + * @return \Illuminate\Support\Collection */ - private function getTaxMap() + private function getTaxMap(): \Illuminate\Support\Collection { return collect([['name' => 'GST', 'total' => 10]]); } @@ -178,9 +179,9 @@ class PdfMock /** * getTotalTaxMap * - * @return void + * @return array */ - private function getTotalTaxMap() + private function getTotalTaxMap(): array { return [['name' => 'GST', 'total' => 10]]; } @@ -188,8 +189,9 @@ class PdfMock /** * getStubVariables * + * @return array */ - public function getStubVariables() + public function getStubVariables(): array { return ['values' => [ diff --git a/app/Services/Preview/StubBuilder.php b/app/Services/Preview/StubBuilder.php index 4bf2eafcca47..8d3cce3076f9 100644 --- a/app/Services/Preview/StubBuilder.php +++ b/app/Services/Preview/StubBuilder.php @@ -227,10 +227,13 @@ class StubBuilder private function createClient(): self { - $this->recipient = Client::factory()->create([ + /** @var \App\Models\Client $client */ + $client = Client::factory()->create([ 'user_id' => $this->user->id, 'company_id' => $this->company->id, ]); + + $this->recipient = $client; $this->contact = ClientContact::factory()->create([ 'user_id' => $this->user->id, @@ -245,10 +248,13 @@ class StubBuilder private function createVendor(): self { - $this->recipient = Vendor::factory()->create([ + /** @var \App\Models\Vendor $vendor */ + $vendor = Vendor::factory()->create([ 'user_id' => $this->user->id, 'company_id' => $this->user->company()->id, ]); + + $this->recipient = $vendor; $this->contact = VendorContact::factory()->create([ 'user_id' => $this->user->id, @@ -276,7 +282,8 @@ class StubBuilder private function createInvoice() { - $this->entity = Invoice::factory()->create([ + /** @var \App\Models\Invoice $invoice */ + $invoice = Invoice::factory()->create([ 'user_id' => $this->user->id, 'company_id' => $this->company->id, 'client_id' => $this->recipient->id, @@ -285,6 +292,8 @@ class StubBuilder 'status_id' => Invoice::STATUS_PAID, ]); + $this->entity = $invoice; + $this->invitation = InvoiceInvitation::factory()->create([ 'user_id' => $this->user->id, 'company_id' => $this->company->id, diff --git a/app/Transformers/BankIntegrationTransformer.php b/app/Transformers/BankIntegrationTransformer.php index 0f296e19ad85..c0a983ced78d 100644 --- a/app/Transformers/BankIntegrationTransformer.php +++ b/app/Transformers/BankIntegrationTransformer.php @@ -12,6 +12,7 @@ namespace App\Transformers; use App\Models\Account; +use App\Models\Company; use App\Models\BankIntegration; use App\Models\BankTransaction; use App\Utils\Traits\MakesHash; diff --git a/app/Transformers/CompanyGatewayTransformer.php b/app/Transformers/CompanyGatewayTransformer.php index d1f214086512..2c79a442a557 100644 --- a/app/Transformers/CompanyGatewayTransformer.php +++ b/app/Transformers/CompanyGatewayTransformer.php @@ -11,11 +11,12 @@ namespace App\Transformers; -use App\Models\CompanyGateway; +use stdClass; +use App\Models\Gateway; use App\Models\SystemLog; +use App\Models\CompanyGateway; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\SoftDeletes; -use stdClass; /** * Class CompanyGatewayTransformer. diff --git a/composer.json b/composer.json index 7e1bf4f4ba1d..0d071ca1da10 100644 --- a/composer.json +++ b/composer.json @@ -113,6 +113,7 @@ "phpstan/phpstan": "^1.9", "phpunit/phpunit": "^9.5.10", "spatie/laravel-ignition": "^1.0", + "spaze/phpstan-stripe": "^3.0", "vimeo/psalm": "^4.24" }, "autoload": { diff --git a/composer.lock b/composer.lock index 4afddc900c60..6bf16dd7b2c8 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": "be16996524279f340c44e2f6c9a0ba53", + "content-hash": "9d7348352c913eb82fcca2e67670e1f8", "packages": [ { "name": "adrienrn/php-mimetyper", @@ -17898,6 +17898,68 @@ ], "time": "2023-01-03T19:28:04+00:00" }, + { + "name": "spaze/phpstan-stripe", + "version": "v3.0.0", + "source": { + "type": "git", + "url": "https://github.com/spaze/phpstan-stripe.git", + "reference": "6e5debe4f65b15192a28bd01f01670ced8250443" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/spaze/phpstan-stripe/zipball/6e5debe4f65b15192a28bd01f01670ced8250443", + "reference": "6e5debe4f65b15192a28bd01f01670ced8250443", + "shasum": "" + }, + "require": { + "php": "^8.0", + "phpstan/phpstan": "^1.7" + }, + "require-dev": { + "nikic/php-parser": "^4.13", + "php-parallel-lint/php-console-highlighter": "^1.0", + "php-parallel-lint/php-parallel-lint": "^1.2", + "spaze/coding-standard": "^1.1", + "stripe/stripe-php": "^8.7|^9.9|^10.8" + }, + "suggest": { + "phpstan/extension-installer": "Allows automatic requirement of extension.neon" + }, + "type": "phpstan-extension", + "extra": { + "phpstan": { + "includes": [ + "extension.neon" + ] + } + }, + "autoload": { + "psr-4": { + "Spaze\\PHPStan\\Stripe\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Michal Špaček", + "email": "mail@michalspacek.cz", + "homepage": "https://www.michalspacek.cz" + } + ], + "description": "Stripe SDK extension for PHPStan", + "keywords": [ + "static analysis" + ], + "support": { + "issues": "https://github.com/spaze/phpstan-stripe/issues", + "source": "https://github.com/spaze/phpstan-stripe/tree/v3.0.0" + }, + "time": "2023-03-06T00:39:29+00:00" + }, { "name": "symfony/polyfill-php81", "version": "v1.27.0", diff --git a/phpstan.neon b/phpstan.neon index 7aec499ed7bd..92bb5444400e 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,5 +1,6 @@ includes: - ./vendor/nunomaduro/larastan/extension.neon + - ./vendor/spaze/phpstan-stripe/extension.neon parameters: level: 2 paths: diff --git a/resources/views/auth/connect/completed.blade.php b/resources/views/auth/connect/completed.blade.php index 3d9999add5c6..05ea6a8cd463 100644 --- a/resources/views/auth/connect/completed.blade.php +++ b/resources/views/auth/connect/completed.blade.php @@ -8,6 +8,6 @@

Connecting your account using Stripe has been successfully completed.

- Click here to continue. + Click here to continue. @endsection