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; } diff --git a/app/Jobs/Import/CSVImport.php b/app/Jobs/Import/CSVImport.php index 9ee272d5deb2..f54016ac8532 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,20 @@ class CSVImport implements ShouldQueue info("import".ucfirst($this->entity_type)); $this->{"import".ucfirst($this->entity_type)}(); + + $data = [ + '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 + ]; +info(print_r($data,1)); - info("errors"); + MailRouter::dispatch(new ImportCompleted($data), $this->company, auth()->user()); - info(print_r($this->error_array, 1)); } public function failed($exception) @@ -168,7 +179,11 @@ class CSVImport implements ShouldQueue $invoice['line_items'] = $this->cleanItems($items); - $validator = Validator::make($invoice, (new StoreInvoiceRequest())->rules()); + $validator = Validator::make($invoice, (new StoreInvoiceRequest())->rules()); + + if ($validator->fails()) { + $this->error_array['invoices'] = ['invoice' => $invoice, 'error' => json_encode($validator->errors())]; + } else { if ($validator->fails()) { $this->error_array[] = ['invoice' => $invoice, 'error' => json_encode($validator->errors())]; @@ -237,7 +252,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))); @@ -279,7 +294,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))); @@ -298,6 +313,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/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/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/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); } } diff --git a/app/Mail/Import/ImportCompleted.php b/app/Mail/Import/ImportCompleted.php new file mode 100644 index 000000000000..85178fb0647d --- /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', $this->data); + } +} 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(); } } 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

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

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

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

Invoices Errors

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

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

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

Client Errors

+ + +@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