Porządki
This commit is contained in:
+176
@@ -0,0 +1,176 @@
|
||||
<?php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
require_once __DIR__ . '/../config/database.php';
|
||||
require_once __DIR__ . '/get_table_name.php';
|
||||
|
||||
$hashParam = isset($_GET['h']) ? trim($_GET['h']) : '';
|
||||
$tableParam = getTableNameByHash($conn, $hashParam);
|
||||
$tableParam = strtolower($tableParam);
|
||||
|
||||
if (empty($tableParam)) {
|
||||
die(json_encode(['status' => 'success', 'data' => []]));
|
||||
}
|
||||
|
||||
// 1. & 2. & 3. Pobranie dzisiejszych rachunków ze statusem 0
|
||||
$tsqlBills = "
|
||||
SELECT
|
||||
r.ID,
|
||||
r.Numer,
|
||||
r.Opis,
|
||||
s.Nazwa as NazwaStolika
|
||||
FROM dbo.NGastroDTRachunek r
|
||||
LEFT JOIN dbo.NGastroStolik s ON s.ID = r.StolikID
|
||||
WHERE CAST(r.DataOtwarcia as DATE) = CAST(GETDATE() as DATE)
|
||||
AND r.Status = 0
|
||||
";
|
||||
|
||||
$stmtBills = sqlsrv_query($conn, $tsqlBills);
|
||||
if ($stmtBills === false) {
|
||||
die(json_encode(['status' => 'error', 'message' => 'Błąd pobierania rachunków.', 'errors' => sqlsrv_errors()]));
|
||||
}
|
||||
|
||||
$matchedBillIds = [];
|
||||
$bills = [];
|
||||
|
||||
// 4. Filtrujemy rachunki po nazwie stolika (tak jak w JS)
|
||||
while ($row = sqlsrv_fetch_array($stmtBills, SQLSRV_FETCH_ASSOC)) {
|
||||
$stolikNazwa = strtolower($row['NazwaStolika'] ?? '');
|
||||
$opis = strtolower($row['Opis'] ?? '');
|
||||
|
||||
// Elastyczne dopasowanie, uwzględnia literówkę 0 zamiast O
|
||||
$normalizedTableParam = str_replace('o', '0', $tableParam);
|
||||
$normalizedStolikNazwa = str_replace('o', '0', $stolikNazwa);
|
||||
$normalizedOpis = str_replace('o', '0', $opis);
|
||||
|
||||
$isMatched = false;
|
||||
|
||||
if (!$tableParam) {
|
||||
// Jeśli testujesz w przeglądarce bez parametru ?table=, pokażemy WSZYSTKIE otwarte rachunki
|
||||
$isMatched = true;
|
||||
} else {
|
||||
$pattern = '/\b' . preg_quote($normalizedTableParam, '/') . '\b/i';
|
||||
if (
|
||||
$normalizedStolikNazwa === $normalizedTableParam ||
|
||||
$normalizedOpis === $normalizedTableParam ||
|
||||
preg_match($pattern, $normalizedStolikNazwa) ||
|
||||
preg_match($pattern, $normalizedOpis)
|
||||
) {
|
||||
$isMatched = true;
|
||||
}
|
||||
}
|
||||
|
||||
if ($isMatched) {
|
||||
$billId = $row['ID'];
|
||||
$matchedBillIds[] = $billId;
|
||||
$bills[$billId] = [
|
||||
'id' => $billId,
|
||||
'numer' => $row['Numer'],
|
||||
'opis' => $row['Opis'],
|
||||
'suma' => 0,
|
||||
'pozycje' => []
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($matchedBillIds)) {
|
||||
die(json_encode(['status' => 'success', 'data' => []]));
|
||||
}
|
||||
|
||||
// 5. Pobranie pozycji dla dopasowanych rachunków
|
||||
$inClause = implode("','", $matchedBillIds);
|
||||
|
||||
$tsqlItems = "
|
||||
SELECT
|
||||
rp.DTRachunekID,
|
||||
rp.ID as PozycjaID,
|
||||
ISNULL(NULLIF(t.NazwaNaZamowieniu, ''), t.NazwaTowaru) as NazwaTowaru,
|
||||
ISNULL(NULLIF(tz.NazwaNaZamowieniu, ''), tz.NazwaTowaru) as NazwaZestawu,
|
||||
rp.GrupaZestawuID,
|
||||
rp.ZestawID,
|
||||
rp.Ilosc,
|
||||
rp.Cena,
|
||||
rp._c_Wartosc
|
||||
FROM dbo.NGastroDTRachunekPozycja rp
|
||||
LEFT JOIN dbo.NGastroTowar t ON t.ID = rp.TowarID
|
||||
LEFT JOIN dbo.NGastroTowar tz ON tz.ID = rp.ZestawID
|
||||
WHERE rp.DTRachunekID IN ('$inClause')
|
||||
";
|
||||
|
||||
$stmtItems = sqlsrv_query($conn, $tsqlItems);
|
||||
if ($stmtItems === false) {
|
||||
die(json_encode(['status' => 'error', 'message' => 'Błąd pobierania pozycji.', 'errors' => sqlsrv_errors()]));
|
||||
}
|
||||
|
||||
// 1. Grupujemy najpierw w fizyczne "Dania" (składniki pizzy łączą się w jedną pizzę)
|
||||
$dishes = [];
|
||||
while ($row = sqlsrv_fetch_array($stmtItems, SQLSRV_FETCH_ASSOC)) {
|
||||
$billId = $row['DTRachunekID'];
|
||||
$groupId = !empty($row['GrupaZestawuID']) ? $row['GrupaZestawuID'] : $row['PozycjaID'];
|
||||
|
||||
if (!isset($dishes[$billId])) {
|
||||
$dishes[$billId] = [];
|
||||
}
|
||||
|
||||
$ilosc = floatval($row['Ilosc']);
|
||||
$wartosc = floatval($row['_c_Wartosc']);
|
||||
|
||||
if (!isset($dishes[$billId][$groupId])) {
|
||||
$nazwa = trim(!empty($row['NazwaZestawu']) ? $row['NazwaZestawu'] : $row['NazwaTowaru']);
|
||||
$dishes[$billId][$groupId] = [
|
||||
'nazwa' => $nazwa ?: 'Brak nazwy',
|
||||
'ilosc' => $ilosc,
|
||||
'wartosc' => 0
|
||||
];
|
||||
} else {
|
||||
// Zabezpieczenie: bierzemy największą ilość ze składników (np. jak ktoś usunął składnik i ma ilość 0)
|
||||
if ($ilosc > $dishes[$billId][$groupId]['ilosc']) {
|
||||
$dishes[$billId][$groupId]['ilosc'] = $ilosc;
|
||||
}
|
||||
}
|
||||
|
||||
// Zawsze sumujemy wartość składników (ser 53zł + ciasto 0zł = 53zł)
|
||||
$dishes[$billId][$groupId]['wartosc'] += $wartosc;
|
||||
}
|
||||
|
||||
// 2. Mając pełne dania, redukujemy je (np. dwie takie same pizze "ZADYMIONA BACÓWKA" w jeden wiersz x2)
|
||||
foreach ($dishes as $billId => $billDishes) {
|
||||
$groupedByMenu = [];
|
||||
|
||||
foreach ($billDishes as $dish) {
|
||||
$nazwa = $dish['nazwa'];
|
||||
$ilosc = $dish['ilosc'];
|
||||
$wartosc = $dish['wartosc'];
|
||||
|
||||
// Cena jednostkowa uśredniona
|
||||
$cenaJednostkowa = $ilosc > 0 ? ($wartosc / $ilosc) : $wartosc;
|
||||
|
||||
$key = $nazwa . "_" . number_format($cenaJednostkowa, 2, '.', '');
|
||||
|
||||
if (!isset($groupedByMenu[$key])) {
|
||||
$groupedByMenu[$key] = [
|
||||
'nazwa' => $nazwa,
|
||||
'ilosc' => 0,
|
||||
'cena' => $cenaJednostkowa,
|
||||
'wartosc' => 0
|
||||
];
|
||||
}
|
||||
|
||||
$groupedByMenu[$key]['ilosc'] += $ilosc;
|
||||
$groupedByMenu[$key]['wartosc'] += $wartosc;
|
||||
$bills[$billId]['suma'] += $wartosc;
|
||||
}
|
||||
|
||||
$bills[$billId]['pozycje'] = array_values($groupedByMenu);
|
||||
}
|
||||
|
||||
$finalData = [];
|
||||
foreach ($bills as $bill) {
|
||||
$finalData[] = $bill;
|
||||
}
|
||||
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'tableName' => strtoupper($tableParam),
|
||||
'data' => $finalData
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
Vendored
+1
@@ -0,0 +1 @@
|
||||
{"00E3F7CD-2DD6-4719-ABCE-FE45AADB6E11":"STOLIK 1","A7B40445-11F2-4078-AAE2-4FE70886C745":"STOLIK 2","7F434E77-5F23-49CD-8FD5-CA6EED6F9FD3":"STOLIK 3","28AF701C-4664-49BE-A5AB-F4AA60A47DF2":"STOLIK 4","59491B8A-EB04-4981-B825-CD644639247B":"STOLIK 5","C6B285A4-6DFC-4254-8195-20339C56D9DF":"STOLIK 6","585BA56A-5A33-4A9A-B2C0-168088500010":"STOLIK 7","C2AE32AD-C283-43D6-BB84-D5AE1E81CA6E":"STOLIK 8","E62159AC-E76A-400E-B883-144FB3F0EDAC":"STOLIK 9","86949E9C-B276-4A0C-8C04-CC1689D03D33":"STOLIK 11","72ADEDAC-BE8C-4AB6-9EA1-563C31DBF3C4":"STOLIK 11A","12EF66B0-D639-42FD-A4F1-9420AB65FB18":"STOLIK 10","FB62083F-7F98-42AA-B61E-CEA28F31717F":"STOLIK 13","13E84A2D-C4A3-4122-B166-9C42C011FA80":"STOLIK 14","480EA2AF-6C0C-40AE-9422-84CFC026D0B7":"STOLIK 15","A1B032B9-D849-4E16-8B27-46E3A45D0F86":"STOLIK 16","8E48ED78-3202-461F-A140-74FF63A50E9D":"STOLIK 17","B6D6D5A8-252C-43BA-8B87-6F9CAE39A747":"STOLIK 23","D799A844-B4E7-4025-94E2-8147E93DC525":"STOLIK 22","EF848BE1-DB17-42D7-A9C6-27B753F161B1":"STOLIK 21","FA6061CC-FA66-4474-9EB6-F26483596826":"STOLIK 20","92367DDA-B500-4C40-885A-0574163DDBBC":"STOLIK 19","0C64E565-9823-439C-B6D3-6FD38251F289":"STOLIK 18","A825B28F-3E79-4A3A-887C-A72F6BAFB299":"STOLIK T_24","4CD3FB15-7A6E-4FE7-8C48-07AB57CE5FBC":"STOLIK T_25","55283F68-78A0-4D00-9B47-FD305370932F":"STOLIK T_30","42A76757-3E9A-450D-A9C1-67A35A83F04A":"STOLIK T_29","D80DE0F0-5591-4ECE-8AD4-01CD77508D10":"O-65","60356B27-5569-4504-AFE2-E349155957EE":"0-64","1B78C97A-C555-44E2-A60E-D8EC251034C7":"O-63","43731846-7C88-4E86-9DBC-C4BB5EDD313F":"O-61","2304DE24-398C-4854-A352-78F6A6B8CFAB":"0-62","FB6E8FAD-3E35-4CF2-B604-59A140A09D84":"O-31","D06E92B4-7E45-46BA-92FC-DF4D6C7F0665":"O-32","54E81D67-D63C-49E5-B64F-8952D1CEA50F":"O-33","A44BB845-9950-47E4-90C8-CAFF1FF44F90":"O-34","09F2601D-C08C-498D-8376-27BDA690750A":"O-35","935BA7EE-1883-4B30-B581-48B72210BBDB":"O-36","F8052EE2-41BE-4286-B4F6-1361C1713270":"0-37","3EE3DF0A-70B2-47CC-848A-E1E7D23C64BB":"0-40","D57FCE56-BD9A-4BA9-8B37-A7E9B7DFDCE1":"0-37A","BB439A64-E7B9-4460-A9A1-BA06908FABC7":"O-38A","0CA2F62E-5EAB-4214-8B71-52ED86DCAF88":"O-38","EABA9383-59B5-4FCC-B45C-2CAF5DFEDC5C":"O-39","23ED63BF-D70E-4FA7-990E-BF91DD1E80C6":"O-40A","C626612E-AC85-41A4-9BEF-44231D5FCAA6":"O-41A","BC97200A-3334-4D49-A51A-0F20CF7B6E2D":"0-44","B54B052F-A284-4025-9F50-8345416AFE32":"0-45","AEEBA14C-0E0F-4E59-9EF2-7D95953DECF8":"O-46","5D1BF524-F8B3-4D34-BEF5-9BA1A25E0475":"O-47","266E2DE1-96E5-430C-80BE-1564B7E2A7C0":"O-48","3F1E9A2F-EF23-44DE-8D7D-0EE2398CAA45":"O-38","B764B09A-73FB-40C1-8788-B2940EC22756":"O-39","AD105452-3A99-4ED5-8E64-6AB2EABC7F37":"O-41","5F09DAC8-219C-4912-8190-DE8D90789DA4":"O-42","F63FA7C0-FE0A-454B-BF81-A63BA6EDA395":"0-72","1CCEC9F0-A636-42DD-8D78-70F3E8F06F31":"O-39A","8BE52ACA-4505-472A-9EEE-B1CD8F56F136":"O-42A","59B296A3-54FB-47E8-A6C5-ABFC07D921DC":"O-48A","DCE351C7-4C51-4892-A736-C43A6258D35A":"O-48B","E25860EF-285C-46E8-938C-67CEC2C1174A":"O-48","A116FD34-6A57-4819-A809-FA02AD834B4E":"O-70","F36A0857-964E-4BC4-B130-653E76874476":"O-71","BE4C3E15-016B-4C30-9023-0CF1527AE732":"C-55","D17FE879-BD11-4EBF-908C-E69E9BBE6FBB":"C-56","B0606B71-0310-46C4-9993-2408C1BBF26B":"C-59","7BC90104-2A30-4BE9-B6A8-82D8EB716E7A":"C-60","F59C03AB-60FE-4560-BB23-5070F4D64394":"C-57","02D53EE2-B1CF-4114-B56C-1D41FFDBC6E9":"C-58","57AF1C72-5CE5-4573-A026-D8D99D30C50D":"C-49A","5CB1B9E5-77E5-4A85-A1CC-6D950F696C60":"C-49","DB4CF965-C41D-4621-9039-B9F2BBD3AB3B":"C-50","2DD0A8F1-637C-4DB7-87D6-4B8D9276730C":"C-51","0116D15C-3378-48A6-ADB4-5AE4B090929D":"C-52","3C667D41-0F3A-446E-A96B-8EFD33596D89":"C-52","16D24F95-D9BA-4419-AFFD-F149D0B7CD50":"C-53"}
|
||||
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
function getTableNameByHash($conn, $hash) {
|
||||
if (empty($hash)) {
|
||||
return '';
|
||||
}
|
||||
|
||||
$cacheFile = __DIR__ . '/cache/tables_cache.json';
|
||||
$cacheLifetime = 24 * 3600; // 24 godziny
|
||||
|
||||
$cacheData = [];
|
||||
$cacheValid = false;
|
||||
|
||||
if (file_exists($cacheFile)) {
|
||||
if (time() - filemtime($cacheFile) < $cacheLifetime) {
|
||||
$json = file_get_contents($cacheFile);
|
||||
$cacheData = json_decode($json, true);
|
||||
if (is_array($cacheData)) {
|
||||
$cacheValid = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!$cacheValid) {
|
||||
$cacheData = [];
|
||||
$tsql = "SELECT ID, Nazwa FROM dbo.NGastroStolik";
|
||||
$stmt = sqlsrv_query($conn, $tsql);
|
||||
|
||||
if ($stmt !== false) {
|
||||
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
|
||||
$id = strtoupper($row['ID']);
|
||||
$nazwa = trim($row['Nazwa']);
|
||||
$cacheData[$id] = $nazwa;
|
||||
}
|
||||
file_put_contents($cacheFile, json_encode($cacheData, JSON_UNESCAPED_UNICODE));
|
||||
}
|
||||
}
|
||||
|
||||
$hashUpper = strtoupper($hash);
|
||||
return $cacheData[$hashUpper] ?? '';
|
||||
}
|
||||
+120
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
// api_kds.php
|
||||
header('Content-Type: application/json; charset=utf-8');
|
||||
|
||||
require_once __DIR__ . '/../config/database.php';
|
||||
require_once __DIR__ . '/get_table_name.php';
|
||||
|
||||
$hashParam = isset($_GET['h']) ? trim($_GET['h']) : '';
|
||||
$myTable = getTableNameByHash($conn, $hashParam);
|
||||
$myTable = strtolower($myTable);
|
||||
|
||||
$isKitchen = (isset($_GET['kds_secret']) && $_GET['kds_secret'] === 'karczma_kuchnia');
|
||||
|
||||
if (empty($myTable) && !$isKitchen) {
|
||||
die(json_encode(['status' => 'success', 'count' => 0, 'data' => []]));
|
||||
}
|
||||
|
||||
if (!$conn) {
|
||||
die(json_encode([
|
||||
'status' => 'error',
|
||||
'message' => 'Błąd połączenia z bazą danych.',
|
||||
'errors' => sqlsrv_errors()
|
||||
]));
|
||||
}
|
||||
|
||||
$tableParam = $myTable;
|
||||
|
||||
// Zapytanie SQL wyciągające aktywne pozycje (StatusRealizacji < 4)
|
||||
// Łączymy NGastroDTRachunekPozycja z NGastroDTRachunek (żeby mieć stolik) i z NGastroTowar (żeby mieć nazwę)
|
||||
$tsql = "
|
||||
SELECT
|
||||
r.StolikID,
|
||||
s.Nazwa AS NazwaStolika,
|
||||
r.Numer AS NumerRachunku,
|
||||
r.Opis,
|
||||
r.NumerReczny AS NumerRecznyRachunku,
|
||||
rp.ID AS PozycjaID,
|
||||
rp.StatusRealizacji,
|
||||
rp.Ilosc,
|
||||
rp.DataDodania,
|
||||
rp.Notatka,
|
||||
CASE
|
||||
WHEN rp.NazwaDanieOtwarte != '' THEN rp.NazwaDanieOtwarte
|
||||
ELSE ISNULL(NULLIF(t.NazwaNaZamowieniu, ''), t.NazwaTowaru)
|
||||
END AS NazwaTowaru,
|
||||
ISNULL(NULLIF(tz.NazwaNaZamowieniu, ''), tz.NazwaTowaru) AS NazwaZestawu,
|
||||
rp.GrupaZestawuID,
|
||||
rp.TowarID
|
||||
FROM dbo.NGastroDTRachunekPozycja rp
|
||||
INNER JOIN dbo.NGastroDTRachunek r ON r.ID = rp.DTRachunekID
|
||||
LEFT JOIN dbo.NGastroTowar t ON t.ID = rp.TowarID
|
||||
LEFT JOIN dbo.NGastroTowar tz ON tz.ID = rp.ZestawID
|
||||
LEFT JOIN dbo.NGastroStolik s ON s.ID = r.StolikID
|
||||
LEFT JOIN dbo.NGastroKonfiguracjaDrukowaniaZamowien kdz ON kdz.ID = ISNULL(rp.KonfiguracjaDrukowaniaZamowienID, t.KonfiguracjaDrukowaniaZamowienID)
|
||||
WHERE r.Status = 0
|
||||
AND rp.StatusRealizacji > 0
|
||||
AND rp.StatusRealizacji < 4
|
||||
AND kdz.ID IS NOT NULL
|
||||
AND CAST(rp.DataDodania AS DATE) = CAST(GETDATE() AS DATE)
|
||||
AND rp.DataUsuniecia = '1900-01-01'
|
||||
ORDER BY rp.DataDodania ASC
|
||||
";
|
||||
|
||||
$stmt = sqlsrv_query($conn, $tsql);
|
||||
|
||||
if ($stmt === false) {
|
||||
die(json_encode([
|
||||
'status' => 'error',
|
||||
'message' => 'Błąd podczas wykonywania zapytania SQL.',
|
||||
'errors' => sqlsrv_errors()
|
||||
]));
|
||||
}
|
||||
|
||||
$pozycje = [];
|
||||
while ($row = sqlsrv_fetch_array($stmt, SQLSRV_FETCH_ASSOC)) {
|
||||
$stolikNazwa = strtolower($row['NazwaStolika'] ?? '');
|
||||
$opis = strtolower($row['Opis'] ?? '');
|
||||
|
||||
$normalizedTableParam = str_replace('o', '0', $tableParam);
|
||||
$normalizedStolikNazwa = str_replace('o', '0', $stolikNazwa);
|
||||
$normalizedOpis = str_replace('o', '0', $opis);
|
||||
|
||||
$isMatched = false;
|
||||
if (!$tableParam) {
|
||||
$isMatched = true;
|
||||
} else {
|
||||
$pattern = '/\b' . preg_quote($normalizedTableParam, '/') . '\b/i';
|
||||
if (
|
||||
$normalizedStolikNazwa === $normalizedTableParam ||
|
||||
$normalizedOpis === $normalizedTableParam ||
|
||||
preg_match($pattern, $normalizedStolikNazwa) ||
|
||||
preg_match($pattern, $normalizedOpis)
|
||||
) {
|
||||
$isMatched = true;
|
||||
}
|
||||
}
|
||||
|
||||
if ($isMatched) {
|
||||
if ($row['DataDodania'] instanceof DateTime) {
|
||||
$row['DataDodania'] = $row['DataDodania']->format('Y-m-d H:i:s');
|
||||
}
|
||||
$row['StolikID'] = $row['StolikID'] ? strtoupper($row['StolikID']) : null;
|
||||
$row['PozycjaID'] = strtoupper($row['PozycjaID']);
|
||||
$row['TowarID'] = strtoupper($row['TowarID']);
|
||||
|
||||
$pozycje[] = $row;
|
||||
}
|
||||
}
|
||||
|
||||
// Zwracamy czysty JSON
|
||||
echo json_encode([
|
||||
'status' => 'success',
|
||||
'count' => count($pozycje),
|
||||
'tableName' => strtoupper($myTable),
|
||||
'data' => $pozycje
|
||||
], JSON_UNESCAPED_UNICODE);
|
||||
|
||||
sqlsrv_free_stmt($stmt);
|
||||
sqlsrv_close($conn);
|
||||
?>
|
||||
Reference in New Issue
Block a user