forked from thetigerone888/APP-STOCK
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathapi.php
More file actions
92 lines (82 loc) · 3.55 KB
/
Copy pathapi.php
File metadata and controls
92 lines (82 loc) · 3.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?php
// MARBOHUB POS — Shared Backend API
// อัปโหลดไฟล์นี้ไว้ที่ public_html/api.php
header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST, OPTIONS');
header('Access-Control-Allow-Headers: Content-Type, X-Pin');
if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; }
// ===== PIN รักษาความปลอดภัย (เปลี่ยนได้) =====
define('PIN', '8888');
$pin = $_SERVER['HTTP_X_PIN'] ?? ($_GET['pin'] ?? '');
if ($pin !== PIN) { http_response_code(401); echo json_encode(['error'=>'PIN ไม่ถูกต้อง']); exit; }
// ===== ไฟล์เก็บข้อมูล =====
define('DATA_FILE', __DIR__ . '/marbohub_data.json');
define('LOCK_FILE', __DIR__ . '/marbohub_data.lock');
function loadData() {
if (!file_exists(DATA_FILE)) return ['orders'=>[], 'stockOv'=>[], 'costOv'=>[], 'v'=>0];
$raw = file_get_contents(DATA_FILE);
return $raw ? json_decode($raw, true) : ['orders'=>[], 'stockOv'=>[], 'costOv'=>[], 'v'=>0];
}
function saveData($data) {
$data['v'] = ($data['v'] ?? 0) + 1;
$data['ts'] = round(microtime(true) * 1000);
$fp = fopen(LOCK_FILE, 'w');
if (flock($fp, LOCK_EX)) {
file_put_contents(DATA_FILE, json_encode($data, JSON_UNESCAPED_UNICODE));
flock($fp, LOCK_UN);
}
fclose($fp);
return $data;
}
$action = $_GET['action'] ?? '';
// ===== โหลดข้อมูลทั้งหมด =====
if ($action === 'load') {
echo json_encode(loadData(), JSON_UNESCAPED_UNICODE);
exit;
}
// ===== เช็คว่ามีอัปเดตใหม่ไหม (polling) =====
if ($action === 'poll') {
$clientV = intval($_GET['v'] ?? 0);
$data = loadData();
if ($data['v'] > $clientV) {
echo json_encode($data, JSON_UNESCAPED_UNICODE);
} else {
echo json_encode(['v' => $data['v'], 'noChange' => true]);
}
exit;
}
// ===== บันทึกทั้งหมด (full sync) =====
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $action === 'save') {
$body = json_decode(file_get_contents('php://input'), true);
if (!$body) { http_response_code(400); echo json_encode(['error'=>'invalid body']); exit; }
$data = saveData($body);
echo json_encode(['ok'=>true, 'v'=>$data['v']]);
exit;
}
// ===== เพิ่มออเดอร์ใหม่ (atomic) =====
if ($_SERVER['REQUEST_METHOD'] === 'POST' && $action === 'addOrder') {
$body = json_decode(file_get_contents('php://input'), true);
$fp = fopen(LOCK_FILE, 'w');
flock($fp, LOCK_EX);
$data = loadData();
$order = $body['order'];
// เพิ่มออเดอร์
array_unshift($data['orders'], $order);
// ตัดสต๊อก
if (isset($body['stockCuts'])) {
foreach ($body['stockCuts'] as $pid => $qty) {
$cur = $data['stockOv'][$pid] ?? null;
// ถ้ายังไม่เคยตั้งค่า ไม่ต้องตัด (ใช้ค่า default จาก PRODUCTS)
if ($cur !== null) $data['stockOv'][$pid] = max(0, $cur - $qty);
}
}
$data['v'] = ($data['v'] ?? 0) + 1;
$data['ts'] = round(microtime(true) * 1000);
file_put_contents(DATA_FILE, json_encode($data, JSON_UNESCAPED_UNICODE));
flock($fp, LOCK_UN); fclose($fp);
echo json_encode(['ok'=>true, 'v'=>$data['v']]);
exit;
}
http_response_code(400);
echo json_encode(['error'=>'unknown action: ' . $action]);