├── .env.example ├── .gitignore ├── src ├── VatException.php ├── BusinessPortal │ ├── InvalidTinException.php │ ├── BusinessPortalException.php │ ├── Enum.php │ ├── Stock.php │ ├── Capital.php │ ├── Activity.php │ ├── Representative.php │ ├── Company.php │ └── BusinessPortal.php ├── VIES.php ├── Helpers.php ├── VatEntity.php └── TaxisNet.php ├── phpunit.xml ├── tests ├── BusinessPortalTest.php ├── ViesTest.php ├── Env.php └── TaxisTest.php ├── composer.json ├── LICENSE.md ├── README.md └── composer.lock /.env.example: -------------------------------------------------------------------------------- 1 | GGPS_USERNAME= 2 | GGPS_PASSWORD= 3 | BUSINESS_PORTAL_TOKEN= -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .phpunit.result.cache 3 | .env 4 | /vendor/ 5 | /.phpunit.cache/test-results 6 | -------------------------------------------------------------------------------- /src/VatException.php: -------------------------------------------------------------------------------- 1 | properties['id'] ?? null; 14 | } 15 | 16 | public function getDescription(): ?string 17 | { 18 | return $this->properties['descr'] ?? null; 19 | } 20 | } -------------------------------------------------------------------------------- /src/BusinessPortal/Stock.php: -------------------------------------------------------------------------------- 1 | properties['stockTypeId'] ?? null; 14 | } 15 | 16 | public function getAmount(): ?float 17 | { 18 | return $this->properties['amount'] ?? null; 19 | } 20 | 21 | public function getNominalPrice(): ?float 22 | { 23 | return $this->properties['nominalPrice'] ?? null; 24 | } 25 | 26 | public function getStockType(): ?string 27 | { 28 | return $this->properties['stockType'] ?? null; 29 | } 30 | } -------------------------------------------------------------------------------- /src/BusinessPortal/Capital.php: -------------------------------------------------------------------------------- 1 | properties['capitalStock'] ?? null; 14 | } 15 | 16 | public function getCurrency(): ?string 17 | { 18 | return $this->properties['currency'] ?? null; 19 | } 20 | 21 | public function getNonCapital(): ?float 22 | { 23 | return $this->properties['ecsokefalaiikes'] ?? null; 24 | } 25 | 26 | public function getBail(): ?float 27 | { 28 | return $this->properties['eggiitikes'] ?? null; 29 | } 30 | } -------------------------------------------------------------------------------- /phpunit.xml: -------------------------------------------------------------------------------- 1 | 2 | 10 | 11 | 12 | ./tests 13 | 14 | 15 | 16 | 17 | ./src 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /tests/BusinessPortalTest.php: -------------------------------------------------------------------------------- 1 | get('BUSINESS_PORTAL_TOKEN')); 21 | $company = $portal->searchCompany('094014201'); 22 | 23 | $this->assertSame("237901000", $company->getRegistrationNumber()); 24 | $this->assertSame("094014201", $company->getTin()); 25 | } 26 | } -------------------------------------------------------------------------------- /src/BusinessPortal/Activity.php: -------------------------------------------------------------------------------- 1 | properties['activity']['id'] ?? null; 14 | } 15 | 16 | public function getDescription(): ?string 17 | { 18 | return $this->properties['activity']['descr'] ?? null; 19 | } 20 | 21 | public function getDateFrom(): ?string 22 | { 23 | return $this->properties['dtFrom'] ?? null; 24 | } 25 | 26 | public function getDateTo(): ?string 27 | { 28 | return $this->properties['dtTo'] ?? null; 29 | } 30 | 31 | public function getType(): ?string 32 | { 33 | return $this->properties['type'] ?? null; 34 | } 35 | 36 | public function isPrimary(): bool 37 | { 38 | return $this->getType() === 'Κύρια'; 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /tests/ViesTest.php: -------------------------------------------------------------------------------- 1 | handle('EL', '094014201'); 14 | 15 | $this->assertTrue($entity->valid); 16 | $this->assertSame("094014201", $entity->vatNumber); 17 | $this->assertSame("ΤΡΑΠΕΖΑ ΕΘΝΙΚΗ ΤΗΣ ΕΛΛΑΔΟΣ ΑΝΩΝΥΜΗ ΕΤΑΙΡΕΙΑ", $entity->legalName); 18 | $this->assertSame("ΑΙΟΛΟΥ", $entity->street); 19 | $this->assertSame("86", $entity->streetNumber); 20 | $this->assertSame("10559", $entity->postcode); 21 | $this->assertSame("ΑΘΗΝΑ", $entity->city); 22 | } 23 | 24 | public function test_invalid_vat_number() 25 | { 26 | $vies = new VIES(); 27 | $entity = $vies->handle('EL', '000000000'); 28 | 29 | $this->assertNull($entity); 30 | } 31 | } -------------------------------------------------------------------------------- /composer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "firebed/vat-registry", 3 | "type": "package", 4 | "description": "Business Registry Information Search", 5 | "keywords": [ 6 | "Αναζήτηση ΑΦΜ", 7 | "ΑΦΜ", 8 | "Μητώο ΑΦΜ", 9 | "VAT Search", 10 | "VAT Registry", 11 | "Business Registry", 12 | "Search VAT" 13 | ], 14 | "license": "MIT", 15 | "authors": [ 16 | { 17 | "name": "Okan Giritli", 18 | "email": "okan.giritli@gmail.com" 19 | } 20 | ], 21 | "require": { 22 | "php": "^8.0", 23 | "ext-mbstring": "*", 24 | "ext-soap": "*", 25 | "ext-curl": "*" 26 | }, 27 | "require-dev": { 28 | "phpunit/phpunit": "^10.0" 29 | }, 30 | "autoload": { 31 | "psr-4": { 32 | "Firebed\\VatRegistry\\": "src/" 33 | } 34 | }, 35 | "autoload-dev": { 36 | "psr-4": { 37 | "Tests\\": "tests/" 38 | } 39 | }, 40 | "scripts": { 41 | "test": "phpunit" 42 | }, 43 | "config": { 44 | "optimize-autoloader": true, 45 | "preferred-install": "dist", 46 | "sort-packages": true 47 | }, 48 | "minimum-stability": "dev", 49 | "prefer-stable": true 50 | } 51 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 firebed 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /tests/Env.php: -------------------------------------------------------------------------------- 1 | variables = $variables; 44 | } 45 | 46 | public function get(string $key): ?string 47 | { 48 | return $this->variables[$key] ?? null; 49 | } 50 | } -------------------------------------------------------------------------------- /src/BusinessPortal/Representative.php: -------------------------------------------------------------------------------- 1 | properties['personName'] ?? null; 14 | } 15 | 16 | public function getBusinessName(): ?string 17 | { 18 | return $this->properties['businessName'] ?? null; 19 | } 20 | 21 | public function getRole(): ?string 22 | { 23 | return $this->properties['role'] ?? null; 24 | } 25 | 26 | public function getDateFrom(): ?string 27 | { 28 | return $this->properties['dtFrom'] ?? null; 29 | } 30 | 31 | public function getDateTo(): ?string 32 | { 33 | return $this->properties['dtTo'] ?? null; 34 | } 35 | 36 | public function isRepresentativeAlone(): ?bool 37 | { 38 | return filter_var($this->properties['isRepresentativeAlone'] ?? null, FILTER_VALIDATE_BOOLEAN); 39 | } 40 | 41 | public function isRepresentativeInCommon(): ?bool 42 | { 43 | return filter_var($this->properties['isRepresentativeInCommon'] ?? null, FILTER_VALIDATE_BOOLEAN); 44 | } 45 | 46 | public function getPercentage(): ?string 47 | { 48 | return $this->properties['percentage'] ?? null; 49 | } 50 | 51 | public function getCategory(): ?string 52 | { 53 | return $this->properties['category'] ?? null; 54 | } 55 | } -------------------------------------------------------------------------------- /src/VIES.php: -------------------------------------------------------------------------------- 1 | request($countryCode, $vatNumber); 21 | return $this->handleResponse($response); 22 | } catch (Throwable $e) { 23 | throw new VatException($e->getMessage()); 24 | } 25 | } 26 | 27 | /** 28 | * @throws VatException 29 | * @noinspection PhpUndefinedMethodInspection 30 | */ 31 | protected function request(string $countryCode, string $vatNumber) 32 | { 33 | $client = $this->createSoapClient(); 34 | $response = $client->checkVat(compact('countryCode', 'vatNumber')); 35 | 36 | if (!$response->valid) { 37 | return null; 38 | } 39 | 40 | return $response; 41 | } 42 | 43 | protected function createSoapClient(): SoapClient 44 | { 45 | return new SoapClient(self::ENDPOINT); 46 | } 47 | 48 | protected function handleResponse($response): ?VatEntity 49 | { 50 | if (!$response) { 51 | return null; 52 | } 53 | 54 | $vat = new VatEntity(); 55 | $vat->vatNumber = $response->vatNumber; 56 | $vat->valid = $response->valid; 57 | $vat->legalName = $response->name; 58 | 59 | $address = $this->trim($this->beforeLast($response->address, ' - ')); 60 | $street = $this->trim($this->beforeLast($address, ' ')); 61 | 62 | $vat->postcode = $this->trim($this->afterLast($address, ' ')); 63 | $vat->street = $this->trim($this->beforeLast($street, ' ')); 64 | $vat->streetNumber = $this->trim($this->afterLast($street, ' ')); 65 | $vat->city = $this->trim($this->afterLast($response->address, ' - ')); 66 | return $vat; 67 | } 68 | } -------------------------------------------------------------------------------- /tests/TaxisTest.php: -------------------------------------------------------------------------------- 1 | get('GGPS_USERNAME'), $env->get('GGPS_PASSWORD')); 15 | $entity = $registry->handle('094014201'); 16 | 17 | $this->assertTrue($entity->valid); 18 | $this->assertSame("094014201", $entity->vatNumber); 19 | $this->assertSame("1190", $entity->taxAuthorityId); 20 | $this->assertSame("ΚΕΦΟΔΕ ΑΤΤΙΚΗΣ", $entity->taxAuthorityName); 21 | $this->assertSame("ΜΗ ΦΠ", $entity->flagDescription); 22 | $this->assertSame("ΕΠΙΤΗΔΕΥΜΑΤΙΑΣ", $entity->firmFlagDescription); 23 | $this->assertSame("ΕΝΕΡΓΟΣ ΑΦΜ", $entity->validityDescription); 24 | $this->assertSame("ΤΡΑΠΕΖΑ ΕΘΝΙΚΗ ΤΗΣ ΕΛΛΑΔΟΣ ΑΝΩΝΥΜΗ ΕΤΑΙΡΕΙΑ", $entity->legalName); 25 | $this->assertSame("ΑΕ", $entity->legalStatusDescription); 26 | $this->assertSame("ΑΙΟΛΟΥ", $entity->street); 27 | $this->assertSame("86", $entity->streetNumber); 28 | $this->assertSame("10559", $entity->postcode); 29 | $this->assertSame("ΑΘΗΝΑ", $entity->city); 30 | $this->assertSame("1900-01-01", $entity->registrationDate); 31 | $this->assertNull($entity->stopDate); 32 | $this->assertSame(true, $entity->normalVat); 33 | $this->assertSame(true, $entity->isCompany()); 34 | $this->assertSame(false, $entity->isNaturalPerson()); 35 | $this->assertSame(true, $entity->isActive()); 36 | 37 | $this->assertCount(2, $entity->firms); 38 | 39 | $this->assertSame("64191204", $entity->firms[0]['code']); 40 | $this->assertSame("ΥΠΗΡΕΣΙΕΣ ΤΡΑΠΕΖΩΝ", $entity->firms[0]['description']); 41 | $this->assertSame("1", $entity->firms[0]['kind']); 42 | $this->assertSame("ΚΥΡΙΑ", $entity->firms[0]['kindDescription']); 43 | 44 | $this->assertSame("66221001", $entity->firms[1]['code']); 45 | $this->assertSame("ΥΠΗΡΕΣΙΕΣ ΑΣΦΑΛΙΣΤΙΚΟΥ ΠΡΑΚΤΟΡΑ ΚΑΙ ΑΣΦΑΛΙΣΤΙΚΟΥ ΣΥΜΒΟΥΛΟΥ", $entity->firms[1]['description']); 46 | $this->assertSame("2", $entity->firms[1]['kind']); 47 | $this->assertSame("ΔΕΥΤΕΡΕΥΟΥΣΑ", $entity->firms[1]['kindDescription']); 48 | } 49 | 50 | public function test_invalid_vat_number() 51 | { 52 | $env = new Env(); 53 | 54 | $registry = new TaxisNet($env->get('GGPS_USERNAME'), $env->get('GGPS_PASSWORD')); 55 | $entity = $registry->handle('000000000'); 56 | 57 | $this->assertNull($entity); 58 | } 59 | } -------------------------------------------------------------------------------- /src/Helpers.php: -------------------------------------------------------------------------------- 1 | blank($value); 45 | } 46 | 47 | /** 48 | * Trim the given string. 49 | * 50 | * @param string|null $value 51 | * @return string|null 52 | */ 53 | public function trim(?string $value): ?string 54 | { 55 | return $value === null ? null : trim($value); 56 | } 57 | 58 | /** 59 | * Get the portion of a string after the last occurrence of a given value. 60 | * 61 | * @param string $subject 62 | * @param string $search 63 | * @return string 64 | */ 65 | public function afterLast(string $subject, string $search): string 66 | { 67 | $position = mb_strrpos($subject, $search); 68 | 69 | return $position === false ? $subject : mb_substr($subject, $position + strlen($search), null, 'UTF-8'); 70 | 71 | } 72 | 73 | /** 74 | * Get the portion of a string before the last occurrence of a given value. 75 | * 76 | * @param string $subject 77 | * @param string $search 78 | * @return string 79 | */ 80 | public function beforeLast(string $subject, string $search): string 81 | { 82 | $position = mb_strrpos($subject, $search); 83 | 84 | return $position === false ? $subject : mb_substr($subject, 0, $position, 'UTF-8'); 85 | } 86 | 87 | /** 88 | * Wrap the given value in an array if it is not already an array. 89 | * 90 | * @param mixed $value 91 | * @return array 92 | */ 93 | public function wrapArray(mixed $value): array 94 | { 95 | if (is_null($value)) { 96 | return []; 97 | } 98 | 99 | return is_array($value) ? $value : [$value]; 100 | } 101 | } -------------------------------------------------------------------------------- /src/VatEntity.php: -------------------------------------------------------------------------------- 1 | flagDescription === "ΜΗ ΦΠ"; 100 | } 101 | 102 | public function isNaturalPerson(): bool 103 | { 104 | return $this->flagDescription === "ΦΠ"; 105 | } 106 | 107 | public function isActive(): bool 108 | { 109 | return $this->firmFlagDescription === "ΕΠΙΤΗΔΕΥΜΑΤΙΑΣ" || $this->stopDate === null; 110 | } 111 | } -------------------------------------------------------------------------------- /src/TaxisNet.php: -------------------------------------------------------------------------------- 1 | username = $username; 24 | $this->password = $password; 25 | } 26 | 27 | /** 28 | * @throws VatException 29 | */ 30 | public function handle(string $vatToSearch, string $vatCalledBy = null): ?VatEntity 31 | { 32 | if ($this->blank($vatToSearch)) { 33 | throw new VatException("Please provide a VAT number"); 34 | } 35 | 36 | try { 37 | $response = $this->request($vatToSearch, $vatCalledBy); 38 | return $this->handleResponse($response); 39 | } catch (Throwable $e) { 40 | throw new VatException($e->getMessage()); 41 | } 42 | } 43 | 44 | /** 45 | * @throws VatException|SoapFault 46 | * @noinspection PhpUndefinedMethodInspection 47 | */ 48 | protected function request(string $vatToSearch, string $vatCalledBy = null) 49 | { 50 | $client = $this->createSoapClient(); 51 | $response = $client->rgWsPublic2AfmMethod([ 52 | 'INPUT_REC' => [ 53 | 'afm_called_by' => $vatCalledBy, 54 | 'afm_called_for' => $vatToSearch 55 | ] 56 | ]); 57 | 58 | $this->validateResponse($response); 59 | 60 | return $response->result->rg_ws_public2_result_rtType; 61 | } 62 | 63 | /** 64 | * @return SoapClient 65 | * @throws SoapFault 66 | */ 67 | protected function createSoapClient(): SoapClient 68 | { 69 | $headers = $this->prepareHeaders($this->username, $this->password); 70 | 71 | $client = new SoapClient(self::WSDL, ['soap_version' => SOAP_1_2]); 72 | $client->__setSoapHeaders($headers); 73 | 74 | return $client; 75 | } 76 | 77 | protected function prepareHeaders(string $username, string $password): SoapHeader 78 | { 79 | $header = new stdClass(); 80 | $header->UsernameToken = new stdClass(); 81 | $header->UsernameToken->Username = $username; 82 | $header->UsernameToken->Password = $password; 83 | 84 | return new SoapHeader(self::XSD, 'Security', $header); 85 | } 86 | 87 | /** 88 | * @throws VatException 89 | */ 90 | protected function validateResponse($response): void 91 | { 92 | if (!isset($response->result->rg_ws_public2_result_rtType)) { 93 | $this->invalidResponse(); 94 | } 95 | } 96 | 97 | /** 98 | * @throws VatException 99 | */ 100 | protected function invalidResponse() 101 | { 102 | throw new VatException("Invalid response from TaxisNet"); 103 | } 104 | 105 | /** 106 | * @throws VatException 107 | */ 108 | protected function handleResponse($response): ?VatEntity 109 | { 110 | $error = $response->error_rec; 111 | if ($this->filled($error->error_code)) { 112 | if ($error->error_code === "RG_WS_PUBLIC_WRONG_AFM") { 113 | return null; 114 | } 115 | 116 | throw new VatException(trim($error->error_descr)); 117 | } 118 | 119 | return $this->parseResponse($response); 120 | } 121 | 122 | protected function parseResponse(object $data): VatEntity 123 | { 124 | $rec = $data->basic_rec; 125 | 126 | $vat = new VatEntity(); 127 | $vat->vatNumber = $this->trim($rec->afm); 128 | $vat->taxAuthorityId = $this->trim($rec->doy); 129 | $vat->taxAuthorityName = $this->trim($rec->doy_descr); 130 | $vat->flagDescription = $this->trim($rec->i_ni_flag_descr); 131 | $vat->valid = $this->trim($rec->deactivation_flag) === "1"; 132 | $vat->validityDescription = $this->trim($rec->deactivation_flag_descr); 133 | $vat->firmFlagDescription = $this->trim($rec->firm_flag_descr); 134 | $vat->legalName = preg_replace('!\s+!', ' ', $this->trim($rec->onomasia)); 135 | $vat->commerceTitle = $this->trim($rec->commer_title); 136 | $vat->legalStatusDescription = $this->trim($rec->legal_status_descr); 137 | $vat->street = $this->trim($rec->postal_address); 138 | $vat->streetNumber = $this->trim($rec->postal_address_no); 139 | $vat->postcode = $this->trim($rec->postal_zip_code); 140 | $vat->city = $this->trim($rec->postal_area_description); 141 | $vat->registrationDate = $this->trim($rec->regist_date); 142 | $vat->stopDate = $this->trim($rec->stop_date); 143 | $vat->normalVat = $this->trim($rec->normal_vat_system_flag) === 'Y'; 144 | 145 | if (isset($data->firm_act_tab->item)) { 146 | $firms = $this->wrapArray($data->firm_act_tab->item); 147 | 148 | foreach ($firms as $firm) { 149 | $vat->firms[] = [ 150 | 'code' => $this->trim($firm->firm_act_code), 151 | 'description' => $this->trim($firm->firm_act_descr), 152 | 'kind' => $this->trim($firm->firm_act_kind), 153 | 'kindDescription' => $this->trim($firm->firm_act_kind_descr), 154 | ]; 155 | } 156 | } else { 157 | $vat->firms = []; 158 | } 159 | 160 | return $vat; 161 | } 162 | } -------------------------------------------------------------------------------- /src/BusinessPortal/Company.php: -------------------------------------------------------------------------------- 1 | properties['legalType']) ? new Enum($this->properties['legalType']) : null; 14 | } 15 | 16 | public function getZipCode(): ?string 17 | { 18 | return $this->properties['zipCode'] ?? null; 19 | } 20 | 21 | public function getMunicipality(): ?Enum 22 | { 23 | return !empty($this->properties['municipality']) ? new Enum($this->properties['municipality']) : null; 24 | } 25 | 26 | public function getRegistrationNumber(): ?string 27 | { 28 | return $this->properties['arGemi'] ?? null; 29 | } 30 | 31 | public function getCity(): ?string 32 | { 33 | return $this->properties['city'] ?? null; 34 | } 35 | 36 | public function getStreetNumber(): ?string 37 | { 38 | return $this->properties['streetNumber'] ?? null; 39 | } 40 | 41 | public function getTin(): ?string 42 | { 43 | return $this->properties['afm'] ?? null; 44 | } 45 | 46 | public function getPhone(): ?string 47 | { 48 | return $this->properties['phone'] ?? null; 49 | } 50 | 51 | public function getFax(): ?string 52 | { 53 | return $this->properties['fax'] ?? null; 54 | } 55 | 56 | public function getUrl(): ?string 57 | { 58 | return $this->properties['url'] ?? null; 59 | } 60 | 61 | public function getEmail(): ?string 62 | { 63 | return $this->properties['email'] ?? null; 64 | } 65 | 66 | public function isBranch(): bool 67 | { 68 | return filter_var($this->properties['isBranch'] ?? false, FILTER_VALIDATE_BOOLEAN); 69 | } 70 | 71 | public function getProfession(): ?string 72 | { 73 | return $this->properties['objective'] ?? null; 74 | } 75 | 76 | public function getCompanyNamesEn(): array 77 | { 78 | return $this->properties['coNamesEn'] ?? []; 79 | } 80 | 81 | public function isAutoRegistered(): bool 82 | { 83 | return filter_var($this->properties['autoRegistered'] ?? false, FILTER_VALIDATE_BOOLEAN); 84 | } 85 | 86 | public function getCompanyNameEl(): ?string 87 | { 88 | return $this->properties['coNameEl'] ?? null; 89 | } 90 | 91 | public function getLastStatusChange(): ?string 92 | { 93 | return $this->properties['lastStatusChange'] ?? null; 94 | } 95 | 96 | public function getStatus(): ?Enum 97 | { 98 | return !empty($this->properties['status']) ? new Enum($this->properties['status']) : null; 99 | } 100 | 101 | public function getTaxOffice(): ?Enum 102 | { 103 | return !empty($this->properties['prefecture']) ? new Enum($this->properties['prefecture']) : null; 104 | } 105 | 106 | public function getStreet(): ?string 107 | { 108 | return $this->properties['street'] ?? null; 109 | } 110 | 111 | public function getCommercialRegistryOffice(): ?Enum 112 | { 113 | return !empty($this->properties['gemiOffice']) ? new Enum($this->properties['gemiOffice']) : null; 114 | } 115 | 116 | /** 117 | * @return Activity[] 118 | */ 119 | public function getActivities(): array 120 | { 121 | $activities = []; 122 | if (!empty($this->properties['activities']) && is_array($this->properties['activities'])) { 123 | foreach ($this->properties['activities'] as $activityData) { 124 | $activities[] = new Activity($activityData); 125 | } 126 | } 127 | return $activities; 128 | } 129 | 130 | public function getCommerceTitlesEl(): array 131 | { 132 | return $this->properties['coTitlesEl'] ?? []; 133 | } 134 | 135 | public function getCommerceTitlesEn(): array 136 | { 137 | return $this->properties['coTitlesEn'] ?? []; 138 | } 139 | 140 | public function getIncorporationDate(): ?string 141 | { 142 | return $this->properties['incorporationDate'] ?? null; 143 | } 144 | 145 | /** 146 | * @return Representative[] 147 | */ 148 | public function getRepresentatives(): array 149 | { 150 | $representatives = []; 151 | if (!empty($this->properties['persons']) && is_array($this->properties['persons'])) { 152 | foreach ($this->properties['persons'] as $personData) { 153 | $representatives[] = new Representative($personData); 154 | } 155 | } 156 | return $representatives; 157 | } 158 | 159 | /** 160 | * @return Capital[] 161 | */ 162 | public function getCapital(): array 163 | { 164 | $capitals = []; 165 | if (!empty($this->properties['capital']) && is_array($this->properties['capital'])) { 166 | foreach ($this->properties['capital'] as $capitalData) { 167 | $capitals[] = new Capital($capitalData); 168 | } 169 | } 170 | return $capitals; 171 | } 172 | 173 | /** 174 | * @return Stock[] 175 | */ 176 | public function getStocks(): array 177 | { 178 | $stocks = []; 179 | if (!empty($this->properties['stocks']) && is_array($this->properties['stocks'])) { 180 | foreach ($this->properties['stocks'] as $stockData) { 181 | $stocks[] = new Stock($stockData); 182 | } 183 | } 184 | return $stocks; 185 | } 186 | 187 | public function getBranch(): array 188 | { 189 | return $this->properties['branch'] ?? []; 190 | } 191 | 192 | public function toArray(): array 193 | { 194 | return $this->properties; 195 | } 196 | } -------------------------------------------------------------------------------- /src/BusinessPortal/BusinessPortal.php: -------------------------------------------------------------------------------- 1 | validateGreekTin($tin); 30 | 31 | $query = [ 32 | 'afm' => $tin, 33 | 'resultsSize' => 1, 34 | ]; 35 | 36 | if (! is_null($isActive)) { 37 | $query['isActive'] = $isActive; 38 | } 39 | 40 | $response = $this->cursor('/companies', $query); 41 | 42 | if (empty($response['searchResults']) || ! is_array($response['searchResults'])) { 43 | return null; 44 | } 45 | 46 | return new Company($response['searchResults'][0]); 47 | } 48 | 49 | /** 50 | * @throws BusinessPortalException 51 | */ 52 | public function showCompany(string $registrationNumber): ?Company 53 | { 54 | $response = $this->cursor("/companies/$registrationNumber"); 55 | 56 | if (empty($response)) { 57 | return null; 58 | } 59 | 60 | return new Company($response); 61 | } 62 | 63 | public function getLastHttpCode(): ?int 64 | { 65 | return $this->lastHttpCode; 66 | } 67 | 68 | /** 69 | * @throws BusinessPortalException 70 | */ 71 | private function cursor(string $url, array $query = []): array 72 | { 73 | $ch = curl_init(); 74 | 75 | $fullUrl = self::BASE_URL . $url; 76 | if (! empty($query)) { 77 | $fullUrl .= '?' . http_build_query($query); 78 | } 79 | 80 | curl_setopt($ch, CURLOPT_URL, $fullUrl); 81 | curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 82 | curl_setopt($ch, CURLOPT_HTTPGET, true); 83 | 84 | $this->setupCurlSslOptions($ch); 85 | 86 | curl_setopt($ch, CURLOPT_HTTPHEADER, [ 87 | 'api_key: ' . $this->apiKey, 88 | 'Accept: application/json', 89 | ]); 90 | 91 | $result = curl_exec($ch); 92 | $err = null; 93 | if (curl_errno($ch)) { 94 | $err = curl_error($ch); 95 | $code = curl_errno($ch); 96 | curl_close($ch); 97 | throw new BusinessPortalException($err, $code); 98 | } 99 | 100 | $this->lastHttpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 101 | 102 | curl_close($ch); 103 | 104 | if ($this->lastHttpCode < 200 || $this->lastHttpCode >= 300) { 105 | throw new BusinessPortalException($err ?: 'HTTP error: ' . $this->lastHttpCode, $this->lastHttpCode); 106 | } 107 | 108 | $decoded = json_decode($result, true); 109 | if ($decoded === null && json_last_error() !== JSON_ERROR_NONE) { 110 | throw new BusinessPortalException('Invalid JSON response: ' . json_last_error_msg()); 111 | } 112 | 113 | return $decoded ?? []; 114 | } 115 | 116 | /** 117 | * @throws InvalidTinException 118 | */ 119 | private function validateGreekTin(string $tin): void 120 | { 121 | if (strlen($tin) !== 9) { 122 | throw new InvalidTinException("The given vat number '$tin' is invalid."); 123 | } 124 | 125 | for ($i = 7, $multiplier = 1, $sum = 0; $i >= 0; $i--) { 126 | $sum += ((int) $tin[$i]) * $multiplier <<= 1; 127 | } 128 | 129 | if ($sum % 11 % 10 != $tin[8]) { 130 | throw new InvalidTinException("The given vat number '$tin' is invalid."); 131 | } 132 | } 133 | 134 | /** 135 | * This method sets up SSL options for the cURL handle. 136 | * All credits and blames go to claude.ai. 137 | * 138 | * @param CurlHandle|bool $ch 139 | * @return void 140 | */ 141 | private function setupCurlSslOptions(CurlHandle|bool $ch): void 142 | { 143 | if (! $this->verifyPeer) { 144 | curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 145 | curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 146 | return; 147 | } 148 | 149 | if (defined('CURLSSLOPT_NATIVE_CA') && version_compare(curl_version()['version'], '7.71', '>=')) { 150 | curl_setopt($ch, CURLOPT_SSL_OPTIONS, CURLSSLOPT_NATIVE_CA); 151 | return; 152 | } 153 | 154 | $caInfo = ini_get('curl.cainfo'); 155 | if (! empty($caInfo) && file_exists($caInfo)) { 156 | curl_setopt($ch, CURLOPT_CAINFO, $caInfo); 157 | return; 158 | } 159 | 160 | $opensslCaFile = ini_get('openssl.cafile'); 161 | if (! empty($opensslCaFile) && file_exists($opensslCaFile)) { 162 | curl_setopt($ch, CURLOPT_CAINFO, $opensslCaFile); 163 | return; 164 | } 165 | 166 | $caBundlePaths = [ 167 | '/etc/ssl/certs/ca-certificates.crt', // Debian/Ubuntu 168 | '/etc/pki/tls/certs/ca-bundle.crt', // RedHat/CentOS 169 | '/etc/ssl/ca-bundle.pem', // OpenSUSE 170 | '/etc/pki/ca-trust/extracted/pem/tls-ca-bundle.pem', // CentOS 7+ 171 | '/etc/ssl/cert.pem', // Alpine/macOS 172 | '/usr/local/etc/openssl/cert.pem', // macOS Homebrew 173 | ]; 174 | 175 | foreach ($caBundlePaths as $path) { 176 | if (file_exists($path)) { 177 | curl_setopt($ch, CURLOPT_CAINFO, $path); 178 | return; 179 | } 180 | } 181 | } 182 | } -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Search for Basic Business Registry Information 2 | 3 | Using this service, legal entities, legal persons, and natural persons with income from business activity can search for basic information in order to verify the tax or professional status of other legal entities, legal persons, or taxpayers/natural persons conducting business activity. 4 | 5 | The system provides 3 ways to search for basic business registry information: 6 | 7 | - Through the Basic Business Registry Information Search Service 8 | - Through the Business Registry Service (ΓΕ.ΜΗ.) 9 | - Through the VAT Information Exchange System (VIES) Service 10 | 11 | ## Installation 12 | 13 | ```bash 14 | composer require firebed/vat-registry 15 | ``` 16 | 17 | ## Through the Basic Business Registry Information Search Service 18 | 19 | This service allows searching all Greek VAT numbers. For the search, you will need a `username` and a `password`. 20 | 21 | Registration process: 22 | 23 | - Register with the [service](https://www1.aade.gr/webtax/wspublicreg/faces/pages/wspublicreg/menu.xhtml) using TAXISnet credentials. 24 | - Obtain special access credentials through the [Special Credentials Management](https://www1.aade.gr/sgsisapps/tokenservices/protected/displayConsole.htm) application. 25 | 26 | For more details and registration, visit the [Official AADE Page](https://www.aade.gr/anazitisi-basikon-stoiheion-mitrooy-epiheiriseon). 27 | 28 | After registration, you will have the `username` and `password` needed to use the service. 29 | 30 | ```php 31 | use Firebed\VatRegistry\TaxisNet; 32 | use Firebed\VatRegistry\VatException; 33 | 34 | $username = 'your-username'; 35 | $password = 'your-password'; 36 | 37 | $taxis = new TaxisNet($username, $password); 38 | 39 | try { 40 | $entity = $taxis->handle('094014201'); 41 | 42 | print_r($entity); 43 | } catch (VatException $exception) { 44 | echo "Σφάλμα: " . $exception->getMessage(); 45 | } 46 | ``` 47 | 48 | The result of the above call: 49 | 50 | ```php 51 | Firebed\VatRegistry\VatEntity { 52 | +vatNumber: "094014201" 53 | +taxAuthorityId: "1159" 54 | +taxAuthorityName: "ΦΑΕ ΑΘΗΝΩΝ" 55 | +flagDescription: "ΜΗ ΦΠ" 56 | +valid: true 57 | +validityDescription: "ΕΝΕΡΓΟΣ ΑΦΜ" 58 | +firmFlagDescription: "ΕΠΙΤΗΔΕΥΜΑΤΙΑΣ" 59 | +legalName: "ΤΡΑΠΕΖΑ ΕΘΝΙΚΗ ΤΗΣ ΕΛΛΑΔΟΣ ΑΝΩΝΥΜΗ ΕΤΑΙΡΕΙΑ" 60 | +commerceTitle: "" 61 | +legalStatusDescription: "ΑΕ" 62 | +street: "ΑΙΟΛΟΥ" 63 | +streetNumber: "86" 64 | +postcode: "10559" 65 | +city: "ΑΘΗΝΑ" 66 | +registrationDate: "1900-01-01" 67 | +stopDate: "" 68 | +normalVat: true 69 | +firms: array:2 [ 70 | 0 => array:4 [ 71 | "code" => "64191204" 72 | "description" => "ΥΠΗΡΕΣΙΕΣ ΤΡΑΠΕΖΩΝ" 73 | "kind" => "1" 74 | "kindDescription" => "ΚΥΡΙΑ" 75 | ] 76 | 1 => array:4 [ 77 | "code" => "66221001" 78 | "description" => "ΥΠΗΡΕΣΙΕΣ ΑΣΦΑΛΙΣΤΙΚΟΥ ΠΡΑΚΤΟΡΑ ΚΑΙ ΑΣΦΑΛΙΣΤΙΚΟΥ ΣΥΜΒΟΥΛΟΥ" 79 | "kind" => "2" 80 | "kindDescription" => "ΔΕΥΤΕΡΕΥΟΥΣΑ" 81 | ] 82 | ] 83 | } 84 | ``` 85 | 86 | ### Check Natural Person / Company 87 | 88 | ```php 89 | $entity->isNaturalPerson(); 90 | $entity->isCompany(); 91 | ``` 92 | 93 | ### Check Activity Status 94 | 95 | ```php 96 | // Returns true if the business is active 97 | // Returns false if the business has been discontinued 98 | $entity->isActive(); 99 | ``` 100 | 101 | If the VAT number is not valid, a `null` value is returned. If there was another issue, the `VatException` will contain the relevant error message. 102 | 103 | ## Through the Business Registry Service (ΓΕ.ΜΗ.) 104 | 105 | This service allows searching all VAT numbers registered in the General Commercial Registry (ΓΕ.ΜΗ.). 106 | The Business Portal API requires an API key. You can request an API key by registering at [https://opendata.businessportal.gr/register/](https://opendata.businessportal.gr/register/) and following the instructions to obtain an API key for the Open Data API. 107 | 108 | - Official Swagger documentation: [https://opendata-api.businessportal.gr/opendata/docs/](https://opendata-api.businessportal.gr/opendata/docs/) 109 | - Technical details about the API: [https://opendata.businessportal.gr/techdocs/](https://opendata.businessportal.gr/techdocs/) 110 | 111 | Before processing the request to the Business Portal API, this package will first check if the provided VAT number is valid, according to the Greek VAT number format. In case the VAT number is invalid, an `InvalidTinException` will be thrown. 112 | 113 | ```php 114 | 115 | use Firebed\VatRegistry\BusinessPortal\BusinessPortal; 116 | 117 | $portal = new BusinessPortal('your-api-key'); 118 | 119 | // Search by company TIN 120 | $response = $portal->searchCompany('094014201'); 121 | 122 | // Search by company registration number (ΓΕ.Ε.Μ.) 123 | $response = $portal->showCompany('000237954001'); 124 | 125 | var_dump($response); 126 | ``` 127 | 128 | 129 | ## Through the VAT Information Exchange System (VIES) Service 130 | 131 | Using the VIES Service, you can verify the validity of a VAT number issued by any member state of the European Union. The details it provides are more limited compared to the AADE service. 132 | 133 | The service is provided free of charge without registration with any entity. It accepts 2 parameters: 134 | - The country code (e.g., EL for Greece) 135 | - The VAT number you want to verify. 136 | 137 | ```php 138 | use Firebed\VatRegistry\VIES; 139 | use Firebed\VatRegistry\VatException; 140 | 141 | $taxis = new VIES(); 142 | 143 | try { 144 | $entity = $taxis->handle('EL', '094014201'); 145 | 146 | print_r($entity); 147 | } catch (VatException $exception) { 148 | echo "Σφάλμα: " . $exception->getMessage(); 149 | } 150 | ``` 151 | 152 | The result of the above call: 153 | 154 | ```php 155 | Firebed\VatRegistry\VatEntity { 156 | +vatNumber: "094014201" 157 | +taxAuthorityId: null 158 | +taxAuthorityName: null 159 | +flagDescription: null 160 | +valid: true 161 | +validityDescription: null 162 | +firmflagDescription: null 163 | +legalName: "ΤΡΑΠΕΖΑ ΕΘΝΙΚΗ ΤΗΣ ΕΛΛΑΔΟΣ ΑΝΩΝΥΜΗ ΕΤΑΙΡΕΙΑ" 164 | +commerceTitle: null 165 | +legalStatusDescription: null 166 | +street: "ΑΙΟΛΟΥ" 167 | +streetNumber: "86" 168 | +postcode: "10559" 169 | +city: "ΑΘΗΝΑ" 170 | +registrationDate: null 171 | +stopDate: null 172 | +normalVat: null 173 | +firms: [] 174 | } 175 | ``` 176 | 177 | If the VAT number is not valid, the service returns `null`. -------------------------------------------------------------------------------- /composer.lock: -------------------------------------------------------------------------------- 1 | { 2 | "_readme": [ 3 | "This file locks the dependencies of your project to a known state", 4 | "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", 5 | "This file is @generated automatically" 6 | ], 7 | "content-hash": "f24a55db287c5832be51c2a93cfe6bcb", 8 | "packages": [], 9 | "packages-dev": [ 10 | { 11 | "name": "myclabs/deep-copy", 12 | "version": "1.11.1", 13 | "source": { 14 | "type": "git", 15 | "url": "https://github.com/myclabs/DeepCopy.git", 16 | "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c" 17 | }, 18 | "dist": { 19 | "type": "zip", 20 | "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", 21 | "reference": "7284c22080590fb39f2ffa3e9057f10a4ddd0e0c", 22 | "shasum": "" 23 | }, 24 | "require": { 25 | "php": "^7.1 || ^8.0" 26 | }, 27 | "conflict": { 28 | "doctrine/collections": "<1.6.8", 29 | "doctrine/common": "<2.13.3 || >=3,<3.2.2" 30 | }, 31 | "require-dev": { 32 | "doctrine/collections": "^1.6.8", 33 | "doctrine/common": "^2.13.3 || ^3.2.2", 34 | "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" 35 | }, 36 | "type": "library", 37 | "autoload": { 38 | "files": [ 39 | "src/DeepCopy/deep_copy.php" 40 | ], 41 | "psr-4": { 42 | "DeepCopy\\": "src/DeepCopy/" 43 | } 44 | }, 45 | "notification-url": "https://packagist.org/downloads/", 46 | "license": [ 47 | "MIT" 48 | ], 49 | "description": "Create deep copies (clones) of your objects", 50 | "keywords": [ 51 | "clone", 52 | "copy", 53 | "duplicate", 54 | "object", 55 | "object graph" 56 | ], 57 | "support": { 58 | "issues": "https://github.com/myclabs/DeepCopy/issues", 59 | "source": "https://github.com/myclabs/DeepCopy/tree/1.11.1" 60 | }, 61 | "funding": [ 62 | { 63 | "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", 64 | "type": "tidelift" 65 | } 66 | ], 67 | "time": "2023-03-08T13:26:56+00:00" 68 | }, 69 | { 70 | "name": "nikic/php-parser", 71 | "version": "v5.0.2", 72 | "source": { 73 | "type": "git", 74 | "url": "https://github.com/nikic/PHP-Parser.git", 75 | "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13" 76 | }, 77 | "dist": { 78 | "type": "zip", 79 | "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/139676794dc1e9231bf7bcd123cfc0c99182cb13", 80 | "reference": "139676794dc1e9231bf7bcd123cfc0c99182cb13", 81 | "shasum": "" 82 | }, 83 | "require": { 84 | "ext-ctype": "*", 85 | "ext-json": "*", 86 | "ext-tokenizer": "*", 87 | "php": ">=7.4" 88 | }, 89 | "require-dev": { 90 | "ircmaxell/php-yacc": "^0.0.7", 91 | "phpunit/phpunit": "^7.0 || ^8.0 || ^9.0" 92 | }, 93 | "bin": [ 94 | "bin/php-parse" 95 | ], 96 | "type": "library", 97 | "extra": { 98 | "branch-alias": { 99 | "dev-master": "5.0-dev" 100 | } 101 | }, 102 | "autoload": { 103 | "psr-4": { 104 | "PhpParser\\": "lib/PhpParser" 105 | } 106 | }, 107 | "notification-url": "https://packagist.org/downloads/", 108 | "license": [ 109 | "BSD-3-Clause" 110 | ], 111 | "authors": [ 112 | { 113 | "name": "Nikita Popov" 114 | } 115 | ], 116 | "description": "A PHP parser written in PHP", 117 | "keywords": [ 118 | "parser", 119 | "php" 120 | ], 121 | "support": { 122 | "issues": "https://github.com/nikic/PHP-Parser/issues", 123 | "source": "https://github.com/nikic/PHP-Parser/tree/v5.0.2" 124 | }, 125 | "time": "2024-03-05T20:51:40+00:00" 126 | }, 127 | { 128 | "name": "phar-io/manifest", 129 | "version": "2.0.4", 130 | "source": { 131 | "type": "git", 132 | "url": "https://github.com/phar-io/manifest.git", 133 | "reference": "54750ef60c58e43759730615a392c31c80e23176" 134 | }, 135 | "dist": { 136 | "type": "zip", 137 | "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", 138 | "reference": "54750ef60c58e43759730615a392c31c80e23176", 139 | "shasum": "" 140 | }, 141 | "require": { 142 | "ext-dom": "*", 143 | "ext-libxml": "*", 144 | "ext-phar": "*", 145 | "ext-xmlwriter": "*", 146 | "phar-io/version": "^3.0.1", 147 | "php": "^7.2 || ^8.0" 148 | }, 149 | "type": "library", 150 | "extra": { 151 | "branch-alias": { 152 | "dev-master": "2.0.x-dev" 153 | } 154 | }, 155 | "autoload": { 156 | "classmap": [ 157 | "src/" 158 | ] 159 | }, 160 | "notification-url": "https://packagist.org/downloads/", 161 | "license": [ 162 | "BSD-3-Clause" 163 | ], 164 | "authors": [ 165 | { 166 | "name": "Arne Blankerts", 167 | "email": "arne@blankerts.de", 168 | "role": "Developer" 169 | }, 170 | { 171 | "name": "Sebastian Heuer", 172 | "email": "sebastian@phpeople.de", 173 | "role": "Developer" 174 | }, 175 | { 176 | "name": "Sebastian Bergmann", 177 | "email": "sebastian@phpunit.de", 178 | "role": "Developer" 179 | } 180 | ], 181 | "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", 182 | "support": { 183 | "issues": "https://github.com/phar-io/manifest/issues", 184 | "source": "https://github.com/phar-io/manifest/tree/2.0.4" 185 | }, 186 | "funding": [ 187 | { 188 | "url": "https://github.com/theseer", 189 | "type": "github" 190 | } 191 | ], 192 | "time": "2024-03-03T12:33:53+00:00" 193 | }, 194 | { 195 | "name": "phar-io/version", 196 | "version": "3.2.1", 197 | "source": { 198 | "type": "git", 199 | "url": "https://github.com/phar-io/version.git", 200 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" 201 | }, 202 | "dist": { 203 | "type": "zip", 204 | "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 205 | "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", 206 | "shasum": "" 207 | }, 208 | "require": { 209 | "php": "^7.2 || ^8.0" 210 | }, 211 | "type": "library", 212 | "autoload": { 213 | "classmap": [ 214 | "src/" 215 | ] 216 | }, 217 | "notification-url": "https://packagist.org/downloads/", 218 | "license": [ 219 | "BSD-3-Clause" 220 | ], 221 | "authors": [ 222 | { 223 | "name": "Arne Blankerts", 224 | "email": "arne@blankerts.de", 225 | "role": "Developer" 226 | }, 227 | { 228 | "name": "Sebastian Heuer", 229 | "email": "sebastian@phpeople.de", 230 | "role": "Developer" 231 | }, 232 | { 233 | "name": "Sebastian Bergmann", 234 | "email": "sebastian@phpunit.de", 235 | "role": "Developer" 236 | } 237 | ], 238 | "description": "Library for handling version information and constraints", 239 | "support": { 240 | "issues": "https://github.com/phar-io/version/issues", 241 | "source": "https://github.com/phar-io/version/tree/3.2.1" 242 | }, 243 | "time": "2022-02-21T01:04:05+00:00" 244 | }, 245 | { 246 | "name": "phpunit/php-code-coverage", 247 | "version": "10.1.14", 248 | "source": { 249 | "type": "git", 250 | "url": "https://github.com/sebastianbergmann/php-code-coverage.git", 251 | "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b" 252 | }, 253 | "dist": { 254 | "type": "zip", 255 | "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", 256 | "reference": "e3f51450ebffe8e0efdf7346ae966a656f7d5e5b", 257 | "shasum": "" 258 | }, 259 | "require": { 260 | "ext-dom": "*", 261 | "ext-libxml": "*", 262 | "ext-xmlwriter": "*", 263 | "nikic/php-parser": "^4.18 || ^5.0", 264 | "php": ">=8.1", 265 | "phpunit/php-file-iterator": "^4.0", 266 | "phpunit/php-text-template": "^3.0", 267 | "sebastian/code-unit-reverse-lookup": "^3.0", 268 | "sebastian/complexity": "^3.0", 269 | "sebastian/environment": "^6.0", 270 | "sebastian/lines-of-code": "^2.0", 271 | "sebastian/version": "^4.0", 272 | "theseer/tokenizer": "^1.2.0" 273 | }, 274 | "require-dev": { 275 | "phpunit/phpunit": "^10.1" 276 | }, 277 | "suggest": { 278 | "ext-pcov": "PHP extension that provides line coverage", 279 | "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" 280 | }, 281 | "type": "library", 282 | "extra": { 283 | "branch-alias": { 284 | "dev-main": "10.1-dev" 285 | } 286 | }, 287 | "autoload": { 288 | "classmap": [ 289 | "src/" 290 | ] 291 | }, 292 | "notification-url": "https://packagist.org/downloads/", 293 | "license": [ 294 | "BSD-3-Clause" 295 | ], 296 | "authors": [ 297 | { 298 | "name": "Sebastian Bergmann", 299 | "email": "sebastian@phpunit.de", 300 | "role": "lead" 301 | } 302 | ], 303 | "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", 304 | "homepage": "https://github.com/sebastianbergmann/php-code-coverage", 305 | "keywords": [ 306 | "coverage", 307 | "testing", 308 | "xunit" 309 | ], 310 | "support": { 311 | "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", 312 | "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", 313 | "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/10.1.14" 314 | }, 315 | "funding": [ 316 | { 317 | "url": "https://github.com/sebastianbergmann", 318 | "type": "github" 319 | } 320 | ], 321 | "time": "2024-03-12T15:33:41+00:00" 322 | }, 323 | { 324 | "name": "phpunit/php-file-iterator", 325 | "version": "4.1.0", 326 | "source": { 327 | "type": "git", 328 | "url": "https://github.com/sebastianbergmann/php-file-iterator.git", 329 | "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c" 330 | }, 331 | "dist": { 332 | "type": "zip", 333 | "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/a95037b6d9e608ba092da1b23931e537cadc3c3c", 334 | "reference": "a95037b6d9e608ba092da1b23931e537cadc3c3c", 335 | "shasum": "" 336 | }, 337 | "require": { 338 | "php": ">=8.1" 339 | }, 340 | "require-dev": { 341 | "phpunit/phpunit": "^10.0" 342 | }, 343 | "type": "library", 344 | "extra": { 345 | "branch-alias": { 346 | "dev-main": "4.0-dev" 347 | } 348 | }, 349 | "autoload": { 350 | "classmap": [ 351 | "src/" 352 | ] 353 | }, 354 | "notification-url": "https://packagist.org/downloads/", 355 | "license": [ 356 | "BSD-3-Clause" 357 | ], 358 | "authors": [ 359 | { 360 | "name": "Sebastian Bergmann", 361 | "email": "sebastian@phpunit.de", 362 | "role": "lead" 363 | } 364 | ], 365 | "description": "FilterIterator implementation that filters files based on a list of suffixes.", 366 | "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", 367 | "keywords": [ 368 | "filesystem", 369 | "iterator" 370 | ], 371 | "support": { 372 | "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", 373 | "security": "https://github.com/sebastianbergmann/php-file-iterator/security/policy", 374 | "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/4.1.0" 375 | }, 376 | "funding": [ 377 | { 378 | "url": "https://github.com/sebastianbergmann", 379 | "type": "github" 380 | } 381 | ], 382 | "time": "2023-08-31T06:24:48+00:00" 383 | }, 384 | { 385 | "name": "phpunit/php-invoker", 386 | "version": "4.0.0", 387 | "source": { 388 | "type": "git", 389 | "url": "https://github.com/sebastianbergmann/php-invoker.git", 390 | "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7" 391 | }, 392 | "dist": { 393 | "type": "zip", 394 | "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", 395 | "reference": "f5e568ba02fa5ba0ddd0f618391d5a9ea50b06d7", 396 | "shasum": "" 397 | }, 398 | "require": { 399 | "php": ">=8.1" 400 | }, 401 | "require-dev": { 402 | "ext-pcntl": "*", 403 | "phpunit/phpunit": "^10.0" 404 | }, 405 | "suggest": { 406 | "ext-pcntl": "*" 407 | }, 408 | "type": "library", 409 | "extra": { 410 | "branch-alias": { 411 | "dev-main": "4.0-dev" 412 | } 413 | }, 414 | "autoload": { 415 | "classmap": [ 416 | "src/" 417 | ] 418 | }, 419 | "notification-url": "https://packagist.org/downloads/", 420 | "license": [ 421 | "BSD-3-Clause" 422 | ], 423 | "authors": [ 424 | { 425 | "name": "Sebastian Bergmann", 426 | "email": "sebastian@phpunit.de", 427 | "role": "lead" 428 | } 429 | ], 430 | "description": "Invoke callables with a timeout", 431 | "homepage": "https://github.com/sebastianbergmann/php-invoker/", 432 | "keywords": [ 433 | "process" 434 | ], 435 | "support": { 436 | "issues": "https://github.com/sebastianbergmann/php-invoker/issues", 437 | "source": "https://github.com/sebastianbergmann/php-invoker/tree/4.0.0" 438 | }, 439 | "funding": [ 440 | { 441 | "url": "https://github.com/sebastianbergmann", 442 | "type": "github" 443 | } 444 | ], 445 | "time": "2023-02-03T06:56:09+00:00" 446 | }, 447 | { 448 | "name": "phpunit/php-text-template", 449 | "version": "3.0.1", 450 | "source": { 451 | "type": "git", 452 | "url": "https://github.com/sebastianbergmann/php-text-template.git", 453 | "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748" 454 | }, 455 | "dist": { 456 | "type": "zip", 457 | "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/0c7b06ff49e3d5072f057eb1fa59258bf287a748", 458 | "reference": "0c7b06ff49e3d5072f057eb1fa59258bf287a748", 459 | "shasum": "" 460 | }, 461 | "require": { 462 | "php": ">=8.1" 463 | }, 464 | "require-dev": { 465 | "phpunit/phpunit": "^10.0" 466 | }, 467 | "type": "library", 468 | "extra": { 469 | "branch-alias": { 470 | "dev-main": "3.0-dev" 471 | } 472 | }, 473 | "autoload": { 474 | "classmap": [ 475 | "src/" 476 | ] 477 | }, 478 | "notification-url": "https://packagist.org/downloads/", 479 | "license": [ 480 | "BSD-3-Clause" 481 | ], 482 | "authors": [ 483 | { 484 | "name": "Sebastian Bergmann", 485 | "email": "sebastian@phpunit.de", 486 | "role": "lead" 487 | } 488 | ], 489 | "description": "Simple template engine.", 490 | "homepage": "https://github.com/sebastianbergmann/php-text-template/", 491 | "keywords": [ 492 | "template" 493 | ], 494 | "support": { 495 | "issues": "https://github.com/sebastianbergmann/php-text-template/issues", 496 | "security": "https://github.com/sebastianbergmann/php-text-template/security/policy", 497 | "source": "https://github.com/sebastianbergmann/php-text-template/tree/3.0.1" 498 | }, 499 | "funding": [ 500 | { 501 | "url": "https://github.com/sebastianbergmann", 502 | "type": "github" 503 | } 504 | ], 505 | "time": "2023-08-31T14:07:24+00:00" 506 | }, 507 | { 508 | "name": "phpunit/php-timer", 509 | "version": "6.0.0", 510 | "source": { 511 | "type": "git", 512 | "url": "https://github.com/sebastianbergmann/php-timer.git", 513 | "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d" 514 | }, 515 | "dist": { 516 | "type": "zip", 517 | "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/e2a2d67966e740530f4a3343fe2e030ffdc1161d", 518 | "reference": "e2a2d67966e740530f4a3343fe2e030ffdc1161d", 519 | "shasum": "" 520 | }, 521 | "require": { 522 | "php": ">=8.1" 523 | }, 524 | "require-dev": { 525 | "phpunit/phpunit": "^10.0" 526 | }, 527 | "type": "library", 528 | "extra": { 529 | "branch-alias": { 530 | "dev-main": "6.0-dev" 531 | } 532 | }, 533 | "autoload": { 534 | "classmap": [ 535 | "src/" 536 | ] 537 | }, 538 | "notification-url": "https://packagist.org/downloads/", 539 | "license": [ 540 | "BSD-3-Clause" 541 | ], 542 | "authors": [ 543 | { 544 | "name": "Sebastian Bergmann", 545 | "email": "sebastian@phpunit.de", 546 | "role": "lead" 547 | } 548 | ], 549 | "description": "Utility class for timing", 550 | "homepage": "https://github.com/sebastianbergmann/php-timer/", 551 | "keywords": [ 552 | "timer" 553 | ], 554 | "support": { 555 | "issues": "https://github.com/sebastianbergmann/php-timer/issues", 556 | "source": "https://github.com/sebastianbergmann/php-timer/tree/6.0.0" 557 | }, 558 | "funding": [ 559 | { 560 | "url": "https://github.com/sebastianbergmann", 561 | "type": "github" 562 | } 563 | ], 564 | "time": "2023-02-03T06:57:52+00:00" 565 | }, 566 | { 567 | "name": "phpunit/phpunit", 568 | "version": "10.5.20", 569 | "source": { 570 | "type": "git", 571 | "url": "https://github.com/sebastianbergmann/phpunit.git", 572 | "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3" 573 | }, 574 | "dist": { 575 | "type": "zip", 576 | "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/547d314dc24ec1e177720d45c6263fb226cc2ae3", 577 | "reference": "547d314dc24ec1e177720d45c6263fb226cc2ae3", 578 | "shasum": "" 579 | }, 580 | "require": { 581 | "ext-dom": "*", 582 | "ext-json": "*", 583 | "ext-libxml": "*", 584 | "ext-mbstring": "*", 585 | "ext-xml": "*", 586 | "ext-xmlwriter": "*", 587 | "myclabs/deep-copy": "^1.10.1", 588 | "phar-io/manifest": "^2.0.3", 589 | "phar-io/version": "^3.0.2", 590 | "php": ">=8.1", 591 | "phpunit/php-code-coverage": "^10.1.5", 592 | "phpunit/php-file-iterator": "^4.0", 593 | "phpunit/php-invoker": "^4.0", 594 | "phpunit/php-text-template": "^3.0", 595 | "phpunit/php-timer": "^6.0", 596 | "sebastian/cli-parser": "^2.0", 597 | "sebastian/code-unit": "^2.0", 598 | "sebastian/comparator": "^5.0", 599 | "sebastian/diff": "^5.0", 600 | "sebastian/environment": "^6.0", 601 | "sebastian/exporter": "^5.1", 602 | "sebastian/global-state": "^6.0.1", 603 | "sebastian/object-enumerator": "^5.0", 604 | "sebastian/recursion-context": "^5.0", 605 | "sebastian/type": "^4.0", 606 | "sebastian/version": "^4.0" 607 | }, 608 | "suggest": { 609 | "ext-soap": "To be able to generate mocks based on WSDL files" 610 | }, 611 | "bin": [ 612 | "phpunit" 613 | ], 614 | "type": "library", 615 | "extra": { 616 | "branch-alias": { 617 | "dev-main": "10.5-dev" 618 | } 619 | }, 620 | "autoload": { 621 | "files": [ 622 | "src/Framework/Assert/Functions.php" 623 | ], 624 | "classmap": [ 625 | "src/" 626 | ] 627 | }, 628 | "notification-url": "https://packagist.org/downloads/", 629 | "license": [ 630 | "BSD-3-Clause" 631 | ], 632 | "authors": [ 633 | { 634 | "name": "Sebastian Bergmann", 635 | "email": "sebastian@phpunit.de", 636 | "role": "lead" 637 | } 638 | ], 639 | "description": "The PHP Unit Testing framework.", 640 | "homepage": "https://phpunit.de/", 641 | "keywords": [ 642 | "phpunit", 643 | "testing", 644 | "xunit" 645 | ], 646 | "support": { 647 | "issues": "https://github.com/sebastianbergmann/phpunit/issues", 648 | "security": "https://github.com/sebastianbergmann/phpunit/security/policy", 649 | "source": "https://github.com/sebastianbergmann/phpunit/tree/10.5.20" 650 | }, 651 | "funding": [ 652 | { 653 | "url": "https://phpunit.de/sponsors.html", 654 | "type": "custom" 655 | }, 656 | { 657 | "url": "https://github.com/sebastianbergmann", 658 | "type": "github" 659 | }, 660 | { 661 | "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", 662 | "type": "tidelift" 663 | } 664 | ], 665 | "time": "2024-04-24T06:32:35+00:00" 666 | }, 667 | { 668 | "name": "sebastian/cli-parser", 669 | "version": "2.0.1", 670 | "source": { 671 | "type": "git", 672 | "url": "https://github.com/sebastianbergmann/cli-parser.git", 673 | "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084" 674 | }, 675 | "dist": { 676 | "type": "zip", 677 | "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/c34583b87e7b7a8055bf6c450c2c77ce32a24084", 678 | "reference": "c34583b87e7b7a8055bf6c450c2c77ce32a24084", 679 | "shasum": "" 680 | }, 681 | "require": { 682 | "php": ">=8.1" 683 | }, 684 | "require-dev": { 685 | "phpunit/phpunit": "^10.0" 686 | }, 687 | "type": "library", 688 | "extra": { 689 | "branch-alias": { 690 | "dev-main": "2.0-dev" 691 | } 692 | }, 693 | "autoload": { 694 | "classmap": [ 695 | "src/" 696 | ] 697 | }, 698 | "notification-url": "https://packagist.org/downloads/", 699 | "license": [ 700 | "BSD-3-Clause" 701 | ], 702 | "authors": [ 703 | { 704 | "name": "Sebastian Bergmann", 705 | "email": "sebastian@phpunit.de", 706 | "role": "lead" 707 | } 708 | ], 709 | "description": "Library for parsing CLI options", 710 | "homepage": "https://github.com/sebastianbergmann/cli-parser", 711 | "support": { 712 | "issues": "https://github.com/sebastianbergmann/cli-parser/issues", 713 | "security": "https://github.com/sebastianbergmann/cli-parser/security/policy", 714 | "source": "https://github.com/sebastianbergmann/cli-parser/tree/2.0.1" 715 | }, 716 | "funding": [ 717 | { 718 | "url": "https://github.com/sebastianbergmann", 719 | "type": "github" 720 | } 721 | ], 722 | "time": "2024-03-02T07:12:49+00:00" 723 | }, 724 | { 725 | "name": "sebastian/code-unit", 726 | "version": "2.0.0", 727 | "source": { 728 | "type": "git", 729 | "url": "https://github.com/sebastianbergmann/code-unit.git", 730 | "reference": "a81fee9eef0b7a76af11d121767abc44c104e503" 731 | }, 732 | "dist": { 733 | "type": "zip", 734 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/a81fee9eef0b7a76af11d121767abc44c104e503", 735 | "reference": "a81fee9eef0b7a76af11d121767abc44c104e503", 736 | "shasum": "" 737 | }, 738 | "require": { 739 | "php": ">=8.1" 740 | }, 741 | "require-dev": { 742 | "phpunit/phpunit": "^10.0" 743 | }, 744 | "type": "library", 745 | "extra": { 746 | "branch-alias": { 747 | "dev-main": "2.0-dev" 748 | } 749 | }, 750 | "autoload": { 751 | "classmap": [ 752 | "src/" 753 | ] 754 | }, 755 | "notification-url": "https://packagist.org/downloads/", 756 | "license": [ 757 | "BSD-3-Clause" 758 | ], 759 | "authors": [ 760 | { 761 | "name": "Sebastian Bergmann", 762 | "email": "sebastian@phpunit.de", 763 | "role": "lead" 764 | } 765 | ], 766 | "description": "Collection of value objects that represent the PHP code units", 767 | "homepage": "https://github.com/sebastianbergmann/code-unit", 768 | "support": { 769 | "issues": "https://github.com/sebastianbergmann/code-unit/issues", 770 | "source": "https://github.com/sebastianbergmann/code-unit/tree/2.0.0" 771 | }, 772 | "funding": [ 773 | { 774 | "url": "https://github.com/sebastianbergmann", 775 | "type": "github" 776 | } 777 | ], 778 | "time": "2023-02-03T06:58:43+00:00" 779 | }, 780 | { 781 | "name": "sebastian/code-unit-reverse-lookup", 782 | "version": "3.0.0", 783 | "source": { 784 | "type": "git", 785 | "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", 786 | "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d" 787 | }, 788 | "dist": { 789 | "type": "zip", 790 | "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", 791 | "reference": "5e3a687f7d8ae33fb362c5c0743794bbb2420a1d", 792 | "shasum": "" 793 | }, 794 | "require": { 795 | "php": ">=8.1" 796 | }, 797 | "require-dev": { 798 | "phpunit/phpunit": "^10.0" 799 | }, 800 | "type": "library", 801 | "extra": { 802 | "branch-alias": { 803 | "dev-main": "3.0-dev" 804 | } 805 | }, 806 | "autoload": { 807 | "classmap": [ 808 | "src/" 809 | ] 810 | }, 811 | "notification-url": "https://packagist.org/downloads/", 812 | "license": [ 813 | "BSD-3-Clause" 814 | ], 815 | "authors": [ 816 | { 817 | "name": "Sebastian Bergmann", 818 | "email": "sebastian@phpunit.de" 819 | } 820 | ], 821 | "description": "Looks up which function or method a line of code belongs to", 822 | "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", 823 | "support": { 824 | "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", 825 | "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/3.0.0" 826 | }, 827 | "funding": [ 828 | { 829 | "url": "https://github.com/sebastianbergmann", 830 | "type": "github" 831 | } 832 | ], 833 | "time": "2023-02-03T06:59:15+00:00" 834 | }, 835 | { 836 | "name": "sebastian/comparator", 837 | "version": "5.0.1", 838 | "source": { 839 | "type": "git", 840 | "url": "https://github.com/sebastianbergmann/comparator.git", 841 | "reference": "2db5010a484d53ebf536087a70b4a5423c102372" 842 | }, 843 | "dist": { 844 | "type": "zip", 845 | "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/2db5010a484d53ebf536087a70b4a5423c102372", 846 | "reference": "2db5010a484d53ebf536087a70b4a5423c102372", 847 | "shasum": "" 848 | }, 849 | "require": { 850 | "ext-dom": "*", 851 | "ext-mbstring": "*", 852 | "php": ">=8.1", 853 | "sebastian/diff": "^5.0", 854 | "sebastian/exporter": "^5.0" 855 | }, 856 | "require-dev": { 857 | "phpunit/phpunit": "^10.3" 858 | }, 859 | "type": "library", 860 | "extra": { 861 | "branch-alias": { 862 | "dev-main": "5.0-dev" 863 | } 864 | }, 865 | "autoload": { 866 | "classmap": [ 867 | "src/" 868 | ] 869 | }, 870 | "notification-url": "https://packagist.org/downloads/", 871 | "license": [ 872 | "BSD-3-Clause" 873 | ], 874 | "authors": [ 875 | { 876 | "name": "Sebastian Bergmann", 877 | "email": "sebastian@phpunit.de" 878 | }, 879 | { 880 | "name": "Jeff Welch", 881 | "email": "whatthejeff@gmail.com" 882 | }, 883 | { 884 | "name": "Volker Dusch", 885 | "email": "github@wallbash.com" 886 | }, 887 | { 888 | "name": "Bernhard Schussek", 889 | "email": "bschussek@2bepublished.at" 890 | } 891 | ], 892 | "description": "Provides the functionality to compare PHP values for equality", 893 | "homepage": "https://github.com/sebastianbergmann/comparator", 894 | "keywords": [ 895 | "comparator", 896 | "compare", 897 | "equality" 898 | ], 899 | "support": { 900 | "issues": "https://github.com/sebastianbergmann/comparator/issues", 901 | "security": "https://github.com/sebastianbergmann/comparator/security/policy", 902 | "source": "https://github.com/sebastianbergmann/comparator/tree/5.0.1" 903 | }, 904 | "funding": [ 905 | { 906 | "url": "https://github.com/sebastianbergmann", 907 | "type": "github" 908 | } 909 | ], 910 | "time": "2023-08-14T13:18:12+00:00" 911 | }, 912 | { 913 | "name": "sebastian/complexity", 914 | "version": "3.2.0", 915 | "source": { 916 | "type": "git", 917 | "url": "https://github.com/sebastianbergmann/complexity.git", 918 | "reference": "68ff824baeae169ec9f2137158ee529584553799" 919 | }, 920 | "dist": { 921 | "type": "zip", 922 | "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/68ff824baeae169ec9f2137158ee529584553799", 923 | "reference": "68ff824baeae169ec9f2137158ee529584553799", 924 | "shasum": "" 925 | }, 926 | "require": { 927 | "nikic/php-parser": "^4.18 || ^5.0", 928 | "php": ">=8.1" 929 | }, 930 | "require-dev": { 931 | "phpunit/phpunit": "^10.0" 932 | }, 933 | "type": "library", 934 | "extra": { 935 | "branch-alias": { 936 | "dev-main": "3.2-dev" 937 | } 938 | }, 939 | "autoload": { 940 | "classmap": [ 941 | "src/" 942 | ] 943 | }, 944 | "notification-url": "https://packagist.org/downloads/", 945 | "license": [ 946 | "BSD-3-Clause" 947 | ], 948 | "authors": [ 949 | { 950 | "name": "Sebastian Bergmann", 951 | "email": "sebastian@phpunit.de", 952 | "role": "lead" 953 | } 954 | ], 955 | "description": "Library for calculating the complexity of PHP code units", 956 | "homepage": "https://github.com/sebastianbergmann/complexity", 957 | "support": { 958 | "issues": "https://github.com/sebastianbergmann/complexity/issues", 959 | "security": "https://github.com/sebastianbergmann/complexity/security/policy", 960 | "source": "https://github.com/sebastianbergmann/complexity/tree/3.2.0" 961 | }, 962 | "funding": [ 963 | { 964 | "url": "https://github.com/sebastianbergmann", 965 | "type": "github" 966 | } 967 | ], 968 | "time": "2023-12-21T08:37:17+00:00" 969 | }, 970 | { 971 | "name": "sebastian/diff", 972 | "version": "5.1.1", 973 | "source": { 974 | "type": "git", 975 | "url": "https://github.com/sebastianbergmann/diff.git", 976 | "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e" 977 | }, 978 | "dist": { 979 | "type": "zip", 980 | "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/c41e007b4b62af48218231d6c2275e4c9b975b2e", 981 | "reference": "c41e007b4b62af48218231d6c2275e4c9b975b2e", 982 | "shasum": "" 983 | }, 984 | "require": { 985 | "php": ">=8.1" 986 | }, 987 | "require-dev": { 988 | "phpunit/phpunit": "^10.0", 989 | "symfony/process": "^6.4" 990 | }, 991 | "type": "library", 992 | "extra": { 993 | "branch-alias": { 994 | "dev-main": "5.1-dev" 995 | } 996 | }, 997 | "autoload": { 998 | "classmap": [ 999 | "src/" 1000 | ] 1001 | }, 1002 | "notification-url": "https://packagist.org/downloads/", 1003 | "license": [ 1004 | "BSD-3-Clause" 1005 | ], 1006 | "authors": [ 1007 | { 1008 | "name": "Sebastian Bergmann", 1009 | "email": "sebastian@phpunit.de" 1010 | }, 1011 | { 1012 | "name": "Kore Nordmann", 1013 | "email": "mail@kore-nordmann.de" 1014 | } 1015 | ], 1016 | "description": "Diff implementation", 1017 | "homepage": "https://github.com/sebastianbergmann/diff", 1018 | "keywords": [ 1019 | "diff", 1020 | "udiff", 1021 | "unidiff", 1022 | "unified diff" 1023 | ], 1024 | "support": { 1025 | "issues": "https://github.com/sebastianbergmann/diff/issues", 1026 | "security": "https://github.com/sebastianbergmann/diff/security/policy", 1027 | "source": "https://github.com/sebastianbergmann/diff/tree/5.1.1" 1028 | }, 1029 | "funding": [ 1030 | { 1031 | "url": "https://github.com/sebastianbergmann", 1032 | "type": "github" 1033 | } 1034 | ], 1035 | "time": "2024-03-02T07:15:17+00:00" 1036 | }, 1037 | { 1038 | "name": "sebastian/environment", 1039 | "version": "6.1.0", 1040 | "source": { 1041 | "type": "git", 1042 | "url": "https://github.com/sebastianbergmann/environment.git", 1043 | "reference": "8074dbcd93529b357029f5cc5058fd3e43666984" 1044 | }, 1045 | "dist": { 1046 | "type": "zip", 1047 | "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/8074dbcd93529b357029f5cc5058fd3e43666984", 1048 | "reference": "8074dbcd93529b357029f5cc5058fd3e43666984", 1049 | "shasum": "" 1050 | }, 1051 | "require": { 1052 | "php": ">=8.1" 1053 | }, 1054 | "require-dev": { 1055 | "phpunit/phpunit": "^10.0" 1056 | }, 1057 | "suggest": { 1058 | "ext-posix": "*" 1059 | }, 1060 | "type": "library", 1061 | "extra": { 1062 | "branch-alias": { 1063 | "dev-main": "6.1-dev" 1064 | } 1065 | }, 1066 | "autoload": { 1067 | "classmap": [ 1068 | "src/" 1069 | ] 1070 | }, 1071 | "notification-url": "https://packagist.org/downloads/", 1072 | "license": [ 1073 | "BSD-3-Clause" 1074 | ], 1075 | "authors": [ 1076 | { 1077 | "name": "Sebastian Bergmann", 1078 | "email": "sebastian@phpunit.de" 1079 | } 1080 | ], 1081 | "description": "Provides functionality to handle HHVM/PHP environments", 1082 | "homepage": "https://github.com/sebastianbergmann/environment", 1083 | "keywords": [ 1084 | "Xdebug", 1085 | "environment", 1086 | "hhvm" 1087 | ], 1088 | "support": { 1089 | "issues": "https://github.com/sebastianbergmann/environment/issues", 1090 | "security": "https://github.com/sebastianbergmann/environment/security/policy", 1091 | "source": "https://github.com/sebastianbergmann/environment/tree/6.1.0" 1092 | }, 1093 | "funding": [ 1094 | { 1095 | "url": "https://github.com/sebastianbergmann", 1096 | "type": "github" 1097 | } 1098 | ], 1099 | "time": "2024-03-23T08:47:14+00:00" 1100 | }, 1101 | { 1102 | "name": "sebastian/exporter", 1103 | "version": "5.1.2", 1104 | "source": { 1105 | "type": "git", 1106 | "url": "https://github.com/sebastianbergmann/exporter.git", 1107 | "reference": "955288482d97c19a372d3f31006ab3f37da47adf" 1108 | }, 1109 | "dist": { 1110 | "type": "zip", 1111 | "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/955288482d97c19a372d3f31006ab3f37da47adf", 1112 | "reference": "955288482d97c19a372d3f31006ab3f37da47adf", 1113 | "shasum": "" 1114 | }, 1115 | "require": { 1116 | "ext-mbstring": "*", 1117 | "php": ">=8.1", 1118 | "sebastian/recursion-context": "^5.0" 1119 | }, 1120 | "require-dev": { 1121 | "phpunit/phpunit": "^10.0" 1122 | }, 1123 | "type": "library", 1124 | "extra": { 1125 | "branch-alias": { 1126 | "dev-main": "5.1-dev" 1127 | } 1128 | }, 1129 | "autoload": { 1130 | "classmap": [ 1131 | "src/" 1132 | ] 1133 | }, 1134 | "notification-url": "https://packagist.org/downloads/", 1135 | "license": [ 1136 | "BSD-3-Clause" 1137 | ], 1138 | "authors": [ 1139 | { 1140 | "name": "Sebastian Bergmann", 1141 | "email": "sebastian@phpunit.de" 1142 | }, 1143 | { 1144 | "name": "Jeff Welch", 1145 | "email": "whatthejeff@gmail.com" 1146 | }, 1147 | { 1148 | "name": "Volker Dusch", 1149 | "email": "github@wallbash.com" 1150 | }, 1151 | { 1152 | "name": "Adam Harvey", 1153 | "email": "aharvey@php.net" 1154 | }, 1155 | { 1156 | "name": "Bernhard Schussek", 1157 | "email": "bschussek@gmail.com" 1158 | } 1159 | ], 1160 | "description": "Provides the functionality to export PHP variables for visualization", 1161 | "homepage": "https://www.github.com/sebastianbergmann/exporter", 1162 | "keywords": [ 1163 | "export", 1164 | "exporter" 1165 | ], 1166 | "support": { 1167 | "issues": "https://github.com/sebastianbergmann/exporter/issues", 1168 | "security": "https://github.com/sebastianbergmann/exporter/security/policy", 1169 | "source": "https://github.com/sebastianbergmann/exporter/tree/5.1.2" 1170 | }, 1171 | "funding": [ 1172 | { 1173 | "url": "https://github.com/sebastianbergmann", 1174 | "type": "github" 1175 | } 1176 | ], 1177 | "time": "2024-03-02T07:17:12+00:00" 1178 | }, 1179 | { 1180 | "name": "sebastian/global-state", 1181 | "version": "6.0.2", 1182 | "source": { 1183 | "type": "git", 1184 | "url": "https://github.com/sebastianbergmann/global-state.git", 1185 | "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9" 1186 | }, 1187 | "dist": { 1188 | "type": "zip", 1189 | "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", 1190 | "reference": "987bafff24ecc4c9ac418cab1145b96dd6e9cbd9", 1191 | "shasum": "" 1192 | }, 1193 | "require": { 1194 | "php": ">=8.1", 1195 | "sebastian/object-reflector": "^3.0", 1196 | "sebastian/recursion-context": "^5.0" 1197 | }, 1198 | "require-dev": { 1199 | "ext-dom": "*", 1200 | "phpunit/phpunit": "^10.0" 1201 | }, 1202 | "type": "library", 1203 | "extra": { 1204 | "branch-alias": { 1205 | "dev-main": "6.0-dev" 1206 | } 1207 | }, 1208 | "autoload": { 1209 | "classmap": [ 1210 | "src/" 1211 | ] 1212 | }, 1213 | "notification-url": "https://packagist.org/downloads/", 1214 | "license": [ 1215 | "BSD-3-Clause" 1216 | ], 1217 | "authors": [ 1218 | { 1219 | "name": "Sebastian Bergmann", 1220 | "email": "sebastian@phpunit.de" 1221 | } 1222 | ], 1223 | "description": "Snapshotting of global state", 1224 | "homepage": "https://www.github.com/sebastianbergmann/global-state", 1225 | "keywords": [ 1226 | "global state" 1227 | ], 1228 | "support": { 1229 | "issues": "https://github.com/sebastianbergmann/global-state/issues", 1230 | "security": "https://github.com/sebastianbergmann/global-state/security/policy", 1231 | "source": "https://github.com/sebastianbergmann/global-state/tree/6.0.2" 1232 | }, 1233 | "funding": [ 1234 | { 1235 | "url": "https://github.com/sebastianbergmann", 1236 | "type": "github" 1237 | } 1238 | ], 1239 | "time": "2024-03-02T07:19:19+00:00" 1240 | }, 1241 | { 1242 | "name": "sebastian/lines-of-code", 1243 | "version": "2.0.2", 1244 | "source": { 1245 | "type": "git", 1246 | "url": "https://github.com/sebastianbergmann/lines-of-code.git", 1247 | "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0" 1248 | }, 1249 | "dist": { 1250 | "type": "zip", 1251 | "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/856e7f6a75a84e339195d48c556f23be2ebf75d0", 1252 | "reference": "856e7f6a75a84e339195d48c556f23be2ebf75d0", 1253 | "shasum": "" 1254 | }, 1255 | "require": { 1256 | "nikic/php-parser": "^4.18 || ^5.0", 1257 | "php": ">=8.1" 1258 | }, 1259 | "require-dev": { 1260 | "phpunit/phpunit": "^10.0" 1261 | }, 1262 | "type": "library", 1263 | "extra": { 1264 | "branch-alias": { 1265 | "dev-main": "2.0-dev" 1266 | } 1267 | }, 1268 | "autoload": { 1269 | "classmap": [ 1270 | "src/" 1271 | ] 1272 | }, 1273 | "notification-url": "https://packagist.org/downloads/", 1274 | "license": [ 1275 | "BSD-3-Clause" 1276 | ], 1277 | "authors": [ 1278 | { 1279 | "name": "Sebastian Bergmann", 1280 | "email": "sebastian@phpunit.de", 1281 | "role": "lead" 1282 | } 1283 | ], 1284 | "description": "Library for counting the lines of code in PHP source code", 1285 | "homepage": "https://github.com/sebastianbergmann/lines-of-code", 1286 | "support": { 1287 | "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", 1288 | "security": "https://github.com/sebastianbergmann/lines-of-code/security/policy", 1289 | "source": "https://github.com/sebastianbergmann/lines-of-code/tree/2.0.2" 1290 | }, 1291 | "funding": [ 1292 | { 1293 | "url": "https://github.com/sebastianbergmann", 1294 | "type": "github" 1295 | } 1296 | ], 1297 | "time": "2023-12-21T08:38:20+00:00" 1298 | }, 1299 | { 1300 | "name": "sebastian/object-enumerator", 1301 | "version": "5.0.0", 1302 | "source": { 1303 | "type": "git", 1304 | "url": "https://github.com/sebastianbergmann/object-enumerator.git", 1305 | "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906" 1306 | }, 1307 | "dist": { 1308 | "type": "zip", 1309 | "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/202d0e344a580d7f7d04b3fafce6933e59dae906", 1310 | "reference": "202d0e344a580d7f7d04b3fafce6933e59dae906", 1311 | "shasum": "" 1312 | }, 1313 | "require": { 1314 | "php": ">=8.1", 1315 | "sebastian/object-reflector": "^3.0", 1316 | "sebastian/recursion-context": "^5.0" 1317 | }, 1318 | "require-dev": { 1319 | "phpunit/phpunit": "^10.0" 1320 | }, 1321 | "type": "library", 1322 | "extra": { 1323 | "branch-alias": { 1324 | "dev-main": "5.0-dev" 1325 | } 1326 | }, 1327 | "autoload": { 1328 | "classmap": [ 1329 | "src/" 1330 | ] 1331 | }, 1332 | "notification-url": "https://packagist.org/downloads/", 1333 | "license": [ 1334 | "BSD-3-Clause" 1335 | ], 1336 | "authors": [ 1337 | { 1338 | "name": "Sebastian Bergmann", 1339 | "email": "sebastian@phpunit.de" 1340 | } 1341 | ], 1342 | "description": "Traverses array structures and object graphs to enumerate all referenced objects", 1343 | "homepage": "https://github.com/sebastianbergmann/object-enumerator/", 1344 | "support": { 1345 | "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", 1346 | "source": "https://github.com/sebastianbergmann/object-enumerator/tree/5.0.0" 1347 | }, 1348 | "funding": [ 1349 | { 1350 | "url": "https://github.com/sebastianbergmann", 1351 | "type": "github" 1352 | } 1353 | ], 1354 | "time": "2023-02-03T07:08:32+00:00" 1355 | }, 1356 | { 1357 | "name": "sebastian/object-reflector", 1358 | "version": "3.0.0", 1359 | "source": { 1360 | "type": "git", 1361 | "url": "https://github.com/sebastianbergmann/object-reflector.git", 1362 | "reference": "24ed13d98130f0e7122df55d06c5c4942a577957" 1363 | }, 1364 | "dist": { 1365 | "type": "zip", 1366 | "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/24ed13d98130f0e7122df55d06c5c4942a577957", 1367 | "reference": "24ed13d98130f0e7122df55d06c5c4942a577957", 1368 | "shasum": "" 1369 | }, 1370 | "require": { 1371 | "php": ">=8.1" 1372 | }, 1373 | "require-dev": { 1374 | "phpunit/phpunit": "^10.0" 1375 | }, 1376 | "type": "library", 1377 | "extra": { 1378 | "branch-alias": { 1379 | "dev-main": "3.0-dev" 1380 | } 1381 | }, 1382 | "autoload": { 1383 | "classmap": [ 1384 | "src/" 1385 | ] 1386 | }, 1387 | "notification-url": "https://packagist.org/downloads/", 1388 | "license": [ 1389 | "BSD-3-Clause" 1390 | ], 1391 | "authors": [ 1392 | { 1393 | "name": "Sebastian Bergmann", 1394 | "email": "sebastian@phpunit.de" 1395 | } 1396 | ], 1397 | "description": "Allows reflection of object attributes, including inherited and non-public ones", 1398 | "homepage": "https://github.com/sebastianbergmann/object-reflector/", 1399 | "support": { 1400 | "issues": "https://github.com/sebastianbergmann/object-reflector/issues", 1401 | "source": "https://github.com/sebastianbergmann/object-reflector/tree/3.0.0" 1402 | }, 1403 | "funding": [ 1404 | { 1405 | "url": "https://github.com/sebastianbergmann", 1406 | "type": "github" 1407 | } 1408 | ], 1409 | "time": "2023-02-03T07:06:18+00:00" 1410 | }, 1411 | { 1412 | "name": "sebastian/recursion-context", 1413 | "version": "5.0.0", 1414 | "source": { 1415 | "type": "git", 1416 | "url": "https://github.com/sebastianbergmann/recursion-context.git", 1417 | "reference": "05909fb5bc7df4c52992396d0116aed689f93712" 1418 | }, 1419 | "dist": { 1420 | "type": "zip", 1421 | "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/05909fb5bc7df4c52992396d0116aed689f93712", 1422 | "reference": "05909fb5bc7df4c52992396d0116aed689f93712", 1423 | "shasum": "" 1424 | }, 1425 | "require": { 1426 | "php": ">=8.1" 1427 | }, 1428 | "require-dev": { 1429 | "phpunit/phpunit": "^10.0" 1430 | }, 1431 | "type": "library", 1432 | "extra": { 1433 | "branch-alias": { 1434 | "dev-main": "5.0-dev" 1435 | } 1436 | }, 1437 | "autoload": { 1438 | "classmap": [ 1439 | "src/" 1440 | ] 1441 | }, 1442 | "notification-url": "https://packagist.org/downloads/", 1443 | "license": [ 1444 | "BSD-3-Clause" 1445 | ], 1446 | "authors": [ 1447 | { 1448 | "name": "Sebastian Bergmann", 1449 | "email": "sebastian@phpunit.de" 1450 | }, 1451 | { 1452 | "name": "Jeff Welch", 1453 | "email": "whatthejeff@gmail.com" 1454 | }, 1455 | { 1456 | "name": "Adam Harvey", 1457 | "email": "aharvey@php.net" 1458 | } 1459 | ], 1460 | "description": "Provides functionality to recursively process PHP variables", 1461 | "homepage": "https://github.com/sebastianbergmann/recursion-context", 1462 | "support": { 1463 | "issues": "https://github.com/sebastianbergmann/recursion-context/issues", 1464 | "source": "https://github.com/sebastianbergmann/recursion-context/tree/5.0.0" 1465 | }, 1466 | "funding": [ 1467 | { 1468 | "url": "https://github.com/sebastianbergmann", 1469 | "type": "github" 1470 | } 1471 | ], 1472 | "time": "2023-02-03T07:05:40+00:00" 1473 | }, 1474 | { 1475 | "name": "sebastian/type", 1476 | "version": "4.0.0", 1477 | "source": { 1478 | "type": "git", 1479 | "url": "https://github.com/sebastianbergmann/type.git", 1480 | "reference": "462699a16464c3944eefc02ebdd77882bd3925bf" 1481 | }, 1482 | "dist": { 1483 | "type": "zip", 1484 | "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/462699a16464c3944eefc02ebdd77882bd3925bf", 1485 | "reference": "462699a16464c3944eefc02ebdd77882bd3925bf", 1486 | "shasum": "" 1487 | }, 1488 | "require": { 1489 | "php": ">=8.1" 1490 | }, 1491 | "require-dev": { 1492 | "phpunit/phpunit": "^10.0" 1493 | }, 1494 | "type": "library", 1495 | "extra": { 1496 | "branch-alias": { 1497 | "dev-main": "4.0-dev" 1498 | } 1499 | }, 1500 | "autoload": { 1501 | "classmap": [ 1502 | "src/" 1503 | ] 1504 | }, 1505 | "notification-url": "https://packagist.org/downloads/", 1506 | "license": [ 1507 | "BSD-3-Clause" 1508 | ], 1509 | "authors": [ 1510 | { 1511 | "name": "Sebastian Bergmann", 1512 | "email": "sebastian@phpunit.de", 1513 | "role": "lead" 1514 | } 1515 | ], 1516 | "description": "Collection of value objects that represent the types of the PHP type system", 1517 | "homepage": "https://github.com/sebastianbergmann/type", 1518 | "support": { 1519 | "issues": "https://github.com/sebastianbergmann/type/issues", 1520 | "source": "https://github.com/sebastianbergmann/type/tree/4.0.0" 1521 | }, 1522 | "funding": [ 1523 | { 1524 | "url": "https://github.com/sebastianbergmann", 1525 | "type": "github" 1526 | } 1527 | ], 1528 | "time": "2023-02-03T07:10:45+00:00" 1529 | }, 1530 | { 1531 | "name": "sebastian/version", 1532 | "version": "4.0.1", 1533 | "source": { 1534 | "type": "git", 1535 | "url": "https://github.com/sebastianbergmann/version.git", 1536 | "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17" 1537 | }, 1538 | "dist": { 1539 | "type": "zip", 1540 | "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c51fa83a5d8f43f1402e3f32a005e6262244ef17", 1541 | "reference": "c51fa83a5d8f43f1402e3f32a005e6262244ef17", 1542 | "shasum": "" 1543 | }, 1544 | "require": { 1545 | "php": ">=8.1" 1546 | }, 1547 | "type": "library", 1548 | "extra": { 1549 | "branch-alias": { 1550 | "dev-main": "4.0-dev" 1551 | } 1552 | }, 1553 | "autoload": { 1554 | "classmap": [ 1555 | "src/" 1556 | ] 1557 | }, 1558 | "notification-url": "https://packagist.org/downloads/", 1559 | "license": [ 1560 | "BSD-3-Clause" 1561 | ], 1562 | "authors": [ 1563 | { 1564 | "name": "Sebastian Bergmann", 1565 | "email": "sebastian@phpunit.de", 1566 | "role": "lead" 1567 | } 1568 | ], 1569 | "description": "Library that helps with managing the version number of Git-hosted PHP projects", 1570 | "homepage": "https://github.com/sebastianbergmann/version", 1571 | "support": { 1572 | "issues": "https://github.com/sebastianbergmann/version/issues", 1573 | "source": "https://github.com/sebastianbergmann/version/tree/4.0.1" 1574 | }, 1575 | "funding": [ 1576 | { 1577 | "url": "https://github.com/sebastianbergmann", 1578 | "type": "github" 1579 | } 1580 | ], 1581 | "time": "2023-02-07T11:34:05+00:00" 1582 | }, 1583 | { 1584 | "name": "theseer/tokenizer", 1585 | "version": "1.2.3", 1586 | "source": { 1587 | "type": "git", 1588 | "url": "https://github.com/theseer/tokenizer.git", 1589 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" 1590 | }, 1591 | "dist": { 1592 | "type": "zip", 1593 | "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 1594 | "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", 1595 | "shasum": "" 1596 | }, 1597 | "require": { 1598 | "ext-dom": "*", 1599 | "ext-tokenizer": "*", 1600 | "ext-xmlwriter": "*", 1601 | "php": "^7.2 || ^8.0" 1602 | }, 1603 | "type": "library", 1604 | "autoload": { 1605 | "classmap": [ 1606 | "src/" 1607 | ] 1608 | }, 1609 | "notification-url": "https://packagist.org/downloads/", 1610 | "license": [ 1611 | "BSD-3-Clause" 1612 | ], 1613 | "authors": [ 1614 | { 1615 | "name": "Arne Blankerts", 1616 | "email": "arne@blankerts.de", 1617 | "role": "Developer" 1618 | } 1619 | ], 1620 | "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", 1621 | "support": { 1622 | "issues": "https://github.com/theseer/tokenizer/issues", 1623 | "source": "https://github.com/theseer/tokenizer/tree/1.2.3" 1624 | }, 1625 | "funding": [ 1626 | { 1627 | "url": "https://github.com/theseer", 1628 | "type": "github" 1629 | } 1630 | ], 1631 | "time": "2024-03-03T12:36:25+00:00" 1632 | } 1633 | ], 1634 | "aliases": [], 1635 | "minimum-stability": "dev", 1636 | "stability-flags": [], 1637 | "prefer-stable": true, 1638 | "prefer-lowest": false, 1639 | "platform": { 1640 | "php": "^8.0", 1641 | "ext-mbstring": "*", 1642 | "ext-soap": "*" 1643 | }, 1644 | "platform-dev": [], 1645 | "plugin-api-version": "2.6.0" 1646 | } 1647 | --------------------------------------------------------------------------------