entity = $entity; $this->design = $design; $this->input_variables = (array) $input_variables; $this->entity_string = $entity_string; } /** * Returns the design * formatted HTML * @return string The HTML design built */ public function build():Designer { $this->setHtml() ->exportVariables() ->setDesign($this->getSection('include')) ->setDesign($this->getSection('header')) ->setDesign($this->getSection('body')) ->setDesign($this->getProductTable($this->entity)) ->setDesign($this->getSection('footer')); return $this; } public function init() { $this->setHtml() ->exportVariables(); return $this; } public function getHeader() { $this->setDesign($this->getSection('include')) ->setDesign($this->getSection('header')); return $this; } public function getFooter() { $this->setDesign($this->getSection('footer')); return $this; } public function getBody() { $this->setDesign($this->getSection('include')) ->setDesign($this->getSection('body')) ->setDesign($this->getProductTable()); return $this; } public function getProductTable():string { $table_header = $this->entity->table_header($this->input_variables['product_columns'], $this->design->table_styles()); $table_body = $this->entity->table_body($this->input_variables['product_columns'], $this->design->table_styles()); $data = str_replace('$table_header', $table_header, $this->getSection('product_table')); $data = str_replace('$table_body', $table_body, $data); return $data; } public function getHtml():string { return $this->html; } public function setHtml() { $this->html = ''; return $this; } private function setDesign($section) { $this->html .= $section; return $this; } /** * Returns the template section on with the * stacked variables replaced with single variables. * * @param string $section the method name to be executed ie header/body/table/footer * @return string The HTML of the template section */ public function getSection($section):string { return str_replace(array_keys($this->exported_variables), array_values($this->exported_variables), $this->design->{$section}()); } private function exportVariables() { $company = $this->entity->company; $this->exported_variables['$client_details'] = $this->processVariables($this->processInputVariables($company, $this->input_variables['client_details']), $this->clientDetails($company)); $this->exported_variables['$company_details'] = $this->processVariables($this->processInputVariables($company, $this->input_variables['company_details']), $this->companyDetails($company)); $this->exported_variables['$company_address'] = $this->processVariables($this->processInputVariables($company, $this->input_variables['company_address']), $this->companyAddress($company)); if($this->entity_string == 'invoice') { $this->exported_variables['$entity_labels'] = $this->processLabels($this->processInputVariables($company, $this->input_variables['invoice_details']), $this->invoiceDetails($company)); $this->exported_variables['$entity_details'] = $this->processVariables($this->processInputVariables($company, $this->input_variables['invoice_details']), $this->invoiceDetails($company)); } elseif($this->entity_string == 'credit') { $this->exported_variables['$entity_labels'] = $this->processLabels($this->processInputVariables($company, $this->input_variables['credit_details']), $this->creditDetails($company)); $this->exported_variables['$entity_details'] = $this->processVariables($this->processInputVariables($company, $this->input_variables['credit_details']), $this->creditDetails($company)); } elseif($this->entity_string == 'quote') { $this->exported_variables['$entity_labels'] = $this->processLabels($this->processInputVariables($company, $this->input_variables['quote_details']), $this->quoteDetails($company)); $this->exported_variables['$entity_details'] = $this->processVariables($this->processInputVariables($company, $this->input_variables['quote_details']), $this->quoteDetails($company)); } return $this; } private function processVariables($input_variables, $variables):string { $output = ''; foreach ($input_variables as $value) $output .= $variables[$value]; return $output; } private function processLabels($input_variables, $variables):string { $output = ''; foreach ($input_variables as $value) { $tmp = str_replace("", "_label", $variables[$value]); $output .= $tmp; } return $output; } private function clientDetails(Company $company) { $data = [ 'name' => '
$client.name
', 'id_number' => '$client.id_number
', 'vat_number' => '$client.vat_number
', 'address1' => '$client.address1
', 'address2' => '$client.address2
', 'city_state_postal' => '$client.city_state_postal
', 'postal_city_state' => '$client.postal_city_state
', 'country' => '$client.country
', 'email' => '$client.email
', 'client1' => '$client1
', 'client2' => '$client2
', 'client3' => '$client3
', 'client4' => '$client4
', 'contact1' => '$contact1
', 'contact2' => '$contact2
', 'contact3' => '$contact3
', 'contact4' => '$contact4
', ]; return $this->processCustomFields($company, $data); } private function companyDetails(Company $company) { $data = [ 'company_name' => '$company.company_name', 'id_number' => '$company.id_number', 'vat_number' => '$company.vat_number', 'website' => '$company.website', 'email' => '$company.email', 'phone' => '$company.phone', 'company1' => '$company1', 'company2' => '$company2', 'company3' => '$company3', 'company4' => '$company4', ]; return $this->processCustomFields($company, $data); } private function companyAddress(Company $company) { $data = [ 'address1' => '$company.address1', 'address2' => '$company.address1', 'city_state_postal' => '$company.city_state_postal', 'postal_city_state' => '$company.postal_city_state', 'country' => '$company.country', 'company1' => '$company1', 'company2' => '$company2', 'company3' => '$company3', 'company4' => '$company4', ]; return $this->processCustomFields($company, $data); } private function invoiceDetails(Company $company) { $data = [ 'invoice_number' => '$invoice_number', 'po_number' => '$po_number', 'date' => '$date', 'due_date' => '$due_date', 'balance_due' => '$balance_due', 'invoice_total' => '$invoice_total', 'partial_due' => '$partial_due', 'invoice1' => '$invoice1', 'invoice2' => '$invoice2', 'invoice3' => '$invoice3', 'invoice4' => '$invoice4', 'surcharge1' => '$surcharge1', 'surcharge2' => '$surcharge2', 'surcharge3' => '$surcharge3', 'surcharge4' => '$surcharge4', ]; return $this->processCustomFields($company, $data); } private function quoteDetails(Company $company) { $data = [ 'quote_number' => '$quote_number', 'po_number' => '$po_number', 'date' => '$date', 'valid_until' => '$valid_until', 'balance_due' => '$balance_due', 'quote_total' => '$quote_total', 'partial_due' => '$partial_due', 'quote1' => '$quote1', 'quote2' => '$quote2', 'quote3' => '$quote3', 'quote4' => '$quote4', 'surcharge1' => '$surcharge1', 'surcharge2' => '$surcharge2', 'surcharge3' => '$surcharge3', 'surcharge4' => '$surcharge4', ]; return $this->processCustomFields($company, $data); } private function creditDetails(Company $company) { $data = [ 'credit_number' => '$credit_number', 'po_number' => '$po_number', 'date' => '$date', 'credit_balance' => '$credit_balance', 'credit_amount' => '$credit_amount', 'partial_due' => '$partial_due', 'invoice1' => '$invoice1', 'invoice2' => '$invoice2', 'invoice3' => '$invoice3', 'invoice4' => '$invoice4', 'surcharge1' => '$surcharge1', 'surcharge2' => '$surcharge2', 'surcharge3' => '$surcharge3', 'surcharge4' => '$surcharge4', ]; return $this->processCustomFields($company, $data); } private function processCustomFields(Company $company, $data) { $custom_fields = $company->custom_fields; if (!$custom_fields) { return $data; } foreach (self::$custom_fields as $cf) { if (!property_exists($custom_fields, $cf) || (strlen($custom_fields->{ $cf}) == 0)) { unset($data[$cf]); } } return $data; } private function processInputVariables($company, $variables) { $custom_fields = $company->custom_fields; $matches = array_intersect(self::$custom_fields, $variables); foreach ($matches as $match) { if (!property_exists($custom_fields, $match) || (strlen($custom_fields->{$match}) == 0)) { foreach ($variables as $key => $value) { if ($value == $match) { unset($variables[$key]); } } } } return $variables; } }