feat: Implement Free Issue functionality in Shop PO and Invoice management

This commit is contained in:
2026-10-22 16:37:03 +05:30
parent 58247a1a0b
commit b1bda1448e
7 changed files with 509 additions and 21 deletions
@@ -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>