From 11de046b9dea719e366ec6a8f520917d26224a6c Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 1 Aug 2023 19:51:19 +1000 Subject: [PATCH 01/16] Fixes for translations --- lang/en/texts.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lang/en/texts.php b/lang/en/texts.php index a1f4316e3dd1..71b154870032 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -4952,7 +4952,7 @@ $LANG = array( 'sync_from' => 'Sync From', 'gateway_payment_text' => 'Invoices: :invoices for :amount for client :client', 'gateway_payment_text_no_invoice' => 'Payment with no invoice for amount :amount for client :client', - 'click_to_variables' => 'Client here to see all variables.', + 'click_to_variables' => 'Click here to see all variables.', 'ship_to' => 'Ship to', 'stripe_direct_debit_details' => 'Please transfer into the nominated bank account above.', 'branch_name' => 'Branch Name', From 25c67ff7ad7e47fba83c7946350ada76d5f0ea98 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 1 Aug 2023 20:30:47 +1000 Subject: [PATCH 02/16] Static analysis cleanup --- app/Models/BankTransaction.php | 30 +------ app/Models/BaseModel.php | 3 +- app/Models/Company.php | 1 + app/Models/CompanyToken.php | 2 +- app/Models/Invoice.php | 13 ++-- app/Models/Payment.php | 2 +- app/Models/Presenters/CompanyPresenter.php | 5 +- app/Models/Presenters/EntityPresenter.php | 4 + app/Models/Presenters/InvoicePresenter.php | 2 + .../Admin/EntitySentNotification.php | 2 +- .../Admin/EntityViewedNotification.php | 46 +++++------ .../Admin/NewPaymentNotification.php | 2 +- .../ClientContactRequestCancellation.php | 2 +- .../ClientContactResetPassword.php | 2 +- app/Notifications/NewAccountCreated.php | 2 +- .../Ninja/ClientAccountNotFound.php | 2 +- .../Ninja/DomainFailureNotification.php | 2 +- .../DomainRenewalFailureNotification.php | 2 +- .../Ninja/EmailBounceNotification.php | 2 +- .../Ninja/EmailQuotaNotification.php | 2 +- .../Ninja/GmailCredentialNotification.php | 2 +- app/Notifications/Ninja/NewAccountCreated.php | 2 +- .../Ninja/NewAccountNotification.php | 2 +- .../Ninja/RenewalFailureNotification.php | 2 +- app/Notifications/Ninja/SpamNotification.php | 2 +- .../Ninja/UserQualityNotification.php | 2 +- app/Notifications/Ninja/VerifyUser.php | 78 ------------------- .../Ninja/WePayFailureNotification.php | 2 +- .../ResetPasswordNotification.php | 2 +- 29 files changed, 65 insertions(+), 157 deletions(-) delete mode 100644 app/Notifications/Ninja/VerifyUser.php diff --git a/app/Models/BankTransaction.php b/app/Models/BankTransaction.php index c702c8428c8b..ed030f0a138f 100644 --- a/app/Models/BankTransaction.php +++ b/app/Models/BankTransaction.php @@ -59,33 +59,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction query() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereAccountType($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereAmount($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereBankAccountId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereBankIntegrationId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereBankTransactionRuleId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereBaseType($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereCategoryId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereCategoryType($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereCompanyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereCurrencyCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereCurrencyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereDeletedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereDescription($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereExpenseId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereInvoiceIds($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereIsDeleted($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereNinjaCategoryId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction wherePaymentId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereStatusId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereTransactionId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction whereVendorId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction withTrashed() + * @method static \Illuminate\Database\Eloquent\Account withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|BankTransaction withoutTrashed() * @property-read \App\Models\Payment|null $payment * @mixin \Eloquent @@ -176,7 +150,7 @@ class BankTransaction extends BaseModel return $this->belongsTo(BankIntegration::class)->withTrashed(); } - public function account() + public function account(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Account::class)->withTrashed(); } diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index 62bcabefa805..cbafe0ab96e0 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -41,7 +41,7 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @method static \Illuminate\Database\Eloquent\Builder|BaseModel newQuery($query) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel query() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude(array $excludeable) - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel withTrashed() + * @method static \Illuminate\Database\Eloquent\BaseModel withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scopeExclude($query) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel find($value) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel whereIn($query) @@ -52,7 +52,6 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @method static \Illuminate\Database\Eloquent\Builder|BaseModel service() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel orderBy($column, $direction) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel invitations() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel createInvitations() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel whereHas($query) * @property-read \Illuminate\Database\Eloquent\Collection $invitations * @property-read int|null $invitations_count diff --git a/app/Models/Company.php b/app/Models/Company.php index d8c0c9172a7e..11de4e8b9f93 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -237,6 +237,7 @@ class Company extends BaseModel // const ENTITY_RECURRING_QUOTE = 'recurring_quote'; + /** @var CompanyPresenter */ protected $presenter = CompanyPresenter::class; protected array $tax_coverage_countries = [ diff --git a/app/Models/CompanyToken.php b/app/Models/CompanyToken.php index 9366310cb784..f37bf10e3e81 100644 --- a/app/Models/CompanyToken.php +++ b/app/Models/CompanyToken.php @@ -76,7 +76,7 @@ class CompanyToken extends BaseModel return $this->belongsTo(User::class); } - public function company() + public function company(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Company::class); } diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 57660005f644..0c917d93a131 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -71,10 +71,10 @@ use App\Events\Invoice\InvoiceReminderWasEmailed; * @property string|null $custom_value3 * @property string|null $custom_value4 * @property string|null $next_send_date - * @property string|null $custom_surcharge1 - * @property string|null $custom_surcharge2 - * @property string|null $custom_surcharge3 - * @property string|null $custom_surcharge4 + * @property float|null $custom_surcharge1 + * @property float|null $custom_surcharge2 + * @property float|null $custom_surcharge3 + * @property float|null $custom_surcharge4 * @property bool $custom_surcharge_tax1 * @property bool $custom_surcharge_tax2 * @property bool $custom_surcharge_tax3 @@ -155,7 +155,7 @@ class Invoice extends BaseModel use MakesReminders; use ActionsInvoice; - protected $presenter = InvoicePresenter::class; + // protected $presenter = InvoicePresenter::class; protected $touches = []; @@ -720,6 +720,8 @@ class Invoice extends BaseModel public function taxTypeString($id) { + $tax_type = false; + match(intval($id)){ Product::PRODUCT_TYPE_PHYSICAL => $tax_type = ctrans('texts.physical_goods'), Product::PRODUCT_TYPE_SERVICE => $tax_type = ctrans('texts.services'), @@ -738,6 +740,7 @@ class Invoice extends BaseModel public function typeIdString($id) { + $type = ''; match($id) { '1' => $type = ctrans('texts.product'), '2' => $type = ctrans('texts.service'), diff --git a/app/Models/Payment.php b/app/Models/Payment.php index cbcbc1171f76..d2922d03656a 100644 --- a/app/Models/Payment.php +++ b/app/Models/Payment.php @@ -252,7 +252,7 @@ class Payment extends BaseModel return $this->belongsTo(Currency::class); } - public function transaction(): BelongsTo + public function transaction() { return $this->belongsTo(BankTransaction::class); } diff --git a/app/Models/Presenters/CompanyPresenter.php b/app/Models/Presenters/CompanyPresenter.php index c836091dc421..8de23d31cea1 100644 --- a/app/Models/Presenters/CompanyPresenter.php +++ b/app/Models/Presenters/CompanyPresenter.php @@ -17,13 +17,16 @@ use Illuminate\Support\Str; /** * Class CompanyPresenter. + * @property \App\DataMapper\CompanySettings $settings */ class CompanyPresenter extends EntityPresenter { + + /** * @return string */ - public function name() + public function name(): string { return $this->settings->name ?: ctrans('texts.untitled_account'); } diff --git a/app/Models/Presenters/EntityPresenter.php b/app/Models/Presenters/EntityPresenter.php index ccfe0ca364da..01cfbc3063ea 100644 --- a/app/Models/Presenters/EntityPresenter.php +++ b/app/Models/Presenters/EntityPresenter.php @@ -16,6 +16,10 @@ use Laracasts\Presenter\Presenter; /** * Class EntityPresenter. + * + * @property \App\Models\Company | \App\Models\Client | \App\Models\ClientContact | \App\Models\Vendor | \App\Models\VendorContact $entity + * @property \App\Models\Client $client + * @property \App\Models\Company $company */ class EntityPresenter extends Presenter { diff --git a/app/Models/Presenters/InvoicePresenter.php b/app/Models/Presenters/InvoicePresenter.php index a7ce9222e30f..d2d806f976c1 100644 --- a/app/Models/Presenters/InvoicePresenter.php +++ b/app/Models/Presenters/InvoicePresenter.php @@ -23,6 +23,8 @@ use App\Utils\Traits\MakesDates; * * Shortcuts to other presenters are here to facilitate * a clean UI / UX + * + * @property \App\Models\Invoice $entity */ class InvoicePresenter extends EntityPresenter { diff --git a/app/Notifications/Admin/EntitySentNotification.php b/app/Notifications/Admin/EntitySentNotification.php index 11b40dbb8650..5033d813d1fd 100644 --- a/app/Notifications/Admin/EntitySentNotification.php +++ b/app/Notifications/Admin/EntitySentNotification.php @@ -67,7 +67,7 @@ class EntitySentNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Admin/EntityViewedNotification.php b/app/Notifications/Admin/EntityViewedNotification.php index 8014aa9045a6..69f7b7e0033c 100644 --- a/app/Notifications/Admin/EntityViewedNotification.php +++ b/app/Notifications/Admin/EntityViewedNotification.php @@ -67,7 +67,7 @@ class EntityViewedNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { @@ -103,7 +103,7 @@ class EntityViewedNotification extends Notification $this->entity_name => $this->entity->number, ] )) - ->attachment(function ($attachment) use ($amount) { + ->attachment(function ($attachment) { $attachment->title(ctrans('texts.entity_number_placeholder', ['entity' => ucfirst($this->entity_name), 'entity_number' => $this->entity->number]), $this->invitation->getAdminLink()) ->fields([ ctrans('texts.client') => $this->contact->present()->name(), @@ -112,30 +112,30 @@ class EntityViewedNotification extends Notification }); } - private function buildDataArray() - { - $amount = Number::formatMoney($this->entity->amount, $this->entity->client); + // private function buildDataArray() + // { + // $amount = Number::formatMoney($this->entity->amount, $this->entity->client); - $data = [ - 'title' => $this->buildSubject(), - 'message' => ctrans( - "texts.notification_{$this->entity_name}_viewed", - [ - 'amount' => $amount, - 'client' => $this->contact->present()->name(), - $this->entity_name => $this->entity->number, - ] - ), - 'url' => $this->invitation->getAdminLink(), - 'button' => ctrans("texts.view_{$this->entity_name}"), - 'signature' => $this->settings->email_signature, - 'logo' => $this->company->present()->logo(), - 'settings' => $this->settings, + // $data = [ + // 'title' => $this->buildSubject(), + // 'message' => ctrans( + // "texts.notification_{$this->entity_name}_viewed", + // [ + // 'amount' => $amount, + // 'client' => $this->contact->present()->name(), + // $this->entity_name => $this->entity->number, + // ] + // ), + // 'url' => $this->invitation->getAdminLink(), + // 'button' => ctrans("texts.view_{$this->entity_name}"), + // 'signature' => $this->settings->email_signature, + // 'logo' => $this->company->present()->logo(), + // 'settings' => $this->settings, - ]; + // ]; - return $data; - } + // return $data; + // } private function buildSubject() { diff --git a/app/Notifications/Admin/NewPaymentNotification.php b/app/Notifications/Admin/NewPaymentNotification.php index 082f70b7fe6c..70694ccc0d6c 100644 --- a/app/Notifications/Admin/NewPaymentNotification.php +++ b/app/Notifications/Admin/NewPaymentNotification.php @@ -57,7 +57,7 @@ class NewPaymentNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/ClientContactRequestCancellation.php b/app/Notifications/ClientContactRequestCancellation.php index 69ea4b2ef52f..618dee18906c 100644 --- a/app/Notifications/ClientContactRequestCancellation.php +++ b/app/Notifications/ClientContactRequestCancellation.php @@ -63,7 +63,7 @@ class ClientContactRequestCancellation extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/ClientContactResetPassword.php b/app/Notifications/ClientContactResetPassword.php index 01f549980adf..2ba6593fb39d 100644 --- a/app/Notifications/ClientContactResetPassword.php +++ b/app/Notifications/ClientContactResetPassword.php @@ -63,7 +63,7 @@ class ClientContactResetPassword extends Notification * Build the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/NewAccountCreated.php b/app/Notifications/NewAccountCreated.php index 997b8ab0e51b..845aecad8c34 100644 --- a/app/Notifications/NewAccountCreated.php +++ b/app/Notifications/NewAccountCreated.php @@ -57,7 +57,7 @@ class NewAccountCreated extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/ClientAccountNotFound.php b/app/Notifications/Ninja/ClientAccountNotFound.php index d913d9c4f001..84087991f618 100644 --- a/app/Notifications/Ninja/ClientAccountNotFound.php +++ b/app/Notifications/Ninja/ClientAccountNotFound.php @@ -42,7 +42,7 @@ class ClientAccountNotFound extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/DomainFailureNotification.php b/app/Notifications/Ninja/DomainFailureNotification.php index f22f08926572..2e4dc99059c5 100644 --- a/app/Notifications/Ninja/DomainFailureNotification.php +++ b/app/Notifications/Ninja/DomainFailureNotification.php @@ -45,7 +45,7 @@ class DomainFailureNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/DomainRenewalFailureNotification.php b/app/Notifications/Ninja/DomainRenewalFailureNotification.php index 860c6ae8b65f..719a93d5e152 100644 --- a/app/Notifications/Ninja/DomainRenewalFailureNotification.php +++ b/app/Notifications/Ninja/DomainRenewalFailureNotification.php @@ -45,7 +45,7 @@ class DomainRenewalFailureNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/EmailBounceNotification.php b/app/Notifications/Ninja/EmailBounceNotification.php index 9af33db98043..796a1f6368f0 100644 --- a/app/Notifications/Ninja/EmailBounceNotification.php +++ b/app/Notifications/Ninja/EmailBounceNotification.php @@ -44,7 +44,7 @@ class EmailBounceNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/EmailQuotaNotification.php b/app/Notifications/Ninja/EmailQuotaNotification.php index 24eab8d21664..8ef6cbf6ac51 100644 --- a/app/Notifications/Ninja/EmailQuotaNotification.php +++ b/app/Notifications/Ninja/EmailQuotaNotification.php @@ -44,7 +44,7 @@ class EmailQuotaNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/GmailCredentialNotification.php b/app/Notifications/Ninja/GmailCredentialNotification.php index df9aee792fe9..0bc8226e1e5d 100644 --- a/app/Notifications/Ninja/GmailCredentialNotification.php +++ b/app/Notifications/Ninja/GmailCredentialNotification.php @@ -44,7 +44,7 @@ class GmailCredentialNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/NewAccountCreated.php b/app/Notifications/Ninja/NewAccountCreated.php index f0e47d8cbdc2..77d570caa415 100644 --- a/app/Notifications/Ninja/NewAccountCreated.php +++ b/app/Notifications/Ninja/NewAccountCreated.php @@ -57,7 +57,7 @@ class NewAccountCreated extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/NewAccountNotification.php b/app/Notifications/Ninja/NewAccountNotification.php index 6c32ef582446..2b215897686a 100644 --- a/app/Notifications/Ninja/NewAccountNotification.php +++ b/app/Notifications/Ninja/NewAccountNotification.php @@ -50,7 +50,7 @@ class NewAccountNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/RenewalFailureNotification.php b/app/Notifications/Ninja/RenewalFailureNotification.php index 34a5942feb25..6d9adfc865ad 100644 --- a/app/Notifications/Ninja/RenewalFailureNotification.php +++ b/app/Notifications/Ninja/RenewalFailureNotification.php @@ -42,7 +42,7 @@ class RenewalFailureNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/SpamNotification.php b/app/Notifications/Ninja/SpamNotification.php index 27569488cde8..d81e7909713b 100644 --- a/app/Notifications/Ninja/SpamNotification.php +++ b/app/Notifications/Ninja/SpamNotification.php @@ -45,7 +45,7 @@ class SpamNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/UserQualityNotification.php b/app/Notifications/Ninja/UserQualityNotification.php index 385f1c0ca9c8..4e1780665e5d 100644 --- a/app/Notifications/Ninja/UserQualityNotification.php +++ b/app/Notifications/Ninja/UserQualityNotification.php @@ -49,7 +49,7 @@ class UserQualityNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/Ninja/VerifyUser.php b/app/Notifications/Ninja/VerifyUser.php deleted file mode 100644 index c1311fba5d64..000000000000 --- a/app/Notifications/Ninja/VerifyUser.php +++ /dev/null @@ -1,78 +0,0 @@ -user = $user; - $this->company = $company; - } - - /** - * Get the notification's delivery channels. - * - * @param mixed $notifiable - * @return array - */ - public function via($notifiable) - { - return ['']; - } - - /** - * Get the mail representation of the notification. - * - * @param mixed $notifiable - * @return MailMessage - */ - public function toMail($notifiable) - { - } - - /** - * Get the array representation of the notification. - * - * @param mixed $notifiable - * @return array - */ - public function toArray($notifiable) - { - return [ - // - ]; - } - - public function toSlack($notifiable) - { - } -} diff --git a/app/Notifications/Ninja/WePayFailureNotification.php b/app/Notifications/Ninja/WePayFailureNotification.php index 1cbf759d5a6f..e11e321c46ba 100644 --- a/app/Notifications/Ninja/WePayFailureNotification.php +++ b/app/Notifications/Ninja/WePayFailureNotification.php @@ -44,7 +44,7 @@ class WePayFailureNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { diff --git a/app/Notifications/ResetPasswordNotification.php b/app/Notifications/ResetPasswordNotification.php index 34b7f4ad69c5..f3fc5497d45a 100644 --- a/app/Notifications/ResetPasswordNotification.php +++ b/app/Notifications/ResetPasswordNotification.php @@ -38,7 +38,7 @@ class ResetPasswordNotification extends Notification * Get the mail representation of the notification. * * @param mixed $notifiable - * @return MailMessage + * */ public function toMail($notifiable) { From 860749f7d5954f3e37973a89c8071b799e94175f Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 1 Aug 2023 22:00:45 +1000 Subject: [PATCH 03/16] Fixes for tests --- app/Models/Invoice.php | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 0c917d93a131..1a9088c27254 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -25,6 +25,7 @@ use App\Services\Invoice\InvoiceService; use App\Utils\Traits\MakesInvoiceValues; use App\Events\Invoice\InvoiceWasEmailed; use Laracasts\Presenter\PresentableTrait; +use App\Models\Presenters\EntityPresenter; use App\Models\Presenters\InvoicePresenter; use App\Helpers\Invoice\InvoiceSumInclusive; use App\Utils\Traits\Invoice\ActionsInvoice; @@ -155,7 +156,7 @@ class Invoice extends BaseModel use MakesReminders; use ActionsInvoice; - // protected $presenter = InvoicePresenter::class; + protected $presenter = EntityPresenter::class; protected $touches = []; From 908161eae76d52bd89e001760519a86d0a71b703 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 1 Aug 2023 22:36:04 +1000 Subject: [PATCH 04/16] Static analysis cleanup --- app/Export/CSV/BaseExport.php | 3 -- .../Requests/Payment/RefundPaymentRequest.php | 4 +- .../ValidRefundableInvoices.php | 2 +- app/Models/Activity.php | 32 +--------------- app/Models/BankIntegration.php | 38 ++----------------- app/Models/BaseModel.php | 4 +- app/Models/CompanyGateway.php | 35 ++++++++--------- app/Models/CompanyToken.php | 6 +-- app/Models/Invoice.php | 2 +- phpstan.neon | 3 +- 10 files changed, 34 insertions(+), 95 deletions(-) diff --git a/app/Export/CSV/BaseExport.php b/app/Export/CSV/BaseExport.php index 4650b990f7d4..cbaab0aa2d9c 100644 --- a/app/Export/CSV/BaseExport.php +++ b/app/Export/CSV/BaseExport.php @@ -623,9 +623,6 @@ class BaseExport } elseif ($transformed_invoice && array_key_exists(str_replace("invoice.", "", $column), $transformed_invoice)) { return $transformed_invoice[$column]; } - - // if($column == 'status') - // return $entity->stringStatus($entity->status_id); return ''; } diff --git a/app/Http/Requests/Payment/RefundPaymentRequest.php b/app/Http/Requests/Payment/RefundPaymentRequest.php index 237140529085..67ad4a7f7ab9 100644 --- a/app/Http/Requests/Payment/RefundPaymentRequest.php +++ b/app/Http/Requests/Payment/RefundPaymentRequest.php @@ -28,7 +28,9 @@ class RefundPaymentRequest extends Request */ public function authorize() : bool { - return auth()->user()->isAdmin(); + /** @var \App\Models\User $user */ + $user = auth()->user(); + return $user->isAdmin(); } public function prepareForValidation() diff --git a/app/Http/ValidationRules/ValidRefundableInvoices.php b/app/Http/ValidationRules/ValidRefundableInvoices.php index d14b37844689..3c10bf71a92c 100644 --- a/app/Http/ValidationRules/ValidRefundableInvoices.php +++ b/app/Http/ValidationRules/ValidRefundableInvoices.php @@ -45,6 +45,7 @@ class ValidRefundableInvoices implements Rule return false; } + /**@var \App\Models\Payment $payment */ $payment = Payment::whereId($this->input['id'])->first(); if (! $payment) { @@ -71,7 +72,6 @@ class ValidRefundableInvoices implements Rule foreach ($this->input['invoices'] as $val) { if ($val['invoice_id'] == $invoice->id) { - //$pivot_record = $invoice->payments->where('id', $invoice->id)->first(); $pivot_record = $payment->paymentables->where('paymentable_id', $invoice->id)->first(); if ($val['amount'] > ($pivot_record->amount - $pivot_record->refunded)) { diff --git a/app/Models/Activity.php b/app/Models/Activity.php index 17cfcb872dc3..84d9bbda5ef1 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -67,37 +67,7 @@ use Illuminate\Database\Eloquent\Relations\BelongsTo; * @property-read \App\Models\VendorContact|null $vendor_contact * @method static \Illuminate\Database\Eloquent\Builder|StaticModel company() * @method static \Illuminate\Database\Eloquent\Builder|StaticModel exclude($columns) - * @method static \Illuminate\Database\Eloquent\Builder|Activity newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Activity newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Activity query() - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereAccountId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereActivityTypeId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereClientContactId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereClientId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereCompanyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereCreditId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereExpenseId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereInvitationId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereInvoiceId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereIp($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereIsSystem($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereNotes($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity wherePaymentId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereProjectId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity wherePurchaseOrderId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereQuoteId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereRecurringExpenseId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereRecurringInvoiceId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereRecurringQuoteId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereSubscriptionId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereTaskId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereTokenId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereVendorContactId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Activity whereVendorId($value) + * @mixin \Eloquent */ class Activity extends StaticModel diff --git a/app/Models/BankIntegration.php b/app/Models/BankIntegration.php index 17ac1eec4891..c701831b162b 100644 --- a/app/Models/BankIntegration.php +++ b/app/Models/BankIntegration.php @@ -27,11 +27,11 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property string|null $bank_account_number * @property string|null $bank_account_status * @property string|null $bank_account_type - * @property string $balance - * @property string|null $currency + * @property float $balance + * @property int|null $currency * @property string $nickname * @property string|null $from_date - * @property int $is_deleted + * @property bool $is_deleted * @property int|null $created_at * @property int|null $updated_at * @property int|null $deleted_at @@ -52,41 +52,9 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration query() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereAccountId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereAutoSync($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereBalance($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereBankAccountId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereBankAccountName($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereBankAccountNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereBankAccountStatus($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereBankAccountType($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereCompanyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereCurrency($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereDeletedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereDisabledUpstream($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereFromDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereIsDeleted($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereNickname($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereProviderId($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereProviderName($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration whereUserId($value) * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration withoutTrashed() * @property-read \Illuminate\Database\Eloquent\Collection $transactions - * @property-read \Illuminate\Database\Eloquent\Collection $transactions - * @property-read \Illuminate\Database\Eloquent\Collection $transactions - * @property-read \Illuminate\Database\Eloquent\Collection $transactions - * @property-read \Illuminate\Database\Eloquent\Collection $transactions - * @property-read \Illuminate\Database\Eloquent\Collection $transactions - * @property-read \Illuminate\Database\Eloquent\Collection $transactions - * @property-read \Illuminate\Database\Eloquent\Collection $transactions - * @property-read \Illuminate\Database\Eloquent\Collection $transactions - * @property-read \Illuminate\Database\Eloquent\Collection $transactions - * @property-read \Illuminate\Database\Eloquent\Collection $transactions - * @property-read \Illuminate\Database\Eloquent\Collection $transactions * @mixin \Eloquent */ class BankIntegration extends BaseModel diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index cbafe0ab96e0..74c483a52247 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -41,9 +41,9 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @method static \Illuminate\Database\Eloquent\Builder|BaseModel newQuery($query) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel query() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude(array $excludeable) - * @method static \Illuminate\Database\Eloquent\BaseModel withTrashed() + * @method static \Illuminate\Database\Eloquent\Builder withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scopeExclude($query) - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel find($value) + * @method static BaseModel find($value) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel whereIn($query) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel where($query) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel count() diff --git a/app/Models/CompanyGateway.php b/app/Models/CompanyGateway.php index 79d5b133798f..fd5a1dce004f 100644 --- a/app/Models/CompanyGateway.php +++ b/app/Models/CompanyGateway.php @@ -21,14 +21,15 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property int $company_id * @property int $user_id * @property string $gateway_key - * @property int $accepted_credit_cards - * @property int $require_cvv - * @property int|null $require_billing_address - * @property int|null $require_shipping_address - * @property int|null $update_details - * @property int $is_deleted + * @property bool $accepted_credit_cards + * @property bool $require_cvv + * @property bool $require_billing_address + * @property bool $require_shipping_address + * @property bool $update_details + * @property bool $is_deleted * @property string $config - * @property object $fees_and_limits + * @property mixed $fees_and_limits + * @property-write mixed $fees_and_limits * @property string|null $custom_value1 * @property string|null $custom_value2 * @property string|null $custom_value3 @@ -38,15 +39,15 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property int|null $deleted_at * @property string $token_billing * @property string|null $label - * @property int $require_client_name - * @property int $require_postal_code - * @property int $require_client_phone - * @property int $require_contact_name - * @property int $require_contact_email - * @property int $require_custom_value1 - * @property int $require_custom_value2 - * @property int $require_custom_value3 - * @property int $require_custom_value4 + * @property bool $require_client_name + * @property bool $require_postal_code + * @property bool $require_client_phone + * @property bool $require_contact_name + * @property bool $require_contact_email + * @property bool $require_custom_value1 + * @property bool $require_custom_value2 + * @property bool $require_custom_value3 + * @property bool $require_custom_value4 * @property-read int|null $client_gateway_tokens_count * @property-read \App\Models\Company $company * @property-read \App\Models\Gateway $gateway @@ -61,7 +62,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() * @method static \Illuminate\Database\Eloquent\Builder|CompanyGateway withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|CompanyGateway withoutTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|CompanyGateway find() + * @method static CompanyGateway find() * @property-read \Illuminate\Database\Eloquent\Collection $client_gateway_tokens * @mixin \Eloquent */ diff --git a/app/Models/CompanyToken.php b/app/Models/CompanyToken.php index f37bf10e3e81..dff64d99021f 100644 --- a/app/Models/CompanyToken.php +++ b/app/Models/CompanyToken.php @@ -66,12 +66,12 @@ class CompanyToken extends BaseModel return self::class; } - public function account() + public function account(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Account::class); } - public function user() + public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class); } @@ -81,7 +81,7 @@ class CompanyToken extends BaseModel return $this->belongsTo(Company::class); } - public function company_user() + public function company_user(): \Illuminate\Database\Eloquent\Relations\HasOne { return $this->hasOne(CompanyUser::class, 'user_id', 'user_id') ->where('company_id', $this->company_id) diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 1a9088c27254..e7ff74fdc9fb 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -122,7 +122,7 @@ use App\Events\Invoice\InvoiceReminderWasEmailed; * @property-read int|null $tasks_count * @property-read \App\Models\User $user * @property-read \App\Models\Vendor|null $vendor - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() + * @method static \Illuminate\Database\Eloquent\Builder company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) * @method static \Database\Factories\InvoiceFactory factory($count = null, $state = []) * @method static \Illuminate\Database\Eloquent\Builder|Invoice filter(\App\Filters\QueryFilters $filters) diff --git a/phpstan.neon b/phpstan.neon index cdfa3b25d911..dba885569bd5 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -10,4 +10,5 @@ parameters: - 'app/Console/Commands/*' - 'app/DataMapper/Analytics/*' universalObjectCratesClasses: - - App\DataMapper\Tax\RuleInterface \ No newline at end of file + - App\DataMapper\Tax\RuleInterface + - App\DataMapper\FeesAndLimits \ No newline at end of file From 82784582f09a5cec73ed08d304774d3396111770 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 1 Aug 2023 23:01:48 +1000 Subject: [PATCH 05/16] Static analysis cleanup --- .../Requests/Payment/RefundPaymentRequest.php | 2 +- .../Payment/ValidRefundableRequest.php | 69 ++++++++++--------- .../ValidRefundableInvoices.php | 2 +- app/Models/BaseModel.php | 36 +++++----- app/Models/Client.php | 1 + app/Models/CompanyGateway.php | 3 +- app/Models/Invoice.php | 11 --- app/Models/Payment.php | 18 ++--- 8 files changed, 61 insertions(+), 81 deletions(-) diff --git a/app/Http/Requests/Payment/RefundPaymentRequest.php b/app/Http/Requests/Payment/RefundPaymentRequest.php index 67ad4a7f7ab9..5ee4d0614b84 100644 --- a/app/Http/Requests/Payment/RefundPaymentRequest.php +++ b/app/Http/Requests/Payment/RefundPaymentRequest.php @@ -81,7 +81,7 @@ class RefundPaymentRequest extends Request return $rules; } - public function payment() :?Payment + public function payment(): ?\App\Models\Payment { $input = $this->all(); diff --git a/app/Http/ValidationRules/Payment/ValidRefundableRequest.php b/app/Http/ValidationRules/Payment/ValidRefundableRequest.php index 29b6a7230d58..752889a37009 100644 --- a/app/Http/ValidationRules/Payment/ValidRefundableRequest.php +++ b/app/Http/ValidationRules/Payment/ValidRefundableRequest.php @@ -46,6 +46,7 @@ class ValidRefundableRequest implements Rule return false; } + /**@var \App\Models\Payment $payment */ $payment = Payment::whereId($this->input['id'])->withTrashed()->first(); if (! $payment) { @@ -76,6 +77,7 @@ class ValidRefundableRequest implements Rule private function checkInvoiceIsPaymentable($invoice, $payment) { + /**@var \App\Models\Invoice $invoice */ $invoice = Invoice::whereId($invoice['invoice_id'])->whereCompanyId($payment->company_id)->withTrashed()->first(); if (! $invoice) { @@ -99,24 +101,25 @@ class ValidRefundableRequest implements Rule } } - private function checkCreditIsPaymentable($credit, $payment) - { - $credit = Credit::whereId($credit['credit_id'])->whereCompanyId($payment->company_id)->first(); + // private function checkCreditIsPaymentable($credit, $payment) + // { + // /** @var \App\Models\Credit $credit */ + // $credit = Credit::whereId($credit['credit_id'])->whereCompanyId($payment->company_id)->first(); - if ($payment->credits()->exists()) { - $paymentable_credit = $payment->credits->where('id', $credit->id)->first(); + // if ($payment->credits()->exists()) { + // $paymentable_credit = $payment->credits->where('id', $credit->id)->first(); - if (! $paymentable_credit) { - $this->error_msg = ctrans('texts.credit_not_related_to_payment', ['credit' => $credit->hashed_id]); + // if (! $paymentable_credit) { + // $this->error_msg = ctrans('texts.credit_not_related_to_payment', ['credit' => $credit->hashed_id]); - return false; - } - } else { - $this->error_msg = ctrans('texts.credit_not_related_to_payment', ['credit' => $credit->hashed_id]); + // return false; + // } + // } else { + // $this->error_msg = ctrans('texts.credit_not_related_to_payment', ['credit' => $credit->hashed_id]); - return false; - } - } + // return false; + // } + // } private function checkInvoice($paymentable, $request_invoices) { @@ -145,32 +148,32 @@ class ValidRefundableRequest implements Rule } } - private function checkCredit($paymentable, $request_credits) - { - $record_found = null; + // private function checkCredit($paymentable, $request_credits) + // { + // $record_found = null; - foreach ($request_credits as $request_credit) { - if ($request_credit['credit_id'] == $paymentable->pivot->paymentable_id) { - $record_found = true; + // foreach ($request_credits as $request_credit) { + // if ($request_credit['credit_id'] == $paymentable->pivot->paymentable_id) { + // $record_found = true; - $refundable_amount = ($paymentable->pivot->amount - $paymentable->pivot->refunded); + // $refundable_amount = ($paymentable->pivot->amount - $paymentable->pivot->refunded); - if ($request_credit['amount'] > $refundable_amount) { - $credit = $paymentable; + // if ($request_credit['amount'] > $refundable_amount) { + // $credit = $paymentable; - $this->error_msg = ctrans('texts.max_refundable_credit', ['credit' => $credit->hashed_id, 'amount' => $refundable_amount]); + // $this->error_msg = ctrans('texts.max_refundable_credit', ['credit' => $credit->hashed_id, 'amount' => $refundable_amount]); - return false; - } - } - } + // return false; + // } + // } + // } - if (! $record_found) { - $this->error_msg = ctrans('texts.refund_without_credits'); + // if (! $record_found) { + // $this->error_msg = ctrans('texts.refund_without_credits'); - return false; - } - } + // return false; + // } + // } /** * @return string diff --git a/app/Http/ValidationRules/ValidRefundableInvoices.php b/app/Http/ValidationRules/ValidRefundableInvoices.php index 3c10bf71a92c..5c3d57334ad5 100644 --- a/app/Http/ValidationRules/ValidRefundableInvoices.php +++ b/app/Http/ValidationRules/ValidRefundableInvoices.php @@ -45,7 +45,7 @@ class ValidRefundableInvoices implements Rule return false; } - /**@var \App\Models\Payment $payment */ + /**@var \App\Models\Payment $payment **/ $payment = Payment::whereId($this->input['id'])->first(); if (! $payment) { diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index 74c483a52247..e720c89a6bad 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -35,32 +35,30 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @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() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel with($value) - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel newModelQuery($query) - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel newQuery($query) - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel query() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude(array $excludeable) + * @method static \Illuminate\Database\Eloquent\Builder exclude($columns) + * @method static \Illuminate\Database\Eloquent\Builder company() + * @method static \Illuminate\Database\Eloquent\Builder with($value) + * @method static \Illuminate\Database\Eloquent\Builder newModelQuery($query) + * @method static \Illuminate\Database\Eloquent\Builder newQuery($query) + * @method static \Illuminate\Database\Eloquent\Builder query() + * @method static \Illuminate\Database\Eloquent\Builder exclude(array $excludeable) * @method static \Illuminate\Database\Eloquent\Builder withTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scopeExclude($query) + * @method static \Illuminate\Database\Eloquent\Builder scopeExclude($query) * @method static BaseModel find($value) - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel whereIn($query) - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel where($query) - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel count() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel create($query) - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel insert($query) - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel service() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel orderBy($column, $direction) - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel invitations() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel whereHas($query) + * @method static \Illuminate\Database\Eloquent\Builder whereIn($query) + * @method static \Illuminate\Database\Eloquent\Builder where($query) + * @method static \Illuminate\Database\Eloquent\Builder count() + * @method static \Illuminate\Database\Eloquent\Builder create($query) + * @method static \Illuminate\Database\Eloquent\Builder insert($query) + * @method static \Illuminate\Database\Eloquent\Builder service() + * @method static \Illuminate\Database\Eloquent\Builder orderBy($column, $direction) + * @method static \Illuminate\Database\Eloquent\Builder invitations() + * @method static \Illuminate\Database\Eloquent\Builder whereHas($query) * @property-read \Illuminate\Database\Eloquent\Collection $invitations * @property-read int|null $invitations_count * - * @method \App\Models\Company company() * @method int companyId() * @method createInvitations() - * @method Builder|static exclude($columns) - * @method static \Illuminate\Database\Eloquent\Builder exclude(array $columns) * @mixin \Eloquent * @mixin \Illuminate\Database\Eloquent\Builder */ diff --git a/app/Models/Client.php b/app/Models/Client.php index f8687eef6141..fd85ef504d90 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -552,6 +552,7 @@ class Client extends BaseModel implements HasLocalePreference foreach ($pms as $pm) { if ($pm['gateway_type_id'] == GatewayType::CREDIT_CARD) { + /**@var \App\Models\CompanyGateway $cg */ $cg = CompanyGateway::find($pm['company_gateway_id']); if ($cg && ! property_exists($cg->fees_and_limits, strval(GatewayType::CREDIT_CARD))) { diff --git a/app/Models/CompanyGateway.php b/app/Models/CompanyGateway.php index fd5a1dce004f..aeaca5d2ce39 100644 --- a/app/Models/CompanyGateway.php +++ b/app/Models/CompanyGateway.php @@ -28,8 +28,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property bool $update_details * @property bool $is_deleted * @property string $config - * @property mixed $fees_and_limits - * @property-write mixed $fees_and_limits + * @property object $fees_and_limits * @property string|null $custom_value1 * @property string|null $custom_value2 * @property string|null $custom_value3 diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index e7ff74fdc9fb..b0fd235a2ae7 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -122,17 +122,6 @@ use App\Events\Invoice\InvoiceReminderWasEmailed; * @property-read int|null $tasks_count * @property-read \App\Models\User $user * @property-read \App\Models\Vendor|null $vendor - * @method static \Illuminate\Database\Eloquent\Builder company() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) - * @method static \Database\Factories\InvoiceFactory factory($count = null, $state = []) - * @method static \Illuminate\Database\Eloquent\Builder|Invoice filter(\App\Filters\QueryFilters $filters) - * @method static \Illuminate\Database\Eloquent\Builder|Invoice newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Invoice newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Invoice onlyTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|Invoice query() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() - * @method static \Illuminate\Database\Eloquent\Builder|Invoice withTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|Invoice withoutTrashed() * @property-read \Illuminate\Database\Eloquent\Collection $activities * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger * @property-read \Illuminate\Database\Eloquent\Collection $credits diff --git a/app/Models/Payment.php b/app/Models/Payment.php index d2922d03656a..e60b4ec726fe 100644 --- a/app/Models/Payment.php +++ b/app/Models/Payment.php @@ -56,6 +56,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property float $exchange_rate * @property int $currency_id * @property int|null $exchange_currency_id + * @property \App\Models\Paymentable $paymentables * @property object|null $meta * @property string|null $custom_value1 * @property string|null $custom_value2 @@ -67,27 +68,17 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property-read \App\Models\Client $client * @property-read \App\Models\Company $company * @property-read \App\Models\CompanyGateway|null $company_gateway - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read int|null $company_ledger_count * @property-read \App\Models\ClientContact|null $contact - * @property-read \Illuminate\Database\Eloquent\Collection $credits - * @property-read int|null $credits_count * @property-read \App\Models\Currency|null $currency - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read int|null $documents_count * @property-read \App\Models\Currency|null $exchange_currency * @property-read \App\Models\GatewayType|null $gateway_type * @property-read mixed $hashed_id - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read int|null $invoices_count - * @property-read \Illuminate\Database\Eloquent\Collection $paymentables - * @property-read int|null $paymentables_count * @property-read \App\Models\Project|null $project * @property-read \App\Models\PaymentType|null $type * @property-read \App\Models\User|null $user * @property-read \App\Models\Vendor|null $vendor - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) + * @method static \Illuminate\Database\Eloquent\Builder company() + * @method static \Illuminate\Database\Eloquent\Builder exclude($columns) * @method static \Database\Factories\PaymentFactory factory($count = null, $state = []) * @method static \Illuminate\Database\Eloquent\Builder|Payment filter(\App\Filters\QueryFilters $filters) * @method static \Illuminate\Database\Eloquent\Builder|Payment newModelQuery() @@ -95,7 +86,6 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|Payment onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Payment query() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() - * @method static \Illuminate\Database\Eloquent\Builder|Payment withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Payment withoutTrashed() * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger * @property-read \Illuminate\Database\Eloquent\Collection $credits @@ -288,7 +278,7 @@ class Payment extends BaseModel return $this->belongsTo(GatewayType::class); } - public function paymentables() + public function paymentables(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(Paymentable::class); } From 0792638e9073be35f10191b0df24148e352376dd Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 1 Aug 2023 23:28:30 +1000 Subject: [PATCH 06/16] Static analysis cleanup --- app/DataMapper/FeesAndLimits.php | 28 +++++++------- .../Migration/UploadMigrationFileRequest.php | 6 ++- .../Requests/Payment/RefundPaymentRequest.php | 4 +- .../Payment/ValidRefundableRequest.php | 9 ++--- app/Models/BaseModel.php | 37 ++++++++++--------- app/Models/Invoice.php | 2 + app/Models/Payment.php | 1 + phpstan.neon | 2 +- 8 files changed, 47 insertions(+), 42 deletions(-) diff --git a/app/DataMapper/FeesAndLimits.php b/app/DataMapper/FeesAndLimits.php index eda9f4b30011..a790de9db7df 100644 --- a/app/DataMapper/FeesAndLimits.php +++ b/app/DataMapper/FeesAndLimits.php @@ -13,35 +13,35 @@ namespace App\DataMapper; class FeesAndLimits { - public $min_limit = -1; //equivalent to null + public float $min_limit = -1; //equivalent to null - public $max_limit = -1; //equivalent to null + public float $max_limit = -1; //equivalent to null - public $fee_amount = 0; + public float $fee_amount = 0; - public $fee_percent = 0; + public float $fee_percent = 0; - public $fee_tax_name1 = ''; + public string $fee_tax_name1 = ''; - public $fee_tax_name2 = ''; + public string $fee_tax_name2 = ''; - public $fee_tax_name3 = ''; + public string $fee_tax_name3 = ''; - public $fee_tax_rate1 = 0; + public float $fee_tax_rate1 = 0; - public $fee_tax_rate2 = 0; + public float $fee_tax_rate2 = 0; - public $fee_tax_rate3 = 0; + public float $fee_tax_rate3 = 0; - public $fee_cap = 0; + public float $fee_cap = 0; - public $adjust_fee_percent = false; + public bool $adjust_fee_percent = false; - public $is_enabled = true; + public bool $is_enabled = true; //public $gateway_type_id = 1; - public static $casts = [ + public static array $casts = [ 'is_enabled' => 'bool', 'gateway_type_id' => 'int', 'min_limit' => 'float', diff --git a/app/Http/Requests/Migration/UploadMigrationFileRequest.php b/app/Http/Requests/Migration/UploadMigrationFileRequest.php index b0d72dfe7d38..a67614f15ab6 100644 --- a/app/Http/Requests/Migration/UploadMigrationFileRequest.php +++ b/app/Http/Requests/Migration/UploadMigrationFileRequest.php @@ -22,7 +22,9 @@ class UploadMigrationFileRequest extends Request */ public function authorize() { - return auth()->user()->isAdmin(); + /** @var \App\Models\User $user */ + $user = auth()->user(); + return $user->isAdmin(); } /** @@ -30,7 +32,7 @@ class UploadMigrationFileRequest extends Request * * @return array */ - public function rules() + public function rules(): array { $rules = [ 'migration' => [], diff --git a/app/Http/Requests/Payment/RefundPaymentRequest.php b/app/Http/Requests/Payment/RefundPaymentRequest.php index 5ee4d0614b84..5f0a8381d5fa 100644 --- a/app/Http/Requests/Payment/RefundPaymentRequest.php +++ b/app/Http/Requests/Payment/RefundPaymentRequest.php @@ -64,12 +64,12 @@ class RefundPaymentRequest extends Request $this->replace($input); } - public function rules() + public function rules(): array { $input = $this->all(); $rules = [ - 'id' => 'bail|required', + 'id' => 'bail|required', //@phpstan-ignore-line 'id' => new ValidRefundableRequest($input), 'amount' => 'numeric', 'date' => 'required', diff --git a/app/Http/ValidationRules/Payment/ValidRefundableRequest.php b/app/Http/ValidationRules/Payment/ValidRefundableRequest.php index 752889a37009..db2f8ad2e1c5 100644 --- a/app/Http/ValidationRules/Payment/ValidRefundableRequest.php +++ b/app/Http/ValidationRules/Payment/ValidRefundableRequest.php @@ -46,8 +46,8 @@ class ValidRefundableRequest implements Rule return false; } - /**@var \App\Models\Payment $payment */ - $payment = Payment::whereId($this->input['id'])->withTrashed()->first(); + /**@var \App\Models\Payment $payment **/ + $payment = Payment::where('id', $this->input['id'])->withTrashed()->first(); if (! $payment) { $this->error_msg = ctrans('texts.unable_to_retrieve_payment'); @@ -56,7 +56,6 @@ class ValidRefundableRequest implements Rule } $request_invoices = request()->has('invoices') ? $this->input['invoices'] : []; - // $request_credits = request()->has('credits') ? $this->input['credits'] : []; if ($payment->invoices()->exists()) { foreach ($payment->invoices as $paymentable_invoice) { @@ -77,8 +76,8 @@ class ValidRefundableRequest implements Rule private function checkInvoiceIsPaymentable($invoice, $payment) { - /**@var \App\Models\Invoice $invoice */ - $invoice = Invoice::whereId($invoice['invoice_id'])->whereCompanyId($payment->company_id)->withTrashed()->first(); + /**@var \App\Models\Invoice $invoice **/ + $invoice = Invoice::where('id', $invoice['invoice_id'])->where('company_id', $payment->company_id)->withTrashed()->first(); if (! $invoice) { $this->error_msg = 'Invoice not found for refund'; diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index e720c89a6bad..f50ecb81cac2 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -35,25 +35,26 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @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() - * @method static \Illuminate\Database\Eloquent\Builder exclude($columns) - * @method static \Illuminate\Database\Eloquent\Builder company() - * @method static \Illuminate\Database\Eloquent\Builder with($value) - * @method static \Illuminate\Database\Eloquent\Builder newModelQuery($query) - * @method static \Illuminate\Database\Eloquent\Builder newQuery($query) - * @method static \Illuminate\Database\Eloquent\Builder query() - * @method static \Illuminate\Database\Eloquent\Builder exclude(array $excludeable) - * @method static \Illuminate\Database\Eloquent\Builder withTrashed() - * @method static \Illuminate\Database\Eloquent\Builder scopeExclude($query) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel with($value) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel newModelQuery($query) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel newQuery($query) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel query() + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude(array $excludeable) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel|\Illuminate\Database\Query\Builder withTrashed(bool $withTrashed = true) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scopeExclude($query) * @method static BaseModel find($value) - * @method static \Illuminate\Database\Eloquent\Builder whereIn($query) - * @method static \Illuminate\Database\Eloquent\Builder where($query) - * @method static \Illuminate\Database\Eloquent\Builder count() - * @method static \Illuminate\Database\Eloquent\Builder create($query) - * @method static \Illuminate\Database\Eloquent\Builder insert($query) - * @method static \Illuminate\Database\Eloquent\Builder service() - * @method static \Illuminate\Database\Eloquent\Builder orderBy($column, $direction) - * @method static \Illuminate\Database\Eloquent\Builder invitations() - * @method static \Illuminate\Database\Eloquent\Builder whereHas($query) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel whereId($query) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel whereIn($query) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel where($query) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel count() + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel create($query) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel insert($query) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel service() + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel orderBy($column, $direction) + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel invitations() + * @method static \Illuminate\Database\Eloquent\Builder|BaseModel whereHas($query) * @property-read \Illuminate\Database\Eloquent\Collection $invitations * @property-read int|null $invitations_count * diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index b0fd235a2ae7..812539485dab 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -132,6 +132,8 @@ use App\Events\Invoice\InvoiceReminderWasEmailed; * @property-read \Illuminate\Database\Eloquent\Collection $payments * @property-read \Illuminate\Database\Eloquent\Collection $tasks * @property object|null $tax_data + * @method static \Illuminate\Database\Eloquent\Builder company() + * @method static \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Query\Builder withTrashed(bool $withTrashed = true) * @mixin \Eloquent */ class Invoice extends BaseModel diff --git a/app/Models/Payment.php b/app/Models/Payment.php index e60b4ec726fe..368546283176 100644 --- a/app/Models/Payment.php +++ b/app/Models/Payment.php @@ -92,6 +92,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property-read \Illuminate\Database\Eloquent\Collection $documents * @property-read \Illuminate\Database\Eloquent\Collection $invoices * @property-read \Illuminate\Database\Eloquent\Collection $paymentables + * @method static \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Query\Builder withTrashed(bool $withTrashed = true) * @mixin \Eloquent */ class Payment extends BaseModel diff --git a/phpstan.neon b/phpstan.neon index dba885569bd5..6e4f01ab202e 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,7 +1,7 @@ includes: - ./vendor/nunomaduro/larastan/extension.neon parameters: - level: 4 + level: 2 paths: - 'app/' excludePaths: From 224e5d99f89f061a81abf4fdaf01ca536cc0ee4f Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 1 Aug 2023 23:53:10 +1000 Subject: [PATCH 07/16] Static analysis cleanup --- app/Console/Commands/CreateSingleAccount.php | 4 +- app/Models/Credit.php | 76 +------------- app/Models/Expense.php | 23 +++-- app/Models/Invoice.php | 4 +- app/Models/Product.php | 53 ---------- app/Models/PurchaseOrder.php | 78 ++------------- app/Models/Quote.php | 98 +++---------------- app/Models/StaticModel.php | 2 +- .../PayPalRestPaymentDriver.php | 20 ++-- tests/MockAccountData.php | 1 + 10 files changed, 50 insertions(+), 309 deletions(-) diff --git a/app/Console/Commands/CreateSingleAccount.php b/app/Console/Commands/CreateSingleAccount.php index 9d83e6b8f086..a28eb64e23ec 100644 --- a/app/Console/Commands/CreateSingleAccount.php +++ b/app/Console/Commands/CreateSingleAccount.php @@ -723,10 +723,10 @@ class CreateSingleAccount extends Command $cg->config = encrypt(config('ninja.testvars.paypal_rest')); $cg->save(); - $gateway_types = $cg->driver()->gatewayTypes(); + // $gateway_types = $cg->driver()->gatewayTypes(); $fees_and_limits = new stdClass; - $fees_and_limits->{$gateway_types[0]} = new FeesAndLimits; + $fees_and_limits->{3} = new FeesAndLimits; $cg->fees_and_limits = $fees_and_limits; $cg->save(); diff --git a/app/Models/Credit.php b/app/Models/Credit.php index e4dfe6e5f79b..380c9e3cb9d7 100644 --- a/app/Models/Credit.php +++ b/app/Models/Credit.php @@ -22,6 +22,7 @@ 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; @@ -112,79 +113,8 @@ use Laracasts\Presenter\PresentableTrait; * @property-read int|null $payments_count * @property-read \App\Models\Project|null $project * @property-read \App\Models\User $user + * @property-read \App\Models\Client $client * @property-read \App\Models\Vendor|null $vendor - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) - * @method static \Database\Factories\CreditFactory factory($count = null, $state = []) - * @method static \Illuminate\Database\Eloquent\Builder|Credit filter(\App\Filters\QueryFilters $filters) - * @method static \Illuminate\Database\Eloquent\Builder|Credit newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Credit newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Credit onlyTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|Credit query() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereAmount($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereAssignedUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereBackup($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereBalance($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereClientId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereCompanyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereCustomSurcharge1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereCustomSurcharge2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereCustomSurcharge3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereCustomSurcharge4($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereCustomSurchargeTax1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereCustomSurchargeTax2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereCustomSurchargeTax3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereCustomSurchargeTax4($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereCustomValue1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereCustomValue2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereCustomValue3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereCustomValue4($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereDeletedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereDesignId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereDiscount($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereDueDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereExchangeRate($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereFooter($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereInvoiceId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereIsAmountDiscount($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereIsDeleted($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereLastSentDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereLastViewed($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereLineItems($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereNextSendDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit wherePaidToDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit wherePartial($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit wherePartialDueDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit wherePoNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit wherePrivateNotes($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereProjectId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit wherePublicNotes($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereRecurringId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereReminder1Sent($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereReminder2Sent($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereReminder3Sent($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereReminderLastSent($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereStatusId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereSubscriptionId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereTaxName1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereTaxName2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereTaxName3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereTaxRate1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereTaxRate2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereTaxRate3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereTerms($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereTotalTaxes($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereUsesInclusiveTaxes($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit whereVendorId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Credit withTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|Credit withoutTrashed() * @property-read \Illuminate\Database\Eloquent\Collection $activities * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger * @property-read \Illuminate\Database\Eloquent\Collection $documents @@ -390,7 +320,7 @@ class Credit extends BaseModel return $this->belongsTo(User::class)->withTrashed(); } - public function client() + public function client(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Client::class)->withTrashed(); } diff --git a/app/Models/Expense.php b/app/Models/Expense.php index fd2cea88c6d6..d60802bc2338 100644 --- a/app/Models/Expense.php +++ b/app/Models/Expense.php @@ -86,8 +86,7 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|Expense withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Expense withoutTrashed() * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $client - * @property-read \Illuminate\Database\Eloquent\Collection $invoice + * @property-read \App\Models\Invoice|null $invoice * @property-read \App\Models\BankTransaction|null $transaction * @mixin \Eloquent */ @@ -156,12 +155,12 @@ class Expense extends BaseModel return $this->morphMany(Document::class, 'documentable'); } - public function user() + public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class)->withTrashed(); } - public function assigned_user() + public function assigned_user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class, 'assigned_user_id', 'id')->withTrashed(); } @@ -171,17 +170,17 @@ class Expense extends BaseModel return $this->belongsTo(Company::class); } - public function invoice() + public function invoice(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Invoice::class); } - public function vendor() + public function vendor(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Vendor::class); } - public function client() + public function client(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Client::class); } @@ -196,27 +195,27 @@ class Expense extends BaseModel return ctrans('texts.expense'); } - public function currency() + public function currency(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Currency::class); } - public function category() + public function category(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(ExpenseCategory::class)->withTrashed(); } - public function payment_type() + public function payment_type(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(PaymentType::class); } - public function project() + public function project(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Project::class); } - public function transaction() + public function transaction(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(BankTransaction::class); } diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 812539485dab..b7f127ee0c90 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -100,7 +100,7 @@ use App\Events\Invoice\InvoiceReminderWasEmailed; * @property bool $is_proforma * @property-read int|null $activities_count * @property-read \App\Models\User|null $assigned_user - * @property-read \App\Models\Client $client + * @property \App\Models\Client $client * @property-read \App\Models\Company $company * @property-read int|null $company_ledger_count * @property-read int|null $credits_count @@ -292,7 +292,7 @@ class Invoice extends BaseModel return $this->hasMany(InvoiceInvitation::class); } - public function client() + public function client(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Client::class)->withTrashed(); } diff --git a/app/Models/Product.php b/app/Models/Product.php index c3e8724ebc46..d07445e7f1b5 100644 --- a/app/Models/Product.php +++ b/app/Models/Product.php @@ -50,66 +50,13 @@ use League\CommonMark\CommonMarkConverter; * @property string|null $product_image * @property-read \App\Models\User|null $assigned_user * @property-read \App\Models\Company $company - * @property-read \Illuminate\Database\Eloquent\Collection $documents * @property-read int|null $documents_count * @property-read mixed $hashed_id * @property-read \App\Models\User $user * @property-read \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\ProductFactory factory($count = null, $state = []) - * @method static \Illuminate\Database\Eloquent\Builder|Product filter(\App\Filters\QueryFilters $filters) - * @method static \Illuminate\Database\Eloquent\Builder|Product newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Product newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Product onlyTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|Product query() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() - * @method static \Illuminate\Database\Eloquent\Builder|Product whereAssignedUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereCompanyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereCost($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereCustomValue1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereCustomValue2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereCustomValue3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereCustomValue4($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereDeletedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereInStockQuantity($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereIsDeleted($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereMaxQuantity($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereNotes($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product wherePrice($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereProductImage($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereProductKey($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereProjectId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereQuantity($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereStockNotification($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereStockNotificationThreshold($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereTaxName1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereTaxName2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereTaxName3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereTaxRate1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereTaxRate2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereTaxRate3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product whereVendorId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Product withTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|Product withoutTrashed() - * @property-read \Illuminate\Database\Eloquent\Collection $documents * @property int|null $tax_id * @property-read \Illuminate\Database\Eloquent\Collection $documents * @method static \Illuminate\Database\Eloquent\Builder|Product whereTaxId($value) - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $documents * @mixin \Eloquent */ class Product extends BaseModel diff --git a/app/Models/PurchaseOrder.php b/app/Models/PurchaseOrder.php index ec5b257fa4e2..e4355f6f82c6 100644 --- a/app/Models/PurchaseOrder.php +++ b/app/Models/PurchaseOrder.php @@ -116,70 +116,6 @@ use Illuminate\Support\Facades\Storage; * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder query() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereAmount($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereAssignedUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereBackup($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereBalance($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereClientId($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereCompanyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereCurrencyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereCustomSurcharge1($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereCustomSurcharge2($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereCustomSurcharge3($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereCustomSurcharge4($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereCustomSurchargeTax1($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereCustomSurchargeTax2($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereCustomSurchargeTax3($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereCustomSurchargeTax4($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereCustomValue1($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereCustomValue2($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereCustomValue3($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereCustomValue4($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereDeletedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereDesignId($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereDiscount($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereDueDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereExchangeRate($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereExpenseId($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereFooter($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereInvoiceId($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereIsAmountDiscount($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereIsDeleted($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereLastSentDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereLastViewed($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereLineItems($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereNextSendDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder wherePaidToDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder wherePartial($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder wherePartialDueDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder wherePoNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder wherePrivateNotes($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereProjectId($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder wherePublicNotes($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereRecurringId($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereReminder1Sent($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereReminder2Sent($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereReminder3Sent($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereReminderLastSent($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereStatusId($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereTaxName1($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereTaxName2($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereTaxName3($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereTaxRate1($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereTaxRate2($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereTaxRate3($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereTerms($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereTotalTaxes($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereUsesInclusiveTaxes($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder whereVendorId($value) - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder withTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|PurchaseOrder withoutTrashed() * @property-read \Illuminate\Database\Eloquent\Collection $activities * @property-read \Illuminate\Database\Eloquent\Collection $documents * @property-read \Illuminate\Database\Eloquent\Collection $history @@ -303,12 +239,12 @@ class PurchaseOrder extends BaseModel return self::class; } - 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)->withTrashed(); } @@ -323,22 +259,22 @@ class PurchaseOrder extends BaseModel 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 expense() + public function expense(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Expense::class); } - public function user() + public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class)->withTrashed(); } - public function client() + public function client(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Client::class)->withTrashed(); } @@ -384,7 +320,7 @@ class PurchaseOrder extends BaseModel return Storage::disk('public')->{$type}($file_path); } - public function invitations() + public function invitations(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(PurchaseOrderInvitation::class); } diff --git a/app/Models/Quote.php b/app/Models/Quote.php index 04c3cee2cd94..5333fd49d346 100644 --- a/app/Models/Quote.php +++ b/app/Models/Quote.php @@ -109,78 +109,6 @@ use Laracasts\Presenter\PresentableTrait; * @property-read \App\Models\Project|null $project * @property-read \App\Models\User $user * @property-read \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\QuoteFactory factory($count = null, $state = []) - * @method static \Illuminate\Database\Eloquent\Builder|Quote filter(\App\Filters\QueryFilters $filters) - * @method static \Illuminate\Database\Eloquent\Builder|Quote newModelQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Quote newQuery() - * @method static \Illuminate\Database\Eloquent\Builder|Quote onlyTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|Quote query() - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereAmount($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereAssignedUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereBackup($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereBalance($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereClientId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereCompanyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereCustomSurcharge1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereCustomSurcharge2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereCustomSurcharge3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereCustomSurcharge4($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereCustomSurchargeTax1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereCustomSurchargeTax2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereCustomSurchargeTax3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereCustomSurchargeTax4($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereCustomValue1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereCustomValue2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereCustomValue3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereCustomValue4($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereDeletedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereDesignId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereDiscount($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereDueDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereExchangeRate($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereFooter($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereInvoiceId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereIsAmountDiscount($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereIsDeleted($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereLastSentDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereLastViewed($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereLineItems($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereNextSendDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote wherePaidToDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote wherePartial($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote wherePartialDueDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote wherePoNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote wherePrivateNotes($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereProjectId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote wherePublicNotes($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereRecurringId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereReminder1Sent($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereReminder2Sent($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereReminder3Sent($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereReminderLastSent($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereStatusId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereSubscriptionId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereTaxName1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereTaxName2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereTaxName3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereTaxRate1($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereTaxRate2($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereTaxRate3($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereTerms($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereTotalTaxes($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereUsesInclusiveTaxes($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote whereVendorId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Quote withTrashed() - * @method static \Illuminate\Database\Eloquent\Builder|Quote withoutTrashed() * @property-read \Illuminate\Database\Eloquent\Collection $activities * @property-read \Illuminate\Database\Eloquent\Collection $documents * @property-read \Illuminate\Database\Eloquent\Collection $history @@ -291,57 +219,57 @@ class Quote extends BaseModel return $value; } - public function company() + public function company(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Company::class); } - 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 user() + public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class)->withTrashed(); } - public function client() + public function client(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Client::class)->withTrashed(); } - public function invoice() + public function invoice(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Invoice::class)->withTrashed(); } - 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 project() + public function project(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Project::class)->withTrashed(); } - public function invitations() + public function invitations(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(QuoteInvitation::class); } - public function documents() + public function documents(): \Illuminate\Database\Eloquent\Relations\MorphMany { return $this->morphMany(Document::class, 'documentable'); } @@ -473,7 +401,7 @@ class Quote extends BaseModel * * @return bool */ - public function isApproved() + public function isApproved(): bool { if ($this->status_id === $this::STATUS_APPROVED) { return true; @@ -497,7 +425,7 @@ class Quote extends BaseModel return $this->calc()->getTotal(); } - public function translate_entity() + public function translate_entity(): string { return ctrans('texts.quote'); } diff --git a/app/Models/StaticModel.php b/app/Models/StaticModel.php index f5be46c52558..f6b3a5747f0a 100644 --- a/app/Models/StaticModel.php +++ b/app/Models/StaticModel.php @@ -24,7 +24,7 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @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 query(?$value) * @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/PaymentDrivers/PayPalRestPaymentDriver.php b/app/PaymentDrivers/PayPalRestPaymentDriver.php index 6e257c8e715b..f60c4e3b1762 100644 --- a/app/PaymentDrivers/PayPalRestPaymentDriver.php +++ b/app/PaymentDrivers/PayPalRestPaymentDriver.php @@ -44,16 +44,16 @@ class PayPalRestPaymentDriver extends BaseDriver 3 => 'paypal', 1 => 'card', 25 => 'venmo', - 9 => 'sepa', - 12 => 'bancontact', - 17 => 'eps', - 15 => 'giropay', - 13 => 'ideal', - 26 => 'mercadopago', - 27 => 'mybank', - 28 => 'paylater', - 16 => 'p24', - 7 => 'sofort' + // 9 => 'sepa', + // 12 => 'bancontact', + // 17 => 'eps', + // 15 => 'giropay', + // 13 => 'ideal', + // 26 => 'mercadopago', + // 27 => 'mybank', + // 28 => 'paylater', + // 16 => 'p24', + // 7 => 'sofort' ]; diff --git a/tests/MockAccountData.php b/tests/MockAccountData.php index c81a97c6a927..86b039bfcdd3 100644 --- a/tests/MockAccountData.php +++ b/tests/MockAccountData.php @@ -808,6 +808,7 @@ trait MockAccountData $cg->fees_and_limits = $data; $cg->save(); + $cg = new CompanyGateway; $cg->company_id = $this->company->id; $cg->user_id = $user_id; From c72d802e4a540197ea1593e423ffecfa381c134e Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 1 Aug 2023 23:53:54 +1000 Subject: [PATCH 08/16] Static analysis cleanup --- app/DataMapper/FeesAndLimits.php | 28 ++++++++++++++-------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/app/DataMapper/FeesAndLimits.php b/app/DataMapper/FeesAndLimits.php index a790de9db7df..eda9f4b30011 100644 --- a/app/DataMapper/FeesAndLimits.php +++ b/app/DataMapper/FeesAndLimits.php @@ -13,35 +13,35 @@ namespace App\DataMapper; class FeesAndLimits { - public float $min_limit = -1; //equivalent to null + public $min_limit = -1; //equivalent to null - public float $max_limit = -1; //equivalent to null + public $max_limit = -1; //equivalent to null - public float $fee_amount = 0; + public $fee_amount = 0; - public float $fee_percent = 0; + public $fee_percent = 0; - public string $fee_tax_name1 = ''; + public $fee_tax_name1 = ''; - public string $fee_tax_name2 = ''; + public $fee_tax_name2 = ''; - public string $fee_tax_name3 = ''; + public $fee_tax_name3 = ''; - public float $fee_tax_rate1 = 0; + public $fee_tax_rate1 = 0; - public float $fee_tax_rate2 = 0; + public $fee_tax_rate2 = 0; - public float $fee_tax_rate3 = 0; + public $fee_tax_rate3 = 0; - public float $fee_cap = 0; + public $fee_cap = 0; - public bool $adjust_fee_percent = false; + public $adjust_fee_percent = false; - public bool $is_enabled = true; + public $is_enabled = true; //public $gateway_type_id = 1; - public static array $casts = [ + public static $casts = [ 'is_enabled' => 'bool', 'gateway_type_id' => 'int', 'min_limit' => 'float', From 2ca3246af823d3418e48cbddb745e50faa5729e2 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 2 Aug 2023 10:38:36 +1000 Subject: [PATCH 09/16] Fixes for matching transactions --- app/Filters/ExpenseFilters.php | 1 + app/Jobs/Bank/MatchBankTransactions.php | 2 +- app/Models/PurchaseOrder.php | 16 ++++++++-------- app/Models/Quote.php | 6 ------ lang/en/texts.php | 6 +++++- lang/fr_CA/texts.php | 17 ++++++++++++++--- 6 files changed, 29 insertions(+), 19 deletions(-) diff --git a/app/Filters/ExpenseFilters.php b/app/Filters/ExpenseFilters.php index 4475973e3e8f..22298105da27 100644 --- a/app/Filters/ExpenseFilters.php +++ b/app/Filters/ExpenseFilters.php @@ -33,6 +33,7 @@ class ExpenseFilters extends QueryFilters return $this->builder->where(function ($query) use ($filter) { $query->where('number', 'like', '%'.$filter.'%') + ->orWhere('amount', 'like', '%'.$filter.'%') ->orWhere('public_notes', 'like', '%'.$filter.'%') ->orWhere('custom_value1', 'like', '%'.$filter.'%') ->orWhere('custom_value2', 'like', '%'.$filter.'%') diff --git a/app/Jobs/Bank/MatchBankTransactions.php b/app/Jobs/Bank/MatchBankTransactions.php index ca6dc4a5a2bb..98b4c05dc700 100644 --- a/app/Jobs/Bank/MatchBankTransactions.php +++ b/app/Jobs/Bank/MatchBankTransactions.php @@ -243,7 +243,7 @@ class MatchBankTransactions implements ShouldQueue private function matchExpense($input) :self { //if there is a category id, pull it from Yodlee and insert - or just reuse!! - $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; diff --git a/app/Models/PurchaseOrder.php b/app/Models/PurchaseOrder.php index e4355f6f82c6..f30a9076e427 100644 --- a/app/Models/PurchaseOrder.php +++ b/app/Models/PurchaseOrder.php @@ -249,12 +249,12 @@ class PurchaseOrder extends BaseModel return $this->belongsTo(Vendor::class)->withTrashed(); } - 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); } @@ -325,12 +325,12 @@ class PurchaseOrder extends BaseModel return $this->hasMany(PurchaseOrderInvitation::class); } - public function project() + public function project(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Project::class)->withTrashed(); } - public function invoice() + public function invoice(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Invoice::class); } @@ -341,17 +341,17 @@ class PurchaseOrder extends BaseModel return new PurchaseOrderService($this); } - 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'); } @@ -374,7 +374,7 @@ class PurchaseOrder extends BaseModel return $purchase_order_calc->build(); } - public function translate_entity() + public function translate_entity(): string { return ctrans('texts.purchase_order'); } diff --git a/app/Models/Quote.php b/app/Models/Quote.php index 5333fd49d346..b3426acb5547 100644 --- a/app/Models/Quote.php +++ b/app/Models/Quote.php @@ -90,19 +90,13 @@ use Laracasts\Presenter\PresentableTrait; * @property string|null $reminder_last_sent * @property string $paid_to_date * @property int|null $subscription_id - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read int|null $activities_count * @property-read \App\Models\User|null $assigned_user * @property-read \App\Models\Client $client * @property-read \App\Models\Company $company - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read int|null $documents_count * @property-read mixed $balance_due * @property-read mixed $hashed_id * @property-read mixed $total * @property-read mixed $valid_until - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read int|null $history_count * @property-read int|null $invitations_count * @property-read \App\Models\Invoice|null $invoice * @property-read \App\Models\QuoteInvitation|null $invitations diff --git a/lang/en/texts.php b/lang/en/texts.php index 71b154870032..fefb47bf3eb6 100644 --- a/lang/en/texts.php +++ b/lang/en/texts.php @@ -5135,9 +5135,13 @@ $LANG = array( 'activity_10_online' => ':contact entered payment :payment for invoice :invoice for :client', 'activity_10_manual' => ':user entered payment :payment for invoice :invoice for :client', 'default_payment_type' => 'Default Payment Type', + 'number_precision' => 'Number precision', + 'number_precision_help' => 'Controls the number of decimals supported in the interface', + 'is_tax_exempt' => 'Tax Exempt', + 'drop_files_here' => 'Drop files here', + 'upload_files' => 'Upload Files', ); - return $LANG; ?> \ No newline at end of file diff --git a/lang/fr_CA/texts.php b/lang/fr_CA/texts.php index 609c4acafd9a..46bdc30e79fc 100644 --- a/lang/fr_CA/texts.php +++ b/lang/fr_CA/texts.php @@ -369,7 +369,7 @@ $LANG = array( 'go_back' => 'Retour', 'data_visualizations' => 'Visualisation des données', 'sample_data' => 'Données fictives présentées', - 'hide' => 'Cacher', + 'hide' => 'Masquer', 'new_version_available' => 'Une nouvelle version de :releases_link est disponible. Vous utilisez v:user_version, la plus récente est v:latest_version', 'invoice_settings' => 'Paramètres des factures', 'invoice_number_prefix' => 'Préfixe du numéro de facture', @@ -1132,7 +1132,7 @@ $LANG = array( 'document_size' => 'Taille', 'enable_client_portal' => 'Portail client', - 'enable_client_portal_help' => 'Afficher / masquer le portail client.', + 'enable_client_portal_help' => 'Afficher/masquer le portail client.', 'enable_client_portal_dashboard' => 'Tableau de bord', 'enable_client_portal_dashboard_help' => 'Afficher/masquer la page du tableau de bord dans le portail client.', @@ -4281,7 +4281,7 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'remind_me' => 'Rappel', 'instant_bank_pay' => 'Instant Bank Pay', 'click_selected' => 'Cliquer sur la sélection', - 'hide_preview' => 'Cacher l\'aperçu', + 'hide_preview' => 'Masquer l\'aperçu', 'edit_record' => 'Modifier l\'enregistrement', 'credit_is_more_than_invoice' => 'Le montant du crédit ne peut pas être supérieur que le montant de la facture', 'please_set_a_password' => 'Veuillez spécifier un mot de passe', @@ -5116,6 +5116,17 @@ Lorsque les montant apparaîtront sur votre relevé, veuillez revenir sur cette 'income' => 'Revenu', 'amount_received_help' => 'Saisissez une valeur si le montant total reçu été PLUS élevé que le montant de la facture, ou lors de l\'enregistrement d\'un paiement sans factures. Sinon, ce champ devrait rester vide.', 'vendor_phone' => 'Téléphone du fournisseur', + 'mercado_pago' => 'Mercado Pago', + 'mybank' => 'MyBank', + 'paypal_paylater' => 'Payez en 4', + 'paid_date' => 'Date de paiement', + 'district' => 'District', + 'region' => 'Région', + 'county' => 'Comté', + 'tax_details' => 'Détails de taxes', + 'activity_10_online' => ':contact a saisi un paiement :payment pour la facture :invoice pour :client', + 'activity_10_manual' => ':user a saisi un paiement :payment pour la facture :invoice pour :client', + 'default_payment_type' => 'Type de paiement par défaut', ); From 4bfe59d2f97612815eb6901c8d274249681b5b19 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 2 Aug 2023 19:10:39 +1000 Subject: [PATCH 10/16] Updates for license checks --- app/Http/Controllers/LicenseController.php | 2 +- app/Services/Chart/ChartQueries.php | 22 ++++++++++++++++++++++ 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/LicenseController.php b/app/Http/Controllers/LicenseController.php index b9221a82c719..1ead42dac365 100644 --- a/app/Http/Controllers/LicenseController.php +++ b/app/Http/Controllers/LicenseController.php @@ -137,7 +137,7 @@ class LicenseController extends BaseController } } else { $error = [ - 'message' => trans('texts.white_label_license_error'), + 'message' => 'There was an issue connecting to the license server. Please check your network.', 'errors' => new stdClass, ]; diff --git a/app/Services/Chart/ChartQueries.php b/app/Services/Chart/ChartQueries.php index 7f284736c58b..9d7172ca13e7 100644 --- a/app/Services/Chart/ChartQueries.php +++ b/app/Services/Chart/ChartQueries.php @@ -164,6 +164,28 @@ trait ChartQueries "), ['company_currency' => $this->company->settings->currency_id, 'company_id' => $this->company->id, 'start_date' => $start_date, 'end_date' => $end_date]); } + // public function getPaymentsQuery($start_date, $end_date) + // { + // $user_filter = $this->is_admin ? '' : 'AND clients.user_id = '.$this->user->id; + + // return DB::select(DB::raw(" + // SELECT + // sum(payments.amount - payments.refunded) as paid_to_date, + // IFNULL(CAST(JSON_UNQUOTE(JSON_EXTRACT( clients.settings, '$.currency_id' )) AS SIGNED), :company_currency) AS currency_id + // FROM payments + // JOIN invoices + // on invoices.client_id = clients.id + // WHERE invoices.company_id = :company_id + // AND clients.is_deleted = 0 + // {$user_filter} + // AND invoices.is_deleted = 0 + // AND invoices.amount > 0 + // AND invoices.status_id IN (3,4) + // AND (invoices.date BETWEEN :start_date AND :end_date) + // GROUP BY currency_id + // "), ['company_currency' => $this->company->settings->currency_id, 'company_id' => $this->company->id, 'start_date' => $start_date, 'end_date' => $end_date]); + // } + public function getInvoicesQuery($start_date, $end_date) { $user_filter = $this->is_admin ? '' : 'AND clients.user_id = '.$this->user->id; From 54420dfe9994554a3e22acd399ecb918dedb3a52 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 2 Aug 2023 19:14:28 +1000 Subject: [PATCH 11/16] Updates for static analysis --- app/Helpers/Invoice/ProRata.php | 1 + app/Http/Controllers/LicenseController.php | 1 - app/Models/Quote.php | 1 + app/Models/RecurringInvoice.php | 12 ++++++------ app/Models/Vendor.php | 6 +++--- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/app/Helpers/Invoice/ProRata.php b/app/Helpers/Invoice/ProRata.php index 7c2027f6b8ac..92f1000ef5dd 100644 --- a/app/Helpers/Invoice/ProRata.php +++ b/app/Helpers/Invoice/ProRata.php @@ -69,6 +69,7 @@ class ProRata return []; } + /** @var \App\Models\RecurringInvoice $recurring_invoice **/ $recurring_invoice = RecurringInvoice::find($invoice->recurring_id)->first(); if (! $recurring_invoice) { diff --git a/app/Http/Controllers/LicenseController.php b/app/Http/Controllers/LicenseController.php index 1ead42dac365..ec130115ba96 100644 --- a/app/Http/Controllers/LicenseController.php +++ b/app/Http/Controllers/LicenseController.php @@ -14,7 +14,6 @@ namespace App\Http\Controllers; use App\Models\Account; use App\Utils\CurlUtils; use Carbon\Carbon; -use Illuminate\Http\Request; use Illuminate\Http\Response; use Illuminate\Support\Facades\Http; use stdClass; diff --git a/app/Models/Quote.php b/app/Models/Quote.php index b3426acb5547..da496f7d63dd 100644 --- a/app/Models/Quote.php +++ b/app/Models/Quote.php @@ -43,6 +43,7 @@ use Laracasts\Presenter\PresentableTrait; * @property string|null $number * @property float $discount * @property bool $is_amount_discount + * @property bool $auto_bill_enabled * @property string|null $po_number * @property string|null $date * @property string|null $last_sent_date diff --git a/app/Models/RecurringInvoice.php b/app/Models/RecurringInvoice.php index a41f58629fb6..9bc2e06a00bb 100644 --- a/app/Models/RecurringInvoice.php +++ b/app/Models/RecurringInvoice.php @@ -278,7 +278,7 @@ class RecurringInvoice extends BaseModel return $value; } - public function vendor() + public function vendor(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Vendor::class); } @@ -293,27 +293,27 @@ class RecurringInvoice extends BaseModel return $this->hasManyThrough(Backup::class, Activity::class); } - public function company() + public function company(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Company::class); } - public function client() + public function client(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Client::class)->withTrashed(); } - public function project() + public function project(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Project::class)->withTrashed(); } - public function user() + public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class)->withTrashed(); } - public function assigned_user() + public function assigned_user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class, 'assigned_user_id', 'id')->withTrashed(); } diff --git a/app/Models/Vendor.php b/app/Models/Vendor.php index 84ca29d6f31d..43ed415da681 100644 --- a/app/Models/Vendor.php +++ b/app/Models/Vendor.php @@ -164,7 +164,7 @@ class Vendor extends BaseModel return self::class; } - public function primary_contact() + public function primary_contact(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(VendorContact::class)->where('is_primary', true); } @@ -179,12 +179,12 @@ class Vendor extends BaseModel return $this->belongsTo(User::class, 'assigned_user_id', 'id')->withTrashed(); } - public function contacts() + public function contacts(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(VendorContact::class)->orderBy('is_primary', 'desc'); } - public function activities() + public function activities(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(Activity::class); } From e35a99d454e9ad01792d017f5dbae16fde274bd6 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 2 Aug 2023 19:47:26 +1000 Subject: [PATCH 12/16] Updates for static analysis --- app/Jobs/Util/VersionCheck.php | 1 + app/Mail/Engine/CreditEmailEngine.php | 3 - app/Mail/Engine/InvoiceEmailEngine.php | 3 - app/Mail/Engine/PurchaseOrderEmailEngine.php | 3 - app/Mail/Engine/QuoteEmailEngine.php | 3 - app/Mail/MigrationCompleted.php | 25 ++-- ...ClientContactRequestCancellationObject.php | 5 +- app/Models/Account.php | 42 ------- app/Models/Activity.php | 2 + app/Models/BankIntegration.php | 1 - app/Models/BankSubaccount.php | 3 - app/Models/BaseModel.php | 17 ++- app/Models/Company.php | 30 ++--- app/Models/RecurringInvoice.php | 6 +- app/Models/RecurringQuote.php | 115 +----------------- app/Models/Webhook.php | 16 +-- app/Services/Chart/ChartQueries.php | 38 +++--- phpstan.neon | 4 +- 18 files changed, 64 insertions(+), 253 deletions(-) diff --git a/app/Jobs/Util/VersionCheck.php b/app/Jobs/Util/VersionCheck.php index c21fb1d4ac63..6d40a3e7172f 100644 --- a/app/Jobs/Util/VersionCheck.php +++ b/app/Jobs/Util/VersionCheck.php @@ -38,6 +38,7 @@ class VersionCheck implements ShouldQueue $version_file = trim(@file_get_contents(config('ninja.version_url'))); if (Ninja::isSelfHost() && $version_file) { + /** @var \App\Models\Account $account **/ Account::whereNotNull('id')->update(['latest_version' => $version_file]); } diff --git a/app/Mail/Engine/CreditEmailEngine.php b/app/Mail/Engine/CreditEmailEngine.php index 2bf98f78410d..09ef15e70abb 100644 --- a/app/Mail/Engine/CreditEmailEngine.php +++ b/app/Mail/Engine/CreditEmailEngine.php @@ -69,7 +69,6 @@ class CreditEmailEngine extends BaseEmailEngine 'company' => $this->credit->company->present()->name(), 'amount' => Number::formatMoney($this->credit->balance, $this->client), ], - null, $this->client->locale() ); @@ -89,7 +88,6 @@ class CreditEmailEngine extends BaseEmailEngine 'number' => $this->credit->number, 'account' => $this->credit->company->present()->name(), ], - null, $this->client->locale() ); } @@ -101,7 +99,6 @@ class CreditEmailEngine extends BaseEmailEngine 'company' => $this->credit->company->present()->name(), 'amount' => Number::formatMoney($this->credit->balance, $this->client), ], - null, $this->client->locale() )."\n\n".$this->invitation->getLink(); diff --git a/app/Mail/Engine/InvoiceEmailEngine.php b/app/Mail/Engine/InvoiceEmailEngine.php index 46604e71690e..debd20eaa6e6 100644 --- a/app/Mail/Engine/InvoiceEmailEngine.php +++ b/app/Mail/Engine/InvoiceEmailEngine.php @@ -76,7 +76,6 @@ class InvoiceEmailEngine extends BaseEmailEngine 'company' => $this->invoice->company->present()->name(), 'amount' => Number::formatMoney($this->invoice->balance, $this->client), ], - null, $this->client->locale() ); @@ -90,7 +89,6 @@ class InvoiceEmailEngine extends BaseEmailEngine 'company' => $this->invoice->company->present()->name(), 'amount' => Number::formatMoney($this->invoice->balance, $this->client), ], - null, $this->client->locale() )."\n\n".$this->invitation->getLink(); @@ -109,7 +107,6 @@ class InvoiceEmailEngine extends BaseEmailEngine 'number' => $this->invoice->number, 'account' => $this->invoice->company->present()->name(), ], - null, $this->client->locale() ); } diff --git a/app/Mail/Engine/PurchaseOrderEmailEngine.php b/app/Mail/Engine/PurchaseOrderEmailEngine.php index 4d104cc2d149..4bdd16f17e4a 100644 --- a/app/Mail/Engine/PurchaseOrderEmailEngine.php +++ b/app/Mail/Engine/PurchaseOrderEmailEngine.php @@ -73,7 +73,6 @@ class PurchaseOrderEmailEngine extends BaseEmailEngine 'company' => $this->purchase_order->company->present()->name(), 'amount' => Number::formatMoney($this->purchase_order->balance, $this->vendor), ], - null, $this->vendor->company->locale() ); @@ -86,7 +85,6 @@ class PurchaseOrderEmailEngine extends BaseEmailEngine 'company' => $this->purchase_order->company->present()->name(), 'amount' => Number::formatMoney($this->purchase_order->balance, $this->vendor), ], - null, $this->vendor->company->locale() )."\n\n".$this->invitation->getLink(); @@ -105,7 +103,6 @@ class PurchaseOrderEmailEngine extends BaseEmailEngine 'number' => $this->purchase_order->number, 'account' => $this->purchase_order->company->present()->name(), ], - null, $this->vendor->company->locale() ); } diff --git a/app/Mail/Engine/QuoteEmailEngine.php b/app/Mail/Engine/QuoteEmailEngine.php index 440624a3975f..8e36291b0d42 100644 --- a/app/Mail/Engine/QuoteEmailEngine.php +++ b/app/Mail/Engine/QuoteEmailEngine.php @@ -68,7 +68,6 @@ class QuoteEmailEngine extends BaseEmailEngine 'company' => $this->quote->company->present()->name(), 'amount' => Number::formatMoney($this->quote->amount, $this->client), ], - null, $this->client->locale() ); @@ -88,7 +87,6 @@ class QuoteEmailEngine extends BaseEmailEngine 'number' => $this->quote->number, 'account' => $this->quote->company->present()->name(), ], - null, $this->client->locale() ); } @@ -100,7 +98,6 @@ class QuoteEmailEngine extends BaseEmailEngine 'company' => $this->quote->company->present()->name(), 'amount' => Number::formatMoney($this->quote->amount, $this->client), ], - null, $this->client->locale() )."\n\n".$this->invitation->getLink(); diff --git a/app/Mail/MigrationCompleted.php b/app/Mail/MigrationCompleted.php index 3052f7adf792..9b62fb6fbab7 100644 --- a/app/Mail/MigrationCompleted.php +++ b/app/Mail/MigrationCompleted.php @@ -1,36 +1,33 @@ company_id = $company_id; - $this->check_data = $check_data; - $this->db = $db; } /** diff --git a/app/Mail/RecurringInvoice/ClientContactRequestCancellationObject.php b/app/Mail/RecurringInvoice/ClientContactRequestCancellationObject.php index 0ae4682d1c70..ab1011b08b9f 100644 --- a/app/Mail/RecurringInvoice/ClientContactRequestCancellationObject.php +++ b/app/Mail/RecurringInvoice/ClientContactRequestCancellationObject.php @@ -11,13 +11,16 @@ namespace App\Mail\RecurringInvoice; +use App\Utils\Ninja; +use App\Models\Company; use App\Models\ClientContact; use App\Models\RecurringInvoice; -use App\Utils\Ninja; use Illuminate\Support\Facades\App; class ClientContactRequestCancellationObject { + public Company $company; + public function __construct(public RecurringInvoice $recurring_invoice, public ClientContact $client_contact, private bool $gateway_refund_attempted) { } diff --git a/app/Models/Account.php b/app/Models/Account.php index 46ba1c330ace..0cdc5a09e373 100644 --- a/app/Models/Account.php +++ b/app/Models/Account.php @@ -78,54 +78,12 @@ use Laracasts\Presenter\PresentableTrait; * @property-read mixed $hashed_id * @property-read \App\Models\Payment|null $payment * @property-read int|null $users_count - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) * @method static \Database\Factories\AccountFactory factory($count = null, $state = []) * @method static \Illuminate\Database\Eloquent\Builder|Account newModelQuery() * @method static \Illuminate\Database\Eloquent\Builder|Account newQuery() * @method static \Illuminate\Database\Eloquent\Builder|Account query() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() - * @method static \Illuminate\Database\Eloquent\Builder|Account whereAccountSmsVerificationCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereAccountSmsVerificationNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereAccountSmsVerified($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereBankIntegrationAccountId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereDefaultCompanyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereHostedClientCount($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereHostedCompanyCount($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereInappTransactionId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereIsFlagged($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereIsMigrated($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereIsOnboarding($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereIsSchedulerRunning($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereIsTrial($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereIsVerifiedAccount($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereKey($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereLatestVersion($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereNumUsers($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereOnboarding($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account wherePaymentId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account wherePlan($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account wherePlanExpires($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account wherePlanPaid($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account wherePlanPrice($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account wherePlanStarted($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account wherePlanTerm($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account wherePlatform($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereReferralCode($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereReportErrors($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereSetReactAsDefaultAp($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereTrialDuration($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereTrialPlan($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereTrialStarted($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereUserAgent($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereUtmCampaign($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereUtmContent($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereUtmMedium($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereUtmSource($value) - * @method static \Illuminate\Database\Eloquent\Builder|Account whereUtmTerm($value) * @method static \Illuminate\Database\Eloquent\Builder|Account first() * @method static \Illuminate\Database\Eloquent\Builder|Account with() * @method static \Illuminate\Database\Eloquent\Builder|Account count() diff --git a/app/Models/Activity.php b/app/Models/Activity.php index 84d9bbda5ef1..7105dbda7298 100644 --- a/app/Models/Activity.php +++ b/app/Models/Activity.php @@ -445,6 +445,8 @@ class Activity extends StaticModel { $system = ctrans('texts.system'); + $translation = ''; + match($variable) { ':invoice' => $translation = [substr($variable, 1) => [ 'label' => $this?->invoice?->number ?? '', 'hashed_id' => $this->invoice?->hashed_id ?? '']], ':user' => $translation = [substr($variable, 1) => [ 'label' => $this?->user?->present()->name() ?? $system, 'hashed_id' => $this->user->hashed_id ?? '']], diff --git a/app/Models/BankIntegration.php b/app/Models/BankIntegration.php index c701831b162b..d6ec7ca94827 100644 --- a/app/Models/BankIntegration.php +++ b/app/Models/BankIntegration.php @@ -43,7 +43,6 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property-read \Illuminate\Database\Eloquent\Collection $transactions * @property-read int|null $transactions_count * @property-read \App\Models\User $user - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) * @method static \Database\Factories\BankIntegrationFactory factory($count = null, $state = []) * @method static \Illuminate\Database\Eloquent\Builder|BankIntegration filter(\App\Filters\QueryFilters $filters) diff --git a/app/Models/BankSubaccount.php b/app/Models/BankSubaccount.php index 29cd4a0de5de..c25f4d539750 100644 --- a/app/Models/BankSubaccount.php +++ b/app/Models/BankSubaccount.php @@ -34,9 +34,6 @@ class BankSubaccount extends BaseModel { use SoftDeletes; - /** - * @var array - */ /** * @return BelongsTo */ diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index f50ecb81cac2..ac19cb1f9054 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -27,6 +27,7 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * Class BaseModel * * @method scope() static + * @method company() static * @package App\Models * @property-read mixed $hashed_id * @property string $number @@ -36,7 +37,6 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @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() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel exclude($columns) - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel company() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel with($value) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel newModelQuery($query) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel newQuery($query) @@ -51,15 +51,16 @@ use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundExceptio * @method static \Illuminate\Database\Eloquent\Builder|BaseModel count() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel create($query) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel insert($query) - * @method static \Illuminate\Database\Eloquent\Builder|BaseModel service() + * @method BaseModel service() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel orderBy($column, $direction) * @method static \Illuminate\Database\Eloquent\Builder|BaseModel invitations() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel whereHas($query) * @property-read \Illuminate\Database\Eloquent\Collection $invitations * @property-read int|null $invitations_count - * + * @method static \Illuminate\Database\Eloquent\Builder company() * @method int companyId() * @method createInvitations() + * @method Builder scopeCompany(Builder $builder) * @mixin \Eloquent * @mixin \Illuminate\Database\Eloquent\Builder */ @@ -113,10 +114,8 @@ class BaseModel extends Model return parent::__call($method, $params); } - /* - V2 type of scope - */ - public function scopeCompany($query) + + public function scopeCompany($query): \Illuminate\Database\Eloquent\Builder { /** @var \App\Models\User $user */ $user = auth()->user(); @@ -126,8 +125,8 @@ class BaseModel extends Model return $query; } - /* - V1 type of scope + /** + * @deprecated version */ public function scopeScope($query) { diff --git a/app/Models/Company.php b/app/Models/Company.php index 11de4e8b9f93..d9285075983e 100644 --- a/app/Models/Company.php +++ b/app/Models/Company.php @@ -733,48 +733,42 @@ class Company extends BaseModel return $this->belongsTo(PaymentType::class); } - /** - * @return mixed - */ - public function expenses() + public function expenses(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(Expense::class)->withTrashed(); } - /** - * @return mixed - */ - public function payments() + public function payments(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(Payment::class)->withTrashed(); } - public function tokens() + public function tokens(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(CompanyToken::class); } - public function client_gateway_tokens() + public function client_gateway_tokens(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(ClientGatewayToken::class); } - public function system_logs() + public function system_logs(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(SystemLog::class)->orderBy('id', 'DESC')->take(100); } - public function system_log_relation() + public function system_log_relation(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(SystemLog::class)->orderBy('id', 'DESC'); } - public function tokens_hashed() + public function tokens_hashed(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(CompanyToken::class); } - public function company_users() + public function company_users(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(CompanyUser::class)->withTrashed(); } @@ -811,7 +805,7 @@ class Company extends BaseModel ->firstOrFail(); } - public function domain() + public function domain(): string { if (Ninja::isHosted()) { if ($this->portal_mode == 'domain' && strlen($this->portal_domain) > 3) { @@ -829,12 +823,12 @@ class Company extends BaseModel return new NotificationService($this, $notification); } - public function routeNotificationForSlack($notification) + public function routeNotificationForSlack($notification): string { return $this->slack_webhook_url; } - public function file_path() + public function file_path(): string { return $this->company_key.'/'; } @@ -873,7 +867,7 @@ class Company extends BaseModel return $data; } - public function timezone_offset() + public function timezone_offset(): int { $offset = 0; diff --git a/app/Models/RecurringInvoice.php b/app/Models/RecurringInvoice.php index 9bc2e06a00bb..248f946fe9ce 100644 --- a/app/Models/RecurringInvoice.php +++ b/app/Models/RecurringInvoice.php @@ -318,17 +318,17 @@ class RecurringInvoice extends BaseModel return $this->belongsTo(User::class, 'assigned_user_id', 'id')->withTrashed(); } - public function invoices() + public function invoices(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(Invoice::class, 'recurring_id', 'id')->withTrashed(); } - public function invitations() + public function invitations(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(RecurringInvoiceInvitation::class); } - public function documents() + public function documents(): \Illuminate\Database\Eloquent\Relations\MorphMany { return $this->morphMany(Document::class, 'documentable'); } diff --git a/app/Models/RecurringQuote.php b/app/Models/RecurringQuote.php index 76d90a1da778..8652c8edca6d 100644 --- a/app/Models/RecurringQuote.php +++ b/app/Models/RecurringQuote.php @@ -61,6 +61,7 @@ use Laracasts\Presenter\PresentableTrait; * @property string $balance * @property string|null $last_viewed * @property int $frequency_id + * @property int $design_id * @property string|null $last_sent_date * @property string|null $next_send_date * @property int|null $remaining_cycles @@ -110,65 +111,6 @@ use Laracasts\Presenter\PresentableTrait; * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote query() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereAmount($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereAssignedUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereAutoBill($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereAutoBillEnabled($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereBackup($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereBalance($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereClientId($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereCompanyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereCustomSurcharge1($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereCustomSurcharge2($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereCustomSurcharge3($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereCustomSurcharge4($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereCustomSurchargeTax1($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereCustomSurchargeTax2($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereCustomSurchargeTax3($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereCustomSurchargeTax4($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereCustomValue1($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereCustomValue2($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereCustomValue3($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereCustomValue4($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereDeletedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereDiscount($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereDueDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereDueDateDays($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereExchangeRate($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereFooter($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereFrequencyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereIsAmountDiscount($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereIsDeleted($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereLastSentDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereLastViewed($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereLineItems($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereNextSendDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote wherePaidToDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote wherePartial($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote wherePartialDueDate($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote wherePoNumber($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote wherePrivateNotes($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereProjectId($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote wherePublicNotes($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereRemainingCycles($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereStatusId($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereSubscriptionId($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereTaxName1($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereTaxName2($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereTaxName3($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereTaxRate1($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereTaxRate2($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereTaxRate3($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereTerms($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereTotalTaxes($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereUserId($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereUsesInclusiveTaxes($value) - * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote whereVendorId($value) * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|RecurringQuote withoutTrashed() * @property-read \Illuminate\Database\Eloquent\Collection $activities @@ -176,61 +118,6 @@ use Laracasts\Presenter\PresentableTrait; * @property-read \Illuminate\Database\Eloquent\Collection $history * @property-read \Illuminate\Database\Eloquent\Collection $invitations * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $quotes - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $quotes * @mixin \Eloquent */ class RecurringQuote extends BaseModel diff --git a/app/Models/Webhook.php b/app/Models/Webhook.php index 05eab5acd514..5a921eb1d8f2 100644 --- a/app/Models/Webhook.php +++ b/app/Models/Webhook.php @@ -39,18 +39,6 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @method static \Illuminate\Database\Eloquent\Builder|Webhook onlyTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Webhook query() * @method static \Illuminate\Database\Eloquent\Builder|BaseModel scope() - * @method static \Illuminate\Database\Eloquent\Builder|Webhook whereCompanyId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Webhook whereCreatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Webhook whereDeletedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Webhook whereEventId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Webhook whereFormat($value) - * @method static \Illuminate\Database\Eloquent\Builder|Webhook whereHeaders($value) - * @method static \Illuminate\Database\Eloquent\Builder|Webhook whereId($value) - * @method static \Illuminate\Database\Eloquent\Builder|Webhook whereIsDeleted($value) - * @method static \Illuminate\Database\Eloquent\Builder|Webhook whereRestMethod($value) - * @method static \Illuminate\Database\Eloquent\Builder|Webhook whereTargetUrl($value) - * @method static \Illuminate\Database\Eloquent\Builder|Webhook whereUpdatedAt($value) - * @method static \Illuminate\Database\Eloquent\Builder|Webhook whereUserId($value) * @method static \Illuminate\Database\Eloquent\Builder|Webhook withTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Webhook withoutTrashed() * @method static \Illuminate\Database\Eloquent\Builder|Webhook where() @@ -268,12 +256,12 @@ class Webhook extends BaseModel 'deleted_at' => 'timestamp', ]; - 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); } diff --git a/app/Services/Chart/ChartQueries.php b/app/Services/Chart/ChartQueries.php index 9d7172ca13e7..e4b881c93688 100644 --- a/app/Services/Chart/ChartQueries.php +++ b/app/Services/Chart/ChartQueries.php @@ -142,7 +142,7 @@ trait ChartQueries "), ['company_currency' => $this->company->settings->currency_id, 'company_id' => $this->company->id, 'start_date' => $start_date, 'end_date' => $end_date]); } - public function getRevenueQuery($start_date, $end_date) + public function getRevenueQueryX($start_date, $end_date) { $user_filter = $this->is_admin ? '' : 'AND clients.user_id = '.$this->user->id; @@ -164,27 +164,23 @@ trait ChartQueries "), ['company_currency' => $this->company->settings->currency_id, 'company_id' => $this->company->id, 'start_date' => $start_date, 'end_date' => $end_date]); } - // public function getPaymentsQuery($start_date, $end_date) - // { - // $user_filter = $this->is_admin ? '' : 'AND clients.user_id = '.$this->user->id; + public function getRevenueQuery($start_date, $end_date) + { + $user_filter = $this->is_admin ? '' : 'AND payments.user_id = '.$this->user->id; - // return DB::select(DB::raw(" - // SELECT - // sum(payments.amount - payments.refunded) as paid_to_date, - // IFNULL(CAST(JSON_UNQUOTE(JSON_EXTRACT( clients.settings, '$.currency_id' )) AS SIGNED), :company_currency) AS currency_id - // FROM payments - // JOIN invoices - // on invoices.client_id = clients.id - // WHERE invoices.company_id = :company_id - // AND clients.is_deleted = 0 - // {$user_filter} - // AND invoices.is_deleted = 0 - // AND invoices.amount > 0 - // AND invoices.status_id IN (3,4) - // AND (invoices.date BETWEEN :start_date AND :end_date) - // GROUP BY currency_id - // "), ['company_currency' => $this->company->settings->currency_id, 'company_id' => $this->company->id, 'start_date' => $start_date, 'end_date' => $end_date]); - // } + return DB::select(DB::raw(" + SELECT + sum(payments.amount - payments.refunded) as paid_to_date, + payments.currency_id AS currency_id + FROM payments + WHERE payments.company_id = :company_id + AND payments.is_deleted = 0 + {$user_filter} + AND payments.status_id IN (1,4,5,6) + AND (payments.date BETWEEN :start_date AND :end_date) + GROUP BY payments.currency_id + "), ['company_id' => $this->company->id, 'start_date' => $start_date, 'end_date' => $end_date]); + } public function getInvoicesQuery($start_date, $end_date) { diff --git a/phpstan.neon b/phpstan.neon index 6e4f01ab202e..fbcbb4b248a7 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -11,4 +11,6 @@ parameters: - 'app/DataMapper/Analytics/*' universalObjectCratesClasses: - App\DataMapper\Tax\RuleInterface - - App\DataMapper\FeesAndLimits \ No newline at end of file + - App\DataMapper\FeesAndLimits + ignoreErrors: + - '#Call to an undefined method Illuminate\Database\Database\Eloquent\Builder::company()#' \ No newline at end of file From 1b5bbb43dac14fa68ce98332a3bc0c63448837b9 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 2 Aug 2023 20:10:42 +1000 Subject: [PATCH 13/16] Fixes for translations --- app/Filters/QuoteFilters.php | 2 +- app/Http/Controllers/EmailController.php | 2 ++ app/Jobs/Report/ProfitAndLoss.php | 15 +----------- app/Jobs/Util/ApplePayDomain.php | 2 +- app/Jobs/Util/RefreshPdfs.php | 2 +- app/Jobs/Util/ReminderJob.php | 2 +- app/Models/Invoice.php | 24 +++++++++---------- app/Models/Payment.php | 3 +-- .../Invoice/EInvoice/FacturaEInvoice.php | 2 +- app/Services/Payment/RefundPayment.php | 4 ++-- phpstan.neon | 4 +++- 11 files changed, 26 insertions(+), 36 deletions(-) diff --git a/app/Filters/QuoteFilters.php b/app/Filters/QuoteFilters.php index 1cb0bed3a999..a08c6aa09418 100644 --- a/app/Filters/QuoteFilters.php +++ b/app/Filters/QuoteFilters.php @@ -53,7 +53,7 @@ class QuoteFilters extends QueryFilters * - paused * - completed * - * @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/Http/Controllers/EmailController.php b/app/Http/Controllers/EmailController.php index 0939a79a294c..b3077f10eb60 100644 --- a/app/Http/Controllers/EmailController.php +++ b/app/Http/Controllers/EmailController.php @@ -144,6 +144,8 @@ class EmailController extends BaseController private function resolveClass(string $entity): string { + $class = ''; + match ($entity) { 'invoice' => $class = Invoice::class, 'App\Models\Invoice' => $class = Invoice::class, diff --git a/app/Jobs/Report/ProfitAndLoss.php b/app/Jobs/Report/ProfitAndLoss.php index fd8cd5575864..c3a31556a8fc 100644 --- a/app/Jobs/Report/ProfitAndLoss.php +++ b/app/Jobs/Report/ProfitAndLoss.php @@ -24,21 +24,8 @@ class ProfitAndLoss implements ShouldQueue { use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; - protected Company $company; - - protected array $payload; - - /** - * Create a new job instance. - * - * @param RecurringInvoice $recurring_invoice - * @param string $db - */ - public function __construct(Company $company, array $payload) + public function __construct(protected Company $company, protected array $payload) { - $this->company = $company; - - $this->payload = $payload; } /** diff --git a/app/Jobs/Util/ApplePayDomain.php b/app/Jobs/Util/ApplePayDomain.php index b9e424e2e3ef..001813a7afe0 100644 --- a/app/Jobs/Util/ApplePayDomain.php +++ b/app/Jobs/Util/ApplePayDomain.php @@ -75,6 +75,6 @@ class ApplePayDomain implements ShouldQueue $parsed_url = parse_url($domain); - return $parsed_url['host']; + return $parsed_url['host'] ?? ''; } } diff --git a/app/Jobs/Util/RefreshPdfs.php b/app/Jobs/Util/RefreshPdfs.php index cdc5a2c5ccdb..dba50bf67c69 100644 --- a/app/Jobs/Util/RefreshPdfs.php +++ b/app/Jobs/Util/RefreshPdfs.php @@ -58,4 +58,4 @@ class RefreshPdfs implements ShouldQueue CreateEntityPdf::dispatch($invitation); }); } -} +} \ No newline at end of file diff --git a/app/Jobs/Util/ReminderJob.php b/app/Jobs/Util/ReminderJob.php index 3a2d00919cc5..27a0f0632577 100644 --- a/app/Jobs/Util/ReminderJob.php +++ b/app/Jobs/Util/ReminderJob.php @@ -312,4 +312,4 @@ class ReminderJob implements ShouldQueue return $invoice; } -} +} \ No newline at end of file diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index b7f127ee0c90..1cb773ad64d0 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -252,42 +252,42 @@ class Invoice extends BaseModel return $this->dateMutator($value); } - public function company() + public function company(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Company::class); } - public function project() + public function project(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Project::class); } - public function vendor() + public function vendor(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Vendor::class); } - public function design() + public function design(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Design::class); } - public function user() + public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class)->withTrashed(); } - public function recurring_invoice() + public function recurring_invoice(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(RecurringInvoice::class, 'recurring_id', 'id')->withTrashed(); } - 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 invitations() + public function invitations(): \Illuminate\Database\Eloquent\Relations\HasMany { return $this->hasMany(InvoiceInvitation::class); } @@ -297,22 +297,22 @@ class Invoice extends BaseModel return $this->belongsTo(Client::class)->withTrashed(); } - public function subscription() + public function subscription(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Subscription::class)->withTrashed(); } - public function documents() + public function documents(): \Illuminate\Database\Eloquent\Relations\MorphMany { return $this->morphMany(Document::class, 'documentable'); } - public function payments() + public function payments(): \Illuminate\Database\Eloquent\Relations\MorphToMany { return $this->morphToMany(Payment::class, 'paymentable')->withTrashed()->withPivot('amount', 'refunded')->withTimestamps(); } - public function company_ledger() + public function company_ledger(): \Illuminate\Database\Eloquent\Relations\MorphMany { return $this->morphMany(CompanyLedger::class, 'company_ledgerable'); } diff --git a/app/Models/Payment.php b/app/Models/Payment.php index 368546283176..091cf5711018 100644 --- a/app/Models/Payment.php +++ b/app/Models/Payment.php @@ -77,7 +77,6 @@ use Illuminate\Database\Eloquent\SoftDeletes; * @property-read \App\Models\PaymentType|null $type * @property-read \App\Models\User|null $user * @property-read \App\Models\Vendor|null $vendor - * @method static \Illuminate\Database\Eloquent\Builder company() * @method static \Illuminate\Database\Eloquent\Builder exclude($columns) * @method static \Database\Factories\PaymentFactory factory($count = null, $state = []) * @method static \Illuminate\Database\Eloquent\Builder|Payment filter(\App\Filters\QueryFilters $filters) @@ -228,7 +227,7 @@ class Payment extends BaseModel return $this->morphedByMany(Credit::class, 'paymentable')->withTrashed()->withPivot('amount', 'refunded')->withTimestamps(); } - public function company_ledger() + public function company_ledger(): \Illuminate\Database\Eloquent\Relations\MorphMany { return $this->morphMany(CompanyLedger::class, 'company_ledgerable'); } diff --git a/app/Services/Invoice/EInvoice/FacturaEInvoice.php b/app/Services/Invoice/EInvoice/FacturaEInvoice.php index df92882a0a42..9afa4ab037d3 100644 --- a/app/Services/Invoice/EInvoice/FacturaEInvoice.php +++ b/app/Services/Invoice/EInvoice/FacturaEInvoice.php @@ -463,7 +463,7 @@ class FacturaEInvoice extends AbstractService $company = $this->invoice->company; $seller = new FacturaeParty([ - "isLegalEntity" => true, // Se asume true si se omite + "isLegalEntity" => $company->custom_value1, // Se asume true si se omite "taxNumber" => $company->settings->vat_number, "name" => substr($company->present()->name(), 0, 40), "address" => substr($company->settings->address1, 0, 80), diff --git a/app/Services/Payment/RefundPayment.php b/app/Services/Payment/RefundPayment.php index 99747a392a2b..15952fe8733c 100644 --- a/app/Services/Payment/RefundPayment.php +++ b/app/Services/Payment/RefundPayment.php @@ -105,7 +105,7 @@ class RefundPayment /** * Create the payment activity. * - * @param json $notes gateway_transaction + * @param string $notes * @return $this */ private function createActivity($notes) @@ -309,4 +309,4 @@ class RefundPayment return $this->payment; } -} +} \ No newline at end of file diff --git a/phpstan.neon b/phpstan.neon index fbcbb4b248a7..11965c7dd020 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -12,5 +12,7 @@ parameters: universalObjectCratesClasses: - App\DataMapper\Tax\RuleInterface - App\DataMapper\FeesAndLimits + reportUnmatchedIgnoredErrors: false ignoreErrors: - - '#Call to an undefined method Illuminate\Database\Database\Eloquent\Builder::company()#' \ No newline at end of file + - '#Call to an undefined method [a-zA-Z0-9\\_]+::company\(\)#' + - '#Call to an undefined method [a-zA-Z0-9\\_]+::entityFilter\(\)#' \ No newline at end of file From 3aaeb8ff5ce7993eb95dc86ff5979a7d676d5ce9 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 3 Aug 2023 07:33:35 +1000 Subject: [PATCH 14/16] Add unlink functionality for bank transactions --- .../BulkBankTransactionRequest.php | 9 ++-- app/Models/BankTransaction.php | 15 ++++--- .../BankTransactionRepository.php | 20 +++++++++ app/Utils/Traits/ClientGroupSettingsSaver.php | 2 +- phpstan.neon | 4 +- tests/Feature/BankTransactionApiTest.php | 45 +++++++++++++++++-- 6 files changed, 82 insertions(+), 13 deletions(-) diff --git a/app/Http/Requests/BankTransaction/BulkBankTransactionRequest.php b/app/Http/Requests/BankTransaction/BulkBankTransactionRequest.php index a95fb7fd23a3..74eed3c7a414 100644 --- a/app/Http/Requests/BankTransaction/BulkBankTransactionRequest.php +++ b/app/Http/Requests/BankTransaction/BulkBankTransactionRequest.php @@ -22,14 +22,17 @@ class BulkBankTransactionRequest extends Request */ public function authorize() : bool { - return auth()->user()->isAdmin(); + /** @var \App\Models\User $user **/ + $user = auth()->user(); + + return $user->isAdmin(); } - public function rules() + public function rules(): array { return [ 'ids' => 'required|bail|array', - 'action' => 'in:archive,restore,delete,convert_matched' + 'action' => 'in:archive,restore,delete,convert_matched,unlink' ]; } } diff --git a/app/Models/BankTransaction.php b/app/Models/BankTransaction.php index ed030f0a138f..f67e75a9d634 100644 --- a/app/Models/BankTransaction.php +++ b/app/Models/BankTransaction.php @@ -130,22 +130,27 @@ class BankTransaction extends BaseModel return self::class; } - public function company() + public function company(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Company::class); } - public function vendor() + public function vendor(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Vendor::class); } - public function user() + public function expense(): \Illuminate\Database\Eloquent\Relations\BelongsTo + { + return $this->belongsTo(Expense::class); + } + + public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(User::class)->withTrashed(); } - public function bank_integration() + public function bank_integration(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(BankIntegration::class)->withTrashed(); } @@ -155,7 +160,7 @@ class BankTransaction extends BaseModel return $this->belongsTo(Account::class)->withTrashed(); } - public function payment() + public function payment(): \Illuminate\Database\Eloquent\Relations\BelongsTo { return $this->belongsTo(Payment::class)->withTrashed(); } diff --git a/app/Repositories/BankTransactionRepository.php b/app/Repositories/BankTransactionRepository.php index 2f2cd569dc22..d9db85172a13 100644 --- a/app/Repositories/BankTransactionRepository.php +++ b/app/Repositories/BankTransactionRepository.php @@ -41,4 +41,24 @@ class BankTransactionRepository extends BaseRepository $bts = (new MatchBankTransactions(auth()->user()->company()->id, auth()->user()->company()->db, $data))->handle(); } + + public function unlink($bt) + { + if($bt->payment()->exists()){ + $bt->payment->transaction_id = null; + $bt->payment_id = null; + } + + if($bt->expense()->exists()) { + $bt->expense->transaction_id = null; + $bt->expense_id = null; + } + + $bt->vendor_id = null; + $bt->status_id = 1; + $bt->invoice_ids = null; + $bt->ninja_category_id = null; + $bt->push(); + + } } diff --git a/app/Utils/Traits/ClientGroupSettingsSaver.php b/app/Utils/Traits/ClientGroupSettingsSaver.php index fa9d5fca2ae3..50afb4e09131 100644 --- a/app/Utils/Traits/ClientGroupSettingsSaver.php +++ b/app/Utils/Traits/ClientGroupSettingsSaver.php @@ -31,7 +31,7 @@ trait ClientGroupSettingsSaver * Works for groups|clients|companies * @param array|object $settings The request input settings array * @param object $entity The entity which the settings belongs to - * @return void + * @return array|object */ public function saveSettings($settings, $entity) { diff --git a/phpstan.neon b/phpstan.neon index 11965c7dd020..8cd766f92d33 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -15,4 +15,6 @@ parameters: reportUnmatchedIgnoredErrors: false ignoreErrors: - '#Call to an undefined method [a-zA-Z0-9\\_]+::company\(\)#' - - '#Call to an undefined method [a-zA-Z0-9\\_]+::entityFilter\(\)#' \ No newline at end of file + - '#Call to an undefined method [a-zA-Z0-9\\_]+::entityFilter\(\)#' + - '#Call to an undefined method [a-zA-Z0-9\\_]+::withTrashed()\(\)#' + - '#Undefined method#' \ No newline at end of file diff --git a/tests/Feature/BankTransactionApiTest.php b/tests/Feature/BankTransactionApiTest.php index c3c0373d483d..79496014fd28 100644 --- a/tests/Feature/BankTransactionApiTest.php +++ b/tests/Feature/BankTransactionApiTest.php @@ -11,12 +11,14 @@ namespace Tests\Feature; +use Tests\TestCase; +use Tests\MockAccountData; +use App\Models\BankIntegration; +use App\Models\BankTransaction; use App\Utils\Traits\MakesHash; use Illuminate\Database\Eloquent\Model; -use Illuminate\Foundation\Testing\DatabaseTransactions; use Illuminate\Support\Facades\Session; -use Tests\MockAccountData; -use Tests\TestCase; +use Illuminate\Foundation\Testing\DatabaseTransactions; /** * @test @@ -109,4 +111,41 @@ class BankTransactionApiTest extends TestCase $this->assertTrue($arr['data'][0]['is_deleted']); } + + public function testBankTransactionUnlink() + { + BankTransaction::truncate(); + + $bi = BankIntegration::factory()->create([ + 'account_id' => $this->account->id, + 'company_id' => $this->company->id, + 'user_id' => $this->user->id, + ]); + + $bank_transaction = BankTransaction::factory()->create([ + 'bank_integration_id' => $bi->id, + 'user_id' => $this->user->id, + 'company_id' => $this->company->id, + 'payment_id' => $this->payment->id, + 'expense_id' => $this->expense->id, + 'invoice_ids' => $this->invoice->hashed_id, + ]); + + $data = [ + 'ids' => [$this->encodePrimaryKey($bank_transaction->id)], + ]; + + $response = $this->withHeaders([ + 'X-API-SECRET' => config('ninja.api_secret'), + 'X-API-TOKEN' => $this->token, + ])->post('/api/v1/bank_transactions/bulk?action=unlink', $data); + + $arr = $response->json(); + + $this->assertEquals(1, $arr['data'][0]['status_id']); + $this->assertEquals("", $arr['data'][0]['payment_id']); + $this->assertEquals("", $arr['data'][0]['invoice_ids']); + $this->assertEquals("", $arr['data'][0]['expense_id']); + } + } From 2956e89f729d915cfa846c259a8030b02795626b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 3 Aug 2023 08:10:36 +1000 Subject: [PATCH 15/16] v5.6.25 --- VERSION.txt | 2 +- app/Models/Credit.php | 79 +------------------ app/Models/Invoice.php | 3 +- app/Repositories/ClientRepository.php | 1 + .../Migration/PaymentMigrationRepository.php | 9 ++- config/ninja.php | 4 +- 6 files changed, 12 insertions(+), 86 deletions(-) diff --git a/VERSION.txt b/VERSION.txt index 66e48ed4e56c..bdde6d7a8c85 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.6.24 \ No newline at end of file +5.6.25 \ No newline at end of file diff --git a/app/Models/Credit.php b/app/Models/Credit.php index 380c9e3cb9d7..0fb203bd38d3 100644 --- a/app/Models/Credit.php +++ b/app/Models/Credit.php @@ -115,6 +115,7 @@ use Laracasts\Presenter\PresentableTrait; * @property-read \App\Models\User $user * @property-read \App\Models\Client $client * @property-read \App\Models\Vendor|null $vendor + * @property-read mixed $pivot * @property-read \Illuminate\Database\Eloquent\Collection $activities * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger * @property-read \Illuminate\Database\Eloquent\Collection $documents @@ -122,83 +123,7 @@ use Laracasts\Presenter\PresentableTrait; * @property-read \Illuminate\Database\Eloquent\Collection $invitations * @property-read \Illuminate\Database\Eloquent\Collection $invoices * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $payments - * @property-read \Illuminate\Database\Eloquent\Collection $activities - * @property-read \Illuminate\Database\Eloquent\Collection $company_ledger - * @property-read \Illuminate\Database\Eloquent\Collection $documents - * @property-read \Illuminate\Database\Eloquent\Collection $history - * @property-read \Illuminate\Database\Eloquent\Collection $invitations - * @property-read \Illuminate\Database\Eloquent\Collection $invoices - * @property-read \Illuminate\Database\Eloquent\Collection $payments + * * @mixin \Eloquent */ class Credit extends BaseModel diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 1cb773ad64d0..018d8722e85f 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -115,6 +115,7 @@ use App\Events\Invoice\InvoiceReminderWasEmailed; * @property-read int|null $history_count * @property-read int|null $invitations_count * @property-read int|null $payments_count + * @property-read mixed $pivot * @property-read \App\Models\Project|null $project * @property-read \App\Models\RecurringInvoice|null $recurring_invoice * @property-read \App\Models\Subscription|null $subscription @@ -132,8 +133,6 @@ use App\Events\Invoice\InvoiceReminderWasEmailed; * @property-read \Illuminate\Database\Eloquent\Collection $payments * @property-read \Illuminate\Database\Eloquent\Collection $tasks * @property object|null $tax_data - * @method static \Illuminate\Database\Eloquent\Builder company() - * @method static \Illuminate\Database\Eloquent\Builder|\Illuminate\Database\Query\Builder withTrashed(bool $withTrashed = true) * @mixin \Eloquent */ class Invoice extends BaseModel diff --git a/app/Repositories/ClientRepository.php b/app/Repositories/ClientRepository.php index f9abbd6fa88b..6ec925f54285 100644 --- a/app/Repositories/ClientRepository.php +++ b/app/Repositories/ClientRepository.php @@ -71,6 +71,7 @@ class ClientRepository extends BaseRepository } if (! $client->country_id) { + /** @var \App\Models\Company $company **/ $company = Company::find($client->company_id); $client->country_id = $company->settings->country_id; } diff --git a/app/Repositories/Migration/PaymentMigrationRepository.php b/app/Repositories/Migration/PaymentMigrationRepository.php index 09412bab11fd..c5de18c89ecd 100644 --- a/app/Repositories/Migration/PaymentMigrationRepository.php +++ b/app/Repositories/Migration/PaymentMigrationRepository.php @@ -193,11 +193,12 @@ class PaymentMigrationRepository extends BaseRepository /** * If the client is paying in a currency other than * the company currency, we need to set a record. - * @param $data - * @param $payment - * @return + * + * @param array$data + * @param \App\Models\Payment $payment + * @return \App\Models\Payment */ - private function processExchangeRates($data, $payment) + private function processExchangeRates($data, $payment): \App\Models\Payment { if ($payment->exchange_rate != 1) { return $payment; diff --git a/config/ninja.php b/config/ninja.php index 33f173d4113f..22c1ef96e80b 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.24'), - 'app_tag' => env('APP_TAG','5.6.24'), + 'app_version' => env('APP_VERSION','5.6.25'), + 'app_tag' => env('APP_TAG','5.6.25'), 'minimum_client_version' => '5.0.16', 'terms_version' => '1.0.1', 'api_secret' => env('API_SECRET', ''), From d4049c50f1e111e9928688a10282990488532a76 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 3 Aug 2023 08:11:31 +1000 Subject: [PATCH 16/16] v5.6.25 --- app/Repositories/PaymentRepository.php | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/app/Repositories/PaymentRepository.php b/app/Repositories/PaymentRepository.php index 073f04fd7cec..0c3ce1c8ce75 100644 --- a/app/Repositories/PaymentRepository.php +++ b/app/Repositories/PaymentRepository.php @@ -172,11 +172,10 @@ class PaymentRepository extends BaseRepository $credits = Credit::whereIn('id', array_column($data['credits'], 'credit_id'))->get(); - // $payment->credits()->saveMany($credits); - //todo optimize into a single query foreach ($data['credits'] as $paid_credit) { + /** @var \App\Models\Credit $credit **/ $credit = $credits->firstWhere('id', $paid_credit['credit_id']); if ($credit) {