一、复式库存(Double - Entry Stock Management)与库存移动(Stock Move)
OpenERP 的库存管理采用了独特的复式库存模式。每一笔库存变动,都会同时记录库存的减少和增加。例如,当向客户销售 10 辆自行车时,OpenERP 会在你的库位中减去 10 辆自行车,同时在客户库位增加 10 辆自行车。在系统里,复式库存是通过记录库存移动来实现的。任何一笔库存变动,系统都会记录为一笔这样的库存移动。
在 OE 中,“库存变动” 的概念十分广泛。比如,在库存盘点时发现盘亏 2 辆自行车,系统会记录从自己的库位转移到 “盘点库位”;若盘盈,则是从盘点库位转移到存货库位。再如生产环节,生产领料时系统记录库存移动为从原料库位转移到生产库位(Produce Location);成品入库时,系统记录从生产库位转移到成品库位。
二、实际库存(Real Stock)和虚拟库存(Virtual Stock or Future Stock)
系统并不直接记录各库位的产品库存数量,而是仅记录库存变动。那么,如何得知某库位中某产品的数量呢?其实很简单,以自行车在库位 A 中的数量为例,移入库位 A(即库存移动的目标库位是库位 A)会使自行车数量增加,反之,移出则会使数量减少。所以,只需统计自行车的库存移动记录中,目标库位为 A 的数量以及源库位为 A 的数量,将两者相减,就能得到库位 A 中自行车的库存数量。
在现实中,库存分为实际库存和虚拟库存。实际库存是库位中实际拥有的数量,虚拟库存是库位中的未来数量。例如,在采购时,假设今天下单,采购物资需 5 天后到达。采购员在考虑今天是否下单以及采购数量时,应参考 5 天后的库存数量来做决策。在未来的 5 天里,有一部分产品已销售出去,将在 5 天内出库,还有一部分产品之前已下单(采购单或生产单),将在 5 天内入库。实际库存加上未来一段时间将要入库的数量,再减去未来一段时间将要出库的数量,就是虚拟库存。需要注意的是,虚拟库存的数量与时间相关。
系统计算实际库存和虚拟库存同样基于库存移动记录,但需要用到库存移动记录中的更多信息。系统中实际记录的库存移动(Stock Move)记录,还包含移动状态、计划移动日期和实际移动日期等字段。统计实际库存时,只需统计那些已经实际发生(移动状态为 Done)的库存移动记录的数量即可。计算虚拟库存时,要统计那些实际已经发生的、以及将要发生(移动状态为 Valid,且计划移动日期在计算时间段内)但尚未发生(没有实际移动日期)的移动记录数量。
三、仓库(Warehouse)和库位(Location)
仓库就是我们通常所说的实际 “仓库”。一个实际仓库通常会划分为若干货区,如成品区、原料区、废品区等,货区还会进一步分为货架、货层等,这些货区、货架等形成树状层次结构,在 OE 中可以用库位来建模。
在 OE 的仓库(Warehouse)设置中,一个仓库分为三个库位(Location):存货库位(Location Stock)、进货库位(Location Input)、出货库位(Location Output)。
- 存货库位:是仓库中存放货物的货区,还可按货架、货层等进一步细分。
- 进货库位:是仓库中收货的暂存货区,例如存放已收货但尚未验收的临时存放区。在简单情况下,若不需要临时收货区,进货库位可以和存货库位设置为同一个库位。
- 出货库位:是仓库中发货的暂存货区,例如存放已发货等待装运的临时存放区。在简单情况下,若不需要临时发货区,出货库位可以和存货库位设置为同一个库位。
库位类似于仓库里的货区,用于存放产品(需要注意的是,OE 的产品包括原料、消耗品、成品等所有物资)。库存移动中记录的源库位和目标库位都是库位,不能使用仓库。OE 的库位概念非常灵活,可以是实际库位(库区),也可以是虚拟库位。虚拟库位在物理上并不存在,仅用于复式库存的库存移动记录。例如,盘亏时的库存移动记录,目标库位是 “盘点库位”,该库位就是一种虚拟库位。OE 的库存移动概念广泛,对应的库位也有多种类型:
- 供应商库位(Supplier Location):用于从供应商处收货时的库存移动的源库位,是一种虚拟库位。
- 视图库位(View):是库位树状结构的中间节点,用于组织库位树状结构。这种视图不能在库存移动中使用,但可用于库存统计,即统计其下面各个库位的总库存。
- 内部库位(Internal Location):是仓库中实际存放货物的库位,即库区。
- 客户库位(Customer Location):用于供货给客户时的库存移动的目标库位,是一种虚拟库位。
- 盘点库位(Inventory):用于盘亏时的目标库位,或者盘盈时的源库位。需要注意的是,新上 OE 系统时,也是从该库位中 “移动” 产品至各库位,以建立期初库存。
- 补货库位(Procurement):是产品补货单(Procurement Order)引起的库存移动的 “临时” 源库位或目标库位。当系统初次生成补货单时,无法确定补货的来源(不确定是通过购买还是通过生产补货)。只有当系统运行完补货调度计划(Procurement Scheduler)后,才能知道补货来源。默认情况下,系统每天运行一次补货调度计划,当然,你也可以在任何时候手动执行补货调度计划。补货库位用于初次生成的补货单中的库存移动,每当运行完补货调度计划后,该库位库存数量应为零。
- 生产库位(Production):在生产时,生产领料或成品入库时的目标库位或源库位,是一种虚拟库位。
- 多公司中间库位(Transit Location for Inter - Companies Transfers):在多公司情况下,用于库存移动时的中间库位。
四、库位链(Location Chain)
OE 的库位之间可以串联起来形成库位链。举个简单的例子,如果你希望收到货物后先进入质检区,经质检人员确认后再入库,就可以利用库位链来实现。设置一个质检库位,并将其链接到你的存货库位,每当货物进入质检库位时(系统记录到一个目标库位为质检库位的库存移动),系统会自动生成一个从质检库位到存货库位的移动单,要求质检人员确认该单子。
库位链中,从前一库位到下一库位的移动有三种方式:
- 手动转移(Manual Operation):系统自动生成一张到下一库位的移动单,需要操作员确认后才会实际移动。
- 自动转移(Automatic Move):系统自动生成一张到下一库位的移动单,无需操作员确认,直接进行移动。此时通常还会指定库链提前时间(Chaining Lead Time),该时间表示货物进入库位后,等待该时间再进入下一库位。这个概念可用于建模物流路径结点及其时间。
- 自动跳移(Automatic No Step Added):系统不生成到下一库位的移动单,而是直接将原库存移动的目标库位修改为下一库位。
可以利用 OE 灵活的库位及库位链概念来建模物流处理过程,例如:
- 销售发货的多次确认:系统默认的销售发货过程是两次确认,一次是出库前确认待发货产品合格,另一次是客户收到货物后联系客户确认收货无误。第一次确认在销售单确认时系统自动产生的装箱单(Packing List,其内容是存货库位 Stock 到出货库位 Output 的库存移动)上进行,第二次在第一次确认后产生的运输单(Delivery Order,其内容是从出货库位 Output 到客户库位 Customer 的库存移动)上进行。如果不需要第二次确认,只需将 Output -> Customer 设置成自动转移库位链,第二次移动将自动完成,无需确认。
- 跟踪货物进出口的海运路径:假设某产品从美国公司 A 进口,A 公司发货后 2 天到达美国西岸港口,1 个月后到达上海港口,5 天后应到达公司仓库。为了跟踪该物流过程,可以建立库位链:Supplier A -> 西岸港 -> 上海港 -> Input -> Stock,并设置该库位链各环节的库链提前时间,系统就可以自动产生库存移动供用户确认货物是否按时到达各节点。
- 管理单个产品的物流路径:安装 Location_Path 模块后,OE 支持为每个产品设置特定的物流路径。
- 管理出租产品:例如某设备 A 出租给某客户 A 3 个月,可以为设备 A 设置库位链:Stock -> Output -> Customer A -> Input -> Stock,并将 Customer A -> Input 环节的库链提前时间设置为 3 个月。这样,系统将于 3 个月后自动产生库存移动单供用户确认设备 A 是否按时归还。
- 管理委托产品:委托产品是指存放于客户或供应商处,但产权属于自己的产品,或者存放于本公司仓库,但产权不属于本公司的产品。例如,对于产权属于自己,但存放于客户处的产品,可以在自己公司的总存货库位下设置一个 “客户库位”,用于记录该类产品库存。
五、产品补货(Procurement)
当销售缺货时,需要及时 “补货”,这个补货过程在 OE 里称为产品补货。OE 的补货是通过手动或自动生成补货单(Procurement Order)来实现的。有多种情况会引发补货:
- 手动生成补货单:仓管员发现某产品库存过低时,可以手动生成一张补货单(Procurement Order)。在产品画面的右边有个 “Make Procurement” 链接,当查看库存发现产品库存太低时,点击该链接即可手工填写补货单。
- 按库存生产(Make to Stock)的自动补货:对于按库存生产的产品,当该产品库存低于最低库存(minimum stock rules)时,系统会自动生成补货单。系统有一个批处理 Job,该 Job 会定期执行(默认为一天一次),它会根据设定的最低库存规则,如果库存不足,就会自动生成补货单。
- 按订单生产(Make to Order)的自动补货:对于按订单生产的产品,在确认销售订单时,系统会自动生成补货单。
- 根据主生产计划生成补货单:按库存生产的产品,还可以根据主生产计划(master production schedule)生成补货单。
随着补货单的执行,系统会产生一系列动作,如自动生成采购单(Purchase Order)、自动生成制造单(Manufacturing Order)、自动生成任务(Task)等。具体采取什么动作,取决于产品(Product)的供应方法(Supply Method)、补货方法(Procurement Method)、产品类型(Product Type)三个属性的设置。
OE 支持两种产品补货方法:
- 按库存生产(Make to Stock):表示从仓库取货供给客户的产品,如分销商的情况,或者季节性产品。
- 按订单生产(Make to Order):表示有销售订单时,根据订单去采购或生产的产品,该种产品不会入库。
OE 支持两种产品供应方法:
- 生产(Produce):表示该产品通过自己生产来供应,或者该服务是通过内部资源来提供。
- 购买(Buy):表示该产品或服务通过购买来供应。
OE 支持三种产品类型:
- 可库存品(Stockable):需要计量其库存数量的物资,通常的有形产品都属于该类型。
- 消耗品(Consumable):不需要计量其库存数量的物资,通常是低值易耗品,如小螺钉等。
- 服务(Service):非有形物,OE 中将服务也看作产品,如咨询服务、软件开发服务。
对于可库存产品,补货单(Procurement Order)的后续动作如下:
补货方法 | 供应方法 (Produce) | 供应方法 (Buy) |
---|---|---|
MTS | 等待 | 等待 |
MTO | 自动生成生产单 | 自动生成采购单 |
对于服务产品,补货单(Procurement Order)的后续动作如下:
补货方法 | 供应方法 (Produce) | 供应方法 (Buy) |
---|---|---|
MTS | - | - |
MTO | 自动生成项目任务 | 自动生成服务外包合同 |
下面举一个复杂的例子来说明 OE 的补货(Procurement)过程:
- 销售出某 MTO 的产品 A。
- 销售单 (SO: Sale Order) 确认时,系统自动生成产品 A 的补货单 (PO: Procurement Order)。
- 该 PO 导致系统生成产品 A 的制造单 (MO: Manufacturing Order)。
- 随着该 MO 的执行,系统会根据 BOM 计算产品零部件的补货单。
- 零部件补货单会导致系统生成库间移动单(INT:Internal Moves,相当于领料单)。
- 如果零部件是 MTO 的产品,该 INT 又会触发新的 PO 及 MO;如果该零部件是 MTS 的,且库存不足领料数量,则系统将处于待料状态(Waiting)。
- 待料状态下,等待一天后,最小库存规则会自动引发该零部件的补货单,该补货单又会产生采购单(PO:Purchase Order)。
- 采购员确认系统生成的采购单,且采购零部件入库后,待料状态结束,生产可以继续进行。
从上述补货过程可以看出,有多种原因会导致补货过程中断(Procurement Exception),补货单会记录导致异常的原因。设置错误是导致自动补货异常的最常见原因:
- 产品未定义 BOM (No bill of materials defined for production):这种情况需要定义 BOM,或者将产品的供应方法改成购买(Buy)。
- 找不到采购单的供应商(No supplier available for a purchase):这是因为没有定义产品的供应商,需要在 Product 界面的 Supplier 页定义产品默认供应商。
- 找不到供应商的地址(No address defined on the supplier partner):这种情况需要设置该供应商的地址,因为系统自动生成采购单时需要该地址。
- 库存不足(No quantity available in stock):这种情况需要定义最小库存规则,以使系统能够自动补货,或者手工录入补货单补足库存。
六、库存价值(stock valuation)
库存价值计算是一个难题,财务经理给出的库存价值往往和库管经理给出的库存价值相差较大,这就是所谓的库存 “两张皮” 现象。在 OE 中,通过非常巧妙的方式将 “两张皮” 统一成了一张皮。OE 统一 “两张皮” 的方法是,每一笔库存移动都会自动生成会计上的一笔库存移动分录。由于系统自动生成,避免了人为错误,所以会计分录和库存移动能够保持一致,财务经理从会计分录计算的库存价值和库管经理从库存移动计算出的库存价值总是相等的。
为了统一库存价值的 “两张皮”,在 OE 中需要设置如下一些基础参数:产品(Product)画面的 Stock Input Account、Stock Output Account,库位(Location)画面的 Stock Input Account、Stock Output Account。
- 产品的 Stock Input Account:该产品入库时,入库分录的贷方。产品入库时,借方通常固定为 “库存商品”。
- 产品的 Stock Output Account:该产品出库时,出库分录的借方。产品出库时,贷方通常固定为 “库存商品”。
- 库位的 Stock Input Account:产品入该库位时,入库分录的借方。该参数通常是 “库存商品” 下的以库位名命名的二级科目,如 “A 库”。但如果是 “盘点库位” 或 “生产库位”,不要设置成 “库存商品” 的二级科目,可以设置为 “盘点库”、“生产库”,或者不设置。
- 库位的 Stock Output Account:产品出该库位时,出库分录的贷方。该参数通常也是 “库存商品” 下的以库位名命名的二级科目,如 “A 库”。
下面通过一个例子来说明:
- 产品 “自行车” 的 Stock Input Account=“外库”,Stock Output Account=“外库”。
- A 库位的 Stock Input Account=“库存商品 - A 库”,Stock Output Account=“库存商品 - A 库”。
- 盘点库位的 Stock Input Account=“盘库”,Stock Output Account=“盘库”。
假设自行车单价 200 元,期初自行车库存数量为 0,依次发生以下业务:
- 采购入库自行车 10 辆,入 A 库位。
- 销售出库自行车 5 辆,从 A 库出。
- 月末盘点盘亏 1 辆自行车。
当确认上述库存移动时,系统会自动生成如下会计分录:
采购入库
产品 | 数量 | 源库位 | 目标库位 |
---|---|---|---|
自行车 | 10 | Supplier | A 库位 |
会计分录
- 借:库存商品 - A 库 2000
- 贷:外库 2000
销售出库
产品 | 数量 | 源库位 | 目标库位 |
---|---|---|---|
自行车 | 5 | A 库位 | Customer |
会计分录
- 借:外库 1000
- 贷:库存商品 - A 库 1000
盘亏
产品 | 数量 | 源库位 | 目标库位 |
---|---|---|---|
自行车 | 1 | A 库位 | 盘点库位 |
会计分录
- 借:盘库 200
- 贷:库存商品 - A 库 200
从系统的记录中,库管经理很容易得出结论:A 库位有 4 辆自行车(10 辆 - 5 辆 - 1 辆),盘点库位有 1 辆自行车。财务经理也很容易得出结论:A 库位的价值为 800 元(2000 元 - 1000 元 - 200 元),盘点库位的价值为 200 元,盘点库位的价值表示盘亏了 200 元。