Переглянути джерело

add the csv on report and add icon and add the note on addproduct

gdias 4 місяців тому
батько
коміт
cd2f653181

+ 58 - 3
src/lib/component/AddProducts.svelte

@@ -3,6 +3,7 @@
 	import { goto } from '$app/navigation';
 	import { page } from '$app/stores';
 	import { browser } from '$app/environment';
+	import save_icon from '$lib/assets/save_icon.svg';
 
 	import trash_icon from '$lib/assets/trash_white.svg';
 	import arrow_back from '$lib/assets/arrow_back.svg';
@@ -13,6 +14,9 @@
 	let company = null;
 	let orderId = null;
 	let tableIdNum = null;
+	let kitchenNote = '';
+	let showKitchenNoteModal = false;
+	let selectedProduct = [];
 
 	if (browser) {
 		token = localStorage.getItem('token');
@@ -88,12 +92,31 @@
 		: products;
 
 	function handleAddItem(product) {
+		if (product.product_is_kitchen) {
+			selectedProduct = product;
+			showKitchenNoteModal = true;
+			return;
+		}
+
+		addItemToOrder(product, null);
+	}
+
+	function confirmKitchenNote() {
+		addItemToOrder(selectedProduct, kitchenNote);
+		showKitchenNoteModal = false;
+		kitchenNote = '';
+		selectedProduct = null;
+	}
+
+	function addItemToOrder(product, note) {
 		const newItem = {
-			order_item_id: Date.now(), // Temporary ID for local use
+			order_item_id: Date.now(),
 			product_details: product,
-			quantity: 1
+			quantity: 1,
+			kitchen_note: note
 		};
-		localOrderItems = [...localOrderItems, newItem]; // Update localOrderItems
+
+		localOrderItems = [...localOrderItems, newItem];
 	}
 
 	function removeItemFromOrder(itemId) {
@@ -252,4 +275,36 @@
 			</div>
 		</div>
 	</div>
+	{#if showKitchenNoteModal}
+		<div class="fixed inset-0 z-50 flex items-center justify-center bg-black bg-opacity-50">
+			<div class="w-full max-w-md rounded-lg bg-gray-800 p-6 shadow-lg">
+				<h2 class="mb-4 text-lg font-semibold">Anotações para o produto</h2>
+				<form on:submit={confirmKitchenNote} class="space-y-4">
+					<div>
+						<p class="mb-1 block text-sm text-gray-400">Anotações</p>
+						<input
+							bind:value={kitchenNote}
+							placeholder="Detalhes do pedido"
+							class="w-full rounded-md border border-gray-600 bg-gray-700 px-3 py-2 focus:ring-emerald-500"
+						/>
+					</div>
+					<div class="flex space-x-2">
+						<button
+							type="button"
+							on:click={() => ((showKitchenNoteModal = false), (kitchenNote = ''))}
+							class="rounded-lg bg-gray-700 px-4 py-2 hover:bg-gray-600"
+						>
+							Cancelar
+						</button>
+						<button
+							type="submit"
+							class="flex items-center rounded-lg bg-emerald-600 px-4 py-2 hover:bg-emerald-700"
+						>
+							<img src={save_icon} alt="Salvar" class="mr-2 h-4 w-4" /> Salvar
+						</button>
+					</div>
+				</form>
+			</div>
+		</div>
+	{/if}
 </div>

+ 0 - 2
src/lib/component/Commands.svelte

@@ -60,7 +60,6 @@
 
 	const createOrder = async () => {
 		if (!customerName.trim()) return;
-		console.log(userId);
 		try {
 			const response = await fetch('https://dev2.mixtech.dev.br/order/create', {
 				method: 'POST',
@@ -116,7 +115,6 @@
 		fetchOrders();
 		setInterval(() => {
 			fetchOrders();
-			console.log('atualizou');
 		}, 5000);
 	});
 </script>

+ 0 - 1
src/lib/component/DashBoardGuard.svelte

@@ -10,7 +10,6 @@
 	}
 
 	onMount(async () => {
-		console.log(flag);
 		if (flag !== 'admin' && flag !== 'waiter' && flag !== 'kitchen' && flag !== 'cashier') {
 			goto('/login');
 		} else {

+ 0 - 32
src/lib/component/HistoricModal.svelte

@@ -1,32 +0,0 @@
-<script>
-  export let pedidoSelecionado;
-  import { createEventDispatcher } from 'svelte';
-  const dispatch = createEventDispatcher();
-
-  const fechar = () => dispatch('close');
-</script>
-
-<div class="fixed inset-0 bg-black bg-opacity-60 flex justify-center items-center z-50">
-  <div class="bg-white text-black p-6 rounded-md w-80">
-    <div class="flex justify-between items-center mb-4">
-      <h2 class="font-bold text-lg">Detalhes do Pedido</h2>
-      <button on:click={fechar} class="text-red-600">✖</button>
-    </div>
-
-    <p><strong>Mesa:</strong> {pedidoSelecionado.mesa}</p>
-    <p><strong>Status:</strong> {pedidoSelecionado.status}</p>
-
-    <div class="mt-4">
-      <strong>Itens:</strong>
-      <ul class="list-disc list-inside">
-        {#each pedidoSelecionado.itens as item}
-          <li>{item}</li>
-        {/each}
-      </ul>
-    </div>
-
-    <button class="mt-4 bg-blue-500 text-white px-3 py-1 rounded" on:click={fechar}>
-      Voltar para andamento
-    </button>
-  </div>
-</div>

+ 0 - 34
src/lib/component/Kitchen.svelte

@@ -1,34 +0,0 @@
-<script>
-  import OrderCard from '$lib/component/OrderCard.svelte';
-  import HistoricModal from '$lib/component/HistoricModal.svelte';
-
-  let pedidos = [
-    { mesa: '01', itens: ['Coca', 'X-Burguer'], status: 'pendente' },
-    { mesa: '02', itens: ['Água', 'Batata'], status: 'pendente' }
-  ];
-
-  let mostrarHistorico = false;
-  let pedidoSelecionado = null;
-
-  const abrirHistorico = (pedido) => {
-    pedidoSelecionado = pedido;
-    mostrarHistorico = true;
-  };
-
-  const fecharHistorico = () => {
-    mostrarHistorico = false;
-  };
-</script>
-
-<main class="p-4 bg-gray-800 min-h-screen text-white">
-  
-  <div class="mt-4 space-y-4">
-    {#each pedidos as pedido}
-      <OrderCard {pedido} on:verHistorico={() => abrirHistorico(pedido)} />
-    {/each}
-  </div>
-
-  {#if mostrarHistorico}
-    <HistoricModal {pedidoSelecionado} on:close={fecharHistorico} />
-  {/if}
-</main>

+ 0 - 1
src/lib/component/Mananger.svelte

@@ -125,7 +125,6 @@
 		})
 			.then((response) => response.json())
 			.then((data) => {
-				console.log(data);
 				users = data.data.map((item) => ({
 					id: item.user_id,
 					name: item.user_name,

+ 24 - 15
src/lib/component/Menu.svelte

@@ -2,6 +2,7 @@
 	import Header from '$lib/layout/Header.svelte';
 	import { onMount } from 'svelte';
 	import { browser } from '$app/environment';
+	import { logo_id } from '$lib/utils/store';
 
 	let categoriaSelecionada = null;
 	let cardapio = [];
@@ -19,22 +20,28 @@
 		categoriaSelecionada = categoriaSelecionada === categoria ? null : categoria;
 	}
 
-	
-
 	onMount(() => {
 		const params = new URLSearchParams(window.location.search);
-		const id = params.get('id'); 
-			
+		const id = params.get('id');
+
+		switch (id) {
+			case '1':
+				logo_id.set(
+					'https://i.postimg.cc/bNNBcTZj/Whats-App-Image-2025-07-29-at-19-59-16-removebg-preview.png'
+				);
+				break;
+		}
+
 		if (id) {
-		  fetch(`https://dev2.mixtech.dev.br/menu/get/${id}`)
-		    .then(res => res.json())
-		    .then(data => {
-		      console.log(data.data);
-			  cardapio = data.data 
-			})
-			.catch(err => console.error("Erro ao buscar o cardapio:', err"));
+			fetch(`https://dev2.mixtech.dev.br/menu/get/${id}`)
+				.then((res) => res.json())
+				.then((data) => {
+					console.log(data.data);
+					cardapio = data.data;
+				})
+				.catch((err) => console.error("Erro ao buscar o cardapio:', err"));
 		} else {
-		  console.log('ID não encontrado na URL');
+			console.log('ID não encontrado na URL');
 		}
 	});
 </script>
@@ -44,7 +51,9 @@
 	{#each cardapio as secao}
 		<button
 			class="rounded-lg px-4 py-2 text-sm font-semibold transition-colors duration-200
-			{categoriaSelecionada === secao.categoria ? 'text-white bg-violet-700' : 'bg-gray-600 text-gray-100'}"
+			{categoriaSelecionada === secao.categoria
+				? 'bg-violet-700 text-white'
+				: 'bg-gray-600 text-gray-100'}"
 			on:click={() => filtrarCategoria(secao.categoria)}
 		>
 			{secao.categoria}
@@ -54,7 +63,7 @@
 
 <main class="flex min-h-screen bg-gray-800">
 	<div class="flex flex-1 items-start justify-center bg-gray-700 pt-5">
-		<div class="h- w-full max-w-370 rounded-2xl bg-gray-800 p-8 shadow-lg">
+		<div class="h- max-w-370 w-full rounded-2xl bg-gray-800 p-8 shadow-lg">
 			<h1 class="mb-8 text-center text-3xl font-bold text-gray-200">Cardápio</h1>
 
 			{#each cardapio.filter((secao) => !categoriaSelecionada || secao.categoria === categoriaSelecionada) as secao}
@@ -67,7 +76,7 @@
 									<span class="block font-medium text-gray-200">{item.nome}</span>
 									<p class="mt-1 text-sm text-gray-400">{item.descricao}</p>
 								</div>
-								<span class="ml-4 text-sm whitespace-nowrap text-gray-300">{item.preco}</span>
+								<span class="ml-4 whitespace-nowrap text-sm text-gray-300">{item.preco}</span>
 							</div>
 						</div>
 					{/each}

+ 0 - 37
src/lib/component/OrderCard.svelte

@@ -1,37 +0,0 @@
-<script>
-  export let pedido;
-  import { createEventDispatcher } from 'svelte';
-
-  const dispatch = createEventDispatcher();
-
-  function marcarComoPronto() {
-    pedido.status = 'pronto';
-  }
-
-  function verHistorico() {
-    dispatch('verHistorico');
-  }
-</script>
-
-<div class="bg-gray-700 p-4 rounded-md shadow-md">
-  <div class="flex justify-between mb-2">
-    <div class="font-semibold">Mesa {pedido.mesa}</div>
-    <button class="text-sm underline" on:click={verHistorico}>Ver histórico</button>
-  </div>
-
-  <div class="mb-2">
-    <strong>Itens:</strong>
-    <ul class="list-disc list-inside">
-      {#each pedido.itens as item}
-        <li>{item}</li>
-      {/each}
-    </ul>
-  </div>
-
-  <button
-    class="bg-green-600 px-3 py-1 rounded text-sm hover:bg-green-500"
-    on:click={marcarComoPronto}
-  >
-    Pedido pronto
-  </button>
-</div>

+ 1 - 11
src/lib/component/Product.svelte

@@ -52,12 +52,7 @@
 	function handleProductSubmit(event) {
 		event.preventDefault();
 
-		if (
-			!productFormData.name ||
-			!productFormData.category ||
-			productFormData.price <= 0 ||
-			!productFormData.description
-		) {
+		if (!productFormData.name || !productFormData.category || productFormData.price <= 0) {
 			console.error('Preencha todos os campos corretamente');
 			return;
 		}
@@ -150,7 +145,6 @@
 		isAddingProduct = true;
 	}
 
-	// Função para enviar update para o backend
 	async function handleUpdateProduct(event) {
 		event.preventDefault();
 
@@ -161,10 +155,6 @@
 		myHeaders.append('Authorization', `Bearer ${token}`);
 		myHeaders.append('Content-Type', 'application/json');
 
-		// Aqui você precisa converter o category (nome) para id, se necessário
-		// Vou supor que você já tem essa informação disponível, por exemplo:
-		// const category_id = getCategoryIdByName(productFormData.category);
-
 		const raw = JSON.stringify({
 			update_product_id: editingProductId,
 			product_name: productFormData.name,

+ 33 - 13
src/lib/component/Report.svelte

@@ -9,11 +9,11 @@
 	let sortBy = 'date';
 	let sortDirection = 'desc';
 	let selectedSale = null;
-	let isDayClosingModalOpen = false;
 
 	let token = null;
 	let company = null;
 	let orderId = null;
+	let csvDownload = [];
 
 	if (browser) {
 		token = localStorage.getItem('token');
@@ -40,6 +40,8 @@
 		try {
 			const response = await fetch('https://dev2.mixtech.dev.br/order_item/get', requestOptions);
 			const result = await response.json();
+			csvDownload = result;
+			console.log(result);
 
 			if (result.status === 'ok' && result.data) {
 				// Agrupar itens por order_id e transformar em formato de sales
@@ -73,6 +75,35 @@
 		}
 	});
 
+	function exportarCSV() {
+		if (!csvDownload.length) return;
+
+		const headers = ['order_item_id', 'product_name', 'product_price', 'product_is_kitchen'];
+
+		const linhas = [
+			headers.join(','),
+			...csvDownload.map((pedido) => {
+				const produto = pedido.product_details;
+				return [
+					pedido.order_item_id,
+					JSON.stringify(produto.product_name ?? ''),
+					produto.product_price,
+					produto.product_is_kitchen
+				].join(',');
+			})
+		];
+
+		const csvContent = linhas.join('\n');
+
+		const blob = new Blob([csvContent], { type: 'text/csv;charset=utf-8;' });
+		const url = URL.createObjectURL(blob);
+		const link = document.createElement('a');
+		link.href = url;
+		link.setAttribute('download', 'csvDownload.csv');
+		link.click();
+		URL.revokeObjectURL(url);
+	}
+
 	function formatDate(dateStr) {
 		const date = new Date(dateStr);
 		return `${date.toLocaleDateString()} ${date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' })}`;
@@ -180,11 +211,6 @@
 			selectedSale = null;
 		}
 	}
-
-	function handleClosingDay() {
-		console.log('Fechamento do dia concluído.');
-		isDayClosingModalOpen = false;
-	}
 </script>
 
 <div class="flex w-full flex-col rounded-md bg-stone-800 p-4">
@@ -193,16 +219,10 @@
 		<div class="mb-6 flex flex-col justify-between md:flex-row md:items-center">
 			<h1 class="mb-4 text-2xl font-bold md:mb-0">Relatório de Vendas</h1>
 			<div class="flex w-full flex-col gap-2 sm:flex-row sm:justify-end md:w-auto">
-				<button
-					on:click={() => (isDayClosingModalOpen = true)}
-					class="flex w-full items-center justify-center rounded-lg bg-[#D4AF37] px-4 py-2 text-[#1C1C1E] transition-colors hover:bg-[#D4AF37]/90 sm:w-auto"
-				>
-					Fechamento do Dia
-				</button>
 				<button
 					on:click={exportToCSV}
 					disabled={filteredSales.length === 0}
-					class="flex w-full items-center justify-center rounded-lg bg-[#2C2C2E] px-4 py-2 transition-colors hover:bg-[#3C3C3E] disabled:cursor-not-allowed disabled:opacity-50 sm:w-auto"
+					class=" flex w-full items-center justify-center rounded-lg bg-[#D4AF37] px-4 py-2 text-[#1C1C1E] transition-colors hover:bg-[#3C3C3E] disabled:cursor-not-allowed sm:w-auto"
 				>
 					Exportar CSV
 				</button>

+ 11 - 11
src/lib/layout/Header.svelte

@@ -1,16 +1,16 @@
 <script>
-
+	import { logo_id } from '$lib/utils/store';
 </script>
 
-<div class="flex justify-between items-center p-6 bg-gray-900 w-full">
-  <!-- Esquerda: Logo -->
-  <p class="text-lg font-bold text-white">Logo</p>   
+<div class="flex w-full items-center justify-between bg-gray-900 p-6">
+	<!-- Esquerda: Logo -->
+	<img class="w-16" src={$logo_id} alt="" />
 
-  <!-- Centro: Titulo--> 
-  <div class="absolute left-1/2 transform -translate-x-1/2">
-    <p class="text-2xl font-bold text-white">BardoDu</p>
-  </div>
+	<!-- Centro: Titulo-->
+	<div class="absolute left-1/2 -translate-x-1/2 transform">
+		<p class="text-2xl font-bold text-white">BardoDu</p>
+	</div>
 
-  <!-- Direita: --> 
-  <p class="text-sm text-gray-300 hover:text-white transition">Contato</p>
-</div>
+	<!-- Direita: -->
+	<!--<p class="text-sm text-gray-300 transition hover:text-white">Contato</p>-->
+</div>

+ 3 - 3
src/lib/layout/SideBar.svelte

@@ -24,16 +24,16 @@
 				{ name: 'Mesas', path: '/dashboard/tables', icon: 'table_bar' },
 				{ name: 'Produtos', path: '/dashboard/products', icon: 'product_sell' },
 				{ name: 'Relatórios', path: '/dashboard/reports', icon: 'report_icon' },
-				{ name: 'Cozinha', path: '/dashboard/kitchen', icon: 'kitchen_icon' },
+				{ name: 'Cozinha', path: '/dashboard/cozinha', icon: 'kitchen_icon' },
 				{ name: 'Gerenciar Usuários', path: '/dashboard/mananger', icon: 'mananger' }
 			];
 		} else if (flag == 'kitchen') {
-			navItems = [{ name: 'Cozinha', path: '/dashboard/kitchen', icon: 'kitchen_icon' }];
+			navItems = [{ name: 'Cozinha', path: '/dashboard/cozinha', icon: 'kitchen_icon' }];
 		} else if (flag == 'cashier') {
 			navItems = [
 				{ name: 'Mesas', path: '/dashboard/tables', icon: 'table_bar' },
 				{ name: 'Relatórios', path: '/dashboard/reports', icon: 'report_icon' },
-				{ name: 'Cozinha', path: '/dashboard/kitchen', icon: 'kitchen_icon' }
+				{ name: 'Cozinha', path: '/dashboard/cozinha', icon: 'kitchen_icon' }
 			];
 		}
 	});

+ 1 - 0
src/lib/utils/store.js

@@ -1,3 +1,4 @@
 import { writable } from 'svelte/store';
 
 export const userFlag = writable('');
+export const logo_id = writable('');

+ 0 - 11
src/routes/dashboard/Kitchen/+page.svelte

@@ -1,11 +0,0 @@
-<script>
-  import SideBar from '$lib/layout/SideBar.svelte';
-  import Kitchen from '$lib/component/Kitchen.svelte';
-  import DashBoardGuard from '$lib/component/DashBoardGuard.svelte';
-</script>
-
-<DashBoardGuard>
-  <SideBar>
-    <Kitchen />
-  </SideBar>
-</DashBoardGuard>

+ 0 - 11
src/routes/dashboard/kitchen/+page.svelte

@@ -1,11 +0,0 @@
-<script>
-  import SideBar from '$lib/layout/SideBar.svelte';
-  import Kitchen from '$lib/component/Kitchen.svelte';
-  import DashBoardGuard from '$lib/component/DashBoardGuard.svelte';
-</script>
-
-<DashBoardGuard>
-  <SideBar>
-    <Kitchen />
-  </SideBar>
-</DashBoardGuard>

+ 0 - 1
src/routes/login/+page.svelte

@@ -51,7 +51,6 @@
 			localStorage.setItem('token', token);
 			localStorage.setItem('company', company);
 			localStorage.setItem('user', username);
-			console.log(data);
 			if (data.status === 'ok') {
 				const id = data.data.role_id;
 				switch (id) {

Різницю між файлами не показано, бо вона завелика
+ 3 - 1
static/favicon.svg


Деякі файли не було показано, через те що забагато файлів було змінено