diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php index 9a50d97c4fca..2df8db9190b7 100644 --- a/app/Http/Controllers/BaseController.php +++ b/app/Http/Controllers/BaseController.php @@ -60,15 +60,15 @@ class BaseController extends Controller private $first_load = [ 'account', - 'user.company_user.token.company_user', - //'token.company_user', + 'user.company_user', + 'token.company_user', 'company.activities', 'company.designs.company', 'company.task_statuses', 'company.expense_categories', 'company.documents', 'company.users.company_user', - 'company.clients.contacts', + 'company.clients.contacts.company', 'company.clients.gateway_tokens', 'company.clients.documents', 'company.company_gateways.gateway', @@ -93,11 +93,11 @@ class BaseController extends Controller 'company.quotes.invitations.contact', 'company.quotes.invitations.company', 'company.quotes.documents', - 'company.tasks', 'company.tasks.documents', 'company.tax_rates', 'company.tokens_hashed', - 'company.vendors.contacts', + 'company.vendors.contacts.company', + 'company.vendors.documents', 'company.webhooks', ]; @@ -427,7 +427,8 @@ class BaseController extends Controller public function flutterRoute() { - if ((bool) $this->checkAppSetup() !== false && Schema::hasTable('accounts') && $account = Account::first()) { + // if ((bool) $this->checkAppSetup() !== false && Schema::hasTable('accounts') && $account = Account::first()) { + if ((bool) $this->checkAppSetup() !== false && $account = Account::first()) { if (config('ninja.require_https') && ! request()->isSecure()) { return redirect()->secure(request()->getRequestUri()); } diff --git a/app/Http/Requests/Project/StoreProjectRequest.php b/app/Http/Requests/Project/StoreProjectRequest.php index 6070d11fb874..a1c3d0bcf570 100644 --- a/app/Http/Requests/Project/StoreProjectRequest.php +++ b/app/Http/Requests/Project/StoreProjectRequest.php @@ -42,12 +42,8 @@ class StoreProjectRequest extends Request protected function prepareForValidation() { - $input = $this->all(); + $input = $this->decodePrimaryKeys($this->all()); - if (array_key_exists('client_id', $input) && is_string($input['client_id'])) { - $input['client_id'] = $this->decodePrimaryKey($input['client_id']); - } - $this->replace($input); } diff --git a/app/Http/Requests/Project/UpdateProjectRequest.php b/app/Http/Requests/Project/UpdateProjectRequest.php index 2382abfc3820..3c4c3892f1ad 100644 --- a/app/Http/Requests/Project/UpdateProjectRequest.php +++ b/app/Http/Requests/Project/UpdateProjectRequest.php @@ -36,12 +36,8 @@ class UpdateProjectRequest extends Request protected function prepareForValidation() { - $input = $this->all(); + $input = $this->decodePrimaryKeys($this->all()); - if (array_key_exists('client_id', $input) && is_string($input['client_id'])) { - unset($input['client_id']); - } - $this->replace($input); } } diff --git a/app/Http/Requests/Task/StoreTaskRequest.php b/app/Http/Requests/Task/StoreTaskRequest.php index 1c1a2b23d1f7..5a26e729a8eb 100644 --- a/app/Http/Requests/Task/StoreTaskRequest.php +++ b/app/Http/Requests/Task/StoreTaskRequest.php @@ -37,49 +37,17 @@ class StoreTaskRequest extends Request public function rules() { $rules = []; - /* Ensure we have a client name, and that all emails are unique*/ - //$rules['name'] = 'required|min:1'; - //$rules['client_id'] = 'required|exists:clients,id,company_id,'.auth()->user()->company()->id; - - // $rules['number'] = new UniqueTaskNumberRule($this->all()); - - - return $rules; + + return $this->globalRules($rules); } protected function prepareForValidation() { - $input = $this->all(); + $input = $this->all(); - if (array_key_exists('design_id', $input) && is_string($input['design_id'])) { - $input['design_id'] = $this->decodePrimaryKey($input['design_id']); - } + $input = $this->decodePrimaryKeys($this->all()); - if (array_key_exists('client_id', $input) && is_string($input['client_id'])) { - $input['client_id'] = $this->decodePrimaryKey($input['client_id']); - } - - if (array_key_exists('assigned_user_id', $input) && is_string($input['assigned_user_id'])) { - $input['assigned_user_id'] = $this->decodePrimaryKey($input['assigned_user_id']); - } - - if (array_key_exists('project_id', $input) && is_string($input['project_id'])) { - $input['project_id'] = $this->decodePrimaryKey($input['project_id']); - } - - if (array_key_exists('invoice_id', $input) && is_string($input['invoice_id'])) { - $input['invoice_id'] = $this->decodePrimaryKey($input['invoice_id']); - } - - $this->replace($input); + $this->replace($input); } - // public function messages() - // { - // // return [ - // // 'unique' => ctrans('validation.unique', ['attribute' => 'email']), - // // //'required' => trans('validation.required', ['attribute' => 'email']), - // // 'contacts.*.email.required' => ctrans('validation.email', ['attribute' => 'email']), - // // ]; - // } } diff --git a/app/Http/Requests/Task/UpdateTaskRequest.php b/app/Http/Requests/Task/UpdateTaskRequest.php index 9d03ab13c4f6..a7f2b3311f75 100644 --- a/app/Http/Requests/Task/UpdateTaskRequest.php +++ b/app/Http/Requests/Task/UpdateTaskRequest.php @@ -43,7 +43,7 @@ class UpdateTaskRequest extends Request $rules['number'] = 'unique:tasks,number,'.$this->id.',id,company_id,'.$this->taskss->company_id; } - return $rules; + return $this->globalRules($rules); } // public function messages() @@ -58,28 +58,9 @@ class UpdateTaskRequest extends Request protected function prepareForValidation() { - $input = $this->all(); - if (array_key_exists('design_id', $input) && is_string($input['design_id'])) { - $input['design_id'] = $this->decodePrimaryKey($input['design_id']); - } + $input = $this->decodePrimaryKeys($this->all()); - if (array_key_exists('client_id', $input) && is_string($input['client_id'])) { - $input['client_id'] = $this->decodePrimaryKey($input['client_id']); - } - - if (array_key_exists('assigned_user_id', $input) && is_string($input['assigned_user_id'])) { - $input['assigned_user_id'] = $this->decodePrimaryKey($input['assigned_user_id']); - } - - if (array_key_exists('project_id', $input) && is_string($input['project_id'])) { - $input['project_id'] = $this->decodePrimaryKey($input['project_id']); - } - - if (array_key_exists('invoice_id', $input) && is_string($input['invoice_id'])) { - $input['invoice_id'] = $this->decodePrimaryKey($input['invoice_id']); - } - - $this->replace($input); + $this->replace($input); } } diff --git a/app/Jobs/Entity/CreateEntityPdf.php b/app/Jobs/Entity/CreateEntityPdf.php new file mode 100644 index 000000000000..5b7ea22278c9 --- /dev/null +++ b/app/Jobs/Entity/CreateEntityPdf.php @@ -0,0 +1,140 @@ +invitation = $invitation; + + if($invitation->invoice) + $this->entity = $invitation->invoice; + elseif($invitation->quote) + $this->entity = $invitation->quote; + elseif($invitation->credit)) + $this->entity = $invitation->credit; + + $this->company = $invitation->company; + + $this->contact = $invitation->contact; + + $this->disk = $disk ?? config('filesystems.default'); + } + + public function handle() + { + + if (config('ninja.phantomjs_key')) { + return (new Phantom)->generate($this->invitation); + } + + App::setLocale($this->contact->preferredLocale()); + + if($this->entity instanceof Invoice) + $path = $this->entity->client->invoice_filepath(); + elseif($this->entity instanceof Quote) + $path = $this->entity->client->quote_filepath(); + elseif($this->entity instanceof Credit) + $path = $this->entity->client->credit_filepath(); + + $file_path = $path.$this->entity->number.'.pdf'; + + $entity_design_id = $this->entity->design_id ? $this->entity->design_id : $this->decodePrimaryKey($this->entity->client->getSetting('invoice_design_id')); + + $design = Design::find($entity_design_id); + $html = new HtmlEngine(null, $this->invitation, 'entity'); + + if ($design->is_custom) { + $options = [ + 'custom_partials' => json_decode(json_encode($design->design), true) + ]; + $template = new PdfMakerDesign(PdfDesignModel::CUSTOM, $options); + } else { + $template = new PdfMakerDesign(strtolower($design->name)); + } + + $state = [ + 'template' => $template->elements([ + 'client' => $this->entity->client, + 'entity' => $this->entity, + 'pdf_variables' => (array) $this->entity->company->settings->pdf_variables, + 'products' => $design->design->product, + ]), + 'variables' => $html->generateLabelsAndValues(), + 'options' => [ + 'all_pages_header' => $this->entity->client->getSetting('all_pages_header'), + 'all_pages_footer' => $this->entity->client->getSetting('all_pages_footer'), + ], + ]; + + $maker = new PdfMakerService($state); + + $maker + ->design($template) + ->build(); + + //todo - move this to the client creation stage so we don't keep hitting this unnecessarily + Storage::makeDirectory($path, 0775); + + $pdf = $this->makePdf(null, null, $maker->getCompiledHTML(true)); + + $instance = Storage::disk($this->disk)->put($file_path, $pdf); + + return $file_path; + } +} diff --git a/app/Models/Client.php b/app/Models/Client.php index 86d4fd90b65c..c65010d1d684 100644 --- a/app/Models/Client.php +++ b/app/Models/Client.php @@ -98,6 +98,8 @@ class Client extends BaseModel implements HasLocalePreference ]; protected $with = [ + 'gateway_tokens', + 'documents' //'currency', // 'primary_contact', // 'country', diff --git a/database/seeders/PaymentTypesSeeder.php b/database/seeders/PaymentTypesSeeder.php index cef35ed5b994..c2756cf52bd6 100644 --- a/database/seeders/PaymentTypesSeeder.php +++ b/database/seeders/PaymentTypesSeeder.php @@ -31,6 +31,7 @@ class PaymentTypesSeeder extends Seeder const GATEWAY_TYPE_APPLE_PAY = 11; const GATEWAY_TYPE_CUSTOM2 = 12; const GATEWAY_TYPE_CUSTOM3 = 13; + const GATEWAY_TYPE_CREDIT = 13; public function run() { @@ -69,6 +70,7 @@ class PaymentTypesSeeder extends Seeder ['name' => 'SEPA', 'gateway_type_id' => self::GATEWAY_TYPE_SEPA], ['name' => 'GoCardless', 'gateway_type_id' => self::GATEWAY_TYPE_GOCARDLESS], ['name' => 'Crypto', 'gateway_type_id' => self::GATEWAY_TYPE_CRYPTO], + ['name' => 'Credit', 'gateway_type_id' => self::GATEWAY_TYPE_CREDIT], ]; $x = 1; diff --git a/resources/lang/en/texts.php b/resources/lang/en/texts.php index c5ee6460babd..1c8d955e504a 100644 --- a/resources/lang/en/texts.php +++ b/resources/lang/en/texts.php @@ -3285,5 +3285,7 @@ return [ 'credit_subject' => 'New credit :number from :account', 'credit_message' => 'To view your credit for :amount, click the link below.', + 'payment_type_Crypto' => 'Cryptocurrency', + 'payment_type_Credit' => 'Credit', ];