import React, { useState } from 'react'; import { useTranslation } from 'react-i18next'; import { productSheetService } from '../../services/api'; import useFormatters from '../../hooks/useFormatters'; import ProductSheetModal from './ProductSheetModal'; import ConfirmModal from '../ConfirmModal'; const ProductSheetsTab = ({ sheets, settings, onCreated, onUpdated, onDeleted }) => { const { t } = useTranslation(); const { currency } = useFormatters(); const [showModal, setShowModal] = useState(false); const [editingSheet, setEditingSheet] = useState(null); const [deleting, setDeleting] = useState(null); const [filter, setFilter] = useState({ category: '', active: 'all' }); const [confirmModal, setConfirmModal] = useState({ show: false, sheet: null }); const handleCreate = () => { setEditingSheet(null); setShowModal(true); }; const handleEdit = (sheet) => { setEditingSheet(sheet); setShowModal(true); }; const handleDuplicate = async (sheet) => { try { const duplicated = await productSheetService.duplicate(sheet.id); onCreated(duplicated); } catch (err) { alert(err.response?.data?.message || t('common.error')); } }; const handleDelete = async (sheet) => { setConfirmModal({ show: true, sheet }); }; const executeDelete = async () => { const sheet = confirmModal.sheet; setConfirmModal({ show: false, sheet: null }); setDeleting(sheet.id); try { await productSheetService.delete(sheet.id); onDeleted(sheet.id); } catch (err) { alert(err.response?.data?.message || t('common.error')); } finally { setDeleting(null); } }; const handleSave = (savedSheet) => { if (editingSheet) { onUpdated(savedSheet); } else { onCreated(savedSheet); } setShowModal(false); }; // Filtrar fichas const filteredSheets = sheets.filter(sheet => { if (filter.category && sheet.category !== filter.category) return false; if (filter.active === 'active' && !sheet.is_active) return false; if (filter.active === 'inactive' && sheet.is_active) return false; return true; }); // Categorias únicas const categories = [...new Set(sheets.map(s => s.category).filter(Boolean))]; return ( <> {/* Header */}
{t('business.products.title')}

{t('business.products.description')}

{/* Filtros */} {sheets.length > 0 && (
)} {/* Empty State */} {sheets.length === 0 ? (
{t('business.products.empty')}

{t('business.products.emptyDescription')}

) : filteredSheets.length === 0 ? (

{t('business.products.noResults')}

) : ( /* Products Grid */
{filteredSheets.map(sheet => (
{sheet.name} {!sheet.is_active && ( {t('common.inactive')} )}
{sheet.sku && {t('business.common.skuLabel')}: {sheet.sku}} {sheet.category && ( {sheet.category} )}

{/* CMV e Preço de Venda */}
{t('business.common.cmvLabel')} {currency(sheet.cmv_total, sheet.currency)}
{t('business.products.salePrice')} {sheet.sale_price ? currency(sheet.sale_price, sheet.currency) : '-'}
{/* Final Price (if strategic pricing applied) */} {sheet.final_price && parseFloat(sheet.final_price) !== parseFloat(sheet.sale_price) && (
{t('business.products.finalPrice')} {currency(sheet.final_price, sheet.currency)}
)}
{/* Margem de Contribuição */} {sheet.contribution_margin !== null && (
{t('business.products.contributionMargin')} {currency(sheet.contribution_margin, sheet.currency)} ({sheet.contribution_margin_percent}%) {sheet.real_margin_percent && parseFloat(sheet.real_margin_percent) !== parseFloat(sheet.contribution_margin_percent) && ( → {parseFloat(sheet.real_margin_percent).toFixed(1)}% )}
)} {/* Competitor Comparison */} {sheet.competitor_comparison && (
{t('business.products.competitorComparison')} {currency(sheet.competitor_comparison.our_price, sheet.currency)} ({sheet.competitor_comparison.percent_difference > 0 ? '+' : ''}{sheet.competitor_comparison.percent_difference.toFixed(1)}%)
)} {/* Strategic Badges */} {(sheet.price_strategy !== 'neutral' || sheet.psychological_rounding || sheet.target_margin_percent) && (
{sheet.price_strategy === 'aggressive' && ( {t('business.products.strategyAggressiveLabel')} )} {sheet.price_strategy === 'premium' && ( {t('business.products.strategyPremiumLabel')} )} {sheet.psychological_rounding && ( {t('business.products.psychologicalBadge')} )} {sheet.target_margin_percent && ( {sheet.target_margin_percent}% )}
)} {/* Itens/Componentes */} {sheet.items && sheet.items.length > 0 && (
{t('business.products.components')} ({sheet.items.length})
{sheet.items.map(item => (
{item.name} {currency(item.unit_cost, sheet.currency)}
))}
)} {/* Configuração usada */} {sheet.business_setting && (
{sheet.business_setting.name} {sheet.markup_used && ( ({t('business.common.markupLabel')}: {parseFloat(sheet.markup_used).toFixed(2)}) )}
)}
))}
)} {/* Modal */} {showModal && ( setShowModal(false)} /> )} {/* Confirm Modal */} setConfirmModal({ show: false, sheet: null })} /> ); }; export default ProductSheetsTab;