Merge pull request #23843 from frappe/datev_check_fiscal_year
feat: validate fiscal year
diff --git a/erpnext/accounts/desk_page/accounting/accounting.json b/erpnext/accounts/desk_page/accounting/accounting.json
index b0371e7..9172792 100644
--- a/erpnext/accounts/desk_page/accounting/accounting.json
+++ b/erpnext/accounts/desk_page/accounting/accounting.json
@@ -43,7 +43,7 @@
{
"hidden": 0,
"label": "Bank Statement",
- "links": "[\n {\n \"label\": \"Bank\",\n \"name\": \"Bank\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Bank Account\",\n \"name\": \"Bank Account\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Bank Statement Transaction Entry\",\n \"name\": \"Bank Statement Transaction Entry\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Bank Statement Settings\",\n \"name\": \"Bank Statement Settings\",\n \"type\": \"doctype\"\n }\n]"
+ "links": "[\n {\n \"label\": \"Bank\",\n \"name\": \"Bank\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Bank Account\",\n \"name\": \"Bank Account\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Bank Clearance\",\n \"name\": \"Bank Clearance\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Bank Reconciliation\",\n \"name\": \"bank-reconciliation\",\n \"type\": \"page\"\n },\n {\n \"dependencies\": [\n \"GL Entry\"\n ],\n \"doctype\": \"GL Entry\",\n \"is_query_report\": true,\n \"label\": \"Bank Reconciliation Statement\",\n \"name\": \"Bank Reconciliation Statement\",\n \"type\": \"report\"\n },\n {\n \"label\": \"Bank Statement Transaction Entry\",\n \"name\": \"Bank Statement Transaction Entry\",\n \"type\": \"doctype\"\n },\n {\n \"label\": \"Bank Statement Settings\",\n \"name\": \"Bank Statement Settings\",\n \"type\": \"doctype\"\n }\n]"
},
{
"hidden": 0,
@@ -98,7 +98,7 @@
"idx": 0,
"is_standard": 1,
"label": "Accounting",
- "modified": "2020-10-08 20:31:46.022470",
+ "modified": "2020-11-06 13:05:58.650150",
"modified_by": "Administrator",
"module": "Accounts",
"name": "Accounting",
@@ -108,7 +108,7 @@
"pin_to_top": 0,
"shortcuts": [
{
- "label": "Chart of Accounts",
+ "label": "Chart Of Accounts",
"link_to": "Account",
"type": "DocType"
},
diff --git a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py
index b0a7547..a7e20a0 100644
--- a/erpnext/accounts/doctype/pos_invoice/pos_invoice.py
+++ b/erpnext/accounts/doctype/pos_invoice/pos_invoice.py
@@ -132,15 +132,19 @@
msg = ""
item_code = frappe.bold(d.item_code)
+ serial_nos = get_serial_nos(d.serial_no)
if serialized and batched and (no_batch_selected or no_serial_selected):
msg = (_('Row #{}: Please select a serial no and batch against item: {} or remove it to complete transaction.')
.format(d.idx, item_code))
- if serialized and no_serial_selected:
+ elif serialized and no_serial_selected:
msg = (_('Row #{}: No serial number selected against item: {}. Please select one or remove it to complete transaction.')
.format(d.idx, item_code))
- if batched and no_batch_selected:
+ elif batched and no_batch_selected:
msg = (_('Row #{}: No batch selected against item: {}. Please select a batch or remove it to complete transaction.')
.format(d.idx, item_code))
+ elif serialized and not no_serial_selected and len(serial_nos) != d.qty:
+ msg = (_("Row #{}: You must select {} serial numbers for item {}.").format(d.idx, frappe.bold(cint(d.qty)), item_code))
+
if msg:
error_msg.append(msg)
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
index fe5301d..1d41d0f 100644
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js
@@ -99,6 +99,7 @@
target: me.frm,
setters: {
supplier: me.frm.doc.supplier || undefined,
+ schedule_date: undefined
},
get_query_filters: {
docstatus: 1,
@@ -107,16 +108,16 @@
company: me.frm.doc.company
}
})
- }, __("Get items from"));
+ }, __("Get Items From"));
this.frm.add_custom_button(__('Purchase Receipt'), function() {
erpnext.utils.map_current_doc({
method: "erpnext.stock.doctype.purchase_receipt.purchase_receipt.make_purchase_invoice",
source_doctype: "Purchase Receipt",
target: me.frm,
- date_field: "posting_date",
setters: {
supplier: me.frm.doc.supplier || undefined,
+ posting_date: undefined
},
get_query_filters: {
docstatus: 1,
@@ -125,7 +126,7 @@
is_return: 0
}
})
- }, __("Get items from"));
+ }, __("Get Items From"));
}
this.frm.toggle_reqd("supplier_warehouse", this.frm.doc.is_subcontracted==="Yes");
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index 9af584e..502e65e 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -199,7 +199,7 @@
company: me.frm.doc.company
}
})
- }, __("Get items from"));
+ }, __("Get Items From"));
},
quotation_btn: function() {
@@ -223,7 +223,7 @@
company: me.frm.doc.company
}
})
- }, __("Get items from"));
+ }, __("Get Items From"));
},
delivery_note_btn: function() {
@@ -251,7 +251,7 @@
};
}
});
- }, __("Get items from"));
+ }, __("Get Items From"));
},
tc_name: function() {
@@ -812,10 +812,10 @@
if (cint(frm.doc.docstatus==0) && cur_frm.page.current_view_name!=="pos" && !frm.doc.is_return) {
frm.add_custom_button(__('Healthcare Services'), function() {
get_healthcare_services_to_invoice(frm);
- },"Get items from");
+ },"Get Items From");
frm.add_custom_button(__('Prescriptions'), function() {
get_drugs_to_invoice(frm);
- },"Get items from");
+ },"Get Items From");
}
}
else {
@@ -1080,7 +1080,7 @@
description:'Quantity will be calculated only for items which has "Nos" as UoM. You may change as required for each invoice item.',
get_query: function(doc) {
return {
- filters: {
+ filters: {
patient: dialog.get_value("patient"),
company: frm.doc.company,
docstatus: 1
diff --git a/erpnext/accounts/print_format/bank_and_cash_payment_voucher/bank_and_cash_payment_voucher.html b/erpnext/accounts/print_format/bank_and_cash_payment_voucher/bank_and_cash_payment_voucher.html
index 6fe6999..e588ed6 100644
--- a/erpnext/accounts/print_format/bank_and_cash_payment_voucher/bank_and_cash_payment_voucher.html
+++ b/erpnext/accounts/print_format/bank_and_cash_payment_voucher/bank_and_cash_payment_voucher.html
@@ -19,7 +19,7 @@
</div>
<div class="col-xs-6">
<table>
- <tr><td><strong>Date: </strong></td><td>{{ frappe.utils.formatdate(doc.creation) }}</td></tr>
+ <tr><td><strong>Date: </strong></td><td>{{ frappe.utils.format_date(doc.creation) }}</td></tr>
</table>
</div>
</div>
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js
index 9f2b971..2f52a9e 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.js
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.js
@@ -299,7 +299,7 @@
if(me.values) {
me.values.sub_con_rm_items.map((row,i) => {
if (!row.item_code || !row.rm_item_code || !row.warehouse || !row.qty || row.qty === 0) {
- frappe.throw(__("Item Code, warehouse, quantity are required on row" + (i+1)));
+ frappe.throw(__("Item Code, warehouse, quantity are required on row {0}", [i+1]));
}
})
me._make_rm_stock_entry(me.dialog.fields_dict.sub_con_rm_items.grid.get_selected_children())
@@ -366,7 +366,7 @@
per_ordered: ["<", 99.99],
}
})
- }, __("Get items from"));
+ }, __("Get Items From"));
this.frm.add_custom_button(__('Supplier Quotation'),
function() {
@@ -382,7 +382,7 @@
status: ["!=", "Stopped"],
}
})
- }, __("Get items from"));
+ }, __("Get Items From"));
this.frm.add_custom_button(__('Update rate as per last purchase'),
function() {
diff --git a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
index cf30e30..c427242 100644
--- a/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
+++ b/erpnext/buying/doctype/request_for_quotation/request_for_quotation.js
@@ -217,13 +217,15 @@
source_doctype: "Material Request",
target: me.frm,
setters: {
- company: me.frm.doc.company
+ schedule_date: undefined,
+ status: undefined
},
get_query_filters: {
material_request_type: "Purchase",
docstatus: 1,
status: ["!=", "Stopped"],
- per_ordered: ["<", 99.99]
+ per_ordered: ["<", 99.99],
+ company: me.frm.doc.company
}
})
}, __("Get Items From"));
@@ -236,32 +238,40 @@
source_doctype: "Opportunity",
target: me.frm,
setters: {
- company: me.frm.doc.company
+ party_name: undefined,
+ opportunity_from: undefined,
+ status: undefined
},
+ get_query_filters: {
+ status: ["not in", ["Closed", "Lost"]],
+ company: me.frm.doc.company
+ }
})
}, __("Get Items From"));
// Get items from open Material Requests based on supplier
this.frm.add_custom_button(__('Possible Supplier'), function() {
// Create a dialog window for the user to pick their supplier
- var d = new frappe.ui.Dialog({
+ var dialog = new frappe.ui.Dialog({
title: __('Select Possible Supplier'),
fields: [
- {fieldname: 'supplier', fieldtype:'Link', options:'Supplier', label:'Supplier', reqd:1},
- {fieldname: 'ok_button', fieldtype:'Button', label:'Get Items from Material Requests'},
- ]
- });
-
- // On the user clicking the ok button
- d.fields_dict.ok_button.input.onclick = function() {
- var btn = d.fields_dict.ok_button.input;
- var v = d.get_values();
- if(v) {
- $(btn).set_working();
+ {
+ fieldname: 'supplier',
+ fieldtype:'Link',
+ options:'Supplier',
+ label:'Supplier',
+ reqd:1,
+ description: __("Get Items from Material Requests against this Supplier")
+ }
+ ],
+ primary_action_label: __("Get Items"),
+ primary_action: (args) => {
+ if(!args) return;
+ dialog.hide();
erpnext.utils.map_current_doc({
method: "erpnext.buying.doctype.request_for_quotation.request_for_quotation.get_item_from_material_requests_based_on_supplier",
- source_name: v.supplier,
+ source_name: args.supplier,
target: me.frm,
setters: {
company: me.frm.doc.company
@@ -273,11 +283,11 @@
per_ordered: ["<", 99.99]
}
});
- $(btn).done_working();
- d.hide();
+ dialog.hide();
}
- }
- d.show();
+ });
+
+ dialog.show();
}, __("Get Items From"));
// Get Suppliers
diff --git a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js
index 3376e82..a7cab50 100644
--- a/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js
+++ b/erpnext/buying/doctype/supplier_quotation/supplier_quotation.js
@@ -37,16 +37,18 @@
source_doctype: "Material Request",
target: me.frm,
setters: {
- company: me.frm.doc.company
+ schedule_date: undefined,
+ status: undefined
},
get_query_filters: {
material_request_type: "Purchase",
docstatus: 1,
status: ["!=", "Stopped"],
- per_ordered: ["<", 99.99]
+ per_ordered: ["<", 99.99],
+ company: me.frm.doc.company
}
})
- }, __("Get items from"));
+ }, __("Get Items From"));
this.frm.add_custom_button(__("Request for Quotation"),
function() {
@@ -58,16 +60,16 @@
source_doctype: "Request for Quotation",
target: me.frm,
setters: {
- company: me.frm.doc.company,
transaction_date: null
},
get_query_filters: {
- supplier: me.frm.doc.supplier
+ supplier: me.frm.doc.supplier,
+ company: me.frm.doc.company
},
get_query_method: "erpnext.buying.doctype.request_for_quotation.request_for_quotation.get_rfq_containing_supplier"
})
- }, __("Get items from"));
+ }, __("Get Items From"));
}
},
diff --git a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js
index e940b60..ddbcdfd 100644
--- a/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js
+++ b/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js
@@ -66,7 +66,7 @@
company: me.frm.doc.company
}
});
- }, __("Get items from"));
+ }, __("Get Items From"));
} else if (this.frm.doc.docstatus === 1) {
this.frm.add_custom_button(__('Create Maintenance Visit'), function() {
frappe.model.open_mapped_doc({
diff --git a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js
index 2e2a9ce..4cbb02a 100644
--- a/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js
+++ b/erpnext/maintenance/doctype/maintenance_visit/maintenance_visit.js
@@ -62,7 +62,7 @@
company: me.frm.doc.company
}
})
- }, __("Get items from"));
+ }, __("Get Items From"));
this.frm.add_custom_button(__('Warranty Claim'),
function() {
erpnext.utils.map_current_doc({
@@ -78,7 +78,7 @@
company: me.frm.doc.company
}
})
- }, __("Get items from"));
+ }, __("Get Items From"));
this.frm.add_custom_button(__('Sales Order'),
function() {
erpnext.utils.map_current_doc({
@@ -94,7 +94,7 @@
order_type: me.frm.doc.order_type,
}
})
- }, __("Get items from"));
+ }, __("Get Items From"));
}
},
});
diff --git a/erpnext/public/js/controllers/buying.js b/erpnext/public/js/controllers/buying.js
index cb76c87..58ac38f 100644
--- a/erpnext/public/js/controllers/buying.js
+++ b/erpnext/public/js/controllers/buying.js
@@ -276,7 +276,7 @@
var me = this;
this.frm.add_custom_button(__("Product Bundle"), function() {
erpnext.buying.get_items_from_product_bundle(me.frm);
- }, __("Get items from"));
+ }, __("Get Items From"));
},
shipping_address: function(){
diff --git a/erpnext/regional/india/utils.py b/erpnext/regional/india/utils.py
index dd87f0f..6164e06 100644
--- a/erpnext/regional/india/utils.py
+++ b/erpnext/regional/india/utils.py
@@ -236,7 +236,7 @@
if tax_category.gst_state == number_state_mapping[state_code] or \
(not default_tax and not tax_category.gst_state):
default_tax = frappe.db.get_value(master_doctype,
- {'disabled': 0, 'tax_category': tax_category.name}, 'name')
+ {'company': company, 'disabled': 0, 'tax_category': tax_category.name}, 'name')
return default_tax
def get_tax_template_for_sez(party_details, master_doctype, company, party_type):
diff --git a/erpnext/selling/doctype/quotation/quotation.js b/erpnext/selling/doctype/quotation/quotation.js
index 12f3260..661e107 100644
--- a/erpnext/selling/doctype/quotation/quotation.js
+++ b/erpnext/selling/doctype/quotation/quotation.js
@@ -116,7 +116,7 @@
company: me.frm.doc.company
}
})
- }, __("Get items from"), "btn-default");
+ }, __("Get Items From"), "btn-default");
}
this.toggle_reqd_lead_customer();
diff --git a/erpnext/selling/doctype/sales_order/sales_order.js b/erpnext/selling/doctype/sales_order/sales_order.js
index f162291..73cc0b8 100644
--- a/erpnext/selling/doctype/sales_order/sales_order.js
+++ b/erpnext/selling/doctype/sales_order/sales_order.js
@@ -236,7 +236,7 @@
status: ["!=", "Lost"]
}
})
- }, __("Get items from"));
+ }, __("Get Items From"));
}
this.order_type(doc);
diff --git a/erpnext/selling/page/point_of_sale/pos_controller.js b/erpnext/selling/page/point_of_sale/pos_controller.js
index f7d1fa4..970d840 100644
--- a/erpnext/selling/page/point_of_sale/pos_controller.js
+++ b/erpnext/selling/page/point_of_sale/pos_controller.js
@@ -555,6 +555,8 @@
frappe.utils.play_sound("error");
return;
}
+ if (!item_code) return;
+
item_selected_from_selector && (value = flt(value))
const args = { item_code, batch_no, [field]: value };
diff --git a/erpnext/selling/page/point_of_sale/pos_item_details.js b/erpnext/selling/page/point_of_sale/pos_item_details.js
index 9874d1b..a4de9f1 100644
--- a/erpnext/selling/page/point_of_sale/pos_item_details.js
+++ b/erpnext/selling/page/point_of_sale/pos_item_details.js
@@ -372,12 +372,13 @@
this.$form_container.on('click', '.auto-fetch-btn', () => {
this.batch_no_control && this.batch_no_control.set_value('');
let qty = this.qty_control.get_value();
+ let conversion_factor = this.conversion_factor_control.get_value();
let expiry_date = this.item_row.has_batch_no ? this.events.get_frm().doc.posting_date : "";
let numbers = frappe.call({
method: "erpnext.stock.doctype.serial_no.serial_no.auto_fetch_serial_number",
args: {
- qty,
+ qty: qty * conversion_factor,
item_code: this.current_item.item_code,
warehouse: this.warehouse_control.get_value() || '',
batch_nos: this.current_item.batch_no || '',
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js
index 19d0bec..251a26a 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.js
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.js
@@ -151,7 +151,7 @@
project: me.frm.doc.project || undefined,
}
})
- }, __("Get items from"));
+ }, __("Get Items From"));
}
}
diff --git a/erpnext/stock/doctype/material_request/material_request.js b/erpnext/stock/doctype/material_request/material_request.js
index 8c47098..01edd99 100644
--- a/erpnext/stock/doctype/material_request/material_request.js
+++ b/erpnext/stock/doctype/material_request/material_request.js
@@ -90,7 +90,7 @@
make_custom_buttons: function(frm) {
if (frm.doc.docstatus==0) {
frm.add_custom_button(__("Bill of Materials"),
- () => frm.events.get_items_from_bom(frm), __("Get items from"));
+ () => frm.events.get_items_from_bom(frm), __("Get Items From"));
}
if (frm.doc.docstatus == 1 && frm.doc.status != 'Stopped') {
@@ -147,7 +147,7 @@
if (frm.doc.docstatus===0) {
frm.add_custom_button(__('Sales Order'), () => frm.events.get_items_from_sales_order(frm),
- __("Get items from"));
+ __("Get Items From"));
}
if (frm.doc.docstatus == 1 && frm.doc.status == 'Stopped') {
@@ -173,7 +173,8 @@
source_doctype: "Sales Order",
target: frm,
setters: {
- customer: frm.doc.customer || undefined
+ customer: frm.doc.customer || undefined,
+ delivery_date: undefined,
},
get_query_filters: {
docstatus: 1,
@@ -280,8 +281,7 @@
fieldname:'default_supplier',
fieldtype: 'Link',
options: 'Supplier',
- description: __('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.'),
+ description: __('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.'),
get_query: () => {
return{
query: "erpnext.stock.doctype.material_request.material_request.get_default_supplier_query",
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
index c504e23..bc1d81d 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
@@ -128,6 +128,7 @@
target: me.frm,
setters: {
supplier: me.frm.doc.supplier,
+ schedule_date: undefined
},
get_query_filters: {
docstatus: 1,
@@ -136,7 +137,7 @@
company: me.frm.doc.company
}
})
- }, __("Get items from"));
+ }, __("Get Items From"));
}
if(this.frm.doc.docstatus == 1 && this.frm.doc.status!="Closed") {
diff --git a/erpnext/stock/doctype/stock_entry/stock_entry.js b/erpnext/stock/doctype/stock_entry/stock_entry.js
index 39fd029..9121758 100644
--- a/erpnext/stock/doctype/stock_entry/stock_entry.js
+++ b/erpnext/stock/doctype/stock_entry/stock_entry.js
@@ -225,7 +225,7 @@
docstatus: 1
}
})
- }, __("Get items from"));
+ }, __("Get Items From"));
frm.add_custom_button(__('Material Request'), function() {
erpnext.utils.map_current_doc({
@@ -240,7 +240,7 @@
status: ["not in", ["Transferred", "Issued"]]
}
})
- }, __("Get items from"));
+ }, __("Get Items From"));
}
if (frm.doc.docstatus===0 && frm.doc.purpose == "Material Issue") {
frm.add_custom_button(__('Expired Batches'), function() {
@@ -263,7 +263,7 @@
}
}
});
- }, __("Get items from"));
+ }, __("Get Items From"));
}
frm.events.show_bom_custom_button(frm);
@@ -282,7 +282,7 @@
},
stock_entry_type: function(frm){
- frm.remove_custom_button('Bill of Materials', "Get items from");
+ frm.remove_custom_button('Bill of Materials', "Get Items From");
frm.events.show_bom_custom_button(frm);
frm.trigger('add_to_transit');
},
@@ -425,9 +425,9 @@
show_bom_custom_button: function(frm){
if (frm.doc.docstatus === 0 &&
['Material Issue', 'Material Receipt', 'Material Transfer', 'Send to Subcontractor'].includes(frm.doc.purpose)) {
- frm.add_custom_button(__('Bill of Materials'), function() {
- frm.events.get_items_from_bom(frm);
- }, __("Get items from"));
+ frm.add_custom_button(__('Bill of Materials'), function() {
+ frm.events.get_items_from_bom(frm);
+ }, __("Get Items From"));
}
},