7 private string $dd_lkw =
'lkw';
8 private string $dd_dispo =
'lkw_dispo_dia';
12 $this->oDB =
dbx()->get_system_obj(
'dbxDB');
18 public function run() {
20 $work =
dbx()->get_modul_var(
'dbx_run2',
'create_tab',
'parameter');
21 dbx_debug(
"myLKW_order run work=($work)");
26 return $this->create_tab();
40 $this->delete_dispo();
44 return "Unbekannte Aktion ($work)";
51 private function create_tab() {
53 $oTPL =
dbx()->get_system_obj(
'dbxTPL');
60 { title:
"Tractor", field:
"TRACTOR", width: 120 },
61 { title:
"Remolque", field:
"REMOLQUE", width: 120 },
62 { title:
"Conductor", field:
"CONDUCTOR", width: 160 },
63 { title:
"Tipo", field:
"TIPO", width: 80 }
69 { title:
"Origen Reg", field:
"d0_origen_region", width: 90 },
70 { title:
"Origen", field:
"d0_origen_lugar", width: 140 },
71 { title:
"Carga Reg", field:
"d0_carga_region", width: 90 },
72 { title:
"Carga", field:
"d0_carga_lugar", width: 140 },
73 { title:
"Hora Prev", field:
"d0_hora_prev", width: 90 },
74 { title:
"Hora Real", field:
"d0_hora_real", width: 90 },
75 { title:
"Estado", field:
"d0_estado", width: 90 },
76 { title:
"Taller", field:
"d0_taller", width: 70 }
82 { title:
"Origen Reg", field:
"d1_origen_region", width: 90 },
83 { title:
"Origen", field:
"d1_origen_lugar", width: 140 },
84 { title:
"Carga Reg", field:
"d1_carga_region", width: 90 },
85 { title:
"Carga", field:
"d1_carga_lugar", width: 140 },
86 { title:
"Hora Prev", field:
"d1_hora_prev", width: 90 },
87 { title:
"Hora Real", field:
"d1_hora_real", width: 90 },
88 { title:
"Estado", field:
"d1_estado", width: 90 },
89 { title:
"Taller", field:
"d1_taller", width: 70 }
95 { title:
"Origen Reg", field:
"d2_origen_region", width: 90 },
96 { title:
"Origen", field:
"d2_origen_lugar", width: 140 },
97 { title:
"Carga Reg", field:
"d2_carga_region", width: 90 },
98 { title:
"Carga", field:
"d2_carga_lugar", width: 140 },
99 { title:
"Hora Prev", field:
"d2_hora_prev", width: 90 },
100 { title:
"Hora Real", field:
"d2_hora_real", width: 90 },
101 { title:
"Estado", field:
"d2_estado", width: 90 },
102 { title:
"Taller", field:
"d2_taller", width: 70 }
106 { field:
"id", visible:
false },
107 { field:
"d0_dispo_id", visible:
false },
108 { field:
"d0_update_date", visible:
false },
109 { field:
"d1_dispo_id", visible:
false },
110 { field:
"d1_update_date", visible:
false },
111 { field:
"d2_dispo_id", visible:
false },
112 { field:
"d2_update_date", visible:
false }
116 $data[
'cols'] = $cols;
118 return $oTPL->get_tpl(
'modul',
'report-dispo',$data);
125 private function read_dispo(){
130 $this->ensure_dispo_rollover();
135 $today = date(
'Y-m-d');
136 $days = $this->getNextWorkdays($today, 3);
145 $lkwCols = $this->oDB->get_dd_cols($this->dd_lkw);
147 $lkwRows = $this->oDB->select(
151 'TIPO DESC, TRACTOR ASC',
158 if (!is_array($lkwRows)) {
165 $dispoCols = $this->oDB->get_dd_cols($this->dd_dispo);
167 $where =
"fecha_trabajo IN ('$d0','$d1','$d2')";
169 $dispoRows = $this->oDB->select(
180 if (!is_array($dispoRows)) {
189 foreach ($dispoRows as $row) {
190 $lid = (int)$row[
'lkw_id'];
191 $day = $row[
'fecha_trabajo'];
192 $dispoMap[$lid][$day] = $row;
200 foreach ($lkwRows as $lkw) {
202 $lid = (int)$lkw[
'id'];
206 $d = $dispoMap[$lid][$d0] ??
null;
207 $row[
'd0_origen_region'] = $d[
'origen_region'] ??
null;
208 $row[
'd0_origen_lugar'] = $d[
'origen_lugar'] ??
null;
209 $row[
'd0_carga_region'] = $d[
'carga_region'] ??
null;
210 $row[
'd0_carga_lugar'] = $d[
'carga_lugar'] ??
null;
211 $row[
'd0_hora_prev'] = $d[
'hora_descarga_prevista'] ??
null;
212 $row[
'd0_hora_real'] = $d[
'hora_descarga_real'] ??
null;
213 $row[
'd0_estado'] = $d[
'estado_carga'] ??
null;
214 $row[
'd0_dispo_id'] = $d[
'id'] ??
null;
215 $row[
'd0_update_date'] = $d[
'update_date'] ??
null;
218 $d = $dispoMap[$lid][$d1] ??
null;
219 $row[
'd1_origen_region'] = $d[
'origen_region'] ??
null;
220 $row[
'd1_origen_lugar'] = $d[
'origen_lugar'] ??
null;
221 $row[
'd1_carga_region'] = $d[
'carga_region'] ??
null;
222 $row[
'd1_carga_lugar'] = $d[
'carga_lugar'] ??
null;
223 $row[
'd1_hora_prev'] = $d[
'hora_descarga_prevista'] ??
null;
224 $row[
'd1_hora_real'] = $d[
'hora_descarga_real'] ??
null;
225 $row[
'd1_estado'] = $d[
'estado_carga'] ??
null;
226 $row[
'd1_dispo_id'] = $d[
'id'] ??
null;
227 $row[
'd1_update_date'] = $d[
'update_date'] ??
null;
230 $d = $dispoMap[$lid][$d2] ??
null;
231 $row[
'd2_origen_region'] = $d[
'origen_region'] ??
null;
232 $row[
'd2_origen_lugar'] = $d[
'origen_lugar'] ??
null;
233 $row[
'd2_carga_region'] = $d[
'carga_region'] ??
null;
234 $row[
'd2_carga_lugar'] = $d[
'carga_lugar'] ??
null;
235 $row[
'd2_hora_prev'] = $d[
'hora_descarga_prevista'] ??
null;
236 $row[
'd2_hora_real'] = $d[
'hora_descarga_real'] ??
null;
237 $row[
'd2_estado'] = $d[
'estado_carga'] ??
null;
238 $row[
'd2_dispo_id'] = $d[
'id'] ??
null;
239 $row[
'd2_update_date'] = $d[
'update_date'] ??
null;
244 header(
'Content-Type: application/json; charset=utf-8');
245 echo json_encode(
$result, JSON_UNESCAPED_UNICODE);
260 if (empty($post[
'id'])) {
261 $this->json(
false,
'missing_id');
264 $id = (int)$post[
'id'];
270 if (empty($post[
'update_date'])) {
271 $this->json(
false,
'missing_update_date');
274 $clientUpdateDate = $post[
'update_date'];
275 unset($post[
'update_date']);
281 $this->json(
true,
'noop');
287 $row = $this->oDB->select1($this->dd_dispo, $id,
'update_date', 0);
289 if (!is_array($row) || empty($row[
'update_date'])) {
290 $this->json(
false,
'not_found');
293 $dbUpdateDate = $row[
'update_date'];
298 if ($dbUpdateDate !== $clientUpdateDate) {
299 $this->json(
false,
'conflict');
306 foreach ($post as $k => $v) {
308 $post[$k] = trim($v);
313 $ok = $this->oDB->update(
324 $this->json(
false,
'update_failed');
330 $this->json(
true,
'ok');
338 private function delete_dispo(){
340 $id = intval($_POST[
'id'] ?? 0);
343 $this->json(
false,
"Keine ID übergeben");
346 $ok = $this->oDB->delete($this->dd_dispo,$id);
355 private function ensure_dispo_rollover(){
358 $today = date(
'Y-m-d');
359 $days = $this->getNextWorkdays($today, 1);
362 $last =
dbx()->get_config(
'myLKW',
'last_dispo_rollover');
363 if ($last === $workday) {
373 $fh = fopen($lockFile,
'c');
380 if (!flock($fh, LOCK_EX)) {
388 $last = dbx()->get_config(
'myLKW',
'last_dispo_rollover');
389 if ($last === $workday) {
394 $this->rollover_dispo();
412 private function rollover_dispo(){
417 $today = date(
'Y-m-d');
418 $days = $this->getNextWorkdays($today, 3);
427 $this->oDB->delete($this->dd_dispo, array(
'fecha_trabajo' => $d2), 0, 0);
432 $rows = $this->oDB->select($this->dd_dispo,
"fecha_trabajo IN ('$d0', '$d1')",
'*',
'',
'ASC',
'', 0, 0, 0);
434 if (!is_array($rows) || empty($rows)) {
443 foreach ($rows as $r) {
444 $map[(int)$r[
'lkw_id']][$r[
'fecha_trabajo']] = $r;
450 foreach ($map as $lkw_id => $dayset) {
453 if (!empty($dayset[$d1])) {
457 $this->oDB->insert($this->dd_dispo, [
459 'fecha_trabajo' => $d2,
460 'origen_region' => $src[
'origen_region'],
461 'origen_lugar' => $src[
'origen_lugar'],
462 'carga_region' => $src[
'carga_region'],
463 'carga_lugar' => $src[
'carga_lugar'],
464 'hora_descarga_prevista' => $src[
'hora_descarga_prevista'],
465 'hora_descarga_real' =>
null,
466 'estado_carga' =>
null,
471 if (!empty($dayset[$d0])) {
475 $this->oDB->insert($this->dd_dispo, [
477 'fecha_trabajo' => $d1,
478 'origen_region' => $src[
'origen_region'],
479 'origen_lugar' => $src[
'origen_lugar'],
480 'carga_region' => $src[
'carga_region'],
481 'carga_lugar' => $src[
'carga_lugar'],
482 'hora_descarga_prevista' => $src[
'hora_descarga_prevista'],
483 'hora_descarga_real' =>
null,
484 'estado_carga' =>
null,
492 private function getNextWorkdays(
string $startDate,
int $count = 3): array {
494 $ts = strtotime($startDate);
496 while (count($days) <
$count) {
499 $days[] = date(
'Y-m-d', $ts);
501 $ts = strtotime(
'+1 day', $ts);
511 private function json(
bool $success,
string $msg=
""){
512 header(
'Content-Type: application/json; charset=utf-8');
516 ],JSON_UNESCAPED_UNICODE);
if(! $db->connect_db_server($server)) $result