From caa30da38d15a2f22d7229f6ead6de50945a78aa Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 21 Dec 2020 10:11:33 +1100 Subject: [PATCH 1/7] Ignore HTTPS errors in browsershop --- app/Utils/Traits/Pdf/PdfMaker.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Utils/Traits/Pdf/PdfMaker.php b/app/Utils/Traits/Pdf/PdfMaker.php index b3225dc33a1a..422149807cc5 100644 --- a/app/Utils/Traits/Pdf/PdfMaker.php +++ b/app/Utils/Traits/Pdf/PdfMaker.php @@ -51,6 +51,7 @@ trait PdfMaker ->deviceScaleFactor(1) ->waitUntilNetworkIdle(true) ->noSandbox() + ->ignoreHttpsErrors() ->pdf(); } } From bc064764311b29367a861e4aaff3a09914d97cdb Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 21 Dec 2020 10:47:03 +1100 Subject: [PATCH 2/7] Fix for Quote View Activitry --- app/Listeners/Quote/QuoteViewedActivity.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Listeners/Quote/QuoteViewedActivity.php b/app/Listeners/Quote/QuoteViewedActivity.php index e80dfd27e7f4..cdcdd12c1401 100644 --- a/app/Listeners/Quote/QuoteViewedActivity.php +++ b/app/Listeners/Quote/QuoteViewedActivity.php @@ -43,14 +43,14 @@ class QuoteViewedActivity implements ShouldQueue $fields = new stdClass; - $fields->user_id = $event->quote->user_id; - $fields->company_id = $event->quote->company_id; + $fields->user_id = $event->invitation->quote->user_id; + $fields->company_id = $event->invitation->company_id; $fields->activity_type_id = Activity::VIEW_QUOTE; $fields->client_id = $event->invitation->client_id; $fields->client_contact_id = $event->invitation->client_contact_id; $fields->invitation_id = $event->invitation->id; $fields->quote_id = $event->invitation->quote_id; - $this->activity_repo->save($fields, $event->quote, $event->event_vars); + $this->activity_repo->save($fields, $event->invitation->quote, $event->event_vars); } } From 2347b9db7a03c64cdd8b62251f9d173c378d2027 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 21 Dec 2020 12:16:26 +1100 Subject: [PATCH 3/7] Import notification --- app/Jobs/Import/CSVImport.php | 22 +++++++---- app/Jobs/Mail/MailRouter.php | 5 ++- app/Mail/Import/ImportCompleted.php | 35 +++++++++++++++++ resources/views/email/import/completed.blade | 41 ++++++++++++++++++++ 4 files changed, 95 insertions(+), 8 deletions(-) create mode 100644 app/Mail/Import/ImportCompleted.php create mode 100644 resources/views/email/import/completed.blade diff --git a/app/Jobs/Import/CSVImport.php b/app/Jobs/Import/CSVImport.php index 0381830b23bb..691fbd0d5b37 100644 --- a/app/Jobs/Import/CSVImport.php +++ b/app/Jobs/Import/CSVImport.php @@ -21,7 +21,9 @@ use App\Import\Transformers\ClientTransformer; use App\Import\Transformers\InvoiceItemTransformer; use App\Import\Transformers\InvoiceTransformer; use App\Import\Transformers\ProductTransformer; +use App\Jobs\Mail\MailRouter; use App\Libraries\MultiDB; +use App\Mail\Import\ImportCompleted; use App\Models\Client; use App\Models\Company; use App\Models\Currency; @@ -98,11 +100,16 @@ class CSVImport implements ShouldQueue info("import".ucfirst($this->entity_type)); $this->{"import".ucfirst($this->entity_type)}(); + + $data = [ + 'entity' => $this->entity_type, + 'errors' => $this->error_array, + 'clients' => $this->maps['clients'], + 'products' => $this->maps['products'], + 'invoices' => $this->maps['invoices'], + ]; - - info("errors"); - - info(print_r($this->error_array,1)); + MailRouter::dispatch(new ImportCompleted($data), $this->company, auth()->user()); } @@ -180,7 +187,7 @@ class CSVImport implements ShouldQueue $validator = Validator::make($invoice, (new StoreInvoiceRequest())->rules()); if ($validator->fails()) { - $this->error_array[] = ['invoice' => $invoice, 'error' => json_encode($validator->errors())]; + $this->error_array['invoices'] = ['invoice' => $invoice, 'error' => json_encode($validator->errors())]; } else { $invoice = $invoice_repository->save($invoice, InvoiceFactory::create($this->company->id, $this->setUser($record))); @@ -248,7 +255,7 @@ class CSVImport implements ShouldQueue $validator = Validator::make($client, (new StoreClientRequest())->rules()); if ($validator->fails()) { - $this->error_array[] = ['client' => $client, 'error' => json_encode($validator->errors())]; + $this->error_array['clients'] = ['client' => $client, 'error' => json_encode($validator->errors())]; } else { $client = $client_repository->save($client, ClientFactory::create($this->company->id, $this->setUser($record))); @@ -291,7 +298,7 @@ class CSVImport implements ShouldQueue $validator = Validator::make($product, (new StoreProductRequest())->rules()); if ($validator->fails()) { - $this->error_array[] = ['product' => $product, 'error' => json_encode($validator->errors())]; + $this->error_array['products'] = ['product' => $product, 'error' => json_encode($validator->errors())]; } else { $product = $product_repository->save($product, ProductFactory::create($this->company->id, $this->setUser($record))); @@ -310,6 +317,7 @@ class CSVImport implements ShouldQueue $this->maps['company'] = $this->company; $this->maps['clients'] = []; $this->maps['products'] = []; + $this->maps['invoices'] = []; return $this; } diff --git a/app/Jobs/Mail/MailRouter.php b/app/Jobs/Mail/MailRouter.php index aa29d036b471..dabb8a456f28 100644 --- a/app/Jobs/Mail/MailRouter.php +++ b/app/Jobs/Mail/MailRouter.php @@ -12,6 +12,7 @@ namespace App\Jobs\Mail; use App\Libraries\MultiDB; +use App\Models\Client; use App\Models\ClientContact; use App\Models\Company; use App\Models\User; @@ -74,7 +75,9 @@ class MailRouter extends BaseMailerJob implements ShouldQueue ->send($this->mailable); } catch (\Exception $e) { $this->failed($e); - $this->logMailError($e->getMessage(), $this->to_user); + + if($this->to_user instanceof ClientContact) + $this->logMailError($e->getMessage(), $this->to_user->client); } } } diff --git a/app/Mail/Import/ImportCompleted.php b/app/Mail/Import/ImportCompleted.php new file mode 100644 index 000000000000..ffe431926f11 --- /dev/null +++ b/app/Mail/Import/ImportCompleted.php @@ -0,0 +1,35 @@ +data = $data; + } + + /** + * Build the message. + * + * @return $this + */ + public function build() + { + return $this->from(config('mail.from.address'), config('mail.from.name')) + ->view('email.import.completed', compact($this->data)); + } +} diff --git a/resources/views/email/import/completed.blade b/resources/views/email/import/completed.blade new file mode 100644 index 000000000000..abc340a3dc99 --- /dev/null +++ b/resources/views/email/import/completed.blade @@ -0,0 +1,41 @@ +@component('email.template.master', ['design' => 'light', 'settings' =>$settings]) + +@slot('header') + @component('email.components.header') + Migration already completed + @endcomponent +@endslot + +@slot('greeting') + Hello, +@endslot + +Here is the output of your recent import job. + +Entity Type: {{ $entity_type }} + +@if(count($errors['invoices']) >=1) +
    + @foreach($errors as $error) +
  • {{ $error['invoice'] }} - {{ $error['error'] }}
  • + @endforeach +
+@endif + +@component('email.components.button', ['url' => url('/')]) + Visit portal +@endcomponent + + +@slot('signature') +Thank you,
+Invoice Ninja +@endslot + +@slot('footer') + @component('email.components.footer', ['url' => 'https://invoiceninja.com', 'url_text' => '© InvoiceNinja']) + For any info, please visit InvoiceNinja. + @endcomponent +@endslot + +@endcomponent \ No newline at end of file From ea360cead4c3bddf7cfadad0c4006b0e29d5966e Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 21 Dec 2020 12:52:33 +1100 Subject: [PATCH 4/7] Import notifications --- app/Jobs/Import/CSVImport.php | 3 +- app/Jobs/Mail/BaseMailerJob.php | 5 ++- app/Mail/Import/ImportCompleted.php | 2 +- resources/views/email/import/completed.blade | 41 -------------------- 4 files changed, 6 insertions(+), 45 deletions(-) delete mode 100644 resources/views/email/import/completed.blade diff --git a/app/Jobs/Import/CSVImport.php b/app/Jobs/Import/CSVImport.php index 691fbd0d5b37..756d02e51784 100644 --- a/app/Jobs/Import/CSVImport.php +++ b/app/Jobs/Import/CSVImport.php @@ -102,11 +102,12 @@ class CSVImport implements ShouldQueue $this->{"import".ucfirst($this->entity_type)}(); $data = [ - 'entity' => $this->entity_type, + 'entity' => ucfirst($this->entity_type), 'errors' => $this->error_array, 'clients' => $this->maps['clients'], 'products' => $this->maps['products'], 'invoices' => $this->maps['invoices'], + 'settings' => $this->company->settings ]; MailRouter::dispatch(new ImportCompleted($data), $this->company, auth()->user()); diff --git a/app/Jobs/Mail/BaseMailerJob.php b/app/Jobs/Mail/BaseMailerJob.php index d0649ba73fc7..c337e939ce90 100644 --- a/app/Jobs/Mail/BaseMailerJob.php +++ b/app/Jobs/Mail/BaseMailerJob.php @@ -97,8 +97,9 @@ class BaseMailerJob implements ShouldQueue public function failed($exception = null) { - // info('the job failed'); - + info('the job failed'); + info($exception->getMessage()); + $job_failure = new EmailFailure(); $job_failure->string_metric5 = get_parent_class($this); $job_failure->string_metric6 = $exception->getMessage(); diff --git a/app/Mail/Import/ImportCompleted.php b/app/Mail/Import/ImportCompleted.php index ffe431926f11..85178fb0647d 100644 --- a/app/Mail/Import/ImportCompleted.php +++ b/app/Mail/Import/ImportCompleted.php @@ -30,6 +30,6 @@ class ImportCompleted extends Mailable public function build() { return $this->from(config('mail.from.address'), config('mail.from.name')) - ->view('email.import.completed', compact($this->data)); + ->view('email.import.completed', $this->data); } } diff --git a/resources/views/email/import/completed.blade b/resources/views/email/import/completed.blade deleted file mode 100644 index abc340a3dc99..000000000000 --- a/resources/views/email/import/completed.blade +++ /dev/null @@ -1,41 +0,0 @@ -@component('email.template.master', ['design' => 'light', 'settings' =>$settings]) - -@slot('header') - @component('email.components.header') - Migration already completed - @endcomponent -@endslot - -@slot('greeting') - Hello, -@endslot - -Here is the output of your recent import job. - -Entity Type: {{ $entity_type }} - -@if(count($errors['invoices']) >=1) -
    - @foreach($errors as $error) -
  • {{ $error['invoice'] }} - {{ $error['error'] }}
  • - @endforeach -
-@endif - -@component('email.components.button', ['url' => url('/')]) - Visit portal -@endcomponent - - -@slot('signature') -Thank you,
-Invoice Ninja -@endslot - -@slot('footer') - @component('email.components.footer', ['url' => 'https://invoiceninja.com', 'url_text' => '© InvoiceNinja']) - For any info, please visit InvoiceNinja. - @endcomponent -@endslot - -@endcomponent \ No newline at end of file From 309bead3749325ea6ceedf69c0cea2edfbbb37b0 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 21 Dec 2020 13:24:09 +1100 Subject: [PATCH 5/7] completed email for import --- .../views/email/import/completed.blade.php | 82 +++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 resources/views/email/import/completed.blade.php diff --git a/resources/views/email/import/completed.blade.php b/resources/views/email/import/completed.blade.php new file mode 100644 index 000000000000..6763d0575f87 --- /dev/null +++ b/resources/views/email/import/completed.blade.php @@ -0,0 +1,82 @@ +@component('email.template.master', ['design' => 'light', 'settings' =>$settings]) + +@slot('header') + @component('email.components.header') + Import completed + @endcomponent +@endslot + +@slot('greeting') + Hello, +@endslot + +Here is the output of your recent import job.

+ +@if(isset($clients) && count($clients) >=1) + +

Clients Imported: {{ count($clients) }}

+ +@endif + +@if(isset($errors['clients']) && count($errors['clients']) >=1) + +

Client Errors

+ +
    + @foreach($errors['clients'] as $error) +
  • {{ $error['client'] }} - {{ $error['error'] }}
  • + @endforeach +
+@endif + +@if(isset($invoices) && count($invoices) >=1) + +

Invoices Imported: {{ count($invoices) }}

+ +@endif + +@if(isset($errors['invoices']) && count($errors['invoices']) >=1) + +

Invoices Errors

+ +
    + @foreach($errors['invoices'] as $error) +
  • {{ $error['invoice'] }} - {{ $error['error'] }}
  • + @endforeach +
+@endif + +@if(isset($products) && count($products) >=1) + +

Products Imported: {{ count($products) }}

+ +@endif + +@if(isset($errors['products']) && count($errors['products']) >=1) + +

Client Errors

+ +
    + @foreach($errors['products'] as $error) +
  • {{ $error['product'] }} - {{ $error['error'] }}
  • + @endforeach +
+@endif + +@component('email.components.button', ['url' => url('/')]) + Visit portal +@endcomponent + + +@slot('signature') +Thank you,
+Invoice Ninja +@endslot + +@slot('footer') + @component('email.components.footer', ['url' => 'https://invoiceninja.com', 'url_text' => '© InvoiceNinja']) + For any info, please visit InvoiceNinja. + @endcomponent +@endslot + +@endcomponent \ No newline at end of file From 26cceac505154a46d3a54914957fda41b2709f57 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 21 Dec 2020 15:55:15 +1100 Subject: [PATCH 6/7] Fixes for import --- app/Jobs/Import/CSVImport.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Jobs/Import/CSVImport.php b/app/Jobs/Import/CSVImport.php index 756d02e51784..5ef23217e46d 100644 --- a/app/Jobs/Import/CSVImport.php +++ b/app/Jobs/Import/CSVImport.php @@ -110,6 +110,8 @@ class CSVImport implements ShouldQueue 'settings' => $this->company->settings ]; +info(print_r($data,1)); + MailRouter::dispatch(new ImportCompleted($data), $this->company, auth()->user()); } From 95455f732bb257cc2b4571d4b76476f15dfde72b Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 21 Dec 2020 20:58:55 +1100 Subject: [PATCH 7/7] Minor fix for preview --- app/Http/Controllers/PreviewController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/PreviewController.php b/app/Http/Controllers/PreviewController.php index 06eb6ebee7af..f93ada1b021c 100644 --- a/app/Http/Controllers/PreviewController.php +++ b/app/Http/Controllers/PreviewController.php @@ -125,7 +125,7 @@ class PreviewController extends BaseController ->design($design) ->build(); - if (request()->has('html') && request()->input('html') == true) { + if (request()->query('html') == true) { return $maker->getCompiledHTML; }