1
0
mirror of https://github.com/invoiceninja/invoiceninja.git synced 2024-11-10 05:02:36 +01:00

Merge pull request #8910 from turbo124/v5-develop

v5.7.34
This commit is contained in:
David Bomba 2023-10-27 21:11:43 +11:00 committed by GitHub
commit e078b9637b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
543 changed files with 15122 additions and 12938 deletions

View File

@ -1 +1 @@
5.7.33
5.7.34

View File

@ -11,13 +11,13 @@
namespace App\Console\Commands;
use App\Utils\Ninja;
use App\Libraries\MultiDB;
use App\Models\Backup;
use App\Models\Client;
use App\Models\Company;
use App\Models\Document;
use App\Libraries\MultiDB;
use App\Models\GroupSetting;
use App\Utils\Ninja;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Storage;
@ -56,8 +56,9 @@ class BackupUpdate extends Command
{
//always return state to first DB
if(Ninja::isSelfHost())
if(Ninja::isSelfHost()) {
return;
}
$current_db = config('database.default');

View File

@ -12,38 +12,37 @@
namespace App\Console\Commands;
use App;
use Exception;
use App\Models\User;
use App\Utils\Ninja;
use App\Models\Quote;
use App\Models\Client;
use App\Models\Credit;
use App\Models\Vendor;
use App\Models\Account;
use App\Models\Company;
use App\Models\Contact;
use App\Models\Invoice;
use App\Models\Payment;
use App\Models\CompanyUser;
use Illuminate\Support\Str;
use App\Models\CompanyToken;
use App\Models\ClientContact;
use App\Models\CompanyLedger;
use App\Models\PurchaseOrder;
use App\Models\VendorContact;
use App\Models\BankTransaction;
use App\Models\QuoteInvitation;
use Illuminate\Console\Command;
use App\Models\CreditInvitation;
use App\Models\RecurringInvoice;
use App\Models\InvoiceInvitation;
use App\DataMapper\ClientSettings;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use App\Factory\ClientContactFactory;
use App\Factory\VendorContactFactory;
use App\Jobs\Company\CreateCompanyToken;
use App\Models\Account;
use App\Models\BankTransaction;
use App\Models\Client;
use App\Models\ClientContact;
use App\Models\Company;
use App\Models\CompanyLedger;
use App\Models\CompanyToken;
use App\Models\CompanyUser;
use App\Models\Contact;
use App\Models\Credit;
use App\Models\CreditInvitation;
use App\Models\Invoice;
use App\Models\InvoiceInvitation;
use App\Models\Payment;
use App\Models\PurchaseOrder;
use App\Models\Quote;
use App\Models\QuoteInvitation;
use App\Models\RecurringInvoice;
use App\Models\RecurringInvoiceInvitation;
use App\Models\User;
use App\Models\Vendor;
use App\Models\VendorContact;
use App\Utils\Ninja;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Mail;
use Illuminate\Support\Str;
use Symfony\Component\Console\Input\InputOption;
/*
@ -185,8 +184,7 @@ class CheckData extends Command
if ($cu->company && $cu->user) {
(new CreateCompanyToken($cu->company, $cu->user, 'System'))->handle();
}
else {
} else {
// $cu->forceDelete();
}
}
@ -445,7 +443,7 @@ class CheckData extends Command
QuoteInvitation::where('deleted_at', "0000-00-00 00:00:00.000000")->withTrashed()->update(['deleted_at' => null]);
CreditInvitation::where('deleted_at', "0000-00-00 00:00:00.000000")->withTrashed()->update(['deleted_at' => null]);
InvoiceInvitation::where('sent_date', '0000-00-00 00:00:00')->cursor()->each(function ($ii){
InvoiceInvitation::where('sent_date', '0000-00-00 00:00:00')->cursor()->each(function ($ii) {
$ii->sent_date = null;
$ii->saveQuietly();
});
@ -1028,7 +1026,7 @@ class CheckData extends Command
{
$this->logMessage("checking bank transactions");
BankTransaction::with('payment')->withTrashed()->where('invoice_ids', ',,,,,,,,')->cursor()->each(function ($bt){
BankTransaction::with('payment')->withTrashed()->where('invoice_ids', ',,,,,,,,')->cursor()->each(function ($bt) {
if($bt->payment->exists()) {
@ -1052,7 +1050,7 @@ class CheckData extends Command
if ($this->option('fix') == 'true') {
$q->cursor()->each(function ($c){
$q->cursor()->each(function ($c) {
$c->send_email = false;
$c->saveQuietly();

View File

@ -20,7 +20,6 @@ use App\Models\Account;
use App\Models\Company;
use App\Models\CompanyToken;
use App\Models\User;
use App\Repositories\InvoiceRepository;
use App\Utils\Traits\GeneratesCounter;
use App\Utils\Traits\MakesHash;
use Illuminate\Console\Command;

View File

@ -36,6 +36,7 @@ use App\Models\CompanyToken;
use App\Models\Country;
use App\Models\Credit;
use App\Models\Expense;
use App\Models\Invoice;
use App\Models\Product;
use App\Models\Project;
use App\Models\Quote;
@ -303,6 +304,62 @@ class CreateSingleAccount extends Command
$this->createGateways($company, $user);
$this->createSubsData($company, $user);
$repo = new \App\Repositories\TaskRepository();
Task::query()->cursor()->each(function ($t) use ($repo) {
$repo->save([], $t);
});
$repo = new \App\Repositories\ExpenseRepository();
Expense::query()->cursor()->each(function ($t) use ($repo) {
$repo->save([], $t);
});
$repo = new \App\Repositories\VendorRepository(new \App\Repositories\VendorContactRepository());
Vendor::query()->cursor()->each(function ($t) use ($repo) {
$repo->save([], $t);
});
$repo = new \App\Repositories\ClientRepository(new \App\Repositories\ClientContactRepository());
Client::query()->cursor()->each(function ($t) use ($repo) {
$repo->save([], $t);
});
$repo = new \App\Repositories\RecurringInvoiceRepository();
RecurringInvoice::query()->cursor()->each(function ($t) use ($repo) {
$repo->save([], $t);
});
$repo = new \App\Repositories\InvoiceRepository();
Invoice::query()->cursor()->each(function ($t) use ($repo) {
$repo->save([], $t);
});
$repo = new \App\Repositories\QuoteRepository();
Quote::query()->cursor()->each(function ($t) use ($repo) {
$repo->save([], $t);
});
$repo = new \App\Repositories\CreditRepository();
Credit::query()->cursor()->each(function ($t) use ($repo) {
$repo->save([], $t);
});
Project::query()->with('client')->whereNotNull('client_id')->cursor()->each(function ($p) {
if($p && $p->client && !isset($p->number)) {
$p->number = $this->getNextProjectNumber($p);
$p->save();
}
});
$this->info("finished");
}
private function createSubsData($company, $user)
@ -403,7 +460,7 @@ class CreateSingleAccount extends Command
$settings = $client->settings;
$settings->currency_id = "1";
// $settings->use_credits_payment = "always";
// $settings->use_credits_payment = "always";
$client->settings = $settings;
@ -885,11 +942,11 @@ class CreateSingleAccount extends Command
}
}
private function createRecurringInvoice($client)
private function createRecurringInvoice(Client $client)
{
$faker = Factory::create();
$invoice = RecurringInvoiceFactory::create($client->company->id, $client->user->id); //stub the company and user_id
$invoice = RecurringInvoiceFactory::create($client->company_id, $client->user_id); //stub the company and user_id
$invoice->client_id = $client->id;
$dateable = Carbon::now()->subDays(rand(0, 90));
$invoice->date = $dateable;

View File

@ -496,7 +496,7 @@ class CreateTestData extends Command
$invoice = InvoiceFactory::create($client->company->id, $client->user->id); //stub the company and user_id
$invoice->client_id = $client->id;
// $invoice->date = $faker->date();
// $invoice->date = $faker->date();
$dateable = Carbon::now()->subDays(rand(0, 90));
$invoice->date = $dateable;

View File

@ -18,7 +18,6 @@ use App\Exceptions\ProcessingMigrationArchiveFailed;
use App\Exceptions\ResourceDependencyMissing;
use App\Exceptions\ResourceNotAvailableForMigration;
use App\Jobs\Util\Import;
use App\Jobs\Util\StartMigration;
use App\Mail\MigrationFailed;
use App\Models\Account;
use App\Models\Company;

View File

@ -52,8 +52,7 @@ class ReactBuilder extends Command
try {
$directoryIterator = new \RecursiveDirectoryIterator(public_path('react/v'.config('ninja.app_version').'/'), \RecursiveDirectoryIterator::SKIP_DOTS);
}
catch (\Exception $e) {
} catch (\Exception $e) {
$this->error('React files not found');
return;
}
@ -61,14 +60,14 @@ class ReactBuilder extends Command
foreach (new \RecursiveIteratorIterator($directoryIterator) as $file) {
if ($file->getExtension() == 'js') {
if (str_contains($file->getFileName(), 'index-')) {
$includes .= '<script type="module" crossorigin src="/react/'.$file->getFileName().'"></script>'."\n";
$includes .= '<script type="module" crossorigin src="/react/v'.config('ninja.app_version').'/'.$file->getFileName().'"></script>'."\n";
} else {
$includes .= '<link rel="modulepreload" href="/react/'.$file->getFileName().'">'."\n";
$includes .= '<link rel="modulepreload" href="/react/v'.config('ninja.app_version').'/'.$file->getFileName().'">'."\n";
}
}
if (str_contains($file->getFileName(), '.css')) {
$includes .= '<link rel="stylesheet" href="/react/'.$file->getFileName().'">'."\n";
$includes .= '<link rel="stylesheet" href="/react/v'.config('ninja.app_version').'/'.$file->getFileName().'">'."\n";
}
}

View File

@ -174,7 +174,7 @@ class SendRemindersCron extends Command
$invoice->calc()->getInvoice()->save();
$invoice->fresh();
// $invoice->service()->deletePdf()->save();
if ($invoice->client->getSetting('enable_e_invoice')){
if ($invoice->client->getSetting('enable_e_invoice')) {
$invoice->service()->deleteEInvoice()->save();
}

View File

@ -11,17 +11,10 @@
namespace App\Console\Commands;
use Faker\Factory;
use App\Models\User;
use App\Models\Account;
use App\Models\Company;
use App\Mail\TestMailServer;
use Illuminate\Console\Command;
use App\Jobs\Mail\NinjaMailerJob;
use App\DataMapper\CompanySettings;
use App\DataMapper\DefaultSettings;
use App\Jobs\Mail\NinjaMailerObject;
use App\Mail\Migration\MaxCompanies;
use App\Mail\TestMailServer;
use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Mail;
class SendTestEmails extends Command

View File

@ -11,29 +11,29 @@
namespace App\Console;
use App\Utils\Ninja;
use App\Models\Account;
use App\Jobs\Ninja\QueueSize;
use App\Jobs\Util\DiskCleanup;
use App\Jobs\Util\ReminderJob;
use App\Jobs\Cron\AutoBillCron;
use App\Jobs\Util\VersionCheck;
use App\Jobs\Ninja\TaskScheduler;
use App\Jobs\Util\SchedulerCheck;
use App\Jobs\Ninja\CheckACHStatus;
use App\Jobs\Cron\SubscriptionCron;
use App\Jobs\Ninja\AdjustEmailQuota;
use App\Jobs\Ninja\CompanySizeCheck;
use App\Jobs\Ninja\SystemMaintenance;
use App\Jobs\Quote\QuoteCheckExpired;
use App\Jobs\Util\UpdateExchangeRates;
use App\Jobs\Ninja\BankTransactionSync;
use App\Jobs\Cron\RecurringExpensesCron;
use App\Jobs\Cron\RecurringInvoicesCron;
use App\Jobs\Cron\SubscriptionCron;
use App\Jobs\Cron\UpdateCalculatedFields;
use Illuminate\Console\Scheduling\Schedule;
use App\Jobs\Invoice\InvoiceCheckLateWebhook;
use App\Jobs\Ninja\AdjustEmailQuota;
use App\Jobs\Ninja\BankTransactionSync;
use App\Jobs\Ninja\CheckACHStatus;
use App\Jobs\Ninja\CompanySizeCheck;
use App\Jobs\Ninja\QueueSize;
use App\Jobs\Ninja\SystemMaintenance;
use App\Jobs\Ninja\TaskScheduler;
use App\Jobs\Quote\QuoteCheckExpired;
use App\Jobs\Subscription\CleanStaleInvoiceOrder;
use App\Jobs\Util\DiskCleanup;
use App\Jobs\Util\ReminderJob;
use App\Jobs\Util\SchedulerCheck;
use App\Jobs\Util\UpdateExchangeRates;
use App\Jobs\Util\VersionCheck;
use App\Models\Account;
use App\Utils\Ninja;
use Illuminate\Console\Scheduling\Schedule;
use Illuminate\Foundation\Console\Kernel as ConsoleKernel;
class Kernel extends ConsoleKernel

View File

@ -481,9 +481,22 @@ class CompanySettings extends BaseSettings
public $enable_e_invoice = false;
public $classification = ''; // individual, company, partnership, trust, charity, government, other
public $delivery_note_design_id = '';
public $statement_design_id = '';
public $payment_receipt_design_id = '';
public $payment_refund_design_id = '';
public $classification = ''; // individual, business, partnership, trust, charity, government, other
public static $casts = [
'statement_design_id' => 'string',
'delivery_note_design_id' => 'string',
'payment_receipt_design_id' => 'string',
'payment_refund_design_id' => 'string',
'classification' => 'string',
'enable_e_invoice' => 'bool',
'classification' => 'string',
'default_expense_payment_type_id' => 'string',
@ -768,6 +781,8 @@ class CompanySettings extends BaseSettings
'quote_design_id',
'credit_design_id',
'purchase_order_design_id',
'statement_design_id',
'delivery_note_design_id',
];
// /**
@ -999,6 +1014,15 @@ class CompanySettings extends BaseSettings
'$total',
'$credit.balance',
],
'statement_details' => [
'$statement_date',
'$balance'
],
'delivery_note_columns' => [
'$product.item',
'$product.description',
'$product.quantity',
],
];
return json_decode(json_encode($variables));

View File

@ -44,7 +44,7 @@ class FreeCompanySettings extends BaseSettings
public $date_format_id = '';
// public $enabled_item_tax_rates = 0;
// public $enabled_item_tax_rates = 0;
public $expense_number_pattern = '';
public $expense_number_counter = 1;

View File

@ -355,7 +355,7 @@ class SettingsData
public string $email = ''; //@implemented
public string $country_id; //@implemented
public string $country_id = ''; //@implemented
public string $vat_number = ''; //@implemented
@ -469,21 +469,22 @@ class SettingsData
public function cast(mixed $object)
{
if(is_array($object))
if(is_array($object)) {
$object = (object)$object;
}
if (is_object($object)) {
foreach ($object as $key => $value) {
try{
try {
settype($object->{$key}, gettype($this->{$key}));
}
catch(\Exception | \Error | \Throwable $e){
} catch(\Exception | \Error | \Throwable $e) {
if(property_exists($this, $key))
if(property_exists($this, $key)) {
$object->{$key} = $this->{$key};
else
} else {
unset($object->{$key});
}
}

View File

@ -11,11 +11,11 @@
namespace App\DataMapper\Tax;
use App\DataMapper\Tax\ZipTax\Response;
use App\DataProviders\USStates;
use App\Models\Client;
use App\Models\Invoice;
use App\Models\Product;
use App\DataProviders\USStates;
use App\DataMapper\Tax\ZipTax\Response;
class BaseRule implements RuleInterface
{
@ -147,8 +147,9 @@ class BaseRule implements RuleInterface
$this->resolveRegions();
if(!$this->isTaxableRegion())
if(!$this->isTaxableRegion()) {
return $this;
}
$this->configTaxData();
@ -173,8 +174,9 @@ class BaseRule implements RuleInterface
/** Harvest the client_region */
/** If the tax data is already set and the invoice is marked as sent, do not adjust the rates */
if($this->invoice->tax_data && $this->invoice->status_id > 1)
if($this->invoice->tax_data && $this->invoice->status_id > 1) {
return $this;
}
/**
* Origin - Company Tax Data
@ -184,14 +186,13 @@ class BaseRule implements RuleInterface
$tax_data = false;
if($this->seller_region == 'US' && $this->client_region == 'US'){
if($this->seller_region == 'US' && $this->client_region == 'US') {
$company = $this->invoice->company;
/** If no company tax data has been configured, lets do that now. */
/** We should never encounter this scenario */
if(!$company->origin_tax_data)
{
if(!$company->origin_tax_data) {
$this->should_calc_tax = false;
return $this;
}
@ -201,8 +202,7 @@ class BaseRule implements RuleInterface
$tax_data = $company->origin_tax_data;
}
elseif($this->client->tax_data){
} elseif($this->client->tax_data) {
$tax_data = $this->client->tax_data;
@ -215,9 +215,10 @@ class BaseRule implements RuleInterface
$this->invoice->tax_data = $tax_data;
if(\DB::transactionLevel() == 0)
if(\DB::transactionLevel() == 0) {
$this->invoice->saveQuietly();
}
}
return $this;
@ -234,7 +235,7 @@ class BaseRule implements RuleInterface
$this->client_region = $this->region_codes[$this->client->country->iso_3166_2];
match($this->client_region){
match($this->client_region) {
'US' => $this->client_subregion = isset($this->invoice?->client?->tax_data?->geoState) ? $this->invoice->client->tax_data->geoState : $this->getUSState(),
'EU' => $this->client_subregion = $this->client->country->iso_3166_2,
'AU' => $this->client_subregion = 'AU',
@ -251,8 +252,9 @@ class BaseRule implements RuleInterface
$states = USStates::$states;
if(isset($states[$this->client->state]))
if(isset($states[$this->client->state])) {
return $this->client->state;
}
return USStates::getState(strlen($this->client->postal_code) > 1 ? $this->client->postal_code : $this->client->shipping_postal_code);
@ -277,8 +279,7 @@ class BaseRule implements RuleInterface
return $this;
}
elseif($this->client_region == 'AU'){ //these are defaults and are only stubbed out for now, for AU we can actually remove these
} elseif($this->client_region == 'AU') { //these are defaults and are only stubbed out for now, for AU we can actually remove these
$this->tax_rate1 = $this->client->company->tax_data->regions->AU->subregions->AU->tax_rate;
$this->tax_name1 = $this->client->company->tax_data->regions->AU->subregions->AU->tax_name;

View File

@ -11,9 +11,9 @@
namespace App\DataMapper\Tax\DE;
use App\Models\Product;
use App\DataMapper\Tax\BaseRule;
use App\DataMapper\Tax\RuleInterface;
use App\Models\Product;
class Rule extends BaseRule implements RuleInterface
{
@ -67,7 +67,7 @@ class Rule extends BaseRule implements RuleInterface
return $this->taxExempt($item);
}
match(intval($item->tax_id)){
match(intval($item->tax_id)) {
Product::PRODUCT_TYPE_EXEMPT => $this->taxExempt($item),
Product::PRODUCT_TYPE_DIGITAL => $this->taxDigital($item),
Product::PRODUCT_TYPE_SERVICE => $this->taxService($item),
@ -220,39 +220,28 @@ class Rule extends BaseRule implements RuleInterface
// nlog("tax exempt");
$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->eu_business_tax_exempt)
} 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->eu_business_tax_exempt) {
// elseif($this->client_subregion != $this->client->company->tax_data->seller_subregion && in_array($this->client_subregion, $this->eu_country_codes) && $this->client->has_valid_vat_number && $this->eu_business_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
{
} elseif(!in_array($this->client_subregion, $this->eu_country_codes) && ($this->foreign_consumer_tax_exempt || $this->foreign_business_tax_exempt)) { //foreign + tax exempt
// nlog("foreign and tax exempt");
$this->tax_rate = 0;
$this->reduced_tax_rate = 0;
}
elseif(!in_array($this->client_subregion, $this->eu_country_codes))
{
} elseif(!in_array($this->client_subregion, $this->eu_country_codes)) {
$this->defaultForeign();
}
elseif(in_array($this->client_subregion, $this->eu_country_codes) && !$this->client->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) && !$this->client->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) {
// 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;
$this->reduced_tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->country->iso_3166_2}->reduced_tax_rate;
}
else {
} else {
// nlog("EU with intra-community supply ie DE to DE");
$this->tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->company->country()->iso_3166_2}->tax_rate;
$this->reduced_tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->company->country()->iso_3166_2}->reduced_tax_rate;
}
}
else {
} else {
// nlog("default tax");
$this->tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->company->country()->iso_3166_2}->tax_rate;
$this->reduced_tax_rate = $this->client->company->tax_data->regions->EU->subregions->{$this->client->company->country()->iso_3166_2}->reduced_tax_rate;

View File

@ -32,10 +32,11 @@ class TaxModel
public function __construct(public ?TaxModel $model = null)
{
if(!$this->model)
if(!$this->model) {
$this->regions = $this->init();
else
} else {
$this->regions = $model;
}
}

View File

@ -117,10 +117,9 @@ class Rule extends BaseRule implements RuleInterface
*/
public function taxService($item): self
{
if(in_array($this->tax_data?->txbService,['Y','L'])) {
if(in_array($this->tax_data?->txbService, ['Y','L'])) {
$this->default($item);
}
else {
} else {
$this->taxExempt($item);
}

View File

@ -114,4 +114,3 @@ class Response
}
}

View File

@ -33868,18 +33868,21 @@ class USStates
public static function getState(?string $zip = '90210'): string
{
if(isset(self::$zip_code_map[$zip]))
if(isset(self::$zip_code_map[$zip])) {
return self::$zip_code_map[$zip];
}
$prefix_state = self::getStateFromThreeDigitPrefix($zip);
if($prefix_state)
if($prefix_state) {
return $prefix_state;
}
$zippo_response = self::getStateFromZippo($zip);
if($zippo_response)
if($zippo_response) {
return $zippo_response;
}
throw new \Exception('Zip code not found');
}
@ -33905,8 +33908,9 @@ class USStates
$response = Http::get("https://api.zippopotam.us/us/{$zip}");
if($response->failed())
if($response->failed()) {
return false;
}
$data = $response->object();

View File

@ -12,11 +12,9 @@
namespace App\Events\Account;
use App\Models\Company;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
/**
* Class StripeConnectFailure.

View File

@ -15,7 +15,6 @@ use App\Models\Client;
use App\Models\Company;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

View File

@ -14,7 +14,6 @@ namespace App\Events\Company;
use App\Models\Company;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
@ -44,6 +43,6 @@ class CompanyDocumentsDeleted
*/
public function broadcastOn()
{
return [];
return [];
}
}

View File

@ -14,7 +14,6 @@ namespace App\Events\Contact;
use App\Models\ClientContact;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

View File

@ -15,7 +15,6 @@ use App\Models\Company;
use App\Models\Design;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

View File

@ -11,10 +11,10 @@
namespace App\Events\Design;
use App\Models\Design;
use App\Models\Company;
use Illuminate\Queue\SerializesModels;
use App\Models\Design;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Queue\SerializesModels;
/**
* Class DesignWasCreated.

View File

@ -11,10 +11,10 @@
namespace App\Events\Design;
use App\Models\Design;
use App\Models\Company;
use Illuminate\Queue\SerializesModels;
use App\Models\Design;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Queue\SerializesModels;
/**
* Class DesignWasDeleted.

View File

@ -11,10 +11,10 @@
namespace App\Events\Design;
use App\Models\Design;
use App\Models\Company;
use Illuminate\Queue\SerializesModels;
use App\Models\Design;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Queue\SerializesModels;
/**
* Class DesignWasRestored.

View File

@ -11,10 +11,10 @@
namespace App\Events\Design;
use App\Models\Design;
use App\Models\Company;
use Illuminate\Queue\SerializesModels;
use App\Models\Design;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Queue\SerializesModels;
/**
* Class DesignWasUpdated.

View File

@ -15,7 +15,6 @@ use App\Models\Company;
use App\Models\Document;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

View File

@ -15,7 +15,6 @@ use App\Models\ClientGatewayToken;
use App\Models\Company;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

View File

@ -11,12 +11,12 @@
namespace App\Events\Payment;
use App\Models\ClientContact;
use App\Models\Company;
use App\Models\Payment;
use App\Models\ClientContact;
use Illuminate\Queue\SerializesModels;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
/**
* Class PaymentWasEmailed.

View File

@ -12,7 +12,6 @@
namespace App\Events\PurchaseOrder;
use App\Models\Company;
use App\Models\PurchaseOrder;
use App\Models\PurchaseOrderInvitation;
use Illuminate\Queue\SerializesModels;

View File

@ -12,7 +12,6 @@
namespace App\Events\Quote;
use App\Models\Company;
use App\Models\Quote;
use App\Models\QuoteInvitation;
use Illuminate\Queue\SerializesModels;

View File

@ -5,7 +5,6 @@ namespace App\Events\Subscription;
use App\Models\Company;
use App\Models\Subscription;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

View File

@ -15,7 +15,6 @@ use App\Models\Company;
use App\Models\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

View File

@ -15,7 +15,6 @@ use App\Models\Company;
use App\Models\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

View File

@ -15,7 +15,6 @@ use App\Models\Company;
use App\Models\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

View File

@ -15,7 +15,6 @@ use App\Models\Company;
use App\Models\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

View File

@ -15,7 +15,6 @@ use App\Models\Company;
use App\Models\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

View File

@ -15,7 +15,6 @@ use App\Models\Company;
use App\Models\User;
use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Broadcasting\PrivateChannel;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

View File

@ -14,9 +14,9 @@ namespace App\Events\Vendor;
use App\Models\Company;
use App\Models\VendorContact;
use Illuminate\Broadcasting\Channel;
use Illuminate\Queue\SerializesModels;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;
/**
* Class VendorContactLoggedIn.

View File

@ -11,31 +11,31 @@
namespace App\Exceptions;
use Throwable;
use PDOException;
use App\Utils\Ninja;
use Sentry\State\Scope;
use Illuminate\Support\Arr;
use Illuminate\Http\Request;
use InvalidArgumentException;
use Sentry\Laravel\Integration;
use Illuminate\Support\Facades\Schema;
use Aws\Exception\CredentialsException;
use GuzzleHttp\Exception\ConnectException;
use Illuminate\Auth\AuthenticationException;
use League\Flysystem\UnableToCreateDirectory;
use Illuminate\Session\TokenMismatchException;
use Illuminate\Validation\ValidationException;
use Illuminate\Auth\Access\AuthorizationException;
use Illuminate\Queue\MaxAttemptsExceededException;
use Illuminate\Http\Exceptions\ThrottleRequestsException;
use Symfony\Component\Process\Exception\RuntimeException;
use Illuminate\Auth\AuthenticationException;
use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundException;
use Illuminate\Database\Eloquent\RelationNotFoundException;
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
use Illuminate\Http\Exceptions\ThrottleRequestsException;
use Illuminate\Http\Request;
use Illuminate\Queue\MaxAttemptsExceededException;
use Illuminate\Session\TokenMismatchException;
use Illuminate\Support\Arr;
use Illuminate\Support\Facades\Schema;
use Illuminate\Validation\ValidationException;
use InvalidArgumentException;
use League\Flysystem\UnableToCreateDirectory;
use PDOException;
use Sentry\Laravel\Integration;
use Sentry\State\Scope;
use Symfony\Component\Console\Exception\CommandNotFoundException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundException;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Process\Exception\RuntimeException;
use Throwable;
class Handler extends ExceptionHandler
{

View File

@ -13,8 +13,8 @@
namespace App\Exceptions;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class PaymentRefundFailed extends Exception
{

View File

@ -13,8 +13,8 @@
namespace App\Exceptions;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class QuoteConversion extends Exception
{

View File

@ -13,8 +13,8 @@
namespace App\Exceptions;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class YodleeApiException extends Exception
{

View File

@ -11,17 +11,17 @@
namespace App\Export\CSV;
use App\Models\Task;
use App\Utils\Ninja;
use League\Csv\Writer;
use App\Models\Company;
use App\Models\Activity;
use App\Libraries\MultiDB;
use App\Models\Activity;
use App\Models\Company;
use App\Models\DateFormat;
use App\Models\Task;
use App\Transformers\ActivityTransformer;
use App\Utils\Ninja;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\App;
use Illuminate\Database\Eloquent\Builder;
use App\Transformers\ActivityTransformer;
use League\Csv\Writer;
class ActivityExport extends BaseExport
{
@ -53,7 +53,7 @@ class ActivityExport extends BaseExport
$headerdisplay = $this->buildHeader();
$header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){
$header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) {
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();
@ -71,7 +71,7 @@ class ActivityExport extends BaseExport
{
return [
Carbon::parse($activity->created_at)->format($this->date_format),
ctrans("texts.activity_{$activity->activity_type_id}",[
ctrans("texts.activity_{$activity->activity_type_id}", [
'payment_amount' => $activity->payment ? $activity->payment->amount : '',
'adjustment' => $activity->payment ? $activity->payment->refunded : '',
'client' => $activity->client ? $activity->client->present()->name() : '',

View File

@ -11,30 +11,28 @@
namespace App\Export\CSV;
use App\Models\Activity;
use App\Models\Quote;
use App\Utils\Number;
use App\Models\Client;
use App\Models\Credit;
use App\Utils\Helpers;
use App\Models\ClientContact;
use App\Models\Company;
use App\Models\Credit;
use App\Models\Document;
use App\Models\Expense;
use App\Models\Invoice;
use App\Models\Payment;
use App\Models\Document;
use League\Fractal\Manager;
use App\Models\ClientContact;
use App\Models\PurchaseOrder;
use App\Models\RecurringInvoice;
use Illuminate\Support\Carbon;
use App\Utils\Traits\MakesHash;
use App\Transformers\TaskTransformer;
use App\Transformers\PaymentTransformer;
use Illuminate\Database\Eloquent\Builder;
use League\Fractal\Serializer\ArraySerializer;
use App\Models\Product;
use App\Models\PurchaseOrder;
use App\Models\Quote;
use App\Models\RecurringInvoice;
use App\Models\Task;
use App\Models\Vendor;
use App\Transformers\PaymentTransformer;
use App\Transformers\TaskTransformer;
use App\Utils\Helpers;
use App\Utils\Traits\MakesHash;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use League\Fractal\Manager;
use League\Fractal\Serializer\ArraySerializer;
class BaseExport
{
@ -446,8 +444,7 @@ class BaseExport
$client = Client::withTrashed()->find($this->input['client_id']);
$this->client_description = $client->present()->name;
return $query->where('client_id', $this->input['client_id']);
}
elseif(isset($this->input['clients']) && count($this->input['clients']) > 0) {
} elseif(isset($this->input['clients']) && count($this->input['clients']) > 0) {
$this->client_description = 'Multiple Clients';
return $query->whereIn('client_id', $this->input['clients']);
@ -459,8 +456,9 @@ class BaseExport
{
$parts = explode(".", $key);
if(!is_array($parts) || count($parts) < 2)
if(!is_array($parts) || count($parts) < 2) {
return '';
}
$value = '';
@ -497,8 +495,9 @@ class BaseExport
private function resolveVendorContactKey($column, $entity, $transformer)
{
if(!$entity->vendor)
if(!$entity->vendor) {
return "";
}
$primary_contact = $entity->vendor->primary_contact()->first() ?? $entity->vendor->contacts()->first();
@ -510,18 +509,21 @@ class BaseExport
private function resolveExpenseKey($column, $entity, $transformer)
{
if($column == 'user' && $entity?->expense?->user)
if($column == 'user' && $entity?->expense?->user) {
return $entity->expense->user->present()->name() ?? ' ';
}
if($column == 'assigned_user' && $entity?->expense?->assigned_user)
if($column == 'assigned_user' && $entity?->expense?->assigned_user) {
return $entity->expense->assigned_user->present()->name() ?? ' ';
}
if($column == 'category' && $entity->expense) {
return $entity->expense->category?->name ?? ' ';
}
if($entity instanceof Expense)
if($entity instanceof Expense) {
return '';
}
$transformed_entity = $transformer->includeExpense($entity);
@ -529,11 +531,13 @@ class BaseExport
$manager->setSerializer(new ArraySerializer());
$transformed_entity = $manager->createData($transformed_entity)->toArray();
if(array_key_exists($column, $transformed_entity))
if(array_key_exists($column, $transformed_entity)) {
return $transformed_entity[$column];
}
if(property_exists($entity, $column))
if(property_exists($entity, $column)) {
return $entity?->{$column} ?? '';
}
nlog("export: Could not resolve expense key: {$column}");
@ -560,8 +564,9 @@ class BaseExport
private function resolveVendorKey($column, $entity, $transformer)
{
if(!$entity->vendor)
if(!$entity->vendor) {
return '';
}
$transformed_entity = $transformer->includeVendor($entity);
@ -569,24 +574,29 @@ class BaseExport
$manager->setSerializer(new ArraySerializer());
$transformed_entity = $manager->createData($transformed_entity)->toArray();
if($column == 'name')
if($column == 'name') {
return $entity->vendor->present()->name() ?: '';
}
if($column == 'user_id')
if($column == 'user_id') {
return $entity->vendor->user->present()->name() ?: '';
}
if($column == 'country_id')
if($column == 'country_id') {
return $entity->vendor->country ? ctrans("texts.country_{$entity->vendor->country->name}") : '';
}
if ($column == 'currency_id') {
return $entity->vendor->currency() ? $entity->vendor->currency()->code : $entity->company->currency()->code;
}
if($column == 'status')
if($column == 'status') {
return $entity->stringStatus($entity->status_id) ?: '';
}
if(array_key_exists($column, $transformed_entity))
if(array_key_exists($column, $transformed_entity)) {
return $transformed_entity[$column];
}
// nlog("export: Could not resolve vendor key: {$column}");
@ -598,8 +608,9 @@ class BaseExport
private function resolveClientKey($column, $entity, $transformer)
{
if(!$entity->client)
if(!$entity->client) {
return '';
}
$transformed_client = $transformer->includeClient($entity);
@ -607,36 +618,46 @@ class BaseExport
$manager->setSerializer(new ArraySerializer());
$transformed_client = $manager->createData($transformed_client)->toArray();
if(in_array($column, ['client.name', 'name']))
if(in_array($column, ['client.name', 'name'])) {
return $transformed_client['display_name'];
}
if(in_array($column, ['client.user_id', 'user_id']))
if(in_array($column, ['client.user_id', 'user_id'])) {
return $entity->client->user->present()->name();
}
if(in_array($column, ['client.assigned_user_id', 'assigned_user_id']))
if(in_array($column, ['client.assigned_user_id', 'assigned_user_id'])) {
return $entity->client->assigned_user->present()->name();
}
if(in_array($column, ['client.country_id', 'country_id']))
if(in_array($column, ['client.country_id', 'country_id'])) {
return $entity->client->country ? ctrans("texts.country_{$entity->client->country->name}") : '';
}
if(in_array($column, ['client.shipping_country_id', 'shipping_country_id']))
if(in_array($column, ['client.shipping_country_id', 'shipping_country_id'])) {
return $entity->client->shipping_country ? ctrans("texts.country_{$entity->client->shipping_country->name}") : '';
}
if(in_array($column, ['client.size_id', 'size_id']))
if(in_array($column, ['client.size_id', 'size_id'])) {
return $entity->client->size?->name ?? '';
}
if(in_array($column, ['client.industry_id', 'industry_id']))
if(in_array($column, ['client.industry_id', 'industry_id'])) {
return $entity->client->industry?->name ?? '';
}
if (in_array($column, ['client.currency_id', 'currency_id']))
if (in_array($column, ['client.currency_id', 'currency_id'])) {
return $entity->client->currency() ? $entity->client->currency()->code : $entity->company->currency()->code;
}
if(in_array($column, ['payment_terms', 'client.payment_terms']))
if(in_array($column, ['payment_terms', 'client.payment_terms'])) {
return $entity->client->getSetting('payment_terms');
}
if(array_key_exists($column, $transformed_client))
if(array_key_exists($column, $transformed_client)) {
return $transformed_client[$column];
}
// nlog("export: Could not resolve client key: {$column}");
@ -650,8 +671,9 @@ class BaseExport
$transformed_entity = $transformer->transform($entity);
if($column == 'status')
if($column == 'status') {
return $entity->stringStatus($entity->status_id);
}
return '';
}
@ -682,16 +704,19 @@ class BaseExport
$manager->setSerializer(new ArraySerializer());
$transformed_invoices = $manager->createData($transformed_invoices)->toArray();
if(!isset($transformed_invoices['App\\Models\\Invoice']))
if(!isset($transformed_invoices['App\\Models\\Invoice'])) {
return '';
}
$transformed_invoices = $transformed_invoices['App\\Models\\Invoice'];
if(count($transformed_invoices) == 1 && array_key_exists($column, $transformed_invoices[0]))
if(count($transformed_invoices) == 1 && array_key_exists($column, $transformed_invoices[0])) {
return $transformed_invoices[0][$column];
}
if(count($transformed_invoices) > 1 && array_key_exists($column, $transformed_invoices[0]))
if(count($transformed_invoices) > 1 && array_key_exists($column, $transformed_invoices[0])) {
return implode(', ', array_column($transformed_invoices, $column));
}
return "";
@ -700,8 +725,9 @@ class BaseExport
if($transformer instanceof TaskTransformer && ($entity->invoice ?? false)) {
$transformed_invoice = $transformer->includeInvoice($entity);
if(!$transformed_invoice)
if(!$transformed_invoice) {
return '';
}
$manager = new Manager();
$manager->setSerializer(new ArraySerializer());
@ -721,7 +747,7 @@ class BaseExport
private function resolvePaymentKey($column, $entity, $transformer)
{
if($entity instanceof Payment){
if($entity instanceof Payment) {
$transformed_payment = $transformer->transform($entity);
@ -737,8 +763,9 @@ class BaseExport
}
if($column == 'amount')
if($column == 'amount') {
return $entity->payments()->exists() ? $entity->payments()->withoutTrashed()->sum('paymentables.amount') : ctrans('texts.unpaid');
}
if($column == 'refunded') {
return $entity->payments()->exists() ? $entity->payments()->withoutTrashed()->sum('paymentables.refunded') : '';
@ -753,24 +780,28 @@ class BaseExport
$payment = $entity->payments()->withoutTrashed()->first();
if(!$payment)
if(!$payment) {
return '';
}
if($column == 'method')
if($column == 'method') {
return $payment->translatedType();
}
if($column == 'currency')
if($column == 'currency') {
return $payment?->currency?->code ?? '';
}
$payment_transformer = new PaymentTransformer();
$transformed_payment = $payment_transformer->transform($payment);
if($column == 'status'){
if($column == 'status') {
return $payment->stringStatus($transformed_payment['status_id']);
}
if(array_key_exists($column, $transformed_payment))
if(array_key_exists($column, $transformed_payment)) {
return $transformed_payment[$column];
}
return '';
@ -782,8 +813,9 @@ class BaseExport
$status_parameters = explode(',', $status);
if(in_array('all', $status_parameters))
if(in_array('all', $status_parameters)) {
return $query;
}
$query->where(function ($nested) use ($status_parameters) {
@ -816,9 +848,9 @@ class BaseExport
->orWhere('partial_due_date', '<', Carbon::now());
}
if(in_array('viewed', $status_parameters)){
if(in_array('viewed', $status_parameters)) {
$nested->whereHas('invitations', function ($q){
$nested->whereHas('invitations', function ($q) {
$q->whereNotNull('viewed_date')->whereNotNull('deleted_at');
});
@ -884,8 +916,9 @@ class BaseExport
$first_month_of_year = $this->company->getSetting('first_month_of_year') ?? 1;
$fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1);
if(now()->lt($fin_year_start))
if(now()->lt($fin_year_start)) {
$fin_year_start->subYearNoOverflow();
}
$this->start_date = $fin_year_start->format('Y-m-d');
$this->end_date = $fin_year_start->copy()->addYear()->subDay()->format('Y-m-d');
@ -896,8 +929,9 @@ class BaseExport
$fin_year_start = now()->createFromDate(now()->year, $first_month_of_year, 1);
$fin_year_start->subYearNoOverflow();
if(now()->subYear()->lt($fin_year_start))
if(now()->subYear()->lt($fin_year_start)) {
$fin_year_start->subYearNoOverflow();
}
$this->start_date = $fin_year_start->format('Y-m-d');
$this->end_date = $fin_year_start->copy()->addYear()->subDay()->format('Y-m-d');
@ -979,9 +1013,10 @@ class BaseExport
$prefix = ctrans('texts.expense')." ";
$key = array_search($value, $this->expense_report_keys);
if(!$key && $value == 'expense.category')
if(!$key && $value == 'expense.category') {
$key = 'category';
}
}
if(!$key) {
$prefix = ctrans('texts.task')." ";
@ -1024,42 +1059,36 @@ class BaseExport
$key = str_replace('product.', '', $key);
$key = str_replace('task.', '', $key);
if(stripos($value, 'custom_value') !== false)
{
if(stripos($value, 'custom_value') !== false) {
$parts = explode(".", $value);
if(count($parts) == 2 && in_array($parts[0], ['credit','quote','invoice','purchase_order','recurring_invoice'])){
if(count($parts) == 2 && in_array($parts[0], ['credit','quote','invoice','purchase_order','recurring_invoice'])) {
$entity = "invoice".substr($parts[1], -1);
$prefix = ctrans("texts.".$parts[0]);
$fallback = "custom_value".substr($parts[1], -1);
$custom_field_label = $helper->makeCustomField($this->company->custom_fields, $entity);
if(strlen($custom_field_label) > 1)
if(strlen($custom_field_label) > 1) {
$header[] = $custom_field_label;
else {
} else {
$header[] = $prefix . " ". ctrans("texts.{$fallback}");
}
}
elseif(count($parts) == 2 && (stripos($parts[0], 'vendor_contact') !== false || stripos($parts[0], 'contact') !== false)) {
} elseif(count($parts) == 2 && (stripos($parts[0], 'vendor_contact') !== false || stripos($parts[0], 'contact') !== false)) {
$parts[0] = str_replace('vendor_contact', 'contact', $parts[0]);
$entity = "contact".substr($parts[1], -1);
$custom_field_string = strlen($helper->makeCustomField($this->company->custom_fields, $entity)) > 1 ? $helper->makeCustomField($this->company->custom_fields, $entity) : ctrans("texts.{$parts[1]}");
$header[] = ctrans("texts.{$parts[0]}") . " " . $custom_field_string;
}
elseif(count($parts) == 2 && in_array(substr($original_key, 0, -1), ['credit','quote','invoice','purchase_order','recurring_invoice','task'])){
$custom_field_string = strlen($helper->makeCustomField($this->company->custom_fields, "product".substr($original_key,-1))) > 1 ? $helper->makeCustomField($this->company->custom_fields, "product".substr($original_key,-1)) : ctrans("texts.{$parts[1]}");
} elseif(count($parts) == 2 && in_array(substr($original_key, 0, -1), ['credit','quote','invoice','purchase_order','recurring_invoice','task'])) {
$custom_field_string = strlen($helper->makeCustomField($this->company->custom_fields, "product".substr($original_key, -1))) > 1 ? $helper->makeCustomField($this->company->custom_fields, "product".substr($original_key, -1)) : ctrans("texts.{$parts[1]}");
$header[] = ctrans("texts.{$parts[0]}") . " " . $custom_field_string;
}
else{
} else {
$header[] = "{$prefix}" . ctrans("texts.{$key}");
}
}
else
{
} else {
$header[] = "{$prefix}" . ctrans("texts.{$key}");
}
}
@ -1146,11 +1175,13 @@ class BaseExport
$column_key = $value;
if($value == 'type_id' || $value == 'item.type_id')
if($value == 'type_id' || $value == 'item.type_id') {
$column_key = 'type';
}
if($value == 'tax_id' || $value == 'item.tax_id')
if($value == 'tax_id' || $value == 'item.tax_id') {
$column_key = 'tax_category';
}
$clean_row[$key]['entity'] = $report_keys[0];
$clean_row[$key]['id'] = $report_keys[1] ?? $report_keys[0];

View File

@ -11,16 +11,16 @@
namespace App\Export\CSV;
use App\Libraries\MultiDB;
use App\Models\Client;
use App\Models\Company;
use App\Transformers\ClientContactTransformer;
use App\Transformers\ClientTransformer;
use App\Utils\Ninja;
use App\Utils\Number;
use App\Models\Client;
use League\Csv\Writer;
use App\Models\Company;
use App\Libraries\MultiDB;
use Illuminate\Support\Facades\App;
use App\Transformers\ClientTransformer;
use Illuminate\Database\Eloquent\Builder;
use App\Transformers\ClientContactTransformer;
use Illuminate\Support\Facades\App;
use League\Csv\Writer;
class ClientExport extends BaseExport
{
@ -92,7 +92,7 @@ class ClientExport extends BaseExport
$headerdisplay = $this->buildHeader();
$header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){
$header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) {
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();
@ -191,10 +191,11 @@ class ClientExport extends BaseExport
$clean_row[$key]['value'] = $row[$column_key];
$clean_row[$key]['identifier'] = $value;
if(in_array($clean_row[$key]['id'], ['paid_to_date', 'balance', 'credit_balance','payment_balance']))
if(in_array($clean_row[$key]['id'], ['paid_to_date', 'balance', 'credit_balance','payment_balance'])) {
$clean_row[$key]['display_value'] = Number::formatMoney($row[$column_key], $resource);
else
} else {
$clean_row[$key]['display_value'] = $row[$column_key];
}
}

View File

@ -88,7 +88,7 @@ class ContactExport extends BaseExport
$headerdisplay = $this->buildHeader();
$header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){
$header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) {
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();

View File

@ -11,15 +11,15 @@
namespace App\Export\CSV;
use App\Libraries\MultiDB;
use App\Models\Company;
use App\Models\Credit;
use App\Transformers\CreditTransformer;
use App\Utils\Ninja;
use App\Utils\Number;
use App\Models\Credit;
use League\Csv\Writer;
use App\Models\Company;
use App\Libraries\MultiDB;
use Illuminate\Support\Facades\App;
use App\Transformers\CreditTransformer;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\App;
use League\Csv\Writer;
class CreditExport extends BaseExport
{
@ -43,7 +43,7 @@ class CreditExport extends BaseExport
$headerdisplay = $this->buildHeader();
$header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){
$header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) {
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();
@ -70,10 +70,11 @@ class CreditExport extends BaseExport
$clean_row[$key]['value'] = $row[$column_key];
$clean_row[$key]['identifier'] = $value;
if(in_array($clean_row[$key]['id'], ['paid_to_date','total_taxes','amount', 'balance', 'partial', 'refunded', 'applied','unit_cost','cost','price']))
if(in_array($clean_row[$key]['id'], ['paid_to_date','total_taxes','amount', 'balance', 'partial', 'refunded', 'applied','unit_cost','cost','price'])) {
$clean_row[$key]['display_value'] = Number::formatMoney($row[$column_key], $resource->client);
else
} else {
$clean_row[$key]['display_value'] = $row[$column_key];
}
}
@ -139,10 +140,9 @@ class CreditExport extends BaseExport
$entity[$keyval] = $transformed_credit[$credit_key];
} elseif (isset($transformed_credit[$keyval])) {
$entity[$keyval] = $transformed_credit[$keyval];
} elseif(isset($transformed_credit[$searched_credit_key])){
} elseif(isset($transformed_credit[$searched_credit_key])) {
$entity[$keyval] = $transformed_credit[$searched_credit_key];
}
else {
} else {
$entity[$keyval] = $this->resolveKey($keyval, $credit, $this->credit_transformer);
}

View File

@ -49,7 +49,7 @@ class DocumentExport extends BaseExport
$headerdisplay = $this->buildHeader();
$header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){
$header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) {
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();

View File

@ -43,7 +43,7 @@ class ExpenseExport extends BaseExport
$headerdisplay = $this->buildHeader();
$header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){
$header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) {
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();

View File

@ -11,16 +11,14 @@
namespace App\Export\CSV;
use App\Utils\Ninja;
use App\Utils\Number;
use League\Csv\Writer;
use App\Libraries\MultiDB;
use App\Models\Company;
use App\Models\Invoice;
use App\Libraries\MultiDB;
use App\Export\CSV\BaseExport;
use Illuminate\Support\Facades\App;
use App\Transformers\InvoiceTransformer;
use App\Utils\Ninja;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\App;
use League\Csv\Writer;
class InvoiceExport extends BaseExport
{
@ -74,7 +72,7 @@ class InvoiceExport extends BaseExport
$headerdisplay = $this->buildHeader();
$header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){
$header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) {
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();

View File

@ -82,7 +82,7 @@ class InvoiceItemExport extends BaseExport
$headerdisplay = $this->buildHeader();
$header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){
$header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) {
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();
@ -139,16 +139,17 @@ class InvoiceItemExport extends BaseExport
$tmp_key = str_replace("item.", "", $key);
if($tmp_key == 'type_id')
if($tmp_key == 'type_id') {
$tmp_key = 'type';
}
if($tmp_key == 'tax_id')
if($tmp_key == 'tax_id') {
$tmp_key = 'tax_category';
}
if (property_exists($item, $tmp_key)) {
$item_array[$key] = $item->{$tmp_key};
}
else {
} else {
$item_array[$key] = '';
}
}
@ -174,15 +175,15 @@ class InvoiceItemExport extends BaseExport
$parts = explode('.', $key);
if(is_array($parts) && $parts[0] == 'item')
if(is_array($parts) && $parts[0] == 'item') {
continue;
}
if (is_array($parts) && $parts[0] == 'invoice' && array_key_exists($parts[1], $transformed_invoice)) {
$entity[$key] = $transformed_invoice[$parts[1]];
}else if (array_key_exists($key, $transformed_invoice)) {
} elseif (array_key_exists($key, $transformed_invoice)) {
$entity[$key] = $transformed_invoice[$key];
}
else {
} else {
$entity[$key] = $this->resolveKey($key, $invoice, $this->invoice_transformer);
}
}

View File

@ -71,8 +71,6 @@ class PaymentExport extends BaseExport
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();
nlog($header);
$report = $query->cursor()
->map(function ($resource) {
$row = $this->buildRow($resource);

View File

@ -41,7 +41,7 @@ class ProductExport extends BaseExport
$headerdisplay = $this->buildHeader();
$header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){
$header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) {
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();

View File

@ -11,15 +11,14 @@
namespace App\Export\CSV;
use App\Utils\Ninja;
use App\Utils\Number;
use League\Csv\Writer;
use App\Models\Company;
use App\Libraries\MultiDB;
use App\Models\Company;
use App\Models\PurchaseOrder;
use Illuminate\Support\Facades\App;
use App\Transformers\PurchaseOrderTransformer;
use App\Utils\Ninja;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\App;
use League\Csv\Writer;
class PurchaseOrderExport extends BaseExport
{
@ -116,7 +115,7 @@ class PurchaseOrderExport extends BaseExport
$headerdisplay = $this->buildHeader();
$header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){
$header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) {
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();

View File

@ -11,14 +11,14 @@
namespace App\Export\CSV;
use App\Utils\Ninja;
use League\Csv\Writer;
use App\Models\Company;
use App\Libraries\MultiDB;
use App\Models\Company;
use App\Models\PurchaseOrder;
use Illuminate\Support\Facades\App;
use Illuminate\Database\Eloquent\Builder;
use App\Transformers\PurchaseOrderTransformer;
use App\Utils\Ninja;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Facades\App;
use League\Csv\Writer;
class PurchaseOrderItemExport extends BaseExport
{
@ -74,7 +74,7 @@ class PurchaseOrderItemExport extends BaseExport
$headerdisplay = $this->buildHeader();
$header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){
$header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) {
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();

View File

@ -76,7 +76,7 @@ class QuoteItemExport extends BaseExport
$headerdisplay = $this->buildHeader();
$header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){
$header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) {
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();
@ -135,16 +135,17 @@ class QuoteItemExport extends BaseExport
$tmp_key = str_replace("item.", "", $key);
if($tmp_key == 'type_id')
if($tmp_key == 'type_id') {
$tmp_key = 'type';
}
if($tmp_key == 'tax_id')
if($tmp_key == 'tax_id') {
$tmp_key = 'tax_category';
}
if (property_exists($item, $tmp_key)) {
$item_array[$key] = $item->{$tmp_key};
}
else {
} else {
$item_array[$key] = '';
}
}

View File

@ -88,7 +88,7 @@ class RecurringInvoiceExport extends BaseExport
$headerdisplay = $this->buildHeader();
$header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){
$header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) {
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();

View File

@ -101,7 +101,7 @@ class TaskExport extends BaseExport
$headerdisplay = $this->buildHeader();
$header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){
$header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) {
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();
@ -110,8 +110,7 @@ class TaskExport extends BaseExport
$this->buildRow($resource);
foreach($this->storage_array as $row)
{
foreach($this->storage_array as $row) {
$this->storage_item_array[] = $this->processMetaData($row, $resource);
}

View File

@ -12,8 +12,8 @@
namespace App\Export\CSV;
use App\Libraries\MultiDB;
use App\Models\Vendor;
use App\Models\Company;
use App\Models\Vendor;
use App\Transformers\VendorContactTransformer;
use App\Transformers\VendorTransformer;
use App\Utils\Ninja;
@ -73,7 +73,7 @@ class VendorExport extends BaseExport
$headerdisplay = $this->buildHeader();
$header = collect($this->input['report_keys'])->map(function ($key, $value) use($headerdisplay){
$header = collect($this->input['report_keys'])->map(function ($key, $value) use ($headerdisplay) {
return ['identifier' => $key, 'display_value' => $headerdisplay[$value]];
})->toArray();

View File

@ -11,13 +11,13 @@
namespace App\Factory;
use App\Utils\Ninja;
use App\Models\Company;
use App\Libraries\MultiDB;
use App\Utils\Traits\MakesHash;
use App\DataMapper\Tax\TaxModel;
use App\DataMapper\CompanySettings;
use App\DataMapper\ClientRegistrationFields;
use App\DataMapper\CompanySettings;
use App\DataMapper\Tax\TaxModel;
use App\Libraries\MultiDB;
use App\Models\Company;
use App\Utils\Ninja;
use App\Utils\Traits\MakesHash;
class CompanyFactory
{

View File

@ -25,6 +25,8 @@ class DesignFactory
$design->is_active = true;
$design->is_custom = true;
$design->name = '';
$design->is_template = false;
$design->entities = '';
$design->design = new DesignBlocks();
return $design;

View File

@ -63,7 +63,7 @@ class InvoiceItemFactory
$item->line_total = $item->quantity * $item->cost;
$item->is_amount_discount = true;
$item->discount = $faker->numberBetween(1, 10);
$item->notes = $faker->realText(50);
$item->notes = str_replace(['"',"'"], ['',""], $faker->realText(20));
$item->product_key = $faker->word();
// $item->custom_value1 = $faker->realText(10);
// $item->custom_value2 = $faker->realText(10);

View File

@ -53,7 +53,7 @@ class BankTransactionFilters extends QueryFilters
}
/**
/**
* Filter based on client status.
*
* Statuses we need to handle

View File

@ -144,7 +144,7 @@ class CreditFilters extends QueryFilters
return $this->builder->company();
}
// return $this->builder->whereCompanyId(auth()->user()->company()->id);
// return $this->builder->whereCompanyId(auth()->user()->company()->id);
}
/**

View File

@ -54,6 +54,19 @@ class DesignFilters extends QueryFilters
return $this->builder->orderBy($sort_col[0], $sort_col[1]);
}
public function entities(string $entities = ''): Builder
{
if (strlen($entities) == 0 || str_contains($entities, ',')) {
return $this->builder;
}
return $this->builder
->where('is_template', true)
->whereRaw('FIND_IN_SET( ? ,entities)', [trim($entities)]);
}
/**
* Filters the query by the users company ID.
*
@ -64,11 +77,22 @@ class DesignFilters extends QueryFilters
/** @var \App\Models\User $user */
$user = auth()->user();
return $this->builder->where(function ($query) use($user){
return $this->builder->where(function ($query) use ($user) {
$query->where('company_id', $user->company()->id)->orWhere('company_id', null)->orderBy('id', 'asc');
});
}
public function template(string $template = 'false'): Builder
{
if (strlen($template) == 0) {
return $this->builder;
}
$bool_val = $template == 'true' ? true : false;
return $this->builder->where('is_template', $bool_val);
}
/**
* Filter the designs by `is_custom` column.
*

View File

@ -125,7 +125,7 @@ class ExpenseFilters extends QueryFilters
$search_key = $split[0] == 'client' ? 'client_id' : 'project_id';
return $this->builder->whereHas('invoice', function ($query) use ($search_key, $split){
return $this->builder->whereHas('invoice', function ($query) use ($search_key, $split) {
$query->where($search_key, $this->decodePrimaryKey($split[1]))
->whereIn('status_id', [\App\Models\Invoice::STATUS_DRAFT, \App\Models\Invoice::STATUS_SENT, \App\Models\Invoice::STATUS_PARTIAL]);
});

View File

@ -11,14 +11,13 @@
namespace App\Filters;
use RuntimeException;
use App\Models\Client;
use App\Models\Invoice;
use App\Filters\QueryFilters;
use InvalidArgumentException;
use Illuminate\Support\Carbon;
use App\Utils\Traits\MakesHash;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Support\Carbon;
use InvalidArgumentException;
use RuntimeException;
/**
* InvoiceFilters.
@ -241,15 +240,13 @@ class InvoiceFilters extends QueryFilters
return $this->builder;
}
try{
try {
$start_date = Carbon::parse($parts[1]);
$end_date = Carbon::parse($parts[2]);
return $this->builder->whereBetween($parts[0], [$start_date, $end_date]);
}
catch(\Exception $e){
} catch(\Exception $e) {
return $this->builder;
}

View File

@ -12,9 +12,8 @@
namespace App\Filters;
use App\Models\Payment;
use Illuminate\Support\Carbon;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Contracts\Database\Eloquent\Builder as EloquentBuilder;
use Illuminate\Support\Carbon;
/**
* PaymentFilters.
@ -37,7 +36,7 @@ class PaymentFilters extends QueryFilters
return $this->builder->where(function ($query) use ($filter) {
$query->where('amount', 'like', '%'.$filter.'%')
->orWhere('date', 'like', '%'.$filter.'%')
->orWhere('number','like', '%'.$filter.'%')
->orWhere('number', 'like', '%'.$filter.'%')
->orWhere('transaction_reference', 'like', '%'.$filter.'%')
->orWhere('custom_value1', 'like', '%'.$filter.'%')
->orWhere('custom_value2', 'like', '%'.$filter.'%')
@ -190,15 +189,13 @@ class PaymentFilters extends QueryFilters
return $this->builder;
}
try{
try {
$start_date = Carbon::parse($parts[1]);
$end_date = Carbon::parse($parts[2]);
return $this->builder->whereBetween($parts[0], [$start_date, $end_date]);
}
catch(\Exception $e){
} catch(\Exception $e) {
return $this->builder;
}

View File

@ -145,7 +145,7 @@ class PurchaseOrderFilters extends QueryFilters
return $this->builder->company();
}
// return $this->builder->whereCompanyId(auth()->user()->company()->id);
// return $this->builder->whereCompanyId(auth()->user()->company()->id);
}
/**

View File

@ -146,7 +146,7 @@ class QuoteFilters extends QueryFilters
return $this->builder;
}
if($sort_col[0] == 'client_id'){
if($sort_col[0] == 'client_id') {
return $this->builder->orderBy(\App\Models\Client::select('name')
->whereColumn('clients.id', 'quotes.client_id'), $sort_col[1]);

View File

@ -136,7 +136,7 @@ class TaskFilters extends QueryFilters
$status_parameters = explode(',', $value);
if(count($status_parameters) >= 1){
if(count($status_parameters) >= 1) {
$this->builder->where(function ($query) use ($status_parameters) {
$query->whereIn('status_id', $this->transformKeys($status_parameters))->whereNull('invoice_id');

View File

@ -11,10 +11,9 @@
namespace App\Helpers\Bank\Yodlee\DTO;
use Spatie\LaravelData\Data;
use Spatie\LaravelData\Attributes\MapInputName;
use Spatie\LaravelData\Attributes\MapOutputName;
use Illuminate\Support\Collection;
use Spatie\LaravelData\Attributes\MapInputName;
use Spatie\LaravelData\Data;
/**
* [

View File

@ -88,20 +88,19 @@ class AccountTransformer implements AccountTransformerInterface
if(property_exists($account, 'currentBalance')) {
$current_balance = $account->currentBalance->amount ?? 0;
$account_currency = $account->currentBalance->currency ?? '';
}
elseif(property_exists($account, 'balance')){
} elseif(property_exists($account, 'balance')) {
$current_balance = $account->balance->amount ?? 0;
$account_currency = $account->balance->currency ?? '';
}
$account_status = $account->accountStatus;
if(property_exists($account, 'dataset')){
if(property_exists($account, 'dataset')) {
$dataset = $account->dataset[0];
$status = false;
$update = false;
match($dataset->additionalStatus ?? ''){
match($dataset->additionalStatus ?? '') {
'LOGIN_IN_PROGRESS' => $status = 'Data retrieval in progress.',
'USER_INPUT_REQUIRED' => $status = 'Please reconnect your account, authentication required.',
'LOGIN_SUCCESS' => $status = 'Data retrieval in progress',
@ -116,21 +115,20 @@ class AccountTransformer implements AccountTransformerInterface
default => $status = false
};
if($status){
if($status) {
$account_status = $status;
}
match($dataset->updateEligibility ?? ''){
match($dataset->updateEligibility ?? '') {
'ALLOW_UPDATE' => $update = 'Account connection stable.',
'ALLOW_UPDATE_WITH_CREDENTIALS' => $update = 'Please reconnect your account with updated credentials.',
'DISALLOW_UPDATE' => $update = 'Update not available due to technical issues.',
default => $update = false,
};
if($status && $update){
if($status && $update) {
$account_status = $status . ' - ' . $update;
}
elseif($update){
} elseif($update) {
$account_status = $update;
}

View File

@ -127,12 +127,14 @@ class IncomeTransformer implements BankRevenueInterface
foreach ($transaction->transaction as $transaction) {
//do not store duplicate / pending transactions
if (property_exists($transaction, 'status') && $transaction->status == 'PENDING')
if (property_exists($transaction, 'status') && $transaction->status == 'PENDING') {
continue;
}
//some object do no store amounts ignore these
if(!property_exists($transaction, 'amount'))
if(!property_exists($transaction, 'amount')) {
continue;
}
$data[] = $this->transformTransaction($transaction);
}

View File

@ -64,7 +64,7 @@ class EpcQrGenerator
} catch(\Exception $e) {
nlog("EPC QR failure => ".$e->getMessage());
return '';
} catch( InvalidArgumentException $e) {
} catch(InvalidArgumentException $e) {
nlog("EPC QR failure => ".$e->getMessage());
return '';
}

View File

@ -11,16 +11,16 @@
namespace App\Helpers\Invoice;
use App\Models\Quote;
use App\DataMapper\BaseSettings;
use App\DataMapper\InvoiceItem;
use App\DataMapper\Tax\RuleInterface;
use App\Models\Client;
use App\Models\Credit;
use App\Models\Invoice;
use App\Models\PurchaseOrder;
use App\Models\RecurringQuote;
use App\DataMapper\InvoiceItem;
use App\DataMapper\BaseSettings;
use App\Models\Quote;
use App\Models\RecurringInvoice;
use App\DataMapper\Tax\RuleInterface;
use App\Models\RecurringQuote;
use App\Utils\Traits\NumberFormatter;
class InvoiceItemSum
@ -125,7 +125,7 @@ class InvoiceItemSum
private RuleInterface $rule;
public function __construct( RecurringInvoice | Invoice | Quote | Credit | PurchaseOrder | RecurringQuote $invoice)
public function __construct(RecurringInvoice | Invoice | Quote | Credit | PurchaseOrder | RecurringQuote $invoice)
{
$this->tax_collection = collect([]);
@ -175,14 +175,15 @@ class InvoiceItemSum
return $this;
}
if (in_array($this->client->company->country()->iso_3166_2, $this->tax_jurisdictions) ) { //only calculate for supported tax jurisdictions
if (in_array($this->client->company->country()->iso_3166_2, $this->tax_jurisdictions)) { //only calculate for supported tax jurisdictions
$class = "App\DataMapper\Tax\\".$this->client->company->country()->iso_3166_2."\\Rule";
$this->rule = new $class();
if($this->rule->regionWithNoTaxCoverage($this->client->country->iso_3166_2))
if($this->rule->regionWithNoTaxCoverage($this->client->country->iso_3166_2)) {
return $this;
}
$this->rule
->setEntity($this->invoice)
@ -399,7 +400,7 @@ class InvoiceItemSum
$item_tax = 0;
//$amount = $this->item->line_total - ($this->item->line_total * ($this->invoice->discount / $this->sub_total));
$amount = ($this->sub_total > 0) ? $this->item->line_total - ($this->invoice->discount * ( $this->item->line_total / $this->sub_total)) : 0;
$amount = ($this->sub_total > 0) ? $this->item->line_total - ($this->invoice->discount * ($this->item->line_total / $this->sub_total)) : 0;
$item_tax_rate1_total = $this->calcAmountLineTax($this->item->tax_rate1, $amount);

View File

@ -11,14 +11,14 @@
namespace App\Helpers\Invoice;
use App\Models\Quote;
use App\DataMapper\Tax\RuleInterface;
use App\Models\Client;
use App\Models\Credit;
use App\Models\Invoice;
use App\Models\PurchaseOrder;
use App\Models\RecurringQuote;
use App\Models\Quote;
use App\Models\RecurringInvoice;
use App\DataMapper\Tax\RuleInterface;
use App\Models\RecurringQuote;
use App\Utils\Traits\NumberFormatter;
class InvoiceItemSumInclusive
@ -404,14 +404,15 @@ class InvoiceItemSumInclusive
return $this;
}
if (in_array($this->client->company->country()->iso_3166_2, $this->tax_jurisdictions) ) { //only calculate for supported tax jurisdictions
if (in_array($this->client->company->country()->iso_3166_2, $this->tax_jurisdictions)) { //only calculate for supported tax jurisdictions
$class = "App\DataMapper\Tax\\".$this->client->company->country()->iso_3166_2."\\Rule";
$this->rule = new $class();
if($this->rule->regionWithNoTaxCoverage($this->client->country->iso_3166_2))
if($this->rule->regionWithNoTaxCoverage($this->client->country->iso_3166_2)) {
return $this;
}
$this->rule
->setEntity($this->invoice)

View File

@ -11,15 +11,15 @@
namespace App\Helpers\Invoice;
use App\Models\Quote;
use App\Utils\Number;
use App\Models\Credit;
use App\Models\Invoice;
use App\Models\PurchaseOrder;
use App\Models\RecurringQuote;
use App\Models\Quote;
use App\Models\RecurringInvoice;
use Illuminate\Support\Collection;
use App\Models\RecurringQuote;
use App\Utils\Number;
use App\Utils\Traits\NumberFormatter;
use Illuminate\Support\Collection;
class InvoiceSum
{

View File

@ -11,15 +11,14 @@
namespace App\Helpers\Invoice;
use App\Models\Quote;
use App\Models\Credit;
use App\Models\Invoice;
use App\Models\PurchaseOrder;
use App\Models\RecurringQuote;
use App\Models\Quote;
use App\Models\RecurringInvoice;
use Illuminate\Support\Collection;
use App\Models\RecurringQuote;
use App\Utils\Traits\NumberFormatter;
use App\Helpers\Invoice\InvoiceItemSumInclusive;
use Illuminate\Support\Collection;
class InvoiceSumInclusive
{

View File

@ -11,17 +11,17 @@
namespace App\Http\Controllers;
use App\Models\Account;
use App\Libraries\MultiDB;
use App\Utils\TruthSource;
use App\Models\CompanyUser;
use Illuminate\Http\Response;
use App\Jobs\Account\CreateAccount;
use App\Transformers\AccountTransformer;
use App\Transformers\CompanyUserTransformer;
use Illuminate\Foundation\Bus\DispatchesJobs;
use App\Http\Requests\Account\CreateAccountRequest;
use App\Http\Requests\Account\UpdateAccountRequest;
use App\Jobs\Account\CreateAccount;
use App\Libraries\MultiDB;
use App\Models\Account;
use App\Models\CompanyUser;
use App\Transformers\AccountTransformer;
use App\Transformers\CompanyUserTransformer;
use App\Utils\TruthSource;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Http\Response;
class AccountController extends BaseController
{

View File

@ -11,19 +11,19 @@
namespace App\Http\Controllers;
use stdClass;
use App\Utils\Ninja;
use App\Models\Activity;
use Illuminate\Http\Request;
use App\Utils\Traits\MakesHash;
use App\Utils\PhantomJS\Phantom;
use App\Utils\HostedPDF\NinjaPdf;
use App\Utils\Traits\Pdf\PdfMaker;
use App\Utils\Traits\Pdf\PageNumbering;
use Illuminate\Support\Facades\Storage;
use App\Transformers\ActivityTransformer;
use App\Http\Requests\Activity\ShowActivityRequest;
use App\Http\Requests\Activity\DownloadHistoricalEntityRequest;
use App\Http\Requests\Activity\ShowActivityRequest;
use App\Models\Activity;
use App\Transformers\ActivityTransformer;
use App\Utils\HostedPDF\NinjaPdf;
use App\Utils\Ninja;
use App\Utils\PhantomJS\Phantom;
use App\Utils\Traits\MakesHash;
use App\Utils\Traits\Pdf\PageNumbering;
use App\Utils\Traits\Pdf\PdfMaker;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use stdClass;
class ActivityController extends BaseController
{

View File

@ -11,13 +11,13 @@
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use App\Libraries\MultiDB;
use App\Models\Account;
use App\Models\Company;
use App\Libraries\MultiDB;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Password;
use Illuminate\Foundation\Auth\SendsPasswordResetEmails;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Password;
class ForgotPasswordController extends Controller
{

View File

@ -25,4 +25,3 @@ class PasswordTimeoutController extends Controller
return $cached ? response()->json(['message' => 'Password is valid'], 200) : response()->json(['message' => 'Invalid Password'], 412);
}
}

View File

@ -111,8 +111,9 @@ class ResetPasswordController extends Controller
{
auth()->logout();
if(request()->has('react') || request()->hasHeader('X-React'))
if(request()->has('react') || request()->hasHeader('X-React')) {
return redirect(config('ninja.react_url').'/#/login');
}
return redirect('/');
}
@ -130,11 +131,11 @@ class ResetPasswordController extends Controller
return new JsonResponse(['message' => trans($response)], 200);
}
if($request->hasHeader('X-REACT') || $request->has('react')){
if($request->hasHeader('X-REACT') || $request->has('react')) {
return redirect(config('ninja.react_url').'/#/login');
}
else
} else {
return redirect('/#/login');
}
return redirect($this->redirectPath())
->with('status', trans($response));

View File

@ -12,13 +12,13 @@
namespace App\Http\Controllers\Bank;
use App\Helpers\Bank\Yodlee\DTO\AccountSummary;
use Illuminate\Http\Request;
use App\Models\BankIntegration;
use App\Helpers\Bank\Yodlee\Yodlee;
use App\Http\Controllers\BaseController;
use App\Jobs\Bank\ProcessBankTransactions;
use App\Http\Requests\Yodlee\YodleeAuthRequest;
use App\Http\Requests\Yodlee\YodleeAdminRequest;
use App\Http\Requests\Yodlee\YodleeAuthRequest;
use App\Jobs\Bank\ProcessBankTransactions;
use App\Models\BankIntegration;
use Illuminate\Http\Request;
class YodleeController extends BaseController
{
@ -177,8 +177,8 @@ class YodleeController extends BaseController
// return response()->json(['message' => 'Unauthorized'], 403);
}
/*
{
/*
{
"event":{
"notificationId":"63c73475-4db5-49ef-8553-8303337ca7c3",
"info":"LATEST_BALANCE_UPDATES",
@ -197,8 +197,8 @@ class YodleeController extends BaseController
]
}
}
}
*/
}
*/
public function balanceWebhook(Request $request)
{
nlog("yodlee refresh");
@ -211,8 +211,8 @@ class YodleeController extends BaseController
// return response()->json(['message' => 'Unauthorized'], 403);
}
/*
{
/*
{
"event":{
"data":[
{
@ -232,8 +232,8 @@ class YodleeController extends BaseController
"notificationId":"4e672150-156048777",
"info":"AUTO_REFRESH_UPDATES"
}
}
*/
}
*/
public function refreshUpdatesWebhook(Request $request)
{
//notifies a user if there are problems with yodlee accessing the data
@ -248,8 +248,8 @@ class YodleeController extends BaseController
}
/*
"event": {
/*
"event": {
"notificationId": "64b7ed1a-1530523285",
"info": "DATA_UPDATES.USER_DATA",
"data": {
@ -267,8 +267,8 @@ class YodleeController extends BaseController
}]
}]
}
}
*/
}
*/
public function dataUpdatesWebhook(Request $request)
{
//this is the main hook we use for notifications
@ -292,8 +292,9 @@ class YodleeController extends BaseController
->where('account_id', $account_number)
->exists();
if(!$bank_integration)
if(!$bank_integration) {
return response()->json(['message' => 'Account does not exist.'], 400);
}
$yodlee = new Yodlee($user->account->bank_integration_account_id);

View File

@ -11,26 +11,25 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use Illuminate\Http\Response;
use App\Models\BankIntegration;
use App\Utils\Traits\MakesHash;
use Illuminate\Http\JsonResponse;
use App\Helpers\Bank\Yodlee\Yodlee;
use Illuminate\Support\Facades\Cache;
use App\Factory\BankIntegrationFactory;
use App\Filters\BankIntegrationFilters;
use App\Jobs\Bank\ProcessBankTransactions;
use App\Repositories\BankIntegrationRepository;
use App\Transformers\BankIntegrationTransformer;
use App\Helpers\Bank\Yodlee\Yodlee;
use App\Http\Requests\BankIntegration\AdminBankIntegrationRequest;
use App\Http\Requests\BankIntegration\BulkBankIntegrationRequest;
use App\Http\Requests\BankIntegration\CreateBankIntegrationRequest;
use App\Http\Requests\BankIntegration\DestroyBankIntegrationRequest;
use App\Http\Requests\BankIntegration\EditBankIntegrationRequest;
use App\Http\Requests\BankIntegration\ShowBankIntegrationRequest;
use App\Http\Requests\BankIntegration\AdminBankIntegrationRequest;
use App\Http\Requests\BankIntegration\StoreBankIntegrationRequest;
use App\Http\Requests\BankIntegration\CreateBankIntegrationRequest;
use App\Http\Requests\BankIntegration\UpdateBankIntegrationRequest;
use App\Http\Requests\BankIntegration\DestroyBankIntegrationRequest;
use App\Jobs\Bank\ProcessBankTransactions;
use App\Models\BankIntegration;
use App\Repositories\BankIntegrationRepository;
use App\Transformers\BankIntegrationTransformer;
use App\Utils\Traits\MakesHash;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Cache;
class BankIntegrationController extends BaseController
{
@ -210,12 +209,11 @@ class BankIntegrationController extends BaseController
$accounts = $yodlee->getAccounts();
foreach ($accounts as $account) {
if ($bi = BankIntegration::withTrashed()->where('bank_account_id', $account['id'])->where('company_id', $user->company()->id)->first()){
if ($bi = BankIntegration::withTrashed()->where('bank_account_id', $account['id'])->where('company_id', $user->company()->id)->first()) {
$bi->balance = $account['current_balance'];
$bi->currency = $account['account_currency'];
$bi->save();
}
else {
} else {
$bank_integration = new BankIntegration();
$bank_integration->company_id = $user->company()->id;
$bank_integration->account_id = $user->account_id;
@ -293,7 +291,7 @@ class BankIntegrationController extends BaseController
/** @var \App\Models\User $user */
$user = auth()->user();
$user->account->bank_integrations->each(function ($bank_integration) use ($user){
$user->account->bank_integrations->each(function ($bank_integration) use ($user) {
(new ProcessBankTransactions($user->account->bank_integration_account_id, $bank_integration))->handle();
});

View File

@ -11,20 +11,20 @@
namespace App\Http\Controllers;
use App\Utils\Traits\MakesHash;
use App\Models\BankTransactionRule;
use App\Factory\BankTransactionRuleFactory;
use App\Filters\BankTransactionRuleFilters;
use App\Repositories\BankTransactionRuleRepository;
use App\Transformers\BankTransactionRuleTransformer;
use App\Http\Requests\BankTransactionRule\BulkBankTransactionRuleRequest;
use App\Http\Requests\BankTransactionRule\CreateBankTransactionRuleRequest;
use App\Http\Requests\BankTransactionRule\DestroyBankTransactionRuleRequest;
use App\Http\Requests\BankTransactionRule\EditBankTransactionRuleRequest;
use App\Http\Requests\BankTransactionRule\ShowBankTransactionRuleRequest;
use App\Http\Requests\BankTransactionRule\StoreBankTransactionRuleRequest;
use App\Http\Requests\BankTransactionRule\CreateBankTransactionRuleRequest;
use App\Http\Requests\BankTransactionRule\UpdateBankTransactionRuleRequest;
use App\Http\Requests\BankTransactionRule\DestroyBankTransactionRuleRequest;
use App\Models\BankTransactionRule;
use App\Repositories\BankTransactionRuleRepository;
use App\Services\Bank\BankMatchingService;
use App\Transformers\BankTransactionRuleTransformer;
use App\Utils\Traits\MakesHash;
class BankTransactionRuleController extends BaseController
{

View File

@ -924,10 +924,9 @@ class BaseController extends Controller
if ($this->entity_type == BankIntegration::class && !$user->isSuperUser() && $user->hasIntersectPermissions(['create_bank_transaction','edit_bank_transaction','view_bank_transaction'])) {
$query->exclude(["balance"]);
} //allows us to selective display bank integrations back to the user if they can view / create bank transactions but without the bank balance being present in the response
elseif($this->entity_type == TaxRate::class && $user->hasIntersectPermissions(['create_invoice','edit_invoice','create_quote','edit_quote','create_purchase_order','edit_purchase_order'])){
elseif($this->entity_type == TaxRate::class && $user->hasIntersectPermissions(['create_invoice','edit_invoice','create_quote','edit_quote','create_purchase_order','edit_purchase_order'])) {
// need to show tax rates if the user has the ability to create documents.
}
else {
} else {
$query->where('user_id', '=', $user->id);
}
} elseif (in_array($this->entity_type, [Design::class, GroupSetting::class, PaymentTerm::class, TaskStatus::class])) {

View File

@ -11,36 +11,36 @@
namespace App\Http\Controllers;
use App\Utils\Ninja;
use App\Models\Client;
use App\Models\Account;
use App\Models\Company;
use App\Models\SystemLog;
use Postmark\PostmarkClient;
use Illuminate\Http\Response;
use App\Factory\ClientFactory;
use App\Filters\ClientFilters;
use App\Utils\Traits\MakesHash;
use App\Utils\Traits\Uploadable;
use App\Utils\Traits\BulkOptions;
use App\Jobs\Client\UpdateTaxData;
use App\Utils\Traits\SavesDocuments;
use App\Repositories\ClientRepository;
use App\Events\Client\ClientWasCreated;
use App\Events\Client\ClientWasUpdated;
use App\Transformers\ClientTransformer;
use Illuminate\Support\Facades\Storage;
use App\Factory\ClientFactory;
use App\Filters\ClientFilters;
use App\Http\Requests\Client\BulkClientRequest;
use App\Http\Requests\Client\EditClientRequest;
use App\Http\Requests\Client\ShowClientRequest;
use App\Http\Requests\Client\PurgeClientRequest;
use App\Http\Requests\Client\StoreClientRequest;
use App\Http\Requests\Client\CreateClientRequest;
use App\Http\Requests\Client\DestroyClientRequest;
use App\Http\Requests\Client\EditClientRequest;
use App\Http\Requests\Client\PurgeClientRequest;
use App\Http\Requests\Client\ReactivateClientEmailRequest;
use App\Http\Requests\Client\ShowClientRequest;
use App\Http\Requests\Client\StoreClientRequest;
use App\Http\Requests\Client\UpdateClientRequest;
use App\Http\Requests\Client\UploadClientRequest;
use App\Http\Requests\Client\DestroyClientRequest;
use App\Http\Requests\Client\ReactivateClientEmailRequest;
use App\Jobs\Client\UpdateTaxData;
use App\Jobs\PostMark\ProcessPostmarkWebhook;
use App\Models\Account;
use App\Models\Client;
use App\Models\Company;
use App\Models\SystemLog;
use App\Repositories\ClientRepository;
use App\Transformers\ClientTransformer;
use App\Utils\Ninja;
use App\Utils\Traits\BulkOptions;
use App\Utils\Traits\MakesHash;
use App\Utils\Traits\SavesDocuments;
use App\Utils\Traits\Uploadable;
use Illuminate\Http\Response;
use Illuminate\Support\Facades\Storage;
use Postmark\PostmarkClient;
/**
* Class ClientController.
@ -275,7 +275,7 @@ class ClientController extends BaseController
//todo add an event here using the client name as reference for purge event
}
/**
/**
* Update the specified resource in storage.
*
* @param PurgeClientRequest $request
@ -313,8 +313,9 @@ class ClientController extends BaseController
*/
public function updateTaxData(PurgeClientRequest $request, Client $client)
{
if($client->company->account->isPaid())
if($client->company->account->isPaid()) {
(new UpdateTaxData($client, $client->company))->handle();
}
return $this->itemResponse($client->fresh());
}
@ -331,7 +332,7 @@ class ClientController extends BaseController
/** @var \App\Models\User $user */
$user = auth()->user();
if(stripos($bounce_id, '-') !== false){
if(stripos($bounce_id, '-') !== false) {
$log =
SystemLog::query()
->where('company_id', $user->company()->id)
@ -343,16 +344,16 @@ class ClientController extends BaseController
$resolved_bounce_id = false;
if($log && ($log?->log['ID'] ?? false)){
if($log && ($log?->log['ID'] ?? false)) {
$resolved_bounce_id = $log->log['ID'] ?? false;
}
if(!$resolved_bounce_id){
if(!$resolved_bounce_id) {
$ppwebhook = new ProcessPostmarkWebhook([]);
$resolved_bounce_id = $ppwebhook->getBounceId($bounce_id);
}
if(!$resolved_bounce_id){
if(!$resolved_bounce_id) {
return response()->json(['message' => 'Bounce ID not found'], 400);
}
@ -367,8 +368,7 @@ class ClientController extends BaseController
return response()->json(['message' => 'Success'], 200);
}
catch(\Exception $e){
} catch(\Exception $e) {
return response()->json(['message' => $e->getMessage(), 400]);

View File

@ -11,11 +11,10 @@
namespace App\Http\Controllers\ClientPortal;
use Auth;
use App\Models\RecurringInvoice;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Redirect;
use App\Http\ViewComposers\PortalComposer;
use App\Models\RecurringInvoice;
use Illuminate\Support\Facades\Redirect;
class ContactHashLoginController extends Controller
{

View File

@ -1,184 +0,0 @@
<?php
namespace App\Http\Controllers\ClientPortal;
use App\Events\Credit\CreditWasViewed;
use App\Events\Invoice\InvoiceWasViewed;
use App\Events\Misc\InvitationWasViewed;
use App\Events\Quote\QuoteWasViewed;
use App\Http\Controllers\Controller;
use App\Utils\Ninja;
use App\Utils\Traits\MakesHash;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Routing\Redirector;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
use Illuminate\View\View;
/**
* EntityViewController
* @deprecated 5.7 ?
*/
class EntityViewController extends Controller
{
use MakesHash;
/**
* Available options for viewing.
*
* @var array
*/
private $entity_types = ['invoice', 'quote', 'credit', 'recurring_invoice'];
/**
* Show the entity outside client portal.
*
* @param string $entity_type
* @param string $invitation_key
* @return Factory|View
*/
public function index(string $entity_type, string $invitation_key)
{
if (! in_array($entity_type, $this->entity_types)) {
abort(404, 'Entity not found');
}
$invitation_entity = sprintf('App\\Models\\%sInvitation', ucfirst($entity_type));
$key = $entity_type.'_id';
$invitation = $invitation_entity::where('key', $invitation_key)
->with('contact.client')
->firstOrFail();
$contact = $invitation->contact;
$client = $contact->client;
$entity = $invitation->{$entity_type};
if (is_null($contact->password) || empty($contact->password)) {
return redirect("/client/password/reset?email={$contact->email}");
}
if ((bool) $invitation->contact->client->getSetting('enable_client_portal_password') !== false) {
session()->flash("{$entity_type}_VIEW_{$entity->hashed_id}", true);
}
if (! session("{$entity_type}_VIEW_{$entity->hashed_id}")) {
return redirect()->route('client.entity_view.password', compact('entity_type', 'invitation_key'));
}
return $this->render('view_entity.index', [
'root' => 'themes',
'entity' => $entity,
]);
}
/**
* Show the form for entering password.
*
* @param string $entity_type
* @param string $invitation_key
*
* @return Factory|View
*/
public function password(string $entity_type, string $invitation_key)
{
return $this->render('view_entity.password', [
'root' => 'themes',
'entity_type' => $entity_type,
]);
}
/**`
* Handle the password check.
*
* @param string $entity_type
* @param string $invitation_key
*
* @return Redirector|RedirectResponse|mixed
*/
public function handlePassword(string $entity_type, string $invitation_key)
{
if (! in_array($entity_type, $this->entity_types)) {
abort(404, 'Entity not found');
}
$invitation_entity = sprintf('App\\Models\\%sInvitation', ucfirst($entity_type));
$key = $entity_type.'_id';
$invitation = $invitation_entity::where('key', $invitation_key)->firstOrFail();
$contact = $invitation->contact;
$check = Hash::check(request()->password, $contact->password);
$entity_class = sprintf('App\\Models\\%s', ucfirst($entity_type));
$entity = $entity_class::findOrFail($invitation->{$key});
if ($check) {
session()->flash("{$entity_type}_VIEW_{$entity->hashed_id}", true);
return redirect()->route('client.entity_view', compact('entity_type', 'invitation_key'));
}
session()->flash('PASSWORD_FAILED', true);
return back();
}
public function handlePasswordSet(Request $request)
{
$entity_obj = 'App\Models\\'.ucfirst(Str::camel($request->entity_type)).'Invitation';
$key = $request->entity_type.'_id';
$invitation = $entity_obj::where('key', $request->invitation_key)
->whereHas($request->entity_type, function ($query) {
$query->where('is_deleted', 0);
})
->with('contact.client')
->firstOrFail();
$contact = $invitation->contact;
$contact->password = Hash::make($request->password);
$contact->save();
$request->session()->invalidate();
auth()->guard('contact')->loginUsingId($contact->id, true);
if (! $invitation->viewed_date) {
$invitation->markViewed();
if (! session()->get('is_silent')) {
event(new InvitationWasViewed($invitation->{$request->entity_type}, $invitation, $invitation->{$request->entity_type}->company, Ninja::eventVars()));
}
if (! session()->get('is_silent')) {
$this->fireEntityViewedEvent($invitation, $request->entity_type);
}
}
return redirect()->route('client.'.$request->entity_type.'.show', [$request->entity_type => $this->encodePrimaryKey($invitation->{$key})]);
}
private function fireEntityViewedEvent($invitation, $entity_string)
{
switch ($entity_string) {
case 'invoice':
event(new InvoiceWasViewed($invitation, $invitation->company, Ninja::eventVars()));
break;
case 'quote':
event(new QuoteWasViewed($invitation, $invitation->company, Ninja::eventVars()));
break;
case 'credit':
event(new CreditWasViewed($invitation, $invitation->company, Ninja::eventVars()));
break;
default:
// code...
break;
}
}
}

View File

@ -11,27 +11,27 @@
namespace App\Http\Controllers\ClientPortal;
use App\Utils\Ninja;
use App\Models\Client;
use App\Models\Payment;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use App\Models\ClientContact;
use App\Models\QuoteInvitation;
use App\Utils\Traits\MakesHash;
use App\Models\CreditInvitation;
use App\Utils\Traits\MakesDates;
use App\Jobs\Entity\CreateRawPdf;
use App\Models\InvoiceInvitation;
use App\Events\Quote\QuoteWasViewed;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Auth;
use App\Events\Credit\CreditWasViewed;
use App\Events\Contact\ContactLoggedIn;
use App\Models\PurchaseOrderInvitation;
use App\Events\Credit\CreditWasViewed;
use App\Events\Invoice\InvoiceWasViewed;
use App\Events\Misc\InvitationWasViewed;
use App\Events\Quote\QuoteWasViewed;
use App\Http\Controllers\Controller;
use App\Jobs\Entity\CreateRawPdf;
use App\Models\ClientContact;
use App\Models\CreditInvitation;
use App\Models\InvoiceInvitation;
use App\Models\Payment;
use App\Models\PurchaseOrderInvitation;
use App\Models\QuoteInvitation;
use App\Services\ClientPortal\InstantPayment;
use App\Utils\Ninja;
use App\Utils\Traits\MakesDates;
use App\Utils\Traits\MakesHash;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Str;
/**
* Class InvitationController.
@ -195,7 +195,7 @@ class InvitationController extends Controller
$file_name = $invitation->{$entity}->numberFormatter().'.pdf';
$file = (new CreateRawPdf($invitation, $invitation->company->db))->handle();
$file = (new CreateRawPdf($invitation))->handle();
$headers = ['Content-Type' => 'application/pdf'];
@ -212,6 +212,41 @@ class InvitationController extends Controller
{
}
public function handlePasswordSet(Request $request)
{
$entity_obj = 'App\Models\\'.ucfirst(Str::camel($request->entity_type)).'Invitation';
$key = $request->entity_type.'_id';
$invitation = $entity_obj::where('key', $request->invitation_key)
->whereHas($request->entity_type, function ($query) {
$query->where('is_deleted', 0);
})
->with('contact.client')
->firstOrFail();
$contact = $invitation->contact;
$contact->password = Hash::make($request->password);
$contact->save();
$request->session()->invalidate();
auth()->guard('contact')->loginUsingId($contact->id, true);
if (! $invitation->viewed_date) {
$invitation->markViewed();
if (! session()->get('is_silent')) {
event(new InvitationWasViewed($invitation->{$request->entity_type}, $invitation, $invitation->{$request->entity_type}->company, Ninja::eventVars()));
}
if (! session()->get('is_silent')) {
$this->fireEntityViewedEvent($invitation, $request->entity_type);
}
}
return redirect()->route('client.'.$request->entity_type.'.show', [$request->entity_type => $this->encodePrimaryKey($invitation->{$key})]);
}
public function paymentRouter(string $contact_key, string $payment_id)
{
/** @var \App\Models\ClientContact $contact **/

View File

@ -11,29 +11,27 @@
namespace App\Http\Controllers\ClientPortal;
use App\Utils\Ninja;
use App\Utils\Number;
use App\Models\Invoice;
use Illuminate\View\View;
use Illuminate\Http\Request;
use App\Models\QuoteInvitation;
use App\Utils\Traits\MakesHash;
use App\Models\CreditInvitation;
use App\Utils\Traits\MakesDates;
use App\Models\InvoiceInvitation;
use App\Http\Controllers\Controller;
use Illuminate\Http\RedirectResponse;
use Illuminate\Support\Facades\Cache;
use Illuminate\Contracts\View\Factory;
use App\Models\PurchaseOrderInvitation;
use Illuminate\Support\Facades\Storage;
use App\Events\Invoice\InvoiceWasViewed;
use App\Events\Misc\InvitationWasViewed;
use App\Models\RecurringInvoiceInvitation;
use App\Jobs\Vendor\CreatePurchaseOrderPdf;
use App\Http\Controllers\Controller;
use App\Http\Requests\ClientPortal\Invoices\ProcessInvoicesInBulkRequest;
use App\Http\Requests\ClientPortal\Invoices\ShowInvoiceRequest;
use App\Http\Requests\ClientPortal\Invoices\ShowInvoicesRequest;
use App\Http\Requests\ClientPortal\Invoices\ProcessInvoicesInBulkRequest;
use App\Models\CreditInvitation;
use App\Models\Invoice;
use App\Models\InvoiceInvitation;
use App\Models\QuoteInvitation;
use App\Models\RecurringInvoiceInvitation;
use App\Utils\Ninja;
use App\Utils\Number;
use App\Utils\Traits\MakesDates;
use App\Utils\Traits\MakesHash;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Storage;
use Illuminate\View\View;
class InvoiceController extends Controller
{
@ -88,14 +86,14 @@ class InvoiceController extends Controller
{
$data = Cache::get($hash);
if(!$data){
if(!$data) {
usleep(200000);
$data = Cache::get($hash);
}
$invitation = false;
match($data['entity_type'] ?? false){
match($data['entity_type'] ?? false) {
'invoice' => $invitation = InvoiceInvitation::withTrashed()->find($data['invitation_id']),
'quote' => $invitation = QuoteInvitation::withTrashed()->find($data['invitation_id']),
'credit' => $invitation = CreditInvitation::withTrashed()->find($data['invitation_id']),
@ -107,7 +105,7 @@ class InvoiceController extends Controller
return redirect('/');
}
$file = (new \App\Jobs\Entity\CreateRawPdf($invitation, $invitation->company->db))->handle();
$file = (new \App\Jobs\Entity\CreateRawPdf($invitation))->handle();
$headers = ['Content-Type' => 'application/pdf'];
return response()->make($file, 200, $headers);

View File

@ -27,7 +27,6 @@ use App\Services\Subscription\SubscriptionService;
use App\Utils\Traits\MakesDates;
use App\Utils\Traits\MakesHash;
use Illuminate\Contracts\View\Factory;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;

View File

@ -12,22 +12,21 @@
namespace App\Http\Controllers\ClientPortal;
use App\Utils\Ninja;
use App\Models\Quote;
use Illuminate\View\View;
use Illuminate\Http\Request;
use App\Models\QuoteInvitation;
use App\Utils\Traits\MakesHash;
use App\Events\Misc\InvitationWasViewed;
use App\Events\Quote\QuoteWasViewed;
use App\Http\Controllers\Controller;
use App\Jobs\Invoice\InjectSignature;
use Illuminate\Contracts\View\Factory;
use Illuminate\Support\Facades\Storage;
use App\Events\Misc\InvitationWasViewed;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
use App\Http\Requests\ClientPortal\Quotes\ProcessQuotesInBulkRequest;
use App\Http\Requests\ClientPortal\Quotes\ShowQuoteRequest;
use App\Http\Requests\ClientPortal\Quotes\ShowQuotesRequest;
use App\Http\Requests\ClientPortal\Quotes\ProcessQuotesInBulkRequest;
use App\Jobs\Invoice\InjectSignature;
use App\Models\Quote;
use App\Models\QuoteInvitation;
use App\Utils\Ninja;
use App\Utils\Traits\MakesHash;
use Illuminate\Contracts\View\Factory;
use Illuminate\Http\Request;
use Illuminate\View\View;
use Symfony\Component\HttpFoundation\BinaryFileResponse;
class QuoteController extends Controller
{
@ -123,7 +122,7 @@ class QuoteController extends Controller
$client_contact = auth()->user();
$quote_invitations = QuoteInvitation::query()
->with('quote','company')
->with('quote', 'company')
->whereIn('quote_id', $ids)
->where('client_contact_id', $client_contact->id)
->withTrashed()
@ -137,7 +136,7 @@ class QuoteController extends Controller
if ($quote_invitations->count() == 1) {
$invitation = $quote_invitations->first();
$file = (new \App\Jobs\Entity\CreateRawPdf($invitation, $invitation->company->db))->handle();
$file = (new \App\Jobs\Entity\CreateRawPdf($invitation))->handle();
return response()->streamDownload(function () use ($file) {
echo $file;
}, $invitation->quote->numberFormatter().".pdf", ['Content-Type' => 'application/pdf']);
@ -152,7 +151,7 @@ class QuoteController extends Controller
$zipFile = new \PhpZip\ZipFile();
try {
foreach ($quote_invitations as $invitation) {
$file = (new \App\Jobs\Entity\CreateRawPdf($invitation, $invitation->company->db))->handle();
$file = (new \App\Jobs\Entity\CreateRawPdf($invitation))->handle();
$zipFile->addFromString($invitation->quote->numberFormatter() . '.pdf', $file);
}

View File

@ -11,7 +11,6 @@
namespace App\Http\Controllers\ClientPortal;
use Auth;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Redirect;

Some files were not shown because too many files have changed in this diff Show More