feat: Implement Free Issue functionality in Shop PO and Invoice management
This commit is contained in:
@@ -29,6 +29,7 @@ import {
|
||||
getPaginatedItems,
|
||||
} from '@/lib/api/index'
|
||||
import type { ItemSummaryResponse, StoreResponse, UserResponse } from '@/types/api'
|
||||
import { FreeIssuePanel, type FreeLine } from '../_components/free-issue-panel'
|
||||
|
||||
const lineItemSchema = z.object({
|
||||
itemId: z.string().min(1, 'Item is required'),
|
||||
@@ -57,6 +58,8 @@ export default function NewShopPOPage() {
|
||||
const [usersList, setUsersList] = useState<UserResponse[]>([])
|
||||
const [priceMinByIndex, setPriceMinByIndex] = useState<Record<number, number | null>>({})
|
||||
const [priceRetailByIndex, setPriceRetailByIndex] = useState<Record<number, number | null>>({})
|
||||
const [freeLines, setFreeLines] = useState<FreeLine[]>([])
|
||||
const [discountIds, setDiscountIds] = useState<string[]>([])
|
||||
|
||||
const form = useForm<FormValues>({
|
||||
resolver: zodResolver(schema),
|
||||
@@ -125,9 +128,13 @@ export default function NewShopPOPage() {
|
||||
async function onSubmit(values: FormValues) {
|
||||
try {
|
||||
await shopPosApi.create({
|
||||
discountSchemeIds: discountIds,
|
||||
storeId: values.storeId,
|
||||
raisedByUserId: values.raisedByUserId,
|
||||
items: values.items,
|
||||
items: [
|
||||
...values.items,
|
||||
...freeLines.map((l) => ({ itemId: l.itemId, quantity: l.quantity, isFree: true, schemeId: l.schemeId })),
|
||||
],
|
||||
})
|
||||
toast.add({ title: 'Shop PO created', type: 'success' })
|
||||
router.push('/sales')
|
||||
@@ -343,6 +350,19 @@ export default function NewShopPOPage() {
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<FreeIssuePanel
|
||||
storeId={watchedStoreId}
|
||||
paidLines={watchedItems.map((l) => ({
|
||||
itemId: l.itemId,
|
||||
quantity: Number(l.quantity) || 0,
|
||||
unitPrice: Number(l.unitPrice) || 0,
|
||||
}))}
|
||||
freeLines={freeLines}
|
||||
onChange={setFreeLines}
|
||||
discountIds={discountIds}
|
||||
onDiscountChange={setDiscountIds}
|
||||
/>
|
||||
|
||||
<div className="flex justify-end">
|
||||
<div className="w-full rounded-2xl border p-6 sm:w-96">
|
||||
<h3 className="text-sm font-medium text-foreground">Order Summary</h3>
|
||||
|
||||
Reference in New Issue
Block a user