"use client"; import React, { useState, useEffect } from "react"; import { Product } from "../lib/data/products"; import { useCartStore } from "../lib/store/cartStore"; import { useUserStore } from "../lib/store/userStore"; import { productService } from "../lib/services/productService"; import { motion, AnimatePresence } from "motion/react"; import { Building2, ShoppingCart, Search, ChevronRight, FileText, Package, CheckCircle2, Lock, Percent, X, Download } from "lucide-react"; import SafeImage from "./SafeImage"; import { toPersian } from "../lib/utils"; interface QuickOrderItem { product: Product; quantity: number; } export default function B2BPortal({ onClose }: { onClose: () => void }) { const [products, setProducts] = useState([]); const [quantities, setQuantities] = useState>({}); const [searchQuery, setSearchQuery] = useState(""); const { addItem } = useCartStore(); const { role } = useUserStore(); const [showSuccess, setShowSuccess] = useState(false); const isWholesaleVerified = (role as string) === "User_Wholesale" || (role as string) === "ADMIN" || (role as string) === "User_Partner"; useEffect(() => { productService.getProducts({ limit: 999 }).then(res => setProducts(res.data)); }, []); const filteredProducts = products.filter(p => p.name.toLowerCase().includes(searchQuery.toLowerCase()) || p.artNo.includes(searchQuery) ); const handleQuantityChange = (id: string, val: string) => { const num = parseInt(val) || 0; setQuantities(prev => ({ ...prev, [id]: Math.max(0, num) })); }; const handleAddAll = () => { Object.entries(quantities).forEach(([id, qty]) => { const numQty = qty as number; if (numQty > 0) { const product = products.find(p => p.id === id); if (product) { addItem(product, numQty); } } }); setShowSuccess(true); setTimeout(() => setShowSuccess(false), 3000); }; const totalItems = Object.values(quantities).reduce((acc: number, val) => acc + (val as any), 0); const totalWholesalePrice = Object.entries(quantities).reduce((sum, [id, qty]) => { const numQty = qty as number; const prod = products.find(p => p.id === id); if (prod && numQty > 0) { const basePrice = prod.priceValue || 0; const wholesalePrice = basePrice * 0.7; // 30% discount for wholesale return sum + (wholesalePrice * numQty); } return sum; }, 0); const exportToCSV = () => { const headers = ["کد کالا", "نام محصول", "دسته‌بندی", "قیمت تک‌فروشی (تومان)", "قیمت عمده (تومان)"]; const rows = products.map(p => { const base = p.priceValue || 0; const wholesale = Math.round(base * 0.7); return [`"${p.artNo}"`, `"${p.name}"`, `"${p.category}"`, base, wholesale]; }); const csvContent = "\uFEFF" + [headers.join(","), ...rows.map(e => e.join(","))].join("\n"); const blob = new Blob([csvContent], { type: "text/csv;charset=utf-8;" }); const url = URL.createObjectURL(blob); const link = document.createElement("a"); link.setAttribute("href", url); link.setAttribute("download", `Canina_B2B_PriceList_${new Date().toISOString().slice(0, 10)}.csv`); document.body.appendChild(link); link.click(); document.body.removeChild(link); }; return ( {/* Sidebar Info */}

پنل کلینیک‌ها
و داروخانه‌ها

این بخش اختصاصی برای ثبت سفارشات حجیم و استعلام موجودی آنی طراحی شده است. قیمت‌های نمایش داده شده، فی واحد کاتالوگ هستند.

پیگیری محمولات قبلی
{/* Main Grid Area */}
{/* Header & Search */}
setSearchQuery(e.target.value)} className="w-full bg-medical-gray-50 border border-medical-gray-200 rounded-2xl py-3 pr-11 pl-4 text-sm focus:outline-none focus:ring-2 focus:ring-canina-blue/20" />
{/* Table */}
{filteredProducts.map(product => { const basePrice = product.priceValue || 0; const wholesalePrice = basePrice * 0.7; // 30% discount return ( ); })}
تصویر نام و کد کالا قیمت تک‌فروشی قیمت عمده (همکار) تعداد سفارش
{product.name}
شناسه کالا: {product.artNo}
{toPersian(basePrice.toLocaleString())} تومان {isWholesaleVerified ? ( {toPersian(wholesalePrice.toLocaleString())} تومان ) : ( نیازمند تایید ادمین )} handleQuantityChange(product.id, e.target.value)} placeholder="0" className="w-20 bg-medical-gray-50 border border-medical-gray-200 rounded-xl py-2 px-3 text-center font-mono font-bold focus:ring-2 focus:ring-canina-blue/20 outline-none" />
{showSuccess && ( سفارشات با موفقیت به سبد خرید اضافه شدند. )}
); }