entity = $entity; $this->design = $design->design; $this->input_variables = json_decode(json_encode($input_variables), 1); $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('includes')) ->setDesign($this->getSection('header')) ->setDesign($this->getSection('body')) ->setDesign($this->getSection('footer')); return $this; } public function init() { $this->setHtml() ->exportVariables(); return $this; } public function getIncludes() { $this->setDesign($this->getSection('includes')); return $this; } public function getHeader() { $this->setDesign($this->getSection('header')); return $this; } public function getFooter() { $this->setDesign($this->getSection('footer')); return $this; } public function getBody() { $this->setDesign($this->getSection('body')); return $this; } 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['$app_url'] = $this->entity->generateAppUrl(); $this->exported_variables['$client_details'] = $this->processVariables($this->input_variables['client_details'], $this->clientDetails($company)); $this->exported_variables['$company_details'] = $this->processVariables($this->input_variables['company_details'], $this->companyDetails($company)); $this->exported_variables['$company_address'] = $this->processVariables($this->input_variables['company_address'], $this->companyAddress($company)); if ($this->entity_string == 'invoice') { $this->exported_variables['$entity_labels'] = $this->processLabels($this->input_variables['invoice_details'], $this->invoiceDetails($company)); $this->exported_variables['$entity_details'] = $this->processVariables($this->input_variables['invoice_details'], $this->invoiceDetails($company)); } elseif ($this->entity_string == 'credit') { $this->exported_variables['$entity_labels'] = $this->processLabels($this->input_variables['credit_details'], $this->creditDetails($company)); $this->exported_variables['$entity_details'] = $this->processVariables($this->input_variables['credit_details'], $this->creditDetails($company)); } elseif ($this->entity_string == 'quote') { $this->exported_variables['$entity_labels'] = $this->processLabels($this->input_variables['quote_details'], $this->quoteDetails($company)); $this->exported_variables['$entity_details'] = $this->processVariables($this->input_variables['quote_details'], $this->quoteDetails($company)); } $this->exported_variables['$product_table_header']= $this->entity->buildTableHeader($this->input_variables['product_columns']); $this->exported_variables['$product_table_body'] = $this->entity->buildTableBody($this->input_variables['product_columns'], $this->design->product, '$product'); $this->exported_variables['$task_table_header'] = $this->entity->buildTableHeader($this->input_variables['task_columns']); $this->exported_variables['$task_table_body'] = $this->entity->buildTableBody($this->input_variables['task_columns'], $this->design->task, '$task'); if (strlen($this->exported_variables['$task_table_body']) == 0) { $this->exported_variables['$task_table_header'] = ''; } if (strlen($this->exported_variables['$product_table_body']) == 0) { $this->exported_variables['$product_table_header'] = ''; } return $this; } private function processVariables($input_variables, $variables):string { $output = ''; foreach (array_keys($input_variables) as $value) { $output .= $variables[$value]; } return $output; } private function processLabels($input_variables, $variables):string { $output = ''; foreach (array_keys($input_variables) as $value) { $tmp = str_replace("", "_label", $variables[$value]); //$output .= $variables[$value]; $output .= $tmp; } return $output; } private function clientDetails(Company $company) { $data = [ '$client.name' => '

$client.name

', '$client.id_number' => '

$client.id_number

', '$client.vat_number' => '

$client.vat_number

', '$client.address1' => '

$client.address1

', '$client.address2' => '

$client.address2

', '$client.city_state_postal' => '

$client.city_state_postal

', '$client.postal_city_state' => '

$client.postal_city_state

', '$client.country' => '

$client.country

', '$client.email' => '

$client.email

', '$client.client1' => '

$client1

', '$client.client2' => '

$client2

', '$client.client3' => '

$client3

', '$client.client4' => '

$client4

', '$client.contact1' => '

$contact1

', '$client.contact2' => '

$contact2

', '$client.contact3' => '

$contact3

', '$client.contact4' => '

$contact4

', ]; return $this->processCustomFields($company, $data); } private function companyDetails(Company $company) { $data = [ '$company.company_name' => '$company.company_name', '$company.id_number' => '$company.id_number', '$company.vat_number' => '$company.vat_number', '$company.website' => '$company.website', '$company.email' => '$company.email', '$company.phone' => '$company.phone', '$company.company1' => '$company1', '$company.company2' => '$company2', '$company.company3' => '$company3', '$company.company4' => '$company4', ]; return $this->processCustomFields($company, $data); } private function companyAddress(Company $company) { $data = [ '$company.address1' => '$company.address1', '$company.address2' => '$company.address2', '$company.city_state_postal' => '$company.city_state_postal', '$company.postal_city_state' => '$company.postal_city_state', '$company.country' => '$company.country', '$company.company1' => '$company1', '$company.company2' => '$company2', '$company.company3' => '$company3', '$company.company4' => '$company4', ]; return $this->processCustomFields($company, $data); } private function invoiceDetails(Company $company) { $data = [ '$invoice.invoice_number' => '$invoice_number_label$invoice_number', '$invoice.po_number' => '$po_number_label$po_number', '$invoice.invoice_date' => '$invoice_date_label$invoice_date', '$invoice.due_date' => '$due_date_label$due_date', '$invoice.balance_due' => '$balance_due_label$balance_due', '$invoice.invoice_total' => '$invoice_total_label$invoice_total', '$invoice.partial_due' => '$partial_due_label$partial_due', '$invoice.invoice1' => '$invoice1_label$invoice1', '$invoice.invoice2' => '$invoice2_label$invoice2', '$invoice.invoice3' => '$invoice3_label$invoice3', '$invoice.invoice4' => '$invoice4_label$invoice4', '$invoice.surcharge1' => '$surcharge1_label$surcharge1', '$invoice.surcharge2' => '$surcharge2_label$surcharge2', '$invoice.surcharge3' => '$surcharge3_label$surcharge3', '$invoice.surcharge4' => '$surcharge4_label$surcharge4', ]; return $this->processCustomFields($company, $data); } private function quoteDetails(Company $company) { $data = [ '$quote.quote_number' => '$quote_number', '$quote.po_number' => '$po_number', '$quote.quote_date' => '$date', '$quote.valid_until' => '$valid_until', '$quote.balance_due' => '$balance_due', '$quote.quote_total' => '$quote_total', '$quote.partial_due' => '$partial_due', '$quote.quote1' => '$quote1', '$quote.quote2' => '$quote2', '$quote.quote3' => '$quote3', '$quote.quote4' => '$quote4', '$quote.surcharge1' => '$surcharge1', '$quote.surcharge2' => '$surcharge2', '$quote.surcharge3' => '$surcharge3', '$quote.surcharge4' => '$surcharge4', ]; return $this->processCustomFields($company, $data); } private function creditDetails(Company $company) { $data = [ '$credit.credit_number' => '$credit_number', '$credit.po_number' => '$po_number', '$credit.credit_date' => '$date', '$credit.credit_balance' => '$credit_balance', '$credit.credit_amount' => '$credit_amount', '$credit.partial_due' => '$partial_due', '$credit.invoice1' => '$invoice1', '$credit.invoice2' => '$invoice2', '$credit.invoice3' => '$invoice3', '$credit.invoice4' => '$invoice4', '$credit.surcharge1' => '$surcharge1', '$credit.surcharge2' => '$surcharge2', '$credit.surcharge3' => '$surcharge3', '$credit.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) // { // if(is_object($variables)) // $variables = json_decode(json_encode($variables),true); // $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; // } }