Merge branch 'develop' into exotel-fixes

This commit is contained in:
Suraj Shetty 2022-04-04 18:21:46 +05:30 committed by GitHub
commit 117e5d05a3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
108 changed files with 440 additions and 315 deletions

View File

@ -6,6 +6,7 @@
</p>
[![CI](https://github.com/frappe/erpnext/actions/workflows/server-tests.yml/badge.svg?branch=develop)](https://github.com/frappe/erpnext/actions/workflows/server-tests.yml)
[![UI](https://github.com/erpnext/erpnext_ui_tests/actions/workflows/ui-tests.yml/badge.svg?branch=develop&event=schedule)](https://github.com/erpnext/erpnext_ui_tests/actions/workflows/ui-tests.yml)
[![Open Source Helpers](https://www.codetriage.com/frappe/erpnext/badges/users.svg)](https://www.codetriage.com/frappe/erpnext)
[![codecov](https://codecov.io/gh/frappe/erpnext/branch/develop/graph/badge.svg?token=0TwvyUg3I5)](https://codecov.io/gh/frappe/erpnext)
[![docker pulls](https://img.shields.io/docker/pulls/frappe/erpnext-worker.svg)](https://hub.docker.com/r/frappe/erpnext-worker)

View File

@ -160,7 +160,7 @@ frappe.treeview_settings["Account"] = {
let root_company = treeview.page.fields_dict.root_company.get_value();
if(root_company) {
frappe.throw(__("Please add the account to root level Company - ") + root_company);
frappe.throw(__("Please add the account to root level Company - {0}"), [root_company]);
} else {
treeview.new_node();
}

View File

@ -200,7 +200,7 @@ frappe.ui.form.on("Bank Statement Import", {
})
.then((result) => {
if (result.length > 0) {
frm.add_custom_button("Report Error", () => {
frm.add_custom_button(__("Report Error"), () => {
let fake_xhr = {
responseText: JSON.stringify({
exc: result[0].error,

View File

@ -3,6 +3,7 @@
import frappe
from frappe import _
from frappe.model.document import Document
@ -16,6 +17,6 @@ class CashFlowMapping(Document):
]
if len(checked_fields) > 1:
frappe.throw(
frappe._("You can only select a maximum of one option from the list of check boxes."),
title="Error",
_("You can only select a maximum of one option from the list of check boxes."),
title=_("Error"),
)

View File

@ -68,9 +68,8 @@ class CurrencyExchangeSettings(Document):
str(key.key).format(transaction_date=nowdate(), to_currency="INR", from_currency="USD")
]
except Exception:
frappe.throw("Invalid result key. Response: " + response.text)
frappe.throw(_("Invalid result key. Response:") + " " + response.text)
if not isinstance(value, (int, float)):
frappe.throw(_("Returned exchange rate is neither integer not float."))
self.url = response.url
frappe.msgprint("Exchange rate of USD to INR is " + str(value))

View File

@ -42,12 +42,7 @@ class ModeofPayment(Document):
pos_profiles = list(map(lambda x: x[0], pos_profiles))
if pos_profiles:
message = (
"POS Profile "
+ frappe.bold(", ".join(pos_profiles))
+ " contains \
Mode of Payment "
+ frappe.bold(str(self.name))
+ ". Please remove them to disable this mode."
)
frappe.throw(_(message), title="Not Allowed")
message = _(
"POS Profile {} contains Mode of Payment {}. Please remove them to disable this mode."
).format(frappe.bold(", ".join(pos_profiles)), frappe.bold(str(self.name)))
frappe.throw(message, title=_("Not Allowed"))

View File

@ -61,13 +61,13 @@ class POSProfile(Document):
if len(item_groups) != len(set(item_groups)):
frappe.throw(
_("Duplicate item group found in the item group table"), title="Duplicate Item Group"
_("Duplicate item group found in the item group table"), title=_("Duplicate Item Group")
)
if len(customer_groups) != len(set(customer_groups)):
frappe.throw(
_("Duplicate customer group found in the cutomer group table"),
title="Duplicate Customer Group",
title=_("Duplicate Customer Group"),
)
def validate_payment_methods(self):

View File

@ -8,7 +8,7 @@ frappe.ui.form.on('Process Statement Of Accounts', {
},
refresh: function(frm){
if(!frm.doc.__islocal) {
frm.add_custom_button('Send Emails',function(){
frm.add_custom_button(__('Send Emails'), function(){
frappe.call({
method: "erpnext.accounts.doctype.process_statement_of_accounts.process_statement_of_accounts.send_emails",
args: {
@ -24,7 +24,7 @@ frappe.ui.form.on('Process Statement Of Accounts', {
}
});
});
frm.add_custom_button('Download',function(){
frm.add_custom_button(__('Download'), function(){
var url = frappe.urllib.get_full_url(
'/api/method/erpnext.accounts.doctype.process_statement_of_accounts.process_statement_of_accounts.download_statements?'
+ 'document_name='+encodeURIComponent(frm.doc.name))

View File

@ -141,7 +141,7 @@ erpnext.accounts.PurchaseInvoice = class PurchaseInvoice extends erpnext.buying.
})
}, __("Get Items From"));
}
this.frm.toggle_reqd("supplier_warehouse", this.frm.doc.is_subcontracted==="Yes");
this.frm.toggle_reqd("supplier_warehouse", this.frm.doc.is_subcontracted);
if (doc.docstatus == 1 && !doc.inter_company_invoice_reference) {
frappe.model.with_doc("Supplier", me.frm.doc.supplier, function() {
@ -571,10 +571,10 @@ frappe.ui.form.on("Purchase Invoice", {
},
is_subcontracted: function(frm) {
if (frm.doc.is_subcontracted === "Yes") {
if (frm.doc.is_subcontracted) {
erpnext.buying.get_default_bom(frm);
}
frm.toggle_reqd("supplier_warehouse", frm.doc.is_subcontracted==="Yes");
frm.toggle_reqd("supplier_warehouse", frm.doc.is_subcontracted);
},
update_stock: function(frm) {

View File

@ -543,11 +543,10 @@
"fieldtype": "Column Break"
},
{
"default": "No",
"default": "0",
"fieldname": "is_subcontracted",
"fieldtype": "Select",
"label": "Raw Materials Supplied",
"options": "No\nYes",
"fieldtype": "Check",
"label": "Is Subcontracted",
"print_hide": 1
},
{
@ -1366,7 +1365,7 @@
"width": "50px"
},
{
"depends_on": "eval:doc.update_stock && doc.is_subcontracted==\"Yes\"",
"depends_on": "eval:doc.update_stock && doc.is_subcontracted",
"fieldname": "supplier_warehouse",
"fieldtype": "Link",
"label": "Supplier Warehouse",

View File

@ -901,7 +901,7 @@ class TestPurchaseInvoice(unittest.TestCase):
)
pi = make_purchase_invoice(
item_code="_Test FG Item", qty=10, rate=500, update_stock=1, is_subcontracted="Yes"
item_code="_Test FG Item", qty=10, rate=500, update_stock=1, is_subcontracted=1
)
self.assertEqual(len(pi.get("supplied_items")), 2)
@ -1611,7 +1611,7 @@ def make_purchase_invoice(**args):
pi.conversion_rate = args.conversion_rate or 1
pi.is_return = args.is_return
pi.return_against = args.return_against
pi.is_subcontracted = args.is_subcontracted or "No"
pi.is_subcontracted = args.is_subcontracted or 0
pi.supplier_warehouse = args.supplier_warehouse or "_Test Warehouse 1 - _TC"
pi.cost_center = args.parent_cost_center
@ -1674,7 +1674,7 @@ def make_purchase_invoice_against_cost_center(**args):
pi.is_return = args.is_return
pi.is_return = args.is_return
pi.credit_to = args.return_against or "Creditors - _TC"
pi.is_subcontracted = args.is_subcontracted or "No"
pi.is_subcontracted = args.is_subcontracted or 0
if args.supplier_warehouse:
pi.supplier_warehouse = "_Test Warehouse 1 - _TC"

View File

@ -623,7 +623,7 @@
},
{
"default": "0",
"depends_on": "eval:parent.is_subcontracted == 'Yes'",
"depends_on": "eval:parent.is_subcontracted",
"fieldname": "include_exploded_items",
"fieldtype": "Check",
"label": "Include Exploded Items",

View File

@ -1412,7 +1412,7 @@ class SalesInvoice(SellingController):
)
)
else:
frappe.throw(_("Select change amount account"), title="Mandatory Field")
frappe.throw(_("Select change amount account"), title=_("Mandatory Field"))
def make_write_off_gl_entry(self, gl_entries):
# write off entries, applicable if only pos

View File

@ -201,17 +201,17 @@ def get_report_summary(
net_provisional_profit_loss += provisional_profit_loss.get(key)
return [
{"value": net_asset, "label": "Total Asset", "datatype": "Currency", "currency": currency},
{"value": net_asset, "label": _("Total Asset"), "datatype": "Currency", "currency": currency},
{
"value": net_liability,
"label": "Total Liability",
"label": _("Total Liability"),
"datatype": "Currency",
"currency": currency,
},
{"value": net_equity, "label": "Total Equity", "datatype": "Currency", "currency": currency},
{"value": net_equity, "label": _("Total Equity"), "datatype": "Currency", "currency": currency},
{
"value": net_provisional_profit_loss,
"label": "Provisional Profit / Loss (Credit)",
"label": _("Provisional Profit / Loss (Credit)"),
"indicator": "Green" if net_provisional_profit_loss > 0 else "Red",
"datatype": "Currency",
"currency": currency,

View File

@ -97,8 +97,8 @@ def get_columns(filters):
if filters["period"] == "Yearly":
labels = [
_("Budget") + " " + str(year[0]),
_("Actual ") + " " + str(year[0]),
_("Variance ") + " " + str(year[0]),
_("Actual") + " " + str(year[0]),
_("Variance") + " " + str(year[0]),
]
for label in labels:
columns.append(

View File

@ -230,7 +230,7 @@ def get_columns(dimension_list):
columns.append(
{
"fieldname": "total",
"label": "Total",
"label": _("Total"),
"fieldtype": "Currency",
"options": "currency",
"width": 150,

View File

@ -29,7 +29,7 @@ def get_columns():
"options": "Item Group",
"width": 150,
},
{"fieldname": "item", "fieldtype": "Link", "options": "Item", "label": "Item", "width": 150},
{"fieldname": "item", "fieldtype": "Link", "options": "Item", "label": _("Item"), "width": 150},
{"fieldname": "item_name", "fieldtype": "Data", "label": _("Item Name"), "width": 150},
{
"fieldname": "customer",

View File

@ -115,9 +115,9 @@ def get_columns(filters):
{"fieldname": "credit", "label": _("Credit"), "fieldtype": "Currency", "width": 140},
{"fieldname": "remarks", "label": _("Remarks"), "fieldtype": "Data", "width": 200},
{"fieldname": "age", "label": _("Age"), "fieldtype": "Int", "width": 50},
{"fieldname": "range1", "label": "0-30", "fieldtype": "Currency", "width": 140},
{"fieldname": "range2", "label": "30-60", "fieldtype": "Currency", "width": 140},
{"fieldname": "range3", "label": "60-90", "fieldtype": "Currency", "width": 140},
{"fieldname": "range1", "label": _("0-30"), "fieldtype": "Currency", "width": 140},
{"fieldname": "range2", "label": _("30-60"), "fieldtype": "Currency", "width": 140},
{"fieldname": "range3", "label": _("60-90"), "fieldtype": "Currency", "width": 140},
{"fieldname": "range4", "label": _("90 Above"), "fieldtype": "Currency", "width": 140},
{
"fieldname": "delay_in_payment",

View File

@ -302,7 +302,7 @@
"is_opening": "No",
"is_paid": 0,
"is_return": 0,
"is_subcontracted": "No",
"is_subcontracted": 0,
"items": [
{
"allow_zero_valuation_rate": 0,

View File

@ -87,7 +87,7 @@ class AssetCategory(Document):
missing_cwip_accounts_for_company.append(get_link_to_form("Company", d.company_name))
if missing_cwip_accounts_for_company:
msg = _("""To enable Capital Work in Progress Accounting, """)
msg = _("""To enable Capital Work in Progress Accounting,""") + " "
msg += _("""you must select Capital Work in Progress Account in accounts table""")
msg += "<br><br>"
msg += _("You can also set default CWIP account in Company {}").format(

View File

@ -46,10 +46,9 @@ class AssetMovement(Document):
if d.target_location:
frappe.throw(
_(
"Issuing cannot be done to a location. \
Please enter employee who has issued Asset {0}"
"Issuing cannot be done to a location. Please enter employee who has issued Asset {0}"
).format(d.asset),
title="Incorrect Movement Purpose",
title=_("Incorrect Movement Purpose"),
)
if not d.to_employee:
frappe.throw(_("Employee is required while issuing Asset {0}").format(d.asset))
@ -58,10 +57,9 @@ class AssetMovement(Document):
if d.to_employee:
frappe.throw(
_(
"Transferring cannot be done to an Employee. \
Please enter location where Asset {0} has to be transferred"
"Transferring cannot be done to an Employee. Please enter location where Asset {0} has to be transferred"
).format(d.asset),
title="Incorrect Movement Purpose",
title=_("Incorrect Movement Purpose"),
)
if not d.target_location:
frappe.throw(_("Target Location is required while transferring Asset {0}").format(d.asset))
@ -89,8 +87,7 @@ class AssetMovement(Document):
if d.to_employee and d.target_location:
frappe.throw(
_(
"Asset {0} cannot be received at a location and \
given to employee in a single movement"
"Asset {0} cannot be received at a location and given to employee in a single movement"
).format(d.asset)
)

View File

@ -32,7 +32,7 @@ frappe.ui.form.on('Asset Repair', {
refresh: function(frm) {
if (frm.doc.docstatus) {
frm.add_custom_button("View General Ledger", function() {
frm.add_custom_button(__("View General Ledger"), function() {
frappe.route_options = {
"voucher_no": frm.doc.name
};

View File

@ -37,7 +37,7 @@ class AssetValueAdjustment(Document):
_("Asset Value Adjustment cannot be posted before Asset's purchase date <b>{0}</b>.").format(
formatdate(asset_purchase_date)
),
title="Incorrect Date",
title=_("Incorrect Date"),
)
def set_difference_amount(self):

View File

@ -179,7 +179,7 @@ erpnext.buying.PurchaseOrderController = class PurchaseOrderController extends e
if (doc.status != "On Hold") {
if(flt(doc.per_received) < 100 && allow_receipt) {
cur_frm.add_custom_button(__('Purchase Receipt'), this.make_purchase_receipt, __('Create'));
if(doc.is_subcontracted==="Yes" && me.has_unsupplied_items()) {
if(doc.is_subcontracted && me.has_unsupplied_items()) {
cur_frm.add_custom_button(__('Material to Supplier'),
function() { me.make_stock_entry(); }, __("Transfer"));
}
@ -636,7 +636,7 @@ function set_schedule_date(frm) {
frappe.provide("erpnext.buying");
frappe.ui.form.on("Purchase Order", "is_subcontracted", function(frm) {
if (frm.doc.is_subcontracted === "Yes") {
if (frm.doc.is_subcontracted) {
erpnext.buying.get_default_bom(frm);
}
});

View File

@ -457,16 +457,15 @@
"fieldtype": "Column Break"
},
{
"default": "No",
"default": "0",
"fieldname": "is_subcontracted",
"fieldtype": "Select",
"fieldtype": "Check",
"in_standard_filter": 1,
"label": "Supply Raw Materials",
"options": "No\nYes",
"label": "Is Subcontracted",
"print_hide": 1
},
{
"depends_on": "eval:doc.is_subcontracted==\"Yes\"",
"depends_on": "eval:doc.is_subcontracted",
"fieldname": "supplier_warehouse",
"fieldtype": "Link",
"label": "Supplier Warehouse",

View File

@ -194,7 +194,7 @@ class PurchaseOrder(BuyingController):
)
def validate_bom_for_subcontracting_items(self):
if self.is_subcontracted == "Yes":
if self.is_subcontracted:
for item in self.items:
if not item.bom:
frappe.throw(
@ -294,7 +294,7 @@ class PurchaseOrder(BuyingController):
self.set_status(update=True, status=status)
self.update_requested_qty()
self.update_ordered_qty()
if self.is_subcontracted == "Yes":
if self.is_subcontracted:
self.update_reserved_qty_for_subcontract()
self.notify_update()
@ -311,7 +311,7 @@ class PurchaseOrder(BuyingController):
self.update_ordered_qty()
self.validate_budget()
if self.is_subcontracted == "Yes":
if self.is_subcontracted:
self.update_reserved_qty_for_subcontract()
frappe.get_doc("Authorization Control").validate_approving_authority(
@ -331,7 +331,7 @@ class PurchaseOrder(BuyingController):
if self.has_drop_ship_item():
self.update_delivered_qty_in_sales_order()
if self.is_subcontracted == "Yes":
if self.is_subcontracted:
self.update_reserved_qty_for_subcontract()
self.check_on_hold_or_closed_status()

View File

@ -390,7 +390,7 @@ class TestPurchaseOrder(FrappeTestCase):
frappe.get_doc("Item Tax Template", "Test Update Items Template - _TC").delete()
def test_update_child_uom_conv_factor_change(self):
po = create_purchase_order(item_code="_Test FG Item", is_subcontracted="Yes")
po = create_purchase_order(item_code="_Test FG Item", is_subcontracted=1)
total_reqd_qty = sum([d.get("required_qty") for d in po.as_dict().get("supplied_items")])
trans_item = json.dumps(
@ -573,7 +573,7 @@ class TestPurchaseOrder(FrappeTestCase):
automatically_fetch_payment_terms(enable=0)
def test_subcontracting(self):
po = create_purchase_order(item_code="_Test FG Item", is_subcontracted="Yes")
po = create_purchase_order(item_code="_Test FG Item", is_subcontracted=1)
self.assertEqual(len(po.get("supplied_items")), 2)
def test_warehouse_company_validation(self):
@ -617,7 +617,7 @@ class TestPurchaseOrder(FrappeTestCase):
"doctype": "Purchase Order",
"company": "_Test Company",
"supplier": "_Test Supplier",
"is_subcontracted": "No",
"is_subcontracted": 0,
"schedule_date": add_days(nowdate(), 1),
"currency": frappe.get_cached_value("Company", "_Test Company", "default_currency"),
"conversion_factor": 1,
@ -764,7 +764,7 @@ class TestPurchaseOrder(FrappeTestCase):
)
# Submit PO
po = create_purchase_order(item_code="_Test FG Item", is_subcontracted="Yes")
po = create_purchase_order(item_code="_Test FG Item", is_subcontracted=1)
bin2 = frappe.db.get_value(
"Bin",
@ -919,7 +919,7 @@ class TestPurchaseOrder(FrappeTestCase):
po = create_purchase_order(
item_code=item_code,
qty=1,
is_subcontracted="Yes",
is_subcontracted=1,
supplier_warehouse="_Test Warehouse 1 - _TC",
include_exploded_items=1,
)
@ -936,7 +936,7 @@ class TestPurchaseOrder(FrappeTestCase):
po1 = create_purchase_order(
item_code=item_code,
qty=1,
is_subcontracted="Yes",
is_subcontracted=1,
supplier_warehouse="_Test Warehouse 1 - _TC",
include_exploded_items=0,
)
@ -957,7 +957,7 @@ class TestPurchaseOrder(FrappeTestCase):
po = create_purchase_order(
item_code=item_code,
qty=order_qty,
is_subcontracted="Yes",
is_subcontracted=1,
supplier_warehouse="_Test Warehouse 1 - _TC",
)
@ -1050,7 +1050,7 @@ class TestPurchaseOrder(FrappeTestCase):
po = create_purchase_order(
item_code=item_code,
qty=order_qty,
is_subcontracted="Yes",
is_subcontracted=1,
supplier_warehouse="_Test Warehouse 1 - _TC",
do_not_save=True,
)
@ -1283,7 +1283,7 @@ def create_purchase_order(**args):
po.schedule_date = add_days(nowdate(), 1)
po.company = args.company or "_Test Company"
po.supplier = args.supplier or "_Test Supplier"
po.is_subcontracted = args.is_subcontracted or "No"
po.is_subcontracted = args.is_subcontracted or 0
po.currency = args.currency or frappe.get_cached_value("Company", po.company, "default_currency")
po.conversion_factor = args.conversion_factor or 1
po.supplier_warehouse = args.supplier_warehouse or None
@ -1309,7 +1309,7 @@ def create_purchase_order(**args):
if not args.do_not_save:
po.insert()
if not args.do_not_submit:
if po.is_subcontracted == "Yes":
if po.is_subcontracted:
supp_items = po.get("supplied_items")
for d in supp_items:
if not d.reserve_warehouse:

View File

@ -8,7 +8,7 @@
"doctype": "Purchase Order",
"base_grand_total": 5000.0,
"grand_total": 5000.0,
"is_subcontracted": "Yes",
"is_subcontracted": 1,
"naming_series": "_T-Purchase Order-",
"base_net_total": 5000.0,
"items": [
@ -42,7 +42,7 @@
"doctype": "Purchase Order",
"base_grand_total": 5000.0,
"grand_total": 5000.0,
"is_subcontracted": "No",
"is_subcontracted": 0,
"naming_series": "_T-Purchase Order-",
"base_net_total": 5000.0,
"items": [

View File

@ -572,7 +572,7 @@
"read_only": 1
},
{
"depends_on": "eval:parent.is_subcontracted == 'Yes'",
"depends_on": "eval:parent.is_subcontracted",
"fieldname": "bom",
"fieldtype": "Link",
"label": "BOM",
@ -581,7 +581,7 @@
},
{
"default": "0",
"depends_on": "eval:parent.is_subcontracted == 'Yes'",
"depends_on": "eval:parent.is_subcontracted",
"fieldname": "include_exploded_items",
"fieldtype": "Check",
"label": "Include Exploded Items",

View File

@ -773,11 +773,10 @@
"fieldtype": "Column Break"
},
{
"default": "No",
"default": "0",
"fieldname": "is_subcontracted",
"fieldtype": "Select",
"fieldtype": "Check",
"label": "Is Subcontracted",
"options": "\nYes\nNo",
"print_hide": 1
},
{

View File

@ -7,7 +7,7 @@
"doctype": "Supplier Quotation",
"base_grand_total": 5000.0,
"grand_total": 5000.0,
"is_subcontracted": "No",
"is_subcontracted": 0,
"naming_series": "_T-Supplier Quotation-",
"base_net_total": 5000.0,
"items": [

View File

@ -213,7 +213,8 @@ def make_all_scorecards(docname):
end_date = get_scorecard_date(sc.period, start_date)
if scp_count > 0:
frappe.msgprint(
_("Created {0} scorecards for {1} between: ").format(scp_count, sc.supplier)
_("Created {0} scorecards for {1} between:").format(scp_count, sc.supplier)
+ " "
+ str(first_start_date)
+ " - "
+ str(last_end_date)

View File

@ -80,6 +80,6 @@ def _get_variables(criteria):
)[0]
my_variables.append(var)
except Exception:
frappe.throw(_("Unable to find variable: ") + str(match.group(1)), InvalidFormulaVariable)
frappe.throw(_("Unable to find variable:") + " " + str(match.group(1)), InvalidFormulaVariable)
return my_variables

View File

@ -48,7 +48,7 @@ def get_chart_data(data, conditions, filters):
"data": {
"labels": labels,
"datasets": [
{"name": _("{0}").format(filters.get("period")) + _(" Purchase Value"), "values": datapoints}
{"name": _(filters.get("period")) + " " + _("Purchase Value"), "values": datapoints}
],
},
"type": "line",

View File

@ -35,7 +35,7 @@ frappe.query_reports["Subcontract Order Summary"] = {
return {
filters: {
docstatus: 1,
is_subcontracted: 'Yes',
is_subcontracted: 1,
company: frappe.query_report.get_filter_value('company')
}
}

View File

@ -45,7 +45,7 @@ def get_subcontracted_orders(report_filters):
def get_filters(report_filters):
filters = [
["Purchase Order", "docstatus", "=", 1],
["Purchase Order", "is_subcontracted", "=", "Yes"],
["Purchase Order", "is_subcontracted", "=", 1],
[
"Purchase Order",
"transaction_date",

View File

@ -78,7 +78,7 @@ def get_data(data, filters):
def get_po(filters):
record_filters = [
["is_subcontracted", "=", "Yes"],
["is_subcontracted", "=", 1],
["supplier", "=", filters.supplier],
["transaction_date", "<=", filters.to_date],
["transaction_date", ">=", filters.from_date],

View File

@ -17,7 +17,7 @@ from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
class TestSubcontractedItemToBeReceived(FrappeTestCase):
def test_pending_and_received_qty(self):
po = create_purchase_order(item_code="_Test FG Item", is_subcontracted="Yes")
po = create_purchase_order(item_code="_Test FG Item", is_subcontracted=1)
transfer_param = []
make_stock_entry(
item_code="_Test Item", target="_Test Warehouse 1 - _TC", qty=100, basic_rate=100

View File

@ -72,7 +72,7 @@ def get_po_items_to_supply(filters):
],
filters=[
["Purchase Order", "per_received", "<", "100"],
["Purchase Order", "is_subcontracted", "=", "Yes"],
["Purchase Order", "is_subcontracted", "=", 1],
["Purchase Order", "supplier", "=", filters.supplier],
["Purchase Order", "transaction_date", "<=", filters.to_date],
["Purchase Order", "transaction_date", ">=", filters.from_date],

View File

@ -19,7 +19,7 @@ from erpnext.stock.doctype.stock_entry.test_stock_entry import make_stock_entry
class TestSubcontractedItemToBeTransferred(FrappeTestCase):
def test_pending_and_transferred_qty(self):
po = create_purchase_order(
item_code="_Test FG Item", is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
item_code="_Test FG Item", is_subcontracted=1, supplier_warehouse="_Test Warehouse 1 - _TC"
)
# Material Receipt of RMs

View File

@ -2586,7 +2586,7 @@ def update_child_qty_rate(parent_doctype, trans_items, parent_doctype_name, chil
parent.update_ordered_qty()
parent.update_ordered_and_reserved_qty()
parent.update_receiving_percentage()
if parent.is_subcontracted == "Yes":
if parent.is_subcontracted:
parent.update_reserved_qty_for_subcontract()
parent.create_raw_materials_supplied("supplied_items")
parent.save()

View File

@ -167,7 +167,7 @@ class BuyingController(StockController, Subcontracting):
_("Row #{0}: Accepted Warehouse and Supplier Warehouse cannot be same").format(item.idx)
)
if item.get("from_warehouse") and self.get("is_subcontracted") == "Yes":
if item.get("from_warehouse") and self.get("is_subcontracted"):
frappe.throw(
_(
"Row #{0}: Cannot select Supplier Warehouse while suppling raw materials to subcontractor"
@ -339,10 +339,7 @@ class BuyingController(StockController, Subcontracting):
return supplied_items_cost
def validate_for_subcontracting(self):
if not self.is_subcontracted and self.sub_contracted_items:
frappe.throw(_("Please enter 'Is Subcontracted' as Yes or No"))
if self.is_subcontracted == "Yes":
if self.is_subcontracted:
if self.doctype in ["Purchase Receipt", "Purchase Invoice"] and not self.supplier_warehouse:
frappe.throw(_("Supplier Warehouse mandatory for sub-contracted {0}").format(self.doctype))
@ -363,14 +360,14 @@ class BuyingController(StockController, Subcontracting):
item.bom = None
def create_raw_materials_supplied(self, raw_material_table):
if self.is_subcontracted == "Yes":
if self.is_subcontracted:
self.set_materials_for_subcontracted_items(raw_material_table)
elif self.doctype in ["Purchase Receipt", "Purchase Invoice"]:
for item in self.get("items"):
item.rm_supp_cost = 0.0
if self.is_subcontracted == "No" and self.get("supplied_items"):
if not self.is_subcontracted and self.get("supplied_items"):
self.set("supplied_items", [])
@property
@ -803,7 +800,7 @@ class BuyingController(StockController, Subcontracting):
if self.doctype == "Material Request":
return
if hasattr(self, "is_subcontracted") and self.is_subcontracted == "Yes":
if hasattr(self, "is_subcontracted") and self.is_subcontracted:
validate_item_type(self, "is_sub_contracted_item", "subcontracted")
else:
validate_item_type(self, "is_purchase_item", "purchase")

View File

@ -407,7 +407,7 @@ class Subcontracting:
def set_consumed_qty_in_po(self):
# Update consumed qty back in the purchase order
if self.is_subcontracted != "Yes":
if not self.is_subcontracted:
return
self.__get_purchase_orders()

View File

@ -37,7 +37,7 @@ frappe.ui.form.on('LinkedIn Settings', {
let msg,color;
if (days>0){
msg = __("Your Session will be expire in ") + days + __(" days.");
msg = __("Your Session will be expire in {0} days.", [days]);
color = "green";
}
else {

View File

@ -86,7 +86,7 @@ frappe.ui.form.on('Social Media Post', {
frm.trigger('add_post_btn');
}
if (frm.doc.post_status !='Deleted') {
frm.add_custom_button(('Delete Post'), function() {
frm.add_custom_button(__('Delete Post'), function() {
frappe.confirm(__('Are you sure want to delete the Post from Social Media platforms?'),
function() {
frappe.call({

View File

@ -3,11 +3,12 @@
import frappe
from frappe import _
def execute(filters=None):
columns = [
{"fieldname": "creation_date", "label": "Date", "fieldtype": "Date", "width": 300},
{"fieldname": "creation_date", "label": _("Date"), "fieldtype": "Date", "width": 300},
{
"fieldname": "first_response_time",
"fieldtype": "Duration",

View File

@ -41,10 +41,8 @@ class CourseSchedulingTool(Document):
if self.day == calendar.day_name[getdate(date).weekday()]:
course_schedule = self.make_course_schedule(date)
try:
print("pass")
course_schedule.save()
except OverlapError:
print("fail")
course_schedules_errors.append(date)
else:
course_schedules.append(course_schedule)

View File

@ -69,13 +69,13 @@ class StudentGroupCreationTool(Document):
l = len(self.courses)
for d in self.courses:
if not d.student_group_name:
frappe.throw(_("""Student Group Name is mandatory in row {0}""".format(d.idx)))
frappe.throw(_("Student Group Name is mandatory in row {0}").format(d.idx))
if d.group_based_on == "Course" and not d.course:
frappe.throw(_("""Course is mandatory in row {0}""".format(d.idx)))
frappe.throw(_("Course is mandatory in row {0}").format(d.idx))
if d.group_based_on == "Batch" and not d.batch:
frappe.throw(_("""Batch is mandatory in row {0}""".format(d.idx)))
frappe.throw(_("Batch is mandatory in row {0}").format(d.idx))
frappe.publish_realtime(
"student_group_creation_progress", {"progress": [d.idx, l]}, user=frappe.session.user

View File

@ -87,7 +87,7 @@ def get_approvers(doctype, txt, searchfield, start, page_len, filters):
field_name, frappe.bold(employee.employee_name)
)
if department_list:
error_msg += _(" or for Department: {0}").format(frappe.bold(employee_department))
error_msg += " " + _("or for Department: {0}").format(frappe.bold(employee_department))
frappe.throw(error_msg, title=_(field_name + " Missing"))
return set(tuple(approver) for approver in approvers)

View File

@ -73,10 +73,10 @@ class ShiftAssignment(Document):
frappe.bold(self.employee), frappe.bold(self.shift_type), frappe.bold(shift_details.name)
)
if shift_details.start_date:
msg += _(" from {0}").format(getdate(self.start_date).strftime("%d-%m-%Y"))
msg += " " + _("from {0}").format(getdate(self.start_date).strftime("%d-%m-%Y"))
title = "Ongoing Shift"
if shift_details.end_date:
msg += _(" to {0}").format(getdate(self.end_date).strftime("%d-%m-%Y"))
msg += " " + _("to {0}").format(getdate(self.end_date).strftime("%d-%m-%Y"))
title = "Active Shift"
if msg:
frappe.throw(msg, title=title)

View File

@ -109,7 +109,7 @@ class ShiftRequest(Document):
self.throw_overlap_error(date_overlap)
def throw_overlap_error(self, d):
msg = _("Employee {0} has already applied for {1} between {2} and {3} : ").format(
msg = _("Employee {0} has already applied for {1} between {2} and {3}").format(
self.employee, d["shift_type"], formatdate(d["from_date"]), formatdate(d["to_date"])
) + """ <b><a href="/app/Form/Shift Request/{0}">{0}</a></b>""".format(d["name"])
) + """ : <b><a href="/app/Form/Shift Request/{0}">{0}</a></b>""".format(d["name"])
frappe.throw(msg, OverlapError)

View File

@ -91,8 +91,7 @@ class StaffingPlan(Document):
) > flt(parent_plan_details[0].total_estimated_cost):
frappe.throw(
_(
"You can only plan for upto {0} vacancies and budget {1} \
for {2} as per staffing plan {3} for parent company {4}."
"You can only plan for upto {0} vacancies and budget {1} for {2} as per staffing plan {3} for parent company {4}."
).format(
cint(parent_plan_details[0].vacancies),
parent_plan_details[0].total_estimated_cost,
@ -128,8 +127,7 @@ class StaffingPlan(Document):
):
frappe.throw(
_(
"{0} vacancies and {1} budget for {2} already planned for subsidiary companies of {3}. \
You can only plan for upto {4} vacancies and and budget {5} as per staffing plan {6} for parent company {3}."
"{0} vacancies and {1} budget for {2} already planned for subsidiary companies of {3}. You can only plan for upto {4} vacancies and and budget {5} as per staffing plan {6} for parent company {3}."
).format(
cint(all_sibling_details.vacancies),
all_sibling_details.total_estimated_cost,
@ -162,8 +160,7 @@ class StaffingPlan(Document):
):
frappe.throw(
_(
"Subsidiary companies have already planned for {1} vacancies at a budget of {2}. \
Staffing Plan for {0} should allocate more vacancies and budget for {3} than planned for its subsidiary companies"
"Subsidiary companies have already planned for {1} vacancies at a budget of {2}. Staffing Plan for {0} should allocate more vacancies and budget for {3} than planned for its subsidiary companies"
).format(
self.company,
cint(children_details.vacancies),

View File

@ -387,13 +387,13 @@ class LoanRepayment(AccountsController):
gle_map = []
if self.shortfall_amount and self.amount_paid > self.shortfall_amount:
remarks = _("Shortfall Repayment of {0}.\nRepayment against Loan: {1}").format(
remarks = _("Shortfall Repayment of {0}.<br>Repayment against Loan: {1}").format(
self.shortfall_amount, self.against_loan
)
elif self.shortfall_amount:
remarks = _("Shortfall Repayment of {0}").format(self.shortfall_amount)
else:
remarks = _("Repayment against Loan: ") + self.against_loan
remarks = _("Repayment against Loan:") + " " + self.against_loan
if self.repay_from_salary:
payment_account = self.payroll_payable_account

View File

@ -250,7 +250,7 @@ class MaintenanceSchedule(TransactionBase):
_("Serial No {0} does not belong to Item {1}").format(
frappe.bold(serial_no), frappe.bold(item_code)
),
title="Invalid",
title=_("Invalid"),
)
if sr_details.warranty_expiry_date and getdate(sr_details.warranty_expiry_date) >= getdate(

View File

@ -20,7 +20,7 @@ class MaintenanceVisit(TransactionBase):
def validate_purpose_table(self):
if not self.purposes:
frappe.throw(_("Add Items in the Purpose Table"), title="Purposes Required")
frappe.throw(_("Add Items in the Purpose Table"), title=_("Purposes Required"))
def validate_maintenance_date(self):
if self.maintenance_type == "Scheduled" and self.maintenance_schedule_detail:

View File

@ -251,7 +251,7 @@ class TestBOM(FrappeTestCase):
self.assertEqual(bom.items[2].rate, 0)
# test in Purchase Order sourced_by_supplier is not added to Supplied Item
po = create_purchase_order(
item_code=item_code, qty=1, is_subcontracted="Yes", supplier_warehouse="_Test Warehouse 1 - _TC"
item_code=item_code, qty=1, is_subcontracted=1, supplier_warehouse="_Test Warehouse 1 - _TC"
)
bom_items = sorted([d.item_code for d in bom.items if d.sourced_by_supplier != 1])
supplied_items = sorted([d.rm_item_code for d in po.supplied_items])

View File

@ -501,7 +501,7 @@ class ProductionPlan(Document):
po = frappe.new_doc("Purchase Order")
po.supplier = supplier
po.schedule_date = getdate(po_list[0].schedule_date) if po_list[0].schedule_date else nowdate()
po.is_subcontracted = "Yes"
po.is_subcontracted = 1
for row in po_list:
po_data = {
"item_code": row.production_item,

View File

@ -3,6 +3,7 @@
import frappe
from frappe import _
def execute(filters=None):
@ -46,17 +47,22 @@ def get_exploded_items(bom, data, indent=0, qty=1):
def get_columns():
return [
{
"label": "Item Code",
"label": _("Item Code"),
"fieldtype": "Link",
"fieldname": "item_code",
"width": 300,
"options": "Item",
},
{"label": "Item Name", "fieldtype": "data", "fieldname": "item_name", "width": 100},
{"label": "BOM", "fieldtype": "Link", "fieldname": "bom", "width": 150, "options": "BOM"},
{"label": "Qty", "fieldtype": "data", "fieldname": "qty", "width": 100},
{"label": "UOM", "fieldtype": "data", "fieldname": "uom", "width": 100},
{"label": "BOM Level", "fieldtype": "Int", "fieldname": "bom_level", "width": 100},
{"label": "Standard Description", "fieldtype": "data", "fieldname": "description", "width": 150},
{"label": "Scrap", "fieldtype": "data", "fieldname": "scrap", "width": 100},
{"label": _("Item Name"), "fieldtype": "data", "fieldname": "item_name", "width": 100},
{"label": _("BOM"), "fieldtype": "Link", "fieldname": "bom", "width": 150, "options": "BOM"},
{"label": _("Qty"), "fieldtype": "data", "fieldname": "qty", "width": 100},
{"label": _("UOM"), "fieldtype": "data", "fieldname": "uom", "width": 100},
{"label": _("BOM Level"), "fieldtype": "Int", "fieldname": "bom_level", "width": 100},
{
"label": _("Standard Description"),
"fieldtype": "data",
"fieldname": "description",
"width": 150,
},
{"label": _("Scrap"), "fieldtype": "data", "fieldname": "scrap", "width": 100},
]

View File

@ -3,6 +3,7 @@
import frappe
from frappe import _
from frappe.utils import flt
@ -114,28 +115,28 @@ def get_purchase_order_details(filters, order_details):
def get_column(filters):
return [
{
"label": "Finished Good",
"label": _("Finished Good"),
"fieldtype": "Link",
"fieldname": "item_code",
"width": 300,
"options": "Item",
},
{"label": "Item Name", "fieldtype": "data", "fieldname": "item_name", "width": 100},
{"label": _("Item Name"), "fieldtype": "data", "fieldname": "item_name", "width": 100},
{
"label": "Document Type",
"label": _("Document Type"),
"fieldtype": "Link",
"fieldname": "document_type",
"width": 150,
"options": "DocType",
},
{
"label": "Document Name",
"label": _("Document Name"),
"fieldtype": "Dynamic Link",
"fieldname": "document_name",
"width": 150,
},
{"label": "BOM Level", "fieldtype": "Int", "fieldname": "bom_level", "width": 100},
{"label": "Order Qty", "fieldtype": "Float", "fieldname": "qty", "width": 120},
{"label": "Received Qty", "fieldtype": "Float", "fieldname": "produced_qty", "width": 160},
{"label": "Pending Qty", "fieldtype": "Float", "fieldname": "pending_qty", "width": 110},
{"label": _("BOM Level"), "fieldtype": "Int", "fieldname": "bom_level", "width": 100},
{"label": _("Order Qty"), "fieldtype": "Float", "fieldname": "qty", "width": 120},
{"label": _("Received Qty"), "fieldtype": "Float", "fieldname": "produced_qty", "width": 160},
{"label": _("Pending Qty"), "fieldtype": "Float", "fieldname": "pending_qty", "width": 110},
]

View File

@ -3,6 +3,7 @@
import frappe
from frappe import _
from frappe.utils import cint
@ -99,59 +100,65 @@ def get_columns():
columns = [
{
"fieldname": "work_order",
"label": "Work Order",
"label": _("Work Order"),
"fieldtype": "Link",
"options": "Work Order",
"width": 110,
},
{"fieldname": "bom_no", "label": "BOM", "fieldtype": "Link", "options": "BOM", "width": 120},
{"fieldname": "bom_no", "label": _("BOM"), "fieldtype": "Link", "options": "BOM", "width": 120},
{
"fieldname": "description",
"label": "Description",
"label": _("Description"),
"fieldtype": "Data",
"options": "",
"width": 230,
},
{
"fieldname": "item_code",
"label": "Item Code",
"label": _("Item Code"),
"fieldtype": "Link",
"options": "Item",
"width": 110,
},
{
"fieldname": "source_warehouse",
"label": "Source Warehouse",
"label": _("Source Warehouse"),
"fieldtype": "Link",
"options": "Warehouse",
"width": 110,
},
{"fieldname": "qty", "label": "Qty to Build", "fieldtype": "Data", "options": "", "width": 110},
{"fieldname": "status", "label": "Status", "fieldtype": "Data", "options": "", "width": 100},
{
"fieldname": "qty",
"label": _("Qty to Build"),
"fieldtype": "Data",
"options": "",
"width": 110,
},
{"fieldname": "status", "label": _("Status"), "fieldtype": "Data", "options": "", "width": 100},
{
"fieldname": "req_items",
"label": "# Req'd Items",
"label": _("# Req'd Items"),
"fieldtype": "Data",
"options": "",
"width": 105,
},
{
"fieldname": "instock",
"label": "# In Stock",
"label": _("# In Stock"),
"fieldtype": "Data",
"options": "",
"width": 105,
},
{
"fieldname": "buildable_qty",
"label": "Buildable Qty",
"label": _("Buildable Qty"),
"fieldtype": "Data",
"options": "",
"width": 100,
},
{
"fieldname": "ready_to_build",
"label": "Build All?",
"label": _("Build All?"),
"fieldtype": "Data",
"options": "",
"width": 90,

View File

@ -4,6 +4,7 @@ erpnext.patches.v11_0.rename_production_order_to_work_order
erpnext.patches.v13_0.add_bin_unique_constraint
erpnext.patches.v11_0.refactor_naming_series
erpnext.patches.v11_0.refactor_autoname_naming
erpnext.patches.v14_0.change_is_subcontracted_fieldtype
execute:frappe.reload_doc("accounts", "doctype", "POS Payment Method") #2020-05-28
execute:frappe.reload_doc("HR", "doctype", "HR Settings") #2020-01-16 #2020-07-24
erpnext.patches.v4_2.update_requested_and_ordered_qty #2021-03-31

View File

@ -0,0 +1,26 @@
# Copyright (c) 2022, Frappe Technologies Pvt. Ltd. and contributors
# For license information, please see license.txt
import frappe
def execute():
for doctype in ["Purchase Order", "Purchase Receipt", "Purchase Invoice", "Supplier Quotation"]:
frappe.db.sql(
"""
UPDATE `tab{doctype}`
SET is_subcontracted = 0
where is_subcontracted in ('', NULL, 'No')""".format(
doctype=doctype
)
)
frappe.db.sql(
"""
UPDATE `tab{doctype}`
SET is_subcontracted = 1
where is_subcontracted = 'Yes'""".format(
doctype=doctype
)
)
frappe.reload_doc(frappe.get_meta(doctype).module, "doctype", frappe.scrub(doctype))

View File

@ -44,8 +44,7 @@ class EmployeeBenefitClaim(Document):
if max_benefits < claimed_amount:
frappe.throw(
_(
"Maximum benefit of employee {0} exceeds {1} by the sum {2} of previous claimed\
amount"
"Maximum benefit of employee {0} exceeds {1} by the sum {2} of previous claimed amount"
).format(self.employee, max_benefits, claimed_amount - max_benefits)
)
@ -84,8 +83,7 @@ class EmployeeBenefitClaim(Document):
if max_benefits < pro_rata_amount + claimed_amount:
frappe.throw(
_(
"Maximum benefit of employee {0} exceeds {1} by the sum {2} of benefit application pro-rata component\
amount and previous claimed amount"
"Maximum benefit of employee {0} exceeds {1} by the sum {2} of benefit application pro-rata component amount and previous claimed amount"
).format(
self.employee, max_benefits, pro_rata_amount + claimed_amount - max_benefits
)

View File

@ -34,7 +34,7 @@ frappe.ui.form.on('Gratuity Rule Slab', {
to_year(frm, cdt, cdn) {
let row = locals[cdt][cdn];
if (row.to_year <= row.from_year && row.to_year === 0) {
frappe.throw(__("To(Year) year can not be less than From(year) "));
frappe.throw(__("To(Year) year can not be less than From(year)"));
}
}
});

View File

@ -112,7 +112,7 @@ frappe.ui.form.on('Payroll Entry', {
},
callback: function (r) {
if (r.message && !r.message.submitted) {
frm.add_custom_button("Make Bank Entry", function () {
frm.add_custom_button(__("Make Bank Entry"), function () {
make_bank_entry(frm);
}).addClass("btn-primary");
}

View File

@ -142,21 +142,21 @@ def get_report_summary(gross_pay, total_deductions, net_pay, currency):
return [
{
"value": gross_pay,
"label": "Total Gross Pay",
"label": _("Total Gross Pay"),
"indicator": "Green",
"datatype": "Currency",
"currency": currency,
},
{
"value": total_deductions,
"label": "Total Deduction",
"label": _("Total Deduction"),
"datatype": "Currency",
"indicator": "Red",
"currency": currency,
},
{
"value": net_pay,
"label": "Total Net Pay",
"label": _("Total Net Pay"),
"datatype": "Currency",
"indicator": "Blue",
"currency": currency,

View File

@ -3,6 +3,7 @@
import frappe
from frappe import _
from frappe.utils import date_diff, nowdate
@ -83,19 +84,24 @@ def get_chart_data(data):
def get_columns():
columns = [
{"fieldname": "name", "fieldtype": "Link", "label": "Task", "options": "Task", "width": 150},
{"fieldname": "subject", "fieldtype": "Data", "label": "Subject", "width": 200},
{"fieldname": "status", "fieldtype": "Data", "label": "Status", "width": 100},
{"fieldname": "priority", "fieldtype": "Data", "label": "Priority", "width": 80},
{"fieldname": "progress", "fieldtype": "Data", "label": "Progress (%)", "width": 120},
{"fieldname": "name", "fieldtype": "Link", "label": _("Task"), "options": "Task", "width": 150},
{"fieldname": "subject", "fieldtype": "Data", "label": _("Subject"), "width": 200},
{"fieldname": "status", "fieldtype": "Data", "label": _("Status"), "width": 100},
{"fieldname": "priority", "fieldtype": "Data", "label": _("Priority"), "width": 80},
{"fieldname": "progress", "fieldtype": "Data", "label": _("Progress (%)"), "width": 120},
{
"fieldname": "exp_start_date",
"fieldtype": "Date",
"label": "Expected Start Date",
"label": _("Expected Start Date"),
"width": 150,
},
{"fieldname": "exp_end_date", "fieldtype": "Date", "label": "Expected End Date", "width": 150},
{"fieldname": "completed_on", "fieldtype": "Date", "label": "Actual End Date", "width": 130},
{"fieldname": "delay", "fieldtype": "Data", "label": "Delay (In Days)", "width": 120},
{
"fieldname": "exp_end_date",
"fieldtype": "Date",
"label": _("Expected End Date"),
"width": 150,
},
{"fieldname": "completed_on", "fieldtype": "Date", "label": _("Actual End Date"), "width": 130},
{"fieldname": "delay", "fieldtype": "Data", "label": _("Delay (In Days)"), "width": 120},
]
return columns

View File

@ -81,7 +81,7 @@ erpnext.buying.BuyingController = class BuyingController extends erpnext.Transac
}
this.frm.set_query("item_code", "items", function() {
if (me.frm.doc.is_subcontracted == "Yes") {
if (me.frm.doc.is_subcontracted) {
return{
query: "erpnext.controllers.queries.item_query",
filters:{ 'supplier': me.frm.doc.supplier, 'is_sub_contracted_item': 1 }

View File

@ -239,7 +239,7 @@ erpnext.TransactionController = class TransactionController extends erpnext.taxe
() => set_value('currency', currency),
() => set_value('price_list_currency', currency),
() => set_value('status', 'Draft'),
() => set_value('is_subcontracted', 'No'),
() => set_value('is_subcontracted', 0),
() => {
if(this.frm.doc.company && !this.frm.doc.amended_from) {
this.frm.trigger("company");

View File

@ -483,7 +483,7 @@ erpnext.utils.update_child_items = function(opts) {
if (frm.doc.doctype == 'Sales Order') {
filters = {"is_sales_item": 1};
} else if (frm.doc.doctype == 'Purchase Order') {
if (frm.doc.is_subcontracted == "Yes") {
if (frm.doc.is_subcontracted) {
filters = {"is_sub_contracted_item": 1};
} else {
filters = {"is_purchase_item": 1};

View File

@ -3,6 +3,6 @@
frappe.ui.form.on('DATEV Settings', {
refresh: function(frm) {
frm.add_custom_button('Show Report', () => frappe.set_route('query-report', 'DATEV'), "fa fa-table");
frm.add_custom_button(__('Show Report'), () => frappe.set_route('query-report', 'DATEV'), "fa fa-table");
}
});

View File

@ -727,7 +727,7 @@ erpnext.selling.SalesOrderController = class SalesOrderController extends erpnex
args: {
reference_doctype: me.frm.doctype,
reference_name: me.frm.docname,
content: __('Reason for hold: ')+data.reason_for_hold,
content: __('Reason for hold:') + ' ' + data.reason_for_hold,
comment_email: frappe.session.user,
comment_by: frappe.session.user_fullname
},

View File

@ -243,7 +243,7 @@ erpnext.PointOfSale.ItemSelector = class {
value: "+1",
item: { item_code, batch_no, serial_no, uom, rate }
});
me.set_search_value('');
me.search_field.set_focus();
});
this.search_field.$input.on('input', (e) => {
@ -328,6 +328,7 @@ erpnext.PointOfSale.ItemSelector = class {
add_filtered_item_to_cart() {
this.$items_container.find(".item-wrapper").click();
this.set_search_value('');
}
resize_selector(minimize) {

View File

@ -102,7 +102,7 @@ def get_data_by_time(filters, common_columns):
def get_data_by_territory(filters, common_columns):
columns = [
{
"label": "Territory",
"label": _("Territory"),
"fieldname": "territory",
"fieldtype": "Link",
"options": "Territory",

View File

@ -65,7 +65,7 @@ def get_columns(customer_naming_type):
_("Credit Limit") + ":Currency:120",
_("Outstanding Amt") + ":Currency:100",
_("Credit Balance") + ":Currency:120",
_("Bypass credit check at Sales Order ") + ":Check:80",
_("Bypass credit check at Sales Order") + ":Check:80",
_("Is Frozen") + ":Check:80",
_("Disabled") + ":Check:80",
]

View File

@ -235,7 +235,7 @@ def get_chart_data(data):
return {
"data": {
"labels": labels[:30], # show max of 30 items in chart
"datasets": [{"name": _(" Total Sales Amount"), "values": datapoints[:30]}],
"datasets": [{"name": _("Total Sales Amount"), "values": datapoints[:30]}],
},
"type": "bar",
}

View File

@ -49,7 +49,7 @@ def get_chart_data(data, conditions, filters):
"data": {
"labels": labels,
"datasets": [
{"name": _("{0}").format(filters.get("period")) + _(" Quoted Amount"), "values": datapoints}
{"name": _(filters.get("period")) + " " + _("Quoted Amount"), "values": datapoints}
],
},
"type": "line",

View File

@ -47,9 +47,7 @@ def get_chart_data(data, conditions, filters):
return {
"data": {
"labels": labels,
"datasets": [
{"name": _("{0}").format(filters.get("period")) + _(" Sales Value"), "values": datapoints}
],
"datasets": [{"name": _(filters.get("period")) + " " + _("Sales Value"), "values": datapoints}],
},
"type": "line",
"lineOptions": {"regionFill": 1},

View File

@ -54,7 +54,7 @@ class Bin(Document):
(supplied_item.rm_item_code == self.item_code)
& (po.name == supplied_item.parent)
& (po.docstatus == 1)
& (po.is_subcontracted == "Yes")
& (po.is_subcontracted)
& (po.status != "Closed")
& (po.per_received < 100)
& (supplied_item.reserve_warehouse == self.warehouse)
@ -79,7 +79,7 @@ class Bin(Document):
& (se.name == se_item.parent)
& (po.name == se.purchase_order)
& (po.docstatus == 1)
& (po.is_subcontracted == "Yes")
& (po.is_subcontracted == 1)
& (po.status != "Closed")
& (po.per_received < 100)
)

View File

@ -464,7 +464,7 @@ class Item(Document):
frappe.msgprint(
_("It can take upto few hours for accurate stock values to be visible after merging items."),
indicator="orange",
title="Note",
title=_("Note"),
)
if self.published_in_website:

View File

@ -41,7 +41,7 @@ class TestItemAlternative(FrappeTestCase):
supplier_warehouse = "Test Supplier Warehouse - _TC"
po = create_purchase_order(
item="Test Finished Goods - A",
is_subcontracted="Yes",
is_subcontracted=1,
qty=5,
rate=3000,
supplier_warehouse=supplier_warehouse,

View File

@ -209,16 +209,14 @@ class MaterialRequest(BuyingController):
if d.ordered_qty and d.ordered_qty > allowed_qty:
frappe.throw(
_(
"The total Issue / Transfer quantity {0} in Material Request {1} \
cannot be greater than allowed requested quantity {2} for Item {3}"
"The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than allowed requested quantity {2} for Item {3}"
).format(d.ordered_qty, d.parent, allowed_qty, d.item_code)
)
elif d.ordered_qty and d.ordered_qty > d.stock_qty:
frappe.throw(
_(
"The total Issue / Transfer quantity {0} in Material Request {1} \
cannot be greater than requested quantity {2} for Item {3}"
"The total Issue / Transfer quantity {0} in Material Request {1} cannot be greater than requested quantity {2} for Item {3}"
).format(d.ordered_qty, d.parent, d.qty, d.item_code)
)

View File

@ -33,7 +33,9 @@ class PickList(Document):
location.sales_order
and frappe.db.get_value("Sales Order", location.sales_order, "per_picked") == 100
):
frappe.throw("Row " + str(location.idx) + " has been picked already!")
frappe.throw(
_("Row #{}: item {} has been picked already.").format(location.idx, location.item_code)
)
def before_submit(self):
for item in self.locations:
@ -82,10 +84,9 @@ class PickList(Document):
100 + flt(frappe.db.get_single_value("Stock Settings", "over_delivery_receipt_allowance"))
):
frappe.throw(
"You are picking more than required quantity for "
+ item_code
+ ". Check if there is any other pick list created for "
+ so_doc.name
_(
"You are picking more than required quantity for {}. Check if there is any other pick list created for {}"
).format(item_code, so_doc.name)
)
frappe.db.set_value("Sales Order Item", so_item, "picked_qty", already_picked + picked_qty)

View File

@ -200,7 +200,7 @@ erpnext.stock.PurchaseReceiptController = class PurchaseReceiptController extend
cur_frm.add_custom_button(__('Reopen'), this.reopen_purchase_receipt, __("Status"))
}
this.frm.toggle_reqd("supplier_warehouse", this.frm.doc.is_subcontracted==="Yes");
this.frm.toggle_reqd("supplier_warehouse", this.frm.doc.is_subcontracted);
}
make_purchase_invoice() {
@ -298,10 +298,10 @@ cur_frm.fields_dict['items'].grid.get_field('bom').get_query = function(doc, cdt
frappe.provide("erpnext.buying");
frappe.ui.form.on("Purchase Receipt", "is_subcontracted", function(frm) {
if (frm.doc.is_subcontracted === "Yes") {
if (frm.doc.is_subcontracted) {
erpnext.buying.get_default_bom(frm);
}
frm.toggle_reqd("supplier_warehouse", frm.doc.is_subcontracted==="Yes");
frm.toggle_reqd("supplier_warehouse", frm.doc.is_subcontracted);
});
frappe.ui.form.on('Purchase Receipt Item', {

View File

@ -437,17 +437,16 @@
"fieldtype": "Column Break"
},
{
"default": "No",
"default": "0",
"fieldname": "is_subcontracted",
"fieldtype": "Select",
"label": "Raw Materials Consumed",
"fieldtype": "Check",
"label": "Is Subcontracted",
"oldfieldname": "is_subcontracted",
"oldfieldtype": "Select",
"options": "No\nYes",
"print_hide": 1
},
{
"depends_on": "eval:doc.is_subcontracted==\"Yes\"",
"depends_on": "eval:doc.is_subcontracted",
"fieldname": "supplier_warehouse",
"fieldtype": "Link",
"label": "Supplier Warehouse",

View File

@ -327,7 +327,7 @@ class TestPurchaseReceipt(FrappeTestCase):
target="_Test Warehouse 1 - _TC",
basic_rate=100,
)
pr = make_purchase_receipt(item_code="_Test FG Item", qty=10, rate=500, is_subcontracted="Yes")
pr = make_purchase_receipt(item_code="_Test FG Item", qty=10, rate=500, is_subcontracted=1)
self.assertEqual(len(pr.get("supplied_items")), 2)
rm_supp_cost = sum(d.amount for d in pr.get("supplied_items"))
@ -362,7 +362,7 @@ class TestPurchaseReceipt(FrappeTestCase):
item_code="_Test FG Item",
qty=10,
rate=0,
is_subcontracted="Yes",
is_subcontracted=1,
company="_Test Company with perpetual inventory",
warehouse="Stores - TCP1",
supplier_warehouse="Work In Progress - TCP1",
@ -401,7 +401,7 @@ class TestPurchaseReceipt(FrappeTestCase):
item_code=item_code,
qty=1,
include_exploded_items=0,
is_subcontracted="Yes",
is_subcontracted=1,
supplier_warehouse="_Test Warehouse 1 - _TC",
)
@ -1122,7 +1122,7 @@ class TestPurchaseReceipt(FrappeTestCase):
po = create_purchase_order(
item_code=item_code,
qty=order_qty,
is_subcontracted="Yes",
is_subcontracted=1,
supplier_warehouse="_Test Warehouse 1 - _TC",
)
@ -1465,7 +1465,7 @@ def make_purchase_receipt(**args):
pr.set_posting_time = 1
pr.company = args.company or "_Test Company"
pr.supplier = args.supplier or "_Test Supplier"
pr.is_subcontracted = args.is_subcontracted or "No"
pr.is_subcontracted = args.is_subcontracted or 0
pr.supplier_warehouse = args.supplier_warehouse or "_Test Warehouse 1 - _TC"
pr.currency = args.currency or "INR"
pr.is_return = args.is_return

View File

@ -92,7 +92,7 @@
"currency": "INR",
"doctype": "Purchase Receipt",
"base_grand_total": 5000.0,
"is_subcontracted": "Yes",
"is_subcontracted": 1,
"base_net_total": 5000.0,
"items": [
{

View File

@ -648,7 +648,7 @@
},
{
"default": "0",
"depends_on": "eval:parent.is_subcontracted == 'Yes'",
"depends_on": "eval:parent.is_subcontracted",
"fieldname": "include_exploded_items",
"fieldtype": "Check",
"label": "Include Exploded Items",

View File

@ -214,7 +214,7 @@ frappe.ui.form.on('Stock Entry', {
if (frm.doc.docstatus === 1) {
if (frm.doc.add_to_transit && frm.doc.purpose=='Material Transfer' && frm.doc.per_transferred < 100) {
frm.add_custom_button('End Transit', function() {
frm.add_custom_button(__('End Transit'), function() {
frappe.model.open_mapped_doc({
method: "erpnext.stock.doctype.stock_entry.stock_entry.make_stock_in_entry",
frm: frm
@ -633,7 +633,7 @@ frappe.ui.form.on('Stock Entry Detail', {
// set allow_zero_valuation_rate to 0 if s_warehouse is selected.
let item = frappe.get_doc(cdt, cdn);
if (item.s_warehouse) {
item.allow_zero_valuation_rate = 0;
frappe.model.set_value(cdt, cdn, "allow_zero_valuation_rate", 0);
}
},
@ -778,7 +778,7 @@ erpnext.stock.StockEntry = class StockEntry extends erpnext.stock.StockControlle
return {
"filters": {
"docstatus": 1,
"is_subcontracted": "Yes",
"is_subcontracted": 1,
"company": me.frm.doc.company
}
};

View File

@ -436,7 +436,7 @@ class TestStockLedgerEntry(FrappeTestCase):
item_code=subcontracted_item,
qty=10,
rate=20,
is_subcontracted="Yes",
is_subcontracted=1,
)
self.assertEqual(pr1.items[0].valuation_rate, 120)

View File

@ -55,6 +55,25 @@ frappe.ui.form.on("Stock Reconciliation", {
}
},
scan_barcode: function(frm) {
const barcode_scanner = new erpnext.utils.BarcodeScanner({frm:frm});
barcode_scanner.process_scan();
},
scan_mode: function(frm) {
if (frm.doc.scan_mode) {
frappe.show_alert({
message: __("Scan mode enabled, existing quantity will not be fetched."),
indicator: "green"
});
}
},
set_warehouse: function(frm) {
let transaction_controller = new erpnext.TransactionController({frm:frm});
transaction_controller.autofill_warehouse(frm.doc.items, "warehouse", frm.doc.set_warehouse);
},
get_items: function(frm) {
let fields = [
{
@ -148,15 +167,18 @@ frappe.ui.form.on("Stock Reconciliation", {
batch_no: d.batch_no
},
callback: function(r) {
frappe.model.set_value(cdt, cdn, "qty", r.message.qty);
const row = frappe.model.get_doc(cdt, cdn);
if (!frm.doc.scan_mode) {
frappe.model.set_value(cdt, cdn, "qty", r.message.qty);
}
frappe.model.set_value(cdt, cdn, "valuation_rate", r.message.rate);
frappe.model.set_value(cdt, cdn, "current_qty", r.message.qty);
frappe.model.set_value(cdt, cdn, "current_valuation_rate", r.message.rate);
frappe.model.set_value(cdt, cdn, "current_amount", r.message.rate * r.message.qty);
frappe.model.set_value(cdt, cdn, "amount", r.message.rate * r.message.qty);
frappe.model.set_value(cdt, cdn, "amount", row.qty * row.valuation_rate);
frappe.model.set_value(cdt, cdn, "current_serial_no", r.message.serial_nos);
if (frm.doc.purpose == "Stock Reconciliation") {
if (frm.doc.purpose == "Stock Reconciliation" && !frm.doc.scan_mode) {
frappe.model.set_value(cdt, cdn, "serial_no", r.message.serial_nos);
}
}
@ -204,7 +226,7 @@ frappe.ui.form.on("Stock Reconciliation Item", {
warehouse: function(frm, cdt, cdn) {
var child = locals[cdt][cdn];
if (child.batch_no) {
if (child.batch_no && !frm.doc.scan_mode) {
frappe.model.set_value(child.cdt, child.cdn, "batch_no", "");
}
@ -213,7 +235,7 @@ frappe.ui.form.on("Stock Reconciliation Item", {
item_code: function(frm, cdt, cdn) {
var child = locals[cdt][cdn];
if (child.batch_no) {
if (child.batch_no && !frm.doc.scan_mode) {
frappe.model.set_value(cdt, cdn, "batch_no", "");
}
@ -239,7 +261,14 @@ frappe.ui.form.on("Stock Reconciliation Item", {
const serial_nos = child.serial_no.trim().split('\n');
frappe.model.set_value(cdt, cdn, "qty", serial_nos.length);
}
}
},
items_add: function(frm, cdt, cdn) {
var item = frappe.get_doc(cdt, cdn);
if (!item.warehouse && frm.doc.set_warehouse) {
frappe.model.set_value(cdt, cdn, "warehouse", frm.doc.set_warehouse);
}
},
});

View File

@ -14,6 +14,12 @@
"posting_date",
"posting_time",
"set_posting_time",
"section_break_8",
"set_warehouse",
"section_break_22",
"scan_barcode",
"column_break_12",
"scan_mode",
"sb9",
"items",
"section_break_9",
@ -139,13 +145,44 @@
{
"fieldname": "dimension_col_break",
"fieldtype": "Column Break"
},
{
"fieldname": "section_break_8",
"fieldtype": "Section Break"
},
{
"fieldname": "scan_barcode",
"fieldtype": "Data",
"label": "Scan Barcode",
"options": "Barcode"
},
{
"default": "0",
"description": "Disables auto-fetching of existing quantity",
"fieldname": "scan_mode",
"fieldtype": "Check",
"label": "Scan Mode"
},
{
"fieldname": "set_warehouse",
"fieldtype": "Link",
"label": "Default Warehouse",
"options": "Warehouse"
},
{
"fieldname": "section_break_22",
"fieldtype": "Section Break"
},
{
"fieldname": "column_break_12",
"fieldtype": "Column Break"
}
],
"icon": "fa fa-upload-alt",
"idx": 1,
"is_submittable": 1,
"links": [],
"modified": "2022-02-06 14:28:19.043905",
"modified": "2022-03-27 08:57:47.161959",
"modified_by": "Administrator",
"module": "Stock",
"name": "Stock Reconciliation",

View File

@ -1,6 +1,7 @@
# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
from typing import Optional
import frappe
from frappe import _, msgprint
@ -706,29 +707,43 @@ def get_itemwise_batch(warehouse, posting_date, company, item_code=None):
@frappe.whitelist()
def get_stock_balance_for(
item_code, warehouse, posting_date, posting_time, batch_no=None, with_valuation_rate=True
item_code: str,
warehouse: str,
posting_date: str,
posting_time: str,
batch_no: Optional[str] = None,
with_valuation_rate: bool = True,
):
frappe.has_permission("Stock Reconciliation", "write", throw=True)
item_dict = frappe.db.get_value("Item", item_code, ["has_serial_no", "has_batch_no"], as_dict=1)
item_dict = frappe.get_cached_value(
"Item", item_code, ["has_serial_no", "has_batch_no"], as_dict=1
)
if not item_dict:
# In cases of data upload to Items table
msg = _("Item {} does not exist.").format(item_code)
frappe.throw(msg, title=_("Missing"))
serial_nos = ""
with_serial_no = True if item_dict.get("has_serial_no") else False
serial_nos = None
has_serial_no = bool(item_dict.get("has_serial_no"))
has_batch_no = bool(item_dict.get("has_batch_no"))
if not batch_no and has_batch_no:
# Not enough information to fetch data
return {"qty": 0, "rate": 0, "serial_nos": None}
# TODO: fetch only selected batch's values
data = get_stock_balance(
item_code,
warehouse,
posting_date,
posting_time,
with_valuation_rate=with_valuation_rate,
with_serial_no=with_serial_no,
with_serial_no=has_serial_no,
)
if with_serial_no:
if has_serial_no:
qty, rate, serial_nos = data
else:
qty, rate = data

View File

@ -16,15 +16,15 @@
"amount",
"allow_zero_valuation_rate",
"serial_no_and_batch_section",
"serial_no",
"column_break_11",
"batch_no",
"column_break_11",
"serial_no",
"section_break_3",
"current_qty",
"current_serial_no",
"current_amount",
"column_break_9",
"current_valuation_rate",
"current_amount",
"current_serial_no",
"section_break_14",
"quantity_difference",
"column_break_16",
@ -181,7 +181,7 @@
],
"istable": 1,
"links": [],
"modified": "2021-05-21 12:13:33.041266",
"modified": "2022-04-02 04:19:40.380587",
"modified_by": "Administrator",
"module": "Stock",
"name": "Stock Reconciliation Item",
@ -190,5 +190,6 @@
"quick_entry": 1,
"sort_field": "modified",
"sort_order": "DESC",
"states": [],
"track_changes": 1
}

View File

@ -50,7 +50,7 @@ def get_item_details(args, doc=None, for_validate=False, overwrite_warehouse=Tru
"transaction_date": None,
"conversion_rate": 1.0,
"buying_price_list": None,
"is_subcontracted": "Yes" / "No",
"is_subcontracted": 0/1,
"ignore_pricing_rule": 0/1
"project": ""
"set_warehouse": ""
@ -124,7 +124,7 @@ def get_item_details(args, doc=None, for_validate=False, overwrite_warehouse=Tru
if args.transaction_date and item.lead_time_days:
out.schedule_date = out.lead_time_date = add_days(args.transaction_date, item.lead_time_days)
if args.get("is_subcontracted") == "Yes":
if args.get("is_subcontracted"):
out.bom = args.get("bom") or get_default_bom(args.item_code)
get_gross_profit(out)
@ -240,7 +240,7 @@ def validate_item_details(args, item):
throw(_("Item {0} is a template, please select one of its variants").format(item.name))
elif args.transaction_type == "buying" and args.doctype != "Material Request":
if args.get("is_subcontracted") == "Yes" and item.is_sub_contracted_item != 1:
if args.get("is_subcontracted") and item.is_sub_contracted_item != 1:
throw(_("Item {0} must be a Sub-contracted Item").format(item.name))
@ -261,7 +261,7 @@ def get_basic_details(args, item, overwrite_warehouse=True):
"transaction_date": None,
"conversion_rate": 1.0,
"buying_price_list": None,
"is_subcontracted": "Yes" / "No",
"is_subcontracted": 0/1,
"ignore_pricing_rule": 0/1
"project": "",
barcode: "",

View File

@ -68,7 +68,7 @@ frappe.pages['warehouse-capacity-summary'].on_page_load = function(wrapper) {
options: [
{fieldname: 'stock_capacity', label: __('Capacity (Stock UOM)')},
{fieldname: 'percent_occupied', label: __('% Occupied')},
{fieldname: 'actual_qty', label: __('Balance Qty (Stock ')}
{fieldname: 'actual_qty', label: __('Balance Qty (Stock)')}
]
},
change: function(sort_by, sort_order) {

View File

@ -246,8 +246,7 @@ def notify_errors(exceptions_list):
_("Dear System Manager,")
+ "<br>"
+ _(
"An error occured for certain Items while creating Material Requests based on Re-order level. \
Please rectify these issues :"
"An error occured for certain Items while creating Material Requests based on Re-order level. Please rectify these issues :"
)
+ "<br>"
)

View File

@ -3,6 +3,7 @@
import frappe
from frappe import _
def execute(filters=None):
@ -34,10 +35,10 @@ def execute(filters=None):
return [
{
"fieldname": "parent",
"label": "BOM",
"label": _("BOM"),
"width": 200,
"fieldtype": "Dynamic Link",
"options": "doctype",
},
{"fieldname": "doctype", "label": "Type", "width": 200, "fieldtype": "Data"},
{"fieldname": "doctype", "label": _("Type"), "width": 200, "fieldtype": "Data"},
], data

View File

@ -71,7 +71,7 @@ def get_columns(item):
columns = [
{
"fieldname": "variant_name",
"label": "Variant",
"label": _("Variant"),
"fieldtype": "Link",
"options": "Item",
"width": 200,

View File

@ -4,6 +4,7 @@
import json
import frappe
from frappe import _
SLE_FIELDS = (
"name",
@ -105,155 +106,155 @@ def get_columns():
{
"fieldname": "name",
"fieldtype": "Link",
"label": "Stock Ledger Entry",
"label": _("Stock Ledger Entry"),
"options": "Stock Ledger Entry",
},
{
"fieldname": "posting_date",
"fieldtype": "Date",
"label": "Posting Date",
"label": _("Posting Date"),
},
{
"fieldname": "posting_time",
"fieldtype": "Time",
"label": "Posting Time",
"label": _("Posting Time"),
},
{
"fieldname": "creation",
"fieldtype": "Datetime",
"label": "Creation",
"label": _("Creation"),
},
{
"fieldname": "voucher_type",
"fieldtype": "Link",
"label": "Voucher Type",
"label": _("Voucher Type"),
"options": "DocType",
},
{
"fieldname": "voucher_no",
"fieldtype": "Dynamic Link",
"label": "Voucher No",
"label": _("Voucher No"),
"options": "voucher_type",
},
{
"fieldname": "batch_no",
"fieldtype": "Link",
"label": "Batch",
"label": _("Batch"),
"options": "Batch",
},
{
"fieldname": "use_batchwise_valuation",
"fieldtype": "Check",
"label": "Batchwise Valuation",
"label": _("Batchwise Valuation"),
},
{
"fieldname": "actual_qty",
"fieldtype": "Float",
"label": "Qty Change",
"label": _("Qty Change"),
},
{
"fieldname": "incoming_rate",
"fieldtype": "Float",
"label": "Incoming Rate",
"label": _("Incoming Rate"),
},
{
"fieldname": "consumption_rate",
"fieldtype": "Float",
"label": "Consumption Rate",
"label": _("Consumption Rate"),
},
{
"fieldname": "qty_after_transaction",
"fieldtype": "Float",
"label": "(A) Qty After Transaction",
"label": _("(A) Qty After Transaction"),
},
{
"fieldname": "expected_qty_after_transaction",
"fieldtype": "Float",
"label": "(B) Expected Qty After Transaction",
"label": _("(B) Expected Qty After Transaction"),
},
{
"fieldname": "difference_in_qty",
"fieldtype": "Float",
"label": "A - B",
"label": _("A - B"),
},
{
"fieldname": "stock_queue",
"fieldtype": "Data",
"label": "FIFO/LIFO Queue",
"label": _("FIFO/LIFO Queue"),
},
{
"fieldname": "fifo_queue_qty",
"fieldtype": "Float",
"label": "(C) Total qty in queue",
"label": _("(C) Total qty in queue"),
},
{
"fieldname": "fifo_qty_diff",
"fieldtype": "Float",
"label": "A - C",
"label": _("A - C"),
},
{
"fieldname": "stock_value",
"fieldtype": "Float",
"label": "(D) Balance Stock Value",
"label": _("(D) Balance Stock Value"),
},
{
"fieldname": "fifo_stock_value",
"fieldtype": "Float",
"label": "(E) Balance Stock Value in Queue",
"label": _("(E) Balance Stock Value in Queue"),
},
{
"fieldname": "fifo_value_diff",
"fieldtype": "Float",
"label": "D - E",
"label": _("D - E"),
},
{
"fieldname": "stock_value_difference",
"fieldtype": "Float",
"label": "(F) Stock Value Difference",
"label": _("(F) Stock Value Difference"),
},
{
"fieldname": "stock_value_from_diff",
"fieldtype": "Float",
"label": "Balance Stock Value using (F)",
"label": _("Balance Stock Value using (F)"),
},
{
"fieldname": "diff_value_diff",
"fieldtype": "Float",
"label": "K - D",
"label": _("K - D"),
},
{
"fieldname": "fifo_stock_diff",
"fieldtype": "Float",
"label": "(G) Stock Value difference (FIFO queue)",
"label": _("(G) Stock Value difference (FIFO queue)"),
},
{
"fieldname": "fifo_difference_diff",
"fieldtype": "Float",
"label": "F - G",
"label": _("F - G"),
},
{
"fieldname": "valuation_rate",
"fieldtype": "Float",
"label": "(H) Valuation Rate",
"label": _("(H) Valuation Rate"),
},
{
"fieldname": "fifo_valuation_rate",
"fieldtype": "Float",
"label": "(I) Valuation Rate as per FIFO",
"label": _("(I) Valuation Rate as per FIFO"),
},
{
"fieldname": "fifo_valuation_diff",
"fieldtype": "Float",
"label": "H - I",
"label": _("H - I"),
},
{
"fieldname": "balance_value_by_qty",
"fieldtype": "Float",
"label": "(J) Valuation = Value (D) ÷ Qty (A)",
"label": _("(J) Valuation = Value (D) ÷ Qty (A)"),
},
{
"fieldname": "valuation_diff",
"fieldtype": "Float",
"label": "H - J",
"label": _("H - J"),
},
]

Some files were not shown because too many files have changed in this diff Show More