'EU', // Austria 'BE' => 'EU', // Belgium 'BG' => 'EU', // Bulgaria 'CY' => 'EU', // Cyprus 'CZ' => 'EU', // Czech Republic 'DE' => 'EU', // Germany 'DK' => 'EU', // Denmark 'EE' => 'EU', // Estonia 'ES' => 'EU', // Spain 'FI' => 'EU', // Finland 'FR' => 'EU', // France 'GR' => 'EU', // Greece 'HR' => 'EU', // Croatia 'HU' => 'EU', // Hungary 'IE' => 'EU', // Ireland 'IT' => 'EU', // Italy 'LT' => 'EU', // Lithuania 'LU' => 'EU', // Luxembourg 'LV' => 'EU', // Latvia 'MT' => 'EU', // Malta 'NL' => 'EU', // Netherlands 'PL' => 'EU', // Poland 'PT' => 'EU', // Portugal 'RO' => 'EU', // Romania 'SE' => 'EU', // Sweden 'SI' => 'EU', // Slovenia 'SK' => 'EU', // Slovakia 'US' => 'US', // United States ]; /** EU TAXES */ /** US TAXES */ /** US TAXES */ public string $tax_name1 = ''; public float $tax_rate1 = 0; public string $tax_name2 = ''; public float $tax_rate2 = 0; public string $tax_name3 = ''; public float $tax_rate3 = 0; protected ?Client $client; protected ?Response $tax_data; public function __construct() { } public function init(): self { return $this; } public function setClient(Client $client): self { $this->client = $client; $this->resolveRegions(); return $this; } // Refactor to support switching between shipping / billing country / region / subregion private function resolveRegions(): self { if(!array_key_exists($this->client->country->iso_3166_2, $this->region_codes)) throw new \Exception('Country not supported'); $this->client_region = $this->region_codes[$this->client->country->iso_3166_2] ?? ''; match($this->client_region){ 'US' => $this->client_subregion = $this->tax_data->geoState, 'EU' => $this->client_subregion = $this->client->country->iso_3166_2, default => '', }; return $this; } private function isTaxableRegion(): bool { return $this->client->company->tax_data->regions->{$this->client_region}->tax_all_subregions || $this->client->company->tax_data->regions->{$this->client_region}->subregions->{$this->client_subregion}->apply_tax; } public function setTaxData(Response $tax_data): self { $this->tax_data = $tax_data; return $this; } public function tax($item = null): self { return $this; } public function taxByType(mixed $type): self { return $this; } public function taxReduced(): self { return $this; } public function taxExempt(): self { return $this; } public function taxDigital(): self { return $this; } public function taxService(): self { return $this; } public function taxShipping(): self { return $this; } public function taxPhysical(): self { return $this; } public function default(): self { return $this; } public function override(): self { return $this; } public function calculateRates(): self { return $this; } }