Files
api/services/nginx/app/objects/xlvask_usage_logs_o.php
T
Jeppe Bundgaard f5ba9dd891 Add product discount calculation and update handling for dynamic usage logs
- Introduced `getProductDiscountPercentage` method to calculate accurate discounts for users across products, categories, and global settings.
- Adjusted `importUsageLogs` to refine date modifier parameter and enhance `usage log` checks.
- Enhanced `orders_o` to include product discount logic with stricter type casting for consistency.
- Added `updateFieldsWhere` method for selective database updates based on specific conditions.
- Updated `customers_o` to handle updates for existing customers while adding new ones.
2025-07-23 09:31:43 +02:00

153 lines
6.5 KiB
PHP

<?php
namespace objects;
use classes\db;
use classes\object_property;
use classes\xlvask;
use Exception;
use helpers\xlvask_customer;
use helpers\xlvask_usage_log;
use helpers\xlvask_vehicle;
use traits\db_object_t;
class xlvask_usage_logs_o extends db
{
use db_object_t;
public object_property $WashId;
public object_property $CustomerId;
public object_property $Customer;
public object_property $VatNumber;
public object_property $Location;
public object_property $Hall;
public object_property $HallId;
public object_property $StartTime;
public object_property $FinishTime;
public object_property $RegistrationNumber;
public object_property $VehicleType;
public object_property $IdentificationType;
public object_property $IdentificationId;
public object_property $Info;
public object_property $Updated;
public object_property $Prepaid;
public object_property $FinishStatus;
public object_property $CustomerGuid;
public object_property $VehicleId;
public object_property $WashItems;
public function structure(): void
{
$this->setTable('xlvask_usage_logs');
}
/**
* Add a new XL Vask customer
* @param array $data The properties
* @returns void
* @throws Exception If the object was not created successfully
*/
public function add(array $data): void
{
$tmp_id = self::add_object($data);
$this->id = $tmp_id;
self::getObjectProperties();
self::objectChanged();
}
public function getObjectProperties(): void
{
$this->WashId = new object_property($this->table, $this->id, 'WashId', 'string', false);
$this->CustomerId = new object_property($this->table, $this->id, 'CustomerId', 'string', false);
$this->Customer = new object_property($this->table, $this->id, 'Customer', 'string', false);
$this->VatNumber = new object_property($this->table, $this->id, 'VatNumber', 'string', false);
$this->Location = new object_property($this->table, $this->id, 'Location', 'string', false);
$this->Hall = new object_property($this->table, $this->id, 'Hall', 'string', false);
$this->HallId = new object_property($this->table, $this->id, 'HallId', 'string', false);
$this->StartTime = new object_property($this->table, $this->id, 'StartTime', 'string', false);
$this->FinishTime = new object_property($this->table, $this->id, 'FinishTime', 'string', false);
$this->RegistrationNumber = new object_property($this->table, $this->id, 'RegistrationNumber', 'string', false);
$this->VehicleType = new object_property($this->table, $this->id, 'VehicleType', 'string', false);
$this->IdentificationType = new object_property($this->table, $this->id, 'IdentificationType', 'string', false);
$this->IdentificationId = new object_property($this->table, $this->id, 'IdentificationId', 'string', false);
$this->Info = new object_property($this->table, $this->id, 'Info', 'string', false);
$this->Updated = new object_property($this->table, $this->id, 'Updated', 'string', false);
$this->Prepaid = new object_property($this->table, $this->id, 'Prepaid', 'string', false);
$this->FinishStatus = new object_property($this->table, $this->id, 'FinishStatus', 'string', false);
$this->CustomerGuid = new object_property($this->table, $this->id, 'CustomerGuid', 'string', false);
$this->VehicleId = new object_property($this->table, $this->id, 'VehicleId', 'string', false);
$this->WashItems = new object_property($this->table, $this->id, 'WashItems', 'string', false);
}
public function objectChanged(): void
{
//TODO: Add cache invalidation
}
/**
* Import the usage logs from XL Vask
* @param string $dateTimeModifier A date time modifier to use for the import, defaults to '-7 days'
* @throws Exception If the objects were not successfully added.
* @returns void
*/
public function importUsageLogs(string $dateTimeModifier = '-7 days'): void
{
if (!empty($this->id)) {
throw new Exception('To prevent issues, having a selected object is not allowed.');
}
$usage_logs = $this->getUsageLogsFromXLVask(
date('Y-m-d\TH:i:s.000', strtotime($dateTimeModifier)) // Example: '2025-05-01T00:00:00.000'
);
/** @var string[] $known_usage_logIds The XL Vask usage logIds currently known */
$known_usage_logIds = array_map(function ($log) {
return $log['WashId'];
},
self::getFieldsWhere(
['WashId' => array_column($usage_logs, 'WashId')],
['WashId']
));
/** The XL Vask usage logs without a matching WashId in the database */
$new_usage_logs = array_filter($usage_logs, function ($log) use ($known_usage_logIds) {
return !in_array($log->WashId, $known_usage_logIds);
});
unset($known_usage_logIds);
unset($usage_logs);
/** Adding the new usage logs */
foreach ($new_usage_logs as $log) {
if (!$log->isValid()) {
echo $log->formattedDetails();
throw new Exception('A usage log from XL Vask is not valid, have the structure changed?');
}
}
// Actually save the usage log
foreach ($new_usage_logs as $log) {
/** @var xlvask_usage_log $log */
$this->add($log->toArray());
}
unset($new_usage_logs);
}
/**
* This function retrieves the usage logs from XL Vask
* @param string $fromDate The date from which to retrieve the usage logs, in ISO 8601 format (e.g., '2025-05-01T00:00:00.000')
* @returns xlvask_usage_log[]
* @throws Exception
*/
public function getUsageLogsFromXLVask(string $fromDate): array
{
// Validate the date format
if (!preg_match('/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}$/', $fromDate)) {
throw new Exception('Invalid date format. Expected format: YYYY-MM-DDTHH:MM:SS.SSS (e.g., 2025-05-01T00:00:00.000)');
}
// Set the memory limit to 512MB, as the import can be quite large
ini_set('memory_limit', '512M');
/** Get the vehicles from XL Vask */
$xlvask = new xlvask();
$vehicle_class = $xlvask->new($xlvask->helpers->xlvask_usage_log);
/** @var xlvask_usage_log[] $vehicles */
$vehicles = $vehicle_class->toObjects($xlvask->getUsageLog(
$fromDate, // Example: '2025-05-01T00:00:00.000'
));
return $vehicles;
}
}