1 制造模块剖析
mrp算法
为了方便说明,给一个最简单的生产模式
m1-p1
也就是由原材料m1直接加工生产p1,比例是1:1
我们设m1的库存量是1000,最低库存200,采购提前期6天,p1的库存是900个,最低库存100
现在接到一个订单,2月2号要2000个p1发运(ofbiz是按照发运期来算提前量的),该怎么算呢
很显然,我们立刻得出,应该生产p1 1200个
但我们的实际生产量并不一定是1200,我们应该先找一下已经安排下的p1的生产单,看有多少
好,找到一个生产单,1月30号生产完毕300个,这样,我们只需要生产900个p1就能满足2月2号的需求
那什么时候开始生产,就需要计算制造提前期,ofbiz是按照工艺路线*数量来计算的,比设一个固定的制造提前期要精确的多,经过计算,需要1月26号开始生产
为了生产p1我们需要多少m1呢,如果不考虑损耗率,应该是900个,现在m1的库存是1000个,能满足需要么
不能,因为m1的最低库存是200个,也就是最多只有800个m1可用,那我们是不是还需要采购100个
和生产一样,先要查一下有没有在1月26号前到货的采购订单,这次发现没有,那我们就要给供应商发一个采购订单,订购600个,为什么是600个
这里有一个采购批量的概念,也就是说采购不是你需要多少就订多少,供应商有一个批量规则,比如m1的供应商的要求是每次订购必须是一箱,一箱是多少呢,600个
ofbiz并没有给出采购批量的算法,只是给出了接口,保证了最大的灵活性,因为实际中,对每一个采购订单计算批量可能导致过大的采购量
比如,现在mrp运算得出 1月26号采购到货100个m1,2月2号采购到货300个m1,2月6号采购到货200个m1,批量是600
在实际中采购员会把数量汇总,给供应商发出一张1月26号到货的采购600个m1的订单,这张订单应该提前6天发出去,因为采购提前期是6天,考虑到日历的休息日,实际应该是提前6个工作日
如果按每张订单分别来,同时考虑批量,就会是1月26号采购600个m1,2月2号采购600个m1,2月6号采购600个m1
以上流程分析清楚了,mrp算法就是一个大循环,先把需求按产品排序,然后按llc循环,计算实际生产或采购需求量,对于需要生产和采购的就生成采购建议和生产建议
代码里也有一些小技巧决定了运行的速度,比如要避免使用递归函数,一遍循环就要全部算完
制造模块还有一些比较细致的设计,比如考虑产品属性,考虑产品配置bom(这两个功能很重要),考虑虚拟件,引入非库存件的概念
以库存件和非库存件的概念分析一下
我们考虑如下的生产模式
m1-p1_2-p1_1-p1
由原材料m1加工成半成品p1_2,再由p1_2加工成p1_1,最后由p1_1加工成成品p1
按很多erp的设计,先是领料m1,生产p1_2,然后将生产出来的p1_2入库,然后领料p1_2,生产p1_1,将生产出来的p1_1入库,然后领料p1_1,生产p1
看上去不是很严谨么
问题在与,在车间的实际生产中,生产出p1_2,就直接拿去生产p1_1了,根本不会做什么入库再领料的操作,不然,一天要输多少单据,如果所有半成品都严格要求做要出入库操作的话,就会不符合实际的车间生产情况
所以,非库存件是一个非常好的设计,我们把p1_2和p1_1设置成非库存件,可以很好的适应实际的生产管理的需要
当然,还有其他需要考虑的,比如,如果非库存件生产有结余要入库也需要处理
2 库存成本的计算和移动平均法
库存成本就是销货成本(COGS),在对组织机构设置财务选项时就需要确定COGS,一般有先进先出,后进先出,移动平均和个别计价法
我们看一个例子
2月2号购入原材料m1 1000 个,价格100 $
2月6号,购入原材料m1 1000 个,价格 200 $
2月8日,卖出原材料m1 600个,那成本是多少呢
按移动平均法,成本是 (1000*100+1000*200)/2000 = 150 $
按后进先出,成本是就是200 $
按先进先出,成本是就是100 $
有了成本,就可以立刻得到销售利润
但是在实际的业务中,由于有进货,退货,各种库存移动,物理库存变动,因此,库存成本的计算要比上面描述的要复杂,一般分为即时计算和月末计算
即时计算是业务发生时就立刻计算这时的移动平均价或后进先出法 先进先出的价格,并写入销售单据(出库单据),对计算速度要求高,并要求软件逻辑必须考虑全面
月末计算是业务发生时不计算成本,到月末时,把入库单据和出库单据按时间顺序排列,从头开始计算成本,并回写到出库单据,一般要计算比较长的时间,有的erp单独设置了 存货核算模块
对于即时计算来说,我们需要有一张表,保存着所有产品的移动平均价 当前数量
比如在该表中,产品m1,当前数量 20000,当前移动平均价 150 $
现在入库m1 10000 个,价格 300 $
那么 当前移动平均价=(20000*150+10000*300)/(20000+10000)= 200 $,当前数量变成 30000
3 自动生成凭证
主要发生在采购 销售 和 生产 的业务发生后,自动生成财务凭证
采购业务的会计分录
入库时
借:库存商品 (1243)
贷:材料采购 (1201)
收到发票时
借:材料采购 (1201)
应交税费-应交增值税(进项税)(21710101)
贷:应付账款 (2121)
付款时
借:应付账款 (2121)
贷:银行存款 (1002)
销售业务的会计分录
销售出库时
借:主营业务成本 (6401)
贷:库存商品 (1243)
开出发票时
借:应收账款 (1131)
贷:主营业务收入 (6001)
应交税费-应交增值税(销项税)(21710105)
对方付款时
借:银行存款(1002)
贷:应收账款 (1131)
在销售 出库 收款时,系统都能自动生成会计凭证,金额从单据中提取,而记账科目则需要预先定义,也就是说,你要指定你的科目表中的哪个科目对应主营业务收入,比如6001,哪个对应应收账款,比如1131,那个对应应交增值税(销项税),一般都是2171
生产则涉及到 原材料科目(比如1211),在产品科目(1241),生产成本科目(4101),制造费用科目(4105)的指定
由于国外erp软件一般没有委外加工的功能,需要做变通处理,可以设置虚拟仓库,纪录委外发出原材料,科目上相应的要设置 委托加工物资 科目
发出材料时
借:在途物资
贷:原材料
收到委外加工产品时
借:委托加工物资
贷:在途物资
一个比较复杂的问题就是,商品入库时,没有收到发票,就会以订单价格或标准价格入库,入库后下月收到发票,如果发票价格与入库价格不一致,国外软件一般计入库存差异,而国内是计入 材料成本差异 科目,另外,应收应付账款是出入库确定,还是开票确认,也会涉及到不同的会计处理,需要增加 库存商品-销售及 应计负债(未税价)等中间科目
==================================
附录
ofbiz快速操作流程
1 建立一个类型为原材料的产品m1,和类型为成品的产品p1
2 建立一个角色类型为供应商的客户组g1,和类型为客户的客户k1
3 设置产品m1 p1的价格和供应商价格
4 设置产品m1 p1的仓库为ofbiz的webstore,位置,并初始化库存各6000个
5 建立一个销售订单,销售p1给k1,店铺为ofbiz的电子商务店铺,从webstore出货
6 建立一个货运计划,交付p1
7 到仓库执行分拣和验证包装
8 建立一个销售发票,和销售付款,与发票匹配
9 建立一个采购订单,从g1采购原材料m1
10 到仓库接受库存m1
11 开采购发票,采购付款,与采购发票匹配
12 新建一个规程任务rtask1
13 新建一个p1的物料清单,子项为m1,数量1,规程任务rtask1
14 建立一个生产单,生产p1, 选择规程任务,然后开始,从仓库领料m1,完成,将生产的p1入库
15 到仓库里可以看库存明细,也可以做仓库调拨和货位移动
16 在总帐里关闭已有的会计期间,新建一个当月的会计期间
快速流程走过一遍,就可以做比较复杂的配置,比如可定制产品,虚拟,变型,特性的配置