Fix Purchase Order modal and reorganize documentation

Frontend Changes:
- Fix runtime error: Remove undefined handleModify reference from ActionQueueCard in DashboardPage
- Migrate PurchaseOrderDetailsModal to use correct PurchaseOrderItem type from purchase_orders service
- Fix item display: Parse unit_price as string (Decimal) instead of number
- Use correct field names: item_notes instead of notes
- Remove deprecated PurchaseOrder types from suppliers.ts to prevent type conflicts
- Update CreatePurchaseOrderModal to use unified types
- Clean up API exports: Remove old PO hooks re-exported from suppliers
- Add comprehensive translations for PO modal (en, es, eu)

Documentation Reorganization:
- Move WhatsApp implementation docs to docs/03-features/notifications/whatsapp/
- Move forecast validation docs to docs/03-features/forecasting/
- Move specification docs to docs/03-features/specifications/
- Move deployment docs (Colima, K8s, VPS sizing) to docs/05-deployment/
- Archive completed implementation summaries to docs/archive/implementation-summaries/
- Delete obsolete FRONTEND_CHANGES_NEEDED.md
- Standardize filenames to lowercase with hyphens

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Urtzi Alfaro
2025-11-18 11:59:23 +01:00
parent 5c45164c8e
commit 3c3d3ce042
32 changed files with 654 additions and 874 deletions

View File

@@ -2,11 +2,12 @@ import React, { useState, useEffect, useMemo } from 'react';
import { Plus, Package, Calendar, Building2 } from 'lucide-react';
import { AddModal } from '../../ui/AddModal/AddModal';
import { useSuppliers } from '../../../api/hooks/suppliers';
import { useCreatePurchaseOrder } from '../../../api/hooks/suppliers';
import { useCreatePurchaseOrder } from '../../../api/hooks/purchase-orders';
import { useIngredients } from '../../../api/hooks/inventory';
import { useTenantStore } from '../../../stores/tenant.store';
import { suppliersService } from '../../../api/services/suppliers';
import type { ProcurementRequirementResponse, PurchaseOrderItem } from '../../../api/types/orders';
import type { ProcurementRequirementResponse } from '../../../api/types/orders';
import type { PurchaseOrderItemCreate } from '../../../api/services/purchase_orders';
import type { SupplierSummary } from '../../../api/types/suppliers';
import type { IngredientResponse } from '../../../api/types/inventory';
import { statusColors } from '../../../styles/colors';
@@ -127,7 +128,7 @@ export const CreatePurchaseOrderModal: React.FC<CreatePurchaseOrderModalProps> =
setLoading(true);
try {
let items: PurchaseOrderItem[] = [];
let items: PurchaseOrderItemCreate[] = [];
if (requirements && requirements.length > 0) {
// Create items from requirements list
@@ -149,13 +150,11 @@ export const CreatePurchaseOrderModal: React.FC<CreatePurchaseOrderModalProps> =
const originalReq = requirements.find(req => req.id === item.id);
return {
inventory_product_id: originalReq?.product_id || '',
product_code: item.product_sku || '',
product_name: item.product_name,
ordered_quantity: item.quantity,
unit_of_measure: item.unit_of_measure,
unit_price: item.unit_price,
unit_price: String(item.unit_price || 0), // ✅ Convert to string for Decimal
quality_requirements: originalReq?.quality_specifications ? JSON.stringify(originalReq.quality_specifications) : undefined,
notes: originalReq?.special_requirements || undefined
item_notes: originalReq?.special_requirements || undefined
};
});
} else {
@@ -180,29 +179,27 @@ export const CreatePurchaseOrderModal: React.FC<CreatePurchaseOrderModalProps> =
// Prepare purchase order items from manual entries with ingredient data
items = manualProducts.map((item: any) => {
// Find the selected ingredient data
const selectedIngredient = ingredientsData.find(ing => ing.id === item.ingredient_id);
return {
inventory_product_id: item.ingredient_id,
product_code: selectedIngredient?.sku || '',
product_name: selectedIngredient?.name || 'Ingrediente desconocido',
ordered_quantity: item.quantity,
unit_of_measure: item.unit_of_measure,
unit_price: item.unit_price,
unit_price: String(item.unit_price || 0), // ✅ Convert to string for Decimal
quality_requirements: undefined,
notes: undefined
item_notes: undefined
};
});
}
// Create purchase order
// Create purchase order using procurement service
await createPurchaseOrderMutation.mutateAsync({
supplier_id: formData.supplier_id,
priority: 'normal',
required_delivery_date: formData.delivery_date || undefined,
notes: formData.notes || undefined,
items
tenantId,
data: {
supplier_id: formData.supplier_id,
priority: 'normal',
required_delivery_date: formData.delivery_date || undefined,
notes: formData.notes || undefined,
items
}
});
// Purchase order created successfully