|
@@ -6,6 +6,8 @@
|
|
|
let token = null;
|
|
let token = null;
|
|
|
let company = null;
|
|
let company = null;
|
|
|
let flag = null;
|
|
let flag = null;
|
|
|
|
|
+ let orders = {};
|
|
|
|
|
+ let tableHasOrders = {};
|
|
|
|
|
|
|
|
if (browser) {
|
|
if (browser) {
|
|
|
token = localStorage.getItem('token');
|
|
token = localStorage.getItem('token');
|
|
@@ -26,7 +28,6 @@
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
let tables = [];
|
|
let tables = [];
|
|
|
- let orders = {};
|
|
|
|
|
let newTableNumber = '';
|
|
let newTableNumber = '';
|
|
|
let showConfirmDelete = false;
|
|
let showConfirmDelete = false;
|
|
|
let tableToDelete = null;
|
|
let tableToDelete = null;
|
|
@@ -52,6 +53,7 @@
|
|
|
if (result.status !== 'ok') {
|
|
if (result.status !== 'ok') {
|
|
|
throw new Error('Falha ao atualizar status: ' + result.msg);
|
|
throw new Error('Falha ao atualizar status: ' + result.msg);
|
|
|
}
|
|
}
|
|
|
|
|
+ fetchTables();
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
const startOrder = async (tableId, tableNumber) => {
|
|
const startOrder = async (tableId, tableNumber) => {
|
|
@@ -68,8 +70,6 @@
|
|
|
return 'bg-green-600 hover:bg-green-700';
|
|
return 'bg-green-600 hover:bg-green-700';
|
|
|
case 'OCCUPIED':
|
|
case 'OCCUPIED':
|
|
|
return 'bg-yellow-500 hover:bg-yellow-600';
|
|
return 'bg-yellow-500 hover:bg-yellow-600';
|
|
|
- case 'ALERT':
|
|
|
|
|
- return 'bg-red-600 hover:bg-red-700';
|
|
|
|
|
default:
|
|
default:
|
|
|
return 'bg-gray-700 hover:bg-gray-800';
|
|
return 'bg-gray-700 hover:bg-gray-800';
|
|
|
}
|
|
}
|
|
@@ -81,8 +81,6 @@
|
|
|
return 'Livre';
|
|
return 'Livre';
|
|
|
case 'OCCUPIED':
|
|
case 'OCCUPIED':
|
|
|
return 'Ocupada';
|
|
return 'Ocupada';
|
|
|
- case 'ALERT':
|
|
|
|
|
- return 'Alerta';
|
|
|
|
|
default:
|
|
default:
|
|
|
return 'Desconhecido';
|
|
return 'Desconhecido';
|
|
|
}
|
|
}
|
|
@@ -142,7 +140,7 @@
|
|
|
console.error(error);
|
|
console.error(error);
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
-
|
|
|
|
|
|
|
+ let showLiberarMesa = {};
|
|
|
const fetchTables = async () => {
|
|
const fetchTables = async () => {
|
|
|
const requestOptions = {
|
|
const requestOptions = {
|
|
|
method: 'POST',
|
|
method: 'POST',
|
|
@@ -156,19 +154,67 @@
|
|
|
try {
|
|
try {
|
|
|
const response = await fetch('https://dev2.mixtech.dev.br/table/get', requestOptions);
|
|
const response = await fetch('https://dev2.mixtech.dev.br/table/get', requestOptions);
|
|
|
const result = await response.json();
|
|
const result = await response.json();
|
|
|
|
|
+
|
|
|
if (result.status === 'ok') {
|
|
if (result.status === 'ok') {
|
|
|
tables = result.data.map((d) => ({
|
|
tables = result.data.map((d) => ({
|
|
|
id: d.table_id,
|
|
id: d.table_id,
|
|
|
number: d.table_number,
|
|
number: d.table_number,
|
|
|
status: statusMap[d.status_id] || 'Desconhecido',
|
|
status: statusMap[d.status_id] || 'Desconhecido',
|
|
|
|
|
+ statusId: d.status_id,
|
|
|
startTime: statusMap[d.status_id] === 'FREE' ? null : new Date().toISOString()
|
|
startTime: statusMap[d.status_id] === 'FREE' ? null : new Date().toISOString()
|
|
|
}));
|
|
}));
|
|
|
|
|
+
|
|
|
|
|
+ // Inicializa orders, para evitar undefined
|
|
|
tables.forEach((t) => {
|
|
tables.forEach((t) => {
|
|
|
if (t.status !== 'FREE' && !orders[t.id]) {
|
|
if (t.status !== 'FREE' && !orders[t.id]) {
|
|
|
orders[t.id] = { items: [], totalAmount: 0 };
|
|
orders[t.id] = { items: [], totalAmount: 0 };
|
|
|
}
|
|
}
|
|
|
});
|
|
});
|
|
|
|
|
+
|
|
|
orders = { ...orders };
|
|
orders = { ...orders };
|
|
|
|
|
+
|
|
|
|
|
+ await Promise.all(
|
|
|
|
|
+ tables.map(async (t) => {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const orderResp = await fetch('https://dev2.mixtech.dev.br/order/get', {
|
|
|
|
|
+ method: 'POST',
|
|
|
|
|
+ headers: {
|
|
|
|
|
+ 'Content-Type': 'application/json',
|
|
|
|
|
+ Authorization: `Bearer ${token}`
|
|
|
|
|
+ },
|
|
|
|
|
+ body: JSON.stringify({
|
|
|
|
|
+ company_id: company,
|
|
|
|
|
+ table_id: t.id
|
|
|
|
|
+ })
|
|
|
|
|
+ });
|
|
|
|
|
+
|
|
|
|
|
+ const text = await orderResp.text();
|
|
|
|
|
+
|
|
|
|
|
+ // Se resposta vazia ou inválida, considerar sem pedidos
|
|
|
|
|
+ if (!text.trim()) {
|
|
|
|
|
+ showLiberarMesa[t.id] = t.statusId !== 1; // só liberar se status diferente de 1
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ let orderResult;
|
|
|
|
|
+ try {
|
|
|
|
|
+ orderResult = JSON.parse(text);
|
|
|
|
|
+ } catch {
|
|
|
|
|
+ showLiberarMesa[t.id] = t.statusId !== 1;
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // Lógica para mostrar botão liberar mesa:
|
|
|
|
|
+ // Mesa ocupada (statusId != 1) e sem pedidos (data vazio)
|
|
|
|
|
+ showLiberarMesa[t.id] =
|
|
|
|
|
+ t.statusId !== 1 && (orderResult.status !== 'ok' || orderResult.data.length === 0);
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('Erro ao checar pedidos da mesa', t.id, e);
|
|
|
|
|
+ showLiberarMesa[t.id] = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ showLiberarMesa = { ...showLiberarMesa };
|
|
|
|
|
+ })
|
|
|
|
|
+ );
|
|
|
} else {
|
|
} else {
|
|
|
console.error('Erro ao buscar mesas:', result.msg);
|
|
console.error('Erro ao buscar mesas:', result.msg);
|
|
|
}
|
|
}
|
|
@@ -176,7 +222,6 @@
|
|
|
console.error(error);
|
|
console.error(error);
|
|
|
}
|
|
}
|
|
|
};
|
|
};
|
|
|
-
|
|
|
|
|
const createTable = async () => {
|
|
const createTable = async () => {
|
|
|
if (!newTableNumber) return;
|
|
if (!newTableNumber) return;
|
|
|
|
|
|
|
@@ -236,7 +281,7 @@
|
|
|
{/if}
|
|
{/if}
|
|
|
|
|
|
|
|
<div class="grid grid-cols-2 gap-4 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5">
|
|
<div class="grid grid-cols-2 gap-4 sm:grid-cols-3 md:grid-cols-4 lg:grid-cols-5">
|
|
|
- {#each tables as table}
|
|
|
|
|
|
|
+ {#each tables as table, i}
|
|
|
{@const order = getTableOrder(table.id)}
|
|
{@const order = getTableOrder(table.id)}
|
|
|
|
|
|
|
|
<div
|
|
<div
|
|
@@ -250,7 +295,7 @@
|
|
|
<div class="p-4">
|
|
<div class="p-4">
|
|
|
{#if table.status !== 'FREE' && order}
|
|
{#if table.status !== 'FREE' && order}
|
|
|
<button
|
|
<button
|
|
|
- on:click={() => handleTableClick(table.id, table.number)}
|
|
|
|
|
|
|
+ on:click={() => handleTableClick(table.id, table.number, i)}
|
|
|
class="mt-2 flex w-full items-center justify-center rounded bg-indigo-600 px-3 py-2 text-sm transition-colors hover:bg-indigo-700"
|
|
class="mt-2 flex w-full items-center justify-center rounded bg-indigo-600 px-3 py-2 text-sm transition-colors hover:bg-indigo-700"
|
|
|
>
|
|
>
|
|
|
Detalhes Mesa
|
|
Detalhes Mesa
|
|
@@ -258,7 +303,7 @@
|
|
|
{:else}
|
|
{:else}
|
|
|
<div class="flex flex-col items-center justify-center space-y-2 py-4">
|
|
<div class="flex flex-col items-center justify-center space-y-2 py-4">
|
|
|
<button
|
|
<button
|
|
|
- on:click={() => handleTableClick(table.id, table.number)}
|
|
|
|
|
|
|
+ on:click={() => handleTableClick(table.id, table.number, i)}
|
|
|
class="flex items-center justify-center rounded bg-emerald-600 px-4 py-2 transition-colors hover:bg-emerald-700"
|
|
class="flex items-center justify-center rounded bg-emerald-600 px-4 py-2 transition-colors hover:bg-emerald-700"
|
|
|
>
|
|
>
|
|
|
Abrir Mesa
|
|
Abrir Mesa
|
|
@@ -273,6 +318,15 @@
|
|
|
{/if}
|
|
{/if}
|
|
|
</div>
|
|
</div>
|
|
|
{/if}
|
|
{/if}
|
|
|
|
|
+
|
|
|
|
|
+ {#if showLiberarMesa[table.id]}
|
|
|
|
|
+ <button
|
|
|
|
|
+ on:click={() => updateTableStatus(table.number, 'FREE')}
|
|
|
|
|
+ class="mt-2 flex w-full items-center justify-center rounded bg-emerald-600 px-3 py-2 text-sm transition-colors hover:bg-emerald-700"
|
|
|
|
|
+ >
|
|
|
|
|
+ Liberar Mesa
|
|
|
|
|
+ </button>
|
|
|
|
|
+ {/if}
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
{/each}
|
|
{/each}
|