/home/edulekha/crm.edulekha.com/modules/einvoice/src/Data/Customer.php
<?php

namespace Perfexcrm\EInvoice\Data;

class Customer
{
    private static array $placeholders;
    private object|null $contact;

    public static function getPlaceholders(): array
    {
        if (! isset(self::$placeholders)) {
            $placeholders = [
                '{{CONTACT_FIRST_NAME}}',
                '{{CONTACT_LAST_NAME}}',
                '{{CONTACT_PHONE_NUMBER}}',
                '{{CONTACT_EMAIL}}',
                '{{CUSTOMER_NAME}}',
                '{{CUSTOMER_PHONE}}',
                '{{CUSTOMER_COUNTRY_NAME}}',
                '{{CUSTOMER_COUNTRY_ISO2}}',
                '{{CUSTOMER_COUNTRY_ISO3}}',
                '{{CUSTOMER_CITY}}',
                '{{CUSTOMER_ZIP}}',
                '{{CUSTOMER_STATE}}',
                '{{CUSTOMER_ADDRESS}}',
                '{{CUSTOMER_VAT_NUMBER}}',
                '{{CUSTOMER_ID}}',
            ];

            foreach (get_custom_fields('customers') as $customField) {
                $placeholders[] = einvioce_custom_field_placeholder($customField['slug']);
            }

            foreach (get_custom_fields('contacts') as $customField) {
                $placeholders[] = einvioce_custom_field_placeholder($customField['slug']);
            }
            self::$placeholders = $placeholders;
        }

        return hooks()->apply_filters('before_get_einvoice_customer_placeholders', self::$placeholders);
    }

    public function __construct(private readonly object $customer)
    {
        $contactId = get_primary_contact_user_id($this->customer->userid);
        if ($contactId) {
            $ci = &get_instance();
            $ci->db->where('userid', $this->customer->userid);
            $ci->db->where('id', $contactId);
            $this->contact = $ci->db->get(db_prefix() . 'contacts')->row();
        }
    }

    public function getPlaceHolderValues(): array
    {
        $country = get_country($this->customer->country);
        $values  = [
            'CONTACT_FIRST_NAME'    => encodeForXml($this->contact?->firstname, false),
            'CONTACT_LAST_NAME'     => encodeForXml($this->contact?->lastname, false),
            'CONTACT_PHONE_NUMBER'  => encodeForXml($this->contact?->phonenumber),
            'CONTACT_EMAIL'         => encodeForXml($this->contact?->email),
            'CUSTOMER_NAME'         => encodeForXml($this->customer->company, false),
            'CUSTOMER_PHONE'        => encodeForXml($this->customer->phonenumber),
            'CUSTOMER_COUNTRY_ISO2' => encodeForXml($country?->iso2, false),
            'CUSTOMER_COUNTRY_ISO3' => encodeForXml($country?->iso3, false),
            'CUSTOMER_COUNTRY_NAME' => encodeForXml($country?->short_name, false),
            'CUSTOMER_CITY'         => encodeForXml($this->customer->city, false),
            'CUSTOMER_ZIP'          => encodeForXml($this->customer->zip),
            'CUSTOMER_STATE'        => encodeForXml($this->customer->state, false),
            'CUSTOMER_ADDRESS'      => encodeForXml($this->customer->address, false),
            'CUSTOMER_VAT_NUMBER'   => encodeForXml($this->customer->vat),
            'CUSTOMER_ID'           => $this->customer->userid,
        ];

        foreach (get_custom_fields('contacts') as $field) {
            $values[einvioce_custom_field_value_placeholder($field['slug'])] = encodeForXml(
                get_custom_field_value($this->contact->id, $field['id'], 'contacts'),
                false
            );
        }

        foreach (get_custom_fields('customers') as $field) {
            $values[einvioce_custom_field_value_placeholder($field['slug'])] = encodeForXml(
                get_custom_field_value($this->customer->userid, $field['id'], 'customers') ?: $field['default_value'],
                false
            );
        }

        return hooks()->apply_filters('before_get_einvoice_customer_placeholder_values', $values, $this->customer);
    }
}