diff --git a/VERSION.txt b/VERSION.txt index ca3fdf6fc0c7..af6dd97a7b10 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -5.10.24 \ No newline at end of file +5.10.25 \ No newline at end of file diff --git a/app/Console/Commands/CheckData.php b/app/Console/Commands/CheckData.php index 90c26bf07238..65f74b2e49b8 100644 --- a/app/Console/Commands/CheckData.php +++ b/app/Console/Commands/CheckData.php @@ -1169,10 +1169,10 @@ class CheckData extends Command ->whereNull('exchange_rate') ->orWhere('exchange_rate', 0) ->cursor() - ->each(function ($expense){ + ->each(function ($expense) { $expense->exchange_rate = 1; $expense->saveQuietly(); - + $this->logMessage("Fixing - exchange rate for expense :: {$expense->id}"); }); diff --git a/app/Console/Commands/CreateSingleAccount.php b/app/Console/Commands/CreateSingleAccount.php index 4a2146a334f3..08057380766f 100644 --- a/app/Console/Commands/CreateSingleAccount.php +++ b/app/Console/Commands/CreateSingleAccount.php @@ -1116,7 +1116,7 @@ class CreateSingleAccount extends Command private function countryClients($company, $user) { - + Client::unguard(); Client::create([ diff --git a/app/Console/Kernel.php b/app/Console/Kernel.php index 382a577102d7..1f4ee4bf6aae 100644 --- a/app/Console/Kernel.php +++ b/app/Console/Kernel.php @@ -67,7 +67,7 @@ class Kernel extends ConsoleKernel /* Checks Rotessa Transactions */ $schedule->job(new TransactionReport())->dailyAt('01:48')->withoutOverlapping()->name('rotessa-transaction-report')->onOneServer(); - + /* Stale Invoice Cleanup*/ $schedule->job(new CleanStaleInvoiceOrder())->hourlyAt(30)->withoutOverlapping()->name('stale-invoice-job')->onOneServer(); diff --git a/app/DataMapper/CompanySettings.php b/app/DataMapper/CompanySettings.php index f3731531734d..9fde1fee410b 100644 --- a/app/DataMapper/CompanySettings.php +++ b/app/DataMapper/CompanySettings.php @@ -515,10 +515,11 @@ class CompanySettings extends BaseSettings public $quote_schedule_reminder1 = ''; //before_valid_until_date,after_valid_until_date,after_quote_date public $quote_late_fee_amount1 = 0; public $quote_late_fee_percent1 = 0; - + public string $payment_flow = 'default'; //smooth public static $casts = [ + 'payment_flow' => 'string', 'enable_quote_reminder1' => 'bool', 'quote_num_days_reminder1' => 'int', 'quote_schedule_reminder1' => 'string', diff --git a/app/DataMapper/EmailTemplateDefaults.php b/app/DataMapper/EmailTemplateDefaults.php index ff24f0d2f1f2..7633b7edd073 100644 --- a/app/DataMapper/EmailTemplateDefaults.php +++ b/app/DataMapper/EmailTemplateDefaults.php @@ -120,7 +120,7 @@ class EmailTemplateDefaults case 'email_quote_subject_reminder1': return self::emailQuoteReminder1Subject(); - + default: return self::emailInvoiceTemplate(); @@ -131,7 +131,7 @@ class EmailTemplateDefaults { return ctrans('texts.quote_reminder_subject', ['quote' => '$number', 'company' => '$company.name']); } - + public static function emailQuoteReminder1Body() { @@ -140,7 +140,7 @@ class EmailTemplateDefaults return $invoice_message; } - + public static function emailVendorNotificationSubject() { return self::transformText('vendor_notification_subject'); diff --git a/app/DataMapper/Tax/BaseRule.php b/app/DataMapper/Tax/BaseRule.php index cecf5fd3a83a..1e8de4773eda 100644 --- a/app/DataMapper/Tax/BaseRule.php +++ b/app/DataMapper/Tax/BaseRule.php @@ -131,7 +131,8 @@ class BaseRule implements RuleInterface return $this; } - public function shouldCalcTax(): bool { + public function shouldCalcTax(): bool + { return $this->should_calc_tax && $this->checkIfInvoiceLocked(); } /** @@ -404,9 +405,10 @@ class BaseRule implements RuleInterface { $lock_invoices = $this->client->getSetting('lock_invoices'); - if($this->invoice instanceof RecurringInvoice) + if($this->invoice instanceof RecurringInvoice) { return true; - + } + switch ($lock_invoices) { case 'off': return true; diff --git a/app/DataMapper/Tax/DE/Rule.php b/app/DataMapper/Tax/DE/Rule.php index a1b4cb356640..d03306fced24 100644 --- a/app/DataMapper/Tax/DE/Rule.php +++ b/app/DataMapper/Tax/DE/Rule.php @@ -107,7 +107,7 @@ class Rule extends BaseRule implements RuleInterface */ public function taxReduced($item): self { - + $this->tax_name1 = $this->tax_name; $this->tax_rate1 = $this->reduced_tax_rate; @@ -121,7 +121,7 @@ class Rule extends BaseRule implements RuleInterface */ public function zeroRated($item): self { - + $this->tax_name1 = $this->tax_name; $this->tax_rate1 = 0; @@ -242,7 +242,7 @@ class Rule extends BaseRule implements RuleInterface $this->tax_rate = 0; $this->reduced_tax_rate = 0; } elseif($this->client_subregion != $this->client->company->tax_data->seller_subregion && in_array($this->client_subregion, $this->eu_country_codes) && $this->client->vat_number && $this->client->has_valid_vat_number && $this->eu_business_tax_exempt) { - // nlog("euro zone and tax exempt"); + // nlog("euro zone and tax exempt"); $this->tax_rate = 0; $this->reduced_tax_rate = 0; } elseif(!in_array($this->client_subregion, $this->eu_country_codes) && ($this->foreign_consumer_tax_exempt || $this->foreign_business_tax_exempt)) { //foreign + tax exempt @@ -251,8 +251,7 @@ class Rule extends BaseRule implements RuleInterface $this->reduced_tax_rate = 0; } elseif(!in_array($this->client_subregion, $this->eu_country_codes)) { $this->defaultForeign(); - } elseif(in_array($this->client_subregion, $this->eu_country_codes) && ((strlen($this->client->vat_number ?? '') == 1) || $this->client->has_valid_vat_number)) { //eu country / no valid vat - // if(($this->client->company->tax_data->seller_subregion != $this->client_subregion) && $this->client->company->tax_data->regions->EU->has_sales_above_threshold) { + } elseif(in_array($this->client_subregion, $this->eu_country_codes) && ((strlen($this->client->vat_number ?? '') == 1) || !$this->client->has_valid_vat_number)) { //eu country / no valid vat if($this->client->company->tax_data->seller_subregion != $this->client_subregion) { // nlog("eu zone with sales above threshold"); $this->tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->country->iso_3166_2}->tax_rate ?? 0; diff --git a/app/DataMapper/Tax/TaxModel.php b/app/DataMapper/Tax/TaxModel.php index c5d4afd185bc..ca84290f58a5 100644 --- a/app/DataMapper/Tax/TaxModel.php +++ b/app/DataMapper/Tax/TaxModel.php @@ -34,10 +34,10 @@ class TaxModel if(!$model) { $this->regions = $this->init(); } else { - + //@phpstan-ignore-next-line foreach($model as $key => $value) { - $this->{$key} = $value; + $this->{$key} = $value; } } @@ -48,8 +48,7 @@ class TaxModel public function migrate(): self { - if($this->version == 'alpha') - { + if($this->version == 'alpha') { $this->regions->EU->subregions->PL = new \stdClass(); $this->regions->EU->subregions->PL->tax_rate = 23; $this->regions->EU->subregions->PL->tax_name = 'VAT'; diff --git a/app/DataProviders/CAProvinces.php b/app/DataProviders/CAProvinces.php index 6e19b1d74fa1..477ce4ff93ae 100644 --- a/app/DataProviders/CAProvinces.php +++ b/app/DataProviders/CAProvinces.php @@ -11,7 +11,8 @@ namespace App\DataProviders; -final class CAProvinces { +final class CAProvinces +{ /** * The provinces and territories of Canada * @@ -39,7 +40,8 @@ final class CAProvinces { * @param string $abbreviation * @return string */ - public static function getName($abbreviation) { + public static function getName($abbreviation) + { return self::$provinces[$abbreviation]; } @@ -48,7 +50,8 @@ final class CAProvinces { * * @return array */ - public static function get() { + public static function get() + { return self::$provinces; } @@ -58,7 +61,8 @@ final class CAProvinces { * @param string $name * @return string */ - public static function getAbbreviation($name) { + public static function getAbbreviation($name) + { return array_search(ucwords($name), self::$provinces); } } diff --git a/app/Events/Client/ClientWasArchived.php b/app/Events/Client/ClientWasArchived.php index 35699606ad2b..a98241879ebb 100644 --- a/app/Events/Client/ClientWasArchived.php +++ b/app/Events/Client/ClientWasArchived.php @@ -58,7 +58,7 @@ class ClientWasArchived implements ShouldBroadcast public function broadcastWith() { - + $manager = new Manager(); $manager->setSerializer(new ArraySerializer()); $class = sprintf('App\\Transformers\\%sTransformer', class_basename($this->client)); @@ -79,7 +79,7 @@ class ClientWasArchived implements ShouldBroadcast */ public function broadcastOn() { - + return [ new PrivateChannel("company-{$this->company->company_key}"), ]; diff --git a/app/Exceptions/DuplicatePaymentException.php b/app/Exceptions/DuplicatePaymentException.php index ba4f33ab2bdf..998b9b31456a 100644 --- a/app/Exceptions/DuplicatePaymentException.php +++ b/app/Exceptions/DuplicatePaymentException.php @@ -39,6 +39,6 @@ class DuplicatePaymentException extends Exception return response()->json([ 'message' => 'Duplicate request', ], 400); - + } } diff --git a/app/Export/CSV/ActivityExport.php b/app/Export/CSV/ActivityExport.php index b148c9806daf..bdbc232f6e4c 100644 --- a/app/Export/CSV/ActivityExport.php +++ b/app/Export/CSV/ActivityExport.php @@ -129,8 +129,8 @@ class ActivityExport extends BaseExport $query->cursor() ->each(function ($entity) { - - /** @var \App\Models\Activity $entity */ + + /** @var \App\Models\Activity $entity */ $this->buildRow($entity); }); diff --git a/app/Export/CSV/BaseExport.php b/app/Export/CSV/BaseExport.php index 0fdee8ad6394..9d4bcd2bd4ec 100644 --- a/app/Export/CSV/BaseExport.php +++ b/app/Export/CSV/BaseExport.php @@ -1041,7 +1041,7 @@ class BaseExport $recurring_filters = []; - if($this->company->getSetting('report_include_drafts')){ + if($this->company->getSetting('report_include_drafts')) { $recurring_filters[] = RecurringInvoice::STATUS_DRAFT; } @@ -1189,7 +1189,7 @@ class BaseExport */ protected function addInvoiceStatusFilter(Builder $query, string $status): Builder { - + /** @var array $status_parameters */ $status_parameters = explode(',', $status); @@ -1270,7 +1270,7 @@ class BaseExport $custom_start_date = now()->startOfYear(); $custom_end_date = now(); } - + switch ($date_range) { case 'all': $this->start_date = 'All available data'; @@ -1616,10 +1616,10 @@ class BaseExport ZipDocuments::dispatch($documents, $this->company, $user); } } - + /** * Tests that the column exists - * on the table prior to adding it to + * on the table prior to adding it to * the query builder * * @param string $table diff --git a/app/Export/CSV/ClientExport.php b/app/Export/CSV/ClientExport.php index ec4374948cd8..a3b77eed9f95 100644 --- a/app/Export/CSV/ClientExport.php +++ b/app/Export/CSV/ClientExport.php @@ -102,7 +102,7 @@ class ClientExport extends BaseExport $report = $query->cursor() ->map(function ($client) { - + /** @var \App\Models\Client $client */ $row = $this->buildRow($client); return $this->processMetaData($row, $client); @@ -133,7 +133,7 @@ class ClientExport extends BaseExport $query->where('is_deleted', 0); } - $query = $this->addDateRange($query,' clients'); + $query = $this->addDateRange($query, ' clients'); if($this->input['document_email_attachment'] ?? false) { $this->queueDocuments($query); @@ -156,8 +156,8 @@ class ClientExport extends BaseExport $query->cursor() ->each(function ($client) { - - /** @var \App\Models\Client $client */ + + /** @var \App\Models\Client $client */ $this->csv->insertOne($this->buildRow($client)); }); diff --git a/app/Export/CSV/CreditExport.php b/app/Export/CSV/CreditExport.php index 7450b4114611..4c82e62d6fca 100644 --- a/app/Export/CSV/CreditExport.php +++ b/app/Export/CSV/CreditExport.php @@ -52,7 +52,7 @@ class CreditExport extends BaseExport $report = $query->cursor() ->map(function ($credit) { - + /** @var \App\Models\Credit $credit */ $row = $this->buildRow($credit); return $this->processMetaData($row, $credit); diff --git a/app/Export/CSV/DocumentExport.php b/app/Export/CSV/DocumentExport.php index cfcebbc062a6..37e97cd3449d 100644 --- a/app/Export/CSV/DocumentExport.php +++ b/app/Export/CSV/DocumentExport.php @@ -54,7 +54,7 @@ class DocumentExport extends BaseExport $report = $query->cursor() ->map(function ($document) { - + /** @var \App\Models\Document $document */ $row = $this->buildRow($document); return $this->processMetaData($row, $document); @@ -101,7 +101,7 @@ class DocumentExport extends BaseExport $query->cursor() ->each(function ($entity) { - /** @var mixed $entity */ + /** @var mixed $entity */ $this->csv->insertOne($this->buildRow($entity)); }); diff --git a/app/Export/CSV/ExpenseExport.php b/app/Export/CSV/ExpenseExport.php index 67894954638b..e18c598d2297 100644 --- a/app/Export/CSV/ExpenseExport.php +++ b/app/Export/CSV/ExpenseExport.php @@ -52,7 +52,7 @@ class ExpenseExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { - + /** @var \App\Models\Expense $resource */ $row = $this->buildRow($resource); return $this->processMetaData($row, $resource); @@ -134,7 +134,7 @@ class ExpenseExport extends BaseExport $query->cursor() ->each(function ($expense) { - + /** @var \App\Models\Expense $expense */ $this->csv->insertOne($this->buildRow($expense)); }); @@ -266,11 +266,10 @@ class ExpenseExport extends BaseExport if($expense->calculate_tax_by_amount) { $total_tax_amount = round($expense->tax_amount1 + $expense->tax_amount2 + $expense->tax_amount3, $precision); - + if($expense->uses_inclusive_taxes) { $entity['expense.net_amount'] = round($expense->amount, $precision) - $total_tax_amount; - } - else { + } else { $entity['expense.net_amount'] = round($expense->amount, $precision); } diff --git a/app/Export/CSV/InvoiceExport.php b/app/Export/CSV/InvoiceExport.php index 39ece67a28a9..73a0d47a447c 100644 --- a/app/Export/CSV/InvoiceExport.php +++ b/app/Export/CSV/InvoiceExport.php @@ -99,7 +99,7 @@ class InvoiceExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { - + /** @var \App\Models\Invoice $resource */ $row = $this->buildRow($resource); return $this->processMetaData($row, $resource); @@ -121,7 +121,7 @@ class InvoiceExport extends BaseExport $query->cursor() ->each(function ($invoice) { - + /** @var \App\Models\Invoice $invoice */ $this->csv->insertOne($this->buildRow($invoice)); }); diff --git a/app/Export/CSV/InvoiceItemExport.php b/app/Export/CSV/InvoiceItemExport.php index ef372c83752f..8657baed6ccf 100644 --- a/app/Export/CSV/InvoiceItemExport.php +++ b/app/Export/CSV/InvoiceItemExport.php @@ -113,7 +113,7 @@ class InvoiceItemExport extends BaseExport $query->cursor() ->each(function ($resource) { - + /** @var \App\Models\Invoice $resource */ $this->iterateItems($resource); @@ -143,7 +143,7 @@ class InvoiceItemExport extends BaseExport $query->cursor() ->each(function ($invoice) { - + /** @var \App\Models\Invoice $invoice */ $this->iterateItems($invoice); }); @@ -262,9 +262,9 @@ class InvoiceItemExport extends BaseExport } if (in_array('invoice.project', $this->input['report_keys'])) { - $entity['invoice.project'] = $invoice->project ? $invoice->project->name : '';// @phpstan-ignore-line + $entity['invoice.project'] = $invoice->project ? $invoice->project->name : '';// @phpstan-ignore-line } - + return $entity; } diff --git a/app/Export/CSV/PaymentExport.php b/app/Export/CSV/PaymentExport.php index 167514781277..a646bfc31a32 100644 --- a/app/Export/CSV/PaymentExport.php +++ b/app/Export/CSV/PaymentExport.php @@ -92,7 +92,7 @@ class PaymentExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { - + /** @var \App\Models\Payment $resource */ $row = $this->buildRow($resource); return $this->processMetaData($row, $resource); @@ -114,8 +114,8 @@ class PaymentExport extends BaseExport $query->cursor() ->each(function ($entity) { - - /** @var \App\Models\Payment $entity */ + + /** @var \App\Models\Payment $entity */ $this->csv->insertOne($this->buildRow($entity)); }); diff --git a/app/Export/CSV/ProductExport.php b/app/Export/CSV/ProductExport.php index dba1b8622833..e377a3023332 100644 --- a/app/Export/CSV/ProductExport.php +++ b/app/Export/CSV/ProductExport.php @@ -51,7 +51,7 @@ class ProductExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { - + /** @var \App\Models\Product $resource */ $row = $this->buildRow($resource); return $this->processMetaData($row, $resource); @@ -106,8 +106,8 @@ class ProductExport extends BaseExport $query->cursor() ->each(function ($entity) { - /** @var \App\Models\Product $entity */ - $this->csv->insertOne($this->buildRow($entity)); + /** @var \App\Models\Product $entity */ + $this->csv->insertOne($this->buildRow($entity)); }); return $this->csv->toString(); diff --git a/app/Export/CSV/PurchaseOrderExport.php b/app/Export/CSV/PurchaseOrderExport.php index 1e60e26424c6..a80f05c0e151 100644 --- a/app/Export/CSV/PurchaseOrderExport.php +++ b/app/Export/CSV/PurchaseOrderExport.php @@ -98,7 +98,7 @@ class PurchaseOrderExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { - + /** @var \App\Models\PurchaseOrder $resource */ $row = $this->buildRow($resource); return $this->processMetaData($row, $resource); @@ -121,9 +121,9 @@ class PurchaseOrderExport extends BaseExport $query->cursor() ->each(function ($purchase_order) { - - /** @var \App\Models\PurchaseOrder $purchase_order */ - $this->csv->insertOne($this->buildRow($purchase_order)); + + /** @var \App\Models\PurchaseOrder $purchase_order */ + $this->csv->insertOne($this->buildRow($purchase_order)); }); return $this->csv->toString(); diff --git a/app/Export/CSV/PurchaseOrderItemExport.php b/app/Export/CSV/PurchaseOrderItemExport.php index bbbcc62dc52c..ea7e82d0bb1a 100644 --- a/app/Export/CSV/PurchaseOrderItemExport.php +++ b/app/Export/CSV/PurchaseOrderItemExport.php @@ -101,15 +101,15 @@ class PurchaseOrderItemExport extends BaseExport $query->cursor() ->each(function ($resource) { - - /** @var \App\Models\PurchaseOrder $resource */ - $this->iterateItems($resource); - foreach($this->storage_array as $row) { - $this->storage_item_array[] = $this->processItemMetaData($row, $resource); - } + /** @var \App\Models\PurchaseOrder $resource */ + $this->iterateItems($resource); - $this->storage_array = []; + foreach($this->storage_array as $row) { + $this->storage_item_array[] = $this->processItemMetaData($row, $resource); + } + + $this->storage_array = []; }); @@ -129,9 +129,9 @@ class PurchaseOrderItemExport extends BaseExport $query->cursor() ->each(function ($purchase_order) { - - /** @var \App\Models\PurchaseOrder $purchase_order */ - $this->iterateItems($purchase_order); + + /** @var \App\Models\PurchaseOrder $purchase_order */ + $this->iterateItems($purchase_order); }); $this->csv->insertAll($this->storage_array); diff --git a/app/Export/CSV/QuoteExport.php b/app/Export/CSV/QuoteExport.php index 4d404d4ca3e8..4b2881fe7bc9 100644 --- a/app/Export/CSV/QuoteExport.php +++ b/app/Export/CSV/QuoteExport.php @@ -127,7 +127,7 @@ class QuoteExport extends BaseExport $query->cursor() ->each(function ($quote) { - + /** @var \App\Models\Quote $quote */ $this->csv->insertOne($this->buildRow($quote)); }); diff --git a/app/Export/CSV/QuoteItemExport.php b/app/Export/CSV/QuoteItemExport.php index 2e8e5a008939..62e4931338a1 100644 --- a/app/Export/CSV/QuoteItemExport.php +++ b/app/Export/CSV/QuoteItemExport.php @@ -104,7 +104,7 @@ class QuoteItemExport extends BaseExport $query->cursor() ->each(function ($resource) { - + /** @var \App\Models\Quote $resource */ $this->iterateItems($resource); @@ -136,7 +136,7 @@ class QuoteItemExport extends BaseExport $query->cursor() ->each(function ($quote) { - + /** @var \App\Models\Quote $quote */ $this->iterateItems($quote); }); diff --git a/app/Export/CSV/RecurringInvoiceExport.php b/app/Export/CSV/RecurringInvoiceExport.php index 62a2c78364ca..01ba57eb5a5e 100644 --- a/app/Export/CSV/RecurringInvoiceExport.php +++ b/app/Export/CSV/RecurringInvoiceExport.php @@ -93,7 +93,7 @@ class RecurringInvoiceExport extends BaseExport $query->cursor() ->each(function ($invoice) { - + /** @var \App\Models\RecurringInvoice $invoice */ $this->csv->insertOne($this->buildRow($invoice)); }); @@ -114,7 +114,7 @@ class RecurringInvoiceExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { - + /** @var \App\Models\RecurringInvoice $resource */ $row = $this->buildRow($resource); return $this->processMetaData($row, $resource); diff --git a/app/Export/CSV/TaskExport.php b/app/Export/CSV/TaskExport.php index 3d48b845a240..3a7d6f99cdf0 100644 --- a/app/Export/CSV/TaskExport.php +++ b/app/Export/CSV/TaskExport.php @@ -106,9 +106,9 @@ class TaskExport extends BaseExport $query->cursor() ->each(function ($entity) { - - /** @var \App\Models\Task $entity*/ - $this->buildRow($entity); + + /** @var \App\Models\Task $entity*/ + $this->buildRow($entity); }); $this->csv->insertAll($this->storage_array); @@ -209,7 +209,7 @@ class TaskExport extends BaseExport $entity['task.duration_words'] = $seconds > 86400 ? CarbonInterval::seconds($seconds)->locale($this->company->locale())->cascade()->forHumans() : now()->startOfDay()->addSeconds($seconds)->format('H:i:s'); $entity['task.time_log'] = (isset($item[1]) && $item[1] != 0) ? $item[1] - $item[0] : ctrans('texts.is_running'); - + } if (in_array('task.billable', $this->input['report_keys']) || in_array('billable', $this->input['report_keys'])) { diff --git a/app/Export/CSV/VendorExport.php b/app/Export/CSV/VendorExport.php index 799fca7a075f..c6f0d32c5a1a 100644 --- a/app/Export/CSV/VendorExport.php +++ b/app/Export/CSV/VendorExport.php @@ -90,7 +90,7 @@ class VendorExport extends BaseExport $report = $query->cursor() ->map(function ($resource) { - + /** @var \App\Models\Vendor $resource */ $row = $this->buildRow($resource); return $this->processMetaData($row, $resource); @@ -109,9 +109,9 @@ class VendorExport extends BaseExport $query->cursor() ->each(function ($vendor) { - - /** @var \App\Models\Vendor $vendor */ - $this->csv->insertOne($this->buildRow($vendor)); + + /** @var \App\Models\Vendor $vendor */ + $this->csv->insertOne($this->buildRow($vendor)); }); return $this->csv->toString(); diff --git a/app/Export/Decorators/TaskDecorator.php b/app/Export/Decorators/TaskDecorator.php index d8d908a34c00..277a7a422637 100644 --- a/app/Export/Decorators/TaskDecorator.php +++ b/app/Export/Decorators/TaskDecorator.php @@ -96,7 +96,7 @@ class TaskDecorator extends Decorator implements DecoratorInterface return ''; } - + /** * billable * @@ -106,7 +106,7 @@ class TaskDecorator extends Decorator implements DecoratorInterface { return ''; } - + /** * items_notes * @todo @@ -115,7 +115,7 @@ class TaskDecorator extends Decorator implements DecoratorInterface { return ''; } - + public function duration(Task $task) { return $task->calcDuration(); diff --git a/app/Factory/RecurringExpenseToExpenseFactory.php b/app/Factory/RecurringExpenseToExpenseFactory.php index e6699e1fb77c..d36fba7a3a09 100644 --- a/app/Factory/RecurringExpenseToExpenseFactory.php +++ b/app/Factory/RecurringExpenseToExpenseFactory.php @@ -149,43 +149,43 @@ class RecurringExpenseToExpenseFactory } // if (Str::contains($match, '|')) { - $parts = explode('|', $match); // [ '[MONTH', 'MONTH+2]' ] + $parts = explode('|', $match); // [ '[MONTH', 'MONTH+2]' ] - $left = substr($parts[0], 1); // 'MONTH' - $right = substr($parts[1], 0, -1); // MONTH+2 + $left = substr($parts[0], 1); // 'MONTH' + $right = substr($parts[1], 0, -1); // MONTH+2 - // If left side is not part of replacements, skip. - if (! array_key_exists($left, $replacements['ranges'])) { - continue; - } + // If left side is not part of replacements, skip. + if (! array_key_exists($left, $replacements['ranges'])) { + continue; + } - $_left = Carbon::createFromDate(now()->year, now()->month)->translatedFormat('F Y'); - $_right = ''; + $_left = Carbon::createFromDate(now()->year, now()->month)->translatedFormat('F Y'); + $_right = ''; - // If right side doesn't have any calculations, replace with raw ranges keyword. - if (! Str::contains($right, ['-', '+', '/', '*'])) { - $_right = Carbon::createFromDate(now()->year, now()->month)->translatedFormat('F Y'); - } + // If right side doesn't have any calculations, replace with raw ranges keyword. + if (! Str::contains($right, ['-', '+', '/', '*'])) { + $_right = Carbon::createFromDate(now()->year, now()->month)->translatedFormat('F Y'); + } - // If right side contains one of math operations, calculate. - if (Str::contains($right, ['+'])) { - $operation = preg_match_all('/(?!^-)[+*\/-](\s?-)?/', $right, $_matches); + // If right side contains one of math operations, calculate. + if (Str::contains($right, ['+'])) { + $operation = preg_match_all('/(?!^-)[+*\/-](\s?-)?/', $right, $_matches); - $_operation = array_shift($_matches)[0]; // + - + $_operation = array_shift($_matches)[0]; // + - - $_value = explode($_operation, $right); // [MONTHYEAR, 4] + $_value = explode($_operation, $right); // [MONTHYEAR, 4] - $_right = Carbon::createFromDate(now()->year, now()->month)->addMonths($_value[1])->translatedFormat('F Y'); //@phpstan-ignore-line - } + $_right = Carbon::createFromDate(now()->year, now()->month)->addMonths($_value[1])->translatedFormat('F Y'); //@phpstan-ignore-line + } - $replacement = sprintf('%s to %s', $_left, $_right); + $replacement = sprintf('%s to %s', $_left, $_right); - $value = preg_replace( - sprintf('/%s/', preg_quote($match)), - $replacement, - $value, - 1 - ); + $value = preg_replace( + sprintf('/%s/', preg_quote($match)), + $replacement, + $value, + 1 + ); // } } diff --git a/app/Filters/CreditFilters.php b/app/Filters/CreditFilters.php index 578a83ddcff0..81d3c2dec09f 100644 --- a/app/Filters/CreditFilters.php +++ b/app/Filters/CreditFilters.php @@ -105,7 +105,7 @@ class CreditFilters extends QueryFilters JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].product_key')) ), '$[*]') ) LIKE ?", ['%'.$filter.'%']); - // ->orWhereRaw("JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].notes')) LIKE ?", ['%'.$filter.'%']); + // ->orWhereRaw("JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].notes')) LIKE ?", ['%'.$filter.'%']); }); } diff --git a/app/Filters/ExpenseFilters.php b/app/Filters/ExpenseFilters.php index 2fa80a1eb799..c86a848d0b0b 100644 --- a/app/Filters/ExpenseFilters.php +++ b/app/Filters/ExpenseFilters.php @@ -162,8 +162,9 @@ class ExpenseFilters extends QueryFilters { $categories_exploded = explode(",", $categories); - if(empty($categories) || count(array_filter($categories_exploded)) == 0) + if(empty($categories) || count(array_filter($categories_exploded)) == 0) { return $this->builder; + } $categories_keys = $this->transformKeys($categories_exploded); diff --git a/app/Filters/InvoiceFilters.php b/app/Filters/InvoiceFilters.php index 4685590b1cfa..e31cfd0dec91 100644 --- a/app/Filters/InvoiceFilters.php +++ b/app/Filters/InvoiceFilters.php @@ -132,7 +132,7 @@ class InvoiceFilters extends QueryFilters JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].product_key')) ), '$[*]') ) LIKE ?", ['%'.$filter.'%']); - // ->orWhereRaw("JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].notes')) LIKE ?", ['%'.$filter.'%']); + // ->orWhereRaw("JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].notes')) LIKE ?", ['%'.$filter.'%']); }); } diff --git a/app/Filters/QuoteFilters.php b/app/Filters/QuoteFilters.php index d2c5763187dc..5e9776c9a0e3 100644 --- a/app/Filters/QuoteFilters.php +++ b/app/Filters/QuoteFilters.php @@ -53,7 +53,7 @@ class QuoteFilters extends QueryFilters JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].product_key')) ), '$[*]') ) LIKE ?", ['%'.$filter.'%']); - // ->orWhereRaw("JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].notes')) LIKE ?", ['%'.$filter.'%']); + // ->orWhereRaw("JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].notes')) LIKE ?", ['%'.$filter.'%']); }); } diff --git a/app/Filters/RecurringInvoiceFilters.php b/app/Filters/RecurringInvoiceFilters.php index 976739912b59..b2f5a8cbce39 100644 --- a/app/Filters/RecurringInvoiceFilters.php +++ b/app/Filters/RecurringInvoiceFilters.php @@ -56,7 +56,7 @@ class RecurringInvoiceFilters extends QueryFilters JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].product_key')) ), '$[*]') ) LIKE ?", ['%'.$filter.'%']); - //->orWhereRaw("JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].notes')) LIKE ?", ['%'.$filter.'%']); + //->orWhereRaw("JSON_UNQUOTE(JSON_EXTRACT(line_items, '$[*].notes')) LIKE ?", ['%'.$filter.'%']); }); } @@ -141,7 +141,7 @@ class RecurringInvoiceFilters extends QueryFilters return $this->builder->orderByRaw("REGEXP_REPLACE(number,'[^0-9]+','')+0 " . $dir); } - if($sort_col[0] == 'status_id'){ + if($sort_col[0] == 'status_id') { return $this->builder->orderBy('status_id', $dir)->orderBy('last_sent_date', $dir); } diff --git a/app/Helpers/Bank/Nordigen/Transformer/TransactionTransformer.php b/app/Helpers/Bank/Nordigen/Transformer/TransactionTransformer.php index 7d3d604a6897..662b833e48f7 100644 --- a/app/Helpers/Bank/Nordigen/Transformer/TransactionTransformer.php +++ b/app/Helpers/Bank/Nordigen/Transformer/TransactionTransformer.php @@ -165,7 +165,7 @@ class TransactionTransformer implements BankRevenueInterface /** @var \App\Models\Currency $currency */ return $currency ? $currency->id : 1; //@phpstan-ignore-line - + } private function formatDate(string $input) diff --git a/app/Helpers/Epc/EpcQrGenerator.php b/app/Helpers/Epc/EpcQrGenerator.php index ccdee6e65efe..256e2d734181 100644 --- a/app/Helpers/Epc/EpcQrGenerator.php +++ b/app/Helpers/Epc/EpcQrGenerator.php @@ -61,7 +61,7 @@ class EpcQrGenerator } catch(\Throwable $e) { nlog("EPC QR failure => ".$e->getMessage()); return ''; - } + } } diff --git a/app/Helpers/Invoice/InvoiceSumInclusive.php b/app/Helpers/Invoice/InvoiceSumInclusive.php index 07fdf3e86894..1ce79aba0a3e 100644 --- a/app/Helpers/Invoice/InvoiceSumInclusive.php +++ b/app/Helpers/Invoice/InvoiceSumInclusive.php @@ -64,7 +64,7 @@ class InvoiceSumInclusive { $this->invoice = $invoice; $this->client = $invoice->client ?? $invoice->vendor; - + $this->precision = $this->client->currency()->precision; $this->rappen_rounding = $this->client->getSetting('enable_rappen_rounding'); diff --git a/app/Helpers/Mail/GmailTransport.php b/app/Helpers/Mail/GmailTransport.php index 5dd8492191b2..f957a1445ff2 100644 --- a/app/Helpers/Mail/GmailTransport.php +++ b/app/Helpers/Mail/GmailTransport.php @@ -53,7 +53,7 @@ class GmailTransport extends AbstractTransport if ($bccs) { $bcc_list = 'Bcc: '; - foreach ($bccs->getAddresses() as $address) { + foreach ($bccs->getAddresses() as $address) { $bcc_list .= $address->getAddress() .','; } diff --git a/app/Http/Controllers/ActivityController.php b/app/Http/Controllers/ActivityController.php index dac6478f326b..fe47969c5aba 100644 --- a/app/Http/Controllers/ActivityController.php +++ b/app/Http/Controllers/ActivityController.php @@ -117,7 +117,7 @@ class ActivityController extends BaseController } - + /** * downloadHistoricalEntity * @@ -204,7 +204,7 @@ class ActivityController extends BaseController $activity->user_id = $user->id; $activity->ip = $request->ip(); $activity->activity_type_id = Activity::USER_NOTE; - + switch (get_class($entity)) { case Invoice::class: $activity->invoice_id = $entity->id; @@ -254,17 +254,20 @@ class ActivityController extends BaseController $activity->client_id = $entity->client_id; $activity->project_id = $entity->project_id; $activity->vendor_id = $entity->vendor_id; + // no break case Task::class: $activity->task_id = $entity->id; $activity->expense_id = $entity->id; $activity->client_id = $entity->client_id; $activity->project_id = $entity->project_id; $activity->vendor_id = $entity->vendor_id; + // no break case Payment::class: $activity->payment_id = $entity->id; $activity->expense_id = $entity->id; $activity->client_id = $entity->client_id; $activity->project_id = $entity->project_id; + // no break default: # code... break; diff --git a/app/Http/Controllers/Auth/ContactLoginController.php b/app/Http/Controllers/Auth/ContactLoginController.php index 5a72419244cb..b35b02016c09 100644 --- a/app/Http/Controllers/Auth/ContactLoginController.php +++ b/app/Http/Controllers/Auth/ContactLoginController.php @@ -41,9 +41,10 @@ class ContactLoginController extends Controller $company = false; $account = false; - if($request->query('intended')) + if($request->query('intended')) { $request->session()->put('url.intended', $request->query('intended')); - + } + if ($request->session()->has('company_key')) { MultiDB::findAndSetDbByCompanyKey($request->session()->get('company_key')); $company = Company::where('company_key', $request->session()->get('company_key'))->first(); @@ -141,9 +142,10 @@ class ContactLoginController extends Controller } $this->setRedirectPath(); - - if($intended) + + if($intended) { $this->redirectTo = $intended; + } return $request->wantsJson() ? new JsonResponse([], 204) diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 3f8201c75a6c..5df56723fed2 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -399,8 +399,8 @@ class LoginController extends BaseController $truth->setCompany($set_company); //21-03-2024 - - + + $cu->each(function ($cu) { /** @var \App\Models\CompanyUser $cu */ if(CompanyToken::query()->where('company_id', $cu->company_id)->where('user_id', $cu->user_id)->where('is_system', true)->doesntExist()) { diff --git a/app/Http/Controllers/BankIntegrationController.php b/app/Http/Controllers/BankIntegrationController.php index 6701f1e65fd9..42b2df3035ac 100644 --- a/app/Http/Controllers/BankIntegrationController.php +++ b/app/Http/Controllers/BankIntegrationController.php @@ -217,7 +217,7 @@ class BankIntegrationController extends BaseController } if (config('ninja.nordigen.secret_id') && config('ninja.nordigen.secret_key') && (Ninja::isSelfHost() || (Ninja::isHosted() && $user_account->isEnterprisePaidClient()))) { - $user_account->bank_integrations->where("integration_type", BankIntegration::INTEGRATION_TYPE_NORDIGEN)->each(function ($bank_integration) { + $user_account->bank_integrations->where("integration_type", BankIntegration::INTEGRATION_TYPE_NORDIGEN)->each(function ($bank_integration) { /** @var \App\Models\BankIntegration $bank_integration */ ProcessBankTransactionsNordigen::dispatch($bank_integration); }); diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php index 01f3d8973d97..873bab711483 100644 --- a/app/Http/Controllers/BaseController.php +++ b/app/Http/Controllers/BaseController.php @@ -934,7 +934,7 @@ class BaseController extends Controller } elseif (in_array($this->entity_type, [Design::class, GroupSetting::class, PaymentTerm::class, TaskStatus::class])) { // nlog($this->entity_type); } else { - $query->where(function ($q) use ($user){ //grouping these together improves query performance significantly) + $query->where(function ($q) use ($user) { //grouping these together improves query performance significantly) $q->where('user_id', '=', $user->id)->orWhere('assigned_user_id', $user->id); }); } @@ -996,7 +996,7 @@ class BaseController extends Controller if(request()->has('einvoice')) { - if(class_exists(Schema::class)){ + if(class_exists(Schema::class)) { $ro = new Schema(); $response_data['einvoice_schema'] = $ro('Peppol'); } diff --git a/app/Http/Controllers/BrevoController.php b/app/Http/Controllers/BrevoController.php index e0e94e8fa71b..7ea09493e98a 100644 --- a/app/Http/Controllers/BrevoController.php +++ b/app/Http/Controllers/BrevoController.php @@ -19,7 +19,6 @@ use Illuminate\Http\Request; */ class BrevoController extends BaseController { - public function __construct() { } diff --git a/app/Http/Controllers/ChartController.php b/app/Http/Controllers/ChartController.php index 07fc7fc238e4..a3cdff36397f 100644 --- a/app/Http/Controllers/ChartController.php +++ b/app/Http/Controllers/ChartController.php @@ -73,7 +73,7 @@ class ChartController extends BaseController $user = auth()->user(); $cs = new ChartService($user->company(), $user, $user->isAdmin()); $result = $cs->getCalculatedField($request->all()); - + return response()->json($result, 200); } diff --git a/app/Http/Controllers/ClientPortal/InvitationController.php b/app/Http/Controllers/ClientPortal/InvitationController.php index ec30aacc37b6..ea4b65c97156 100644 --- a/app/Http/Controllers/ClientPortal/InvitationController.php +++ b/app/Http/Controllers/ClientPortal/InvitationController.php @@ -114,8 +114,8 @@ class InvitationController extends Controller 'invitation_key' => $invitation_key ]); } - - if(!auth()->guard('contact')->check()){ + + if(!auth()->guard('contact')->check()) { $this->middleware('auth:contact'); return redirect()->route('client.login', ['intended' => route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key}), 'silent' => $is_silent])]); } @@ -146,7 +146,7 @@ class InvitationController extends Controller } - + private function fireEntityViewedEvent($invitation, $entity_string) { switch ($entity_string) { diff --git a/app/Http/Controllers/ClientPortal/InvoiceController.php b/app/Http/Controllers/ClientPortal/InvoiceController.php index 0d8449daae99..2a22627d8491 100644 --- a/app/Http/Controllers/ClientPortal/InvoiceController.php +++ b/app/Http/Controllers/ClientPortal/InvoiceController.php @@ -62,6 +62,7 @@ class InvoiceController extends Controller $invitation = $invoice->invitations()->where('client_contact_id', auth()->guard('contact')->user()->id)->first(); + // @phpstan-ignore-next-line if ($invitation && auth()->guard('contact') && ! session()->get('is_silent') && ! $invitation->viewed_date) { $invitation->markViewed(); @@ -77,13 +78,17 @@ class InvoiceController extends Controller 'key' => $invitation ? $invitation->key : false, 'hash' => $hash, 'variables' => $variables, + 'invoices' => [$invoice->hashed_id], + 'db' => $invoice->company->db, ]; if ($request->query('mode') === 'fullscreen') { return render('invoices.show-fullscreen', $data); } - return $this->render('invoices.show', $data); + return auth()->guard('contact')->user()->client->getSetting('payment_flow') == 'default' ? $this->render('invoices.show', $data) : $this->render('invoices.show_smooth', $data); + + // return $this->render('invoices.show_smooth', $data); } public function showBlob($hash) @@ -235,9 +240,12 @@ class InvoiceController extends Controller 'hashed_ids' => $invoices->pluck('hashed_id'), 'total' => $total, 'variables' => $variables, + 'invitation' => $invitation, + 'db' => $invitation->company->db, ]; - return $this->render('invoices.payment', $data); + // return $this->render('invoices.payment', $data); + return auth()->guard('contact')->user()->client->getSetting('payment_flow') === 'default' ? $this->render('invoices.payment', $data) : $this->render('invoices.show_smooth_multi', $data); } /** diff --git a/app/Http/Controllers/ClientPortal/NinjaPlanController.php b/app/Http/Controllers/ClientPortal/NinjaPlanController.php index 3b3c19580488..48d1c467e928 100644 --- a/app/Http/Controllers/ClientPortal/NinjaPlanController.php +++ b/app/Http/Controllers/ClientPortal/NinjaPlanController.php @@ -80,7 +80,7 @@ class NinjaPlanController extends Controller $data['intent'] = $setupIntent; $data['client'] = Auth::guard('contact')->user()->client; - + return $this->render('plan.trial', $data); } diff --git a/app/Http/Controllers/ClientPortal/PaymentController.php b/app/Http/Controllers/ClientPortal/PaymentController.php index 94a46bd5cbe5..3ab4a714413b 100644 --- a/app/Http/Controllers/ClientPortal/PaymentController.php +++ b/app/Http/Controllers/ClientPortal/PaymentController.php @@ -126,7 +126,7 @@ class PaymentController extends Controller // if($payment_hash) $invoice = $payment_hash->fee_invoice; // else - // $invoice = Invoice::with('client')->where('id',$payment_hash->fee_invoice_id)->orderBy('id','desc')->first(); + // $invoice = Invoice::with('client')->where('id',$payment_hash->fee_invoice_id)->orderBy('id','desc')->first(); // $invoice = Invoice::with('client')->find($payment_hash->fee_invoice_id); diff --git a/app/Http/Controllers/ClientPortal/SubscriptionPurchaseController.php b/app/Http/Controllers/ClientPortal/SubscriptionPurchaseController.php index 677fb3cceeff..8818e2887877 100644 --- a/app/Http/Controllers/ClientPortal/SubscriptionPurchaseController.php +++ b/app/Http/Controllers/ClientPortal/SubscriptionPurchaseController.php @@ -94,7 +94,7 @@ class SubscriptionPurchaseController extends Controller */ private function setLocale(string $locale): string { - + /** @var \Illuminate\Support\Collection<\App\Models\Language> */ $languages = app('languages'); @@ -104,6 +104,6 @@ class SubscriptionPurchaseController extends Controller }); return $record ? $record->locale : 'en'; - + } } diff --git a/app/Http/Controllers/CompanyController.php b/app/Http/Controllers/CompanyController.php index efa8c8081096..2be76e52b83b 100644 --- a/app/Http/Controllers/CompanyController.php +++ b/app/Http/Controllers/CompanyController.php @@ -707,7 +707,7 @@ class CompanyController extends BaseController } /** - * + * * * @return \Symfony\Component\HttpFoundation\StreamedResponse | \Illuminate\Http\JsonResponse */ diff --git a/app/Http/Controllers/CreditController.php b/app/Http/Controllers/CreditController.php index d6fe802d4fe7..11abfd50a3ac 100644 --- a/app/Http/Controllers/CreditController.php +++ b/app/Http/Controllers/CreditController.php @@ -615,7 +615,7 @@ class CreditController extends BaseController return response()->streamDownload(function () use ($file) { echo $file; }, $credit->numberFormatter() . '.pdf', ['Content-Type' => 'application/pdf']); - + case 'archive': $this->credit_repository->archive($credit); diff --git a/app/Http/Controllers/ExpenseController.php b/app/Http/Controllers/ExpenseController.php index 3c2028c6f874..eaeee304f7db 100644 --- a/app/Http/Controllers/ExpenseController.php +++ b/app/Http/Controllers/ExpenseController.php @@ -593,6 +593,6 @@ class ExpenseController extends BaseController } return response()->json(['message' => 'Processing....'], 200); - + } } diff --git a/app/Http/Controllers/ImportQuickbooksController.php b/app/Http/Controllers/ImportQuickbooksController.php index 7913f7a433a0..8f93651a7a25 100644 --- a/app/Http/Controllers/ImportQuickbooksController.php +++ b/app/Http/Controllers/ImportQuickbooksController.php @@ -3,7 +3,7 @@ namespace App\Http\Controllers; use App\Http\Requests\Quickbooks\AuthorizedQuickbooksRequest; -use \Closure; +use Closure; use App\Utils\Ninja; use App\Models\Company; use App\Libraries\MultiDB; @@ -19,7 +19,6 @@ use App\Services\Import\Quickbooks\QuickbooksService; class ImportQuickbooksController extends BaseController { - private array $import_entities = [ 'client' => 'Customer', 'invoice' => 'Invoice', @@ -29,7 +28,7 @@ class ImportQuickbooksController extends BaseController public function onAuthorized(AuthorizedQuickbooksRequest $request) { - + MultiDB::findAndSetDbByCompanyKey($request->getTokenContent()['company_key']); $company = $request->getCompany(); $qb = new QuickbooksService($company); @@ -39,18 +38,17 @@ class ImportQuickbooksController extends BaseController nlog($access_token_object); //OAuth2AccessToken $company->quickbooks = $access_token_object; $company->save(); - + return response()->json(['message' => 'Success'], 200); //todo swapout for redirect to UI } /** * Determine if the user is authorized to make this request. * - * @return bool */ public function authorizeQuickbooks(AuthQuickbooksRequest $request, string $token) { - + MultiDB::findAndSetDbByCompanyKey($request->getTokenContent()['company_key']); $company = $request->getCompany(); $qb = new QuickbooksService($company); @@ -65,7 +63,7 @@ class ImportQuickbooksController extends BaseController public function preimport(string $type, string $hash) { - // Check for authorization otherwise + // Check for authorization otherwise // Create a reference $data = [ 'hash' => $hash, @@ -74,17 +72,19 @@ class ImportQuickbooksController extends BaseController $this->getData($data); } - protected function getData($data) { + protected function getData($data) + { $entity = $this->import_entities[$data['type']]; $cache_name = "{$data['hash']}-{$data['type']}"; // TODO: Get or put cache or DB? - if(! Cache::has($cache_name) ) - { + if(! Cache::has($cache_name)) { $contents = call_user_func([$this->service, "fetch{$entity}s"]); - if($contents->isEmpty()) return; - - Cache::put($cache_name, base64_encode( $contents->toJson()), 600); + if($contents->isEmpty()) { + return; + } + + Cache::put($cache_name, base64_encode($contents->toJson()), 600); } } @@ -117,20 +117,19 @@ class ImportQuickbooksController extends BaseController */ public function import(Request $request) { - $hash = Str::random(32); - foreach($request->input('import_types') as $type) - { - $this->preimport($type, $hash); - } - /** @var \App\Models\User $user */ - // $user = auth()->user() ?? Auth::loginUsingId(60); - $data = ['import_types' => $request->input('import_types') ] + compact('hash'); - if (Ninja::isHosted()) { - QuickbooksIngest::dispatch( $data , $user->company() ); - } else { - QuickbooksIngest::dispatch($data, $user->company() ); - } + // $hash = Str::random(32); + // foreach($request->input('import_types') as $type) { + // $this->preimport($type, $hash); + // } + // /** @var \App\Models\User $user */ + // // $user = auth()->user() ?? Auth::loginUsingId(60); + // $data = ['import_types' => $request->input('import_types') ] + compact('hash'); + // if (Ninja::isHosted()) { + // QuickbooksIngest::dispatch($data, $user->company()); + // } else { + // QuickbooksIngest::dispatch($data, $user->company()); + // } - return response()->json(['message' => 'Processing'], 200); + // return response()->json(['message' => 'Processing'], 200); } } diff --git a/app/Http/Controllers/InvoiceController.php b/app/Http/Controllers/InvoiceController.php index f163bb45ad91..ee363bb808a3 100644 --- a/app/Http/Controllers/InvoiceController.php +++ b/app/Http/Controllers/InvoiceController.php @@ -503,7 +503,7 @@ class InvoiceController extends BaseController $invoices = Invoice::withTrashed()->whereIn('id', $this->transformKeys($ids))->company()->get(); - if ($invoices->count() == 0 ) { + if ($invoices->count() == 0) { return response()->json(['message' => 'No Invoices Found']); } diff --git a/app/Http/Controllers/MailgunWebhookController.php b/app/Http/Controllers/MailgunWebhookController.php index 88985e136158..ce51e319cc9e 100644 --- a/app/Http/Controllers/MailgunWebhookController.php +++ b/app/Http/Controllers/MailgunWebhookController.php @@ -20,7 +20,6 @@ use Illuminate\Http\Request; */ class MailgunWebhookController extends BaseController { - public function __construct() { } @@ -35,7 +34,7 @@ class MailgunWebhookController extends BaseController } if(\hash_equals(\hash_hmac('sha256', $input['signature']['timestamp'] . $input['signature']['token'], config('services.mailgun.webhook_signing_key')), $input['signature']['signature'])) { - ProcessMailgunWebhook::dispatch($request->all())->delay(rand(2,10)); + ProcessMailgunWebhook::dispatch($request->all())->delay(rand(2, 10)); } return response()->json(['message' => 'Success.'], 200); diff --git a/app/Http/Controllers/OneTimeTokenController.php b/app/Http/Controllers/OneTimeTokenController.php index 1d4773b530c5..d4aa685c58b6 100644 --- a/app/Http/Controllers/OneTimeTokenController.php +++ b/app/Http/Controllers/OneTimeTokenController.php @@ -22,7 +22,6 @@ use Illuminate\Support\Str; class OneTimeTokenController extends BaseController { - public function __construct() { parent::__construct(); diff --git a/app/Http/Controllers/PaymentNotificationWebhookController.php b/app/Http/Controllers/PaymentNotificationWebhookController.php index a7ab8b0c3cba..7511085f73b0 100644 --- a/app/Http/Controllers/PaymentNotificationWebhookController.php +++ b/app/Http/Controllers/PaymentNotificationWebhookController.php @@ -25,7 +25,7 @@ class PaymentNotificationWebhookController extends Controller { /** @var \App\Models\CompanyGateway $company_gateway */ $company_gateway = CompanyGateway::find($this->decodePrimaryKey($company_gateway_id)); - + /** @var \App\Models\Client $client */ $client = Client::find($this->decodePrimaryKey($client_hash)); diff --git a/app/Http/Controllers/PostMarkController.php b/app/Http/Controllers/PostMarkController.php index e2974f99831b..01679cef67f0 100644 --- a/app/Http/Controllers/PostMarkController.php +++ b/app/Http/Controllers/PostMarkController.php @@ -19,7 +19,6 @@ use Illuminate\Http\Request; */ class PostMarkController extends BaseController { - public function __construct() { } diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 02c9692b6292..517f36ce47ce 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -297,8 +297,7 @@ class PreviewController extends BaseController ->setTemplate($design_object) ->mock(); } catch(SyntaxError $e) { - } - catch(\Exception $e) { + } catch(\Exception $e) { return response()->json(['message' => 'invalid data access', 'errors' => ['design.design.body' => $e->getMessage()]], 422); } diff --git a/app/Http/Controllers/SearchController.php b/app/Http/Controllers/SearchController.php index 5cf35adef3c2..f4d842843c6b 100644 --- a/app/Http/Controllers/SearchController.php +++ b/app/Http/Controllers/SearchController.php @@ -85,12 +85,12 @@ class SearchController extends Controller // ->whereHas('client', function ($q) { // $q->where('is_deleted', 0); // }) - + ->leftJoin('clients', function ($join) { $join->on('invoices.client_id', '=', 'clients.id') ->where('clients.is_deleted', 0); }) - + ->when(!$user->hasPermission('view_all') || !$user->hasPermission('view_invoice'), function ($query) use ($user) { $query->where('invoices.user_id', $user->id); }) diff --git a/app/Http/Controllers/SelfUpdateController.php b/app/Http/Controllers/SelfUpdateController.php index 3c7caf650ed9..ba06f6806e84 100644 --- a/app/Http/Controllers/SelfUpdateController.php +++ b/app/Http/Controllers/SelfUpdateController.php @@ -181,8 +181,9 @@ class SelfUpdateController extends BaseController public function checkVersion() { - if(Ninja::isHosted()) + if(Ninja::isHosted()) { return '5.10.SaaS'; + } return trim(file_get_contents(config('ninja.version_url'))); } diff --git a/app/Http/Controllers/VendorPortal/PurchaseOrderController.php b/app/Http/Controllers/VendorPortal/PurchaseOrderController.php index b5321baff9c0..44d836c05257 100644 --- a/app/Http/Controllers/VendorPortal/PurchaseOrderController.php +++ b/app/Http/Controllers/VendorPortal/PurchaseOrderController.php @@ -189,7 +189,7 @@ class PurchaseOrderController extends Controller } event(new PurchaseOrderWasAccepted($purchase_order, auth()->guard('vendor')->user(), $purchase_order->company, Ninja::eventVars())); - + WebhookHandler::dispatch(Webhook::EVENT_ACCEPTED_PURCHASE_ORDER, $purchase_order, $purchase_order->company, 'vendor')->delay(0); }); diff --git a/app/Http/Controllers/VendorPortal/VendorContactHashLoginController.php b/app/Http/Controllers/VendorPortal/VendorContactHashLoginController.php index b0464fb5a65f..c902cbb072ff 100644 --- a/app/Http/Controllers/VendorPortal/VendorContactHashLoginController.php +++ b/app/Http/Controllers/VendorPortal/VendorContactHashLoginController.php @@ -34,7 +34,7 @@ class VendorContactHashLoginController extends Controller { return redirect($this->setRedirectPath()); } - + /** * errorPage * diff --git a/app/Http/Middleware/ThrottleRequestsWithPredis.php b/app/Http/Middleware/ThrottleRequestsWithPredis.php index 6d7cad13fb76..c1ce0e4592bd 100644 --- a/app/Http/Middleware/ThrottleRequestsWithPredis.php +++ b/app/Http/Middleware/ThrottleRequestsWithPredis.php @@ -34,7 +34,7 @@ class ThrottleRequestsWithPredis extends \Illuminate\Routing\Middleware\Throttle * Create a new request throttler. * @return void */ - + /** @phpstan-ignore-next-line */ public function __construct(RateLimiter $limiter, Redis $redis) { @@ -85,7 +85,10 @@ class ThrottleRequestsWithPredis extends \Illuminate\Routing\Middleware\Throttle protected function tooManyAttempts($key, $maxAttempts, $decaySeconds) { $limiter = new DurationLimiter( - $this->getRedisConnection(), $key, $maxAttempts, $decaySeconds + $this->getRedisConnection(), + $key, + $maxAttempts, + $decaySeconds ); return tap(! $limiter->acquire(), function () use ($key, $limiter) { diff --git a/app/Http/Requests/Activity/StoreNoteRequest.php b/app/Http/Requests/Activity/StoreNoteRequest.php index 8233cfd0592c..250fcfceec46 100644 --- a/app/Http/Requests/Activity/StoreNoteRequest.php +++ b/app/Http/Requests/Activity/StoreNoteRequest.php @@ -68,11 +68,12 @@ class StoreNoteRequest extends Request public function getEntity() { - if(!$this->entity) + if(!$this->entity) { return false; + } $class = "\\App\\Models\\".ucfirst(Str::camel(rtrim($this->entity, 's'))); - return $class::withTrashed()->find(is_string($this->entity_id) ? $this->decodePrimaryKey($this->entity_id) : $this->entity_id); + return $class::withTrashed()->find(is_string($this->entity_id) ? $this->decodePrimaryKey($this->entity_id) : $this->entity_id); } diff --git a/app/Http/Requests/Chart/ShowCalculatedFieldRequest.php b/app/Http/Requests/Chart/ShowCalculatedFieldRequest.php index 0980dcd3173c..5a9945da8f72 100644 --- a/app/Http/Requests/Chart/ShowCalculatedFieldRequest.php +++ b/app/Http/Requests/Chart/ShowCalculatedFieldRequest.php @@ -66,8 +66,7 @@ class ShowCalculatedFieldRequest extends Request $input['end_date'] = now()->format('Y-m-d'); } - if(isset($input['period']) && $input['period'] == 'previous') - { + if(isset($input['period']) && $input['period'] == 'previous') { $dates = $this->calculatePreviousPeriodStartAndEndDates($input, $user->company()); $input['start_date'] = $dates[0]; $input['end_date'] = $dates[1]; diff --git a/app/Http/Requests/Client/StoreClientRequest.php b/app/Http/Requests/Client/StoreClientRequest.php index 8592d93f2e3a..3262593f605c 100644 --- a/app/Http/Requests/Client/StoreClientRequest.php +++ b/app/Http/Requests/Client/StoreClientRequest.php @@ -200,7 +200,7 @@ class StoreClientRequest extends Request private function getCountryCode(string $country_code) { - + /** @var \Illuminate\Support\Collection<\App\Models\Country> */ $countries = app('countries'); @@ -209,12 +209,12 @@ class StoreClientRequest extends Request }); return $country ? (string) $country->id : ''; - + } private function getCurrencyCode($code) { - + /** @var \Illuminate\Support\Collection<\App\Models\Currency> */ $currencies = app('currencies'); @@ -223,6 +223,6 @@ class StoreClientRequest extends Request }); return $currency ? (string)$currency->id : ''; - + } } diff --git a/app/Http/Requests/Client/UpdateClientRequest.php b/app/Http/Requests/Client/UpdateClientRequest.php index ad8944c2dfbd..ea41667db8ce 100644 --- a/app/Http/Requests/Client/UpdateClientRequest.php +++ b/app/Http/Requests/Client/UpdateClientRequest.php @@ -142,7 +142,7 @@ class UpdateClientRequest extends Request private function getCountryCode($country_code) { - + /** @var \Illuminate\Support\Collection<\App\Models\Country> */ $countries = app('countries'); @@ -155,7 +155,7 @@ class UpdateClientRequest extends Request private function getLanguageId($language_code) { - + /** @var \Illuminate\Support\Collection<\App\Models\Language> */ $languages = app('languages'); diff --git a/app/Http/Requests/ClientPortal/Credits/ShowCreditRequest.php b/app/Http/Requests/ClientPortal/Credits/ShowCreditRequest.php index 8de2c43a0006..1defbd9095c5 100644 --- a/app/Http/Requests/ClientPortal/Credits/ShowCreditRequest.php +++ b/app/Http/Requests/ClientPortal/Credits/ShowCreditRequest.php @@ -14,7 +14,7 @@ class ShowCreditRequest extends FormRequest */ public function authorize() { - auth()->guard('contact')->user()->loadMissing(['company']); + auth()->guard('contact')->user()->loadMissing(['company']); return ! $this->credit->is_deleted && (bool)(auth()->guard('contact')->user()->company->enabled_modules & PortalComposer::MODULE_CREDITS) diff --git a/app/Http/Requests/ClientPortal/Invoices/ProcessInvoicesInBulkRequest.php b/app/Http/Requests/ClientPortal/Invoices/ProcessInvoicesInBulkRequest.php index 2cc008636e39..21a91571d6af 100644 --- a/app/Http/Requests/ClientPortal/Invoices/ProcessInvoicesInBulkRequest.php +++ b/app/Http/Requests/ClientPortal/Invoices/ProcessInvoicesInBulkRequest.php @@ -19,7 +19,7 @@ class ProcessInvoicesInBulkRequest extends FormRequest { public function authorize() { - + auth()->guard('contact')->user()->loadMissing(['company']); return (bool)(auth()->guard('contact')->user()->company->enabled_modules & PortalComposer::MODULE_INVOICES); diff --git a/app/Http/Requests/ClientPortal/Invoices/ShowInvoiceRequest.php b/app/Http/Requests/ClientPortal/Invoices/ShowInvoiceRequest.php index 16d328f496e7..2201b9541841 100644 --- a/app/Http/Requests/ClientPortal/Invoices/ShowInvoiceRequest.php +++ b/app/Http/Requests/ClientPortal/Invoices/ShowInvoiceRequest.php @@ -23,7 +23,7 @@ class ShowInvoiceRequest extends Request */ public function authorize(): bool { - + auth()->guard('contact')->user()->loadMissing(['company']); return (int) auth()->guard('contact')->user()->client_id === (int) $this->invoice->client_id diff --git a/app/Http/Requests/ClientPortal/Invoices/ShowInvoicesRequest.php b/app/Http/Requests/ClientPortal/Invoices/ShowInvoicesRequest.php index 25e2d1817f2e..91c7128e7291 100644 --- a/app/Http/Requests/ClientPortal/Invoices/ShowInvoicesRequest.php +++ b/app/Http/Requests/ClientPortal/Invoices/ShowInvoicesRequest.php @@ -19,7 +19,7 @@ class ShowInvoicesRequest extends FormRequest { public function authorize() { - + auth()->guard('contact')->user()->loadMissing(['company']); return (bool)(auth()->guard('contact')->user()->company->enabled_modules & PortalComposer::MODULE_INVOICES); diff --git a/app/Http/Requests/ClientPortal/PaymentMethod/CreatePaymentMethodRequest.php b/app/Http/Requests/ClientPortal/PaymentMethod/CreatePaymentMethodRequest.php index a50352b9b05d..c4213f9756a7 100644 --- a/app/Http/Requests/ClientPortal/PaymentMethod/CreatePaymentMethodRequest.php +++ b/app/Http/Requests/ClientPortal/PaymentMethod/CreatePaymentMethodRequest.php @@ -18,7 +18,7 @@ class CreatePaymentMethodRequest extends FormRequest */ public function authorize(): bool { - + auth()->guard('contact')->user()->loadMissing(['client' => function ($query) { $query->without('gateway_tokens', 'documents', 'contacts.company', 'contacts'); // Exclude 'grandchildren' relation of 'client' }]); diff --git a/app/Http/Requests/ClientPortal/PrePayments/StorePrePaymentRequest.php b/app/Http/Requests/ClientPortal/PrePayments/StorePrePaymentRequest.php index 6b5ab0c4f95a..08160c92172a 100644 --- a/app/Http/Requests/ClientPortal/PrePayments/StorePrePaymentRequest.php +++ b/app/Http/Requests/ClientPortal/PrePayments/StorePrePaymentRequest.php @@ -15,7 +15,7 @@ class StorePrePaymentRequest extends FormRequest */ public function authorize() { - + auth()->guard('contact')->user()->loadMissing(['company']); auth()->guard('contact')->user()->loadMissing(['client' => function ($query) { diff --git a/app/Http/Requests/ClientPortal/Quotes/ProcessQuotesInBulkRequest.php b/app/Http/Requests/ClientPortal/Quotes/ProcessQuotesInBulkRequest.php index 72a7cc9a664e..f2b8fc6efadf 100644 --- a/app/Http/Requests/ClientPortal/Quotes/ProcessQuotesInBulkRequest.php +++ b/app/Http/Requests/ClientPortal/Quotes/ProcessQuotesInBulkRequest.php @@ -21,7 +21,7 @@ class ProcessQuotesInBulkRequest extends FormRequest { public function authorize() { - + auth()->guard('contact')->user()->loadMissing(['company']); return (bool)(auth()->guard('contact')->user()->company->enabled_modules & PortalComposer::MODULE_QUOTES); diff --git a/app/Http/Requests/ClientPortal/Quotes/ShowQuoteRequest.php b/app/Http/Requests/ClientPortal/Quotes/ShowQuoteRequest.php index d5203b029832..a006504b84ff 100644 --- a/app/Http/Requests/ClientPortal/Quotes/ShowQuoteRequest.php +++ b/app/Http/Requests/ClientPortal/Quotes/ShowQuoteRequest.php @@ -19,7 +19,7 @@ class ShowQuoteRequest extends FormRequest { public function authorize() { - + auth()->guard('contact')->user()->loadMissing(['company']); return (int)auth()->guard('contact')->user()->client->id === (int) $this->quote->client_id diff --git a/app/Http/Requests/ClientPortal/Quotes/ShowQuotesRequest.php b/app/Http/Requests/ClientPortal/Quotes/ShowQuotesRequest.php index 9f62924e027c..585b5396b6d7 100644 --- a/app/Http/Requests/ClientPortal/Quotes/ShowQuotesRequest.php +++ b/app/Http/Requests/ClientPortal/Quotes/ShowQuotesRequest.php @@ -19,7 +19,7 @@ class ShowQuotesRequest extends FormRequest { public function authorize() { - + auth()->guard('contact')->user()->loadMissing(['company']); return (bool)(auth()->guard('contact')->user()->company->enabled_modules & PortalComposer::MODULE_QUOTES); diff --git a/app/Http/Requests/ClientPortal/RecurringInvoices/RequestCancellationRequest.php b/app/Http/Requests/ClientPortal/RecurringInvoices/RequestCancellationRequest.php index eacd6112dca3..0506bb861ac2 100644 --- a/app/Http/Requests/ClientPortal/RecurringInvoices/RequestCancellationRequest.php +++ b/app/Http/Requests/ClientPortal/RecurringInvoices/RequestCancellationRequest.php @@ -9,7 +9,7 @@ class RequestCancellationRequest extends FormRequest { public function authorize() { - + auth()->guard('contact')->user()->loadMissing(['company']); return (bool)(auth()->guard('contact')->user()->company->enabled_modules & PortalComposer::MODULE_RECURRING_INVOICES); diff --git a/app/Http/Requests/ClientPortal/Uploads/StoreUploadRequest.php b/app/Http/Requests/ClientPortal/Uploads/StoreUploadRequest.php index 50369aa5c99f..d37d84ec9efa 100644 --- a/app/Http/Requests/ClientPortal/Uploads/StoreUploadRequest.php +++ b/app/Http/Requests/ClientPortal/Uploads/StoreUploadRequest.php @@ -22,7 +22,7 @@ class StoreUploadRequest extends FormRequest */ public function authorize() { - + /** @phpstan-ignore-next-line **/ auth()->guard('contact')->user()->loadMissing(['client' => function ($query) { $query->without('gateway_tokens', 'documents', 'contacts.company', 'contacts'); // Exclude 'grandchildren' relation of 'client' diff --git a/app/Http/Requests/Credit/StoreCreditRequest.php b/app/Http/Requests/Credit/StoreCreditRequest.php index 27b9a4b020cf..626ee07fdc48 100644 --- a/app/Http/Requests/Credit/StoreCreditRequest.php +++ b/app/Http/Requests/Credit/StoreCreditRequest.php @@ -64,7 +64,7 @@ class StoreCreditRequest extends Request $user = auth()->user(); $rules['client_id'] = 'required|exists:clients,id,company_id,'.$user->company()->id; - + $rules['invitations'] = 'sometimes|bail|array'; $rules['invitations.*.client_contact_id'] = 'bail|required|distinct'; diff --git a/app/Http/Requests/Credit/UpdateCreditRequest.php b/app/Http/Requests/Credit/UpdateCreditRequest.php index 0733e3891326..acdda38d5781 100644 --- a/app/Http/Requests/Credit/UpdateCreditRequest.php +++ b/app/Http/Requests/Credit/UpdateCreditRequest.php @@ -65,7 +65,7 @@ class UpdateCreditRequest extends Request $rules['number'] = ['bail', 'sometimes', 'nullable', Rule::unique('credits')->where('company_id', $user->company()->id)->ignore($this->credit->id)]; $rules['client_id'] = ['bail', 'sometimes',Rule::in([$this->credit->client_id])]; - + $rules['invitations'] = 'sometimes|bail|array'; $rules['invitations.*.client_contact_id'] = 'bail|required|distinct'; diff --git a/app/Http/Requests/Expense/UpdateExpenseRequest.php b/app/Http/Requests/Expense/UpdateExpenseRequest.php index 50c496cf3301..812449e30b38 100644 --- a/app/Http/Requests/Expense/UpdateExpenseRequest.php +++ b/app/Http/Requests/Expense/UpdateExpenseRequest.php @@ -56,7 +56,7 @@ class UpdateExpenseRequest extends Request $rules['invoice_id'] = 'bail|sometimes|nullable|exists:invoices,id,company_id,'.$user->company()->id; $rules['documents'] = 'bail|sometimes|array'; $rules['amount'] = ['sometimes', 'bail', 'nullable', 'numeric', 'max:99999999999999']; - + return $this->globalRules($rules); } diff --git a/app/Http/Requests/Invoice/BulkInvoiceRequest.php b/app/Http/Requests/Invoice/BulkInvoiceRequest.php index 4cd6611077cd..130bca9224de 100644 --- a/app/Http/Requests/Invoice/BulkInvoiceRequest.php +++ b/app/Http/Requests/Invoice/BulkInvoiceRequest.php @@ -40,11 +40,12 @@ class BulkInvoiceRequest extends Request /** @var \App\Models\User $user */ $user = auth()->user(); - if(\Illuminate\Support\Facades\Cache::has($this->ip()."|".$this->input('action', 0)."|".$user->company()->company_key)) + if(\Illuminate\Support\Facades\Cache::has($this->ip()."|".$this->input('action', 0)."|".$user->company()->company_key)) { throw new DuplicatePaymentException('Duplicate request.', 429); + } \Illuminate\Support\Facades\Cache::put(($this->ip()."|".$this->input('action', 0)."|".$user->company()->company_key), true, 1); } - + } diff --git a/app/Http/Requests/Invoice/StoreInvoiceRequest.php b/app/Http/Requests/Invoice/StoreInvoiceRequest.php index 34907c6d602f..14b658ba53fd 100644 --- a/app/Http/Requests/Invoice/StoreInvoiceRequest.php +++ b/app/Http/Requests/Invoice/StoreInvoiceRequest.php @@ -89,7 +89,7 @@ class StoreInvoiceRequest extends Request public function prepareForValidation() { - + /** @var \App\Models\User $user */ $user = auth()->user(); @@ -106,7 +106,7 @@ class StoreInvoiceRequest extends Request } if(isset($input['partial']) && $input['partial'] == 0) { $input['partial_due_date'] = null; - } + } if (!isset($input['tax_rate1'])) { $input['tax_rate1'] = 0; } diff --git a/app/Http/Requests/Payment/StorePaymentRequest.php b/app/Http/Requests/Payment/StorePaymentRequest.php index 67d472836f49..b74c5c09445f 100644 --- a/app/Http/Requests/Payment/StorePaymentRequest.php +++ b/app/Http/Requests/Payment/StorePaymentRequest.php @@ -80,11 +80,12 @@ class StorePaymentRequest extends Request /** @var \App\Models\User $user */ $user = auth()->user(); - if(\Illuminate\Support\Facades\Cache::has($this->ip()."|".$this->input('amount', 0)."|".$this->input('client_id', '')."|".$user->company()->company_key)) + if(\Illuminate\Support\Facades\Cache::has($this->ip()."|".$this->input('amount', 0)."|".$this->input('client_id', '')."|".$user->company()->company_key)) { throw new DuplicatePaymentException('Duplicate request.', 429); + } \Illuminate\Support\Facades\Cache::put(($this->ip()."|".$this->input('amount', 0)."|".$this->input('client_id', '')."|".$user->company()->company_key), true, 1); - + $input = $this->all(); $invoices_total = 0; diff --git a/app/Http/Requests/Payments/PaymentWebhookRequest.php b/app/Http/Requests/Payments/PaymentWebhookRequest.php index 765f681f508f..0769dcc6ae5d 100644 --- a/app/Http/Requests/Payments/PaymentWebhookRequest.php +++ b/app/Http/Requests/Payments/PaymentWebhookRequest.php @@ -74,7 +74,7 @@ class PaymentWebhookRequest extends Request public function getCompany(): ?Company { MultiDB::findAndSetDbByCompanyKey($this->company_key); - + /** @var \App\Models\Company */ return Company::where('company_key', $this->company_key)->firstOrFail(); } diff --git a/app/Http/Requests/Preview/PreviewInvoiceRequest.php b/app/Http/Requests/Preview/PreviewInvoiceRequest.php index 4a8d82e57b15..e710790004b2 100644 --- a/app/Http/Requests/Preview/PreviewInvoiceRequest.php +++ b/app/Http/Requests/Preview/PreviewInvoiceRequest.php @@ -88,7 +88,7 @@ class PreviewInvoiceRequest extends Request public function resolveInvitation() { $invitation = false; - + /** @phpstan-ignore-next-line */ if(! $this->entity_id ?? false) { return $this->stubInvitation(); diff --git a/app/Http/Requests/Project/StoreProjectRequest.php b/app/Http/Requests/Project/StoreProjectRequest.php index 84010aaffe33..88d3c7749672 100644 --- a/app/Http/Requests/Project/StoreProjectRequest.php +++ b/app/Http/Requests/Project/StoreProjectRequest.php @@ -46,7 +46,7 @@ class StoreProjectRequest extends Request $rules['client_id'] = 'required|exists:clients,id,company_id,'.$user->company()->id; $rules['budgeted_hours'] = 'sometimes|numeric'; $rules['task_rate'] = 'required|bail|numeric'; - + if (isset($this->number)) { $rules['number'] = Rule::unique('projects')->where('company_id', $user->company()->id); } @@ -81,7 +81,7 @@ class StoreProjectRequest extends Request } $input['task_rate'] = (isset($input['task_rate']) && floatval($input['task_rate']) >= 0) ? $input['task_rate'] : 0; - + $this->replace($input); } diff --git a/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php b/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php index 6e2387ce79ae..27e6b1b8c7ad 100644 --- a/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php +++ b/app/Http/Requests/PurchaseOrder/StorePurchaseOrderRequest.php @@ -50,7 +50,7 @@ class StorePurchaseOrderRequest extends Request $rules['number'] = ['nullable', Rule::unique('purchase_orders')->where('company_id', $user->company()->id)]; - + $rules['invitations'] = 'sometimes|bail|array'; $rules['invitations.*.vendor_contact_id'] = 'bail|required|distinct'; diff --git a/app/Http/Requests/Quickbooks/AuthQuickbooksRequest.php b/app/Http/Requests/Quickbooks/AuthQuickbooksRequest.php index 9e462ce6e319..c7fb58c277f9 100644 --- a/app/Http/Requests/Quickbooks/AuthQuickbooksRequest.php +++ b/app/Http/Requests/Quickbooks/AuthQuickbooksRequest.php @@ -64,6 +64,6 @@ class AuthQuickbooksRequest extends FormRequest public function getCompany(): ?Company { - return Company::where('company_key', $this->getTokenContent()['company_key'])->firstOrFail(); + return Company::query()->where('company_key', $this->getTokenContent()['company_key'])->firstOrFail(); } } diff --git a/app/Http/Requests/Quickbooks/AuthorizedQuickbooksRequest.php b/app/Http/Requests/Quickbooks/AuthorizedQuickbooksRequest.php index b7b2f3f5584e..39e615fef5a2 100644 --- a/app/Http/Requests/Quickbooks/AuthorizedQuickbooksRequest.php +++ b/app/Http/Requests/Quickbooks/AuthorizedQuickbooksRequest.php @@ -37,8 +37,8 @@ class AuthorizedQuickbooksRequest extends FormRequest public function rules(): array { return [ - 'code' => 'required|string', - 'state' => 'required|string', + 'code' => 'required|string', + 'state' => 'required|string', 'realmId' => 'required|string', ]; } diff --git a/app/Http/Requests/Quote/StoreQuoteRequest.php b/app/Http/Requests/Quote/StoreQuoteRequest.php index afb6226cfe62..47264fc28d10 100644 --- a/app/Http/Requests/Quote/StoreQuoteRequest.php +++ b/app/Http/Requests/Quote/StoreQuoteRequest.php @@ -44,7 +44,7 @@ class StoreQuoteRequest extends Request $rules = []; - $rules['client_id'] = ['required', 'bail', Rule::exists('clients', 'id')->where('company_id', $user->company()->id)->where('is_deleted',0)]; + $rules['client_id'] = ['required', 'bail', Rule::exists('clients', 'id')->where('company_id', $user->company()->id)->where('is_deleted', 0)]; if ($this->file('documents') && is_array($this->file('documents'))) { $rules['documents.*'] = $this->fileValidation(); @@ -61,7 +61,7 @@ class StoreQuoteRequest extends Request } $rules['number'] = ['bail','nullable', Rule::unique('quotes')->where('company_id', $user->company()->id)]; - + $rules['invitations'] = 'sometimes|bail|array'; $rules['invitations.*.client_contact_id'] = 'bail|required|distinct'; diff --git a/app/Http/Requests/Quote/UpdateQuoteRequest.php b/app/Http/Requests/Quote/UpdateQuoteRequest.php index 1f5e795dedcf..4e60ea0c4e6d 100644 --- a/app/Http/Requests/Quote/UpdateQuoteRequest.php +++ b/app/Http/Requests/Quote/UpdateQuoteRequest.php @@ -55,7 +55,7 @@ class UpdateQuoteRequest extends Request } elseif ($this->file('file')) { $rules['file'] = $this->fileValidation(); } - + $rules['invitations'] = 'sometimes|bail|array'; $rules['invitations.*.client_contact_id'] = 'bail|required|distinct'; diff --git a/app/Http/Requests/RecurringExpense/BulkRecurringExpenseRequest.php b/app/Http/Requests/RecurringExpense/BulkRecurringExpenseRequest.php index 2c2cdc9e7d0e..f6697edc50f2 100644 --- a/app/Http/Requests/RecurringExpense/BulkRecurringExpenseRequest.php +++ b/app/Http/Requests/RecurringExpense/BulkRecurringExpenseRequest.php @@ -36,7 +36,7 @@ class BulkRecurringExpenseRequest extends Request /** @var \App\Models\User $user */ $user = auth()->user(); - + return $user->can('edit', RecurringExpense::class); } diff --git a/app/Http/Requests/Report/GenericReportRequest.php b/app/Http/Requests/Report/GenericReportRequest.php index 085de868efb3..8e7c658c4a2d 100644 --- a/app/Http/Requests/Report/GenericReportRequest.php +++ b/app/Http/Requests/Report/GenericReportRequest.php @@ -17,7 +17,6 @@ use Illuminate\Auth\Access\AuthorizationException; class GenericReportRequest extends Request { - /** * Determine if the user is authorized to make this request. * diff --git a/app/Http/Requests/Shop/StoreShopClientRequest.php b/app/Http/Requests/Shop/StoreShopClientRequest.php index 3dc6e78d3cbf..54a54fa88b7d 100644 --- a/app/Http/Requests/Shop/StoreShopClientRequest.php +++ b/app/Http/Requests/Shop/StoreShopClientRequest.php @@ -155,7 +155,7 @@ class StoreShopClientRequest extends Request private function getCountryCode($country_code) { - + /** @var \Illuminate\Support\Collection<\App\Models\Country> */ $countries = app('countries'); @@ -168,7 +168,7 @@ class StoreShopClientRequest extends Request private function getCurrencyCode($code) { - + /** @var \Illuminate\Support\Collection<\App\Models\Country> */ $currencies = app('currencies'); diff --git a/app/Http/Requests/Task/UpdateTaskRequest.php b/app/Http/Requests/Task/UpdateTaskRequest.php index 7e9752d29c20..af55eea0b1f1 100644 --- a/app/Http/Requests/Task/UpdateTaskRequest.php +++ b/app/Http/Requests/Task/UpdateTaskRequest.php @@ -67,7 +67,7 @@ class UpdateTaskRequest extends Request if(is_string($values)) { $values = json_decode($values, true); } - + if(!is_array($values)) { $fail('The '.$attribute.' must be a valid array.'); return; diff --git a/app/Http/Requests/User/DisconnectUserMailerRequest.php b/app/Http/Requests/User/DisconnectUserMailerRequest.php index b1c805176eee..9f5354367e15 100644 --- a/app/Http/Requests/User/DisconnectUserMailerRequest.php +++ b/app/Http/Requests/User/DisconnectUserMailerRequest.php @@ -15,7 +15,6 @@ use App\Http\Requests\Request; class DisconnectUserMailerRequest extends Request { - /** * Determine if the user is authorized to make this request. * diff --git a/app/Http/Requests/User/UpdateUserRequest.php b/app/Http/Requests/User/UpdateUserRequest.php index c95765e9c4ac..f4e6d8d029d7 100644 --- a/app/Http/Requests/User/UpdateUserRequest.php +++ b/app/Http/Requests/User/UpdateUserRequest.php @@ -77,11 +77,10 @@ class UpdateUserRequest extends Request unset($input['oauth_user_token']); } - if(isset($input['password']) && is_string($input['password'])) - { + if(isset($input['password']) && is_string($input['password'])) { $input['password'] = trim($input['password']); } - + $this->replace($input); } } diff --git a/app/Http/ValidationRules/EInvoice/ValidClientScheme.php b/app/Http/ValidationRules/EInvoice/ValidClientScheme.php index f21582559e4b..503125e1d8f1 100644 --- a/app/Http/ValidationRules/EInvoice/ValidClientScheme.php +++ b/app/Http/ValidationRules/EInvoice/ValidClientScheme.php @@ -34,8 +34,7 @@ class ValidClientScheme implements ValidationRule, ValidatorAwareRule public function validate(string $attribute, mixed $value, Closure $fail): void { - if(isset($value['Invoice'])) - { + if(isset($value['Invoice'])) { $r = new EInvoice(); $errors = $r->validateRequest($value['Invoice'], ClientLevel::class); diff --git a/app/Http/ValidationRules/EInvoice/ValidCompanyScheme.php b/app/Http/ValidationRules/EInvoice/ValidCompanyScheme.php index 6c3975d11c3e..7af375d669dc 100644 --- a/app/Http/ValidationRules/EInvoice/ValidCompanyScheme.php +++ b/app/Http/ValidationRules/EInvoice/ValidCompanyScheme.php @@ -24,7 +24,6 @@ use Illuminate\Contracts\Validation\ValidatorAwareRule; */ class ValidCompanyScheme implements ValidationRule, ValidatorAwareRule { - /** * The validator instance. * @@ -35,11 +34,10 @@ class ValidCompanyScheme implements ValidationRule, ValidatorAwareRule public function validate(string $attribute, mixed $value, Closure $fail): void { - if(isset($value['Invoice'])) - { + if(isset($value['Invoice'])) { $r = new EInvoice(); $errors = $r->validateRequest($value['Invoice'], CompanyLevel::class); - + foreach ($errors as $key => $msg) { $this->validator->errors()->add( @@ -49,16 +47,16 @@ class ValidCompanyScheme implements ValidationRule, ValidatorAwareRule } } - + } - + /** * Set the current validator. */ public function setValidator(Validator $validator): static { $this->validator = $validator; - + return $this; } diff --git a/app/Http/ValidationRules/Payment/ValidInvoicesRules.php b/app/Http/ValidationRules/Payment/ValidInvoicesRules.php index 043a2419efbb..c174b276be05 100644 --- a/app/Http/ValidationRules/Payment/ValidInvoicesRules.php +++ b/app/Http/ValidationRules/Payment/ValidInvoicesRules.php @@ -89,7 +89,7 @@ class ValidInvoicesRules implements Rule } elseif (floatval($invoice['amount']) > floatval($inv->balance)) { $this->error_msg = ctrans('texts.amount_greater_than_balance_v5'); return false; - } elseif($inv->is_deleted){ + } elseif($inv->is_deleted) { $this->error_msg = 'One or more invoices in this request have since been deleted'; return false; } diff --git a/app/Http/ViewComposers/Components/Rotessa/AccountComponent.php b/app/Http/ViewComposers/Components/Rotessa/AccountComponent.php index 61b7538c8cf0..883b7f584c0c 100644 --- a/app/Http/ViewComposers/Components/Rotessa/AccountComponent.php +++ b/app/Http/ViewComposers/Components/Rotessa/AccountComponent.php @@ -42,10 +42,11 @@ class AccountComponent extends Component "authorization_type" => 'Online' ]; - public function __construct(public array $account) { - $this->attributes = $this->newAttributeBag(Arr::only($this->account, $this->fields) ); + public function __construct(public array $account) + { + $this->attributes = $this->newAttributeBag(Arr::only($this->account, $this->fields)); } - + public function render() { diff --git a/app/Http/ViewComposers/Components/Rotessa/AddressComponent.php b/app/Http/ViewComposers/Components/Rotessa/AddressComponent.php index e7bd28d72999..5923217b2ea1 100644 --- a/app/Http/ViewComposers/Components/Rotessa/AddressComponent.php +++ b/app/Http/ViewComposers/Components/Rotessa/AddressComponent.php @@ -34,21 +34,25 @@ class AddressComponent extends Component 'country' => 'US' ]; - public function __construct(public array $address) { - if(strlen($this->address['state']) > 2 ) { - $this->address['state'] = $this->address['country'] == 'US' ? array_search($this->address['state'], USStates::$states) : CAProvinces::getAbbreviation($this->address['state']); + public function __construct(public array $address) + { + if(strlen($this->address['state']) > 2) { + $this->address['state'] = $this->address['country'] == 'US' ? array_search($this->address['state'], USStates::$states) : CAProvinces::getAbbreviation($this->address['state']); } $this->attributes = $this->newAttributeBag( - Arr::only(Arr::mapWithKeys($this->address, function ($item, $key) { - return in_array($key, ['address1','address2','state'])?[ (['address1'=>'address_1','address2'=>'address_2','state'=>'province_code'])[$key] => $item ] :[ $key => $item ]; - }), - $this->fields) ); + Arr::only( + Arr::mapWithKeys($this->address, function ($item, $key) { + return in_array($key, ['address1','address2','state']) ? [ (['address1' => 'address_1','address2' => 'address_2','state' => 'province_code'])[$key] => $item ] : [ $key => $item ]; + }), + $this->fields + ) + ); } - + public function render() { - return render('gateways.rotessa.components.address', $this->attributes->getAttributes() + $this->defaults ); + return render('gateways.rotessa.components.address', $this->attributes->getAttributes() + $this->defaults); } } diff --git a/app/Http/ViewComposers/Components/Rotessa/ContactComponent.php b/app/Http/ViewComposers/Components/Rotessa/ContactComponent.php index dcaff72ab283..463ef3285598 100644 --- a/app/Http/ViewComposers/Components/Rotessa/ContactComponent.php +++ b/app/Http/ViewComposers/Components/Rotessa/ContactComponent.php @@ -18,21 +18,20 @@ use App\Models\ClientContact; use Illuminate\Support\Arr; use Illuminate\View\View; - // Contact Component class ContactComponent extends Component { + public function __construct(ClientContact $contact) + { - public function __construct(ClientContact $contact) { - $contact = collect($contact->client->contacts->firstWhere('is_primary', 1)->toArray())->merge([ - 'home_phone' =>$contact->client->phone, + 'home_phone' => $contact->client->phone, 'custom_identifier' => $contact->client->client_hash, - 'name' =>$contact->client->name, + 'name' => $contact->client->name, 'id' => null, - ] )->all(); - - $this->attributes = $this->newAttributeBag(Arr::only($contact, $this->fields) ); + ])->all(); + + $this->attributes = $this->newAttributeBag(Arr::only($contact, $this->fields)); } private $fields = [ @@ -53,6 +52,6 @@ class ContactComponent extends Component public function render() { - return render('gateways.rotessa.components.contact', $this->attributes->getAttributes() + $this->defaults ); + return render('gateways.rotessa.components.contact', $this->attributes->getAttributes() + $this->defaults); } } diff --git a/app/Http/ViewComposers/PortalComposer.php b/app/Http/ViewComposers/PortalComposer.php index 9799260c5a17..ad7139418606 100644 --- a/app/Http/ViewComposers/PortalComposer.php +++ b/app/Http/ViewComposers/PortalComposer.php @@ -137,9 +137,9 @@ class PortalComposer $data[] = ['title' => ctrans('texts.statement'), 'url' => 'client.statement', 'icon' => 'activity']; // if (Ninja::isHosted() && auth()->guard('contact')->user()->company->id == config('ninja.ninja_default_company_id')) { - $data[] = ['title' => ctrans('texts.plan'), 'url' => 'client.plan', 'icon' => 'credit-card']; + $data[] = ['title' => ctrans('texts.plan'), 'url' => 'client.plan', 'icon' => 'credit-card']; // } else { - $data[] = ['title' => ctrans('texts.subscriptions'), 'url' => 'client.subscriptions.index', 'icon' => 'calendar']; + $data[] = ['title' => ctrans('texts.subscriptions'), 'url' => 'client.subscriptions.index', 'icon' => 'calendar']; // } if (auth()->guard('contact')->user()->client->getSetting('client_initiated_payments')) { diff --git a/app/Http/ViewComposers/RotessaComposer.php b/app/Http/ViewComposers/RotessaComposer.php index 6fea87852442..a8cdff368163 100644 --- a/app/Http/ViewComposers/RotessaComposer.php +++ b/app/Http/ViewComposers/RotessaComposer.php @@ -21,4 +21,4 @@ View::composer(['*.rotessa.components.address','*.rotessa.components.banks.US.ba View::composer(['*.rotessa.components.address','*.rotessa.components.banks.CA.bank','*.rotessa.components.dropdowns.country.CA'], function ($view) { $provinces = CAProvinces::get(); $view->with('provinces', $provinces); -}); \ No newline at end of file +}); diff --git a/app/Import/Providers/BaseImport.php b/app/Import/Providers/BaseImport.php index fef3ccdd269f..483993951309 100644 --- a/app/Import/Providers/BaseImport.php +++ b/app/Import/Providers/BaseImport.php @@ -105,7 +105,7 @@ class BaseImport } nlog("found {$entity_type}"); - + $csv = base64_decode($base64_encoded_csv); $csv = mb_convert_encoding($csv, 'UTF-8', 'UTF-8'); @@ -474,7 +474,7 @@ class BaseImport $tasks = $this->groupTasks($tasks, $task_number_key); nlog($tasks); - + foreach ($tasks as $raw_task) { $task_data = []; @@ -706,8 +706,8 @@ class BaseImport if ($invoice->status_id == Invoice::STATUS_DRAFT) { return $invoice; - } - + } + $invoice = $invoice ->service() ->markSent() diff --git a/app/Import/Providers/Quickbooks.php b/app/Import/Providers/Quickbooks.php index 5bd968443b5c..6dd7d5784b3f 100644 --- a/app/Import/Providers/Quickbooks.php +++ b/app/Import/Providers/Quickbooks.php @@ -12,23 +12,24 @@ namespace App\Import\Providers; use App\Models\Invoice; -use App\Factory\ProductFactory; use App\Factory\ClientFactory; use App\Factory\InvoiceFactory; use App\Factory\PaymentFactory; +use App\Factory\ProductFactory; +use App\Import\ImportException; use Illuminate\Support\Facades\Cache; use App\Repositories\ClientRepository; use App\Repositories\InvoiceRepository; -use App\Repositories\ProductRepository; use App\Repositories\PaymentRepository; +use App\Repositories\ProductRepository; use App\Http\Requests\Client\StoreClientRequest; -use App\Http\Requests\Product\StoreProductRequest; use App\Http\Requests\Invoice\StoreInvoiceRequest; use App\Http\Requests\Payment\StorePaymentRequest; +use App\Http\Requests\Product\StoreProductRequest; use App\Import\Transformer\Quickbooks\ClientTransformer; use App\Import\Transformer\Quickbooks\InvoiceTransformer; -use App\Import\Transformer\Quickbooks\ProductTransformer; use App\Import\Transformer\Quickbooks\PaymentTransformer; +use App\Import\Transformer\Quickbooks\ProductTransformer; class Quickbooks extends BaseImport { @@ -72,7 +73,7 @@ class Quickbooks extends BaseImport $this->transformer = new ClientTransformer($this->company); $client_count = $this->ingest($data, $entity_type); $this->entity_count['clients'] = $client_count; - } + } public function product() { @@ -92,12 +93,13 @@ class Quickbooks extends BaseImport $this->transformer = new ProductTransformer($this->company); $count = $this->ingest($data, $entity_type); $this->entity_count['products'] = $count; - } + } - public function getData($type) { + public function getData($type) + { // get the data from cache? file? or api ? - return json_decode(base64_decode(Cache::get("{$this->hash}-$type")), 1); + return json_decode(base64_decode(Cache::get("{$this->hash}-{$type}")), true); } public function payment() @@ -122,7 +124,7 @@ class Quickbooks extends BaseImport public function invoice() { - //make sure we update and create products + //make sure we update and create products $initial_update_products_value = $this->company->update_products; $this->company->update_products = true; @@ -143,7 +145,7 @@ class Quickbooks extends BaseImport $this->repository = app()->make($this->repository_name); $this->repository->import_mode = true; $this->transformer = new InvoiceTransformer($this->company); - $invoice_count = $this->ingestInvoices($data,''); + $invoice_count = $this->ingestInvoices($data, ''); $this->entity_count['invoices'] = $invoice_count; $this->company->update_products = $initial_update_products_value; $this->company->save(); @@ -158,7 +160,7 @@ class Quickbooks extends BaseImport $client_repository->import_mode = true; $invoice_repository = new InvoiceRepository(); $invoice_repository->import_mode = true; - + foreach ($invoices as $raw_invoice) { if(!is_array($raw_invoice)) { continue; @@ -171,7 +173,7 @@ class Quickbooks extends BaseImport $invoice_data['line_items'] = $this->cleanItems( $invoice_data['line_items'] ?? [] ); - + if ( empty($invoice_data['client_id']) && ! empty($invoice_data['client']) @@ -189,7 +191,7 @@ class Quickbooks extends BaseImport ); $invoice_data['client_id'] = $client->id; unset($invoice_data['client']); - } + } $validator = $this->request_name::runFormRequest($invoice_data); if ($validator->fails()) { @@ -198,8 +200,7 @@ class Quickbooks extends BaseImport 'error' => $validator->errors()->all(), ]; } else { - if(!Invoice::where('number',$invoice_data['number'])->get()->first()) - { + if(!Invoice::where('number', $invoice_data['number'])->first()) { $invoice = InvoiceFactory::create( $this->company->id, $this->company->owner()->id @@ -208,16 +209,16 @@ class Quickbooks extends BaseImport if (! empty($invoice_data['status_id'])) { $invoice->status_id = $invoice_data['status_id']; } - + $saveable_invoice_data = $invoice_data; if(array_key_exists('payments', $saveable_invoice_data)) { unset($saveable_invoice_data['payments']); } - + $invoice->fill($saveable_invoice_data); $invoice->save(); $count++; - + } // $this->actionInvoiceStatus( // $invoice, @@ -245,7 +246,7 @@ class Quickbooks extends BaseImport ]; } } - + return $count; } diff --git a/app/Import/Providers/Wave.php b/app/Import/Providers/Wave.php index 1fbd58b0e0c0..ce936dd01a8a 100644 --- a/app/Import/Providers/Wave.php +++ b/app/Import/Providers/Wave.php @@ -244,8 +244,7 @@ class Wave extends BaseImport implements ImportInterface if (empty($expense_data['vendor_id'])) { $vendor_data['user_id'] = $this->getUserIDForRecord($expense_data); - if(isset($raw_expense['Vendor Name']) || isset($raw_expense['Vendor'])) - { + if(isset($raw_expense['Vendor Name']) || isset($raw_expense['Vendor'])) { $vendor_repository->save( ['name' => isset($raw_expense['Vendor Name']) ? $raw_expense['Vendor Name'] : isset($raw_expense['Vendor'])], $vendor = VendorFactory::create( diff --git a/app/Import/Transformer/BaseTransformer.php b/app/Import/Transformer/BaseTransformer.php index 2dc91e6c2f47..c75e377ff935 100644 --- a/app/Import/Transformer/BaseTransformer.php +++ b/app/Import/Transformer/BaseTransformer.php @@ -119,8 +119,9 @@ class BaseTransformer { $code = array_key_exists($key, $data) ? $data[$key] : false; - if(!$code) + if(!$code) { return $this->company->settings->currency_id; + } /** @var \Illuminate\Support\Collection<\App\Models\Currency> */ $currencies = app('currencies'); diff --git a/app/Import/Transformer/Quickbooks/ClientTransformer.php b/app/Import/Transformer/Quickbooks/ClientTransformer.php index 8cfbd94befe7..1a1d487652aa 100644 --- a/app/Import/Transformer/Quickbooks/ClientTransformer.php +++ b/app/Import/Transformer/Quickbooks/ClientTransformer.php @@ -24,7 +24,6 @@ use Illuminate\Support\Str; */ class ClientTransformer extends BaseTransformer { - use CommonTrait { transform as preTransform; } @@ -49,7 +48,7 @@ class ClientTransformer extends BaseTransformer { parent::__construct($company); - $this->model = new Model; + $this->model = new Model(); } @@ -68,12 +67,13 @@ class ClientTransformer extends BaseTransformer } $transformed_data = $this->preTransform($data); - $transformed_data['contacts'][0] = $this->getContacts($data)->toArray()+['company_id' => $this->company->id ]; - + $transformed_data['contacts'][0] = $this->getContacts($data)->toArray() + ['company_id' => $this->company->id ]; + return $transformed_data; } - protected function getContacts($data) { + protected function getContacts($data) + { return (new ClientContact())->fill([ 'first_name' => $this->getString($data, 'GivenName'), 'last_name' => $this->getString($data, 'FamilyName'), @@ -84,12 +84,14 @@ class ClientTransformer extends BaseTransformer } - public function getShipAddrCountry($data,$field) { - return is_null(($c = $this->getString($data,$field))) ? null : $this->getCountryId($c); + public function getShipAddrCountry($data, $field) + { + return is_null(($c = $this->getString($data, $field))) ? null : $this->getCountryId($c); } - public function getBillAddrCountry($data,$field) { - return is_null(($c = $this->getString($data,$field))) ? null : $this->getCountryId($c); + public function getBillAddrCountry($data, $field) + { + return is_null(($c = $this->getString($data, $field))) ? null : $this->getCountryId($c); } } diff --git a/app/Import/Transformer/Quickbooks/CommonTrait.php b/app/Import/Transformer/Quickbooks/CommonTrait.php index d618f94120ed..19bcaccadca2 100644 --- a/app/Import/Transformer/Quickbooks/CommonTrait.php +++ b/app/Import/Transformer/Quickbooks/CommonTrait.php @@ -8,8 +8,9 @@ trait CommonTrait { protected $model; - public function getString($data,$field) { - return Arr::get($data,$field); + public function getString($data, $field) + { + return Arr::get($data, $field); } public function getCreateTime($data, $field = null) @@ -19,7 +20,7 @@ trait CommonTrait public function getLastUpdatedTime($data, $field = null) { - return $this->parseDateOrNull($data,'MetaData.LastUpdatedTime'); + return $this->parseDateOrNull($data, 'MetaData.LastUpdatedTime'); } public function transform($data) @@ -27,10 +28,10 @@ trait CommonTrait $transformed = []; foreach ($this->fillable as $key => $field) { - $transformed[$key] = is_null((($v = $this->getString($data, $field))))? null : (method_exists($this, ($method = "get{$field}")) ? call_user_func([$this, $method], $data, $field ) : $this->getString($data,$field)); + $transformed[$key] = is_null((($v = $this->getString($data, $field)))) ? null : (method_exists($this, ($method = "get{$field}")) ? call_user_func([$this, $method], $data, $field) : $this->getString($data, $field)); } return $this->model->fillable(array_keys($this->fillable))->fill($transformed)->toArray() + ['company_id' => $this->company->id ] ; } -} \ No newline at end of file +} diff --git a/app/Import/Transformer/Quickbooks/InvoiceTransformer.php b/app/Import/Transformer/Quickbooks/InvoiceTransformer.php index fe2f998c1c4a..a4f2f564595a 100644 --- a/app/Import/Transformer/Quickbooks/InvoiceTransformer.php +++ b/app/Import/Transformer/Quickbooks/InvoiceTransformer.php @@ -11,10 +11,11 @@ namespace App\Import\Transformer\Quickbooks; -use Illuminate\Support\Str; +use App\Models\Invoice; use Illuminate\Support\Arr; -use App\Import\ImportException; +use Illuminate\Support\Str; use App\DataMapper\InvoiceItem; +use App\Import\ImportException; use App\Models\Invoice as Model; use App\Import\Transformer\BaseTransformer; use App\Import\Transformer\Quickbooks\CommonTrait; @@ -48,7 +49,7 @@ class InvoiceTransformer extends BaseTransformer { parent::__construct($company); - $this->model = new Model; + $this->model = new Model(); } public function getInvoiceStatus($data) @@ -58,33 +59,34 @@ class InvoiceTransformer extends BaseTransformer public function transform($data) { - return $this->preTransform($data) + $this->getInvoiceClient($data); + return $this->preTransform($data) + $this->getInvoiceClient($data); } public function getTotalAmt($data) { - return (float) $this->getString($data,'TotalAmt'); + return (float) $this->getString($data, 'TotalAmt'); } public function getLine($data) { return array_map(function ($item) { return [ - 'description' => $this->getString($item,'Description'), - 'product_key' => $this->getString($item,'Description'), - 'quantity' => (int) $this->getString($item,'SalesItemLineDetail.Qty'), - 'unit_price' =>(double) $this->getString($item,'SalesItemLineDetail.UnitPrice'), - 'line_total' => (double) $this->getString($item,'Amount'), - 'cost' =>(double) $this->getString($item,'SalesItemLineDetail.UnitPrice'), - 'product_cost' => (double) $this->getString($item,'SalesItemLineDetail.UnitPrice'), - 'tax_amount' => (double) $this->getString($item,'TxnTaxDetail.TotalTax'), + 'description' => $this->getString($item, 'Description'), + 'product_key' => $this->getString($item, 'Description'), + 'quantity' => (int) $this->getString($item, 'SalesItemLineDetail.Qty'), + 'unit_price' => (float) $this->getString($item, 'SalesItemLineDetail.UnitPrice'), + 'line_total' => (float) $this->getString($item, 'Amount'), + 'cost' => (float) $this->getString($item, 'SalesItemLineDetail.UnitPrice'), + 'product_cost' => (float) $this->getString($item, 'SalesItemLineDetail.UnitPrice'), + 'tax_amount' => (float) $this->getString($item, 'TxnTaxDetail.TotalTax'), ]; - }, array_filter($this->getString($data,'Line'), function ($item) { - return $this->getString($item,'DetailType') !== 'SubTotalLineDetail'; + }, array_filter($this->getString($data, 'Line'), function ($item) { + return $this->getString($item, 'DetailType') !== 'SubTotalLineDetail'; })); } - public function getInvoiceClient($data, $field = null) { + public function getInvoiceClient($data, $field = null) + { /** * "CustomerRef": { "value": "23", @@ -135,23 +137,22 @@ class InvoiceTransformer extends BaseTransformer $customer = explode(" ", $this->getString($data, 'CustomerRef.name')); $customer = ['GivenName' => $customer[0], 'FamilyName' => $customer[1]]; $has_company = property_exists($bill_address, 'Line4'); - $address = $has_company? $bill_address->Line4 : $bill_address->Line3; - $address_1 = substr($address, 0, stripos($address,',')); - $address =array_filter( [$address_1] + (explode(' ', substr($address, stripos($address,",") + 1 )))); + $address = $has_company ? $bill_address->Line4 : $bill_address->Line3; + $address_1 = substr($address, 0, stripos($address, ',')); + $address = array_filter([$address_1] + (explode(' ', substr($address, stripos($address, ",") + 1)))); $client_id = null; - $client = + $client = [ - "CompanyName" => $has_company? $bill_address->Line2 : $bill_address->Line1, - "BillAddr" => array_combine(['City','CountrySubDivisionCode','PostalCode'], array_pad($address,3,'N/A') ) + ['Line1' => $has_company? $bill_address->Line3 : $bill_address->Line2 ], + "CompanyName" => $has_company ? $bill_address->Line2 : $bill_address->Line1, + "BillAddr" => array_combine(['City','CountrySubDivisionCode','PostalCode'], array_pad($address, 3, 'N/A')) + ['Line1' => $has_company ? $bill_address->Line3 : $bill_address->Line2 ], "ShipAddr" => $ship_address ] + $customer + ['PrimaryEmailAddr' => ['Address' => $this->getString($data, 'BillEmail.Address') ]]; - if($this->hasClient($client['CompanyName'])) - { - $client_id = $this->getClient($client['CompanyName'],$this->getString($client, 'PrimaryEmailAddr.Address')); + if($this->hasClient($client['CompanyName'])) { + $client_id = $this->getClient($client['CompanyName'], $this->getString($client, 'PrimaryEmailAddr.Address')); } - - - return ['client'=> (new ClientTransformer($this->company))->transform($client), 'client_id'=> $client_id ]; + + + return ['client' => (new ClientTransformer($this->company))->transform($client), 'client_id' => $client_id ]; } public function getDueDate($data) @@ -161,36 +162,39 @@ class InvoiceTransformer extends BaseTransformer public function getDeposit($data) { - return (double) $this->getString($data,'Deposit'); + return (float) $this->getString($data, 'Deposit'); } public function getBalance($data) { - return (double) $this->getString($data,'Balance'); + return (float) $this->getString($data, 'Balance'); } public function getCustomerMemo($data) { - return $this->getString($data,'CustomerMemo.value'); + return $this->getString($data, 'CustomerMemo.value'); } - public function getDocNumber($data, $field = null) + public function getDocNumber($data, $field = null) { - return sprintf("%s-%s", - $this->getString($data, 'DocNumber'), - $this->getString($data, 'Id.value') - ); + return sprintf( + "%s-%s", + $this->getString($data, 'DocNumber'), + $this->getString($data, 'Id.value') + ); } public function getLinkedTxn($data) { - $payments = $this->getString($data,'LinkedTxn'); - if(empty($payments)) return []; + $payments = $this->getString($data, 'LinkedTxn'); + if(empty($payments)) { + return []; + } - return [[ - 'amount' => $this->getTotalAmt($data), - 'date' => $this->parseDateOrNull($data, 'TxnDate') - ]]; + return [[ + 'amount' => $this->getTotalAmt($data), + 'date' => $this->parseDateOrNull($data, 'TxnDate') + ]]; } } diff --git a/app/Import/Transformer/Quickbooks/PaymentTransformer.php b/app/Import/Transformer/Quickbooks/PaymentTransformer.php index 5156d0fa61d0..c23ce0e242b3 100644 --- a/app/Import/Transformer/Quickbooks/PaymentTransformer.php +++ b/app/Import/Transformer/Quickbooks/PaymentTransformer.php @@ -21,7 +21,7 @@ use Illuminate\Support\Arr; use App\Models\Invoice; /** - * + * * Class PaymentTransformer. */ class PaymentTransformer extends BaseTransformer @@ -44,10 +44,11 @@ class PaymentTransformer extends BaseTransformer { parent::__construct($company); - $this->model = new Model; + $this->model = new Model(); } - public function getTotalAmt($data, $field = null) { + public function getTotalAmt($data, $field = null) + { return (float) $this->getString($data, $field); } @@ -56,12 +57,12 @@ class PaymentTransformer extends BaseTransformer return $this->parseDateOrNull($data, $field); } - public function getCustomerRef($data, $field = null ) + public function getCustomerRef($data, $field = null) { - return $this->getClient($this->getString($data, 'CustomerRef.name'),null); + return $this->getClient($this->getString($data, 'CustomerRef.name'), null); } - public function getCurrencyRef($data, $field = null) + public function getCurrencyRef($data, $field = null) { return $this->getCurrencyByCode($data['CurrencyRef'], 'value'); } @@ -69,26 +70,32 @@ class PaymentTransformer extends BaseTransformer public function getLine($data, $field = null) { $invoices = []; - $invoice = $this->getString($data,'Line.LinkedTxn.TxnType'); - if(is_null($invoice) || $invoice !== 'Invoice') return $invoices; - if( is_null( ($invoice_id = $this->getInvoiceId($this->getString($data, 'Line.LinkedTxn.TxnId.value')))) ) return $invoices; - + $invoice = $this->getString($data, 'Line.LinkedTxn.TxnType'); + if(is_null($invoice) || $invoice !== 'Invoice') { + return $invoices; + } + if(is_null(($invoice_id = $this->getInvoiceId($this->getString($data, 'Line.LinkedTxn.TxnId.value'))))) { + return $invoices; + } + return [[ 'amount' => (float) $this->getString($data, 'Line.Amount'), 'invoice_id' => $invoice_id ]]; } - /** - * @param $invoice_number - * - * @return int|null - */ + /** + * @param $invoice_number + * + * @return int|null + */ public function getInvoiceId($invoice_number) { $invoice = Invoice::query()->where('company_id', $this->company->id) ->where('is_deleted', false) - ->where("number", "LIKE", + ->where( + "number", + "LIKE", "%-$invoice_number%", ) ->first(); diff --git a/app/Import/Transformer/Quickbooks/ProductTransformer.php b/app/Import/Transformer/Quickbooks/ProductTransformer.php index af7b9342ab91..f66dbd236cf2 100644 --- a/app/Import/Transformer/Quickbooks/ProductTransformer.php +++ b/app/Import/Transformer/Quickbooks/ProductTransformer.php @@ -22,9 +22,8 @@ use App\Import\ImportException; */ class ProductTransformer extends BaseTransformer { - use CommonTrait; - + protected $fillable = [ 'product_key' => 'Name', 'notes' => 'Description', @@ -41,19 +40,22 @@ class ProductTransformer extends BaseTransformer { parent::__construct($company); - $this->model = new Model; + $this->model = new Model(); } - public function getQtyOnHand($data, $field = null) { + public function getQtyOnHand($data, $field = null) + { return (int) $this->getString($data, $field); } - public function getPurchaseCost($data, $field = null) { - return (double) $this->getString($data, $field); + public function getPurchaseCost($data, $field = null) + { + return (float) $this->getString($data, $field); } - public function getUnitPrice($data, $field = null) { + public function getUnitPrice($data, $field = null) + { return (float) $this->getString($data, $field); } } diff --git a/app/Import/Transformer/Wave/ExpenseTransformer.php b/app/Import/Transformer/Wave/ExpenseTransformer.php index afd282b80d63..9bfa34c0b466 100644 --- a/app/Import/Transformer/Wave/ExpenseTransformer.php +++ b/app/Import/Transformer/Wave/ExpenseTransformer.php @@ -38,13 +38,14 @@ class ExpenseTransformer extends BaseTransformer $tax_rate = $total_tax > 0 ? round(($total_tax / $amount) * 100, 3) : 0; - if(isset($data['Notes / Memo']) && strlen($data['Notes / Memo']) > 1) + if(isset($data['Notes / Memo']) && strlen($data['Notes / Memo']) > 1) { $public_notes = $data['Notes / Memo']; - elseif (isset($data['Transaction Description']) && strlen($data['Transaction Description']) > 1) + } elseif (isset($data['Transaction Description']) && strlen($data['Transaction Description']) > 1) { $public_notes = $data['Transaction Description']; - else + } else { $public_notes = ''; - + } + $transformed = [ 'company_id' => $this->company->id, diff --git a/app/Jobs/Bank/MatchBankTransactions.php b/app/Jobs/Bank/MatchBankTransactions.php index 326d9952583d..d886846a8c32 100644 --- a/app/Jobs/Bank/MatchBankTransactions.php +++ b/app/Jobs/Bank/MatchBankTransactions.php @@ -237,7 +237,7 @@ class MatchBankTransactions implements ShouldQueue $amount = $this->bt->amount; - if ($_invoices->count() >0 && $this->checkPayable($_invoices)) { + if ($_invoices->count() > 0 && $this->checkPayable($_invoices)) { $this->createPayment($_invoices, $amount); $this->bts->push($this->bt->id); @@ -387,7 +387,7 @@ class MatchBankTransactions implements ShouldQueue $hashed_keys = []; - foreach($this->attachable_invoices as $attachable_invoice){ //@phpstan-ignore-line + foreach($this->attachable_invoices as $attachable_invoice) { //@phpstan-ignore-line $hashed_keys[] = $this->encodePrimaryKey($attachable_invoice['id']); } diff --git a/app/Jobs/Brevo/ProcessBrevoWebhook.php b/app/Jobs/Brevo/ProcessBrevoWebhook.php index b81772fd2c0a..2c5c0f2b2d5f 100644 --- a/app/Jobs/Brevo/ProcessBrevoWebhook.php +++ b/app/Jobs/Brevo/ProcessBrevoWebhook.php @@ -55,7 +55,7 @@ class ProcessBrevoWebhook implements ShouldQueue 'events' => [], ]; - + /** @var ?\App\Models\Company $company*/ private ?Company $company = null; diff --git a/app/Jobs/Client/UpdateTaxData.php b/app/Jobs/Client/UpdateTaxData.php index 8a637f8b9bb6..4801b71e1bb1 100644 --- a/app/Jobs/Client/UpdateTaxData.php +++ b/app/Jobs/Client/UpdateTaxData.php @@ -69,7 +69,7 @@ class UpdateTaxData implements ShouldQueue } - } catch(\Exception $e) { + } catch(\Exception $e) { nlog("Exception:: UpdateTaxData::" . $e->getMessage()); nlog("problem getting tax data => ".$e->getMessage()); } diff --git a/app/Jobs/Company/CompanyExport.php b/app/Jobs/Company/CompanyExport.php index 9cc901cdf240..07252140decd 100644 --- a/app/Jobs/Company/CompanyExport.php +++ b/app/Jobs/Company/CompanyExport.php @@ -468,7 +468,7 @@ class CompanyExport implements ShouldQueue $x->addItems($this->export_data['subscriptions']); $this->export_data = null; - + $this->export_data['system_logs'] = $this->company->system_logs->map(function ($log) { $log->client_id = $this->encodePrimaryKey($log->client_id);/** @phpstan-ignore-line */ $log->company_id = $this->encodePrimaryKey($log->company_id);/** @phpstan-ignore-line */ diff --git a/app/Jobs/Company/CompanyImport.php b/app/Jobs/Company/CompanyImport.php index 9108998985c3..ef436ab0e764 100644 --- a/app/Jobs/Company/CompanyImport.php +++ b/app/Jobs/Company/CompanyImport.php @@ -1407,10 +1407,10 @@ class CompanyImport implements ShouldQueue switch ($type) { case 'invoices': return $this->transformId('invoices', $id); - + case Credit::class: return $this->transformId('credits', $id); - + case Payment::class: return $this->transformId('payments', $id); default: diff --git a/app/Jobs/Cron/RecurringExpensesCron.php b/app/Jobs/Cron/RecurringExpensesCron.php index e996afac35b9..04d649966be3 100644 --- a/app/Jobs/Cron/RecurringExpensesCron.php +++ b/app/Jobs/Cron/RecurringExpensesCron.php @@ -114,8 +114,7 @@ class RecurringExpensesCron $exchange_rate = new CurrencyApi(); $expense->exchange_rate = $exchange_rate->exchangeRate($expense->currency_id, (int)$expense->company->settings->currency_id, Carbon::parse($expense->date)); - } - else { + } else { $expense->exchange_rate = 1; } diff --git a/app/Jobs/Cron/SubscriptionCron.php b/app/Jobs/Cron/SubscriptionCron.php index b3ddbb3e7e32..43dcb60a07d2 100644 --- a/app/Jobs/Cron/SubscriptionCron.php +++ b/app/Jobs/Cron/SubscriptionCron.php @@ -65,7 +65,7 @@ class SubscriptionCron //Requires the crons to be updated and set to hourly @ 00:01 private function timezoneAware() { - + Invoice::query() ->with('company') ->where('is_deleted', 0) diff --git a/app/Jobs/EDocument/ImportEDocument.php b/app/Jobs/EDocument/ImportEDocument.php index e92860faf81c..aacc9b7f35ca 100644 --- a/app/Jobs/EDocument/ImportEDocument.php +++ b/app/Jobs/EDocument/ImportEDocument.php @@ -43,7 +43,7 @@ class ImportEDocument implements ShouldQueue */ public function handle(): Expense { - + switch (true) { case stristr($this->file_content, "urn:cen.eu:en16931:2017"): case stristr($this->file_content, "urn:cen.eu:en16931:2017#compliant#urn:xeinkauf.de:kosit:xrechnung_3.0"): diff --git a/app/Jobs/Entity/CreateRawPdf.php b/app/Jobs/Entity/CreateRawPdf.php index 4d52e4319758..c5c777ae4101 100644 --- a/app/Jobs/Entity/CreateRawPdf.php +++ b/app/Jobs/Entity/CreateRawPdf.php @@ -118,7 +118,7 @@ class CreateRawPdf if ($this->entity_string == "invoice" && $this->entity->client->getSetting("merge_e_invoice_to_pdf")) { $pdf = (new MergeEDocument($this->entity, $pdf))->handle(); - } + } $merge_docs = isset($this->entity->client) ? $this->entity->client->getSetting('embed_documents') : $this->company->getSetting('embed_documents'); diff --git a/app/Jobs/Import/QuickbooksIngest.php b/app/Jobs/Import/QuickbooksIngest.php index e240623bf9ac..b32db16f0eeb 100644 --- a/app/Jobs/Import/QuickbooksIngest.php +++ b/app/Jobs/Import/QuickbooksIngest.php @@ -12,7 +12,10 @@ use Illuminate\Foundation\Bus\Dispatchable; class QuickbooksIngest implements ShouldQueue { - use Dispatchable, InteractsWithQueue, Queueable, SerializesModels; + use Dispatchable; + use InteractsWithQueue; + use Queueable; + use SerializesModels; protected $engine; protected $request; @@ -35,7 +38,7 @@ class QuickbooksIngest implements ShouldQueue MultiDB::setDb($this->company->db); set_time_limit(0); - $engine = new Quickbooks(['import_type' => 'client', 'hash'=> $this->request['hash'] ], $this->company); + $engine = new Quickbooks(['import_type' => 'client', 'hash' => $this->request['hash'] ], $this->company); foreach ($this->request['import_types'] as $entity) { $engine->import($entity); } diff --git a/app/Jobs/Quote/QuoteCheckExpired.php b/app/Jobs/Quote/QuoteCheckExpired.php index 15a9ab9383de..edf9ac57b919 100644 --- a/app/Jobs/Quote/QuoteCheckExpired.php +++ b/app/Jobs/Quote/QuoteCheckExpired.php @@ -60,7 +60,7 @@ class QuoteCheckExpired implements ShouldQueue ->whereHas('company', function ($query) { $query->where('is_disabled', 0); }) - + ->whereBetween('quotes.due_date', [now()->subDay()->startOfDay(), now()->startOfDay()->subSecond()]) ->cursor() ->each(function ($quote) { @@ -82,7 +82,7 @@ class QuoteCheckExpired implements ShouldQueue ->whereHas('company', function ($query) { $query->where('is_disabled', 0); }) - + ->whereBetween('quotes.due_date', [now()->subDay()->startOfDay(), now()->startOfDay()->subSecond()]) ->cursor() ->each(function ($quote) { diff --git a/app/Jobs/Subscription/CleanStaleInvoiceOrder.php b/app/Jobs/Subscription/CleanStaleInvoiceOrder.php index d8295ed9f54d..9795d08cd2c7 100644 --- a/app/Jobs/Subscription/CleanStaleInvoiceOrder.php +++ b/app/Jobs/Subscription/CleanStaleInvoiceOrder.php @@ -95,7 +95,7 @@ class CleanStaleInvoiceOrder implements ShouldQueue ->each(function ($invoice) { $invoice->service()->removeUnpaidGatewayFees(); }); - + \DB::connection($db)->table('password_resets')->where('created_at', '<', now()->subHours(12))->delete(); } diff --git a/app/Jobs/Task/TaskAssigned.php b/app/Jobs/Task/TaskAssigned.php index 5668a39d388e..4e72637b0303 100644 --- a/app/Jobs/Task/TaskAssigned.php +++ b/app/Jobs/Task/TaskAssigned.php @@ -48,12 +48,11 @@ class TaskAssigned implements ShouldQueue $company_user = $this->task->assignedCompanyUser(); - if(($company_user instanceof CompanyUser) && $this->findEntityAssignedNotification($company_user, 'task')) - { + if(($company_user instanceof CompanyUser) && $this->findEntityAssignedNotification($company_user, 'task')) { $mo = new EmailObject(); $mo->subject = ctrans('texts.task_assigned_subject', ['task' => $this->task->number, 'date' => now()->setTimeZone($this->task->company->timezone()->name)->format($this->task->company->date_format()) ]); - $mo->body = ctrans('texts.task_assigned_body',['task' => $this->task->number, 'description' => $this->task->description ?? '', 'client' => $this->task->client ? $this->task->client->present()->name() : ' ']); - $mo->text_body = ctrans('texts.task_assigned_body',['task' => $this->task->number, 'description' => $this->task->description ?? '', 'client' => $this->task->client ? $this->task->client->present()->name() : ' ']); + $mo->body = ctrans('texts.task_assigned_body', ['task' => $this->task->number, 'description' => $this->task->description ?? '', 'client' => $this->task->client ? $this->task->client->present()->name() : ' ']); + $mo->text_body = ctrans('texts.task_assigned_body', ['task' => $this->task->number, 'description' => $this->task->description ?? '', 'client' => $this->task->client ? $this->task->client->present()->name() : ' ']); $mo->company_key = $this->task->company->company_key; $mo->html_template = 'email.template.generic'; $mo->to = [new Address($this->task->assigned_user->email, $this->task->assigned_user->present()->name())]; @@ -61,7 +60,7 @@ class TaskAssigned implements ShouldQueue $mo->email_template_subject = 'task_assigned_subject'; (new Email($mo, $this->task->company))->handle(); - + } } diff --git a/app/Jobs/Util/Import.php b/app/Jobs/Util/Import.php index f4961b19fc43..81bfa656c537 100644 --- a/app/Jobs/Util/Import.php +++ b/app/Jobs/Util/Import.php @@ -2069,7 +2069,7 @@ class Import implements ShouldQueue nlog($exception->getMessage()); app('sentry')->captureException($exception); - + } diff --git a/app/Jobs/Util/QuoteReminderJob.php b/app/Jobs/Util/QuoteReminderJob.php index a583062df824..111e8b2723f9 100644 --- a/app/Jobs/Util/QuoteReminderJob.php +++ b/app/Jobs/Util/QuoteReminderJob.php @@ -99,7 +99,7 @@ class QuoteReminderJob implements ShouldQueue ->whereHas('company', function ($query) { $query->where('is_disabled', 0); }) - + ->with('invitations')->chunk(50, function ($quotes) { foreach ($quotes as $quote) { diff --git a/app/Livewire/BillingPortal/Authentication/Register.php b/app/Livewire/BillingPortal/Authentication/Register.php index 33c8e3d1860a..e6ead95bc701 100644 --- a/app/Livewire/BillingPortal/Authentication/Register.php +++ b/app/Livewire/BillingPortal/Authentication/Register.php @@ -59,7 +59,6 @@ class Register extends Component public function register(array $data) { - $service = new ClientRegisterService( company: $this->subscription->company, additional: $this->additional_fields, diff --git a/app/Livewire/BillingPortal/Authentication/RegisterOrLogin.php b/app/Livewire/BillingPortal/Authentication/RegisterOrLogin.php index 559ad798d1b9..3016bc8f1db2 100644 --- a/app/Livewire/BillingPortal/Authentication/RegisterOrLogin.php +++ b/app/Livewire/BillingPortal/Authentication/RegisterOrLogin.php @@ -256,7 +256,7 @@ class RegisterOrLogin extends Component public function render() { - + /** @var \Illuminate\Support\Collection<\App\Models\Country> */ $countries = app('countries'); diff --git a/app/Livewire/BillingPortalPurchase.php b/app/Livewire/BillingPortalPurchase.php index 96d7e8dcdd3e..34afb103097e 100644 --- a/app/Livewire/BillingPortalPurchase.php +++ b/app/Livewire/BillingPortalPurchase.php @@ -285,7 +285,7 @@ class BillingPortalPurchase extends Component } if (array_key_exists('currency_id', $this->request_data)) { - + /** @var \Illuminate\Support\Collection<\App\Models\Currency> */ $currencies = app('currencies'); @@ -312,7 +312,7 @@ class BillingPortalPurchase extends Component if (array_key_exists('locale', $this->request_data)) { $request = $this->request_data; - + /** @var \Illuminate\Support\Collection<\App\Models\Language> */ $languages = app('languages'); $record = $languages->first(function ($item) use ($request) { @@ -363,11 +363,12 @@ class BillingPortalPurchase extends Component $method_values = array_column($this->methods, 'is_paypal'); $is_paypal = in_array('1', $method_values); - if($is_paypal && !$this->steps['check_rff']) + if($is_paypal && !$this->steps['check_rff']) { $this->rff(); - elseif(!$this->steps['check_rff']) + } elseif(!$this->steps['check_rff']) { $this->steps['fetched_payment_methods'] = true; - + } + $this->heading_text = ctrans('texts.payment_methods'); return $this; @@ -422,7 +423,7 @@ class BillingPortalPurchase extends Component $this->payment_method_id = $gateway_type_id; $this->handleBeforePaymentEvents(); - + } /** diff --git a/app/Livewire/BillingPortalPurchasev2.php b/app/Livewire/BillingPortalPurchasev2.php index 647613e60f1f..a5256fc0828e 100644 --- a/app/Livewire/BillingPortalPurchasev2.php +++ b/app/Livewire/BillingPortalPurchasev2.php @@ -487,7 +487,7 @@ class BillingPortalPurchasev2 extends Component if ($this->contact && $this->float_amount_total >= 0) { $this->methods = $this->contact->client->service()->getPaymentMethods($this->float_amount_total); } - + foreach($this->methods as $method) { if($method['is_paypal'] == '1' && !$this->check_rff) { @@ -502,7 +502,7 @@ class BillingPortalPurchasev2 extends Component protected function rff() { - + $this->contact_first_name = $this->contact->first_name; $this->contact_last_name = $this->contact->last_name; $this->contact_email = $this->contact->email; @@ -515,8 +515,7 @@ class BillingPortalPurchasev2 extends Component strlen($this->contact_email ?? '') == 0 || strlen($this->client_city ?? '') == 0 || strlen($this->client_postal_code ?? '') == 0 - ) - { + ) { $this->check_rff = true; } @@ -757,7 +756,7 @@ class BillingPortalPurchasev2 extends Component $data['settings']->currency_id = $currency->id; } } elseif ($this->subscription->group_settings && property_exists($this->subscription->group_settings->settings, 'currency_id')) { - + /** @var \Illuminate\Support\Collection<\App\Models\Currency> */ $currencies = app('currencies'); @@ -775,7 +774,7 @@ class BillingPortalPurchasev2 extends Component /** @var \Illuminate\Support\Collection<\App\Models\Language> */ $languages = app('languages'); - + $record = $languages->first(function ($item) use ($request) { return $item->locale == $request['locale']; }); diff --git a/app/Livewire/Flow2/InvoicePay.php b/app/Livewire/Flow2/InvoicePay.php new file mode 100644 index 000000000000..f67278d32b9c --- /dev/null +++ b/app/Livewire/Flow2/InvoicePay.php @@ -0,0 +1,287 @@ + 'name', + 'client_website' => 'website', + 'client_phone' => 'phone', + + 'client_address_line_1' => 'address1', + 'client_address_line_2' => 'address2', + 'client_city' => 'city', + 'client_state' => 'state', + 'client_postal_code' => 'postal_code', + 'client_country_id' => 'country_id', + + 'client_shipping_address_line_1' => 'shipping_address1', + 'client_shipping_address_line_2' => 'shipping_address2', + 'client_shipping_city' => 'shipping_city', + 'client_shipping_state' => 'shipping_state', + 'client_shipping_postal_code' => 'shipping_postal_code', + 'client_shipping_country_id' => 'shipping_country_id', + + 'client_custom_value1' => 'custom_value1', + 'client_custom_value2' => 'custom_value2', + 'client_custom_value3' => 'custom_value3', + 'client_custom_value4' => 'custom_value4', + + 'contact_first_name' => 'first_name', + 'contact_last_name' => 'last_name', + 'contact_email' => 'email', + // 'contact_phone' => 'phone', + ]; + + public $client_address_array = [ + 'address1', + 'address2', + 'city', + 'state', + 'postal_code', + 'country_id', + 'shipping_address1', + 'shipping_address2', + 'shipping_city', + 'shipping_state', + 'shipping_postal_code', + 'shipping_country_id', + ]; + + public $invitation_id; + + public $invoices; + + public $variables; + + public $db; + + public $settings; + + public $terms_accepted = false; + + public $signature_accepted = false; + + public $payment_method_accepted = false; + + public $under_over_payment = false; + + public $required_fields = false; + + #[On('update.context')] + public function handleContext(string $property, $value): self + { + $this->setContext(property: $property, value: $value); + + return $this; + } + + #[On('terms-accepted')] + public function termsAccepted() + { + nlog("Terms accepted"); + // $this->invite = \App\Models\InvoiceInvitation::withTrashed()->find($this->invitation_id)->withoutRelations(); + $this->terms_accepted = true; + } + + #[On('signature-captured')] + public function signatureCaptured($base64) + { + nlog("signature captured"); + + $this->signature_accepted = true; + $invite = \App\Models\InvoiceInvitation::withTrashed()->find($this->invitation_id); + $invite->signature_base64 = $base64; + $invite->signature_date = now()->addSeconds($invite->contact->client->timezone_offset()); + $this->setContext('signature', $base64); // $this->context['signature'] = $base64; + $invite->save(); + + } + + #[On('payable-amount')] + public function payableAmount($payable_amount) + { + // $this->setContext('payable_invoices.0.amount', Number::parseFloat($payable_amount)); // $this->context['payable_invoices'][0]['amount'] = Number::parseFloat($payable_amount); //TODO DB: check parseFloat() + $this->under_over_payment = false; + } + + #[On('payment-method-selected')] + public function paymentMethodSelected($company_gateway_id, $gateway_type_id, $amount) + { + $this->setContext('company_gateway_id', $company_gateway_id); + $this->setContext('gateway_type_id', $gateway_type_id); + $this->setContext('amount', $amount); + $this->setContext('pre_payment', false); + $this->setContext('is_recurring', false); + $this->setContext('invitation_id', $this->invitation_id); + + $this->payment_method_accepted = true; + + $company_gateway = CompanyGateway::query()->find($company_gateway_id); + + $this->checkRequiredFields($company_gateway); + } + + #[On('required-fields')] + public function requiredFieldsFilled() + { + $this->required_fields = false; + } + + private function checkRequiredFields(CompanyGateway $company_gateway) + { + + $fields = $company_gateway->driver()->getClientRequiredFields(); + + $this->setContext('fields', $fields); // $this->context['fields'] = $fields; + + if ($company_gateway->always_show_required_fields) { + return $this->required_fields = true; + } + + $contact = $this->getContext()['contact']; + + foreach ($fields as $index => $field) { + $_field = $this->mappings[$field['name']]; + + if (\Illuminate\Support\Str::startsWith($field['name'], 'client_')) { + if ( + empty($contact->client->{$_field}) + || is_null($contact->client->{$_field}) + ) { + + return $this->required_fields = true; + + } + } + + if (\Illuminate\Support\Str::startsWith($field['name'], 'contact_')) { + if (empty($contact->{$_field}) || is_null($contact->{$_field}) || str_contains($contact->{$_field}, '@example.com')) { + return $this->required_fields = true; + } + } + } + + return $this->required_fields = false; + + } + + #[Computed()] + public function component(): string + { + if (!$this->terms_accepted) { + return Terms::class; + } + + if (!$this->signature_accepted) { + return Signature::class; + } + + if ($this->under_over_payment) { + return UnderOverPayment::class; + } + + if (!$this->payment_method_accepted) { + return PaymentMethod::class; + } + + if ($this->required_fields) { + return RequiredFields::class; + } + + return ProcessPayment::class; + } + + #[Computed()] + public function componentUniqueId(): string + { + return "purchase-" . md5(microtime()); + } + + public function mount() + { + $this->resetContext(); + + MultiDB::setDb($this->db); + + // @phpstan-ignore-next-line + $invite = \App\Models\InvoiceInvitation::with('contact.client', 'company')->withTrashed()->find($this->invitation_id); + $client = $invite->contact->client; + $settings = $client->getMergedSettings(); + $this->setContext('contact', $invite->contact); // $this->context['contact'] = $invite->contact; + $this->setContext('settings', $settings); // $this->context['settings'] = $settings; + $this->setContext('db', $this->db); // $this->context['db'] = $this->db; + + nlog($this->invoices); + + if(is_array($this->invoices)) { + $this->invoices = Invoice::find($this->transformKeys($this->invoices)); + } + + $invoices = $this->invoices->filter(function ($i) { + $i = $i->service() + ->markSent() + ->removeUnpaidGatewayFees() + ->save(); + + return $i->isPayable(); + }); + + //under-over / payment + + //required fields + $this->terms_accepted = !$settings->show_accept_invoice_terms; + $this->signature_accepted = !$settings->require_invoice_signature; + $this->under_over_payment = $settings->client_portal_allow_over_payment || $settings->client_portal_allow_under_payment; + $this->required_fields = false; + + $this->setContext('variables', $this->variables); // $this->context['variables'] = $this->variables; + $this->setContext('invoices', $invoices); // $this->context['invoices'] = $invoices; + $this->setContext('settings', $settings); // $this->context['settings'] = $settings; + $this->setContext('invitation', $invite); // $this->context['invitation'] = $invite; + + $payable_invoices = $invoices->map(function ($i) { + /** @var \App\Models\Invoice $i */ + return [ + 'invoice_id' => $i->hashed_id, + 'amount' => $i->partial > 0 ? $i->partial : $i->balance, + 'formatted_amount' => Number::formatValue($i->partial > 0 ? $i->partial : $i->balance, $i->client->currency()), + 'number' => $i->number, + 'date' => $i->translateDate($i->date, $i->client->date_format(), $i->client->locale()) + ]; + })->toArray(); + + $this->setContext('payable_invoices', $payable_invoices); + } + + public function render(): \Illuminate\Contracts\View\Factory|\Illuminate\View\View + { + return render('flow2.invoice-pay'); + } +} diff --git a/app/Livewire/Flow2/InvoiceSummary.php b/app/Livewire/Flow2/InvoiceSummary.php new file mode 100644 index 000000000000..ce84992512a1 --- /dev/null +++ b/app/Livewire/Flow2/InvoiceSummary.php @@ -0,0 +1,47 @@ +invoices = $this->getContext()['invoices']; // $this->context['invitation']->invoice; + } + + #[On(self::CONTEXT_UPDATE)] + public function onContextUpdate(): void + { + // refactor logic for updating the price for eg if it changes with under/over pay + + $this->invoices = $this->getContext()['invoices']; + } + + public function render(): \Illuminate\Contracts\View\Factory|\Illuminate\View\View + { + return render('flow2.invoices-summary', [ + 'invoice' => $this->invoices, + 'client' => $this->invoices->first()->client, + ]); + + } +} diff --git a/app/Livewire/Flow2/PaymentMethod.php b/app/Livewire/Flow2/PaymentMethod.php new file mode 100644 index 000000000000..2014159e98be --- /dev/null +++ b/app/Livewire/Flow2/PaymentMethod.php @@ -0,0 +1,78 @@ + + + + + + + HTML; + } + + public function handleSelect(string $company_gateway_id, string $gateway_type_id, string $amount) + { + $this->isLoading = true; + + $this->dispatch( + event: 'payment-method-selected', + company_gateway_id: $company_gateway_id, + gateway_type_id: $gateway_type_id, + amount: $amount, + ); + } + + public function mount() + { + $this->variables = $this->getContext()['variables']; + $this->amount = array_sum(array_column($this->getContext()['payable_invoices'], 'amount')); + + MultiDB::setDb($this->getContext()['db']); + + $this->methods = $this->getContext()['invitation']->contact->client->service()->getPaymentMethods($this->amount); + + if (count($this->methods) == 1) { + $this->dispatch('singlePaymentMethodFound', company_gateway_id: $this->methods[0]['company_gateway_id'], gateway_type_id: $this->methods[0]['gateway_type_id'], amount: $this->amount); + } else { + $this->isLoading = false; + $this->dispatch('loadingCompleted'); + } + } + + public function render(): \Illuminate\Contracts\View\Factory|\Illuminate\View\View + { + return render('flow2.payment-method', ['methods' => $this->methods]); + } +} diff --git a/app/Livewire/Flow2/ProcessPayment.php b/app/Livewire/Flow2/ProcessPayment.php new file mode 100644 index 000000000000..175092a98ca7 --- /dev/null +++ b/app/Livewire/Flow2/ProcessPayment.php @@ -0,0 +1,86 @@ +getContext()['db']); + + $invitation = InvoiceInvitation::find($this->getContext()['invitation_id']); + + $data = [ + 'company_gateway_id' => $this->getContext()['company_gateway_id'], + 'payment_method_id' => $this->getContext()['gateway_type_id'], + 'payable_invoices' => $this->getContext()['payable_invoices'], + 'signature' => isset($this->getContext()['signature']) ? $this->getContext()['signature'] : false, + 'signature_ip' => isset($this->getContext()['signature_ip']) ? $this->getContext()['signature_ip'] : false, + 'pre_payment' => false, + 'frequency_id' => false, + 'remaining_cycles' => false, + 'is_recurring' => false, + // 'hash' => false, + ]; + + $responder_data = (new LivewireInstantPayment($data))->run(); + + $company_gateway = CompanyGateway::find($this->getContext()['company_gateway_id']); + + if (!$responder_data['success']) { + throw new PaymentFailed($responder_data['error'], 400); + } + + $driver = $company_gateway + ->driver($invitation->contact->client) + ->setPaymentMethod($data['payment_method_id']) + ->setPaymentHash($responder_data['payload']['ph']); + + $this->payment_data_payload = $driver->processPaymentViewData($responder_data['payload']); + + $this->payment_view = $driver->livewirePaymentView( + $this->payment_data_payload, + ); + + $this->isLoading = false; + + } + + public function render(): \Illuminate\Contracts\View\Factory|string|\Illuminate\View\View + { + if ($this->isLoading) { + return <<<'HTML' + + HTML; + } + + return render($this->payment_view, $this->payment_data_payload); + } +} diff --git a/app/Livewire/Flow2/RequiredFields.php b/app/Livewire/Flow2/RequiredFields.php new file mode 100644 index 000000000000..5cce417df6f6 --- /dev/null +++ b/app/Livewire/Flow2/RequiredFields.php @@ -0,0 +1,136 @@ + */ + public array $fields = []; + + public bool $is_loading = true; + + public array $errors = []; + + public function mount(): void + { + MultiDB::setDB( + $this->getContext()['db'], + ); + + $this->fields = $this->getContext()['fields']; + + $this->company_gateway = CompanyGateway::withTrashed() + ->with('company') + ->find($this->getContext()['company_gateway_id']); + + $contact = auth()->user(); + + $this->client_name = $contact->client->name; + $this->contact_first_name = $contact->first_name; + $this->contact_last_name = $contact->last_name; + $this->contact_email = $contact->email; + $this->client_phone = $contact->client->phone; + $this->client_address_line_1 = $contact->client->address1; + $this->client_city = $contact->client->city; + $this->client_state = $contact->client->state; + $this->client_country_id = $contact->client->country_id; + $this->client_postal_code = $contact->client->postal_code; + $this->client_shipping_address_line_1 = $contact->client->shipping_address1; + $this->client_shipping_city = $contact->client->shipping_city; + $this->client_shipping_state = $contact->client->shipping_state; + $this->client_shipping_postal_code = $contact->client->shipping_postal_code; + $this->client_shipping_country_id = $contact->client->shipping_country_id; + $this->client_custom_value1 = $contact->client->custom_value1; + $this->client_custom_value2 = $contact->client->custom_value2; + $this->client_custom_value3 = $contact->client->custom_value3; + $this->client_custom_value4 = $contact->client->custom_value4; + + $rff = new RFFService( + fields: $this->getContext()['fields'], + database: $this->getContext()['db'], + company_gateway_id: $this->company_gateway->id, + ); + + /** @var \App\Models\ClientContact $contact */ + $rff->check($contact); + + if ($rff->unfilled_fields === 0) { + $this->dispatch('required-fields'); + } + + if ($rff->unfilled_fields > 0) { + $this->is_loading = false; + } + } + + public function handleSubmit(array $data) + { + $this->errors = []; + $this->is_loading = true; + + $rff = new RFFService( + fields: $this->fields, + database: $this->getContext()['db'], + company_gateway_id: $this->company_gateway->id, + ); + + $contact = auth()->user(); + + /** @var \App\Models\ClientContact $contact */ + $errors = $rff->handleSubmit($data, $contact, return_errors: true, callback: function () { + $this->dispatch('required-fields'); + }); + + if (is_array($errors) && count($errors)) { + $this->errors = $errors; + $this->is_loading = false; + } + } + + public function render(): \Illuminate\Contracts\View\Factory|\Illuminate\View\View + { + return render('flow2.required-fields', [ + 'contact' => $this->getContext()['contact'], + ]); + } +} diff --git a/app/Livewire/Flow2/Signature.php b/app/Livewire/Flow2/Signature.php new file mode 100644 index 000000000000..07e63a658ebe --- /dev/null +++ b/app/Livewire/Flow2/Signature.php @@ -0,0 +1,23 @@ +invoice = $this->getContext()['invoices']->first(); + $this->variables = $this->getContext()['variables']; + } + + public function render() + { + return render('components.livewire.terms'); + } +} diff --git a/app/Livewire/Flow2/UnderOverPayment.php b/app/Livewire/Flow2/UnderOverPayment.php new file mode 100644 index 000000000000..93865ee6a0bd --- /dev/null +++ b/app/Livewire/Flow2/UnderOverPayment.php @@ -0,0 +1,76 @@ +invoice_amount = array_sum(array_column($this->getContext()['payable_invoices'], 'amount')); + $this->currency = $this->getContext()['invitation']->contact->client->currency(); + $this->payableInvoices = $this->getContext()['payable_invoices']; + } + + public function checkValue(array $payableInvoices) + { + $this->errors = ''; + + $settings = $this->getContext()['settings']; + + foreach($payableInvoices as $key => $invoice) { + $payableInvoices[$key]['amount'] = Number::parseFloat($invoice['formatted_amount']); + } + + $input_amount = collect($payableInvoices)->sum('amount'); + + if($settings->client_portal_allow_under_payment && $settings->client_portal_under_payment_minimum != 0) { + if($input_amount <= $settings->client_portal_under_payment_minimum) { + // return error message under payment too low. + $this->errors = ctrans('texts.minimum_required_payment', ['amount' => $settings->client_portal_under_payment_minimum]); + $this->dispatch('errorMessageUpdate', errors: $this->errors); + } + } + + if(!$settings->client_portal_allow_over_payment && ($input_amount > $this->invoice_amount)) { + $this->errors = ctrans('texts.over_payments_disabled'); + $this->dispatch('errorMessageUpdate', errors: $this->errors); + } + + if(!$this->errors) { + $this->setContext('payable_invoices', $payableInvoices); + $this->dispatch('payable-amount', payable_amount: $input_amount); + } + } + + public function render(): \Illuminate\Contracts\View\Factory|\Illuminate\View\View + { + return render('flow2.under-over-payments'); + } +} diff --git a/app/Livewire/RequiredClientInfo.php b/app/Livewire/RequiredClientInfo.php index 7192f45432b5..11f7e8312a96 100644 --- a/app/Livewire/RequiredClientInfo.php +++ b/app/Livewire/RequiredClientInfo.php @@ -197,8 +197,8 @@ class RequiredClientInfo extends Component MultiDB::setDb($this->db); $contact = ClientContact::withTrashed()->with(['client' => function ($query) { - $query->without('gateway_tokens', 'documents', 'contacts.company', 'contacts'); // Exclude 'grandchildren' relation of 'client' - }])->find($this->contact_id); + $query->without('gateway_tokens', 'documents', 'contacts.company', 'contacts'); // Exclude 'grandchildren' relation of 'client' + }])->find($this->contact_id); $this->company_gateway = CompanyGateway::withTrashed()->with('company')->find($this->company_gateway_id); $company = $this->company_gateway->company; diff --git a/app/Mail/TemplateEmail.php b/app/Mail/TemplateEmail.php index 1c5be18e9859..43263484ef4c 100644 --- a/app/Mail/TemplateEmail.php +++ b/app/Mail/TemplateEmail.php @@ -26,8 +26,8 @@ class TemplateEmail extends Mailable /** @var \App\Models\Client $client */ - private $client; - + private $client; + /** @var \App\Models\ClientContact | \App\Models\VendorContact $contact */ private $contact; @@ -65,7 +65,7 @@ class TemplateEmail extends Mailable } $link_string = '