Add CVR handling to guest and auth routes with virkdata integration

- Introduced `/guest/cvr/search` endpoint in `guestRoute` for company search using CVR.
- Added `/auth/register/cvr` endpoint in `authRoute` to handle CVR-based registration with validation.
- Enhanced `virkdata` with `searchCompanies` and improved response handling for search requests.
- Updated E-conomic integration to check for existing CVR registrations and create new customers where needed.
This commit is contained in:
Jeppe Bundgaard
2025-11-17 13:20:12 +01:00
parent a22fc3fab0
commit 5b01644c0a
3 changed files with 159 additions and 3 deletions
+33 -3
View File
@@ -134,8 +134,12 @@ class virkdata implements virkdata_i
function exception(string $search, array $data, int $status_code = 500): object
{
// Check if the response is valid JSON
if (!json_decode($data['response'])) {
throw new Exception('Invalid response');
if (isset($data['response'])) {
if (!json_decode($data['response'])) {
throw new Exception('Invalid response');
}
} else {
isset($data['data']) ? $data['response'] = json_encode($data['data']) : $data['response'] = null;
}
// Add the request to the log
$this->virkdata_search->virkdata_search($search, $data, $status_code);;
@@ -153,11 +157,14 @@ class virkdata implements virkdata_i
} else {
$query_string = '';
}
if (empty($query_string) && !empty($search)) {
$query_string = '?search=' . urlencode($search);
}
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://virkdata.dk/api/?search={$search}",
CURLOPT_URL => "https://virkdata.dk/api/{$query_string}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
@@ -203,6 +210,29 @@ class virkdata implements virkdata_i
$status_code
);
}
$decoded_response = json_decode($response, true);
if (isset($decoded_response['error_code'])) {
self::exception(
$search,
[
'method' => 'GET',
'endpoint' => $endpoint,
'data' => $data,
'response' => $response,
'status_code' => $status_code,
'error' => $response['error'] ?? 'An error occurred',
],
$status_code
);
}
return (new virkdata_response())->populate(json_decode($response, true));
}
/**
* @throws Exception
*/
public function searchCompanies(string $query): virkdata_response|array
{
return $this->sendRequest($query, 'search', [], 'GET');
}
}
+110
View File
@@ -3,9 +3,12 @@
namespace routes;
use classes\authentication;
use classes\economic;
use classes\recaptcha;
use classes\virkdata;
use objects\logs_o;
use objects\tokens_o;
use objects\users_o;
use traits\route_t;
class authRoute
@@ -123,5 +126,112 @@ class authRoute
'recaptcha' => $recaptcha
]);
});
$this->post('/auth/register/cvr', function () {
// Get the post data
global $response;
$this->requireRecaptcha();
/**
* {
* "cvr": "44794780",
* "companyPhone": 21754690,
* "invoiceEmail": "mikkel@truckwash.dk",
* "contactEmail": "mikkel@truckwash.dk",
* "contactPhone": 21754690,
* "searchResult": {
* "vat": 41004355,
* "status": "Normal",
* "name": "Truckwash ApS",
* "address": "Letland Alle 2",
* "zipcode": 2630,
* "city": "Taastrup",
* "protected": true,
* "phone": "21754690",
* "website": null,
* "email": "mikkel@truckwash.dk",
* "fax": null,
* "startdate": "2019-12-11",
* "enddate": null,
* "employees": 14,
* "industrycode": 953190,
* "industrydesc": "Reparation og vedligeholdelse af motorkøretøjer i.a.n.",
* "companytype": "APS",
* "companydesc": "Anpartsselskab",
* "owners": [
* "DELOITTE STATSAUTORISERET REVISIONSPARTNERSELSKAB",
* "MBL Revision I/S",
* "WASH GROUP A/S"
* ]
* }
* }
*/
/**
* Parameters:
*/
self::requireParameters(['cvr', 'companyPhone', 'invoiceEmail', 'contactEmail', 'contactPhone']);
$cvr = self::getParameter('cvr');
$companyPhone = (int)self::getParameter('companyPhone');
$invoiceEmail = self::getParameter('invoiceEmail');
$contactEmail = self::getParameter('contactEmail');
$contactPhone = (int)self::getParameter('contactPhone');
/**
* Validate
*/
self::requireType($cvr, $this->type_string());
self::requireMinLength('cvr', 8);
self::requireMaxLength('cvr', 20);
self::requireType($companyPhone, $this->type_int());
self::requireMinValue($companyPhone, 10000000);
self::requireMaxValue($companyPhone, 9999999999);
self::requireType($invoiceEmail, $this->type_string());
self::requireMinLength('invoiceEmail', 5);
self::requireMaxLength('invoiceEmail', 255);
self::requireType($contactEmail, $this->type_string());
self::requireMinLength('contactEmail', 5);
self::requireMaxLength('contactEmail', 255);
self::requireType($contactPhone, $this->type_int());
self::requireMinValue($contactPhone, 10000000);
self::requireMaxValue($contactPhone, 9999999999);
/**
* Check if the cvr already exists
*/
$economic_response = ((new economic())->customers->customers->search([
'corporateIdentificationNumber' => (string)$cvr,
], [
'skipPages' => 0,
'pageSize' => 1, // Since the limit is 1000, we need to set the page size to 1000.
])->collection);
if (count($economic_response) === 0) {
/**
* Create the customer in E-conomic
*/
// Get the customer name
$name = (new virkdata())->getCompanyInformation($cvr, '', [])->name;
/**
* $economic = new economic();
* $economic->createCustomer(
* $customer_number,
* $name,
* $cvr,
* $invoiceEmail,
* $companyPhone,
* );
*/
$economic = new economic();
$result = $economic->createCustomer(
(int)$companyPhone,
$name,
(string)$cvr,
$invoiceEmail,
(string)$companyPhone,
);
/**
* Return the result
*/
$response->success($result, 201);
} else {
$response->error('CVR already registered', 400);
}
});
}
}
+16
View File
@@ -4,6 +4,7 @@ namespace routes;
use classes\authentication;
use classes\recaptcha;
use classes\virkdata;
use objects\logs_o;
use objects\tokens_o;
use objects\users_o;
@@ -31,5 +32,20 @@ class guestRoute
// Return the result
$response->success(['exists' => $doesCustomerExist, 'customer_number' => $customer_number]);
});
$this->get('/cvr/search', function () {
global $response;
self::requirePermission('cvr_search'); // TODO: Remove this
self::requireParameters(['query']);
$query = self::getParameter('query');
if (strlen($query) < 2) {
$response->error('Query must be at least 2 characters long', 400);
}
$virkdata = new virkdata();
$result = $virkdata->searchCompanies($query);
$response->success($result, 200);
}, [
'cvr_search' => 'Search CVR numbers'
]);
}
}