From 3fe876d4798c56b70ee6952c9ba591cc1305df1c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 3 Aug 2023 14:30:14 +1000 Subject: [PATCH 01/17] Fixes for static analysis --- app/Filters/TaskFilters.php | 2 +- .../Invoice/InvoiceItemSumInclusive.php | 1 - app/Helpers/Invoice/ProRata.php | 8 ++--- .../Subscription/SubscriptionCalculator.php | 1 + app/Http/Controllers/ActivityController.php | 4 +-- .../Auth/ContactForgotPasswordController.php | 4 +++ app/Models/ClientContact.php | 14 ++++---- app/Models/StaticModel.php | 6 ++-- app/Models/Subscription.php | 35 ------------------- app/PaymentDrivers/Sample/CreditCard.php | 4 ++- app/PaymentDrivers/Square/CreditCard.php | 1 + .../Jobs/PaymentIntentProcessingWebhook.php | 9 +++-- .../Stripe/Jobs/PaymentIntentWebhook.php | 2 ++ .../Stripe/Jobs/StripeWebhook.php | 1 + .../Stripe/Jobs/UpdateCustomer.php | 1 + phpstan.neon | 1 + 16 files changed, 38 insertions(+), 56 deletions(-) diff --git a/app/Filters/TaskFilters.php b/app/Filters/TaskFilters.php index f0b3a1afc256..3e09a0d2addf 100644 --- a/app/Filters/TaskFilters.php +++ b/app/Filters/TaskFilters.php @@ -56,7 +56,7 @@ class TaskFilters extends QueryFilters * - all * - invoiced * - * @param string client_status The invoice status as seen by the client + * @param string $value The invoice status as seen by the client * @return Builder */ public function client_status(string $value = ''): Builder diff --git a/app/Helpers/Invoice/InvoiceItemSumInclusive.php b/app/Helpers/Invoice/InvoiceItemSumInclusive.php index 264c76ec41e9..9e792c0d714e 100644 --- a/app/Helpers/Invoice/InvoiceItemSumInclusive.php +++ b/app/Helpers/Invoice/InvoiceItemSumInclusive.php @@ -230,7 +230,6 @@ class InvoiceItemSumInclusive $item_tax += $this->formatValue($item_tax_rate1_total, $this->currency->precision); - // if($item_tax_rate1_total != 0) if (strlen($this->item->tax_name1) > 1) { $this->groupTax($this->item->tax_name1, $this->item->tax_rate1, $item_tax_rate1_total); } diff --git a/app/Helpers/Invoice/ProRata.php b/app/Helpers/Invoice/ProRata.php index 92f1000ef5dd..34e52cc1a2a3 100644 --- a/app/Helpers/Invoice/ProRata.php +++ b/app/Helpers/Invoice/ProRata.php @@ -111,13 +111,13 @@ class ProRata case RecurringInvoice::FREQUENCY_MONTHLY: return now()->diffInDays(now()->addMonthNoOverflow()); case RecurringInvoice::FREQUENCY_TWO_MONTHS: - return now()->diffInDays(now()->addMonthNoOverflow(2)); + return now()->diffInDays(now()->addMonthsNoOverflow(2)); case RecurringInvoice::FREQUENCY_THREE_MONTHS: - return now()->diffInDays(now()->addMonthNoOverflow(3)); + return now()->diffInDays(now()->addMonthsNoOverflow(3)); case RecurringInvoice::FREQUENCY_FOUR_MONTHS: - return now()->diffInDays(now()->addMonthNoOverflow(4)); + return now()->diffInDays(now()->addMonthsNoOverflow(4)); case RecurringInvoice::FREQUENCY_SIX_MONTHS: - return now()->diffInDays(now()->addMonthNoOverflow(6)); + return now()->diffInDays(now()->addMonthsNoOverflow(6)); case RecurringInvoice::FREQUENCY_ANNUALLY: return now()->diffInDays(now()->addYear()); case RecurringInvoice::FREQUENCY_TWO_YEARS: diff --git a/app/Helpers/Subscription/SubscriptionCalculator.php b/app/Helpers/Subscription/SubscriptionCalculator.php index dd9675bef4ad..99049bab3993 100644 --- a/app/Helpers/Subscription/SubscriptionCalculator.php +++ b/app/Helpers/Subscription/SubscriptionCalculator.php @@ -64,6 +64,7 @@ class SubscriptionCalculator } if ($refund_invoice) { + /** @var \App\Models\Subscription $subscription **/ $subscription = Subscription::find($this->invoice->subscription_id); $pro_rata = new ProRata; diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index 7f4a7bd7fc8b..2b377c7f5ef6 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -58,7 +58,7 @@ class ActivityController extends BaseController $system = ctrans('texts.system'); - $data = $activities->cursor()->map(function ($activity) use ($system) { + $data = $activities->cursor()->map(function ($activity) { return $activity->activity_string(); @@ -90,7 +90,7 @@ class ActivityController extends BaseController $system = ctrans('texts.system'); - $data = $activities->cursor()->map(function ($activity) use ($system) { + $data = $activities->cursor()->map(function ($activity) { return $activity->activity_string(); diff --git a/app/Http/Controllers/Auth/ContactForgotPasswordController.php b/app/Http/Controllers/Auth/ContactForgotPasswordController.php index cda235731295..251d199b0eef 100644 --- a/app/Http/Controllers/Auth/ContactForgotPasswordController.php +++ b/app/Http/Controllers/Auth/ContactForgotPasswordController.php @@ -62,11 +62,15 @@ class ContactForgotPasswordController extends Controller if (Ninja::isHosted() && $request->session()->has('company_key')) { MultiDB::findAndSetDbByCompanyKey($request->session()->get('company_key')); + + /** @var \App\Models\Company $company **/ $company = Company::where('company_key', $request->session()->get('company_key'))->first(); $account = $company->account; } if (! $account) { + + /** @var \App\Models\Account $account **/ $account = Account::first(); $company = $account->companies->first(); } diff --git a/app/Models/ClientContact.php b/app/Models/ClientContact.php index 8dc2cf9d41ab..0116d611b474 100644 --- a/app/Models/ClientContact.php +++ b/app/Models/ClientContact.php @@ -215,7 +215,7 @@ class ClientContact extends Authenticatable implements HasLocalePreference } } - public function client() + public function client(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Client::class)->withTrashed(); } @@ -225,32 +225,32 @@ class ClientContact extends Authenticatable implements HasLocalePreference return $this->where('is_primary', true); } - public function company() + public function company(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Company::class); } - public function user() + public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class)->withTrashed(); } - public function invoice_invitations() + public function invoice_invitations(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(InvoiceInvitation::class); } - public function recurring_invoice_invitations() + public function recurring_invoice_invitations(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(RecurringInvoiceInvitation::class); } - public function quote_invitations() + public function quote_invitations(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(QuoteInvitation::class); } - public function credit_invitations() + public function credit_invitations(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(CreditInvitation::class); } diff --git a/app/Models/StaticModel.php b/app/Models/StaticModel.php index f6b3a5747f0a..9165e726528a 100644 --- a/app/Models/StaticModel.php +++ b/app/Models/StaticModel.php @@ -22,9 +22,9 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @property-read mixed $id * @method static \Illuminate\Database\Eloquent\Builder|StaticModel company() * @method static \Illuminate\Database\Eloquent\Builder|StaticModel exclude($columns) - * @method static \Illuminate\Database\Eloquent\Builder|StaticModel newModelQuery($value) - * @method static \Illuminate\Database\Eloquent\Builder|StaticModel newQuery($value) - * @method static \Illuminate\Database\Eloquent\Builder|StaticModel query(?$value) + * @method static \Illuminate\Database\Eloquent\Builder|StaticModel newModelQuery() + * @method static \Illuminate\Database\Eloquent\Builder|StaticModel newQuery() + * @method static \Illuminate\Database\Eloquent\Builder|StaticModel query() * @method static \Illuminate\Database\Eloquent\Builder|StaticModel find($value) * @method static \Illuminate\Database\Eloquent\Builder|StaticModel with($value) * @method static \Illuminate\Database\Eloquent\Builder|StaticModel withTrashed($value) diff --git a/app/Models/Subscription.php b/app/Models/Subscription.php index 1e2f67ce8ccd..3798a69433a8 100644 --- a/app/Models/Subscription.php +++ b/app/Models/Subscription.php @@ -66,41 +66,6 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|Subscription onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Subscription query() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereAllowCancellation($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereAllowPlanChanges($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereAllowQueryOverrides($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereAssignedUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereAutoBill($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereCompanyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereCurrencyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereDeletedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereFrequencyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereGroupId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereIsAmountDiscount($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereIsDeleted($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereMaxSeatsLimit($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereMinSeatsLimit($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereOptionalProductIds($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereOptionalRecurringProductIds($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription wherePerSeatEnabled($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription wherePlanMap($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription wherePrice($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereProductIds($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription wherePromoCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription wherePromoDiscount($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription wherePromoPrice($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereRecurringProductIds($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereRefundPeriod($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereRegistrationRequired($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereTrialDuration($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereTrialEnabled($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereUseInventoryManagement($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Subscription whereWebhookConfiguration($value) * @method static \Illuminate\Database\Eloquent\Builder|Subscription withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Subscription withoutTrashed() * @mixin \Eloquent diff --git a/app/PaymentDrivers/Sample/CreditCard.php b/app/PaymentDrivers/Sample/CreditCard.php index 2165a56d83a2..b8813769aac2 100644 --- a/app/PaymentDrivers/Sample/CreditCard.php +++ b/app/PaymentDrivers/Sample/CreditCard.php @@ -69,7 +69,9 @@ class CreditCard // $error .= " - {$response->approval_message}"; // $error_code = property_exists($response, 'approval_message') ? $response->approval_message : 'Undefined code'; - + $error = ''; + $error_code = ''; + $data = [ 'response' => $response, 'error' => $error, diff --git a/app/PaymentDrivers/Square/CreditCard.php b/app/PaymentDrivers/Square/CreditCard.php index 1cec62101c90..f3589b98333f 100644 --- a/app/PaymentDrivers/Square/CreditCard.php +++ b/app/PaymentDrivers/Square/CreditCard.php @@ -100,6 +100,7 @@ class CreditCard implements MethodInterface ); if ($request->shouldUseToken()) { + /** @var \App\Models\ClientGatewayToken $cgt **/ $cgt = ClientGatewayToken::where('token', $request->token)->first(); $token = $cgt->token; } diff --git a/app/PaymentDrivers/Stripe/Jobs/PaymentIntentProcessingWebhook.php b/app/PaymentDrivers/Stripe/Jobs/PaymentIntentProcessingWebhook.php index 28f3b92c5d4c..ed34fdf9402b 100644 --- a/app/PaymentDrivers/Stripe/Jobs/PaymentIntentProcessingWebhook.php +++ b/app/PaymentDrivers/Stripe/Jobs/PaymentIntentProcessingWebhook.php @@ -61,11 +61,13 @@ class PaymentIntentProcessingWebhook implements ShouldQueue foreach ($this->stripe_request as $transaction) { if (array_key_exists('payment_intent', $transaction)) { + /** @var \App\Models\Payment $payment **/ $payment = Payment::query() ->where('company_id', $company->id) ->where('transaction_reference', $transaction['payment_intent']) ->first(); } else { + /** @var \App\Models\Payment $payment **/ $payment = Payment::query() ->where('company_id', $company->id) ->where('transaction_reference', $transaction['id']) @@ -80,6 +82,7 @@ class PaymentIntentProcessingWebhook implements ShouldQueue } if (isset($transaction['payment_method'])) { + /** @var \App\Models\ClientGatewayToken $cgt **/ $cgt = ClientGatewayToken::where('token', $transaction['payment_method'])->first(); if ($cgt && $cgt->meta?->state == 'unauthorized') { @@ -94,7 +97,7 @@ class PaymentIntentProcessingWebhook implements ShouldQueue if ($this->payment_completed) { return; } - + /** @var \App\Models\CompanyGateway $company_gateway **/ $company_gateway = CompanyGateway::find($this->company_gateway_id); $stripe_driver = $company_gateway->driver()->init(); @@ -123,8 +126,10 @@ class PaymentIntentProcessingWebhook implements ShouldQueue return; } + /** @var \App\Models\Company $company **/ $company = Company::where('company_key', $this->company_key)->first(); - + + /** @var \App\Models\Payment $payment **/ $payment = Payment::query() ->where('company_id', $company->id) ->where('transaction_reference', $charge['id']) diff --git a/app/PaymentDrivers/Stripe/Jobs/PaymentIntentWebhook.php b/app/PaymentDrivers/Stripe/Jobs/PaymentIntentWebhook.php index 70417665ae49..b476db2fea87 100644 --- a/app/PaymentDrivers/Stripe/Jobs/PaymentIntentWebhook.php +++ b/app/PaymentDrivers/Stripe/Jobs/PaymentIntentWebhook.php @@ -113,8 +113,10 @@ class PaymentIntentWebhook implements ShouldQueue return; } + /** @var \App\Models\Company $company **/ $company = Company::where('company_key', $this->company_key)->first(); + /** @var \App\Models\Payment $payment **/ $payment = Payment::query() ->where('company_id', $company->id) ->where('transaction_reference', $charge['id']) diff --git a/app/PaymentDrivers/Stripe/Jobs/StripeWebhook.php b/app/PaymentDrivers/Stripe/Jobs/StripeWebhook.php index 3dfc94805e9d..9424d76d9196 100644 --- a/app/PaymentDrivers/Stripe/Jobs/StripeWebhook.php +++ b/app/PaymentDrivers/Stripe/Jobs/StripeWebhook.php @@ -58,6 +58,7 @@ class StripeWebhook implements ShouldQueue $company = Company::where('company_key', $this->company_key)->first(); + /** @var \App\Models\CompanyGateway $company_gateway **/ $company_gateway = CompanyGateway::find($this->company_gateway_id); $stripe = $company_gateway->driver()->init(); diff --git a/app/PaymentDrivers/Stripe/Jobs/UpdateCustomer.php b/app/PaymentDrivers/Stripe/Jobs/UpdateCustomer.php index af6e9d490646..f274db47c630 100644 --- a/app/PaymentDrivers/Stripe/Jobs/UpdateCustomer.php +++ b/app/PaymentDrivers/Stripe/Jobs/UpdateCustomer.php @@ -49,6 +49,7 @@ class UpdateCustomer implements ShouldQueue $company = Company::where('company_key', $this->company_key)->first(); + /** @var \App\Models\CompanyGateway $company_gateway **/ $company_gateway = CompanyGateway::find($this->company_gateway_id); $client = Client::withTrashed()->find($this->client_id); diff --git a/phpstan.neon b/phpstan.neon index 8cd766f92d33..2b60d7d20252 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -9,6 +9,7 @@ parameters: - 'app/Jobs/Ninja/*' - 'app/Console/Commands/*' - 'app/DataMapper/Analytics/*' + - 'app/PaymentDrivers/Authorize/*' universalObjectCratesClasses: - App\DataMapper\Tax\RuleInterface - App\DataMapper\FeesAndLimits From 455f966077453e23ece78d7853fbba3bc4660f28 Mon Sep 17 00:00:00 2001 From: Lars Kusch Date: Wed, 2 Aug 2023 21:07:27 +0200 Subject: [PATCH 02/17] Added method for merging the xml file with the pdf --- app/Jobs/Invoice/CreateEInvoice.php | 8 +-- .../Invoice/EInvoice/ZugferdEInvoice.php | 18 +----- ...iceXInvoice.php => GetInvoiceEInvoice.php} | 2 +- app/Services/Invoice/InvoiceService.php | 8 ++- app/Services/Invoice/MergeEInvoice.php | 61 +++++++++++++++++++ 5 files changed, 73 insertions(+), 24 deletions(-) rename app/Services/Invoice/{GetInvoiceXInvoice.php => GetInvoiceEInvoice.php} (96%) create mode 100644 app/Services/Invoice/MergeEInvoice.php diff --git a/app/Jobs/Invoice/CreateEInvoice.php b/app/Jobs/Invoice/CreateEInvoice.php index ff4e87d7e872..dc2fdfba1d39 100644 --- a/app/Jobs/Invoice/CreateEInvoice.php +++ b/app/Jobs/Invoice/CreateEInvoice.php @@ -51,9 +51,9 @@ class CreateEInvoice implements ShouldQueue /* Set customized translations _NOW_ */ $t->replace(Ninja::transformTranslations($this->invoice->client->getMergedSettings())); - + $e_invoice_type = $this->invoice->client->getSetting('e_invoice_type'); - + switch ($e_invoice_type) { case "EN16931": case "XInvoice_2_2": @@ -63,13 +63,13 @@ class CreateEInvoice implements ShouldQueue case "XInvoice-Extended": case "XInvoice-BasicWL": case "XInvoice-Basic": - return (new ZugferdEInvoice($this->invoice, $this->alterPDF, $this->custom_pdf_path))->run(); + return (new ZugferdEInvoice($this->invoice))->run(); case "Facturae_3.2": case "Facturae_3.2.1": case "Facturae_3.2.2": return (new FacturaEInvoice($this->invoice, str_replace("Facturae_", "", $e_invoice_type)))->run(); default: - return (new ZugferdEInvoice($this->invoice, $this->alterPDF, $this->custom_pdf_path))->run(); + return (new ZugferdEInvoice($this->invoice))->run(); } diff --git a/app/Services/Invoice/EInvoice/ZugferdEInvoice.php b/app/Services/Invoice/EInvoice/ZugferdEInvoice.php index 823662f73c90..687f8431e80f 100644 --- a/app/Services/Invoice/EInvoice/ZugferdEInvoice.php +++ b/app/Services/Invoice/EInvoice/ZugferdEInvoice.php @@ -23,7 +23,7 @@ use horstoeko\zugferd\codelists\ZugferdDutyTaxFeeCategories; class ZugferdEInvoice extends AbstractService { - public function __construct(public Invoice $invoice, private bool $alterPDF, private string $custom_pdf_path = "", private array $tax_map = []) + public function __construct(public Invoice $invoice, private array $tax_map = []) { } @@ -175,22 +175,6 @@ class ZugferdEInvoice extends AbstractService $xrechnung->writeFile(Storage::disk($disk)->path($client->e_invoice_filepath($this->invoice->invitations->first()) . $this->invoice->getFileName("xml"))); // The validity can be checked using https://portal3.gefeg.com/invoice/validation or https://e-rechnung.bayern.de/app/#/upload - if ($this->alterPDF) { - if ($this->custom_pdf_path != "") { - $pdfBuilder = new ZugferdDocumentPdfBuilder($xrechnung, $this->custom_pdf_path); - $pdfBuilder->generateDocument(); - $pdfBuilder->saveDocument($this->custom_pdf_path); - } else { - $filepath_pdf = $client->invoice_filepath($this->invoice->invitations->first()) . $this->invoice->getFileName(); - $file = Storage::disk($disk)->exists($filepath_pdf); - if ($file) { - $pdfBuilder = new ZugferdDocumentPdfBuilder($xrechnung, Storage::disk($disk)->path($filepath_pdf)); - $pdfBuilder->generateDocument(); - $pdfBuilder->saveDocument(Storage::disk($disk)->path($filepath_pdf)); - } - } - } - return $client->e_invoice_filepath($this->invoice->invitations->first()) . $this->invoice->getFileName("xml"); } diff --git a/app/Services/Invoice/GetInvoiceXInvoice.php b/app/Services/Invoice/GetInvoiceEInvoice.php similarity index 96% rename from app/Services/Invoice/GetInvoiceXInvoice.php rename to app/Services/Invoice/GetInvoiceEInvoice.php index c3f312382058..6b6dac9f544f 100644 --- a/app/Services/Invoice/GetInvoiceXInvoice.php +++ b/app/Services/Invoice/GetInvoiceEInvoice.php @@ -17,7 +17,7 @@ use App\Models\Invoice; use App\Services\AbstractService; use Illuminate\Support\Facades\Storage; -class GetInvoiceXInvoice extends AbstractService +class GetInvoiceEInvoice extends AbstractService { public function __construct(public Invoice $invoice, public ?ClientContact $contact = null) { diff --git a/app/Services/Invoice/InvoiceService.php b/app/Services/Invoice/InvoiceService.php index fa4fb4036187..8558c0128ec6 100644 --- a/app/Services/Invoice/InvoiceService.php +++ b/app/Services/Invoice/InvoiceService.php @@ -48,7 +48,7 @@ class InvoiceService return $this; } - + /** * applyPaymentAmount * @@ -194,9 +194,13 @@ class InvoiceService public function getEInvoice($contact = null) { - return (new GetInvoiceXInvoice($this->invoice, $contact))->run(); + return (new GetInvoiceEInvoice($this->invoice, $contact))->run(); } + public function mergeEInvoice($contact = null): void + { + (new MergeEInvoice($this->invoice, $contact))->run(); + } public function sendEmail($contact = null) { $send_email = new SendEmail($this->invoice, null, $contact); diff --git a/app/Services/Invoice/MergeEInvoice.php b/app/Services/Invoice/MergeEInvoice.php new file mode 100644 index 000000000000..d05d61abaf86 --- /dev/null +++ b/app/Services/Invoice/MergeEInvoice.php @@ -0,0 +1,61 @@ +invoice->client->getSetting('e_invoice_type'); + switch ($e_invoice_type) { + case "EN16931": + case "XInvoice_2_2": + case "XInvoice_2_1": + case "XInvoice_2_0": + case "XInvoice_1_0": + case "XInvoice-Extended": + case "XInvoice-BasicWL": + case "XInvoice-Basic": + $this->embedEInvoiceZuGFerD(); + //case "Facturae_3.2": + //case "Facturae_3.2.1": + //case "Facturae_3.2.2": + // + default: + $this->embedEInvoiceZuGFerD(); + break; + } + } + + /** + * @throws \Exception + */ + private function embedEInvoiceZuGFerD(): void + { + $filepath_pdf = $this->invoice->client->invoice_filepath($this->invoice->invitations->first()) . $this->invoice->getFileName(); + $e_invoice_path = $this->invoice->client->e_invoice_filepath($this->invoice->invitations->first()) . $this->invoice->getFileName("xml"); + $document = ZugferdDocumentReader::readAndGuessFromFile($e_invoice_path); + $disk = config('filesystems.default'); + + if (!Storage::disk($disk)->exists($this->invoice->client->e_invoice_filepath($this->invoice->invitations->first()))) { + Storage::makeDirectory($this->invoice->client->e_invoice_filepath($this->invoice->invitations->first())); + } + $pdfBuilder = new ZugferdDocumentPdfBuilder($document, Storage::disk($disk)->path($filepath_pdf)); + $pdfBuilder->generateDocument(); + $pdfBuilder->saveDocument(Storage::disk($disk)->path($filepath_pdf)); + } +} From a0fab8d22dfc906d93714f3bf56b06acb2a6634a Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 4 Aug 2023 07:19:26 +1000 Subject: [PATCH 03/17] Fixes for recurring invoice email logic --- app/Jobs/RecurringInvoice/SendRecurring.php | 49 ++++++++++++------- app/Services/Invoice/AutoBillInvoice.php | 52 --------------------- app/Services/Pdf/PdfBuilder.php | 6 +-- app/Services/Pdf/PdfMock.php | 1 - 4 files changed, 35 insertions(+), 73 deletions(-) diff --git a/app/Jobs/RecurringInvoice/SendRecurring.php b/app/Jobs/RecurringInvoice/SendRecurring.php index c398f0f2d363..d82df8f7b235 100644 --- a/app/Jobs/RecurringInvoice/SendRecurring.php +++ b/app/Jobs/RecurringInvoice/SendRecurring.php @@ -110,33 +110,50 @@ class SendRecurring implements ShouldQueue if ($invoice->auto_bill_enabled && $invoice->client->getSetting('auto_bill_date') == 'on_send_date' && $invoice->client->getSetting('auto_email_invoice')) { nlog("attempting to autobill {$invoice->number}"); AutoBill::dispatch($invoice->id, $this->db, true)->delay(rand(1, 2)); + + //edge case to support where online payment notifications are not enabled + if(!$invoice->client->getSetting('client_online_payment_notification')){ + $this->sendRecurringEmails($invoice); + } } elseif ($invoice->auto_bill_enabled && $invoice->client->getSetting('auto_bill_date') == 'on_due_date' && $invoice->client->getSetting('auto_email_invoice') && ($invoice->due_date && Carbon::parse($invoice->due_date)->startOfDay()->lte(now()->startOfDay()))) { nlog("attempting to autobill {$invoice->number}"); AutoBill::dispatch($invoice->id, $this->db, true)->delay(rand(1, 2)); - } - elseif ($invoice->client->getSetting('auto_email_invoice')) { - //Admin notification for recurring invoice sent. - if ($invoice->invitations->count() >= 1) { - $invoice->entityEmailEvent($invoice->invitations->first(), 'invoice', 'email_template_invoice'); + + //edge case to support where online payment notifications are not enabled + if(!$invoice->client->getSetting('client_online_payment_notification')) { + $this->sendRecurringEmails($invoice); } - $invoice->invitations->each(function ($invitation) use ($invoice) { - if ($invitation->contact && ! $invitation->contact->trashed() && strlen($invitation->contact->email) >= 1 && $invoice->client->getSetting('auto_email_invoice')) { - try { - EmailEntity::dispatch($invitation, $invoice->company)->delay(rand(1, 2)); - } catch (\Exception $e) { - nlog($e->getMessage()); - } - - nlog("Firing email for invoice {$invoice->number}"); - } - }); + } + elseif ($invoice->client->getSetting('auto_email_invoice')) { + $this->sendRecurringEmails($invoice); } } + private function sendRecurringEmails(Invoice $invoice) + { + //Admin notification for recurring invoice sent. + if ($invoice->invitations->count() >= 1) { + $invoice->entityEmailEvent($invoice->invitations->first(), 'invoice', 'email_template_invoice'); + } + + $invoice->invitations->each(function ($invitation) use ($invoice) { + if ($invitation->contact && ! $invitation->contact->trashed() && strlen($invitation->contact->email) >= 1 && $invoice->client->getSetting('auto_email_invoice')) { + try { + EmailEntity::dispatch($invitation, $invoice->company)->delay(rand(1, 2)); + } catch (\Exception $e) { + nlog($e->getMessage()); + } + + nlog("Firing email for invoice {$invoice->number}"); + } + }); + + } + /** * Only create the invitations that are defined on the recurring invoice. * @param Invoice $invoice diff --git a/app/Services/Invoice/AutoBillInvoice.php b/app/Services/Invoice/AutoBillInvoice.php index d67b4fa8607f..c05aecf18ba4 100644 --- a/app/Services/Invoice/AutoBillInvoice.php +++ b/app/Services/Invoice/AutoBillInvoice.php @@ -310,25 +310,6 @@ class AutoBillInvoice extends AbstractService return $this; } - // private function applyPaymentToCredit($credit, $amount) :Credit - // { - // $credit_item = new InvoiceItem; - // $credit_item->type_id = '1'; - // $credit_item->product_key = ctrans('texts.credit'); - // $credit_item->notes = ctrans('texts.credit_payment', ['invoice_number' => $this->invoice->number]); - // $credit_item->quantity = 1; - // $credit_item->cost = $amount * -1; - - // $credit_items = $credit->line_items; - // $credit_items[] = $credit_item; - - // $credit->line_items = $credit_items; - - // $credit = $credit->calc()->getCredit(); - // $credit->save(); - - // return $credit; - // } /** * Harvests a client gateway token which passes the @@ -371,37 +352,4 @@ class AutoBillInvoice extends AbstractService return false; } - /** - * Adds a gateway fee to the invoice. - * - * @param float $fee The fee amount. - * @return AutoBillInvoice - * @deprecated / unused - */ - // private function addFeeToInvoice(float $fee) - // { - // //todo if we increase the invoice balance here, we will also need to adjust UP the client balance and ledger? - // $starting_amount = $this->invoice->amount; - - // $item = new InvoiceItem; - // $item->quantity = 1; - // $item->cost = $fee; - // $item->notes = ctrans('texts.online_payment_surcharge'); - // $item->type_id = 3; - - // $items = (array) $this->invoice->line_items; - // $items[] = $item; - - // $this->invoice->line_items = $items; - // $this->invoice->saveQuietly(); - - // $this->invoice = $this->invoice->calc()->getInvoice()->saveQuietly(); - - // if ($starting_amount != $this->invoice->amount && $this->invoice->status_id != Invoice::STATUS_DRAFT) { - // $this->invoice->client->service()->updateBalance($this->invoice->amount - $starting_amount)->save(); - // $this->invoice->ledger()->updateInvoiceBalance($this->invoice->amount - $starting_amount, "Invoice {$this->invoice->number} balance updated after stale gateway fee removed")->save(); - // } - - // return $this; - // } } diff --git a/app/Services/Pdf/PdfBuilder.php b/app/Services/Pdf/PdfBuilder.php index 0e55f97433f7..819130cff9ef 100644 --- a/app/Services/Pdf/PdfBuilder.php +++ b/app/Services/Pdf/PdfBuilder.php @@ -39,7 +39,6 @@ class PdfBuilder /** * The DOM Document; * - * @var $document */ public DomDocument $document; @@ -619,7 +618,6 @@ class PdfBuilder * * @param mixed $items * @param string $table_type - * @param mixed|null $custom_fields * * @return array */ @@ -1313,7 +1311,7 @@ class PdfBuilder * Generates the custom values for the * entity. * - * @param array + * @param array $variables * @return array */ public function genericDetailsBuilder(array $variables): array @@ -1470,7 +1468,7 @@ class PdfBuilder * Passes an array of items by reference * and performs a nl2br * - * @param array + * @param array $variables * @return void * */ diff --git a/app/Services/Pdf/PdfMock.php b/app/Services/Pdf/PdfMock.php index 06a572c0680d..34ac517d975e 100644 --- a/app/Services/Pdf/PdfMock.php +++ b/app/Services/Pdf/PdfMock.php @@ -183,7 +183,6 @@ class PdfMock /** * getStubVariables * - * @return void */ public function getStubVariables() { From b09f1a7d075d2de50b79484b3bd1a395ed161335 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 4 Aug 2023 16:40:44 +1000 Subject: [PATCH 04/17] Updates for Static Analysis --- app/Filters/PaymentFilters.php | 1 + .../Auth/ContactForgotPasswordController.php | 4 ++ .../Auth/ContactLoginController.php | 3 + .../Auth/ContactRegisterController.php | 3 +- .../Auth/ContactResetPasswordController.php | 4 ++ .../Auth/ForgotPasswordController.php | 1 + .../Auth/ResetPasswordController.php | 1 + .../BankTransactionRuleController.php | 13 ++-- .../ContactHashLoginController.php | 7 ++- .../ClientPortal/DocumentController.php | 2 + .../ClientPortal/InvitationController.php | 3 + .../ClientPortal/InvoiceController.php | 7 --- .../ClientPortal/NinjaPlanController.php | 2 + .../ClientPortal/PaymentController.php | 1 + .../ClientPortal/PaymentMethodController.php | 38 ++++++++---- .../ClientPortal/ProfileController.php | 4 +- .../ClientPortal/QuoteController.php | 13 +++- .../ClientPortal/UploadController.php | 6 +- app/Http/Controllers/CompanyController.php | 6 +- .../Controllers/CompanyUserController.php | 10 +++- app/Http/Controllers/CreditController.php | 38 ++++++++---- app/Jobs/RecurringInvoice/SendRecurring.php | 14 +++-- app/Models/Account.php | 28 ++++----- app/Models/Credit.php | 60 +++++++++---------- app/Models/Document.php | 26 -------- app/Models/InvoiceInvitation.php | 33 +++------- app/Models/User.php | 15 ++--- app/PaymentDrivers/WePayPaymentDriver.php | 9 ++- app/Repositories/ActivityRepository.php | 11 ++-- app/Repositories/UserRepository.php | 5 +- 30 files changed, 201 insertions(+), 167 deletions(-) diff --git a/app/Filters/PaymentFilters.php b/app/Filters/PaymentFilters.php index ffda39e9b89a..92c1a7827812 100644 --- a/app/Filters/PaymentFilters.php +++ b/app/Filters/PaymentFilters.php @@ -120,6 +120,7 @@ class PaymentFilters extends QueryFilters */ public function match_transactions($value = 'true'): Builder { + if ($value == 'true') { return $this->builder ->where('is_deleted', 0) diff --git a/app/Http/Controllers/Auth/ContactForgotPasswordController.php b/app/Http/Controllers/Auth/ContactForgotPasswordController.php index 251d199b0eef..f6e33e00fee5 100644 --- a/app/Http/Controllers/Auth/ContactForgotPasswordController.php +++ b/app/Http/Controllers/Auth/ContactForgotPasswordController.php @@ -101,7 +101,11 @@ class ContactForgotPasswordController extends Controller $this->validateEmail($request); + if (Ninja::isHosted() && $company = Company::where('company_key', $request->input('company_key'))->first()) { + /** @var \App\Models\Company $company **/ + + /** @var \App\Models\ClientContact $contact **/ $contact = ClientContact::where(['email' => $request->input('email'), 'company_id' => $company->id]) ->whereHas('client', function ($query) { $query->where('is_deleted', 0); diff --git a/app/Http/Controllers/Auth/ContactLoginController.php b/app/Http/Controllers/Auth/ContactLoginController.php index 0872b085069d..0eca53814132 100644 --- a/app/Http/Controllers/Auth/ContactLoginController.php +++ b/app/Http/Controllers/Auth/ContactLoginController.php @@ -52,6 +52,7 @@ class ContactLoginController extends Controller $company = Company::where('company_key', $company_key)->first(); } + /** @var \App\Models\Company $company **/ if ($company) { $account = $company->account; } elseif (! $company && strpos($request->getHost(), 'invoicing.co') !== false) { @@ -63,6 +64,7 @@ class ContactLoginController extends Controller $company = Company::where('portal_domain', $request->getSchemeAndHttpHost())->first(); } elseif (Ninja::isSelfHost()) { + /** @var \App\Models\Account $account **/ $account = Account::first(); $company = $account->default_company; } else { @@ -97,6 +99,7 @@ class ContactLoginController extends Controller } if (Ninja::isHosted() && $request->has('password') && $company = Company::where('company_key', $request->input('company_key'))->first()) { + /** @var \App\Models\Company $company **/ $contact = ClientContact::where(['email' => $request->input('email'), 'company_id' => $company->id]) ->whereHas('client', function ($query) { $query->where('is_deleted', 0); diff --git a/app/Http/Controllers/Auth/ContactRegisterController.php b/app/Http/Controllers/Auth/ContactRegisterController.php index 15acb8c7d765..b1c6fe966136 100644 --- a/app/Http/Controllers/Auth/ContactRegisterController.php +++ b/app/Http/Controllers/Auth/ContactRegisterController.php @@ -39,7 +39,8 @@ class ContactRegisterController extends Controller } else { $key = request()->session()->has('company_key') ? request()->session()->get('company_key') : $company_key; } - + + /** @var \App\Models\Company $company **/ $company = Company::where('company_key', $key)->firstOrFail(); App::forgetInstance('translator'); diff --git a/app/Http/Controllers/Auth/ContactResetPasswordController.php b/app/Http/Controllers/Auth/ContactResetPasswordController.php index 5ef3778cbded..ebb64455dc47 100644 --- a/app/Http/Controllers/Auth/ContactResetPasswordController.php +++ b/app/Http/Controllers/Auth/ContactResetPasswordController.php @@ -71,6 +71,8 @@ class ContactResetPasswordController extends Controller { if ($request->session()->has('company_key')) { MultiDB::findAndSetDbByCompanyKey($request->session()->get('company_key')); + + /** @var \App\Models\Company $company **/ $company = Company::where('company_key', $request->session()->get('company_key'))->first(); $db = $company->db; $account = $company->account; @@ -79,10 +81,12 @@ class ContactResetPasswordController extends Controller if ($account_key) { MultiDB::findAndSetDbByAccountKey($account_key); + /** @var \App\Models\Account $account **/ $account = Account::where('key', $account_key)->first(); $db = $account->companies->first()->db; $company = $account->companies->first(); } else { + /** @var \App\Models\Account $account **/ $account = Account::first(); $db = $account->companies->first()->db; $company = $account->companies->first(); diff --git a/app/Http/Controllers/Auth/ForgotPasswordController.php b/app/Http/Controllers/Auth/ForgotPasswordController.php index 7d08aad6a391..472778eae359 100644 --- a/app/Http/Controllers/Auth/ForgotPasswordController.php +++ b/app/Http/Controllers/Auth/ForgotPasswordController.php @@ -82,6 +82,7 @@ class ForgotPasswordController extends Controller { if ($request->has('company_key')) { MultiDB::findAndSetDbByCompanyKey($request->input('company_key')); + /** @var \App\Models\Company $company **/ $company = Company::where('company_key', $request->input('company_key'))->first(); $account = $company->account; } else { diff --git a/app/Http/Controllers/Auth/ResetPasswordController.php b/app/Http/Controllers/Auth/ResetPasswordController.php index 09419ac60f67..2103971c5478 100644 --- a/app/Http/Controllers/Auth/ResetPasswordController.php +++ b/app/Http/Controllers/Auth/ResetPasswordController.php @@ -60,6 +60,7 @@ class ResetPasswordController extends Controller if (Ninja::isHosted()) { MultiDB::findAndSetDbByCompanyKey($request->session()->get('company_key')); + /** @var \App\Models\Company $company **/ $company = Company::where('company_key', $request->session()->get('company_key'))->first(); } diff --git a/app/Http/Controllers/BankTransactionRuleController.php b/app/Http/Controllers/BankTransactionRuleController.php index a5a918743138..0e8747109084 100644 --- a/app/Http/Controllers/BankTransactionRuleController.php +++ b/app/Http/Controllers/BankTransactionRuleController.php @@ -85,7 +85,7 @@ class BankTransactionRuleController extends BaseController * @OA\JsonContent(ref="#/components/schemas/Error"), * ), * ) - * @param BankTransactionFilters $filter + * @param BankTransactionRuleFilters $filters * @return Response|mixed */ public function index(BankTransactionRuleFilters $filters) @@ -302,7 +302,9 @@ class BankTransactionRuleController extends BaseController */ public function create(CreateBankTransactionRuleRequest $request) { - $bank_transaction_rule = BankTransactionRuleFactory::create(auth()->user()->company()->id, auth()->user()->id, auth()->user()->account_id); + /** @var \App\Models\User $user **/ + $user = auth()->user(); + $bank_transaction_rule = BankTransactionRuleFactory::create($user->company()->id, $user->id); return $this->itemResponse($bank_transaction_rule); } @@ -347,8 +349,11 @@ class BankTransactionRuleController extends BaseController */ public function store(StoreBankTransactionRuleRequest $request) { - //stub to store the model - $bank_transaction_rule = $this->bank_transaction_repo->save($request->all(), BankTransactionRuleFactory::create(auth()->user()->company()->id, auth()->user()->id, auth()->user()->account_id)); + + /** @var \App\Models\User $user **/ + $user = auth()->user(); + + $bank_transaction_rule = $this->bank_transaction_repo->save($request->all(), BankTransactionRuleFactory::create($user->company()->id, $user->id)); return $this->itemResponse($bank_transaction_rule); } diff --git a/app/Http/Controllers/ClientPortal/ContactHashLoginController.php b/app/Http/Controllers/ClientPortal/ContactHashLoginController.php index 4fb99e36ceba..8501131833a6 100644 --- a/app/Http/Controllers/ClientPortal/ContactHashLoginController.php +++ b/app/Http/Controllers/ClientPortal/ContactHashLoginController.php @@ -27,7 +27,12 @@ class ContactHashLoginController extends Controller public function login(string $contact_key) { if (request()->has('subscription') && request()->subscription == 'true') { - $recurring_invoice = RecurringInvoice::where('client_id', auth()->guard('contact')->client->id) + + /** @var \App\Models\ClientContact $client_contact **/ + $client_contact = auth()->guard('contact'); + + /** @var \App\Models\RecurringInvoice $recurring_invoice **/ + $recurring_invoice = RecurringInvoice::where('client_id', $client_contact->client->id) ->whereNotNull('subscription_id') ->whereNull('deleted_at') ->first(); diff --git a/app/Http/Controllers/ClientPortal/DocumentController.php b/app/Http/Controllers/ClientPortal/DocumentController.php index b5bc39f9aa08..1f4da5d02434 100644 --- a/app/Http/Controllers/ClientPortal/DocumentController.php +++ b/app/Http/Controllers/ClientPortal/DocumentController.php @@ -56,6 +56,7 @@ class DocumentController extends Controller { MultiDB::documentFindAndSetDb($document_hash); + /** @var \App\Models\Document $document **/ $document = Document::where('hash', $document_hash)->firstOrFail(); $headers = ['Cache-Control:' => 'no-cache']; @@ -69,6 +70,7 @@ class DocumentController extends Controller public function downloadMultiple(DownloadMultipleDocumentsRequest $request) { + /** @var \Illuminate\Database\Eloquent\Collection $documents **/ $documents = Document::whereIn('id', $this->transformKeys($request->file_hash)) ->where('company_id', auth()->guard('contact')->user()->company_id) ->get(); diff --git a/app/Http/Controllers/ClientPortal/InvitationController.php b/app/Http/Controllers/ClientPortal/InvitationController.php index 2c606c141573..ccb6f8f53fd4 100644 --- a/app/Http/Controllers/ClientPortal/InvitationController.php +++ b/app/Http/Controllers/ClientPortal/InvitationController.php @@ -212,7 +212,10 @@ class InvitationController extends Controller public function paymentRouter(string $contact_key, string $payment_id) { + /** @var \App\Models\ClientContact $contact **/ $contact = ClientContact::withTrashed()->where('contact_key', $contact_key)->firstOrFail(); + + /** @var \App\Models\Payment $payment **/ $payment = Payment::find($this->decodePrimaryKey($payment_id)); if ($payment->client_id != $contact->client_id) { diff --git a/app/Http/Controllers/ClientPortal/InvoiceController.php b/app/Http/Controllers/ClientPortal/InvoiceController.php index 2e432e964210..cb6764c6a84d 100644 --- a/app/Http/Controllers/ClientPortal/InvoiceController.php +++ b/app/Http/Controllers/ClientPortal/InvoiceController.php @@ -97,13 +97,6 @@ class InvoiceController extends Controller $file = (new \App\Jobs\Entity\CreateRawPdf($invitation, $invitation->company->db))->handle(); - // $headers = ['Content-Type' => 'application/pdf']; - // $entity_string = $data['entity_type']; - // $file_name = $invitation->{$entity_string}->numberFormatter().'.pdf'; - // return response()->streamDownload(function () use ($file) { - // echo $file; - // }, $file_name, $headers); - $headers = ['Content-Type' => 'application/pdf']; return response()->make($file, 200, $headers); diff --git a/app/Http/Controllers/ClientPortal/NinjaPlanController.php b/app/Http/Controllers/ClientPortal/NinjaPlanController.php index bf61b7d34517..9afdd1db6bc0 100644 --- a/app/Http/Controllers/ClientPortal/NinjaPlanController.php +++ b/app/Http/Controllers/ClientPortal/NinjaPlanController.php @@ -44,6 +44,8 @@ class NinjaPlanController extends Controller if (! $company) { MultiDB::findAndSetDbByAccountKey($account_or_company_key); + + /** @var \App\Models\Account $account **/ $account = Account::where('key', $account_or_company_key)->first(); } else { $account = $company->account; diff --git a/app/Http/Controllers/ClientPortal/PaymentController.php b/app/Http/Controllers/ClientPortal/PaymentController.php index ef3eb52c87ec..2cf498cfa7cd 100644 --- a/app/Http/Controllers/ClientPortal/PaymentController.php +++ b/app/Http/Controllers/ClientPortal/PaymentController.php @@ -111,6 +111,7 @@ class PaymentController extends Controller public function response(PaymentResponseRequest $request) { + /** @var \App\Models\CompanyGateway $gateway **/ $gateway = CompanyGateway::findOrFail($request->input('company_gateway_id')); $payment_hash = PaymentHash::where('hash', $request->payment_hash)->firstOrFail(); $invoice = Invoice::with('client')->find($payment_hash->fee_invoice_id); diff --git a/app/Http/Controllers/ClientPortal/PaymentMethodController.php b/app/Http/Controllers/ClientPortal/PaymentMethodController.php index 9e63cf22cd7c..71b26e9efd10 100644 --- a/app/Http/Controllers/ClientPortal/PaymentMethodController.php +++ b/app/Http/Controllers/ClientPortal/PaymentMethodController.php @@ -55,9 +55,13 @@ class PaymentMethodController extends Controller $gateway = $this->getClientGateway(); $data['gateway'] = $gateway; - $data['client'] = auth()->user()->client; + + /** @var \App\Models\ClientContact auth()->user() **/ + $client_contact = auth()->user(); + $data['client'] = $client_contact->client; + return $gateway - ->driver(auth()->user()->client) + ->driver($client_contact->client) ->setPaymentMethod($request->query('method')) ->checkRequirements() ->authorizeView($data); @@ -73,8 +77,11 @@ class PaymentMethodController extends Controller { $gateway = $this->getClientGateway(); + /** @var \App\Models\ClientContact auth()->user() **/ + $client_contact = auth()->user(); + return $gateway - ->driver(auth()->user()->client) + ->driver($client_contact->client) ->setPaymentMethod($request->query('method')) ->checkRequirements() ->authorizeResponse($request); @@ -95,18 +102,23 @@ class PaymentMethodController extends Controller public function verify(ClientGatewayToken $payment_method) { + + /** @var \App\Models\ClientContact auth()->user() **/ + $client_contact = auth()->user(); + return $payment_method->gateway - ->driver(auth()->user()->client) + ->driver($client_contact->client) ->setPaymentMethod(request()->query('method')) ->verificationView($payment_method); } public function processVerification(Request $request, ClientGatewaytoken $payment_method) { - // $gateway = $this->getClientGateway(); + /** @var \App\Models\ClientContact auth()->user() **/ + $client_contact = auth()->user(); return $payment_method->gateway - ->driver(auth()->user()->client) + ->driver($client_contact->client) ->setPaymentMethod(request()->query('method')) ->processVerification($request, $payment_method); } @@ -119,9 +131,12 @@ class PaymentMethodController extends Controller */ public function destroy(ClientGatewayToken $payment_method) { + /** @var \App\Models\ClientContact auth()->user() **/ + $client_contact = auth()->user(); + if ($payment_method->gateway()->exists()) { $payment_method->gateway - ->driver(auth()->user()->client) + ->driver($client_contact->client) ->setPaymentMethod(request()->query('method')) ->detach($payment_method); } @@ -143,15 +158,18 @@ class PaymentMethodController extends Controller private function getClientGateway() { + /** @var \App\Models\ClientContact auth()->user() **/ + $client_contact = auth()->user(); + if (request()->query('method') == GatewayType::CREDIT_CARD) { - return auth()->user()->client->getCreditCardGateway(); + return $client_contact->client->getCreditCardGateway(); } if (request()->query('method') == GatewayType::BACS) { - return auth()->user()->client->getBACSGateway(); + return $client_contact->client->getBACSGateway(); } if (in_array(request()->query('method'), [GatewayType::BANK_TRANSFER, GatewayType::DIRECT_DEBIT, GatewayType::SEPA])) { - return auth()->user()->client->getBankTransferGateway(); + return $client_contact->client->getBankTransferGateway(); } abort(404, 'Gateway not found.'); diff --git a/app/Http/Controllers/ClientPortal/ProfileController.php b/app/Http/Controllers/ClientPortal/ProfileController.php index e654d5698a23..d98a98d46c79 100644 --- a/app/Http/Controllers/ClientPortal/ProfileController.php +++ b/app/Http/Controllers/ClientPortal/ProfileController.php @@ -50,8 +50,6 @@ class ProfileController extends Controller $client_contact->save(); - // auth()->user()->fresh(); - return back()->withSuccess( ctrans('texts.profile_updated_successfully') ); @@ -63,7 +61,7 @@ class ProfileController extends Controller //update avatar if needed if ($request->file('logo')) { - $path = (new UploadAvatar($request->file('logo'), auth()->user()->client->client_hash))->handle(); + $path = (new UploadAvatar($request->file('logo'), $client->client_hash))->handle(); if ($path) { $client->logo = $path; diff --git a/app/Http/Controllers/ClientPortal/QuoteController.php b/app/Http/Controllers/ClientPortal/QuoteController.php index 1b36166538d4..83c541452f98 100644 --- a/app/Http/Controllers/ClientPortal/QuoteController.php +++ b/app/Http/Controllers/ClientPortal/QuoteController.php @@ -83,7 +83,7 @@ class QuoteController extends Controller return $this->downloadQuotes((array) $transformed_ids); } - if ($request->action = 'approve') { + if ($request->action == 'approve') { return $this->approve((array) $transformed_ids, $request->has('process')); } @@ -92,8 +92,11 @@ class QuoteController extends Controller public function downloadQuotes($ids) { + /** @var \App\Models\ClientContact $client_contact **/ + $client_contact = auth()->user(); + $data['quotes'] = Quote::whereIn('id', $ids) - ->whereClientId(auth()->user()->client->id) + ->whereClientId($client_contact->client->id) ->withTrashed() ->get(); @@ -113,8 +116,12 @@ class QuoteController extends Controller protected function downloadQuotePdf(array $ids) { + + /** @var \App\Models\ClientContact $client_contact **/ + $client_contact = auth()->user(); + $quotes = Quote::whereIn('id', $ids) - ->whereClientId(auth()->user()->client->id) + ->whereClientId($client_contact->client_id) ->withTrashed() ->get(); diff --git a/app/Http/Controllers/ClientPortal/UploadController.php b/app/Http/Controllers/ClientPortal/UploadController.php index e6859922d01d..5099317910e4 100644 --- a/app/Http/Controllers/ClientPortal/UploadController.php +++ b/app/Http/Controllers/ClientPortal/UploadController.php @@ -30,7 +30,11 @@ class UploadController extends Controller */ public function __invoke(StoreUploadRequest $request) { - $this->saveDocuments($request->getFile(), auth()->user()->client, true); + + /** @var \App\Models\ClientContact $client_contact **/ + $client_contact = auth()->user(); + + $this->saveDocuments($request->getFile(), $client_contact->client, true); return response([], 200); } diff --git a/app/Http/Controllers/CompanyController.php b/app/Http/Controllers/CompanyController.php index 9c3506b0d19d..3741c61359c0 100644 --- a/app/Http/Controllers/CompanyController.php +++ b/app/Http/Controllers/CompanyController.php @@ -547,6 +547,8 @@ class CompanyController extends BaseController //If we are deleting the default companies, we'll need to make a new company the default. if ($account->default_company_id == $company_id) { + + /** @var \App\Models\Company $new_default_company **/ $new_default_company = Company::whereAccountId($account->id)->first(); $account->default_company_id = $new_default_company->id; $account->save(); @@ -560,7 +562,7 @@ class CompanyController extends BaseController * Update the specified resource in storage. * * @param UploadCompanyRequest $request - * @param Company $client + * @param Company $company * @return Response * * @@ -622,7 +624,7 @@ class CompanyController extends BaseController /** * Update the specified resource in storage. * - * @param UploadCompanyRequest $request + * @param DefaultCompanyRequest $request * @param Company $company * @return Response * diff --git a/app/Http/Controllers/CompanyUserController.php b/app/Http/Controllers/CompanyUserController.php index 1e3f686fe2d4..e3d7c7ba8f21 100644 --- a/app/Http/Controllers/CompanyUserController.php +++ b/app/Http/Controllers/CompanyUserController.php @@ -111,7 +111,10 @@ class CompanyUserController extends BaseController */ public function update(UpdateCompanyUserRequest $request, User $user) { - $company = auth()->user()->company(); + /** @var \App\Models\User $logged_in_user */ + $logged_in_user = auth()->user(); + + $company = $logged_in_user->company(); $company_user = CompanyUser::whereUserId($user->id)->whereCompanyId($company->id)->first(); @@ -121,7 +124,7 @@ class CompanyUserController extends BaseController return; } - if (auth()->user()->isAdmin()) { + if ($logged_in_user->isAdmin()) { $company_user->fill($request->input('company_user')); } else { $company_user->settings = $request->input('company_user')['settings']; @@ -136,7 +139,8 @@ class CompanyUserController extends BaseController public function updatePreferences(UpdateCompanyUserPreferencesRequest $request, User $user) { /** @var \App\Models\User $logged_in_user */ - $company = auth()->user()->company(); + $logged_in_user = auth()->user(); + $company = $logged_in_user->company(); $company_user = CompanyUser::whereUserId($user->id)->whereCompanyId($company->id)->first(); diff --git a/app/Http/Controllers/CreditController.php b/app/Http/Controllers/CreditController.php index 1e33151d3af5..fb48ea46cbe8 100644 --- a/app/Http/Controllers/CreditController.php +++ b/app/Http/Controllers/CreditController.php @@ -148,7 +148,10 @@ class CreditController extends BaseController */ public function create(CreateCreditRequest $request) { - $credit = CreditFactory::create(auth()->user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user**/ + $user = auth()->user(); + + $credit = CreditFactory::create($user->company()->id, auth()->user()->id); return $this->itemResponse($credit); } @@ -193,9 +196,13 @@ class CreditController extends BaseController */ public function store(StoreCreditRequest $request) { - $client = Client::find($request->input('client_id')); - $credit = $this->credit_repository->save($request->all(), CreditFactory::create(auth()->user()->company()->id, auth()->user()->id)); + /** @var \App\Models\User $user**/ + $user = auth()->user(); + + // $client = Client::find($request->input('client_id')); + + $credit = $this->credit_repository->save($request->all(), CreditFactory::create($user->company()->id, $user->id)); $credit = $credit->service() ->fillDefaults() @@ -207,7 +214,7 @@ class CreditController extends BaseController $credit->client->service()->updatePaidToDate(-1 * $credit->balance)->save(); } - event(new CreditWasCreated($credit, $credit->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); + event(new CreditWasCreated($credit, $credit->company, Ninja::eventVars($user->id))); return $this->itemResponse($credit); } @@ -383,7 +390,10 @@ class CreditController extends BaseController ->triggeredActions($request) ->deletePdf(); - event(new CreditWasUpdated($credit, $credit->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); + /** @var \App\Models\User $user**/ + $user = auth()->user(); + + event(new CreditWasUpdated($credit, $credit->company, Ninja::eventVars($user->id))); return $this->itemResponse($credit); } @@ -495,9 +505,13 @@ class CreditController extends BaseController */ public function bulk(BulkCreditRequest $request) { + + /** @var \App\Models\User $user**/ + $user = auth()->user(); + $action = $request->input('action'); - if (Ninja::isHosted() && (stripos($action, 'email') !== false) && !auth()->user()->company()->account->account_sms_verified) { + if (Ninja::isHosted() && (stripos($action, 'email') !== false) && !$user->company()->account->account_sms_verified) { return response(['message' => 'Please verify your account to send emails.'], 400); } @@ -515,20 +529,20 @@ class CreditController extends BaseController */ if ($action == 'bulk_download' && $credits->count() > 1) { - $credits->each(function ($credit) { - if (auth()->user()->cannot('view', $credit)) { + $credits->each(function ($credit) use($user){ + if ($user->cannot('view', $credit)) { nlog('access denied'); return response()->json(['message' => ctrans('text.access_denied')]); } }); - ZipCredits::dispatch($credits, $credits->first()->company, auth()->user()); + ZipCredits::dispatch($credits, $credits->first()->company, $user); return response()->json(['message' => ctrans('texts.sent_message')], 200); } - if ($action == 'bulk_print' && auth()->user()->can('view', $credits->first())) { + if ($action == 'bulk_print' && $user->can('view', $credits->first())) { $paths = $credits->map(function ($credit) { return $credit->service()->getCreditPdf($credit->invitations->first()); }); @@ -540,8 +554,8 @@ class CreditController extends BaseController }, 'print.pdf', ['Content-Type' => 'application/pdf']); } - $credits->each(function ($credit, $key) use ($action) { - if (auth()->user()->can('edit', $credit)) { + $credits->each(function ($credit, $key) use ($action, $user) { + if ($user->can('edit', $credit)) { $this->performAction($credit, $action, true); } }); diff --git a/app/Jobs/RecurringInvoice/SendRecurring.php b/app/Jobs/RecurringInvoice/SendRecurring.php index d82df8f7b235..49343ed73033 100644 --- a/app/Jobs/RecurringInvoice/SendRecurring.php +++ b/app/Jobs/RecurringInvoice/SendRecurring.php @@ -111,7 +111,7 @@ class SendRecurring implements ShouldQueue nlog("attempting to autobill {$invoice->number}"); AutoBill::dispatch($invoice->id, $this->db, true)->delay(rand(1, 2)); - //edge case to support where online payment notifications are not enabled + //04-08-2023 edge case to support where online payment notifications are not enabled if(!$invoice->client->getSetting('client_online_payment_notification')){ $this->sendRecurringEmails($invoice); } @@ -120,7 +120,7 @@ class SendRecurring implements ShouldQueue nlog("attempting to autobill {$invoice->number}"); AutoBill::dispatch($invoice->id, $this->db, true)->delay(rand(1, 2)); - //edge case to support where online payment notifications are not enabled + //04-08-2023 edge case to support where online payment notifications are not enabled if(!$invoice->client->getSetting('client_online_payment_notification')) { $this->sendRecurringEmails($invoice); } @@ -130,10 +130,16 @@ class SendRecurring implements ShouldQueue $this->sendRecurringEmails($invoice); } - } - private function sendRecurringEmails(Invoice $invoice) + /** + * Sends the recurring invoice emails to + * the designated contacts + * + * @param Invoice $invoice + * @return void + */ + private function sendRecurringEmails(Invoice $invoice): void { //Admin notification for recurring invoice sent. if ($invoice->invitations->count() >= 1) { diff --git a/app/Models/Account.php b/app/Models/Account.php index 0cdc5a09e373..8af6bc7e4023 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -185,42 +185,42 @@ class Account extends BaseModel return self::class; } - public function users() + public function users(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(User::class)->withTrashed(); } - public function default_company() + public function default_company(): \Illuminate\Database\Eloquent\Relations\HasOne { return $this->hasOne(Company::class, 'id', 'default_company_id'); } - public function payment() + public function payment(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Payment::class)->withTrashed(); } - public function companies() + public function companies(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(Company::class); } - public function bank_integrations() + public function bank_integrations(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(BankIntegration::class); } - public function company_users() + public function company_users(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(CompanyUser::class); } - public function owner() + public function owner(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(CompanyUser::class)->where('is_owner', true)->first() ? $this->hasMany(CompanyUser::class)->where('is_owner', true)->first()->user : false; } - public function tokens() + public function tokens(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(CompanyToken::class)->withTrashed(); } @@ -293,12 +293,12 @@ class Account extends BaseModel } } - public function isPaid() + public function isPaid(): bool { return Ninja::isNinja() ? ($this->isPaidHostedClient() && ! $this->isTrial()) : $this->hasFeature(self::FEATURE_WHITE_LABEL); } - public function isPaidHostedClient() + public function isPaidHostedClient(): bool { if (! Ninja::isNinja()) { return false; @@ -312,7 +312,7 @@ class Account extends BaseModel return $this->plan == 'pro' || $this->plan == 'enterprise'; } - public function isFreeHostedClient() + public function isFreeHostedClient(): bool { if (! Ninja::isNinja()) { return false; @@ -325,7 +325,7 @@ class Account extends BaseModel return $this->plan == 'free' || is_null($this->plan) || empty($this->plan); } - public function isEnterpriseClient() + public function isEnterpriseClient(): bool { if (! Ninja::isNinja()) { return false; @@ -334,7 +334,7 @@ class Account extends BaseModel return $this->plan == 'enterprise'; } - public function isTrial() + public function isTrial(): bool { if (! Ninja::isNinja()) { return false; @@ -345,7 +345,7 @@ class Account extends BaseModel return $plan_details && $plan_details['trial']; } - public function startTrial($plan) + public function startTrial($plan): void { if (! Ninja::isNinja()) { return; diff --git a/app/Models/Credit.php b/app/Models/Credit.php index 12923bc4f555..8a4dc2ea642d 100644 --- a/app/Models/Credit.php +++ b/app/Models/Credit.php @@ -11,22 +11,23 @@ namespace App\Models; +use App\Utils\Ninja; +use Illuminate\Support\Carbon; +use App\Utils\Traits\MakesHash; +use App\Utils\Traits\MakesDates; use App\Helpers\Invoice\InvoiceSum; -use App\Helpers\Invoice\InvoiceSumInclusive; use App\Jobs\Entity\CreateEntityPdf; -use App\Models\Presenters\CreditPresenter; +use App\Utils\Traits\MakesReminders; use App\Services\Credit\CreditService; use App\Services\Ledger\LedgerService; -use App\Utils\Ninja; -use App\Utils\Traits\MakesDates; -use App\Utils\Traits\MakesHash; -use App\Utils\Traits\MakesInvoiceValues; -use App\Utils\Traits\MakesReminders; -use Illuminate\Database\Eloquent\Relations\BelongsTo; -use Illuminate\Database\Eloquent\SoftDeletes; -use Illuminate\Support\Carbon; use Illuminate\Support\Facades\Storage; +use App\Utils\Traits\MakesInvoiceValues; use Laracasts\Presenter\PresentableTrait; +use App\Models\Presenters\CreditPresenter; +use App\Helpers\Invoice\InvoiceSumInclusive; +use Illuminate\Database\Eloquent\SoftDeletes; +use Illuminate\Database\Eloquent\Relations\BelongsTo; +use Illuminate\Database\Eloquent\Relations\MorphMany; /** * App\Models\Credit @@ -215,32 +216,32 @@ class Credit extends BaseModel return $this->dateMutator($value); } - public function assigned_user() + public function assigned_user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class, 'assigned_user_id', 'id')->withTrashed(); } - public function vendor() + public function vendor(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Vendor::class); } - public function history() + public function history(): \Illuminate\Database\Eloquent\Relations\HasManyThrough { return $this->hasManyThrough(Backup::class, Activity::class); } - public function activities() + public function activities(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(Activity::class)->orderBy('id', 'DESC')->take(50); } - public function company() + public function company(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Company::class); } - public function user() + public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class)->withTrashed(); } @@ -250,17 +251,12 @@ class Credit extends BaseModel return $this->belongsTo(Client::class)->withTrashed(); } - // public function contacts() - // { - // return $this->hasManyThrough(ClientContact::class, Client::class); - // } - - public function invitations() + public function invitations(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(CreditInvitation::class); } - public function project() + public function project(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Project::class)->withTrashed(); } @@ -268,17 +264,17 @@ class Credit extends BaseModel /** * The invoice which the credit has been created from. */ - public function invoice() + public function invoice(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Invoice::class); } - public function company_ledger() + public function company_ledger(): \Illuminate\Database\Eloquent\Relations\MorphMany { return $this->morphMany(CompanyLedger::class, 'company_ledgerable'); } - public function ledger() + public function ledger(): \App\Services\Ledger\LedgerService { return new LedgerService($this); } @@ -287,17 +283,17 @@ class Credit extends BaseModel * The invoice/s which the credit has * been applied to. */ - public function invoices() + public function invoices(): \Illuminate\Database\Eloquent\Relations\BelongsToMany { return $this->belongsToMany(Invoice::class)->using(Paymentable::class); } - public function payments() + public function payments(): \Illuminate\Database\Eloquent\Relations\MorphToMany { return $this->morphToMany(Payment::class, 'paymentable'); } - public function documents() + public function documents(): \Illuminate\Database\Eloquent\Relations\MorphMany { return $this->morphMany(Document::class, 'documentable'); } @@ -320,7 +316,7 @@ class Credit extends BaseModel return $credit_calc->build(); } - public function service() + public function service(): \App\Services\Credit\CreditService { return new CreditService($this); } @@ -423,12 +419,12 @@ class Credit extends BaseModel ]; } - public function translate_entity() + public function translate_entity(): string { return ctrans('texts.credit'); } - public static function stringStatus(int $status) + public static function stringStatus(int $status): string { switch ($status) { case self::STATUS_DRAFT: diff --git a/app/Models/Document.php b/app/Models/Document.php index 2195d893f7a2..e317e27c8656 100644 --- a/app/Models/Document.php +++ b/app/Models/Document.php @@ -56,32 +56,6 @@ use Illuminate\Support\Facades\Storage; * @method static \Illuminate\Database\Eloquent\Builder|Document onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Document query() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() - * @method static \Illuminate\Database\Eloquent\Builder|Document whereAssignedUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereCompanyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereCustomValue1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereCustomValue2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereCustomValue3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereCustomValue4($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereDeletedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereDisk($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereDocumentableId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereDocumentableType($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereHash($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereHeight($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereIsDefault($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereIsPublic($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereName($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document wherePreview($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereProjectId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereSize($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereType($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereUrl($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereVendorId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Document whereWidth($value) * @method static \Illuminate\Database\Eloquent\Builder|Document withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Document withoutTrashed() * @mixin \Eloquent diff --git a/app/Models/InvoiceInvitation.php b/app/Models/InvoiceInvitation.php index e3e0a19f7a0f..bd4e24f75d1a 100644 --- a/app/Models/InvoiceInvitation.php +++ b/app/Models/InvoiceInvitation.php @@ -107,42 +107,27 @@ class InvoiceInvitation extends BaseModel return Invoice::class; } - /** - * @return mixed - */ - public function invoice() + public function invoice(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Invoice::class)->withTrashed(); } - /** - * @return mixed - */ - public function getEntity() + public function getEntity(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Invoice::class)->withTrashed(); } - /** - * @return mixed - */ - public function contact() + public function contact(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(ClientContact::class, 'client_contact_id', 'id')->withTrashed(); } - /** - * @return mixed - */ - public function user() + public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class)->withTrashed(); } - /** - * @return BelongsTo - */ - public function company() + public function company(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Company::class); } @@ -156,24 +141,24 @@ class InvoiceInvitation extends BaseModel return sprintf('

%s: %s', $this->signature_base64, ctrans('texts.signed'), $this->createClientDate($this->signature_date, $this->contact->client->timezone()->name)); } - public function getName() + public function getName(): string { return $this->key; } - public function markViewed() + public function markViewed(): void { $this->viewed_date = Carbon::now(); $this->save(); } - public function markOpened() + public function markOpened(): void { $this->opened_date = Carbon::now(); $this->save(); } - public function pdf_file_path() + public function pdf_file_path(): string { $storage_path = Storage::url($this->invoice->client->invoice_filepath($this).$this->invoice->numberFormatter().'.pdf'); diff --git a/app/Models/User.php b/app/Models/User.php index a765ddef6d62..d30dc4fcadc3 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -283,7 +283,7 @@ class User extends Authenticatable implements MustVerifyEmail return $this->getCompany(); } - public function company_users() + public function company_users(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(CompanyUser::class)->withTrashed(); } @@ -313,8 +313,6 @@ class User extends Authenticatable implements MustVerifyEmail return $this->token()->cu; - // return $this->hasOneThrough(CompanyUser::class, CompanyToken::class, 'user_id', 'user_id', 'id', 'user_id') - // ->withTrashed(); } /** @@ -327,7 +325,7 @@ class User extends Authenticatable implements MustVerifyEmail return $this->company()->id; } - public function clients() + public function clients(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(Client::class); } @@ -352,7 +350,6 @@ class User extends Authenticatable implements MustVerifyEmail { return json_decode($this->token()->cu->settings); - //return json_decode($this->company_user->settings); } /** @@ -364,14 +361,12 @@ class User extends Authenticatable implements MustVerifyEmail { return $this->token()->cu->is_admin; - // return $this->company_user->is_admin; } public function isOwner() : bool { return $this->token()->cu->is_owner; - // return $this->company_user->is_owner; } /** @@ -389,7 +384,7 @@ class User extends Authenticatable implements MustVerifyEmail * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ - public function contacts() + public function contacts(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(ClientContact::class); } @@ -581,12 +576,12 @@ class User extends Authenticatable implements MustVerifyEmail return false; } - public function documents() + public function documents(): \Illuminate\Database\Eloquent\Relations\MorphMany { return $this->morphMany(Document::class, 'documentable'); } - public function isVerified() + public function isVerified(): bool { return is_null($this->email_verified_at) ? false : true; } diff --git a/app/PaymentDrivers/WePayPaymentDriver.php b/app/PaymentDrivers/WePayPaymentDriver.php index 199a48303ae8..ec521443850b 100644 --- a/app/PaymentDrivers/WePayPaymentDriver.php +++ b/app/PaymentDrivers/WePayPaymentDriver.php @@ -174,7 +174,9 @@ class WePayPaymentDriver extends BaseDriver $config = $this->company_gateway->getConfig(); $accountId = $this->company_gateway->getConfigField('accountId'); - + $objectId = false; + $objectType = ''; + foreach (array_keys($input) as $key) { if ('_id' == substr($key, -3)) { $objectType = substr($key, 0, -3); @@ -183,7 +185,7 @@ class WePayPaymentDriver extends BaseDriver } } - if (! isset($objectType)) { + if (! $objectId) { throw new \Exception('Could not find object id parameter'); } @@ -226,12 +228,13 @@ class WePayPaymentDriver extends BaseDriver return ['message' => 'Processed successfully']; } elseif ($objectType == 'checkout') { + /** @var \App\Models\Payment $payment */ $payment = Payment::where('company_id', $this->company_gateway->company_id) ->where('transaction_reference', '=', $objectId) ->first(); if (! $payment) { - throw new Exception('Unknown payment'); + throw new \Exception('Unknown payment'); } if ($payment->is_deleted) { diff --git a/app/Repositories/ActivityRepository.php b/app/Repositories/ActivityRepository.php index 575a2499ab14..129436d875e7 100644 --- a/app/Repositories/ActivityRepository.php +++ b/app/Repositories/ActivityRepository.php @@ -38,9 +38,9 @@ class ActivityRepository extends BaseRepository /** * Save the Activity. * - * @param stdClass $fields The fields - * @param Collection $entity The entity that you wish to have backed up (typically Invoice, Quote etc etc rather than Payment) - * @param $event_vars + * @param \stdClass $fields The fields + * @param \App\Models\Invoice | \App\Models\Quote | \App\Models\Credit | \App\Models\PurchaseOrder $entity + * @param array $event_vars */ public function save($fields, $entity, $event_vars) { @@ -69,8 +69,8 @@ class ActivityRepository extends BaseRepository /** * Creates a backup. * - * @param Collection $entity The entity - * @param Collection $activity The activity + * @param \App\Models\Invoice | \App\Models\Quote | \App\Models\Credit | \App\Models\PurchaseOrder $entity + * @param \App\Models\Activity $activity The activity */ public function createBackup($entity, $activity) { @@ -98,6 +98,7 @@ class ActivityRepository extends BaseRepository public function getTokenId(array $event_vars) { if ($event_vars['token']) { + /** @var \App\Models\CompanyToken $company_token **/ $company_token = CompanyToken::where('token', $event_vars['token'])->first(); if ($company_token) { diff --git a/app/Repositories/UserRepository.php b/app/Repositories/UserRepository.php index 1e59805c9bc6..f5d065a2da33 100644 --- a/app/Repositories/UserRepository.php +++ b/app/Repositories/UserRepository.php @@ -52,8 +52,9 @@ class UserRepository extends BaseRepository if ($unset_company_user) { unset($details['company_user']); } - - $company = auth()->user()->company(); + /** @var \App\Models\User $user */ + $user = auth()->user(); + $company = $user->company(); $account = $company->account; // if(array_key_exists('oauth_provider_id', $details)) From 26d520c9c26af529bf0e4176dbe35a6e5201a3d9 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 4 Aug 2023 17:12:21 +1000 Subject: [PATCH 05/17] Static analysis --- .../ClientPortal/NinjaPlanController.php | 2 + app/Http/Controllers/DocumentController.php | 11 +-- app/Http/Controllers/EmailController.php | 2 +- .../Controllers/ExpenseCategoryController.php | 15 ++-- .../Controllers/HostedMigrationController.php | 3 + app/Http/Controllers/MigrationController.php | 1 - .../Controllers/OneTimeTokenController.php | 22 +++--- app/Http/Controllers/PaymentController.php | 23 ++++-- .../PaymentNotificationWebhookController.php | 2 + .../Controllers/PaymentTermController.php | 53 +++++++++----- app/Http/Controllers/PreviewController.php | 4 +- .../PreviewPurchaseOrderController.php | 70 +++++++++++++------ app/Http/Controllers/ProjectController.php | 23 +++--- app/Http/Controllers/QuoteController.php | 61 +++++++++------- .../RecurringExpenseController.php | 4 +- app/Models/User.php | 2 +- 16 files changed, 191 insertions(+), 107 deletions(-) diff --git a/app/Http/Controllers/ClientPortal/NinjaPlanController.php b/app/Http/Controllers/ClientPortal/NinjaPlanController.php index 9afdd1db6bc0..996b8c2209c7 100644 --- a/app/Http/Controllers/ClientPortal/NinjaPlanController.php +++ b/app/Http/Controllers/ClientPortal/NinjaPlanController.php @@ -139,6 +139,8 @@ class NinjaPlanController extends Controller //set free trial if (auth()->guard('contact')->user()->client->custom_value2) { MultiDB::findAndSetDbByAccountKey(auth()->guard('contact')->user()->client->custom_value2); + + /** @var \App\Models\Account $account **/ $account = Account::where('key', auth()->guard('contact')->user()->client->custom_value2)->first(); // $account->trial_started = now(); // $account->trial_plan = 'pro'; diff --git a/app/Http/Controllers/DocumentController.php b/app/Http/Controllers/DocumentController.php index 7997de5101d0..0d65af5d84f1 100644 --- a/app/Http/Controllers/DocumentController.php +++ b/app/Http/Controllers/DocumentController.php @@ -69,7 +69,7 @@ class DocumentController extends BaseController * @OA\JsonContent(ref="#/components/schemas/Error"), * ), * ) - * @param DocumentsFilters $filters + * @param DocumentFilters $filters * @return Response|mixed */ public function index(DocumentFilters $filters) @@ -168,6 +168,9 @@ class DocumentController extends BaseController public function bulk() { + /** @var \App\Models\User $user */ + $user = auth()->user(); + $action = request()->input('action'); $ids = request()->input('ids'); @@ -179,15 +182,15 @@ class DocumentController extends BaseController } if ($action == 'download') { - ZipDocuments::dispatch($documents->pluck('id'), auth()->user()->company(), auth()->user()); + ZipDocuments::dispatch($documents->pluck('id'), $user->company(), auth()->user()); return response()->json(['message' => ctrans('texts.sent_message')], 200); } /* * Send the other actions to the switch */ - $documents->each(function ($document, $key) use ($action) { - if (auth()->user()->can('edit', $document)) { + $documents->each(function ($document, $key) use ($action, $user) { + if ($user->can('edit', $document)) { $this->document_repo->{$action}($document); } }); diff --git a/app/Http/Controllers/EmailController.php b/app/Http/Controllers/EmailController.php index b3077f10eb60..055cbfcffe64 100644 --- a/app/Http/Controllers/EmailController.php +++ b/app/Http/Controllers/EmailController.php @@ -73,7 +73,7 @@ class EmailController extends BaseController $mo->cc[] = new Address($request->cc_email); } - $entity_obj->invitations->each(function ($invitation) use ($data, $entity_obj, $template, $mo) { + $entity_obj->invitations->each(function ($invitation) use ($entity_obj, $mo) { if (! $invitation->contact->trashed() && $invitation->contact->email) { $entity_obj->service()->markSent()->save(); diff --git a/app/Http/Controllers/ExpenseCategoryController.php b/app/Http/Controllers/ExpenseCategoryController.php index ed38c3919403..36c47b9ba13f 100644 --- a/app/Http/Controllers/ExpenseCategoryController.php +++ b/app/Http/Controllers/ExpenseCategoryController.php @@ -138,8 +138,7 @@ class ExpenseCategoryController extends BaseController /** * Store a newly created resource in storage. * - * @param StoreInvoiceRequest $request The request - * + * @param StoreExpenseCategoryRequest $request * @return Response * * @@ -175,7 +174,10 @@ class ExpenseCategoryController extends BaseController */ public function store(StoreExpenseCategoryRequest $request) { - $expense_category = ExpenseCategoryFactory::create(auth()->user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user **/ + $user = auth()->user(); + + $expense_category = ExpenseCategoryFactory::create($user->company()->id, $user->id); $expense_category->fill($request->all()); $expense_category->save(); @@ -454,14 +456,17 @@ class ExpenseCategoryController extends BaseController */ public function bulk() { + /** @var \App\Models\User $user **/ + $user = auth()->user(); + $action = request()->input('action'); $ids = request()->input('ids'); $expense_categories = ExpenseCategory::withTrashed()->find($this->transformKeys($ids)); - $expense_categories->each(function ($expense_category, $key) use ($action) { - if (auth()->user()->can('edit', $expense_category)) { + $expense_categories->each(function ($expense_category, $key) use ($action, $user) { + if ($user->can('edit', $expense_category)) { $this->base_repo->{$action}($expense_category); } }); diff --git a/app/Http/Controllers/HostedMigrationController.php b/app/Http/Controllers/HostedMigrationController.php index 4ddc57d5593f..5d5e0cc18aaf 100644 --- a/app/Http/Controllers/HostedMigrationController.php +++ b/app/Http/Controllers/HostedMigrationController.php @@ -43,6 +43,8 @@ class HostedMigrationController extends Controller $company = $account->companies->first(); + /** @var \App\Models\CompanyToken $company_token **/ + $company_token = CompanyToken::where('user_id', auth()->user()->id) ->where('company_id', $company->id) ->first(); @@ -60,6 +62,7 @@ class HostedMigrationController extends Controller MultiDB::findAndSetDbByCompanyKey($input['account_key']); + /** @var \App\Models\Company $company **/ $company = Company::with('account')->where('company_key', $input['account_key'])->first(); $forward_url = $company->domain(); diff --git a/app/Http/Controllers/MigrationController.php b/app/Http/Controllers/MigrationController.php index 57b3044f228e..55f8979d8737 100644 --- a/app/Http/Controllers/MigrationController.php +++ b/app/Http/Controllers/MigrationController.php @@ -255,7 +255,6 @@ class MigrationController extends BaseController * ), * ) * @param Request $request - * @param Company $company * @return \Illuminate\Http\JsonResponse|void */ public function startMigration(Request $request) diff --git a/app/Http/Controllers/OneTimeTokenController.php b/app/Http/Controllers/OneTimeTokenController.php index a271fc7b0b3e..2d387a0fc998 100644 --- a/app/Http/Controllers/OneTimeTokenController.php +++ b/app/Http/Controllers/OneTimeTokenController.php @@ -11,14 +11,15 @@ namespace App\Http\Controllers; -use App\Http\Requests\OneTimeToken\OneTimeRouterRequest; -use App\Http\Requests\OneTimeToken\OneTimeTokenRequest; -use App\Models\Company; use App\Models\User; +use App\Models\Company; +use App\Libraries\MultiDB; +use Illuminate\Support\Str; use Illuminate\Http\Response; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Cache; -use Illuminate\Support\Str; +use App\Http\Requests\OneTimeToken\OneTimeTokenRequest; +use App\Http\Requests\OneTimeToken\OneTimeRouterRequest; class OneTimeTokenController extends BaseController { @@ -33,7 +34,7 @@ class OneTimeTokenController extends BaseController /** * Store a newly created resource in storage. * - * @param CreateOneTimeTokenRequest $request + * @param OneTimeTokenRequest $request * @return Response * * @OA\Post( @@ -64,11 +65,14 @@ class OneTimeTokenController extends BaseController */ public function create(OneTimeTokenRequest $request) { + /** @var \App\Models\User $user */ + $user = auth()->user(); + $hash = Str::random(64); $data = [ - 'user_id' => auth()->user()->id, - 'company_key'=> auth()->user()->company()->company_key, + 'user_id' => $user->id, + 'company_key'=> $user->company()->company_key, 'context' => $request->input('context'), ]; @@ -83,10 +87,6 @@ class OneTimeTokenController extends BaseController MultiDB::findAndSetDbByCompanyKey($data['company_key']); - // $user = User::findOrFail($data['user_id']); - // Auth::login($user, true); - // Cache::forget($request->input('hash')); - $this->sendTo($data['context']); } diff --git a/app/Http/Controllers/PaymentController.php b/app/Http/Controllers/PaymentController.php index f747741342fb..8498c9d4bdc4 100644 --- a/app/Http/Controllers/PaymentController.php +++ b/app/Http/Controllers/PaymentController.php @@ -152,7 +152,10 @@ class PaymentController extends BaseController */ public function create(CreatePaymentRequest $request) { - $payment = PaymentFactory::create(auth()->user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $payment = PaymentFactory::create($user->company()->id, $user->id); return $this->itemResponse($payment); } @@ -203,7 +206,10 @@ class PaymentController extends BaseController */ public function store(StorePaymentRequest $request) { - $payment = $this->payment_repo->save($request->all(), PaymentFactory::create(auth()->user()->company()->id, auth()->user()->id)); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $payment = $this->payment_repo->save($request->all(), PaymentFactory::create($user->company()->id, $user->id)); event('eloquent.created: App\Models\Payment', $payment); @@ -372,13 +378,16 @@ class PaymentController extends BaseController */ public function update(UpdatePaymentRequest $request, Payment $payment) { + /** @var \App\Models\User $user */ + $user = auth()->user(); + if ($request->entityIsDeleted($payment)) { return $request->disallowUpdate(); } $payment = $this->payment_repo->save($request->all(), $payment); - event(new PaymentWasUpdated($payment, $payment->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); + event(new PaymentWasUpdated($payment, $payment->company, Ninja::eventVars($user->id))); event('eloquent.updated: App\Models\Payment', $payment); @@ -495,14 +504,17 @@ class PaymentController extends BaseController */ public function bulk() { + /** @var \App\Models\User $user */ + $user = auth()->user(); + $action = request()->input('action'); $ids = request()->input('ids'); $payments = Payment::withTrashed()->find($this->transformKeys($ids)); - $payments->each(function ($payment, $key) use ($action) { - if (auth()->user()->can('edit', $payment)) { + $payments->each(function ($payment, $key) use ($action, $user) { + if ($user->can('edit', $payment)) { $this->performAction($payment, $action, true); } }); @@ -576,7 +588,6 @@ class PaymentController extends BaseController * @OA\JsonContent(ref="#/components/schemas/Error"), * ), * ) - * @param ActionPaymentRequest $request * @param Payment $payment * @param $action */ diff --git a/app/Http/Controllers/PaymentNotificationWebhookController.php b/app/Http/Controllers/PaymentNotificationWebhookController.php index 5e9510caa184..de1940b75d45 100644 --- a/app/Http/Controllers/PaymentNotificationWebhookController.php +++ b/app/Http/Controllers/PaymentNotificationWebhookController.php @@ -23,6 +23,8 @@ class PaymentNotificationWebhookController extends Controller public function __invoke(PaymentNotificationWebhookRequest $request, string $company_key, string $company_gateway_id, string $client_hash) { + /** @var \App\Models\CompanyGateway $company_gateway */ + $company_gateway = CompanyGateway::find($this->decodePrimaryKey($company_gateway_id)); $client = Client::find($this->decodePrimaryKey($client_hash)); diff --git a/app/Http/Controllers/PaymentTermController.php b/app/Http/Controllers/PaymentTermController.php index 0864dc9e4ee4..a4992ca040d3 100644 --- a/app/Http/Controllers/PaymentTermController.php +++ b/app/Http/Controllers/PaymentTermController.php @@ -1,20 +1,29 @@ user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user */ + $user = auth()->user(); + $payment_term = PaymentTermFactory::create($user->company()->id, $user->id); return $this->itemResponse($payment_term); } @@ -172,7 +183,10 @@ class PaymentTermController extends BaseController */ public function store(StorePaymentTermRequest $request) { - $payment_term = PaymentTermFactory::create(auth()->user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $payment_term = PaymentTermFactory::create($user->company()->id, $user->id); $payment_term->fill($request->all()); $payment_term->save(); @@ -270,13 +284,13 @@ class PaymentTermController extends BaseController * @OA\JsonContent(ref="#/components/schemas/Error"), * ), * ) - * @param EditPaymentRequest $request - * @param Payment $payment + * @param EditPaymentTermRequest $request + * @param PaymentTerm $payment_term * @return Response|mixed */ - public function edit(EditPaymentRequest $request, Payment $payment) + public function edit(EditPaymentTermRequest $request, PaymentTerm $payment_term) { - return $this->itemResponse($payment); + return $this->itemResponse($payment_term); } /** @@ -447,14 +461,17 @@ class PaymentTermController extends BaseController */ public function bulk() { + /** @var \App\Models\User $user */ + $user = auth()->user(); + $action = request()->input('action'); $ids = request()->input('ids'); $payment_terms = PaymentTerm::withTrashed()->company()->find($this->transformKeys($ids)); - $payment_terms->each(function ($payment_term, $key) use ($action) { - if (auth()->user()->can('edit', $payment_term)) { + $payment_terms->each(function ($payment_term, $key) use ($action, $user) { + if ($user->can('edit', $payment_term)) { $this->payment_term_repo->{$action}($payment_term); } }); diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 7402b886a4cf..4ff7f3dabce2 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -209,7 +209,7 @@ class PreviewController extends BaseController if ($request->has('entity_id')) { - /** @var \App\Models\BaseModel $class */ + /** @var \App\Models\Quote | \App\Models\Invoice | \App\Models\RecurringInvoice | \App\Models\Credit $class */ $entity_obj = $class::on(config('database.default')) ->with('client.company') ->where('id', $this->decodePrimaryKey($request->input('entity_id'))) @@ -239,6 +239,7 @@ class PreviewController extends BaseController $html = new HtmlEngine($entity_obj->invitations()->first()); + /** @var \App\Models\Design $design */ $design = \App\Models\Design::withTrashed()->find($entity_obj->design_id); /* Catch all in case migration doesn't pass back a valid design */ @@ -343,6 +344,7 @@ class PreviewController extends BaseController $t = app('translator'); $t->replace(Ninja::transformTranslations($company->settings)); + /** @var \App\Models\InvoiceInvitation $invitation */ $invitation = InvoiceInvitation::where('company_id', $company->id)->orderBy('id', 'desc')->first(); /* If we don't have a valid invitation in the system - create a mock using transactions */ diff --git a/app/Http/Controllers/PreviewPurchaseOrderController.php b/app/Http/Controllers/PreviewPurchaseOrderController.php index 92d51e56a9f3..bdc90f3f8d28 100644 --- a/app/Http/Controllers/PreviewPurchaseOrderController.php +++ b/app/Http/Controllers/PreviewPurchaseOrderController.php @@ -140,10 +140,13 @@ class PreviewPurchaseOrderController extends BaseController return (new Phantom)->convertHtmlToPdf($maker->getCompiledHTML(true)); } + /** @var \App\Models\User $user */ + $user = auth()->user(); + if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); - $numbered_pdf = $this->pageNumbering($pdf, auth()->user()->company()); + $numbered_pdf = $this->pageNumbering($pdf, $user->company()); if ($numbered_pdf) { $pdf = $numbered_pdf; @@ -153,7 +156,7 @@ class PreviewPurchaseOrderController extends BaseController } //else - $file_path = (new PreviewPdf($maker->getCompiledHTML(true), auth()->user()->company()))->handle(); + $file_path = (new PreviewPdf($maker->getCompiledHTML(true), $user->company()))->handle(); return response()->download($file_path, basename($file_path), ['Cache-Control:' => 'no-cache'])->deleteFileAfterSend(true); } @@ -163,12 +166,15 @@ class PreviewPurchaseOrderController extends BaseController public function live(PreviewPurchaseOrderRequest $request) { - $company = auth()->user()->company(); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $company = $user->company(); MultiDB::setDb($company->db); $repo = new PurchaseOrderRepository(); - $entity_obj = PurchaseOrderFactory::create($company->id, auth()->user()->id); + $entity_obj = PurchaseOrderFactory::create($company->id, $user->id); $class = PurchaseOrder::class; try { @@ -196,6 +202,7 @@ class PreviewPurchaseOrderController extends BaseController $html = new VendorHtmlEngine($entity_obj->invitations()->first()); + /** @var \App\Models\Design $design */ $design = \App\Models\Design::withTrashed()->find($entity_obj->design_id); /* Catch all in case migration doesn't pass back a valid design */ @@ -243,6 +250,8 @@ class PreviewPurchaseOrderController extends BaseController return; } + /** @var \App\Models\User $user */ + $user = auth()->user(); //if phantom js...... inject here.. if (config('ninja.phantomjs_pdf_generation') || config('ninja.pdf_generator') == 'phantom') { @@ -252,7 +261,7 @@ class PreviewPurchaseOrderController extends BaseController if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); - $numbered_pdf = $this->pageNumbering($pdf, auth()->user()->company()); + $numbered_pdf = $this->pageNumbering($pdf, $user->company()); if ($numbered_pdf) { $pdf = $numbered_pdf; @@ -279,11 +288,15 @@ class PreviewPurchaseOrderController extends BaseController private function blankEntity() { + /** @var \App\Models\User $user */ + $user = auth()->user(); + App::forgetInstance('translator'); $t = app('translator'); - $t->replace(Ninja::transformTranslations(auth()->user()->company()->settings)); + $t->replace(Ninja::transformTranslations($user->company()->settings)); - $invitation = PurchaseOrderInvitation::where('company_id', auth()->user()->company()->id)->orderBy('id', 'desc')->first(); + /** @var \App\Models\PurchaseOrderInvitation $invitation */ + $invitation = PurchaseOrderInvitation::where('company_id', $user->company()->id)->orderBy('id', 'desc')->first(); /* If we don't have a valid invitation in the system - create a mock using transactions */ if (!$invitation) { @@ -327,10 +340,13 @@ class PreviewPurchaseOrderController extends BaseController return (new Phantom)->convertHtmlToPdf($maker->getCompiledHTML(true)); } + /** @var \App\Models\User $user */ + $user = auth()->user(); + if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); - $numbered_pdf = $this->pageNumbering($pdf, auth()->user()->company()); + $numbered_pdf = $this->pageNumbering($pdf, $user->company()); if ($numbered_pdf) { $pdf = $numbered_pdf; @@ -339,7 +355,7 @@ class PreviewPurchaseOrderController extends BaseController return $pdf; } - $file_path = (new PreviewPdf($maker->getCompiledHTML(true), auth()->user()->company()))->handle(); + $file_path = (new PreviewPdf($maker->getCompiledHTML(true), $user->company()))->handle(); $response = Response::make($file_path, 200); $response->header('Content-Type', 'application/pdf'); @@ -349,40 +365,47 @@ class PreviewPurchaseOrderController extends BaseController private function mockEntity() { - DB::connection(auth()->user()->company()->db)->beginTransaction(); + /** @var \App\Models\User $user */ + $user = auth()->user(); + DB::connection($user->company()->db)->beginTransaction(); + + /** @var \App\Models\Vendor $vendor */ $vendor = Vendor::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, ]); + /** @var \App\Models\VendorContact $contact */ $contact = VendorContact::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, 'vendor_id' => $vendor->id, 'is_primary' => 1, 'send_email' => true, ]); + /** @var \App\Models\PurchaseOrder $purchase_order */ $purchase_order = PurchaseOrder::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, 'vendor_id' => $vendor->id, 'terms' => 'Sample Terms', 'footer' => 'Sample Footer', 'public_notes' => 'Sample Public Notes', ]); + /** @var \App\Models\PurchaseOrderInvitation $invitation */ $invitation = PurchaseOrderInvitation::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, 'purchase_order_id' => $purchase_order->id, 'vendor_contact_id' => $contact->id, ]); $purchase_order->setRelation('invitations', $invitation); $purchase_order->setRelation('vendor', $vendor); - $purchase_order->setRelation('company', auth()->user()->company()); + $purchase_order->setRelation('company', $user->company()); $purchase_order->load('vendor.company'); $design_object = json_decode(json_encode(request()->input('design'))); @@ -413,7 +436,10 @@ class PreviewPurchaseOrderController extends BaseController ->design($design) ->build(); - DB::connection(auth()->user()->company()->db)->rollBack(); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + DB::connection($user->company()->db)->rollBack(); if (request()->query('html') == 'true') { return $maker->getCompiledHTML(); @@ -426,7 +452,7 @@ class PreviewPurchaseOrderController extends BaseController if (config('ninja.invoiceninja_hosted_pdf_generation') || config('ninja.pdf_generator') == 'hosted_ninja') { $pdf = (new NinjaPdf())->build($maker->getCompiledHTML(true)); - $numbered_pdf = $this->pageNumbering($pdf, auth()->user()->company()); + $numbered_pdf = $this->pageNumbering($pdf, $user->company()); if ($numbered_pdf) { $pdf = $numbered_pdf; @@ -435,7 +461,7 @@ class PreviewPurchaseOrderController extends BaseController return $pdf; } - $file_path = (new PreviewPdf($maker->getCompiledHTML(true), auth()->user()->company()))->handle(); + $file_path = (new PreviewPdf($maker->getCompiledHTML(true), $user->company()))->handle(); $response = Response::make($file_path, 200); $response->header('Content-Type', 'application/pdf'); diff --git a/app/Http/Controllers/ProjectController.php b/app/Http/Controllers/ProjectController.php index fc921b191242..e2be244ef02c 100644 --- a/app/Http/Controllers/ProjectController.php +++ b/app/Http/Controllers/ProjectController.php @@ -312,7 +312,10 @@ class ProjectController extends BaseController */ public function create(CreateProjectRequest $request) { - $project = ProjectFactory::create(auth()->user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $project = ProjectFactory::create($user->company()->id, $user->id); return $this->itemResponse($project); } @@ -357,7 +360,10 @@ class ProjectController extends BaseController */ public function store(StoreProjectRequest $request) { - $project = ProjectFactory::create(auth()->user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $project = ProjectFactory::create($user->company()->id, $user->id); $project->fill($request->all()); $project->saveQuietly(); @@ -486,14 +492,17 @@ class ProjectController extends BaseController */ public function bulk() { + /** @var \App\Models\User $user */ + $user = auth()->user(); + $action = request()->input('action'); $ids = request()->input('ids'); $projects = Project::withTrashed()->find($this->transformKeys($ids)); - $projects->each(function ($project, $key) use ($action) { - if (auth()->user()->can('edit', $project)) { + $projects->each(function ($project, $key) use ($action, $user) { + if ($user->can('edit', $project)) { $this->project_repo->{$action}($project); } }); @@ -504,12 +513,10 @@ class ProjectController extends BaseController /** * Update the specified resource in storage. * - * @param UploadProductRequest $request - * @param Product $project + * @param UploadProjectRequest $request + * @param Project $project * @return Response * - * - * * @OA\Put( * path="/api/v1/projects/{id}/upload", * operationId="uploadProject", diff --git a/app/Http/Controllers/QuoteController.php b/app/Http/Controllers/QuoteController.php index 1e53d2d46189..08dd6d885d85 100644 --- a/app/Http/Controllers/QuoteController.php +++ b/app/Http/Controllers/QuoteController.php @@ -162,7 +162,10 @@ class QuoteController extends BaseController */ public function create(CreateQuoteRequest $request) { - $quote = QuoteFactory::create(auth()->user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $quote = QuoteFactory::create($user->company()->id, $user->id); return $this->itemResponse($quote); } @@ -208,16 +211,17 @@ class QuoteController extends BaseController */ public function store(StoreQuoteRequest $request) { - $client = Client::find($request->input('client_id')); - - $quote = $this->quote_repo->save($request->all(), QuoteFactory::create(auth()->user()->company()->id, auth()->user()->id)); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $quote = $this->quote_repo->save($request->all(), QuoteFactory::create($user->company()->id, $user->id)); $quote = $quote->service() ->fillDefaults() ->triggeredActions($request) ->save(); - event(new QuoteWasCreated($quote, $quote->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); + event(new QuoteWasCreated($quote, $quote->company, Ninja::eventVars($user->id))); return $this->itemResponse($quote); } @@ -509,6 +513,9 @@ class QuoteController extends BaseController */ public function bulk(BulkActionQuoteRequest $request) { + /** @var \App\Models\User $user */ + $user = auth()->user(); + $action = request()->input('action'); $ids = request()->input('ids'); @@ -528,8 +535,8 @@ class QuoteController extends BaseController */ if ($action == 'bulk_download' && $quotes->count() >= 1) { - $quotes->each(function ($quote) { - if (auth()->user()->cannot('view', $quote)) { + $quotes->each(function ($quote) use($user){ + if ($user->cannot('view', $quote)) { return response()->json(['message'=> ctrans('texts.access_denied')]); } }); @@ -543,8 +550,8 @@ class QuoteController extends BaseController $this->entity_type = Quote::class; $this->entity_transformer = QuoteTransformer::class; - $quotes->each(function ($quote, $key) use ($action) { - if (auth()->user()->can('edit', $quote) && $quote->service()->isConvertable()) { + $quotes->each(function ($quote, $key) use ($user) { + if ($user->can('edit', $quote) && $quote->service()->isConvertable()) { $quote->service()->convertToInvoice(); } }); @@ -552,7 +559,7 @@ class QuoteController extends BaseController return $this->listResponse(Quote::withTrashed()->whereIn('id', $this->transformKeys($ids))->company()); } - if ($action == 'bulk_print' && auth()->user()->can('view', $quotes->first())) { + if ($action == 'bulk_print' && $user->can('view', $quotes->first())) { $paths = $quotes->map(function ($quote) { return $quote->service()->getQuotePdf(); }); @@ -566,9 +573,9 @@ class QuoteController extends BaseController if ($action == 'convert_to_project') { - $quotes->each(function ($quote, $key) use ($action) { - if (auth()->user()->can('edit', $quote)) { - $project = CloneQuoteToProjectFactory::create($quote, auth()->user()->id); + $quotes->each(function ($quote, $key) use ($user) { + if ($user->can('edit', $quote)) { + $project = CloneQuoteToProjectFactory::create($quote, $user->id); if (empty($project->number)) { $project->number = $this->getNextProjectNumber($project); @@ -585,8 +592,8 @@ class QuoteController extends BaseController /* * Send the other actions to the switch */ - $quotes->each(function ($quote, $key) use ($action) { - if (auth()->user()->can('edit', $quote)) { + $quotes->each(function ($quote, $key) use ($action, $user) { + if ($user->can('edit', $quote)) { $this->performAction($quote, $action, true); } }); @@ -607,18 +614,18 @@ class QuoteController extends BaseController * tags={"quotes"}, * summary="Performs a custom action on an Quote", * description="Performs a custom action on an Quote. - - The current range of actions are as follows - - clone_to_quote - - history - - delivery_note - - mark_paid - - download - - archive - - delete - - convert - - convert_to_invoice - - email", + * + * The current range of actions are as follows + * - clone_to_quote + * - history + * - delivery_note + * - mark_paid + * - download + * - archive + * - delete + * - convert + * - convert_to_invoice + * - email", * @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"), * @OA\Parameter(ref="#/components/parameters/X-Requested-With"), * @OA\Parameter(ref="#/components/parameters/include"), diff --git a/app/Http/Controllers/RecurringExpenseController.php b/app/Http/Controllers/RecurringExpenseController.php index 2edb1be1e82e..1ff6b628e1d2 100644 --- a/app/Http/Controllers/RecurringExpenseController.php +++ b/app/Http/Controllers/RecurringExpenseController.php @@ -49,7 +49,7 @@ class RecurringExpenseController extends BaseController protected $entity_transformer = RecurringExpenseTransformer::class; /** - * @var RecurringExpenseepository + * @var RecurringExpenseRepository */ protected $recurring_expense_repo; @@ -72,7 +72,7 @@ class RecurringExpenseController extends BaseController * summary="Gets a list of recurring_expenses", * description="Lists recurring_expenses, search and filters allow fine grained lists to be generated. - Query parameters can be added to performed more fine grained filtering of the recurring_expenses, these are handled by the RecurringExpenseFilters class which defines the methods available", + * Query parameters can be added to performed more fine grained filtering of the recurring_expenses, these are handled by the RecurringExpenseFilters class which defines the methods available", * @OA\Parameter(ref="#/components/parameters/X-API-TOKEN"), * @OA\Parameter(ref="#/components/parameters/X-Requested-With"), * @OA\Parameter(ref="#/components/parameters/include"), diff --git a/app/Models/User.php b/app/Models/User.php index d30dc4fcadc3..8a69ea4d9dc2 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -231,7 +231,7 @@ class User extends Authenticatable implements MustVerifyEmail * * @return \Illuminate\Database\Eloquent\Relations\BelongsToMany */ - public function companies() + public function companies(): \Illuminate\Database\Eloquent\Relations\BelongsToMany { return $this->belongsToMany(Company::class)->using(CompanyUser::class)->withPivot('permissions', 'settings', 'is_admin', 'is_owner', 'is_locked')->withTimestamps(); } From dc1d23067cd2ad9be7c000b4628be61a5468f4dc Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 4 Aug 2023 18:13:26 +1000 Subject: [PATCH 06/17] Fixes for tests --- .../Controllers/CompanyUserController.php | 11 ++-- app/Http/Controllers/QuoteController.php | 2 +- .../RecurringExpenseController.php | 19 ++++-- .../Controllers/RecurringQuoteController.php | 25 +++++--- .../Controllers/Shop/ClientController.php | 2 + .../Controllers/Shop/InvoiceController.php | 2 + .../Controllers/Shop/ProductController.php | 2 + .../Controllers/Shop/ProfileController.php | 1 + app/Http/Controllers/StaticController.php | 8 ++- .../Controllers/StripeConnectController.php | 1 + app/Http/Controllers/StripeController.php | 30 ++++++--- .../Controllers/SubscriptionController.php | 48 ++++++++------ app/Http/Controllers/TaskController.php | 4 +- app/Http/Controllers/TaskStatusController.php | 19 +++--- app/Http/Controllers/VendorController.php | 2 +- .../VendorPortal/DocumentController.php | 2 + .../VendorPortal/PurchaseOrderController.php | 6 +- app/Models/PurchaseOrderInvitation.php | 27 +++----- app/Models/VendorContact.php | 64 +------------------ app/Repositories/UserRepository.php | 12 ++-- tests/Feature/UserTest.php | 5 +- 21 files changed, 135 insertions(+), 157 deletions(-) diff --git a/app/Http/Controllers/CompanyUserController.php b/app/Http/Controllers/CompanyUserController.php index e3d7c7ba8f21..22d1a0ee2ae9 100644 --- a/app/Http/Controllers/CompanyUserController.php +++ b/app/Http/Controllers/CompanyUserController.php @@ -111,10 +111,8 @@ class CompanyUserController extends BaseController */ public function update(UpdateCompanyUserRequest $request, User $user) { - /** @var \App\Models\User $logged_in_user */ - $logged_in_user = auth()->user(); - $company = $logged_in_user->company(); + $company = auth()->user()->company(); $company_user = CompanyUser::whereUserId($user->id)->whereCompanyId($company->id)->first(); @@ -124,7 +122,7 @@ class CompanyUserController extends BaseController return; } - if ($logged_in_user->isAdmin()) { + if (auth()->user()->isAdmin()) { $company_user->fill($request->input('company_user')); } else { $company_user->settings = $request->input('company_user')['settings']; @@ -138,9 +136,8 @@ class CompanyUserController extends BaseController public function updatePreferences(UpdateCompanyUserPreferencesRequest $request, User $user) { - /** @var \App\Models\User $logged_in_user */ - $logged_in_user = auth()->user(); - $company = $logged_in_user->company(); + + $company = auth()->user()->company(); $company_user = CompanyUser::whereUserId($user->id)->whereCompanyId($company->id)->first(); diff --git a/app/Http/Controllers/QuoteController.php b/app/Http/Controllers/QuoteController.php index 08dd6d885d85..cfbad5fe931c 100644 --- a/app/Http/Controllers/QuoteController.php +++ b/app/Http/Controllers/QuoteController.php @@ -520,7 +520,7 @@ class QuoteController extends BaseController $ids = request()->input('ids'); - if (Ninja::isHosted() && (stripos($action, 'email') !== false) && !auth()->user()->company()->account->account_sms_verified) { + if (Ninja::isHosted() && (stripos($action, 'email') !== false) && !$user->account->account_sms_verified) { return response(['message' => 'Please verify your account to send emails.'], 400); } diff --git a/app/Http/Controllers/RecurringExpenseController.php b/app/Http/Controllers/RecurringExpenseController.php index 1ff6b628e1d2..0a4d4ef59377 100644 --- a/app/Http/Controllers/RecurringExpenseController.php +++ b/app/Http/Controllers/RecurringExpenseController.php @@ -320,7 +320,10 @@ class RecurringExpenseController extends BaseController */ public function create(CreateRecurringExpenseRequest $request) { - $recurring_expense = RecurringExpenseFactory::create(auth()->user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $recurring_expense = RecurringExpenseFactory::create($user->company()->id, $user->id); return $this->itemResponse($recurring_expense); } @@ -365,10 +368,13 @@ class RecurringExpenseController extends BaseController */ public function store(StoreRecurringExpenseRequest $request) { - $recurring_expense = $this->recurring_expense_repo->save($request->all(), RecurringExpenseFactory::create(auth()->user()->company()->id, auth()->user()->id)); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $recurring_expense = $this->recurring_expense_repo->save($request->all(), RecurringExpenseFactory::create($user->company()->id, $user->id)); $recurring_expense->service()->triggeredActions($request)->save(); - event(new RecurringExpenseWasCreated($recurring_expense, $recurring_expense->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); + event(new RecurringExpenseWasCreated($recurring_expense, $recurring_expense->company, Ninja::eventVars($user->id))); return $this->itemResponse($recurring_expense); } @@ -481,13 +487,16 @@ class RecurringExpenseController extends BaseController */ public function bulk() { + /** @var \App\Models\User $user */ + $user = auth()->user(); + $action = request()->input('action'); $ids = request()->input('ids'); $recurring_expenses = RecurringExpense::withTrashed()->find($this->transformKeys($ids)); - $recurring_expenses->each(function ($recurring_expense, $key) use ($action) { - if (auth()->user()->can('edit', $recurring_expense)) { + $recurring_expenses->each(function ($recurring_expense, $key) use ($action, $user) { + if ($user->can('edit', $recurring_expense)) { $this->performAction($recurring_expense, $action, true); } }); diff --git a/app/Http/Controllers/RecurringQuoteController.php b/app/Http/Controllers/RecurringQuoteController.php index 141f8ecf92eb..348440c234a1 100644 --- a/app/Http/Controllers/RecurringQuoteController.php +++ b/app/Http/Controllers/RecurringQuoteController.php @@ -148,7 +148,10 @@ class RecurringQuoteController extends BaseController */ public function create(CreateRecurringQuoteRequest $request) { - $recurring_quote = RecurringQuoteFactory::create(auth()->user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $recurring_quote = RecurringQuoteFactory::create($user->company()->id, $user->id); return $this->itemResponse($recurring_quote); } @@ -193,7 +196,10 @@ class RecurringQuoteController extends BaseController */ public function store(StoreRecurringQuoteRequest $request) { - $recurring_quote = $this->recurring_quote_repo->save($request, RecurringQuoteFactory::create(auth()->user()->company()->id, auth()->user()->id)); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $recurring_quote = $this->recurring_quote_repo->save($request, RecurringQuoteFactory::create($user->company()->id, $user->id)); return $this->itemResponse($recurring_quote); } @@ -479,14 +485,17 @@ class RecurringQuoteController extends BaseController */ public function bulk() { + /** @var \App\Models\User $user */ + $user = auth()->user(); + $action = request()->input('action'); $ids = request()->input('ids'); $recurring_quotes = RecurringQuote::withTrashed()->find($this->transformKeys($ids)); - $recurring_quotes->each(function ($recurring_quote, $key) use ($action) { - if (auth()->user()->can('edit', $recurring_quote)) { + $recurring_quotes->each(function ($recurring_quote, $key) use ($action, $user) { + if ($user->can('edit', $recurring_quote)) { $this->recurring_quote_repo->{$action}($recurring_quote); } }); @@ -573,11 +582,11 @@ class RecurringQuoteController extends BaseController // return $this->itemResponse($recurring_invoice); break; case 'clone_to_quote': - $quote = CloneRecurringQuoteToQuoteFactory::create($recurring_invoice, auth()->user()->id); - $this->entity_transformer = QuoteTransformer::class; - $this->entity_type = Quote::class; + // $quote = CloneRecurringQuoteToQuoteFactory::create($recurring_invoice, auth()->user()->id); + // $this->entity_transformer = QuoteTransformer::class; + // $this->entity_type = Quote::class; - return $this->itemResponse($quote); + // return $this->itemResponse($quote); break; case 'history': // code... diff --git a/app/Http/Controllers/Shop/ClientController.php b/app/Http/Controllers/Shop/ClientController.php index eaea49eb99f1..2711563aadf6 100644 --- a/app/Http/Controllers/Shop/ClientController.php +++ b/app/Http/Controllers/Shop/ClientController.php @@ -53,6 +53,7 @@ class ClientController extends BaseController public function show(Request $request, string $contact_key) { + /** @var \App\Models\Company $company */ $company = Company::where('company_key', $request->header('X-API-COMPANY-KEY'))->first(); if (! $company->enable_shop_api) { @@ -69,6 +70,7 @@ class ClientController extends BaseController public function store(StoreShopClientRequest $request) { + /** @var \App\Models\Company $company */ $company = Company::where('company_key', $request->header('X-API-COMPANY-KEY'))->first(); if (! $company->enable_shop_api) { diff --git a/app/Http/Controllers/Shop/InvoiceController.php b/app/Http/Controllers/Shop/InvoiceController.php index e5eca8f2d7a9..b8ad0d90328f 100644 --- a/app/Http/Controllers/Shop/InvoiceController.php +++ b/app/Http/Controllers/Shop/InvoiceController.php @@ -53,6 +53,7 @@ class InvoiceController extends BaseController public function show(Request $request, string $invitation_key) { + /** @var \App\Models\Company $company */ $company = Company::where('company_key', $request->header('X-API-COMPANY-KEY'))->first(); if (! $company->enable_shop_api) { @@ -69,6 +70,7 @@ class InvoiceController extends BaseController public function store(StoreShopInvoiceRequest $request) { + /** @var \App\Models\Company $company */ $company = Company::where('company_key', $request->header('X-API-COMPANY-KEY'))->first(); if (! $company->enable_shop_api) { diff --git a/app/Http/Controllers/Shop/ProductController.php b/app/Http/Controllers/Shop/ProductController.php index da6d91407e63..aea06f5c5f9d 100644 --- a/app/Http/Controllers/Shop/ProductController.php +++ b/app/Http/Controllers/Shop/ProductController.php @@ -36,6 +36,7 @@ class ProductController extends BaseController */ public function index(Request $request) { + /** @var \App\Models\Company $company */ $company = Company::where('company_key', $request->header('X-API-COMPANY-KEY'))->firstOrFail(); if (! $company->enable_shop_api) { @@ -49,6 +50,7 @@ class ProductController extends BaseController public function show(Request $request, string $product_key) { + /** @var \App\Models\Company $company */ $company = Company::where('company_key', $request->header('X-API-COMPANY-KEY'))->firstOrFail(); if (! $company->enable_shop_api) { diff --git a/app/Http/Controllers/Shop/ProfileController.php b/app/Http/Controllers/Shop/ProfileController.php index a744c5f51ce7..975ca5cf34af 100644 --- a/app/Http/Controllers/Shop/ProfileController.php +++ b/app/Http/Controllers/Shop/ProfileController.php @@ -28,6 +28,7 @@ class ProfileController extends BaseController public function show(Request $request) { + /** @var \App\Models\Company $company */ $company = Company::where('company_key', $request->header('X-API-COMPANY-KEY'))->first(); if (! $company->enable_shop_api) { diff --git a/app/Http/Controllers/StaticController.php b/app/Http/Controllers/StaticController.php index bd9fddf84e31..1d2186090925 100644 --- a/app/Http/Controllers/StaticController.php +++ b/app/Http/Controllers/StaticController.php @@ -19,8 +19,6 @@ class StaticController extends BaseController /** * Show the list of Invoices. * - * @param InvoiceFilters $filters The filters - * * @return Response * * @OA\Get( @@ -54,7 +52,11 @@ class StaticController extends BaseController */ public function __invoke() { - $response = Statics::company(auth()->user()->getCompany()->getLocale()); + + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $response = Statics::company($user->company()->getLocale()); return response()->json($response, 200, ['Content-type'=> 'application/json; charset=utf-8'], JSON_PRETTY_PRINT); } diff --git a/app/Http/Controllers/StripeConnectController.php b/app/Http/Controllers/StripeConnectController.php index 9408f987b0b9..691d8602fd3a 100644 --- a/app/Http/Controllers/StripeConnectController.php +++ b/app/Http/Controllers/StripeConnectController.php @@ -81,6 +81,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_gateway = CompanyGateway::query() diff --git a/app/Http/Controllers/StripeController.php b/app/Http/Controllers/StripeController.php index a50402a6c1e1..c434ddae21b8 100644 --- a/app/Http/Controllers/StripeController.php +++ b/app/Http/Controllers/StripeController.php @@ -27,8 +27,11 @@ class StripeController extends BaseController public function update() { - if (auth()->user()->isAdmin()) { - StripeUpdatePaymentMethods::dispatch(auth()->user()->company()); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + if ($user->isAdmin()) { + StripeUpdatePaymentMethods::dispatch($user->company()); return response()->json(['message' => 'Processing'], 200); } @@ -38,10 +41,11 @@ class StripeController extends BaseController public function import() { - // return response()->json(['message' => 'Processing'], 200); + /** @var \App\Models\User $user */ + $user = auth()->user(); - if (auth()->user()->isAdmin()) { - ImportStripeCustomers::dispatch(auth()->user()->company()); + if ($user->isAdmin()) { + ImportStripeCustomers::dispatch($user->company()); return response()->json(['message' => 'Processing'], 200); } @@ -51,10 +55,14 @@ class StripeController extends BaseController public function verify() { - if (auth()->user()->isAdmin()) { - MultiDB::findAndSetDbByCompanyKey(auth()->user()->company()->company_key); + /** @var \App\Models\User $user */ + $user = auth()->user(); - $company_gateway = CompanyGateway::where('company_id', auth()->user()->company()->id) + if ($user->isAdmin()) { + MultiDB::findAndSetDbByCompanyKey($user->company()->company_key); + + /** @var \App\Models\CompanyGateway $company_gateway */ + $company_gateway = CompanyGateway::where('company_id', $user->company()->id) ->where('is_deleted', 0) ->whereIn('gateway_key', $this->stripe_keys) ->first(); @@ -67,7 +75,11 @@ class StripeController extends BaseController public function disconnect(string $company_gateway_id) { - $company_gateway = CompanyGateway::where('company_id', auth()->user()->company()->id) + /** @var \App\Models\User $user */ + $user = auth()->user(); + + /** @var \App\Models\CompanyGateway $company_gateway */ + $company_gateway = CompanyGateway::where('company_id', $user->company()->id) ->where('id', $this->decodePrimaryKey($company_gateway_id)) ->whereIn('gateway_key', $this->stripe_keys) ->firstOrFail(); diff --git a/app/Http/Controllers/SubscriptionController.php b/app/Http/Controllers/SubscriptionController.php index 55b3ea375756..9a21f2043293 100644 --- a/app/Http/Controllers/SubscriptionController.php +++ b/app/Http/Controllers/SubscriptionController.php @@ -48,7 +48,7 @@ class SubscriptionController extends BaseController /** * Show the list of Subscriptions. * - * @return \Illuminate\Http\JsonResponse + * @return \Illuminate\Http\Response * * @OA\Get( * path="/api/v1/subscriptions", @@ -92,7 +92,7 @@ class SubscriptionController extends BaseController * * @param CreateSubscriptionRequest $request The request * - * @return \Illuminate\Http\JsonResponse + * @return \Illuminate\Http\Response * * * @OA\Get( @@ -127,7 +127,10 @@ class SubscriptionController extends BaseController */ public function create(CreateSubscriptionRequest $request): \Illuminate\Http\Response { - $subscription = SubscriptionFactory::create(auth()->user()->company()->id, auth()->user()->id); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $subscription = SubscriptionFactory::create($user->company()->id, $user->id); return $this->itemResponse($subscription); } @@ -137,7 +140,7 @@ class SubscriptionController extends BaseController * * @param StoreSubscriptionRequest $request The request * - * @return \Illuminate\Http\JsonResponse + * @return \Illuminate\Http\Response * * * @OA\Post( @@ -172,9 +175,12 @@ class SubscriptionController extends BaseController */ public function store(StoreSubscriptionRequest $request): \Illuminate\Http\Response { - $subscription = $this->subscription_repo->save($request->all(), SubscriptionFactory::create(auth()->user()->company()->id, auth()->user()->id)); + /** @var \App\Models\User $user */ + $user = auth()->user(); - event(new SubscriptionWasCreated($subscription, $subscription->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); + $subscription = $this->subscription_repo->save($request->all(), SubscriptionFactory::create($user->company()->id, $user->id)); + + event(new SubscriptionWasCreated($subscription, $subscription->company, Ninja::eventVars($user->id))); return $this->itemResponse($subscription); } @@ -183,9 +189,9 @@ class SubscriptionController extends BaseController * Display the specified resource. * * @param ShowSubscriptionRequest $request The request - * @param Invoice $subscription The invoice + * @param Subscription $subscription The invoice * - * @return \Illuminate\Http\JsonResponse + * @return \Illuminate\Http\Response * * * @OA\Get( @@ -238,9 +244,9 @@ class SubscriptionController extends BaseController * Show the form for editing the specified resource. * * @param EditSubscriptionRequest $request The request - * @param Invoice $subscription The invoice + * @param Subscription $subscription The subscription * - * @return \Illuminate\Http\JsonResponse + * @return \Illuminate\Http\Response * * @OA\Get( * path="/api/v1/subscriptions/{id}/edit", @@ -292,9 +298,9 @@ class SubscriptionController extends BaseController * Update the specified resource in storage. * * @param UpdateSubscriptionRequest $request The request - * @param Subscription $subscription The invoice + * @param Subscription $subscription The subscription * - * @return \Illuminate\Http\JsonResponse + * @return \Illuminate\Http\Response * * * @OA\Put( @@ -338,7 +344,7 @@ class SubscriptionController extends BaseController * ), * ) */ - public function update(UpdateSubscriptionRequest $request, Subscription $subscription) + public function update(UpdateSubscriptionRequest $request, Subscription $subscription): \Illuminate\Http\Response { if ($request->entityIsDeleted($subscription)) { return $request->disallowUpdate(); @@ -346,7 +352,10 @@ class SubscriptionController extends BaseController $subscription = $this->subscription_repo->save($request->all(), $subscription); - event(new SubscriptionWasUpdated($subscription, $subscription->company, Ninja::eventVars(auth()->user() ? auth()->user()->id : null))); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + event(new SubscriptionWasUpdated($subscription, $subscription->company, Ninja::eventVars($user->id))); return $this->itemResponse($subscription); } @@ -355,9 +364,9 @@ class SubscriptionController extends BaseController * Remove the specified resource from storage. * * @param DestroySubscriptionRequest $request - * @param Subscription $invoice + * @param Subscription $subscription * - * @return \Illuminate\Http\JsonResponse + * @return \Illuminate\Http\Response * * @throws \Exception * @OA\Delete( @@ -459,13 +468,16 @@ class SubscriptionController extends BaseController */ public function bulk() { + /** @var \App\Models\User $user */ + $user = auth()->user(); + $action = request()->input('action'); $ids = request()->input('ids'); $subscriptions = Subscription::withTrashed()->find($this->transformKeys($ids)); - $subscriptions->each(function ($subscription, $key) use ($action) { - if (auth()->user()->can('edit', $subscription)) { + $subscriptions->each(function ($subscription, $key) use ($action, $user) { + if ($user->can('edit', $subscription)) { $this->subscription_repo->{$action}($subscription); } }); diff --git a/app/Http/Controllers/TaskController.php b/app/Http/Controllers/TaskController.php index 313038e34a30..5deec8f6652b 100644 --- a/app/Http/Controllers/TaskController.php +++ b/app/Http/Controllers/TaskController.php @@ -50,7 +50,7 @@ class TaskController extends BaseController protected $entity_transformer = TaskTransformer::class; /** - * @var Taskepository + * @var TaskRepository */ protected $task_repo; @@ -583,7 +583,7 @@ class TaskController extends BaseController /** * Store a newly created resource in storage. * - * @param StoreTaskRequest $request + * @param SortTaskRequest $request * @return Response * * diff --git a/app/Http/Controllers/TaskStatusController.php b/app/Http/Controllers/TaskStatusController.php index 4dc1e3f11f37..ce5f8da05481 100644 --- a/app/Http/Controllers/TaskStatusController.php +++ b/app/Http/Controllers/TaskStatusController.php @@ -11,19 +11,20 @@ namespace App\Http\Controllers; +use App\Models\TaskStatus; +use Illuminate\Http\Response; +use App\Utils\Traits\MakesHash; use App\Factory\TaskStatusFactory; use App\Filters\TaskStatusFilters; -use App\Http\Requests\TaskStatus\ActionTaskStatusRequest; -use App\Http\Requests\TaskStatus\CreateTaskStatusRequest; -use App\Http\Requests\TaskStatus\DestroyTaskStatusRequest; -use App\Http\Requests\TaskStatus\ShowTaskStatusRequest; -use App\Http\Requests\TaskStatus\StoreTaskStatusRequest; -use App\Http\Requests\TaskStatus\UpdateTaskStatusRequest; -use App\Models\TaskStatus; use App\Repositories\TaskStatusRepository; use App\Transformers\TaskStatusTransformer; -use App\Utils\Traits\MakesHash; -use Illuminate\Http\Response; +use App\Http\Requests\TaskStatus\EditTaskStatusRequest; +use App\Http\Requests\TaskStatus\ShowTaskStatusRequest; +use App\Http\Requests\TaskStatus\StoreTaskStatusRequest; +use App\Http\Requests\TaskStatus\ActionTaskStatusRequest; +use App\Http\Requests\TaskStatus\CreateTaskStatusRequest; +use App\Http\Requests\TaskStatus\UpdateTaskStatusRequest; +use App\Http\Requests\TaskStatus\DestroyTaskStatusRequest; class TaskStatusController extends BaseController { diff --git a/app/Http/Controllers/VendorController.php b/app/Http/Controllers/VendorController.php index 4ac01af36de1..d13240f82d0e 100644 --- a/app/Http/Controllers/VendorController.php +++ b/app/Http/Controllers/VendorController.php @@ -48,7 +48,7 @@ class VendorController extends BaseController protected $entity_transformer = VendorTransformer::class; /** - * @var Vendorepository + * @var VendorRepository */ protected $vendor_repo; diff --git a/app/Http/Controllers/VendorPortal/DocumentController.php b/app/Http/Controllers/VendorPortal/DocumentController.php index c12820953b25..537326b29c45 100644 --- a/app/Http/Controllers/VendorPortal/DocumentController.php +++ b/app/Http/Controllers/VendorPortal/DocumentController.php @@ -81,6 +81,7 @@ class DocumentController extends Controller { MultiDB::documentFindAndSetDb($document_hash); + /** @var \App\Models\Document $document */ $document = Document::where('hash', $document_hash)->firstOrFail(); $headers = []; @@ -94,6 +95,7 @@ class DocumentController extends Controller public function downloadMultiple(DownloadMultipleDocumentsRequest $request) { + /** @var \Illuminate\Database\Eloquent\Collection $documents */ $documents = Document::whereIn('id', $this->transformKeys($request->file_hash)) ->where('company_id', auth()->guard('vendor')->user()->company_id) ->get(); diff --git a/app/Http/Controllers/VendorPortal/PurchaseOrderController.php b/app/Http/Controllers/VendorPortal/PurchaseOrderController.php index 108cee7667c4..589c7d53dd58 100644 --- a/app/Http/Controllers/VendorPortal/PurchaseOrderController.php +++ b/app/Http/Controllers/VendorPortal/PurchaseOrderController.php @@ -75,10 +75,10 @@ class PurchaseOrderController extends Controller } /** - * Show specific invoice. + * Show specific PurchaseOrder. * - * @param ShowInvoiceRequest $request - * @param Invoice $invoice + * @param ShowPurchaseOrderRequest $request + * @param PurchaseOrder $purchase_order * * @return Factory|View */ diff --git a/app/Models/PurchaseOrderInvitation.php b/app/Models/PurchaseOrderInvitation.php index c41288d95924..be8e8f4dee80 100644 --- a/app/Models/PurchaseOrderInvitation.php +++ b/app/Models/PurchaseOrderInvitation.php @@ -15,6 +15,7 @@ use App\Utils\Ninja; use App\Utils\Traits\Inviteable; use App\Utils\Traits\MakesDates; use Carbon\Carbon; +use Illuminate\Database\Eloquent\Relations\BelongsTo; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Str; @@ -102,49 +103,37 @@ class PurchaseOrderInvitation extends BaseModel return PurchaseOrder::class; } - /** - * @return mixed - */ - public function purchase_order() + public function purchase_order(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(PurchaseOrder::class)->withTrashed(); } - /** - * @return mixed - */ - public function entity() + public function entity(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(PurchaseOrder::class)->withTrashed(); } - /** - * @return mixed - */ - public function contact() + public function contact(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(VendorContact::class, 'vendor_contact_id', 'id')->withTrashed(); } - /** - * @return mixed - */ - public function user() + public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class)->withTrashed(); } - public function company() + public function company(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Company::class); } - public function getName() + public function getName(): string { return $this->key; } - public function markViewed() + public function markViewed(): void { $this->viewed_date = Carbon::now(); $this->save(); diff --git a/app/Models/VendorContact.php b/app/Models/VendorContact.php index 8f388e4959f4..91201af7a357 100644 --- a/app/Models/VendorContact.php +++ b/app/Models/VendorContact.php @@ -63,9 +63,7 @@ use Laracasts\Presenter\PresentableTrait; * @property-read \App\Models\Company $company * @property-read mixed $contact_id * @property-read mixed $hashed_id - * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications * @property-read int|null $notifications_count - * @property-read \Illuminate\Database\Eloquent\Collection $purchase_order_invitations * @property-read int|null $purchase_order_invitations_count * @property-read \App\Models\User $user * @property-read \App\Models\Vendor $vendor @@ -74,66 +72,10 @@ use Laracasts\Presenter\PresentableTrait; * @method static \Illuminate\Database\Eloquent\Builder|VendorContact newQuery() * @method static \Illuminate\Database\Eloquent\Builder|VendorContact onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|VendorContact query() - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereAcceptedTermsVersion($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereAvatar($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereAvatarSize($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereAvatarType($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereCompanyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereConfirmationCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereConfirmed($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereContactKey($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereCustomValue1($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereCustomValue2($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereCustomValue3($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereCustomValue4($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereDeletedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereEmail($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereEmailVerifiedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereFailedLogins($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereFirstName($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereGoogle2faSecret($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereIsLocked($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereIsPrimary($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereLastLogin($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereLastName($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereOauthProviderId($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereOauthUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact wherePassword($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact wherePhone($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereRememberToken($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereSendEmail($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereToken($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|VendorContact whereVendorId($value) * @method static \Illuminate\Database\Eloquent\Builder|VendorContact withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|VendorContact withoutTrashed() * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications * @property-read \Illuminate\Database\Eloquent\Collection $purchase_order_invitations - * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications - * @property-read \Illuminate\Database\Eloquent\Collection $purchase_order_invitations - * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications - * @property-read \Illuminate\Database\Eloquent\Collection $purchase_order_invitations - * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications - * @property-read \Illuminate\Database\Eloquent\Collection $purchase_order_invitations - * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications - * @property-read \Illuminate\Database\Eloquent\Collection $purchase_order_invitations - * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications - * @property-read \Illuminate\Database\Eloquent\Collection $purchase_order_invitations - * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications - * @property-read \Illuminate\Database\Eloquent\Collection $purchase_order_invitations - * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications - * @property-read \Illuminate\Database\Eloquent\Collection $purchase_order_invitations - * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications - * @property-read \Illuminate\Database\Eloquent\Collection $purchase_order_invitations - * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications - * @property-read \Illuminate\Database\Eloquent\Collection $purchase_order_invitations - * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications - * @property-read \Illuminate\Database\Eloquent\Collection $purchase_order_invitations - * @property-read \Illuminate\Notifications\DatabaseNotificationCollection $notifications - * @property-read \Illuminate\Database\Eloquent\Collection $purchase_order_invitations * @mixin \Eloquent */ class VendorContact extends Authenticatable implements HasLocalePreference @@ -213,7 +155,7 @@ class VendorContact extends Authenticatable implements HasLocalePreference return $this->encodePrimaryKey($this->id); } - public function vendor() + public function vendor(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Vendor::class)->withTrashed(); } @@ -223,12 +165,12 @@ class VendorContact extends Authenticatable implements HasLocalePreference return $this->where('is_primary', true); } - public function company() + public function company(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Company::class); } - public function user() + public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class)->withTrashed(); } diff --git a/app/Repositories/UserRepository.php b/app/Repositories/UserRepository.php index f5d065a2da33..ce870fe557f1 100644 --- a/app/Repositories/UserRepository.php +++ b/app/Repositories/UserRepository.php @@ -52,14 +52,10 @@ class UserRepository extends BaseRepository if ($unset_company_user) { unset($details['company_user']); } - /** @var \App\Models\User $user */ - $user = auth()->user(); - $company = $user->company(); + + $company = auth()->user()->company(); $account = $company->account; - // if(array_key_exists('oauth_provider_id', $details)) - // unset($details['oauth_provider_id']); - if (request()->has('validated_phone')) { $details['phone'] = request()->input('validated_phone'); $user->verified_phone_number = false; @@ -104,8 +100,8 @@ class UserRepository extends BaseRepository (new CreateCompanyToken($cu->company, $cu->user, 'restored_user'))->handle(); } } else { - $cu->notifications = $data['company_user']['notifications']; - $cu->settings = $data['company_user']['settings']; + $cu->notifications = $data['company_user']['notifications'] ?? ''; + $cu->settings = $data['company_user']['settings'] ?? ''; $cu->save(); } } diff --git a/tests/Feature/UserTest.php b/tests/Feature/UserTest.php index 5d49460132b6..b79644f586a7 100644 --- a/tests/Feature/UserTest.php +++ b/tests/Feature/UserTest.php @@ -224,6 +224,7 @@ class UserTest extends TestCase 'is_admin' => false, 'is_owner' => false, 'permissions' => 'create_client,create_invoice', + 'notifications' => '', ], 'phone' => "", ]; @@ -247,6 +248,7 @@ class UserTest extends TestCase 'is_admin' => false, 'is_owner' => false, 'permissions' => 'create_client,create_invoice', + 'notifications' => '', ], ]; @@ -292,9 +294,6 @@ class UserTest extends TestCase $arr = $response->json(); - // $this->assertNotNull($user->company_user); - // $this->assertEquals($user->company_user->company_id, $this->company->id); - $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, From c7595b7032f9ed232cc7de91c939e42e0cd5e293 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Fri, 4 Aug 2023 18:16:58 +1000 Subject: [PATCH 07/17] Static analysis --- app/Services/Bank/ProcessBankRules.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Services/Bank/ProcessBankRules.php b/app/Services/Bank/ProcessBankRules.php index 14dd32fb5898..9daaacb6b161 100644 --- a/app/Services/Bank/ProcessBankRules.php +++ b/app/Services/Bank/ProcessBankRules.php @@ -48,12 +48,14 @@ class ProcessBankRules extends AbstractService private function matchCredit() { + /** @var \Illuminate\Database\Eloquent\Collection $this->invoices */ $this->invoices = Invoice::where('company_id', $this->bank_transaction->company_id) ->whereIn('status_id', [1,2,3]) ->where('is_deleted', 0) ->get(); $invoice = $this->invoices->first(function ($value, $key) { + /** @var \App\Models\Invoice $value */ return str_contains($this->bank_transaction->description, $value->number); }); From 0d6b8140a0c496e318f4e94d5990c380ab635e76 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 5 Aug 2023 09:22:02 +1000 Subject: [PATCH 08/17] Minor adjustments for bank transaction rules permissions? --- app/Http/Controllers/BaseController.php | 4 +- app/Services/Recurring/RecurringService.php | 5 --- tests/Feature/RecurringInvoiceTest.php | 47 +++++++++++++++++++++ 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php index 156e5384ced9..77ee5066898e 100644 --- a/app/Http/Controllers/BaseController.php +++ b/app/Http/Controllers/BaseController.php @@ -519,7 +519,7 @@ class BaseController extends Controller 'company.bank_transaction_rules'=> function ($query) use ($updated_at, $user) { $query->where('updated_at', '>=', $updated_at); - if (! $user->isAdmin()) { + if (! $user->isAdmin() && !$user->hasIntersectPermissions(['create_bank_transaction','edit_bank_transaction','view_bank_transaction'])) { $query->where('bank_transaction_rules.user_id', $user->id); } }, @@ -627,7 +627,7 @@ class BaseController extends Controller } }, 'company.bank_transaction_rules'=> function ($query) use ($user) { - if (! $user->isAdmin()) { + if (! $user->isAdmin() && !$user->hasIntersectPermissions(['create_bank_transaction','edit_bank_transaction','view_bank_transaction'])) { $query->where('bank_transaction_rules.user_id', $user->id); } }, diff --git a/app/Services/Recurring/RecurringService.php b/app/Services/Recurring/RecurringService.php index 721b94dcd183..eca206c746e0 100644 --- a/app/Services/Recurring/RecurringService.php +++ b/app/Services/Recurring/RecurringService.php @@ -90,15 +90,10 @@ class RecurringService public function deletePdf() { $this->recurring_entity->invitations->each(function ($invitation) { - // (new UnlinkFile(config('filesystems.default'), $this->recurring_entity->client->recurring_invoice_filepath($invitation) . $this->recurring_entity->numberFormatter().'.pdf'))->handle(); //30-06-2023 try { Storage::disk(config('filesystems.default'))->delete($this->recurring_entity->client->recurring_invoice_filepath($invitation) . $this->recurring_entity->numberFormatter().'.pdf'); - // if (Storage::disk(config('filesystems.default'))->exists($this->invoice->client->invoice_filepath($invitation).$this->invoice->numberFormatter().'.pdf')) { - // } - - // if (Ninja::isHosted() && Storage::disk('public')->exists($this->invoice->client->invoice_filepath($invitation).$this->invoice->numberFormatter().'.pdf')) { Storage::disk('public')->delete($this->recurring_entity->client->recurring_invoice_filepath($invitation) . $this->recurring_entity->numberFormatter().'.pdf'); if (Ninja::isHosted()) { } diff --git a/tests/Feature/RecurringInvoiceTest.php b/tests/Feature/RecurringInvoiceTest.php index def58d0e50cc..b70b2f22ee9a 100644 --- a/tests/Feature/RecurringInvoiceTest.php +++ b/tests/Feature/RecurringInvoiceTest.php @@ -60,6 +60,53 @@ class RecurringInvoiceTest extends TestCase } + + public function testStartDate() + { + $line_items = []; + + $item = InvoiceItemFactory::create(); + $item->quantity = 1; + $item->cost = 10; + $item->task_id = $this->encodePrimaryKey($this->task->id); + $item->expense_id = $this->encodePrimaryKey($this->expense->id); + $item->notes = "Hello this is the month of :MONTH"; + + $line_items[] = $item; + + + $data = [ + 'frequency_id' => 1, + 'status_id' => 1, + 'discount' => 0, + 'is_amount_discount' => 1, + 'po_number' => '3434343', + 'public_notes' => 'notes', + 'is_deleted' => 0, + 'custom_value1' => 0, + 'custom_value2' => 0, + 'custom_value3' => 0, + 'custom_value4' => 0, + 'status' => 1, + 'client_id' => $this->encodePrimaryKey($this->client->id), + 'line_items' => $line_items, + 'remaining_cycles' => -1, + 'date' => '0001-01-01', + 'due_date' => '0001-01-01', + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->post('/api/v1/recurring_invoices/', $data) + ->assertStatus(200); + + $arr = $response->json(); + + $this->assertEquals('0001-01-01', $arr['data']['date']); + + } + public function testNextSendDateCatch() { $line_items = []; From 95e4cc7afc4b615aee774a9e90ba6e0f3ddb8abf Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 5 Aug 2023 09:31:16 +1000 Subject: [PATCH 09/17] Fixes for email templates --- app/Http/Requests/Email/SendEmailRequest.php | 9 ++++--- tests/Feature/InvoiceEmailTest.php | 26 ++++++++++++++++++++ 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/app/Http/Requests/Email/SendEmailRequest.php b/app/Http/Requests/Email/SendEmailRequest.php index 4b9a1b20983c..b0264eac2b3c 100644 --- a/app/Http/Requests/Email/SendEmailRequest.php +++ b/app/Http/Requests/Email/SendEmailRequest.php @@ -65,7 +65,7 @@ class SendEmailRequest extends Request $input['entity_id'] = $this->decodePrimaryKey($input['entity_id']); } - if (array_key_exists('entity', $input)) { + if (isset($input['entity'])) { $input['entity'] = "App\Models\\".ucfirst(Str::camel($input['entity'])); } @@ -83,15 +83,13 @@ class SendEmailRequest extends Request { $input = $this->all(); - if (Ninja::isHosted() && !auth()->user()->account->account_sms_verified) { $this->error_message = ctrans('texts.authorization_sms_failure'); - return false; } /*Make sure we have all the require ingredients to send a template*/ - if (array_key_exists('entity', $input) && array_key_exists('entity_id', $input) && is_string($input['entity']) && $input['entity_id']) { + if (isset($input['entity']) && array_key_exists('entity_id', $input) && is_string($input['entity']) && $input['entity_id']) { /** @var \App\Models\User $user */ $user = auth()->user(); @@ -108,6 +106,9 @@ class SendEmailRequest extends Request return true; } } + else { + $this->error_message = "Invalid entity or entity_id"; + } return false; } diff --git a/tests/Feature/InvoiceEmailTest.php b/tests/Feature/InvoiceEmailTest.php index 13fc69618933..8196c2ccce2d 100644 --- a/tests/Feature/InvoiceEmailTest.php +++ b/tests/Feature/InvoiceEmailTest.php @@ -46,6 +46,32 @@ class InvoiceEmailTest extends TestCase } + public function testTemplateValidation() + { + $data = [ + "body" => "hey what's up", + "entity" => 'invoice', + "entity_id"=> $this->invoice->hashed_id, + "subject"=> 'Reminder $number', + "template"=> "first_custom" + ]; + + $response = false; + + // try { + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->postJson('/api/v1/emails', $data); + // } catch (ValidationException $e) { + // $message = json_decode($e->validator->getMessageBag(), 1); + // nlog($message); + // } + + $response->assertStatus(200); + + } + public function test_cc_email_implementation() { $data = [ From 911738c443f48bd5d61d687faccec501aa8c2ac2 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 5 Aug 2023 10:01:44 +1000 Subject: [PATCH 10/17] Fixes for email templates --- tests/Feature/InvoiceEmailTest.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/tests/Feature/InvoiceEmailTest.php b/tests/Feature/InvoiceEmailTest.php index 8196c2ccce2d..9609840e8ae2 100644 --- a/tests/Feature/InvoiceEmailTest.php +++ b/tests/Feature/InvoiceEmailTest.php @@ -42,7 +42,7 @@ class InvoiceEmailTest extends TestCase $this->makeTestData(); - $this->withoutExceptionHandling(); + // $this->withoutExceptionHandling(); } @@ -58,17 +58,17 @@ class InvoiceEmailTest extends TestCase $response = false; - // try { + try { $response = $this->withHeaders([ 'X-API-SECRET' => config('ninja.api_secret'), 'X-API-TOKEN' => $this->token, ])->postJson('/api/v1/emails', $data); - // } catch (ValidationException $e) { - // $message = json_decode($e->validator->getMessageBag(), 1); - // nlog($message); - // } + } catch (ValidationException $e) { + $message = json_decode($e->validator->getMessageBag(), 1); + nlog($message); + } - $response->assertStatus(200); + $response->assertStatus(422); } From 45e2465a245764422804c235a80037478519157b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sat, 5 Aug 2023 12:26:07 +1000 Subject: [PATCH 11/17] Code cleanup --- .../Controllers/BankTransactionController.php | 5 +++- .../MatchBankTransactionRequest.php | 23 +++++++++++++------ app/Jobs/Bank/MatchBankTransactions.php | 2 +- 3 files changed, 21 insertions(+), 9 deletions(-) diff --git a/app/Http/Controllers/BankTransactionController.php b/app/Http/Controllers/BankTransactionController.php index d8b05a3d5e33..69261d4882db 100644 --- a/app/Http/Controllers/BankTransactionController.php +++ b/app/Http/Controllers/BankTransactionController.php @@ -114,7 +114,10 @@ class BankTransactionController extends BaseController public function match(MatchBankTransactionRequest $request) { - $bts = (new MatchBankTransactions(auth()->user()->company()->id, auth()->user()->company()->db, $request->all()))->handle(); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + $bts = (new MatchBankTransactions($user->company()->id, $user->company()->db, $request->all()))->handle(); return $this->listResponse($bts); } diff --git a/app/Http/Requests/BankTransaction/MatchBankTransactionRequest.php b/app/Http/Requests/BankTransaction/MatchBankTransactionRequest.php index 0ee23451ba6c..76f8c5ee09ec 100644 --- a/app/Http/Requests/BankTransaction/MatchBankTransactionRequest.php +++ b/app/Http/Requests/BankTransaction/MatchBankTransactionRequest.php @@ -24,26 +24,35 @@ class MatchBankTransactionRequest extends Request */ public function authorize() : bool { - return auth()->user()->isAdmin() || auth()->user()->can('create', BankTransaction::class) || auth()->user()->hasPermission('edit_bank_transaction'); + /** @var \App\Models\User $user */ + $user = auth()->user(); + + return $user->isAdmin() || $user->can('create', BankTransaction::class) || $user->hasPermission('edit_bank_transaction'); } - public function rules() + public function rules(): array { + /** @var \App\Models\User $user */ + $user = auth()->user(); + $rules = [ 'transactions' => 'bail|array', 'transactions.*.invoice_ids' => 'nullable|string|sometimes', ]; - $rules['transactions.*.ninja_category_id'] = 'bail|nullable|sometimes|exists:expense_categories,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; - $rules['transactions.*.vendor_id'] = 'bail|nullable|sometimes|exists:vendors,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; - $rules['transactions.*.id'] = 'bail|required|exists:bank_transactions,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; - $rules['transactions.*.payment_id'] = 'bail|sometimes|nullable|exists:payments,id,company_id,'.auth()->user()->company()->id.',is_deleted,0'; + $rules['transactions.*.ninja_category_id'] = 'bail|nullable|sometimes|exists:expense_categories,id,company_id,'.$user->company()->id.',is_deleted,0'; + $rules['transactions.*.vendor_id'] = 'bail|nullable|sometimes|exists:vendors,id,company_id,'.$user->company()->id.',is_deleted,0'; + $rules['transactions.*.id'] = 'bail|required|exists:bank_transactions,id,company_id,'.$user->company()->id.',is_deleted,0'; + $rules['transactions.*.payment_id'] = 'bail|sometimes|nullable|exists:payments,id,company_id,'.$user->company()->id.',is_deleted,0'; return $rules; } public function prepareForValidation() { + /** @var \App\Models\User $user */ + $user = auth()->user(); + $inputs = $this->all(); foreach ($inputs['transactions'] as $key => $input) { @@ -61,7 +70,7 @@ class MatchBankTransactionRequest extends Request if (array_key_exists('payment_id', $inputs['transactions'][$key]) && strlen($inputs['transactions'][$key]['payment_id']) >= 1) { $inputs['transactions'][$key]['payment_id'] = $this->decodePrimaryKey($inputs['transactions'][$key]['payment_id']); - $p = Payment::withTrashed()->where('company_id', auth()->user()->company()->id)->where('id', $inputs['transactions'][$key]['payment_id'])->first(); + $p = Payment::withTrashed()->where('company_id', $user->company()->id)->where('id', $inputs['transactions'][$key]['payment_id'])->first(); /*Ensure we don't relink an existing payment*/ if (!$p || is_numeric($p->transaction_id)) { diff --git a/app/Jobs/Bank/MatchBankTransactions.php b/app/Jobs/Bank/MatchBankTransactions.php index 4f38ff399ac9..bc3c0fc3a2d1 100644 --- a/app/Jobs/Bank/MatchBankTransactions.php +++ b/app/Jobs/Bank/MatchBankTransactions.php @@ -218,7 +218,7 @@ class MatchBankTransactions implements ShouldQueue private function matchInvoicePayment($input) :self { - $this->bt = BankTransaction::find($input['id']); + $this->bt = BankTransaction::withTrashed()->find($input['id']); if (!$this->bt || $this->bt->status_id == BankTransaction::STATUS_CONVERTED) { return $this; From 2748df1bce52000db3f6d83e38b7d5768839e332 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 6 Aug 2023 11:30:35 +1000 Subject: [PATCH 12/17] Improve facturae invoice for individuals --- app/Models/Presenters/UserPresenter.php | 45 +++++++++++++++++-- .../Invoice/EInvoice/FacturaEInvoice.php | 2 + .../Traits/Notifications/UserNotifies.php | 2 +- 3 files changed, 45 insertions(+), 4 deletions(-) diff --git a/app/Models/Presenters/UserPresenter.php b/app/Models/Presenters/UserPresenter.php index d370ed92912d..68c5722581c6 100644 --- a/app/Models/Presenters/UserPresenter.php +++ b/app/Models/Presenters/UserPresenter.php @@ -17,9 +17,11 @@ namespace App\Models\Presenters; class UserPresenter extends EntityPresenter { /** + * Returns the first and last names concatenated. + * * @return string */ - public function name() + public function name(): string { if (! $this->entity) { return 'No User Object Available'; @@ -30,8 +32,13 @@ class UserPresenter extends EntityPresenter return $first_name.' '.$last_name; } - - public function getDisplayName() + + /** + * Returns a full name (with fallback) of the user + * + * @return string + */ + public function getDisplayName(): string { if ($this->getFullName()) { return $this->getFullName(); @@ -43,6 +50,7 @@ class UserPresenter extends EntityPresenter } /** + * Returns the full name of the user * @return string */ public function getFullName() @@ -53,4 +61,35 @@ class UserPresenter extends EntityPresenter return ''; } } + + /** + * Returns the first name of the user + * + * @return string + */ + public function firstName(): string + { + if (! $this->entity) { + return 'No First Name Available'; + } + + return $this->entity->first_name ?? 'First Name'; + + } + + /** + * Returns the last name of the user + * + * @return string + */ + public function lastName(): string + { + if (! $this->entity) { + return 'No Last Name Available'; + } + + return $this->entity->last_name ?? 'Last Name'; + } + + } diff --git a/app/Services/Invoice/EInvoice/FacturaEInvoice.php b/app/Services/Invoice/EInvoice/FacturaEInvoice.php index 9afa4ab037d3..aebebd103e14 100644 --- a/app/Services/Invoice/EInvoice/FacturaEInvoice.php +++ b/app/Services/Invoice/EInvoice/FacturaEInvoice.php @@ -482,6 +482,8 @@ class FacturaEInvoice extends AbstractService "fax" => "", "website" => substr($company->settings->website, 0, 50), "contactPeople" => substr($company->owner()->present()->name(), 0, 40), + "firstName" => $company->owner()->present()->firstName(), + "lastName" => $company->owner()->present()->lastName(); // 'centres' => $this->setFace(), // "cnoCnae" => "04647", // Clasif. Nacional de Act. Económicas // "ineTownCode" => "280796" // Cód. de municipio del INE diff --git a/app/Utils/Traits/Notifications/UserNotifies.php b/app/Utils/Traits/Notifications/UserNotifies.php index 7f0e7f5d16ad..35f065757b3d 100644 --- a/app/Utils/Traits/Notifications/UserNotifies.php +++ b/app/Utils/Traits/Notifications/UserNotifies.php @@ -163,7 +163,7 @@ trait UserNotifies * Underrated method right here, last ones * are always the best * - * @param CompanyUser $company_user + * @param \App\Models\CompanyUser $company_user * @param Invoice | Quote | Credit | PurchaseOrder | Product $entity * @param array $required_notification * From 3766a67ec1f2b5d024020223b69da997617469f1 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 6 Aug 2023 11:44:52 +1000 Subject: [PATCH 13/17] Fixes for e-invoices --- VERSION.txt | 2 +- app/Services/Invoice/EInvoice/FacturaEInvoice.php | 2 +- app/Services/Invoice/EInvoice/ZugferdEInvoice.php | 1 + app/Utils/Traits/MakesReminders.php | 8 +++++--- config/ninja.php | 4 ++-- 5 files changed, 10 insertions(+), 7 deletions(-) diff --git a/VERSION.txt b/VERSION.txt index bdde6d7a8c85..879aebbd77dd 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.6.25 \ No newline at end of file +5.6.26 \ No newline at end of file diff --git a/app/Services/Invoice/EInvoice/FacturaEInvoice.php b/app/Services/Invoice/EInvoice/FacturaEInvoice.php index aebebd103e14..7d109e21a618 100644 --- a/app/Services/Invoice/EInvoice/FacturaEInvoice.php +++ b/app/Services/Invoice/EInvoice/FacturaEInvoice.php @@ -483,7 +483,7 @@ class FacturaEInvoice extends AbstractService "website" => substr($company->settings->website, 0, 50), "contactPeople" => substr($company->owner()->present()->name(), 0, 40), "firstName" => $company->owner()->present()->firstName(), - "lastName" => $company->owner()->present()->lastName(); + "lastName" => $company->owner()->present()->lastName(), // 'centres' => $this->setFace(), // "cnoCnae" => "04647", // Clasif. Nacional de Act. Económicas // "ineTownCode" => "280796" // Cód. de municipio del INE diff --git a/app/Services/Invoice/EInvoice/ZugferdEInvoice.php b/app/Services/Invoice/EInvoice/ZugferdEInvoice.php index 687f8431e80f..e40d3ed6dbc4 100644 --- a/app/Services/Invoice/EInvoice/ZugferdEInvoice.php +++ b/app/Services/Invoice/EInvoice/ZugferdEInvoice.php @@ -91,6 +91,7 @@ class ZugferdEInvoice extends AbstractService //Create line items and calculate taxes foreach ($this->invoice->line_items as $index => $item) { + /** @var \App\DataMapper\InvoiceItem $item **/ $xrechnung->addNewPosition($index) ->setDocumentPositionGrossPrice($item->gross_line_total) ->setDocumentPositionNetPrice($item->line_total); diff --git a/app/Utils/Traits/MakesReminders.php b/app/Utils/Traits/MakesReminders.php index 06560db29e38..2447d2c1f316 100644 --- a/app/Utils/Traits/MakesReminders.php +++ b/app/Utils/Traits/MakesReminders.php @@ -16,18 +16,18 @@ use Illuminate\Support\Carbon; /** * Class MakesReminders. + * */ trait MakesReminders { /** - * * @param string $schedule_reminder * @param string $num_days_reminder * @return ?bool */ public function inReminderWindow($schedule_reminder, $num_days_reminder) { - + /** @var \App\Models\Invoice | \App\Models\Quote | \App\Models\RecurringInvoice | \App\Models\Credit $this **/ $offset = $this->client->timezone_offset(); switch ($schedule_reminder) { @@ -44,7 +44,9 @@ trait MakesReminders public function calculateTemplate(string $entity_string): string { - //if invoice is currently a draft, or being marked as sent, this will be the initial email + + /** @var \App\Models\Invoice | \App\Models\Quote | \App\Models\RecurringInvoice | \App\Models\Credit $this **/ + $client = $this->client; if ($entity_string != 'invoice') { diff --git a/config/ninja.php b/config/ninja.php index 22c1ef96e80b..e50a4db22031 100644 --- a/config/ninja.php +++ b/config/ninja.php @@ -15,8 +15,8 @@ return [ 'require_https' => env('REQUIRE_HTTPS', true), 'app_url' => rtrim(env('APP_URL', ''), '/'), 'app_domain' => env('APP_DOMAIN', 'invoicing.co'), - 'app_version' => env('APP_VERSION','5.6.25'), - 'app_tag' => env('APP_TAG','5.6.25'), + 'app_version' => env('APP_VERSION','5.6.26'), + 'app_tag' => env('APP_TAG','5.6.26'), 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', ''), From fab3b30b38727b8cf9eb2e0234bac32370ee4715 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 6 Aug 2023 12:20:18 +1000 Subject: [PATCH 14/17] Updates for static analysis --- .../ClientPortal/PaymentController.php | 12 ++++++++---- app/Jobs/RecurringInvoice/SendRecurring.php | 19 +++---------------- app/Models/PaymentHash.php | 2 +- app/Models/PurchaseOrder.php | 2 +- app/Models/User.php | 2 ++ .../CheckoutComPaymentDriver.php | 5 +---- app/Services/Pdf/PdfBuilder.php | 6 +++--- app/Services/Pdf/PdfMock.php | 5 +++++ app/Services/Preview/StubBuilder.php | 2 +- app/Services/Recurring/UpdatePrice.php | 1 + app/Transformers/ExpenseTransformer.php | 5 +++-- app/Transformers/PurchaseOrderTransformer.php | 6 ++++-- app/Transformers/QuoteTransformer.php | 7 ++++--- .../RecurringExpenseTransformer.php | 6 ++++-- app/Transformers/TaskTransformer.php | 7 +++++-- app/Utils/Traits/MakesReminders.php | 4 +--- 16 files changed, 47 insertions(+), 44 deletions(-) diff --git a/app/Http/Controllers/ClientPortal/PaymentController.php b/app/Http/Controllers/ClientPortal/PaymentController.php index 2cf498cfa7cd..d696c083de43 100644 --- a/app/Http/Controllers/ClientPortal/PaymentController.php +++ b/app/Http/Controllers/ClientPortal/PaymentController.php @@ -27,6 +27,7 @@ use App\Services\Subscription\SubscriptionService; use App\Utils\Traits\MakesDates; use App\Utils\Traits\MakesHash; use Illuminate\Contracts\View\Factory; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; use Illuminate\View\View; @@ -167,16 +168,19 @@ class PaymentController extends Controller $payment = $payment->service()->applyCredits($payment_hash)->save(); + /** @var \Illuminate\Database\Eloquent\Collection<\App\Models\Invoice> $invoices */ $invoices = Invoice::whereIn('id', $this->transformKeys(array_column($payment_hash->invoices(), 'invoice_id'))); - - $invoices->each(function ($i) { - $i->is_proforma = false; - $i->saveQuietly(); + + $invoices->each(function ($invoice) { + /** @var \App\Models\Invoice $invoice **/ + $invoice->is_proforma = false; + $invoice->saveQuietly(); }); event('eloquent.created: App\Models\Payment', $payment); if ($invoices->sum('balance') > 0) { + /** @var \App\Models\Invoice $invoice **/ $invoice = $invoices->first(); return redirect()->route('client.invoice.show', ['invoice' => $invoice->hashed_id, 'hash' => $request->input('hash')]); diff --git a/app/Jobs/RecurringInvoice/SendRecurring.php b/app/Jobs/RecurringInvoice/SendRecurring.php index 49343ed73033..ad6074309f80 100644 --- a/app/Jobs/RecurringInvoice/SendRecurring.php +++ b/app/Jobs/RecurringInvoice/SendRecurring.php @@ -168,7 +168,8 @@ class SendRecurring implements ShouldQueue private function createRecurringInvitations($invoice) :Invoice { if ($this->recurring_invoice->invitations->count() == 0) { - $this->recurring_invoice = $this->recurring_invoice->service()->createInvitations()->save(); + $this->recurring_invoice->service()->createInvitations()->save(); + $this->recurring_invoice = $this->recurring_invoice->fresh(); } $this->recurring_invoice->invitations->each(function ($recurring_invitation) use ($invoice) { @@ -195,18 +196,4 @@ class SendRecurring implements ShouldQueue nlog(print_r($exception->getMessage(), 1)); } -} - - -/** - * - * 1/8/2022 - * - * Improvements here include moving the emailentity and autobilling into the queue. - * - * Further improvements could using the CompanyRecurringCron.php stub which divides - * the recurring invoices into companies and spins them off into their own queue to - * improve parallel processing. - * - * Need to be careful we do not overload redis and OOM. -*/ +} \ No newline at end of file diff --git a/app/Models/PaymentHash.php b/app/Models/PaymentHash.php index 875e412bd1c4..019ac21ac33a 100644 --- a/app/Models/PaymentHash.php +++ b/app/Models/PaymentHash.php @@ -20,7 +20,7 @@ use Illuminate\Database\Eloquent\Model; * @property string $hash * @property string $fee_total * @property int|null $fee_invoice_id - * @property object|array $data + * @property mixed $data * @property int|null $payment_id * @property \Illuminate\Support\Carbon|null $created_at * @property \Illuminate\Support\Carbon|null $updated_at diff --git a/app/Models/PurchaseOrder.php b/app/Models/PurchaseOrder.php index f30a9076e427..e634636acda0 100644 --- a/app/Models/PurchaseOrder.php +++ b/app/Models/PurchaseOrder.php @@ -106,7 +106,7 @@ use Illuminate\Support\Facades\Storage; * @property-read int|null $payments_count * @property-read \App\Models\Project|null $project * @property-read \App\Models\User $user - * @property-read \App\Models\Vendor|null $vendor + * @property \App\Models\Vendor|null $vendor * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) * @method static \Database\Factories\PurchaseOrderFactory factory($count = null, $state = []) diff --git a/app/Models/User.php b/app/Models/User.php index 8a69ea4d9dc2..db2f87506444 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -82,6 +82,8 @@ use Illuminate\Foundation\Auth\User as Authenticatable; * @property-read int|null $notifications_count * @property-read \Illuminate\Database\Eloquent\Collection $tokens * @property-read int|null $tokens_count + * @property \App\Models\CompanyToken $token + * @property int $company_id * @method static \Database\Factories\UserFactory factory($count = null, $state = []) * @method static \Illuminate\Database\Eloquent\Builder|User filter(\App\Filters\QueryFilters $filters) * @method static \Illuminate\Database\Eloquent\Builder|User newModelQuery() diff --git a/app/PaymentDrivers/CheckoutComPaymentDriver.php b/app/PaymentDrivers/CheckoutComPaymentDriver.php index 719e0119c42b..7c65fadc8508 100644 --- a/app/PaymentDrivers/CheckoutComPaymentDriver.php +++ b/app/PaymentDrivers/CheckoutComPaymentDriver.php @@ -74,9 +74,6 @@ class CheckoutComPaymentDriver extends BaseDriver */ public $gateway; - /** - * @var - */ public $payment_method; //the gateway type id public static $methods = [ @@ -178,7 +175,7 @@ class CheckoutComPaymentDriver extends BaseDriver /** * Process the payment response * - * @param Request $request The payment request + * @param \Illuminate\Http\Request $request The payment request * @return \Illuminate\View\View */ public function processPaymentResponse($request) diff --git a/app/Services/Pdf/PdfBuilder.php b/app/Services/Pdf/PdfBuilder.php index 819130cff9ef..8a8226e09e1d 100644 --- a/app/Services/Pdf/PdfBuilder.php +++ b/app/Services/Pdf/PdfBuilder.php @@ -616,7 +616,7 @@ class PdfBuilder /** * Formats the line items for display. * - * @param mixed $items + * @param array<\App\DataMapper\InvoiceItem> $items * @param string $table_type * * @return array @@ -954,7 +954,7 @@ class PdfBuilder * Performs a variable check to ensure * the variable exists * - * @param string $variables + * @param string $variable * @return bool * */ @@ -1468,7 +1468,7 @@ class PdfBuilder * Passes an array of items by reference * and performs a nl2br * - * @param array $variables + * @param array $items * @return void * */ diff --git a/app/Services/Pdf/PdfMock.php b/app/Services/Pdf/PdfMock.php index 34ac517d975e..ade1e5d3694c 100644 --- a/app/Services/Pdf/PdfMock.php +++ b/app/Services/Pdf/PdfMock.php @@ -103,26 +103,31 @@ class PdfMock switch ($this->request['entity_type']) { case 'invoice': + /** @var \App\Models\Invoice | \App\Models\Credit | \App\Models\Quote $entity */ $entity = Invoice::factory()->make(); $entity->client = Client::factory()->make(['settings' => $settings]); $entity->invitation = InvoiceInvitation::factory()->make(); break; case 'quote': + /** @var \App\Models\Invoice | \App\Models\Credit | \App\Models\Quote $entity */ $entity = Quote::factory()->make(); $entity->client = Client::factory()->make(['settings' => $settings]); $entity->invitation = QuoteInvitation::factory()->make(); break; case 'credit': + /** @var \App\Models\Invoice | \App\Models\Credit | \App\Models\Quote $entity */ $entity = Credit::factory()->make(); $entity->client = Client::factory()->make(['settings' => $settings]); $entity->invitation = CreditInvitation::factory()->make(); break; case 'purchase_order': + /** @var \App\Models\Invoice | \App\Models\Credit | \App\Models\Quote $entity */ $entity = PurchaseOrder::factory()->make(); $entity->client = Client::factory()->make(['settings' => $settings]); $entity->invitation = PurchaseOrderInvitation::factory()->make(); break; case PurchaseOrder::class: + /** @var \App\Models\PurchaseOrder $entity */ $entity = PurchaseOrder::factory()->make(); $entity->invitation = PurchaseOrderInvitation::factory()->make(); $entity->vendor = Vendor::factory()->make(); diff --git a/app/Services/Preview/StubBuilder.php b/app/Services/Preview/StubBuilder.php index c17d3de593ba..3755f077e742 100644 --- a/app/Services/Preview/StubBuilder.php +++ b/app/Services/Preview/StubBuilder.php @@ -42,7 +42,7 @@ class StubBuilder public $entity_type; - public mixed $recipient; + public \App\Models\Client | \App\Models\Vendor $recipient; public mixed $contact; diff --git a/app/Services/Recurring/UpdatePrice.php b/app/Services/Recurring/UpdatePrice.php index 9e4569be1ff7..77c729669bdc 100644 --- a/app/Services/Recurring/UpdatePrice.php +++ b/app/Services/Recurring/UpdatePrice.php @@ -27,6 +27,7 @@ class UpdatePrice extends AbstractService foreach ($line_items as $key => $line_item) { + /** @var \App\Models\Product $product **/ $product = Product::where('company_id', $this->recurring_invoice->company_id) ->where('product_key', $line_item->product_key) ->where('is_deleted', 0) diff --git a/app/Transformers/ExpenseTransformer.php b/app/Transformers/ExpenseTransformer.php index 48a3ed7c4a7d..653d0ee155ff 100644 --- a/app/Transformers/ExpenseTransformer.php +++ b/app/Transformers/ExpenseTransformer.php @@ -11,15 +11,16 @@ namespace App\Transformers; +use App\Models\Client; use App\Models\Vendor; use App\Models\Expense; use App\Models\Invoice; -use App\Models\ExpenseCategory; -use App\Transformers\ExpenseCategoryTransformer; use App\Models\Document; +use App\Models\ExpenseCategory; use App\Utils\Traits\MakesHash; use League\Fractal\Resource\Item; use Illuminate\Database\Eloquent\SoftDeletes; +use App\Transformers\ExpenseCategoryTransformer; /** * class ExpenseTransformer. diff --git a/app/Transformers/PurchaseOrderTransformer.php b/app/Transformers/PurchaseOrderTransformer.php index 360e1edcf922..527cca34666f 100644 --- a/app/Transformers/PurchaseOrderTransformer.php +++ b/app/Transformers/PurchaseOrderTransformer.php @@ -11,10 +11,12 @@ namespace App\Transformers; -use App\Models\PurchaseOrder; -use App\Models\PurchaseOrderInvitation; use App\Models\Vendor; +use App\Models\Expense; +use App\Models\Document; +use App\Models\PurchaseOrder; use App\Utils\Traits\MakesHash; +use App\Models\PurchaseOrderInvitation; class PurchaseOrderTransformer extends EntityTransformer { diff --git a/app/Transformers/QuoteTransformer.php b/app/Transformers/QuoteTransformer.php index ca2d092057fd..bdbe0bfa27a2 100644 --- a/app/Transformers/QuoteTransformer.php +++ b/app/Transformers/QuoteTransformer.php @@ -11,10 +11,11 @@ namespace App\Transformers; -use App\Models\Activity; -use App\Models\Backup; -use App\Models\Document; use App\Models\Quote; +use App\Models\Backup; +use App\Models\Client; +use App\Models\Activity; +use App\Models\Document; use App\Models\QuoteInvitation; use App\Utils\Traits\MakesHash; use League\Fractal\Resource\Item; diff --git a/app/Transformers/RecurringExpenseTransformer.php b/app/Transformers/RecurringExpenseTransformer.php index 74f42eb79349..6d323093387c 100644 --- a/app/Transformers/RecurringExpenseTransformer.php +++ b/app/Transformers/RecurringExpenseTransformer.php @@ -11,11 +11,13 @@ namespace App\Transformers; +use App\Models\Client; +use App\Models\Vendor; use App\Models\Document; -use App\Models\RecurringExpense; use App\Utils\Traits\MakesHash; -use Illuminate\Database\Eloquent\SoftDeletes; +use App\Models\RecurringExpense; use League\Fractal\Resource\Item; +use Illuminate\Database\Eloquent\SoftDeletes; /** * class RecurringExpenseTransformer. diff --git a/app/Transformers/TaskTransformer.php b/app/Transformers/TaskTransformer.php index 503ec0612799..af78d20d92eb 100644 --- a/app/Transformers/TaskTransformer.php +++ b/app/Transformers/TaskTransformer.php @@ -11,9 +11,12 @@ namespace App\Transformers; -use App\Models\Document; -use App\Models\Project; use App\Models\Task; +use App\Models\User; +use App\Models\Client; +use App\Models\Invoice; +use App\Models\Project; +use App\Models\Document; use App\Models\TaskStatus; use App\Utils\Traits\MakesHash; use League\Fractal\Resource\Item; diff --git a/app/Utils/Traits/MakesReminders.php b/app/Utils/Traits/MakesReminders.php index 2447d2c1f316..753fb1d98608 100644 --- a/app/Utils/Traits/MakesReminders.php +++ b/app/Utils/Traits/MakesReminders.php @@ -45,15 +45,13 @@ trait MakesReminders public function calculateTemplate(string $entity_string): string { - /** @var \App\Models\Invoice | \App\Models\Quote | \App\Models\RecurringInvoice | \App\Models\Credit $this **/ - + /** @var \App\Models\Invoice | \App\Models\Quote | \App\Models\RecurringInvoice | \App\Models\Credit $this **/ $client = $this->client; if ($entity_string != 'invoice') { return $entity_string; } - //if the invoice if ($this->inReminderWindow( $client->getSetting('schedule_reminder1'), $client->getSetting('num_days_reminder1') From ada3c78556a922b42525d45b0e97d40c7ad2f5a5 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 6 Aug 2023 12:34:41 +1000 Subject: [PATCH 15/17] Updates for static analysis --- app/Models/BaseModel.php | 2 + app/Utils/EmailStats.php | 2 +- app/Utils/Helpers.php | 4 +- app/Utils/PaymentHtmlEngine.php | 2 +- app/Utils/TemplateEngine.php | 83 +++++++++++-------- .../Traits/GeneratesConvertedQuoteCounter.php | 2 +- 6 files changed, 55 insertions(+), 40 deletions(-) diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index ac19cb1f9054..4208d08386ee 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -33,6 +33,8 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @property string $number * @property int $company_id * @property int $id + * @property int $user_id + * @property int @assigned_user_id * @property \App\Models\Company $company * @method static \Illuminate\Database\Eloquent\Builder|BaseModel|Illuminate\Database\Eloquent\Relations\BelongsTo|\Awobaz\Compoships\Database\Eloquent\Relations\BelongsTo|\App\Models\Company company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel|Illuminate\Database\Eloquent\Relations\HasMany|BaseModel orderBy() diff --git a/app/Utils/EmailStats.php b/app/Utils/EmailStats.php index 8000ed4edfd7..ff55bb08b4ae 100644 --- a/app/Utils/EmailStats.php +++ b/app/Utils/EmailStats.php @@ -57,7 +57,7 @@ class EmailStats * Iterates through a list of companies * and flushes the email sent data. * - * @param Collection $companies The company key + * @param \Illuminate\Database\Eloquent\Collection<\App\Models\Company> $companies The company key * @return void */ public static function clearCompanies($companies) diff --git a/app/Utils/Helpers.php b/app/Utils/Helpers.php index 6efc82126297..912cc47f71fc 100644 --- a/app/Utils/Helpers.php +++ b/app/Utils/Helpers.php @@ -49,7 +49,7 @@ class Helpers * @param mixed|null $custom_fields * @param mixed $field * @param mixed $value - * @param \App\Models\Client|null $client + * @param \App\Models\Client|null $entity * * @return null|string */ @@ -143,7 +143,7 @@ class Helpers * Process reserved keywords on PDF. * * @param string $value - * @param Client|Company|Vendor $entity + * @param \App\Models\Client|\App\Models\Company|\App\Models\Vendor $entity * @param null|Carbon $currentDateTime * @return null|string */ diff --git a/app/Utils/PaymentHtmlEngine.php b/app/Utils/PaymentHtmlEngine.php index 7cba02291c88..e3b0be94c06d 100644 --- a/app/Utils/PaymentHtmlEngine.php +++ b/app/Utils/PaymentHtmlEngine.php @@ -64,7 +64,7 @@ class PaymentHtmlEngine $data['$amount'] = &$data['$payment.amount']; $data['$payment.date'] = ['value' => $this->translateDate($this->payment->date, $this->client->date_format(), $this->client->locale()), 'label' => ctrans('texts.payment_date')]; $data['$transaction_reference'] = ['value' => $this->payment->transaction_reference, 'label' => ctrans('texts.transaction_reference')]; - $data['$public_notes'] = ['value' => $this->payment->public_notes, 'label' => ctrans('texts.notes')]; + // $data['$public_notes'] = ['value' => $this->payment->public_notes, 'label' => ctrans('texts.notes')]; $data['$payment1'] = ['value' => $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'payment1', $this->payment->custom_value1, $this->client) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'payment1')]; $data['$payment2'] = ['value' => $this->helpers->formatCustomFieldValue($this->company->custom_fields, 'payment2', $this->payment->custom_value2, $this->client) ?: ' ', 'label' => $this->helpers->makeCustomField($this->company->custom_fields, 'payment2')]; diff --git a/app/Utils/TemplateEngine.php b/app/Utils/TemplateEngine.php index 52390e082e3c..09b5ea8b9c5a 100644 --- a/app/Utils/TemplateEngine.php +++ b/app/Utils/TemplateEngine.php @@ -50,8 +50,10 @@ class TemplateEngine public $template; + /** @var \App\Models\Invoice | \App\Models\Quote | \App\Models\Credit | \App\Models\PurchaseOrder | null $entity_obj **/ private $entity_obj; + /** @var \App\Models\Company | \App\Models\Client | null $settings_entity **/ private $settings_entity; private $settings; @@ -117,14 +119,17 @@ class TemplateEngine private function setSettingsObject() { + /** @var \App\Models\User $user */ + $user = auth()->user(); + if ($this->entity == 'purchaseOrder' || $this->entity == 'purchase_order') { - $this->settings_entity = auth()->user()->company(); + $this->settings_entity = $user->company(); $this->settings = $this->settings_entity->settings; } elseif ($this->entity_obj->client()->exists()) { $this->settings_entity = $this->entity_obj->client; $this->settings = $this->settings_entity->getMergedSettings(); } else { - $this->settings_entity = auth()->user()->company(); + $this->settings_entity = $user->company(); $this->settings = $this->settings_entity->settings; } @@ -219,13 +224,16 @@ class TemplateEngine private function renderTemplate() { + /** @var \App\Models\User $user */ + $user = auth()->user(); + /* wrapper */ $email_style = $this->settings_entity->getSetting('email_style'); $data['title'] = ''; $data['body'] = '$body'; $data['footer'] = ''; - $data['logo'] = auth()->user()->company()->present()->logo(); + $data['logo'] = $user->company()->present()->logo(); if ($this->entity_obj->client()->exists()) { $data = array_merge($data, Helpers::sharedEmailVariables($this->entity_obj->client)); @@ -284,16 +292,19 @@ class TemplateEngine DB::connection(config('database.default'))->beginTransaction(); - $vendor = false; + /** @var \App\Models\User $user */ + $user = auth()->user(); + $vendor = false; + /** @var \App\Models\Client $client */ $client = Client::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, ]); $contact = ClientContact::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, 'client_id' => $client->id, 'is_primary' => 1, 'send_email' => true, @@ -301,26 +312,28 @@ class TemplateEngine if ($this->entity == 'payment') { $this->entity_obj = Payment::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, 'client_id' => $client->id, 'amount' => 10, 'applied' => 10, 'refunded' => 5, ]); - + + /** @var \App\Models\Invoice $invoice */ $invoice = Invoice::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, 'client_id' => $client->id, 'amount' => 10, 'balance' => 10, 'number' => rand(1, 10000) ]); + /** @var \App\Models\InvoiceInvitation $invitation */ $invitation = InvoiceInvitation::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, 'invoice_id' => $invoice->id, 'client_contact_id' => $contact->id, ]); @@ -332,16 +345,16 @@ class TemplateEngine if (!$this->entity || $this->entity == 'invoice') { $this->entity_obj = Invoice::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, 'client_id' => $client->id, 'amount' => '10', 'balance' => '10', ]); $invitation = InvoiceInvitation::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, 'invoice_id' => $this->entity_obj->id, 'client_contact_id' => $contact->id, ]); @@ -349,14 +362,14 @@ class TemplateEngine if ($this->entity == 'quote') { $this->entity_obj = Quote::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, 'client_id' => $client->id, ]); $invitation = QuoteInvitation::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, 'quote_id' => $this->entity_obj->id, 'client_contact_id' => $contact->id, ]); @@ -364,13 +377,13 @@ class TemplateEngine if ($this->entity == 'purchaseOrder') { $vendor = Vendor::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, ]); $contact = VendorContact::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, 'vendor_id' => $vendor->id, 'is_primary' => 1, 'send_email' => true, @@ -378,14 +391,14 @@ class TemplateEngine $this->entity_obj = PurchaseOrder::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, 'vendor_id' => $vendor->id, ]); $invitation = PurchaseOrderInvitation::factory()->create([ - 'user_id' => auth()->user()->id, - 'company_id' => auth()->user()->company()->id, + 'user_id' => $user->id, + 'company_id' => $user->company()->id, 'purchase_order_id' => $this->entity_obj->id, 'vendor_contact_id' => $contact->id, ]); @@ -394,16 +407,16 @@ class TemplateEngine if ($vendor) { $this->entity_obj->setRelation('invitations', $invitation); $this->entity_obj->setRelation('vendor', $vendor); - $this->entity_obj->setRelation('company', auth()->user()->company()); + $this->entity_obj->setRelation('company', $user->company()); $this->entity_obj->load('vendor'); - $vendor->setRelation('company', auth()->user()->company()); + $vendor->setRelation('company', $user->company()); $vendor->load('company'); } else { $this->entity_obj->setRelation('invitations', $invitation); $this->entity_obj->setRelation('client', $client); - $this->entity_obj->setRelation('company', auth()->user()->company()); + $this->entity_obj->setRelation('company', $user->company()); $this->entity_obj->load('client'); - $client->setRelation('company', auth()->user()->company()); + $client->setRelation('company', $user->company()); $client->load('company'); } } diff --git a/app/Utils/Traits/GeneratesConvertedQuoteCounter.php b/app/Utils/Traits/GeneratesConvertedQuoteCounter.php index 1c331694d46a..06cf6fa36536 100644 --- a/app/Utils/Traits/GeneratesConvertedQuoteCounter.php +++ b/app/Utils/Traits/GeneratesConvertedQuoteCounter.php @@ -650,7 +650,7 @@ trait GeneratesConvertedQuoteCounter $replace[] = str_pad(($user_id), 2, '0', STR_PAD_LEFT); } - $matches = false; + $matches = []; preg_match('/{\$date:(.*?)}/', $pattern, $matches); if (count($matches) > 1) { $format = $matches[1]; From 742d566f2752aed1f0247fa844dc276734804c9e Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 6 Aug 2023 15:24:13 +1000 Subject: [PATCH 16/17] Adjustments for mini_load --- app/Http/Controllers/BaseController.php | 34 +++---------------------- app/Models/BaseModel.php | 2 +- 2 files changed, 5 insertions(+), 31 deletions(-) diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php index 77ee5066898e..b61390e34742 100644 --- a/app/Http/Controllers/BaseController.php +++ b/app/Http/Controllers/BaseController.php @@ -516,19 +516,11 @@ class BaseController extends Controller $query->where('bank_transactions.user_id', $user->id); } }, - 'company.bank_transaction_rules'=> function ($query) use ($updated_at, $user) { - $query->where('updated_at', '>=', $updated_at); - - if (! $user->isAdmin() && !$user->hasIntersectPermissions(['create_bank_transaction','edit_bank_transaction','view_bank_transaction'])) { - $query->where('bank_transaction_rules.user_id', $user->id); - } + 'company.bank_transaction_rules'=> function ($query) { + $query->whereNotNull('updated_at'); }, - 'company.task_schedulers'=> function ($query) use ($updated_at, $user) { - $query->where('updated_at', '>=', $updated_at); - - if (! $user->isAdmin()) { - $query->where('schedulers.user_id', $user->id); - } + 'company.task_schedulers'=> function ($query) { + $query->whereNotNull('updated_at'); }, ] ); @@ -656,24 +648,6 @@ class BaseController extends Controller return $this->response($this->manager->createData($resource)->toArray()); } - /** - * In case a user is not an admin and is - * able to access multiple companies, then we - * need to pass back the mini load only - * - * @deprecated - * @return bool - */ - // private function complexPermissionsUser(): bool - // { - // //if the user is attached to more than one company AND they are not an admin across all companies - // if (auth()->user()->company_users()->count() > 1 && (auth()->user()->company_users()->where('is_admin', 1)->count() != auth()->user()->company_users()->count())) { - // return true; - // } - - // return false; - // } - /** * Passes back the miniloaded data response * diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index 4208d08386ee..05fe216aa825 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -34,7 +34,7 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @property int $company_id * @property int $id * @property int $user_id - * @property int @assigned_user_id + * @property int $assigned_user_id * @property \App\Models\Company $company * @method static \Illuminate\Database\Eloquent\Builder|BaseModel|Illuminate\Database\Eloquent\Relations\BelongsTo|\Awobaz\Compoships\Database\Eloquent\Relations\BelongsTo|\App\Models\Company company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel|Illuminate\Database\Eloquent\Relations\HasMany|BaseModel orderBy() From a790101f3477f1a72078588271456ebbe7d8a064 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Sun, 6 Aug 2023 15:26:33 +1000 Subject: [PATCH 17/17] Fixes for previews --- app/Http/Controllers/PreviewController.php | 6 +++++- app/Services/Pdf/PdfMock.php | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 4ff7f3dabce2..13a5daf43148 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -210,12 +210,16 @@ class PreviewController extends BaseController if ($request->has('entity_id')) { /** @var \App\Models\Quote | \App\Models\Invoice | \App\Models\RecurringInvoice | \App\Models\Credit $class */ - $entity_obj = $class::on(config('database.default')) + $temp_obj = $class::on(config('database.default')) ->with('client.company') ->where('id', $this->decodePrimaryKey($request->input('entity_id'))) ->where('company_id', $company->id) ->withTrashed() ->first(); + + /** Prevents null values from being passed into entity_obj */ + if($temp_obj) + $entity_obj = $temp_obj; } if ($request->has('footer') && !$request->filled('footer') && $request->input('entity') == 'recurring_invoice') { diff --git a/app/Services/Pdf/PdfMock.php b/app/Services/Pdf/PdfMock.php index ade1e5d3694c..67ceaa42d82e 100644 --- a/app/Services/Pdf/PdfMock.php +++ b/app/Services/Pdf/PdfMock.php @@ -103,7 +103,7 @@ class PdfMock switch ($this->request['entity_type']) { case 'invoice': - /** @var \App\Models\Invoice | \App\Models\Credit | \App\Models\Quote $entity */ + /** @var \App\Models\Invoice | \App\Models\Credit | \App\Models\Quote $entity */ $entity = Invoice::factory()->make(); $entity->client = Client::factory()->make(['settings' => $settings]); $entity->invitation = InvoiceInvitation::factory()->make();