2
0
mirror of https://github.com/frappe/books.git synced 2025-02-08 23:18:31 +00:00

feat: apply price list in POS

This commit is contained in:
AbleKSaju 2024-11-27 16:56:25 +05:30
parent 73c40d755e
commit f573f13dff
4 changed files with 59 additions and 41 deletions

View File

@ -48,7 +48,7 @@ import { AppliedCouponCodes } from '../AppliedCouponCodes/AppliedCouponCodes';
import { CouponCode } from '../CouponCode/CouponCode'; import { CouponCode } from '../CouponCode/CouponCode';
import { SalesInvoice } from '../SalesInvoice/SalesInvoice'; import { SalesInvoice } from '../SalesInvoice/SalesInvoice';
import { SalesInvoiceItem } from '../SalesInvoiceItem/SalesInvoiceItem'; import { SalesInvoiceItem } from '../SalesInvoiceItem/SalesInvoiceItem';
import { PriceListItem } from '../PriceList/PriceListItem'; import { PricingRuleItem } from '../PricingRuleItem/PricingRuleItem';
export type TaxDetail = { export type TaxDetail = {
account: string; account: string;
@ -1332,7 +1332,7 @@ export abstract class Invoice extends Transactional {
item: item.item as string, item: item.item as string,
unit: item.unit as string, unit: item.unit as string,
}, },
})) as PriceListItem[]; })) as PricingRuleItem[];
return docs.map((doc) => doc.parent) as string[]; return docs.map((doc) => doc.parent) as string[];
} }

View File

@ -17,9 +17,9 @@ import { safeParseFloat } from 'utils/index';
import { Invoice } from '../Invoice/Invoice'; import { Invoice } from '../Invoice/Invoice';
import { Item } from '../Item/Item'; import { Item } from '../Item/Item';
import { StockTransfer } from 'models/inventory/StockTransfer'; import { StockTransfer } from 'models/inventory/StockTransfer';
import { PriceList } from '../PriceList/PriceList';
import { isPesa } from 'fyo/utils'; import { isPesa } from 'fyo/utils';
import { PricingRule } from '../PricingRule/PricingRule'; import { PricingRule } from '../PricingRule/PricingRule';
import { getItemRateFromPriceList } from 'models/helpers';
export abstract class InvoiceItem extends Doc { export abstract class InvoiceItem extends Doc {
item?: string; item?: string;
@ -629,7 +629,10 @@ async function getItemRate(doc: InvoiceItem): Promise<Money | undefined> {
let priceListRate: Money | undefined; let priceListRate: Money | undefined;
if (doc.fyo.singles.AccountingSettings?.enablePriceList) { if (doc.fyo.singles.AccountingSettings?.enablePriceList) {
priceListRate = await getItemRateFromPriceList(doc); priceListRate = await getItemRateFromPriceList(
doc,
doc.parentdoc?.priceList as string
);
} }
if (priceListRate) { if (priceListRate) {
@ -675,43 +678,6 @@ async function getItemRateFromPricingRule(
return pricingRuleDoc.discountRate; return pricingRuleDoc.discountRate;
} }
async function getItemRateFromPriceList(
doc: InvoiceItem
): Promise<Money | undefined> {
const priceListName = doc.parentdoc?.priceList;
const item = doc.item;
if (!priceListName || !item) {
return;
}
const priceList = await doc.fyo.doc.getDoc(
ModelNameEnum.PriceList,
priceListName
);
if (!(priceList instanceof PriceList)) {
return;
}
const unit = doc.unit;
const transferUnit = doc.transferUnit;
const plItem = priceList.priceListItem?.find((pli) => {
if (pli.item !== item) {
return false;
}
if (transferUnit && pli.unit !== transferUnit) {
return false;
} else if (unit && pli.unit !== unit) {
return false;
}
return true;
});
return plItem?.rate;
}
function getDiscountedTotalBeforeTaxation( function getDiscountedTotalBeforeTaxation(
rate: Money, rate: Money,
quantity: number, quantity: number,

View File

@ -33,6 +33,9 @@ import { ValidationError } from 'fyo/utils/errors';
import { isPesa } from 'fyo/utils'; import { isPesa } from 'fyo/utils';
import { numberSeriesDefaultsMap } from './baseModels/Defaults/Defaults'; import { numberSeriesDefaultsMap } from './baseModels/Defaults/Defaults';
import { safeParseFloat } from 'utils/index'; import { safeParseFloat } from 'utils/index';
import { PriceList } from './baseModels/PriceList/PriceList';
import { InvoiceItem } from './baseModels/InvoiceItem/InvoiceItem';
import { SalesInvoiceItem } from './baseModels/SalesInvoiceItem/SalesInvoiceItem';
export function getQuoteActions( export function getQuoteActions(
fyo: Fyo, fyo: Fyo,
@ -947,6 +950,43 @@ export async function getPricingRule(
return pricingRules; return pricingRules;
} }
export async function getItemRateFromPriceList(
doc: InvoiceItem | SalesInvoiceItem,
priceListName: string
): Promise<Money | undefined> {
const item = doc.item;
if (!priceListName || !item) {
return;
}
const priceList = await doc.fyo.doc.getDoc(
ModelNameEnum.PriceList,
priceListName
);
if (!(priceList instanceof PriceList)) {
return;
}
const unit = doc.unit;
const transferUnit = doc.transferUnit;
const plItem = priceList.priceListItem?.find((pli) => {
if (pli.item !== item) {
return false;
}
if (transferUnit && pli.unit !== transferUnit) {
return false;
} else if (unit && pli.unit !== unit) {
return false;
}
return true;
});
return plItem?.rate;
}
export function filterPricingRules( export function filterPricingRules(
pricingRuleDocsForItem: PricingRule[], pricingRuleDocsForItem: PricingRule[],
sinvDate: Date, sinvDate: Date,

View File

@ -126,6 +126,7 @@ import {
getPricingRule, getPricingRule,
removeFreeItems, removeFreeItems,
getAddedLPWithGrandTotal, getAddedLPWithGrandTotal,
getItemRateFromPriceList,
} from 'models/helpers'; } from 'models/helpers';
import { import {
POSItem, POSItem,
@ -460,6 +461,17 @@ export default defineComponent({
item: item.name, item: item.name,
}); });
if (this.sinvDoc.priceList) {
let itemData = this.sinvDoc.items?.filter(
(val) => val.item == item.name
) as SalesInvoiceItem[];
itemData[0].rate = await getItemRateFromPriceList(
itemData[0],
this.sinvDoc.priceList
);
}
await this.applyPricingRule(); await this.applyPricingRule();
await this.sinvDoc.runFormulas(); await this.sinvDoc.runFormulas();
}, },