PluginProbe ʕ •ᴥ•ʔ
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress / 4.17.1
Paid Membership Plugin, Ecommerce, User Registration Form, Login Form, User Profile & Restrict Content – ProfilePress v4.17.1
4.17.1 4.17.0 4.16.19 4.16.18 4.16.17 4.16.16 trunk 1.0 1.0.1 1.0.2 1.1 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.5a 1.1.6 1.1.7 1.2 1.2.1 1.2.2 1.2.3 1.2.4 1.2.5 1.2.6 1.3 1.3.1 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.4 1.4.1 1.4.2 1.5 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 1.6 1.6.1 1.6.2 1.6.3 1.6.4 1.6.5 1.6.6 1.6.7 1.6.8 1.7 1.7.1 1.7.2 1.8 1.8.1 1.8.10 1.8.2 1.8.3 1.8.4 1.8.5 1.8.6 1.8.7 1.8.8 1.8.9 1.9 1.9.1 1.9.10 1.9.11 1.9.12 1.9.13 1.9.2 1.9.3 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.1.9 2.2.10 2.2.11 2.2.12 2.2.13 2.2.14 2.2.15 2.2.16 2.2.2 2.2.5 2.2.6 2.2.7 2.2.8 2.2.9 3.0 3.1 3.1.1 3.1.10 3.1.11 3.1.12 3.1.13 3.1.14 3.1.15 3.1.16 3.1.17 3.1.18 3.1.19 3.1.2 3.1.3 3.1.4 3.1.5 3.1.6 3.1.7 3.1.8 3.1.9 3.2.0 3.2.1 3.2.10 3.2.11 3.2.12 3.2.13 3.2.14 3.2.15 3.2.16 3.2.2 3.2.3 3.2.4 3.2.5 3.2.6 3.2.7 3.2.8 3.2.9 4.0.0 4.0.1 4.0.2 4.0.3 4.1.0 4.1.1 4.1.2 4.1.3 4.1.4 4.10.0 4.10.1 4.10.2 4.10.3 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.13.3 4.13.4 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.15.0 4.15.1 4.15.10 4.15.11 4.15.12 4.15.13 4.15.14 4.15.15 4.15.16 4.15.17 4.15.18 4.15.19 4.15.2 4.15.20 4.15.20.1 4.15.21 4.15.22 4.15.23 4.15.24 4.15.25 4.15.3 4.15.4 4.15.5 4.15.6 4.15.7 4.15.8 4.15.9 4.16.0 4.16.1 4.16.10 4.16.11 4.16.12 4.16.13 4.16.14 4.16.15 4.16.2 4.16.3 4.16.4 4.16.5 4.16.6 4.16.7 4.16.8 4.16.9 4.2.0 4.3.0 4.3.1 4.3.2 4.4.0 4.4.1 4.5.0 4.5.1 4.5.2 4.5.3 4.5.4 4.5.5 4.6.0 4.7.0 4.8.0 4.9.0
wp-user-avatar / src / Membership / Services / EUVATChecker / EuVatApi.php
wp-user-avatar / src / Membership / Services / EUVATChecker Last commit date
EuVatApi.php 4 years ago EuVatApiResponse.php 4 years ago index.php 3 years ago
EuVatApi.php
174 lines
1 <?php
2
3 namespace ProfilePress\Core\Membership\Services\EUVATChecker;
4
5
6 use ProfilePress\Core\Membership\Services\TaxService;
7
8 class EuVatApi
9 {
10 const API_URL = 'https://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl';
11
12 /**
13 * Check a VAT number against the supplied country code.
14 *
15 * @param string $vat_number The VAT number to check.
16 * @param string $country_code The country code.
17 *
18 * @return EUVATAPIResponse
19 */
20 public static function check_vat($vat_number, $country_code)
21 {
22 $result = new EuVatApiResponse($vat_number, $country_code);
23
24 if ( ! $vat_number) {
25 $result->error = EuVatApiResponse::NO_VAT_NUMBER;
26
27 return $result;
28 }
29
30 if ( ! $country_code) {
31
32 $result->error = EuVatApiResponse::NO_COUNTRY_CODE;
33
34 return $result;
35 }
36
37 // Check country is in the EU.
38 if ( ! in_array($country_code, self::get_eu_countries(), true)) {
39 $result->error = EuVatApiResponse::INVALID_COUNTRY_CODE;
40
41 return $result;
42 }
43
44 // Sanitize VAT number (remove white space, etc).
45 $vat_number = str_replace([' ', '.', '-'], '', strtoupper($vat_number));
46
47 // Check prefix.
48 $vat_prefix_for_country = self::get_vat_number_prefix($country_code);
49 $vat_number_prefix = substr($vat_number, 0, 2);
50
51 // If prefix is a valid VAT prefix but doesn't match selected country, return an error.
52 if ($vat_prefix_for_country !== $vat_number_prefix) {
53 $result->error = EuVatApiResponse::VAT_NUMBER_INVALID_FOR_COUNTRY;
54
55 return $result;
56 }
57
58 // Strip country code if VAT number starts with it.
59 if ($vat_prefix_for_country === $vat_number_prefix) {
60 $vat_number = substr($vat_number, 2);
61 }
62
63 $result = self::vies_request($result, $vat_number, $country_code, $vat_prefix_for_country);
64
65 // Catch all for invalid VAT number if no error set.
66 if ( ! $result->is_valid() && empty($result->error)) {
67 $result->error = EuVatApiResponse::INVALID_VAT_NUMBER;
68 }
69
70 return $result;
71 }
72
73 /**
74 * Makes a request to the VIES API
75 *
76 * @param EuVatApiResponse $result
77 * @param string $vat_number
78 * @param string $country_code
79 * @param string $vat_prefix_for_country
80 *
81 * @return EuVatApiResponse
82 */
83 private static function vies_request($result, $vat_number, $country_code, $vat_prefix_for_country)
84 {
85 try {
86
87 $cache_key = md5('ppress_eu_vat_vies_' . $country_code . '_' . $vat_number . '_' . $vat_prefix_for_country);
88
89 $response = get_transient($cache_key);
90
91 if (empty($response) || false === $response) {
92
93 // Create the SOAP client for VIES API call.
94 $client = new \SoapClient(self::API_URL);
95
96 // API parameters.
97 $parameters = [
98 'countryCode' => $vat_prefix_for_country,
99 'vatNumber' => $vat_number,
100 ];
101
102 // Fetch response.
103 $response = $client->checkVat($parameters);
104
105 // Save response for a day
106 set_transient($cache_key, $response, DAY_IN_SECONDS);
107 }
108
109 $result->valid = filter_var($response->valid, FILTER_VALIDATE_BOOLEAN);
110
111 // 3 dashes are returned in name and address field if not found
112 if ($response->name && '---' !== $response->name) {
113 $result->name = $response->name;
114 }
115
116 if ($response->address && '---' !== $response->address) {
117 $address = explode("\n", $response->address);
118
119 // Add country code to address
120 $address[] = $country_code;
121
122 $result->address = implode(', ', array_filter($address));
123 }
124 } catch (\Exception $exception) {
125 // Handle error.
126 $result->error = $exception->getMessage();
127 }
128
129 // Translate common errors.
130 if ('MS_UNAVAILABLE' === $result->error) {
131 $result->error = EuVatApiResponse::API_ERROR;
132 } elseif ('INVALID_INPUT' === $result->error) {
133 $result->error = EuVatApiResponse::INVALID_INPUT;
134 }
135
136 return $result;
137 }
138
139 /**
140 * Return the vat number prefix.
141 *
142 * @param string $country
143 *
144 * @return string
145 */
146 private static function get_vat_number_prefix($country)
147 {
148 switch ($country) {
149 // Greek VAT numbers begin with EL, not GR.
150 case 'GR' :
151 $vat_prefix = 'EL';
152 break;
153 // makes monaco use france's tax rate
154 case 'MC' :
155 $vat_prefix = 'FR';
156 break;
157 // makes UK use Northern ireland's tax rate
158 case 'GB' :
159 $vat_prefix = 'XI';
160 break;
161 default :
162 $vat_prefix = $country;
163 break;
164 }
165
166 return $vat_prefix;
167 }
168
169 private static function get_eu_countries()
170 {
171 return TaxService::init()->get_eu_countries();
172 }
173 }
174