Fixes for tests (#3184)

* fix typo

* php-cs traits

* CS fixer pass

* Password protect User routes

* Implement checks to prevent editing a deleted record

* Clean up payment flows

* Fixes for tests
This commit is contained in:
David Bomba 2019-12-31 08:59:12 +11:00 committed by GitHub
parent 167b503fa1
commit f712b789ca
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
470 changed files with 5777 additions and 7249 deletions

View File

@ -51,8 +51,6 @@ class CreateTestData extends Command
parent::__construct(); parent::__construct();
$this->invoice_repo = $invoice_repo; $this->invoice_repo = $invoice_repo;
} }
/** /**
@ -72,13 +70,11 @@ class CreateTestData extends Command
$this->createSmallAccount(); $this->createSmallAccount();
$this->createMediumAccount(); $this->createMediumAccount();
$this->createLargeAccount(); $this->createLargeAccount();
} }
private function createSmallAccount() private function createSmallAccount()
{ {
$this->info('Creating Small Account and Company'); $this->info('Creating Small Account and Company');
$account = factory(\App\Models\Account::class)->create(); $account = factory(\App\Models\Account::class)->create();
@ -91,8 +87,7 @@ class CreateTestData extends Command
$user = User::whereEmail('small@example.com')->first(); $user = User::whereEmail('small@example.com')->first();
if(!$user) if (!$user) {
{
$user = factory(\App\Models\User::class)->create([ $user = factory(\App\Models\User::class)->create([
// 'account_id' => $account->id, // 'account_id' => $account->id,
'email' => 'small@example.com', 'email' => 'small@example.com',
@ -123,13 +118,12 @@ class CreateTestData extends Command
$this->info('Creating '.$this->count. ' clients'); $this->info('Creating '.$this->count. ' clients');
for($x=0; $x<$this->count; $x++) { for ($x=0; $x<$this->count; $x++) {
$z = $x+1; $z = $x+1;
$this->info("Creating client # ".$z); $this->info("Creating client # ".$z);
$this->createClient($company, $user); $this->createClient($company, $user);
} }
} }
private function createMediumAccount() private function createMediumAccount()
@ -146,8 +140,7 @@ class CreateTestData extends Command
$user = User::whereEmail('medium@example.com')->first(); $user = User::whereEmail('medium@example.com')->first();
if(!$user) if (!$user) {
{
$user = factory(\App\Models\User::class)->create([ $user = factory(\App\Models\User::class)->create([
// 'account_id' => $account->id, // 'account_id' => $account->id,
'email' => 'medium@example.com', 'email' => 'medium@example.com',
@ -179,18 +172,17 @@ class CreateTestData extends Command
$this->info('Creating '.$this->count. ' clients'); $this->info('Creating '.$this->count. ' clients');
for($x=0; $x<$this->count; $x++) { for ($x=0; $x<$this->count; $x++) {
$z = $x+1; $z = $x+1;
$this->info("Creating client # ".$z); $this->info("Creating client # ".$z);
$this->createClient($company, $user); $this->createClient($company, $user);
} }
} }
private function createLargeAccount() private function createLargeAccount()
{ {
$this->info('Creating Large Account and Company'); $this->info('Creating Large Account and Company');
$account = factory(\App\Models\Account::class)->create(); $account = factory(\App\Models\Account::class)->create();
$company = factory(\App\Models\Company::class)->create([ $company = factory(\App\Models\Company::class)->create([
@ -202,8 +194,7 @@ class CreateTestData extends Command
$user = User::whereEmail('large@example.com')->first(); $user = User::whereEmail('large@example.com')->first();
if(!$user) if (!$user) {
{
$user = factory(\App\Models\User::class)->create([ $user = factory(\App\Models\User::class)->create([
// 'account_id' => $account->id, // 'account_id' => $account->id,
'email' => 'large@example.com', 'email' => 'large@example.com',
@ -235,13 +226,12 @@ class CreateTestData extends Command
$this->info('Creating '.$this->count. ' clients'); $this->info('Creating '.$this->count. ' clients');
for($x=0; $x<$this->count; $x++) { for ($x=0; $x<$this->count; $x++) {
$z = $x+1; $z = $x+1;
$this->info("Creating client # ".$z); $this->info("Creating client # ".$z);
$this->createClient($company, $user); $this->createClient($company, $user);
} }
} }
private function createClient($company, $user) private function createClient($company, $user)
@ -252,25 +242,24 @@ class CreateTestData extends Command
]); ]);
factory(\App\Models\ClientContact::class,1)->create([ factory(\App\Models\ClientContact::class, 1)->create([
'user_id' => $user->id, 'user_id' => $user->id,
'client_id' => $client->id, 'client_id' => $client->id,
'company_id' => $company->id, 'company_id' => $company->id,
'is_primary' => 1 'is_primary' => 1
]); ]);
factory(\App\Models\ClientContact::class,rand(1,5))->create([ factory(\App\Models\ClientContact::class, rand(1, 5))->create([
'user_id' => $user->id, 'user_id' => $user->id,
'client_id' => $client->id, 'client_id' => $client->id,
'company_id' => $company->id 'company_id' => $company->id
]); ]);
$y = $this->count * rand(1,5); $y = $this->count * rand(1, 5);
$this->info("Creating {$y} invoices & quotes"); $this->info("Creating {$y} invoices & quotes");
for($x=0; $x<$y; $x++){ for ($x=0; $x<$y; $x++) {
$this->createInvoice($client); $this->createInvoice($client);
$this->createQuote($client); $this->createQuote($client);
} }
@ -280,27 +269,24 @@ class CreateTestData extends Command
{ {
$faker = \Faker\Factory::create(); $faker = \Faker\Factory::create();
$invoice = InvoiceFactory::create($client->company->id,$client->user->id);//stub the company and user_id $invoice = InvoiceFactory::create($client->company->id, $client->user->id);//stub the company and user_id
$invoice->client_id = $client->id; $invoice->client_id = $client->id;
$invoice->date = $faker->date(); $invoice->date = $faker->date();
$invoice->line_items = $this->buildLineItems(); $invoice->line_items = $this->buildLineItems();
$invoice->uses_inclusive_taxes = false; $invoice->uses_inclusive_taxes = false;
if(rand(0,1)) if (rand(0, 1)) {
{
$invoice->tax_name1 = 'GST'; $invoice->tax_name1 = 'GST';
$invoice->tax_rate1 = 10.00; $invoice->tax_rate1 = 10.00;
} }
if(rand(0,1)) if (rand(0, 1)) {
{
$invoice->tax_name2 = 'VAT'; $invoice->tax_name2 = 'VAT';
$invoice->tax_rate2 = 17.50; $invoice->tax_rate2 = 17.50;
} }
if(rand(0,1)) if (rand(0, 1)) {
{
$invoice->tax_name3 = 'CA Sales Tax'; $invoice->tax_name3 = 'CA Sales Tax';
$invoice->tax_rate3 = 5; $invoice->tax_rate3 = 5;
} }
@ -314,31 +300,30 @@ class CreateTestData extends Command
$invoice->save(); $invoice->save();
event(new CreateInvoiceInvitation($invoice)); event(new CreateInvoiceInvitation($invoice));
UpdateCompanyLedgerWithInvoice::dispatchNow($invoice, $invoice->balance, $invoice->company); UpdateCompanyLedgerWithInvoice::dispatchNow($invoice, $invoice->balance, $invoice->company);
$this->invoice_repo->markSent($invoice); $this->invoice_repo->markSent($invoice);
CreateInvoiceInvitations::dispatch($invoice, $invoice->company); CreateInvoiceInvitations::dispatch($invoice, $invoice->company);
if(rand(0, 1)) { if (rand(0, 1)) {
$payment = PaymentFactory::create($client->company->id, $client->user->id);
$payment->date = now();
$payment->client_id = $client->id;
$payment->amount = $invoice->balance;
$payment->transaction_reference = rand(0, 500);
$payment->type_id = PaymentType::CREDIT_CARD_OTHER;
$payment->status_id = Payment::STATUS_COMPLETED;
$payment->save();
$payment = PaymentFactory::create($client->company->id, $client->user->id); $payment->invoices()->save($invoice);
$payment->date = now();
$payment->client_id = $client->id;
$payment->amount = $invoice->balance;
$payment->transaction_reference = rand(0,500);
$payment->type_id = PaymentType::CREDIT_CARD_OTHER;
$payment->status_id = Payment::STATUS_COMPLETED;
$payment->save();
$payment->invoices()->save($invoice); event(new PaymentWasCreated($payment, $payment->company));
event(new PaymentWasCreated($payment, $payment->company)); UpdateInvoicePayment::dispatchNow($payment, $payment->company);
}
UpdateInvoicePayment::dispatchNow($payment, $payment->company);
}
} }
@ -346,27 +331,24 @@ class CreateTestData extends Command
{ {
$faker = \Faker\Factory::create(); $faker = \Faker\Factory::create();
$quote = QuoteFactory::create($client->company->id,$client->user->id);//stub the company and user_id $quote = QuoteFactory::create($client->company->id, $client->user->id);//stub the company and user_id
$quote->client_id = $client->id; $quote->client_id = $client->id;
$quote->date = $faker->date(); $quote->date = $faker->date();
$quote->line_items = $this->buildLineItems(); $quote->line_items = $this->buildLineItems();
$quote->uses_inclusive_taxes = false; $quote->uses_inclusive_taxes = false;
if(rand(0,1)) if (rand(0, 1)) {
{
$quote->tax_name1 = 'GST'; $quote->tax_name1 = 'GST';
$quote->tax_rate1 = 10.00; $quote->tax_rate1 = 10.00;
} }
if(rand(0,1)) if (rand(0, 1)) {
{
$quote->tax_name2 = 'VAT'; $quote->tax_name2 = 'VAT';
$quote->tax_rate2 = 17.50; $quote->tax_rate2 = 17.50;
} }
if(rand(0,1)) if (rand(0, 1)) {
{
$quote->tax_name3 = 'CA Sales Tax'; $quote->tax_name3 = 'CA Sales Tax';
$quote->tax_rate3 = 5; $quote->tax_rate3 = 5;
} }
@ -380,9 +362,7 @@ class CreateTestData extends Command
$quote->save(); $quote->save();
CreateQuoteInvitations::dispatch($quote, $quote->company); CreateQuoteInvitations::dispatch($quote, $quote->company);
} }
private function buildLineItems() private function buildLineItems()
@ -393,20 +373,17 @@ class CreateTestData extends Command
$item->quantity = 1; $item->quantity = 1;
$item->cost =10; $item->cost =10;
if(rand(0, 1)) if (rand(0, 1)) {
{
$item->tax_name1 = 'GST'; $item->tax_name1 = 'GST';
$item->tax_rate1 = 10.00; $item->tax_rate1 = 10.00;
} }
if(rand(0, 1)) if (rand(0, 1)) {
{
$item->tax_name1 = 'VAT'; $item->tax_name1 = 'VAT';
$item->tax_rate1 = 17.50; $item->tax_rate1 = 17.50;
} }
if(rand(0, 1)) if (rand(0, 1)) {
{
$item->tax_name1 = 'Sales Tax'; $item->tax_name1 = 'Sales Tax';
$item->tax_rate1 = 5; $item->tax_rate1 = 5;
} }
@ -414,12 +391,11 @@ class CreateTestData extends Command
$line_items[] = $item; $line_items[] = $item;
return $line_items; return $line_items;
} }
private function warmCache() private function warmCache()
{ {
/* Warm up the cache !*/ /* Warm up the cache !*/
$cached_tables = config('ninja.cached_tables'); $cached_tables = config('ninja.cached_tables');
foreach ($cached_tables as $name => $class) { foreach ($cached_tables as $name => $class) {

View File

@ -64,7 +64,7 @@ class SendTestEmails extends Command
$user = User::whereEmail('user@example.com')->first(); $user = User::whereEmail('user@example.com')->first();
$client = Client::all()->first(); $client = Client::all()->first();
if(!$user){ if (!$user) {
$user = factory(\App\Models\User::class)->create([ $user = factory(\App\Models\User::class)->create([
'confirmation_code' => '123', 'confirmation_code' => '123',
'email' => 'admin@business.com', 'email' => 'admin@business.com',
@ -73,12 +73,11 @@ class SendTestEmails extends Command
]); ]);
} }
if(!$client) { if (!$client) {
$client = ClientFactory::create($user->company()->id, $user->id);
$client->save();
$client = ClientFactory::create($user->company()->id, $user->id); factory(\App\Models\ClientContact::class, 1)->create([
$client->save();
factory(\App\Models\ClientContact::class,1)->create([
'user_id' => $user->id, 'user_id' => $user->id,
'client_id' => $client->id, 'client_id' => $client->id,
'company_id' => $company->id, 'company_id' => $company->id,
@ -87,7 +86,7 @@ class SendTestEmails extends Command
'email' => 'exy@example.com', 'email' => 'exy@example.com',
]); ]);
factory(\App\Models\ClientContact::class,1)->create([ factory(\App\Models\ClientContact::class, 1)->create([
'user_id' => $user->id, 'user_id' => $user->id,
'client_id' => $client->id, 'client_id' => $client->id,
'company_id' => $company->id, 'company_id' => $company->id,
@ -96,14 +95,13 @@ class SendTestEmails extends Command
]); ]);
} }
$cc_emails = [config('ninja.testvars.test_email')]; $cc_emails = [config('ninja.testvars.test_email')];
$bcc_emails = [config('ninja.testvars.test_email')]; $bcc_emails = [config('ninja.testvars.test_email')];
Mail::to(config('ninja.testvars.test_email'),'Mr Test') Mail::to(config('ninja.testvars.test_email'), 'Mr Test')
->cc($cc_emails) ->cc($cc_emails)
->bcc($bcc_emails) ->bcc($bcc_emails)
//->replyTo(also_available_if_needed) //->replyTo(also_available_if_needed)
->send(new TemplateEmail($message, $template, $user, $client)); ->send(new TemplateEmail($message, $template, $user, $client));
} }
} }

View File

@ -38,8 +38,6 @@ class Kernel extends ConsoleKernel
// ->hourly(); // ->hourly();
$schedule->job(new RecurringInvoicesCron)->hourly(); $schedule->job(new RecurringInvoicesCron)->hourly();
} }
/** /**

View File

@ -16,50 +16,48 @@ namespace App\DataMapper;
*/ */
class BaseSettings class BaseSettings
{ {
public function __construct($obj)
{
foreach ($obj as $key => $value) {
$obj->{$key} = $value;
}
}
public function __construct($obj) public static function setCasts($obj, $casts)
{ {
foreach($obj as $key => $value) foreach ($casts as $key => $value) {
$obj->{$key} = $value; $obj->{$key} = self::castAttribute($key, $obj->{$key});
} }
public static function setCasts($obj, $casts) return $obj;
{ }
foreach ($casts as $key => $value)
$obj->{$key} = self::castAttribute($key, $obj->{$key});
return $obj; public static function castAttribute($key, $value)
} {
switch ($key) {
public static function castAttribute($key, $value) case 'int':
{ case 'integer':
switch ($key) return (int) $value;
{ case 'real':
case 'int': case 'float':
case 'integer': case 'double':
return (int) $value; return (float) $value;
case 'real': case 'string':
case 'float': return is_null($value) ? '' : (string) $value;
case 'double': case 'bool':
return (float) $value; case 'boolean':
case 'string': return (bool)($value);
return is_null($value) ? '' : (string) $value; case 'object':
case 'bool': return json_decode($value);
case 'boolean': case 'array':
return (bool)($value); case 'json':
case 'object': return json_decode($value, true);
return json_decode($value); default:
case 'array': return $value;
case 'json': }
return json_decode($value, true); }
default:
return $value;
}
}
public static function castSingleAttribute($key, $data)
{
}
public static function castSingleAttribute($key, $data)
{
}
} }

View File

@ -30,78 +30,72 @@ use App\Utils\TranslationHelper;
class ClientSettings extends BaseSettings class ClientSettings extends BaseSettings
{ {
/** /**
* Settings which which are unique to client settings * Settings which which are unique to client settings
*/
public $industry_id;
public $size_id;
public static $casts = [
'industry_id' => 'string',
'size_id' => 'string',
];
/**
* Cast object values and return entire class
* prevents missing properties from not being returned
* and always ensure an up to date class is returned
*
* @return \stdClass
*/ */
public function __construct($obj) public $industry_id;
{ public $size_id;
parent::__construct($obj);
}
/** public static $casts = [
* 'industry_id' => 'string',
* Default Client Settings scaffold 'size_id' => 'string',
* ];
* @return \stdClass
* /**
* Cast object values and return entire class
* prevents missing properties from not being returned
* and always ensure an up to date class is returned
*
* @return \stdClass
*/ */
public static function defaults() : \stdClass public function __construct($obj)
{ {
parent::__construct($obj);
}
$data = (object)[ /**
'entity' => (string)Client::class, *
'industry_id' => '', * Default Client Settings scaffold
'size_id' => '', *
]; * @return \stdClass
*
*/
public static function defaults() : \stdClass
{
$data = (object)[
'entity' => (string)Client::class,
'industry_id' => '',
'size_id' => '',
];
return self::setCasts($data, self::$casts); return self::setCasts($data, self::$casts);
}
}
/** /**
* Merges settings from Company to Client * Merges settings from Company to Client
* *
* @param \stdClass $company_settings * @param \stdClass $company_settings
* @param \stdClass $client_settings * @param \stdClass $client_settings
* @return \stdClass of merged settings * @return \stdClass of merged settings
*/ */
public static function buildClientSettings($company_settings, $client_settings) public static function buildClientSettings($company_settings, $client_settings)
{ {
if (!$client_settings) {
return $company_settings;
}
if(!$client_settings) foreach ($company_settings as $key => $value) {
return $company_settings; /* pseudo code
if the property exists and is a string BUT has no length, treat it as TRUE
foreach($company_settings as $key => $value) */
{ if (((property_exists($client_settings, $key) && is_string($client_settings->{$key}) && (iconv_strlen($client_settings->{$key}) <1)))
/* pseudo code || !isset($client_settings->{$key})
if the property exists and is a string BUT has no length, treat it as TRUE && property_exists($company_settings, $key)) {
*/ $client_settings->{$key} = $company_settings->{$key};
if( ( (property_exists($client_settings, $key) && is_string($client_settings->{$key}) && (iconv_strlen($client_settings->{$key}) <1))) }
|| !isset($client_settings->{$key}) }
&& property_exists($company_settings, $key)) {
$client_settings->{$key} = $company_settings->{$key};
}
}
return $client_settings;
}
return $client_settings;
}
} }

View File

@ -21,194 +21,194 @@ use App\Models\Company;
class CompanySettings extends BaseSettings class CompanySettings extends BaseSettings
{ {
/*Group settings based on functionality*/ /*Group settings based on functionality*/
/*Invoice*/ /*Invoice*/
public $auto_archive_invoice = false; public $auto_archive_invoice = false;
public $lock_sent_invoices = false; public $lock_sent_invoices = false;
public $enable_client_portal_tasks = false; public $enable_client_portal_tasks = false;
public $enable_client_portal_password = false; public $enable_client_portal_password = false;
public $enable_client_portal = true; //implemented public $enable_client_portal = true; //implemented
public $enable_client_portal_dashboard = true; //implemented public $enable_client_portal_dashboard = true; //implemented
public $signature_on_pdf = false; public $signature_on_pdf = false;
public $document_email_attachment = false; public $document_email_attachment = false;
public $send_portal_password = false; public $send_portal_password = false;
public $timezone_id = ''; public $timezone_id = '';
public $date_format_id = ''; public $date_format_id = '';
public $military_time = false; public $military_time = false;
public $language_id = ''; public $language_id = '';
public $show_currency_code = false; public $show_currency_code = false;
public $company_gateway_ids = ''; public $company_gateway_ids = '';
public $currency_id = '1'; public $currency_id = '1';
public $custom_value1 = ''; public $custom_value1 = '';
public $custom_value2 = ''; public $custom_value2 = '';
public $custom_value3 = ''; public $custom_value3 = '';
public $custom_value4 = ''; public $custom_value4 = '';
public $default_task_rate = 0; public $default_task_rate = 0;
public $payment_terms = 1; public $payment_terms = 1;
public $send_reminders = false; public $send_reminders = false;
public $custom_message_dashboard = ''; public $custom_message_dashboard = '';
public $custom_message_unpaid_invoice = ''; public $custom_message_unpaid_invoice = '';
public $custom_message_paid_invoice = ''; public $custom_message_paid_invoice = '';
public $custom_message_unapproved_quote = ''; public $custom_message_unapproved_quote = '';
public $auto_archive_quote = false; public $auto_archive_quote = false;
public $auto_convert_quote = true; public $auto_convert_quote = true;
public $auto_email_invoice = true; public $auto_email_invoice = true;
public $inclusive_taxes = false; public $inclusive_taxes = false;
public $quote_footer = ''; public $quote_footer = '';
public $translations; public $translations;
public $counter_number_applied = 'when_saved'; // when_saved , when_sent , when_paid public $counter_number_applied = 'when_saved'; // when_saved , when_sent , when_paid
public $quote_number_applied = 'when_saved'; // when_saved , when_sent public $quote_number_applied = 'when_saved'; // when_saved , when_sent
/* Counters */ /* Counters */
public $invoice_number_pattern = ''; public $invoice_number_pattern = '';
public $invoice_number_counter = 1; public $invoice_number_counter = 1;
public $quote_number_pattern = ''; public $quote_number_pattern = '';
public $quote_number_counter = 1; public $quote_number_counter = 1;
public $client_number_pattern = ''; public $client_number_pattern = '';
public $client_number_counter = 1; public $client_number_counter = 1;
public $credit_number_pattern = ''; public $credit_number_pattern = '';
public $credit_number_counter = 1; public $credit_number_counter = 1;
public $task_number_pattern = ''; public $task_number_pattern = '';
public $task_number_counter = 1; public $task_number_counter = 1;
public $expense_number_pattern = ''; public $expense_number_pattern = '';
public $expense_number_counter = 1; public $expense_number_counter = 1;
public $vendor_number_pattern = ''; public $vendor_number_pattern = '';
public $vendor_number_counter = 1; public $vendor_number_counter = 1;
public $ticket_number_pattern = ''; public $ticket_number_pattern = '';
public $ticket_number_counter = 1; public $ticket_number_counter = 1;
public $payment_number_pattern = ''; public $payment_number_pattern = '';
public $payment_number_counter = 1; public $payment_number_counter = 1;
public $shared_invoice_quote_counter = false; public $shared_invoice_quote_counter = false;
public $recurring_number_prefix = 'R'; public $recurring_number_prefix = 'R';
public $reset_counter_frequency_id = '0'; public $reset_counter_frequency_id = '0';
public $reset_counter_date = ''; public $reset_counter_date = '';
public $counter_padding = 4; public $counter_padding = 4;
public $design = 'views/pdf/design1.blade.php'; public $design = 'views/pdf/design1.blade.php';
public $invoice_terms = ''; public $invoice_terms = '';
public $quote_terms = ''; public $quote_terms = '';
public $invoice_taxes = 0; public $invoice_taxes = 0;
public $enabled_item_tax_rates = 0; public $enabled_item_tax_rates = 0;
public $invoice_design_id = '1'; public $invoice_design_id = '1';
public $quote_design_id = '1'; public $quote_design_id = '1';
public $invoice_footer = ''; public $invoice_footer = '';
public $invoice_labels = ''; public $invoice_labels = '';
public $tax_name1 = ''; public $tax_name1 = '';
public $tax_rate1 = 0; public $tax_rate1 = 0;
public $tax_name2 = ''; public $tax_name2 = '';
public $tax_rate2 = 0; public $tax_rate2 = 0;
public $tax_name3 = ''; public $tax_name3 = '';
public $tax_rate3 = 0; public $tax_rate3 = 0;
public $payment_type_id = '1'; public $payment_type_id = '1';
public $invoice_fields = ''; public $invoice_fields = '';
public $show_accept_invoice_terms = false; public $show_accept_invoice_terms = false;
public $show_accept_quote_terms = false; public $show_accept_quote_terms = false;
public $require_invoice_signature = false; public $require_invoice_signature = false;
public $require_quote_signature = false; public $require_quote_signature = false;
//email settings //email settings
public $email_sending_method = 'default'; //enum 'default','gmail' public $email_sending_method = 'default'; //enum 'default','gmail'
public $gmail_sending_user_id = '0'; public $gmail_sending_user_id = '0';
public $reply_to_email = ''; public $reply_to_email = '';
public $bcc_email = ''; public $bcc_email = '';
public $pdf_email_attachment = false; public $pdf_email_attachment = false;
public $ubl_email_attachment = false; public $ubl_email_attachment = false;
public $email_style = 'plain'; //plain, light, dark, custom public $email_style = 'plain'; //plain, light, dark, custom
public $email_style_custom = ''; //the template itself public $email_style_custom = ''; //the template itself
public $email_subject_invoice = ''; public $email_subject_invoice = '';
public $email_subject_quote = ''; public $email_subject_quote = '';
public $email_subject_payment = ''; public $email_subject_payment = '';
public $email_subject_statement = ''; public $email_subject_statement = '';
public $email_template_invoice = ''; public $email_template_invoice = '';
public $email_template_quote = ''; public $email_template_quote = '';
public $email_template_payment = ''; public $email_template_payment = '';
public $email_template_statement = ''; public $email_template_statement = '';
public $email_subject_reminder1 = ''; public $email_subject_reminder1 = '';
public $email_subject_reminder2 = ''; public $email_subject_reminder2 = '';
public $email_subject_reminder3 = ''; public $email_subject_reminder3 = '';
public $email_subject_reminder_endless = ''; public $email_subject_reminder_endless = '';
public $email_template_reminder1 = ''; public $email_template_reminder1 = '';
public $email_template_reminder2 = ''; public $email_template_reminder2 = '';
public $email_template_reminder3 = ''; public $email_template_reminder3 = '';
public $email_template_reminder_endless = ''; public $email_template_reminder_endless = '';
public $email_signature = ''; public $email_signature = '';
public $enable_email_markup = true; public $enable_email_markup = true;
public $email_subject_custom1 = ''; public $email_subject_custom1 = '';
public $email_subject_custom2 = ''; public $email_subject_custom2 = '';
public $email_subject_custom3 = ''; public $email_subject_custom3 = '';
public $email_template_custom1 = ''; public $email_template_custom1 = '';
public $email_template_custom2 = ''; public $email_template_custom2 = '';
public $email_template_custom3 = ''; public $email_template_custom3 = '';
public $enable_reminder1 = false; public $enable_reminder1 = false;
public $enable_reminder2 = false; public $enable_reminder2 = false;
public $enable_reminder3 = false; public $enable_reminder3 = false;
public $num_days_reminder1 = 0; public $num_days_reminder1 = 0;
public $num_days_reminder2 = 0; public $num_days_reminder2 = 0;
public $num_days_reminder3 = 0; public $num_days_reminder3 = 0;
public $schedule_reminder1 = ''; // (enum: after_invoice_date, before_due_date, after_due_date) public $schedule_reminder1 = ''; // (enum: after_invoice_date, before_due_date, after_due_date)
public $schedule_reminder2 = ''; // (enum: after_invoice_date, before_due_date, after_due_date) public $schedule_reminder2 = ''; // (enum: after_invoice_date, before_due_date, after_due_date)
public $schedule_reminder3 = ''; // (enum: after_invoice_date, before_due_date, after_due_date) public $schedule_reminder3 = ''; // (enum: after_invoice_date, before_due_date, after_due_date)
public $reminder_send_time = 32400; //number of seconds from UTC +0 to send reminders public $reminder_send_time = 32400; //number of seconds from UTC +0 to send reminders
public $late_fee_amount1 = 0; public $late_fee_amount1 = 0;
public $late_fee_amount2 = 0; public $late_fee_amount2 = 0;
public $late_fee_amount3 = 0; public $late_fee_amount3 = 0;
public $endless_reminder_frequency_id = '0'; public $endless_reminder_frequency_id = '0';
public $client_online_payment_notification = true; public $client_online_payment_notification = true;
public $client_manual_payment_notification = true; public $client_manual_payment_notification = true;
/* Company Meta data that we can use to build sub companies*/ /* Company Meta data that we can use to build sub companies*/
public $name = ''; public $name = '';
public $company_logo = ''; public $company_logo = '';
public $website = ''; public $website = '';
public $address1 = ''; public $address1 = '';
public $address2 = ''; public $address2 = '';
public $city = ''; public $city = '';
public $state = ''; public $state = '';
public $postal_code = ''; public $postal_code = '';
public $phone = ''; public $phone = '';
public $email = ''; public $email = '';
public $country_id; public $country_id;
public $vat_number = ''; public $vat_number = '';
public $id_number = ''; public $id_number = '';
public $page_size = 'A4'; public $page_size = 'A4';
public $font_size = 9; public $font_size = 9;
public $primary_font = 'Roboto'; public $primary_font = 'Roboto';
public $secondary_font = 'Roboto'; public $secondary_font = 'Roboto';
@ -218,245 +218,238 @@ class CompanySettings extends BaseSettings
public $all_pages_footer = true; public $all_pages_footer = true;
public static $casts = [ public static $casts = [
'auto_email_invoice' => 'bool', 'auto_email_invoice' => 'bool',
'reminder_send_time' => 'int', 'reminder_send_time' => 'int',
'email_sending_method' => 'string', 'email_sending_method' => 'string',
'gmail_sending_user_id' => 'string', 'gmail_sending_user_id' => 'string',
'currency_id' => 'string', 'currency_id' => 'string',
'counter_number_applied' => 'string', 'counter_number_applied' => 'string',
'quote_number_applied' => 'string', 'quote_number_applied' => 'string',
'email_subject_custom1' => 'string', 'email_subject_custom1' => 'string',
'email_subject_custom2' => 'string', 'email_subject_custom2' => 'string',
'email_subject_custom3' => 'string', 'email_subject_custom3' => 'string',
'email_template_custom1' => 'string', 'email_template_custom1' => 'string',
'email_template_custom2' => 'string', 'email_template_custom2' => 'string',
'email_template_custom3' => 'string', 'email_template_custom3' => 'string',
'enable_reminder1' => 'bool', 'enable_reminder1' => 'bool',
'enable_reminder2' => 'bool', 'enable_reminder2' => 'bool',
'enable_reminder3' => 'bool', 'enable_reminder3' => 'bool',
'num_days_reminder1' => 'int', 'num_days_reminder1' => 'int',
'num_days_reminder2' => 'int', 'num_days_reminder2' => 'int',
'num_days_reminder3' => 'int', 'num_days_reminder3' => 'int',
'schedule_reminder1' => 'string', // (enum: after_invoice_date, before_due_date, after_due_date) 'schedule_reminder1' => 'string', // (enum: after_invoice_date, before_due_date, after_due_date)
'schedule_reminder2' => 'string', // (enum: after_invoice_date, before_due_date, after_due_date) 'schedule_reminder2' => 'string', // (enum: after_invoice_date, before_due_date, after_due_date)
'schedule_reminder3' => 'string', // (enum: after_invoice_date, before_due_date, after_due_date) 'schedule_reminder3' => 'string', // (enum: after_invoice_date, before_due_date, after_due_date)
'late_fee_amount1' => 'float', 'late_fee_amount1' => 'float',
'late_fee_amount2' => 'float', 'late_fee_amount2' => 'float',
'late_fee_amount3' => 'float', 'late_fee_amount3' => 'float',
'endless_reminder_frequency_id' => 'integer', 'endless_reminder_frequency_id' => 'integer',
'client_online_payment_notification' => 'bool', 'client_online_payment_notification' => 'bool',
'client_manual_payment_notification' => 'bool', 'client_manual_payment_notification' => 'bool',
'document_email_attachment' => 'bool', 'document_email_attachment' => 'bool',
'enable_client_portal_password' => 'bool', 'enable_client_portal_password' => 'bool',
'enable_email_markup' => 'bool', 'enable_email_markup' => 'bool',
'enable_client_portal_dashboard' => 'bool', 'enable_client_portal_dashboard' => 'bool',
'enable_client_portal' => 'bool', 'enable_client_portal' => 'bool',
'email_template_statement' => 'string', 'email_template_statement' => 'string',
'email_subject_statement' => 'string', 'email_subject_statement' => 'string',
'signature_on_pdf' => 'bool', 'signature_on_pdf' => 'bool',
'send_portal_password' => 'bool', 'send_portal_password' => 'bool',
'quote_footer' => 'string', 'quote_footer' => 'string',
'page_size' => 'string', 'page_size' => 'string',
'font_size' => 'int', 'font_size' => 'int',
'primary_font' => 'string', 'primary_font' => 'string',
'secondary_font' => 'string', 'secondary_font' => 'string',
'hide_paid_to_date' => 'bool', 'hide_paid_to_date' => 'bool',
'embed_documents' => 'bool', 'embed_documents' => 'bool',
'all_pages_header' => 'bool', 'all_pages_header' => 'bool',
'all_pages_footer' => 'bool', 'all_pages_footer' => 'bool',
'task_number_pattern' => 'string', 'task_number_pattern' => 'string',
'task_number_counter' => 'int', 'task_number_counter' => 'int',
'expense_number_pattern' => 'string', 'expense_number_pattern' => 'string',
'expense_number_counter' => 'int', 'expense_number_counter' => 'int',
'vendor_number_pattern' => 'string', 'vendor_number_pattern' => 'string',
'vendor_number_counter' => 'int', 'vendor_number_counter' => 'int',
'ticket_number_pattern' => 'string', 'ticket_number_pattern' => 'string',
'ticket_number_counter' => 'int', 'ticket_number_counter' => 'int',
'payment_number_pattern' => 'string', 'payment_number_pattern' => 'string',
'payment_number_counter' => 'int', 'payment_number_counter' => 'int',
'reply_to_email' => 'string', 'reply_to_email' => 'string',
'bcc_email' => 'string', 'bcc_email' => 'string',
'pdf_email_attachment' => 'bool', 'pdf_email_attachment' => 'bool',
'ubl_email_attachment' => 'bool', 'ubl_email_attachment' => 'bool',
'email_style' => 'string', 'email_style' => 'string',
'email_style_custom' => 'string', 'email_style_custom' => 'string',
'company_gateway_ids' => 'string', 'company_gateway_ids' => 'string',
'address1' => 'string', 'address1' => 'string',
'address2' => 'string', 'address2' => 'string',
'city' => 'string', 'city' => 'string',
'company_logo' => 'string', 'company_logo' => 'string',
'country_id' => 'string', 'country_id' => 'string',
'client_number_pattern' => 'string', 'client_number_pattern' => 'string',
'client_number_counter' => 'integer', 'client_number_counter' => 'integer',
'credit_number_pattern' => 'string', 'credit_number_pattern' => 'string',
'credit_number_counter' => 'integer', 'credit_number_counter' => 'integer',
'currency_id' => 'string', 'currency_id' => 'string',
'custom_value1' => 'string', 'custom_value1' => 'string',
'custom_value2' => 'string', 'custom_value2' => 'string',
'custom_value3' => 'string', 'custom_value3' => 'string',
'custom_value4' => 'string', 'custom_value4' => 'string',
'custom_message_dashboard' => 'string', 'custom_message_dashboard' => 'string',
'custom_message_unpaid_invoice' => 'string', 'custom_message_unpaid_invoice' => 'string',
'custom_message_paid_invoice' => 'string', 'custom_message_paid_invoice' => 'string',
'custom_message_unapproved_quote' => 'string', 'custom_message_unapproved_quote' => 'string',
'default_task_rate' => 'float', 'default_task_rate' => 'float',
'email_signature' => 'string', 'email_signature' => 'string',
'email_subject_invoice' => 'string', 'email_subject_invoice' => 'string',
'email_subject_quote' => 'string', 'email_subject_quote' => 'string',
'email_subject_payment' => 'string', 'email_subject_payment' => 'string',
'email_template_invoice' => 'string', 'email_template_invoice' => 'string',
'email_template_quote' => 'string', 'email_template_quote' => 'string',
'email_template_payment' => 'string', 'email_template_payment' => 'string',
'email_subject_reminder1' => 'string', 'email_subject_reminder1' => 'string',
'email_subject_reminder2' => 'string', 'email_subject_reminder2' => 'string',
'email_subject_reminder3' => 'string', 'email_subject_reminder3' => 'string',
'email_subject_reminder_endless' => 'string', 'email_subject_reminder_endless' => 'string',
'email_template_reminder1' => 'string', 'email_template_reminder1' => 'string',
'email_template_reminder2' => 'string', 'email_template_reminder2' => 'string',
'email_template_reminder3' => 'string', 'email_template_reminder3' => 'string',
'email_template_reminder_endless' => 'string', 'email_template_reminder_endless' => 'string',
'enable_client_portal_password' => 'bool', 'enable_client_portal_password' => 'bool',
'inclusive_taxes' => 'bool', 'inclusive_taxes' => 'bool',
'invoice_number_pattern' => 'string', 'invoice_number_pattern' => 'string',
'invoice_number_counter' => 'integer', 'invoice_number_counter' => 'integer',
'invoice_design_id' => 'string', 'invoice_design_id' => 'string',
'invoice_fields' => 'string', 'invoice_fields' => 'string',
'invoice_taxes' => 'int', 'invoice_taxes' => 'int',
'enabled_item_tax_rates' => 'int', 'enabled_item_tax_rates' => 'int',
'invoice_footer' => 'string', 'invoice_footer' => 'string',
'invoice_labels' => 'string', 'invoice_labels' => 'string',
'invoice_terms' => 'string', 'invoice_terms' => 'string',
'name' => 'string', 'name' => 'string',
'payment_terms' => 'integer', 'payment_terms' => 'integer',
'payment_type_id' => 'string', 'payment_type_id' => 'string',
'phone' => 'string', 'phone' => 'string',
'postal_code' => 'string', 'postal_code' => 'string',
'quote_design_id' => 'string', 'quote_design_id' => 'string',
'quote_number_pattern' => 'string', 'quote_number_pattern' => 'string',
'quote_number_counter' => 'integer', 'quote_number_counter' => 'integer',
'quote_terms' => 'string', 'quote_terms' => 'string',
'recurring_number_prefix' => 'string', 'recurring_number_prefix' => 'string',
'reset_counter_frequency_id' => 'integer', 'reset_counter_frequency_id' => 'integer',
'reset_counter_date' => 'string', 'reset_counter_date' => 'string',
'require_invoice_signature' => 'bool', 'require_invoice_signature' => 'bool',
'require_quote_signature' => 'bool', 'require_quote_signature' => 'bool',
'state' => 'string', 'state' => 'string',
'email' => 'string', 'email' => 'string',
'vat_number' => 'string', 'vat_number' => 'string',
'id_number' => 'string', 'id_number' => 'string',
'tax_name1' => 'string', 'tax_name1' => 'string',
'tax_name2' => 'string', 'tax_name2' => 'string',
'tax_name3' => 'string', 'tax_name3' => 'string',
'tax_rate1' => 'float', 'tax_rate1' => 'float',
'tax_rate2' => 'float', 'tax_rate2' => 'float',
'tax_rate3' => 'float', 'tax_rate3' => 'float',
'show_accept_quote_terms' => 'bool', 'show_accept_quote_terms' => 'bool',
'show_accept_invoice_terms' => 'bool', 'show_accept_invoice_terms' => 'bool',
'timezone_id' => 'string', 'timezone_id' => 'string',
'date_format_id' => 'string', 'date_format_id' => 'string',
'military_time' => 'bool', 'military_time' => 'bool',
'language_id' => 'string', 'language_id' => 'string',
'show_currency_code' => 'bool', 'show_currency_code' => 'bool',
'send_reminders' => 'bool', 'send_reminders' => 'bool',
'enable_client_portal_tasks' => 'bool', 'enable_client_portal_tasks' => 'bool',
'lock_sent_invoices' => 'bool', 'lock_sent_invoices' => 'bool',
'auto_archive_invoice' => 'bool', 'auto_archive_invoice' => 'bool',
'auto_archive_quote' => 'bool', 'auto_archive_quote' => 'bool',
'auto_convert_quote' => 'bool', 'auto_convert_quote' => 'bool',
'shared_invoice_quote_counter' => 'bool', 'shared_invoice_quote_counter' => 'bool',
'counter_padding' => 'integer', 'counter_padding' => 'integer',
'design' => 'string', 'design' => 'string',
'website' => 'string', 'website' => 'string',
]; ];
/** /**
* Array of variables which * Array of variables which
* cannot be modified client side * cannot be modified client side
*/
public static $protected_fields = [
// 'credit_number_counter',
// 'invoice_number_counter',
// 'quote_number_counter',
];
/**
* Cast object values and return entire class
* prevents missing properties from not being returned
* and always ensure an up to date class is returned
*
* @return \stdClass
*/ */
public function __construct($obj) public static $protected_fields = [
{ // 'credit_number_counter',
// parent::__construct($obj); // 'invoice_number_counter',
} // 'quote_number_counter',
];
/** /**
* Provides class defaults on init * Cast object values and return entire class
* @return object * prevents missing properties from not being returned
*/ * and always ensure an up to date class is returned
public static function defaults() : \stdClass *
{ * @return \stdClass
*/
public function __construct($obj)
{
// parent::__construct($obj);
}
$config = json_decode(config('ninja.settings')); /**
* Provides class defaults on init
* @return object
*/
public static function defaults() : \stdClass
{
$config = json_decode(config('ninja.settings'));
$data = (object)get_class_vars(CompanySettings::class); $data = (object)get_class_vars(CompanySettings::class);
unset($data->casts); unset($data->casts);
unset($data->protected_fields); unset($data->protected_fields);
$data->timezone_id = (string)config('ninja.i18n.timezone_id'); $data->timezone_id = (string)config('ninja.i18n.timezone_id');
$data->currency_id = (string)config('ninja.i18n.currency_id'); $data->currency_id = (string)config('ninja.i18n.currency_id');
$data->language_id = (string)config('ninja.i18n.language_id'); $data->language_id = (string)config('ninja.i18n.language_id');
$data->payment_terms = (int)config('ninja.i18n.payment_terms'); $data->payment_terms = (int)config('ninja.i18n.payment_terms');
$data->military_time = (bool)config('ninja.i18n.military_time'); $data->military_time = (bool)config('ninja.i18n.military_time');
$data->date_format_id = (string)config('ninja.i18n.date_format_id'); $data->date_format_id = (string)config('ninja.i18n.date_format_id');
$data->country_id = (string)config('ninja.i18n.country_id'); $data->country_id = (string)config('ninja.i18n.country_id');
$data->translations = (object) []; $data->translations = (object) [];
// $data->email_subject_invoice = EmailTemplateDefaults::emailInvoiceSubject(); // $data->email_subject_invoice = EmailTemplateDefaults::emailInvoiceSubject();
// $data->email_template_invoice = EmailTemplateDefaults:: emailInvoiceTemplate(); // $data->email_template_invoice = EmailTemplateDefaults:: emailInvoiceTemplate();
// $data->email_subject_quote = EmailTemplateDefaults::emailQuoteSubject(); // $data->email_subject_quote = EmailTemplateDefaults::emailQuoteSubject();
// $data->email_subject_payment = EmailTemplateDefaults::emailPaymentSubject(); // $data->email_subject_payment = EmailTemplateDefaults::emailPaymentSubject();
// $data->email_subject_statement = EmailTemplateDefaults::emailStatementSubject(); // $data->email_subject_statement = EmailTemplateDefaults::emailStatementSubject();
// $data->email_template_quote = EmailTemplateDefaults::emailQuoteTemplate(); // $data->email_template_quote = EmailTemplateDefaults::emailQuoteTemplate();
// $data->email_template_payment = EmailTemplateDefaults::emailPaymentTemplate(); // $data->email_template_payment = EmailTemplateDefaults::emailPaymentTemplate();
// $data->email_template_statement = EmailTemplateDefaults::emailStatementTemplate(); // $data->email_template_statement = EmailTemplateDefaults::emailStatementTemplate();
// $data->email_subject_reminder1 = EmailTemplateDefaults::emailReminder1Subject(); // $data->email_subject_reminder1 = EmailTemplateDefaults::emailReminder1Subject();
// $data->email_subject_reminder2 = EmailTemplateDefaults::emailReminder2Subject(); // $data->email_subject_reminder2 = EmailTemplateDefaults::emailReminder2Subject();
// $data->email_subject_reminder3 = EmailTemplateDefaults::emailReminder3Subject(); // $data->email_subject_reminder3 = EmailTemplateDefaults::emailReminder3Subject();
// $data->email_subject_reminder_endless = EmailTemplateDefaults::emailReminderEndlessSubject(); // $data->email_subject_reminder_endless = EmailTemplateDefaults::emailReminderEndlessSubject();
// $data->email_template_reminder1 = EmailTemplateDefaults::emailReminder1Template(); // $data->email_template_reminder1 = EmailTemplateDefaults::emailReminder1Template();
// $data->email_template_reminder2 = EmailTemplateDefaults::emailReminder2Template(); // $data->email_template_reminder2 = EmailTemplateDefaults::emailReminder2Template();
// $data->email_template_reminder3 = EmailTemplateDefaults::emailReminder3Template(); // $data->email_template_reminder3 = EmailTemplateDefaults::emailReminder3Template();
// $data->email_template_reminder_endless = EmailTemplateDefaults::emailReminderEndlessTemplate(); // $data->email_template_reminder_endless = EmailTemplateDefaults::emailReminderEndlessTemplate();
return self::setCasts($data, self::$casts); return self::setCasts($data, self::$casts);
}
} /**
* In case we update the settings object in the future we
* need to provide a fallback catch on old settings objects which will
* set new properties to the object prior to being returned.
*
* @param object $data The settings object to be checked
*/
public static function setProperties($settings) :\stdClass
{
$company_settings = (object)get_class_vars(CompanySettings::class);
/** foreach ($company_settings as $key => $value) {
* In case we update the settings object in the future we if (!property_exists($settings, $key)) {
* need to provide a fallback catch on old settings objects which will $settings->{$key} = self::castAttribute($key, $company_settings->{$key});
* set new properties to the object prior to being returned. }
* }
* @param object $data The settings object to be checked
*/
public static function setProperties($settings) :\stdClass
{
$company_settings = (object)get_class_vars(CompanySettings::class);
foreach($company_settings as $key => $value)
{
if(!property_exists($settings, $key))
$settings->{$key} = self::castAttribute($key, $company_settings->{$key});
}
return $settings;
}
return $settings;
}
} }

View File

@ -21,33 +21,30 @@ use App\Models\User;
class DefaultSettings extends BaseSettings class DefaultSettings extends BaseSettings
{ {
/** /**
* @var int * @var int
*/ */
public static $per_page = 25; public static $per_page = 25;
/** /**
* @return \stdClass * @return \stdClass
* *
* //todo user specific settings / preferences. * //todo user specific settings / preferences.
*/ */
public static function userSettings() : \stdClass public static function userSettings() : \stdClass
{ {
return (object)[ return (object)[
class_basename(User::class) => self::userSettingsObject(), class_basename(User::class) => self::userSettingsObject(),
]; ];
} }
/** /**
* @return \stdClass * @return \stdClass
*/ */
private static function userSettingsObject() : \stdClass private static function userSettingsObject() : \stdClass
{ {
return (object)[
return (object)[ 'per_page' => self::$per_page,
'per_page' => self::$per_page, ];
]; }
}
} }

View File

@ -108,5 +108,3 @@ class EmailTemplateDefaults
return str_replace(":", "$", ctrans('texts.'.$string)); return str_replace(":", "$", ctrans('texts.'.$string));
} }
} }

View File

@ -13,29 +13,29 @@ namespace App\DataMapper;
class FeesAndLimits class FeesAndLimits
{ {
public $min_limit = -1; //equivalent to null public $min_limit = -1; //equivalent to null
public $max_limit = -1; //equivalent to null public $max_limit = -1; //equivalent to null
public $fee_amount = 0; public $fee_amount = 0;
public $fee_percent = 0; public $fee_percent = 0;
public $fee_tax_name1 = ''; public $fee_tax_name1 = '';
public $fee_tax_name2 = ''; public $fee_tax_name2 = '';
public $fee_tax_name3 = ''; public $fee_tax_name3 = '';
public $fee_tax_rate1 = 0; public $fee_tax_rate1 = 0;
public $fee_tax_rate2 = 0; public $fee_tax_rate2 = 0;
public $fee_tax_rate3 = 0; public $fee_tax_rate3 = 0;
public $fee_cap = 0; public $fee_cap = 0;
public $adjust_fee_percent = false; public $adjust_fee_percent = false;
//public $gateway_type_id = 1; //public $gateway_type_id = 1;

View File

@ -13,7 +13,6 @@ namespace App\DataMapper;
class InvoiceItem class InvoiceItem
{ {
public $quantity = 0; public $quantity = 0;
public $cost = 0; public $cost = 0;

View File

@ -13,13 +13,13 @@ namespace App\DataMapper;
class PaymentMethodMeta class PaymentMethodMeta
{ {
public $exp_month; public $exp_month;
public $exp_year; public $exp_year;
public $brand; public $brand;
public $last4; public $last4;
public $type; public $type;
} }

View File

@ -13,17 +13,15 @@ namespace App\DataMapper;
class PaymentTransaction class PaymentTransaction
{ {
public $transaction_id;
public $transaction_id; public $gateway_response;
public $gateway_response; public $account_gateway_id;
public $account_gateway_id; public $type_id;
public $type_id; public $status; // prepayment|payment|response|completed
public $status; // prepayment|payment|response|completed
public $invoices;
public $invoices;
} }

View File

@ -19,6 +19,7 @@ use Illuminate\Broadcasting\PresenceChannel;
use Illuminate\Foundation\Events\Dispatchable; use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Broadcasting\InteractsWithSockets; use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast; use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
/** /**
* Class ClientWasArchived. * Class ClientWasArchived.
*/ */

View File

@ -40,9 +40,7 @@ class ContactLoggedIn
*/ */
public function __construct(ClientContact $client_contact) public function __construct(ClientContact $client_contact)
{ {
$this->client_contact = $client_contact; $this->client_contact = $client_contact;
} }
/** /**

View File

@ -11,6 +11,7 @@
namespace App\Events\Invoice; namespace App\Events\Invoice;
use App\Models\Company;
use App\Models\Invoice; use App\Models\Invoice;
use Illuminate\Queue\SerializesModels; use Illuminate\Queue\SerializesModels;
@ -26,13 +27,15 @@ class InvoiceWasUpdated
*/ */
public $invoice; public $invoice;
public $company;
/** /**
* Create a new event instance. * Create a new event instance.
* *
* @param Invoice $invoice * @param Invoice $invoice
*/ */
public function __construct(Invoice $invoice) public function __construct(Invoice $invoice, Company $company)
{ {
$this->invoice = $invoice; $this->invoice = $invoice;
$this->company = $company;
} }
} }

View File

@ -39,9 +39,7 @@ class UserLoggedIn
*/ */
public function __construct($user) public function __construct($user)
{ {
$this->user = $user; $this->user = $user;
} }
/** /**

View File

@ -70,47 +70,32 @@ class Handler extends ExceptionHandler
public function render($request, Exception $exception) public function render($request, Exception $exception)
{ {
if ($exception instanceof ModelNotFoundException && $request->expectsJson()) {
if ($exception instanceof ModelNotFoundException && $request->expectsJson()) return response()->json(['message'=>'Record not found'], 400);
{ } elseif ($exception instanceof ThrottleRequestsException && $request->expectsJson()) {
return response()->json(['message'=>'Record not found'],400); return response()->json(['message'=>'Too many requests'], 429);
} } elseif ($exception instanceof FatalThrowableError && $request->expectsJson()) {
else if($exception instanceof ThrottleRequestsException && $request->expectsJson())
{
return response()->json(['message'=>'Too many requests'],429);
}
else if($exception instanceof FatalThrowableError && $request->expectsJson())
{
return response()->json(['message'=>'Fatal error'], 500); return response()->json(['message'=>'Fatal error'], 500);
} } elseif ($exception instanceof AuthorizationException) {
else if($exception instanceof AuthorizationException) return response()->json(['message'=>'You are not authorized to view or perform this action'], 401);
{ } elseif ($exception instanceof \Illuminate\Session\TokenMismatchException) {
return response()->json(['message'=>'You are not authorized to view or perform this action'],401);
}
else if ($exception instanceof \Illuminate\Session\TokenMismatchException)
{
return redirect() return redirect()
->back() ->back()
->withInput($request->except('password', 'password_confirmation', '_token')) ->withInput($request->except('password', 'password_confirmation', '_token'))
->with([ ->with([
'message' => ctrans('texts.token_expired'), 'message' => ctrans('texts.token_expired'),
'message-type' => 'danger']); 'message-type' => 'danger']);
} } elseif ($exception instanceof NotFoundHttpException && $request->expectsJson()) {
else if ($exception instanceof NotFoundHttpException && $request->expectsJson()) { return response()->json(['message'=>'Route does not exist'], 404);
return response()->json(['message'=>'Route does not exist'],404); } elseif ($exception instanceof MethodNotAllowedHttpException && $request->expectsJson()) {
} return response()->json(['message'=>'Method not support for this route'], 404);
else if($exception instanceof MethodNotAllowedHttpException && $request->expectsJson()){ } elseif ($exception instanceof ValidationException && $request->expectsJson()) {
return response()->json(['message'=>'Method not support for this route'],404);
}
else if ($exception instanceof ValidationException && $request->expectsJson()) {
return response()->json(['message' => 'The given data was invalid.', 'errors' => $exception->validator->getMessageBag()], 422); return response()->json(['message' => 'The given data was invalid.', 'errors' => $exception->validator->getMessageBag()], 422);
} } elseif ($exception instanceof RelationNotFoundException && $request->expectsJson()) {
else if ($exception instanceof RelationNotFoundException && $request->expectsJson()) {
return response()->json(['message' => $exception->getMessage()], 400); return response()->json(['message' => $exception->getMessage()], 400);
} }
return parent::render($request, $exception); return parent::render($request, $exception);
} }

View File

@ -15,15 +15,15 @@ use App\Models\ClientContact;
class ClientContactFactory class ClientContactFactory
{ {
public static function create(int $company_id, int $user_id) :ClientContact public static function create(int $company_id, int $user_id) :ClientContact
{ {
$client_contact = new ClientContact; $client_contact = new ClientContact;
$client_contact->first_name = ""; $client_contact->first_name = "";
$client_contact->user_id = $user_id; $client_contact->user_id = $user_id;
$client_contact->company_id = $company_id; $client_contact->company_id = $company_id;
$client_contact->contact_key = \Illuminate\Support\Str::random(40); $client_contact->contact_key = \Illuminate\Support\Str::random(40);
$client_contact->id = 0; $client_contact->id = 0;
return $client_contact; return $client_contact;
} }
} }

View File

@ -17,24 +17,24 @@ use Illuminate\Support\Str;
class ClientFactory class ClientFactory
{ {
public static function create(int $company_id, int $user_id) :Client public static function create(int $company_id, int $user_id) :Client
{ {
$client = new Client; $client = new Client;
$client->company_id = $company_id; $client->company_id = $company_id;
$client->user_id = $user_id; $client->user_id = $user_id;
$client->name = ''; $client->name = '';
$client->website = ''; $client->website = '';
$client->private_notes = ''; $client->private_notes = '';
$client->balance = 0; $client->balance = 0;
$client->paid_to_date = 0; $client->paid_to_date = 0;
$client->country_id = 4; $client->country_id = 4;
$client->is_deleted = 0; $client->is_deleted = 0;
$client->client_hash = Str::random(40); $client->client_hash = Str::random(40);
$client->settings = ClientSettings::defaults(); $client->settings = ClientSettings::defaults();
$client_contact = ClientContactFactory::create($company_id, $user_id); $client_contact = ClientContactFactory::create($company_id, $user_id);
$client->contacts->add($client_contact); $client->contacts->add($client_contact);
return $client; return $client;
} }
} }

View File

@ -15,20 +15,19 @@ use App\Models\Invoice;
class CloneInvoiceFactory class CloneInvoiceFactory
{ {
public static function create(Invoice $invoice, $user_id) : ?Invoice public static function create(Invoice $invoice, $user_id) : ?Invoice
{ {
$clone_invoice = $invoice->replicate(); $clone_invoice = $invoice->replicate();
$clone_invoice->status_id = Invoice::STATUS_DRAFT; $clone_invoice->status_id = Invoice::STATUS_DRAFT;
$clone_invoice->number = NULL; $clone_invoice->number = null;
$clone_invoice->date = null; $clone_invoice->date = null;
$clone_invoice->due_date = null; $clone_invoice->due_date = null;
$clone_invoice->partial_due_date = null; $clone_invoice->partial_due_date = null;
$clone_invoice->user_id = $user_id; $clone_invoice->user_id = $user_id;
$clone_invoice->balance = $invoice->amount; $clone_invoice->balance = $invoice->amount;
$clone_invoice->line_items = $invoice->line_items; $clone_invoice->line_items = $invoice->line_items;
$clone_invoice->backup = null; $clone_invoice->backup = null;
return $clone_invoice;
}
return $clone_invoice;
}
} }

View File

@ -16,45 +16,43 @@ use App\Models\Quote;
class CloneInvoiceToQuoteFactory class CloneInvoiceToQuoteFactory
{ {
public static function create(Invoice $invoice, $user_id) : ?Quote public static function create(Invoice $invoice, $user_id) : ?Quote
{ {
$quote = new Quote();
$quote->client_id = $invoice->client_id;
$quote->user_id = $user_id;
$quote->company_id = $invoice->company_id;
$quote->discount = $invoice->discount;
$quote->is_amount_discount = $invoice->is_amount_discount;
$quote->po_number = $invoice->po_number;
$quote->is_deleted = false;
$quote->backup = null;
$quote->footer = $invoice->footer;
$quote->public_notes = $invoice->public_notes;
$quote->private_notes = $invoice->private_notes;
$quote->terms = $invoice->terms;
$quote->tax_name1 = $invoice->tax_name1;
$quote->tax_rate1 = $invoice->tax_rate1;
$quote->tax_name2 = $invoice->tax_name2;
$quote->tax_rate2 = $invoice->tax_rate2;
$quote->custom_value1 = $invoice->custom_value1;
$quote->custom_value2 = $invoice->custom_value2;
$quote->custom_value3 = $invoice->custom_value3;
$quote->custom_value4 = $invoice->custom_value4;
$quote->amount = $invoice->amount;
$quote->balance = $invoice->balance;
$quote->partial = $invoice->partial;
$quote->partial_due_date = $invoice->partial_due_date;
$quote->last_viewed = $invoice->last_viewed;
$quote = new Quote(); $quote->status_id = Quote::STATUS_DRAFT;
$quote->client_id = $invoice->client_id; $quote->number = '';
$quote->user_id = $user_id; $quote->date = null;
$quote->company_id = $invoice->company_id; $quote->due_date = null;
$quote->discount = $invoice->discount; $quote->partial_due_date = null;
$quote->is_amount_discount = $invoice->is_amount_discount; $quote->balance = $invoice->amount;
$quote->po_number = $invoice->po_number; $quote->line_items = $invoice->line_items;
$quote->is_deleted = false;
$quote->backup = null;
$quote->footer = $invoice->footer;
$quote->public_notes = $invoice->public_notes;
$quote->private_notes = $invoice->private_notes;
$quote->terms = $invoice->terms;
$quote->tax_name1 = $invoice->tax_name1;
$quote->tax_rate1 = $invoice->tax_rate1;
$quote->tax_name2 = $invoice->tax_name2;
$quote->tax_rate2 = $invoice->tax_rate2;
$quote->custom_value1 = $invoice->custom_value1;
$quote->custom_value2 = $invoice->custom_value2;
$quote->custom_value3 = $invoice->custom_value3;
$quote->custom_value4 = $invoice->custom_value4;
$quote->amount = $invoice->amount;
$quote->balance = $invoice->balance;
$quote->partial = $invoice->partial;
$quote->partial_due_date = $invoice->partial_due_date;
$quote->last_viewed = $invoice->last_viewed;
$quote->status_id = Quote::STATUS_DRAFT;
$quote->number = '';
$quote->date = null;
$quote->due_date = null;
$quote->partial_due_date = null;
$quote->balance = $invoice->amount;
$quote->line_items = $invoice->line_items;
return $quote;
}
return $quote;
}
} }

View File

@ -17,14 +17,14 @@ use App\Utils\Traits\MakesHash;
class CompanyFactory class CompanyFactory
{ {
use MakesHash; use MakesHash;
/** /**
* @param int $account_id * @param int $account_id
* @return Company * @return Company
*/ */
public function create(int $account_id) :Company public function create(int $account_id) :Company
{ {
$company = new Company; $company = new Company;
// $company->name = ''; // $company->name = '';
$company->account_id = $account_id; $company->account_id = $account_id;

View File

@ -15,15 +15,12 @@ use App\Models\CompanyGateway;
class CompanyGatewayFactory class CompanyGatewayFactory
{ {
public static function create(int $company_id, int $user_id) :CompanyGateway
public static function create(int $company_id, int $user_id) :CompanyGateway {
{
$company_gateway = new CompanyGateway; $company_gateway = new CompanyGateway;
$company_gateway->company_id = $company_id; $company_gateway->company_id = $company_id;
$company_gateway->user_id = $user_id; $company_gateway->user_id = $user_id;
return $company_gateway; return $company_gateway;
} }
} }

View File

@ -15,17 +15,17 @@ use App\Models\CompanyLedger;
class CompanyLedgerFactory class CompanyLedgerFactory
{ {
public static function create(int $company_id, int $user_id) :CompanyLedger public static function create(int $company_id, int $user_id) :CompanyLedger
{ {
$company_ledger = new CompanyLedger; $company_ledger = new CompanyLedger;
$company_ledger->company_id = $company_id; $company_ledger->company_id = $company_id;
$company_ledger->user_id = $user_id; $company_ledger->user_id = $user_id;
$company_ledger->adjustment = 0; $company_ledger->adjustment = 0;
$company_ledger->balance = 0; $company_ledger->balance = 0;
$company_ledger->notes = ''; $company_ledger->notes = '';
$company_ledger->hash = ''; $company_ledger->hash = '';
$company_ledger->client_id = 0; $company_ledger->client_id = 0;
return $company_ledger; return $company_ledger;
} }
} }

View File

@ -15,16 +15,13 @@ use App\Models\CompanyUser;
class CompanyUserFactory class CompanyUserFactory
{ {
public static function create($user_id, $company_id, $account_id) :CompanyUser
public static function create($user_id, $company_id, $account_id) :CompanyUser {
{
$company_user = new CompanyUser; $company_user = new CompanyUser;
$company_user->user_id = $user_id; $company_user->user_id = $user_id;
$company_user->company_id = $company_id; $company_user->company_id = $company_id;
$company_user->account_id = $account_id; $company_user->account_id = $account_id;
return $company_user; return $company_user;
} }
} }

View File

@ -15,10 +15,8 @@ use App\Models\GroupSetting;
class GroupSettingFactory class GroupSettingFactory
{ {
public static function create(int $company_id, int $user_id) :GroupSetting
public static function create(int $company_id, int $user_id) :GroupSetting {
{
$gs = new GroupSetting; $gs = new GroupSetting;
$gs->name = ''; $gs->name = '';
$gs->company_id = $company_id; $gs->company_id = $company_id;
@ -26,6 +24,5 @@ class GroupSettingFactory
$gs->settings = '{}'; $gs->settings = '{}';
return $gs; return $gs;
} }
} }

View File

@ -18,39 +18,39 @@ use Illuminate\Support\Facades\Log;
class InvoiceFactory class InvoiceFactory
{ {
public static function create(int $company_id, int $user_id) :Invoice public static function create(int $company_id, int $user_id) :Invoice
{ {
$invoice = new Invoice(); $invoice = new Invoice();
$invoice->status_id = Invoice::STATUS_DRAFT; $invoice->status_id = Invoice::STATUS_DRAFT;
$invoice->number = null; $invoice->number = null;
$invoice->discount = 0; $invoice->discount = 0;
$invoice->is_amount_discount = true; $invoice->is_amount_discount = true;
$invoice->po_number = ''; $invoice->po_number = '';
$invoice->footer = ''; $invoice->footer = '';
$invoice->terms = ''; $invoice->terms = '';
$invoice->public_notes = ''; $invoice->public_notes = '';
$invoice->private_notes = ''; $invoice->private_notes = '';
$invoice->date = null; $invoice->date = null;
$invoice->due_date = null; $invoice->due_date = null;
$invoice->partial_due_date = null; $invoice->partial_due_date = null;
$invoice->is_deleted = false; $invoice->is_deleted = false;
$invoice->line_items = json_encode([]); $invoice->line_items = json_encode([]);
$invoice->backup = json_encode([]); $invoice->backup = json_encode([]);
$invoice->tax_name1 = ''; $invoice->tax_name1 = '';
$invoice->tax_rate1 = 0; $invoice->tax_rate1 = 0;
$invoice->tax_name2 = ''; $invoice->tax_name2 = '';
$invoice->tax_rate2 = 0; $invoice->tax_rate2 = 0;
$invoice->custom_value1 = 0; $invoice->custom_value1 = 0;
$invoice->custom_value2 = 0; $invoice->custom_value2 = 0;
$invoice->custom_value3 = 0; $invoice->custom_value3 = 0;
$invoice->custom_value4 = 0; $invoice->custom_value4 = 0;
$invoice->amount = 0; $invoice->amount = 0;
$invoice->balance = 0; $invoice->balance = 0;
$invoice->partial = 0; $invoice->partial = 0;
$invoice->user_id = $user_id; $invoice->user_id = $user_id;
$invoice->company_id = $company_id; $invoice->company_id = $company_id;
$invoice->recurring_id = null; $invoice->recurring_id = null;
return $invoice; return $invoice;
} }
} }

View File

@ -16,27 +16,23 @@ use Illuminate\Support\Str;
class InvoiceInvitationFactory class InvoiceInvitationFactory
{ {
public static function create(int $company_id, int $user_id) :InvoiceInvitation
{
$ii = new InvoiceInvitation;
$ii->company_id = $company_id;
$ii->user_id = $user_id;
$ii->client_contact_id = null;
$ii->invoice_id = null;
$ii->key = Str::random(config('ninja.key_length'));
$ii->transaction_reference = null;
$ii->message_id = null;
$ii->email_error = '';
$ii->signature_base64 = '';
$ii->signature_date = null;
$ii->sent_date = null;
$ii->viewed_date = null;
$ii->opened_date = null;
public static function create(int $company_id, int $user_id) :InvoiceInvitation return $ii;
{ }
$ii = new InvoiceInvitation;
$ii->company_id = $company_id;
$ii->user_id = $user_id;
$ii->client_contact_id = null;
$ii->invoice_id = null;
$ii->key = Str::random(config('ninja.key_length'));
$ii->transaction_reference = null;
$ii->message_id = null;
$ii->email_error = '';
$ii->signature_base64 = '';
$ii->signature_date = null;
$ii->sent_date = null;
$ii->viewed_date = null;
$ii->opened_date = null;
return $ii;
}
} }

View File

@ -12,70 +12,67 @@
namespace App\Factory; namespace App\Factory;
use Illuminate\Support\Carbon; use Illuminate\Support\Carbon;
//use Faker\Generator as Faker; //use Faker\Generator as Faker;
class InvoiceItemFactory class InvoiceItemFactory
{ {
public static function create() :\stdClass public static function create() :\stdClass
{ {
$item = new \stdClass; $item = new \stdClass;
$item->quantity = 0; $item->quantity = 0;
$item->cost = 0; $item->cost = 0;
$item->product_key = ''; $item->product_key = '';
$item->notes = ''; $item->notes = '';
$item->discount = 0; $item->discount = 0;
$item->is_amount_discount = true; $item->is_amount_discount = true;
$item->tax_name1 = ''; $item->tax_name1 = '';
$item->tax_rate1 = 0; $item->tax_rate1 = 0;
$item->tax_name2 = ''; $item->tax_name2 = '';
$item->tax_rate2 = 0; $item->tax_rate2 = 0;
$item->tax_name3 = ''; $item->tax_name3 = '';
$item->tax_rate3 = 0; $item->tax_rate3 = 0;
$item->sort_id = 0; $item->sort_id = 0;
$item->line_total = 0; $item->line_total = 0;
$item->date = Carbon::now(); $item->date = Carbon::now();
$item->custom_value1 = NULL; $item->custom_value1 = null;
$item->custom_value2 = NULL; $item->custom_value2 = null;
$item->custom_value3 = NULL; $item->custom_value3 = null;
$item->custom_value4 = NULL; $item->custom_value4 = null;
return $item; return $item;
}
} /**
* Generates an array of dummy data for invoice items
* @param int $items Number of line items to create
* @return array array of objects
*/
public static function generate(int $items = 1) :array
{
$faker = \Faker\Factory::create();
/** $data = [];
* Generates an array of dummy data for invoice items
* @param int $items Number of line items to create
* @return array array of objects
*/
public static function generate(int $items = 1) :array
{
$faker = \Faker\Factory::create();
$data = []; for ($x=0; $x<$items; $x++) {
$item = self::create();
$item->quantity = $faker->numberBetween(1, 10);
$item->cost = $faker->randomFloat(2, 1, 1000);
$item->line_total = $item->quantity * $item->cost;
$item->is_amount_discount = true;
$item->discount = $faker->numberBetween(1, 10);
$item->notes = $faker->realText(20);
$item->product_key = $faker->word();
$item->custom_value1 = $faker->realText(10);
$item->custom_value2 = $faker->realText(10);
$item->custom_value3 = $faker->realText(10);
$item->custom_value4 = $faker->realText(10);
$item->tax_name1 = 'GST';
$item->tax_rate1 = '10.00';
for($x=0; $x<$items; $x++) $data[] = $item;
{ }
$item = self::create();
$item->quantity = $faker->numberBetween(1,10);
$item->cost = $faker->randomFloat(2, 1, 1000);
$item->line_total = $item->quantity * $item->cost;
$item->is_amount_discount = true;
$item->discount = $faker->numberBetween(1,10);
$item->notes = $faker->realText(20);
$item->product_key = $faker->word();
$item->custom_value1 = $faker->realText(10);
$item->custom_value2 = $faker->realText(10);
$item->custom_value3 = $faker->realText(10);
$item->custom_value4 = $faker->realText(10);
$item->tax_name1 = 'GST';
$item->tax_rate1 = '10.00';
$data[] = $item;
}
return $data;
}
return $data;
}
} }

View File

@ -18,44 +18,42 @@ use App\Models\RecurringInvoice;
class InvoiceToRecurringInvoiceFactory class InvoiceToRecurringInvoiceFactory
{ {
public static function create(Invoice $invoice) :RecurringInvoice
{
$recurring_invoice = new RecurringInvoice;
public static function create(Invoice $invoice) :RecurringInvoice $recurring_invoice->status_id = RecurringInvoice::STATUS_DRAFT;
{ $recurring_invoice->discount = $invoice->discount;
$recurring_invoice = new RecurringInvoice; $recurring_invoice->number = '';
$recurring_invoice->is_amount_discount = $invoice->is_amount_discount;
$recurring_invoice->status_id = RecurringInvoice::STATUS_DRAFT; $recurring_invoice->po_number = $invoice->po_number;
$recurring_invoice->discount = $invoice->discount; $recurring_invoice->footer = $invoice->footer;
$recurring_invoice->number = ''; $recurring_invoice->terms = $invoice->terms;
$recurring_invoice->is_amount_discount = $invoice->is_amount_discount; $recurring_invoice->public_notes = $invoice->public_notes;
$recurring_invoice->po_number = $invoice->po_number; $recurring_invoice->private_notes = $invoice->private_notes;
$recurring_invoice->footer = $invoice->footer; $recurring_invoice->date = date_create()->format($invoice->client->date_format());
$recurring_invoice->terms = $invoice->terms; $recurring_invoice->due_date = $invoice->due_date; //todo calculate based on terms
$recurring_invoice->public_notes = $invoice->public_notes; $recurring_invoice->is_deleted = $invoice->is_deleted;
$recurring_invoice->private_notes = $invoice->private_notes; $recurring_invoice->line_items = $invoice->line_items;
$recurring_invoice->date = date_create()->format($invoice->client->date_format()); $recurring_invoice->tax_name1 = $invoice->tax_name1;
$recurring_invoice->due_date = $invoice->due_date; //todo calculate based on terms $recurring_invoice->tax_rate1 = $invoice->tax_rate1;
$recurring_invoice->is_deleted = $invoice->is_deleted; $recurring_invoice->tax_name2 = $invoice->tax_name2;
$recurring_invoice->line_items = $invoice->line_items; $recurring_invoice->tax_rate2 = $invoice->tax_rate2;
$recurring_invoice->tax_name1 = $invoice->tax_name1; $recurring_invoice->custom_value1 = $invoice->custom_value1;
$recurring_invoice->tax_rate1 = $invoice->tax_rate1; $recurring_invoice->custom_value2 = $invoice->custom_value2;
$recurring_invoice->tax_name2 = $invoice->tax_name2; $recurring_invoice->custom_value3 = $invoice->custom_value3;
$recurring_invoice->tax_rate2 = $invoice->tax_rate2; $recurring_invoice->custom_value4 = $invoice->custom_value4;
$recurring_invoice->custom_value1 = $invoice->custom_value1; $recurring_invoice->amount = $invoice->amount;
$recurring_invoice->custom_value2 = $invoice->custom_value2; $recurring_invoice->balance = $invoice->balance;
$recurring_invoice->custom_value3 = $invoice->custom_value3; $recurring_invoice->user_id = $invoice->user_id;
$recurring_invoice->custom_value4 = $invoice->custom_value4; $recurring_invoice->client_id = $invoice->client_id;
$recurring_invoice->amount = $invoice->amount; $recurring_invoice->company_id = $invoice->company_id;
$recurring_invoice->balance = $invoice->balance; $recurring_invoice->frequency_id = RecurringInvoice::FREQUENCY_MONTHLY;
$recurring_invoice->user_id = $invoice->user_id; $recurring_invoice->start_date = null;
$recurring_invoice->client_id = $invoice->client_id; $recurring_invoice->last_sent_date = null;
$recurring_invoice->company_id = $invoice->company_id; $recurring_invoice->next_send_date = null;
$recurring_invoice->frequency_id = RecurringInvoice::FREQUENCY_MONTHLY; $recurring_invoice->remaining_cycles = 0;
$recurring_invoice->start_date = null;
$recurring_invoice->last_sent_date = null;
$recurring_invoice->next_send_date = null;
$recurring_invoice->remaining_cycles = 0;
return $recurring_invoice;
}
return $recurring_invoice;
}
} }

View File

@ -19,27 +19,24 @@ use Illuminate\Support\Facades\Log;
class PaymentFactory class PaymentFactory
{ {
public static function create(int $company_id, int $user_id) :Payment public static function create(int $company_id, int $user_id) :Payment
{ {
$payment = new Payment; $payment = new Payment;
$payment->company_id = $company_id; $payment->company_id = $company_id;
$payment->user_id = $user_id; $payment->user_id = $user_id;
$payment->client_id = 0; $payment->client_id = 0;
$payment->client_contact_id = null; $payment->client_contact_id = null;
$payment->invitation_id = null; $payment->invitation_id = null;
$payment->company_gateway_id = null; $payment->company_gateway_id = null;
$payment->type_id = null; $payment->type_id = null;
$payment->is_deleted = false; $payment->is_deleted = false;
$payment->amount = 0; $payment->amount = 0;
$payment->date = Carbon::now()->format('Y-m-d'); $payment->date = Carbon::now()->format('Y-m-d');
$payment->transaction_reference = null; $payment->transaction_reference = null;
$payment->payer_id = null; $payment->payer_id = null;
$payment->status_id = Payment::STATUS_PENDING; $payment->status_id = Payment::STATUS_PENDING;
return $payment; return $payment;
} }
} }

View File

@ -15,29 +15,27 @@ use App\Models\Product;
class ProductFactory class ProductFactory
{ {
public static function create(int $company_id, int $user_id) :Product public static function create(int $company_id, int $user_id) :Product
{ {
$product = new Product; $product = new Product;
$product->company_id = $company_id; $product->company_id = $company_id;
$product->user_id = $user_id; $product->user_id = $user_id;
$product->product_key = ''; $product->product_key = '';
$product->notes = ''; $product->notes = '';
$product->cost = 0; $product->cost = 0;
$product->price = 0; $product->price = 0;
$product->quantity = 1; $product->quantity = 1;
$product->tax_name1 = ''; $product->tax_name1 = '';
$product->tax_rate1 = 0; $product->tax_rate1 = 0;
$product->tax_name2 = ''; $product->tax_name2 = '';
$product->tax_rate2 = 0; $product->tax_rate2 = 0;
$product->custom_value1 = ''; $product->custom_value1 = '';
$product->custom_value2 = ''; $product->custom_value2 = '';
$product->custom_value3 = ''; $product->custom_value3 = '';
$product->custom_value4 = ''; $product->custom_value4 = '';
$product->is_deleted = 0; $product->is_deleted = 0;
return $product; return $product;
} }
} }

View File

@ -18,38 +18,38 @@ use Illuminate\Support\Facades\Log;
class QuoteFactory class QuoteFactory
{ {
public static function create(int $company_id, int $user_id) :Quote public static function create(int $company_id, int $user_id) :Quote
{ {
$quote = new Quote(); $quote = new Quote();
$quote->status_id = Quote::STATUS_DRAFT; $quote->status_id = Quote::STATUS_DRAFT;
$quote->number = null; $quote->number = null;
$quote->discount = 0; $quote->discount = 0;
$quote->is_amount_discount = true; $quote->is_amount_discount = true;
$quote->po_number = ''; $quote->po_number = '';
$quote->footer = ''; $quote->footer = '';
$quote->terms = ''; $quote->terms = '';
$quote->public_notes = ''; $quote->public_notes = '';
$quote->private_notes = ''; $quote->private_notes = '';
$quote->date = null; $quote->date = null;
$quote->due_date = null; $quote->due_date = null;
$quote->partial_due_date = null; $quote->partial_due_date = null;
$quote->is_deleted = false; $quote->is_deleted = false;
$quote->line_items = json_encode([]); $quote->line_items = json_encode([]);
$quote->backup = json_encode([]); $quote->backup = json_encode([]);
$quote->tax_name1 = ''; $quote->tax_name1 = '';
$quote->tax_rate1 = 0; $quote->tax_rate1 = 0;
$quote->tax_name2 = ''; $quote->tax_name2 = '';
$quote->tax_rate2 = 0; $quote->tax_rate2 = 0;
$quote->custom_value1 = 0; $quote->custom_value1 = 0;
$quote->custom_value2 = 0; $quote->custom_value2 = 0;
$quote->custom_value3 = 0; $quote->custom_value3 = 0;
$quote->custom_value4 = 0; $quote->custom_value4 = 0;
$quote->amount = 0; $quote->amount = 0;
$quote->balance = 0; $quote->balance = 0;
$quote->partial = 0; $quote->partial = 0;
$quote->user_id = $user_id; $quote->user_id = $user_id;
$quote->company_id = $company_id; $quote->company_id = $company_id;
return $quote; return $quote;
} }
} }

View File

@ -16,27 +16,23 @@ use Illuminate\Support\Str;
class QuoteInvitationFactory class QuoteInvitationFactory
{ {
public static function create(int $company_id, int $user_id) :QuoteInvitation
{
$qi = new QuoteInvitation;
$qi->company_id = $company_id;
$qi->user_id = $user_id;
$qi->client_contact_id = null;
$qi->quote_id = null;
$qi->key = Str::random(config('ninja.key_length'));
$qi->transaction_reference = null;
$qi->message_id = null;
$qi->email_error = '';
$qi->signature_base64 = '';
$qi->signature_date = null;
$qi->sent_date = null;
$qi->viewed_date = null;
$qi->opened_date = null;
public static function create(int $company_id, int $user_id) :QuoteInvitation return $qi;
{ }
$qi = new QuoteInvitation;
$qi->company_id = $company_id;
$qi->user_id = $user_id;
$qi->client_contact_id = null;
$qi->quote_id = null;
$qi->key = Str::random(config('ninja.key_length'));
$qi->transaction_reference = null;
$qi->message_id = null;
$qi->email_error = '';
$qi->signature_base64 = '';
$qi->signature_date = null;
$qi->sent_date = null;
$qi->viewed_date = null;
$qi->opened_date = null;
return $qi;
}
} }

View File

@ -17,44 +17,43 @@ use App\Models\RecurringInvoice;
class RecurringInvoiceFactory class RecurringInvoiceFactory
{ {
public static function create(int $company_id, int $user_id) :RecurringInvoice public static function create(int $company_id, int $user_id) :RecurringInvoice
{ {
$invoice = new RecurringInvoice(); $invoice = new RecurringInvoice();
$invoice->status_id = RecurringInvoice::STATUS_DRAFT; $invoice->status_id = RecurringInvoice::STATUS_DRAFT;
$invoice->discount = 0; $invoice->discount = 0;
$invoice->is_amount_discount = true; $invoice->is_amount_discount = true;
$invoice->po_number = ''; $invoice->po_number = '';
$invoice->number = ''; $invoice->number = '';
$invoice->footer = ''; $invoice->footer = '';
$invoice->terms = ''; $invoice->terms = '';
$invoice->public_notes = ''; $invoice->public_notes = '';
$invoice->private_notes = ''; $invoice->private_notes = '';
$invoice->date = null; $invoice->date = null;
$invoice->due_date = null; $invoice->due_date = null;
$invoice->partial_due_date = null; $invoice->partial_due_date = null;
$invoice->is_deleted = false; $invoice->is_deleted = false;
$invoice->line_items = json_encode([]); $invoice->line_items = json_encode([]);
$invoice->backup = json_encode([]); $invoice->backup = json_encode([]);
$invoice->tax_name1 = ''; $invoice->tax_name1 = '';
$invoice->tax_rate1 = 0; $invoice->tax_rate1 = 0;
$invoice->tax_name2 = ''; $invoice->tax_name2 = '';
$invoice->tax_rate2 = 0; $invoice->tax_rate2 = 0;
$invoice->custom_value1 = 0; $invoice->custom_value1 = 0;
$invoice->custom_value2 = 0; $invoice->custom_value2 = 0;
$invoice->custom_value3 = 0; $invoice->custom_value3 = 0;
$invoice->custom_value4 = 0; $invoice->custom_value4 = 0;
$invoice->amount = 0; $invoice->amount = 0;
$invoice->balance = 0; $invoice->balance = 0;
$invoice->partial = 0; $invoice->partial = 0;
$invoice->user_id = $user_id; $invoice->user_id = $user_id;
$invoice->company_id = $company_id; $invoice->company_id = $company_id;
$invoice->frequency_id = RecurringInvoice::FREQUENCY_MONTHLY; $invoice->frequency_id = RecurringInvoice::FREQUENCY_MONTHLY;
$invoice->start_date = null; $invoice->start_date = null;
$invoice->last_sent_date = null; $invoice->last_sent_date = null;
$invoice->next_send_date = null; $invoice->next_send_date = null;
$invoice->remaining_cycles = 0; $invoice->remaining_cycles = 0;
return $invoice;
}
return $invoice;
}
} }

View File

@ -18,38 +18,36 @@ use App\Models\RecurringInvoice;
class recurring_invoiceToInvoiceFactory class recurring_invoiceToInvoiceFactory
{ {
public static function create(RecurringInvoice $recurring_invoice) :Invoice
{
$invoice = new Invoice();
$invoice->status_id = Invoice::STATUS_DRAFT;
$invoice->discount = $recurring_invoice->discount;
$invoice->is_amount_discount = $recurring_invoice->is_amount_discount;
$invoice->po_number = $recurring_invoice->po_number;
$invoice->footer = $recurring_invoice->footer;
$invoice->terms = $recurring_invoice->terms;
$invoice->public_notes = $recurring_invoice->public_notes;
$invoice->private_notes = $recurring_invoice->private_notes;
$invoice->date = date_create()->format($client->date_format());
$invoice->due_date = $recurring_invoice->due_date; //todo calculate based on terms
$invoice->is_deleted = $recurring_invoice->is_deleted;
$invoice->line_items = $recurring_invoice->line_items;
$invoice->backup = json_encode([]);
$invoice->tax_name1 = $recurring_invoice->tax_name1;
$invoice->tax_rate1 = $recurring_invoice->tax_rate1;
$invoice->tax_name2 = $recurring_invoice->tax_name2;
$invoice->tax_rate2 = $recurring_invoice->tax_rate2;
$invoice->custom_value1 = $recurring_invoice->custom_value1;
$invoice->custom_value2 = $recurring_invoice->custom_value2;
$invoice->custom_value3 = $recurring_invoice->custom_value3;
$invoice->custom_value4 = $recurring_invoice->custom_value4;
$invoice->amount = $recurring_invoice->amount;
$invoice->balance = $recurring_invoice->balance;
$invoice->user_id = $recurring_invoice->user_id;
$invoice->company_id = $recurring_invoice->company_id;
$invoice->recurring_id = $recurring_invoice->id;
public static function create(RecurringInvoice $recurring_invoice) :Invoice return $invoice;
{ }
$invoice = new Invoice();
$invoice->status_id = Invoice::STATUS_DRAFT;
$invoice->discount = $recurring_invoice->discount;
$invoice->is_amount_discount = $recurring_invoice->is_amount_discount;
$invoice->po_number = $recurring_invoice->po_number;
$invoice->footer = $recurring_invoice->footer;
$invoice->terms = $recurring_invoice->terms;
$invoice->public_notes = $recurring_invoice->public_notes;
$invoice->private_notes = $recurring_invoice->private_notes;
$invoice->date = date_create()->format($client->date_format());
$invoice->due_date = $recurring_invoice->due_date; //todo calculate based on terms
$invoice->is_deleted = $recurring_invoice->is_deleted;
$invoice->line_items = $recurring_invoice->line_items;
$invoice->backup = json_encode([]);
$invoice->tax_name1 = $recurring_invoice->tax_name1;
$invoice->tax_rate1 = $recurring_invoice->tax_rate1;
$invoice->tax_name2 = $recurring_invoice->tax_name2;
$invoice->tax_rate2 = $recurring_invoice->tax_rate2;
$invoice->custom_value1 = $recurring_invoice->custom_value1;
$invoice->custom_value2 = $recurring_invoice->custom_value2;
$invoice->custom_value3 = $recurring_invoice->custom_value3;
$invoice->custom_value4 = $recurring_invoice->custom_value4;
$invoice->amount = $recurring_invoice->amount;
$invoice->balance = $recurring_invoice->balance;
$invoice->user_id = $recurring_invoice->user_id;
$invoice->company_id = $recurring_invoice->company_id;
$invoice->recurring_id = $recurring_invoice->id;
return $invoice;
}
} }

View File

@ -17,43 +17,42 @@ use App\Models\RecurringQuote;
class RecurringQuoteFactory class RecurringQuoteFactory
{ {
public static function create(int $company_id, int $user_id) :RecurringQuote public static function create(int $company_id, int $user_id) :RecurringQuote
{ {
$quote = new RecurringQuote(); $quote = new RecurringQuote();
$quote->status_id = RecurringQuote::STATUS_DRAFT; $quote->status_id = RecurringQuote::STATUS_DRAFT;
$quote->discount = 0; $quote->discount = 0;
$quote->is_amount_discount = true; $quote->is_amount_discount = true;
$quote->po_number = ''; $quote->po_number = '';
$quote->footer = ''; $quote->footer = '';
$quote->terms = ''; $quote->terms = '';
$quote->public_notes = ''; $quote->public_notes = '';
$quote->private_notes = ''; $quote->private_notes = '';
$quote->date = null; $quote->date = null;
$quote->due_date = null; $quote->due_date = null;
$quote->partial_due_date = null; $quote->partial_due_date = null;
$quote->is_deleted = false; $quote->is_deleted = false;
$quote->line_items = json_encode([]); $quote->line_items = json_encode([]);
$quote->backup = json_encode([]); $quote->backup = json_encode([]);
$quote->tax_name1 = ''; $quote->tax_name1 = '';
$quote->tax_rate1 = 0; $quote->tax_rate1 = 0;
$quote->tax_name2 = ''; $quote->tax_name2 = '';
$quote->tax_rate2 = 0; $quote->tax_rate2 = 0;
$quote->custom_value1 = 0; $quote->custom_value1 = 0;
$quote->custom_value2 = 0; $quote->custom_value2 = 0;
$quote->custom_value3 = 0; $quote->custom_value3 = 0;
$quote->custom_value4 = 0; $quote->custom_value4 = 0;
$quote->amount = 0; $quote->amount = 0;
$quote->balance = 0; $quote->balance = 0;
$quote->partial = 0; $quote->partial = 0;
$quote->user_id = $user_id; $quote->user_id = $user_id;
$quote->company_id = $company_id; $quote->company_id = $company_id;
$quote->frequency_id = RecurringQuote::FREQUENCY_MONTHLY; $quote->frequency_id = RecurringQuote::FREQUENCY_MONTHLY;
$quote->start_date = null; $quote->start_date = null;
$quote->last_sent_date = null; $quote->last_sent_date = null;
$quote->next_send_date = null; $quote->next_send_date = null;
$quote->remaining_cycles = 0; $quote->remaining_cycles = 0;
return $quote;
}
return $quote;
}
} }

View File

@ -15,17 +15,15 @@ use App\Models\TaxRate;
class TaxRateFactory class TaxRateFactory
{ {
public static function create($company_id, $user_id) :TaxRate
{
$tax_rate = new TaxRate;
public static function create($company_id, $user_id) :TaxRate $tax_rate->name = '';
{ $tax_rate->rate = '';
$tax_rate = new TaxRate; $tax_rate->company_id = $company_id;
$tax_rate->user_id = $user_id;
$tax_rate->name = '';
$tax_rate->rate = '';
$tax_rate->company_id = $company_id;
$tax_rate->user_id = $user_id;
return $tax_rate;
}
return $tax_rate;
}
} }

View File

@ -15,19 +15,19 @@ use App\Models\User;
class UserFactory class UserFactory
{ {
public static function create() :User public static function create() :User
{ {
$user = new User; $user = new User;
$user->first_name = ''; $user->first_name = '';
$user->last_name = ''; $user->last_name = '';
$user->phone = ''; $user->phone = '';
$user->email = ''; $user->email = '';
$user->last_login = now(); $user->last_login = now();
$user->failed_logins = 0; $user->failed_logins = 0;
$user->signature = ''; $user->signature = '';
$user->theme_id = 0; $user->theme_id = 0;
return $user; return $user;
} }
} }

View File

@ -59,20 +59,21 @@ class ClientFilters extends QueryFilters
*/ */
public function filter(string $filter = '') : Builder public function filter(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
return $this->builder->where(function ($query) use ($filter) { return $this->builder->where(function ($query) use ($filter) {
$query->where('clients.name', 'like', '%'.$filter.'%') $query->where('clients.name', 'like', '%'.$filter.'%')
->orWhere('clients.id_number', 'like', '%'.$filter.'%') ->orWhere('clients.id_number', 'like', '%'.$filter.'%')
->orWhere('client_contacts.first_name', 'like', '%'.$filter.'%') ->orWhere('client_contacts.first_name', 'like', '%'.$filter.'%')
->orWhere('client_contacts.last_name', 'like', '%'.$filter.'%') ->orWhere('client_contacts.last_name', 'like', '%'.$filter.'%')
->orWhere('client_contacts.email', 'like', '%'.$filter.'%') ->orWhere('client_contacts.email', 'like', '%'.$filter.'%')
->orWhere('clients.custom_value1', 'like' , '%'.$filter.'%') ->orWhere('clients.custom_value1', 'like', '%'.$filter.'%')
->orWhere('clients.custom_value2', 'like' , '%'.$filter.'%') ->orWhere('clients.custom_value2', 'like', '%'.$filter.'%')
->orWhere('clients.custom_value3', 'like' , '%'.$filter.'%') ->orWhere('clients.custom_value3', 'like', '%'.$filter.'%')
->orWhere('clients.custom_value4', 'like' , '%'.$filter.'%'); ->orWhere('clients.custom_value4', 'like', '%'.$filter.'%');
}); });
} }
/** /**
@ -84,8 +85,9 @@ class ClientFilters extends QueryFilters
*/ */
public function status(string $filter = '') : Builder public function status(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
$table = 'clients'; $table = 'clients';
$filters = explode(',', $filter); $filters = explode(',', $filter);
@ -185,12 +187,10 @@ class ClientFilters extends QueryFilters
* @param $company_id The company Id * @param $company_id The company Id
* @return Illuminate\Database\Query\Builder * @return Illuminate\Database\Query\Builder
*/ */
public function entityFilter() public function entityFilter()
{ {
//return $this->builder->whereCompanyId(auth()->user()->company()->id); //return $this->builder->whereCompanyId(auth()->user()->company()->id);
return $this->builder->company(); return $this->builder->company();
} }
} }

View File

@ -41,26 +41,31 @@ class InvoiceFilters extends QueryFilters
public function client_status(string $value = '') :Builder public function client_status(string $value = '') :Builder
{ {
if(strlen($value) == 0) if (strlen($value) == 0) {
return $this->builder; return $this->builder;
}
$status_parameters = explode(",", $value); $status_parameters = explode(",", $value);
if (in_array('all', $status_parameters)) if (in_array('all', $status_parameters)) {
return $this->builder; return $this->builder;
}
if(in_array('paid', $status_parameters)) if (in_array('paid', $status_parameters)) {
$this->builder->where('status_id', Invoice::STATUS_PAID); $this->builder->where('status_id', Invoice::STATUS_PAID);
}
if(in_array('unpaid', $status_parameters)) if (in_array('unpaid', $status_parameters)) {
$this->builder->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]); $this->builder->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]);
//->where('due_date', '>', Carbon::now()) }
//->orWhere('partial_due_date', '>', Carbon::now()); //->where('due_date', '>', Carbon::now())
//->orWhere('partial_due_date', '>', Carbon::now());
if(in_array('overdue', $status_parameters)) if (in_array('overdue', $status_parameters)) {
$this->builder->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL]) $this->builder->whereIn('status_id', [Invoice::STATUS_SENT, Invoice::STATUS_PARTIAL])
->where('due_date', '<', Carbon::now()) ->where('due_date', '<', Carbon::now())
->orWhere('partial_due_date', '<', Carbon::now()); ->orWhere('partial_due_date', '<', Carbon::now());
}
return $this->builder; return $this->builder;
} }
@ -75,20 +80,21 @@ class InvoiceFilters extends QueryFilters
*/ */
public function filter(string $filter = '') : Builder public function filter(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
return $this->builder->where(function ($query) use ($filter) { return $this->builder->where(function ($query) use ($filter) {
$query->where('invoices.number', 'like', '%'.$filter.'%') $query->where('invoices.number', 'like', '%'.$filter.'%')
->orWhere('invoices.po_number', 'like', '%'.$filter.'%') ->orWhere('invoices.po_number', 'like', '%'.$filter.'%')
->orWhere('invoices.date', 'like', '%'.$filter.'%') ->orWhere('invoices.date', 'like', '%'.$filter.'%')
->orWhere('invoices.amount', 'like', '%'.$filter.'%') ->orWhere('invoices.amount', 'like', '%'.$filter.'%')
->orWhere('invoices.balance', 'like', '%'.$filter.'%') ->orWhere('invoices.balance', 'like', '%'.$filter.'%')
->orWhere('invoices.custom_value1', 'like', '%'.$filter.'%') ->orWhere('invoices.custom_value1', 'like', '%'.$filter.'%')
->orWhere('invoices.custom_value2', 'like' , '%'.$filter.'%') ->orWhere('invoices.custom_value2', 'like', '%'.$filter.'%')
->orWhere('invoices.custom_value3', 'like' , '%'.$filter.'%') ->orWhere('invoices.custom_value3', 'like', '%'.$filter.'%')
->orWhere('invoices.custom_value4', 'like' , '%'.$filter.'%'); ->orWhere('invoices.custom_value4', 'like', '%'.$filter.'%');
}); });
} }
/** /**
@ -100,8 +106,9 @@ class InvoiceFilters extends QueryFilters
*/ */
public function status(string $filter = '') : Builder public function status(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
$table = 'invoices'; $table = 'invoices';
$filters = explode(',', $filter); $filters = explode(',', $filter);
@ -150,7 +157,6 @@ class InvoiceFilters extends QueryFilters
*/ */
public function baseQuery(int $company_id, User $user) : Builder public function baseQuery(int $company_id, User $user) : Builder
{ {
} }
/** /**
@ -164,14 +170,13 @@ class InvoiceFilters extends QueryFilters
*/ */
public function entityFilter() public function entityFilter()
{ {
if (auth('contact')->user()) {
if(auth('contact')->user())
return $this->contactViewFilter(); return $this->contactViewFilter();
else } else {
return $this->builder->company(); return $this->builder->company();
}
// return $this->builder->whereCompanyId(auth()->user()->company()->id); // return $this->builder->whereCompanyId(auth()->user()->company()->id);
} }
/** /**
@ -182,13 +187,8 @@ class InvoiceFilters extends QueryFilters
*/ */
private function contactViewFilter() : Builder private function contactViewFilter() : Builder
{ {
return $this->builder return $this->builder
->whereCompanyId(auth('contact')->user()->company->id) ->whereCompanyId(auth('contact')->user()->company->id)
->whereNotIn('status_id', [Invoice::STATUS_DRAFT, Invoice::STATUS_CANCELLED]); ->whereNotIn('status_id', [Invoice::STATUS_DRAFT, Invoice::STATUS_CANCELLED]);
} }
} }

View File

@ -32,17 +32,18 @@ class PaymentFilters extends QueryFilters
*/ */
public function filter(string $filter = '') : Builder public function filter(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
return $this->builder->where(function ($query) use ($filter) { return $this->builder->where(function ($query) use ($filter) {
$query->where('payments.amount', 'like', '%'.$filter.'%') $query->where('payments.amount', 'like', '%'.$filter.'%')
->orWhere('payments.date', 'like', '%'.$filter.'%') ->orWhere('payments.date', 'like', '%'.$filter.'%')
->orWhere('payments.custom_value1', 'like', '%'.$filter.'%') ->orWhere('payments.custom_value1', 'like', '%'.$filter.'%')
->orWhere('payments.custom_value2', 'like' , '%'.$filter.'%') ->orWhere('payments.custom_value2', 'like', '%'.$filter.'%')
->orWhere('payments.custom_value3', 'like' , '%'.$filter.'%') ->orWhere('payments.custom_value3', 'like', '%'.$filter.'%')
->orWhere('payments.custom_value4', 'like' , '%'.$filter.'%'); ->orWhere('payments.custom_value4', 'like', '%'.$filter.'%');
}); });
} }
/** /**
@ -54,8 +55,9 @@ class PaymentFilters extends QueryFilters
*/ */
public function status(string $filter = '') : Builder public function status(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
$table = 'payments'; $table = 'payments';
$filters = explode(',', $filter); $filters = explode(',', $filter);
@ -104,7 +106,6 @@ class PaymentFilters extends QueryFilters
*/ */
public function baseQuery(int $company_id, User $user) : Builder public function baseQuery(int $company_id, User $user) : Builder
{ {
} }
/** /**
@ -113,13 +114,13 @@ class PaymentFilters extends QueryFilters
* @param $company_id The company Id * @param $company_id The company Id
* @return Illuminate\Database\Query\Builder * @return Illuminate\Database\Query\Builder
*/ */
public function entityFilter() public function entityFilter()
{ {
if (auth('contact')->user()) {
if(auth('contact')->user())
return $this->contactViewFilter(); return $this->contactViewFilter();
else } else {
return $this->builder->company(); return $this->builder->company();
}
} }
@ -132,10 +133,8 @@ class PaymentFilters extends QueryFilters
*/ */
private function contactViewFilter() : Builder private function contactViewFilter() : Builder
{ {
return $this->builder return $this->builder
->whereCompanyId(auth('contact')->user()->company->id) ->whereCompanyId(auth('contact')->user()->company->id)
->whereIsDeleted(false); ->whereIsDeleted(false);
} }
} }

View File

@ -31,17 +31,18 @@ class ProductFilters extends QueryFilters
*/ */
public function filter(string $filter = '') : Builder public function filter(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
return $this->builder->where(function ($query) use ($filter) { return $this->builder->where(function ($query) use ($filter) {
$query->where('products.product_key', 'like', '%'.$filter.'%') $query->where('products.product_key', 'like', '%'.$filter.'%')
->orWhere('products.notes', 'like', '%'.$filter.'%') ->orWhere('products.notes', 'like', '%'.$filter.'%')
->orWhere('products.custom_value1', 'like' , '%'.$filter.'%') ->orWhere('products.custom_value1', 'like', '%'.$filter.'%')
->orWhere('products.custom_value2', 'like' , '%'.$filter.'%') ->orWhere('products.custom_value2', 'like', '%'.$filter.'%')
->orWhere('products.custom_value3', 'like' , '%'.$filter.'%') ->orWhere('products.custom_value3', 'like', '%'.$filter.'%')
->orWhere('products.custom_value4', 'like' , '%'.$filter.'%'); ->orWhere('products.custom_value4', 'like', '%'.$filter.'%');
}); });
} }
/** /**
@ -53,8 +54,9 @@ class ProductFilters extends QueryFilters
*/ */
public function status(string $filter = '') : Builder public function status(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
$table = 'products'; $table = 'products';
$filters = explode(',', $filter); $filters = explode(',', $filter);
@ -103,7 +105,6 @@ class ProductFilters extends QueryFilters
*/ */
public function baseQuery(int $company_id, User $user) : Builder public function baseQuery(int $company_id, User $user) : Builder
{ {
} }
/** /**
@ -112,11 +113,8 @@ class ProductFilters extends QueryFilters
* @param $company_id The company Id * @param $company_id The company Id
* @return Illuminate\Database\Query\Builder * @return Illuminate\Database\Query\Builder
*/ */
public function entityFilter() public function entityFilter()
{ {
return $this->builder->company();
return $this->builder->company();
} }
} }

View File

@ -59,9 +59,7 @@ abstract class QueryFilters
*/ */
public function __construct(Request $request) public function __construct(Request $request)
{ {
$this->request = $request; $this->request = $request;
} }
/** /**
@ -100,9 +98,7 @@ abstract class QueryFilters
*/ */
public function filters() public function filters()
{ {
return $this->request->all(); return $this->request->all();
} }
/** /**
@ -113,7 +109,6 @@ abstract class QueryFilters
*/ */
public function split($value) : stdClass public function split($value) : stdClass
{ {
$exploded_array = explode(":", $value); $exploded_array = explode(":", $value);
$parts = new stdClass; $parts = new stdClass;
@ -122,7 +117,6 @@ abstract class QueryFilters
$parts->operator = $this->operatorConvertor($exploded_array[1]); $parts->operator = $this->operatorConvertor($exploded_array[1]);
return $parts; return $parts;
} }
/** /**
@ -133,7 +127,6 @@ abstract class QueryFilters
*/ */
private function operatorConvertor(string $operator) : string private function operatorConvertor(string $operator) : string
{ {
switch ($operator) { switch ($operator) {
case 'lt': case 'lt':
return '<'; return '<';
@ -167,7 +160,8 @@ abstract class QueryFilters
*/ */
public function clientFilter() public function clientFilter()
{ {
if(auth('contact')->user()) if (auth('contact')->user()) {
return $this->builder->whereClientId(auth('contact')->user()->client->id); return $this->builder->whereClientId(auth('contact')->user()->client->id);
}
} }
} }

View File

@ -31,15 +31,16 @@ class QuoteFilters extends QueryFilters
*/ */
public function filter(string $filter = '') : Builder public function filter(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
return $this->builder->where(function ($query) use ($filter) { return $this->builder->where(function ($query) use ($filter) {
$query->where('quotes.custom_value1', 'like', '%'.$filter.'%') $query->where('quotes.custom_value1', 'like', '%'.$filter.'%')
->orWhere('quotes.custom_value2', 'like' , '%'.$filter.'%') ->orWhere('quotes.custom_value2', 'like', '%'.$filter.'%')
->orWhere('quotes.custom_value3', 'like' , '%'.$filter.'%') ->orWhere('quotes.custom_value3', 'like', '%'.$filter.'%')
->orWhere('quotes.custom_value4', 'like' , '%'.$filter.'%'); ->orWhere('quotes.custom_value4', 'like', '%'.$filter.'%');
}); });
} }
/** /**
@ -51,8 +52,9 @@ class QuoteFilters extends QueryFilters
*/ */
public function status(string $filter = '') : Builder public function status(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
$table = 'quotes'; $table = 'quotes';
$filters = explode(',', $filter); $filters = explode(',', $filter);
@ -101,7 +103,6 @@ class QuoteFilters extends QueryFilters
*/ */
public function baseQuery(int $company_id, User $user) : Builder public function baseQuery(int $company_id, User $user) : Builder
{ {
} }
/** /**
@ -110,11 +111,8 @@ class QuoteFilters extends QueryFilters
* @param $company_id The company Id * @param $company_id The company Id
* @return Illuminate\Database\Query\Builder * @return Illuminate\Database\Query\Builder
*/ */
public function entityFilter() public function entityFilter()
{ {
return $this->builder->company();
return $this->builder->company();
} }
} }

View File

@ -31,15 +31,16 @@ class RecurringInvoiceFilters extends QueryFilters
*/ */
public function filter(string $filter = '') : Builder public function filter(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
return $this->builder->where(function ($query) use ($filter) { return $this->builder->where(function ($query) use ($filter) {
$query->where('recurring_invoices.custom_value1', 'like', '%'.$filter.'%') $query->where('recurring_invoices.custom_value1', 'like', '%'.$filter.'%')
->orWhere('recurring_invoices.custom_value2', 'like' , '%'.$filter.'%') ->orWhere('recurring_invoices.custom_value2', 'like', '%'.$filter.'%')
->orWhere('recurring_invoices.custom_value3', 'like' , '%'.$filter.'%') ->orWhere('recurring_invoices.custom_value3', 'like', '%'.$filter.'%')
->orWhere('recurring_invoices.custom_value4', 'like' , '%'.$filter.'%'); ->orWhere('recurring_invoices.custom_value4', 'like', '%'.$filter.'%');
}); });
} }
/** /**
@ -51,8 +52,9 @@ class RecurringInvoiceFilters extends QueryFilters
*/ */
public function status(string $filter = '') : Builder public function status(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
$table = 'recurring_'; $table = 'recurring_';
$filters = explode(',', $filter); $filters = explode(',', $filter);
@ -101,7 +103,6 @@ class RecurringInvoiceFilters extends QueryFilters
*/ */
public function baseQuery(int $company_id, User $user) : Builder public function baseQuery(int $company_id, User $user) : Builder
{ {
} }
/** /**
@ -110,11 +111,8 @@ class RecurringInvoiceFilters extends QueryFilters
* @param $company_id The company Id * @param $company_id The company Id
* @return Illuminate\Database\Query\Builder * @return Illuminate\Database\Query\Builder
*/ */
public function entityFilter() public function entityFilter()
{ {
return $this->builder->company();
return $this->builder->company();
} }
} }

View File

@ -31,15 +31,16 @@ class RecurringQuoteFilters extends QueryFilters
*/ */
public function filter(string $filter = '') : Builder public function filter(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
return $this->builder->where(function ($query) use ($filter) { return $this->builder->where(function ($query) use ($filter) {
$query->where('recurring_quotes.custom_value1', 'like', '%'.$filter.'%') $query->where('recurring_quotes.custom_value1', 'like', '%'.$filter.'%')
->orWhere('recurring_quotes.custom_value2', 'like' , '%'.$filter.'%') ->orWhere('recurring_quotes.custom_value2', 'like', '%'.$filter.'%')
->orWhere('recurring_quotes.custom_value3', 'like' , '%'.$filter.'%') ->orWhere('recurring_quotes.custom_value3', 'like', '%'.$filter.'%')
->orWhere('recurring_quotes.custom_value4', 'like' , '%'.$filter.'%'); ->orWhere('recurring_quotes.custom_value4', 'like', '%'.$filter.'%');
}); });
} }
/** /**
@ -51,8 +52,9 @@ class RecurringQuoteFilters extends QueryFilters
*/ */
public function status(string $filter = '') : Builder public function status(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
$table = 'recurring_'; $table = 'recurring_';
$filters = explode(',', $filter); $filters = explode(',', $filter);
@ -101,7 +103,6 @@ class RecurringQuoteFilters extends QueryFilters
*/ */
public function baseQuery(int $company_id, User $user) : Builder public function baseQuery(int $company_id, User $user) : Builder
{ {
} }
/** /**
@ -110,11 +111,8 @@ class RecurringQuoteFilters extends QueryFilters
* @param $company_id The company Id * @param $company_id The company Id
* @return Illuminate\Database\Query\Builder * @return Illuminate\Database\Query\Builder
*/ */
public function entityFilter() public function entityFilter()
{ {
return $this->builder->company();
return $this->builder->company();
} }
} }

View File

@ -31,15 +31,16 @@ class UserFilters extends QueryFilters
*/ */
public function filter(string $filter = '') : Builder public function filter(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
return $this->builder->where(function ($query) use ($filter) { return $this->builder->where(function ($query) use ($filter) {
$query->where('users.first_name', 'like', '%'.$filter.'%') $query->where('users.first_name', 'like', '%'.$filter.'%')
->orWhere('users.last_name', 'like' , '%'.$filter.'%') ->orWhere('users.last_name', 'like', '%'.$filter.'%')
->orWhere('users.email', 'like' , '%'.$filter.'%') ->orWhere('users.email', 'like', '%'.$filter.'%')
->orWhere('users.signature', 'like' , '%'.$filter.'%'); ->orWhere('users.signature', 'like', '%'.$filter.'%');
}); });
} }
/** /**
@ -51,8 +52,9 @@ class UserFilters extends QueryFilters
*/ */
public function status(string $filter = '') : Builder public function status(string $filter = '') : Builder
{ {
if(strlen($filter) == 0) if (strlen($filter) == 0) {
return $this->builder; return $this->builder;
}
$table = 'users'; $table = 'users';
$filters = explode(',', $filter); $filters = explode(',', $filter);
@ -101,7 +103,6 @@ class UserFilters extends QueryFilters
*/ */
public function baseQuery(int $company_id, User $user) : Builder public function baseQuery(int $company_id, User $user) : Builder
{ {
} }
/** /**
@ -110,15 +111,12 @@ class UserFilters extends QueryFilters
* @param $company_id The company Id * @param $company_id The company Id
* @return Illuminate\Database\Query\Builder * @return Illuminate\Database\Query\Builder
*/ */
public function entityFilter() public function entityFilter()
{ {
//return $this->builder->user_companies()->whereCompanyId(auth()->user()->company()->id); //return $this->builder->user_companies()->whereCompanyId(auth()->user()->company()->id);
//return $this->builder->whereCompanyId(auth()->user()->company()->id); //return $this->builder->whereCompanyId(auth()->user()->company()->id);
return $this->builder->whereHas('company_users', function($q) return $this->builder->whereHas('company_users', function ($q) {
{
$q->where('company_id', '=', auth()->user()->company()->id); $q->where('company_id', '=', auth()->user()->company()->id);
}); });
} }
} }

View File

@ -16,17 +16,12 @@ namespace App\Helpers\Invoice;
*/ */
trait Balancer trait Balancer
{ {
public function balance($total, $invoice)
public function balance($total, $invoice) {
{ if (isset($this->invoice->id) && $this->invoice->id >= 1) {
if(isset($this->invoice->id) && $this->invoice->id >= 1)
{
return round($total - ($this->invoice->amount - $this->invoice->balance), 2); return round($total - ($this->invoice->amount - $this->invoice->balance), 2);
} }
return $total; return $total;
}
}
} }

View File

@ -16,23 +16,21 @@ namespace App\Helpers\Invoice;
*/ */
trait CustomValuer trait CustomValuer
{ {
public function valuer($custom_value)
public function valuer($custom_value) {
{ if (isset($custom_value) && is_numeric($custom_value)) {
return $custom_value;
if(isset($custom_value) && is_numeric($custom_value)) }
return $custom_value;
return 0; return 0;
} }
public function valuerTax($custom_value, $has_custom_invoice_taxes) public function valuerTax($custom_value, $has_custom_invoice_taxes)
{ {
if(isset($custom_value) && is_numeric($custom_value) && $has_custom_invoice_taxes === true) if (isset($custom_value) && is_numeric($custom_value) && $has_custom_invoice_taxes === true) {
return round($custom_value * ($this->invoice->tax_rate1/100) ,2) + round($custom_value * ($this->invoice->tax_rate2/100) ,2) + round($custom_value * ($this->invoice->tax_rate3/100) ,2); return round($custom_value * ($this->invoice->tax_rate1/100), 2) + round($custom_value * ($this->invoice->tax_rate2/100), 2) + round($custom_value * ($this->invoice->tax_rate3/100), 2);
}
return 0;
}
return 0;
}
} }

View File

@ -16,18 +16,13 @@ namespace App\Helpers\Invoice;
*/ */
trait Discounter trait Discounter
{ {
public function discount($amount)
public function discount($amount) {
{ if ($this->invoice->is_amount_discount == true) {
return $this->invoice->discount;
if($this->invoice->is_amount_discount == true){ }
return $this->invoice->discount;
}
return round($amount * ($this->invoice->discount / 100), 2);
}
return round($amount * ($this->invoice->discount / 100), 2);
}
} }

View File

@ -21,275 +21,261 @@ use Illuminate\Support\Collection;
class InvoiceItemSum class InvoiceItemSum
{ {
use NumberFormatter;
use Discounter;
use Taxer;
use NumberFormatter; protected $invoice;
use Discounter;
use Taxer;
protected $invoice; private $items;
private $items; private $line_total;
private $line_total; private $currency;
private $currency; private $total_taxes;
private $total_taxes; private $item;
private $item; private $line_items;
private $line_items; private $sub_total;
private $sub_total; private $total_discount;
private $total_discount; private $tax_collection;
private $tax_collection; public function __construct($invoice)
{
$this->tax_collection = collect([]);
public function __construct($invoice) $this->invoice = $invoice;
{
$this->tax_collection = collect([]); $this->currency = $this->invoice->client->currency();
$this->invoice = $invoice; $this->line_items = [];
}
$this->currency = $this->invoice->client->currency(); public function process()
{
if (!$this->invoice->line_items || !isset($this->invoice->line_items) || count($this->invoice->line_items) == 0) {
$this->items = [];
return $this;
}
$this->line_items = []; $this->calcLineItems();
}
public function process() return $this;
{ }
if(!$this->invoice->line_items || !isset($this->invoice->line_items) || count($this->invoice->line_items) == 0){ private function calcLineItems()
$this->items = []; {
return $this; foreach ($this->invoice->line_items as $this->item) {
} $this->cleanLineItem()
->sumLineItem()
->setDiscount()
->calcTaxes()
->push();
}
$this->calcLineItems(); return $this;
}
return $this; private function push()
} {
$this->sub_total += $this->getLineTotal();
private function calcLineItems() $this->line_items[] = $this->item;
{
foreach($this->invoice->line_items as $this->item)
{
$this->cleanLineItem()
->sumLineItem()
->setDiscount()
->calcTaxes()
->push();
}
return $this; return $this;
} }
private function push() private function sumLineItem()
{ {
$this->setLineTotal($this->formatValue($this->item->cost, $this->currency->precision) * $this->formatValue($this->item->quantity, $this->currency->precision));
return $this;
}
$this->sub_total += $this->getLineTotal(); private function setDiscount()
{
if ($this->invoice->is_amount_discount) {
$this->setLineTotal($this->getLineTotal() - $this->formatValue($this->item->discount, $this->currency->precision));
} else {
$this->setLineTotal($this->getLineTotal() - $this->formatValue(round($this->item->line_total * ($this->item->discount / 100), 2), $this->currency->precision));
}
$this->line_items[] = $this->item; $this->item->is_amount_discount = $this->invoice->is_amount_discount;
return $this; return $this;
} }
private function sumLineItem() private function calcTaxes()
{ {
$this->setLineTotal($this->formatValue($this->item->cost, $this->currency->precision) * $this->formatValue($this->item->quantity, $this->currency->precision)); $item_tax = 0;
return $this;
}
private function setDiscount() $amount = $this->item->line_total - ($this->item->line_total * ($this->invoice->discount/100));
{ $item_tax_rate1_total = $this->calcAmountLineTax($this->item->tax_rate1, $amount);
if($this->invoice->is_amount_discount) $item_tax += $item_tax_rate1_total;
{
$this->setLineTotal($this->getLineTotal() - $this->formatValue($this->item->discount, $this->currency->precision));
}
else
{
$this->setLineTotal($this->getLineTotal() - $this->formatValue(round($this->item->line_total * ($this->item->discount / 100),2), $this->currency->precision));
}
$this->item->is_amount_discount = $this->invoice->is_amount_discount; if ($item_tax_rate1_total > 0) {
$this->groupTax($this->item->tax_name1, $this->item->tax_rate1, $item_tax_rate1_total);
}
return $this; $item_tax_rate2_total = $this->calcAmountLineTax($this->item->tax_rate2, $amount);
} $item_tax += $item_tax_rate2_total;
private function calcTaxes() if ($item_tax_rate2_total > 0) {
{ $this->groupTax($this->item->tax_name2, $this->item->tax_rate2, $item_tax_rate2_total);
}
$item_tax = 0; $item_tax_rate3_total = $this->calcAmountLineTax($this->item->tax_rate3, $amount);
$amount = $this->item->line_total - ($this->item->line_total * ($this->invoice->discount/100)); $item_tax += $item_tax_rate3_total;
$item_tax_rate1_total = $this->calcAmountLineTax($this->item->tax_rate1, $amount);
$item_tax += $item_tax_rate1_total; if ($item_tax_rate3_total > 0) {
$this->groupTax($this->item->tax_name3, $this->item->tax_rate3, $item_tax_rate3_total);
}
if($item_tax_rate1_total > 0)
$this->groupTax($this->item->tax_name1, $this->item->tax_rate1, $item_tax_rate1_total);
$item_tax_rate2_total = $this->calcAmountLineTax($this->item->tax_rate2, $amount); $this->setTotalTaxes($this->formatValue($item_tax, $this->currency->precision));
$item_tax += $item_tax_rate2_total; return $this;
}
if($item_tax_rate2_total > 0) private function groupTax($tax_name, $tax_rate, $tax_total)
$this->groupTax($this->item->tax_name2, $this->item->tax_rate2, $item_tax_rate2_total); {
$group_tax = [];
$item_tax_rate3_total = $this->calcAmountLineTax($this->item->tax_rate3, $amount); $key = str_replace(" ", "", $tax_name.$tax_rate);
$item_tax += $item_tax_rate3_total; $group_tax = ['key' => $key, 'total' => $tax_total, 'tax_name' => $tax_name . ' ' . $tax_rate.'%'];
if($item_tax_rate3_total > 0) $this->tax_collection->push(collect($group_tax));
$this->groupTax($this->item->tax_name3, $this->item->tax_rate3, $item_tax_rate3_total); }
public function getTotalTaxes()
{
return $this->total_taxes;
}
$this->setTotalTaxes($this->formatValue($item_tax, $this->currency->precision)); public function setTotalTaxes($total)
{
$this->total_taxes = $total;
return $this; return $this;
} }
private function groupTax($tax_name, $tax_rate, $tax_total) public function setLineTotal($total)
{ {
$group_tax = []; $this->item->line_total = $total;
$key = str_replace(" ", "", $tax_name.$tax_rate); return $this;
}
$group_tax = ['key' => $key, 'total' => $tax_total, 'tax_name' => $tax_name . ' ' . $tax_rate.'%']; public function getLineTotal()
{
return $this->item->line_total;
}
$this->tax_collection->push(collect($group_tax)); public function getLineItems()
{
return $this->line_items;
}
} public function getGroupedTaxes()
{
return $this->tax_collection;
}
public function getTotalTaxes() public function setGroupedTaxes($group_taxes)
{ {
return $this->total_taxes; $this->tax_collection = $group_taxes;
}
public function setTotalTaxes($total) return $this;
{ }
$this->total_taxes = $total;
return $this; public function getSubTotal()
} {
return $this->sub_total;
}
public function setLineTotal($total) public function setSubTotal($value)
{ {
$this->item->line_total = $total; $this->sub_total = $value;
return $this;
}
return $this;
}
public function getLineTotal() /**
{ * Invoice Amount Discount
return $this->item->line_total; *
} * The problem, when calculating invoice level discounts,
* the tax collected changes.
*
* We need to synthetically reduce the line_total amounts
* and recalculate the taxes and then pass back
* the updated map
*/
public function getLineItems() public function calcTaxesWithAmountDiscount()
{ {
return $this->line_items; $this->setGroupedTaxes(collect([]));
}
public function getGroupedTaxes() $item_tax = 0;
{
return $this->tax_collection;
}
public function setGroupedTaxes($group_taxes) foreach ($this->line_items as $this->item) {
{ if ($this->item->line_total == 0) {
$this->tax_collection = $group_taxes; continue;
}
return $this; $amount = $this->item->line_total - ($this->item->line_total * ($this->invoice->discount/$this->sub_total));
} $item_tax_rate1_total = $this->calcAmountLineTax($this->item->tax_rate1, $amount);
public function getSubTotal() $item_tax += $item_tax_rate1_total;
{
return $this->sub_total;
}
public function setSubTotal($value) if ($item_tax_rate1_total > 0) {
{ $this->groupTax($this->item->tax_name1, $this->item->tax_rate1, $item_tax_rate1_total);
$this->sub_total = $value; }
return $this;
}
$item_tax_rate2_total = $this->calcAmountLineTax($this->item->tax_rate2, $amount);
/** $item_tax += $item_tax_rate2_total;
* Invoice Amount Discount
*
* The problem, when calculating invoice level discounts,
* the tax collected changes.
*
* We need to synthetically reduce the line_total amounts
* and recalculate the taxes and then pass back
* the updated map
*/
public function calcTaxesWithAmountDiscount() if ($item_tax_rate2_total > 0) {
{ $this->groupTax($this->item->tax_name2, $this->item->tax_rate2, $item_tax_rate2_total);
$this->setGroupedTaxes(collect([])); }
$item_tax = 0; $item_tax_rate3_total = $this->calcAmountLineTax($this->item->tax_rate3, $amount);
foreach($this->line_items as $this->item) $item_tax += $item_tax_rate3_total;
{
if($this->item->line_total == 0) if ($item_tax_rate3_total > 0) {
continue; $this->groupTax($this->item->tax_name3, $this->item->tax_rate3, $item_tax_rate3_total);
}
}
$amount = $this->item->line_total - ($this->item->line_total * ($this->invoice->discount/$this->sub_total)); $this->setTotalTaxes($item_tax);
$item_tax_rate1_total = $this->calcAmountLineTax($this->item->tax_rate1, $amount); }
$item_tax += $item_tax_rate1_total; /**
* Sets default values for the line_items
* @return $this
*/
private function cleanLineItem()
{
$invoice_item = (object)get_class_vars(InvoiceItem::class);
unset($invoice_item->casts);
foreach ($invoice_item as $key => $value) {
if (!property_exists($this->item, $key) || !isset($this->item->{$key})) {
$this->item->{$key} = $value;
$this->item->{$key} = BaseSettings::castAttribute(InvoiceItem::$casts[$key], $value);
}
}
if($item_tax_rate1_total > 0)
$this->groupTax($this->item->tax_name1, $this->item->tax_rate1, $item_tax_rate1_total);
$item_tax_rate2_total = $this->calcAmountLineTax($this->item->tax_rate2, $amount); return $this;
}
$item_tax += $item_tax_rate2_total;
if($item_tax_rate2_total > 0)
$this->groupTax($this->item->tax_name2, $this->item->tax_rate2, $item_tax_rate2_total);
$item_tax_rate3_total = $this->calcAmountLineTax($this->item->tax_rate3, $amount);
$item_tax += $item_tax_rate3_total;
if($item_tax_rate3_total > 0)
$this->groupTax($this->item->tax_name3, $this->item->tax_rate3, $item_tax_rate3_total);
}
$this->setTotalTaxes($item_tax);
}
/**
* Sets default values for the line_items
* @return $this
*/
private function cleanLineItem()
{
$invoice_item = (object)get_class_vars(InvoiceItem::class);
unset($invoice_item->casts);
foreach($invoice_item as $key => $value)
{
if(!property_exists($this->item, $key) || !isset($this->item->{$key})){
$this->item->{$key} = $value;
$this->item->{$key} = BaseSettings::castAttribute(InvoiceItem::$casts[$key], $value);
}
}
return $this;
}
} }

View File

@ -19,255 +19,243 @@ use Illuminate\Support\Collection;
class InvoiceItemSumInclusive class InvoiceItemSumInclusive
{ {
use NumberFormatter;
use Discounter;
use Taxer;
use NumberFormatter;
use Discounter;
use Taxer;
protected $invoice;
protected $invoice; private $items;
private $items; private $line_total;
private $line_total; private $currency;
private $currency; private $total_taxes;
private $total_taxes; private $item;
private $item; private $line_items;
private $line_items; private $sub_total;
private $sub_total; private $total_discount;
private $total_discount; private $tax_collection;
private $tax_collection; public function __construct($invoice)
{
$this->tax_collection = collect([]);
public function __construct($invoice) $this->invoice = $invoice;
{
$this->currency = $this->invoice->client->currency();
$this->tax_collection = collect([]); $this->line_items = [];
}
$this->invoice = $invoice; public function process()
{
if (!$this->invoice->line_items || count($this->invoice->line_items) == 0) {
$this->items = [];
return $this;
}
$this->currency = $this->invoice->client->currency(); $this->calcLineItems();
$this->line_items = []; return $this;
} }
public function process() private function calcLineItems()
{ {
foreach ($this->invoice->line_items as $this->item) {
$this->sumLineItem()
->setDiscount()
->calcTaxes()
->push();
}
if(!$this->invoice->line_items || count($this->invoice->line_items) == 0){ return $this;
$this->items = []; }
return $this;
}
$this->calcLineItems(); private function push()
{
$this->sub_total += $this->getLineTotal();
return $this; $this->line_items[] = $this->item;
}
private function calcLineItems() return $this;
{ }
foreach($this->invoice->line_items as $this->item)
{
$this->sumLineItem()
->setDiscount()
->calcTaxes()
->push();
}
return $this;
}
private function push() private function sumLineItem()
{ {
$this->setLineTotal($this->formatValue($this->item->cost, $this->currency->precision) * $this->formatValue($this->item->quantity, $this->currency->precision));
$this->sub_total += $this->getLineTotal(); return $this;
}
$this->line_items[] = $this->item; private function setDiscount()
{
if ($this->invoice->is_amount_discount) {
$this->setLineTotal($this->getLineTotal() - $this->formatValue($this->item->discount, $this->currency->precision));
} else {
$this->setLineTotal($this->getLineTotal() - $this->formatValue(($this->item->line_total * ($this->item->discount / 100)), $this->currency->precision));
}
return $this; $this->item->is_amount_discount = $this->invoice->is_amount_discount;
}
return $this;
}
private function sumLineItem() /**
{ * Taxes effect the line totals and item costs. we decrement both on
$this->setLineTotal($this->formatValue($this->item->cost, $this->currency->precision) * $this->formatValue($this->item->quantity, $this->currency->precision)); * application of inclusive tax rates.
*
*/
private function calcTaxes()
{
$item_tax = 0;
return $this; $amount = $this->item->line_total - ($this->item->line_total * ($this->invoice->discount/100));
}
private function setDiscount() $item_tax_rate1_total = $this->calcInclusiveLineTax($this->item->tax_rate1, $amount);
{
if($this->invoice->is_amount_discount) $item_tax += $this->formatValue($item_tax_rate1_total, $this->currency->precision);
{
$this->setLineTotal($this->getLineTotal() - $this->formatValue($this->item->discount, $this->currency->precision));
}
else
{
$this->setLineTotal($this->getLineTotal() - $this->formatValue(($this->item->line_total * ($this->item->discount / 100)), $this->currency->precision));
}
$this->item->is_amount_discount = $this->invoice->is_amount_discount; if ($item_tax_rate1_total > 0) {
$this->groupTax($this->item->tax_name1, $this->item->tax_rate1, $item_tax_rate1_total);
}
return $this; $item_tax_rate2_total = $this->calcInclusiveLineTax($this->item->tax_rate2, $amount);
} $item_tax += $this->formatValue($item_tax_rate2_total, $this->currency->precision);
/** if ($item_tax_rate2_total > 0) {
* Taxes effect the line totals and item costs. we decrement both on $this->groupTax($this->item->tax_name2, $this->item->tax_rate2, $item_tax_rate2_total);
* application of inclusive tax rates. }
*
*/
private function calcTaxes()
{
$item_tax = 0; $item_tax_rate3_total = $this->calcInclusiveLineTax($this->item->tax_rate3, $amount);
$amount = $this->item->line_total - ($this->item->line_total * ($this->invoice->discount/100)); $item_tax += $this->formatValue($item_tax_rate3_total, $this->currency->precision);
$item_tax_rate1_total = $this->calcInclusiveLineTax($this->item->tax_rate1, $amount); if ($item_tax_rate3_total > 0) {
$this->groupTax($this->item->tax_name3, $this->item->tax_rate3, $item_tax_rate3_total);
}
$item_tax += $this->formatValue($item_tax_rate1_total, $this->currency->precision); $this->setTotalTaxes($this->formatValue($item_tax, $this->currency->precision));
if($item_tax_rate1_total > 0) return $this;
$this->groupTax($this->item->tax_name1, $this->item->tax_rate1, $item_tax_rate1_total); }
$item_tax_rate2_total = $this->calcInclusiveLineTax($this->item->tax_rate2, $amount); private function groupTax($tax_name, $tax_rate, $tax_total)
{
$group_tax = [];
$item_tax += $this->formatValue($item_tax_rate2_total, $this->currency->precision); $key = str_replace(" ", "", $tax_name.$tax_rate);
if($item_tax_rate2_total > 0) $group_tax = ['key' => $key, 'total' => $tax_total, 'tax_name' => $tax_name . ' ' . $tax_rate.'%'];
$this->groupTax($this->item->tax_name2, $this->item->tax_rate2, $item_tax_rate2_total);
$item_tax_rate3_total = $this->calcInclusiveLineTax($this->item->tax_rate3, $amount); $this->tax_collection->push(collect($group_tax));
}
$item_tax += $this->formatValue($item_tax_rate3_total, $this->currency->precision); public function getTotalTaxes()
{
return $this->total_taxes;
}
if($item_tax_rate3_total > 0) public function setTotalTaxes($total)
$this->groupTax($this->item->tax_name3, $this->item->tax_rate3, $item_tax_rate3_total); {
$this->total_taxes = $total;
$this->setTotalTaxes($this->formatValue($item_tax, $this->currency->precision)); return $this;
}
return $this; public function setLineTotal($total)
} {
$this->item->line_total = $total;
private function groupTax($tax_name, $tax_rate, $tax_total) return $this;
{ }
$group_tax = [];
$key = str_replace(" ", "", $tax_name.$tax_rate); public function getLineTotal()
{
return $this->item->line_total;
}
$group_tax = ['key' => $key, 'total' => $tax_total, 'tax_name' => $tax_name . ' ' . $tax_rate.'%']; public function getLineItems()
{
return $this->line_items;
}
$this->tax_collection->push(collect($group_tax)); public function getGroupedTaxes()
{
return $this->tax_collection;
}
} public function setGroupedTaxes($group_taxes)
{
$this->tax_collection = $group_taxes;
public function getTotalTaxes() return $this;
{ }
return $this->total_taxes;
}
public function setTotalTaxes($total) public function getSubTotal()
{ {
$this->total_taxes = $total; return $this->sub_total;
}
return $this; public function setSubTotal($value)
} {
$this->sub_total = $value;
return $this;
}
public function setLineTotal($total) /**
{ * Invoice Amount Discount
$this->item->line_total = $total; *
* The problem, when calculating invoice level discounts,
* the tax collected changes.
*
* We need to synthetically reduce the line_total amounts
* and recalculate the taxes and then pass back
* the updated map
*/
return $this; public function calcTaxesWithAmountDiscount()
} {
$this->setGroupedTaxes(collect([]));
public function getLineTotal() $item_tax = 0;
{
return $this->item->line_total;
}
public function getLineItems() foreach ($this->line_items as $this->item) {
{ $amount = $this->item->line_total - ($this->item->line_total * ($this->invoice->discount/$this->sub_total));
return $this->line_items; $item_tax_rate1_total = $this->calcInclusiveLineTax($this->item->tax_rate1, $amount);
}
public function getGroupedTaxes() $item_tax += $item_tax_rate1_total;
{
return $this->tax_collection;
}
public function setGroupedTaxes($group_taxes) if ($item_tax_rate1_total > 0) {
{ $this->groupTax($this->item->tax_name1, $this->item->tax_rate1, $item_tax_rate1_total);
$this->tax_collection = $group_taxes; }
return $this; $item_tax_rate2_total = $this->calcInclusiveLineTax($this->item->tax_rate2, $amount);
}
public function getSubTotal() $item_tax += $item_tax_rate2_total;
{
return $this->sub_total;
}
public function setSubTotal($value) if ($item_tax_rate2_total > 0) {
{ $this->groupTax($this->item->tax_name2, $this->item->tax_rate2, $item_tax_rate2_total);
$this->sub_total = $value; }
return $this;
}
/** $item_tax_rate3_total = $this->calcInclusiveLineTax($this->item->tax_rate3, $amount);
* Invoice Amount Discount
*
* The problem, when calculating invoice level discounts,
* the tax collected changes.
*
* We need to synthetically reduce the line_total amounts
* and recalculate the taxes and then pass back
* the updated map
*/
public function calcTaxesWithAmountDiscount() $item_tax += $item_tax_rate3_total;
{
$this->setGroupedTaxes(collect([]));
$item_tax = 0; if ($item_tax_rate3_total > 0) {
$this->groupTax($this->item->tax_name3, $this->item->tax_rate3, $item_tax_rate3_total);
}
}
foreach($this->line_items as $this->item) $this->setTotalTaxes($item_tax);
{ }
$amount = $this->item->line_total - ($this->item->line_total * ($this->invoice->discount/$this->sub_total));
$item_tax_rate1_total = $this->calcInclusiveLineTax($this->item->tax_rate1, $amount);
$item_tax += $item_tax_rate1_total;
if($item_tax_rate1_total > 0)
$this->groupTax($this->item->tax_name1, $this->item->tax_rate1, $item_tax_rate1_total);
$item_tax_rate2_total = $this->calcInclusiveLineTax($this->item->tax_rate2, $amount);
$item_tax += $item_tax_rate2_total;
if($item_tax_rate2_total > 0)
$this->groupTax($this->item->tax_name2, $this->item->tax_rate2, $item_tax_rate2_total);
$item_tax_rate3_total = $this->calcInclusiveLineTax($this->item->tax_rate3, $amount);
$item_tax += $item_tax_rate3_total;
if($item_tax_rate3_total > 0)
$this->groupTax($this->item->tax_name3, $this->item->tax_rate3, $item_tax_rate3_total);
}
$this->setTotalTaxes($item_tax);
}
} }

View File

@ -21,88 +21,85 @@ use Illuminate\Support\Collection;
class InvoiceSum class InvoiceSum
{ {
use Taxer; use Taxer;
use Balancer; use Balancer;
use CustomValuer; use CustomValuer;
use Discounter; use Discounter;
use NumberFormatter; use NumberFormatter;
protected $invoice; protected $invoice;
public $tax_map; public $tax_map;
public $invoice_item; public $invoice_item;
public $total_taxes; public $total_taxes;
private $total; private $total;
private $total_discount; private $total_discount;
private $total_custom_values; private $total_custom_values;
private $total_tax_map; private $total_tax_map;
private $sub_total; private $sub_total;
/** /**
* Constructs the object with Invoice and Settings object * Constructs the object with Invoice and Settings object
* *
* @param \App\Models\Invoice $invoice The invoice * @param \App\Models\Invoice $invoice The invoice
*/ */
public function __construct($invoice) public function __construct($invoice)
{ {
$this->invoice = $invoice;
$this->invoice = $invoice; $this->tax_map = new Collection;
}
$this->tax_map = new Collection; public function build()
{
$this->calculateLineItems()
->calculateDiscount()
->calculateCustomValues()
->calculateInvoiceTaxes()
->setTaxMap()
->calculateTotals()
->calculateBalance()
->calculatePartial();
} return $this;
}
public function build() private function calculateLineItems()
{ {
$this->invoice_items = new InvoiceItemSum($this->invoice);
$this->invoice_items->process();
$this->invoice->line_items = $this->invoice_items->getLineItems();
$this->total = $this->invoice_items->getSubTotal();
$this->setSubTotal($this->invoice_items->getSubTotal());
$this->calculateLineItems() return $this;
->calculateDiscount() }
->calculateCustomValues()
->calculateInvoiceTaxes()
->setTaxMap()
->calculateTotals()
->calculateBalance()
->calculatePartial();
return $this; private function calculateDiscount()
} {
$this->total_discount = $this->discount($this->invoice_items->getSubTotal());
private function calculateLineItems() $this->total -= $this->total_discount;
{
$this->invoice_items = new InvoiceItemSum($this->invoice);
$this->invoice_items->process();
$this->invoice->line_items = $this->invoice_items->getLineItems();
$this->total = $this->invoice_items->getSubTotal();
$this->setSubTotal($this->invoice_items->getSubTotal());
return $this; return $this;
} }
private function calculateDiscount() private function calculateCustomValues()
{ {
$this->total_discount = $this->discount($this->invoice_items->getSubTotal()); $this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge1, $this->invoice->custom_surcharge_taxes1);
$this->total -= $this->total_discount;
return $this;
}
private function calculateCustomValues()
{
$this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge1, $this->invoice->custom_surcharge_taxes1);
$this->total_custom_values += $this->valuer($this->invoice->custom_surcharge1); $this->total_custom_values += $this->valuer($this->invoice->custom_surcharge1);
$this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge2, $this->invoice->custom_surcharge_taxes2); $this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge2, $this->invoice->custom_surcharge_taxes2);
$this->total_custom_values += $this->valuer($this->invoice->custom_surcharge2); $this->total_custom_values += $this->valuer($this->invoice->custom_surcharge2);
$this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge3, $this->invoice->custom_surcharge_taxes3); $this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge3, $this->invoice->custom_surcharge_taxes3);
$this->total_custom_values += $this->valuer($this->invoice->custom_surcharge3); $this->total_custom_values += $this->valuer($this->invoice->custom_surcharge3);
$this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge4, $this->invoice->custom_surcharge_taxes4); $this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge4, $this->invoice->custom_surcharge_taxes4);
@ -111,145 +108,142 @@ class InvoiceSum
$this->total += $this->total_custom_values; $this->total += $this->total_custom_values;
return $this; return $this;
} }
private function calculateInvoiceTaxes() private function calculateInvoiceTaxes()
{ {
if ($this->invoice->tax_rate1 > 0) {
if($this->invoice->tax_rate1 > 0){ $tax = $this->taxer($this->total, $this->invoice->tax_rate1);
$tax = $this->taxer($this->total, $this->invoice->tax_rate1); $this->total_taxes += $tax;
$this->total_taxes += $tax; $this->total_tax_map[] = ['name' => $this->invoice->tax_name1 . ' ' . $this->invoice->tax_rate1.'%', 'total' => $tax];
$this->total_tax_map[] = ['name' => $this->invoice->tax_name1 . ' ' . $this->invoice->tax_rate1.'%', 'total' => $tax];
} }
if($this->invoice->tax_rate2 > 0){ if ($this->invoice->tax_rate2 > 0) {
$tax = $this->taxer($this->total, $this->invoice->tax_rate2); $tax = $this->taxer($this->total, $this->invoice->tax_rate2);
$this->total_taxes += $tax; $this->total_taxes += $tax;
$this->total_tax_map[] = ['name' => $this->invoice->tax_name2. ' ' . $this->invoice->tax_rate2.'%', 'total' => $tax]; $this->total_tax_map[] = ['name' => $this->invoice->tax_name2. ' ' . $this->invoice->tax_rate2.'%', 'total' => $tax];
} }
if($this->invoice->tax_rate3 > 0){ if ($this->invoice->tax_rate3 > 0) {
$tax = $this->taxer($this->total, $this->invoice->tax_rate3); $tax = $this->taxer($this->total, $this->invoice->tax_rate3);
$this->total_taxes += $tax; $this->total_taxes += $tax;
$this->total_tax_map[] = ['name' => $this->invoice->tax_name3 . ' ' . $this->invoice->tax_rate3.'%', 'total' => $tax]; $this->total_tax_map[] = ['name' => $this->invoice->tax_name3 . ' ' . $this->invoice->tax_rate3.'%', 'total' => $tax];
} }
return $this; return $this;
} }
/** /**
* Calculates the balance. * Calculates the balance.
* *
* @return self The balance. * @return self The balance.
*/ */
private function calculateBalance() private function calculateBalance()
{ {
//$this->invoice->balance = $this->balance($this->getTotal(), $this->invoice); //$this->invoice->balance = $this->balance($this->getTotal(), $this->invoice);
$this->setCalculatedAttributes(); $this->setCalculatedAttributes();
return $this; return $this;
} }
private function calculatePartial() private function calculatePartial()
{ {
if ( !isset($this->invoice->id) && isset($this->invoice->partial) ) { if (!isset($this->invoice->id) && isset($this->invoice->partial)) {
$this->invoice->partial = max(0, min($this->formatValue($this->invoice->partial, 2), $this->invoice->balance)); $this->invoice->partial = max(0, min($this->formatValue($this->invoice->partial, 2), $this->invoice->balance));
} }
return $this; return $this;
} }
private function calculateTotals() private function calculateTotals()
{ {
$this->total += $this->total_taxes; $this->total += $this->total_taxes;
return $this; return $this;
} }
public function getInvoice() public function getInvoice()
{ {
//Build invoice values here and return Invoice //Build invoice values here and return Invoice
$this->setCalculatedAttributes(); $this->setCalculatedAttributes();
$this->invoice->save(); $this->invoice->save();
return $this->invoice; return $this->invoice;
} }
/** /**
* Build $this->invoice variables after * Build $this->invoice variables after
* calculations have been performed. * calculations have been performed.
*/ */
private function setCalculatedAttributes() private function setCalculatedAttributes()
{ {
/* If amount != balance then some money has been paid on the invoice, need to subtract this difference from the total to set the new balance */ /* If amount != balance then some money has been paid on the invoice, need to subtract this difference from the total to set the new balance */
if($this->invoice->amount != $this->invoice->balance) if ($this->invoice->amount != $this->invoice->balance) {
{ $paid_to_date = $this->invoice->amount - $this->invoice->balance;
$paid_to_date = $this->invoice->amount - $this->invoice->balance;
$this->invoice->balance = $this->formatValue($this->getTotal(), $this->invoice->client->currency()->precision) - $paid_to_date; $this->invoice->balance = $this->formatValue($this->getTotal(), $this->invoice->client->currency()->precision) - $paid_to_date;
} } else {
else $this->invoice->balance = $this->formatValue($this->getTotal(), $this->invoice->client->currency()->precision);
$this->invoice->balance = $this->formatValue($this->getTotal(), $this->invoice->client->currency()->precision); }
/* Set new calculated total */ /* Set new calculated total */
$this->invoice->amount = $this->formatValue($this->getTotal(), $this->invoice->client->currency()->precision); $this->invoice->amount = $this->formatValue($this->getTotal(), $this->invoice->client->currency()->precision);
$this->invoice->total_taxes = $this->getTotalTaxes(); $this->invoice->total_taxes = $this->getTotalTaxes();
return $this; return $this;
} }
public function getSubTotal() public function getSubTotal()
{ {
return $this->sub_total; return $this->sub_total;
} }
public function setSubTotal($value) public function setSubTotal($value)
{ {
$this->sub_total = $value; $this->sub_total = $value;
return $this; return $this;
} }
public function getTotalDiscount() public function getTotalDiscount()
{ {
return $this->total_discount; return $this->total_discount;
} }
public function getTotalTaxes() public function getTotalTaxes()
{ {
return $this->total_taxes; return $this->total_taxes;
} }
public function getTotalTaxMap() public function getTotalTaxMap()
{ {
return $this->total_tax_map; return $this->total_tax_map;
} }
public function getTotal() public function getTotal()
{ {
return $this->total; return $this->total;
} }
public function setTaxMap() public function setTaxMap()
{ {
if($this->invoice->is_amount_discount == true) if ($this->invoice->is_amount_discount == true) {
$this->invoice_items->calcTaxesWithAmountDiscount(); $this->invoice_items->calcTaxesWithAmountDiscount();
}
$this->tax_map = collect(); $this->tax_map = collect();
$keys = $this->invoice_items->getGroupedTaxes()->pluck('key')->unique(); $keys = $this->invoice_items->getGroupedTaxes()->pluck('key')->unique();
$values = $this->invoice_items->getGroupedTaxes(); $values = $this->invoice_items->getGroupedTaxes();
foreach($keys as $key) foreach ($keys as $key) {
{ $tax_name = $values->filter(function ($value, $k) use ($key) {
$tax_name = $values->filter(function ($value, $k) use($key){
return $value['key'] == $key; return $value['key'] == $key;
})->pluck('tax_name')->first(); })->pluck('tax_name')->first();
$total_line_tax = $values->filter(function ($value, $k) use($key){ $total_line_tax = $values->filter(function ($value, $k) use ($key) {
return $value['key'] == $key; return $value['key'] == $key;
})->sum('total'); })->sum('total');
@ -261,21 +255,20 @@ class InvoiceSum
} }
return $this; return $this;
}
} public function getTaxMap()
{
return $this->tax_map;
}
public function getTaxMap() public function getBalance()
{ {
return $this->tax_map; return $this->invoice->balance;
} }
public function getBalance() public function getItemTotalTaxes()
{ {
return $this->invoice->balance; return $this->getTotalTaxes();
} }
public function getItemTotalTaxes()
{
return $this->getTotalTaxes();
}
} }

View File

@ -22,88 +22,86 @@ use Illuminate\Support\Collection;
class InvoiceSumInclusive class InvoiceSumInclusive
{ {
use Taxer; use Taxer;
use Balancer; use Balancer;
use CustomValuer; use CustomValuer;
use Discounter; use Discounter;
use NumberFormatter; use NumberFormatter;
protected $invoice; protected $invoice;
public $tax_map; public $tax_map;
public $invoice_item; public $invoice_item;
public $total_taxes; public $total_taxes;
private $total; private $total;
private $total_discount; private $total_discount;
private $total_custom_values; private $total_custom_values;
private $total_tax_map; private $total_tax_map;
private $sub_total; private $sub_total;
/** /**
* Constructs the object with Invoice and Settings object * Constructs the object with Invoice and Settings object
* *
* @param \App\Models\Invoice $invoice The invoice * @param \App\Models\Invoice $invoice The invoice
*/ */
public function __construct($invoice) public function __construct($invoice)
{ {
$this->invoice = $invoice;
$this->invoice = $invoice;
$this->tax_map = new Collection; $this->tax_map = new Collection;
}
} public function build()
{
public function build() $this->calculateLineItems()
{ ->calculateDiscount()
$this->calculateLineItems() ->calculateCustomValues()
->calculateDiscount() ->calculateInvoiceTaxes()
->calculateCustomValues() ->setTaxMap()
->calculateInvoiceTaxes()
->setTaxMap()
// ->calculateTotals() // ->calculateTotals()
->calculateBalance() ->calculateBalance()
->calculatePartial(); ->calculatePartial();
return $this; return $this;
} }
private function calculateLineItems() private function calculateLineItems()
{ {
$this->invoice_items = new InvoiceItemSumInclusive($this->invoice); $this->invoice_items = new InvoiceItemSumInclusive($this->invoice);
$this->invoice_items->process(); $this->invoice_items->process();
$this->invoice->line_items = $this->invoice_items->getLineItems(); $this->invoice->line_items = $this->invoice_items->getLineItems();
$this->total = $this->invoice_items->getSubTotal(); $this->total = $this->invoice_items->getSubTotal();
$this->setSubTotal($this->invoice_items->getSubTotal()); $this->setSubTotal($this->invoice_items->getSubTotal());
return $this; return $this;
} }
private function calculateDiscount() private function calculateDiscount()
{ {
$this->total_discount = $this->discount($this->invoice_items->getSubTotal()); $this->total_discount = $this->discount($this->invoice_items->getSubTotal());
$this->total -= $this->total_discount; $this->total -= $this->total_discount;
return $this; return $this;
} }
private function calculateCustomValues() private function calculateCustomValues()
{ {
$this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge1, $this->invoice->custom_surcharge_taxes1); $this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge1, $this->invoice->custom_surcharge_taxes1);
$this->total_custom_values += $this->valuer($this->invoice->custom_surcharge1); $this->total_custom_values += $this->valuer($this->invoice->custom_surcharge1);
$this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge2, $this->invoice->custom_surcharge_taxes2); $this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge2, $this->invoice->custom_surcharge_taxes2);
$this->total_custom_values += $this->valuer($this->invoice->custom_surcharge2); $this->total_custom_values += $this->valuer($this->invoice->custom_surcharge2);
$this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge3, $this->invoice->custom_surcharge_taxes3); $this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge3, $this->invoice->custom_surcharge_taxes3);
$this->total_custom_values += $this->valuer($this->invoice->custom_surcharge3); $this->total_custom_values += $this->valuer($this->invoice->custom_surcharge3);
$this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge4, $this->invoice->custom_surcharge_taxes4); $this->total_taxes += $this->valuerTax($this->invoice->custom_surcharge4, $this->invoice->custom_surcharge_taxes4);
@ -112,156 +110,154 @@ class InvoiceSumInclusive
$this->total += $this->total_custom_values; $this->total += $this->total_custom_values;
return $this; return $this;
} }
private function calculateInvoiceTaxes() private function calculateInvoiceTaxes()
{ {
$amount = $this->total; $amount = $this->total;
if($this->invoice->discount > 0 && $this->invoice->is_amount_discount) if ($this->invoice->discount > 0 && $this->invoice->is_amount_discount) {
$amount = $this->formatValue(($this->sub_total - $this->invoice->discount),2); $amount = $this->formatValue(($this->sub_total - $this->invoice->discount), 2);
}
if($this->invoice->discount > 0 && !$this->invoice->is_amount_discount) if ($this->invoice->discount > 0 && !$this->invoice->is_amount_discount) {
$amount = $this->formatValue(($this->sub_total - ($this->sub_total * ($this->invoice->discount/100))),2); $amount = $this->formatValue(($this->sub_total - ($this->sub_total * ($this->invoice->discount/100))), 2);
}
if($this->invoice->tax_rate1 > 0){ if ($this->invoice->tax_rate1 > 0) {
$tax = $this->calcInclusiveLineTax($this->invoice->tax_rate1, $amount); $tax = $this->calcInclusiveLineTax($this->invoice->tax_rate1, $amount);
$this->total_taxes += $tax; $this->total_taxes += $tax;
$this->total_tax_map[] = ['name' => $this->invoice->tax_name1 . ' ' . $this->invoice->tax_rate1.'%', 'total' => $tax];
$this->total_tax_map[] = ['name' => $this->invoice->tax_name1 . ' ' . $this->invoice->tax_rate1.'%', 'total' => $tax];
} }
if($this->invoice->tax_rate2 > 0){ if ($this->invoice->tax_rate2 > 0) {
$tax = $this->calcInclusiveLineTax($this->invoice->tax_rate2, $amount); $tax = $this->calcInclusiveLineTax($this->invoice->tax_rate2, $amount);
$this->total_taxes += $tax; $this->total_taxes += $tax;
$this->total_tax_map[] = ['name' => $this->invoice->tax_name2. ' ' . $this->invoice->tax_rate2.'%', 'total' => $tax]; $this->total_tax_map[] = ['name' => $this->invoice->tax_name2. ' ' . $this->invoice->tax_rate2.'%', 'total' => $tax];
} }
if($this->invoice->tax_rate3 > 0){ if ($this->invoice->tax_rate3 > 0) {
$tax = $this->calcInclusiveLineTax($this->invoice->tax_rate3, $amount); $tax = $this->calcInclusiveLineTax($this->invoice->tax_rate3, $amount);
$this->total_taxes += $tax; $this->total_taxes += $tax;
$this->total_tax_map[] = ['name' => $this->invoice->tax_name3 . ' ' . $this->invoice->tax_rate3.'%', 'total' => $tax]; $this->total_tax_map[] = ['name' => $this->invoice->tax_name3 . ' ' . $this->invoice->tax_rate3.'%', 'total' => $tax];
} }
return $this; return $this;
} }
/** /**
* Calculates the balance. * Calculates the balance.
* *
* @return self The balance. * @return self The balance.
*/ */
private function calculateBalance() private function calculateBalance()
{ {
//$this->invoice->balance = $this->balance($this->getTotal(), $this->invoice); //$this->invoice->balance = $this->balance($this->getTotal(), $this->invoice);
$this->setCalculatedAttributes(); $this->setCalculatedAttributes();
return $this; return $this;
} }
private function calculatePartial() private function calculatePartial()
{ {
if ( !isset($this->invoice->id) && isset($this->invoice->partial) ) { if (!isset($this->invoice->id) && isset($this->invoice->partial)) {
$this->invoice->partial = max(0, min($this->formatValue($this->invoice->partial, 2), $this->invoice->balance)); $this->invoice->partial = max(0, min($this->formatValue($this->invoice->partial, 2), $this->invoice->balance));
} }
return $this; return $this;
} }
private function calculateTotals() private function calculateTotals()
{ {
$this->total += $this->total_taxes; $this->total += $this->total_taxes;
return $this; return $this;
} }
public function getInvoice() public function getInvoice()
{ {
//Build invoice values here and return Invoice //Build invoice values here and return Invoice
$this->setCalculatedAttributes(); $this->setCalculatedAttributes();
$this->invoice->save(); $this->invoice->save();
return $this->invoice; return $this->invoice;
} }
/** /**
* Build $this->invoice variables after * Build $this->invoice variables after
* calculations have been performed. * calculations have been performed.
*/ */
private function setCalculatedAttributes() private function setCalculatedAttributes()
{ {
/* If amount != balance then some money has been paid on the invoice, need to subtract this difference from the total to set the new balance */ /* If amount != balance then some money has been paid on the invoice, need to subtract this difference from the total to set the new balance */
if($this->invoice->amount != $this->invoice->balance) if ($this->invoice->amount != $this->invoice->balance) {
{ $paid_to_date = $this->invoice->amount - $this->invoice->balance;
$paid_to_date = $this->invoice->amount - $this->invoice->balance;
$this->invoice->balance = $this->formatValue($this->getTotal(), $this->invoice->client->currency()->precision) - $paid_to_date; $this->invoice->balance = $this->formatValue($this->getTotal(), $this->invoice->client->currency()->precision) - $paid_to_date;
} } else {
else $this->invoice->balance = $this->formatValue($this->getTotal(), $this->invoice->client->currency()->precision);
$this->invoice->balance = $this->formatValue($this->getTotal(), $this->invoice->client->currency()->precision); }
/* Set new calculated total */ /* Set new calculated total */
$this->invoice->amount = $this->formatValue($this->getTotal(), $this->invoice->client->currency()->precision); $this->invoice->amount = $this->formatValue($this->getTotal(), $this->invoice->client->currency()->precision);
$this->invoice->total_taxes = $this->getTotalTaxes(); $this->invoice->total_taxes = $this->getTotalTaxes();
return $this; return $this;
} }
public function getSubTotal() public function getSubTotal()
{ {
return $this->sub_total; return $this->sub_total;
} }
public function setSubTotal($value) public function setSubTotal($value)
{ {
$this->sub_total = $value; $this->sub_total = $value;
return $this; return $this;
} }
public function getTotalDiscount() public function getTotalDiscount()
{ {
return $this->total_discount; return $this->total_discount;
} }
public function getTotalTaxes() public function getTotalTaxes()
{ {
return $this->total_taxes; return $this->total_taxes;
} }
public function getTotalTaxMap() public function getTotalTaxMap()
{ {
return $this->total_tax_map; return $this->total_tax_map;
} }
public function getTotal() public function getTotal()
{ {
return $this->total; return $this->total;
} }
public function setTaxMap() public function setTaxMap()
{ {
if($this->invoice->is_amount_discount == true) if ($this->invoice->is_amount_discount == true) {
$this->invoice_items->calcTaxesWithAmountDiscount(); $this->invoice_items->calcTaxesWithAmountDiscount();
}
$this->tax_map = collect(); $this->tax_map = collect();
$keys = $this->invoice_items->getGroupedTaxes()->pluck('key')->unique(); $keys = $this->invoice_items->getGroupedTaxes()->pluck('key')->unique();
$values = $this->invoice_items->getGroupedTaxes(); $values = $this->invoice_items->getGroupedTaxes();
foreach($keys as $key) foreach ($keys as $key) {
{ $tax_name = $values->filter(function ($value, $k) use ($key) {
$tax_name = $values->filter(function ($value, $k) use($key){
return $value['key'] == $key; return $value['key'] == $key;
})->pluck('tax_name')->first(); })->pluck('tax_name')->first();
$total_line_tax = $values->filter(function ($value, $k) use($key){ $total_line_tax = $values->filter(function ($value, $k) use ($key) {
return $value['key'] == $key; return $value['key'] == $key;
})->sum('total'); })->sum('total');
@ -273,23 +269,20 @@ class InvoiceSumInclusive
} }
return $this; return $this;
}
} public function getTaxMap()
{
public function getTaxMap() return $this->tax_map;
{ }
return $this->tax_map;
}
public function getBalance()
{
return $this->invoice->balance;
}
public function getItemTotalTaxes()
{
return $this->getTotalTaxes();
}
public function getBalance()
{
return $this->invoice->balance;
}
public function getItemTotalTaxes()
{
return $this->getTotalTaxes();
}
} }

View File

@ -16,21 +16,18 @@ namespace App\Helpers\Invoice;
*/ */
trait Taxer trait Taxer
{ {
public function taxer($amount, $tax_rate)
{
return round($amount * (($tax_rate ? $tax_rate : 0) / 100), 2);
}
public function taxer($amount, $tax_rate) public function calcAmountLineTax($tax_rate, $amount)
{ {
return round($amount * (($tax_rate ? $tax_rate : 0) / 100), 2); return $this->formatValue(($amount * $tax_rate/100), 2);
} }
public function calcAmountLineTax($tax_rate, $amount)
{
return $this->formatValue(($amount * $tax_rate/100), 2);
}
public function calcInclusiveLineTax($tax_rate, $amount)
{
return $this->formatValue($amount - ($amount / (1 + ($tax_rate/100))), 2);
}
public function calcInclusiveLineTax($tax_rate, $amount)
{
return $this->formatValue($amount - ($amount / (1 + ($tax_rate/100))), 2);
}
} }

View File

@ -24,13 +24,12 @@ use Laravel\Socialite\Facades\Socialite;
*/ */
class GmailTransportConfig class GmailTransportConfig
{ {
public function test() public function test()
{ {
/********************* We may need to fetch a new token on behalf of the client ******************************/ /********************* We may need to fetch a new token on behalf of the client ******************************/
$query = [ $query = [
'email' => 'david@invoiceninja.com', 'email' => 'david@invoiceninja.com',
]; ];
$user = MultiDB::hasUser($query); $user = MultiDB::hasUser($query);
// $oauth_user = Socialite::driver('google')->stateless()->userFromToken($user->oauth_user_token); // $oauth_user = Socialite::driver('google')->stateless()->userFromToken($user->oauth_user_token);
@ -38,25 +37,12 @@ class GmailTransportConfig
// $user->oauth_user_token = $oauth_user->refreshToken; // $user->oauth_user_token = $oauth_user->refreshToken;
// $user->save(); // $user->save();
Config::set('mail.driver', 'gmail'); Config::set('mail.driver', 'gmail');
Config::set('services.gmail.token', $user->oauth_user_token); Config::set('services.gmail.token', $user->oauth_user_token);
(new MailServiceProvider(app()))->register(); (new MailServiceProvider(app()))->register();
Mail::to('david@romulus.com.au') Mail::to('david@romulus.com.au')
->send(new SupportMessageSent('a cool message')); ->send(new SupportMessageSent('a cool message'));
} }
} }

View File

@ -15,5 +15,4 @@ class GmailTransportManager extends TransportManager
return new GmailTransport($mail, $token); return new GmailTransport($mail, $token);
} }
} }

View File

@ -22,8 +22,7 @@ use Illuminate\Support\Facades\Cache;
*/ */
function ctrans(string $string, $replace = [], $locale = null) : string function ctrans(string $string, $replace = [], $locale = null) : string
{ {
//todo pass through the cached version of the custom strings here else return trans(); //todo pass through the cached version of the custom strings here else return trans();
return trans($string, $replace, $locale); return trans($string, $replace, $locale);
} }

View File

@ -43,8 +43,7 @@ class AccountController extends BaseController
*/ */
public function index() public function index()
{ {
// return view('signup.index'); // return view('signup.index');
} }
/** /**
@ -146,13 +145,11 @@ class AccountController extends BaseController
*/ */
public function store(CreateAccountRequest $request) public function store(CreateAccountRequest $request)
{ {
$account = CreateAccount::dispatchNow($request->all()); $account = CreateAccount::dispatchNow($request->all());
$ct = CompanyUser::whereUserId(auth()->user()->id); $ct = CompanyUser::whereUserId(auth()->user()->id);
return $this->listResponse($ct); return $this->listResponse($ct);
} }
/** /**

View File

@ -11,14 +11,12 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Activity; use App\Models\Activity;
use App\Transformers\ActivityTransformer; use App\Transformers\ActivityTransformer;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class ActivityController extends BaseController class ActivityController extends BaseController
{ {
protected $entity_type = Activity::class; protected $entity_type = Activity::class;
protected $entity_transformer = ActivityTransformer::class; protected $entity_transformer = ActivityTransformer::class;
@ -83,5 +81,4 @@ class ActivityController extends BaseController
return $this->listResponse($activities); return $this->listResponse($activities);
} }
} }

View File

@ -41,13 +41,14 @@ class ContactForgotPasswordController extends Controller
$this->middleware('guest:contact'); $this->middleware('guest:contact');
} }
/** /**
* Show the reset email form. * Show the reset email form.
* *
* @return \Illuminate\Http\Response * @return \Illuminate\Http\Response
*/ */
public function showLinkRequestForm(){ public function showLinkRequestForm()
return view('portal.default.auth.passwords.email',[ {
return view('portal.default.auth.passwords.email', [
'title' => 'Client Password Reset', 'title' => 'Client Password Reset',
'passwordEmailRoute' => 'client.password.email' 'passwordEmailRoute' => 'client.password.email'
]); ]);
@ -60,6 +61,6 @@ class ContactForgotPasswordController extends Controller
public function broker() public function broker()
{ {
return Password::broker('contacts'); return Password::broker('contacts');
} }
} }

View File

@ -20,7 +20,6 @@ use Route;
class ContactLoginController extends Controller class ContactLoginController extends Controller
{ {
use AuthenticatesUsers; use AuthenticatesUsers;
protected $redirectTo = '/client/dashboard'; protected $redirectTo = '/client/dashboard';
@ -32,9 +31,7 @@ class ContactLoginController extends Controller
public function showLoginForm() public function showLoginForm()
{ {
return view('portal.default.auth.login');
return view('portal.default.auth.login');
} }
@ -63,18 +60,17 @@ class ContactLoginController extends Controller
public function authenticated(Request $request, ClientContact $client) public function authenticated(Request $request, ClientContact $client)
{ {
Auth::guard('contact')->login($client, true); Auth::guard('contact')->login($client, true);
if(session()->get('url.intended')) if (session()->get('url.intended')) {
return redirect(session()->get('url.intended')); return redirect(session()->get('url.intended'));
}
return redirect(route('client.dashboard')); return redirect(route('client.dashboard'));
} }
public function logout() public function logout()
{ {
Auth::guard('contact')->logout(); Auth::guard('contact')->logout();
return redirect('/client/login'); return redirect('/client/login');

View File

@ -72,6 +72,6 @@ class ContactResetPasswordController extends Controller
public function broker() public function broker()
{ {
return Password::broker('contacts'); return Password::broker('contacts');
} }
} }

View File

@ -115,5 +115,4 @@ class ForgotPasswordController extends Controller
? response()->json(['message' => 'Reset link sent to your email.', 'status' => true], 201) ? response()->json(['message' => 'Reset link sent to your email.', 'status' => true], 201)
: response()->json(['message' => 'Email not found', 'status' => false], 401); : response()->json(['message' => 'Email not found', 'status' => false], 401);
} }
} }

View File

@ -40,16 +40,16 @@ class LoginController extends BaseController
| |
*/ */
/** /**
* @OA\Tag( * @OA\Tag(
* name="login", * name="login",
* description="Authentication", * description="Authentication",
* @OA\ExternalDocumentation( * @OA\ExternalDocumentation(
* description="Find out more", * description="Find out more",
* url="http://docs.invoiceninja.com" * url="http://docs.invoiceninja.com"
* ) * )
* ) * )
*/ */
use AuthenticatesUsers; use AuthenticatesUsers;
use UserSessionAttributes; use UserSessionAttributes;
@ -72,9 +72,7 @@ class LoginController extends BaseController
*/ */
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
} }
/** /**
@ -170,17 +168,13 @@ class LoginController extends BaseController
} }
if ($this->attemptLogin($request)) { if ($this->attemptLogin($request)) {
$user = $this->guard()->user(); $user = $this->guard()->user();
$user->setCompany($user->company_user->account->default_company); $user->setCompany($user->company_user->account->default_company);
$ct = CompanyUser::whereUserId($user->id); $ct = CompanyUser::whereUserId($user->id);
return $this->listResponse($ct); return $this->listResponse($ct);
} else {
}
else {
$this->incrementLoginAttempts($request); $this->incrementLoginAttempts($request);
return response() return response()
@ -188,7 +182,6 @@ class LoginController extends BaseController
->header('X-App-Version', config('ninja.app_version')) ->header('X-App-Version', config('ninja.app_version'))
->header('X-Api-Version', config('ninja.api_version')); ->header('X-Api-Version', config('ninja.api_version'));
} }
} }
/** /**
@ -233,8 +226,8 @@ class LoginController extends BaseController
*/ */
public function refresh(Request $request) public function refresh(Request $request)
{ {
$ct = CompanyUser::whereUserId(auth()->user()->id); $ct = CompanyUser::whereUserId(auth()->user()->id);
return $this->listResponse($ct); return $this->listResponse($ct);
} }
/** /**
@ -246,24 +239,23 @@ class LoginController extends BaseController
{ {
//'https://www.googleapis.com/auth/gmail.send','email','profile','openid' //'https://www.googleapis.com/auth/gmail.send','email','profile','openid'
// //
if(request()->has('code')) if (request()->has('code')) {
return $this->handleProviderCallback($provider); return $this->handleProviderCallback($provider);
else } else {
return Socialite::driver($provider)->scopes('https://www.googleapis.com/auth/gmail.send')->redirect(); return Socialite::driver($provider)->scopes('https://www.googleapis.com/auth/gmail.send')->redirect();
}
} }
public function redirectToProviderAndCreate(string $provider) public function redirectToProviderAndCreate(string $provider)
{ {
$redirect_url = config('services.' . $provider . '.redirect') . '/create'; $redirect_url = config('services.' . $provider . '.redirect') . '/create';
if(request()->has('code')) if (request()->has('code')) {
return $this->handleProviderCallbackAndCreate($provider); return $this->handleProviderCallbackAndCreate($provider);
else } else {
return Socialite::driver($provider)->scopes('https://www.googleapis.com/auth/gmail.send')->redirectUrl($redirect_url)->redirect(); return Socialite::driver($provider)->scopes('https://www.googleapis.com/auth/gmail.send')->redirectUrl($redirect_url)->redirect();
}
} }
@ -278,16 +270,13 @@ class LoginController extends BaseController
->user(); ->user();
/* Handle existing users who attempt to create another account with existing OAuth credentials */ /* Handle existing users who attempt to create another account with existing OAuth credentials */
if($user = OAuth::handleAuth($socialite_user, $provider)) if ($user = OAuth::handleAuth($socialite_user, $provider)) {
{
$user->oauth_user_token = $socialite_user->refreshToken; $user->oauth_user_token = $socialite_user->refreshToken;
$user->save(); $user->save();
Auth::login($user, true); Auth::login($user, true);
return redirect($this->redirectTo); return redirect($this->redirectTo);
} } elseif (MultiDB::checkUserEmailExists($socialite_user->getEmail())) {
else if(MultiDB::checkUserEmailExists($socialite_user->getEmail()))
{
Session::flash('error', 'User exists in system, but not with this authentication method'); //todo add translations Session::flash('error', 'User exists in system, but not with this authentication method'); //todo add translations
return view('auth.login'); return view('auth.login');
@ -317,7 +306,6 @@ class LoginController extends BaseController
return redirect($this->redirectTo)->withCookie($cookie); return redirect($this->redirectTo)->withCookie($cookie);
} }
} }
/** /**
@ -327,7 +315,6 @@ class LoginController extends BaseController
*/ */
public function handleProviderCallback(string $provider) public function handleProviderCallback(string $provider)
{ {
$redirect_url = config('services.' . $provider . '.redirect'); $redirect_url = config('services.' . $provider . '.redirect');
$socialite_user = Socialite::driver($provider) $socialite_user = Socialite::driver($provider)
@ -335,16 +322,13 @@ class LoginController extends BaseController
->stateless() ->stateless()
->user(); ->user();
if($user = OAuth::handleAuth($socialite_user, $provider)) if ($user = OAuth::handleAuth($socialite_user, $provider)) {
{
$user->oauth_user_token = $socialite_user->token; $user->oauth_user_token = $socialite_user->token;
$user->save(); $user->save();
Auth::login($user, true); Auth::login($user, true);
return redirect($this->redirectTo); return redirect($this->redirectTo);
} } elseif (MultiDB::checkUserEmailExists($socialite_user->getEmail())) {
else if(MultiDB::checkUserEmailExists($socialite_user->getEmail()))
{
Session::flash('error', 'User exists in system, but not with this authentication method'); //todo add translations Session::flash('error', 'User exists in system, but not with this authentication method'); //todo add translations
return view('auth.login'); return view('auth.login');
@ -372,8 +356,6 @@ class LoginController extends BaseController
return redirect($this->redirectTo)->withCookie($cookie); return redirect($this->redirectTo)->withCookie($cookie);
} }
} }
/** /**
@ -390,7 +372,6 @@ class LoginController extends BaseController
*/ */
public function oauthApiLogin() public function oauthApiLogin()
{ {
$user = false; $user = false;
$oauth = new OAuth(); $oauth = new OAuth();
@ -400,12 +381,9 @@ class LoginController extends BaseController
if ($user) { if ($user) {
$ct = CompanyUser::whereUserId($user); $ct = CompanyUser::whereUserId($user);
return $this->listResponse($ct); return $this->listResponse($ct);
// return $this->itemResponse($user); // return $this->itemResponse($user);
} } else {
else
return $this->errorResponse(['message' => 'Invalid credentials'], 401); return $this->errorResponse(['message' => 'Invalid credentials'], 401);
}
} }
} }

View File

@ -54,28 +54,23 @@ class BaseController extends Controller
protected $manager; protected $manager;
public function __construct() public function __construct()
{ {
$this->manager = new Manager(); $this->manager = new Manager();
$this->forced_includes = []; $this->forced_includes = [];
$this->forced_index = 'data'; $this->forced_index = 'data';
} }
private function buildManager() private function buildManager()
{ {
$include = ''; $include = '';
if(request()->has('first_load') && request()->input('first_load') == 'true') if (request()->has('first_load') && request()->input('first_load') == 'true') {
{
/* For very large accounts, we reduce the includes automatically */ /* For very large accounts, we reduce the includes automatically */
if(auth()->user()->getCompany()->clients->count() > 1000) if (auth()->user()->getCompany()->clients->count() > 1000) {
{
$include = [ $include = [
'account', 'account',
'user.company_user', 'user.company_user',
@ -91,11 +86,7 @@ class BaseController extends Controller
'company.payments', 'company.payments',
'company.quotes', 'company.quotes',
]; ];
} else {
}
else
{
$include = [ $include = [
'account', 'account',
'user.company_user', 'user.company_user',
@ -111,48 +102,30 @@ class BaseController extends Controller
// 'company.payments', // 'company.payments',
// 'company.quotes', // 'company.quotes',
]; ];
} }
$include = array_merge($this->forced_includes, $include); $include = array_merge($this->forced_includes, $include);
$include = implode(",", $include); $include = implode(",", $include);
} elseif (request()->input('include') !== null) {
}
else if(request()->input('include') !== null)
{
$request_include = explode(",", request()->input('include')); $request_include = explode(",", request()->input('include'));
$include = array_merge($this->forced_includes, $request_include); $include = array_merge($this->forced_includes, $request_include);
$include = implode(",", $include); $include = implode(",", $include);
} elseif (count($this->forced_includes) >= 1) {
}
else if(count($this->forced_includes) >= 1)
{
$include = implode(",", $this->forced_includes); $include = implode(",", $this->forced_includes);
} }
$this->manager->parseIncludes($include); $this->manager->parseIncludes($include);
$this->serializer = request()->input('serializer') ?: EntityTransformer::API_SERIALIZER_ARRAY; $this->serializer = request()->input('serializer') ?: EntityTransformer::API_SERIALIZER_ARRAY;
if ($this->serializer === EntityTransformer::API_SERIALIZER_JSON) if ($this->serializer === EntityTransformer::API_SERIALIZER_JSON) {
{
$this->manager->setSerializer(new JsonApiSerializer()); $this->manager->setSerializer(new JsonApiSerializer());
} else {
}
else
{
$this->manager->setSerializer(new ArraySerializer()); $this->manager->setSerializer(new ArraySerializer());
} }
} }
/** /**
@ -161,34 +134,27 @@ class BaseController extends Controller
*/ */
public function notFound() public function notFound()
{ {
return response()->json(['message' => '404 | Nothing to see here!'], 404) return response()->json(['message' => '404 | Nothing to see here!'], 404)
->header('X-API-VERSION', config('ninja.api_version')) ->header('X-API-VERSION', config('ninja.api_version'))
->header('X-APP-VERSION', config('ninja.app_version')); ->header('X-APP-VERSION', config('ninja.app_version'));
} }
public function notFoundClient() public function notFoundClient()
{ {
return abort(404); return abort(404);
} }
protected function errorResponse($response, $httpErrorCode = 400) protected function errorResponse($response, $httpErrorCode = 400)
{ {
$error['error'] = $response; $error['error'] = $response;
$error = json_encode($error, JSON_PRETTY_PRINT); $error = json_encode($error, JSON_PRETTY_PRINT);
$headers = self::getApiHeaders(); $headers = self::getApiHeaders();
return response()->make($error, $httpErrorCode, $headers); return response()->make($error, $httpErrorCode, $headers);
} }
protected function listResponse($query) protected function listResponse($query)
{ {
$this->buildManager(); $this->buildManager();
$transformer = new $this->entity_transformer(Input::get('serializer')); $transformer = new $this->entity_transformer(Input::get('serializer'));
@ -199,16 +165,12 @@ class BaseController extends Controller
$query->with($includes); $query->with($includes);
if (auth()->user()->cannot('view_'.$this->entity_type)) if (auth()->user()->cannot('view_'.$this->entity_type)) {
{ if ($this->entity_type == Company::class) {
if($this->entity_type == Company::class){
//no user keys exist on the company table, so we need to skip //no user keys exist on the company table, so we need to skip
} } elseif ($this->entity_type == User::class) {
else if ($this->entity_type == User::class) {
$query->where('id', '=', auth()->user()->id); $query->where('id', '=', auth()->user()->id);
} } else {
else {
$query->where('user_id', '=', auth()->user()->id); $query->where('user_id', '=', auth()->user()->id);
} }
} }
@ -216,12 +178,10 @@ class BaseController extends Controller
$data = $this->createCollection($query, $transformer, $this->entity_type); $data = $this->createCollection($query, $transformer, $this->entity_type);
return $this->response($data); return $this->response($data);
} }
protected function createCollection($query, $transformer, $entity_type) protected function createCollection($query, $transformer, $entity_type)
{ {
$this->buildManager(); $this->buildManager();
if ($this->serializer && $this->serializer != EntityTransformer::API_SERIALIZER_JSON) { if ($this->serializer && $this->serializer != EntityTransformer::API_SERIALIZER_JSON) {
@ -240,12 +200,10 @@ class BaseController extends Controller
} }
return $this->manager->createData($resource)->toArray(); return $this->manager->createData($resource)->toArray();
} }
protected function response($response) protected function response($response)
{ {
$index = request()->input('index') ?: $this->forced_index; $index = request()->input('index') ?: $this->forced_index;
if ($index == 'none') { if ($index == 'none') {
@ -261,9 +219,9 @@ class BaseController extends Controller
unset($response[$index]['meta']); unset($response[$index]['meta']);
} }
if(request()->include_static) if (request()->include_static) {
$response['static'] = Statics::company(auth()->user()->getCompany()->getLocale()); $response['static'] = Statics::company(auth()->user()->getCompany()->getLocale());
}
} }
ksort($response); ksort($response);
@ -273,42 +231,38 @@ class BaseController extends Controller
return response()->make($response, 200, $headers); return response()->make($response, 200, $headers);
} }
protected function itemResponse($item) protected function itemResponse($item)
{ {
$this->buildManager(); $this->buildManager();
$transformer = new $this->entity_transformer(Input::get('serializer')); $transformer = new $this->entity_transformer(Input::get('serializer'));
$data = $this->createItem($item, $transformer, $this->entity_type); $data = $this->createItem($item, $transformer, $this->entity_type);
if(request()->include_static) if (request()->include_static) {
$data['static'] = Statics::company(auth()->user()->getCompany()->getLocale()); $data['static'] = Statics::company(auth()->user()->getCompany()->getLocale());
}
return $this->response($data); return $this->response($data);
} }
protected function createItem($data, $transformer, $entity_type) protected function createItem($data, $transformer, $entity_type)
{ {
if ($this->serializer && $this->serializer != EntityTransformer::API_SERIALIZER_JSON) {
if ($this->serializer && $this->serializer != EntityTransformer::API_SERIALIZER_JSON)
$entity_type = null; $entity_type = null;
}
$resource = new Item($data, $transformer, $entity_type); $resource = new Item($data, $transformer, $entity_type);
return $this->manager->createData($resource)->toArray(); return $this->manager->createData($resource)->toArray();
} }
public static function getApiHeaders($count = 0) public static function getApiHeaders($count = 0)
{ {
return [ return [
'Content-Type' => 'application/json', 'Content-Type' => 'application/json',
//'Access-Control-Allow-Origin' => '*', //'Access-Control-Allow-Origin' => '*',
@ -322,12 +276,10 @@ class BaseController extends Controller
//'X-Rate-Limit-Remaining' - The number of remaining requests in the current period //'X-Rate-Limit-Remaining' - The number of remaining requests in the current period
//'X-Rate-Limit-Reset' - The number of seconds left in the current period, //'X-Rate-Limit-Reset' - The number of seconds left in the current period,
]; ];
} }
protected function getRequestIncludes($data) protected function getRequestIncludes($data)
{ {
$included = request()->input('include'); $included = request()->input('include');
$included = explode(',', $included); $included = explode(',', $included);
@ -341,5 +293,4 @@ class BaseController extends Controller
return $data; return $data;
} }
} }

View File

@ -70,7 +70,6 @@ class ClientController extends BaseController
parent::__construct(); parent::__construct();
$this->client_repo = $client_repo; $this->client_repo = $client_repo;
} }
/** /**
@ -111,11 +110,9 @@ class ClientController extends BaseController
*/ */
public function index(ClientFilters $filters) public function index(ClientFilters $filters)
{ {
$clients = Client::filter($filters); $clients = Client::filter($filters);
return $this->listResponse($clients); return $this->listResponse($clients);
} }
/** /**
@ -170,9 +167,7 @@ class ClientController extends BaseController
*/ */
public function show(ShowClientRequest $request, Client $client) public function show(ShowClientRequest $request, Client $client)
{ {
return $this->itemResponse($client); return $this->itemResponse($client);
} }
/** /**
@ -227,9 +222,7 @@ class ClientController extends BaseController
*/ */
public function edit(EditClientRequest $request, Client $client) public function edit(EditClientRequest $request, Client $client)
{ {
return $this->itemResponse($client); return $this->itemResponse($client);
} }
/** /**
@ -286,13 +279,14 @@ class ClientController extends BaseController
*/ */
public function update(UpdateClientRequest $request, Client $client) public function update(UpdateClientRequest $request, Client $client)
{ {
if($request->entityIsDeleted($client))
return $request->disallowUpdate();
$client = $this->client_repo->save($request->all(), $client); $client = $this->client_repo->save($request->all(), $client);
$this->uploadLogo($request->file('company_logo'), $client->company, $client); $this->uploadLogo($request->file('company_logo'), $client->company, $client);
return $this->itemResponse($client->fresh()); return $this->itemResponse($client->fresh());
} }
/** /**
@ -336,11 +330,9 @@ class ClientController extends BaseController
*/ */
public function create(CreateClientRequest $request) public function create(CreateClientRequest $request)
{ {
$client = ClientFactory::create(auth()->user()->company()->id, auth()->user()->id); $client = ClientFactory::create(auth()->user()->company()->id, auth()->user()->id);
return $this->itemResponse($client); return $this->itemResponse($client);
} }
/** /**
@ -385,7 +377,6 @@ class ClientController extends BaseController
*/ */
public function store(StoreClientRequest $request) public function store(StoreClientRequest $request)
{ {
$client = $this->client_repo->save($request->all(), ClientFactory::create(auth()->user()->company()->id, auth()->user()->id)); $client = $this->client_repo->save($request->all(), ClientFactory::create(auth()->user()->company()->id, auth()->user()->id));
$client->load('contacts', 'primary_contact'); $client->load('contacts', 'primary_contact');
@ -393,7 +384,6 @@ class ClientController extends BaseController
$this->uploadLogo($request->file('company_logo'), $client->company, $client); $this->uploadLogo($request->file('company_logo'), $client->company, $client);
return $this->itemResponse($client); return $this->itemResponse($client);
} }
/** /**
@ -507,15 +497,15 @@ class ClientController extends BaseController
*/ */
public function bulk() public function bulk()
{ {
$action = request()->input('action'); $action = request()->input('action');
$ids = request()->input('ids'); $ids = request()->input('ids');
$clients = Client::withTrashed()->find($this->transformKeys($ids)); $clients = Client::withTrashed()->find($this->transformKeys($ids));
$clients->each(function ($client, $key) use($action){ $clients->each(function ($client, $key) use ($action) {
if(auth()->user()->can('edit', $client)) if (auth()->user()->can('edit', $client)) {
$this->client_repo->{$action}($client); $this->client_repo->{$action}($client);
}
}); });
return $this->listResponse(Client::withTrashed()->whereIn('id', $this->transformKeys($ids))); return $this->listResponse(Client::withTrashed()->whereIn('id', $this->transformKeys($ids)));
@ -530,5 +520,4 @@ class ClientController extends BaseController
{ {
//todo //todo
} }
} }

View File

@ -27,7 +27,6 @@ class DocumentController extends Controller
*/ */
public function index() public function index()
{ {
} }
/** /**

View File

@ -25,7 +25,6 @@ use Illuminate\Support\Facades\Auth;
class InvitationController extends Controller class InvitationController extends Controller
{ {
use MakesHash; use MakesHash;
use MakesDates; use MakesDates;
@ -36,26 +35,22 @@ class InvitationController extends Controller
$invitation = $entity_obj::whereRaw("BINARY `key`= ?", [$invitation_key])->first(); $invitation = $entity_obj::whereRaw("BINARY `key`= ?", [$invitation_key])->first();
if($invitation){ if ($invitation) {
if ((bool)$invitation->contact->client->getSetting('enable_client_portal_password') !== false) {
if((bool)$invitation->contact->client->getSetting('enable_client_portal_password') !== false)
$this->middleware('auth:contact'); $this->middleware('auth:contact');
else } else {
auth()->guard('contact')->login($invitation->contact, false); auth()->guard('contact')->login($invitation->contact, false);
}
$invitation->markViewed(); $invitation->markViewed();
return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key})]); return redirect()->route('client.'.$entity.'.show', [$entity => $this->encodePrimaryKey($invitation->{$key})]);
} else {
} abort(404);
else }
abort(404);
} }
public function routerForIframe(string $entity, string $client_hash, string $invitation_key) public function routerForIframe(string $entity, string $client_hash, string $invitation_key)
{ {
} }
} }

View File

@ -36,7 +36,6 @@ use ZipStream\ZipStream;
class InvoiceController extends Controller class InvoiceController extends Controller
{ {
use MakesHash; use MakesHash;
use MakesDates; use MakesDates;
/** /**
@ -51,18 +50,17 @@ class InvoiceController extends Controller
$invoices = Invoice::filter($filters)->with('client', 'client.country'); $invoices = Invoice::filter($filters)->with('client', 'client.country');
if (request()->ajax()) { if (request()->ajax()) {
return DataTables::of($invoices)->addColumn('action', function ($invoice) { return DataTables::of($invoices)->addColumn('action', function ($invoice) {
return $this->buildClientButtons($invoice); return $this->buildClientButtons($invoice);
}) })
->addColumn('checkbox', function ($invoice){ ->addColumn('checkbox', function ($invoice) {
return '<input type="checkbox" name="hashed_ids[]" value="'. $invoice->hashed_id .'"/>'; return '<input type="checkbox" name="hashed_ids[]" value="'. $invoice->hashed_id .'"/>';
}) })
->editColumn('status_id', function ($invoice){ ->editColumn('status_id', function ($invoice) {
return Invoice::badgeForStatus($invoice->status); return Invoice::badgeForStatus($invoice->status);
})->editColumn('date', function ($invoice){ })->editColumn('date', function ($invoice) {
return $this->formatDate($invoice->date, $invoice->client->date_format()); return $this->formatDate($invoice->date, $invoice->client->date_format());
})->editColumn('due_date', function ($invoice){ })->editColumn('due_date', function ($invoice) {
return $this->formatDate($invoice->due_date, $invoice->client->date_format()); return $this->formatDate($invoice->due_date, $invoice->client->date_format());
})->editColumn('balance', function ($invoice) { })->editColumn('balance', function ($invoice) {
return Number::formatMoney($invoice->balance, $invoice->client); return Number::formatMoney($invoice->balance, $invoice->client);
@ -76,16 +74,15 @@ class InvoiceController extends Controller
$data['html'] = $builder; $data['html'] = $builder;
return view('portal.default.invoices.index', $data); return view('portal.default.invoices.index', $data);
} }
private function buildClientButtons($invoice) private function buildClientButtons($invoice)
{ {
$buttons = '<div>'; $buttons = '<div>';
if($invoice->isPayable()){ if ($invoice->isPayable()) {
$buttons .= "<button type=\"button\" class=\"btn btn-sm btn-info\" onclick=\"payInvoice('".$invoice->hashed_id."')\"><i class=\"glyphicon glyphicon-edit\"></i>".ctrans('texts.pay_now')."</button>"; $buttons .= "<button type=\"button\" class=\"btn btn-sm btn-info\" onclick=\"payInvoice('".$invoice->hashed_id."')\"><i class=\"glyphicon glyphicon-edit\"></i>".ctrans('texts.pay_now')."</button>";
// $buttons .= '<a href="/client/invoices/'. $invoice->hashed_id .'" class="btn btn-sm btn-info"><i class="glyphicon glyphicon-edit"></i>'.ctrans('texts.pay_now').'</a>'; // $buttons .= '<a href="/client/invoices/'. $invoice->hashed_id .'" class="btn btn-sm btn-info"><i class="glyphicon glyphicon-edit"></i>'.ctrans('texts.pay_now').'</a>';
} }
$buttons .= '<a href="/client/invoices/'. $invoice->hashed_id .'" class="btn btn-sm btn-primary"><i class="glyphicon glyphicon-edit"></i>'.ctrans('texts.view').'</a>'; $buttons .= '<a href="/client/invoices/'. $invoice->hashed_id .'" class="btn btn-sm btn-primary"><i class="glyphicon glyphicon-edit"></i>'.ctrans('texts.view').'</a>';
@ -117,34 +114,33 @@ class InvoiceController extends Controller
*/ */
public function bulk() public function bulk()
{ {
$transformed_ids = $this->transformKeys(explode(",", request()->input('hashed_ids')));
$transformed_ids = $this->transformKeys(explode(",",request()->input('hashed_ids'))); if (request()->input('action') == 'payment') {
if(request()->input('action') == 'payment')
return $this->makePayment($transformed_ids); return $this->makePayment($transformed_ids);
else if(request()->input('action') == 'download') } elseif (request()->input('action') == 'download') {
return $this->downloadInvoicePDF($transformed_ids); return $this->downloadInvoicePDF($transformed_ids);
}
} }
private function makePayment(array $ids) private function makePayment(array $ids)
{ {
$invoices = Invoice::whereIn('id', $ids) $invoices = Invoice::whereIn('id', $ids)
->whereClientId(auth()->user()->client->id) ->whereClientId(auth()->user()->client->id)
->get(); ->get();
$total = $invoices->sum('balance'); $total = $invoices->sum('balance');
$invoices = $invoices->filter(function ($invoice){ $invoices = $invoices->filter(function ($invoice) {
return $invoice->isPayable(); return $invoice->isPayable();
}); });
if($invoices->count() == 0) if ($invoices->count() == 0) {
return back()->with(['warning' => 'No payable invoices selected']); return back()->with(['warning' => 'No payable invoices selected']);
}
$invoices->map(function ($invoice){ $invoices->map(function ($invoice) {
$invoice->balance = Number::formatMoney($invoice->balance, $invoice->client); $invoice->balance = Number::formatMoney($invoice->balance, $invoice->client);
$invoice->due_date = $this->formatDate($invoice->due_date, $invoice->client->date_format()); $invoice->due_date = $this->formatDate($invoice->due_date, $invoice->client->date_format());
return $invoice; return $invoice;
@ -164,7 +160,6 @@ class InvoiceController extends Controller
]; ];
return view('portal.default.invoices.payment', $data); return view('portal.default.invoices.payment', $data);
} }
private function downloadInvoicePDF(array $ids) private function downloadInvoicePDF(array $ids)
@ -174,12 +169,14 @@ class InvoiceController extends Controller
->get(); ->get();
//generate pdf's of invoices locally //generate pdf's of invoices locally
if(!$invoices || $invoices->count() == 0) if (!$invoices || $invoices->count() == 0) {
return; return;
}
//if only 1 pdf, output to buffer for download //if only 1 pdf, output to buffer for download
if($invoices->count() == 1) if ($invoices->count() == 1) {
return response()->download(public_path($invoices->first()->pdf_file_path())); return response()->download(public_path($invoices->first()->pdf_file_path()));
}
# enable output of HTTP headers # enable output of HTTP headers
@ -189,15 +186,11 @@ class InvoiceController extends Controller
# create a new zipstream object # create a new zipstream object
$zip = new ZipStream(date('Y-m-d') . '_' . str_replace(' ', '_', trans('texts.invoices')).".zip", $options); $zip = new ZipStream(date('Y-m-d') . '_' . str_replace(' ', '_', trans('texts.invoices')).".zip", $options);
foreach($invoices as $invoice){ foreach ($invoices as $invoice) {
$zip->addFileFromPath(basename($invoice->pdf_file_path()), public_path($invoice->pdf_file_path()));
$zip->addFileFromPath(basename($invoice->pdf_file_path()), public_path($invoice->pdf_file_path())); }
}
# finish the zip stream # finish the zip stream
$zip->finish(); $zip->finish();
} }
} }

View File

@ -32,7 +32,6 @@ use Yajra\DataTables\Html\Builder;
class PaymentController extends Controller class PaymentController extends Controller
{ {
use MakesHash; use MakesHash;
use MakesDates; use MakesDates;
@ -46,19 +45,18 @@ class PaymentController extends Controller
public function index(PaymentFilters $filters, Builder $builder) public function index(PaymentFilters $filters, Builder $builder)
{ {
//$payments = Payment::filter($filters); //$payments = Payment::filter($filters);
$payments = Payment::with('type','client'); $payments = Payment::with('type', 'client');
if (request()->ajax()) { if (request()->ajax()) {
return DataTables::of($payments)->addColumn('action', function ($payment) { return DataTables::of($payments)->addColumn('action', function ($payment) {
return '<a href="/client/payments/'. $payment->hashed_id .'" class="btn btn-xs btn-primary"><i class="glyphicon glyphicon-edit"></i>'.ctrans('texts.view').'</a>'; return '<a href="/client/payments/'. $payment->hashed_id .'" class="btn btn-xs btn-primary"><i class="glyphicon glyphicon-edit"></i>'.ctrans('texts.view').'</a>';
})->editColumn('type_id', function ($payment) { })->editColumn('type_id', function ($payment) {
return $payment->type->name; return $payment->type->name;
}) })
->editColumn('status_id', function ($payment){ ->editColumn('status_id', function ($payment) {
return Payment::badgeForStatus($payment->status_id); return Payment::badgeForStatus($payment->status_id);
}) })
->editColumn('date', function ($payment){ ->editColumn('date', function ($payment) {
//return $payment->date; //return $payment->date;
return $payment->formatDate($payment->date, $payment->client->date_format()); return $payment->formatDate($payment->date, $payment->client->date_format());
}) })
@ -67,13 +65,11 @@ class PaymentController extends Controller
}) })
->rawColumns(['action', 'status_id','type_id']) ->rawColumns(['action', 'status_id','type_id'])
->make(true); ->make(true);
} }
$data['html'] = $builder; $data['html'] = $builder;
return view('portal.default.payments.index', $data); return view('portal.default.payments.index', $data);
} }
/** /**
@ -90,7 +86,6 @@ class PaymentController extends Controller
$data['payment'] = $payment; $data['payment'] = $payment;
return view('portal.default.payments.show', $data); return view('portal.default.payments.show', $data);
} }
/** /**
@ -103,21 +98,21 @@ class PaymentController extends Controller
*/ */
public function process() public function process()
{ {
$invoices = Invoice::whereIn('id', $this->transformKeys(explode(",", request()->input('hashed_ids'))))
$invoices = Invoice::whereIn('id', $this->transformKeys(explode(",",request()->input('hashed_ids'))))
->whereClientId(auth()->user()->client->id) ->whereClientId(auth()->user()->client->id)
->get(); ->get();
$amount = $invoices->sum('balance'); $amount = $invoices->sum('balance');
$invoices = $invoices->filter(function ($invoice){ $invoices = $invoices->filter(function ($invoice) {
return $invoice->isPayable(); return $invoice->isPayable();
}); });
if($invoices->count() == 0) if ($invoices->count() == 0) {
return back()->with(['warning' => 'No payable invoices selected']); return back()->with(['warning' => 'No payable invoices selected']);
}
$invoices->map(function ($invoice){ $invoices->map(function ($invoice) {
$invoice->balance = Number::formatMoney($invoice->balance, $invoice->client); $invoice->balance = Number::formatMoney($invoice->balance, $invoice->client);
$invoice->due_date = $this->formatDate($invoice->due_date, $invoice->client->date_format()); $invoice->due_date = $this->formatDate($invoice->due_date, $invoice->client->date_format());
return $invoice; return $invoice;
@ -140,12 +135,11 @@ class PaymentController extends Controller
'amount_with_fee' => $amount + $gateway->calcGatewayFee($amount), 'amount_with_fee' => $amount + $gateway->calcGatewayFee($amount),
'token' => auth()->user()->client->gateway_token($gateway->id, $payment_method_id), 'token' => auth()->user()->client->gateway_token($gateway->id, $payment_method_id),
'payment_method_id' => $payment_method_id, 'payment_method_id' => $payment_method_id,
'hashed_ids' => explode(",",request()->input('hashed_ids')), 'hashed_ids' => explode(",", request()->input('hashed_ids')),
]; ];
return $gateway->driver(auth()->user()->client)->processPaymentView($data); return $gateway->driver(auth()->user()->client)->processPaymentView($data);
} }
public function response(Request $request) public function response(Request $request)
@ -153,7 +147,5 @@ class PaymentController extends Controller
$gateway = CompanyGateway::find($request->input('company_gateway_id')); $gateway = CompanyGateway::find($request->input('company_gateway_id'));
return $gateway->driver(auth()->user()->client)->processPaymentResponse($request); return $gateway->driver(auth()->user()->client)->processPaymentResponse($request);
} }
} }

View File

@ -17,14 +17,10 @@ use Illuminate\Http\Request;
class PaymentHookController extends Controller class PaymentHookController extends Controller
{ {
public function process($company_gateway_id, $gateway_type_id)
{
$gateway = Gateway::find($company_gateway_id);
public function process($company_gateway_id, $gateway_type_id) dd(request()->input());
{ }
$gateway = Gateway::find($company_gateway_id);
dd(request()->input());
}
} }

View File

@ -36,7 +36,6 @@ class PaymentMethodController extends Controller
$payment_methods->with('gateway_type'); $payment_methods->with('gateway_type');
if (request()->ajax()) { if (request()->ajax()) {
return DataTables::of($payment_methods)->addColumn('action', function ($payment_method) { return DataTables::of($payment_methods)->addColumn('action', function ($payment_method) {
return '<a href="/client/payment_methods/' . $payment_method->hashed_id . '" class="btn btn-xs btn-primary"><i class="glyphicon glyphicon-edit"></i>' . ctrans('texts.view') . '</a>'; return '<a href="/client/payment_methods/' . $payment_method->hashed_id . '" class="btn btn-xs btn-primary"><i class="glyphicon glyphicon-edit"></i>' . ctrans('texts.view') . '</a>';
}) })
@ -47,24 +46,26 @@ class PaymentMethodController extends Controller
})->editColumn('is_default', function ($payment_method) { })->editColumn('is_default', function ($payment_method) {
return $payment_method->is_default ? ctrans('texts.default') : ''; return $payment_method->is_default ? ctrans('texts.default') : '';
})->editColumn('meta', function ($payment_method) { })->editColumn('meta', function ($payment_method) {
if (isset($payment_method->meta->exp_month) && isset($payment_method->meta->exp_year)) if (isset($payment_method->meta->exp_month) && isset($payment_method->meta->exp_year)) {
return "{$payment_method->meta->exp_month}/{$payment_method->meta->exp_year}"; return "{$payment_method->meta->exp_month}/{$payment_method->meta->exp_year}";
else } else {
return ""; return "";
}
})->addColumn('last4', function ($payment_method) { })->addColumn('last4', function ($payment_method) {
if (isset($payment_method->meta->last4)) if (isset($payment_method->meta->last4)) {
return $payment_method->meta->last4; return $payment_method->meta->last4;
else } else {
return ""; return "";
}
})->addColumn('brand', function ($payment_method) { })->addColumn('brand', function ($payment_method) {
if (isset($payment_method->meta->brand)) if (isset($payment_method->meta->brand)) {
return $payment_method->meta->brand; return $payment_method->meta->brand;
else } else {
return ""; return "";
}
}) })
->rawColumns(['action', 'status_id', 'last4', 'brand']) ->rawColumns(['action', 'status_id', 'last4', 'brand'])
->make(true); ->make(true);
} }
$data['html'] = $builder; $data['html'] = $builder;
@ -101,7 +102,6 @@ class PaymentMethodController extends Controller
$gateway = auth()->user()->client->getCreditCardGateway(); $gateway = auth()->user()->client->getCreditCardGateway();
return $gateway->driver(auth()->user()->client)->authorizeCreditCardResponse($request); return $gateway->driver(auth()->user()->client)->authorizeCreditCardResponse($request);
} }
/** /**

View File

@ -45,10 +45,10 @@ class ProfileController extends Controller
/* Dropzone configuration */ /* Dropzone configuration */
$data = [ $data = [
'params' => [ 'params' => [
'is_avatar' => TRUE, 'is_avatar' => true,
], ],
'url' => '/client/document', 'url' => '/client/document',
'multi_upload' => FALSE, 'multi_upload' => false,
]; ];
return view('portal.default.profile.index', $data); return view('portal.default.profile.index', $data);
@ -63,33 +63,31 @@ class ProfileController extends Controller
*/ */
public function update(UpdateContactRequest $request, ClientContact $client_contact) public function update(UpdateContactRequest $request, ClientContact $client_contact)
{ {
$client_contact->fill($request->all()); $client_contact->fill($request->all());
//update password if needed //update password if needed
if($request->input('password')) if ($request->input('password')) {
$client_contact->password = Hash::make($request->input('password')); $client_contact->password = Hash::make($request->input('password'));
}
$client_contact->save(); $client_contact->save();
// auth()->user()->fresh(); // auth()->user()->fresh();
return back(); return back();
} }
public function updateClient(UpdateClientRequest $request, ClientContact $client_contact) public function updateClient(UpdateClientRequest $request, ClientContact $client_contact)
{ {
$client = $client_contact->client; $client = $client_contact->client;
//update avatar if needed //update avatar if needed
if($request->file('logo')) if ($request->file('logo')) {
{
$path = UploadAvatar::dispatchNow($request->file('logo'), auth()->user()->client->client_hash); $path = UploadAvatar::dispatchNow($request->file('logo'), auth()->user()->client->client_hash);
if($path) if ($path) {
$client->logo = $path; $client->logo = $path;
}
} }
$client->fill($request->all()); $client->fill($request->all());

View File

@ -33,7 +33,6 @@ use Yajra\DataTables\Html\Builder;
class RecurringInvoiceController extends Controller class RecurringInvoiceController extends Controller
{ {
use MakesHash; use MakesHash;
use MakesDates; use MakesDates;
/** /**
@ -52,33 +51,30 @@ class RecurringInvoiceController extends Controller
->get(); ->get();
if (request()->ajax()) { if (request()->ajax()) {
return DataTables::of($invoices)->addColumn('action', function ($invoice) { return DataTables::of($invoices)->addColumn('action', function ($invoice) {
return '<a href="/client/recurring_invoices/'. $invoice->hashed_id .'" class="btn btn-xs btn-primary"><i class="glyphicon glyphicon-edit"></i>'.ctrans('texts.view').'</a>'; return '<a href="/client/recurring_invoices/'. $invoice->hashed_id .'" class="btn btn-xs btn-primary"><i class="glyphicon glyphicon-edit"></i>'.ctrans('texts.view').'</a>';
})->addColumn('frequency_id', function ($invoice) { })->addColumn('frequency_id', function ($invoice) {
return RecurringInvoice::frequencyForKey($invoice->frequency_id); return RecurringInvoice::frequencyForKey($invoice->frequency_id);
}) })
->editColumn('status_id', function ($invoice){ ->editColumn('status_id', function ($invoice) {
return RecurringInvoice::badgeForStatus($invoice->status); return RecurringInvoice::badgeForStatus($invoice->status);
}) })
->editColumn('start_date', function ($invoice){ ->editColumn('start_date', function ($invoice) {
return $this->formatDate($invoice->date, $invoice->client->date_format()); return $this->formatDate($invoice->date, $invoice->client->date_format());
}) })
->editColumn('next_send_date', function ($invoice){ ->editColumn('next_send_date', function ($invoice) {
return $this->formatDate($invoice->next_send_date, $invoice->client->date_format()); return $this->formatDate($invoice->next_send_date, $invoice->client->date_format());
}) })
->editColumn('amount', function ($invoice){ ->editColumn('amount', function ($invoice) {
return Number::formatMoney($invoice->amount, $invoice->client); return Number::formatMoney($invoice->amount, $invoice->client);
}) })
->rawColumns(['action', 'status_id']) ->rawColumns(['action', 'status_id'])
->make(true); ->make(true);
} }
$data['html'] = $builder; $data['html'] = $builder;
return view('portal.default.recurring_invoices.index', $data); return view('portal.default.recurring_invoices.index', $data);
} }
/** /**
@ -90,19 +86,16 @@ class RecurringInvoiceController extends Controller
*/ */
public function show(ShowRecurringInvoiceRequest $request, RecurringInvoice $recurring_invoice) public function show(ShowRecurringInvoiceRequest $request, RecurringInvoice $recurring_invoice)
{ {
$data = [ $data = [
'invoice' => $recurring_invoice->load('invoices'), 'invoice' => $recurring_invoice->load('invoices'),
]; ];
return view('portal.default.recurring_invoices.show', $data); return view('portal.default.recurring_invoices.show', $data);
} }
public function requestCancellation(Request $request, RecurringInvoice $recurring_invoice) public function requestCancellation(Request $request, RecurringInvoice $recurring_invoice)
{ {
$data = [ $data = [
'invoice' => $recurring_invoice 'invoice' => $recurring_invoice
]; ];
@ -112,7 +105,5 @@ class RecurringInvoiceController extends Controller
$recurring_invoice->user->notify(new ClientContactRequestCancellation($recurring_invoice, auth()->user())); $recurring_invoice->user->notify(new ClientContactRequestCancellation($recurring_invoice, auth()->user()));
return view('portal.default.recurring_invoices.request_cancellation', $data); return view('portal.default.recurring_invoices.request_cancellation', $data);
} }
} }

View File

@ -17,32 +17,26 @@ namespace App\Http\Controllers;
*/ */
class ClientStatementController extends BaseController class ClientStatementController extends BaseController
{ {
public function __construct()
public function __construct()
{ {
parent::__construct(); parent::__construct();
} }
/** /**
* Displays a client statement view for a given * Displays a client statement view for a given
* client_id. * client_id.
* @return view * @return view
*/ */
public function show() public function show()
{ {
}
}
/**
* Updates the show view data dependent on
* configured variables
* @return json
*/
public function update()
{
}
/**
* Updates the show view data dependent on
* configured variables
* @return json
*/
public function update()
{
}
} }

View File

@ -60,11 +60,9 @@ class CompanyController extends BaseController
*/ */
public function __construct(CompanyRepository $company_repo) public function __construct(CompanyRepository $company_repo)
{ {
parent::__construct(); parent::__construct();
$this->company_repo = $company_repo; $this->company_repo = $company_repo;
} }
/** /**
@ -108,11 +106,9 @@ class CompanyController extends BaseController
*/ */
public function index() public function index()
{ {
$companies = Company::whereAccountId(auth()->user()->company()->account->id); $companies = Company::whereAccountId(auth()->user()->company()->account->id);
return $this->listResponse($companies); return $this->listResponse($companies);
} }
/** /**
@ -156,7 +152,6 @@ class CompanyController extends BaseController
*/ */
public function create(CreateCompanyRequest $request) public function create(CreateCompanyRequest $request)
{ {
$company = CompanyFactory::create(auth()->user()->company()->account->id); $company = CompanyFactory::create(auth()->user()->company()->account->id);
return $this->itemResponse($company); return $this->itemResponse($company);
@ -240,7 +235,6 @@ class CompanyController extends BaseController
$ct = CompanyUser::whereUserId(auth()->user()->id)->whereCompanyId($company->id); $ct = CompanyUser::whereUserId(auth()->user()->id)->whereCompanyId($company->id);
return $this->listResponse($ct); return $this->listResponse($ct);
} }
/** /**
@ -295,9 +289,7 @@ class CompanyController extends BaseController
*/ */
public function show(ShowCompanyRequest $request, Company $company) public function show(ShowCompanyRequest $request, Company $company)
{ {
return $this->itemResponse($company); return $this->itemResponse($company);
} }
/** /**
@ -352,9 +344,7 @@ class CompanyController extends BaseController
*/ */
public function edit(EditCompanyRequest $request, Company $company) public function edit(EditCompanyRequest $request, Company $company)
{ {
return $this->itemResponse($company); return $this->itemResponse($company);
} }
/** /**
@ -470,7 +460,6 @@ class CompanyController extends BaseController
*/ */
public function destroy(DestroyCompanyRequest $request, Company $company) public function destroy(DestroyCompanyRequest $request, Company $company)
{ {
$company->delete(); $company->delete();
return response()->json([], 200); return response()->json([], 200);

View File

@ -47,11 +47,9 @@ class CompanyGatewayController extends BaseController
*/ */
public function __construct(CompanyRepository $company_repo) public function __construct(CompanyRepository $company_repo)
{ {
parent::__construct(); parent::__construct();
$this->company_repo = $company_repo; $this->company_repo = $company_repo;
} }
/** /**
@ -100,7 +98,6 @@ class CompanyGatewayController extends BaseController
$company_gateways = CompanyGateway::whereCompanyId(auth()->user()->company()->id); $company_gateways = CompanyGateway::whereCompanyId(auth()->user()->company()->id);
return $this->listResponse($company_gateways); return $this->listResponse($company_gateways);
} }
/** /**
@ -144,7 +141,6 @@ class CompanyGatewayController extends BaseController
*/ */
public function create(CreateCompanyGatewayRequest $request) public function create(CreateCompanyGatewayRequest $request)
{ {
$company_gateway = CompanyGatewayFactory::create(auth()->user()->company()->id, auth()->user()->id); $company_gateway = CompanyGatewayFactory::create(auth()->user()->company()->id, auth()->user()->id);
return $this->itemResponse($company_gateway); return $this->itemResponse($company_gateway);
@ -192,13 +188,11 @@ class CompanyGatewayController extends BaseController
*/ */
public function store(StoreCompanyGatewayRequest $request) public function store(StoreCompanyGatewayRequest $request)
{ {
$company_gateway = CompanyGatewayFactory::create(auth()->user()->company()->id, auth()->user()->id); $company_gateway = CompanyGatewayFactory::create(auth()->user()->company()->id, auth()->user()->id);
$company_gateway->fill($request->all()); $company_gateway->fill($request->all());
$company_gateway->save(); $company_gateway->save();
return $this->itemResponse($company_gateway); return $this->itemResponse($company_gateway);
} }
/** /**
@ -253,9 +247,7 @@ class CompanyGatewayController extends BaseController
*/ */
public function show(ShowCompanyGatewayRequest $request, CompanyGateway $company_gateway) public function show(ShowCompanyGatewayRequest $request, CompanyGateway $company_gateway)
{ {
return $this->itemResponse($company_gateway); return $this->itemResponse($company_gateway);
} }
/** /**
@ -310,9 +302,7 @@ class CompanyGatewayController extends BaseController
*/ */
public function edit(EditCompanyGatewayRequest $request, CompanyGateway $company_gateway) public function edit(EditCompanyGatewayRequest $request, CompanyGateway $company_gateway)
{ {
return $this->itemResponse($company_gateway); return $this->itemResponse($company_gateway);
} }
/** /**
@ -368,11 +358,11 @@ class CompanyGatewayController extends BaseController
*/ */
public function update(UpdateCompanyGatewayRequest $request, CompanyGateway $company_gateway) public function update(UpdateCompanyGatewayRequest $request, CompanyGateway $company_gateway)
{ {
$company_gateway->fill($request->all()); $company_gateway->fill($request->all());
if(!$request->has('fees_and_limits')) if (!$request->has('fees_and_limits')) {
$company_gateway->fees_and_limits = ''; $company_gateway->fees_and_limits = '';
}
$company_gateway->save(); $company_gateway->save();
@ -430,10 +420,8 @@ class CompanyGatewayController extends BaseController
*/ */
public function destroy(DestroyCompanyGatewayRequest $request, CompanyGateway $company_gateway) public function destroy(DestroyCompanyGatewayRequest $request, CompanyGateway $company_gateway)
{ {
$company_gateway->delete(); $company_gateway->delete();
return response()->json([], 200); return response()->json([], 200);
} }
} }

View File

@ -28,9 +28,7 @@ class InvoiceController extends BaseController
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
} }
/** /**
@ -42,10 +40,8 @@ class InvoiceController extends BaseController
*/ */
public function index(InvoiceFilters $filters) public function index(InvoiceFilters $filters)
{ {
$invoices = Invoice::filter($filters); $invoices = Invoice::filter($filters);
return $this->listResponse($invoices); return $this->listResponse($invoices);
} }
} }

View File

@ -54,9 +54,7 @@ class LoginController extends BaseController
*/ */
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
} }
/** /**
@ -68,7 +66,6 @@ class LoginController extends BaseController
*/ */
public function apiLogin(Request $request) public function apiLogin(Request $request)
{ {
Auth::shouldUse('contact'); Auth::shouldUse('contact');
$this->validateLogin($request); $this->validateLogin($request);
@ -79,15 +76,13 @@ class LoginController extends BaseController
return response()->json(['message' => 'Too many login attempts, you are being throttled']); return response()->json(['message' => 'Too many login attempts, you are being throttled']);
} }
if ($this->attemptLogin($request)) if ($this->attemptLogin($request)) {
return $this->itemResponse($this->guard()->user()); return $this->itemResponse($this->guard()->user());
else { } else {
$this->incrementLoginAttempts($request); $this->incrementLoginAttempts($request);
return response()->json(['message' => ctrans('texts.invalid_credentials')]); return response()->json(['message' => ctrans('texts.invalid_credentials')]);
} }
} }
/** /**
@ -99,24 +94,23 @@ class LoginController extends BaseController
{ {
//'https://www.googleapis.com/auth/gmail.send','email','profile','openid' //'https://www.googleapis.com/auth/gmail.send','email','profile','openid'
// //
if(request()->has('code')) if (request()->has('code')) {
return $this->handleProviderCallback($provider); return $this->handleProviderCallback($provider);
else } else {
return Socialite::driver($provider)->scopes()->redirect(); return Socialite::driver($provider)->scopes()->redirect();
}
} }
public function redirectToProviderAndCreate(string $provider) public function redirectToProviderAndCreate(string $provider)
{ {
$redirect_url = config('services.' . $provider . '.redirect') . '/create'; $redirect_url = config('services.' . $provider . '.redirect') . '/create';
if(request()->has('code')) if (request()->has('code')) {
return $this->handleProviderCallbackAndCreate($provider); return $this->handleProviderCallbackAndCreate($provider);
else } else {
return Socialite::driver($provider)->redirectUrl($redirect_url)->redirect(); return Socialite::driver($provider)->redirectUrl($redirect_url)->redirect();
}
} }
@ -225,18 +219,17 @@ class LoginController extends BaseController
*/ */
public function oauthApiLogin() public function oauthApiLogin()
{ {
$user = false; $user = false;
$oauth = new OAuth(); $oauth = new OAuth();
$user = $oauth->getProvider(request()->input('provider'))->getTokenResponse(request()->input('token')); $user = $oauth->getProvider(request()->input('provider'))->getTokenResponse(request()->input('token'));
if ($user) if ($user) {
return $this->itemResponse($user); return $this->itemResponse($user);
else } else {
return $this->errorResponse(['message' => 'Invalid credentials'], 401); return $this->errorResponse(['message' => 'Invalid credentials'], 401);
}
} }

View File

@ -11,7 +11,6 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
class DashboardController extends BaseController class DashboardController extends BaseController
{ {
/** /**
@ -22,7 +21,6 @@ class DashboardController extends BaseController
public function __construct() public function __construct()
{ {
$this->middleware('auth:user'); $this->middleware('auth:user');
} }
/** /**
@ -32,9 +30,7 @@ class DashboardController extends BaseController
*/ */
public function index() public function index()
{ {
// dd(json_decode(auth()->user()->permissions(),true)); // dd(json_decode(auth()->user()->permissions(),true));
return view('dashboard.index'); return view('dashboard.index');
} }
} }

View File

@ -11,7 +11,6 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Factory\GroupSettingFactory; use App\Factory\GroupSettingFactory;
use App\Http\Requests\GroupSetting\CreateGroupSettingRequest; use App\Http\Requests\GroupSetting\CreateGroupSettingRequest;
use App\Http\Requests\GroupSetting\DestroyGroupSettingRequest; use App\Http\Requests\GroupSetting\DestroyGroupSettingRequest;
@ -189,7 +188,6 @@ class GroupSettingController extends BaseController
$this->uploadLogo($request->file('company_logo'), $group_setting->company, $group_setting); $this->uploadLogo($request->file('company_logo'), $group_setting->company, $group_setting);
return $this->itemResponse($group_setting); return $this->itemResponse($group_setting);
} }
/** /**
@ -355,13 +353,11 @@ class GroupSettingController extends BaseController
*/ */
public function update(UpdateGroupSettingRequest $request, GroupSetting $group_setting) public function update(UpdateGroupSettingRequest $request, GroupSetting $group_setting)
{ {
$group_setting = $this->group_setting_repo->save($request->all(), $group_setting); $group_setting = $this->group_setting_repo->save($request->all(), $group_setting);
$this->uploadLogo($request->file('company_logo'), $group_setting->company, $group_setting); $this->uploadLogo($request->file('company_logo'), $group_setting->company, $group_setting);
return $this->itemResponse($group_setting); return $this->itemResponse($group_setting);
} }
/** /**
@ -418,6 +414,5 @@ class GroupSettingController extends BaseController
$group_setting->delete(); $group_setting->delete();
return response()->json([], 200); return response()->json([], 200);
} }
} }

View File

@ -43,7 +43,6 @@ use Illuminate\Support\Facades\Log;
class InvoiceController extends BaseController class InvoiceController extends BaseController
{ {
use MakesHash; use MakesHash;
protected $entity_type = Invoice::class; protected $entity_type = Invoice::class;
@ -62,11 +61,9 @@ class InvoiceController extends BaseController
*/ */
public function __construct(InvoiceRepository $invoice_repo) public function __construct(InvoiceRepository $invoice_repo)
{ {
parent::__construct(); parent::__construct();
$this->invoice_repo = $invoice_repo; $this->invoice_repo = $invoice_repo;
} }
/** /**
@ -112,11 +109,9 @@ class InvoiceController extends BaseController
*/ */
public function index(InvoiceFilters $filters) public function index(InvoiceFilters $filters)
{ {
$invoices = Invoice::filter($filters); $invoices = Invoice::filter($filters);
return $this->listResponse($invoices); return $this->listResponse($invoices);
} }
/** /**
@ -161,11 +156,9 @@ class InvoiceController extends BaseController
*/ */
public function create(CreateInvoiceRequest $request) public function create(CreateInvoiceRequest $request)
{ {
$invoice = InvoiceFactory::create(auth()->user()->company()->id, auth()->user()->id); $invoice = InvoiceFactory::create(auth()->user()->company()->id, auth()->user()->id);
return $this->itemResponse($invoice); return $this->itemResponse($invoice);
} }
@ -211,7 +204,6 @@ class InvoiceController extends BaseController
*/ */
public function store(StoreInvoiceRequest $request) public function store(StoreInvoiceRequest $request)
{ {
$invoice = $this->invoice_repo->save($request->all(), InvoiceFactory::create(auth()->user()->company()->id, auth()->user()->id)); $invoice = $this->invoice_repo->save($request->all(), InvoiceFactory::create(auth()->user()->company()->id, auth()->user()->id));
$invoice = StoreInvoice::dispatchNow($invoice, $request->all(), $invoice->company); //todo potentially this may return mixed ie PDF/$invoice... need to revisit when we implement UI $invoice = StoreInvoice::dispatchNow($invoice, $request->all(), $invoice->company); //todo potentially this may return mixed ie PDF/$invoice... need to revisit when we implement UI
@ -219,7 +211,6 @@ class InvoiceController extends BaseController
event(new InvoiceWasCreated($invoice, $invoice->company)); event(new InvoiceWasCreated($invoice, $invoice->company));
return $this->itemResponse($invoice); return $this->itemResponse($invoice);
} }
/** /**
@ -276,9 +267,7 @@ class InvoiceController extends BaseController
*/ */
public function show(ShowInvoiceRequest $request, Invoice $invoice) public function show(ShowInvoiceRequest $request, Invoice $invoice)
{ {
return $this->itemResponse($invoice); return $this->itemResponse($invoice);
} }
/** /**
@ -334,9 +323,7 @@ class InvoiceController extends BaseController
*/ */
public function edit(EditInvoiceRequest $request, Invoice $invoice) public function edit(EditInvoiceRequest $request, Invoice $invoice)
{ {
return $this->itemResponse($invoice); return $this->itemResponse($invoice);
} }
/** /**
@ -393,13 +380,14 @@ class InvoiceController extends BaseController
*/ */
public function update(UpdateInvoiceRequest $request, Invoice $invoice) public function update(UpdateInvoiceRequest $request, Invoice $invoice)
{ {
if($request->entityIsDeleted($invoice))
return $request->disallowUpdate();
$invoice = $this->invoice_repo->save($request->all(), $invoice); $invoice = $this->invoice_repo->save($request->all(), $invoice);
event(new InvoiceWasUpdated($invoice, $invoice->company)); event(new InvoiceWasUpdated($invoice, $invoice->company));
return $this->itemResponse($invoice); return $this->itemResponse($invoice);
} }
/** /**
@ -454,11 +442,9 @@ class InvoiceController extends BaseController
*/ */
public function destroy(DestroyInvoiceRequest $request, Invoice $invoice) public function destroy(DestroyInvoiceRequest $request, Invoice $invoice)
{ {
$invoice->delete(); $invoice->delete();
return response()->json([], 200); return response()->json([], 200);
} }
/** /**
@ -515,27 +501,26 @@ class InvoiceController extends BaseController
*/ */
public function bulk() public function bulk()
{ {
$action = request()->input('action'); $action = request()->input('action');
$ids = request()->input('ids'); $ids = request()->input('ids');
$invoices = Invoice::withTrashed()->whereIn('id', $this->transformKeys($ids)); $invoices = Invoice::withTrashed()->whereIn('id', $this->transformKeys($ids));
if(!$invoices) if (!$invoices) {
return response()->json(['message'=>'No Invoices Found']); return response()->json(['message'=>'No Invoices Found']);
}
$invoices->each(function ($invoice, $key) use($action){ $invoices->each(function ($invoice, $key) use ($action) {
// $this->invoice_repo->{$action}($invoice); // $this->invoice_repo->{$action}($invoice);
if(auth()->user()->can('edit', $invoice)) if (auth()->user()->can('edit', $invoice)) {
$this->performAction($invoice, $action, true); $this->performAction($invoice, $action, true);
}
}); });
return $this->listResponse(Invoice::withTrashed()->whereIn('id', $this->transformKeys($ids))); return $this->listResponse(Invoice::withTrashed()->whereIn('id', $this->transformKeys($ids)));
} }
/** /**
@ -607,9 +592,7 @@ class InvoiceController extends BaseController
*/ */
public function action(ActionInvoiceRequest $request, Invoice $invoice, $action) public function action(ActionInvoiceRequest $request, Invoice $invoice, $action)
{ {
return $this->performAction($invoice, $action); return $this->performAction($invoice, $action);
} }
private function performAction(Invoice $invoice, $action, $bulk = false) private function performAction(Invoice $invoice, $action, $bulk = false)
@ -631,19 +614,22 @@ class InvoiceController extends BaseController
# code... # code...
break; break;
case 'mark_paid': case 'mark_paid':
if($invoice->balance <= 0 || $invoice->status_id == Invoice::STATUS_PAID) if ($invoice->balance <= 0 || $invoice->status_id == Invoice::STATUS_PAID) {
return $this->errorResponse(['message' => 'Invoice has no balance owing'], 400); return $this->errorResponse(['message' => 'Invoice has no balance owing'], 400);
}
$invoice = MarkInvoicePaid::dispatchNow($invoice, $invoice->company); $invoice = MarkInvoicePaid::dispatchNow($invoice, $invoice->company);
if(!$bulk) if (!$bulk) {
return $this->itemResponse($invoice); return $this->itemResponse($invoice);
}
break; break;
case 'mark_sent': case 'mark_sent':
$invoice->markSent(); $invoice->markSent();
if(!$bulk) if (!$bulk) {
return $this->itemResponse($invoice); return $this->itemResponse($invoice);
}
break; break;
case 'download': case 'download':
return response()->download(public_path($invoice->pdf_file_path())); return response()->download(public_path($invoice->pdf_file_path()));
@ -651,25 +637,27 @@ class InvoiceController extends BaseController
case 'archive': case 'archive':
$this->invoice_repo->archive($invoice); $this->invoice_repo->archive($invoice);
if(!$bulk) if (!$bulk) {
return $this->listResponse($invoice); return $this->listResponse($invoice);
}
break; break;
case 'delete': case 'delete':
$this->invoice_repo->delete($invoice); $this->invoice_repo->delete($invoice);
if(!$bulk) if (!$bulk) {
return $this->listResponse($invoice); return $this->listResponse($invoice);
}
break; break;
case 'email': case 'email':
EmailInvoice::dispatch($invoice, $invoice->company); EmailInvoice::dispatch($invoice, $invoice->company);
if(!$bulk) if (!$bulk) {
return response()->json(['message'=>'email sent'],200); return response()->json(['message'=>'email sent'], 200);
}
break; break;
default: default:
return response()->json(['message' => "The requested action `{$action}` is not available."],400); return response()->json(['message' => "The requested action `{$action}` is not available."], 400);
break; break;
} }
} }
} }

View File

@ -29,7 +29,6 @@ class MigrationController extends BaseController
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
} }
@ -79,10 +78,9 @@ class MigrationController extends BaseController
*/ */
public function purgeCompany(Company $company) public function purgeCompany(Company $company)
{ {
$company->delete();
$company->delete(); return response()->json(['message'=>'Company purged'], 200);
return response()->json(['message'=>'Company purged'], 200);
} }
@ -136,9 +134,6 @@ class MigrationController extends BaseController
$company->client->delete(); $company->client->delete();
$company->save(); $company->save();
return response()->json(['message'=>'Settings preserved'], 200); return response()->json(['message'=>'Settings preserved'], 200);
} }
} }

View File

@ -21,4 +21,3 @@
* ), * ),
* ) * )
*/ */

View File

@ -27,4 +27,3 @@
* @OA\Property(property="settings",ref="#/components/schemas/CompanySettings"), * @OA\Property(property="settings",ref="#/components/schemas/CompanySettings"),
* ) * )
*/ */

View File

@ -85,5 +85,3 @@
* ), * ),
* *
*/ */

View File

@ -11,7 +11,6 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Factory\PaymentFactory; use App\Factory\PaymentFactory;
use App\Filters\PaymentFilters; use App\Filters\PaymentFilters;
use App\Http\Requests\Payment\ActionPaymentRequest; use App\Http\Requests\Payment\ActionPaymentRequest;
@ -37,7 +36,6 @@ use Illuminate\Http\Request;
class PaymentController extends BaseController class PaymentController extends BaseController
{ {
use MakesHash; use MakesHash;
protected $entity_type = Payment::class; protected $entity_type = Payment::class;
@ -57,11 +55,9 @@ class PaymentController extends BaseController
*/ */
public function __construct(PaymentRepository $payment_repo) public function __construct(PaymentRepository $payment_repo)
{ {
parent::__construct(); parent::__construct();
$this->payment_repo = $payment_repo; $this->payment_repo = $payment_repo;
} }
/** /**
@ -109,11 +105,9 @@ class PaymentController extends BaseController
*/ */
public function index(PaymentFilters $filters) public function index(PaymentFilters $filters)
{ {
$payments = Payment::filter($filters); $payments = Payment::filter($filters);
return $this->listResponse($payments); return $this->listResponse($payments);
} }
/** /**
@ -159,11 +153,9 @@ class PaymentController extends BaseController
*/ */
public function create(CreatePaymentRequest $request) public function create(CreatePaymentRequest $request)
{ {
$payment = PaymentFactory::create(auth()->user()->company()->id, auth()->user()->id); $payment = PaymentFactory::create(auth()->user()->company()->id, auth()->user()->id);
return $this->itemResponse($payment); return $this->itemResponse($payment);
} }
@ -244,11 +236,9 @@ class PaymentController extends BaseController
*/ */
public function store(StorePaymentRequest $request) public function store(StorePaymentRequest $request)
{ {
$payment = $this->payment_repo->save($request, PaymentFactory::create(auth()->user()->company()->id, auth()->user()->id)); $payment = $this->payment_repo->save($request, PaymentFactory::create(auth()->user()->company()->id, auth()->user()->id));
return $this->itemResponse($payment); return $this->itemResponse($payment);
} }
/** /**
@ -305,9 +295,7 @@ class PaymentController extends BaseController
*/ */
public function show(ShowPaymentRequest $request, Payment $payment) public function show(ShowPaymentRequest $request, Payment $payment)
{ {
return $this->itemResponse($payment); return $this->itemResponse($payment);
} }
/** /**
@ -364,9 +352,7 @@ class PaymentController extends BaseController
*/ */
public function edit(EditPaymentRequest $request, Payment $payment) public function edit(EditPaymentRequest $request, Payment $payment)
{ {
return $this->itemResponse($payment); return $this->itemResponse($payment);
} }
/** /**
@ -423,11 +409,12 @@ class PaymentController extends BaseController
*/ */
public function update(UpdatePaymentRequest $request, Payment $payment) public function update(UpdatePaymentRequest $request, Payment $payment)
{ {
if($request->entityIsDeleted($payment))
return $request->disallowUpdate();
$payment = $this->payment_repo->save(request(), $payment); $payment = $this->payment_repo->save(request(), $payment);
return $this->itemResponse($payment); return $this->itemResponse($payment);
} }
/** /**
@ -483,7 +470,6 @@ class PaymentController extends BaseController
*/ */
public function destroy(DestroyPaymentRequest $request, Payment $payment) public function destroy(DestroyPaymentRequest $request, Payment $payment)
{ {
ReverseInvoicePayment::dispatchNow($payment, $payment->company); ReverseInvoicePayment::dispatchNow($payment, $payment->company);
$payment->is_deleted = true; $payment->is_deleted = true;
@ -491,7 +477,6 @@ class PaymentController extends BaseController
$payment->delete(); $payment->delete();
return $this->itemResponse($payment); return $this->itemResponse($payment);
} }
/** /**
@ -549,22 +534,19 @@ class PaymentController extends BaseController
*/ */
public function bulk() public function bulk()
{ {
$action = request()->input('action'); $action = request()->input('action');
$ids = request()->input('ids'); $ids = request()->input('ids');
$payments = Payment::withTrashed()->find($this->transformKeys($ids)); $payments = Payment::withTrashed()->find($this->transformKeys($ids));
$payments->each(function ($payment, $key) use($action){ $payments->each(function ($payment, $key) use ($action) {
if (auth()->user()->can('edit', $payment)) {
if(auth()->user()->can('edit', $payment))
$this->payment_repo->{$action}($payment); $this->payment_repo->{$action}($payment);
}
}); });
return $this->listResponse(Payment::withTrashed()->whereIn('id', $this->transformKeys($ids))); return $this->listResponse(Payment::withTrashed()->whereIn('id', $this->transformKeys($ids)));
} }
/** /**
@ -638,7 +620,6 @@ class PaymentController extends BaseController
*/ */
public function action(ActionPaymentRequest $request, Payment $payment, $action) public function action(ActionPaymentRequest $request, Payment $payment, $action)
{ {
switch ($action) { switch ($action) {
case 'clone_to_invoice': case 'clone_to_invoice':
//$payment = CloneInvoiceFactory::create($payment, auth()->user()->id); //$payment = CloneInvoiceFactory::create($payment, auth()->user()->id);
@ -672,5 +653,4 @@ class PaymentController extends BaseController
break; break;
} }
} }
} }

View File

@ -27,7 +27,6 @@ use Illuminate\Http\Request;
class ProductController extends BaseController class ProductController extends BaseController
{ {
use MakesHash; use MakesHash;
protected $entity_type = Product::class; protected $entity_type = Product::class;
@ -36,12 +35,11 @@ class ProductController extends BaseController
protected $product_repo; protected $product_repo;
/** /**
* ProductController constructor. * ProductController constructor.
*/ */
public function __construct(ProductRepository $product_repo) public function __construct(ProductRepository $product_repo)
{ {
parent::__construct(); parent::__construct();
$this->product_repo = $product_repo; $this->product_repo = $product_repo;
@ -86,11 +84,9 @@ class ProductController extends BaseController
*/ */
public function index(ProductFilters $filters) public function index(ProductFilters $filters)
{ {
$products = Product::filter($filters); $products = Product::filter($filters);
return $this->listResponse($products); return $this->listResponse($products);
} }
@ -349,6 +345,10 @@ class ProductController extends BaseController
*/ */
public function update(UpdateProductRequest $request, Product $product) public function update(UpdateProductRequest $request, Product $product)
{ {
if($request->entityIsDeleted($product))
return $request->disallowUpdate();
$product = $this->product_repo->save($request, $product); $product = $this->product_repo->save($request, $product);
return $this->itemResponse($product); return $this->itemResponse($product);
@ -465,21 +465,18 @@ class ProductController extends BaseController
*/ */
public function bulk() public function bulk()
{ {
$action = request()->input('action'); $action = request()->input('action');
$ids = request()->input('ids'); $ids = request()->input('ids');
$products = Product::withTrashed()->find($this->transformKeys($ids)); $products = Product::withTrashed()->find($this->transformKeys($ids));
$products->each(function ($product, $key) use($action){ $products->each(function ($product, $key) use ($action) {
if (auth()->user()->can('edit', $product)) {
if(auth()->user()->can('edit', $product))
$this->product_repo->{$action}($product); $this->product_repo->{$action}($product);
}
}); });
return $this->listResponse(Product::withTrashed()->whereIn('id', $this->transformKeys($ids))); return $this->listResponse(Product::withTrashed()->whereIn('id', $this->transformKeys($ids)));
} }
} }

View File

@ -33,7 +33,6 @@ use Illuminate\Http\Request;
class QuoteController extends BaseController class QuoteController extends BaseController
{ {
use MakesHash; use MakesHash;
protected $entity_type = Quote::class; protected $entity_type = Quote::class;
@ -54,11 +53,9 @@ class QuoteController extends BaseController
*/ */
public function __construct(QuoteRepository $quote_repo) public function __construct(QuoteRepository $quote_repo)
{ {
parent::__construct(); parent::__construct();
$this->quote_repo = $quote_repo; $this->quote_repo = $quote_repo;
} }
/** /**
@ -104,7 +101,6 @@ class QuoteController extends BaseController
public function index(QuoteFilters $filters) public function index(QuoteFilters $filters)
{ {
$quotes = Quote::filter($filters); $quotes = Quote::filter($filters);
return $this->listResponse($quotes); return $this->listResponse($quotes);
@ -151,11 +147,9 @@ class QuoteController extends BaseController
*/ */
public function create(CreateQuoteRequest $request) public function create(CreateQuoteRequest $request)
{ {
$quote = QuoteFactory::create(auth()->user()->company()->id, auth()->user()->id); $quote = QuoteFactory::create(auth()->user()->company()->id, auth()->user()->id);
return $this->itemResponse($quote); return $this->itemResponse($quote);
} }
/** /**
@ -201,11 +195,9 @@ class QuoteController extends BaseController
*/ */
public function store(StoreQuoteRequest $request) public function store(StoreQuoteRequest $request)
{ {
$quote = $this->quote_repo->save($request->all(), QuoteFactory::create(auth()->user()->company()->id, auth()->user()->id)); $quote = $this->quote_repo->save($request->all(), QuoteFactory::create(auth()->user()->company()->id, auth()->user()->id));
return $this->itemResponse($quote); return $this->itemResponse($quote);
} }
/** /**
@ -262,9 +254,7 @@ class QuoteController extends BaseController
*/ */
public function show(ShowQuoteRequest $request, Quote $quote) public function show(ShowQuoteRequest $request, Quote $quote)
{ {
return $this->itemResponse($quote); return $this->itemResponse($quote);
} }
/** /**
@ -321,9 +311,7 @@ class QuoteController extends BaseController
*/ */
public function edit(EditQuoteRequest $request, Quote $quote) public function edit(EditQuoteRequest $request, Quote $quote)
{ {
return $this->itemResponse($quote); return $this->itemResponse($quote);
} }
/** /**
@ -380,11 +368,12 @@ class QuoteController extends BaseController
*/ */
public function update(UpdateQuoteRequest $request, Quote $quote) public function update(UpdateQuoteRequest $request, Quote $quote)
{ {
if($request->entityIsDeleted($quote))
return $request->disallowUpdate();
$quote = $this->quote_repo->save($request->all(), $quote); $quote = $this->quote_repo->save($request->all(), $quote);
return $this->itemResponse($quote); return $this->itemResponse($quote);
} }
/** /**
@ -440,11 +429,9 @@ class QuoteController extends BaseController
*/ */
public function destroy(DestroyQuoteRequest $request, Quote $quote) public function destroy(DestroyQuoteRequest $request, Quote $quote)
{ {
$quote->delete(); $quote->delete();
return response()->json([], 200); return response()->json([], 200);
} }
/** /**
@ -502,22 +489,19 @@ class QuoteController extends BaseController
*/ */
public function bulk() public function bulk()
{ {
$action = request()->input('action'); $action = request()->input('action');
$ids = request()->input('ids'); $ids = request()->input('ids');
$quotes = Quote::withTrashed()->find($this->transformKeys($ids)); $quotes = Quote::withTrashed()->find($this->transformKeys($ids));
$quotes->each(function ($quote, $key) use($action){ $quotes->each(function ($quote, $key) use ($action) {
if (auth()->user()->can('edit', $quote)) {
if(auth()->user()->can('edit', $quote))
$this->quote_repo->{$action}($quote); $this->quote_repo->{$action}($quote);
}
}); });
return $this->listResponse(Quote::withTrashed()->whereIn('id', $this->transformKeys($ids))); return $this->listResponse(Quote::withTrashed()->whereIn('id', $this->transformKeys($ids)));
} }
/** /**
@ -592,7 +576,6 @@ class QuoteController extends BaseController
*/ */
public function action(ActionQuoteRequest $request, Quote $quote, $action) public function action(ActionQuoteRequest $request, Quote $quote, $action)
{ {
switch ($action) { switch ($action) {
case 'clone_to_invoice': case 'clone_to_invoice':
//$quote = CloneInvoiceFactory::create($quote, auth()->user()->id); //$quote = CloneInvoiceFactory::create($quote, auth()->user()->id);
@ -623,12 +606,11 @@ class QuoteController extends BaseController
return $this->listResponse($quote); return $this->listResponse($quote);
break; break;
case 'email': case 'email':
return response()->json(['message'=>'email sent'],200); return response()->json(['message'=>'email sent'], 200);
break; break;
default: default:
return response()->json(['message' => "The requested action `{$action}` is not available."],400); return response()->json(['message' => "The requested action `{$action}` is not available."], 400);
break; break;
} }
} }
} }

View File

@ -38,7 +38,6 @@ use Illuminate\Support\Facades\Log;
class RecurringInvoiceController extends BaseController class RecurringInvoiceController extends BaseController
{ {
use MakesHash; use MakesHash;
protected $entity_type = RecurringInvoice::class; protected $entity_type = RecurringInvoice::class;
@ -59,11 +58,9 @@ class RecurringInvoiceController extends BaseController
*/ */
public function __construct(RecurringInvoiceRepository $recurring_invoice_repo) public function __construct(RecurringInvoiceRepository $recurring_invoice_repo)
{ {
parent::__construct(); parent::__construct();
$this->recurring_invoice_repo = $recurring_invoice_repo; $this->recurring_invoice_repo = $recurring_invoice_repo;
} }
/** /**
@ -110,11 +107,9 @@ class RecurringInvoiceController extends BaseController
*/ */
public function index(RecurringInvoiceFilters $filters) public function index(RecurringInvoiceFilters $filters)
{ {
$recurring_invoices = RecurringInvoice::filter($filters); $recurring_invoices = RecurringInvoice::filter($filters);
return $this->listResponse($recurring_invoices); return $this->listResponse($recurring_invoices);
} }
/** /**
@ -160,11 +155,9 @@ class RecurringInvoiceController extends BaseController
*/ */
public function create(CreateRecurringInvoiceRequest $request) public function create(CreateRecurringInvoiceRequest $request)
{ {
$recurring_invoice = RecurringInvoiceFactory::create(auth()->user()->company()->id, auth()->user()->id); $recurring_invoice = RecurringInvoiceFactory::create(auth()->user()->company()->id, auth()->user()->id);
return $this->itemResponse($recurring_invoice); return $this->itemResponse($recurring_invoice);
} }
@ -211,11 +204,9 @@ class RecurringInvoiceController extends BaseController
*/ */
public function store(StoreRecurringInvoiceRequest $request) public function store(StoreRecurringInvoiceRequest $request)
{ {
$recurring_invoice = $this->recurring_invoice_repo->save($request->all(), RecurringInvoiceFactory::create(auth()->user()->company()->id, auth()->user()->id)); $recurring_invoice = $this->recurring_invoice_repo->save($request->all(), RecurringInvoiceFactory::create(auth()->user()->company()->id, auth()->user()->id));
return $this->itemResponse($recurring_invoice); return $this->itemResponse($recurring_invoice);
} }
/** /**
@ -272,9 +263,7 @@ class RecurringInvoiceController extends BaseController
*/ */
public function show(ShowRecurringInvoiceRequest $request, RecurringInvoice $recurring_invoice) public function show(ShowRecurringInvoiceRequest $request, RecurringInvoice $recurring_invoice)
{ {
return $this->itemResponse($recurring_invoice); return $this->itemResponse($recurring_invoice);
} }
/** /**
@ -331,9 +320,7 @@ class RecurringInvoiceController extends BaseController
*/ */
public function edit(EditRecurringInvoiceRequest $request, RecurringInvoice $recurring_invoice) public function edit(EditRecurringInvoiceRequest $request, RecurringInvoice $recurring_invoice)
{ {
return $this->itemResponse($recurring_invoice); return $this->itemResponse($recurring_invoice);
} }
/** /**
@ -390,11 +377,12 @@ class RecurringInvoiceController extends BaseController
*/ */
public function update(UpdateRecurringInvoiceRequest $request, RecurringInvoice $recurring_invoice) public function update(UpdateRecurringInvoiceRequest $request, RecurringInvoice $recurring_invoice)
{ {
if($request->entityIsDeleted($recurring_invoice))
return $request->disallowUpdate();
$recurring_invoice = $this->recurring_invoice_repo->save($request->all(), $recurring_invoice); $recurring_invoice = $this->recurring_invoice_repo->save($request->all(), $recurring_invoice);
return $this->itemResponse($recurring_invoice); return $this->itemResponse($recurring_invoice);
} }
/** /**
@ -450,11 +438,9 @@ class RecurringInvoiceController extends BaseController
*/ */
public function destroy(DestroyRecurringInvoiceRequest $request, RecurringInvoice $recurring_invoice) public function destroy(DestroyRecurringInvoiceRequest $request, RecurringInvoice $recurring_invoice)
{ {
$recurring_invoice->delete(); $recurring_invoice->delete();
return response()->json([], 200); return response()->json([], 200);
} }
/** /**
@ -512,22 +498,19 @@ class RecurringInvoiceController extends BaseController
*/ */
public function bulk() public function bulk()
{ {
$action = request()->input('action'); $action = request()->input('action');
$ids = request()->input('ids'); $ids = request()->input('ids');
$recurring_invoices = RecurringInvoice::withTrashed()->find($this->transformKeys($ids)); $recurring_invoices = RecurringInvoice::withTrashed()->find($this->transformKeys($ids));
$recurring_invoices->each(function ($recurring_invoice, $key) use($action){ $recurring_invoices->each(function ($recurring_invoice, $key) use ($action) {
if (auth()->user()->can('edit', $recurring_invoice)) {
if(auth()->user()->can('edit', $recurring_invoice))
$this->recurring_invoice_repo->{$action}($recurring_invoice); $this->recurring_invoice_repo->{$action}($recurring_invoice);
}
}); });
return $this->listResponse(RecurringInvoice::withTrashed()->whereIn('id', $this->transformKeys($ids))); return $this->listResponse(RecurringInvoice::withTrashed()->whereIn('id', $this->transformKeys($ids)));
} }
/** /**
@ -602,7 +585,6 @@ class RecurringInvoiceController extends BaseController
public function action(ActionRecurringInvoiceRequest $request, RecurringInvoice $recurring_invoice, $action) public function action(ActionRecurringInvoiceRequest $request, RecurringInvoice $recurring_invoice, $action)
{ {
switch ($action) { switch ($action) {
case 'clone_to_RecurringInvoice': case 'clone_to_RecurringInvoice':
// $recurring_invoice = CloneRecurringInvoiceFactory::create($recurring_invoice, auth()->user()->id); // $recurring_invoice = CloneRecurringInvoiceFactory::create($recurring_invoice, auth()->user()->id);
@ -636,5 +618,4 @@ class RecurringInvoiceController extends BaseController
break; break;
} }
} }
} }

View File

@ -38,7 +38,6 @@ use Illuminate\Support\Facades\Log;
class RecurringQuoteController extends BaseController class RecurringQuoteController extends BaseController
{ {
use MakesHash; use MakesHash;
protected $entity_type = RecurringQuote::class; protected $entity_type = RecurringQuote::class;
@ -59,11 +58,9 @@ class RecurringQuoteController extends BaseController
*/ */
public function __construct(RecurringQuoteRepository $recurring_quote_repo) public function __construct(RecurringQuoteRepository $recurring_quote_repo)
{ {
parent::__construct(); parent::__construct();
$this->recurring_quote_repo = $recurring_quote_repo; $this->recurring_quote_repo = $recurring_quote_repo;
} }
/** /**
@ -110,11 +107,9 @@ class RecurringQuoteController extends BaseController
*/ */
public function index(RecurringQuoteFilters $filters) public function index(RecurringQuoteFilters $filters)
{ {
$recurring_quotes = RecurringQuote::filter($filters); $recurring_quotes = RecurringQuote::filter($filters);
return $this->listResponse($recurring_quotes); return $this->listResponse($recurring_quotes);
} }
/** /**
@ -159,11 +154,9 @@ class RecurringQuoteController extends BaseController
*/ */
public function create(CreateRecurringQuoteRequest $request) public function create(CreateRecurringQuoteRequest $request)
{ {
$recurring_quote = RecurringQuoteFactory::create(auth()->user()->company()->id, auth()->user()->id); $recurring_quote = RecurringQuoteFactory::create(auth()->user()->company()->id, auth()->user()->id);
return $this->itemResponse($recurring_quote); return $this->itemResponse($recurring_quote);
} }
@ -209,11 +202,9 @@ class RecurringQuoteController extends BaseController
*/ */
public function store(StoreRecurringQuoteRequest $request) public function store(StoreRecurringQuoteRequest $request)
{ {
$recurring_quote = $this->recurring_quote_repo->save($request, RecurringQuoteFactory::create(auth()->user()->company()->id, auth()->user()->id)); $recurring_quote = $this->recurring_quote_repo->save($request, RecurringQuoteFactory::create(auth()->user()->company()->id, auth()->user()->id));
return $this->itemResponse($recurring_quote); return $this->itemResponse($recurring_quote);
} }
/** /**
@ -270,9 +261,7 @@ class RecurringQuoteController extends BaseController
*/ */
public function show(ShowRecurringQuoteRequest $request, RecurringQuote $recurring_quote) public function show(ShowRecurringQuoteRequest $request, RecurringQuote $recurring_quote)
{ {
return $this->itemResponse($recurring_quote); return $this->itemResponse($recurring_quote);
} }
/** /**
@ -329,9 +318,7 @@ class RecurringQuoteController extends BaseController
*/ */
public function edit(EditRecurringQuoteRequest $request, RecurringQuote $recurring_quote) public function edit(EditRecurringQuoteRequest $request, RecurringQuote $recurring_quote)
{ {
return $this->itemResponse($recurring_quote); return $this->itemResponse($recurring_quote);
} }
/** /**
@ -389,10 +376,12 @@ class RecurringQuoteController extends BaseController
public function update(UpdateRecurringQuoteRequest $request, RecurringQuote $recurring_quote) public function update(UpdateRecurringQuoteRequest $request, RecurringQuote $recurring_quote)
{ {
if($request->entityIsDeleted($recurring_quote))
return $request->disallowUpdate();
$recurring_quote = $this->recurring_quote_repo->save(request(), $recurring_quote); $recurring_quote = $this->recurring_quote_repo->save(request(), $recurring_quote);
return $this->itemResponse($recurring_quote); return $this->itemResponse($recurring_quote);
} }
/** /**
@ -448,11 +437,9 @@ class RecurringQuoteController extends BaseController
*/ */
public function destroy(DestroyRecurringQuoteRequest $request, RecurringQuote $recurring_quote) public function destroy(DestroyRecurringQuoteRequest $request, RecurringQuote $recurring_quote)
{ {
$recurring_quote->delete(); $recurring_quote->delete();
return response()->json([], 200); return response()->json([], 200);
} }
/** /**
@ -510,22 +497,19 @@ class RecurringQuoteController extends BaseController
*/ */
public function bulk() public function bulk()
{ {
$action = request()->input('action'); $action = request()->input('action');
$ids = request()->input('ids'); $ids = request()->input('ids');
$recurring_quotes = RecurringQuote::withTrashed()->find($this->transformKeys($ids)); $recurring_quotes = RecurringQuote::withTrashed()->find($this->transformKeys($ids));
$recurring_quotes->each(function ($recurring_quote, $key) use($action){ $recurring_quotes->each(function ($recurring_quote, $key) use ($action) {
if (auth()->user()->can('edit', $recurring_quote)) {
if(auth()->user()->can('edit', $recurring_quote))
$this->recurring_quote_repo->{$action}($recurring_quote); $this->recurring_quote_repo->{$action}($recurring_quote);
}
}); });
return $this->listResponse(RecurringQuote::withTrashed()->whereIn('id', $this->transformKeys($ids))); return $this->listResponse(RecurringQuote::withTrashed()->whereIn('id', $this->transformKeys($ids)));
} }
/** /**
@ -600,7 +584,6 @@ class RecurringQuoteController extends BaseController
*/ */
public function action(ActionRecurringQuoteRequest $request, RecurringQuote $recurring_quote, $action) public function action(ActionRecurringQuoteRequest $request, RecurringQuote $recurring_quote, $action)
{ {
switch ($action) { switch ($action) {
case 'clone_to_RecurringQuote': case 'clone_to_RecurringQuote':
// $recurring_invoice = CloneRecurringQuoteFactory::create($recurring_invoice, auth()->user()->id); // $recurring_invoice = CloneRecurringQuoteFactory::create($recurring_invoice, auth()->user()->id);
@ -634,5 +617,4 @@ class RecurringQuoteController extends BaseController
break; break;
} }
} }
} }

View File

@ -21,9 +21,7 @@ class SettingsController extends BaseController
{ {
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
} }
/** /**

View File

@ -76,5 +76,4 @@ class SendingController extends Controller
'success' => true 'success' => true
]); ]);
} }
} }

View File

@ -28,7 +28,6 @@ use Illuminate\Http\Request;
*/ */
class TaxRateController extends BaseController class TaxRateController extends BaseController
{ {
protected $entity_type = TaxRate::class; protected $entity_type = TaxRate::class;
protected $entity_transformer = TaxRateTransformer::class; protected $entity_transformer = TaxRateTransformer::class;
@ -36,7 +35,6 @@ class TaxRateController extends BaseController
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
} }
/** /**
@ -122,7 +120,6 @@ class TaxRateController extends BaseController
{ {
$tax_rate = TaxRateFactory::create(auth()->user()->company()->id, auth()->user()->id); $tax_rate = TaxRateFactory::create(auth()->user()->company()->id, auth()->user()->id);
return $this->itemResponse($tax_rate); return $this->itemResponse($tax_rate);
} }
/** /**
@ -305,7 +302,6 @@ class TaxRateController extends BaseController
$tax_rate->save(); $tax_rate->save();
return $this->itemResponse($tax_rate); return $this->itemResponse($tax_rate);
} }
/** /**
@ -361,6 +357,5 @@ class TaxRateController extends BaseController
$tax_rate->delete(); $tax_rate->delete();
return response()->json([], 200); return response()->json([], 200);
} }
} }

View File

@ -15,11 +15,9 @@ use Parsedown;
class TemplateController extends BaseController class TemplateController extends BaseController
{ {
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
} }
/** /**
@ -100,12 +98,9 @@ class TemplateController extends BaseController
*/ */
public function show() public function show()
{ {
if (request()->has('entity') && request()->has('entity_id')) {
if(request()->has('entity') && request()->has('entity_id')){
$class = 'App\Models\\'.ucfirst(request()->input('entity')); $class = 'App\Models\\'.ucfirst(request()->input('entity'));
$entity_obj = $class::whereId(request()->input('entity_id'))->company()->first(); $entity_obj = $class::whereId(request()->input('entity_id'))->company()->first();
} }
$subject = request()->input('subject'); $subject = request()->input('subject');
@ -117,7 +112,5 @@ class TemplateController extends BaseController
]; ];
return response()->json($data, 200); return response()->json($data, 200);
} }
} }

View File

@ -31,20 +31,17 @@ trait VerifiesUserEmail
{ {
//$user = User::where('confirmation_code', $code)->first(); //$user = User::where('confirmation_code', $code)->first();
if ($user = User::whereRaw("BINARY `confirmation_code`= ?",$code)->first()) { if ($user = User::whereRaw("BINARY `confirmation_code`= ?", $code)->first()) {
$user->email_verified_at = now(); $user->email_verified_at = now();
$user->confirmation_code = null; $user->confirmation_code = null;
$user->save(); $user->save();
return response()->json(['message' => ctrans('texts.security_confirmation')]); return response()->json(['message' => ctrans('texts.security_confirmation')]);
//return redirect()->route('dashboard.index')->with('message', ctrans('texts.security_confirmation')); //return redirect()->route('dashboard.index')->with('message', ctrans('texts.security_confirmation'));
} }
return response()->json(['message' => ctrans('texts.wrong_confirmation')]); return response()->json(['message' => ctrans('texts.wrong_confirmation')]);
//return redirect()->route('login')->with('message', ctrans('texts.wrong_confirmation')); //return redirect()->route('login')->with('message', ctrans('texts.wrong_confirmation'));
} }
} }

View File

@ -22,9 +22,7 @@ class TranslationController extends BaseController
{ {
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
} }
/** /**
@ -53,7 +51,8 @@ class TranslationController extends BaseController
exit(); exit();
} }
private function easyMinify($javascript){ private function easyMinify($javascript)
{
return preg_replace(array("/\s+\n/", "/\n\s+/", "/ +/"), array("\n", "\n ", " "), $javascript); return preg_replace(array("/\s+\n/", "/\n\s+/", "/ +/"), array("\n", "\n ", " "), $javascript);
} }

View File

@ -40,7 +40,7 @@ class UserController extends BaseController
{ {
use VerifiesUserEmail; use VerifiesUserEmail;
use MakesHash; use MakesHash;
protected $entity_type = User::class; protected $entity_type = User::class;
@ -48,18 +48,16 @@ class UserController extends BaseController
protected $user_repo; protected $user_repo;
/** /**
* Constructor * Constructor
* *
* @param \App\Repositories\UserRepository $user_repo The user repo * @param \App\Repositories\UserRepository $user_repo The user repo
*/ */
public function __construct(UserRepository $user_repo) public function __construct(UserRepository $user_repo)
{ {
parent::__construct(); parent::__construct();
$this->user_repo = $user_repo; $this->user_repo = $user_repo;
} }
/** /**
@ -105,11 +103,9 @@ class UserController extends BaseController
public function index(UserFilters $filters) public function index(UserFilters $filters)
{ {
$users = User::filter($filters); $users = User::filter($filters);
return $this->listResponse($users); return $this->listResponse($users);
} }
/** /**
@ -153,11 +149,9 @@ class UserController extends BaseController
*/ */
public function create(CreateUserRequest $request) public function create(CreateUserRequest $request)
{ {
$user = UserFactory::create(); $user = UserFactory::create();
return $this->itemResponse($user); return $this->itemResponse($user);
} }
/** /**
@ -202,7 +196,6 @@ class UserController extends BaseController
*/ */
public function store(StoreUserRequest $request) public function store(StoreUserRequest $request)
{ {
$company = auth()->user()->company(); $company = auth()->user()->company();
$user = $this->user_repo->save($request->all(), $request->fetchUser()); $user = $this->user_repo->save($request->all(), $request->fetchUser());
@ -212,7 +205,6 @@ class UserController extends BaseController
$ct = CreateCompanyToken::dispatchNow($company, $user, $user_agent); $ct = CreateCompanyToken::dispatchNow($company, $user, $user_agent);
return $this->itemResponse($user->fresh()); return $this->itemResponse($user->fresh());
} }
/** /**
@ -267,9 +259,7 @@ class UserController extends BaseController
*/ */
public function show(ShowUserRequest $request, User $user) public function show(ShowUserRequest $request, User $user)
{ {
return $this->itemResponse($user); return $this->itemResponse($user);
} }
/** /**
@ -324,9 +314,7 @@ class UserController extends BaseController
*/ */
public function edit(EditUserRequest $request, User $user) public function edit(EditUserRequest $request, User $user)
{ {
return $this->itemResponse($user); return $this->itemResponse($user);
} }
/** /**
@ -382,11 +370,9 @@ class UserController extends BaseController
*/ */
public function update(UpdateUserRequest $request, User $user) public function update(UpdateUserRequest $request, User $user)
{ {
$user = $this->user_repo->save($request->all(), $user); $user = $this->user_repo->save($request->all(), $user);
return $this->itemResponse($user); return $this->itemResponse($user);
} }
/** /**
@ -451,11 +437,9 @@ class UserController extends BaseController
*/ */
public function destroy(DestroyUserRequest $request, User $user) public function destroy(DestroyUserRequest $request, User $user)
{ {
$user->delete(); $user->delete();
return response()->json([], 200); return response()->json([], 200);
} }
/** /**
@ -514,22 +498,19 @@ class UserController extends BaseController
*/ */
public function bulk() public function bulk()
{ {
$action = request()->input('action'); $action = request()->input('action');
$ids = request()->input('ids'); $ids = request()->input('ids');
$users = User::withTrashed()->find($this->transformKeys($ids)); $users = User::withTrashed()->find($this->transformKeys($ids));
$users->each(function ($user, $key) use($action){ $users->each(function ($user, $key) use ($action) {
if (auth()->user()->can('edit', $user)) {
if(auth()->user()->can('edit', $user))
$this->user_repo->{$action}($user); $this->user_repo->{$action}($user);
}
}); });
return $this->listResponse(User::withTrashed()->whereIn('id', $this->transformKeys($ids))); return $this->listResponse(User::withTrashed()->whereIn('id', $this->transformKeys($ids)));
} }
@ -587,7 +568,6 @@ class UserController extends BaseController
*/ */
public function attach(AttachCompanyUserRequest $request, User $user) public function attach(AttachCompanyUserRequest $request, User $user)
{ {
$company = auth()->user()->company(); $company = auth()->user()->company();
$user->companies()->attach($company->id, array_merge($request->all(), ['account_id' => $company->account->id])); $user->companies()->attach($company->id, array_merge($request->all(), ['account_id' => $company->account->id]));
@ -595,7 +575,6 @@ class UserController extends BaseController
$ct = CreateCompanyToken::dispatchNow($company, $user, 'User token created by'.auth()->user()->present()->name()); $ct = CreateCompanyToken::dispatchNow($company, $user, 'User token created by'.auth()->user()->present()->name());
return $this->itemResponse($user->fresh()); return $this->itemResponse($user->fresh());
} }
/** /**
@ -652,6 +631,5 @@ class UserController extends BaseController
$company_user->delete(); $company_user->delete();
return response()->json(['message' => 'User detached from company'], 200); return response()->json(['message' => 'User detached from company'], 200);
} }
} }

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