Add supplier and imporve inventory frontend

This commit is contained in:
Urtzi Alfaro
2025-09-18 23:32:53 +02:00
parent ae77a0e1c5
commit d61056df33
40 changed files with 2022 additions and 629 deletions

View File

@@ -0,0 +1,166 @@
// frontend/src/utils/enumHelpers.ts
/**
* Utilities for working with enums and translations
*/
import { useTranslation } from 'react-i18next';
import type { SelectOption } from '../components/ui/Select';
import {
SupplierType,
SupplierStatus,
PaymentTerms,
PurchaseOrderStatus,
DeliveryStatus,
QualityRating,
DeliveryRating,
InvoiceStatus,
type EnumOption
} from '../api/types/suppliers';
/**
* Generic function to convert enum to select options with i18n translations
*/
export function enumToSelectOptions<T extends Record<string, string | number>>(
enumObject: T,
translationKey: string,
t: (key: string) => string,
options?: {
includeDescription?: boolean;
descriptionKey?: string;
sortAlphabetically?: boolean;
}
): SelectOption[] {
const selectOptions = Object.entries(enumObject).map(([key, value]) => ({
value,
label: t(`${translationKey}.${value}`),
...(options?.includeDescription && options?.descriptionKey && {
description: t(`${options.descriptionKey}.${value}`)
})
}));
if (options?.sortAlphabetically) {
selectOptions.sort((a, b) => a.label.localeCompare(b.label));
}
return selectOptions;
}
/**
* Hook for supplier enum utilities
*/
export function useSupplierEnums() {
const { t } = useTranslation('suppliers');
return {
// Supplier Type
getSupplierTypeOptions: (): SelectOption[] =>
enumToSelectOptions(SupplierType, 'types', t, {
includeDescription: true,
descriptionKey: 'descriptions'
}),
getSupplierTypeLabel: (type: SupplierType): string => {
if (!type) return 'Tipo no definido';
return t(`types.${type}`);
},
// Supplier Status
getSupplierStatusOptions: (): SelectOption[] =>
enumToSelectOptions(SupplierStatus, 'status', t),
getSupplierStatusLabel: (status: SupplierStatus): string => {
if (!status) return 'Estado no definido';
return t(`status.${status}`);
},
// Payment Terms
getPaymentTermsOptions: (): SelectOption[] =>
enumToSelectOptions(PaymentTerms, 'payment_terms', t, {
includeDescription: true,
descriptionKey: 'descriptions'
}),
getPaymentTermsLabel: (terms: PaymentTerms): string => {
if (!terms) return 'Sin términos definidos';
return t(`payment_terms.${terms}`);
},
// Purchase Order Status
getPurchaseOrderStatusOptions: (): SelectOption[] =>
enumToSelectOptions(PurchaseOrderStatus, 'purchase_order_status', t),
getPurchaseOrderStatusLabel: (status: PurchaseOrderStatus): string => {
if (!status) return 'Estado no definido';
return t(`purchase_order_status.${status}`);
},
// Delivery Status
getDeliveryStatusOptions: (): SelectOption[] =>
enumToSelectOptions(DeliveryStatus, 'delivery_status', t),
getDeliveryStatusLabel: (status: DeliveryStatus): string => {
if (!status) return 'Estado no definido';
return t(`delivery_status.${status}`);
},
// Quality Rating
getQualityRatingOptions: (): SelectOption[] =>
enumToSelectOptions(QualityRating, 'quality_rating', t, {
includeDescription: true,
descriptionKey: 'descriptions'
}),
getQualityRatingLabel: (rating: QualityRating): string => {
if (rating === undefined || rating === null) return 'Sin calificación';
return t(`quality_rating.${rating}`);
},
// Delivery Rating
getDeliveryRatingOptions: (): SelectOption[] =>
enumToSelectOptions(DeliveryRating, 'delivery_rating', t, {
includeDescription: true,
descriptionKey: 'descriptions'
}),
getDeliveryRatingLabel: (rating: DeliveryRating): string => {
if (rating === undefined || rating === null) return 'Sin calificación';
return t(`delivery_rating.${rating}`);
},
// Invoice Status
getInvoiceStatusOptions: (): SelectOption[] =>
enumToSelectOptions(InvoiceStatus, 'invoice_status', t),
getInvoiceStatusLabel: (status: InvoiceStatus): string => {
if (!status) return 'Estado no definido';
return t(`invoice_status.${status}`);
},
// Field Labels
getFieldLabel: (field: string): string =>
t(`labels.${field}`),
getFieldDescription: (field: string): string =>
t(`descriptions.${field}`)
};
}
/**
* Utility to get enum value from select option value
*/
export function getEnumFromValue<T>(
enumObject: Record<string, T>,
value: string | number
): T | undefined {
return Object.values(enumObject).find(enumValue => enumValue === value);
}
/**
* Utility to validate enum value
*/
export function isValidEnumValue<T>(
enumObject: Record<string, T>,
value: unknown
): value is T {
return Object.values(enumObject).includes(value as T);
}