mirror of
				https://github.com/crater-invoice/crater.git
				synced 2025-11-03 22:13:18 -05:00 
			
		
		
		
	
		
			
				
	
	
		
			185 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			185 lines
		
	
	
		
			6.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace Crater\Traits;
 | 
						|
 | 
						|
use Carbon\Carbon;
 | 
						|
use Crater\Models\Address;
 | 
						|
use Crater\Models\CompanySetting;
 | 
						|
use Crater\Models\FileDisk;
 | 
						|
use Illuminate\Support\Facades\App;
 | 
						|
 | 
						|
trait GeneratesPdfTrait
 | 
						|
{
 | 
						|
    public function getGeneratedPDFOrStream($collection_name)
 | 
						|
    {
 | 
						|
        $pdf = $this->getGeneratedPDF($collection_name);
 | 
						|
        if ($pdf && file_exists($pdf['path'])) {
 | 
						|
            return response()->make(file_get_contents($pdf['path']), 200, [
 | 
						|
                'Content-Type' => 'application/pdf',
 | 
						|
                'Content-Disposition' => 'inline; filename="'.$pdf['file_name'].'"',
 | 
						|
            ]);
 | 
						|
        }
 | 
						|
 | 
						|
        $locale = CompanySetting::getSetting('language',  $this->company_id);
 | 
						|
 | 
						|
        App::setLocale($locale);
 | 
						|
 | 
						|
        $pdf = $this->getPDFData();
 | 
						|
 | 
						|
        return response()->make($pdf->stream(), 200, [
 | 
						|
            'Content-Type' => 'application/pdf',
 | 
						|
            'Content-Disposition' => 'inline; filename="'.$this[$collection_name.'_number'].'.pdf"',
 | 
						|
        ]);
 | 
						|
    }
 | 
						|
 | 
						|
    public function getGeneratedPDF($collection_name)
 | 
						|
    {
 | 
						|
        try {
 | 
						|
            $media = $this->getMedia($collection_name)->first();
 | 
						|
 | 
						|
            if ($media) {
 | 
						|
                $file_disk = FileDisk::find($media->custom_properties['file_disk_id']);
 | 
						|
 | 
						|
                if (! $file_disk) {
 | 
						|
                    return false;
 | 
						|
                }
 | 
						|
 | 
						|
                $file_disk->setConfig();
 | 
						|
 | 
						|
                $path = null;
 | 
						|
 | 
						|
                if ($file_disk->driver == 'local') {
 | 
						|
                    $path = $media->getPath();
 | 
						|
                } else {
 | 
						|
                    $path = $media->getTemporaryUrl(Carbon::now()->addMinutes(5));
 | 
						|
                }
 | 
						|
 | 
						|
                return collect([
 | 
						|
                    'path' => $path,
 | 
						|
                    'file_name' => $media->file_name,
 | 
						|
                ]);
 | 
						|
            }
 | 
						|
        } catch (\Exception $e) {
 | 
						|
            return false;
 | 
						|
        }
 | 
						|
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    public function generatePDF($collection_name, $file_name, $deleteExistingFile = false)
 | 
						|
    {
 | 
						|
        $save_pdf_to_disk = CompanySetting::getSetting('save_pdf_to_disk',  $this->company_id);
 | 
						|
 | 
						|
        if ($save_pdf_to_disk == 'NO') {
 | 
						|
            return 0;
 | 
						|
        }
 | 
						|
 | 
						|
        $locale = CompanySetting::getSetting('language',  $this->company_id);
 | 
						|
 | 
						|
        App::setLocale($locale);
 | 
						|
 | 
						|
        $pdf = $this->getPDFData();
 | 
						|
 | 
						|
        \Storage::disk('local')->put('temp/'.$collection_name.'/'.$this->id.'/temp.pdf', $pdf->output());
 | 
						|
 | 
						|
        if ($deleteExistingFile) {
 | 
						|
            $this->clearMediaCollection($this->id);
 | 
						|
        }
 | 
						|
 | 
						|
        $file_disk = FileDisk::whereSetAsDefault(true)->first();
 | 
						|
 | 
						|
        if ($file_disk) {
 | 
						|
            $file_disk->setConfig();
 | 
						|
        }
 | 
						|
 | 
						|
        $media = \Storage::disk('local')->path('temp/'.$collection_name.'/'.$this->id.'/temp.pdf');
 | 
						|
 | 
						|
        try {
 | 
						|
            $this->addMedia($media)
 | 
						|
                ->withCustomProperties(['file_disk_id' => $file_disk->id])
 | 
						|
                ->usingFileName($file_name.'.pdf')
 | 
						|
                ->toMediaCollection($collection_name, config('filesystems.default'));
 | 
						|
 | 
						|
            \Storage::disk('local')->deleteDirectory('temp/'.$collection_name.'/'.$this->id);
 | 
						|
 | 
						|
            return true;
 | 
						|
        } catch (\Exception $e) {
 | 
						|
            return $e->getMessage();
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    public function getFieldsArray()
 | 
						|
    {
 | 
						|
        $customer = $this->customer;
 | 
						|
        $shippingAddress = $customer->shippingAddress ?? new Address();
 | 
						|
        $billingAddress = $customer->billingAddress ?? new Address();
 | 
						|
        $companyAddress = $this->company->address ?? new Address();
 | 
						|
 | 
						|
        $fields = [
 | 
						|
            '{SHIPPING_ADDRESS_NAME}' => $shippingAddress->name,
 | 
						|
            '{SHIPPING_COUNTRY}' => $shippingAddress->country_name,
 | 
						|
            '{SHIPPING_STATE}' => $shippingAddress->state,
 | 
						|
            '{SHIPPING_CITY}' => $shippingAddress->city,
 | 
						|
            '{SHIPPING_ADDRESS_STREET_1}' => $shippingAddress->address_street_1,
 | 
						|
            '{SHIPPING_ADDRESS_STREET_2}' => $shippingAddress->address_street_2,
 | 
						|
            '{SHIPPING_PHONE}' => $shippingAddress->phone,
 | 
						|
            '{SHIPPING_ZIP_CODE}' => $shippingAddress->zip,
 | 
						|
            '{BILLING_ADDRESS_NAME}' => $billingAddress->name,
 | 
						|
            '{BILLING_COUNTRY}' => $billingAddress->country_name,
 | 
						|
            '{BILLING_STATE}' => $billingAddress->state,
 | 
						|
            '{BILLING_CITY}' => $billingAddress->city,
 | 
						|
            '{BILLING_ADDRESS_STREET_1}' => $billingAddress->address_street_1,
 | 
						|
            '{BILLING_ADDRESS_STREET_2}' => $billingAddress->address_street_2,
 | 
						|
            '{BILLING_PHONE}' => $billingAddress->phone,
 | 
						|
            '{BILLING_ZIP_CODE}' => $billingAddress->zip,
 | 
						|
            '{COMPANY_NAME}' => $this->company->name,
 | 
						|
            '{COMPANY_COUNTRY}' => $companyAddress->country_name,
 | 
						|
            '{COMPANY_STATE}' => $companyAddress->state,
 | 
						|
            '{COMPANY_CITY}' => $companyAddress->city,
 | 
						|
            '{COMPANY_ADDRESS_STREET_1}' => $companyAddress->address_street_1,
 | 
						|
            '{COMPANY_ADDRESS_STREET_2}' => $companyAddress->address_street_2,
 | 
						|
            '{COMPANY_PHONE}' => $companyAddress->phone,
 | 
						|
            '{COMPANY_ZIP_CODE}' => $companyAddress->zip,
 | 
						|
            '{CONTACT_DISPLAY_NAME}' => $customer->name,
 | 
						|
            '{PRIMARY_CONTACT_NAME}' => $customer->contact_name,
 | 
						|
            '{CONTACT_EMAIL}' => $customer->email,
 | 
						|
            '{CONTACT_PHONE}' => $customer->phone,
 | 
						|
            '{CONTACT_WEBSITE}' => $customer->website,
 | 
						|
        ];
 | 
						|
 | 
						|
        $customFields = $this->fields;
 | 
						|
        $customerCustomFields = $this->customer->fields;
 | 
						|
 | 
						|
        foreach ($customFields as $customField) {
 | 
						|
            $fields['{'.$customField->customField->slug.'}'] = $customField->defaultAnswer;
 | 
						|
        }
 | 
						|
 | 
						|
        foreach ($customerCustomFields as $customField) {
 | 
						|
            $fields['{'.$customField->customField->slug.'}'] = $customField->defaultAnswer;
 | 
						|
        }
 | 
						|
 | 
						|
        foreach ($fields as $key => $field) {
 | 
						|
            $fields[$key] = htmlspecialchars($field, ENT_QUOTES, 'UTF-8');
 | 
						|
        }
 | 
						|
 | 
						|
        return $fields;
 | 
						|
    }
 | 
						|
 | 
						|
    public function getFormattedString($format)
 | 
						|
    {
 | 
						|
        $values = array_merge($this->getFieldsArray(), $this->getExtraFields());
 | 
						|
 | 
						|
        $str = nl2br(strtr($format, $values));
 | 
						|
 | 
						|
        $str = preg_replace('/{(.*?)}/', '', $str);
 | 
						|
 | 
						|
        $str = preg_replace("/<[^\/>]*>([\s]?)*<\/[^>]*>/", '', $str);
 | 
						|
 | 
						|
        $str = str_replace("<p>", "", $str);
 | 
						|
 | 
						|
        $str = str_replace("</p>", "</br>", $str);
 | 
						|
 | 
						|
        return $str;
 | 
						|
    }
 | 
						|
}
 |