快速访问\n"
#: erpnext/projects/workspace/projects/projects.json
#: erpnext/quality_management/workspace/quality/quality.json
#: erpnext/setup/workspace/home/home.json
-#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json
#: erpnext/support/workspace/support/support.json
msgid "Your Shortcuts"
msgstr "快速访问"
-#: erpnext/accounts/doctype/payment_request/payment_request.py:995
+#: erpnext/accounts/doctype/payment_request/payment_request.py:1002
msgid "Grand Total: {0}"
msgstr "总计: {0}"
-#: erpnext/accounts/doctype/payment_request/payment_request.py:996
+#: erpnext/accounts/doctype/payment_request/payment_request.py:1003
msgid "Outstanding Amount: {0}"
msgstr "未清金额: {0}"
@@ -1238,7 +1239,7 @@ msgstr "收货数量(库存单位)"
#. Label of the qty (Float) field in DocType 'Purchase Receipt Item'
#. Label of the qty (Float) field in DocType 'Subcontracting Receipt Item'
-#: erpnext/public/js/controllers/transaction.js:2799
+#: erpnext/public/js/controllers/transaction.js:2795
#: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
#: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json
msgid "Accepted Quantity"
@@ -1271,7 +1272,7 @@ msgstr "服务商{0}必须提供访问密钥"
msgid "According to CEFACT/ICG/2010/IC013 or CEFACT/ICG/2010/IC010"
msgstr "依据CEFACT/ICG/2010/IC013或IC010标准"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:938
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:939
msgid "According to the BOM {0}, the Item '{1}' is missing in the stock entry."
msgstr "根据物料清单{0},库存交易缺少物料'{1}'"
@@ -1506,7 +1507,7 @@ msgstr "请输入科目以获取收付款凭证"
msgid "Account is not set for the dashboard chart {0}"
msgstr "尚未为统计图表{0}设置科目"
-#: erpnext/assets/doctype/asset/asset.py:824
+#: erpnext/assets/doctype/asset/asset.py:883
msgid "Account not Found"
msgstr "未找到科目"
@@ -1623,7 +1624,7 @@ msgstr "科目{0}只能通过库存相关业务更新"
msgid "Account: {0} is not permitted under Payment Entry"
msgstr "收付款凭证中不能使用科目{0}"
-#: erpnext/controllers/accounts_controller.py:3261
+#: erpnext/controllers/accounts_controller.py:3263
msgid "Account: {0} with currency: {1} can not be selected"
msgstr "科目:{0}货币:{1}不能选择"
@@ -1896,18 +1897,18 @@ msgstr "辅助核算过滤条件"
msgid "Accounting Entries"
msgstr "会计分录"
-#: erpnext/assets/doctype/asset/asset.py:858
-#: erpnext/assets/doctype/asset/asset.py:873
-#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:561
+#: erpnext/assets/doctype/asset/asset.py:917
+#: erpnext/assets/doctype/asset/asset.py:932
+#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:562
msgid "Accounting Entry for Asset"
msgstr "资产会计分录"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1882
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1902
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1883
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1903
msgid "Accounting Entry for LCV in Stock Entry {0}"
msgstr "库存凭证{0}中LCV的会计分录入账"
-#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:867
+#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:873
msgid "Accounting Entry for Landed Cost Voucher for SCR {0}"
msgstr "SCR{0}到岸成本凭证的会计分录入账"
@@ -1927,9 +1928,9 @@ msgstr "服务会计凭证"
#: erpnext/controllers/stock_controller.py:683
#: erpnext/controllers/stock_controller.py:700
#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:932
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1827
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1841
-#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:702
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1828
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1842
+#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:708
msgid "Accounting Entry for Stock"
msgstr "库存会计分录"
@@ -1963,7 +1964,7 @@ msgstr "会计主数据"
msgid "Accounting Period"
msgstr "会计期间"
-#: erpnext/accounts/doctype/accounting_period/accounting_period.py:67
+#: erpnext/accounts/doctype/accounting_period/accounting_period.py:68
msgid "Accounting Period overlaps with {0}"
msgstr "会计期间与{0}重叠"
@@ -2002,7 +2003,7 @@ msgstr ""
#: erpnext/setup/doctype/email_digest/email_digest.json
#: erpnext/setup/doctype/incoterm/incoterm.json
#: erpnext/setup/doctype/supplier_group/supplier_group.json
-#: erpnext/setup/install.py:325
+#: erpnext/setup/install.py:337
msgid "Accounts"
msgstr "会计"
@@ -2154,7 +2155,7 @@ msgstr "累计折旧科目"
#. Label of the accumulated_depreciation_amount (Currency) field in DocType
#. 'Depreciation Schedule'
#: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:178
-#: erpnext/assets/doctype/asset/asset.js:289
+#: erpnext/assets/doctype/asset/asset.js:302
#: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json
msgid "Accumulated Depreciation Amount"
msgstr "累计折旧额"
@@ -2309,6 +2310,11 @@ msgstr "有效销售线索"
msgid "Active Status"
msgstr "在产状态"
+#. Label of a number card in the Subcontracting Workspace
+#: erpnext/subcontracting/workspace/subcontracting/subcontracting.json
+msgid "Active Subcontracted Items"
+msgstr ""
+
#. Label of the activities_tab (Tab Break) field in DocType 'Lead'
#. Label of the activities_tab (Tab Break) field in DocType 'Opportunity'
#. Label of the activities_tab (Tab Break) field in DocType 'Prospect'
@@ -2397,7 +2403,7 @@ msgstr "实际需求"
#: erpnext/manufacturing/doctype/job_card/job_card.json
#: erpnext/manufacturing/doctype/work_order/work_order.json
#: erpnext/manufacturing/report/work_order_summary/work_order_summary.py:254
-#: erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py:115
+#: erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py:129
msgid "Actual End Date"
msgstr "实际结束日期"
@@ -2530,7 +2536,7 @@ msgstr "实际工时(通过工时表)"
msgid "Actual qty in stock"
msgstr "实际库存数量"
-#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1526
+#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1521
#: erpnext/public/js/controllers/accounts.js:197
msgid "Actual type tax cannot be included in Item rate in row {0}"
msgstr "实际税额不能包含在第{0}行的物料单价中"
@@ -2716,7 +2722,7 @@ msgid "Add details"
msgstr "添加明细"
#: erpnext/stock/doctype/pick_list/pick_list.js:86
-#: erpnext/stock/doctype/pick_list/pick_list.py:866
+#: erpnext/stock/doctype/pick_list/pick_list.py:882
msgid "Add items in the Item Locations table"
msgstr "请在拣货明细表中添加物料"
@@ -3002,7 +3008,7 @@ msgstr "额外工费成本"
msgid "Additional Transferred Qty"
msgstr "额外调拨数量"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:665
+#: erpnext/manufacturing/doctype/work_order/work_order.py:660
msgid "Additional Transferred Qty {0}\n"
"\t\t\t\t\tcannot be greater than {1}.\n"
"\t\t\t\t\tTo fix this, increase the percentage value\n"
@@ -3015,7 +3021,7 @@ msgstr "额外调拨数量{0}不得超过{1}。要修复此问题,请提高制
msgid "Additional information regarding the customer."
msgstr "该客户的其他信息。"
-#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:584
+#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:590
msgid "Additional {0} {1} of item {2} required as per BOM to complete this transaction"
msgstr ""
@@ -3155,7 +3161,7 @@ msgstr "地址必须关联公司,请在链接表中添加公司记录"
msgid "Address used to determine Tax Category in transactions"
msgstr "业务交易用于决定税别的地址"
-#: erpnext/assets/doctype/asset/asset.js:146
+#: erpnext/assets/doctype/asset/asset.js:152
msgid "Adjust Asset Value"
msgstr "调整资产价值"
@@ -3164,7 +3170,7 @@ msgstr "调整资产价值"
msgid "Adjust Qty"
msgstr "调整数量"
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1112
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1108
msgid "Adjustment Against"
msgstr "源单"
@@ -3347,7 +3353,7 @@ msgstr "对方科目"
#: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
#: erpnext/accounts/report/bank_clearance_summary/bank_clearance_summary.py:39
#: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py:91
-#: erpnext/accounts/report/general_ledger/general_ledger.py:748
+#: erpnext/accounts/report/general_ledger/general_ledger.py:752
msgid "Against Account"
msgstr "对方科目"
@@ -3465,7 +3471,7 @@ msgstr "对应供应商发票{0}"
#. Label of the against_voucher (Dynamic Link) field in DocType 'GL Entry'
#: erpnext/accounts/doctype/gl_entry/gl_entry.json
-#: erpnext/accounts/report/general_ledger/general_ledger.py:781
+#: erpnext/accounts/report/general_ledger/general_ledger.py:785
msgid "Against Voucher"
msgstr "对销凭证"
@@ -3489,7 +3495,7 @@ msgstr "对销凭证号"
#: erpnext/accounts/doctype/advance_payment_ledger_entry/advance_payment_ledger_entry.json
#: erpnext/accounts/doctype/gl_entry/gl_entry.json
#: erpnext/accounts/doctype/payment_ledger_entry/payment_ledger_entry.json
-#: erpnext/accounts/report/general_ledger/general_ledger.py:779
+#: erpnext/accounts/report/general_ledger/general_ledger.py:783
#: erpnext/accounts/report/payment_ledger/payment_ledger.py:183
msgid "Against Voucher Type"
msgstr "对销凭证类型"
@@ -3627,7 +3633,7 @@ msgstr "全部活动"
msgid "All Activities HTML"
msgstr "所有活动HTML"
-#: erpnext/manufacturing/doctype/bom/bom.py:306
+#: erpnext/manufacturing/doctype/bom/bom.py:318
msgid "All BOMs"
msgstr "全部物料清单"
@@ -3767,15 +3773,15 @@ msgstr "所有物料已申请"
msgid "All items have already been Invoiced/Returned"
msgstr "所有物料已开具发票/退回"
-#: erpnext/stock/doctype/delivery_note/delivery_note.py:1207
+#: erpnext/stock/doctype/delivery_note/delivery_note.py:1208
msgid "All items have already been received"
msgstr "所有物料已收货"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:2992
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:2993
msgid "All items have already been transferred for this Work Order."
msgstr "所有物料已发料到该生产工单。"
-#: erpnext/public/js/controllers/transaction.js:2907
+#: erpnext/public/js/controllers/transaction.js:2903
msgid "All items in this document already have a linked Quality Inspection."
msgstr "本单据所有物料均已关联质检单"
@@ -3801,7 +3807,7 @@ msgstr "所有物料已退回"
msgid "All the required items (raw materials) will be fetched from BOM and populated in this table. Here you can also change the Source Warehouse for any item. And during the production, you can track transferred raw materials from this table."
msgstr "所需物料(原材料)将从BOM提取并填充本表,可修改物料的源仓库,生产过程中可在此追踪原材料转移"
-#: erpnext/stock/doctype/delivery_note/delivery_note.py:857
+#: erpnext/stock/doctype/delivery_note/delivery_note.py:858
msgid "All these items have already been Invoiced/Returned"
msgstr "所有物料已经开票/被退货"
@@ -3830,7 +3836,7 @@ msgstr "分配付款金额"
msgid "Allocate Payment Based On Payment Terms"
msgstr "基于付款条款分配付款金额"
-#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1716
+#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1711
msgid "Allocate Payment Request"
msgstr "分配付款请求"
@@ -3861,7 +3867,7 @@ msgstr "已分配"
#: erpnext/accounts/doctype/advance_taxes_and_charges/advance_taxes_and_charges.json
#: erpnext/accounts/doctype/bank_transaction/bank_transaction.json
#: erpnext/accounts/doctype/bank_transaction_payments/bank_transaction_payments.json
-#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1707
+#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1702
#: erpnext/accounts/doctype/payment_reconciliation_allocation/payment_reconciliation_allocation.json
#: erpnext/accounts/doctype/process_payment_reconciliation_log_allocations/process_payment_reconciliation_log_allocations.json
#: erpnext/accounts/doctype/purchase_invoice_advance/purchase_invoice_advance.json
@@ -4333,7 +4339,7 @@ msgstr "允许用户提交零数量销售订单,适用于费率固定但数量
msgid "Allows users to submit Supplier Quotations with zero quantity. Useful when rates are fixed but the quantities are not. Eg. Rate Contracts."
msgstr "允许用户提交零数量供应商报价,适用于费率固定但数量未定的场景(如:费率合同)。"
-#: erpnext/stock/doctype/pick_list/pick_list.py:1008
+#: erpnext/stock/doctype/pick_list/pick_list.py:1024
msgid "Already Picked"
msgstr "已经拣货"
@@ -4369,7 +4375,7 @@ msgstr "替代物料号"
msgid "Alternative Item Name"
msgstr "替代物料名称"
-#: erpnext/selling/doctype/quotation/quotation.js:362
+#: erpnext/selling/doctype/quotation/quotation.js:369
msgid "Alternative Items"
msgstr "替代物料清单"
@@ -4548,7 +4554,7 @@ msgstr "始终询问"
#: erpnext/manufacturing/doctype/bom_item/bom_item.json
#: erpnext/manufacturing/doctype/bom_scrap_item/bom_scrap_item.json
#: erpnext/manufacturing/doctype/work_order_item/work_order_item.json
-#: erpnext/selling/doctype/quotation/quotation.js:300
+#: erpnext/selling/doctype/quotation/quotation.js:307
#: erpnext/selling/doctype/quotation_item/quotation_item.json
#: erpnext/selling/doctype/sales_order_item/sales_order_item.json
#: erpnext/selling/page/point_of_sale/pos_item_cart.js:46
@@ -4811,7 +4817,7 @@ msgstr ""
msgid "Another Cost Center Allocation record {0} applicable from {1}, hence this allocation will be applicable upto {2}"
msgstr "成本中心分配记录{0}自{1}生效,当前分配有效期至{2}"
-#: erpnext/accounts/doctype/payment_request/payment_request.py:748
+#: erpnext/accounts/doctype/payment_request/payment_request.py:752
msgid "Another Payment Request is already processed"
msgstr "已有其他付款请求正在处理"
@@ -5270,7 +5276,7 @@ msgstr "存在预留库存时不可禁用{0}"
msgid "As there are sufficient Sub Assembly Items, Work Order is not required for Warehouse {0}."
msgstr "由于子装配件充足,仓库{0}无需工单"
-#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1794
+#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1802
msgid "As there are sufficient raw materials, Material Request is not required for Warehouse {0}."
msgstr "因仓库 {0} 有足够库存,未生成物料需求。"
@@ -5438,7 +5444,7 @@ msgstr "资产{1}的折旧计划{0}已存在"
msgid "Asset Depreciation Schedule {0} for Asset {1} and Finance Book {2} already exists."
msgstr "资产{1}与财务账簿{2}的折旧计划{0}已存在"
-#: erpnext/assets/doctype/asset/asset.py:181
+#: erpnext/assets/doctype/asset/asset.py:236
msgid "Asset Depreciation Schedules created/updated:
{0}
Please check, edit if needed, and submit the Asset."
msgstr "资产折旧计划已创建/更新:
{0}
请检查并按要求编辑后提交资产。"
@@ -5520,7 +5526,7 @@ msgstr "资产变动"
msgid "Asset Movement Item"
msgstr "资产移动明细项"
-#: erpnext/assets/doctype/asset/asset.py:1104
+#: erpnext/assets/doctype/asset/asset.py:1163
msgid "Asset Movement record {0} created"
msgstr "资产变动{0}已创建"
@@ -5626,7 +5632,7 @@ msgstr "资产状态"
#. Label of the asset_value (Currency) field in DocType 'Asset Capitalization
#. Asset Item'
#: erpnext/assets/dashboard_fixtures.py:175
-#: erpnext/assets/doctype/asset/asset.js:421
+#: erpnext/assets/doctype/asset/asset.js:434
#: erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json
#: erpnext/assets/report/fixed_asset_register/fixed_asset_register.py:209
#: erpnext/assets/report/fixed_asset_register/fixed_asset_register.py:460
@@ -5651,11 +5657,11 @@ msgstr "资产价值调整不可在资产购置日期{0}前过账"
msgid "Asset Value Analytics"
msgstr "固定资产价值分析"
-#: erpnext/assets/doctype/asset/asset.py:213
+#: erpnext/assets/doctype/asset/asset.py:272
msgid "Asset cancelled"
msgstr "资产已取消"
-#: erpnext/assets/doctype/asset/asset.py:653
+#: erpnext/assets/doctype/asset/asset.py:712
msgid "Asset cannot be cancelled, as it is already {0}"
msgstr "资产不能被取消,因为它已经是{0}"
@@ -5663,19 +5669,19 @@ msgstr "资产不能被取消,因为它已经是{0}"
msgid "Asset cannot be scrapped before the last depreciation entry."
msgstr "在最后折旧分录前不能报废资产"
-#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:611
+#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:612
msgid "Asset capitalized after Asset Capitalization {0} was submitted"
msgstr "资产资本化{0} 增加了资产价值"
-#: erpnext/assets/doctype/asset/asset.py:222
+#: erpnext/assets/doctype/asset/asset.py:281
msgid "Asset created"
msgstr "资产已创建"
-#: erpnext/assets/doctype/asset/asset.py:1344
+#: erpnext/assets/doctype/asset/asset.py:1403
msgid "Asset created after being split from Asset {0}"
msgstr "资产通过拆分自资产{0}创建"
-#: erpnext/assets/doctype/asset/asset.py:225
+#: erpnext/assets/doctype/asset/asset.py:284
msgid "Asset deleted"
msgstr "资产已删除"
@@ -5695,7 +5701,7 @@ msgstr "资产在位置{0}接收并发放给员工{1}"
msgid "Asset restored"
msgstr "资产已恢复"
-#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:619
+#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:620
msgid "Asset restored after Asset Capitalization {0} was cancelled"
msgstr "因取消资产资本化{0} 恢复了资产价值"
@@ -5716,7 +5722,7 @@ msgstr "通过资产日记账凭证报废{0}"
msgid "Asset sold"
msgstr "资产已出售"
-#: erpnext/assets/doctype/asset/asset.py:200
+#: erpnext/assets/doctype/asset/asset.py:259
msgid "Asset submitted"
msgstr "资产已提交"
@@ -5724,7 +5730,7 @@ msgstr "资产已提交"
msgid "Asset transferred to Location {0}"
msgstr "资产已转到 {0}"
-#: erpnext/assets/doctype/asset/asset.py:1353
+#: erpnext/assets/doctype/asset/asset.py:1412
msgid "Asset updated after being split into Asset {0}"
msgstr "资产拆分更新为资产{0}"
@@ -5752,12 +5758,12 @@ msgstr "资产{0}不属于保管人{1}"
msgid "Asset {0} does not belong to the location {1}"
msgstr "资产{0}不属于位置{1}"
-#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:671
-#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:763
+#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:672
+#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:765
msgid "Asset {0} does not exist"
msgstr "资产{0}不存在"
-#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:585
+#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:586
msgid "Asset {0} has been updated. Please set the depreciation details if any and submit it."
msgstr "资产 {0} 已变更,如需折旧请设置折旧信息后提交资产"
@@ -5815,7 +5821,7 @@ msgstr "未为{item_code}创建资产,请手动创建"
msgid "Assets {assets_link} created for {item_code}"
msgstr "已为{item_code}创建资产{assets_link}"
-#: erpnext/manufacturing/doctype/job_card/job_card.js:231
+#: erpnext/manufacturing/doctype/job_card/job_card.js:232
msgid "Assign Job to Employee"
msgstr "派工"
@@ -5835,11 +5841,11 @@ msgstr "分派条件"
msgid "Associate"
msgstr "协理"
-#: erpnext/stock/doctype/pick_list/pick_list.py:110
+#: erpnext/stock/doctype/pick_list/pick_list.py:124
msgid "At Row #{0}: The picked quantity {1} for the item {2} is greater than available stock {3} for the batch {4} in the warehouse {5}. Please restock the item."
msgstr "行{0}:物料{2}的拣货数量{1}超过仓库{5}批次{4}的可用库存{3},请补货"
-#: erpnext/stock/doctype/pick_list/pick_list.py:135
+#: erpnext/stock/doctype/pick_list/pick_list.py:149
msgid "At Row #{0}: The picked quantity {1} for the item {2} is greater than available stock {3} in the warehouse {4}."
msgstr "行{0}:物料{2}的拣货数量{1}超过仓库{4}的可用库存{3}"
@@ -5847,7 +5853,7 @@ msgstr "行{0}:物料{2}的拣货数量{1}超过仓库{4}的可用库存{3}"
msgid "At least one account with exchange gain or loss is required"
msgstr "必须设置至少一个汇兑损益科目"
-#: erpnext/assets/doctype/asset/asset.py:1210
+#: erpnext/assets/doctype/asset/asset.py:1269
msgid "At least one asset has to be selected."
msgstr "必须选择至少一项资产"
@@ -5876,11 +5882,11 @@ msgstr "必须选择销售或采购至少一项"
msgid "At least one row is required for a financial report template"
msgstr ""
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:772
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:773
msgid "At least one warehouse is mandatory"
msgstr "必须指定至少一个仓库"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:685
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:686
msgid "At row #{0}: the Difference Account must not be a Stock type account, please change the Account Type for the account {1} or select a different account"
msgstr "第{0}行:差异科目不得为库存类型科目,请修改科目{1}类型或选择其他科目。"
@@ -5888,7 +5894,7 @@ msgstr "第{0}行:差异科目不得为库存类型科目,请修改科目{1}
msgid "At row #{0}: the sequence id {1} cannot be less than previous row sequence id {2}"
msgstr "行{0}:序列ID{1}不能小于前一行的序列ID{2}"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:696
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:697
msgid "At row #{0}: you have selected the Difference Account {1}, which is a Cost of Goods Sold type account. Please select a different account"
msgstr "第{0}行:所选差异科目{1}为销售成本类型科目,请选择其他科目。"
@@ -6367,11 +6373,11 @@ msgstr "可用库存"
msgid "Available Stock for Packing Items"
msgstr "包装物料库存"
-#: erpnext/assets/doctype/asset/asset.py:318
+#: erpnext/assets/doctype/asset/asset.py:377
msgid "Available for use date is required"
msgstr "请输入启用日期"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:905
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:906
msgid "Available quantity is {0}, you need {1}"
msgstr "可用数量 {0},需求数量 {1}"
@@ -6384,7 +6390,7 @@ msgstr "可用{0}"
msgid "Available-for-use Date"
msgstr "启用日期"
-#: erpnext/assets/doctype/asset/asset.py:424
+#: erpnext/assets/doctype/asset/asset.py:483
msgid "Available-for-use Date should be after purchase date"
msgstr "启用日应晚于采购日"
@@ -6403,6 +6409,11 @@ msgstr "平均完成"
msgid "Average Discount"
msgstr "平均折扣"
+#. Label of a number card in the Buying Workspace
+#: erpnext/buying/workspace/buying/buying.json
+msgid "Average Order Values"
+msgstr ""
+
#: erpnext/accounts/report/share_balance/share_balance.py:60
msgid "Average Rate"
msgstr "均价"
@@ -6496,7 +6507,7 @@ msgstr "库位数量"
#: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:109
#: erpnext/manufacturing/workspace/manufacturing/manufacturing.json
#: erpnext/selling/doctype/sales_order/sales_order.js:1407
-#: erpnext/stock/doctype/material_request/material_request.js:337
+#: erpnext/stock/doctype/material_request/material_request.js:339
#: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
#: erpnext/stock/doctype/stock_entry/stock_entry.js:671
#: erpnext/stock/report/bom_search/bom_search.py:38
@@ -6510,7 +6521,7 @@ msgstr "物料清单"
msgid "BOM 1"
msgstr "物料清单1"
-#: erpnext/manufacturing/doctype/bom/bom.py:1670
+#: erpnext/manufacturing/doctype/bom/bom.py:1682
msgid "BOM 1 {0} and BOM 2 {1} should not be same"
msgstr "物料清单1 {0} 与物料清单2 {0} 不能相同"
@@ -6749,7 +6760,7 @@ msgstr "BOM和生产量是必需的"
msgid "BOM and Production"
msgstr "物料清单与生产"
-#: erpnext/stock/doctype/material_request/material_request.js:372
+#: erpnext/stock/doctype/material_request/material_request.js:374
#: erpnext/stock/doctype/stock_entry/stock_entry.js:723
msgid "BOM does not contain any stock item"
msgstr "BOM不包含任何库存物料"
@@ -6758,23 +6769,23 @@ msgstr "BOM不包含任何库存物料"
msgid "BOM recursion: {0} cannot be child of {1}"
msgstr "物料清单嵌套: {0} 不能是 {1} 的下层"
-#: erpnext/manufacturing/doctype/bom/bom.py:688
+#: erpnext/manufacturing/doctype/bom/bom.py:700
msgid "BOM recursion: {1} cannot be parent or child of {0}"
msgstr "物料清单递归错误:{1}不能作为{0}的父项或子项"
-#: erpnext/manufacturing/doctype/bom/bom.py:1412
+#: erpnext/manufacturing/doctype/bom/bom.py:1424
msgid "BOM {0} does not belong to Item {1}"
msgstr "BOM{0}不属于物料{1}"
-#: erpnext/manufacturing/doctype/bom/bom.py:1394
+#: erpnext/manufacturing/doctype/bom/bom.py:1406
msgid "BOM {0} must be active"
msgstr "BOM{0}必须处于生效状态"
-#: erpnext/manufacturing/doctype/bom/bom.py:1397
+#: erpnext/manufacturing/doctype/bom/bom.py:1409
msgid "BOM {0} must be submitted"
msgstr "BOM{0}未提交"
-#: erpnext/manufacturing/doctype/bom/bom.py:776
+#: erpnext/manufacturing/doctype/bom/bom.py:788
msgid "BOM {0} not found for the item {1}"
msgstr "未找到物料{1}的物料清单{0}"
@@ -6845,7 +6856,7 @@ msgstr "余额"
msgid "Balance (Dr - Cr)"
msgstr "结余(Dr - Cr)"
-#: erpnext/accounts/report/general_ledger/general_ledger.py:700
+#: erpnext/accounts/report/general_ledger/general_ledger.py:704
msgid "Balance ({0})"
msgstr "余额({0})"
@@ -7043,7 +7054,7 @@ msgstr "银行户头子类型"
msgid "Bank Account Type"
msgstr "银行户头类型"
-#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:338
+#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:376
msgid "Bank Account {} in Bank Transaction {} is not matching with Bank Account {}"
msgstr "银行交易{}中的银行账户{}与银行账户{}不匹配"
@@ -7196,7 +7207,7 @@ msgstr "银行交易{0}已添加为日记账分录"
msgid "Bank Transaction {0} added as Payment Entry"
msgstr "银行交易{0}已添加为付款凭证"
-#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:143
+#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:147
msgid "Bank Transaction {0} is already fully reconciled"
msgstr "银行交易{0}已完全对账"
@@ -7409,6 +7420,8 @@ msgstr "单价(按库存单位)"
#: erpnext/stock/report/stock_ledger/stock_ledger.py:330
#: erpnext/stock/report/stock_ledger_invariant_check/stock_ledger_invariant_check.py:171
#: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py:80
+#: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.js:19
+#: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.py:32
#: erpnext/stock/workspace/stock/stock.json
msgid "Batch"
msgstr "批号"
@@ -7423,7 +7436,7 @@ msgstr "批号说明"
msgid "Batch Details"
msgstr "批号信息"
-#: erpnext/stock/doctype/batch/batch.py:210
+#: erpnext/stock/doctype/batch/batch.py:217
#: erpnext/stock/report/serial_no_and_batch_traceability/serial_no_and_batch_traceability.py:465
msgid "Batch Expiry Date"
msgstr "批次有效期"
@@ -7476,7 +7489,7 @@ msgstr "物料批号到期状态"
#: erpnext/manufacturing/doctype/job_card/job_card.json
#: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.js:89
#: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py:115
-#: erpnext/public/js/controllers/transaction.js:2825
+#: erpnext/public/js/controllers/transaction.js:2821
#: erpnext/public/js/utils/barcode_scanner.js:281
#: erpnext/public/js/utils/serial_no_batch_selector.js:438
#: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json
@@ -7509,7 +7522,7 @@ msgstr "批号"
msgid "Batch No is mandatory"
msgstr "批次号为必填项"
-#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3027
+#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3031
msgid "Batch No {0} does not exists"
msgstr "批次号{0}不存在"
@@ -7546,10 +7559,15 @@ msgid "Batch Number Series"
msgstr "批号模板"
#: erpnext/stock/report/serial_and_batch_summary/serial_and_batch_summary.py:161
+#: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.py:33
msgid "Batch Qty"
msgstr "批号数量"
-#: erpnext/stock/doctype/batch/batch.py:170
+#: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.py:120
+msgid "Batch Qty updated successfully"
+msgstr ""
+
+#: erpnext/stock/doctype/batch/batch.py:177
msgid "Batch Qty updated to {0}"
msgstr "批次数量已更新至{0}"
@@ -7581,7 +7599,7 @@ msgstr "计量单位"
msgid "Batch and Serial No"
msgstr "批次和序列号"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:885
+#: erpnext/manufacturing/doctype/work_order/work_order.py:880
msgid "Batch not created for item {} since it does not have a batch series."
msgstr "未为物料{}创建批次,因其无批次编号规则"
@@ -7593,12 +7611,12 @@ msgstr "批号 {0} 和仓库"
msgid "Batch {0} is not available in warehouse {1}"
msgstr "批次{0}在仓库{1}中不可用"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:3168
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:3169
#: erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py:290
msgid "Batch {0} of Item {1} has expired."
msgstr "物料{1}的批号{0} 已过期。"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:3174
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:3175
msgid "Batch {0} of Item {1} is disabled."
msgstr "物料{1}批号{0}已禁用。"
@@ -7662,7 +7680,7 @@ msgstr "采购发票含被退货数量"
#. Label of a Card Break in the Manufacturing Workspace
#. Label of a Link in the Manufacturing Workspace
-#: erpnext/manufacturing/doctype/bom/bom.py:1251
+#: erpnext/manufacturing/doctype/bom/bom.py:1263
#: erpnext/manufacturing/workspace/manufacturing/manufacturing.json
#: erpnext/stock/doctype/material_request/material_request.js:127
#: erpnext/stock/doctype/stock_entry/stock_entry.js:657
@@ -8353,7 +8371,7 @@ msgstr "可生产数量"
msgid "Buildings"
msgstr "房屋"
-#: erpnext/utilities/doctype/rename_tool/rename_tool.js:78
+#: erpnext/utilities/doctype/rename_tool/rename_tool.js:70
msgid "Bulk Rename Jobs"
msgstr "批量重命名任务"
@@ -8768,7 +8786,7 @@ msgstr "促销计划"
msgid "Can be approved by {0}"
msgstr "可以被 {0} 批准"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:2459
+#: erpnext/manufacturing/doctype/work_order/work_order.py:2454
msgid "Can not close Work Order. Since {0} Job Cards are in Work In Progress state."
msgstr "无法关闭工单,因{0}张作业卡处于进行中状态"
@@ -8801,8 +8819,8 @@ msgstr "按凭证分类后不能根据凭证号过滤"
msgid "Can only make payment against unbilled {0}"
msgstr "只能为未开票{0}付款"
-#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1494
-#: erpnext/controllers/accounts_controller.py:3170
+#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1493
+#: erpnext/controllers/accounts_controller.py:3172
#: erpnext/public/js/controllers/accounts.js:103
msgid "Can refer row only if the charge type is 'On Previous Row Amount' or 'Previous Row Total'"
msgstr "仅在收费模式为“基于上一行金额”或“前一行的总计”才能参考(这一)行"
@@ -8912,7 +8930,7 @@ msgstr ""
msgid "Cannot cancel as processing of cancelled documents is pending."
msgstr "因相关已取消单据后台提交尚未完成,不能进行取消操作"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:1070
+#: erpnext/manufacturing/doctype/work_order/work_order.py:1065
msgid "Cannot cancel because submitted Stock Entry {0} exists"
msgstr "不能取消,因为提交的仓储记录{0}已经存在"
@@ -8928,7 +8946,7 @@ msgstr "无法取消本生产库存凭证,因产成品数量不得少于关联
msgid "Cannot cancel this document as it is linked with the submitted asset {asset_link}. Please cancel the asset to continue."
msgstr "该单据关联已提交资产{asset_link},需先取消资产"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:457
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:458
msgid "Cannot cancel transaction for Completed Work Order."
msgstr "无法取消已完成工单的交易。"
@@ -8980,8 +8998,8 @@ msgstr "科目类型字段须为空才能转换为组。"
msgid "Cannot create Stock Reservation Entries for future dated Purchase Receipts."
msgstr "无法为未来日期的采购收据创建库存预留"
-#: erpnext/selling/doctype/sales_order/sales_order.py:1848
-#: erpnext/stock/doctype/pick_list/pick_list.py:205
+#: erpnext/selling/doctype/sales_order/sales_order.py:1849
+#: erpnext/stock/doctype/pick_list/pick_list.py:219
msgid "Cannot create a pick list for Sales Order {0} because it has reserved stock. Please unreserve the stock in order to create a pick list."
msgstr "为销售订单 {0} 创建了库存预留,请取消预留后再创建拣货单"
@@ -8993,7 +9011,7 @@ msgstr "无法为已禁用科目{0}创建会计凭证"
msgid "Cannot create return for consolidated invoice {0}."
msgstr "无法为合并发票{0}创建退货。"
-#: erpnext/manufacturing/doctype/bom/bom.py:1108
+#: erpnext/manufacturing/doctype/bom/bom.py:1120
msgid "Cannot deactivate or cancel BOM as it is linked with other BOMs"
msgstr "无法停用或取消BOM,因为它被其他BOM引用。"
@@ -9006,7 +9024,7 @@ msgstr "已报价,不能更改状态为未成交。"
msgid "Cannot deduct when category is for 'Valuation' or 'Valuation and Total'"
msgstr "分类是“估值”或“估值和总计”的时候不能扣税。"
-#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1813
+#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1808
msgid "Cannot delete Exchange Gain/Loss row"
msgstr "无法删除汇兑损益行"
@@ -9014,11 +9032,15 @@ msgstr "无法删除汇兑损益行"
msgid "Cannot delete Serial No {0}, as it is used in stock transactions"
msgstr "无法删除已在库存业务单据中使用过的序列号{0}"
+#: erpnext/controllers/accounts_controller.py:3768
+msgid "Cannot delete an item which has been ordered"
+msgstr ""
+
#: erpnext/setup/doctype/company/company.py:552
msgid "Cannot disable perpetual inventory, as there are existing Stock Ledger Entries for the company {0}. Please cancel the stock transactions first and try again."
msgstr "无法停用永续盘存制,因公司{0}存在库存分类账记录。请先取消库存交易再重试。"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:682
+#: erpnext/manufacturing/doctype/work_order/work_order.py:677
msgid "Cannot disassemble more than produced quantity."
msgstr "拆解数量不得超过产出数量。"
@@ -9043,7 +9065,7 @@ msgstr "未找到匹配此条码的物料或仓库"
msgid "Cannot find Item with this Barcode"
msgstr "找不到该条码对应的物料"
-#: erpnext/controllers/accounts_controller.py:3718
+#: erpnext/controllers/accounts_controller.py:3720
msgid "Cannot find a default warehouse for item {0}. Please set one in the Item Master or in Stock Settings."
msgstr "找不到物料{0}的默认仓库,请在物料主数据或库存设置中设置"
@@ -9055,11 +9077,11 @@ msgstr "删除任务完成前不可进行任何交易"
msgid "Cannot produce more Item {0} than Sales Order quantity {1}"
msgstr "不能生产超过销售订单数量{1}的物料{0}"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:1425
+#: erpnext/manufacturing/doctype/work_order/work_order.py:1420
msgid "Cannot produce more item for {0}"
msgstr "无法为{0}生产更多物料"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:1429
+#: erpnext/manufacturing/doctype/work_order/work_order.py:1424
msgid "Cannot produce more than {0} items for {1}"
msgstr "无法为{1}生产超过{0}件物料"
@@ -9067,8 +9089,12 @@ msgstr "无法为{1}生产超过{0}件物料"
msgid "Cannot receive from customer against negative outstanding"
msgstr "存在负未清金额时不可从客户收货"
-#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1511
-#: erpnext/controllers/accounts_controller.py:3185
+#: erpnext/controllers/accounts_controller.py:3900
+msgid "Cannot reduce quantity than ordered or purchased quantity"
+msgstr ""
+
+#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1506
+#: erpnext/controllers/accounts_controller.py:3187
#: erpnext/public/js/controllers/accounts.js:120
msgid "Cannot refer row number greater than or equal to current row number for this Charge type"
msgstr "此收取类型不能引用大于或等于本行的数据。"
@@ -9081,10 +9107,10 @@ msgstr "无法获取更新链接令牌,查看错误日志"
msgid "Cannot retrieve link token. Check Error Log for more information"
msgstr "无法获取链接令牌,查看错误日志"
-#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1503
-#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1682
+#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1499
+#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1677
#: erpnext/accounts/doctype/payment_entry/payment_entry.py:1889
-#: erpnext/controllers/accounts_controller.py:3175
+#: erpnext/controllers/accounts_controller.py:3177
#: erpnext/public/js/controllers/accounts.js:112
#: erpnext/public/js/controllers/taxes_and_totals.js:524
msgid "Cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for first row"
@@ -9102,11 +9128,11 @@ msgstr "不能为{0}设置折扣授权"
msgid "Cannot set multiple Item Defaults for a company."
msgstr "无法为公司设置多个物料默认值。"
-#: erpnext/controllers/accounts_controller.py:3873
+#: erpnext/controllers/accounts_controller.py:3882
msgid "Cannot set quantity less than delivered quantity"
msgstr "无法设定数量小于出货数量"
-#: erpnext/controllers/accounts_controller.py:3876
+#: erpnext/controllers/accounts_controller.py:3885
msgid "Cannot set quantity less than received quantity"
msgstr "无法设置小于收货数量的数量"
@@ -9149,7 +9175,7 @@ msgstr "产能(库存单位)"
msgid "Capacity Planning"
msgstr "产能计划"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:1056
+#: erpnext/manufacturing/doctype/work_order/work_order.py:1051
msgid "Capacity Planning Error, planned start time can not be same as end time"
msgstr "产能计划错误,计划开始时间不能等于结束时间"
@@ -9193,7 +9219,7 @@ msgstr "在建工程科目"
msgid "Capital Work in Progress"
msgstr "在建工程"
-#: erpnext/assets/doctype/asset/asset.js:203
+#: erpnext/assets/doctype/asset/asset.js:210
msgid "Capitalize Asset"
msgstr "资产资本化"
@@ -9202,8 +9228,8 @@ msgstr "资产资本化"
msgid "Capitalize Repair Cost"
msgstr "资本化维修成本"
-#: erpnext/assets/doctype/asset/asset.js:201
-msgid "Capitalize this asset to confirm"
+#: erpnext/assets/doctype/asset/asset.js:208
+msgid "Capitalize this asset before submitting."
msgstr ""
#. Option for the 'Status' (Select) field in DocType 'Asset'
@@ -9527,7 +9553,7 @@ msgid "Channel Partner"
msgstr "渠道服务商"
#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2318
-#: erpnext/controllers/accounts_controller.py:3238
+#: erpnext/controllers/accounts_controller.py:3240
msgid "Charge of type 'Actual' in row {0} cannot be included in Item Rate or Paid Amount"
msgstr "行{0}的'实际'类型费用不可包含在物料单价或实付金额中"
@@ -9699,7 +9725,7 @@ msgstr "支票宽度"
#. Label of the reference_date (Date) field in DocType 'Payment Entry'
#: erpnext/accounts/doctype/payment_entry/payment_entry.json
-#: erpnext/public/js/controllers/transaction.js:2735
+#: erpnext/public/js/controllers/transaction.js:2731
msgid "Cheque/Reference Date"
msgstr "业务日期"
@@ -9747,7 +9773,7 @@ msgstr "子单据名称/编号"
#. Label of the child_row_reference (Data) field in DocType 'Quality
#. Inspection'
-#: erpnext/public/js/controllers/transaction.js:2831
+#: erpnext/public/js/controllers/transaction.js:2827
#: erpnext/stock/doctype/quality_inspection/quality_inspection.json
msgid "Child Row Reference"
msgstr "子行引用"
@@ -9900,7 +9926,7 @@ msgstr "封闭文件"
msgid "Closed Documents"
msgstr "已关闭单据类型"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:2382
+#: erpnext/manufacturing/doctype/work_order/work_order.py:2377
msgid "Closed Work Order can not be stopped or Re-opened"
msgstr "已关闭工单不可停止或重新打开"
@@ -10519,6 +10545,7 @@ msgstr "公司"
#: erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.json
#: erpnext/setup/doctype/vehicle/vehicle.json erpnext/setup/install.py:156
#: erpnext/setup/install.py:165 erpnext/setup/workspace/home/home.json
+#: erpnext/stock/dashboard_chart_source/stock_value_by_item_group/stock_value_by_item_group.js:8
#: erpnext/stock/dashboard_chart_source/warehouse_wise_stock_value/warehouse_wise_stock_value.js:8
#: erpnext/stock/doctype/delivery_note/delivery_note.json
#: erpnext/stock/doctype/delivery_trip/delivery_trip.json
@@ -10647,7 +10674,7 @@ msgstr "公司地址"
msgid "Company Address Name"
msgstr "公司地址名称"
-#: erpnext/controllers/accounts_controller.py:4267
+#: erpnext/controllers/accounts_controller.py:4311
msgid "Company Address is missing. You don't have permission to update it. Please contact your System Manager."
msgstr "公司地址信息缺失。您无权限更新该信息,请联系系统管理员。"
@@ -10737,11 +10764,11 @@ msgstr "公司纳税登记号"
msgid "Company and Posting Date is mandatory"
msgstr "必须填写公司和过账日期"
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2500
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2501
msgid "Company currencies of both the companies should match for Inter Company Transactions."
msgstr "两家公司的本币应匹配关联公司交易。"
-#: erpnext/stock/doctype/material_request/material_request.js:366
+#: erpnext/stock/doctype/material_request/material_request.js:368
#: erpnext/stock/doctype/stock_entry/stock_entry.js:717
msgid "Company field is required"
msgstr "公司字段是必填项"
@@ -10762,7 +10789,7 @@ msgstr "生成发票必须指定公司,请在全局设置中设置默认公司
msgid "Company name not same"
msgstr "公司名不一样"
-#: erpnext/assets/doctype/asset/asset.py:266
+#: erpnext/assets/doctype/asset/asset.py:325
msgid "Company of asset {0} and purchase document {1} doesn't matches."
msgstr "资产{0}与采购单据{1}的公司不匹配"
@@ -10836,7 +10863,7 @@ msgstr "竞争对手名称"
msgid "Competitors"
msgstr "竞争对手"
-#: erpnext/manufacturing/doctype/job_card/job_card.js:268
+#: erpnext/manufacturing/doctype/job_card/job_card.js:269
#: erpnext/manufacturing/doctype/workstation/workstation.js:151
msgid "Complete Job"
msgstr "停止计时"
@@ -10863,6 +10890,11 @@ msgstr "完成日期不能晚于今日"
msgid "Completed Operation"
msgstr "完成工序"
+#. Label of a chart in the Projects Workspace
+#: erpnext/projects/workspace/projects/projects.json
+msgid "Completed Projects"
+msgstr ""
+
#. Label of the completed_qty (Float) field in DocType 'Job Card Operation'
#. Label of the completed_qty (Float) field in DocType 'Job Card Time Log'
#. Label of the completed_qty (Float) field in DocType 'Work Order Operation'
@@ -10874,12 +10906,12 @@ msgstr "完成工序"
msgid "Completed Qty"
msgstr "完工数量"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:1339
+#: erpnext/manufacturing/doctype/work_order/work_order.py:1334
msgid "Completed Qty cannot be greater than 'Qty to Manufacture'"
msgstr "完成数量不可超过'待生产数量'"
-#: erpnext/manufacturing/doctype/job_card/job_card.js:316
-#: erpnext/manufacturing/doctype/job_card/job_card.js:437
+#: erpnext/manufacturing/doctype/job_card/job_card.js:317
+#: erpnext/manufacturing/doctype/job_card/job_card.js:438
#: erpnext/manufacturing/doctype/workstation/workstation.js:296
msgid "Completed Quantity"
msgstr "完成数量"
@@ -11179,7 +11211,7 @@ msgstr "已消耗物料成本"
msgid "Consumed Qty"
msgstr "已耗用数量"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:1717
+#: erpnext/manufacturing/doctype/work_order/work_order.py:1712
msgid "Consumed Qty cannot be greater than Reserved Qty for item {0}"
msgstr "物料{0}的消耗数量不可超过预留数量"
@@ -11523,15 +11555,15 @@ msgstr "行{0}中默认单位的转换系数必须是1"
msgid "Conversion factor for item {0} has been reset to 1.0 as the uom {1} is same as stock uom {2}."
msgstr "物料{0}的换算系数已重置为1.0,因其单位{1}与库存单位{2}相同"
-#: erpnext/controllers/accounts_controller.py:2953
+#: erpnext/controllers/accounts_controller.py:2955
msgid "Conversion rate cannot be 0"
msgstr "汇率不能为 0"
-#: erpnext/controllers/accounts_controller.py:2960
+#: erpnext/controllers/accounts_controller.py:2962
msgid "Conversion rate is 1.00, but document currency is different from company currency"
msgstr "汇率设置为1.00,但单据货币与公司货币不同"
-#: erpnext/controllers/accounts_controller.py:2956
+#: erpnext/controllers/accounts_controller.py:2958
msgid "Conversion rate must be 1.00 if document currency is same as company currency"
msgstr "单据货币与公司本位币相同时,汇率必须为1.00"
@@ -11597,13 +11629,13 @@ msgstr "纠正"
msgid "Corrective Action"
msgstr "纠正措施"
-#: erpnext/manufacturing/doctype/job_card/job_card.js:494
+#: erpnext/manufacturing/doctype/job_card/job_card.js:495
msgid "Corrective Job Card"
msgstr "返工生产任务单"
#. Label of the corrective_operation_section (Tab Break) field in DocType 'Job
#. Card'
-#: erpnext/manufacturing/doctype/job_card/job_card.js:501
+#: erpnext/manufacturing/doctype/job_card/job_card.js:502
#: erpnext/manufacturing/doctype/job_card/job_card.json
msgid "Corrective Operation"
msgstr "返工工序"
@@ -11747,7 +11779,7 @@ msgstr "成本"
#: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:204
#: erpnext/accounts/report/customer_ledger_summary/customer_ledger_summary.js:98
#: erpnext/accounts/report/general_ledger/general_ledger.js:153
-#: erpnext/accounts/report/general_ledger/general_ledger.py:774
+#: erpnext/accounts/report/general_ledger/general_ledger.py:778
#: erpnext/accounts/report/gross_profit/gross_profit.js:68
#: erpnext/accounts/report/gross_profit/gross_profit.py:384
#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:297
@@ -11855,11 +11887,11 @@ msgstr "已产生业务交易的成本中心不能转化为记账成本中心"
msgid "Cost Center {0} cannot be used for allocation as it is used as main cost center in other allocation record."
msgstr "成本中心{0}已在其他分配中作为主成本中心使用,不可分配"
-#: erpnext/assets/doctype/asset/asset.py:294
+#: erpnext/assets/doctype/asset/asset.py:353
msgid "Cost Center {} doesn't belong to Company {}"
msgstr "成本中心{}不属于公司{}"
-#: erpnext/assets/doctype/asset/asset.py:301
+#: erpnext/assets/doctype/asset/asset.py:360
msgid "Cost Center {} is a group cost center and group cost centers cannot be used in transactions"
msgstr "成本中心{}为组成本中心,不可用于交易"
@@ -11901,7 +11933,7 @@ msgstr "出货物料成本"
msgid "Cost of Goods Sold"
msgstr "销货成本"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:699
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:700
msgid "Cost of Goods Sold Account in Items Table"
msgstr "物料表中的销售成本科目"
@@ -11978,7 +12010,7 @@ msgstr "成本核算与计费字段已更新"
msgid "Could Not Delete Demo Data"
msgstr "无法删除演示数据"
-#: erpnext/selling/doctype/quotation/quotation.py:608
+#: erpnext/selling/doctype/quotation/quotation.py:609
msgid "Could not auto create Customer due to the following missing mandatory field(s):"
msgstr "无法自动创建客户,缺失必填字段:"
@@ -12082,7 +12114,7 @@ msgstr "创建交货单"
msgid "Create Delivery Trip"
msgstr "创建配送单"
-#: erpnext/assets/doctype/asset/asset.js:156
+#: erpnext/assets/doctype/asset/asset.js:162
msgid "Create Depreciation Entry"
msgstr "创建折旧分录"
@@ -12248,7 +12280,7 @@ msgid "Create Sample Retention Stock Entry"
msgstr "创建样本保留库存凭证"
#: erpnext/stock/dashboard/item_dashboard.js:283
-#: erpnext/stock/doctype/material_request/material_request.js:486
+#: erpnext/stock/doctype/material_request/material_request.js:488
#: erpnext/stock/doctype/pick_list/pick_list.js:138
msgid "Create Stock Entry"
msgstr "新建物料移动"
@@ -12358,7 +12390,7 @@ msgstr "正在创建采购发票..."
msgid "Creating Purchase Order ..."
msgstr "正在创建采购订单..."
-#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:739
+#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:728
#: erpnext/buying/doctype/purchase_order/purchase_order.js:560
#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.js:73
msgid "Creating Purchase Receipt ..."
@@ -12385,7 +12417,7 @@ msgstr "正在创建外协订单..."
msgid "Creating Subcontracting Receipt ..."
msgstr "正在创建外协收货单..."
-#: erpnext/setup/doctype/employee/employee.js:86
+#: erpnext/setup/doctype/employee/employee.js:92
msgid "Creating User..."
msgstr "正在创建用户..."
@@ -12434,11 +12466,11 @@ msgstr "创建 {0} 部分成功。\n"
msgid "Credit"
msgstr "贷方"
-#: erpnext/accounts/report/general_ledger/general_ledger.py:718
+#: erpnext/accounts/report/general_ledger/general_ledger.py:722
msgid "Credit (Transaction)"
msgstr "贷方(交易货币)"
-#: erpnext/accounts/report/general_ledger/general_ledger.py:693
+#: erpnext/accounts/report/general_ledger/general_ledger.py:697
msgid "Credit ({0})"
msgstr "贷方({0})"
@@ -12807,7 +12839,7 @@ msgstr "货币{0}必须{1}"
msgid "Currency of the Closing Account must be {0}"
msgstr "在关闭科目的货币必须是{0}"
-#: erpnext/manufacturing/doctype/bom/bom.py:622
+#: erpnext/manufacturing/doctype/bom/bom.py:634
msgid "Currency of the price list {0} must be {1} or {2}"
msgstr "价格表{0}的货币必须是{1}或{2}"
@@ -13144,8 +13176,8 @@ msgstr "自定义分离符"
#: erpnext/setup/doctype/customer_group/customer_group.json
#: erpnext/setup/doctype/territory/territory.json
#: erpnext/setup/workspace/home/home.json
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:219
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:490
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:215
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:486
#: erpnext/stock/doctype/delivery_note/delivery_note.json
#: erpnext/stock/doctype/delivery_stop/delivery_stop.json
#: erpnext/stock/doctype/item/item.json
@@ -13526,7 +13558,7 @@ msgstr "客户PO"
msgid "Customer PO Details"
msgstr "客户PO详细信息"
-#: erpnext/public/js/utils/contact_address_quick_entry.js:110
+#: erpnext/public/js/utils/contact_address_quick_entry.js:113
msgid "Customer POS Id"
msgstr "客户POS ID"
@@ -13735,7 +13767,7 @@ msgstr "D - E"
msgid "DFS"
msgstr "DFS"
-#: erpnext/projects/doctype/project/project.py:674
+#: erpnext/projects/doctype/project/project.py:675
msgid "Daily Project Summary for {0}"
msgstr "{0}的每日项目摘要"
@@ -13980,11 +14012,11 @@ msgstr "贸易商"
msgid "Debit"
msgstr "借方"
-#: erpnext/accounts/report/general_ledger/general_ledger.py:711
+#: erpnext/accounts/report/general_ledger/general_ledger.py:715
msgid "Debit (Transaction)"
msgstr "借方(交易货币)"
-#: erpnext/accounts/report/general_ledger/general_ledger.py:686
+#: erpnext/accounts/report/general_ledger/general_ledger.py:690
msgid "Debit ({0})"
msgstr "借方({0})"
@@ -14216,15 +14248,15 @@ msgstr "默认物料清单"
msgid "Default BOM ({0}) must be active for this item or its template"
msgstr "该物料或其模板物料的默认物料清单状态必须是生效"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:2184
+#: erpnext/manufacturing/doctype/work_order/work_order.py:2179
msgid "Default BOM for {0} not found"
msgstr "默认BOM {0}未找到"
-#: erpnext/controllers/accounts_controller.py:3914
+#: erpnext/controllers/accounts_controller.py:3938
msgid "Default BOM not found for FG Item {0}"
msgstr "未找到产成品{0}的默认物料清单"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:2181
+#: erpnext/manufacturing/doctype/work_order/work_order.py:2176
msgid "Default BOM not found for Item {0} and Project {1}"
msgstr "物料{0}和物料{1}找不到默认BOM"
@@ -14711,7 +14743,7 @@ msgstr "定义项目类型。"
msgid "Dekagram/Litre"
msgstr "十克/升"
-#: erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py:116
+#: erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py:130
msgid "Delay (In Days)"
msgstr "逾期天数"
@@ -15081,7 +15113,7 @@ msgstr "交货截止日期"
#. Label of the delivery_trip (Link) field in DocType 'Delivery Note'
#. Name of a DocType
#. Label of a Link in the Stock Workspace
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:284
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:280
#: erpnext/stock/doctype/delivery_note/delivery_note.json
#: erpnext/stock/doctype/delivery_trip/delivery_trip.json
#: erpnext/stock/workspace/stock/stock.json
@@ -15226,7 +15258,7 @@ msgstr "折旧"
#. Label of the depreciation_amount (Currency) field in DocType 'Depreciation
#. Schedule'
#: erpnext/accounts/report/asset_depreciation_ledger/asset_depreciation_ledger.py:172
-#: erpnext/assets/doctype/asset/asset.js:288
+#: erpnext/assets/doctype/asset/asset.js:301
#: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json
msgid "Depreciation Amount"
msgstr "折旧额"
@@ -15263,7 +15295,7 @@ msgstr "折旧分录"
msgid "Depreciation Entry Posting Status"
msgstr "折旧凭证记账状态"
-#: erpnext/assets/doctype/asset/asset.py:1178
+#: erpnext/assets/doctype/asset/asset.py:1237
msgid "Depreciation Entry against asset {0}"
msgstr "资产{0}的折旧分录入账"
@@ -15306,15 +15338,15 @@ msgstr "折旧选项"
msgid "Depreciation Posting Date"
msgstr "折旧过账日期"
-#: erpnext/assets/doctype/asset/asset.js:784
+#: erpnext/assets/doctype/asset/asset.js:795
msgid "Depreciation Posting Date cannot be before Available-for-use Date"
msgstr "折旧过账日期不可早于可用日期"
-#: erpnext/assets/doctype/asset/asset.py:323
+#: erpnext/assets/doctype/asset/asset.py:382
msgid "Depreciation Row {0}: Depreciation Posting Date cannot be before Available-for-use Date"
msgstr "折旧行{0}:折旧过账日期不可早于可用日期"
-#: erpnext/assets/doctype/asset/asset.py:638
+#: erpnext/assets/doctype/asset/asset.py:697
msgid "Depreciation Row {0}: Expected value after useful life must be greater than or equal to {1}"
msgstr "折旧行{0}:资产使用年限结束残值必须大于或等于{1}"
@@ -15341,7 +15373,7 @@ msgstr "折旧计划"
msgid "Depreciation Schedule View"
msgstr "折旧计划表视图"
-#: erpnext/assets/doctype/asset/asset.py:418
+#: erpnext/assets/doctype/asset/asset.py:477
msgid "Depreciation cannot be calculated for fully depreciated assets"
msgstr "不能为已勾选已完全折旧的固定资产勾选计算折旧"
@@ -15394,6 +15426,7 @@ msgstr "柴油"
#: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:171
#: erpnext/public/js/bank_reconciliation_tool/number_card.js:30
#: erpnext/stock/report/incorrect_balance_qty_after_transaction/incorrect_balance_qty_after_transaction.py:130
+#: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.py:35
#: erpnext/stock/report/stock_qty_vs_serial_no_count/stock_qty_vs_serial_no_count.py:35
msgid "Difference"
msgstr "差异"
@@ -15420,11 +15453,11 @@ msgstr "差异(借方-贷方)"
msgid "Difference Account"
msgstr "差异科目"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:688
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:689
msgid "Difference Account in Items Table"
msgstr "物料表中的差异科目"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:677
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:678
msgid "Difference Account must be a Asset/Liability type account (Temporary Opening), since this Stock Entry is an Opening Entry"
msgstr "因本库存凭证为期初凭证,差异科目必须为资产/负债类科目(临时期初)。"
@@ -15488,7 +15521,7 @@ msgstr "差额数量"
msgid "Difference Value"
msgstr "差异金额"
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:499
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:495
msgid "Different 'Source Warehouse' and 'Target Warehouse' can be set for each row."
msgstr "每行可设置不同的'来源仓库'与'目标仓库'"
@@ -16199,7 +16232,7 @@ msgstr "不要在货币旁显示货币代号,例如$等。"
msgid "Do not update variants on save"
msgstr "不在保存时更新多规格物料"
-#: erpnext/assets/doctype/asset/asset.js:822
+#: erpnext/assets/doctype/asset/asset.js:833
msgid "Do you really want to restore this scrapped asset?"
msgstr "真要恢复该已报废资产?"
@@ -16492,7 +16525,7 @@ msgstr "重复客户组"
msgid "Duplicate Entry. Please check Authorization Rule {0}"
msgstr "有重复记录,请检查授权规则{0}"
-#: erpnext/assets/doctype/asset/asset.py:350
+#: erpnext/assets/doctype/asset/asset.py:409
msgid "Duplicate Finance Book"
msgstr "重复财务账簿"
@@ -16677,7 +16710,7 @@ msgstr "编辑备注"
#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
#: erpnext/accounts/doctype/sales_invoice/sales_invoice.json
#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.json
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:503
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:499
#: erpnext/stock/doctype/delivery_note/delivery_note.json
#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.json
#: erpnext/stock/doctype/stock_entry/stock_entry.json
@@ -17132,6 +17165,12 @@ msgstr "启用不可篡改账本"
msgid "Enable Item-wise Inventory Account"
msgstr "启用按物料核算库存科目"
+#. Label of the enable_parallel_reposting (Check) field in DocType 'Stock
+#. Reposting Settings'
+#: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json
+msgid "Enable Parallel Reposting"
+msgstr ""
+
#. Label of the enable_perpetual_inventory (Check) field in DocType 'Company'
#: erpnext/setup/doctype/company/company.json
msgid "Enable Perpetual Inventory"
@@ -17223,8 +17262,8 @@ msgstr "结束日期不能早于开始日期。"
#. Label of the end_time (Time) field in DocType 'Stock Reposting Settings'
#. Label of the end_time (Time) field in DocType 'Service Day'
#. Label of the end_time (Datetime) field in DocType 'Call Log'
-#: erpnext/manufacturing/doctype/job_card/job_card.js:374
-#: erpnext/manufacturing/doctype/job_card/job_card.js:444
+#: erpnext/manufacturing/doctype/job_card/job_card.js:375
+#: erpnext/manufacturing/doctype/job_card/job_card.js:445
#: erpnext/manufacturing/doctype/workstation_working_hour/workstation_working_hour.json
#: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json
#: erpnext/support/doctype/service_day/service_day.json
@@ -17303,7 +17342,7 @@ msgstr "在Google设置中输入API密钥"
msgid "Enter Company Details"
msgstr ""
-#: erpnext/setup/doctype/employee/employee.js:102
+#: erpnext/setup/doctype/employee/employee.js:108
msgid "Enter First and Last name of Employee, based on Which Full Name will be updated. IN transactions, it will be Full Name which will be fetched."
msgstr "输入员工姓和名,全称将自动更新。交易中将使用全称"
@@ -17315,12 +17354,12 @@ msgstr "手动输入"
msgid "Enter Serial Nos"
msgstr "输入序列号"
-#: erpnext/stock/doctype/material_request/material_request.js:423
+#: erpnext/stock/doctype/material_request/material_request.js:425
msgid "Enter Supplier"
msgstr "输入供应商"
-#: erpnext/manufacturing/doctype/job_card/job_card.js:401
-#: erpnext/manufacturing/doctype/job_card/job_card.js:470
+#: erpnext/manufacturing/doctype/job_card/job_card.js:402
+#: erpnext/manufacturing/doctype/job_card/job_card.js:471
#: erpnext/manufacturing/doctype/workstation/workstation.js:312
msgid "Enter Value"
msgstr "输入值"
@@ -17357,11 +17396,11 @@ msgstr "输入客户邮箱"
msgid "Enter customer's phone number"
msgstr "输入客户电话号码"
-#: erpnext/assets/doctype/asset/asset.js:793
+#: erpnext/assets/doctype/asset/asset.js:804
msgid "Enter date to scrap asset"
msgstr "输入资产报废日期"
-#: erpnext/assets/doctype/asset/asset.py:416
+#: erpnext/assets/doctype/asset/asset.py:475
msgid "Enter depreciation details"
msgstr "输入折旧信息"
@@ -17472,7 +17511,7 @@ msgstr "更新来电信息时出错"
msgid "Error evaluating the criteria formula"
msgstr "评估标准公式时出错"
-#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:303
+#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:307
msgid "Error in party matching for Bank Transaction {0}"
msgstr "银行交易{0}交易方匹配错误"
@@ -17724,6 +17763,11 @@ msgstr "Excise页码"
msgid "Excluded DocTypes"
msgstr "不包括单据类型"
+#. Label of the excluded_fee (Currency) field in DocType 'Bank Transaction'
+#: erpnext/accounts/doctype/bank_transaction/bank_transaction.json
+msgid "Excluded Fee"
+msgstr ""
+
#: erpnext/setup/setup_wizard/operations/install_fixtures.py:265
msgid "Execution"
msgstr "执行"
@@ -17740,6 +17784,11 @@ msgstr "猎头"
msgid "Exempt Supplies"
msgstr "免税供应"
+#. Label of the exempted_role (Link) field in DocType 'Accounting Period'
+#: erpnext/accounts/doctype/accounting_period/accounting_period.json
+msgid "Exempted Role"
+msgstr ""
+
#: erpnext/setup/setup_wizard/data/marketing_source.txt:5
msgid "Exhibition"
msgstr "展会"
@@ -17816,7 +17865,7 @@ msgstr "预计出货日应晚于销售订单日"
#: erpnext/manufacturing/doctype/workstation/workstation_job_card.html:49
#: erpnext/projects/doctype/project/project.json
#: erpnext/projects/doctype/task/task.json
-#: erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py:112
+#: erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py:126
#: erpnext/projects/web_form/tasks/tasks.json
#: erpnext/templates/pages/task_info.html:64
msgid "Expected End Date"
@@ -17840,7 +17889,7 @@ msgstr "预计工时"
#: erpnext/manufacturing/doctype/workstation/workstation_job_card.html:45
#: erpnext/projects/doctype/project/project.json
#: erpnext/projects/doctype/task/task.json
-#: erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py:106
+#: erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py:120
#: erpnext/projects/web_form/tasks/tasks.json
#: erpnext/templates/pages/task_info.html:59
msgid "Expected Start Date"
@@ -17980,7 +18029,7 @@ msgstr "结转资产的费用"
msgid "Expenses Included In Valuation"
msgstr "结转库存的费用"
-#: erpnext/stock/doctype/pick_list/pick_list.py:256
+#: erpnext/stock/doctype/pick_list/pick_list.py:271
#: erpnext/stock/doctype/stock_entry/stock_entry.js:390
msgid "Expired Batches"
msgstr "过期批号"
@@ -18015,7 +18064,7 @@ msgstr "过期(按天计算)"
msgid "Expiry Date"
msgstr "失效日期"
-#: erpnext/stock/doctype/batch/batch.py:212
+#: erpnext/stock/doctype/batch/batch.py:219
msgid "Expiry Date Mandatory"
msgstr "有效期必填"
@@ -18039,6 +18088,12 @@ msgstr "指数平滑法预测"
msgid "Export E-Invoices"
msgstr "出口电子发票"
+#. Label of the extended_bank_statement_section (Section Break) field in
+#. DocType 'Bank Transaction'
+#: erpnext/accounts/doctype/bank_transaction/bank_transaction.json
+msgid "Extended Bank Statement"
+msgstr ""
+
#. Label of the external_work_history (Table) field in DocType 'Employee'
#: erpnext/setup/doctype/employee/employee.json
msgid "External Work History"
@@ -18141,7 +18196,7 @@ msgstr "登录失败"
msgid "Failed to parse MT940 format. Error: {0}"
msgstr "解析MT940格式失败。错误:{0}"
-#: erpnext/assets/doctype/asset/asset.js:214
+#: erpnext/assets/doctype/asset/asset.js:221
msgid "Failed to post depreciation entries"
msgstr "折旧分录过账失败"
@@ -18226,7 +18281,7 @@ msgstr "逾期待付款"
msgid "Fetch Subscription Updates"
msgstr "获取订阅更新"
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1051
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1047
msgid "Fetch Timesheet"
msgstr "选工时单"
@@ -18248,7 +18303,7 @@ msgstr "获取内部交易计价率"
msgid "Fetch Value From"
msgstr "带出关联字段"
-#: erpnext/stock/doctype/material_request/material_request.js:358
+#: erpnext/stock/doctype/material_request/material_request.js:360
#: erpnext/stock/doctype/stock_entry/stock_entry.js:694
msgid "Fetch exploded BOM (including sub-assemblies)"
msgstr "选物料清单底层物料(括子装配件)"
@@ -18276,7 +18331,7 @@ msgid "Fetching Sales Orders..."
msgstr "正在获取销售订单..."
#: erpnext/accounts/doctype/dunning/dunning.js:135
-#: erpnext/public/js/controllers/transaction.js:1480
+#: erpnext/public/js/controllers/transaction.js:1476
msgid "Fetching exchange rates ..."
msgstr "正在获取汇率..."
@@ -18548,15 +18603,15 @@ msgstr "成品物料数量"
msgid "Finished Good Item Quantity"
msgstr "成品物料数量"
-#: erpnext/controllers/accounts_controller.py:3900
+#: erpnext/controllers/accounts_controller.py:3924
msgid "Finished Good Item is not specified for service item {0}"
msgstr "服务物料{0}未指定产成品物料"
-#: erpnext/controllers/accounts_controller.py:3917
+#: erpnext/controllers/accounts_controller.py:3941
msgid "Finished Good Item {0} Qty can not be zero"
msgstr "产成品物料{0}数量不可为零"
-#: erpnext/controllers/accounts_controller.py:3911
+#: erpnext/controllers/accounts_controller.py:3935
msgid "Finished Good Item {0} must be a sub-contracted item"
msgstr "产成品物料{0}必须为外协物料"
@@ -18642,7 +18697,7 @@ msgstr "成品仓"
msgid "Finished Goods based Operating Cost"
msgstr "启用计件成本"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1593
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1594
msgid "Finished Item {0} does not match with Work Order {1}"
msgstr "产成品{0}与工单{1}不匹配"
@@ -18666,7 +18721,7 @@ msgstr "首次回复时间"
msgid "First Response Due"
msgstr "首次响应截止"
-#: erpnext/support/doctype/issue/test_issue.py:238
+#: erpnext/support/doctype/issue/test_issue.py:239
#: erpnext/support/doctype/service_level_agreement/service_level_agreement.py:906
msgid "First Response SLA Failed by {}"
msgstr "首次响应SLA未达标 {}"
@@ -18782,7 +18837,7 @@ msgstr "固定资产"
#. Capitalization Asset Item'
#. Label of the fixed_asset_account (Link) field in DocType 'Asset Category
#. Account'
-#: erpnext/assets/doctype/asset/asset.py:820
+#: erpnext/assets/doctype/asset/asset.py:879
#: erpnext/assets/doctype/asset_capitalization_asset_item/asset_capitalization_asset_item.json
#: erpnext/assets/doctype/asset_category_account/asset_category_account.json
msgid "Fixed Asset Account"
@@ -18808,7 +18863,7 @@ msgstr "固定资产台账"
msgid "Fixed Asset Turnover Ratio"
msgstr "固定资产周转率"
-#: erpnext/manufacturing/doctype/bom/bom.py:679
+#: erpnext/manufacturing/doctype/bom/bom.py:691
msgid "Fixed Asset item {0} cannot be used in BOMs."
msgstr "固定资产物料{0}不可用于物料清单。"
@@ -18864,11 +18919,11 @@ msgstr "液盎司(英制)"
msgid "Fluid Ounce (US)"
msgstr "液盎司(美制)"
-#: erpnext/selling/page/point_of_sale/pos_item_selector.js:335
+#: erpnext/selling/page/point_of_sale/pos_item_selector.js:334
msgid "Focus on Item Group filter"
msgstr "聚焦物料组筛选"
-#: erpnext/selling/page/point_of_sale/pos_item_selector.js:326
+#: erpnext/selling/page/point_of_sale/pos_item_selector.js:325
msgid "Focus on search input"
msgstr "聚焦搜索框"
@@ -18938,7 +18993,7 @@ msgstr "采购"
msgid "For Company"
msgstr "公司"
-#: erpnext/stock/doctype/material_request/material_request.js:401
+#: erpnext/stock/doctype/material_request/material_request.js:403
msgid "For Default Supplier (Optional)"
msgstr "默认供应商(可选)"
@@ -18957,7 +19012,7 @@ msgid "For Job Card"
msgstr "生产任务单"
#. Label of the for_operation (Link) field in DocType 'Job Card'
-#: erpnext/manufacturing/doctype/job_card/job_card.js:514
+#: erpnext/manufacturing/doctype/job_card/job_card.js:515
#: erpnext/manufacturing/doctype/job_card/job_card.json
msgid "For Operation"
msgstr "工序"
@@ -18978,7 +19033,7 @@ msgstr "价格表"
msgid "For Production"
msgstr "生产"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:789
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:790
msgid "For Quantity (Manufactured Qty) is mandatory"
msgstr "数量(制造数量)字段必填"
@@ -19007,7 +19062,7 @@ msgstr "供应商"
#: erpnext/manufacturing/doctype/production_plan/production_plan.js:471
#: erpnext/manufacturing/doctype/production_plan/production_plan.json
#: erpnext/selling/doctype/sales_order/sales_order.js:1399
-#: erpnext/stock/doctype/material_request/material_request.js:347
+#: erpnext/stock/doctype/material_request/material_request.js:349
#: erpnext/templates/form_grid/material_request_grid.html:36
msgid "For Warehouse"
msgstr "仓库"
@@ -19054,7 +19109,7 @@ msgstr "物料{0}仅创建/关联了{1}项资产至{2},
msgid "For item {0}, rate must be a positive number. To Allow negative rates, enable {1} in {2}"
msgstr "物料{0}的税率必须为正数。允许负数需在{2}启用{1}"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:2529
+#: erpnext/manufacturing/doctype/work_order/work_order.py:2524
msgid "For operation {0}: Quantity ({1}) can not be greater than pending quantity({2})"
msgstr "工序{0}:数量({1})不得超过待处理数量({2})"
@@ -19071,7 +19126,7 @@ msgstr "针对项目{0},请更新您的状态"
msgid "For projected and forecast quantities, the system will consider all child warehouses under the selected parent warehouse."
msgstr "对于预计和预测数量,系统将考量所选父仓库下的所有子仓库。"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1625
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1626
msgid "For quantity {0} should not be greater than allowed quantity {1}"
msgstr "成品数量 {0} 不能大于剩余可入库数量 {1}"
@@ -19080,12 +19135,12 @@ msgstr "成品数量 {0} 不能大于剩余可入库数量 {1}"
msgid "For reference"
msgstr "供参考"
-#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1533
+#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1528
#: erpnext/public/js/controllers/accounts.js:204
msgid "For row {0} in {1}. To include {2} in Item rate, rows {3} must also be included"
msgstr "对于{1}的第{0}行。要在物料单价中包括{2},也必须包括第{3}行"
-#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1684
+#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1691
msgid "For row {0}: Enter Planned Qty"
msgstr "请在第{0}行输入计划数量"
@@ -19104,11 +19159,11 @@ msgstr "对于'应用于其他'条件,字段{0}为必填项"
msgid "For the convenience of customers, these codes can be used in print formats like Invoices and Delivery Notes"
msgstr "为方便客户,这些代码可以在打印格式(如发票和销售出库)中使用"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:929
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:930
msgid "For the item {0}, the quantity should be {1} according to the BOM {2}."
msgstr "物料{0}的数量根据BOM{2}应为{1}"
-#: erpnext/public/js/controllers/transaction.js:1290
+#: erpnext/public/js/controllers/transaction.js:1286
msgctxt "Clear payment terms template and/or payment schedule when due date is changed"
msgid "For the new {0} to take effect, would you like to clear the current {1}?"
msgstr "为使新{0}生效,是否清除当前{1}?"
@@ -19728,7 +19783,7 @@ msgstr "总账余额"
#. Name of a DocType
#: erpnext/accounts/doctype/gl_entry/gl_entry.json
-#: erpnext/accounts/report/general_ledger/general_ledger.py:671
+#: erpnext/accounts/report/general_ledger/general_ledger.py:675
msgid "GL Entry"
msgstr "总账分录"
@@ -19991,27 +20046,27 @@ msgstr "分配可拣货仓"
#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:288
#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:320
#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:354
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1107
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1103
#: erpnext/buying/doctype/purchase_order/purchase_order.js:603
#: erpnext/buying/doctype/purchase_order/purchase_order.js:626
#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:366
#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:388
#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:433
-#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:60
-#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:93
+#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:67
+#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:100
#: erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js:80
#: erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js:100
#: erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js:119
#: erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js:142
#: erpnext/manufacturing/doctype/production_plan/production_plan.json
#: erpnext/public/js/controllers/buying.js:327
-#: erpnext/selling/doctype/quotation/quotation.js:167
+#: erpnext/selling/doctype/quotation/quotation.js:174
#: erpnext/selling/doctype/sales_order/sales_order.js:196
#: erpnext/selling/doctype/sales_order/sales_order.js:1200
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:191
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:243
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:187
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:239
#: erpnext/stock/doctype/material_request/material_request.js:129
-#: erpnext/stock/doctype/material_request/material_request.js:224
+#: erpnext/stock/doctype/material_request/material_request.js:226
#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:151
#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:241
#: erpnext/stock/doctype/stock_entry/stock_entry.js:333
@@ -20033,7 +20088,7 @@ msgstr "获取需采购/调拨的物料"
msgid "Get Items for Purchase Only"
msgstr "仅获取需采购的物料"
-#: erpnext/stock/doctype/material_request/material_request.js:332
+#: erpnext/stock/doctype/material_request/material_request.js:334
#: erpnext/stock/doctype/stock_entry/stock_entry.js:697
#: erpnext/stock/doctype/stock_entry/stock_entry.js:710
msgid "Get Items from BOM"
@@ -20148,7 +20203,7 @@ msgstr "选供应商"
msgid "Get Suppliers By"
msgstr "获得供应商"
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1103
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1099
msgid "Get Timesheets"
msgstr "选工时单"
@@ -20218,7 +20273,7 @@ msgstr "在途物料"
msgid "Goods Transferred"
msgstr "已调拨"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:2144
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:2145
msgid "Goods are already received against the outward entry {0}"
msgstr "出库移动物料{0}已收货"
@@ -20813,7 +20868,7 @@ msgstr "可以登记家庭详细信息,如姓名,父母、配偶及子女的
msgid "Here you can maintain height, weight, allergies, medical concerns etc"
msgstr "可以记录身高,体重,是否对某药物过敏等"
-#: erpnext/setup/doctype/employee/employee.js:128
+#: erpnext/setup/doctype/employee/employee.js:134
msgid "Here, you can select a senior of this Employee. Based on this, Organization Chart will be populated."
msgstr "此处可选择该员工的上级,组织架构图将基于此生成"
@@ -21503,7 +21558,7 @@ msgstr "可以手工勾选匹配,否则按时间先后自动匹配"
msgid "If you still want to proceed, please disable 'Skip Available Sub Assembly Items' checkbox."
msgstr "若仍要继续,请取消勾选'跳过可用子装配件'复选框"
-#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1799
+#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1807
msgid "If you still want to proceed, please enable {0}."
msgstr "请勾选{0}后继续"
@@ -21575,7 +21630,7 @@ msgstr "忽略汇率重估及损益日记账"
msgid "Ignore Existing Ordered Qty"
msgstr "忽略已采购数量"
-#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1791
+#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1799
msgid "Ignore Existing Projected Quantity"
msgstr "忽略可用数量"
@@ -21786,11 +21841,11 @@ msgstr "库存数量"
msgid "In Transit"
msgstr "在途中"
-#: erpnext/stock/doctype/material_request/material_request.js:485
+#: erpnext/stock/doctype/material_request/material_request.js:487
msgid "In Transit Transfer"
msgstr "在途调拨"
-#: erpnext/stock/doctype/material_request/material_request.js:454
+#: erpnext/stock/doctype/material_request/material_request.js:456
msgid "In Transit Warehouse"
msgstr "在途仓库"
@@ -22104,6 +22159,15 @@ msgstr ""
msgid "Include in gross"
msgstr "是毛利相关科目"
+#. Label of the included_fee (Currency) field in DocType 'Bank Transaction'
+#: erpnext/accounts/doctype/bank_transaction/bank_transaction.json
+msgid "Included Fee"
+msgstr ""
+
+#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:322
+msgid "Included fee is bigger than the withdrawal itself."
+msgstr ""
+
#: erpnext/accounts/report/gross_and_net_profit_report/gross_and_net_profit_report.py:74
#: erpnext/accounts/report/gross_and_net_profit_report/gross_and_net_profit_report.py:75
msgid "Included in Gross Profit"
@@ -22194,7 +22258,7 @@ msgstr "检测到不兼容设置"
msgid "Incorrect Balance Qty After Transaction"
msgstr "交易记账后结余数量不正确"
-#: erpnext/controllers/subcontracting_controller.py:1037
+#: erpnext/controllers/subcontracting_controller.py:1044
msgid "Incorrect Batch Consumed"
msgstr "消耗批次错误"
@@ -22202,11 +22266,11 @@ msgstr "消耗批次错误"
msgid "Incorrect Check in (group) Warehouse for Reorder"
msgstr "再订购(组)仓库检查错误"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:934
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:935
msgid "Incorrect Component Quantity"
msgstr "组件数量错误"
-#: erpnext/assets/doctype/asset/asset.py:326
+#: erpnext/assets/doctype/asset/asset.py:385
#: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.py:56
msgid "Incorrect Date"
msgstr "日期错误"
@@ -22228,7 +22292,7 @@ msgstr "参考单据错误(采购收货单物料)"
msgid "Incorrect Serial No Valuation"
msgstr "异常序列号成本价"
-#: erpnext/controllers/subcontracting_controller.py:1050
+#: erpnext/controllers/subcontracting_controller.py:1057
msgid "Incorrect Serial Number Consumed"
msgstr "消耗序列号错误"
@@ -22246,7 +22310,7 @@ msgstr "异常物料凭证结余金额"
msgid "Incorrect Type of Transaction"
msgstr "交易类型错误"
-#: erpnext/stock/doctype/pick_list/pick_list.py:161
+#: erpnext/stock/doctype/pick_list/pick_list.py:175
#: erpnext/stock/doctype/stock_settings/stock_settings.py:122
msgid "Incorrect Warehouse"
msgstr "仓库错误"
@@ -22446,7 +22510,7 @@ msgstr "安装日期"
#. 'Installation Note'
#. Label of a Link in the Stock Workspace
#: erpnext/selling/doctype/installation_note/installation_note.json
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:264
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:260
#: erpnext/stock/workspace/stock/stock.json
msgid "Installation Note"
msgstr "安装通知单"
@@ -22495,16 +22559,16 @@ msgstr "说明"
msgid "Insufficient Capacity"
msgstr "产能不足"
-#: erpnext/controllers/accounts_controller.py:3825
-#: erpnext/controllers/accounts_controller.py:3849
+#: erpnext/controllers/accounts_controller.py:3834
+#: erpnext/controllers/accounts_controller.py:3858
msgid "Insufficient Permissions"
msgstr "权限不足"
#: erpnext/accounts/doctype/pos_invoice/pos_invoice.py:462
-#: erpnext/stock/doctype/pick_list/pick_list.py:120
-#: erpnext/stock/doctype/pick_list/pick_list.py:138
-#: erpnext/stock/doctype/pick_list/pick_list.py:1016
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:909
+#: erpnext/stock/doctype/pick_list/pick_list.py:134
+#: erpnext/stock/doctype/pick_list/pick_list.py:152
+#: erpnext/stock/doctype/pick_list/pick_list.py:1032
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:910
#: erpnext/stock/serial_batch_bundle.py:1186 erpnext/stock/stock_ledger.py:1714
#: erpnext/stock/stock_ledger.py:2202
msgid "Insufficient Stock"
@@ -22751,13 +22815,13 @@ msgstr "间隔在1到59分钟之间"
#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:1003
#: erpnext/assets/doctype/asset_category/asset_category.py:69
#: erpnext/assets/doctype/asset_category/asset_category.py:97
-#: erpnext/controllers/accounts_controller.py:3199
-#: erpnext/controllers/accounts_controller.py:3207
+#: erpnext/controllers/accounts_controller.py:3201
+#: erpnext/controllers/accounts_controller.py:3209
msgid "Invalid Account"
msgstr "无效科目"
#: erpnext/accounts/doctype/payment_entry/payment_entry.py:394
-#: erpnext/accounts/doctype/payment_request/payment_request.py:869
+#: erpnext/accounts/doctype/payment_request/payment_request.py:873
msgid "Invalid Allocated Amount"
msgstr "无效分配金额"
@@ -22777,7 +22841,7 @@ msgstr "无效自动重复日期"
msgid "Invalid Barcode. There is no Item attached to this barcode."
msgstr "无效条码,未关联任何物料"
-#: erpnext/public/js/controllers/transaction.js:3091
+#: erpnext/public/js/controllers/transaction.js:3087
msgid "Invalid Blanket Order for the selected Customer and Item"
msgstr "无效框架订单对所选客户和物料无效"
@@ -22789,9 +22853,9 @@ msgstr "无效子流程"
msgid "Invalid Company for Inter Company Transaction."
msgstr "公司间交易的公司无效。"
-#: erpnext/assets/doctype/asset/asset.py:297
-#: erpnext/assets/doctype/asset/asset.py:304
-#: erpnext/controllers/accounts_controller.py:3222
+#: erpnext/assets/doctype/asset/asset.py:356
+#: erpnext/assets/doctype/asset/asset.py:363
+#: erpnext/controllers/accounts_controller.py:3224
msgid "Invalid Cost Center"
msgstr "无效成本中心"
@@ -22838,7 +22902,7 @@ msgstr "无效物料默认值"
msgid "Invalid Ledger Entries"
msgstr "异常总账凭证"
-#: erpnext/assets/doctype/asset/asset.py:498
+#: erpnext/assets/doctype/asset/asset.py:557
msgid "Invalid Net Purchase Amount"
msgstr "净采购金额无效"
@@ -22877,7 +22941,7 @@ msgstr "打印格式无效"
msgid "Invalid Priority"
msgstr "无效的优先级"
-#: erpnext/manufacturing/doctype/bom/bom.py:1157
+#: erpnext/manufacturing/doctype/bom/bom.py:1169
msgid "Invalid Process Loss Configuration"
msgstr "无效的工艺损耗配置"
@@ -22885,7 +22949,7 @@ msgstr "无效的工艺损耗配置"
msgid "Invalid Purchase Invoice"
msgstr "无效的采购发票"
-#: erpnext/controllers/accounts_controller.py:3869
+#: erpnext/controllers/accounts_controller.py:3878
msgid "Invalid Qty"
msgstr "无效的数量"
@@ -22905,8 +22969,8 @@ msgstr "无效的退货"
msgid "Invalid Sales Invoices"
msgstr "无效销售发票"
-#: erpnext/assets/doctype/asset/asset.py:584
-#: erpnext/assets/doctype/asset/asset.py:603
+#: erpnext/assets/doctype/asset/asset.py:643
+#: erpnext/assets/doctype/asset/asset.py:662
msgid "Invalid Schedule"
msgstr "无效的排程计划"
@@ -22914,12 +22978,12 @@ msgstr "无效的排程计划"
msgid "Invalid Selling Price"
msgstr "无效的销售单价"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1668
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1669
msgid "Invalid Serial and Batch Bundle"
msgstr "无效的序列号和批次组合"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:968
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:990
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:969
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:991
msgid "Invalid Source and Target Warehouse"
msgstr ""
@@ -22932,7 +22996,7 @@ msgstr "无效的数值"
msgid "Invalid Warehouse"
msgstr "无效的仓库"
-#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:355
+#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:393
msgid "Invalid amount in accounting entries of {} {} for Account {}: {}"
msgstr "科目{}的{} {}会计凭证中存在无效金额: {}"
@@ -22952,6 +23016,10 @@ msgstr "无效的流失原因{0},请创建新的流失原因"
msgid "Invalid naming series (. missing) for {0}"
msgstr "编号规则无效(缺少.)于{0}"
+#: erpnext/accounts/doctype/payment_request/payment_request.py:544
+msgid "Invalid parameter. 'dn' should be of type str"
+msgstr ""
+
#: erpnext/utilities/transaction_base.py:68
msgid "Invalid reference {0} {1}"
msgstr "无效的参考{0} {1}"
@@ -22985,7 +23053,7 @@ msgid "Invalid {0}: {1}"
msgstr "无效的{0}:{1}"
#. Label of the inventory_section (Tab Break) field in DocType 'Item'
-#: erpnext/setup/install.py:315 erpnext/stock/doctype/item/item.json
+#: erpnext/setup/install.py:327 erpnext/stock/doctype/item/item.json
msgid "Inventory"
msgstr "库存"
@@ -23275,7 +23343,7 @@ msgid "Is Advance"
msgstr "是预付款"
#. Label of the is_alternative (Check) field in DocType 'Quotation Item'
-#: erpnext/selling/doctype/quotation/quotation.js:308
+#: erpnext/selling/doctype/quotation/quotation.js:315
#: erpnext/selling/doctype/quotation_item/quotation_item.json
msgid "Is Alternative"
msgstr "是替代"
@@ -23787,7 +23855,7 @@ msgstr "退款"
msgid "Issue Date"
msgstr "发出日期"
-#: erpnext/stock/doctype/material_request/material_request.js:166
+#: erpnext/stock/doctype/material_request/material_request.js:168
msgid "Issue Material"
msgstr "发料"
@@ -23861,7 +23929,7 @@ msgstr "发货日期"
msgid "It can take upto few hours for accurate stock values to be visible after merging items."
msgstr "合并后的物料库存数量更新可能需几个小时"
-#: erpnext/public/js/controllers/transaction.js:2492
+#: erpnext/public/js/controllers/transaction.js:2488
msgid "It is needed to fetch Item Details."
msgstr "以获取物料详细信息。"
@@ -23985,6 +24053,7 @@ msgstr ""
#: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.js:27
#: erpnext/stock/report/stock_ledger_variance/stock_ledger_variance.py:51
#: erpnext/stock/report/stock_projected_qty/stock_projected_qty.js:28
+#: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.js:8
#: erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py:57
#: erpnext/stock/report/total_stock_summary/total_stock_summary.py:21
#: erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.js:40
@@ -24161,7 +24230,7 @@ msgstr "购物车"
#: erpnext/accounts/doctype/pricing_rule_item_code/pricing_rule_item_code.json
#: erpnext/accounts/doctype/promotional_scheme/promotional_scheme.json
#: erpnext/accounts/doctype/promotional_scheme_product_discount/promotional_scheme_product_discount.json
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1060
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1056
#: erpnext/accounts/report/billed_items_to_be_received/billed_items_to_be_received.py:68
#: erpnext/accounts/report/delivered_items_to_be_billed/delivered_items_to_be_billed.py:37
#: erpnext/accounts/report/gross_profit/gross_profit.py:301
@@ -24216,14 +24285,14 @@ msgstr "购物车"
#: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:86
#: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:119
#: erpnext/projects/doctype/timesheet/timesheet.js:214
-#: erpnext/public/js/controllers/transaction.js:2787
+#: erpnext/public/js/controllers/transaction.js:2783
#: erpnext/public/js/stock_reservation.js:112
#: erpnext/public/js/stock_reservation.js:318 erpnext/public/js/utils.js:488
#: erpnext/public/js/utils.js:644
#: erpnext/regional/doctype/import_supplier_invoice/import_supplier_invoice.json
#: erpnext/selling/doctype/delivery_schedule_item/delivery_schedule_item.json
#: erpnext/selling/doctype/installation_note_item/installation_note_item.json
-#: erpnext/selling/doctype/quotation/quotation.js:282
+#: erpnext/selling/doctype/quotation/quotation.js:289
#: erpnext/selling/doctype/quotation_item/quotation_item.json
#: erpnext/selling/doctype/sales_order/sales_order.js:368
#: erpnext/selling/doctype/sales_order/sales_order.js:476
@@ -24276,6 +24345,7 @@ msgstr "购物车"
#: erpnext/stock/report/serial_no_ledger/serial_no_ledger.js:7
#: erpnext/stock/report/stock_ageing/stock_ageing.py:132
#: erpnext/stock/report/stock_projected_qty/stock_projected_qty.py:104
+#: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.py:25
#: erpnext/stock/report/stock_qty_vs_serial_no_count/stock_qty_vs_serial_no_count.py:26
#: erpnext/subcontracting/doctype/subcontracting_inward_order_item/subcontracting_inward_order_item.json
#: erpnext/subcontracting/doctype/subcontracting_inward_order_received_item/subcontracting_inward_order_received_item.json
@@ -24689,7 +24759,7 @@ msgstr "物料制造商"
#: erpnext/manufacturing/report/production_planning_report/production_planning_report.py:371
#: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:92
#: erpnext/manufacturing/report/work_order_consumed_materials/work_order_consumed_materials.py:138
-#: erpnext/public/js/controllers/transaction.js:2793
+#: erpnext/public/js/controllers/transaction.js:2789
#: erpnext/public/js/utils.js:734
#: erpnext/selling/doctype/quotation_item/quotation_item.json
#: erpnext/selling/doctype/sales_order/sales_order.js:1247
@@ -24733,6 +24803,7 @@ msgstr "物料制造商"
#: erpnext/stock/report/stock_balance/stock_balance.py:404
#: erpnext/stock/report/stock_ledger/stock_ledger.py:213
#: erpnext/stock/report/stock_projected_qty/stock_projected_qty.py:110
+#: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.py:31
#: erpnext/stock/report/stock_qty_vs_serial_no_count/stock_qty_vs_serial_no_count.py:32
#: erpnext/stock/report/supplier_wise_sales_analytics/supplier_wise_sales_analytics.py:58
#: erpnext/stock/report/warehouse_wise_item_balance_age_and_value/warehouse_wise_item_balance_age_and_value.py:98
@@ -24981,7 +25052,7 @@ msgstr "相同规格/属性的多规格物料{0}已存在"
msgid "Item Variants updated"
msgstr "多规格物料已更新"
-#: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.py:73
+#: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.py:85
msgid "Item Warehouse based reposting has been enabled."
msgstr "已启用按物料进行成本追溯调整"
@@ -25066,7 +25137,7 @@ msgstr "物料与仓库"
msgid "Item and Warranty Details"
msgstr "物料和保修"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:3147
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:3148
msgid "Item for row {0} does not match Material Request"
msgstr "行{0}的物料与物料请求不匹配"
@@ -25096,11 +25167,11 @@ msgstr "物料名称"
msgid "Item operation"
msgstr "工序"
-#: erpnext/controllers/accounts_controller.py:3892
+#: erpnext/controllers/accounts_controller.py:3916
msgid "Item qty can not be updated as raw materials are already processed."
msgstr "因原材料已处理,物料数量不可更新"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1073
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1074
msgid "Item rate has been updated to zero as Allow Zero Valuation Rate is checked for item {0}"
msgstr "因勾选了成本价为0,物料 {0} 的单价已设置为0"
@@ -25134,12 +25205,12 @@ msgstr "物料{0}不能作为自身的子装配件添加"
msgid "Item {0} cannot be ordered more than {1} against Blanket Order {2}."
msgstr "物料{0}在总括订单{2}下不可订购超过{1}"
-#: erpnext/assets/doctype/asset/asset.py:279
+#: erpnext/assets/doctype/asset/asset.py:338
#: erpnext/stock/doctype/item/item.py:635
msgid "Item {0} does not exist"
msgstr "物料{0}不存在"
-#: erpnext/manufacturing/doctype/bom/bom.py:607
+#: erpnext/manufacturing/doctype/bom/bom.py:619
msgid "Item {0} does not exist in the system or has expired"
msgstr "物料{0}不存在于系统中或已过期"
@@ -25155,7 +25226,7 @@ msgstr "物料{0}重复输入"
msgid "Item {0} has already been returned"
msgstr "物料{0}已被退回"
-#: erpnext/assets/doctype/asset/asset.py:281
+#: erpnext/assets/doctype/asset/asset.py:340
msgid "Item {0} has been disabled"
msgstr "物料{0}已禁用"
@@ -25195,11 +25266,11 @@ msgstr "物料{0}不允许库存"
msgid "Item {0} is not a subcontracted item"
msgstr "物料{0}非外协物料"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:2054
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:2055
msgid "Item {0} is not active or end of life has been reached"
msgstr "物料{0}处于失效或寿命终止状态"
-#: erpnext/assets/doctype/asset/asset.py:283
+#: erpnext/assets/doctype/asset/asset.py:342
msgid "Item {0} must be a Fixed Asset Item"
msgstr "物料{0}必须被定义为允许资产"
@@ -25211,11 +25282,11 @@ msgstr "物料{0}必须为非库存物料"
msgid "Item {0} must be a Sub-contracted Item"
msgstr "物料{0}必须是委外物料"
-#: erpnext/assets/doctype/asset/asset.py:285
+#: erpnext/assets/doctype/asset/asset.py:344
msgid "Item {0} must be a non-stock item"
msgstr "物料{0}必须是非允许库存物料"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1406
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1407
msgid "Item {0} not found in 'Raw Materials Supplied' table in {1} {2}"
msgstr "在{1} {2}的'供应的原材料'表中未找到物料{0}"
@@ -25231,7 +25302,7 @@ msgstr "物料{0}的订单数量{1}不能小于最低订货量{2}(物料主数
msgid "Item {0}: {1} qty produced. "
msgstr "物料{0}:已生产数量{1}"
-#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1442
+#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1434
msgid "Item {} does not exist."
msgstr "物料{}不存在"
@@ -25272,7 +25343,7 @@ msgstr "物料销售台账"
msgid "Item/Item Code required to get Item Tax Template."
msgstr "获取物料税模板需要物料/物料编码。"
-#: erpnext/manufacturing/doctype/bom/bom.py:349
+#: erpnext/manufacturing/doctype/bom/bom.py:361
msgid "Item: {0} does not exist in the system"
msgstr "物料{0}不存在"
@@ -25290,7 +25361,7 @@ msgstr "物料"
msgid "Items Filter"
msgstr "物料过滤"
-#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1646
+#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1653
#: erpnext/selling/doctype/sales_order/sales_order.js:1668
msgid "Items Required"
msgstr "所需物料"
@@ -25307,11 +25378,11 @@ msgstr "待创建物料需求物料"
msgid "Items and Pricing"
msgstr "物料和定价"
-#: erpnext/controllers/accounts_controller.py:4126
+#: erpnext/controllers/accounts_controller.py:4169
msgid "Items cannot be updated as Subcontracting Inward Order(s) exist against this Subcontracted Sales Order."
msgstr "因存在针对此外包销售订单的外包收货订单,物料无法更新。"
-#: erpnext/controllers/accounts_controller.py:4119
+#: erpnext/controllers/accounts_controller.py:4162
msgid "Items cannot be updated as Subcontracting Order is created against the Purchase Order {0}."
msgstr "因已针对采购订单{0}创建外协订单,物料不可更新"
@@ -25319,7 +25390,7 @@ msgstr "因已针对采购订单{0}创建外协订单,物料不可更新"
msgid "Items for Raw Material Request"
msgstr "用于物料需求的物料号"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1069
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1070
msgid "Items rate has been updated to zero as Allow Zero Valuation Rate is checked for the following items: {0}"
msgstr "因勾选了成本价为0,这些物料 {0} 的单价已设置为0"
@@ -25329,7 +25400,7 @@ msgstr "因勾选了成本价为0,这些物料 {0} 的单价已设置为0"
msgid "Items to Be Repost"
msgstr "待重过账物料"
-#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1645
+#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1652
msgid "Items to Manufacture are required to pull the Raw Materials associated with it."
msgstr "需有装配件或子装配件明细后才可计算采购原材料需求。"
@@ -25529,7 +25600,7 @@ msgstr "委外供应商名"
msgid "Job Worker Warehouse"
msgstr "委外仓库"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:2580
+#: erpnext/manufacturing/doctype/work_order/work_order.py:2575
msgid "Job card {0} created"
msgstr "已创建生产任务单{0}"
@@ -25583,8 +25654,8 @@ msgstr "日记账凭证{0}没有关联"
#: erpnext/accounts/workspace/accounting/accounting.json
#: erpnext/accounts/workspace/payables/payables.json
#: erpnext/accounts/workspace/receivables/receivables.json
-#: erpnext/assets/doctype/asset/asset.js:294
-#: erpnext/assets/doctype/asset/asset.js:303
+#: erpnext/assets/doctype/asset/asset.js:307
+#: erpnext/assets/doctype/asset/asset.js:316
#: erpnext/assets/doctype/asset/asset.json
#: erpnext/assets/doctype/asset_value_adjustment/asset_value_adjustment.json
#: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json
@@ -25817,7 +25888,7 @@ msgstr "到岸成本供应商发票"
#. Name of a DocType
#. Label of a Link in the Stock Workspace
-#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:678
+#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:667
#: erpnext/stock/doctype/landed_cost_voucher/landed_cost_voucher.json
#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:95
#: erpnext/stock/workspace/stock/stock.json
@@ -26272,7 +26343,7 @@ msgstr "许可证号"
msgid "License Plate"
msgstr "车牌"
-#: erpnext/controllers/status_updater.py:461
+#: erpnext/controllers/status_updater.py:467
msgid "Limit Crossed"
msgstr "超出最大数量"
@@ -26325,7 +26396,7 @@ msgid "Link to Material Request"
msgstr "链接到物料需求"
#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:438
-#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:65
+#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:72
msgid "Link to Material Requests"
msgstr "链接到物料申请集"
@@ -26627,7 +26698,7 @@ msgstr "积分:{0}"
#: erpnext/accounts/doctype/loyalty_point_entry/loyalty_point_entry.json
#: erpnext/accounts/doctype/loyalty_program/loyalty_program.json
#: erpnext/accounts/doctype/pos_invoice/pos_invoice.json
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1158
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1154
#: erpnext/accounts/doctype/sales_invoice/sales_invoice.json
#: erpnext/selling/doctype/customer/customer.json
#: erpnext/selling/page/point_of_sale/pos_item_cart.js:952
@@ -26730,7 +26801,7 @@ msgstr "主成本中心{0}不能输入子表"
msgid "Main Item Code"
msgstr ""
-#: erpnext/assets/doctype/asset/asset.js:136
+#: erpnext/assets/doctype/asset/asset.js:142
msgid "Maintain Asset"
msgstr "保养资产"
@@ -26950,7 +27021,7 @@ msgstr "主修/选修科目"
#. Label of the make (Data) field in DocType 'Vehicle'
#: erpnext/accounts/doctype/journal_entry/journal_entry.js:109
-#: erpnext/manufacturing/doctype/job_card/job_card.js:535
+#: erpnext/manufacturing/doctype/job_card/job_card.js:536
#: erpnext/manufacturing/doctype/work_order/work_order.js:808
#: erpnext/manufacturing/doctype/work_order/work_order.js:842
#: erpnext/setup/doctype/vehicle/vehicle.json
@@ -27015,7 +27086,7 @@ msgstr "从工单生成序列号/批号"
msgid "Make Stock Entry"
msgstr "创建物料移动"
-#: erpnext/manufacturing/doctype/job_card/job_card.js:409
+#: erpnext/manufacturing/doctype/job_card/job_card.js:410
msgid "Make Subcontracting PO"
msgstr "创建外协采购订单"
@@ -27039,15 +27110,15 @@ msgstr "生成{0}个多规格物料"
msgid "Making Journal Entries against advance accounts: {0} is not recommended. These Journals won't be available for Reconciliation."
msgstr "因无法核销,不建议在日记账凭证中包括预收/付款科目:{0}"
-#: erpnext/assets/doctype/asset/asset.js:94
-#: erpnext/assets/doctype/asset/asset.js:102
-#: erpnext/assets/doctype/asset/asset.js:110
-#: erpnext/assets/doctype/asset/asset.js:118
-#: erpnext/assets/doctype/asset/asset.js:126
-#: erpnext/assets/doctype/asset/asset.js:140
-#: erpnext/assets/doctype/asset/asset.js:150
-#: erpnext/assets/doctype/asset/asset.js:160
-#: erpnext/assets/doctype/asset/asset.js:176
+#: erpnext/assets/doctype/asset/asset.js:100
+#: erpnext/assets/doctype/asset/asset.js:108
+#: erpnext/assets/doctype/asset/asset.js:116
+#: erpnext/assets/doctype/asset/asset.js:124
+#: erpnext/assets/doctype/asset/asset.js:132
+#: erpnext/assets/doctype/asset/asset.js:146
+#: erpnext/assets/doctype/asset/asset.js:156
+#: erpnext/assets/doctype/asset/asset.js:166
+#: erpnext/assets/doctype/asset/asset.js:182
#: erpnext/setup/doctype/company/company.js:161
#: erpnext/setup/doctype/company/company.js:172
msgid "Manage"
@@ -27094,7 +27165,7 @@ msgstr "针对资产负债科目必填"
msgid "Mandatory For Profit and Loss Account"
msgstr "针对损益科目必填"
-#: erpnext/selling/doctype/quotation/quotation.py:612
+#: erpnext/selling/doctype/quotation/quotation.py:613
msgid "Mandatory Missing"
msgstr "缺少必填项"
@@ -27180,8 +27251,8 @@ msgstr "请到会计设置-递延记账设置中取消勾选自动生成递延
#: erpnext/stock/doctype/material_request_item/material_request_item.json
#: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
#: erpnext/stock/doctype/stock_entry/stock_entry.json
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1150
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1166
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1151
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1167
#: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json
#: erpnext/subcontracting/doctype/subcontracting_order_item/subcontracting_order_item.json
#: erpnext/subcontracting/doctype/subcontracting_receipt_item/subcontracting_receipt_item.json
@@ -27193,6 +27264,11 @@ msgstr "工单入库"
msgid "Manufacture against Material Request"
msgstr "基于物料需求生产"
+#. Label of a number card in the Manufacturing Workspace
+#: erpnext/manufacturing/workspace/manufacturing/manufacturing.json
+msgid "Manufactured Items Value"
+msgstr ""
+
#. Label of the manufactured_qty (Float) field in DocType 'Job Card'
#. Label of the produced_qty (Float) field in DocType 'Work Order'
#: erpnext/manufacturing/doctype/job_card/job_card.json
@@ -27277,7 +27353,7 @@ msgstr "物料的制造商"
#: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json
#: erpnext/manufacturing/workspace/manufacturing/manufacturing.json
#: erpnext/selling/doctype/sales_order/sales_order_dashboard.py:29
-#: erpnext/setup/doctype/company/company.json erpnext/setup/install.py:320
+#: erpnext/setup/doctype/company/company.json erpnext/setup/install.py:332
#: erpnext/setup/setup_wizard/data/industry_type.txt:31
#: erpnext/stock/doctype/batch/batch.json erpnext/stock/doctype/item/item.json
#: erpnext/stock/doctype/item_lead_time/item_lead_time.json
@@ -27320,7 +27396,7 @@ msgstr "生产日期"
msgid "Manufacturing Manager"
msgstr "生产经理"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:2288
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:2289
msgid "Manufacturing Quantity is mandatory"
msgstr "请填写生产数量"
@@ -27542,7 +27618,7 @@ msgstr "工单耗用"
#. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type'
#: erpnext/setup/setup_wizard/operations/install_fixtures.py:114
#: erpnext/stock/doctype/stock_entry/stock_entry.json
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1151
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1152
#: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json
msgid "Material Consumption for Manufacture"
msgstr "工单耗用"
@@ -27572,7 +27648,7 @@ msgstr "其他出库"
#. Option for the 'Purpose' (Select) field in DocType 'Stock Entry'
#. Option for the 'Purpose' (Select) field in DocType 'Stock Entry Type'
#: erpnext/setup/setup_wizard/operations/install_fixtures.py:77
-#: erpnext/stock/doctype/material_request/material_request.js:174
+#: erpnext/stock/doctype/material_request/material_request.js:176
#: erpnext/stock/doctype/stock_entry/stock_entry.json
#: erpnext/stock/doctype/stock_entry_type/stock_entry_type.json
msgid "Material Receipt"
@@ -27613,7 +27689,7 @@ msgstr "其他入库"
#: erpnext/buying/doctype/purchase_order_item/purchase_order_item.json
#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:347
#: erpnext/buying/doctype/request_for_quotation_item/request_for_quotation_item.json
-#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:41
+#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:48
#: erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json
#: erpnext/buying/report/requested_items_to_order_and_receive/requested_items_to_order_and_receive.js:33
#: erpnext/buying/report/requested_items_to_order_and_receive/requested_items_to_order_and_receive.py:184
@@ -27714,7 +27790,7 @@ msgstr "物料需求中的计划物料"
msgid "Material Request Type"
msgstr "物料需求类型"
-#: erpnext/selling/doctype/sales_order/sales_order.py:1794
+#: erpnext/selling/doctype/sales_order/sales_order.py:1795
msgid "Material Request not created, as quantity for Raw Materials already available."
msgstr "因原材料可用数量足够,物料需求未创建,。"
@@ -27728,7 +27804,7 @@ msgstr "销售订单{2}中物料{1}的最大物流申请量为{0}"
msgid "Material Request used to make this Stock Entry"
msgstr "创建此物料移动的物料需求"
-#: erpnext/controllers/subcontracting_controller.py:1303
+#: erpnext/controllers/subcontracting_controller.py:1310
msgid "Material Request {0} is cancelled or stopped"
msgstr "物料需求{0}已取消或已停止"
@@ -27786,7 +27862,7 @@ msgstr "原材料已退回"
#: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json
#: erpnext/setup/setup_wizard/operations/install_fixtures.py:83
#: erpnext/stock/doctype/item/item.json
-#: erpnext/stock/doctype/material_request/material_request.js:152
+#: erpnext/stock/doctype/material_request/material_request.js:154
#: erpnext/stock/doctype/material_request/material_request.json
#: erpnext/stock/doctype/pick_list/pick_list.json
#: erpnext/stock/doctype/stock_entry/stock_entry.json
@@ -27794,7 +27870,7 @@ msgstr "原材料已退回"
msgid "Material Transfer"
msgstr "直接调拨"
-#: erpnext/stock/doctype/material_request/material_request.js:158
+#: erpnext/stock/doctype/material_request/material_request.js:160
msgid "Material Transfer (In Transit)"
msgstr "直接调拨(在途)"
@@ -27842,7 +27918,7 @@ msgstr "客户提供物料"
msgid "Material to Supplier"
msgstr "委外原材料"
-#: erpnext/controllers/subcontracting_controller.py:1524
+#: erpnext/controllers/subcontracting_controller.py:1531
msgid "Materials are already received against the {0} {1}"
msgstr "已根据{0}{1}接收物料"
@@ -27937,11 +28013,11 @@ msgstr "最高净价"
msgid "Maximum Payment Amount"
msgstr "最大付款金额"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:3707
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:3724
msgid "Maximum Samples - {0} can be retained for Batch {1} and Item {2}."
msgstr "可以为批号{1}和物料{2}保留最大样本数量{0}。"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:3698
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:3715
msgid "Maximum Samples - {0} have already been retained for Batch {1} and Item {2} in Batch {3}."
msgstr "批号{1}和批号{3}中的物料{2}已保留最大样本数量{0}。"
@@ -28362,15 +28438,15 @@ msgstr "杂项费用"
msgid "Mismatch"
msgstr "不匹配"
-#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1443
+#: erpnext/stock/doctype/stock_reconciliation/stock_reconciliation.py:1435
msgid "Missing"
msgstr "缺失"
#: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:97
#: erpnext/accounts/doctype/pos_profile/pos_profile.py:200
#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py:595
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2344
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2947
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2345
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2948
#: erpnext/assets/doctype/asset_category/asset_category.py:116
msgid "Missing Account"
msgstr "缺少账户"
@@ -28380,7 +28456,7 @@ msgid "Missing Asset"
msgstr "缺少资产"
#: erpnext/accounts/doctype/gl_entry/gl_entry.py:186
-#: erpnext/assets/doctype/asset/asset.py:313
+#: erpnext/assets/doctype/asset/asset.py:372
msgid "Missing Cost Center"
msgstr "缺少成本中心"
@@ -28392,11 +28468,11 @@ msgstr "公司缺少默认值"
msgid "Missing Filters"
msgstr "缺少筛选条件"
-#: erpnext/assets/doctype/asset/asset.py:358
+#: erpnext/assets/doctype/asset/asset.py:417
msgid "Missing Finance Book"
msgstr "缺少财务账簿"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1603
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1604
msgid "Missing Finished Good"
msgstr "无成品明细行"
@@ -28404,7 +28480,7 @@ msgstr "无成品明细行"
msgid "Missing Formula"
msgstr "未维护公式"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:941
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:942
msgid "Missing Item"
msgstr "缺少物料"
@@ -28424,8 +28500,8 @@ msgstr "未配置外发电子邮件模板。请在“出货设置”中设置。
msgid "Missing required filter: {0}"
msgstr ""
-#: erpnext/manufacturing/doctype/bom/bom.py:1116
-#: erpnext/manufacturing/doctype/work_order/work_order.py:1451
+#: erpnext/manufacturing/doctype/bom/bom.py:1128
+#: erpnext/manufacturing/doctype/work_order/work_order.py:1446
msgid "Missing value"
msgstr "缺失值"
@@ -28695,7 +28771,7 @@ msgstr "多仓库科目"
msgid "Multiple fiscal years exist for the date {0}. Please set company in Fiscal Year"
msgstr "多个财年的日期{0}存在。请设置公司财年"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1610
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1611
msgid "Multiple items cannot be marked as finished item"
msgstr "只允许一个明细行勾选了是成品"
@@ -28704,7 +28780,7 @@ msgid "Music"
msgstr "音乐"
#. Label of the must_be_whole_number (Check) field in DocType 'UOM'
-#: erpnext/manufacturing/doctype/work_order/work_order.py:1398
+#: erpnext/manufacturing/doctype/work_order/work_order.py:1393
#: erpnext/setup/doctype/uom/uom.json
#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py:267
#: erpnext/utilities/transaction_base.py:563
@@ -28978,11 +29054,11 @@ msgstr "净损益"
msgid "Net Purchase Amount"
msgstr "采购金额(未税)"
-#: erpnext/assets/doctype/asset/asset.py:386
+#: erpnext/assets/doctype/asset/asset.py:445
msgid "Net Purchase Amount is mandatory"
msgstr "净采购金额为必填项"
-#: erpnext/assets/doctype/asset/asset.py:493
+#: erpnext/assets/doctype/asset/asset.py:552
msgid "Net Purchase Amount should be equal to purchase amount of one single Asset."
msgstr "净采购金额应等于单项资产的采购金额。"
@@ -29365,7 +29441,7 @@ msgstr "没有控制措施"
msgid "No Answer"
msgstr "未答复"
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2446
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2447
msgid "No Customer found for Inter Company Transactions which represents company {0}"
msgstr "未找到代表公司{0}的关联公司交易客户"
@@ -29390,7 +29466,7 @@ msgstr "没有条码为{0}的物料"
msgid "No Item with Serial No {0}"
msgstr "没启用序列号管理为{0}的物料"
-#: erpnext/controllers/subcontracting_controller.py:1438
+#: erpnext/controllers/subcontracting_controller.py:1445
msgid "No Items selected for transfer."
msgstr "未选择待转移物料"
@@ -29455,7 +29531,7 @@ msgstr "当前无可用库存"
msgid "No Summary"
msgstr "无摘要"
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2430
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2431
msgid "No Supplier found for Inter Company Transactions which represents company {0}"
msgstr "未找到代表公司{0}的关联公司交易供应商"
@@ -29481,7 +29557,7 @@ msgid "No Work Orders were created"
msgstr "无待创建的生产工单"
#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.py:828
-#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:854
+#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:860
msgid "No accounting entries for the following warehouses"
msgstr "没有以下仓库的日记账凭证"
@@ -29525,7 +29601,7 @@ msgstr "未发现库存科目{0}存在差异"
msgid "No employee was scheduled for call popup"
msgstr "未安排员工进行来电弹窗"
-#: erpnext/controllers/subcontracting_controller.py:1347
+#: erpnext/controllers/subcontracting_controller.py:1354
msgid "No item available for transfer."
msgstr "无可用转移物料"
@@ -29538,7 +29614,7 @@ msgstr "销售订单 {0} 无待生产的物料"
msgid "No items are available in the sales order {0} for production"
msgstr "销售订单 {0} 无待生产的物料"
-#: erpnext/selling/page/point_of_sale/pos_item_selector.js:352
+#: erpnext/selling/page/point_of_sale/pos_item_selector.js:351
msgid "No items found. Scan barcode again."
msgstr "未找到物料,请重新扫描条码"
@@ -29597,6 +29673,12 @@ msgstr "月数(费用)"
msgid "No of Months (Revenue)"
msgstr "月数(收)"
+#. Label of the no_of_parallel_reposting (Int) field in DocType 'Stock
+#. Reposting Settings'
+#: erpnext/stock/doctype/stock_reposting_settings/stock_reposting_settings.json
+msgid "No of Parallel Reposting (Per Item)"
+msgstr ""
+
#. Label of the no_of_shares (Int) field in DocType 'Share Balance'
#. Label of the no_of_shares (Int) field in DocType 'Share Transfer'
#: erpnext/accounts/doctype/share_balance/share_balance.json
@@ -29715,11 +29797,11 @@ msgstr "无金额"
msgid "No {0} Accounts found for this company."
msgstr "本公司未找到{0}科目"
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2494
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2495
msgid "No {0} found for Inter Company Transactions."
msgstr "关联公司交易没有找到{0}。"
-#: erpnext/assets/doctype/asset/asset.js:286
+#: erpnext/assets/doctype/asset/asset.js:299
msgid "No."
msgstr "编号"
@@ -29732,6 +29814,11 @@ msgstr "员工数"
msgid "No. of parallel job cards which can be allowed on this workstation. Example: 2 would mean this workstation can process production for two Work Orders at a time."
msgstr "本工作站允许的并行作业卡数量。例如:2表示该工作站可同时处理两个工单的生产"
+#. Label of a number card in the Projects Workspace
+#: erpnext/projects/workspace/projects/projects.json
+msgid "Non Completed Tasks"
+msgstr ""
+
#. Name of a DocType
#. Label of a Link in the Quality Workspace
#. Label of a shortcut in the Quality Workspace
@@ -29750,7 +29837,7 @@ msgstr "非折旧类目"
msgid "Non Profit"
msgstr "公益组织"
-#: erpnext/manufacturing/doctype/bom/bom.py:1506
+#: erpnext/manufacturing/doctype/bom/bom.py:1518
msgid "Non stock items"
msgstr "非库存物料"
@@ -29880,7 +29967,7 @@ msgstr "注意:到期日超过允许的{0}天信用期{1}天。"
msgid "Note: Email will not be sent to disabled users"
msgstr "注意:邮件不会发送给已禁用用户"
-#: erpnext/manufacturing/doctype/bom/bom.py:691
+#: erpnext/manufacturing/doctype/bom/bom.py:703
msgid "Note: If you want to use the finished good {0} as a raw material, then enable the 'Do Not Explode' checkbox in the Items table against the same raw material."
msgstr "注意:若需将产成品{0}作为原材料使用,请在物料表中对应的原材料行启用“不展开”复选框。"
@@ -30221,7 +30308,7 @@ msgstr "基于前一行的总计"
msgid "On This Date"
msgstr "日期"
-#: erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py:80
+#: erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py:84
msgid "On Track"
msgstr "正常"
@@ -30235,6 +30322,12 @@ msgstr "勾选后取消单据将以实际取消日记账,相应月份的报表
msgid "On expanding a row in the Items to Manufacture table, you'll see an option to 'Include Exploded Items'. Ticking this includes raw materials of the sub-assembly items in the production process."
msgstr "展开待生产物料表格行时,将显示'包含展开项'选项。勾选后将在生产过程中包含子装配件的原材料"
+#. Description of the 'Excluded Fee' (Currency) field in DocType 'Bank
+#. Transaction'
+#: erpnext/accounts/doctype/bank_transaction/bank_transaction.json
+msgid "On save, the Excluded Fee will be converted to an Included Fee."
+msgstr ""
+
#. Description of the 'Use Serial / Batch Fields' (Check) field in DocType
#. 'Stock Settings'
#: erpnext/stock/doctype/stock_settings/stock_settings.json
@@ -30335,7 +30428,11 @@ msgstr "仅现有资产"
msgid "Only leaf nodes are allowed in transaction"
msgstr "只有子节点才可用于业务单据中"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1165
+#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:337
+msgid "Only one of Deposit or Withdrawal should be non-zero when applying an Excluded Fee."
+msgstr ""
+
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1166
msgid "Only one {0} entry can be created against the Work Order {1}"
msgstr "每个工单{1}仅能创建一个{0}条目"
@@ -30432,7 +30529,7 @@ msgstr "未处理通知"
msgid "Open Orders"
msgstr "未结订单"
-#. Label of a chart in the Projects Workspace
+#. Label of a number card in the Projects Workspace
#. Label of the project (Check) field in DocType 'Email Digest'
#: erpnext/projects/workspace/projects/projects.json
#: erpnext/setup/doctype/email_digest/email_digest.json
@@ -30475,7 +30572,9 @@ msgid "Open Work Order {0}"
msgstr "打开工单{0}"
#. Name of a report
+#. Label of a number card in the Manufacturing Workspace
#: erpnext/manufacturing/report/open_work_orders/open_work_orders.json
+#: erpnext/manufacturing/workspace/manufacturing/manufacturing.json
msgid "Open Work Orders"
msgstr "未开始生产工单"
@@ -30686,7 +30785,7 @@ msgstr "工费成本(本币)"
msgid "Operating Cost Per BOM Quantity"
msgstr "每个成品工费成本"
-#: erpnext/manufacturing/doctype/bom/bom.py:1590
+#: erpnext/manufacturing/doctype/bom/bom.py:1602
msgid "Operating Cost as per Work Order / BOM"
msgstr "按工单/物料清单计算的运营成本"
@@ -30762,7 +30861,7 @@ msgstr "工序行号"
msgid "Operation Time"
msgstr "工序时间"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:1457
+#: erpnext/manufacturing/doctype/work_order/work_order.py:1452
msgid "Operation Time must be greater than 0 for Operation {0}"
msgstr "工序{0}的时间必须大于0"
@@ -30777,7 +30876,7 @@ msgstr "多少成品工序已完成?"
msgid "Operation time does not depend on quantity to produce"
msgstr "加工(操作)时间不随着生产数量变化"
-#: erpnext/manufacturing/doctype/job_card/job_card.js:577
+#: erpnext/manufacturing/doctype/job_card/job_card.js:578
msgid "Operation {0} added multiple times in the work order {1}"
msgstr "工单{1}中工序{0}被多次添加"
@@ -30811,7 +30910,7 @@ msgstr "工序"
msgid "Operations Routing"
msgstr "工序路线"
-#: erpnext/manufacturing/doctype/bom/bom.py:1125
+#: erpnext/manufacturing/doctype/bom/bom.py:1137
msgid "Operations cannot be left blank"
msgstr "请填写工序信息"
@@ -30871,7 +30970,7 @@ msgstr "按来源统计的商机"
#: erpnext/crm/report/lead_details/lead_details.js:36
#: erpnext/crm/report/lost_opportunity/lost_opportunity.py:17
#: erpnext/crm/workspace/crm/crm.json erpnext/public/js/communication.js:35
-#: erpnext/selling/doctype/quotation/quotation.js:139
+#: erpnext/selling/doctype/quotation/quotation.js:146
#: erpnext/selling/doctype/quotation/quotation.json
msgid "Opportunity"
msgstr "商机"
@@ -31238,7 +31337,7 @@ msgstr "年度维保合同失效日"
msgid "Out of Order"
msgstr "乱序"
-#: erpnext/stock/doctype/pick_list/pick_list.py:564
+#: erpnext/stock/doctype/pick_list/pick_list.py:580
msgid "Out of Stock"
msgstr "缺货"
@@ -31367,7 +31466,7 @@ msgstr "允许超量拣货(%)"
msgid "Over Receipt"
msgstr "超收"
-#: erpnext/controllers/status_updater.py:466
+#: erpnext/controllers/status_updater.py:472
msgid "Over Receipt/Delivery of {0} {1} ignored for item {2} because you have {3} role."
msgstr "因您具有{3}角色,物料{2}的{0} {1}超收/交付已被忽略"
@@ -31382,7 +31481,7 @@ msgstr "允许超量发料(%)"
msgid "Over Transfer Allowance (%)"
msgstr "允许超量发料(%)"
-#: erpnext/controllers/status_updater.py:468
+#: erpnext/controllers/status_updater.py:474
msgid "Overbilling of {0} {1} ignored for item {2} because you have {3} role."
msgstr "因您具有{3}角色,物料{2}的{0} {1}超计费已被忽略"
@@ -31866,7 +31965,7 @@ msgstr "包装清单"
#. Name of a DocType
#. Label of a Link in the Stock Workspace
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:300
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:296
#: erpnext/stock/doctype/packing_slip/packing_slip.json
#: erpnext/stock/workspace/stock/stock.json
msgid "Packing Slip"
@@ -32377,7 +32476,7 @@ msgstr "百万分率"
#: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:147
#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:228
#: erpnext/accounts/report/general_ledger/general_ledger.js:74
-#: erpnext/accounts/report/general_ledger/general_ledger.py:750
+#: erpnext/accounts/report/general_ledger/general_ledger.py:754
#: erpnext/accounts/report/payment_ledger/payment_ledger.js:51
#: erpnext/accounts/report/payment_ledger/payment_ledger.py:161
#: erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.js:46
@@ -32482,7 +32581,7 @@ msgstr "交易方不匹配"
#: erpnext/accounts/doctype/payment_entry/payment_entry.json
#: erpnext/accounts/doctype/payment_request/payment_request.json
#: erpnext/accounts/report/general_ledger/general_ledger.js:110
-#: erpnext/accounts/report/general_ledger/general_ledger.py:759
+#: erpnext/accounts/report/general_ledger/general_ledger.py:763
#: erpnext/crm/doctype/contract/contract.json
#: erpnext/selling/doctype/party_specific_item/party_specific_item.json
#: erpnext/selling/report/address_and_contacts/address_and_contacts.js:22
@@ -32546,7 +32645,7 @@ msgstr "客户/供应商可交易物料"
#: erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py:141
#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:219
#: erpnext/accounts/report/general_ledger/general_ledger.js:65
-#: erpnext/accounts/report/general_ledger/general_ledger.py:749
+#: erpnext/accounts/report/general_ledger/general_ledger.py:753
#: erpnext/accounts/report/payment_ledger/payment_ledger.js:41
#: erpnext/accounts/report/payment_ledger/payment_ledger.py:157
#: erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.js:35
@@ -32634,7 +32733,7 @@ msgstr "历史事件"
msgid "Pause"
msgstr "暂停"
-#: erpnext/manufacturing/doctype/job_card/job_card.js:254
+#: erpnext/manufacturing/doctype/job_card/job_card.js:255
msgid "Pause Job"
msgstr "暂停生产任务单"
@@ -32838,7 +32937,7 @@ msgstr "扣款"
msgid "Payment Entry Reference"
msgstr "付款参考"
-#: erpnext/accounts/doctype/payment_request/payment_request.py:449
+#: erpnext/accounts/doctype/payment_request/payment_request.py:450
msgid "Payment Entry already exists"
msgstr "收付款凭证已存在"
@@ -32847,7 +32946,7 @@ msgid "Payment Entry has been modified after you pulled it. Please pull it again
msgstr "选择收付款凭证后有修改,请重新选取。"
#: erpnext/accounts/doctype/payment_request/payment_request.py:128
-#: erpnext/accounts/doctype/payment_request/payment_request.py:549
+#: erpnext/accounts/doctype/payment_request/payment_request.py:553
msgid "Payment Entry is already created"
msgstr "收付款凭证已创建"
@@ -33050,7 +33149,7 @@ msgstr "付款参考"
#. Name of a DocType
#. Label of a Link in the Receivables Workspace
#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json
-#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1707
+#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1702
#: erpnext/accounts/doctype/payment_entry_reference/payment_entry_reference.json
#: erpnext/accounts/doctype/payment_order/payment_order.js:19
#: erpnext/accounts/doctype/payment_order/payment_order.json
@@ -33082,11 +33181,11 @@ msgstr "收付款申请类型"
msgid "Payment Request created from Sales Order or Purchase Order will be in Draft status. When disabled document will be in unsaved state."
msgstr "销售订单或采购订单生成的付款请求将处于草稿状态。禁用后单据将处于未保存状态"
-#: erpnext/accounts/doctype/payment_request/payment_request.py:622
+#: erpnext/accounts/doctype/payment_request/payment_request.py:626
msgid "Payment Request for {0}"
msgstr "收付款申请{0}"
-#: erpnext/accounts/doctype/payment_request/payment_request.py:564
+#: erpnext/accounts/doctype/payment_request/payment_request.py:568
msgid "Payment Request is already created"
msgstr "付款请求已创建"
@@ -33094,7 +33193,7 @@ msgstr "付款请求已创建"
msgid "Payment Request took too long to respond. Please try requesting for payment again."
msgstr "付款请求响应超时,请重试"
-#: erpnext/accounts/doctype/payment_request/payment_request.py:540
+#: erpnext/accounts/doctype/payment_request/payment_request.py:541
msgid "Payment Requests cannot be created against: {0}"
msgstr "无法针对以下类型创建付款请求:{0}"
@@ -33112,7 +33211,7 @@ msgstr "无法针对以下类型创建付款请求:{0}"
#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.json
#: erpnext/accounts/doctype/sales_invoice/sales_invoice.json
#: erpnext/buying/doctype/purchase_order/purchase_order.json
-#: erpnext/controllers/accounts_controller.py:2724
+#: erpnext/controllers/accounts_controller.py:2726
#: erpnext/selling/doctype/quotation/quotation.json
#: erpnext/selling/doctype/sales_order/sales_order.json
msgid "Payment Schedule"
@@ -33733,8 +33832,8 @@ msgstr "电话"
#. Reservation Entry'
#. Label of a Link in the Stock Workspace
#: erpnext/selling/doctype/sales_order/sales_order.js:1022
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:203
-#: erpnext/stock/doctype/material_request/material_request.js:143
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:199
+#: erpnext/stock/doctype/material_request/material_request.js:144
#: erpnext/stock/doctype/pick_list/pick_list.json
#: erpnext/stock/doctype/stock_entry/stock_entry.json
#: erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.json
@@ -33742,7 +33841,7 @@ msgstr "电话"
msgid "Pick List"
msgstr "拣货单"
-#: erpnext/stock/doctype/pick_list/pick_list.py:217
+#: erpnext/stock/doctype/pick_list/pick_list.py:231
msgid "Pick List Incomplete"
msgstr "拣货单不完整"
@@ -33784,7 +33883,9 @@ msgstr "自动选序列号/批号规则"
msgid "Pick Serial / Batch No"
msgstr "选序列号 / 批号"
+#. Label of the picked_qty (Float) field in DocType 'Material Request Item'
#. Label of the picked_qty (Float) field in DocType 'Packed Item'
+#: erpnext/stock/doctype/material_request_item/material_request_item.json
#: erpnext/stock/doctype/packed_item/packed_item.json
msgid "Picked Qty"
msgstr "拣货数量"
@@ -34057,7 +34158,7 @@ msgstr "车间"
msgid "Plants and Machineries"
msgstr "植物和机械设备"
-#: erpnext/stock/doctype/pick_list/pick_list.py:561
+#: erpnext/stock/doctype/pick_list/pick_list.py:577
msgid "Please Restock Items and Update the Pick List to continue. To discontinue, cancel the Pick List."
msgstr "请补货并更新领料单以继续。若要终止,请取消领料单。"
@@ -34069,8 +34170,8 @@ msgstr "请先选择公司"
msgid "Please Select a Company."
msgstr "请先选择公司"
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:166
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:208
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:162
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:204
msgid "Please Select a Customer"
msgstr "请选择客户"
@@ -34088,7 +34189,7 @@ msgstr "请设置优先级"
msgid "Please Set Supplier Group in Buying Settings."
msgstr "请设置供应商组采购设置。"
-#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1878
+#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1873
msgid "Please Specify Account"
msgstr "请指定账户"
@@ -34140,7 +34241,7 @@ msgstr "请调整数量或修改 {0} 后继续"
msgid "Please attach CSV file"
msgstr "请附加CSV文件"
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3084
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3085
msgid "Please cancel and amend the Payment Entry"
msgstr "请取消并修改付款分录"
@@ -34153,6 +34254,11 @@ msgstr "请先手动取消付款分录"
msgid "Please cancel related transaction."
msgstr "请取消相关交易。"
+#: erpnext/assets/doctype/asset/asset.js:85
+#: erpnext/assets/doctype/asset/asset.py:248
+msgid "Please capitalize this asset before submitting."
+msgstr ""
+
#: erpnext/accounts/doctype/journal_entry/journal_entry.py:941
msgid "Please check Multi Currency option to allow accounts with other currency"
msgstr "请勾选允许同一往来单位发票多货币"
@@ -34206,7 +34312,7 @@ msgstr "请联系管理员延长{0}的信用额度"
msgid "Please convert the parent account in corresponding child company to a group account."
msgstr "请将对应子公司的上级账户转换为组账户"
-#: erpnext/selling/doctype/quotation/quotation.py:610
+#: erpnext/selling/doctype/quotation/quotation.py:611
msgid "Please create Customer from Lead {0}."
msgstr "请从线索{0}创建客户"
@@ -34222,7 +34328,7 @@ msgstr "如需,请新建会计维度"
msgid "Please create purchase from internal sale or delivery document itself"
msgstr "请自关联方内部销售或出货单创建采购订单"
-#: erpnext/assets/doctype/asset/asset.py:396
+#: erpnext/assets/doctype/asset/asset.py:455
msgid "Please create purchase receipt or purchase invoice for the item {0}"
msgstr "请为物料{0}创建采购入库或采购发票"
@@ -34234,7 +34340,7 @@ msgstr "在合并{1}到{2}前,请先删除产品套装{0}"
msgid "Please disable workflow temporarily for Journal Entry {0}"
msgstr "请暂时停用日记账凭证{0}的工作流。"
-#: erpnext/assets/doctype/asset/asset.py:497
+#: erpnext/assets/doctype/asset/asset.py:556
msgid "Please do not book expense of multiple assets against one single Asset."
msgstr "请勿将多个资产的费用记入单一资产"
@@ -34250,7 +34356,7 @@ msgstr "请启用适用于预订实际费用"
msgid "Please enable Applicable on Purchase Order and Applicable on Booking Actual Expenses"
msgstr "请启用适用于采购订单并适用于预订实际费用"
-#: erpnext/stock/doctype/pick_list/pick_list.py:267
+#: erpnext/stock/doctype/pick_list/pick_list.py:282
msgid "Please enable Use Old Serial / Batch Fields to make_bundle"
msgstr "请启用'使用旧序列/批次字段'以生成套装"
@@ -34282,7 +34388,7 @@ msgstr "请确保{}账户为资产负债表账户"
msgid "Please ensure {} account {} is a Receivable account."
msgstr "请确保{}账户{}为应收账户"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:663
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:664
msgid "Please enter Difference Account or set default Stock Adjustment Account for company {0}"
msgstr "请输入差异账户或为公司{0}设置默认库存调整账户"
@@ -34316,7 +34422,7 @@ msgstr "请输入您的费用科目"
msgid "Please enter Item Code to get Batch Number"
msgstr "请输入产品代码来获得批号"
-#: erpnext/public/js/controllers/transaction.js:2948
+#: erpnext/public/js/controllers/transaction.js:2944
msgid "Please enter Item Code to get batch no"
msgstr "请输入物料号,以获得批号"
@@ -34332,7 +34438,7 @@ msgstr "请先输入维护明细"
msgid "Please enter Planned Qty for Item {0} at row {1}"
msgstr "请为第{1}行的物料{0}输入计划数量"
-#: erpnext/setup/doctype/employee/employee.js:77
+#: erpnext/setup/doctype/employee/employee.js:83
msgid "Please enter Preferred Contact Email"
msgstr "请输入首选电子邮件联系"
@@ -34389,7 +34495,7 @@ msgstr "请至少输入一个交货日期和数量"
msgid "Please enter company name first"
msgstr "请先输入公司名"
-#: erpnext/controllers/accounts_controller.py:2950
+#: erpnext/controllers/accounts_controller.py:2952
msgid "Please enter default currency in Company Master"
msgstr "请在公司设置中维护默认货币"
@@ -34532,7 +34638,7 @@ msgstr "请选择模板类型以下载模板"
msgid "Please select Apply Discount On"
msgstr "请选择适用的折扣"
-#: erpnext/selling/doctype/sales_order/sales_order.py:1740
+#: erpnext/selling/doctype/sales_order/sales_order.py:1741
msgid "Please select BOM against item {0}"
msgstr "请选择物料{0}的物料清单"
@@ -34552,7 +34658,7 @@ msgstr "请选择银行账户"
msgid "Please select Category first"
msgstr "请先选择类型。"
-#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1485
+#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1484
#: erpnext/public/js/controllers/accounts.js:94
#: erpnext/public/js/controllers/accounts.js:145
msgid "Please select Charge Type first"
@@ -34591,8 +34697,8 @@ msgstr "请选择现有的公司创建会计科目表"
msgid "Please select Finished Good Item for Service Item {0}"
msgstr "请为服务项{0}选择产成品"
-#: erpnext/assets/doctype/asset/asset.js:619
-#: erpnext/assets/doctype/asset/asset.js:634
+#: erpnext/assets/doctype/asset/asset.js:630
+#: erpnext/assets/doctype/asset/asset.js:645
msgid "Please select Item Code first"
msgstr "请先选择物料号"
@@ -34620,11 +34726,11 @@ msgstr "在选择往来单位之前请先选择记账日期"
msgid "Please select Posting Date first"
msgstr "请先选择记账日期"
-#: erpnext/manufacturing/doctype/bom/bom.py:1170
+#: erpnext/manufacturing/doctype/bom/bom.py:1182
msgid "Please select Price List"
msgstr "请选择价格表"
-#: erpnext/selling/doctype/sales_order/sales_order.py:1742
+#: erpnext/selling/doctype/sales_order/sales_order.py:1743
msgid "Please select Qty against item {0}"
msgstr "请选择为物料{0}指定数量"
@@ -34644,28 +34750,28 @@ msgstr "请为物料{0}选择开始日期和结束日期"
msgid "Please select Stock Asset Account"
msgstr "请选择库存资产科目"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1527
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1528
msgid "Please select Subcontracting Order instead of Purchase Order {0}"
msgstr "请选择委外订单而非采购订单{0}"
-#: erpnext/controllers/accounts_controller.py:2799
+#: erpnext/controllers/accounts_controller.py:2801
msgid "Please select Unrealized Profit / Loss account or add default Unrealized Profit / Loss account account for company {0}"
msgstr "请在单据中维护公司内部交易未实现损益科目,或在公司 {0} 主数据中维护相应的默认科目"
-#: erpnext/manufacturing/doctype/bom/bom.py:1418
+#: erpnext/manufacturing/doctype/bom/bom.py:1430
msgid "Please select a BOM"
msgstr "请选择一个物料清单"
#: erpnext/accounts/party.py:430
-#: erpnext/stock/doctype/pick_list/pick_list.py:1591
+#: erpnext/stock/doctype/pick_list/pick_list.py:1607
msgid "Please select a Company"
msgstr "请选择一个公司"
#: erpnext/accounts/doctype/payment_entry/payment_entry.js:267
#: erpnext/manufacturing/doctype/bom/bom.js:648
-#: erpnext/manufacturing/doctype/bom/bom.py:264
+#: erpnext/manufacturing/doctype/bom/bom.py:276
#: erpnext/public/js/controllers/accounts.js:277
-#: erpnext/public/js/controllers/transaction.js:3244
+#: erpnext/public/js/controllers/transaction.js:3240
msgid "Please select a Company first."
msgstr "请先选择公司"
@@ -34681,7 +34787,7 @@ msgstr "请先选择销售出库"
msgid "Please select a Subcontracting Purchase Order."
msgstr "请选择委外采购订单"
-#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:76
+#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:83
msgid "Please select a Supplier"
msgstr "请选择供应商"
@@ -34738,7 +34844,7 @@ msgstr "请选择包含服务项目的有效采购订单"
msgid "Please select a valid Purchase Order that is configured for Subcontracting."
msgstr "请选择配置为委外的有效采购订单"
-#: erpnext/selling/doctype/quotation/quotation.js:230
+#: erpnext/selling/doctype/quotation/quotation.js:237
msgid "Please select a value for {0} quotation_to {1}"
msgstr "请选择一个值{0} quotation_to {1}"
@@ -34754,6 +34860,10 @@ msgstr "请至少选择一个筛选条件:物料编码、批次或序列号"
msgid "Please select at least one row to fix"
msgstr "请至少选择一行进行修复"
+#: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.js:50
+msgid "Please select at least one row with difference value"
+msgstr ""
+
#: erpnext/selling/doctype/sales_order/sales_order.js:1288
msgid "Please select atleast one item to continue"
msgstr "请至少选择一个物料以继续操作"
@@ -34883,7 +34993,7 @@ msgstr "请在{}设置会计维度{}"
#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js:58
#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js:68
#: erpnext/accounts/doctype/process_statement_of_accounts/process_statement_of_accounts.js:78
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:781
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:777
msgid "Please set Company"
msgstr "请设公司"
@@ -34951,11 +35061,11 @@ msgstr "请在 UAE 增值税设置中设置公司的增值税账户: \"{0}\""
msgid "Please set a Company"
msgstr "请设置公司"
-#: erpnext/assets/doctype/asset/asset.py:310
+#: erpnext/assets/doctype/asset/asset.py:369
msgid "Please set a Cost Center for the Asset or set an Asset Depreciation Cost Center for the Company {}"
msgstr "请为资产设置成本中心或为公司{}设置资产折旧成本中心"
-#: erpnext/projects/doctype/project/project.py:730
+#: erpnext/projects/doctype/project/project.py:731
msgid "Please set a default Holiday List for Company {0}"
msgstr "请为公司{0}设置默认假期列表"
@@ -34992,19 +35102,19 @@ msgstr "请在“税费和收费表”中至少设置一行"
msgid "Please set both the Tax ID and Fiscal Code on Company {0}"
msgstr "请为公司{0}同时设置税号和财政代码"
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2341
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2342
msgid "Please set default Cash or Bank account in Mode of Payment {0}"
msgstr "请为付款方式{0}设置默认的现金或银行科目"
#: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:94
#: erpnext/accounts/doctype/pos_profile/pos_profile.py:197
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2944
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2945
msgid "Please set default Cash or Bank account in Mode of Payment {}"
msgstr "请在付款方式{}设置默认现金或银行账户"
#: erpnext/accounts/doctype/pos_opening_entry/pos_opening_entry.py:96
#: erpnext/accounts/doctype/pos_profile/pos_profile.py:199
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2946
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2947
msgid "Please set default Cash or Bank account in Mode of Payments {}"
msgstr "请在付款方式{}设置默认现金或银行账户"
@@ -35041,11 +35151,11 @@ msgstr "根据物料或仓库请设置过滤条件"
msgid "Please set one of the following:"
msgstr "请设置以下其中一项:"
-#: erpnext/assets/doctype/asset/asset.py:575
+#: erpnext/assets/doctype/asset/asset.py:634
msgid "Please set opening number of booked depreciations"
msgstr "请设置已登记折旧的期初数量。"
-#: erpnext/public/js/controllers/transaction.js:2635
+#: erpnext/public/js/controllers/transaction.js:2631
msgid "Please set recurring after saving"
msgstr "请保存后设置自动重复参数"
@@ -35088,7 +35198,7 @@ msgstr "请设置{0}"
msgid "Please set {0} first."
msgstr "请先设置{0}"
-#: erpnext/stock/doctype/batch/batch.py:207
+#: erpnext/stock/doctype/batch/batch.py:214
msgid "Please set {0} for Batched Item {1}, which is used to set {2} on Submit."
msgstr "请为批次物料{1}设置{0},用于提交时设置{2}"
@@ -35126,8 +35236,7 @@ msgstr "请选择公司"
msgid "Please specify Company to proceed"
msgstr "请输入公司后继续"
-#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1508
-#: erpnext/controllers/accounts_controller.py:3181
+#: erpnext/controllers/accounts_controller.py:3183
#: erpnext/public/js/controllers/accounts.js:117
msgid "Please specify a valid Row ID for row {0} in table {1}"
msgstr "请指定行{0}在表中的有效行ID {1}"
@@ -35325,7 +35434,7 @@ msgstr "邮政费用"
#: erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py:61
#: erpnext/accounts/report/billed_items_to_be_received/billed_items_to_be_received.py:66
#: erpnext/accounts/report/cheques_and_deposits_incorrectly_cleared/cheques_and_deposits_incorrectly_cleared.py:151
-#: erpnext/accounts/report/general_ledger/general_ledger.py:677
+#: erpnext/accounts/report/general_ledger/general_ledger.py:681
#: erpnext/accounts/report/gross_profit/gross_profit.py:289
#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:175
#: erpnext/accounts/report/item_wise_sales_register/item_wise_sales_register.py:192
@@ -35440,7 +35549,7 @@ msgstr "记账日期时间"
msgid "Posting Time"
msgstr "记账时间"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:2236
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:2237
msgid "Posting date and posting time is mandatory"
msgstr "记账日期和记账时间必填"
@@ -35835,7 +35944,7 @@ msgstr "单价({0})"
msgid "Price is not set for the item."
msgstr "未设置物料价格"
-#: erpnext/manufacturing/doctype/bom/bom.py:503
+#: erpnext/manufacturing/doctype/bom/bom.py:515
msgid "Price not found for item {0} in price list {1}"
msgstr "针对价格表{1}的物料{0}价格未定义"
@@ -36208,7 +36317,7 @@ msgstr "流程描述"
msgid "Process Loss"
msgstr "制程损耗"
-#: erpnext/manufacturing/doctype/bom/bom.py:1153
+#: erpnext/manufacturing/doctype/bom/bom.py:1165
msgid "Process Loss Percentage cannot be greater than 100"
msgstr "加工损耗百分比不能超过100"
@@ -36230,7 +36339,7 @@ msgstr "加工损耗百分比不能超过100"
msgid "Process Loss Qty"
msgstr "制程损耗数量"
-#: erpnext/manufacturing/doctype/job_card/job_card.js:331
+#: erpnext/manufacturing/doctype/job_card/job_card.js:332
msgid "Process Loss Quantity"
msgstr "加工损耗量"
@@ -36371,8 +36480,10 @@ msgstr "已生产/已接收数量"
msgid "Produced Qty"
msgstr "完工数量"
+#. Label of a chart in the Manufacturing Workspace
#. Label of the produced_qty (Float) field in DocType 'Sales Order Item'
#: erpnext/manufacturing/dashboard_fixtures.py:59
+#: erpnext/manufacturing/workspace/manufacturing/manufacturing.json
#: erpnext/selling/doctype/sales_order_item/sales_order_item.json
msgid "Produced Quantity"
msgstr "生产的产品数量"
@@ -36649,7 +36760,7 @@ msgstr "盈利能力分析"
msgid "Progress % for a task cannot be more than 100."
msgstr "为任务进度百分比不能超过100个。"
-#: erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py:102
+#: erpnext/projects/report/delayed_tasks_summary/delayed_tasks_summary.py:116
msgid "Progress (%)"
msgstr "进展(%)"
@@ -36695,7 +36806,7 @@ msgstr "项目状态"
msgid "Project Summary"
msgstr "项目汇总"
-#: erpnext/projects/doctype/project/project.py:668
+#: erpnext/projects/doctype/project/project.py:669
msgid "Project Summary for {0}"
msgstr "{0}的项目摘要"
@@ -37022,7 +37133,7 @@ msgstr "出版"
#: erpnext/accounts/doctype/tax_rule/tax_rule.json
#: erpnext/manufacturing/doctype/material_request_plan_item/material_request_plan_item.json
#: erpnext/projects/doctype/project/project_dashboard.py:16
-#: erpnext/setup/doctype/company/company.py:454 erpnext/setup/install.py:334
+#: erpnext/setup/doctype/company/company.py:454 erpnext/setup/install.py:346
#: erpnext/stock/doctype/item/item.json
#: erpnext/stock/doctype/item_lead_time/item_lead_time.json
#: erpnext/stock/doctype/item_reorder/item_reorder.json
@@ -37169,7 +37280,7 @@ msgstr "采购发票明细"
msgid "Purchase Invoice Trends"
msgstr "采购发票趋势"
-#: erpnext/assets/doctype/asset/asset.py:272
+#: erpnext/assets/doctype/asset/asset.py:331
msgid "Purchase Invoice cannot be made against an existing asset {0}"
msgstr "采购发票不能基于现存固定资产 {0}"
@@ -37201,7 +37312,7 @@ msgstr "采购发票"
#. Label of the purchase_order (Link) field in DocType 'Stock Entry'
#. Label of the purchase_order (Link) field in DocType 'Subcontracting Receipt
#. Item'
-#. Label of a shortcut in the Subcontracting Workspace
+#. Label of a Link in the Subcontracting Workspace
#: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:145
#: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json
@@ -37226,7 +37337,7 @@ msgstr "采购发票"
#: erpnext/selling/doctype/sales_order_item/sales_order_item.json
#: erpnext/setup/doctype/authorization_rule/authorization_rule.json
#: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json
-#: erpnext/stock/doctype/material_request/material_request.js:182
+#: erpnext/stock/doctype/material_request/material_request.js:184
#: erpnext/stock/doctype/purchase_receipt/purchase_receipt.js:214
#: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
#: erpnext/stock/doctype/stock_entry/stock_entry.json
@@ -37291,7 +37402,7 @@ msgstr "采购订单明细"
msgid "Purchase Order Item Supplied"
msgstr "采购订单外发物料"
-#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:969
+#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:975
msgid "Purchase Order Item reference is missing in Subcontracting Receipt {0}"
msgstr "分包收货单{0}中缺少采购订单项引用"
@@ -37340,6 +37451,11 @@ msgstr "采购订单{0}未提交"
msgid "Purchase Orders"
msgstr "采购订单"
+#. Label of a number card in the Buying Workspace
+#: erpnext/buying/workspace/buying/buying.json
+msgid "Purchase Orders Count"
+msgstr ""
+
#. Label of the purchase_orders_items_overdue (Check) field in DocType 'Email
#. Digest'
#: erpnext/setup/doctype/email_digest/email_digest.json
@@ -37385,8 +37501,8 @@ msgstr "采购价格表"
#. Label of a Link in the Stock Workspace
#. Label of a shortcut in the Stock Workspace
#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:170
-#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:654
-#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:664
+#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:643
+#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js:653
#: erpnext/accounts/doctype/purchase_invoice/purchase_invoice_list.js:49
#: erpnext/accounts/doctype/purchase_invoice_item/purchase_invoice_item.json
#: erpnext/accounts/report/item_wise_purchase_register/item_wise_purchase_register.py:238
@@ -37464,7 +37580,7 @@ msgstr "采购入库趋势"
msgid "Purchase Receipt doesn't have any Item for which Retain Sample is enabled."
msgstr "采购入库未包括启用了保留样品的物料"
-#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:1046
+#: erpnext/subcontracting/doctype/subcontracting_receipt/subcontracting_receipt.py:1052
msgid "Purchase Receipt {0} created."
msgstr "采购收货单{0}已创建"
@@ -37585,7 +37701,7 @@ msgstr "采购"
msgid "Purpose"
msgstr "目的"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:477
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:478
msgid "Purpose must be one of {0}"
msgstr "目的必须是一个{0}"
@@ -37776,7 +37892,7 @@ msgstr "每单位数量"
msgid "Qty To Manufacture"
msgstr "工单数量"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:1394
+#: erpnext/manufacturing/doctype/work_order/work_order.py:1389
msgid "Qty To Manufacture ({0}) cannot be a fraction for the UOM {2}. To allow this, disable '{1}' in the UOM {2}."
msgstr "待生产数量({0})不能是计量单位{2}的分数。若要允许,请在计量单位{2}中禁用'{1}'"
@@ -37849,7 +37965,7 @@ msgstr "数量(库存单位)"
msgid "Qty of Finished Goods Item"
msgstr "成品数量"
-#: erpnext/stock/doctype/pick_list/pick_list.py:608
+#: erpnext/stock/doctype/pick_list/pick_list.py:624
msgid "Qty of Finished Goods Item should be greater than 0."
msgstr "成品数量须大于0"
@@ -37882,7 +37998,7 @@ msgstr "待出货数量"
msgid "Qty to Fetch"
msgstr "待获取数量"
-#: erpnext/manufacturing/doctype/job_card/job_card.js:303
+#: erpnext/manufacturing/doctype/job_card/job_card.js:304
#: erpnext/manufacturing/doctype/job_card/job_card.py:769
msgid "Qty to Manufacture"
msgstr "生产数量"
@@ -38103,6 +38219,11 @@ msgstr "质检模板名称"
msgid "Quality Inspection(s)"
msgstr "质检单"
+#. Label of a chart in the Quality Workspace
+#: erpnext/quality_management/workspace/quality/quality.json
+msgid "Quality Inspections"
+msgstr ""
+
#: erpnext/setup/doctype/company/company.py:496
msgid "Quality Management"
msgstr "质量管理"
@@ -38239,7 +38360,7 @@ msgstr "质量审核目标"
#: erpnext/selling/report/sales_partner_transaction_summary/sales_partner_transaction_summary.py:67
#: erpnext/stock/dashboard/item_dashboard.js:248
#: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json
-#: erpnext/stock/doctype/material_request/material_request.js:354
+#: erpnext/stock/doctype/material_request/material_request.js:356
#: erpnext/stock/doctype/material_request_item/material_request_item.json
#: erpnext/stock/doctype/packing_slip_item/packing_slip_item.json
#: erpnext/stock/doctype/pick_list_item/pick_list_item.json
@@ -38363,13 +38484,13 @@ msgstr "数量不能超过{0}"
msgid "Quantity of item obtained after manufacturing / repacking from given quantities of raw materials"
msgstr "加工/打包原材料后得到的成品物料数量"
-#: erpnext/manufacturing/doctype/bom/bom.py:671
+#: erpnext/manufacturing/doctype/bom/bom.py:683
msgid "Quantity required for Item {0} in row {1}"
msgstr "请为第{1}行的物料{0}输入需求数量"
-#: erpnext/manufacturing/doctype/bom/bom.py:615
-#: erpnext/manufacturing/doctype/job_card/job_card.js:384
-#: erpnext/manufacturing/doctype/job_card/job_card.js:454
+#: erpnext/manufacturing/doctype/bom/bom.py:627
+#: erpnext/manufacturing/doctype/job_card/job_card.js:385
+#: erpnext/manufacturing/doctype/job_card/job_card.js:455
#: erpnext/manufacturing/doctype/workstation/workstation.js:303
msgid "Quantity should be greater than 0"
msgstr "量应大于0"
@@ -38382,11 +38503,11 @@ msgstr "待生产数量"
msgid "Quantity to Manufacture"
msgstr "生产数量"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:2522
+#: erpnext/manufacturing/doctype/work_order/work_order.py:2517
msgid "Quantity to Manufacture can not be zero for the operation {0}"
msgstr "工序 {0} 生产数量不能为0"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:1386
+#: erpnext/manufacturing/doctype/work_order/work_order.py:1381
msgid "Quantity to Manufacture must be greater than 0."
msgstr "生产数量应大于0。"
@@ -38471,7 +38592,7 @@ msgstr "报价/线索%"
#. Label of a Link in the Selling Workspace
#. Option for the 'Transaction' (Select) field in DocType 'Authorization Rule'
#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:295
-#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:36
+#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:43
#: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.html:20
#: erpnext/crm/doctype/contract/contract.json
#: erpnext/crm/doctype/crm_settings/crm_settings.json
@@ -38837,7 +38958,7 @@ msgstr "供应商的货币转换为公司的本币后的单价"
msgid "Rate at which this tax is applied"
msgstr "此科目的默认税率"
-#: erpnext/controllers/accounts_controller.py:4003
+#: erpnext/controllers/accounts_controller.py:4041
msgid "Rate of '{}' items cannot be changed"
msgstr ""
@@ -38899,6 +39020,10 @@ msgstr "价格折扣需要费率或折扣"
msgid "Rates"
msgstr "价格"
+#: erpnext/controllers/accounts_controller.py:4017
+msgid "Rates cannot be modified for quoted items"
+msgstr ""
+
#: erpnext/accounts/report/financial_ratios/financial_ratios.py:48
msgid "Ratios"
msgstr "指标"
@@ -39038,7 +39163,7 @@ msgstr "发委外原材料给供应商?"
msgid "Raw Materials Supplied Cost"
msgstr "委外原材料成本"
-#: erpnext/manufacturing/doctype/bom/bom.py:663
+#: erpnext/manufacturing/doctype/bom/bom.py:675
msgid "Raw Materials cannot be blank."
msgstr "原材料不能为空。"
@@ -39063,7 +39188,7 @@ msgstr ""
#: erpnext/manufacturing/doctype/work_order/work_order.js:736
#: erpnext/selling/doctype/sales_order/sales_order.js:968
#: erpnext/selling/doctype/sales_order/sales_order_list.js:70
-#: erpnext/stock/doctype/material_request/material_request.js:229
+#: erpnext/stock/doctype/material_request/material_request.js:231
#: erpnext/subcontracting/doctype/subcontracting_inward_order/subcontracting_inward_order.js:116
#: erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js:164
msgid "Re-open"
@@ -39607,7 +39732,7 @@ msgstr "参考日期"
msgid "Reference #{0} dated {1}"
msgstr "参考# {0}记载日期为{1}"
-#: erpnext/public/js/controllers/transaction.js:2748
+#: erpnext/public/js/controllers/transaction.js:2744
msgid "Reference Date for Early Payment Discount"
msgstr "提前付款折扣的参考日期"
@@ -39957,7 +40082,7 @@ msgstr "备注"
#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1264
#: erpnext/accounts/report/general_ledger/general_ledger.html:90
#: erpnext/accounts/report/general_ledger/general_ledger.html:116
-#: erpnext/accounts/report/general_ledger/general_ledger.py:792
+#: erpnext/accounts/report/general_ledger/general_ledger.py:796
#: erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py:112
#: erpnext/accounts/report/purchase_register/purchase_register.py:296
#: erpnext/accounts/report/sales_register/sales_register.py:335
@@ -40020,11 +40145,11 @@ msgstr "不能重命名"
msgid "Rename Tool"
msgstr "批量修改名称(单据编号)工具"
-#: erpnext/utilities/doctype/rename_tool/rename_tool.js:34
+#: erpnext/utilities/doctype/rename_tool/rename_tool.js:26
msgid "Rename jobs for doctype {0} have been enqueued."
msgstr "已为文档类型{0}的批量重命名任务加入队列。"
-#: erpnext/utilities/doctype/rename_tool/rename_tool.js:47
+#: erpnext/utilities/doctype/rename_tool/rename_tool.js:39
msgid "Rename jobs for doctype {0} have not been enqueued."
msgstr "未能将文档类型{0}的批量重命名任务加入队列。"
@@ -40077,7 +40202,7 @@ msgstr "重新包装"
msgid "Repair"
msgstr "维修"
-#: erpnext/assets/doctype/asset/asset.js:114
+#: erpnext/assets/doctype/asset/asset.js:120
msgid "Repair Asset"
msgstr "修理资产"
@@ -40368,12 +40493,12 @@ msgstr "索取资料"
#: erpnext/buying/doctype/buying_settings/buying_settings.json
#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.json
#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.py:388
-#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:73
+#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:80
#: erpnext/buying/doctype/supplier_quotation_item/supplier_quotation_item.json
#: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js:70
#: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.py:272
#: erpnext/buying/workspace/buying/buying.json
-#: erpnext/stock/doctype/material_request/material_request.js:188
+#: erpnext/stock/doctype/material_request/material_request.js:190
msgid "Request for Quotation"
msgstr "询价"
@@ -40933,7 +41058,7 @@ msgstr ""
msgid "Restart Subscription"
msgstr "重新启动订阅"
-#: erpnext/assets/doctype/asset/asset.js:129
+#: erpnext/assets/doctype/asset/asset.js:135
msgid "Restore Asset"
msgstr "恢复资产"
@@ -40986,7 +41111,7 @@ msgstr "结果标题字段"
msgid "Resume"
msgstr "恢复"
-#: erpnext/manufacturing/doctype/job_card/job_card.js:238
+#: erpnext/manufacturing/doctype/job_card/job_card.js:239
msgid "Resume Job"
msgstr "恢复作业"
@@ -41365,6 +41490,12 @@ msgstr "可忽略预算设置的停止控制的角色"
msgid "Role allowed to bypass Credit Limit"
msgstr "不受信用额度限制的角色"
+#. Description of the 'Exempted Role' (Link) field in DocType 'Accounting
+#. Period'
+#: erpnext/accounts/doctype/accounting_period/accounting_period.json
+msgid "Role allowed to bypass period restrictions."
+msgstr ""
+
#. Label of the role_to_notify_on_depreciation_failure (Link) field in DocType
#. 'Accounts Settings'
#: erpnext/accounts/doctype/accounts_settings/accounts_settings.json
@@ -41715,27 +41846,27 @@ msgstr "第{0}行:无法取消本生产库存凭证,因废品物料{1}的产
msgid "Row #{0}: Cannot cancel this Stock Entry as returned quantity cannot be greater than delivered quantity for Item {1} in the linked Subcontracting Inward Order"
msgstr "第{0}行:无法取消本库存凭证,因关联外包收货订单中物料{1}的退货数量不得大于交付数量"
-#: erpnext/controllers/accounts_controller.py:3759
+#: erpnext/controllers/accounts_controller.py:3761
msgid "Row #{0}: Cannot delete item {1} which has already been billed."
msgstr "第{0}行: 不能删除已开票物料 {1}"
-#: erpnext/controllers/accounts_controller.py:3733
+#: erpnext/controllers/accounts_controller.py:3735
msgid "Row #{0}: Cannot delete item {1} which has already been delivered"
msgstr "第{0}行: 不能删除已出货物料 {1}"
-#: erpnext/controllers/accounts_controller.py:3752
+#: erpnext/controllers/accounts_controller.py:3754
msgid "Row #{0}: Cannot delete item {1} which has already been received"
msgstr "第{0}行: 不能删除已收货物料 {1}"
-#: erpnext/controllers/accounts_controller.py:3739
+#: erpnext/controllers/accounts_controller.py:3741
msgid "Row #{0}: Cannot delete item {1} which has work order assigned to it."
msgstr "第{0}行: 不能删除已关联工单的物料 {1}"
-#: erpnext/controllers/accounts_controller.py:3745
+#: erpnext/controllers/accounts_controller.py:3747
msgid "Row #{0}: Cannot delete item {1} which is assigned to customer's purchase order."
msgstr "第{0}行: 不能删除已分派客户采购订单号的物料 {1}"
-#: erpnext/controllers/accounts_controller.py:4012
+#: erpnext/controllers/accounts_controller.py:4051
msgid "Row #{0}: Cannot set Rate if the billed amount is greater than the amount for Item {1}."
msgstr "第{0}行:开票金额超过物料{1}金额时不可设置费率。"
@@ -41818,7 +41949,7 @@ msgstr "行号#{0}:日期与其他行重叠"
msgid "Row #{0}: Default BOM not found for FG Item {1}"
msgstr "行号#{0}:产成品{1}未找到默认物料清单(BOM)"
-#: erpnext/assets/doctype/asset/asset.py:602
+#: erpnext/assets/doctype/asset/asset.py:661
msgid "Row #{0}: Depreciation Start Date is required"
msgstr "行号#{0}:必须填写折旧起始日期"
@@ -41853,7 +41984,7 @@ msgstr "行号#{0}:服务项{1}未指定产成品"
msgid "Row #{0}: Finished Good Item {1} must be a sub-contracted item"
msgstr "行号#{0}:产成品{1}必须为外协物料"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:433
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:434
msgid "Row #{0}: Finished Good must be {1}"
msgstr "行号#{0}:产成品必须为{1}"
@@ -41939,11 +42070,11 @@ msgstr "第{0}行:物料{1}不匹配。不允许修改物料编码。"
msgid "Row #{0}: Journal Entry {1} does not have account {2} or already matched against another voucher"
msgstr "行#{0}:日记账凭证{1}没有科目{2}或已被另一凭证核销"
-#: erpnext/assets/doctype/asset/asset.py:596
+#: erpnext/assets/doctype/asset/asset.py:655
msgid "Row #{0}: Next Depreciation Date cannot be before Available-for-use Date"
msgstr "第{0}行:下次折旧日期不得早于启用日期。"
-#: erpnext/assets/doctype/asset/asset.py:591
+#: erpnext/assets/doctype/asset/asset.py:650
msgid "Row #{0}: Next Depreciation Date cannot be before Purchase Date"
msgstr "第{0}行:下次折旧日期不得早于采购日期。"
@@ -41955,11 +42086,11 @@ msgstr "行#{0}:因采购订单已经存在不能再更改供应商"
msgid "Row #{0}: Only {1} available to reserve for the Item {2}"
msgstr "第 {0} 行:物料 {2} 可预留库存数量仅有 {1}"
-#: erpnext/assets/doctype/asset/asset.py:568
+#: erpnext/assets/doctype/asset/asset.py:627
msgid "Row #{0}: Opening Accumulated Depreciation must be less than or equal to {1}"
msgstr "第{0}行:期初累计折旧不得超过{1}。"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:821
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:822
msgid "Row #{0}: Operation {1} is not completed for {2} qty of finished goods in Work Order {3}. Please update operation status via Job Card {4}."
msgstr "第{0}行生产工单{3}成品数量{2}工序{1}未完成。请在生产任务单{4}上更新工序状态。"
@@ -42022,7 +42153,7 @@ msgid "Row #{0}: Quantity cannot be a non-positive number. Please increase the q
msgstr "第{0}行:数量不能为非正数。请增加数量或移除物料{1}"
#: erpnext/controllers/accounts_controller.py:1450
-#: erpnext/controllers/accounts_controller.py:3866
+#: erpnext/controllers/accounts_controller.py:3875
msgid "Row #{0}: Quantity for Item {1} cannot be zero."
msgstr "行号#{0}:物料{1}数量不能为零"
@@ -42139,11 +42270,11 @@ msgstr "第{0}行:物料{2}的源仓库{1}不能是客户仓库。"
msgid "Row #{0}: Source Warehouse {1} for item {2} must be same as Source Warehouse {3} in the Work Order."
msgstr "第{0}行:物料{2}的源仓库{1}必须与工作订单中的源仓库{3}相同。"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:965
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:966
msgid "Row #{0}: Source and Target Warehouse cannot be the same for Material Transfer"
msgstr ""
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:987
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:988
msgid "Row #{0}: Source, Target Warehouse and Inventory Dimensions cannot be the exact same for Material Transfer"
msgstr ""
@@ -42212,7 +42343,7 @@ msgstr "行号#{0}:仓库{1}不是组仓库{2}的子仓库"
msgid "Row #{0}: Timings conflicts with row {1}"
msgstr "行#{0}:与排时序冲突{1}"
-#: erpnext/assets/doctype/asset/asset.py:581
+#: erpnext/assets/doctype/asset/asset.py:640
msgid "Row #{0}: Total Number of Depreciations cannot be less than or equal to Opening Number of Booked Depreciations"
msgstr "行号#{0}:总折旧次数不可小于等于已记账折旧的期初次数"
@@ -42288,7 +42419,7 @@ msgstr "行号#{idx}:{schedule_date}不能早于{transaction_date}"
msgid "Row #{}: Currency of {} - {} doesn't matches company currency."
msgstr "第{0}行: 货币 {} 与公司本币不匹配"
-#: erpnext/assets/doctype/asset/asset.py:357
+#: erpnext/assets/doctype/asset/asset.py:416
msgid "Row #{}: Finance Book should not be empty since you're using multiple."
msgstr "行号#{}:使用多财务账簿时不可为空"
@@ -42308,7 +42439,7 @@ msgstr "行号#{}:POS发票{}尚未提交"
msgid "Row #{}: Please assign task to a member."
msgstr "行号#{}:请将任务分配给成员"
-#: erpnext/assets/doctype/asset/asset.py:349
+#: erpnext/assets/doctype/asset/asset.py:408
msgid "Row #{}: Please use a different Finance Book."
msgstr "行号#{}:请使用其他财务账簿"
@@ -42324,7 +42455,7 @@ msgstr "行号#{}:退货发票{}的原始发票{}未合并"
msgid "Row #{}: You cannot add positive quantities in a return invoice. Please remove item {} to complete the return."
msgstr "行号#{}:退货发票中不可添加正数数量,请移除物料{}以完成退货"
-#: erpnext/stock/doctype/pick_list/pick_list.py:184
+#: erpnext/stock/doctype/pick_list/pick_list.py:198
msgid "Row #{}: item {} has been picked already."
msgstr "第 {} 行:物料 {} 已经拣货了"
@@ -42349,15 +42480,15 @@ msgstr "行号{0}:必须指定仓库,请为物料{1}和公司{2}设置默认
msgid "Row {0} : Operation is required against the raw material item {1}"
msgstr "第{0}行,原材料 {1} 工序信息必填"
-#: erpnext/stock/doctype/pick_list/pick_list.py:214
+#: erpnext/stock/doctype/pick_list/pick_list.py:228
msgid "Row {0} picked quantity is less than the required quantity, additional {1} {2} required."
msgstr "第 {0} 行拣货数量少于需求数量,短缺 {1} {2}"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1458
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1459
msgid "Row {0}# Item {1} cannot be transferred more than {2} against {3} {4}"
msgstr "第 {0} 行: 对 {3} {4} 发原物料 {1} 的数量不能超过 {2}"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1482
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1483
msgid "Row {0}# Item {1} not found in 'Raw Materials Supplied' table in {2} {3}"
msgstr "行号{0}# 在{2} {3}的'供应原材料'表中未找到物料{1}"
@@ -42389,11 +42520,11 @@ msgstr "行号{0}:分配金额{1}不能超过发票未结金额{2}"
msgid "Row {0}: Allocated amount {1} must be less than or equal to remaining payment amount {2}"
msgstr "行号{0}:分配金额{1}不能超过剩余付款金额{2}"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1145
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1146
msgid "Row {0}: As {1} is enabled, raw materials cannot be added to {2} entry. Use {3} entry to consume raw materials."
msgstr "第 {0} 行:生产设置中已勾选 入库成品原材料成本取自工单耗用,工单入库中不允许倒扣原材料,请创建工单耗用物料移动消耗原材料"
-#: erpnext/stock/doctype/material_request/material_request.py:881
+#: erpnext/stock/doctype/material_request/material_request.py:882
msgid "Row {0}: Bill of Materials not found for the Item {1}"
msgstr "没有为第{0}行的物料{1}定义物料清单"
@@ -42410,7 +42541,7 @@ msgstr ""
msgid "Row {0}: Conversion Factor is mandatory"
msgstr "行{0}:转换系数必填"
-#: erpnext/controllers/accounts_controller.py:3219
+#: erpnext/controllers/accounts_controller.py:3221
msgid "Row {0}: Cost Center {1} does not belong to Company {2}"
msgstr "第 {0} 行 :成本中心 {1} 不是公司 {3} 的有效成本中心"
@@ -42422,7 +42553,7 @@ msgstr "请为第{0}行的物料{1}输入成本中心"
msgid "Row {0}: Credit entry can not be linked with a {1}"
msgstr "行{0}:{1}不可关联退款凭证"
-#: erpnext/manufacturing/doctype/bom/bom.py:475
+#: erpnext/manufacturing/doctype/bom/bom.py:487
msgid "Row {0}: Currency of the BOM #{1} should be equal to the selected currency {2}"
msgstr "行{0}:BOM#的货币{1}应等于所选货币{2}"
@@ -42438,7 +42569,7 @@ msgstr "第{0}行:出货仓 ({1}) 不能与客户仓 ({2}) 相同"
msgid "Row {0}: Delivery Warehouse cannot be same as Customer Warehouse for Item {1}."
msgstr "第{0}行:物料{1}的交货仓库不能与客户仓库相同。"
-#: erpnext/controllers/accounts_controller.py:2712
+#: erpnext/controllers/accounts_controller.py:2714
msgid "Row {0}: Due Date in the Payment Terms table cannot be before Posting Date"
msgstr "第{0}行: 付款计划中的到期日不能早于记账日"
@@ -42451,7 +42582,7 @@ msgstr "行号{0}:必须关联交货单物料或包装物料"
msgid "Row {0}: Exchange Rate is mandatory"
msgstr "请为第{0}行输入汇率"
-#: erpnext/assets/doctype/asset/asset.py:543
+#: erpnext/assets/doctype/asset/asset.py:602
msgid "Row {0}: Expected Value After Useful Life must be less than Net Purchase Amount"
msgstr "第{0}行:使用寿命结束后期望价值必须小于净采购金额"
@@ -42584,7 +42715,7 @@ msgstr "行号{0}:采购发票{1}无库存影响"
msgid "Row {0}: Qty cannot be greater than {1} for the Item {2}."
msgstr "行号{0}:物料{2}数量不可超过{1}"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:524
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:525
msgid "Row {0}: Qty in Stock UOM can not be zero."
msgstr "行号{0}:库存单位的数量不可为零"
@@ -42596,7 +42727,7 @@ msgstr "行号{0}:数量必须大于0"
msgid "Row {0}: Quantity cannot be negative."
msgstr "行号{0}:数量不能为负数"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:895
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:896
msgid "Row {0}: Quantity not available for {4} in warehouse {1} at posting time of the entry ({2} {3})"
msgstr "第{0}行:在记账时间点({2} {3}) 物料{4}在{1}中的可用数量不足"
@@ -42604,7 +42735,7 @@ msgstr "第{0}行:在记账时间点({2} {3}) 物料{4}在{1}中的可用数
msgid "Row {0}: Shift cannot be changed since the depreciation has already been processed"
msgstr "行号{0}:折旧已处理后不可变更班次"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1495
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1496
msgid "Row {0}: Subcontracted Item is mandatory for the raw material {1}"
msgstr "行号{0}:原材料{1}必须关联外协物料"
@@ -42620,11 +42751,11 @@ msgstr "行号{0}:任务{1}不属于项目{2}"
msgid "Row {0}: The entire expense amount for account {1} in {2} has already been allocated."
msgstr ""
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:570
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:571
msgid "Row {0}: The item {1}, quantity must be positive number"
msgstr "第 {0} 行: 物料 {1} 数量必须为正数"
-#: erpnext/controllers/accounts_controller.py:3196
+#: erpnext/controllers/accounts_controller.py:3198
msgid "Row {0}: The {3} Account {1} does not belong to the company {2}"
msgstr "行号{0}:{3}科目{1}不属于公司{2}"
@@ -42632,11 +42763,15 @@ msgstr "行号{0}:{3}科目{1}不属于公司{2}"
msgid "Row {0}: To set {1} periodicity, difference between from and to date must be greater than or equal to {2}"
msgstr "行号{0}:设置{1}周期时,起止日期差值必须大于等于{2}"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:518
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:3243
+msgid "Row {0}: Transferred quantity cannot be greater than the requested quantity."
+msgstr ""
+
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:519
msgid "Row {0}: UOM Conversion Factor is mandatory"
msgstr "行{0}:单位转换系数是必需的"
-#: erpnext/manufacturing/doctype/bom/bom.py:1136
+#: erpnext/manufacturing/doctype/bom/bom.py:1148
#: erpnext/manufacturing/doctype/work_order/work_order.py:397
msgid "Row {0}: Workstation or Workstation Type is mandatory for an operation {1}"
msgstr "行号{0}:工序{1}必须指定工作站或工作站类型"
@@ -42695,7 +42830,7 @@ msgstr "在{0}中删除的行"
msgid "Rows with Same Account heads will be merged on Ledger"
msgstr "相同科目会被自动合并"
-#: erpnext/controllers/accounts_controller.py:2723
+#: erpnext/controllers/accounts_controller.py:2725
msgid "Rows with duplicate due dates in other rows were found: {0}"
msgstr "其他行已存在相同的付款到期日:{0}"
@@ -42877,7 +43012,7 @@ msgstr "工资发放方式"
#: erpnext/setup/doctype/company/company.py:640
#: erpnext/setup/doctype/company/company_dashboard.py:9
#: erpnext/setup/doctype/sales_person/sales_person_dashboard.py:12
-#: erpnext/setup/install.py:329
+#: erpnext/setup/install.py:341
#: erpnext/setup/setup_wizard/operations/install_fixtures.py:297
#: erpnext/stock/doctype/item/item.json
msgid "Sales"
@@ -42988,7 +43123,7 @@ msgstr "销售收入率"
#: erpnext/selling/workspace/selling/selling.json
#: erpnext/setup/doctype/authorization_rule/authorization_rule.json
#: erpnext/setup/workspace/home/home.json
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:351
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:347
#: erpnext/stock/doctype/delivery_note/delivery_note_list.js:65
#: erpnext/stock/doctype/quality_inspection/quality_inspection.json
msgid "Sales Invoice"
@@ -43121,7 +43256,7 @@ msgstr "按来源划分的销售机会"
#. Label of the sales_order (Link) field in DocType 'Purchase Receipt Item'
#. Option for the 'Voucher Type' (Select) field in DocType 'Stock Reservation
#. Entry'
-#. Label of a shortcut in the Subcontracting Workspace
+#. Label of a Link in the Subcontracting Workspace
#: erpnext/accounts/doctype/journal_entry_account/journal_entry_account.json
#: erpnext/accounts/doctype/pos_invoice_item/pos_invoice_item.json
#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:273
@@ -43156,9 +43291,9 @@ msgstr "按来源划分的销售机会"
#: erpnext/selling/report/sales_order_analysis/sales_order_analysis.py:222
#: erpnext/selling/workspace/selling/selling.json
#: erpnext/setup/doctype/authorization_rule/authorization_rule.json
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:161
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:227
-#: erpnext/stock/doctype/material_request/material_request.js:222
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:157
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:223
+#: erpnext/stock/doctype/material_request/material_request.js:224
#: erpnext/stock/doctype/material_request_item/material_request_item.json
#: erpnext/stock/doctype/pick_list_item/pick_list_item.json
#: erpnext/stock/doctype/purchase_receipt_item/purchase_receipt_item.json
@@ -43513,7 +43648,7 @@ msgid "Sales Representative"
msgstr "销售代表"
#: erpnext/accounts/report/gross_profit/gross_profit.py:893
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:274
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:270
msgid "Sales Return"
msgstr "销售退货"
@@ -43670,12 +43805,12 @@ msgstr "样品仓"
#. Label of the sample_size (Float) field in DocType 'Quality Inspection'
#: erpnext/manufacturing/report/quality_inspection_summary/quality_inspection_summary.py:93
-#: erpnext/public/js/controllers/transaction.js:2806
+#: erpnext/public/js/controllers/transaction.js:2802
#: erpnext/stock/doctype/quality_inspection/quality_inspection.json
msgid "Sample Size"
msgstr "样本大小"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:3689
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:3706
msgid "Sample quantity {0} cannot be more than received quantity {1}"
msgstr "采样数量{0}不能超过接收数量{1}"
@@ -43770,7 +43905,7 @@ msgstr "已扫描数量"
#. Label of the schedule_date (Date) field in DocType 'Depreciation Schedule'
#. Label of the schedule_date (Datetime) field in DocType 'Production Plan Sub
#. Assembly Item'
-#: erpnext/assets/doctype/asset/asset.js:287
+#: erpnext/assets/doctype/asset/asset.js:300
#: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json
#: erpnext/manufacturing/doctype/production_plan_sub_assembly_item/production_plan_sub_assembly_item.json
msgid "Schedule Date"
@@ -43824,7 +43959,7 @@ msgstr "计划任务"
msgid "Scheduling"
msgstr "排程"
-#: erpnext/utilities/doctype/rename_tool/rename_tool.js:31
+#: erpnext/utilities/doctype/rename_tool/rename_tool.js:23
msgid "Scheduling..."
msgstr "计划调度..."
@@ -43880,7 +44015,7 @@ msgstr "得分排名"
msgid "Scrap & Process Loss"
msgstr "报废与制程损耗"
-#: erpnext/assets/doctype/asset/asset.js:98
+#: erpnext/assets/doctype/asset/asset.js:104
msgid "Scrap Asset"
msgstr "报废资产"
@@ -44035,7 +44170,7 @@ msgstr "选择会计维度。"
msgid "Select Alternate Item"
msgstr "选替代物料"
-#: erpnext/selling/doctype/quotation/quotation.js:326
+#: erpnext/selling/doctype/quotation/quotation.js:333
msgid "Select Alternative Items for Sales Order"
msgstr "选择供销售订单使用的替代项目"
@@ -44085,7 +44220,7 @@ msgstr "选择公司"
msgid "Select Company Address"
msgstr ""
-#: erpnext/manufacturing/doctype/job_card/job_card.js:532
+#: erpnext/manufacturing/doctype/job_card/job_card.js:533
msgid "Select Corrective Operation"
msgstr "选择纠正性工序"
@@ -44095,11 +44230,11 @@ msgstr "选择纠正性工序"
msgid "Select Customers By"
msgstr "客户筛选依据"
-#: erpnext/setup/doctype/employee/employee.js:114
+#: erpnext/setup/doctype/employee/employee.js:120
msgid "Select Date of Birth. This will validate Employees age and prevent hiring of under-age staff."
msgstr "选择出生日期。此操作将验证员工年龄并防止雇用未成年人员。"
-#: erpnext/setup/doctype/employee/employee.js:121
+#: erpnext/setup/doctype/employee/employee.js:127
msgid "Select Date of joining. It will have impact on the first salary calculation, Leave allocation on pro-rata bases."
msgstr "选择入职日期。这将影响首次薪资计算及按比例分配的年假额度。"
@@ -44145,7 +44280,7 @@ msgstr "选择物料"
msgid "Select Items based on Delivery Date"
msgstr "根据出货日期选择物料"
-#: erpnext/public/js/controllers/transaction.js:2845
+#: erpnext/public/js/controllers/transaction.js:2841
msgid "Select Items for Quality Inspection"
msgstr "选择待检验物料"
@@ -44166,7 +44301,7 @@ msgstr "筛选截至交货日期的物料"
msgid "Select Job Worker Address"
msgstr "选择委外地址"
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1155
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1151
#: erpnext/selling/page/point_of_sale/pos_item_cart.js:955
msgid "Select Loyalty Program"
msgstr "选择积分方案"
@@ -44234,7 +44369,7 @@ msgstr "选择仓库"
msgid "Select a Company"
msgstr "选择公司"
-#: erpnext/setup/doctype/employee/employee.js:109
+#: erpnext/setup/doctype/employee/employee.js:115
msgid "Select a Company this Employee belongs to."
msgstr "选择该员工所属的公司。"
@@ -44254,7 +44389,7 @@ msgstr "请选择付款方式。"
msgid "Select a Supplier"
msgstr "选择供应商"
-#: erpnext/stock/doctype/material_request/material_request.js:405
+#: erpnext/stock/doctype/material_request/material_request.js:407
msgid "Select a Supplier from the Default Suppliers of the items below. On selection, a Purchase Order will be made against items belonging to the selected Supplier only."
msgstr "从以下物料的默认供应商中选择。选定后,采购订单将仅针对该供应商的物料生成。"
@@ -44274,7 +44409,7 @@ msgstr "选择一个科目以科目货币进行打印"
msgid "Select an invoice to load summary data"
msgstr "选择发票以加载汇总数据"
-#: erpnext/selling/doctype/quotation/quotation.js:341
+#: erpnext/selling/doctype/quotation/quotation.js:348
msgid "Select an item from each set to be used in the Sales Order."
msgstr "从每组中选择一个物料用于销售订单。"
@@ -44292,7 +44427,7 @@ msgstr "首先选择公司"
msgid "Select company name first."
msgstr "请先选择公司"
-#: erpnext/controllers/accounts_controller.py:2971
+#: erpnext/controllers/accounts_controller.py:2973
msgid "Select finance book for the item {0} at row {1}"
msgstr "请为第{1}行的物料{0}选择账簿"
@@ -44330,7 +44465,7 @@ msgstr "请先选择仓库"
msgid "Select the customer or supplier."
msgstr "选择客户或供应商。"
-#: erpnext/assets/doctype/asset/asset.js:796
+#: erpnext/assets/doctype/asset/asset.js:807
msgid "Select the date"
msgstr "选择日期"
@@ -44366,7 +44501,7 @@ msgstr "设置客户首选联系人后,可以使用手机号过滤客户"
msgid "Selected POS Opening Entry should be open."
msgstr "选定的POS期初条目应为开启状态。"
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2489
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:2490
msgid "Selected Price List should have buying and selling fields checked."
msgstr "价格表主数据中应勾选采购和销售。"
@@ -44402,7 +44537,7 @@ msgstr "自运"
msgid "Sell"
msgstr "销售"
-#: erpnext/assets/doctype/asset/asset.js:106
+#: erpnext/assets/doctype/asset/asset.js:112
msgid "Sell Asset"
msgstr "出售资产"
@@ -44632,7 +44767,7 @@ msgstr "序列号/批号"
#: erpnext/manufacturing/doctype/job_card/job_card.json
#: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.js:74
#: erpnext/manufacturing/report/cost_of_poor_quality_report/cost_of_poor_quality_report.py:114
-#: erpnext/public/js/controllers/transaction.js:2819
+#: erpnext/public/js/controllers/transaction.js:2815
#: erpnext/public/js/utils/serial_no_batch_selector.js:421
#: erpnext/selling/doctype/installation_note_item/installation_note_item.json
#: erpnext/stock/doctype/delivery_note_item/delivery_note_item.json
@@ -44769,7 +44904,7 @@ msgstr "序列号{0}不属于物料{1}"
msgid "Serial No {0} does not exist"
msgstr "序列号{0}不存在"
-#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3021
+#: erpnext/stock/doctype/serial_and_batch_bundle/serial_and_batch_bundle.py:3025
msgid "Serial No {0} does not exists"
msgstr "序列号{0}不存在"
@@ -45274,12 +45409,12 @@ msgid "Service Stop Date"
msgstr "服务停止日期"
#: erpnext/accounts/deferred_revenue.py:45
-#: erpnext/public/js/controllers/transaction.js:1662
+#: erpnext/public/js/controllers/transaction.js:1658
msgid "Service Stop Date cannot be after Service End Date"
msgstr "服务停止日不能晚于服务结束日"
#: erpnext/accounts/deferred_revenue.py:42
-#: erpnext/public/js/controllers/transaction.js:1659
+#: erpnext/public/js/controllers/transaction.js:1655
msgid "Service Stop Date cannot be before Service Start Date"
msgstr "服务停止日期不能早于服务开始日期"
@@ -45317,8 +45452,8 @@ msgstr "设置默认供应商"
msgid "Set Delivery Warehouse"
msgstr "设置交货仓库"
-#: erpnext/manufacturing/doctype/job_card/job_card.js:403
-#: erpnext/manufacturing/doctype/job_card/job_card.js:472
+#: erpnext/manufacturing/doctype/job_card/job_card.js:404
+#: erpnext/manufacturing/doctype/job_card/job_card.js:473
msgid "Set Finished Good Quantity"
msgstr "设置产成品数量"
@@ -45349,7 +45484,7 @@ msgstr "为此区域设置物料组层级的预算。还可以设置“每月分
msgid "Set Landed Cost Based on Purchase Invoice Rate"
msgstr "到岸成本(采购入库)以采购发票价为准"
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1167
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1163
msgid "Set Loyalty Program"
msgstr "设置忠诚度计划"
@@ -45465,7 +45600,7 @@ msgid "Set as Completed"
msgstr "设为已完成"
#: erpnext/public/js/utils/sales_common.js:569
-#: erpnext/selling/doctype/quotation/quotation.js:129
+#: erpnext/selling/doctype/quotation/quotation.js:136
msgid "Set as Lost"
msgstr "设置为未成交"
@@ -45531,15 +45666,15 @@ msgstr "手工设置状态"
msgid "Set this if the customer is a Public Administration company."
msgstr "如果客户是公共管理公司,请设置此项。"
-#: erpnext/assets/doctype/asset/asset.py:819
+#: erpnext/assets/doctype/asset/asset.py:878
msgid "Set {0} in asset category {1} for company {2}"
msgstr "为{2}公司设置资产类别{1}的{0}"
-#: erpnext/assets/doctype/asset/asset.py:1152
+#: erpnext/assets/doctype/asset/asset.py:1211
msgid "Set {0} in asset category {1} or company {2}"
msgstr "在资产类别{1}或公司{2}中设置{0}"
-#: erpnext/assets/doctype/asset/asset.py:1149
+#: erpnext/assets/doctype/asset/asset.py:1208
msgid "Set {0} in company {1}"
msgstr "在{1}公司设置{0}"
@@ -45606,8 +45741,8 @@ msgstr "银行对账功能仅限本公司银行户头"
msgid "Setting up company"
msgstr "创建公司"
-#: erpnext/manufacturing/doctype/bom/bom.py:1115
-#: erpnext/manufacturing/doctype/work_order/work_order.py:1450
+#: erpnext/manufacturing/doctype/bom/bom.py:1127
+#: erpnext/manufacturing/doctype/work_order/work_order.py:1445
msgid "Setting {0} is required"
msgstr "必须设置{0}"
@@ -45690,12 +45825,12 @@ msgstr "股东"
msgid "Shelf Life In Days"
msgstr "保质期天数"
-#: erpnext/stock/doctype/batch/batch.py:208
+#: erpnext/stock/doctype/batch/batch.py:215
msgid "Shelf Life in Days"
msgstr "保质期(天)"
#. Label of the shift (Link) field in DocType 'Depreciation Schedule'
-#: erpnext/assets/doctype/asset/asset.js:300
+#: erpnext/assets/doctype/asset/asset.js:313
#: erpnext/assets/doctype/depreciation_schedule/depreciation_schedule.json
msgid "Shift"
msgstr "班次"
@@ -45716,7 +45851,7 @@ msgid "Shift Time (In Hours)"
msgstr "班次时间(小时)"
#. Name of a DocType
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:250
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:246
#: erpnext/stock/doctype/shipment/shipment.json
msgid "Shipment"
msgstr "运单"
@@ -46265,7 +46400,7 @@ msgstr "简单的 Python 公式应用于阅读字段。
数字例如 1:
When creating Manufacture Entry, raw-material items are backflushed based on BOM of production item. If you want raw-material items to be backflushed based on Material Transfer entry made against that Work Order instead, then you can set it under this field."
msgstr "'生产'类型的库存转移单称为反冲。通过消耗原材料生产成品称为反冲处理。
创建生产转移单时,原材料根据生产物料的BOM进行反冲。若希望基于工单的物料转移单进行反冲,可在此字段设置"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:2165
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:2166
msgid "The Work Order is mandatory for Disassembly Order"
msgstr "拆卸订单必须关联工单"
@@ -50166,7 +50331,7 @@ msgstr "拆卸订单必须关联工单"
msgid "The account head under Liability or Equity, in which Profit/Loss will be booked"
msgstr "负债或权益下的科目,用于利润/亏损记账"
-#: erpnext/accounts/doctype/payment_request/payment_request.py:866
+#: erpnext/accounts/doctype/payment_request/payment_request.py:870
msgid "The allocated amount is greater than the outstanding amount of Payment Request {0}"
msgstr "分配金额超过付款申请{0}的未清金额"
@@ -50239,7 +50404,7 @@ msgstr ""
msgid "The following assets have failed to automatically post depreciation entries: {0}"
msgstr "以下资产自动计提折旧失败:{0}"
-#: erpnext/stock/doctype/pick_list/pick_list.py:255
+#: erpnext/stock/doctype/pick_list/pick_list.py:270
msgid "The following batches are expired, please restock them:
{0}"
msgstr "以下批次已过期,请补货:
{0}"
@@ -50263,7 +50428,7 @@ msgstr "以下无效定价规则已被删除:"
msgid "The following rows are duplicates:"
msgstr ""
-#: erpnext/stock/doctype/material_request/material_request.py:891
+#: erpnext/stock/doctype/material_request/material_request.py:892
msgid "The following {0} were created: {1}"
msgstr "已创建以下{0}:{1}"
@@ -50395,7 +50560,7 @@ msgstr "卖方和买方不能相同"
msgid "The serial and batch bundle {0} not linked to {1} {2}"
msgstr "序列号批次组合{0}未链接到{1}{2}"
-#: erpnext/stock/doctype/batch/batch.py:427
+#: erpnext/stock/doctype/batch/batch.py:436
msgid "The serial no {0} does not belong to item {1}"
msgstr "序列号{0}不属于物料{1}"
@@ -50498,7 +50663,7 @@ msgstr "生产开始时物料转移的目标仓库,可选择组仓库作为在
msgid "The {0} ({1}) must be equal to {2} ({3})"
msgstr "{0}({1})必须等于{2}({3})"
-#: erpnext/public/js/controllers/transaction.js:3283
+#: erpnext/public/js/controllers/transaction.js:3279
msgid "The {0} contains Unit Price Items."
msgstr "{0}包含单价物料。"
@@ -50506,7 +50671,7 @@ msgstr "{0}包含单价物料。"
msgid "The {0} prefix '{1}' already exists. Please change the Serial No Series, otherwise you will get a Duplicate Entry error."
msgstr ""
-#: erpnext/stock/doctype/material_request/material_request.py:897
+#: erpnext/stock/doctype/material_request/material_request.py:898
msgid "The {0} {1} created successfully"
msgstr "成功创建{0}{1}"
@@ -50522,7 +50687,7 @@ msgstr "{0} {1} 用于计算入库成品成本"
msgid "Then Pricing Rules are filtered out based on Customer, Customer Group, Territory, Supplier, Supplier Type, Campaign, Sales Partner etc."
msgstr "随后定价规则将基于客户、客户组、区域、供应商、供应商类型、营销活动、销售伙伴等进行筛选。"
-#: erpnext/assets/doctype/asset/asset.py:648
+#: erpnext/assets/doctype/asset/asset.py:707
msgid "There are active maintenance or repairs against the asset. You must complete all of them before cancelling the asset."
msgstr "资产存在有效维护或维修记录。取消前需完成所有相关操作"
@@ -50574,11 +50739,11 @@ msgstr "供应商{1}在本期间已存在有效的{2}类别低税率证明{0}"
msgid "There is already an active Subcontracting BOM {0} for the Finished Good {1}."
msgstr "成品{1}已存在有效委外BOM{0}"
-#: erpnext/stock/doctype/batch/batch.py:435
+#: erpnext/stock/doctype/batch/batch.py:444
msgid "There is no batch found against the {0}: {1}"
msgstr "未找到{0}:{1}对应的批次"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:1602
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:1603
msgid "There must be atleast 1 Finished Good in this Stock Entry"
msgstr "至少须有一行勾选了是成品的明细行"
@@ -50621,11 +50786,11 @@ msgstr "此物料是基于模板物料{0}的多规格物料。"
msgid "This Month's Summary"
msgstr "本月摘要"
-#: erpnext/buying/doctype/purchase_order/purchase_order.py:976
+#: erpnext/buying/doctype/purchase_order/purchase_order.py:977
msgid "This Purchase Order has been fully subcontracted."
msgstr "本采购订单已完全外包。"
-#: erpnext/selling/doctype/sales_order/sales_order.py:2005
+#: erpnext/selling/doctype/sales_order/sales_order.py:2006
msgid "This Sales Order has been fully subcontracted."
msgstr "本销售订单已完全外包。"
@@ -50641,7 +50806,7 @@ msgstr "此操作将停止未来的结算。您确定要取消此订阅吗?"
msgid "This action will unlink this account from any external service integrating ERPNext with your bank accounts. It cannot be undone. Are you certain ?"
msgstr "此操作将取消此账户与将ERPNext与您的银行账户集成的任何外部服务的链接。它无法撤销。你确定吗 ?"
-#: erpnext/assets/doctype/asset/asset.py:367
+#: erpnext/assets/doctype/asset/asset.py:426
msgid "This asset category is marked as non-depreciable. Please disable depreciation calculation or choose a different category."
msgstr "本资产类别标记为不可折旧。请停用折旧计算或选择其他类别。"
@@ -50649,11 +50814,11 @@ msgstr "本资产类别标记为不可折旧。请停用折旧计算或选择其
msgid "This covers all scorecards tied to this Setup"
msgstr "包含已设置的所有评分卡"
-#: erpnext/controllers/status_updater.py:449
+#: erpnext/controllers/status_updater.py:456
msgid "This document is over limit by {0} {1} for item {4}. Are you making another {3} against the same {2}?"
msgstr "物料{4}{0} 超出订单允许量 {1}。你在对同一个{2}做另一个{3}?"
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:491
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:487
msgid "This field is used to set the 'Customer'."
msgstr "用于设置'客户'"
@@ -50756,7 +50921,7 @@ msgstr "适用于用于生产成品的原材料。若物料是BOM中的附加服
msgid "This item filter has already been applied for the {0}"
msgstr "该物料筛选器已应用于{0}"
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:504
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:500
msgid "This option can be checked to edit the 'Posting Date' and 'Posting Time' fields."
msgstr "勾选此选项可编辑'过账日期'和'过账时间'字段"
@@ -50764,7 +50929,7 @@ msgstr "勾选此选项可编辑'过账日期'和'过账时间'字段"
msgid "This schedule was created when Asset {0} was adjusted through Asset Value Adjustment {1}."
msgstr "因资产价值调整 {1}已创建固定资产 {0} 折旧计划"
-#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:493
+#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:494
msgid "This schedule was created when Asset {0} was consumed through Asset Capitalization {1}."
msgstr "因被耗用在资产资本化{1}中,已为资产{0} 创建折旧计划"
@@ -50776,7 +50941,7 @@ msgstr "此计划在资产{0}通过资产维修{1}修复时创建"
msgid "This schedule was created when Asset {0} was restored due to Sales Invoice {1} cancellation."
msgstr "本计划因销售发票{1}取消恢复资产{0}时创建。"
-#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:597
+#: erpnext/assets/doctype/asset_capitalization/asset_capitalization.py:598
msgid "This schedule was created when Asset {0} was restored on Asset Capitalization {1}'s cancellation."
msgstr "因取消资产资本化{1},已为资产{0} 创建折旧计划"
@@ -50792,7 +50957,7 @@ msgstr "因经由销售发票 {1} 退回,已创建固定资产{0} 折旧计划
msgid "This schedule was created when Asset {0} was scrapped."
msgstr "针对固定资产 {0} 报废的折旧计划已创建"
-#: erpnext/assets/doctype/asset/asset.py:1425
+#: erpnext/assets/doctype/asset/asset.py:1484
msgid "This schedule was created when Asset {0} was {1} into new Asset {2}."
msgstr "本计划因资产{0}{1}至新资产{2}时创建。"
@@ -50814,7 +50979,7 @@ msgstr "因按班次分派{1},固定资产{0}折旧计划已更新"
msgid "This section allows the user to set the Body and Closing text of the Dunning Letter for the Dunning Type based on language, which can be used in Print."
msgstr "可设置催款函正文和结尾文本(按语言),用于打印"
-#: erpnext/stock/doctype/delivery_note/delivery_note.js:497
+#: erpnext/stock/doctype/delivery_note/delivery_note.js:493
msgid "This table is used to set details about the 'Item', 'Qty', 'Basic Rate', etc."
msgstr "用于设置'物料'、'数量'、'基本汇率'等详细信息"
@@ -50969,7 +51134,7 @@ msgstr "计时器超出了指定的小时数"
#. Name of a DocType
#. Label of a Link in the Projects Workspace
#. Label of a shortcut in the Projects Workspace
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1048
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:1044
#: erpnext/projects/doctype/timesheet/timesheet.json
#: erpnext/projects/report/daily_timesheet_summary/daily_timesheet_summary.py:26
#: erpnext/projects/report/timesheet_billing_summary/timesheet_billing_summary.py:59
@@ -50980,7 +51145,6 @@ msgstr "工时表"
#. Name of a report
#. Label of a Link in the Projects Workspace
-#. Label of a shortcut in the Projects Workspace
#: erpnext/projects/report/timesheet_billing_summary/timesheet_billing_summary.json
#: erpnext/projects/workspace/projects/projects.json
msgid "Timesheet Billing Summary"
@@ -51268,11 +51432,11 @@ msgstr "要添加操作,请勾选“包含操作”复选框。"
msgid "To add subcontracted Item's raw materials if include exploded items is disabled."
msgstr "如果禁用包含爆炸项,则添加分包项的原材料。"
-#: erpnext/controllers/status_updater.py:444
+#: erpnext/controllers/status_updater.py:449
msgid "To allow over billing, update \"Over Billing Allowance\" in Accounts Settings or the Item."
msgstr "要允许超订单金额开票,请在“会计设置”或“物料主数据”中更新“发票超金额控制(%)”。"
-#: erpnext/controllers/status_updater.py:440
+#: erpnext/controllers/status_updater.py:445
msgid "To allow over receipt / delivery, update \"Over Receipt/Delivery Allowance\" in Stock Settings or the Item."
msgstr "要允许超量收货/出货,请在库存设置或物料主数据中更新“出入库超量控制”。"
@@ -51315,7 +51479,7 @@ msgid "To include sub-assembly costs and scrap items in Finished Goods on a work
msgstr "工单勾选使用多级物料清单但未启用生产任务单,成品入库包含子装配件工费成本及废料"
#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2309
-#: erpnext/controllers/accounts_controller.py:3229
+#: erpnext/controllers/accounts_controller.py:3231
msgid "To include tax in row {0} in Item rate, taxes in rows {1} must also be included"
msgstr "第{0}行的物料单价要含税,第{1}行的税也必须包括在内"
@@ -51398,7 +51562,7 @@ msgstr "太多的列。导出报表,并使用电子表格应用程序进行打
#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:157
#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:442
#: erpnext/buying/doctype/request_for_quotation/request_for_quotation.js:451
-#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:69
+#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:76
#: erpnext/buying/report/supplier_quotation_comparison/supplier_quotation_comparison.js:123
#: erpnext/manufacturing/workspace/manufacturing/manufacturing.json
#: erpnext/setup/doctype/email_digest/email_digest.json
@@ -51905,7 +52069,7 @@ msgstr "总未付金额"
msgid "Total Paid Amount"
msgstr "总付款金额"
-#: erpnext/controllers/accounts_controller.py:2777
+#: erpnext/controllers/accounts_controller.py:2779
msgid "Total Payment Amount in Payment Schedule must be equal to Grand / Rounded Total"
msgstr "付款计划汇总金额与总计(圆整后)金额不符"
@@ -51936,7 +52100,9 @@ msgstr "总完工数量"
msgid "Total Projected Qty"
msgstr "总可用数量"
+#. Label of a number card in the Buying Workspace
#: erpnext/buying/report/item_wise_purchase_history/item_wise_purchase_history.py:272
+#: erpnext/buying/workspace/buying/buying.json
msgid "Total Purchase Amount"
msgstr "总采购额"
@@ -52405,7 +52571,7 @@ msgstr "交易类型"
msgid "Transaction currency must be same as Payment Gateway currency"
msgstr "交易货币必须与支付网关货币相同"
-#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:64
+#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:68
msgid "Transaction currency: {0} cannot be different from Bank Account({1}) currency: {2}"
msgstr "交易货币{0}必须与银行账户{1}的货币{2}一致"
@@ -52457,7 +52623,7 @@ msgstr "POS中使用销售发票的交易已被禁用。"
msgid "Transfer"
msgstr "调拨"
-#: erpnext/assets/doctype/asset/asset.js:90
+#: erpnext/assets/doctype/asset/asset.js:96
msgid "Transfer Asset"
msgstr "转移资产"
@@ -52703,7 +52869,7 @@ msgstr "付款类型"
msgid "Type of Transaction"
msgstr "库存变动类型(收/发)"
-#. Description of the 'Select DocType' (Select) field in DocType 'Rename Tool'
+#. Description of the 'Select DocType' (Link) field in DocType 'Rename Tool'
#: erpnext/utilities/doctype/rename_tool/rename_tool.json
msgid "Type of document to rename."
msgstr "需重命名的单据类型。"
@@ -52895,7 +53061,7 @@ msgstr "单位换算信息"
msgid "UOM Conversion Factor"
msgstr "单位换算系数"
-#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1431
+#: erpnext/manufacturing/doctype/production_plan/production_plan.py:1438
msgid "UOM Conversion factor ({0} -> {1}) not found for item: {2}"
msgstr "物料{2}的计量单位换算系数({0}→{1})未找到"
@@ -52908,7 +53074,7 @@ msgstr "请为第{0}行输入单位换算系数"
msgid "UOM Name"
msgstr "单位名称"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:3611
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:3628
msgid "UOM conversion factor required for UOM: {0} in Item: {1}"
msgstr "物料{1}的计量单位{0}需要换算系数"
@@ -52963,7 +53129,7 @@ msgstr "无法为关键日期{2}查找{0}到{1}的汇率。请手动创建汇率
msgid "Unable to find score starting at {0}. You need to have standing scores covering 0 to 100"
msgstr "无法从{0}开始获得分数。你需要有0到100的常规分数"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:1018
+#: erpnext/manufacturing/doctype/work_order/work_order.py:1013
msgid "Unable to find the time slot in the next {0} days for the operation {1}. Please increase the 'Capacity Planning For (Days)' in the {2}."
msgstr "未来{0}天内未找到工序{1}的可用时段,请在{2}中增加'产能计划周期(天)'"
@@ -53034,7 +53200,7 @@ msgstr "未履行"
msgid "Unit"
msgstr "单位"
-#: erpnext/controllers/accounts_controller.py:4003
+#: erpnext/controllers/accounts_controller.py:4041
msgid "Unit Price"
msgstr ""
@@ -53224,7 +53390,7 @@ msgstr "计划外"
msgid "Unsecured Loans"
msgstr "无担保借款"
-#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1711
+#: erpnext/accounts/doctype/payment_entry/payment_entry.js:1706
msgid "Unset Matched Payment Request"
msgstr "取消匹配付款申请"
@@ -53312,6 +53478,10 @@ msgstr "自动更新BOM成本"
msgid "Update BOM cost automatically via scheduler, based on the latest Valuation Rate/Price List Rate/Last Purchase Rate of raw materials"
msgstr "通过后台程序基于原材料最新成本价/标价/采购价自动更新BOM成本"
+#: erpnext/stock/report/stock_qty_vs_batch_qty/stock_qty_vs_batch_qty.js:31
+msgid "Update Batch Qty"
+msgstr ""
+
#. Label of the update_billed_amount_in_delivery_note (Check) field in DocType
#. 'POS Invoice'
#. Label of the update_billed_amount_in_delivery_note (Check) field in DocType
@@ -53382,7 +53552,9 @@ msgid "Update Existing Price List Rate"
msgstr "更新物料价格主数据"
#: erpnext/buying/doctype/purchase_order/purchase_order.js:366
+#: erpnext/buying/doctype/supplier_quotation/supplier_quotation.js:35
#: erpnext/public/js/utils.js:842
+#: erpnext/selling/doctype/quotation/quotation.js:126
#: erpnext/selling/doctype/sales_order/sales_order.js:75
#: erpnext/selling/doctype/sales_order/sales_order.js:940
msgid "Update Items"
@@ -53445,7 +53617,7 @@ msgstr "项目统计数据更新频率"
msgid "Update latest price in all BOMs"
msgstr "更新所有BOM的最新价格"
-#: erpnext/assets/doctype/asset/asset.py:407
+#: erpnext/assets/doctype/asset/asset.py:466
msgid "Update stock must be enabled for the purchase invoice {0}"
msgstr "采购发票{0}必须启用库存更新"
@@ -53669,7 +53841,7 @@ msgstr "启用明细行批号与序列号字段"
msgid "Use Transaction Date Exchange Rate"
msgstr "使用交易日汇率"
-#: erpnext/projects/doctype/project/project.py:562
+#: erpnext/projects/doctype/project/project.py:563
msgid "Use a name that is different from previous project name"
msgstr "使用与之前项目名称不同的名称"
@@ -53953,7 +54125,7 @@ msgstr "有效期与可用性"
msgid "Validity in Days"
msgstr "有效天数"
-#: erpnext/selling/doctype/quotation/quotation.py:365
+#: erpnext/selling/doctype/quotation/quotation.py:366
msgid "Validity period of this quotation has ended."
msgstr "此报价的有效期已经结束。"
@@ -54065,7 +54237,7 @@ msgid "Valuation rate for the item as per Sales Invoice (Only for Internal Trans
msgstr "按销售发票的物料计价单价(仅限内部调拨)"
#: erpnext/accounts/doctype/payment_entry/payment_entry.py:2333
-#: erpnext/controllers/accounts_controller.py:3253
+#: erpnext/controllers/accounts_controller.py:3255
msgid "Valuation type charges can not be marked as Inclusive"
msgstr "计价类型费用不可标记为含税"
@@ -54368,7 +54540,7 @@ msgstr "数据查看依据"
msgid "View Exchange Gain/Loss Journals"
msgstr "查看汇兑损益日记账"
-#: erpnext/assets/doctype/asset/asset.js:166
+#: erpnext/assets/doctype/asset/asset.js:172
msgid "View General Ledger"
msgstr "查看会计总账"
@@ -54516,7 +54688,7 @@ msgstr "凭证号"
#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.js:42
#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:209
#: erpnext/accounts/report/general_ledger/general_ledger.js:49
-#: erpnext/accounts/report/general_ledger/general_ledger.py:742
+#: erpnext/accounts/report/general_ledger/general_ledger.py:746
#: erpnext/accounts/report/invalid_ledger_entries/invalid_ledger_entries.js:41
#: erpnext/accounts/report/invalid_ledger_entries/invalid_ledger_entries.py:33
#: erpnext/accounts/report/payment_ledger/payment_ledger.js:65
@@ -54556,7 +54728,7 @@ msgstr "单据数量"
#. Label of the voucher_subtype (Small Text) field in DocType 'GL Entry'
#: erpnext/accounts/doctype/gl_entry/gl_entry.json
-#: erpnext/accounts/report/general_ledger/general_ledger.py:736
+#: erpnext/accounts/report/general_ledger/general_ledger.py:740
msgid "Voucher Subtype"
msgstr "源凭证业务类型"
@@ -54589,7 +54761,7 @@ msgstr "源凭证业务类型"
#: erpnext/accounts/doctype/unreconcile_payment/unreconcile_payment.json
#: erpnext/accounts/report/accounts_receivable/accounts_receivable.py:1194
#: erpnext/accounts/report/general_and_payment_ledger_comparison/general_and_payment_ledger_comparison.py:200
-#: erpnext/accounts/report/general_ledger/general_ledger.py:734
+#: erpnext/accounts/report/general_ledger/general_ledger.py:738
#: erpnext/accounts/report/invalid_ledger_entries/invalid_ledger_entries.py:31
#: erpnext/accounts/report/payment_ledger/payment_ledger.py:165
#: erpnext/accounts/report/purchase_register/purchase_register.py:158
@@ -54620,7 +54792,7 @@ msgstr "源凭证业务类型"
msgid "Voucher Type"
msgstr "凭证类型"
-#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:191
+#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:195
msgid "Voucher {0} is over-allocated by {1}"
msgstr "凭证{0}超额分配{1}"
@@ -54672,6 +54844,11 @@ msgstr "在制品仓库"
msgid "WIP Warehouse"
msgstr "车间仓"
+#. Label of a number card in the Manufacturing Workspace
+#: erpnext/manufacturing/workspace/manufacturing/manufacturing.json
+msgid "WIP Work Orders"
+msgstr ""
+
#: erpnext/manufacturing/doctype/workstation/test_workstation.py:127
#: erpnext/patches/v16_0/make_workstation_operating_components.py:50
#: erpnext/setup/setup_wizard/operations/install_fixtures.py:317
@@ -54793,11 +54970,6 @@ msgstr "物料{0}需要指定仓库"
msgid "Warehouse wise Item Balance Age and Value"
msgstr "仓库级物料库龄和金额报表"
-#. Label of a chart in the Stock Workspace
-#: erpnext/stock/workspace/stock/stock.json
-msgid "Warehouse wise Stock Value"
-msgstr "按仓库库存金额"
-
#: erpnext/stock/doctype/warehouse/warehouse.py:94
msgid "Warehouse {0} can not be deleted as quantity exists for Item {1}"
msgstr "仓库{0}无法删除,因为产品{1}还有库存"
@@ -54935,11 +55107,11 @@ msgstr "警告!"
msgid "Warning: Another {0} # {1} exists against stock entry {2}"
msgstr "警告:库存凭证{2}中已存在另一个{0}#{1}"
-#: erpnext/stock/doctype/material_request/material_request.js:542
+#: erpnext/stock/doctype/material_request/material_request.js:544
msgid "Warning: Material Requested Qty is less than Minimum Order Qty"
msgstr "警告:物料需求数量低于最小起订量"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:1435
+#: erpnext/manufacturing/doctype/work_order/work_order.py:1430
msgid "Warning: Quantity exceeds maximum producible quantity based on quantity of raw materials received through the Subcontracting Inward Order {0}."
msgstr "警告:数量超过基于外包收货订单{0}接收的原材料数量的最大可生产数量。"
@@ -55298,9 +55470,9 @@ msgstr "进行中"
#: erpnext/manufacturing/report/work_order_stock_report/work_order_stock_report.py:104
#: erpnext/manufacturing/workspace/manufacturing/manufacturing.json
#: erpnext/selling/doctype/sales_order/sales_order.js:1050
-#: erpnext/stock/doctype/material_request/material_request.js:202
+#: erpnext/stock/doctype/material_request/material_request.js:204
#: erpnext/stock/doctype/material_request/material_request.json
-#: erpnext/stock/doctype/material_request/material_request.py:898
+#: erpnext/stock/doctype/material_request/material_request.py:899
#: erpnext/stock/doctype/pick_list/pick_list.json
#: erpnext/stock/doctype/serial_no/serial_no.json
#: erpnext/stock/doctype/stock_entry/stock_entry.json
@@ -55360,16 +55532,16 @@ msgstr "工单原材料库存齐套报表"
msgid "Work Order Summary"
msgstr "工单进度追踪表"
-#: erpnext/stock/doctype/material_request/material_request.py:904
+#: erpnext/stock/doctype/material_request/material_request.py:905
msgid "Work Order cannot be created for following reason:
{0}"
msgstr "无法创建生产工单,原因:
{0}"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:1379
+#: erpnext/manufacturing/doctype/work_order/work_order.py:1374
msgid "Work Order cannot be raised against a Item Template"
msgstr "不能为模板物料创建新生产工单"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:2386
-#: erpnext/manufacturing/doctype/work_order/work_order.py:2466
+#: erpnext/manufacturing/doctype/work_order/work_order.py:2381
+#: erpnext/manufacturing/doctype/work_order/work_order.py:2461
msgid "Work Order has been {0}"
msgstr "生产工单已{0}"
@@ -55381,12 +55553,12 @@ msgstr "生产工单未创建"
msgid "Work Order {0} created"
msgstr "工作订单{0}已创建"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:813
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:814
msgid "Work Order {0}: Job Card not found for the operation {1}"
msgstr "工单 {0}: Job Card not found 未找到针对工序 {1} 的生产任务单"
#: erpnext/manufacturing/report/job_card_summary/job_card_summary.js:56
-#: erpnext/stock/doctype/material_request/material_request.py:892
+#: erpnext/stock/doctype/material_request/material_request.py:893
msgid "Work Orders"
msgstr "工单"
@@ -55411,7 +55583,7 @@ msgstr "进行中"
msgid "Work-in-Progress Warehouse"
msgstr "车间仓"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:740
+#: erpnext/manufacturing/doctype/work_order/work_order.py:735
msgid "Work-in-Progress Warehouse is required before Submit"
msgstr "请指定车间仓后再提交"
@@ -55435,12 +55607,14 @@ msgstr "处理中"
#. Label of the working_hours_section (Tab Break) field in DocType
#. 'Workstation'
#. Label of the working_hours (Table) field in DocType 'Workstation'
+#. Label of a number card in the Projects Workspace
#. Label of the support_and_resolution_section_break (Section Break) field in
#. DocType 'Service Level Agreement'
#. Label of the support_and_resolution (Table) field in DocType 'Service Level
#. Agreement'
#: erpnext/manufacturing/doctype/workstation/workstation.json
#: erpnext/projects/report/timesheet_billing_summary/timesheet_billing_summary.py:65
+#: erpnext/projects/workspace/projects/projects.json
#: erpnext/support/doctype/service_level_agreement/service_level_agreement.json
msgid "Working Hours"
msgstr "工作时间"
@@ -55698,7 +55872,7 @@ msgstr "新财年开始或结束日期与{0}重叠。请在公司主数据中设
msgid "You are importing data for the code list:"
msgstr "您正在导入代码列表的数据:"
-#: erpnext/controllers/accounts_controller.py:3846
+#: erpnext/controllers/accounts_controller.py:3855
msgid "You are not allowed to update as per the conditions set in {} Workflow."
msgstr "根据{}工作流设置的条件,您无权更新"
@@ -55714,7 +55888,7 @@ msgstr "您此时无权在仓库{1}下为物料{0}创建/编辑库存交易"
msgid "You are not authorized to set Frozen value"
msgstr "您没有权限设定冻结值"
-#: erpnext/stock/doctype/pick_list/pick_list.py:473
+#: erpnext/stock/doctype/pick_list/pick_list.py:489
msgid "You are picking more than required quantity for the item {0}. Check if there is any other pick list created for the sales order {1}."
msgstr "您正在为物料{0}提货超过所需数量,请检查销售订单{1}是否已创建其他拣货单"
@@ -55743,7 +55917,7 @@ msgid "You can only have Plans with the same billing cycle in a Subscription"
msgstr "您只能在订阅中拥有相同结算周期的计划"
#: erpnext/accounts/doctype/pos_invoice/pos_invoice.js:423
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:910
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.js:906
msgid "You can only redeem max {0} points in this order."
msgstr "您只能按此顺序兑换最多{0}个积分。"
@@ -55775,7 +55949,7 @@ msgstr "不可兑换价值超过总金额的忠诚度积分。"
msgid "You cannot change the rate if BOM is mentioned against any Item."
msgstr "有物料清单的物料价格不可手工设置"
-#: erpnext/accounts/doctype/accounting_period/accounting_period.py:130
+#: erpnext/accounts/doctype/accounting_period/accounting_period.py:136
msgid "You cannot create a {0} within the closed Accounting Period {1}"
msgstr "不能在已关闭会计期间 {1} 创建 {0}"
@@ -55827,7 +56001,7 @@ msgstr "未付款的订单不能提交"
msgid "You cannot {0} this document because another Period Closing Entry {1} exists after {2}"
msgstr "无法{0}此单据,因为存在后续的期间结账分录{1}在{2}之后"
-#: erpnext/controllers/accounts_controller.py:3822
+#: erpnext/controllers/accounts_controller.py:3831
msgid "You do not have permissions to {} items in a {}."
msgstr "您无权{} {}。"
@@ -55879,7 +56053,7 @@ msgstr "添加物料前需先选择客户"
msgid "You need to cancel POS Closing Entry {} to be able to cancel this document."
msgstr "需先取消POS结算单{}才能取消此单据"
-#: erpnext/controllers/accounts_controller.py:3204
+#: erpnext/controllers/accounts_controller.py:3206
msgid "You selected the account group {1} as {2} Account in row {0}. Please select a single account."
msgstr "第{0}行选择账户组{1}作为{2}科目,请选择单个科目"
@@ -55916,7 +56090,7 @@ msgstr "YouTube ID"
msgid "Youtube Statistics"
msgstr "YouTube统计"
-#: erpnext/public/js/utils/contact_address_quick_entry.js:86
+#: erpnext/public/js/utils/contact_address_quick_entry.js:87
msgid "ZIP Code"
msgstr "邮编"
@@ -55930,7 +56104,7 @@ msgstr "余额为0"
msgid "Zero Rated"
msgstr "零税率"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:524
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:525
msgid "Zero quantity"
msgstr "零数量"
@@ -56205,8 +56379,8 @@ msgstr "已售"
msgid "subscription is already cancelled."
msgstr "订阅已取消"
-#: erpnext/controllers/status_updater.py:452
-#: erpnext/controllers/status_updater.py:472
+#: erpnext/controllers/status_updater.py:459
+#: erpnext/controllers/status_updater.py:478
msgid "target_ref_field"
msgstr "目标参考字段"
@@ -56224,7 +56398,7 @@ msgstr "标题"
msgid "to"
msgstr "至"
-#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3086
+#: erpnext/accounts/doctype/sales_invoice/sales_invoice.py:3087
msgid "to unallocate the amount of this Return Invoice before cancelling it."
msgstr "在取消前需先解除此退货发票的金额分配"
@@ -56259,7 +56433,7 @@ msgstr "{0}“{1}”已禁用"
msgid "{0} '{1}' not in Fiscal Year {2}"
msgstr "{0}“ {1}”不属于{2}财年"
-#: erpnext/manufacturing/doctype/work_order/work_order.py:632
+#: erpnext/manufacturing/doctype/work_order/work_order.py:627
msgid "{0} ({1}) cannot be greater than planned quantity ({2}) in Work Order {3}"
msgstr "{0}({1})不能大于生产工单{3}中的计划数量({2})"
@@ -56295,7 +56469,7 @@ msgstr "{0}统计信息"
msgid "{0} Number {1} is already used in {2} {3}"
msgstr "{0} 代码 {1} 已被 {2} {3} 占用"
-#: erpnext/manufacturing/doctype/bom/bom.py:1548
+#: erpnext/manufacturing/doctype/bom/bom.py:1560
msgid "{0} Operating Cost for operation {1}"
msgstr "工序{1}的{0}运营成本"
@@ -56432,7 +56606,7 @@ msgstr "已成功提交{0}"
msgid "{0} hours"
msgstr "{0}小时"
-#: erpnext/controllers/accounts_controller.py:2717
+#: erpnext/controllers/accounts_controller.py:2719
msgid "{0} in row {1}"
msgstr "{1}行中的{0}"
@@ -56454,7 +56628,7 @@ msgstr "{0}已在{1}运行"
msgid "{0} is blocked so this transaction cannot proceed"
msgstr "{0}被临时冻结,所以此交易无法继续"
-#: erpnext/assets/doctype/asset/asset.py:438
+#: erpnext/assets/doctype/asset/asset.py:497
msgid "{0} is in Draft. Submit it before creating the Asset."
msgstr ""
@@ -56471,7 +56645,7 @@ msgstr "对于科目 {1} {0} 必填"
msgid "{0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}"
msgstr "{0}是强制性的。可能没有为{1}到{2}创建货币兑换记录"
-#: erpnext/controllers/accounts_controller.py:3161
+#: erpnext/controllers/accounts_controller.py:3163
msgid "{0} is mandatory. Maybe Currency Exchange record is not created for {1} to {2}."
msgstr "{0}是必填项。{1}和{2}的货币转换记录可能还未生成。"
@@ -56483,7 +56657,7 @@ msgstr "{0}不是公司银行账户"
msgid "{0} is not a group node. Please select a group node as parent cost center"
msgstr "{0}不是组节点,请选择组节点作为上级成本中心"
-#: erpnext/stock/doctype/stock_entry/stock_entry.py:576
+#: erpnext/stock/doctype/stock_entry/stock_entry.py:577
msgid "{0} is not a stock Item"
msgstr "{0}不是库存物料"
@@ -56503,7 +56677,7 @@ msgstr "{0}未在{1}中启用"
msgid "{0} is not running. Cannot trigger events for this Document"
msgstr "{0} 未运行。无法触发该文档的事件"
-#: erpnext/stock/doctype/material_request/material_request.py:651
+#: erpnext/stock/doctype/material_request/material_request.py:652
msgid "{0} is not the default supplier for any items."
msgstr "{0}未被设置为任一物料的的默认供应商。"
@@ -56535,7 +56709,7 @@ msgstr "{0}在退货凭证中必须为负"
msgid "{0} not allowed to transact with {1}. Please change the Company or add the Company in the 'Allowed To Transact With'-Section in the Customer record."
msgstr "不允许{0}与{1}进行交易。请更改公司或在客户记录的'允许交易对象'章节添加该公司"
-#: erpnext/manufacturing/doctype/bom/bom.py:510
+#: erpnext/manufacturing/doctype/bom/bom.py:522
msgid "{0} not found for item {1}"
msgstr "没有找到物料 {1} 的{0}"
@@ -56555,11 +56729,11 @@ msgstr "已收到物料 {1} 数量 {0} 到仓库 {2},占用库容 {3}"
msgid "{0} units are reserved for Item {1} in Warehouse {2}, please un-reserve the same to {3} the Stock Reconciliation."
msgstr "仓库 {2} 中物料 {1} 已被预留了{0} ,请取消预留后再 {3} 库存调账"
-#: erpnext/stock/doctype/pick_list/pick_list.py:1013
+#: erpnext/stock/doctype/pick_list/pick_list.py:1029
msgid "{0} units of Item {1} is not available in any of the warehouses."
msgstr "物料 {1} 缺货数量 {0}"
-#: erpnext/stock/doctype/pick_list/pick_list.py:1005
+#: erpnext/stock/doctype/pick_list/pick_list.py:1021
msgid "{0} units of Item {1} is picked in another Pick List."
msgstr "其它拣货单中已拣 {0} 个物料 {1}"
@@ -56652,7 +56826,7 @@ msgstr "{0} {1}已被修改过,请刷新。"
msgid "{0} {1} has not been submitted so the action cannot be completed"
msgstr "{0} {1}尚未提交,因此无法完成此操作"
-#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:92
+#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:96
msgid "{0} {1} is allocated twice in this Bank Transaction"
msgstr "银行交易中重复分配了{0}{1}"
@@ -56665,7 +56839,7 @@ msgid "{0} {1} is associated with {2}, but Party Account is {3}"
msgstr "待付款源单据 {0} {1} 科目 {2} 与当前收付款凭证科目 {3} 不一致"
#: erpnext/controllers/selling_controller.py:526
-#: erpnext/controllers/subcontracting_controller.py:1133
+#: erpnext/controllers/subcontracting_controller.py:1140
msgid "{0} {1} is cancelled or closed"
msgstr "{0} {1}被取消或关闭"
@@ -56922,7 +57096,7 @@ msgstr "{} {} 已经关联了其它 {}"
msgid "{} {} is already linked with {} {}"
msgstr "{} {} 已经关联了 {} {}"
-#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:347
+#: erpnext/accounts/doctype/bank_transaction/bank_transaction.py:385
msgid "{} {} is not affecting bank account {}"
msgstr "{} {}未影响银行账户{}"
diff --git a/erpnext/manufacturing/doctype/bom/bom.js b/erpnext/manufacturing/doctype/bom/bom.js
index d5b9e8e719a..34ce59e6e51 100644
--- a/erpnext/manufacturing/doctype/bom/bom.js
+++ b/erpnext/manufacturing/doctype/bom/bom.js
@@ -19,6 +19,20 @@ frappe.ui.form.on("BOM", {
};
});
+ frm.set_query("operation", "items", function () {
+ if (!frm.doc.operations?.length) {
+ frappe.throw(__("Please add Operations first."));
+ }
+
+ let operations = frm.doc.operations.map((d) => d.operation);
+
+ return {
+ filters: {
+ name: ["in", operations],
+ },
+ };
+ });
+
frm.set_query("bom_no", "operations", function (doc, cdt, cdn) {
let row = locals[cdt][cdn];
return {
diff --git a/erpnext/manufacturing/doctype/bom/bom.py b/erpnext/manufacturing/doctype/bom/bom.py
index 96e091714a7..4bee20e3609 100644
--- a/erpnext/manufacturing/doctype/bom/bom.py
+++ b/erpnext/manufacturing/doctype/bom/bom.py
@@ -1036,10 +1036,14 @@ class BOM(WebsiteGenerator):
return erpnext.get_company_currency(self.company)
def add_to_cur_exploded_items(self, args):
- if self.cur_exploded_items.get(args.item_code):
- self.cur_exploded_items[args.item_code]["stock_qty"] += args.stock_qty
+ key = args.item_code
+ if args.operation:
+ key = (args.item_code, args.operation)
+
+ if self.cur_exploded_items.get(key):
+ self.cur_exploded_items[key]["stock_qty"] += args.stock_qty
else:
- self.cur_exploded_items[args.item_code] = args
+ self.cur_exploded_items[key] = args
def get_child_exploded_items(self, bom_no, stock_qty, operation=None):
"""Add all items from Flat BOM of child BOM"""
@@ -1275,7 +1279,7 @@ def get_bom_items_as_dict(
):
item_dict = {}
- group_by_cond = "group by item_code, stock_uom"
+ group_by_cond = "group by item_code, stock_uom, operation"
if frappe.get_cached_value("BOM", bom, "track_semi_finished_goods"):
fetch_exploded = 0
group_by_cond = "group by item_code, operation_row_id, stock_uom"
@@ -1360,6 +1364,9 @@ def get_bom_items_as_dict(
if item.operation_row_id:
key = (item.item_code, item.operation_row_id)
+ if item.operation:
+ key = (item.item_code, item.operation)
+
if item.get("is_phantom_item"):
data = get_bom_items_as_dict(
item.get("bom_no"),
diff --git a/erpnext/manufacturing/doctype/bom_creator/bom_creator.py b/erpnext/manufacturing/doctype/bom_creator/bom_creator.py
index 40040793620..b8d322f9463 100644
--- a/erpnext/manufacturing/doctype/bom_creator/bom_creator.py
+++ b/erpnext/manufacturing/doctype/bom_creator/bom_creator.py
@@ -4,7 +4,7 @@
from collections import OrderedDict
import frappe
-from frappe import _
+from frappe import _, bold
from frappe.model.document import Document
from frappe.utils import cint, flt, sbool
from pypika.terms import ValueWrapper
@@ -78,6 +78,29 @@ class BOMCreator(Document):
def validate(self):
self.validate_items()
+ self.validate_duplicate_item()
+
+ def validate_duplicate_item(self):
+ # If same items added multiple times under same parent, raise error
+ item_map = {}
+ for row in self.items:
+ if not row.fg_reference_id:
+ continue
+
+ key = (row.item_code, row.fg_reference_id)
+ if key in item_map:
+ parent_item_code = next(
+ item.item_code for item in self.items if item.name == row.fg_reference_id
+ )
+
+ frappe.throw(
+ _(
+ "Item {0} added multiple times under the same parent item {1} at rows {2} and {3}"
+ ).format(bold(row.item_code), bold(parent_item_code), item_map[key], row.idx),
+ title=_("Duplicate Item Under Same Parent"),
+ )
+ else:
+ item_map[key] = row.idx
def validate_items(self):
for row in self.items:
@@ -182,7 +205,7 @@ class BOMCreator(Document):
else:
row.rate = flt(self.get_raw_material_cost(row.item_code) * row.conversion_factor)
- row.amount = flt(row.rate * row.qty)
+ row.amount = flt(row.rate) * flt(row.qty)
amount += flt(row.amount)
return amount
diff --git a/erpnext/manufacturing/doctype/bom_operation/bom_operation.json b/erpnext/manufacturing/doctype/bom_operation/bom_operation.json
index 8e9d4782fad..27025c12fdb 100644
--- a/erpnext/manufacturing/doctype/bom_operation/bom_operation.json
+++ b/erpnext/manufacturing/doctype/bom_operation/bom_operation.json
@@ -147,8 +147,10 @@
},
{
"depends_on": "eval:doc.parenttype == \"Routing\"",
+ "description": "If you want to run operations in parallel, keep the same sequence ID for them.",
"fieldname": "sequence_id",
"fieldtype": "Int",
+ "in_list_view": 1,
"label": "Sequence ID"
},
{
@@ -295,7 +297,7 @@
"index_web_pages_for_search": 1,
"istable": 1,
"links": [],
- "modified": "2025-08-12 19:27:20.682797",
+ "modified": "2026-01-01 17:15:59.806874",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "BOM Operation",
diff --git a/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.json b/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.json
index 0892b3ce75b..654d566cff7 100644
--- a/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.json
+++ b/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.json
@@ -52,7 +52,7 @@
"fieldname": "status",
"fieldtype": "Select",
"label": "Status",
- "options": "Queued\nIn Progress\nCompleted\nFailed"
+ "options": "Queued\nIn Progress\nCompleted\nFailed\nCancelled"
},
{
"fieldname": "amended_from",
@@ -98,11 +98,11 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2024-03-27 13:06:41.658172",
+ "modified": "2025-12-24 12:27:06.478893",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "BOM Update Log",
- "naming_rule": "Expression (old style)",
+ "naming_rule": "Expression",
"owner": "Administrator",
"permissions": [
{
@@ -131,8 +131,9 @@
"write": 1
}
],
+ "row_format": "Dynamic",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
-}
\ No newline at end of file
+}
diff --git a/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py b/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py
index 9984ce455ca..a5f3ee4ea95 100644
--- a/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py
+++ b/erpnext/manufacturing/doctype/bom_update_log/bom_update_log.py
@@ -41,7 +41,7 @@ class BOMUpdateLog(Document):
error_log: DF.Link | None
new_bom: DF.Link | None
processed_boms: DF.LongText | None
- status: DF.Literal["Queued", "In Progress", "Completed", "Failed"]
+ status: DF.Literal["Queued", "In Progress", "Completed", "Failed", "Cancelled"]
update_type: DF.Literal["Replace BOM", "Update Cost"]
# end: auto-generated types
@@ -64,6 +64,9 @@ class BOMUpdateLog(Document):
self.status = "Queued"
+ def on_discard(self):
+ self.db_set("status", "Cancelled")
+
def validate_boms_are_specified(self):
if self.update_type == "Replace BOM" and not (self.current_bom and self.new_bom):
frappe.throw(
diff --git a/erpnext/manufacturing/doctype/job_card/job_card.json b/erpnext/manufacturing/doctype/job_card/job_card.json
index 1fc9feaf21d..6488a54308a 100644
--- a/erpnext/manufacturing/doctype/job_card/job_card.json
+++ b/erpnext/manufacturing/doctype/job_card/job_card.json
@@ -405,7 +405,8 @@
"fieldname": "employee",
"fieldtype": "Table MultiSelect",
"label": "Employee",
- "options": "Job Card Time Log"
+ "options": "Job Card Time Log",
+ "read_only": 1
},
{
"fieldname": "serial_no",
@@ -625,7 +626,7 @@
"grid_page_length": 50,
"is_submittable": 1,
"links": [],
- "modified": "2025-08-04 15:47:54.514290",
+ "modified": "2025-12-22 14:20:07.817118",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Job Card",
diff --git a/erpnext/manufacturing/doctype/job_card/job_card.py b/erpnext/manufacturing/doctype/job_card/job_card.py
index d086da7051c..c9010ff54cc 100644
--- a/erpnext/manufacturing/doctype/job_card/job_card.py
+++ b/erpnext/manufacturing/doctype/job_card/job_card.py
@@ -144,6 +144,9 @@ class JobCard(Document):
self.set_onload("work_order_closed", self.is_work_order_closed())
self.set_onload("has_stock_entry", self.has_stock_entry())
+ def on_discard(self):
+ self.db_set("status", "Cancelled")
+
def has_stock_entry(self):
return frappe.db.exists("Stock Entry", {"job_card": self.name, "docstatus": ["!=", 2]})
@@ -162,6 +165,7 @@ class JobCard(Document):
self.set_total_completed_qty_from_sub_operations()
self.validate_work_order()
+ self.set_employees()
def on_update(self):
self.validate_job_card_qty()
@@ -631,11 +635,6 @@ class JobCard(Document):
row = self.append("time_logs", args)
row.db_update()
- def set_employees(self, employees):
- for name in employees:
- self.append("employee", {"employee": name.get("employee"), "completed_qty": 0.0})
- self.save()
-
def update_sub_operation_status(self):
if not self.sub_operations:
return
@@ -1230,6 +1229,12 @@ class JobCard(Document):
if self.is_work_order_closed():
frappe.throw(_("You can't make any changes to Job Card since Work Order is closed."))
+ def set_employees(self):
+ self.employee = []
+ for item in self.time_logs:
+ if not any(d.employee == item.employee for d in self.employee):
+ self.append("employee", {"employee": item.employee, "completed_qty": 0.0})
+
def is_work_order_closed(self):
if self.work_order:
status = frappe.get_value("Work Order", self.work_order)
@@ -1285,10 +1290,8 @@ class JobCard(Document):
self.set_status(update_status=update_status)
- if not self.employee and kwargs.employees:
- self.set_employees(kwargs.employees)
-
self.validate_time_logs(save=True)
+ self.save()
def update_workstation_status(self):
status_map = {
@@ -1329,17 +1332,15 @@ class JobCard(Document):
kwargs = frappe._dict(kwargs)
if kwargs.end_time:
+ if kwargs.for_quantity:
+ self.for_quantity = kwargs.for_quantity
+
self.add_time_logs(
to_time=kwargs.end_time,
completed_qty=kwargs.qty,
employees=self.employee,
sub_operation=kwargs.get("sub_operation"),
)
-
- if kwargs.for_quantity:
- self.for_quantity = kwargs.for_quantity
-
- self.save()
else:
self.add_time_logs(completed_qty=kwargs.qty, employees=self.employee)
self.save()
diff --git a/erpnext/manufacturing/doctype/production_plan/production_plan.py b/erpnext/manufacturing/doctype/production_plan/production_plan.py
index 579dca4a8df..772d9466228 100644
--- a/erpnext/manufacturing/doctype/production_plan/production_plan.py
+++ b/erpnext/manufacturing/doctype/production_plan/production_plan.py
@@ -119,6 +119,9 @@ class ProductionPlan(Document):
frappe.db.get_single_value("Stock Settings", "enable_stock_reservation"),
)
+ def on_discard(self):
+ self.db_set("status", "Cancelled")
+
def validate(self):
self.set_pending_qty_in_row_without_reference()
self.calculate_total_planned_qty()
diff --git a/erpnext/manufacturing/doctype/sales_forecast/sales_forecast.json b/erpnext/manufacturing/doctype/sales_forecast/sales_forecast.json
index c0af3ef8322..550f62ee112 100644
--- a/erpnext/manufacturing/doctype/sales_forecast/sales_forecast.json
+++ b/erpnext/manufacturing/doctype/sales_forecast/sales_forecast.json
@@ -143,7 +143,7 @@
"fieldtype": "Select",
"in_list_view": 1,
"label": "Status",
- "options": "Planned\nMPS Generated",
+ "options": "Planned\nMPS Generated\nCancelled",
"read_only": 1
},
{
@@ -166,7 +166,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2025-11-13 16:33:49.682684",
+ "modified": "2025-12-24 11:40:44.263700",
"modified_by": "Administrator",
"module": "Manufacturing",
"name": "Sales Forecast",
diff --git a/erpnext/manufacturing/doctype/sales_forecast/sales_forecast.py b/erpnext/manufacturing/doctype/sales_forecast/sales_forecast.py
index 9167d4dcf32..dd1427bcd70 100644
--- a/erpnext/manufacturing/doctype/sales_forecast/sales_forecast.py
+++ b/erpnext/manufacturing/doctype/sales_forecast/sales_forecast.py
@@ -33,9 +33,12 @@ class SalesForecast(Document):
parent_warehouse: DF.Link
posting_date: DF.Date | None
selected_items: DF.TableMultiSelect[SalesForecastItem]
- status: DF.Literal["Planned", "MPS Generated"]
+ status: DF.Literal["Planned", "MPS Generated", "Cancelled"]
# end: auto-generated types
+ def on_discard(self):
+ self.db_set("status", "Cancelled")
+
def validate(self):
self.validate_demand_qty()
diff --git a/erpnext/manufacturing/doctype/work_order/work_order.py b/erpnext/manufacturing/doctype/work_order/work_order.py
index a602fba4dbe..df03dc2951d 100644
--- a/erpnext/manufacturing/doctype/work_order/work_order.py
+++ b/erpnext/manufacturing/doctype/work_order/work_order.py
@@ -180,6 +180,9 @@ class WorkOrder(Document):
return False
+ def on_discard(self):
+ self.db_set("status", "Cancelled")
+
def validate(self):
self.validate_production_item()
if self.bom_no:
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index f2f568d8abe..ce466bc94cd 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -454,4 +454,5 @@ erpnext.patches.v16_0.populate_budget_distribution_total
erpnext.patches.v16_0.set_mr_picked_qty
erpnext.patches.v16_0.update_tax_withholding_field_in_payment_entry
erpnext.patches.v16_0.migrate_tax_withholding_data
-
+erpnext.patches.v16_0.update_corrected_cancelled_status
+erpnext.patches.v16_0.fix_barcode_typo
diff --git a/erpnext/patches/v11_0/update_sales_partner_type.py b/erpnext/patches/v11_0/update_sales_partner_type.py
index ced77d97276..75c28613a53 100644
--- a/erpnext/patches/v11_0/update_sales_partner_type.py
+++ b/erpnext/patches/v11_0/update_sales_partner_type.py
@@ -30,4 +30,4 @@ def execute():
def insert_sales_partner_type(s):
if not frappe.db.exists("Sales Partner Type", s):
- frappe.get_doc(dict(doctype="Sales Partner Type", sales_partner_type=s)).insert()
+ frappe.get_doc(doctype="Sales Partner Type", sales_partner_type=s).insert()
diff --git a/erpnext/patches/v13_0/update_project_template_tasks.py b/erpnext/patches/v13_0/update_project_template_tasks.py
index c9a23222424..4ba8f853a9e 100644
--- a/erpnext/patches/v13_0/update_project_template_tasks.py
+++ b/erpnext/patches/v13_0/update_project_template_tasks.py
@@ -30,15 +30,13 @@ def execute():
if task.subject:
replace_tasks = True
new_task = frappe.get_doc(
- dict(
- doctype="Task",
- subject=task.subject,
- start=task.start,
- duration=task.duration,
- task_weight=task.task_weight,
- description=task.description,
- is_template=1,
- )
+ doctype="Task",
+ subject=task.subject,
+ start=task.start,
+ duration=task.duration,
+ task_weight=task.task_weight,
+ description=task.description,
+ is_template=1,
).insert()
new_tasks.append(new_task)
diff --git a/erpnext/patches/v16_0/fix_barcode_typo.py b/erpnext/patches/v16_0/fix_barcode_typo.py
new file mode 100644
index 00000000000..0433b96bf6a
--- /dev/null
+++ b/erpnext/patches/v16_0/fix_barcode_typo.py
@@ -0,0 +1,7 @@
+import frappe
+
+
+def execute():
+ frappe.qb.update("Item Barcode").set("barcode_type", "EAN-13").where(
+ frappe.qb.Field("barcode_type") == "EAN-12"
+ ).run()
diff --git a/erpnext/patches/v16_0/migrate_budget_records_to_new_structure.py b/erpnext/patches/v16_0/migrate_budget_records_to_new_structure.py
index c9a18ebff31..5d6dc25c3ea 100644
--- a/erpnext/patches/v16_0/migrate_budget_records_to_new_structure.py
+++ b/erpnext/patches/v16_0/migrate_budget_records_to_new_structure.py
@@ -1,6 +1,10 @@
import frappe
from frappe.utils import add_months, flt, get_first_day, get_last_day
+from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import (
+ get_accounting_dimensions,
+)
+
def execute():
remove_old_property_setter()
@@ -79,6 +83,10 @@ def create_new_budget_from_row(budget_doc, fiscal_year, account_row, percentage_
for field in core_fields:
new_budget.set(field, budget_doc.get(field))
+ for fieldname in get_accounting_dimensions():
+ if budget_doc.get(fieldname):
+ new_budget.set(fieldname, budget_doc.get(fieldname))
+
new_budget.from_fiscal_year = fiscal_year.name
new_budget.to_fiscal_year = fiscal_year.name
new_budget.budget_start_date = fiscal_year.year_start_date
diff --git a/erpnext/patches/v16_0/update_corrected_cancelled_status.py b/erpnext/patches/v16_0/update_corrected_cancelled_status.py
new file mode 100644
index 00000000000..86b76fe896c
--- /dev/null
+++ b/erpnext/patches/v16_0/update_corrected_cancelled_status.py
@@ -0,0 +1,16 @@
+import frappe
+
+
+def execute():
+ stock_closing_entry = frappe.qb.DocType("Stock Closing Entry")
+ call_log = frappe.qb.DocType("Call Log")
+
+ # updating stock closing entry status to cancelled from canceled
+ (
+ frappe.qb.update(stock_closing_entry)
+ .set(stock_closing_entry.status, "Cancelled")
+ .where(stock_closing_entry.status == "Canceled")
+ ).run()
+
+ # updating call log status to cancelled from canceled
+ (frappe.qb.update(call_log).set(call_log.status, "Cancelled").where(call_log.status == "Canceled")).run()
diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py
index 13da8d10774..c7023dd9423 100644
--- a/erpnext/projects/doctype/project/project.py
+++ b/erpnext/projects/doctype/project/project.py
@@ -127,22 +127,20 @@ class Project(Document):
def create_task_from_template(self, task_details):
return frappe.get_doc(
- dict(
- doctype="Task",
- subject=task_details.subject,
- project=self.name,
- status="Open",
- exp_start_date=self.calculate_start_date(task_details),
- exp_end_date=self.calculate_end_date(task_details),
- description=task_details.description,
- task_weight=task_details.task_weight,
- type=task_details.type,
- issue=task_details.issue,
- is_group=task_details.is_group,
- color=task_details.color,
- template_task=task_details.name,
- priority=task_details.priority,
- )
+ doctype="Task",
+ subject=task_details.subject,
+ project=self.name,
+ status="Open",
+ exp_start_date=self.calculate_start_date(task_details),
+ exp_end_date=self.calculate_end_date(task_details),
+ description=task_details.description,
+ task_weight=task_details.task_weight,
+ type=task_details.type,
+ issue=task_details.issue,
+ is_group=task_details.is_group,
+ color=task_details.color,
+ template_task=task_details.name,
+ priority=task_details.priority,
).insert()
def calculate_start_date(self, task_details):
diff --git a/erpnext/projects/doctype/project/test_project.py b/erpnext/projects/doctype/project/test_project.py
index 5d353a3cdbd..2f1974ee4cb 100644
--- a/erpnext/projects/doctype/project/test_project.py
+++ b/erpnext/projects/doctype/project/test_project.py
@@ -255,14 +255,12 @@ class TestProject(ERPNextTestSuite):
def get_project(name, template):
project = frappe.get_doc(
- dict(
- doctype="Project",
- project_name=name,
- status="Open",
- project_template=template.name,
- expected_start_date=nowdate(),
- company="_Test Company",
- )
+ doctype="Project",
+ project_name=name,
+ status="Open",
+ project_template=template.name,
+ expected_start_date=nowdate(),
+ company="_Test Company",
).insert()
return project
@@ -275,13 +273,11 @@ def make_project(args):
return frappe.get_doc("Project", {"project_name": args.project_name})
project = frappe.get_doc(
- dict(
- doctype="Project",
- project_name=args.project_name,
- status="Open",
- expected_start_date=args.start_date,
- company=args.company or "_Test Company",
- )
+ doctype="Project",
+ project_name=args.project_name,
+ status="Open",
+ expected_start_date=args.start_date,
+ company=args.company or "_Test Company",
)
if args.project_template_name:
diff --git a/erpnext/projects/doctype/project_template/test_project_template.py b/erpnext/projects/doctype/project_template/test_project_template.py
index 7d94e5226ca..2671d7a02ec 100644
--- a/erpnext/projects/doctype/project_template/test_project_template.py
+++ b/erpnext/projects/doctype/project_template/test_project_template.py
@@ -20,7 +20,7 @@ def make_project_template(project_template_name, project_tasks=None):
create_task(subject="_Test Template Task 1", is_template=1, begin=0, duration=3),
create_task(subject="_Test Template Task 2", is_template=1, begin=0, duration=2),
]
- doc = frappe.get_doc(dict(doctype="Project Template", name=project_template_name))
+ doc = frappe.get_doc(doctype="Project Template", name=project_template_name)
for task in project_tasks:
doc.append("tasks", {"task": task.name})
doc.insert()
diff --git a/erpnext/projects/doctype/timesheet/test_timesheet.py b/erpnext/projects/doctype/timesheet/test_timesheet.py
index 046db983dc0..55d90e85c94 100644
--- a/erpnext/projects/doctype/timesheet/test_timesheet.py
+++ b/erpnext/projects/doctype/timesheet/test_timesheet.py
@@ -8,6 +8,7 @@ from frappe.tests import IntegrationTestCase
from frappe.utils import add_to_date, now_datetime, nowdate
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_sales_invoice
+from erpnext.projects.doctype.task.test_task import create_task
from erpnext.projects.doctype.timesheet.timesheet import OverlapError, make_sales_invoice
from erpnext.setup.doctype.employee.test_employee import make_employee
from erpnext.tests.utils import ERPNextTestSuite
@@ -22,6 +23,55 @@ class TestTimesheet(ERPNextTestSuite):
def setUp(self):
frappe.db.delete("Timesheet")
+ def test_timesheet_post_update(self):
+ frappe.get_doc(
+ {
+ "doctype": "Property Setter",
+ "doctype_or_field": "DocField",
+ "doc_type": "Timesheet",
+ "field_name": "time_logs",
+ "property": "allow_on_submit",
+ "property_type": "Check",
+ "value": "1",
+ }
+ ).insert(ignore_permissions=True)
+
+ task = create_task("Test Task 1")
+
+ timesheet = frappe.new_doc("Timesheet")
+ timesheet.append(
+ "time_logs",
+ {
+ "task": task.name,
+ "from_time": now_datetime(),
+ "to_time": now_datetime() + datetime.timedelta(hours=1),
+ "company": "_Test Company",
+ },
+ )
+
+ timesheet.save()
+ timesheet.submit()
+ task.reload()
+ self.assertEqual(task.actual_time, 1)
+ timesheet.append(
+ "time_logs",
+ {
+ "task": task.name,
+ "from_time": now_datetime(),
+ "to_time": now_datetime() + datetime.timedelta(hours=2),
+ "hours": 2,
+ },
+ )
+
+ timesheet.save()
+ task.reload()
+ self.assertEqual(task.actual_time, 3)
+
+ frappe.db.delete(
+ "Property Setter",
+ {"doc_type": "Timesheet", "field_name": "time_logs", "property": "allow_on_submit"},
+ )
+
def test_timesheet_base_amount(self):
emp = make_employee("test_employee_6@salary.com")
timesheet = make_timesheet(emp, simulate=True, is_billable=1)
diff --git a/erpnext/projects/doctype/timesheet/timesheet.py b/erpnext/projects/doctype/timesheet/timesheet.py
index 5ef50218a3f..d9ee987c8c2 100644
--- a/erpnext/projects/doctype/timesheet/timesheet.py
+++ b/erpnext/projects/doctype/timesheet/timesheet.py
@@ -73,6 +73,13 @@ class Timesheet(Document):
self.calculate_percentage_billed()
self.set_dates()
+ def on_discard(self):
+ self.db_set("status", "Cancelled")
+
+ def on_update_after_submit(self):
+ self.validate_mandatory_fields()
+ self.update_task_and_project()
+
def calculate_hours(self):
for row in self.time_logs:
if row.to_time and row.from_time:
diff --git a/erpnext/public/icons/desktop_icons/solid/finnancial-report.svg b/erpnext/public/icons/desktop_icons/solid/financial_reports.svg
similarity index 100%
rename from erpnext/public/icons/desktop_icons/solid/finnancial-report.svg
rename to erpnext/public/icons/desktop_icons/solid/financial_reports.svg
diff --git a/erpnext/public/icons/desktop_icons/subtle/finnancial-report.svg b/erpnext/public/icons/desktop_icons/subtle/financial_reports.svg
similarity index 100%
rename from erpnext/public/icons/desktop_icons/subtle/finnancial-report.svg
rename to erpnext/public/icons/desktop_icons/subtle/financial_reports.svg
diff --git a/erpnext/public/js/bank_reconciliation_tool/dialog_manager.js b/erpnext/public/js/bank_reconciliation_tool/dialog_manager.js
index bab25b6eca2..16d4e9971d8 100644
--- a/erpnext/public/js/bank_reconciliation_tool/dialog_manager.js
+++ b/erpnext/public/js/bank_reconciliation_tool/dialog_manager.js
@@ -361,6 +361,21 @@ erpnext.accounts.bank_reconciliation.DialogManager = class DialogManager {
mandatory_depends_on:
"eval:doc.action=='Create Voucher' && doc.document_type=='Payment Entry'",
},
+ {
+ fieldname: "bank_account",
+ fieldtype: "Link",
+ label: "Company Bank Account",
+ options: "Bank Account",
+ depends_on: "eval:doc.party",
+ get_query: function () {
+ return {
+ filters: {
+ is_company_account: 1,
+ company: this.company,
+ },
+ };
+ },
+ },
{
fieldname: "project",
fieldtype: "Link",
@@ -511,6 +526,7 @@ erpnext.accounts.bank_reconciliation.DialogManager = class DialogManager {
mode_of_payment: values.mode_of_payment,
project: values.project,
cost_center: values.cost_center,
+ company_bank_account: values?.bank_account || this?.bank_account,
},
callback: (response) => {
const alert_string = __("Bank Transaction {0} added as Payment Entry", [
@@ -582,6 +598,7 @@ erpnext.accounts.bank_reconciliation.DialogManager = class DialogManager {
project: values.project,
cost_center: values.cost_center,
allow_edit: true,
+ company_bank_account: values?.bank_account || this?.bank_account,
},
callback: (r) => {
const doc = frappe.model.sync(r.message);
diff --git a/erpnext/public/js/controllers/taxes_and_totals.js b/erpnext/public/js/controllers/taxes_and_totals.js
index 855dbfe67e9..87ec985ad18 100644
--- a/erpnext/public/js/controllers/taxes_and_totals.js
+++ b/erpnext/public/js/controllers/taxes_and_totals.js
@@ -1106,7 +1106,7 @@ erpnext.taxes_and_totals = class TaxesAndTotals extends erpnext.payments {
var payment_types = $.map(this.frm.doc.payments, function (d) {
return d.type;
});
- if (in_list(payment_types, "Cash")) {
+ if (payment_types.includes("Cash")) {
var grand_total = this.frm.doc.rounded_total || this.frm.doc.grand_total;
var base_grand_total = this.frm.doc.base_rounded_total || this.frm.doc.base_grand_total;
diff --git a/erpnext/public/js/controllers/transaction.js b/erpnext/public/js/controllers/transaction.js
index fb782b12e0e..0ea2bac6591 100644
--- a/erpnext/public/js/controllers/transaction.js
+++ b/erpnext/public/js/controllers/transaction.js
@@ -904,7 +904,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
get_incoming_rate(item, posting_date, posting_time, voucher_type, company) {
let item_args = {
item_code: item.item_code,
- warehouse: in_list("Purchase Receipt", "Purchase Invoice") ? item.from_warehouse : item.warehouse,
+ warehouse: "Purchase Receipt".includes("Purchase Invoice") ? item.from_warehouse : item.warehouse,
posting_date: posting_date,
posting_time: posting_time,
qty: item.qty * item.conversion_factor,
@@ -2248,7 +2248,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
child.apply_rule_on_other_items &&
JSON.parse(child.apply_rule_on_other_items).length
) {
- if (!in_list(JSON.parse(child.apply_rule_on_other_items), child.item_code)) {
+ if (!JSON.parse(child.apply_rule_on_other_items).includes(child.item_code)) {
continue;
}
}
@@ -2296,7 +2296,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
if (JSON.parse(data.apply_rule_on_other_items).includes(d[data.apply_rule_on])) {
for (var k in data) {
if (
- in_list(fields, k) &&
+ fields.includes(k) &&
data[k] &&
(data.price_or_product_discount === "Price" || k === "pricing_rules")
) {
@@ -2768,8 +2768,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
}
has_discount_in_schedule() {
- let is_eligible = in_list(
- ["Sales Order", "Sales Invoice", "Purchase Order", "Purchase Invoice"],
+ let is_eligible = ["Sales Order", "Sales Invoice", "Purchase Order", "Purchase Invoice"].includes(
this.frm.doctype
);
let has_payment_schedule = this.frm.doc.payment_schedule && this.frm.doc.payment_schedule.length;
@@ -3205,16 +3204,13 @@ erpnext.show_serial_batch_selector = function (frm, item_row, callback, on_close
}
if (
- in_list(
- [
- "Material Transfer",
- "Send to Subcontractor",
- "Material Issue",
- "Material Consumption for Manufacture",
- "Material Transfer for Manufacture",
- ],
- frm.doc.purpose
- )
+ [
+ "Material Transfer",
+ "Send to Subcontractor",
+ "Material Issue",
+ "Material Consumption for Manufacture",
+ "Material Transfer for Manufacture",
+ ].includes(frm.doc.purpose)
) {
warehouse_field = "s_warehouse";
} else {
diff --git a/erpnext/public/js/utils/barcode_scanner.js b/erpnext/public/js/utils/barcode_scanner.js
index 822a9902a38..2e580f83c18 100644
--- a/erpnext/public/js/utils/barcode_scanner.js
+++ b/erpnext/public/js/utils/barcode_scanner.js
@@ -338,7 +338,7 @@ erpnext.utils.BarcodeScanner = class BarcodeScanner {
? this.dialog.get_value("serial_no").split("\n")
: [];
- if (in_list(serial_nos, serial_no)) {
+ if (serial_nos.includes(serial_no)) {
frappe.throw(__("Serial No {0} already scanned", [serial_no]));
}
}
@@ -359,7 +359,7 @@ erpnext.utils.BarcodeScanner = class BarcodeScanner {
];
for (let key in prev_row) {
- if (in_list(ignore_fields, key)) {
+ if (ignore_fields.includes(key)) {
continue;
}
diff --git a/erpnext/public/js/utils/party.js b/erpnext/public/js/utils/party.js
index fcd6c05e4ac..d86296f1eea 100644
--- a/erpnext/public/js/utils/party.js
+++ b/erpnext/public/js/utils/party.js
@@ -36,14 +36,14 @@ erpnext.utils.get_party_details = function (frm, method, args, callback) {
}
if (!args) {
- if (in_list(SALES_DOCTYPES, frm.doc.doctype)) {
+ if (SALES_DOCTYPES.includes(frm.doc.doctype)) {
args = {
party: frm.doc.customer || frm.doc.party_name,
party_type: "Customer",
};
}
- if (in_list(PURCHASE_DOCTYPES, frm.doc.doctype)) {
+ if (PURCHASE_DOCTYPES.includes(frm.doc.doctype)) {
args = {
party: frm.doc.supplier,
party_type: "Supplier",
@@ -57,13 +57,13 @@ erpnext.utils.get_party_details = function (frm, method, args, callback) {
args.fetch_payment_terms_template = cint(!frm.doc.ignore_default_payment_terms_template);
}
- if (in_list(SALES_DOCTYPES, frm.doc.doctype)) {
+ if (SALES_DOCTYPES.includes(frm.doc.doctype)) {
if (!args.company_address && frm.doc.company_address) {
args.company_address = frm.doc.company_address;
}
}
- if (in_list(PURCHASE_DOCTYPES, frm.doc.doctype)) {
+ if (PURCHASE_DOCTYPES.includes(frm.doc.doctype)) {
if (!args.company_address && frm.doc.billing_address) {
args.company_address = frm.doc.billing_address;
}
diff --git a/erpnext/quality_management/doctype/quality_feedback/test_quality_feedback.py b/erpnext/quality_management/doctype/quality_feedback/test_quality_feedback.py
index 7baf908b3df..35a326ad943 100644
--- a/erpnext/quality_management/doctype/quality_feedback/test_quality_feedback.py
+++ b/erpnext/quality_management/doctype/quality_feedback/test_quality_feedback.py
@@ -9,20 +9,16 @@ from frappe.tests import IntegrationTestCase
class TestQualityFeedback(IntegrationTestCase):
def test_quality_feedback(self):
template = frappe.get_doc(
- dict(
- doctype="Quality Feedback Template",
- template="Test Template",
- parameters=[dict(parameter="Test Parameter 1"), dict(parameter="Test Parameter 2")],
- )
+ doctype="Quality Feedback Template",
+ template="Test Template",
+ parameters=[dict(parameter="Test Parameter 1"), dict(parameter="Test Parameter 2")],
).insert()
feedback = frappe.get_doc(
- dict(
- doctype="Quality Feedback",
- template=template.name,
- document_type="User",
- document_name=frappe.session.user,
- )
+ doctype="Quality Feedback",
+ template=template.name,
+ document_type="User",
+ document_name=frappe.session.user,
).insert()
self.assertEqual(template.parameters[0].parameter, feedback.parameters[0].parameter)
diff --git a/erpnext/quality_management/doctype/quality_goal/test_quality_goal.py b/erpnext/quality_management/doctype/quality_goal/test_quality_goal.py
index 1b3727500b3..57d0a94ed0a 100644
--- a/erpnext/quality_management/doctype/quality_goal/test_quality_goal.py
+++ b/erpnext/quality_management/doctype/quality_goal/test_quality_goal.py
@@ -16,10 +16,8 @@ class TestQualityGoal(IntegrationTestCase):
def get_quality_goal():
return frappe.get_doc(
- dict(
- doctype="Quality Goal",
- goal="Test Quality Module",
- frequency="Daily",
- objectives=[dict(objective="Check test cases", target="100", uom="Percent")],
- )
+ doctype="Quality Goal",
+ goal="Test Quality Module",
+ frequency="Daily",
+ objectives=[dict(objective="Check test cases", target="100", uom="Percent")],
).insert()
diff --git a/erpnext/regional/address_template/setup.py b/erpnext/regional/address_template/setup.py
index 684c76620a4..793767e0a90 100644
--- a/erpnext/regional/address_template/setup.py
+++ b/erpnext/regional/address_template/setup.py
@@ -50,5 +50,5 @@ def update_address_template(country, html, is_default=0):
frappe.db.set_value("Address Template", country, "is_default", is_default)
else:
frappe.get_doc(
- dict(doctype="Address Template", country=country, is_default=is_default, template=html)
+ doctype="Address Template", country=country, is_default=is_default, template=html
).insert()
diff --git a/erpnext/regional/italy/setup.py b/erpnext/regional/italy/setup.py
index 3ee8399012f..9f9115ca12d 100644
--- a/erpnext/regional/italy/setup.py
+++ b/erpnext/regional/italy/setup.py
@@ -231,6 +231,22 @@ def make_custom_fields(update=True):
description=_("Set this if the customer is a Public Administration company."),
depends_on='eval:doc.customer_type=="Company"',
),
+ dict(
+ fieldname="first_name",
+ label="First Name",
+ fieldtype="Data",
+ insert_after="salutation",
+ print_hide=1,
+ depends_on='eval:doc.customer_type!="Company"',
+ ),
+ dict(
+ fieldname="last_name",
+ label="Last Name",
+ fieldtype="Data",
+ insert_after="first_name",
+ print_hide=1,
+ depends_on='eval:doc.customer_type!="Company"',
+ ),
],
"Mode of Payment": [
dict(
@@ -454,11 +470,9 @@ def setup_report():
if not frappe.db.get_value("Custom Role", dict(report=report_name)):
frappe.get_doc(
- dict(
- doctype="Custom Role",
- report=report_name,
- roles=[dict(role="Accounts User"), dict(role="Accounts Manager")],
- )
+ doctype="Custom Role",
+ report=report_name,
+ roles=[dict(role="Accounts User"), dict(role="Accounts Manager")],
).insert()
diff --git a/erpnext/regional/south_africa/setup.py b/erpnext/regional/south_africa/setup.py
index 289f2726e9b..3c9f492edfc 100644
--- a/erpnext/regional/south_africa/setup.py
+++ b/erpnext/regional/south_africa/setup.py
@@ -50,9 +50,7 @@ def add_permissions():
if not frappe.db.get_value("Custom Role", dict(report="VAT Audit Report")):
frappe.get_doc(
- dict(
- doctype="Custom Role",
- report="VAT Audit Report",
- roles=[dict(role="Accounts User"), dict(role="Accounts Manager"), dict(role="Auditor")],
- )
+ doctype="Custom Role",
+ report="VAT Audit Report",
+ roles=[dict(role="Accounts User"), dict(role="Accounts Manager"), dict(role="Auditor")],
).insert()
diff --git a/erpnext/regional/united_arab_emirates/setup.py b/erpnext/regional/united_arab_emirates/setup.py
index 6a8c7b9438b..6541d5539e5 100644
--- a/erpnext/regional/united_arab_emirates/setup.py
+++ b/erpnext/regional/united_arab_emirates/setup.py
@@ -261,11 +261,9 @@ def add_custom_roles_for_reports():
"""Add Access Control to UAE VAT 201."""
if not frappe.db.get_value("Custom Role", dict(report="UAE VAT 201")):
frappe.get_doc(
- dict(
- doctype="Custom Role",
- report="UAE VAT 201",
- roles=[dict(role="Accounts User"), dict(role="Accounts Manager"), dict(role="Auditor")],
- )
+ doctype="Custom Role",
+ report="UAE VAT 201",
+ roles=[dict(role="Accounts User"), dict(role="Accounts Manager"), dict(role="Auditor")],
).insert()
diff --git a/erpnext/selling/doctype/customer/customer.py b/erpnext/selling/doctype/customer/customer.py
index ef7717ed3f8..628173c2c7d 100644
--- a/erpnext/selling/doctype/customer/customer.py
+++ b/erpnext/selling/doctype/customer/customer.py
@@ -18,7 +18,11 @@ from frappe.query_builder import Field, functions
from frappe.utils import cint, cstr, flt, get_formatted_email, today
from frappe.utils.user import get_users_with_role
-from erpnext.accounts.party import get_dashboard_info, validate_party_accounts
+from erpnext.accounts.party import (
+ get_dashboard_info,
+ validate_party_accounts,
+ validate_party_currency_before_merging,
+)
from erpnext.controllers.website_list_for_contact import add_role_for_portal_user
from erpnext.utilities.transaction_base import TransactionBase
@@ -375,6 +379,10 @@ class Customer(TransactionBase):
if self.lead_name:
frappe.db.sql("update `tabLead` set status='Interested' where name=%s", self.lead_name)
+ def before_rename(self, olddn, newdn, merge=False):
+ if merge:
+ validate_party_currency_before_merging("Customer", olddn, newdn)
+
def after_rename(self, olddn, newdn, merge=False):
if frappe.defaults.get_global_default("cust_master_name") == "Customer Name":
self.db_set("customer_name", newdn)
diff --git a/erpnext/selling/doctype/customer/test_customer.py b/erpnext/selling/doctype/customer/test_customer.py
index 85bb04c3409..2e7b7233fb1 100644
--- a/erpnext/selling/doctype/customer/test_customer.py
+++ b/erpnext/selling/doctype/customer/test_customer.py
@@ -104,28 +104,24 @@ class TestCustomer(IntegrationTestCase):
self.assertEqual(details.tax_category, "_Test Tax Category 1")
billing_address = frappe.get_doc(
- dict(
- doctype="Address",
- address_title="_Test Address With Tax Category",
- tax_category="_Test Tax Category 2",
- address_type="Billing",
- address_line1="Station Road",
- city="_Test City",
- country="India",
- links=[dict(link_doctype="Customer", link_name="_Test Customer With Tax Category")],
- )
+ doctype="Address",
+ address_title="_Test Address With Tax Category",
+ tax_category="_Test Tax Category 2",
+ address_type="Billing",
+ address_line1="Station Road",
+ city="_Test City",
+ country="India",
+ links=[dict(link_doctype="Customer", link_name="_Test Customer With Tax Category")],
).insert()
shipping_address = frappe.get_doc(
- dict(
- doctype="Address",
- address_title="_Test Address With Tax Category",
- tax_category="_Test Tax Category 3",
- address_type="Shipping",
- address_line1="Station Road",
- city="_Test City",
- country="India",
- links=[dict(link_doctype="Customer", link_name="_Test Customer With Tax Category")],
- )
+ doctype="Address",
+ address_title="_Test Address With Tax Category",
+ tax_category="_Test Tax Category 3",
+ address_type="Shipping",
+ address_line1="Station Road",
+ city="_Test City",
+ country="India",
+ links=[dict(link_doctype="Customer", link_name="_Test Customer With Tax Category")],
).insert()
settings = frappe.get_single("Accounts Settings")
diff --git a/erpnext/selling/doctype/sales_order/sales_order.py b/erpnext/selling/doctype/sales_order/sales_order.py
index a3c0ef2f52d..5bdf8da738a 100755
--- a/erpnext/selling/doctype/sales_order/sales_order.py
+++ b/erpnext/selling/doctype/sales_order/sales_order.py
@@ -1743,18 +1743,16 @@ def make_work_orders(items, sales_order, company, project=None):
frappe.throw(_("Please select Qty against item {0}").format(i.get("item_code")))
work_order = frappe.get_doc(
- dict(
- doctype="Work Order",
- production_item=i["item_code"],
- bom_no=i.get("bom"),
- qty=i["pending_qty"],
- company=company,
- sales_order=sales_order,
- sales_order_item=i["sales_order_item"],
- project=project,
- fg_warehouse=i["warehouse"],
- description=i["description"],
- )
+ doctype="Work Order",
+ production_item=i["item_code"],
+ bom_no=i.get("bom"),
+ qty=i["pending_qty"],
+ company=company,
+ sales_order=sales_order,
+ sales_order_item=i["sales_order_item"],
+ project=project,
+ fg_warehouse=i["warehouse"],
+ description=i["description"],
).insert()
work_order.set_work_order_operations()
work_order.flags.ignore_mandatory = True
diff --git a/erpnext/selling/doctype/sales_order/test_sales_order.py b/erpnext/selling/doctype/sales_order/test_sales_order.py
index 7ff4c3e5c63..dea7b3bff97 100644
--- a/erpnext/selling/doctype/sales_order/test_sales_order.py
+++ b/erpnext/selling/doctype/sales_order/test_sales_order.py
@@ -2713,8 +2713,8 @@ def make_sales_order_workflow():
doc.save()
return doc
- frappe.get_doc(dict(doctype="Role", role_name="Test Junior Approver")).insert(ignore_if_duplicate=True)
- frappe.get_doc(dict(doctype="Role", role_name="Test Approver")).insert(ignore_if_duplicate=True)
+ frappe.get_doc(doctype="Role", role_name="Test Junior Approver").insert(ignore_if_duplicate=True)
+ frappe.get_doc(doctype="Role", role_name="Test Approver").insert(ignore_if_duplicate=True)
frappe.cache().hdel("roles", frappe.session.user)
workflow = frappe.get_doc(
diff --git a/erpnext/selling/number_card/average_sales_order_value/average_sales_order_value.json b/erpnext/selling/number_card/average_sales_order_value/average_sales_order_value.json
new file mode 100644
index 00000000000..c6733b81c97
--- /dev/null
+++ b/erpnext/selling/number_card/average_sales_order_value/average_sales_order_value.json
@@ -0,0 +1,26 @@
+{
+ "aggregate_function_based_on": "base_rounded_total",
+ "creation": "2025-12-24 19:25:10.194383",
+ "currency": "",
+ "docstatus": 0,
+ "doctype": "Number Card",
+ "document_type": "Purchase Order",
+ "dynamic_filters_json": "[[\"Purchase Order\",\"company\",\"=\",\"frappe.defaults.get_user_default(\\\"Company\\\")\"]]",
+ "filters_json": "[[\"Purchase Order\",\"transaction_date\",\"Timespan\",\"this quarter\"],[\"Purchase Order\",\"docstatus\",\"=\",\"1\"],[\"Purchase Order\",\"is_subcontracted\",\"=\",0]]",
+ "function": "Average",
+ "idx": 0,
+ "is_public": 1,
+ "is_standard": 1,
+ "label": "Average Sales Order Value",
+ "modified": "2025-12-24 19:25:10.194383",
+ "modified_by": "Administrator",
+ "module": "Selling",
+ "name": "Average Sales Order Value",
+ "owner": "Administrator",
+ "parent_document_type": "",
+ "report_function": "Sum",
+ "show_full_number": 0,
+ "show_percentage_stats": 1,
+ "stats_time_interval": "Weekly",
+ "type": "Document Type"
+}
diff --git a/erpnext/selling/number_card/sales_orders_count/sales_orders_count.json b/erpnext/selling/number_card/sales_orders_count/sales_orders_count.json
new file mode 100644
index 00000000000..ffd8a4b2c73
--- /dev/null
+++ b/erpnext/selling/number_card/sales_orders_count/sales_orders_count.json
@@ -0,0 +1,26 @@
+{
+ "aggregate_function_based_on": "",
+ "creation": "2025-12-24 19:32:58.320589",
+ "currency": "",
+ "docstatus": 0,
+ "doctype": "Number Card",
+ "document_type": "Sales Order",
+ "dynamic_filters_json": "[]",
+ "filters_json": "[[\"Sales Order\",\"transaction_date\",\"Timespan\",\"this quarter\"],[\"Sales Order\",\"docstatus\",\"=\",\"1\"]]",
+ "function": "Count",
+ "idx": 0,
+ "is_public": 1,
+ "is_standard": 1,
+ "label": "Sales Orders Count",
+ "modified": "2025-12-24 19:32:58.320589",
+ "modified_by": "Administrator",
+ "module": "Selling",
+ "name": "Sales Orders Count",
+ "owner": "Administrator",
+ "parent_document_type": "",
+ "report_function": "Sum",
+ "show_full_number": 0,
+ "show_percentage_stats": 1,
+ "stats_time_interval": "Weekly",
+ "type": "Document Type"
+}
diff --git a/erpnext/selling/number_card/total_sales_amount/total_sales_amount.json b/erpnext/selling/number_card/total_sales_amount/total_sales_amount.json
new file mode 100644
index 00000000000..20d742eda43
--- /dev/null
+++ b/erpnext/selling/number_card/total_sales_amount/total_sales_amount.json
@@ -0,0 +1,26 @@
+{
+ "aggregate_function_based_on": "base_rounded_total",
+ "creation": "2025-12-24 19:28:43.461156",
+ "currency": "",
+ "docstatus": 0,
+ "doctype": "Number Card",
+ "document_type": "Sales Order",
+ "dynamic_filters_json": "[]",
+ "filters_json": "[[\"Sales Order\",\"transaction_date\",\"Timespan\",\"this quarter\"],[\"Sales Order\",\"docstatus\",\"=\",\"1\"]]",
+ "function": "Sum",
+ "idx": 0,
+ "is_public": 1,
+ "is_standard": 1,
+ "label": "Total Sales Amount",
+ "modified": "2025-12-24 19:28:43.461156",
+ "modified_by": "Administrator",
+ "module": "Selling",
+ "name": "Total Sales Amount",
+ "owner": "Administrator",
+ "parent_document_type": "",
+ "report_function": "Sum",
+ "show_full_number": 0,
+ "show_percentage_stats": 0,
+ "stats_time_interval": "Weekly",
+ "type": "Document Type"
+}
diff --git a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.js b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.js
index 2b4b8e714ed..14d6d71a0b6 100644
--- a/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.js
+++ b/erpnext/selling/report/item_wise_sales_history/item_wise_sales_history.js
@@ -54,7 +54,7 @@ frappe.query_reports["Item-wise Sales History"] = {
value = default_formatter(value, row, column, data);
let format_fields = ["delivered_quantity", "billed_amount"];
- if (in_list(format_fields, column.fieldname) && data && data[column.fieldname] > 0) {
+ if (format_fields.includes(column.fieldname) && data && data[column.fieldname] > 0) {
value = "" + value + "";
}
return value;
diff --git a/erpnext/selling/report/sales_order_analysis/sales_order_analysis.js b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.js
index b7f7a34c1b8..3b7fa966927 100644
--- a/erpnext/selling/report/sales_order_analysis/sales_order_analysis.js
+++ b/erpnext/selling/report/sales_order_analysis/sales_order_analysis.js
@@ -96,7 +96,7 @@ frappe.query_reports["Sales Order Analysis"] = {
value = default_formatter(value, row, column, data);
let format_fields = ["delivered_qty", "billed_amount"];
- if (in_list(format_fields, column.fieldname) && data && data[column.fieldname] > 0) {
+ if (format_fields.includes(column.fieldname) && data && data[column.fieldname] > 0) {
value = "" + value + "";
}
diff --git a/erpnext/selling/report/sales_order_trends/sales_order_trends.py b/erpnext/selling/report/sales_order_trends/sales_order_trends.py
index 0827110ae5d..ca11b8302de 100644
--- a/erpnext/selling/report/sales_order_trends/sales_order_trends.py
+++ b/erpnext/selling/report/sales_order_trends/sales_order_trends.py
@@ -36,7 +36,7 @@ def get_chart_data(data, conditions, filters):
# fetch only periodic columns as labels
columns = conditions.get("columns")[start:-2][2::2]
- labels = [column.split(":")[0] for column in columns]
+ labels = [column.split(":")[0].replace(" (Amt)", "") for column in columns]
datapoints = [0] * len(labels)
for row in data:
diff --git a/erpnext/selling/workspace/selling/selling.json b/erpnext/selling/workspace/selling/selling.json
index c9012362622..d0643abc97c 100644
--- a/erpnext/selling/workspace/selling/selling.json
+++ b/erpnext/selling/workspace/selling/selling.json
@@ -6,7 +6,7 @@
"label": "Sales Order Trends"
}
],
- "content": "[{\"id\":\"vBSf8Vi9U8\",\"type\":\"chart\",\"data\":{\"chart_name\":\"Sales Order Trends\",\"col\":12}},{\"id\":\"aW2i5R5GRP\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"1it3dCOnm6\",\"type\":\"header\",\"data\":{\"text\":\"Quick Access\",\"col\":12}},{\"id\":\"x7pLl-spS4\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Item\",\"col\":3}},{\"id\":\"SSGrXWmY-H\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Order\",\"col\":3}},{\"id\":\"-5J_yLxDaS\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Analytics\",\"col\":3}},{\"id\":\"6YEYpnIBKV\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Point of Sale\",\"col\":3}},{\"id\":\"c_GjZuZ2oN\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"id\":\"mX-9DJSyT2\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Learn Sales Management\",\"col\":3}},{\"id\":\"oNjjNbnUHp\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"0BcePLg0g1\",\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"id\":\"uze5dJ1ipL\",\"type\":\"card\",\"data\":{\"card_name\":\"Selling\",\"col\":4}},{\"id\":\"3j2fYwMAkq\",\"type\":\"card\",\"data\":{\"card_name\":\"Point of Sale\",\"col\":4}},{\"id\":\"xImm8NepFt\",\"type\":\"card\",\"data\":{\"card_name\":\"Items and Pricing\",\"col\":4}},{\"id\":\"6MjIe7KCQo\",\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}},{\"id\":\"lBu2EKgmJF\",\"type\":\"card\",\"data\":{\"card_name\":\"Key Reports\",\"col\":4}},{\"id\":\"1ARHrjg4kI\",\"type\":\"card\",\"data\":{\"card_name\":\"Other Reports\",\"col\":4}}]",
+ "content": "[{\"id\":\"vBSf8Vi9U8\",\"type\":\"chart\",\"data\":{\"chart_name\":\"Sales Order Trends\",\"col\":12}},{\"id\":\"aW2i5R5GRP\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"43fzlS1qZg\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Sales Orders\",\"col\":4}},{\"id\":\"jhtxl-XOGi\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Total Sales Amount\",\"col\":4}},{\"id\":\"0Ioq-P11FP\",\"type\":\"number_card\",\"data\":{\"number_card_name\":\"Average Order Value\",\"col\":4}},{\"id\":\"1it3dCOnm6\",\"type\":\"header\",\"data\":{\"text\":\"Quick Access\",\"col\":12}},{\"id\":\"x7pLl-spS4\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Item\",\"col\":3}},{\"id\":\"SSGrXWmY-H\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Order\",\"col\":3}},{\"id\":\"-5J_yLxDaS\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Sales Analytics\",\"col\":3}},{\"id\":\"6YEYpnIBKV\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Point of Sale\",\"col\":3}},{\"id\":\"c_GjZuZ2oN\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Dashboard\",\"col\":3}},{\"id\":\"mX-9DJSyT2\",\"type\":\"shortcut\",\"data\":{\"shortcut_name\":\"Learn Sales Management\",\"col\":3}},{\"id\":\"oNjjNbnUHp\",\"type\":\"spacer\",\"data\":{\"col\":12}},{\"id\":\"0BcePLg0g1\",\"type\":\"header\",\"data\":{\"text\":\"Reports & Masters\",\"col\":12}},{\"id\":\"uze5dJ1ipL\",\"type\":\"card\",\"data\":{\"card_name\":\"Selling\",\"col\":4}},{\"id\":\"3j2fYwMAkq\",\"type\":\"card\",\"data\":{\"card_name\":\"Point of Sale\",\"col\":4}},{\"id\":\"xImm8NepFt\",\"type\":\"card\",\"data\":{\"card_name\":\"Items and Pricing\",\"col\":4}},{\"id\":\"6MjIe7KCQo\",\"type\":\"card\",\"data\":{\"card_name\":\"Settings\",\"col\":4}},{\"id\":\"lBu2EKgmJF\",\"type\":\"card\",\"data\":{\"card_name\":\"Key Reports\",\"col\":4}},{\"id\":\"1ARHrjg4kI\",\"type\":\"card\",\"data\":{\"card_name\":\"Other Reports\",\"col\":4}}]",
"creation": "2020-01-28 11:49:12.092882",
"custom_blocks": [],
"docstatus": 0,
@@ -622,11 +622,24 @@
"type": "Link"
}
],
- "modified": "2024-12-13 14:37:39.781540",
+ "modified": "2025-12-24 19:34:01.452100",
"modified_by": "Administrator",
"module": "Selling",
"name": "Selling",
- "number_cards": [],
+ "number_cards": [
+ {
+ "label": "Total Sales Amount",
+ "number_card_name": "Total Sales Amount"
+ },
+ {
+ "label": "Sales Orders",
+ "number_card_name": "Sales Orders Count"
+ },
+ {
+ "label": "Average Order Value",
+ "number_card_name": "Average Sales Order Value"
+ }
+ ],
"owner": "Administrator",
"parent_page": "",
"public": 1,
@@ -640,7 +653,7 @@
"doc_view": "List",
"label": "Learn Sales Management",
"type": "URL",
- "url": "https://school.frappe.io/lms/courses/sales-management-course?utm_source=in_app"
+ "url": "https://frappe.school/lms/courses/sales-management-course?utm_source=in_app"
},
{
"label": "Point of Sale",
@@ -668,6 +681,7 @@
"format": "{} Open",
"label": "Sales Analytics",
"link_to": "Sales Analytics",
+ "report_ref_doctype": "Sales Order",
"stats_filter": "{ \"Status\": \"Open\" }",
"type": "Report"
},
diff --git a/erpnext/setup/doctype/company/company.js b/erpnext/setup/doctype/company/company.js
index a4cdbe223f1..f8daf3c6f31 100644
--- a/erpnext/setup/doctype/company/company.js
+++ b/erpnext/setup/doctype/company/company.js
@@ -257,7 +257,7 @@ erpnext.company.set_chart_of_accounts_options = function (doc) {
callback: function (r) {
if (!r.exc) {
set_field_options("chart_of_accounts", [""].concat(r.message).join("\n"));
- if (in_list(r.message, selected_value))
+ if (r.message.includes(selected_value))
cur_frm.set_value("chart_of_accounts", selected_value);
}
},
diff --git a/erpnext/setup/doctype/company/test_company.py b/erpnext/setup/doctype/company/test_company.py
index d30f7367dbf..3c2500c0826 100644
--- a/erpnext/setup/doctype/company/test_company.py
+++ b/erpnext/setup/doctype/company/test_company.py
@@ -1,7 +1,6 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
import json
-import unittest
import frappe
from frappe import _
diff --git a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py
index edca7bde6da..25459ee8567 100644
--- a/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py
+++ b/erpnext/setup/doctype/transaction_deletion_record/transaction_deletion_record.py
@@ -66,6 +66,9 @@ class TransactionDeletionRecord(Document):
}
)
+ def on_discard(self):
+ self.db_set("status", "Cancelled")
+
def validate(self):
frappe.only_for("System Manager")
self.validate_doctypes_to_be_ignored()
diff --git a/erpnext/stock/doctype/batch/batch.py b/erpnext/stock/doctype/batch/batch.py
index 10de964d19f..c67060a8699 100644
--- a/erpnext/stock/doctype/batch/batch.py
+++ b/erpnext/stock/doctype/batch/batch.py
@@ -306,7 +306,7 @@ def get_batches_by_oldest(item_code, warehouse):
@frappe.whitelist()
def split_batch(batch_no: str, item_code: str, warehouse: str, qty: float, new_batch_id: str | None = None):
"""Split the batch into a new batch"""
- batch = frappe.get_doc(dict(doctype="Batch", item=item_code, batch_id=new_batch_id)).insert()
+ batch = frappe.get_doc(doctype="Batch", item=item_code, batch_id=new_batch_id).insert()
qty = flt(qty)
company = frappe.db.get_value("Warehouse", warehouse, "company")
@@ -330,22 +330,18 @@ def split_batch(batch_no: str, item_code: str, warehouse: str, qty: float, new_b
)
stock_entry = frappe.get_doc(
- dict(
- doctype="Stock Entry",
- purpose="Repack",
- company=company,
- items=[
- dict(
- item_code=item_code,
- qty=qty,
- s_warehouse=warehouse,
- serial_and_batch_bundle=from_bundle_id,
- ),
- dict(
- item_code=item_code, qty=qty, t_warehouse=warehouse, serial_and_batch_bundle=to_bundle_id
- ),
- ],
- )
+ doctype="Stock Entry",
+ purpose="Repack",
+ company=company,
+ items=[
+ dict(
+ item_code=item_code,
+ qty=qty,
+ s_warehouse=warehouse,
+ serial_and_batch_bundle=from_bundle_id,
+ ),
+ dict(item_code=item_code, qty=qty, t_warehouse=warehouse, serial_and_batch_bundle=to_bundle_id),
+ ],
)
stock_entry.set_stock_entry_type()
stock_entry.insert()
diff --git a/erpnext/stock/doctype/batch/test_batch.py b/erpnext/stock/doctype/batch/test_batch.py
index bc06e2beb39..6154a982c98 100644
--- a/erpnext/stock/doctype/batch/test_batch.py
+++ b/erpnext/stock/doctype/batch/test_batch.py
@@ -45,12 +45,10 @@ class TestBatch(IntegrationTestCase):
self.make_batch_item("ITEM-BATCH-1")
receipt = frappe.get_doc(
- dict(
- doctype="Purchase Receipt",
- supplier="_Test Supplier",
- company="_Test Company",
- items=[dict(item_code="ITEM-BATCH-1", qty=batch_qty, rate=10, warehouse="Stores - _TC")],
- )
+ doctype="Purchase Receipt",
+ supplier="_Test Supplier",
+ company="_Test Company",
+ items=[dict(item_code="ITEM-BATCH-1", qty=batch_qty, rate=10, warehouse="Stores - _TC")],
).insert()
receipt.submit()
@@ -66,12 +64,10 @@ class TestBatch(IntegrationTestCase):
self.make_batch_item("ITEM-BATCH-1")
receipt = frappe.get_doc(
- dict(
- doctype="Purchase Receipt",
- supplier="_Test Supplier",
- company="_Test Company",
- items=[dict(item_code="ITEM-BATCH-1", qty=10, rate=10, warehouse="Stores - _TC")],
- )
+ doctype="Purchase Receipt",
+ supplier="_Test Supplier",
+ company="_Test Company",
+ items=[dict(item_code="ITEM-BATCH-1", qty=10, rate=10, warehouse="Stores - _TC")],
).insert()
receipt.submit()
@@ -96,20 +92,18 @@ class TestBatch(IntegrationTestCase):
)
receipt2 = frappe.get_doc(
- dict(
- doctype="Purchase Receipt",
- supplier="_Test Supplier",
- company="_Test Company",
- items=[
- dict(
- item_code="ITEM-BATCH-1",
- qty=20,
- rate=10,
- warehouse="_Test Warehouse - _TC",
- serial_and_batch_bundle=bundle_id,
- )
- ],
- )
+ doctype="Purchase Receipt",
+ supplier="_Test Supplier",
+ company="_Test Company",
+ items=[
+ dict(
+ item_code="ITEM-BATCH-1",
+ qty=20,
+ rate=10,
+ warehouse="_Test Warehouse - _TC",
+ serial_and_batch_bundle=bundle_id,
+ )
+ ],
).insert()
receipt2.submit()
@@ -135,20 +129,18 @@ class TestBatch(IntegrationTestCase):
self.make_batch_item("ITEM-BATCH-1")
stock_entry = frappe.get_doc(
- dict(
- doctype="Stock Entry",
- purpose="Material Receipt",
- company="_Test Company",
- items=[
- dict(
- item_code="ITEM-BATCH-1",
- qty=90,
- t_warehouse="_Test Warehouse - _TC",
- cost_center="Main - _TC",
- rate=10,
- )
- ],
- )
+ doctype="Stock Entry",
+ purpose="Material Receipt",
+ company="_Test Company",
+ items=[
+ dict(
+ item_code="ITEM-BATCH-1",
+ qty=90,
+ t_warehouse="_Test Warehouse - _TC",
+ cost_center="Main - _TC",
+ rate=10,
+ )
+ ],
)
stock_entry.set_stock_entry_type()
@@ -187,20 +179,18 @@ class TestBatch(IntegrationTestCase):
)
delivery_note = frappe.get_doc(
- dict(
- doctype="Delivery Note",
- customer="_Test Customer",
- company=receipt.company,
- items=[
- dict(
- item_code=item_code,
- qty=batch_qty,
- rate=10,
- warehouse=receipt.items[0].warehouse,
- serial_and_batch_bundle=bundle_id,
- )
- ],
- )
+ doctype="Delivery Note",
+ customer="_Test Customer",
+ company=receipt.company,
+ items=[
+ dict(
+ item_code=item_code,
+ qty=batch_qty,
+ rate=10,
+ warehouse=receipt.items[0].warehouse,
+ serial_and_batch_bundle=bundle_id,
+ )
+ ],
).insert()
delivery_note.submit()
@@ -261,19 +251,17 @@ class TestBatch(IntegrationTestCase):
)
stock_entry = frappe.get_doc(
- dict(
- doctype="Stock Entry",
- purpose="Material Issue",
- company=receipt.company,
- items=[
- dict(
- item_code=item_code,
- qty=batch_qty,
- s_warehouse=receipt.items[0].warehouse,
- serial_and_batch_bundle=bundle_id,
- )
- ],
- )
+ doctype="Stock Entry",
+ purpose="Material Issue",
+ company=receipt.company,
+ items=[
+ dict(
+ item_code=item_code,
+ qty=batch_qty,
+ s_warehouse=receipt.items[0].warehouse,
+ serial_and_batch_bundle=bundle_id,
+ )
+ ],
)
stock_entry.set_stock_entry_type()
@@ -373,7 +361,7 @@ class TestBatch(IntegrationTestCase):
"""Make a new stock entry for given target warehouse and batch name of item"""
if not frappe.db.exists("Batch", batch_name):
- batch = frappe.get_doc(dict(doctype="Batch", item=item_name, batch_id=batch_name)).insert(
+ batch = frappe.get_doc(doctype="Batch", item=item_name, batch_id=batch_name).insert(
ignore_permissions=True
)
batch.save()
@@ -393,22 +381,20 @@ class TestBatch(IntegrationTestCase):
).make_serial_and_batch_bundle()
stock_entry = frappe.get_doc(
- dict(
- doctype="Stock Entry",
- purpose="Material Receipt",
- company="_Test Company",
- items=[
- dict(
- item_code=item_name,
- qty=90,
- serial_and_batch_bundle=sn_doc.name,
- t_warehouse=warehouse,
- cost_center="Main - _TC",
- rate=10,
- allow_zero_valuation_rate=1,
- )
- ],
- )
+ doctype="Stock Entry",
+ purpose="Material Receipt",
+ company="_Test Company",
+ items=[
+ dict(
+ item_code=item_name,
+ qty=90,
+ serial_and_batch_bundle=sn_doc.name,
+ t_warehouse=warehouse,
+ cost_center="Main - _TC",
+ rate=10,
+ allow_zero_valuation_rate=1,
+ )
+ ],
)
stock_entry.set_stock_entry_type()
diff --git a/erpnext/stock/doctype/delivery_trip/delivery_trip.py b/erpnext/stock/doctype/delivery_trip/delivery_trip.py
index 24910a5f588..24223e123f2 100644
--- a/erpnext/stock/doctype/delivery_trip/delivery_trip.py
+++ b/erpnext/stock/doctype/delivery_trip/delivery_trip.py
@@ -50,6 +50,10 @@ class DeliveryTrip(Document):
"UOM Conversion Factor", {"from_uom": "Meter", "to_uom": self.default_distance_uom}, "value"
)
+ def on_discard(self):
+ self.update_status()
+ self.update_delivery_notes(delete=True)
+
def validate(self):
if self._action == "submit" and not self.driver:
frappe.throw(_("A driver must be set to submit."))
diff --git a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.js b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.js
index 1b5f4a5743f..f3d60548b65 100644
--- a/erpnext/stock/doctype/inventory_dimension/inventory_dimension.js
+++ b/erpnext/stock/doctype/inventory_dimension/inventory_dimension.js
@@ -56,7 +56,7 @@ frappe.ui.form.on("Inventory Dimension", {
];
frm.fields.forEach((field) => {
- if (!in_list(allow_to_edit_fields, field.df.fieldname)) {
+ if (!allow_to_edit_fields.includes(field.df.fieldname)) {
frm.set_df_property(field.df.fieldname, "read_only", "1");
}
});
diff --git a/erpnext/stock/doctype/item/item.js b/erpnext/stock/doctype/item/item.js
index 2503cd0148e..56cdb427acd 100644
--- a/erpnext/stock/doctype/item/item.js
+++ b/erpnext/stock/doctype/item/item.js
@@ -129,7 +129,7 @@ frappe.ui.form.on("Item", {
if (frm.doc.has_variants) {
frm.set_intro(
__(
- "This Item is a Template and cannot be used in transactions. Item attributes will be copied over into the variants unless 'No Copy' is set"
+ "This Item is a Template and cannot be used in transactions.
All fields present in the 'Copy Fields to Variant' table in Item Variant Settings will be copied to its variant items."
),
true
);
@@ -1089,9 +1089,9 @@ function open_form(frm, doctype, child_doctype, parentfield) {
let new_child_doc = frappe.model.add_child(new_doc, child_doctype, parentfield);
new_child_doc.item_code = frm.doc.name;
new_child_doc.item_name = frm.doc.item_name;
- if (in_list(SALES_DOCTYPES, doctype) && frm.doc.sales_uom) {
+ if (SALES_DOCTYPES.includes(doctype) && frm.doc.sales_uom) {
new_child_doc.uom = frm.doc.sales_uom;
- } else if (in_list(PURCHASE_DOCTYPES, doctype) && frm.doc.purchase_uom) {
+ } else if (PURCHASE_DOCTYPES.includes(doctype) && frm.doc.purchase_uom) {
new_child_doc.uom = frm.doc.purchase_uom;
} else {
new_child_doc.uom = frm.doc.stock_uom;
diff --git a/erpnext/stock/doctype/item/item.py b/erpnext/stock/doctype/item/item.py
index b26644d12d6..5c92fecbfdf 100644
--- a/erpnext/stock/doctype/item/item.py
+++ b/erpnext/stock/doctype/item/item.py
@@ -484,7 +484,7 @@ class Item(Document):
)
if item_barcode.barcode_type:
barcode_type = convert_erpnext_to_barcodenumber(
- item_barcode.barcode_type.upper(), item_barcode.barcode
+ item_barcode.barcode_type.replace("-", "").upper(), item_barcode.barcode
)
if barcode_type in barcodenumber.barcodes():
if not barcodenumber.check_code(barcode_type, item_barcode.barcode):
diff --git a/erpnext/stock/doctype/item_barcode/item_barcode.json b/erpnext/stock/doctype/item_barcode/item_barcode.json
index 513f7123e61..66fcc524443 100644
--- a/erpnext/stock/doctype/item_barcode/item_barcode.json
+++ b/erpnext/stock/doctype/item_barcode/item_barcode.json
@@ -25,7 +25,7 @@
"fieldtype": "Select",
"in_list_view": 1,
"label": "Barcode Type",
- "options": "\nEAN\nUPC-A\nCODE-39\nEAN-12\nEAN-8\nGS1\nGTIN\nISBN\nISBN-10\nISBN-13\nISSN\nJAN\nPZN\nUPC"
+ "options": "\nEAN\nUPC-A\nCODE-39\nEAN-13\nEAN-8\nGS1\nGTIN\nGTIN-14\nISBN\nISBN-10\nISBN-13\nISSN\nJAN\nPZN\nUPC"
},
{
"fieldname": "uom",
@@ -37,15 +37,16 @@
],
"istable": 1,
"links": [],
- "modified": "2024-03-27 13:09:54.217164",
+ "modified": "2025-12-30 12:24:11.749128",
"modified_by": "Administrator",
"module": "Stock",
"name": "Item Barcode",
"naming_rule": "Random",
"owner": "Administrator",
"permissions": [],
+ "row_format": "Dynamic",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"track_changes": 1
-}
\ No newline at end of file
+}
diff --git a/erpnext/stock/doctype/item_barcode/item_barcode.py b/erpnext/stock/doctype/item_barcode/item_barcode.py
index e38b95bad5f..43764722c88 100644
--- a/erpnext/stock/doctype/item_barcode/item_barcode.py
+++ b/erpnext/stock/doctype/item_barcode/item_barcode.py
@@ -20,10 +20,11 @@ class ItemBarcode(Document):
"EAN",
"UPC-A",
"CODE-39",
- "EAN-12",
+ "EAN-13",
"EAN-8",
"GS1",
"GTIN",
+ "GTIN-14",
"ISBN",
"ISBN-10",
"ISBN-13",
diff --git a/erpnext/stock/doctype/item_variant_settings/item_variant_settings.js b/erpnext/stock/doctype/item_variant_settings/item_variant_settings.js
index d906b85a031..6807177e582 100644
--- a/erpnext/stock/doctype/item_variant_settings/item_variant_settings.js
+++ b/erpnext/stock/doctype/item_variant_settings/item_variant_settings.js
@@ -30,9 +30,9 @@ frappe.ui.form.on("Item Variant Settings", {
field_label_map[d.fieldname] = __(d.label, null, d.parent) + ` (${d.fieldname})`;
if (
- !in_list(exclude_field_types, d.fieldtype) &&
+ !exclude_field_types.includes(d.fieldtype) &&
!d.no_copy &&
- !in_list(exclude_fields, d.fieldname)
+ !exclude_fields.includes(d.fieldname)
) {
allow_fields.push({
label: field_label_map[d.fieldname],
diff --git a/erpnext/stock/doctype/packed_item/packed_item.py b/erpnext/stock/doctype/packed_item/packed_item.py
index 0a76425d6d0..9477b85131d 100644
--- a/erpnext/stock/doctype/packed_item/packed_item.py
+++ b/erpnext/stock/doctype/packed_item/packed_item.py
@@ -309,9 +309,9 @@ def update_packed_item_from_cancelled_doc(main_item_row, packing_item, pi_row, d
prev_doc_packed_items_map = get_cancelled_doc_packed_item_details(doc.packed_items)
if prev_doc_packed_items_map and prev_doc_packed_items_map.get(
- (packing_item.item_code, main_item_row.item_code)
+ (packing_item.item_code, main_item_row.name)
):
- prev_doc_row = prev_doc_packed_items_map.get((packing_item.item_code, main_item_row.item_code))
+ prev_doc_row = prev_doc_packed_items_map.get((packing_item.item_code, main_item_row.name))
pi_row.batch_no = prev_doc_row[0].batch_no
pi_row.serial_no = prev_doc_row[0].serial_no
pi_row.warehouse = prev_doc_row[0].warehouse
@@ -331,7 +331,9 @@ def get_packed_item_bin_qty(item, warehouse):
def get_cancelled_doc_packed_item_details(old_packed_items):
prev_doc_packed_items_map = {}
for items in old_packed_items:
- prev_doc_packed_items_map.setdefault((items.item_code, items.parent_item), []).append(items.as_dict())
+ prev_doc_packed_items_map.setdefault((items.item_code, items.parent_detail_docname), []).append(
+ items.as_dict()
+ )
return prev_doc_packed_items_map
diff --git a/erpnext/stock/doctype/pick_list/pick_list.py b/erpnext/stock/doctype/pick_list/pick_list.py
index aeeacaba655..d1a273f12a8 100644
--- a/erpnext/stock/doctype/pick_list/pick_list.py
+++ b/erpnext/stock/doctype/pick_list/pick_list.py
@@ -400,35 +400,23 @@ class PickList(TransactionBase):
picked_items = get_picked_items_qty(packed_items, contains_packed_items=True)
self.validate_picked_qty(picked_items)
- picked_qty = frappe._dict()
+ doc_updates = {}
for d in picked_items:
- picked_qty[d.product_bundle_item] = d.picked_qty
+ doc_updates[d.product_bundle_item] = {"picked_qty": flt(d.picked_qty)}
- for packed_item in packed_items:
- frappe.db.set_value(
- "Packed Item",
- packed_item,
- "picked_qty",
- flt(picked_qty.get(packed_item)),
- update_modified=False,
- )
+ if doc_updates:
+ frappe.db.bulk_update("Packed Item", doc_updates, update_modified=False)
def update_sales_order_item_qty(self, so_items):
picked_items = get_picked_items_qty(so_items)
self.validate_picked_qty(picked_items)
- picked_qty = frappe._dict()
+ doc_updates = {}
for d in picked_items:
- picked_qty[d.sales_order_item] = d.picked_qty
+ doc_updates[d.sales_order_item] = {"picked_qty": flt(d.picked_qty)}
- for so_item in so_items:
- frappe.db.set_value(
- "Sales Order Item",
- so_item,
- "picked_qty",
- flt(picked_qty.get(so_item)),
- update_modified=False,
- )
+ if doc_updates:
+ frappe.db.bulk_update("Sales Order Item", doc_updates, update_modified=False)
def update_sales_order_picking_status(self) -> None:
sales_orders = []
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
index ce462f73039..b5c1c38729f 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
@@ -17,13 +17,6 @@ frappe.ui.form.on("Purchase Receipt", {
"Landed Cost Voucher": "Landed Cost Voucher",
};
- frm.set_query("expense_account", "items", function () {
- return {
- query: "erpnext.controllers.queries.get_expense_account",
- filters: { company: frm.doc.company },
- };
- });
-
frm.set_query("wip_composite_asset", "items", function () {
return {
filters: { is_composite_asset: 1, docstatus: 0 },
@@ -171,6 +164,16 @@ erpnext.stock.PurchaseReceiptController = class PurchaseReceiptController extend
this.setup_accounting_dimension_triggers();
this.setup_posting_date_time_check();
super.setup(doc);
+
+ this.frm.set_query("expense_account", "items", () => {
+ return {
+ query: "erpnext.controllers.queries.get_expense_account",
+ filters: {
+ company: this.frm.doc.company,
+ disabled: 0,
+ },
+ };
+ });
}
refresh() {
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
index 69971410b2c..f3e56c3b239 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -1121,22 +1121,30 @@ def update_billed_amount_based_on_po(po_details, update_modified=True, pr_doc=No
updated_pr = []
for pr_item in pr_details:
- billed_against_po = flt(po_billed_amt_details.get(pr_item.purchase_order_item))
+ billed_amt_against_po, billed_qty_against_po = 0, 0
+ if billed_details := po_billed_amt_details.get(pr_item.purchase_order_item):
+ billed_amt_against_po = flt(billed_details["billed_amt"])
+ billed_qty_against_po = flt(billed_details["billed_qty"])
# Get billed amount directly against Purchase Receipt
billed_amt_against_pr = flt(pr_items_billed_amount.get(pr_item.name, 0))
# Distribute billed amount directly against PO between PRs based on FIFO
- if billed_against_po and billed_amt_against_pr < pr_item.amount:
- pending_to_bill = flt(pr_item.amount) - billed_amt_against_pr
- if pending_to_bill <= billed_against_po:
- billed_amt_against_pr += pending_to_bill
- billed_against_po -= pending_to_bill
+ if billed_amt_against_po and billed_amt_against_pr < pr_item.amount:
+ if not billed_amt_against_pr and billed_qty_against_po and billed_qty_against_po > pr_item.qty:
+ billed_amt_against_pr = flt(flt(billed_amt_against_po) * flt(pr_item.qty)) / flt(
+ billed_qty_against_po
+ )
else:
- billed_amt_against_pr += billed_against_po
- billed_against_po = 0
+ pending_to_bill = flt(pr_item.amount) - billed_amt_against_pr
+ if pending_to_bill <= billed_amt_against_po:
+ billed_amt_against_pr += pending_to_bill
+ billed_amt_against_po -= pending_to_bill
+ else:
+ billed_amt_against_pr += billed_amt_against_po
+ billed_amt_against_po = 0
- po_billed_amt_details[pr_item.purchase_order_item] = billed_against_po
+ po_billed_amt_details[pr_item.purchase_order_item]["billed_amt"] = billed_amt_against_po
if pr_item.billed_amt != billed_amt_against_pr:
# update existing doc if possible
@@ -1170,6 +1178,7 @@ def get_purchase_receipts_against_po_details(po_details):
.on(purchase_receipt.name == purchase_receipt_item.parent)
.select(
purchase_receipt_item.name,
+ purchase_receipt_item.qty,
purchase_receipt_item.parent,
purchase_receipt_item.amount,
purchase_receipt_item.billed_amt,
@@ -1217,7 +1226,11 @@ def get_billed_amount_against_po(po_items):
frappe.qb.from_(purchase_invoice_item)
.inner_join(purchase_invoice)
.on(purchase_invoice_item.parent == purchase_invoice.name)
- .select(fn.Sum(purchase_invoice_item.amount).as_("billed_amt"), purchase_invoice_item.po_detail)
+ .select(
+ fn.Sum(purchase_invoice_item.amount).as_("billed_amt"),
+ fn.Sum(purchase_invoice_item.qty).as_("qty"),
+ purchase_invoice_item.po_detail,
+ )
.where(
(purchase_invoice_item.po_detail.isin(po_items))
& (purchase_invoice.docstatus == 1)
@@ -1227,7 +1240,7 @@ def get_billed_amount_against_po(po_items):
.groupby(purchase_invoice_item.po_detail)
).run(as_dict=1)
- return {d.po_detail: flt(d.billed_amt) for d in query}
+ return {d.po_detail: {"billed_amt": flt(d.billed_amt), "billed_qty": flt(d.qty)} for d in query}
def update_billing_percentage(pr_doc, update_modified=True, adjust_incoming_rate=False):
@@ -1241,6 +1254,8 @@ def update_billing_percentage(pr_doc, update_modified=True, adjust_incoming_rate
if adjust_incoming_rate:
item_wise_billed_qty = get_billed_qty_against_purchase_receipt(pr_doc)
+ billed_qty_based_on_po = get_billed_qty_against_purchase_order(pr_doc)
+
for item in pr_doc.items:
returned_qty = flt(item_wise_returned_qty.get(item.name))
returned_amount = flt(returned_qty) * flt(item.rate)
@@ -1268,11 +1283,21 @@ def update_billing_percentage(pr_doc, update_modified=True, adjust_incoming_rate
if (
item.billed_amt is not None
and item.amount is not None
- and item_wise_billed_qty.get(item.name)
+ and (
+ item_wise_billed_qty.get(item.name)
+ or billed_qty_based_on_po.get(item.purchase_order_item)
+ )
):
- adjusted_amt = (
- flt(item.billed_amt / item_wise_billed_qty.get(item.name)) - flt(item.rate)
- ) * item.qty
+ qty = item_wise_billed_qty.get(item.name)
+ if not qty:
+ if item.qty < billed_qty_based_on_po.get(item.purchase_order_item):
+ qty = item.qty
+ else:
+ qty = billed_qty_based_on_po.get(item.purchase_order_item)
+
+ billed_qty_based_on_po[item.purchase_order_item] -= qty
+
+ adjusted_amt = (flt(item.billed_amt / qty) - flt(item.rate)) * item.qty
adjusted_amt = flt(adjusted_amt * flt(pr_doc.conversion_rate), item.precision("amount"))
pi_landed_cost_amount += adjusted_amt
@@ -1316,6 +1341,32 @@ def get_billed_qty_against_purchase_receipt(pr_doc):
return frappe._dict(invoice_data)
+def get_billed_qty_against_purchase_order(pr_doc):
+ po_names = list(
+ set(
+ [
+ d.purchase_order_item
+ for d in pr_doc.items
+ if d.purchase_order_item and not d.purchase_invoice_item
+ ]
+ )
+ )
+
+ invoice_data_po_based = frappe._dict()
+ if po_names:
+ table = frappe.qb.DocType("Purchase Invoice Item")
+ query = (
+ frappe.qb.from_(table)
+ .select(table.po_detail, fn.Sum(table.qty).as_("qty"))
+ .where((table.po_detail.isin(po_names)) & (table.docstatus == 1) & (table.pr_detail.isnull()))
+ .groupby(table.po_detail)
+ )
+ invoice_data_po_based = query.run(as_list=1)
+ invoice_data_po_based = frappe._dict(invoice_data_po_based)
+
+ return invoice_data_po_based
+
+
def adjust_incoming_rate_for_pr(doc):
doc.update_valuation_rate(reset_outgoing_rate=False)
diff --git a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
index 6282782ccde..5873b583f27 100644
--- a/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
+++ b/erpnext/stock/doctype/purchase_receipt/test_purchase_receipt.py
@@ -684,6 +684,8 @@ class TestPurchaseReceipt(IntegrationTestCase):
from erpnext.buying.doctype.purchase_order.purchase_order import make_purchase_receipt
from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order
+ frappe.flags.print_test_messages = False
+ # Qty: 10, Rate: 500
po = create_purchase_order()
pr1 = make_purchase_receipt(po.name)
@@ -703,6 +705,7 @@ class TestPurchaseReceipt(IntegrationTestCase):
pi2.get("items")[0].qty = 4
pi2.submit()
+ frappe.flags.print_test_messages = True
pr2 = make_purchase_receipt(po.name)
pr2.posting_date = today()
pr2.posting_time = "08:00"
@@ -2063,6 +2066,19 @@ class TestPurchaseReceipt(IntegrationTestCase):
ste7.reload()
self.assertEqual(ste7.items[0].valuation_rate, 275.00)
+ available_qty = frappe.db.get_value(
+ "Bin",
+ {"item_code": item_code, "warehouse": warehouse},
+ "actual_qty",
+ )
+
+ new_pr = make_purchase_receipt(
+ item_code=item_code,
+ warehouse=warehouse,
+ qty=100,
+ rate=500,
+ )
+
create_landed_cost_voucher("Purchase Receipt", pr.name, pr.company, charges=2500 * -1)
pr.reload()
@@ -2089,6 +2105,37 @@ class TestPurchaseReceipt(IntegrationTestCase):
ste7.reload()
self.assertEqual(ste7.items[0].valuation_rate, valuation_rate)
+ sle = frappe.db.get_value(
+ "Stock Ledger Entry",
+ {"voucher_type": "Purchase Receipt", "voucher_no": new_pr.name, "is_cancelled": 0},
+ ["stock_value", "qty_after_transaction"],
+ as_dict=1,
+ )
+
+ stock_value = flt(available_qty * valuation_rate) + 50000
+ total_stock_qty = available_qty + 100
+
+ self.assertEqual(sle.stock_value, stock_value)
+ self.assertEqual(sle.qty_after_transaction, total_stock_qty)
+
+ make_purchase_receipt(
+ item_code=item_code,
+ warehouse=warehouse,
+ posting_date=add_days(today(), -12),
+ qty=100,
+ rate=500,
+ )
+
+ total_stock_qty += 100
+
+ qty_after_transaction = frappe.db.get_value(
+ "Stock Ledger Entry",
+ {"voucher_type": "Purchase Receipt", "voucher_no": new_pr.name, "is_cancelled": 0},
+ ["qty_after_transaction"],
+ )
+
+ self.assertEqual(qty_after_transaction, total_stock_qty)
+
def test_purchase_receipt_provisional_accounting(self):
# Step - 1: Create Supplier with Default Currency as USD
from erpnext.buying.doctype.supplier.test_supplier import create_supplier
@@ -4671,6 +4718,83 @@ class TestPurchaseReceipt(IntegrationTestCase):
self.assertEqual(sles, [1500.0, 1500.0])
+ @IntegrationTestCase.change_settings("Stock Settings", {"allow_negative_stock": 0})
+ def test_multiple_transactions_with_same_posting_datetime(self):
+ from erpnext.stock.doctype.delivery_note.test_delivery_note import create_delivery_note
+ from erpnext.stock.stock_ledger import NegativeStockError
+
+ item_code = make_item(
+ "Test Item for Multiple Txn with Same Posting Datetime", {"is_stock_item": 1}
+ ).name
+
+ pr = make_purchase_receipt(
+ item_code=item_code,
+ qty=100,
+ rate=100,
+ posting_date=today(),
+ posting_time="10:00:00",
+ )
+
+ create_delivery_note(
+ item_code=item_code,
+ qty=100,
+ rate=100,
+ posting_date=today(),
+ posting_time="10:00:00",
+ )
+
+ make_purchase_receipt(
+ item_code=item_code,
+ qty=150,
+ rate=100,
+ posting_date=today(),
+ posting_time="10:00:00",
+ )
+
+ self.assertRaises(NegativeStockError, pr.cancel)
+
+ @IntegrationTestCase.change_settings(
+ "Buying Settings", {"set_landed_cost_based_on_purchase_invoice_rate": 1, "maintain_same_rate": 0}
+ )
+ def test_set_lcv_from_pi_created_against_po(self):
+ from erpnext.buying.doctype.purchase_order.purchase_order import (
+ make_purchase_invoice as make_pi_against_po,
+ )
+ from erpnext.buying.doctype.purchase_order.purchase_order import (
+ make_purchase_receipt as make_pr_against_po,
+ )
+ from erpnext.buying.doctype.purchase_order.test_purchase_order import create_purchase_order
+
+ original_value = frappe.db.get_single_value("Accounts Settings", "over_billing_allowance")
+
+ frappe.db.set_single_value("Accounts Settings", "over_billing_allowance", 100)
+
+ item_code = create_item("Test Item for LCV from PI against PO").name
+
+ po = create_purchase_order(item_code=item_code, qty=10, rate=400)
+ pr = make_pr_against_po(po.name)
+ pr.items[0].qty = 5
+ item = frappe.copy_doc(pr.items[0])
+ item.qty = 2
+ pr.append("items", item)
+
+ item = frappe.copy_doc(pr.items[0])
+ item.qty = 3
+ pr.append("items", item)
+ pr.submit()
+
+ pi = make_pi_against_po(po.name)
+ pi.items[0].rate = 500
+ pi.submit()
+
+ pr.reload()
+ for row in pr.items:
+ self.assertTrue(row.amount_difference_with_purchase_invoice)
+ amt_diff = 5000 * (row.qty / 10) - row.amount
+ self.assertEqual(row.amount_difference_with_purchase_invoice, amt_diff)
+
+ frappe.db.set_single_value("Accounts Settings", "over_billing_allowance", original_value)
+
def prepare_data_for_internal_transfer():
from erpnext.accounts.doctype.sales_invoice.test_sales_invoice import create_internal_supplier
diff --git a/erpnext/stock/doctype/quality_inspection/quality_inspection.json b/erpnext/stock/doctype/quality_inspection/quality_inspection.json
index be87402a6b3..de8ee9db0a4 100644
--- a/erpnext/stock/doctype/quality_inspection/quality_inspection.json
+++ b/erpnext/stock/doctype/quality_inspection/quality_inspection.json
@@ -234,7 +234,7 @@
"fieldname": "status",
"fieldtype": "Select",
"label": "Status",
- "options": "\nAccepted\nRejected",
+ "options": "\nAccepted\nRejected\nCancelled",
"reqd": 1
},
{
@@ -278,7 +278,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2025-02-17 13:20:17.583094",
+ "modified": "2025-12-24 15:21:03.240008",
"modified_by": "Administrator",
"module": "Stock",
"name": "Quality Inspection",
@@ -300,9 +300,10 @@
"write": 1
}
],
+ "row_format": "Dynamic",
"search_fields": "item_code, report_date, reference_name",
"show_name_in_global_search": 1,
"sort_field": "creation",
"sort_order": "ASC",
"states": []
-}
\ No newline at end of file
+}
diff --git a/erpnext/stock/doctype/quality_inspection/quality_inspection.py b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
index faef473a7fa..f461fd54869 100644
--- a/erpnext/stock/doctype/quality_inspection/quality_inspection.py
+++ b/erpnext/stock/doctype/quality_inspection/quality_inspection.py
@@ -56,9 +56,13 @@ class QualityInspection(Document):
remarks: DF.Text | None
report_date: DF.Date
sample_size: DF.Float
- status: DF.Literal["", "Accepted", "Rejected"]
+ status: DF.Literal["", "Accepted", "Rejected", "Cancelled"]
verified_by: DF.Data | None
+
# end: auto-generated types
+ def on_discard(self):
+ self.update_qc_reference()
+ self.db_set("status", "Cancelled")
def validate(self):
if not self.readings and self.item_code:
diff --git a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.json b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.json
index 23701e7c94e..05d302dc4f1 100644
--- a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.json
+++ b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.json
@@ -76,7 +76,7 @@
"in_standard_filter": 1,
"label": "Status",
"no_copy": 1,
- "options": "Queued\nIn Progress\nCompleted\nSkipped\nFailed",
+ "options": "Queued\nIn Progress\nCompleted\nSkipped\nFailed\nCancelled",
"read_only": 1
},
{
@@ -252,7 +252,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2025-11-20 18:24:48.808526",
+ "modified": "2025-12-24 14:59:15.512898",
"modified_by": "Administrator",
"module": "Stock",
"name": "Repost Item Valuation",
diff --git a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
index e74901584e3..64d636a4fd1 100644
--- a/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
+++ b/erpnext/stock/doctype/repost_item_valuation/repost_item_valuation.py
@@ -53,7 +53,7 @@ class RepostItemValuation(Document):
repost_only_accounting_ledgers: DF.Check
reposting_data_file: DF.Attach | None
reposting_reference: DF.Data | None
- status: DF.Literal["Queued", "In Progress", "Completed", "Skipped", "Failed"]
+ status: DF.Literal["Queued", "In Progress", "Completed", "Skipped", "Failed", "Cancelled"]
total_reposting_count: DF.Int
via_landed_cost_voucher: DF.Check
voucher_no: DF.DynamicLink | None
@@ -73,6 +73,9 @@ class RepostItemValuation(Document):
),
)
+ def on_discard(self):
+ self.db_set("status", "Cancelled")
+
def validate(self):
self.reset_repost_only_accounting_ledgers()
self.set_company()
diff --git a/erpnext/stock/doctype/serial_no/serial_no.json b/erpnext/stock/doctype/serial_no/serial_no.json
index 85bc04fe9ba..9069a721eac 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.json
+++ b/erpnext/stock/doctype/serial_no/serial_no.json
@@ -312,7 +312,7 @@
"icon": "fa fa-barcode",
"idx": 1,
"links": [],
- "modified": "2025-08-05 17:17:11.328682",
+ "modified": "2025-12-24 20:14:52.942251",
"modified_by": "Administrator",
"module": "Stock",
"name": "Serial No",
diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py
index 9479a3de2c5..42fef027aba 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.py
+++ b/erpnext/stock/doctype/serial_no/serial_no.py
@@ -304,3 +304,7 @@ def get_serial_nos_for_outward(kwargs):
return []
return [d.serial_no for d in serial_nos]
+
+
+def on_doctype_update():
+ frappe.db.add_index("Serial No", ["item_code", "warehouse"])
diff --git a/erpnext/stock/doctype/shipment/shipment.py b/erpnext/stock/doctype/shipment/shipment.py
index cf9d165fdd3..f638d6125fe 100644
--- a/erpnext/stock/doctype/shipment/shipment.py
+++ b/erpnext/stock/doctype/shipment/shipment.py
@@ -72,6 +72,9 @@ class Shipment(Document):
value_of_goods: DF.Currency
# end: auto-generated types
+ def on_discard(self):
+ self.db_set("status", "Cancelled")
+
def validate(self):
self.validate_weight()
self.validate_pickup_time()
diff --git a/erpnext/stock/doctype/stock_closing_entry/stock_closing_entry.json b/erpnext/stock/doctype/stock_closing_entry/stock_closing_entry.json
index 2d4afbd8354..3165e00f41b 100644
--- a/erpnext/stock/doctype/stock_closing_entry/stock_closing_entry.json
+++ b/erpnext/stock/doctype/stock_closing_entry/stock_closing_entry.json
@@ -37,7 +37,7 @@
"in_list_view": 1,
"in_preview": 1,
"label": "Status",
- "options": "Draft\nQueued\nIn Progress\nCompleted\nFailed\nCanceled",
+ "options": "Draft\nQueued\nIn Progress\nCompleted\nFailed\nCancelled",
"read_only": 1
},
{
@@ -68,7 +68,7 @@
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
- "modified": "2024-12-20 13:48:46.618066",
+ "modified": "2025-12-29 10:35:32.507988",
"modified_by": "Administrator",
"module": "Stock",
"name": "Stock Closing Entry",
@@ -121,7 +121,8 @@
"write": 1
}
],
+ "row_format": "Dynamic",
"sort_field": "creation",
"sort_order": "DESC",
"states": []
-}
\ No newline at end of file
+}
diff --git a/erpnext/stock/doctype/stock_closing_entry/stock_closing_entry.py b/erpnext/stock/doctype/stock_closing_entry/stock_closing_entry.py
index 8cc06953362..5c523cc560e 100644
--- a/erpnext/stock/doctype/stock_closing_entry/stock_closing_entry.py
+++ b/erpnext/stock/doctype/stock_closing_entry/stock_closing_entry.py
@@ -27,17 +27,20 @@ class StockClosingEntry(Document):
company: DF.Link | None
from_date: DF.Date | None
naming_series: DF.Literal["CBAL-.#####"]
- status: DF.Literal["Draft", "Queued", "In Progress", "Completed", "Failed", "Canceled"]
+ status: DF.Literal["Draft", "Queued", "In Progress", "Completed", "Failed", "Cancelled"]
to_date: DF.Date | None
# end: auto-generated types
+ def on_discard(self):
+ self.db_set("status", "Cancelled")
+
def before_save(self):
self.set_status()
def set_status(self, save=False):
self.status = "Queued"
if self.docstatus == 2:
- self.status = "Canceled"
+ self.status = "Cancelled"
if self.docstatus == 0:
self.status = "Draft"
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index 10cdde6e37a..65161699807 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -944,6 +944,9 @@ frappe.ui.form.on("Stock Entry Detail", {
item_code(frm, cdt, cdn) {
var d = locals[cdt][cdn];
+ // since some items may not have image, so empty the image field to avoid setting the image of previous item
+ d.image = "";
+
if (d.item_code) {
var args = {
item_code: d.item_code,
@@ -1287,10 +1290,11 @@ erpnext.stock.StockEntry = class StockEntry extends erpnext.stock.StockControlle
// Clear Work Order record from locals, because it is updated via Stock Entry
if (
this.frm.doc.work_order &&
- in_list(
- ["Manufacture", "Material Transfer for Manufacture", "Material Consumption for Manufacture"],
- this.frm.doc.purpose
- )
+ [
+ "Manufacture",
+ "Material Transfer for Manufacture",
+ "Material Consumption for Manufacture",
+ ].includes(this.frm.doc.purpose)
) {
frappe.model.remove_from_locals("Work Order", this.frm.doc.work_order);
}
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.py b/erpnext/stock/doctype/stock_entry/stock_entry.py
index 3d66e3f684d..215ad6d2ee9 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.py
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.py
@@ -201,7 +201,7 @@ class StockEntry(StockController, SubcontractingInwardController):
def onload(self):
for item in self.get("items"):
- item.update(get_bin_details(item.item_code, item.s_warehouse))
+ item.update(get_bin_details(item.item_code, item.s_warehouse or item.t_warehouse))
def before_insert(self):
if self.subcontracting_order and frappe.get_cached_value(
@@ -1454,9 +1454,11 @@ class StockEntry(StockController, SubcontractingInwardController):
)
).run()[0][0] or 0
- if flt(total_supplied - total_returned, precision) > flt(total_allowed, precision):
+ if flt(total_supplied + se_item.transfer_qty - total_returned, precision) > flt(
+ total_allowed, precision
+ ):
frappe.throw(
- _("Row {0}# Item {1} cannot be transferred more than {2} against {3} {4}").format(
+ _("Row #{0}: Item {1} cannot be transferred more than {2} against {3} {4}").format(
se_item.idx,
se_item.item_code,
total_allowed,
@@ -3080,7 +3082,7 @@ class StockEntry(StockController, SubcontractingInwardController):
child_qty = flt(item_row["qty"], precision)
if not self.is_return and child_qty <= 0 and not item_row.get("is_scrap_item"):
- if self.purpose != "Receive from Customer":
+ if self.purpose not in ["Receive from Customer", "Send to Subcontractor"]:
continue
se_child = self.append("items")
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry_list.js b/erpnext/stock/doctype/stock_entry/stock_entry_list.js
index 8a1c808cd91..8d7392eb6da 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry_list.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry_list.js
@@ -22,7 +22,7 @@ frappe.listview_settings["Stock Entry"] = {
} else if (doc.purpose === "Send to Warehouse" && doc.per_transferred === 100) {
return [__("Goods Transferred"), "green", "per_transferred,=,100"];
} else if (doc.docstatus === 2) {
- return [__("Canceled"), "red", "docstatus,=,2"];
+ return [__("Cancelled"), "red", "docstatus,=,2"];
} else {
return [__("Submitted"), "blue", "docstatus,=,1"];
}
diff --git a/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py b/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
index 71d7dd4e5f3..ca8d49fe8ef 100644
--- a/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
+++ b/erpnext/stock/doctype/stock_reservation_entry/stock_reservation_entry.py
@@ -709,6 +709,7 @@ def get_available_qty_to_reserve(
& (sre.warehouse == warehouse)
& (sre.delivered_qty < sre.reserved_qty)
)
+ .for_update()
)
if ignore_sre:
diff --git a/erpnext/stock/doctype/stock_settings/test_stock_settings.py b/erpnext/stock/doctype/stock_settings/test_stock_settings.py
index 138cb536995..18c523f9998 100644
--- a/erpnext/stock/doctype/stock_settings/test_stock_settings.py
+++ b/erpnext/stock/doctype/stock_settings/test_stock_settings.py
@@ -13,12 +13,10 @@ class TestStockSettings(IntegrationTestCase):
def test_settings(self):
item = frappe.get_doc(
- dict(
- doctype="Item",
- item_code="Item for description test",
- item_group="Products",
- description='Drawing No. 07-xxx-PO132
1800 x 1685 x 750
All parts made of Marine Ply
Top w/ Corian dd
CO, CS, VIP Day Cabin
',
- )
+ doctype="Item",
+ item_code="Item for description test",
+ item_group="Products",
+ description='Drawing No. 07-xxx-PO132
1800 x 1685 x 750
All parts made of Marine Ply
Top w/ Corian dd
CO, CS, VIP Day Cabin
',
).insert()
settings = frappe.get_single("Stock Settings")
@@ -40,12 +38,10 @@ class TestStockSettings(IntegrationTestCase):
settings.save()
item = frappe.get_doc(
- dict(
- doctype="Item",
- item_code="Item for description test",
- item_group="Products",
- description='Drawing No. 07-xxx-PO132
1800 x 1685 x 750
All parts made of Marine Ply
Top w/ Corian dd
CO, CS, VIP Day Cabin
',
- )
+ doctype="Item",
+ item_code="Item for description test",
+ item_group="Products",
+ description='Drawing No. 07-xxx-PO132
1800 x 1685 x 750
All parts made of Marine Ply
Top w/ Corian dd
CO, CS, VIP Day Cabin
',
).insert()
self.assertEqual(
diff --git a/erpnext/stock/get_item_details.py b/erpnext/stock/get_item_details.py
index 01959e6b547..a1f431c883e 100644
--- a/erpnext/stock/get_item_details.py
+++ b/erpnext/stock/get_item_details.py
@@ -56,9 +56,7 @@ def _preprocess_ctx(ctx):
@frappe.whitelist()
@erpnext.normalize_ctx_input(ItemDetailsCtx)
-def get_item_details(
- ctx: ItemDetailsCtx, doc=None, for_validate=False, overwrite_warehouse=True
-) -> ItemDetails:
+def get_item_details(ctx, doc=None, for_validate=False, overwrite_warehouse=True) -> ItemDetails:
"""
ctx = {
"item_code": "",
diff --git a/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py b/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py
index b62a6ee6fd8..9d313b477a3 100644
--- a/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py
+++ b/erpnext/stock/report/purchase_receipt_trends/purchase_receipt_trends.py
@@ -20,6 +20,9 @@ def execute(filters=None):
def get_chart_data(data, filters):
+ def wrap_in_quotes(label):
+ return f"'{label}'"
+
if not data:
return []
@@ -36,6 +39,9 @@ def get_chart_data(data, filters):
data = data[:10]
for row in data:
+ if row[0] == wrap_in_quotes(_("Total")):
+ continue
+
labels.append(row[0])
datapoints.append(row[-1])
diff --git a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js
index f8661e59e4b..82331d41ad4 100644
--- a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js
+++ b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.js
@@ -460,6 +460,119 @@ frappe.ui.form.on("Subcontracting Order", {
});
},
+ make_subcontracting_receipt(this_obj) {
+ const doc = this_obj.frm.doc;
+ const has_overtransferred_items = doc.supplied_items.some((item) => {
+ return item.supplied_qty > item.required_qty;
+ });
+ const backflush_based_on = doc.__onload.backflush_based_on;
+ if (has_overtransferred_items && backflush_based_on === "BOM") {
+ const raw_data = doc.supplied_items.map((item) => {
+ const row = doc.items.find((i) => i.name === item.reference_name);
+ const qty = flt(row.qty) - flt(row.received_qty);
+ return {
+ __checked: 1,
+ item_code: row.item_code,
+ warehouse: row.warehouse,
+ bom_no: row.bom,
+ required_by: row.schedule_date,
+ qty: qty > 0 ? qty : null,
+ subcontracting_order_item: row.name,
+ };
+ });
+ const item_names_list = [];
+ const data = [];
+ raw_data.forEach((d) => {
+ if (!item_names_list.includes(d.subcontracting_order_item)) {
+ item_names_list.push(d.subcontracting_order_item);
+ data.push(d);
+ }
+ });
+
+ const dialog = new frappe.ui.Dialog({
+ title: __("Select Items"),
+ size: "extra-large",
+ fields: [
+ {
+ fieldname: "items",
+ fieldtype: "Table",
+ reqd: 1,
+ label: __("Select Items to Receive"),
+ cannot_add_rows: true,
+ fields: [
+ {
+ fieldtype: "Link",
+ fieldname: "item_code",
+ reqd: 1,
+ options: "Item",
+ label: __("Item Code"),
+ in_list_view: 1,
+ read_only: 1,
+ },
+ {
+ fieldtype: "Link",
+ fieldname: "warehouse",
+ options: "Warehouse",
+ label: __("Warehouse"),
+ in_list_view: 1,
+ read_only: 1,
+ reqd: 1,
+ },
+ {
+ fieldtype: "Link",
+ fieldname: "bom_no",
+ options: "BOM",
+ label: __("BOM"),
+ in_list_view: 1,
+ read_only: 1,
+ reqd: 1,
+ },
+ {
+ fieldtype: "Date",
+ fieldname: "required_by",
+ label: __("Required By"),
+ in_list_view: 1,
+ read_only: 1,
+ reqd: 1,
+ },
+ {
+ fieldtype: "Float",
+ fieldname: "qty",
+ reqd: 1,
+ label: __("Qty to Receive"),
+ in_list_view: 1,
+ },
+ {
+ fieldtype: "Data",
+ fieldname: "subcontracting_order_item",
+ reqd: 1,
+ label: __("Subcontracting Order Item"),
+ hidden: 1,
+ read_only: 1,
+ in_list_view: 0,
+ },
+ ],
+ data: data,
+ },
+ ],
+ primary_action_label: __("Proceed"),
+ primary_action: () => {
+ const values = dialog.fields_dict["items"].grid
+ .get_selected_children()
+ .map((i) => ({ name: i.subcontracting_order_item, qty: i.qty }));
+ if (values.some((i) => !i.qty || i.qty == 0)) {
+ frappe.throw(__("Quantity is mandatory for the selected items."));
+ } else {
+ this_obj.make_subcontracting_receipt(values);
+ }
+ },
+ });
+ dialog.show();
+ } else {
+ this_obj.make_subcontracting_receipt();
+ }
+ },
+
company: function (frm) {
erpnext.utils.set_letter_head(frm);
},
@@ -524,11 +637,11 @@ erpnext.buying.SubcontractingOrderController = class SubcontractingOrderControll
var me = this;
if (doc.docstatus == 1) {
- if (!["Closed", "Completed"].includes(doc.status)) {
- if (flt(doc.per_received) < 100) {
+ if (doc.status != "Closed") {
+ if (flt(doc.per_received) < 100 + doc.__onload.over_delivery_receipt_allowance) {
this.frm.add_custom_button(
__("Subcontracting Receipt"),
- this.make_subcontracting_receipt,
+ () => this.frm.events.make_subcontracting_receipt(this),
__("Create")
);
if (me.has_unsupplied_items()) {
@@ -576,10 +689,12 @@ erpnext.buying.SubcontractingOrderController = class SubcontractingOrderControll
});
}
- make_subcontracting_receipt() {
+ make_subcontracting_receipt(items) {
frappe.model.open_mapped_doc({
method: "erpnext.subcontracting.doctype.subcontracting_order.subcontracting_order.make_subcontracting_receipt",
frm: cur_frm,
+ args: { items: items || [] },
+ freeze: true,
freeze_message: __("Creating Subcontracting Receipt ..."),
});
}
diff --git a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py
index 221396f64d4..ee9cf7a8ee5 100644
--- a/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py
+++ b/erpnext/subcontracting/doctype/subcontracting_order/subcontracting_order.py
@@ -110,6 +110,14 @@ class SubcontractingOrder(SubcontractingController):
"over_transfer_allowance",
frappe.db.get_single_value("Buying Settings", "over_transfer_allowance"),
)
+ self.set_onload(
+ "over_delivery_receipt_allowance",
+ frappe.get_single_value("Stock Settings", "over_delivery_receipt_allowance"),
+ )
+ self.set_onload(
+ "backflush_based_on",
+ frappe.get_single_value("Buying Settings", "backflush_raw_materials_of_subcontract_based_on"),
+ )
if self.reserve_stock:
if self.has_unreserved_stock():
@@ -464,16 +472,18 @@ class SubcontractingOrder(SubcontractingController):
@frappe.whitelist()
def make_subcontracting_receipt(source_name, target_doc=None):
- return get_mapped_subcontracting_receipt(source_name, target_doc)
+ items = frappe.flags.args.get("items") if frappe.flags.args else None
+ return get_mapped_subcontracting_receipt(source_name, target_doc, items=items)
-def get_mapped_subcontracting_receipt(source_name, target_doc=None):
+def get_mapped_subcontracting_receipt(source_name, target_doc=None, items=None):
def update_item(source, target, source_parent):
target.purchase_order = source_parent.purchase_order
target.purchase_order_item = source.purchase_order_item
- target.qty = flt(source.qty) - flt(source.received_qty)
+ target.qty = items.get(source.name) or (flt(source.qty) - flt(source.received_qty))
target.amount = (flt(source.qty) - flt(source.received_qty)) * flt(source.rate)
+ items = {item["name"]: item["qty"] for item in items} if items else {}
target_doc = get_mapped_doc(
"Subcontracting Order",
source_name,
@@ -496,7 +506,9 @@ def get_mapped_subcontracting_receipt(source_name, target_doc=None):
"bom": "bom",
},
"postprocess": update_item,
- "condition": lambda doc: abs(doc.received_qty) < abs(doc.qty),
+ "condition": lambda doc: abs(doc.received_qty) < abs(doc.qty)
+ if not items
+ else doc.name in items,
},
},
target_doc,
diff --git a/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py b/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py
index 6003978835b..5bf2a6dd6fe 100644
--- a/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py
+++ b/erpnext/subcontracting/doctype/subcontracting_receipt/test_subcontracting_receipt.py
@@ -1890,6 +1890,36 @@ class TestSubcontractingReceipt(IntegrationTestCase):
self.assertRaises(BOMQuantityError, scr.submit)
+ @IntegrationTestCase.change_settings("Buying Settings", {"over_transfer_allowance": 20})
+ @IntegrationTestCase.change_settings("Stock Settings", {"over_delivery_receipt_allowance": 20})
+ def test_over_receipt(self):
+ from erpnext.controllers.subcontracting_controller import make_rm_stock_entry
+
+ set_backflush_based_on("BOM")
+
+ sco = get_subcontracting_order()
+ rm_items = get_rm_items(sco.supplied_items)
+ itemwise_details = make_stock_in_entry(rm_items=rm_items)
+ make_stock_transfer_entry(
+ sco_no=sco.name,
+ rm_items=rm_items,
+ itemwise_details=copy.deepcopy(itemwise_details),
+ )
+
+ rm_items[0]["qty"] = 2
+ itemwise_details = make_stock_in_entry(rm_items=rm_items)
+ ste_dict = make_rm_stock_entry(sco.name)
+ doc = frappe.get_doc(ste_dict)
+ self.assertEqual(doc.items[0].qty, 0)
+ doc.items[0].qty = 2
+ doc.submit()
+
+ frappe.flags["args"] = {"items": [{"name": sco.items[0].name, "qty": 2}]}
+ scr = make_subcontracting_receipt(sco.name)
+ self.assertEqual(scr.items[0].qty, 2)
+ scr.submit()
+ frappe.flags["args"].pop("items", None)
+
def make_return_subcontracting_receipt(**args):
args = frappe._dict(args)
diff --git a/erpnext/telephony/doctype/call_log/call_log.json b/erpnext/telephony/doctype/call_log/call_log.json
index a41ddb19f91..b763181f955 100644
--- a/erpnext/telephony/doctype/call_log/call_log.json
+++ b/erpnext/telephony/doctype/call_log/call_log.json
@@ -54,7 +54,7 @@
"fieldtype": "Select",
"in_list_view": 1,
"label": "Status",
- "options": "Ringing\nIn Progress\nCompleted\nFailed\nBusy\nNo Answer\nQueued\nCanceled",
+ "options": "Ringing\nIn Progress\nCompleted\nFailed\nBusy\nNo Answer\nQueued\nCancelled",
"read_only": 1
},
{
@@ -164,7 +164,7 @@
"in_create": 1,
"index_web_pages_for_search": 1,
"links": [],
- "modified": "2022-04-14 02:59:22.503202",
+ "modified": "2025-12-29 10:37:26.183502",
"modified_by": "Administrator",
"module": "Telephony",
"name": "Call Log",
@@ -188,10 +188,11 @@
"role": "Employee"
}
],
+ "row_format": "Dynamic",
"sort_field": "creation",
"sort_order": "DESC",
"states": [],
"title_field": "from",
"track_changes": 1,
"track_views": 1
-}
\ No newline at end of file
+}
diff --git a/erpnext/telephony/doctype/call_log/call_log.py b/erpnext/telephony/doctype/call_log/call_log.py
index 23cd8537032..0b5fd5dc368 100644
--- a/erpnext/telephony/doctype/call_log/call_log.py
+++ b/erpnext/telephony/doctype/call_log/call_log.py
@@ -36,7 +36,7 @@ class CallLog(Document):
recording_url: DF.Data | None
start_time: DF.Datetime | None
status: DF.Literal[
- "Ringing", "In Progress", "Completed", "Failed", "Busy", "No Answer", "Queued", "Canceled"
+ "Ringing", "In Progress", "Completed", "Failed", "Busy", "No Answer", "Queued", "Cancelled"
]
summary: DF.SmallText | None
to: DF.Data | None
diff --git a/erpnext/templates/utils.py b/erpnext/templates/utils.py
index 15af9f0f014..164a52f58c2 100644
--- a/erpnext/templates/utils.py
+++ b/erpnext/templates/utils.py
@@ -26,17 +26,15 @@ def send_message(sender, message, subject="Website Query"):
lead = frappe.db.get_value("Lead", dict(email_id=sender))
if not lead:
new_lead = frappe.get_doc(
- dict(doctype="Lead", email_id=sender, lead_name=sender.split("@")[0].title())
+ doctype="Lead", email_id=sender, lead_name=sender.split("@")[0].title()
).insert(ignore_permissions=True)
opportunity = frappe.get_doc(
- dict(
- doctype="Opportunity",
- opportunity_from="Customer" if customer else "Lead",
- status="Open",
- title=subject,
- contact_email=sender,
- )
+ doctype="Opportunity",
+ opportunity_from="Customer" if customer else "Lead",
+ status="Open",
+ title=subject,
+ contact_email=sender,
)
if customer:
diff --git a/erpnext/utilities/transaction_base.py b/erpnext/utilities/transaction_base.py
index 283ad1c4eab..0f29de81ebd 100644
--- a/erpnext/utilities/transaction_base.py
+++ b/erpnext/utilities/transaction_base.py
@@ -19,8 +19,8 @@ class UOMMustBeIntegerError(frappe.ValidationError):
class TransactionBase(StatusUpdater):
def validate_posting_time(self):
- # set Edit Posting Date and Time to 1 while data import
- if frappe.flags.in_import and self.posting_date:
+ # set Edit Posting Date and Time to 1 while data import and restore
+ if (frappe.flags.in_import or self.flags.from_restore) and self.posting_date:
self.set_posting_time = 1
if not getattr(self, "set_posting_time", None):
diff --git a/erpnext/workspace_sidebar/accounting.json b/erpnext/workspace_sidebar/accounting.json
index 8767e96a22a..fef3df6a617 100644
--- a/erpnext/workspace_sidebar/accounting.json
+++ b/erpnext/workspace_sidebar/accounting.json
@@ -33,7 +33,7 @@
{
"child": 0,
"collapsible": 1,
- "icon": "arrow-right",
+ "icon": "arrow-left-to-line",
"indent": 1,
"keep_closed": 0,
"label": "Receivables",
@@ -67,12 +67,14 @@
{
"child": 1,
"collapsible": 1,
+ "filters": "",
"icon": "",
"indent": 0,
"keep_closed": 0,
"label": "Credit Note",
"link_to": "Sales Invoice",
"link_type": "DocType",
+ "route_options": "",
"show_arrow": 0,
"type": "Link"
},
@@ -90,7 +92,7 @@
{
"child": 0,
"collapsible": 1,
- "icon": "arrow-left",
+ "icon": "arrow-right-from-line",
"indent": 1,
"keep_closed": 0,
"label": "Payables",
@@ -146,7 +148,7 @@
{
"child": 0,
"collapsible": 1,
- "icon": "dollar-sign",
+ "icon": "money-coins-1",
"indent": 1,
"keep_closed": 1,
"label": "Payments",
@@ -176,6 +178,28 @@
"show_arrow": 0,
"type": "Link"
},
+ {
+ "child": 1,
+ "collapsible": 1,
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Payment Request",
+ "link_to": "Payment Request",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
+ {
+ "child": 1,
+ "collapsible": 1,
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Payment Order",
+ "link_to": "Payment Order",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
{
"child": 1,
"collapsible": 1,
@@ -187,10 +211,32 @@
"show_arrow": 0,
"type": "Link"
},
+ {
+ "child": 1,
+ "collapsible": 1,
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Unreconcile Payment",
+ "link_to": "Unreconcile Payment",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
+ {
+ "child": 1,
+ "collapsible": 1,
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Process Payment Reconciliation",
+ "link_to": "Process Payment Reconciliation",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
{
"child": 0,
"collapsible": 1,
- "icon": "notepad-text",
+ "icon": "sheet",
"indent": 1,
"keep_closed": 1,
"label": "Reports",
@@ -231,6 +277,77 @@
"show_arrow": 0,
"type": "Link"
},
+ {
+ "child": 0,
+ "collapsible": 1,
+ "icon": "lock-keyhole-open",
+ "indent": 1,
+ "keep_closed": 1,
+ "label": "Opening & Closing",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Section Break"
+ },
+ {
+ "child": 1,
+ "collapsible": 1,
+ "icon": "",
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "COA Importer",
+ "link_to": "Chart of Accounts Importer",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
+ {
+ "child": 1,
+ "collapsible": 1,
+ "icon": "",
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Opening Invoice Tool",
+ "link_to": "Opening Invoice Creation Tool",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
+ {
+ "child": 1,
+ "collapsible": 1,
+ "icon": "",
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Accounting Period",
+ "link_to": "Accounting Period",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
+ {
+ "child": 1,
+ "collapsible": 1,
+ "icon": "",
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "FX Revaluation",
+ "link_to": "Exchange Rate Revaluation",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
+ {
+ "child": 1,
+ "collapsible": 1,
+ "icon": "",
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Period Closing Voucher",
+ "link_to": "Period Closing Voucher",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
{
"child": 0,
"collapsible": 1,
@@ -380,14 +497,14 @@
"icon": "settings",
"indent": 0,
"keep_closed": 0,
- "label": "Accounts Settings",
+ "label": "Settings",
"link_to": "Accounts Settings",
"link_type": "DocType",
"show_arrow": 0,
"type": "Link"
}
],
- "modified": "2025-11-25 10:46:09.814457",
+ "modified": "2025-12-31 16:54:07.693056",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounting",
diff --git a/erpnext/workspace_sidebar/assets.json b/erpnext/workspace_sidebar/assets.json
index 4db0ce0725a..932ca4518d7 100644
--- a/erpnext/workspace_sidebar/assets.json
+++ b/erpnext/workspace_sidebar/assets.json
@@ -33,7 +33,7 @@
{
"child": 0,
"collapsible": 1,
- "icon": "assets",
+ "icon": "laptop",
"indent": 0,
"keep_closed": 0,
"label": "Asset",
@@ -42,6 +42,30 @@
"show_arrow": 0,
"type": "Link"
},
+ {
+ "child": 0,
+ "collapsible": 1,
+ "icon": "trending-down",
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Depreciation Schedule",
+ "link_to": "Asset Depreciation Schedule",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
+ {
+ "child": 0,
+ "collapsible": 1,
+ "icon": "sprout",
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Asset Capitalization",
+ "link_to": "Asset Capitalization",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
{
"child": 0,
"collapsible": 1,
@@ -54,17 +78,6 @@
"show_arrow": 0,
"type": "Link"
},
- {
- "child": 0,
- "collapsible": 1,
- "indent": 0,
- "keep_closed": 0,
- "label": "Fixed Asset Register",
- "link_to": "Fixed Asset Register",
- "link_type": "Report",
- "show_arrow": 0,
- "type": "Link"
- },
{
"child": 0,
"collapsible": 1,
@@ -131,21 +144,10 @@
"show_arrow": 0,
"type": "Link"
},
- {
- "child": 1,
- "collapsible": 1,
- "indent": 0,
- "keep_closed": 0,
- "label": "Asset Capitalization",
- "link_to": "Asset Capitalization",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
{
"child": 0,
"collapsible": 1,
- "icon": "notepad-text",
+ "icon": "sheet",
"indent": 1,
"keep_closed": 1,
"label": "Reports",
@@ -153,6 +155,17 @@
"show_arrow": 0,
"type": "Section Break"
},
+ {
+ "child": 1,
+ "collapsible": 1,
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Fixed Asset Register",
+ "link_to": "Fixed Asset Register",
+ "link_type": "Report",
+ "show_arrow": 0,
+ "type": "Link"
+ },
{
"child": 1,
"collapsible": 1,
@@ -250,12 +263,13 @@
"label": "Settings",
"link_to": "Accounts Settings",
"link_type": "DocType",
+ "navigate_to_tab": "assets_tab",
"show_arrow": 0,
"type": "Link",
"url": ""
}
],
- "modified": "2025-11-25 10:46:09.778268",
+ "modified": "2025-12-31 16:27:44.936562",
"modified_by": "Administrator",
"module": "Assets",
"name": "Assets",
diff --git a/erpnext/workspace_sidebar/banking.json b/erpnext/workspace_sidebar/banking.json
index 1cb227667a2..e6ffcb473ad 100644
--- a/erpnext/workspace_sidebar/banking.json
+++ b/erpnext/workspace_sidebar/banking.json
@@ -6,30 +6,6 @@
"header_icon": "circle-dollar-sign",
"idx": 0,
"items": [
- {
- "child": 0,
- "collapsible": 1,
- "icon": "organization",
- "indent": 0,
- "keep_closed": 0,
- "label": "Bank",
- "link_to": "Bank",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "accounting",
- "indent": 0,
- "keep_closed": 0,
- "label": "Bank Account",
- "link_to": "Bank Account",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
{
"child": 0,
"collapsible": 1,
@@ -69,6 +45,41 @@
{
"child": 0,
"collapsible": 1,
+ "icon": "database",
+ "indent": 1,
+ "keep_closed": 1,
+ "label": "Setup",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Section Break"
+ },
+ {
+ "child": 1,
+ "collapsible": 1,
+ "icon": "organization",
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Bank",
+ "link_to": "Bank",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
+ {
+ "child": 1,
+ "collapsible": 1,
+ "icon": "accounting",
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Bank Account",
+ "link_to": "Bank Account",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
+ {
+ "child": 1,
+ "collapsible": 1,
"icon": "settings",
"indent": 0,
"keep_closed": 0,
@@ -112,7 +123,7 @@
"type": "Link"
}
],
- "modified": "2025-11-25 10:46:09.274779",
+ "modified": "2025-12-22 16:57:07.501533",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Banking",
diff --git a/erpnext/workspace_sidebar/budget.json b/erpnext/workspace_sidebar/budget.json
index 9a7fdb06ee1..57d3d3d1d12 100644
--- a/erpnext/workspace_sidebar/budget.json
+++ b/erpnext/workspace_sidebar/budget.json
@@ -57,6 +57,17 @@
{
"child": 0,
"collapsible": 1,
+ "icon": "notepad-text",
+ "indent": 1,
+ "keep_closed": 1,
+ "label": "Reports",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Section Break"
+ },
+ {
+ "child": 1,
+ "collapsible": 1,
"icon": "file-text",
"indent": 0,
"keep_closed": 0,
@@ -65,21 +76,9 @@
"link_type": "Report",
"show_arrow": 0,
"type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "receipt-text",
- "indent": 0,
- "keep_closed": 0,
- "label": "Monthly Distribution",
- "link_to": "Monthly Distribution",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
}
],
- "modified": "2025-11-25 10:46:09.281991",
+ "modified": "2025-12-23 17:01:31.198860",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Budget",
diff --git a/erpnext/workspace_sidebar/opening_&_closing.json b/erpnext/workspace_sidebar/opening_&_closing.json
deleted file mode 100644
index eddcbf929dc..00000000000
--- a/erpnext/workspace_sidebar/opening_&_closing.json
+++ /dev/null
@@ -1,76 +0,0 @@
-{
- "app": "erpnext",
- "creation": "2025-11-12 15:14:26.244306",
- "docstatus": 0,
- "doctype": "Workspace Sidebar",
- "header_icon": "lock-keyhole-open",
- "idx": 0,
- "items": [
- {
- "child": 0,
- "collapsible": 1,
- "icon": "accounting",
- "indent": 0,
- "keep_closed": 0,
- "label": "COA Importer",
- "link_to": "Chart of Accounts Importer",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "tool",
- "indent": 0,
- "keep_closed": 0,
- "label": "Opening Invoice Tool",
- "link_to": "Opening Invoice Creation Tool",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "folder-clock",
- "indent": 0,
- "keep_closed": 0,
- "label": "Accounting Period",
- "link_to": "Accounting Period",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "expand-alt",
- "indent": 0,
- "keep_closed": 0,
- "label": "FX Revaluation",
- "link_to": "Exchange Rate Revaluation",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "calendar-check",
- "indent": 0,
- "keep_closed": 0,
- "label": "Period Closing Voucher",
- "link_to": "Period Closing Voucher",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- }
- ],
- "modified": "2025-11-25 10:46:09.262478",
- "modified_by": "Administrator",
- "module": "Accounts",
- "name": "Opening & Closing",
- "owner": "Administrator",
- "title": "Opening & Closing"
-}
diff --git a/erpnext/workspace_sidebar/payables.json b/erpnext/workspace_sidebar/payables.json
deleted file mode 100644
index 5932569028c..00000000000
--- a/erpnext/workspace_sidebar/payables.json
+++ /dev/null
@@ -1,88 +0,0 @@
-{
- "app": "erpnext",
- "creation": "2025-11-17 13:19:04.870143",
- "docstatus": 0,
- "doctype": "Workspace Sidebar",
- "header_icon": "arrow-left",
- "idx": 0,
- "items": [
- {
- "child": 0,
- "collapsible": 1,
- "icon": "home",
- "indent": 0,
- "keep_closed": 0,
- "label": "Home",
- "link_to": "Payables",
- "link_type": "Workspace",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "customer",
- "indent": 0,
- "keep_closed": 0,
- "label": "Supplier",
- "link_to": "Supplier",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "liabilities",
- "indent": 0,
- "keep_closed": 0,
- "label": "Purchase Invoice",
- "link_to": "Purchase Invoice",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "dollar-sign",
- "indent": 0,
- "keep_closed": 0,
- "label": "Payment Entry",
- "link_to": "Payment Entry",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "calendar-range",
- "indent": 0,
- "keep_closed": 0,
- "label": "Journal Entry",
- "link_to": "Journal Entry",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "notepad-text",
- "indent": 0,
- "keep_closed": 0,
- "label": "Accounts Payable",
- "link_to": "Accounts Payable",
- "link_type": "Report",
- "show_arrow": 0,
- "type": "Link"
- }
- ],
- "modified": "2025-11-25 10:46:09.192845",
- "modified_by": "Administrator",
- "module": "Accounts",
- "name": "Payables",
- "owner": "Administrator",
- "title": "Payables"
-}
diff --git a/erpnext/workspace_sidebar/receivables.json b/erpnext/workspace_sidebar/receivables.json
deleted file mode 100644
index e6ecb4884c1..00000000000
--- a/erpnext/workspace_sidebar/receivables.json
+++ /dev/null
@@ -1,99 +0,0 @@
-{
- "app": "erpnext",
- "creation": "2025-11-17 13:19:04.958271",
- "docstatus": 0,
- "doctype": "Workspace Sidebar",
- "header_icon": "arrow-right",
- "idx": 0,
- "items": [
- {
- "child": 0,
- "collapsible": 1,
- "indent": 0,
- "keep_closed": 0,
- "label": "Home",
- "link_to": "Receivables",
- "link_type": "Workspace",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "customer",
- "indent": 0,
- "keep_closed": 0,
- "label": "Customer",
- "link_to": "Customer",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "receipt",
- "indent": 0,
- "keep_closed": 0,
- "label": "Sales Invoice",
- "link_to": "Sales Invoice",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "dollar-sign",
- "indent": 0,
- "keep_closed": 0,
- "label": "Payment Entry",
- "link_to": "Payment Entry",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "file-text",
- "indent": 0,
- "keep_closed": 0,
- "label": "Journal Entry",
- "link_to": "Journal Entry",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "computer",
- "indent": 0,
- "keep_closed": 0,
- "label": "POS Invoice",
- "link_to": "POS Invoice",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
- {
- "child": 0,
- "collapsible": 1,
- "icon": "notepad-text",
- "indent": 0,
- "keep_closed": 0,
- "label": "Accounts Receivable",
- "link_to": "Accounts Receivable",
- "link_type": "Report",
- "show_arrow": 0,
- "type": "Link"
- }
- ],
- "modified": "2025-11-25 10:46:09.185843",
- "modified_by": "Administrator",
- "module": "Accounts",
- "name": "Receivables",
- "owner": "Administrator",
- "title": "Receivables"
-}
diff --git a/erpnext/workspace_sidebar/subscription.json b/erpnext/workspace_sidebar/subscription.json
index 8e675086339..ed91cc0c04c 100644
--- a/erpnext/workspace_sidebar/subscription.json
+++ b/erpnext/workspace_sidebar/subscription.json
@@ -41,9 +41,53 @@
"link_type": "DocType",
"show_arrow": 0,
"type": "Link"
+ },
+ {
+ "child": 0,
+ "collapsible": 1,
+ "icon": "database",
+ "indent": 1,
+ "keep_closed": 1,
+ "label": "Setup",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Section Break"
+ },
+ {
+ "child": 1,
+ "collapsible": 1,
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Customer",
+ "link_to": "Customer",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
+ {
+ "child": 1,
+ "collapsible": 1,
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Supplier",
+ "link_to": "Supplier",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
+ {
+ "child": 1,
+ "collapsible": 1,
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Item",
+ "link_to": "Item",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
}
],
- "modified": "2025-11-25 10:46:09.340108",
+ "modified": "2025-12-22 17:06:54.262451",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Subscription",
diff --git a/erpnext/workspace_sidebar/taxes.json b/erpnext/workspace_sidebar/taxes.json
index 4d831f3c998..b975e6e83a9 100644
--- a/erpnext/workspace_sidebar/taxes.json
+++ b/erpnext/workspace_sidebar/taxes.json
@@ -12,7 +12,7 @@
"icon": "panel-bottom-close",
"indent": 0,
"keep_closed": 0,
- "label": "Sales Template",
+ "label": "Sales Tax Template",
"link_to": "Sales Taxes and Charges",
"link_type": "DocType",
"show_arrow": 0,
@@ -24,12 +24,24 @@
"icon": "panel-top-close",
"indent": 0,
"keep_closed": 0,
- "label": "Purchase Template",
+ "label": "Purchase Tax Template",
"link_to": "Purchase Taxes and Charges Template",
"link_type": "DocType",
"show_arrow": 0,
"type": "Link"
},
+ {
+ "child": 0,
+ "collapsible": 1,
+ "icon": "stock",
+ "indent": 0,
+ "keep_closed": 0,
+ "label": "Item Tax Template",
+ "link_to": "Item Tax Template",
+ "link_type": "DocType",
+ "show_arrow": 0,
+ "type": "Link"
+ },
{
"child": 0,
"collapsible": 1,
@@ -54,18 +66,6 @@
"show_arrow": 0,
"type": "Link"
},
- {
- "child": 0,
- "collapsible": 1,
- "icon": "stock",
- "indent": 0,
- "keep_closed": 0,
- "label": "Item Tax Template",
- "link_to": "Item Tax Template",
- "link_type": "DocType",
- "show_arrow": 0,
- "type": "Link"
- },
{
"child": 0,
"collapsible": 1,
@@ -91,7 +91,7 @@
"type": "Link"
}
],
- "modified": "2025-11-25 10:46:09.268703",
+ "modified": "2025-12-31 16:55:52.262432",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Taxes",
diff --git a/pyproject.toml b/pyproject.toml
index 166918528fd..e3627770446 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -4,7 +4,7 @@ authors = [
{ name = "Frappe Technologies Pvt Ltd", email = "developers@frappe.io"}
]
description = "Open Source ERP"
-requires-python = ">=3.10"
+requires-python = ">=3.14"
readme = "README.md"
dynamic = ["version"]
dependencies = [