This commit is contained in:
2026-04-23 14:38:41 +03:00
parent f17dd1486c
commit c0f78c6e18
90 changed files with 10819 additions and 1583 deletions
@@ -13,6 +13,7 @@ import { ScrollArea } from "@/shared/components/ui/scroll-area"
import { BillForm } from "@/modules/bills/bill-form"
import { toRelation } from "@/shared/lib/utils"
import { usePurchaseOrder } from "./purchase-order-context"
import { getFullName } from "@/shared/utils/getFullName"
/**
* Maps a Purchase Order data object to a complete BillFormValues shape so that
@@ -26,9 +27,9 @@ function mapPOToBillInitialData(po: Record<string, any>) {
notes: po.notes ?? "",
// Relation fields — must be { value, label } objects for RhfAsyncSelectField
vendor: toRelation(po.vendor_id, po.vendor_name),
department: toRelation(po.department_id, po.department_name),
job_card: toRelation(po.job_card_id, po.job_card_name ?? po.job_card_number),
vendor: toRelation(po.vendor_id, getFullName(po.vendor)),
department: toRelation(po.department_id, po.department.name),
job_card: toRelation(po.job_card_id, po.job_card.title ),
// Link bill back to the source PO
purchase_order: toRelation(po.id, po.order_number ?? po.title),
@@ -11,8 +11,10 @@ import {
RhfTextareaField,
RhfAsyncSelectField,
RhfDateField,
RhfAutoGenerateField,
} from "@/shared/components/form"
import { PartsSelectorField } from "@/modules/parts/parts-selector-field"
import { VendorForm } from "@/modules/vendors/vendor-form"
import { toast } from "sonner"
import { useAuthApi } from "@/shared/useApi"
import { useResourceForm } from "@/shared/hooks/use-resource-form"
@@ -38,7 +40,7 @@ export type PurchaseOrderFormProps = {
const DEFAULT_VALUES: PurchaseOrderFormValues = {
vendor: null,
order_number: "" ,
order_number: "",
job_card: null,
department: null,
title: "",
@@ -98,6 +100,13 @@ const mapLookupOption = (item: any) => ({
label: item.name,
})
const getVendorLabel = (item: any) => getFullName(item) || item.company_name || item.name || `#${item.id}`
const mapVendorOption = (item: any) => ({
value: String(item.id),
label: getVendorLabel(item),
})
const STORE_OBJECT = { getOptionValue: (o: any) => o, getOptionLabel: (o: any) => o.label }
// ── Component ──
@@ -147,8 +156,8 @@ export function PurchaseOrderForm({ resourceId, initialData, onSuccess }: Purcha
<FieldGroup>
<div className="grid grid-cols-1 gap-4 sm:grid-cols-2">
<RhfTextField name="title" label="Title" placeholder="Enter purchase order title" required />
<RhfTextField name="order_number" label="Order Number" placeholder="Enter purchase order number" required />
<RhfTextField name="title" label="Title" placeholder="Enter purchase order title" required />
<RhfAutoGenerateField autoFetch table="purchase-order" name="order_number" label="Order Number" placeholder="Enter purchase order number" required />
<RhfDateField name="order_date" label="Order Date" />
<RhfDateField name="delivery_date" label="Delivery Date" />
</div>
@@ -160,7 +169,16 @@ export function PurchaseOrderForm({ resourceId, initialData, onSuccess }: Purcha
placeholder="Select vendor"
queryKey={[VENDOR_ROUTES.INDEX]}
listFn={() => api.vendors.list()}
mapOption={(op: any) => ({ label: getFullName(op as any), value: String(op.id) })}
mapOption={mapVendorOption}
createForm={({ onSuccess }) => (
<VendorForm
onSuccess={(data) => {
const vendor = (data as any)?.data ?? data
onSuccess(vendor?.id ? mapVendorOption(vendor) : undefined)
}}
/>
)}
createLabel="Vendor"
{...STORE_OBJECT}
/>
<RhfAsyncSelectField