import React, { useState, useRef, useEffect } from "react"; import jsQR from "jsqr"; import { getImageUrl } from "../helpers/itemHelper"; import { getCafe, saveCafeDetails, setConfirmationStatus, } from "../helpers/cafeHelpers"; import { getMaterials, createMaterial, deleteMaterial, } from "../helpers/materialHelpers"; import { createMaterialMutation, getMaterialMutations, } from "../helpers/materialMutationHelpers"; import Switch from "react-switch"; // Import the Switch component import Carousel from '../components/Carousel' import styles from './MaterialList.module.css'; // Import the CSS Module const SetPaymentQr = ({ cafeId }) => { // All your state and logic goes here (unchanged) const [materials, setMaterials] = useState([]); const [mutations, setMutations] = useState([]); const [newMaterialName, setNewMaterialName] = useState(""); const [newMaterialUnit, setNewMaterialUnit] = useState("kilogram"); const [newMaterialImage, setNewMaterialImage] = useState(null); const [deleting, setDeleting] = useState(null); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [showForm, setShowForm] = useState(false); const [selectedMaterialIndex, setSelectedMaterialIndex] = useState(-1); const [latestMutation, setLatestMutation] = useState([]); const [currentQuantity, setCurrentQuantity] = useState(-1); const [currentPrice, setCurrentPrice] = useState(0); const [newPrice, setNewPrice] = useState(0); const [quantityChange, setQuantityChange] = useState(0); const [sortOrder, setSortOrder] = useState("desc"); const [isEditCurrentPrice, setIsEditCurrentPrice] = useState(false); const [isViewingHistory, setIsViewingHistory] = useState(false); const convertToInteger = (formattedValue) => { // Remove dots and convert to integer return parseInt(formattedValue.replace(/\./g, ""), 10); }; const formatCurrency = (value) => { if (!value) return ""; // Remove existing formatting (dots) and format again const numericValue = value.toString().replace(/\D/g, ""); // Keep only digits return numericValue.replace(/\B(?=(\d{3})+(?!\d))/g, "."); // Add dot as thousands separator }; const handleChange = (e) => { const formattedValue = formatCurrency(e.target.value); setNewPrice(formattedValue); }; useEffect(() => { const fetchMaterials = async () => { try { const data = await getMaterials(cafeId); setMaterials(data); console.log(data) setError(null); if (data.length > 0) { setSelectedMaterialIndex(0); } } catch (error) { console.error("Error fetching materials:", error); setError("Failed to fetch materials."); } }; const fetchMutations = async () => { try { const data = await getMaterialMutations(cafeId); setMutations(data); } catch (err) { setError(err.message); } finally { setLoading(false); } }; fetchMaterials(); fetchMutations(); }, [cafeId]); const filteredMutations = mutations.filter((mutation) => mutation.materialId === materials[selectedMaterialIndex]?.materialId) || []; const sortedMutations = filteredMutations .filter((mutation) => mutation.materialId === materials[selectedMaterialIndex].materialId) .sort((a, b) => { if (sortOrder === "asc") { return new Date(a.createdAt) - new Date(b.createdAt); } else { return new Date(b.createdAt) - new Date(a.createdAt); } }); const handleCreateMaterial = async (e) => { e.preventDefault(); setLoading(true); const formData = new FormData(); formData.append("name", newMaterialName); formData.append("unit", newMaterialUnit); if (newMaterialImage) { formData.append("image", newMaterialImage); } try { await createMaterial(cafeId, formData); setNewMaterialName(""); setNewMaterialUnit("kilogram"); setNewMaterialImage(null); setShowForm(false); const data = await getMaterials(cafeId); setMaterials(data); setError(null); if (data.length > 0) { setSelectedMaterialIndex(0); } } catch (error) { console.error("Error creating material:", error); setError("Failed to create material."); } finally { setLoading(false); } }; const handleDeleteMaterial = async (materialId) => { setDeleting(materialId); try { await deleteMaterial(materialId); const updatedMaterials = materials.filter( (material) => material.materialId !== materialId ); setMaterials(updatedMaterials); setError(null); if (selectedMaterialIndex === materialId) { setSelectedMaterialIndex( updatedMaterials.length > 0 ? updatedMaterials[0].materialId : null ); } } catch (error) { console.error("Error deleting material:", error); setError("Failed to delete material."); } finally { setDeleting(null); } }; const handleQuantityChange = (change) => { setQuantityChange((prev) => prev + change); if (quantityChange + change < 1) setNewPrice(currentPrice); setIsEditCurrentPrice(false); }; useEffect(() => { setQuantityChange(0); if (materials.length > 0 || selectedMaterialIndex > -1) { const materialMutations = mutations.filter( (mutation) => mutation.materialId === materials[selectedMaterialIndex]?.materialId ); console.log(materialMutations) if (materialMutations.length > 0) { const latestMutation = materialMutations.reduce( (latest, current) => new Date(current.createdAt) > new Date(latest.createdAt) ? current : latest, materialMutations[0] ); setLatestMutation(latestMutation); setCurrentQuantity(latestMutation.newStock); setCurrentPrice(formatCurrency(latestMutation.priceAtp)); setNewPrice(formatCurrency(latestMutation.priceAtp)); } else { setCurrentQuantity(0); // Default value if no mutations exist setLatestMutation({ newStock: 0 }); setCurrentPrice(0); setNewPrice(0); } } setIsViewingHistory(false); }, [materials, mutations, selectedMaterialIndex]); const handleUpdateStock = async () => { setLoading(true); try { const newprice = convertToInteger(newPrice) const newStock = currentQuantity + quantityChange; const formData = new FormData(); formData.append("newStock", newStock); formData.append("priceAtp", newprice); formData.append("reason", "Stock update"); await createMaterialMutation(materials[selectedMaterialIndex].materialId, formData); setQuantityChange(0); const updatedMutations = await getMaterialMutations(cafeId); setMutations(updatedMutations); setCurrentQuantity(newStock); setError(null); } catch (error) { console.error("Error updating stock:", error); setError("Failed to update stock."); } finally { setLoading(false); } }; const currentMaterial = materials.find( (material) => material.materialId === selectedMaterialIndex ); const formatDate = (timestamp) => { const date = new Date(timestamp); return date.toLocaleString(); }; return (
{loading ? ( <> ) : ( <>

Bahan baku

setSelectedMaterialIndex(e)} selectedIndex={selectedMaterialIndex} /> {selectedMaterialIndex !== -1 ? ( <>

Stok sekarang {currentQuantity}

{currentQuantity + quantityChange}

harga per {materials && materials[selectedMaterialIndex]?.unit} sekarang

quantityChange < 1 ? null : setIsEditCurrentPrice(!isEditCurrentPrice)} className={quantityChange < 1 ? styles.changeButtonDisabled : styles.changeButtonEnabled}> {isEditCurrentPrice ? 'Terapkan' : 'Ganti'}

setIsViewingHistory(!isViewingHistory)}> {isViewingHistory ? '˅' : '˃'} Riwayat stok

{selectedMaterialIndex !== -1 && isViewingHistory && !loading && ( <>
setSortOrder(sortOrder == 'asc' ? 'desc' : 'asc')}> Urutkan: {sortOrder === 'asc' ? "terlama" : "terbaru"}
<>
{sortedMutations.length > 0 ? ( sortedMutations.map((mutation) => (

{formatDate(mutation.createdAt)}

Total stok: {mutation.newStock} || +{mutation.newStock - mutation.oldStock} || {formatCurrency((mutation.newStock - mutation.oldStock) * mutation.priceAtp)}

)) ) : (

Tidak ada laporan perubahan stok.

)}
)}
) : ( <>
Fitur ini mempermudah mengelola biaya dan memantau pengeluaran bahan.

Buat bahan baru

setNewMaterialName(event.target.value)} placeholder="Masukkan nama barang" style={{width: '100%', height: '31px'}} />
)} )}
); }; export default SetPaymentQr;