diff --git a/app/Mail/Engine/CreditEmailEngine.php b/app/Mail/Engine/CreditEmailEngine.php index feffbcf0181a..2aafed3d1c1e 100644 --- a/app/Mail/Engine/CreditEmailEngine.php +++ b/app/Mail/Engine/CreditEmailEngine.php @@ -119,6 +119,10 @@ class CreditEmailEngine extends BaseEmailEngine $pdf = ((new CreateRawPdf($this->invitation))->handle()); + if($this->client->getSetting('embed_documents') && ($this->credit->documents()->where('is_public', true)->count() > 0 || $this->credit->company->documents()->where('is_public', true)->count() > 0)) { + $pdf = $this->credit->documentMerge($pdf); + } + $this->setAttachments([['file' => base64_encode($pdf), 'name' => $this->credit->numberFormatter().'.pdf']]); } diff --git a/app/Mail/Engine/InvoiceEmailEngine.php b/app/Mail/Engine/InvoiceEmailEngine.php index 8f9e15f8dbf0..23bdba41c315 100644 --- a/app/Mail/Engine/InvoiceEmailEngine.php +++ b/app/Mail/Engine/InvoiceEmailEngine.php @@ -131,6 +131,10 @@ class InvoiceEmailEngine extends BaseEmailEngine if ($this->client->getSetting('pdf_email_attachment') !== false && $this->invoice->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { $pdf = ((new CreateRawPdf($this->invitation))->handle()); + if($this->client->getSetting('embed_documents') && ($this->invoice->documents()->where('is_public', true)->count() > 0 || $this->invoice->company->documents()->where('is_public', true)->count() > 0)) { + $pdf = $this->invoice->documentMerge($pdf); + } + $this->setAttachments([['file' => base64_encode($pdf), 'name' => $this->invoice->numberFormatter().'.pdf']]); } diff --git a/app/Mail/Engine/PurchaseOrderEmailEngine.php b/app/Mail/Engine/PurchaseOrderEmailEngine.php index 168544aea23a..cef7173466a3 100644 --- a/app/Mail/Engine/PurchaseOrderEmailEngine.php +++ b/app/Mail/Engine/PurchaseOrderEmailEngine.php @@ -123,6 +123,10 @@ class PurchaseOrderEmailEngine extends BaseEmailEngine $pdf = (new CreateRawPdf($this->invitation))->handle(); + if($this->vendor->getSetting('embed_documents') && ($this->purchase_order->documents()->where('is_public', true)->count() > 0 || $this->purchase_order->company->documents()->where('is_public', true)->count() > 0)) { + $pdf = $this->purchase_order->documentMerge($pdf); + } + $this->setAttachments([['file' => base64_encode($pdf), 'name' => $this->purchase_order->numberFormatter().'.pdf']]); } diff --git a/app/Mail/Engine/QuoteEmailEngine.php b/app/Mail/Engine/QuoteEmailEngine.php index f0dad52d58bf..d43592595080 100644 --- a/app/Mail/Engine/QuoteEmailEngine.php +++ b/app/Mail/Engine/QuoteEmailEngine.php @@ -17,6 +17,7 @@ use App\Models\Account; use App\Utils\HtmlEngine; use Illuminate\Support\Str; use App\Jobs\Entity\CreateRawPdf; +use App\Services\PdfMaker\PdfMerge; use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\URL; use Illuminate\Support\Facades\Cache; @@ -117,6 +118,10 @@ class QuoteEmailEngine extends BaseEmailEngine if ($this->client->getSetting('pdf_email_attachment') !== false && $this->quote->company->account->hasFeature(Account::FEATURE_PDF_ATTACHMENT)) { $pdf = ((new CreateRawPdf($this->invitation))->handle()); + if($this->client->getSetting('embed_documents') && ($this->quote->documents()->where('is_public', true)->count() > 0 || $this->quote->company->documents()->where('is_public', true)->count() > 0)){ + $pdf = $this->quote->documentMerge($pdf); + } + $this->setAttachments([['file' => base64_encode($pdf), 'name' => $this->quote->numberFormatter().'.pdf']]); } diff --git a/app/Models/BaseModel.php b/app/Models/BaseModel.php index 2e6e81066729..19b443c476db 100644 --- a/app/Models/BaseModel.php +++ b/app/Models/BaseModel.php @@ -11,16 +11,17 @@ namespace App\Models; +use Illuminate\Support\Str; +use Illuminate\Support\Carbon; +use App\Utils\Traits\MakesHash; use App\Jobs\Entity\CreateRawPdf; use App\Jobs\Util\WebhookHandler; use App\Models\Traits\Excludable; -use App\Utils\Traits\MakesHash; +use App\Services\PdfMaker\PdfMerge; +use Illuminate\Database\Eloquent\Model; use App\Utils\Traits\UserSessionAttributes; use Illuminate\Database\Eloquent\Factories\HasFactory; -use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\ModelNotFoundException as ModelNotFoundException; -use Illuminate\Support\Carbon; -use Illuminate\Support\Str; /** * Class BaseModel @@ -77,6 +78,8 @@ class BaseModel extends Model use UserSessionAttributes; use HasFactory; use Excludable; + + public int $max_attachment_size = 3000000; protected $appends = [ 'hashed_id', @@ -337,4 +340,42 @@ class BaseModel extends Model return strtr($section, $variables['values']); } + + /** + * Merged PDFs associated with the entity / company + * into a single document + * + * @param string $pdf + * @return mixed + */ + public function documentMerge(string $pdf): mixed + { + $files = collect([$pdf]); + + $entity_docs = $this->documents() + ->where('is_public', true) + ->get() + ->filter(function ($document) { + return $document->size < $this->max_attachment_size && stripos($document->name, ".pdf") !== false; + })->map(function ($d) { + return $d->getFile(); + }); + + $files->push($entity_docs); + + $company_docs = $this->company->documents() + ->where('is_public', true) + ->get() + ->filter(function ($document) { + return $document->size < $this->max_attachment_size && stripos($document->name, ".pdf") !== false; + })->map(function ($d) { + return $d->getFile(); + }); + + $files->push($company_docs); + + $pdf = (new PdfMerge($files->flatten()->toArray()))->run(); + + return $pdf; + } } diff --git a/app/Services/Email/EmailDefaults.php b/app/Services/Email/EmailDefaults.php index 1053632b4328..79c7dcf812a3 100644 --- a/app/Services/Email/EmailDefaults.php +++ b/app/Services/Email/EmailDefaults.php @@ -309,6 +309,11 @@ class EmailDefaults /** Purchase Order / Invoice / Credit / Quote PDF */ if ($this->email->email_object->settings->pdf_email_attachment) { $pdf = ((new CreateRawPdf($this->email->email_object->invitation))->handle()); + + if($this->email->email_object->settings->embed_documents && ($this->email->email_object->entity->documents()->where('is_public', true)->count() > 0 || $this->email->email_object->entity->company->documents()->where('is_public', true)->count() > 0)) { + $pdf = $this->email->email_object->entity->documentMerge($pdf); + } + $this->email->email_object->attachments = array_merge($this->email->email_object->attachments, [['file' => base64_encode($pdf), 'name' => $this->email->email_object->entity->numberFormatter().'.pdf']]); }