feat: enable selecting batches for batched items

This commit is contained in:
Gadha2311
2025-09-17 12:53:02 +05:30
parent b0e995578b
commit 700eb7bab2
7 changed files with 33 additions and 18 deletions
+5 -2
View File
@@ -27,6 +27,7 @@ import {
getReturnQtyTotal,
getReturnLoyaltyPoints,
getItemQtyMap,
getItemVisibility,
} from 'models/helpers';
import { StockTransfer } from 'models/inventory/StockTransfer';
import { validateBatch } from 'models/inventory/helpers';
@@ -1329,17 +1330,17 @@ export abstract class Invoice extends Transactional {
linkedEntries = await getLinkedEntries(sinvDoc);
}
const itemVisibility = this.fyo.singles.POSSettings?.itemVisibility;
const itemVisibility = await getItemVisibility(this.fyo);
if (!this.stockNotTransferred && itemVisibility === 'Inventory Items') {
return null;
}
const schemaName = this.stockTransferSchemaName;
const defaults = (this.fyo.singles.Defaults as Defaults) ?? {};
let terms;
let numberSeries;
if (this.isSales) {
terms = defaults.shipmentTerms ?? '';
numberSeries = defaults.shipmentNumberSeries ?? undefined;
@@ -1367,6 +1368,7 @@ export abstract class Invoice extends Transactional {
}
const transfer = this.fyo.doc.getNewDoc(schemaName, data) as StockTransfer;
for (const row of this.items ?? []) {
if (!row.item) {
continue;
@@ -1398,6 +1400,7 @@ export abstract class Invoice extends Transactional {
} else {
quantity = row.quantity;
}
const item = row.item;
const batch = row.batch || null;
const description = row.description;
+15 -1
View File
@@ -40,7 +40,7 @@ import { safeParseFloat } from 'utils/index';
import { PriceList } from './baseModels/PriceList/PriceList';
import { InvoiceItem } from './baseModels/InvoiceItem/InvoiceItem';
import { SalesInvoiceItem } from './baseModels/SalesInvoiceItem/SalesInvoiceItem';
import { ItemQtyMap, POSItem } from 'src/components/POS/types';
import { ItemQtyMap, ItemVisibility, POSItem } from 'src/components/POS/types';
import { ValuationMethod } from './inventory/types';
import {
getRawStockLedgerEntries,
@@ -113,6 +113,20 @@ export async function getItemQtyMap(doc: SalesInvoice): Promise<ItemQtyMap> {
return itemQtyMap;
}
export async function getItemVisibility(fyo: Fyo): Promise<ItemVisibility> {
const posProfileName = fyo.singles.POSSettings?.posProfile as string;
if (posProfileName) {
const posProfile = await fyo.doc.getDoc(
ModelNameEnum.POSProfile,
posProfileName
);
return posProfile?.itemVisibility as ItemVisibility;
}
return fyo.singles.POSSettings?.itemVisibility as ItemVisibility;
}
export function getStockTransferActions(
fyo: Fyo,
schemaName: ModelNameEnum.Shipment | ModelNameEnum.PurchaseReceipt
+4 -3
View File
@@ -5,6 +5,7 @@ import { Money } from 'pesa';
import { StockLedgerEntry } from './StockLedgerEntry';
import { SMDetails, SMIDetails, SMTransferDetails } from './types';
import { getSerialNumbers } from './helpers';
import { getItemVisibility } from 'models/helpers';
export class StockManager {
/**
@@ -86,13 +87,13 @@ export class StockManager {
async #validate(details: SMIDetails) {
this.#validateRate(details);
this.#validateQuantity(details);
await this.#validateQuantity(details);
this.#validateLocation(details);
await this.#validateStockAvailability(details);
}
#validateQuantity(details: SMIDetails) {
const itemVisibility = this.fyo.singles.POSSettings?.itemVisibility;
async #validateQuantity(details: SMIDetails) {
const itemVisibility = await getItemVisibility(this.fyo);
if (itemVisibility !== 'Inventory Items') {
return;
}
@@ -290,7 +290,7 @@ import { SalesInvoiceItem } from 'models/baseModels/SalesInvoiceItem/SalesInvoic
import { Money } from 'pesa';
import { DiscountType } from '../types';
import { validateSerialNumberCount } from 'src/utils/pos';
import { validateQty } from 'models/helpers';
import { getItemVisibility, validateQty } from 'models/helpers';
import { InvoiceItem } from 'models/baseModels/InvoiceItem/InvoiceItem';
import { SalesInvoice } from 'models/baseModels/SalesInvoice/SalesInvoice';
import { showToast } from 'src/utils/interactive';
@@ -371,17 +371,13 @@ export default defineComponent({
!!profile?.canChangeRate ||
!!this.fyo.singles.POSSettings?.canChangeRate;
this.itemVisibility = profile?.itemVisibility as string;
this.itemVisibility = await getItemVisibility(this.fyo);
} else {
this.profileDiscountSetting =
!!this.fyo.singles.POSSettings?.canEditDiscount;
this.profileRateSetting = !!this.fyo.singles.POSSettings?.canChangeRate;
}
if (!this.itemVisibility) {
this.itemVisibility = this.fyo.singles.POSSettings
?.itemVisibility as string;
this.itemVisibility = await getItemVisibility(this.fyo);
}
},
+2
View File
@@ -10,6 +10,8 @@ export type ItemGroupMap = Record<string, string>;
export type DiscountType = 'percent' | 'amount';
export type ItemVisibility = 'Inventory Items' | 'Non-Inventory Items'
export const modalNames = [
'Keyboard',
'Payment',
+3 -4
View File
@@ -158,6 +158,7 @@ import {
getPricingRule,
removeFreeItems,
getItemRateFromPriceList,
getItemVisibility,
} from 'models/helpers';
import {
POSItem,
@@ -677,9 +678,7 @@ export default defineComponent({
},
async setItems() {
const filters: Record<string, boolean | string> = {};
const itemVisibility =
this.posProfile?.itemVisibility ??
this.fyo.singles.POSSettings?.itemVisibility;
const itemVisibility = await getItemVisibility(this.fyo);
const hideUnavailable =
this.posProfile?.hideUnavailableItems ??
@@ -1058,7 +1057,7 @@ export default defineComponent({
await this.validate();
await this.submitSinvDoc();
const itemVisibility = this.fyo.singles.POSSettings?.itemVisibility;
const itemVisibility = await getItemVisibility(this.fyo);
if (
this.sinvDoc.stockNotTransferred &&
+1 -1
View File
@@ -329,7 +329,7 @@ export default defineComponent({
return false;
},
},
async activated() {
async mounted() {
await this.setPaymentMethods();
},
methods: {