Complete port of all 163 API endpoints from Lucee/CFML to PHP 8.3. Shared helpers in api/helpers.php (DB, auth, request/response, security). PDO prepared statements throughout. Same JSON response shapes as CFML.
93 lines
3.1 KiB
PHP
93 lines
3.1 KiB
PHP
<?php
|
|
require_once __DIR__ . '/../helpers.php';
|
|
runAuth();
|
|
|
|
global $businessId;
|
|
|
|
$data = readJsonBody();
|
|
|
|
if ($businessId <= 0) {
|
|
apiAbort(['OK' => false, 'ERROR' => 'no_business_selected']);
|
|
}
|
|
|
|
$spName = trim($data['Name'] ?? '');
|
|
if ($spName === '') {
|
|
apiAbort(['OK' => false, 'ERROR' => 'missing_name', 'MESSAGE' => 'Name is required']);
|
|
}
|
|
|
|
$servicePointId = (int) ($data['ServicePointID'] ?? 0);
|
|
$spCode = trim($data['Code'] ?? '');
|
|
$spTypeID = (int) ($data['TypeID'] ?? 1);
|
|
$sortOrder = (int) ($data['SortOrder'] ?? 0);
|
|
$beaconMinor = isset($data['BeaconMinor']) && is_numeric($data['BeaconMinor']) ? (int) $data['BeaconMinor'] : -1;
|
|
|
|
$isActive = 1;
|
|
if (isset($data['IsActive'])) {
|
|
$v = $data['IsActive'];
|
|
if (is_bool($v)) $isActive = $v ? 1 : 0;
|
|
elseif (is_numeric($v)) $isActive = (int) $v;
|
|
elseif (is_string($v)) $isActive = (strtolower(trim($v)) === 'true') ? 1 : 0;
|
|
}
|
|
|
|
try {
|
|
if ($servicePointId > 0) {
|
|
// Update
|
|
$sql = "UPDATE ServicePoints SET Name = ?, Code = ?, TypeID = ?, IsActive = ?, SortOrder = ?";
|
|
$params = [$spName, $spCode ?: null, $spTypeID, $isActive, $sortOrder];
|
|
|
|
if ($beaconMinor >= 0) {
|
|
$sql .= ", BeaconMinor = ?";
|
|
$params[] = $beaconMinor;
|
|
}
|
|
|
|
$sql .= " WHERE ID = ? AND BusinessID = ?";
|
|
$params[] = $servicePointId;
|
|
$params[] = $businessId;
|
|
|
|
queryTimed($sql, $params);
|
|
|
|
$qCheck = queryOne("SELECT ID FROM ServicePoints WHERE ID = ? AND BusinessID = ? LIMIT 1",
|
|
[$servicePointId, $businessId]);
|
|
if (!$qCheck) {
|
|
apiAbort(['OK' => false, 'ERROR' => 'not_found']);
|
|
}
|
|
} else {
|
|
// Auto-allocate BeaconMinor if not provided
|
|
if ($beaconMinor < 0) {
|
|
$qMaxMinor = queryOne("
|
|
SELECT COALESCE(MAX(BeaconMinor), -1) AS MaxMinor FROM ServicePoints WHERE BusinessID = ?
|
|
", [$businessId]);
|
|
$beaconMinor = (int) $qMaxMinor['MaxMinor'] + 1;
|
|
}
|
|
|
|
queryTimed("
|
|
INSERT INTO ServicePoints (BusinessID, Name, Code, TypeID, IsActive, SortOrder, BeaconMinor)
|
|
VALUES (?, ?, ?, ?, ?, ?, ?)
|
|
", [$businessId, $spName, $spCode ?: null, $spTypeID, $isActive, $sortOrder, $beaconMinor]);
|
|
|
|
$servicePointId = (int) lastInsertId();
|
|
}
|
|
|
|
$qOut = queryOne("
|
|
SELECT ID, BusinessID, Name, Code, TypeID, IsActive, SortOrder, BeaconMinor
|
|
FROM ServicePoints WHERE ID = ? AND BusinessID = ? LIMIT 1
|
|
", [$servicePointId, $businessId]);
|
|
|
|
jsonResponse([
|
|
'OK' => true,
|
|
'ERROR' => '',
|
|
'SERVICEPOINT' => [
|
|
'ServicePointID' => (int) $qOut['ID'],
|
|
'BusinessID' => (int) $qOut['BusinessID'],
|
|
'Name' => $qOut['Name'],
|
|
'Code' => $qOut['Code'] ?? '',
|
|
'TypeID' => (int) $qOut['TypeID'],
|
|
'IsActive' => (int) $qOut['IsActive'],
|
|
'SortOrder' => (int) $qOut['SortOrder'],
|
|
'BeaconMinor' => $qOut['BeaconMinor'] !== null ? (int) $qOut['BeaconMinor'] : '',
|
|
],
|
|
]);
|
|
|
|
} catch (Exception $e) {
|
|
jsonResponse(['OK' => false, 'ERROR' => 'server_error', 'MESSAGE' => $e->getMessage()]);
|
|
}
|