# nuoda **Repository Path**: zhjrate/nuoda ## Basic Information - **Project Name**: nuoda - **Description**: No description available - **Primary Language**: Python - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2024-08-06 - **Last Updated**: 2024-08-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README <<<<<<< HEAD ### 修改原有的发票功能 - 调拨单不直接生成发票 √ - 每条调拨单明细生成一张对应的预发票明细 √ - 在调拨完成后,根据实际数量来生成 √ - 勾选预发票明细生成发票 √ - 发票和调拨单关联(确保系统原有功能正常) √ - 销售单上选择批次,并自动写入调拨单 √ - 发票红冲和审核。 - 要考虑退货: - 从调拨单上发起退货,完成退货的调拨单后仍然按正常流程生成发票明细(退货类型,值是负值) - 有了退货之后,原发票可以选择整张取消重新开具(发票完成支付后不能再取消,因此这种整张红冲只能发生在未支付 的情形下。完成支付的发票可以回到未支付状态),也可以新增一张红字发票 - 采购、采购上的赠品金额可以为0,可以不为0,如果为0则没有入库凭证,否则有(科目需要改,科目需要可以配置)。 √ - 无论如何都要带入到供应商账单、客户发票上去(具体金额如何分配,待确认),金额为0 √ - 开票策略影响开票时间 √ - 批次号的自动填充问题:在点开明细按钮时,利用_get_available_quantity和_gather方法获取到捆包并选取足够的自动填充 - 增加保留env['stock.quant']._update_reserved_quantity, 和env['stock.move']._update_reserved_quantity - 取消保留向env['stock.quant']._update_reserved_quantity传入负值的数量即可。 - 在调拨单完成生成相应的会计凭证时, - 调用env['stock.move']._account_entry_move() - 在这个方法下,有使用env['stock.move']._get_accounting_data_for_valuation()获取科目、journal等信息 - 然后利用env['stock.move']._create_account_move_line()来创建account.move和account.move.line - 里面利用env['stock.move']._prepare_account_move_line()来准备account.move.line的参数 - 里面利用env['stock.move']._generate_valuation_lines_data()来准备借贷行参数(钩子函数!!) - 在发票验证生成凭证时, - 调用env['account.invoice'].action_move_create()来创建凭证 - 其中利用env['account.invoice'].invoice_line_move_line_get()来获取发票明细行对应凭证行(account.move.line)的参数 (包含安格鲁撒克逊会计相关销售和采购行) - 再利用env['account.invoice].tax_line_move_line_get()获取税务相关行参数account.move.line(这个是根据 发票左下角那个来采集的) - action_move_create()在上面两个方法的基础上还会额外增加一行 - 再利用env['product.product']._convert_prepared_anglosaxon_line()将借贷金额进行转换(比如贷方金额转成负值), 利用env['account.invoice'].group_lines()进行汇总,再汇集finalize_invoice_move_lines()钩子函数(这里!!) - 最后创建account.move并过账Post() - 库存价值的计算: - ['product.product']._compute_stock_value() - 搜索account.move.line按照product_id和account_id分组, - 每个组算出借方总和-贷方总和 - 每个组的总数量quantity和每个组的id - 然后根据product_id和StockMove._get_all_base_domain()的筛选条件搜索stock.move,按照product_id分组 - 计算每个组的remaining_value总和,记录每个组的ID - 记录每个产品对应的remaining_value总和 以及stock.move的id - 最后将产品的remaining_value总和记录到产品的stock_value字段(这就是库存总价值) - 根据产品所属分类上的库存计价科目和产品本身,获取到(借方总和-贷方总和),总数量quantity和ID 将account.move.line所属ID赋值给stock_fifo_real_time_aml_ids字段。 - 成本计算,当确认真实成本时(录入发票、确认分摊等动作)需要修改如下凭证:产品入库凭证、产品库存价值、产品销售出库凭证、产品销售会计凭证 - 如果库存计价 是“手动”则不需要改动。 - 如果成本方法是“先进先出”就可以直接定位到凭证,而如果是平均成本,就需要手动定位。 - JBL: - 生产入库:直接创建待分摊金额的凭证,借方科目取产品类别库存计价科目(原价值2,摊10元给此产品),贷方科目新建字段(制造费用10) - 销售出库凭证,借方科目商品类别的库存出货科目(多10元),贷方是库存计价科目。 - 发票凭证,借方科目产品类别的费用科目,贷方科目产品类别的库存出货科目 - 采购入库,如果发票金额多了,借方库存计价科目(发票多出的金额),贷方库存进货科目。如果发票金额少了,借方库存进货科目,贷方库存计价科目。 - 库存移动表stock.move上额外新增字段记录分摊的金额 - 获取期间到制造费用 - 搜索对于期间的生产单,获取要分摊的费用 - 然后要改三个地方,生产入库凭证、销售出库凭证、销售会计凭证 - 先找到生产单对于的入库凭证,通过生产单stock_move_line.move_id.production_id or stock_move_line.move_id.raw_material_production_id, 找到对应的stock.move.line,再找到stock.move,通过stock.move的account_move_ids找到对于的account.move - 再找到销售的出库凭证,通过销售明细的move_ids找到stock.move,通过stock.move的account_move_ids找到对于的account.move - 再找到销售的会计凭证,通过销售单的invoice_ids找到account.invoice,再根据move_id找到account.move - 遍历生产单对应的入库单明细,根据数量计算分摊的费用 - 搜索此产品、此期间、特定科目、并且是已过帐的客户日记账的会计凭证,并修改价格 #### 与WMS系统交互的时间点 - 各种基础数据的同步 - 销售、采购生成的调拨单的同步。 - WMS里已存在的接口 - 新增或修改商品资料: - ERP系统新增或修改商品时触发该接口,可以批量 - CustomerID是公司??SKU是产品编码,两者确定唯一的一个产品来决定是新增还是修改原有的(必填). - Descr_C是产品名称(必填)。ShelfLife是有效期。ReservedField12批准文号有效期至。FreightClass货物类型。 SpecialMaintenance是否重点养护。MedicineSpecicalControl是否特殊商品。SerialNoCatch是否采集序列号。 Alternate_SKU1 69条形码。Alternate_SKU2 ERP 货品代码。Alternate_SKU3规格。Alternate_SKU4生产厂家 ApprovalNo批准文号。 - 新增或修改客商资料: - 当ERP系统新增或修改供应商或收货公司时触发该接口,可批量 - CustomerID,Customer_Type(CO, VE)两个字段来唯一确定一个合作伙伴。Descr_C名称。此三个字段必填 - Descr_E编码。Address1地址。Contact1联系人1。Contact1_Title联系人职位。Contact1_Email联系人emai。 - 入库单:采购订单、销售退货通知、寄售退货通知单、其它入库 - 当ERP系统新增到货入库单时触发该接口,注意如果需要修改采购入库单重新下达则需要先调用【4.5取消入库单接口】取消原单,重新下单完整单据。可批量 - PONo采购订单号。POType订单类型(类型代码)??。CustomerID货主 ID(货主公司代码)????这三个字段必填。 - ExpectedArriveTime1预期到货时间。POReference1 ERP 采购订单号。SupplierID 供应商 ID。Supplier_Name供应商名称。 H_EDI_09 ERPID。WarehouseID所属仓库。 - 明细行 CustomerID货主ID。SKU ERP 产品代码。OrderedQty 订单数量。OrderedQty_Each 订单数量(最小包装数量)。 LotAtt05 批准文号。LotAtt06 供应商。LotAtt07产品状态是否良品。D_EDI_08 ERP 行号。D_EDI_09 ERPID。 - 出库单:销售发货通知单、采购退料通知单、销毁出库、寄售出库、其它出库 - 系统新增到销售出库单时触发该接口,注意如果需要修改销售出库单重新下达则需要先调用【4.6 取消出库单接口】取消原单,重新下单完整单据。可批量 - OrderNo订单号。OrderType订单类型。CustomerID货主 ID(货主代码)???SOReference1(ERP 采购订单号。OrderTime订单创建时间 SOReference2参考编号2??ConsigneeID收货人 ID。ConsigneeName收货人名称。C_Address1地址1。C_Address2地址2(区县)。 WarehouseID仓库 ID。Priority订单优先级别。以上字段全部必填 - Notes备注(顾客留言)。 - 明细行:LineNo行号。CustomerID 客户编号。SKU产品。QtyOrdered订货数,QtyOrdered_Each订货数(最小包装数) UserDefine1仓库。这几个必填。 LotAtt01生产日期。LotAtt02失 效 日 期。LotAtt03入 库 日 期。LotAtt04批号。 - 入库取消:初始状态下可以取消 - ERP系统所有取消仓储入库作业的单据时统一调用该接口。不可批量 - OrderNo入库单号。OrderType入库单类型。CustomerID货主 ID。WarehouseID仓库 ID。均必填 - 出库取消:初始状态下可以取消,复核前手动回退到初始状态可取消,复核后需做销售退货流程; - ERP系统所有取消仓储出库作业的单据时统一调用该接口,不可批量 - OrderNo出库单号。OrderType出库单类型。CustomerID货主 ID。WarehouseID仓库 ID。均必填 - 入库明细查询,可批量 - 当WMS系统完成到货入库作业后,调用此接口将到货入库结果推送至ERP系统(也就是之前WMS回写至ERP是通过ERP主动查询来实现的) - 返回字段(应该)有:OrderNo来源单据号。OrderType来源单据类型。CustomerID货主 ID。Udf1 WMS 订单号。 明细行字段:SKU产品。ReceivedQty实收数量。ReceivedTime收 货 时 间。 - 出库明细查询 - 当WMS系统完成销售出库作业后,调用此接口将销售出库结果推送至OMS系统(也就是之前WMS回写至ERP是通过ERP主动查询来实现的)。 - 返回字段:OrderNo来源单据号。OrderType来源单据类型。CustomerID货主 ID。WarehouseID仓库 ID。 明细行:OrderNo来源订单号。LineNo来源行号。SKU产品。QtyShipped实收发运数量。ShippedTime实 际 发 运 时 间。 Lotatt01生产日期。Lotatt02失效日期 - 库存调整单查询:盘盈单、盘亏单 - 当WMS系统完成库存调整作业后,及时将库存调整结果推送至ERP系统,可批量 - 返回字段有:OrderNo单号。OrderType单据类型(盘盈调整单、盘亏调整单)。CustomerID货主 ID。 WarehouseID仓库 ID。ResonCode调整原因。 明细行:SKU产品。Qty调整数量。Time调整时间。 - 库存转移明细查询:批次调整单调整批次,状态调拨单(不合格情况:ERP 生成不合格品登记单) - 当WMS系统完成库存转移作业后,及时将库存转移结果推送至ERP系统 - 返回字段:OrderNo单号。OrderType单据类型。CustomerID货主 ID。WarehouseID仓库 ID。Udf1批次增 加或批次减少标记。 明细行:SKU产品。Qty数量。Time转移时间 - 库存移动单明细回传: - 当WMS系统完成库存移动作业后,及时将库存移动结果推送至ERP系统。特别用于从水土仓库、大坪仓库相互调货,支持批量 - 返回字段:OrderNo单号。OrderType单据类型(转仓单)。CustomerID货主 ID。WarehouseID仓库 ID。ResonCode调整原因。 明细行:SKU产品。Qty移动数量。Time调整时间。FMLOC转出库位。TOLOC转入库位。FMWH转出仓库。TOWH转入仓库。 - ### WMS疑问总结: - CustomerID到底是什么 - 在客商资料里,他代表客户的唯一标识 nd_customer_code或者nd_supplier_code - 在产品里,他代表此产品的货主 customer_id - 在出入库单里,他代表货主 customer_id.nd_customer_code或者nd_supplier_code - 产品资料里的重点养护、货物类型, 是否采集序列号 - 客商资料里的Customer_Type和ODOO里的差异,联系人 - 入库单的订单类型??货主具体是谁 - 出库单的订单类型?? - 产品资料 - 产品单位描述 - 产品货物类型 就是类别 - 重点养护:普通养护6个月养护一次,重点养护3个月养护一次 - 首营状态:是否审核 - 剂型: - - 客商 - CustomerID 唯一编号 - 入库单 - PONo 入库单号 - 入库可能分多次 - POType 单据类型,具体问他们要 - CustomerID 入库货主,多公司的公司 - ERPID,可以不穿 - warehouseID:WH01 - LineNo 可以不穿 - 批准文号 需要 - 供应商 不需要传 - 明细需要确保产品没有多行 # 出库单 - 一个SKU只能选一个批次号,可以不传 - 入库单取消,在有回传信息之后,不能再取消 - 库存转移明细查询 适用于入库属性的变动,比如入库时间,FROM代表原信息 TO代表新信息 ### - 公共参数: - 入库明细推送(入库结果推送) - POST /api/in_stock/ - 参数: - purchase_id: Integer,必填,采购单ERP ID - picking_id: Integer, 可选,入库单的ERP ID (如果为空,则此入库单视作是新的欠单(入库单没有一次性完成而产生的新的待完成入库单)) - wms_no: wms单号,可选 - picking_lines: 必填,哈希表组成的列表,入库明细内容 - line_id: integer, 可选,入库明细行的ERP ID(欠单不填) - product_code: char, 必填,产品唯一编码(SKU) - date: datetime, 可选,收 货 时 间 ,YYYY-MM-DD HH:MM:SS格式,如果不填则默认当前时间 - warehouse: char, 必填,入库位置 - lot_lines: 必填,映射表组成的列表,入库批次信息, - lot_no: string,批次号,必填 - qty_done: float, 必填,实收数量 - uom:char,可选,单位,如果不填将使用采购单上的单位 - production_date: datetime,必填,生产日期 - expire_date: datetime, 必填,过期日期 - 例如:{ 'purchase_id': 15, 'picking_id': 20, 'wms_no': 'xx01', 'picking_lines': [{ 'line_id': 151, 'product_code': 'ASPL', 'date': '2020-06-14 15:02:02', 'warehouse': 'WH01', 'lot_lines': [{ 'lot_no': 'A0001', 'qty_done': 100, 'uom': '件', 'production_date': '2020-04-14 16:02:02', 'expire_date': '2021-04-14 16:02:02', }, { 'lot_no': 'A0002', 'qty_done': 20, 'uom': '件', 'production_date': '2020-04-14 16:02:02', 'expire_date': '2021-04-14 16:02:02', }] }, { 'line_id': 152, 'product_code': 'HLY', 'date': '2020-06-14 15:02:02', 'warehouse': 'WH01', 'lot_lines': [{ 'lot_no': 'A0003', 'qty_done': 10, 'uom': '件', 'production_date': '2020-03-14 16:02:02', 'expire_date': '2022-03-14 16:02:02', }] } ] } - 返回: - code: string,状态码,0代表成功,1代表失败 - msg:string,信息描述,描述错误原因 例如:{ "code": "1", "msg": "入库单已完成,不能重复操作!"} - 说明:对于欠单(没有一次性完成的入库生成的新的入库单),不填写picking_id 和 明细行的line_id参数, 因为推送的时候ERP系统里还不存在欠单,ERP收到这样的欠单,会新建入库单并完成入库。对于非欠单情况,ERP将在 相应的入库单上的相应明细行上更新相应信息,并完成入库,(注意,同一采购单首次确认入库之后的所有入库单都应 视作欠单)。 - 出库明细推送(出库结果推送) - POST /api/out_stock/ - 参数: - sale_id: Integer,必填,销售单ERP ID - picking_id: Integer, 可选,出库单的ERP ID (如果为空,则此出库单视作是新的欠单(出库单没有一次性完成而产生的新的待完成出库单)) - wms_no: wms单号,可选 - picking_lines: 必填,映射表组成的列表,出库明细内容 - line_id: integer, 可选,出库明细行的ERP ID(欠单不填) - product_code: char, 必填,产品唯一编码(SKU) - date: datetime, 可选,发货时间 ,YYYY-MM-DD HH:MM:SS格式,如果不填将默认为当前时间 - warehouse: char, 必填,出库位置 - lot_lines: 必填,映射表组成的列表,出库批次信息 - lot_no: string,必填,批次号 - qty_done: float, 必填,实发数量 - uom:char,可选,单位,如果不填将使用销售单上的单位 - 例如(这是欠单的情况):{ 'sale_id': 15, 'picking_id': False, 'wms_no': 'xy01', 'picking_lines': [{ 'line_id': False, 'product_code': 'ASPL', 'date': '2020-06-14 15:02:02', 'warehouse': 'WH01', 'lot_lines': [{ 'lot_no': 'A0001', 'qty_done': 10, 'uom': '件', }, { 'lot_no': 'A0005', 'qty_done': 5, 'uom': '瓶', }] }, { 'line_id': False, 'product_code': 'HLY', 'date': '2020-06-14 15:02:02', 'warehouse': 'WH01', 'lot_lines': [{ 'lot_no': 'A0003', 'qty_done': 10, 'uom': '件', }] } ] } - 返回: - code: string,状态码,0代表成功,1代表失败 - msg:string,信息描述,描述错误原因 例如:{ "code": "0", "msg": "操作成功!"} - 说明:对于欠单(没有一次性完成的出库生成的新的出库单),不填写picking_id 和 明细行的line_id参数, 因为推送的时候ERP系统里还不存在欠单,ERP收到这样的欠单,会新建出库单并完成出。对于非欠单情况,ERP将在 相应的出库单上的相应明细行上更新相应信息,并完成出库,(注意,同一销售单首次确认出库之后的所有出库单都应 视作欠单)。 - 库存调整明细推送(库存调整) - POST /api/inventory/ - 参数: - product_code: string, 必填,产品唯一编码(SKU) - date:datetime,可选,调整时间,不填则默认当前时间 - company_id: string, 调整的货物所属的公司 - wms_no: string, wms单据号 - lot_lines: 必填,映射表组成的列表,调整批次信息 - lot_no: string,必填,批次号 - real_qty: float, 必填,调整后的数量(不是调整数量) - uom:char,可选,单位,如果不填将使用入库时批次上的单位 - 例如:{ 'product_code': 'HLY', 'date': '2020-06-14 15:02:02', 'company_id': '诺达公司1', 'wms_no': 'tz01', 'lot_lines': [{ 'lot_no': 'A0001', 'real_qty': 15, 'uom': '件', }, { 'lot_no': 'A0005', 'real_qty': 5, 'uom': '瓶', }] } - 返回: - code: string,状态码,0代表成功,1代表失败 - msg:string,信息描述,描述错误原因 - 例如:{ "code": "0", "msg": "操作成功!"} - 说明:库存调整需要根据每个批次来调整,输出的数量是调整后的真实数量。 - 库存转移明细推送 - POST /api/update_stock/ 。。。 - 内部移库 - POST /api/internal_stock/ - 参数: - product_code: string, 必填,产品唯一编码(SKU) - date:datetime,可选,调整时间,不填则默认当前时间 - wms_no: string, wms单据号 - location: string, 源位置 - location_dest: string. 目的位置 - lot_lines: 必填,映射表组成的列表,内部调拨批次信息 - lot_no: string,必填,批次号 - qty_done: float, 必填,调拨数量 - uom:char,可选,单位,如果不填将使用入库时批次上的单位 - 返回: - code: string,状态码,0代表成功,1代表失败 - msg:string,信息描述,描述错误原因 - 例如:{ "code": "0", "msg": "操作成功!"} - 说明:内部移库,因为位置属于仓库之内,因此只需要位置信息即可。 {'method': 'putSOData', 'client_db': 'FLUXWMSJSON', 'messageid': 'SO', 'client_customerid': 'FLUXWMSJSON', 'apptoken': '80AC1A3F-F949-492C-A024-7044B28C8025', 'appkey': 'test', 'timestamp': datetime.date(2021, 3, 31), 'data': '{"xmldata": {"header": [{"OrderNo": 647, "OrderType": "PT", "CustomerID": "K00003", "RequiredDeliveryTime": "2021-03-31 01:01:36", "ConsigneeID": "K00027", "ConsigneeName": "\\u91cd\\u5e86\\u4e5d\\u8c26\\u79d1\\u6280\\u6709\\u9650\\u516c\\u53f8", "WarehouseID": "WH01", "Priority": "1", "Notes": "", "detailsItem": [{"LineNo": "", "D_EDI_05": 2226, "CustomerID": "K00003", "SKU": "105-005708-00", "QtyOrdered": 0.0, "QtyOrdered_Each": 0.0, "D_EDI_08": "\\u74f6", "UserDefine1": "WH01", "LotAtt04": "2021012612", "LotAtt08": "N", "LotAtt01": "2021-01-26", "LotAtt02": "2022-01-25", "LotAtt03": "2021-03-01"}, {"LineNo": "", "D_EDI_05": 2227, "CustomerID": "K00003", "SKU": "105-012232-00", "QtyOrdered": 0.0, "QtyOrdered_Each": 0.0, "D_EDI_08": "\\u7bb1", "UserDefine1": "WH01", "LotAtt04": "2020120904", "LotAtt08": "N", "LotAtt01": "2020-12-09", "LotAtt02": "2023-12-08", "LotAtt03": "2021-03-01"}, {"LineNo": "", "D_EDI_05": 2228, "CustomerID": "K00003", "SKU": "105-012241-00", "QtyOrdered": 0.0, "QtyOrdered_Each": 0.0, "D_EDI_08": "\\u7bb1", "UserDefine1": "WH01", "LotAtt04": "2021012803", "LotAtt08": "N", "LotAtt01": "2021-01-28", "LotAtt02": "2023-01-27", "LotAtt03": "2021-03-18"}, {"LineNo": "", "D_EDI_05": 2229, "CustomerID": "K00003", "SKU": "105-012257-00", "QtyOrdered": 0.0, "QtyOrdered_Each": 0.0, "D_EDI_08": "\\u7bb1", "UserDefine1": "WH01", "LotAtt04": "2020121602", "LotAtt08": "N", "LotAtt01": "2020-12-16", "LotAtt02": "2021-12-15", "LotAtt03": "2021-03-01"}]}]}}', 'sign': 'MWEZNGVHOGVKM2M0Y2ZLYJJLODI5NDA3YZU4NDDMOTG%3D'} ======= # nuoda #### 介绍 {**以下是 Gitee 平台说明,您可以替换此简介** Gitee 是 OSCHINA 推出的基于 Git 的代码托管平台(同时支持 SVN)。专为开发者提供稳定、高效、安全的云端软件开发协作平台 无论是个人、团队、或是企业,都能够用 Gitee 实现代码托管、项目管理、协作开发。企业项目请看 [https://gitee.com/enterprises](https://gitee.com/enterprises)} #### 软件架构 软件架构说明 #### 安装教程 1. xxxx 2. xxxx 3. xxxx #### 使用说明 1. xxxx 2. xxxx 3. xxxx #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/) >>>>>>> 045af18e17bd27c8ad3eec1a3133f52ae676467f