From 980f538e28766ec697630be6250ac1c6d3b94274 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 5 Oct 2021 13:12:21 +1100 Subject: [PATCH 1/6] Fixes for displaying valid credits --- app/Http/Livewire/CreditsTable.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Livewire/CreditsTable.php b/app/Http/Livewire/CreditsTable.php index 2cee74e9f843..a0ab59199612 100644 --- a/app/Http/Livewire/CreditsTable.php +++ b/app/Http/Livewire/CreditsTable.php @@ -41,7 +41,7 @@ class CreditsTable extends Component ->where('status_id', '<>', Credit::STATUS_DRAFT) ->where('is_deleted', 0) ->where(function ($query){ - $query->whereDate('due_date', '<=', now()) + $query->whereDate('due_date', '>=', now()) ->orWhereNull('due_date'); }) ->orderBy($this->sort_field, $this->sort_asc ? 'asc' : 'desc') From 8ce94012fb73c582baa69890a11706858ce87b3d Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 5 Oct 2021 13:49:15 +1100 Subject: [PATCH 2/6] Credits fix --- app/Http/Livewire/CreditsTable.php | 3 ++- tests/Feature/ClientPortal/CreditsTest.php | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/app/Http/Livewire/CreditsTable.php b/app/Http/Livewire/CreditsTable.php index a0ab59199612..e756de8d4f76 100644 --- a/app/Http/Livewire/CreditsTable.php +++ b/app/Http/Livewire/CreditsTable.php @@ -42,7 +42,8 @@ class CreditsTable extends Component ->where('is_deleted', 0) ->where(function ($query){ $query->whereDate('due_date', '>=', now()) - ->orWhereNull('due_date'); + ->orWhereNull('due_date') + ->orWhere('due_date', '=', ''); }) ->orderBy($this->sort_field, $this->sort_asc ? 'asc' : 'desc') ->withTrashed() diff --git a/tests/Feature/ClientPortal/CreditsTest.php b/tests/Feature/ClientPortal/CreditsTest.php index 6b20980a450a..37c15613397b 100644 --- a/tests/Feature/ClientPortal/CreditsTest.php +++ b/tests/Feature/ClientPortal/CreditsTest.php @@ -93,9 +93,9 @@ class CreditsTest extends TestCase $this->actingAs($client->contacts->first(), 'contact'); Livewire::test(CreditsTable::class, ['company' => $company]) - ->assertSee('testing-number-01') + ->assertDontSee('testing-number-01') ->assertSee('testing-number-02') - ->assertDontSee('testing-number-03'); + ->assertSee('testing-number-03'); } public function testShowingCreditsWithNullDueDate() @@ -122,6 +122,7 @@ class CreditsTest extends TestCase 'client_id' => $client->id, 'number' => 'testing-number-01', 'status_id' => Credit::STATUS_SENT, + 'due_date' => null, ]); Credit::factory()->create([ @@ -142,12 +143,21 @@ class CreditsTest extends TestCase 'status_id' => Credit::STATUS_SENT, ]); + Credit::factory()->create([ + 'user_id' => $user->id, + 'company_id' => $company->id, + 'client_id' => $client->id, + 'number' => 'testing-number-04', + 'due_date' => '', + 'status_id' => Credit::STATUS_SENT, + ]); + $this->actingAs($client->contacts->first(), 'contact'); Livewire::test(CreditsTable::class, ['company' => $company]) ->assertSee('testing-number-01') ->assertSee('testing-number-02') - ->assertDontSee('testing-number-03'); + ->assertSee('testing-number-03'); } } From 2d791f26b7d9d8187e3f2ff7776306bbe5698245 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 5 Oct 2021 15:20:44 +1100 Subject: [PATCH 3/6] Remove checks for send_email --- .../ClientPortal/InvitationController.php | 6 ++++++ app/Http/Controllers/EmailController.php | 2 +- app/Jobs/RecurringInvoice/SendRecurring.php | 14 +++++++------- app/PaymentDrivers/BaseDriver.php | 4 ++-- app/Services/Credit/SendEmail.php | 2 +- app/Services/Invoice/SendEmail.php | 2 +- app/Services/Payment/SendEmail.php | 2 +- app/Services/Quote/SendEmail.php | 2 +- 8 files changed, 20 insertions(+), 14 deletions(-) diff --git a/app/Http/Controllers/ClientPortal/InvitationController.php b/app/Http/Controllers/ClientPortal/InvitationController.php index 97e57262112d..99a0c1a39bcb 100644 --- a/app/Http/Controllers/ClientPortal/InvitationController.php +++ b/app/Http/Controllers/ClientPortal/InvitationController.php @@ -65,6 +65,9 @@ class InvitationController extends Controller private function genericRouter(string $entity, string $invitation_key) { + if(!in_array($entity, ['invoice', 'credit', 'quote', 'recurring_invoice'])) + return response()->json(['message' => 'Invalid resource request']); + $key = $entity.'_id'; $entity_obj = 'App\Models\\'.ucfirst(Str::camel($entity)).'Invitation'; @@ -133,6 +136,9 @@ class InvitationController extends Controller private function returnRawPdf(string $entity, string $invitation_key) { + if(!in_array($entity, ['invoice', 'credit', 'quote', 'recurring_invoice'])) + return response()->json(['message' => 'Invalid resource request']); + $key = $entity.'_id'; $entity_obj = 'App\Models\\'.ucfirst(Str::camel($entity)).'Invitation'; diff --git a/app/Http/Controllers/EmailController.php b/app/Http/Controllers/EmailController.php index bedd150153d3..faeda280f0b4 100644 --- a/app/Http/Controllers/EmailController.php +++ b/app/Http/Controllers/EmailController.php @@ -127,7 +127,7 @@ class EmailController extends BaseController $entity_obj->invitations->each(function ($invitation) use ($data, $entity_string, $entity_obj, $template) { - if (!$invitation->contact->trashed() && $invitation->contact->send_email && $invitation->contact->email) { + if (!$invitation->contact->trashed() && $invitation->contact->email) { $entity_obj->service()->markSent()->save(); diff --git a/app/Jobs/RecurringInvoice/SendRecurring.php b/app/Jobs/RecurringInvoice/SendRecurring.php index df7d0dcc40bb..878db0fd8b2c 100644 --- a/app/Jobs/RecurringInvoice/SendRecurring.php +++ b/app/Jobs/RecurringInvoice/SendRecurring.php @@ -59,15 +59,15 @@ class SendRecurring implements ShouldQueue public function handle() : void { //reset all contacts here - $this->recurring_invoice->client->contacts()->update(['send_email' => false]); + // $this->recurring_invoice->client->contacts()->update(['send_email' => false]); - $this->recurring_invoice->invitations->each(function ($invitation){ + // $this->recurring_invoice->invitations->each(function ($invitation){ - $contact = $invitation->contact; - $contact->send_email = true; - $contact->save(); + // $contact = $invitation->contact; + // $contact->send_email = true; + // $contact->save(); - }); + // }); // Generate Standard Invoice $invoice = RecurringInvoiceToInvoiceFactory::create($this->recurring_invoice, $this->recurring_invoice->client); @@ -153,7 +153,7 @@ class SendRecurring implements ShouldQueue } //important catch all here - we should never leave contacts send_email to false incase they are permanently set to false in the future. - $this->recurring_invoice->client->contacts()->update(['send_email' => true]); + // $this->recurring_invoice->client->contacts()->update(['send_email' => true]); } diff --git a/app/PaymentDrivers/BaseDriver.php b/app/PaymentDrivers/BaseDriver.php index eed36b9ff967..2c7141c71c46 100644 --- a/app/PaymentDrivers/BaseDriver.php +++ b/app/PaymentDrivers/BaseDriver.php @@ -395,7 +395,7 @@ class BaseDriver extends AbstractPaymentDriver $invoices->first()->invitations->each(function ($invitation) use ($nmo) { - if ($invitation->contact->send_email && $invitation->contact->email) { + if ($invitation->contact->email) { $nmo->to_user = $invitation->contact; NinjaMailerJob::dispatch($nmo); @@ -459,7 +459,7 @@ class BaseDriver extends AbstractPaymentDriver $invoices->first()->invitations->each(function ($invitation) use ($nmo){ - if (!$invitation->contact->trashed() && $invitation->contact->send_email && $invitation->contact->email) { + if (!$invitation->contact->trashed() && $invitation->contact->email) { $nmo->to_user = $invitation->contact; NinjaMailerJob::dispatch($nmo); diff --git a/app/Services/Credit/SendEmail.php b/app/Services/Credit/SendEmail.php index 55599323f139..03e4d9b7b127 100644 --- a/app/Services/Credit/SendEmail.php +++ b/app/Services/Credit/SendEmail.php @@ -44,7 +44,7 @@ class SendEmail } $this->credit->invitations->each(function ($invitation) { - if (!$invitation->contact->trashed() && $invitation->contact->send_email && $invitation->contact->email) { + if (!$invitation->contact->trashed() && $invitation->contact->email) { $email_builder = (new CreditEmail())->build($invitation, $this->reminder_template); // EmailCredit::dispatchNow($email_builder, $invitation, $invitation->company); diff --git a/app/Services/Invoice/SendEmail.php b/app/Services/Invoice/SendEmail.php index f96b95cbaabc..3b0fc8bbdd98 100644 --- a/app/Services/Invoice/SendEmail.php +++ b/app/Services/Invoice/SendEmail.php @@ -44,7 +44,7 @@ class SendEmail extends AbstractService } $this->invoice->invitations->each(function ($invitation) { - if (!$invitation->contact->trashed() && $invitation->contact->send_email && $invitation->contact->email) { + if (!$invitation->contact->trashed() && $invitation->contact->email) { EmailEntity::dispatchNow($invitation, $invitation->company, $this->reminder_template); } }); diff --git a/app/Services/Payment/SendEmail.php b/app/Services/Payment/SendEmail.php index 99f1ae45664c..19702b631738 100644 --- a/app/Services/Payment/SendEmail.php +++ b/app/Services/Payment/SendEmail.php @@ -33,7 +33,7 @@ class SendEmail public function run() { $this->payment->client->contacts->each(function ($contact) { - if ($contact->send_email && $contact->email) { + if ($contact->email) { EmailPayment::dispatchNow($this->payment, $this->payment->company, $contact); } }); diff --git a/app/Services/Quote/SendEmail.php b/app/Services/Quote/SendEmail.php index 8fb1c30024a0..7903f9b28b24 100644 --- a/app/Services/Quote/SendEmail.php +++ b/app/Services/Quote/SendEmail.php @@ -42,7 +42,7 @@ class SendEmail } $this->quote->invitations->each(function ($invitation) { - if (!$invitation->contact->trashed() && $invitation->contact->send_email && $invitation->contact->email) { + if (!$invitation->contact->trashed() && $invitation->contact->email) { EmailEntity::dispatchNow($invitation, $invitation->company, $this->reminder_template); } }); From 81772cd3e8fc7120ff598762c5fd5aca64f133e5 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Tue, 5 Oct 2021 21:29:32 +1100 Subject: [PATCH 4/6] Pay Now Link --- .../Controllers/ClientPortal/InvitationController.php | 9 +++++++++ routes/client.php | 1 + 2 files changed, 10 insertions(+) diff --git a/app/Http/Controllers/ClientPortal/InvitationController.php b/app/Http/Controllers/ClientPortal/InvitationController.php index 99a0c1a39bcb..5deddc23ffa4 100644 --- a/app/Http/Controllers/ClientPortal/InvitationController.php +++ b/app/Http/Controllers/ClientPortal/InvitationController.php @@ -19,6 +19,7 @@ use App\Http\Controllers\Controller; use App\Jobs\Entity\CreateRawPdf; use App\Models\Client; use App\Models\ClientContact; +use App\Models\InvoiceInvitation; use App\Models\Payment; use App\Utils\Ninja; use App\Utils\Traits\MakesDates; @@ -187,4 +188,12 @@ class InvitationController extends Controller return redirect()->route('client.payments.show', $payment->hashed_id); } + + public function payInvoice(string $invitation_key) + { + $invitation = InvoiceInvitation::where('key', $invitation_key) + ->with('contact.client') + ->firstOrFail(); + + } } diff --git a/routes/client.php b/routes/client.php index c824bbe303c9..ebc44c1a3f5c 100644 --- a/routes/client.php +++ b/routes/client.php @@ -103,6 +103,7 @@ Route::group(['middleware' => ['invite_db'], 'prefix' => 'client', 'as' => 'clie Route::get('quote/{invitation_key}/download_pdf', 'QuoteController@downloadPdf')->name('quote.download_invitation_key'); Route::get('credit/{invitation_key}/download_pdf', 'CreditController@downloadPdf')->name('credit.download_invitation_key'); Route::get('{entity}/{invitation_key}/download', 'ClientPortal\InvitationController@routerForDownload'); + Route::get('pay/{invitation_key}', 'ClientPortal\InvitationController@payInvoice')->name('pay.invoice'); // Route::get('{entity}/{client_hash}/{invitation_key}', 'ClientPortal\InvitationController@routerForIframe')->name('invoice.client_hash_and_invitation_key'); //should never need this }); From aae78bce2a1e5502fb95c04943bb4f198d27b693 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 6 Oct 2021 04:39:09 +1100 Subject: [PATCH 5/6] Fixes for gross line totals --- app/Utils/Traits/MakesInvoiceValues.php | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/app/Utils/Traits/MakesInvoiceValues.php b/app/Utils/Traits/MakesInvoiceValues.php index d4a6ffca5748..7f8ddf5b9577 100644 --- a/app/Utils/Traits/MakesInvoiceValues.php +++ b/app/Utils/Traits/MakesInvoiceValues.php @@ -270,7 +270,7 @@ trait MakesInvoiceValues if (! is_array($items)) { $data; } - +nlog($items); $locale_info = localeconv(); foreach ($items as $key => $item) { @@ -296,11 +296,7 @@ trait MakesInvoiceValues $data[$key][$table_type.'.notes'] = Helpers::processReservedKeywords($item->notes, $this->client); $data[$key][$table_type.'.description'] = Helpers::processReservedKeywords($item->notes, $this->client); - - /* need to test here as this is new - 18/09/2021*/ - if(!array_key_exists($table_type.'.gross_line_total', $data[$key])) - $data[$key][$table_type.'.gross_line_total'] = 0; - + $data[$key][$table_type . ".{$_table_type}1"] = $helpers->formatCustomFieldValue($this->client->company->custom_fields, "{$_table_type}1", $item->custom_value1, $this->client); $data[$key][$table_type . ".{$_table_type}2"] = $helpers->formatCustomFieldValue($this->client->company->custom_fields, "{$_table_type}2", $item->custom_value2, $this->client); $data[$key][$table_type . ".{$_table_type}3"] = $helpers->formatCustomFieldValue($this->client->company->custom_fields, "{$_table_type}3", $item->custom_value3, $this->client); @@ -314,8 +310,12 @@ trait MakesInvoiceValues $data[$key][$table_type.'.cost'] = Number::formatMoney($item->cost, $this->client); $data[$key][$table_type.'.line_total'] = Number::formatMoney($item->line_total, $this->client); - + if(property_exists($item, 'gross_line_total')) + $data[$key][$table_type.'.gross_line_total'] = Number::formatMoney($item->gross_line_total, $this->client); + else + $data[$key][$table_type.'.gross_line_total'] = 0; + if (isset($item->discount) && $item->discount > 0) { if ($item->is_amount_discount) { $data[$key][$table_type.'.discount'] = Number::formatMoney($item->discount, $this->client); From 9c1f82f632eb6610b57f236d88697086d34b9164 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 6 Oct 2021 09:51:03 +1100 Subject: [PATCH 6/6] Minor fixes for migration --- app/Http/Controllers/MigrationController.php | 46 ++++++++------------ 1 file changed, 19 insertions(+), 27 deletions(-) diff --git a/app/Http/Controllers/MigrationController.php b/app/Http/Controllers/MigrationController.php index d7f1d1ae3463..079cff193794 100644 --- a/app/Http/Controllers/MigrationController.php +++ b/app/Http/Controllers/MigrationController.php @@ -234,21 +234,24 @@ class MigrationController extends BaseController public function startMigration(Request $request) { - // v4 Laravel 6 - - // $companies = []; - - // foreach($request->all() as $input){ - - // if($input instanceof UploadedFile) - // nlog('is file'); - // else - // $companies[] = json_decode($input); - // } - nlog("Starting Migration"); - $companies = json_decode($request->companies,1); + if($request->companies){ + //handle Laravel 5.5 UniHTTP + $companies = json_decode($request->companies,1); + } + else { + //handle Laravel 6 Guzzle + $companies = []; + + foreach($request->all() as $input){ + + if($input instanceof UploadedFile) + nlog('is file'); + else + $companies[] = json_decode($input,1); + } + } if (app()->environment() === 'local') { nlog($request->all()); @@ -267,22 +270,11 @@ class MigrationController extends BaseController foreach($companies as $company) { + if(!is_array($company)) + continue; + $company = (array)$company; - // v4 Laravel 6 - // $input = $request->all(); - - // foreach ($input as $company) { - - // if($company instanceof UploadedFile) - // continue; - // else - // $company = json_decode($company,1); - - // if (!$company || !is_int($company['company_index'] || !$request->file($company['company_index'])->isValid())) { - // continue; - // } - $user = auth()->user(); $company_count = $user->account->companies()->count();