openerp 6.0.2库存业务

一、复式库存(Double-Entry Stock Management)和库存移动(Stock Move)
OpenERP的库存管理采取了独特的复式库存(Double-Entry Stock Management)。什么是复式库存?就是每一笔库存变动,同时记录库存减少和库存增加。例如卖了10辆自行车给客户,OpenERP会在你的库位(Location,这个概念后面再说)减去10辆自行车,再在客户库位(Customers Location)增加10辆自行车。因此,任何时候,OpenERP的所有库位的库存数量加起来总是为零。
系统中,复式库存是通过记录库存移动(stock move)来实现的。例如,前面的卖10辆自行车给客户,系统记录的是:
产品  |数量 | 源库位 | 目标库位
自行车  | 10  | stock  | Partner Locations > Customers
这条记录的意思是,有10辆自行车从自己的库位(stock)转移到了客户的库位(Partner Locations > Customers)。任何一笔库存变动,系统中都记录了一笔如此形式的库存移动。在OE中,“库存变动”的概念非常广泛,如库存盘点发现盘亏了2辆自行车,系统记录的是:
产品  |数量 | 源库位 | 目标库位
自行车  | 2  | stock  | Virtual Locations > Inventory Loss
这条记录的意思是,有2辆自行车从自己的库位(stock)转移到了“盘点库位”(Virtual Locations > Inventory Loss)。反之,盘盈的话,就是从盘点库位转移到了stock。又如生产,生产领料系统记录库存移动:从原料库位转移到生产库位(Produce Location)。成品入库系统记录库存移动:从生产库位(Produce Location)转移到成品库位。
二、实际库存(Real Stock)和虚拟库存(Virtual Stock or Future Stock)
系统中不记录各库位的产品库存数量,只记录库存变动,那么,怎么知道某库位中某产品的数量呢?这个其实很容易,例如自行车在库位A中的数量,移入库位A(库存移动的目标库位是库位A)使得自行车数量增加,反之,移出使得自行车数量减少。因此,只要统计自行车的库存移动记录中,目标库位为A的数量,以及源库位为A的数量,两者相减,即得到库位A中自行车的库存数量。
现实中,库存分实际库存(Real Stock)和虚拟库存(Virtual Stock or Future Stock)。实际库存是库位中实有数量,虚拟库存是库位中的将来数量。例如,采购时候,假设今天下单,采购物资要5天后到达。那么,采购员考虑今天要不要下单,以及采购多少数量时候,他应该参考5天后的库存数量来决定。在未来的5天中,有一部分产品已销售出去,将在5天内出库,还有一部分产品之前已下单(采购单或生产单),将在5天内入库。实际库存,加上未来一段时间将要入库的数量,减去未来一段时间将要出库的数量,就是虚拟库存。注意,虚拟库存的数量和时间相关,例如10天后的虚拟库存显然和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到客户库位Cusomer的库存移动)上确认。如果不需要第二次确认,那么,只要将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里叫产品补货(Procurement)。OE的补货,是通过手动或自动生成补货单(Procurement Order)来实现。有多种情况会引发补货:
1)仓管员发现某产品库存太低,他可以手动生成一张补货单(Procurement Order)。在产品画面,右边有个“Make Procurement”链接,当查看库存时发现产品库存太低,可以点击该链接手工填写补货单。
2)按库存生产(Make to Stock)的产品,当该产品库存低于最低库存(minimum stock rules)时,系统会自动生成补货单。系统有一个批处理Job,该Job会定期执行(默认为一天一次),该Job根据设定的最低库存规则(minimum stock rules),如果库存不够时,自动生成补货单。
3)按订单生产(Make to Order)的产品,确认销售订单时候,系统会自动生成补货单。
4)按库存生产(Make to Stock)的产品,根据主生产计划(master production schedule)生成补货单。
随着补货单的执行,系统会产生一系列的动作。如自动生成采购单(Purchase Order),自动生成制造单(Manufacturing Order),自动生成任务(Task)。具体采取什么动作,取决于产品(Product)的供应方法(Supply Method)、补货方法(Procurement Method)、产品类型(Product Type)三个属性的设置。
OE支持两种产品补货方法:按库存生产(Make to Stock)、按订单生产(Make to Order)。
按库存生产(Make to Stock): 表示从仓库取货供给客户的产品,如分销商的情况,或者季节性产品。
按订单生产(Make to Order): 表示有销售订单时,根据订单去采购或生产的产品,该种产品不会入库。
OE支持两种产品供应方法:生产(Produce)、购买(Buy)。
生产(Produce): 表示该产品通过自己生产来供应,或者该服务是通过内部资源来提供。
购买(Buy): 表示该产品或服务通过购买来供应。
OE支持三种产品类型:可库存品(Stockable)、消耗品(Cosumable)、服务(Service)
可库存品(Stockable):需要计量其库存数量的物资,通常的有形产品都是该类型。
消耗品(Cosumable):不需要计量其库存数量的物资,通常是低值易耗品,如小螺钉等。
服务(Service):非有形物,OE中将服务也看做产品。如咨询服务、软件开发服务。
对于可库存产品,补货单(Procurement Order)的后续动作:
补货方法 | 供应方法(Produce)  | 供应方法(Buy)
MTS  | 等待  | 等待
MTO  | 自动生成生产单  | 自动生成采购单
对于服务产品,补货单(Procurement Order)的后续动作:
补货方法 | 供应方法(Produce)  | 供应方法(Buy)
MTS  | -  | -
MTO  | 自动生成项目任务  | 自动生成服务外包合同
下面举个复杂点的例子说明OE的补货(Procurement)过程:
1)销售出某MTO的产品A
2)销售单(SO:Sale Order)确认时候,系统自动生成产品A的补货单(PO:Procurement Order)
3)该PO导致系统生成产品A的制造单(MO:Manufacturing Order)
4)随着该MO的执行,系统会根据BOM计算产品零部件的补货单
5)零部件补货单会导致系统生成库间移动单(INT:Internal Moves,相当于领料单)
6)如果零部件是MTO的产品,该INT又会触发新的PO及MO,如果该零部件是MTS的,且库存不足领料数量,则系统将处于待料状态(Waiting)
7)待料状态下,等待一天后,最小库存规则会自动引发该零部件的补货单,该补货单又会产生采购单(PO:Purchase Order)
8)采购员确认系统生成的采购单,且采购零部件入库后,待料状态结束,生产可以继续进行。
从上述补货过程可以看出,有多种原因会导致补货过程中断(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,依次发生业务:1)采购入库自行车10辆,入A库位;2)销售出库自行车5辆,从A库出;3)月末盘点盘亏1辆自行车。
当确认上述库存移动时候,系统会自动生成如下会计分录:
1)采购入库
产品  |数量 | 源库位  | 目标库位
自行车  | 10  | Supplier  | A库位
会计分录
借:库存商品 - A库  2000
贷:外库  2000
2)销售出库
产品  |数量 | 源库位  | 目标库位
自行车  | 5  | A库位  | Customer
会计分录
借:外库  1000
贷:库存商品 - A库  1000
3)盘亏
产品  |数量 | 源库位  | 目标库位
自行车  | 1  | A库位  | 盘点库位
会计分录
借:盘库  200
贷:库存商品 - A库  200
从系统的记录中,库管经理很容易得出结论:A库位4辆(10辆-5辆-1辆),盘点库位1辆。
财务经理很容易得出结论:A库位价值800元(2000元-1000元-200元),盘点库位价值200元。
盘点库位的价值表示盘亏了200元。

一天就写这么多,好样的!
以下三处值得商榷:
仓库是我们通常说的实际“仓库”。一个实际仓库中,通常分为若干货区,如成品区、原料区、废品区,货区还分货架、货层等,货区、货架等形成树状层次结构,这个层次结构在OE中可以用库位建模。
补货库位(Procurement): 产品补货单(Procurement Order,这个概念很重要,后面再讲)引起的库存移动的“临时”源库位或目标库位。当系统初次生成补货单时候,系统不能确定补货的来源(不确定是通过购买还是通过生产补货)。只有当系统运行完补货调度计划(Procurement Scheduler)后,才知道补货来源。默认情况下,系统每天运行一次补货调度计划,当然,你可以在任何时候手动执行补货调度计划。补货库位用于初次生成的补货单中的库存移动。
该库位库存数量应为零。是一种虚拟库位。
按库存生产(Make to Stock): 表示从仓库取货供给客户的产品,如分销商的情况,或者季节性产品。
按订单生产(Make to Order): 表示有销售订单时,根据订单去采购或生产的产品,该种产品不会入库。

楼上的大大也没有写哪些地方值得商榷。
五、产品补货(Procurement)
销售缺货时需要及时“补货”,这个补货过程在OE里叫产品补货(Procurement)。OE的补货,是通过手动或自动生成补货单(Procurement Order)来实现。有多种情况会引发补货:
1)仓管员发现某产品库存太低,他可以手动生成一张补货单(Procurement Order)。在产品画面,右边有个“Make Procurement”链接,当查看库存时发现产品库存太低,可以点击该链接手工填写补货单。
2)按库存生产(Make to Stock)的产品,当该产品库存低于最低库存(minimum stock rules)时,系统会自动生成补货单。系统有一个批处理Job,该Job会定期执行(默认为一天一次),该Job根据设定的最低库存规则(minimum stock rules),如果库存不够时,自动生成补货单。
3)按订单生产(Make to Order)的产品,确认销售订单时候,系统会自动生成补货单。
4)按库存生产(Make to Stock)的产品,根据主生产计划(master production schedule)生成补货单。
疑问下:
1、为什么2)跟4)有些不同呢,是否是2)的供应方法是buy而4)的供应方法为MRP?
2、产品补货会自动生成补货单,请问补货单跟采购订单是一样的概念吗?如果是一样的,那么,多张自动生成的补货单中如果供应商相同,会不会合并采购呢?
向老大说明,OE还没有用过,所以问的问题可能有点白,请见谅!

1、为什么2)跟4)有些不同呢,是否是2)的供应方法是buy而4)的供应方法为MRP?
2)是系统自动运算产生补货单,4)是在画面“Master Procurement Schedule”上点击按钮“Procure Incoming Left”时候,系统生成的补货单(系统计算“期末计划库存”与“实有库存”之差额数量,生成补货单补足差额)。“Master Procurement Schedule”表单用于物流主管计划期间物流进出数量。该功能需要安装模块Stock_Planning,访问菜单是:Warehouse -> Stock Planning -> Master Procurement Schedule。
> 2、产品补货会自动生成补货单,请问补货单跟采购订单是一样的概念吗?如果是一样的,那么,多张自动生成的补货单中如果供应商相同,会不会合并采购呢?
补货单跟采购订单不是一个概念,如果产品的供应方式是Buy,系统会根据补货单会产生相应的采购单,如果产品供应方式是Produce,系统根据补货单产生制造单(MO)。
由补货单产生的采购单,系统不会自动将供应商相同的单子合并到一起,但有附加模块(merge_picking)允许用户手工合并单子。

这里值得商榷:
库位的Stock Input Account:产品入该库位时,入库分录的借方。该参数通常是“库存商品”下的以库位名命名的二级科目,如“A库”。但如果是“盘点库位”或“生产库位”,不要设置成“库存商品”的二级科目,你可以设置该参数为“盘点库”、“生产库”,或者不设。
库位的Stock Output Account:产品出该库位时,出库分录的贷方。该参数通常也是“库存商品”下的以库位名命名的二级科目,如“A库”。
------------------------------------------
6.0这里和5.0不太一样。
在5.0里只能对库位设置一个会计科目,也就是入库出库用同一个科目。
在6.0里可以针对某个库位的出库和入库分别设置科目。这样就更灵活了。
在库位上设置科目一般来说只适用于虚拟库位。比如盘存、客户、供应商、生产这些,而对物理库位比如stock极其子库位我们一般不设置科目。

时间: 2024-10-29 00:09:31

openerp 6.0.2库存业务的相关文章

Openerp 7.0 附件存储位置

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58         我们知道对OpenERP中的每个内部对象(比如:业务伙伴,采购订单,销售订单,发货单,等等)我们都可以添加任意的附件,如图片,文档,视频等.那么这些附

JavaScript ,Css and Jquery In OpenERP 7.0

From: http://openerpbay.blogspot.jp/2013/02/javascript-css-and-jquery-in-openerp-70.html Hi fellows,                Here i'm showing how can you use  JavaScript ,Css and Jquery In OpenERP 7.0.There is one cool feature added in openERP 7.0 in which yo

Tags Used In OpenERP 7.0

In OpenERP 7.0. the form view of each object has been redesigned so that the object the user is working on resembles a real document. So, now when a user is creating an invoice, the document which appears on his screen actually looks like a hard copy

.net core 3.0 Signalr - 07 业务实现-服务端 自定义管理组、用户、连接

## Hub的管理 - 重写OnConnectedAsync 从连接信息中获取UserId.Groups,ConnectId,并实现这三者的关系,存放于redis中 [代码请查看](https://github.com/xiexingen/CTS.Signalr/blob/master/CTS.Signalr.Server/Hubs/NotifyHub.cs) ``` C# using CTS.Signalr.Server.Cores; using CTS.Signalr.Server.Dtos

.net core 3.0 Signalr - 06 业务实现-业务分析

## 业务需求 1. 人-项目关系 一个人可以属于多个项目,一个项目可以有多个人加入,通知的时候,可以通知项目内的所有人,也可以通知部分人或者某个责任人. 2. 登录互斥 同一个人不允许登录两次(不同浏览器或者不同电脑登),后面登录的会将前面登录的人挤下线. 3. 聊天 可以私聊.也可以创建群聊.上线通知(多个连接的情况) 4. 文件下载 用户在界面上选择了多个文件,然后选择批量打包下载,后端后台线程进行压缩.压缩完成后通过signalr通知该用户(的某个连接,比如当前用户开了多个tab页,应该

.net core 3.0 Signalr - 08 业务实现-客户端demo

由于signalr作为一个单独的推送系统,跟业务系统是分离开的,所以此处模拟一个业务系统,新建一个.net core app项目 ## 模拟实现一个登录功能 我们的登录很简单,当进入系统,如果检测到用户未登录则跳转到登录页面,用户只需要输入用户名点击登录即算登录成功 - 配置ConfigServices方法 [查看代码](https://github.com/xiexingen/CTS.Signalr/blob/master/CTS.Signalr.Client/Startup.cs#L41-L

OpenERP 7.0 导入 FAQ

Frequently Asked Questions Need to import data from an other application? In order to re-create relationships between different records, you should use the unique identifier from the original application and map it to the ID column in OpenERP. When y

Odoo 的库存管理与OpenERP之前的版本有了很大的不同,解读Odoo新的WMS模块中的新特性

原文来自:http://shine-it.net/index.php/topic,16409.0.html 库存移动(Stock Move)新玩法Odoo的库存移动不仅仅是存货在两个“存货地点”之间的移动的基本概念了,他们可以被“串联”在一起,可以用来生成或改变其对应的拣货单(Picking).链式库存移动被广泛应用在各类库存操作中比如:多步收货或多步发货操作,多仓库间的配.补货操作等:而不仅限于之前OpenERP中MTO供货类型产品的发货等待对应供应商收货这样的链式库存移动的应用场景了.我们会

ecshop 秒杀并发时库存会被减到小于0的解决办法

ecshop 秒杀并发时库存会被减到小于0更新库存后,再进行库存检查,如果库存为负数,则执行事务的回滚. begin();//开始一个事物处理开始 $sql = "UPDATE ".$GLOBALS['a']->table('seconds_kill')." SET kill_stock = kill_stock - 1 WHERE sk_id='".$sk_id."' LIMIT 1" ; $GLOBALS['db']->query