import { v4 as uuidv4 } from 'uuid'; import { bignumber, chain } from 'mathjs'; import { InvoiceControllerState, LineAttributeType } from '../'; import idGenerator from '../../tools/idGenerator'; export interface IOptions { /** 需要添加的索引 */ $index: string; /** 折扣 金额 */ discolineAmountunt: number; } /** * 给一组货物添加折扣行 */ export default async (state: InvoiceControllerState, options?: IOptions[]) => { if (!options || options.length <= 0) return; const discountGroup = uuidv4(); options.forEach(e => { const goodsList = state.goodsListState.goodsList; const goodsMap = state.goodsListState.goodsMap; for (let i = 0; i < goodsList.length; i++) { const good = goodsList[i]; if (good.$index !== e.$index) continue; // 折扣行 税额 const lineAmountExcludeTax = getLineAmountExcludeTax(e.discolineAmountunt, good.taxRate); const taxAmount = getTaxAmount(e.discolineAmountunt, lineAmountExcludeTax); good.lineAttribute = LineAttributeType.被折扣行; good.discountGroup = discountGroup; const newGood = { discountGroup, $index: idGenerator(), lineAttribute: LineAttributeType.折扣行, taxRate: good.taxRate, itemName: good.itemName, shorthand: good.shorthand, taxClassificationCode: good.taxClassificationCode, taxAmount: -1 * taxAmount, lineAmountExcludeTax: -1 * lineAmountExcludeTax, lineAmountIncludeTax: -1 * e.discolineAmountunt, taxFreeType: good.taxFreeType, favouredPolicyMark: good.favouredPolicyMark, favouredPolicyName: good.favouredPolicyName, } goodsList.splice(i + 1, 0, newGood); goodsMap.set(newGood.$index, newGood); } }) state.goodsListState.goodsList = [...state.goodsListState.goodsList]; state.goodsListState.goodsMap = new Map(state.goodsListState.goodsMap); } /** 金额(不含税) = 含税金额 / (1 + 税率) */ function getLineAmountExcludeTax(lineAmountIncludeTax: number, taxRate: number = 0) { const biTaxRate = chain(bignumber(taxRate)).divide(bignumber(100)).done(); return chain(bignumber(lineAmountIncludeTax)) .divide(chain(bignumber(1)).add(biTaxRate).done()) .multiply(bignumber(100)) .round() .divide(bignumber(100)) .done() .toNumber() } /** 税额 = 含税金额 - 金额(不含税) */ function getTaxAmount(lineAmountIncludeTax: number, lineAmountExcludeTax: number) { return chain(bignumber(lineAmountIncludeTax)) .subtract(bignumber(lineAmountExcludeTax)) .done() .toNumber() }