Integrate caching for CVR lookup, add economic customer creation endpoint, and enhance license plate recognition validation

- Implemented Redis caching for CVR lookups to improve performance and reduce API calls.
- Introduced economic customer creation functionality with new `createCustomer` method and corresponding route.
- Enhanced license plate recognition validation to handle plates shorter than 3 characters.
This commit is contained in:
Jeppe Bundgaard
2025-10-13 13:32:11 +02:00
parent ca29ded6be
commit ce9913429f
5 changed files with 85 additions and 9 deletions
+23
View File
@@ -118,4 +118,27 @@ class economic implements economic_i
{
return new $this->helpers->economic_tasks();
}
public function createCustomer(int $customer_number, string $name, int $cvr_number, string $email, int $phone): economic_customer
{
$result = $this->customers->customers->create([
'customerNumber' => $customer_number,
'corporateIdentificationNumber' => (string)$cvr_number,
'customerGroup' => [
'customerGroupNumber' => 1,
],
'paymentTerms' => [
'paymentTermsNumber' => 12,
],
'name' => $name,
'email' => $email,
'phone' => $phone,
'currency' => 'DKK',
'vatZone' => [
'vatZoneNumber' => 1,
]
]);
return new $this->helpers->economic_customer($customer_number);
}
}
@@ -21,6 +21,20 @@ class economic_customers_endpoint
// Return the response as an object
return json_decode($response);
}
/**
* Create a customer
* @param array $data
* @return object
*/
public function create(array $data): object
{
$response = $this->send_request(
'/customers/',
'POST',
json_encode($data)
);
return json_decode($response);
}
/**
* Get customers by filters
@@ -43,5 +43,37 @@ class moduleEconomicCustomerRoute
]
);
/** Modules > Economic > Customer > Create customer */
$this->post('/modules/economic/customer', function () {
global $response;
self::requirePermission('modules_economic_customer_create');
$user = (new authentication())->get_user();
if ($user || true) {
self::requireParameters(['customer_number', 'cvr', 'email', 'phone', 'name']);
self::requireMinLength('customer_number', 1);
self::requireMaxLength('customer_number', 10);
self::requireMinLength('cvr', 1);
self::requireMaxLength('cvr', 10);
self::requireMinLength('email', 1);
self::requireMaxLength('email', 255);
self::requireMinLength('phone', 1);
self::requireMaxLength('phone', 255);
self::requireMinLength('name', 1);
self::requireMaxLength('name', 255);
(new logs_o())->add('modules_economic', 'global', 1, 0, 'MODULES_ECONOMIC', 'User accessed the customer');
$result = (new economic())->createCustomer(
(int)self::getParameter('customer_number'),
(string)self::getParameter('name'),
(int)self::getParameter('cvr'),
(string)self::getParameter('email'),
(int)self::getParameter('phone'),
);
$response->success((object)$result);
} else {
(new logs_o())->add('modules_economic', 'global', 0, 0, 'MODULES_ECONOMIC', 'User tried to access the customer without a valid session');
$response->error('Invalid session', 400);
}
});
}
}
@@ -40,8 +40,10 @@ class moduleScannerRoute
if ($lpr_result['success']) {
// Set the LICENSE_PLATE_NUMBER to uppercase and remove spaces.
$lpr_result['license_plate_number'] = strtoupper(str_replace(' ', '', $lpr_result['license_plate_number']));
// Make sure the scanned plate is more than 3 characters long.
$scannedPlateIsTooShort = strlen($lpr_result['license_plate_number']) <= 3;
// If the confidence is below 90%, consider it a failure.
if (isset($lpr_result['confidence']) && $lpr_result['confidence'] < 0.9) {
if (isset($lpr_result['confidence']) && $lpr_result['confidence'] < 0.9 && !$scannedPlateIsTooShort) {
throw new Exception('License plate recognition confidence too low. Score: ' . $lpr_result['confidence'] . ' Plate: ' . $lpr_result['license_plate_number'] . ' Raw: ' . json_encode($lpr_result['raw_response']));
}
// Success
+13 -8
View File
@@ -5,6 +5,7 @@ namespace routes;
use classes\economic;
use classes\router;
use classes\virkdata;
use modules\virkdata\helpers\virkdata_response;
use objects\users_o;
use traits\route_t;
@@ -86,14 +87,18 @@ class workerRoute
if (!is_numeric($cvr)) {
$response->error('Invalid CVR number', 400);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://cvrapi.dk/api?search=' . $cvr . '&country=dk');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_USERAGENT, 'Truck Wash ApS (truckwash.dk) - Kundeimporterings-modul');
$result = curl_exec($ch);
curl_close($ch);
$result = json_decode($result);
$response->success(['cvr' => $cvr, 'result' => $result, 'phone' => $result->phone, 'email' => $result->email], 200);
// Check if the result is cached
if (!empty(redis->get('cvr_lookup_' . $cvr))) {
$result = (new virkdata_response())->populate((array)json_decode(redis->get('cvr_lookup_' . $cvr)));
} else {
$virkdata = new virkdata();
$result = $virkdata->getCompanyInformation($cvr, '', []);
// Cache the result
redis->set('cvr_lookup_' . $cvr, json_encode($result->asArray()));
// Set the cache expiration time (3 days)
redis->expire('cvr_lookup_' . $cvr, (60 * 60 * 24 * 4));
}
$response->success(['cvr' => $cvr, 'result' => (object)$result->asArray(), 'phone' => $result->phone, 'email' => $result->email], 200);
});
}