Refactor product pricing: catalog owns base price, pricing manager owns rules

This commit is contained in:
2026-02-21 19:52:25 -03:00
parent 841cc961b5
commit 6d1eb908a0
17 changed files with 90 additions and 26 deletions

View File

@@ -10,6 +10,7 @@ interface AdEditorModalProps {
onClose: () => void;
onConfirm: (listingId: number, price: number, description: string) => void;
clientId: number | null; // El aviso se vinculará a este cliente
productId: number; // Necesario para el precio base
}
interface PricingResult {
@@ -18,7 +19,7 @@ interface PricingResult {
details: string;
}
export default function AdEditorModal({ isOpen, onClose, onConfirm, clientId }: AdEditorModalProps) {
export default function AdEditorModal({ isOpen, onClose, onConfirm, clientId, productId }: AdEditorModalProps) {
const [flatCategories, setFlatCategories] = useState<FlatCategory[]>([]);
const [operations, setOperations] = useState<any[]>([]);
const [loading, setLoading] = useState(false);
@@ -72,6 +73,7 @@ export default function AdEditorModal({ isOpen, onClose, onConfirm, clientId }:
try {
const res = await api.post('/pricing/calculate', {
categoryId: parseInt(categoryId),
productId: productId,
text: debouncedText,
days: days,
isBold: styles.isBold,

View File

@@ -240,6 +240,7 @@ export default function FastEntryPage() {
try {
const res = await api.post('/pricing/calculate', {
categoryId: parseInt(formData.categoryId),
productId: 0, // En FastEntry no hay producto aún
text: debouncedText || "",
days: formData.days,
isBold: options.isBold,

View File

@@ -310,6 +310,7 @@ export default function UniversalPosPage() {
onClose={() => setShowAdEditor(false)}
onConfirm={handleAdConfirmed}
clientId={clientId || 1005}
productId={selectedAdProduct?.id || 0}
/>
)}

View File

@@ -2,6 +2,7 @@ export interface Product {
id: number;
companyId: number;
productTypeId: number; // 1:Classified, 2:Graphic, 3:Radio, 4:Physical, 5:Service, 6:Bundle
categoryId?: number; // Para relacionarlo a un rubro
name: string;
description?: string;
sku?: string;