龙空技术网

发票合并和拆分

方正柱 782

前言:

现时朋友们对“合并中什么意思”大体比较珍视,你们都想要知道一些“合并中什么意思”的相关资讯。那么小编也在网上搜集了一些关于“合并中什么意思””的相关内容,希望各位老铁们能喜欢,同学们一起来了解一下吧!

税局对单张发票有限额,同时给到企业的发票张数也是有限的。在这两个前提下,企业开票既要满足税局要求,保证单张票的票额不超过票限额,也要尽量减小开票张数,节省发票。

为满足这两个要求,提出了发票和拆分的业务诉求,技术上也提出了对应的发票拆票和合并算法问题。

发票开票的内容,包含以下几个主要信息:

1. 销售的商品和服务的名称

2. 商品单价

3. 商品的数量

4. 商品的税率

5. 商品的不含税价格和税额

6. 商品折扣信息

不含税金额和税额的计算

---------------------------------------------

一般情况下,企业给客户销售时,使用的是含税额的总金额。在开票时,要把不含税金额和税额拆分出来。定义含税额为AmmountWithTax,税率为r,不含税额为AmmountWithoutTax,税额为AmmountOfTax则对应的计算公式为:

AmmountWithoutTax = AmmountWithTax / (1+r);

AmmountOfTax = AmmountWithTax – AmmountWithoutTax;

含税总额的计算,比较简单,是销售价格乘以数量即可。但是这里的价格,需要注意一下,发票上开的“单价”,是不含税的“单价”,和我们给客户销售的“含税单价”,是不一样的。

销售单价和销售数量的调整

-------------------------------------------

在这里,有一个发票单价和数量计算的问题: 保单价还是保数量。之所以出现这个问题,是因为一般情况下,对于商品类,希望能保持单价不变,去调整数量; 而对于服务类,希望保持“数量”不变,而调整“单价”。以上规则是一个行业的实践,不是税务的规则。

在商品保单价的逻辑下,单价保持为“含税单价“不变,而调整商品数量。公式为:

AmmountOfCount = AmmountWithoutTax / PriceWithTax;

在服务保数量的逻辑下,数量保持为含税价格时的服务数量,而调整商品单价。 公式为:

Price = AmmountWithoutTax / AmmountOfCount;

单张发票的误差约束

------------------------------------------

1. 单张票面上,单行商品或服务的差异,即金额和单价*数量,应该小于0.01元。

2. 单行的金额(不含漱)* 税率 和 税额的差异,小于0.06元。

3. 票面所有行的 金额*税率之和,与税额之差异,小于1.27元。

不满足以上的误差约束,则不能从税控系统里,开出票来。

票面合并和拆分

---------------------------------------------

税局给出的空票,是有额度和数量限制的。为了有效利用额度和数量,在开票上,我们可以对代开票的内容,进行合并和拆分。

1. 发票的合并

如果多个开票项的不含税总额之和,没有超过发票票面额度限制,那么这些开票项目,可以合并起来。以节省发票张数。

比如发票单张面额限制是10万元,有一个客户在1个开票周期内,有1000张额度100元以下的待开项,那么是可以合并起来的,以减少开票的张数。

2. 发票的拆分

如果一个客户的开票额度,超过单张发票限额,此时为了能够完成开票,需要把发票的开票项,拆分为多个,以满足开票的需求。

3. 发票的混合拆分、合并

在合并过程中,会遇到以下的情况:单个商品因总额高,被拆成多张发票后,最后一张拆开的发票额度,小于限额;此时可以合并一些其它小额的开票项目进来。形成拆分、合并的双重场景。

合并和拆分适用的场景,比以上情况丰富的多,具体看开票的企业的应用。一般情况下,在合并拆分上,我们使用以下几个约束:

1. 被拆分过一次的发票的剩余部分,除非依然超过限额,否则不进行再次分割。

2. 对于一张票的剩余额度,如果其它开票商品的额度都比剩余额度大,不对其它开票商品再次进行拆分;而仅以其余更小的额度的整体商品,进行合并。

这两个的约束,不是税控系统的要求,只是为了减少发票开具后,降低理解开票内容的难度而设计。

发票拆分、合并算法

-----------------------------------------------

问题:

某个业务因发生交易或服务,需要对交易或服务内容,进行开票。 各交易项或服务项,定义为“发票行信息”(Invoice_Line), 各交易项或服务项的总额度,定义为“发票总额度”(Invoice_Amount)。

当 Invoice_Amount > Single_Invoide_Max_Value时, 触发拆单,使得每张发票内含的发票总额度,小于Single_Invoide_Max_Value.

约束:

1. 单张实体发票的发票面额,有上限Single_Invoice_Max_Value; 开票金额不能超过此上限。

2. 电票的发票行信息数,不能超过M; 支票的发票行信息,不能超过N。

3. 当发票行信息,是服务类型时,则服务数量为整数,可调整服务单价。(保数量策略); 当发票行信息,是商品型时,则商品价格为实际单价,可调整商品数量(报单价策略)。

算法过程描述:

1. 对Invoice_Line数组进行排序,由小往大排。

2. 遍历Invoide_Line数组,组合出最长满足单张发票限额条件的子序列 Sub_Invoice_Line.

3. 当出现单条Invoice_Line的额度(Invoide_Line_Value),超过单张发票面额时,按以下过程处理:

a. 根据发票限额,及Invoice_Line_Value,计算出可拆出票的数量。

Invoide_Count = LowRound[Invoice_Line_Value / Single_Invoice_Max_Value];

b. 从1到Invouce_Count-1张发票,票面额度为Single_Invoide_Max_Value, 最后一张则为可用发票余额。

c. 最后一张发票为余额,按照Invoice_Line类型, 如果是服务类,则数量为整数,调整单价; 如果是商品类,则单价为原单价,数量可以调整为小数。

4. 从小到大遍历Invoice_Line数组,如果最小的商品行的额度,小于待开发票额度,则加入到Sub_Invoice_Line里,直到子序列最长。

5. 按Sub_Invoice_Line数组遍历,顺序生成发票开票信息,调用税局发票接口。

标签: #合并中什么意思