Merge branch 'hotfix'
This commit is contained in:
commit
8ca5940f76
@ -5,7 +5,7 @@ import frappe
|
|||||||
from erpnext.hooks import regional_overrides
|
from erpnext.hooks import regional_overrides
|
||||||
from frappe.utils import getdate
|
from frappe.utils import getdate
|
||||||
|
|
||||||
__version__ = '10.1.42'
|
__version__ = '10.1.43'
|
||||||
|
|
||||||
def get_default_company(user=None):
|
def get_default_company(user=None):
|
||||||
'''Get default company for user'''
|
'''Get default company for user'''
|
||||||
|
@ -507,5 +507,6 @@ def save_invoice(doc, name, name_list):
|
|||||||
name_list.append(name)
|
name_list.append(name)
|
||||||
except Exception:
|
except Exception:
|
||||||
frappe.log_error(frappe.get_traceback())
|
frappe.log_error(frappe.get_traceback())
|
||||||
|
frappe.db.rollback()
|
||||||
|
|
||||||
return name_list
|
return name_list
|
||||||
|
@ -639,6 +639,66 @@
|
|||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "column_break_21",
|
||||||
|
"fieldtype": "Column Break",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"depends_on": "eval: doc.is_return && doc.return_against",
|
||||||
|
"fieldname": "update_billed_amount_in_sales_order",
|
||||||
|
"fieldtype": "Check",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Update Billed Amount in Sales Order",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@ -4713,7 +4773,7 @@
|
|||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"menu_index": 0,
|
"menu_index": 0,
|
||||||
"modified": "2018-07-06 12:09:02.039783",
|
"modified": "2018-07-17 13:46:52.449142",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Accounts",
|
"module": "Accounts",
|
||||||
"name": "Sales Invoice",
|
"name": "Sales Invoice",
|
||||||
@ -4804,7 +4864,7 @@
|
|||||||
"quick_entry": 1,
|
"quick_entry": 1,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"read_only_onload": 1,
|
"read_only_onload": 1,
|
||||||
"search_fields": "posting_date, due_date, customer, base_grand_total, outstanding_amount",
|
"search_fields": "posting_date,due_date,customer,base_grand_total,outstanding_amount",
|
||||||
"show_name_in_global_search": 1,
|
"show_name_in_global_search": 1,
|
||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "DESC",
|
"sort_order": "DESC",
|
||||||
|
@ -116,7 +116,7 @@ class SalesInvoice(SellingController):
|
|||||||
|
|
||||||
self.check_prev_docstatus()
|
self.check_prev_docstatus()
|
||||||
|
|
||||||
if self.is_return:
|
if self.is_return and not self.update_billed_amount_in_sales_order:
|
||||||
# NOTE status updating bypassed for is_return
|
# NOTE status updating bypassed for is_return
|
||||||
self.status_updater = []
|
self.status_updater = []
|
||||||
|
|
||||||
@ -161,7 +161,7 @@ class SalesInvoice(SellingController):
|
|||||||
if frappe.db.get_single_value('Accounts Settings', 'unlink_payment_on_cancellation_of_invoice'):
|
if frappe.db.get_single_value('Accounts Settings', 'unlink_payment_on_cancellation_of_invoice'):
|
||||||
unlink_ref_doc_from_payment_entries(self)
|
unlink_ref_doc_from_payment_entries(self)
|
||||||
|
|
||||||
if self.is_return:
|
if self.is_return and not self.update_billed_amount_in_sales_order:
|
||||||
# NOTE status updating bypassed for is_return
|
# NOTE status updating bypassed for is_return
|
||||||
self.status_updater = []
|
self.status_updater = []
|
||||||
|
|
||||||
|
@ -20,8 +20,8 @@ from erpnext import get_default_currency, get_company_currency
|
|||||||
class DuplicatePartyAccountError(frappe.ValidationError): pass
|
class DuplicatePartyAccountError(frappe.ValidationError): pass
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_party_details(party=None, account=None, party_type="Customer", company=None,
|
def get_party_details(party=None, account=None, party_type="Customer", company=None, posting_date=None,
|
||||||
posting_date=None, price_list=None, currency=None, doctype=None, ignore_permissions=False):
|
price_list=None, currency=None, doctype=None, ignore_permissions=False, fetch_payment_terms_template=True):
|
||||||
|
|
||||||
if not party:
|
if not party:
|
||||||
return {}
|
return {}
|
||||||
@ -30,10 +30,10 @@ def get_party_details(party=None, account=None, party_type="Customer", company=N
|
|||||||
frappe.throw(_("{0}: {1} does not exists").format(party_type, party))
|
frappe.throw(_("{0}: {1} does not exists").format(party_type, party))
|
||||||
|
|
||||||
return _get_party_details(party, account, party_type,
|
return _get_party_details(party, account, party_type,
|
||||||
company, posting_date, price_list, currency, doctype, ignore_permissions)
|
company, posting_date, price_list, currency, doctype, ignore_permissions, fetch_payment_terms_template)
|
||||||
|
|
||||||
def _get_party_details(party=None, account=None, party_type="Customer", company=None,
|
def _get_party_details(party=None, account=None, party_type="Customer", company=None, posting_date=None,
|
||||||
posting_date=None, price_list=None, currency=None, doctype=None, ignore_permissions=False):
|
price_list=None, currency=None, doctype=None, ignore_permissions=False, fetch_payment_terms_template=True):
|
||||||
|
|
||||||
out = frappe._dict(set_account_and_due_date(party, account, party_type, company, posting_date, doctype))
|
out = frappe._dict(set_account_and_due_date(party, account, party_type, company, posting_date, doctype))
|
||||||
|
|
||||||
@ -50,7 +50,9 @@ def _get_party_details(party=None, account=None, party_type="Customer", company=
|
|||||||
set_other_values(out, party, party_type)
|
set_other_values(out, party, party_type)
|
||||||
set_price_list(out, party, party_type, price_list)
|
set_price_list(out, party, party_type, price_list)
|
||||||
out["taxes_and_charges"] = set_taxes(party.name, party_type, posting_date, company, out.customer_group, out.supplier_type)
|
out["taxes_and_charges"] = set_taxes(party.name, party_type, posting_date, company, out.customer_group, out.supplier_type)
|
||||||
out["payment_terms_template"] = get_pyt_term_template(party.name, party_type, company)
|
|
||||||
|
if fetch_payment_terms_template:
|
||||||
|
out["payment_terms_template"] = get_pyt_term_template(party.name, party_type, company)
|
||||||
|
|
||||||
if not out.get("currency"):
|
if not out.get("currency"):
|
||||||
out["currency"] = currency
|
out["currency"] = currency
|
||||||
@ -272,6 +274,7 @@ def get_due_date(posting_date, party_type, party, company=None):
|
|||||||
if posting_date and party:
|
if posting_date and party:
|
||||||
due_date = posting_date
|
due_date = posting_date
|
||||||
template_name = get_pyt_term_template(party, party_type, company)
|
template_name = get_pyt_term_template(party, party_type, company)
|
||||||
|
|
||||||
if template_name:
|
if template_name:
|
||||||
due_date = get_due_date_from_template(template_name, posting_date).strftime("%Y-%m-%d")
|
due_date = get_due_date_from_template(template_name, posting_date).strftime("%Y-%m-%d")
|
||||||
else:
|
else:
|
||||||
@ -304,11 +307,13 @@ def get_due_date_from_template(template_name, posting_date):
|
|||||||
|
|
||||||
return due_date
|
return due_date
|
||||||
|
|
||||||
def validate_due_date(posting_date, due_date, party_type, party, company=None):
|
def validate_due_date(posting_date, due_date, party_type, party, company=None, template_name=None):
|
||||||
if getdate(due_date) < getdate(posting_date):
|
if getdate(due_date) < getdate(posting_date):
|
||||||
frappe.throw(_("Due Date cannot be before Posting Date"))
|
frappe.throw(_("Due Date cannot be before Posting Date"))
|
||||||
else:
|
else:
|
||||||
default_due_date = get_due_date(posting_date, party_type, party, company)
|
if not template_name: return
|
||||||
|
|
||||||
|
default_due_date = get_due_date_from_template(template_name, posting_date).strftime("%Y-%m-%d")
|
||||||
if not default_due_date:
|
if not default_due_date:
|
||||||
return
|
return
|
||||||
|
|
||||||
|
@ -171,7 +171,7 @@ class GrossProfitGenerator(object):
|
|||||||
row.qty += returned_item_row.qty
|
row.qty += returned_item_row.qty
|
||||||
row.base_amount += returned_item_row.base_amount
|
row.base_amount += returned_item_row.base_amount
|
||||||
row.buying_amount = row.qty * row.buying_rate
|
row.buying_amount = row.qty * row.buying_rate
|
||||||
if row.qty:
|
if row.qty or row.base_amount:
|
||||||
row = self.set_average_rate(row)
|
row = self.set_average_rate(row)
|
||||||
self.grouped_data.append(row)
|
self.grouped_data.append(row)
|
||||||
|
|
||||||
|
@ -23,6 +23,14 @@ frappe.ui.form.on('Asset', {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
frm.set_query("cost_center", function() {
|
||||||
|
return {
|
||||||
|
"filters": {
|
||||||
|
"company": frm.doc.company,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
refresh: function(frm) {
|
refresh: function(frm) {
|
||||||
|
@ -415,6 +415,37 @@
|
|||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
|
"allow_on_submit": 0,
|
||||||
|
"bold": 0,
|
||||||
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
|
"fieldname": "cost_center",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"hidden": 0,
|
||||||
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"label": "Cost Center",
|
||||||
|
"length": 0,
|
||||||
|
"no_copy": 0,
|
||||||
|
"options": "Cost Center",
|
||||||
|
"permlevel": 0,
|
||||||
|
"precision": "",
|
||||||
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
|
"report_hide": 0,
|
||||||
|
"reqd": 0,
|
||||||
|
"search_index": 0,
|
||||||
|
"set_only_once": 0,
|
||||||
|
"unique": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@ -1221,7 +1252,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-12-19 12:58:44.137460",
|
"modified": "2018-07-17 06:30:25.506194",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Assets",
|
"module": "Assets",
|
||||||
"name": "Asset",
|
"name": "Asset",
|
||||||
|
@ -38,7 +38,7 @@ def make_depreciation_entry(asset_name, date=None):
|
|||||||
|
|
||||||
depreciation_cost_center, depreciation_series = frappe.db.get_value("Company", asset.company,
|
depreciation_cost_center, depreciation_series = frappe.db.get_value("Company", asset.company,
|
||||||
["depreciation_cost_center", "series_for_depreciation_entry"])
|
["depreciation_cost_center", "series_for_depreciation_entry"])
|
||||||
|
depreciation_cost_center = asset.cost_center or depreciation_cost_center
|
||||||
|
|
||||||
for d in asset.get("schedules"):
|
for d in asset.get("schedules"):
|
||||||
if not d.journal_entry and getdate(d.schedule_date) <= getdate(date):
|
if not d.journal_entry and getdate(d.schedule_date) <= getdate(date):
|
||||||
@ -154,6 +154,7 @@ def restore_asset(asset_name):
|
|||||||
def get_gl_entries_on_asset_disposal(asset, selling_amount=0):
|
def get_gl_entries_on_asset_disposal(asset, selling_amount=0):
|
||||||
fixed_asset_account, accumulated_depr_account, depr_expense_account = get_depreciation_accounts(asset)
|
fixed_asset_account, accumulated_depr_account, depr_expense_account = get_depreciation_accounts(asset)
|
||||||
disposal_account, depreciation_cost_center = get_disposal_account_and_cost_center(asset.company)
|
disposal_account, depreciation_cost_center = get_disposal_account_and_cost_center(asset.company)
|
||||||
|
depreciation_cost_center = asset.cost_center or depreciation_cost_center
|
||||||
|
|
||||||
accumulated_depr_amount = flt(asset.gross_purchase_amount) - flt(asset.value_after_depreciation)
|
accumulated_depr_amount = flt(asset.gross_purchase_amount) - flt(asset.value_after_depreciation)
|
||||||
|
|
||||||
|
@ -1,231 +1,276 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
|
"allow_guest_to_view": 0,
|
||||||
"allow_import": 0,
|
"allow_import": 0,
|
||||||
"allow_rename": 0,
|
"allow_rename": 0,
|
||||||
|
"beta": 0,
|
||||||
"creation": "2013-06-25 11:04:03",
|
"creation": "2013-06-25 11:04:03",
|
||||||
"custom": 0,
|
"custom": 0,
|
||||||
"description": "Settings for Buying Module",
|
"description": "Settings for Buying Module",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
"document_type": "Other",
|
"document_type": "Other",
|
||||||
|
"editable_grid": 0,
|
||||||
"fields": [
|
"fields": [
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
"default": "Supplier Name",
|
"default": "Supplier Name",
|
||||||
"fieldname": "supp_master_name",
|
"fieldname": "supp_master_name",
|
||||||
"fieldtype": "Select",
|
"fieldtype": "Select",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
"label": "Supplier Naming By",
|
"label": "Supplier Naming By",
|
||||||
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"options": "Supplier Name\nNaming Series",
|
"options": "Supplier Name\nNaming Series",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
"fieldname": "supplier_type",
|
"fieldname": "supplier_type",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
"label": "Default Supplier Type",
|
"label": "Default Supplier Type",
|
||||||
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"options": "Supplier Type",
|
"options": "Supplier Type",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
"fieldname": "buying_price_list",
|
"fieldname": "buying_price_list",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
"label": "Default Buying Price List",
|
"label": "Default Buying Price List",
|
||||||
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"options": "Price List",
|
"options": "Price List",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
"fieldname": "column_break_3",
|
"fieldname": "column_break_3",
|
||||||
"fieldtype": "Column Break",
|
"fieldtype": "Column Break",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
"fieldname": "po_required",
|
"fieldname": "po_required",
|
||||||
"fieldtype": "Select",
|
"fieldtype": "Select",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
"label": "Purchase Order Required",
|
"label": "Purchase Order Required",
|
||||||
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"options": "No\nYes",
|
"options": "No\nYes",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
"fieldname": "pr_required",
|
"fieldname": "pr_required",
|
||||||
"fieldtype": "Select",
|
"fieldtype": "Select",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
"label": "Purchase Receipt Required",
|
"label": "Purchase Receipt Required",
|
||||||
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"options": "No\nYes",
|
"options": "No\nYes",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
"fieldname": "maintain_same_rate",
|
"fieldname": "maintain_same_rate",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
"label": "Maintain same rate throughout purchase cycle",
|
"label": "Maintain same rate throughout purchase cycle",
|
||||||
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
|
"translatable": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
"bold": 0,
|
"bold": 0,
|
||||||
"collapsible": 0,
|
"collapsible": 0,
|
||||||
|
"columns": 0,
|
||||||
"fieldname": "allow_multiple_items",
|
"fieldname": "allow_multiple_items",
|
||||||
"fieldtype": "Check",
|
"fieldtype": "Check",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"ignore_user_permissions": 0,
|
"ignore_user_permissions": 0,
|
||||||
|
"ignore_xss_filter": 0,
|
||||||
"in_filter": 0,
|
"in_filter": 0,
|
||||||
|
"in_global_search": 0,
|
||||||
"in_list_view": 0,
|
"in_list_view": 0,
|
||||||
|
"in_standard_filter": 0,
|
||||||
"label": "Allow Item to be added multiple times in a transaction",
|
"label": "Allow Item to be added multiple times in a transaction",
|
||||||
|
"length": 0,
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
"search_index": 0,
|
"search_index": 0,
|
||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"translatable": 0,
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"default": "0",
|
|
||||||
"description": "If enabled, last purchase details of items will not be fetched from previous purchase order or purchase receipt",
|
|
||||||
"fieldname": "disable_fetch_last_purchase_rate",
|
|
||||||
"fieldtype": "Check",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Disable Fetching Last Purchase Details in Purchase Order",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"unique": 0
|
"unique": 0
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"has_web_view": 0,
|
||||||
"hide_heading": 0,
|
"hide_heading": 0,
|
||||||
"hide_toolbar": 0,
|
"hide_toolbar": 0,
|
||||||
"icon": "fa fa-cog",
|
"icon": "fa fa-cog",
|
||||||
"idx": 1,
|
"idx": 1,
|
||||||
|
"image_view": 0,
|
||||||
"in_create": 0,
|
"in_create": 0,
|
||||||
"in_dialog": 0,
|
|
||||||
"is_submittable": 0,
|
"is_submittable": 0,
|
||||||
"issingle": 1,
|
"issingle": 1,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"modified": "2017-12-27 15:20:06.052342",
|
"max_attachments": 0,
|
||||||
|
"modified": "2018-07-18 07:52:38.062488",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Buying Settings",
|
"name": "Buying Settings",
|
||||||
@ -252,6 +297,10 @@
|
|||||||
"write": 1
|
"write": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"quick_entry": 0,
|
||||||
"read_only": 0,
|
"read_only": 0,
|
||||||
"read_only_onload": 0
|
"read_only_onload": 0,
|
||||||
|
"show_name_in_global_search": 0,
|
||||||
|
"track_changes": 0,
|
||||||
|
"track_seen": 0
|
||||||
}
|
}
|
@ -32,12 +32,7 @@ frappe.ui.form.on("Purchase Order", {
|
|||||||
erpnext.queries.setup_queries(frm, "Warehouse", function() {
|
erpnext.queries.setup_queries(frm, "Warehouse", function() {
|
||||||
return erpnext.queries.warehouse(frm.doc);
|
return erpnext.queries.warehouse(frm.doc);
|
||||||
});
|
});
|
||||||
|
}
|
||||||
if (frm.doc.__onload) {
|
|
||||||
frm.toggle_display('get_last_purchase_rate',
|
|
||||||
frm.doc.__onload.disable_fetch_last_purchase_rate);
|
|
||||||
}
|
|
||||||
},
|
|
||||||
});
|
});
|
||||||
|
|
||||||
frappe.ui.form.on("Purchase Order Item", {
|
frappe.ui.form.on("Purchase Order Item", {
|
||||||
@ -318,6 +313,73 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
|
|||||||
})
|
})
|
||||||
}, __("Add items from"));
|
}, __("Add items from"));
|
||||||
|
|
||||||
|
this.frm.add_custom_button(__('Update rate as per last purchase'),
|
||||||
|
function() {
|
||||||
|
frappe.call({
|
||||||
|
"method": "get_last_purchase_rate",
|
||||||
|
"doc": me.frm.doc,
|
||||||
|
callback: function(r, rt) {
|
||||||
|
me.frm.dirty();
|
||||||
|
me.frm.cscript.calculate_taxes_and_totals();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}, __("Tools"));
|
||||||
|
|
||||||
|
this.frm.add_custom_button(__('Link to Material Request'),
|
||||||
|
function() {
|
||||||
|
var my_items = [];
|
||||||
|
for (var i in me.frm.doc.items) {
|
||||||
|
if(!me.frm.doc.items[i].material_request){
|
||||||
|
my_items.push(me.frm.doc.items[i].item_code);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
frappe.call({
|
||||||
|
method: "erpnext.buying.utils.get_linked_material_requests",
|
||||||
|
args:{
|
||||||
|
items: my_items
|
||||||
|
},
|
||||||
|
callback: function(r) {
|
||||||
|
if(r.exc) return;
|
||||||
|
|
||||||
|
var i = 0;
|
||||||
|
var item_length = me.frm.doc.items.length;
|
||||||
|
while (i < item_length) {
|
||||||
|
var qty = me.frm.doc.items[i].qty;
|
||||||
|
(r.message[0] || []).forEach(function(d) {
|
||||||
|
if (d.qty > 0 && qty > 0 && me.frm.doc.items[i].item_code == d.item_code && !me.frm.doc.items[i].material_request_item)
|
||||||
|
{
|
||||||
|
me.frm.doc.items[i].material_request = d.mr_name;
|
||||||
|
me.frm.doc.items[i].material_request_item = d.mr_item;
|
||||||
|
var my_qty = Math.min(qty, d.qty);
|
||||||
|
qty = qty - my_qty;
|
||||||
|
d.qty = d.qty - my_qty;
|
||||||
|
me.frm.doc.items[i].stock_qty = my_qty * me.frm.doc.items[i].conversion_factor;
|
||||||
|
me.frm.doc.items[i].qty = my_qty;
|
||||||
|
|
||||||
|
frappe.msgprint("Assigning " + d.mr_name + " to " + d.item_code + " (row " + me.frm.doc.items[i].idx + ")");
|
||||||
|
if (qty > 0) {
|
||||||
|
frappe.msgprint("Splitting " + qty + " units of " + d.item_code);
|
||||||
|
var new_row = frappe.model.add_child(me.frm.doc, me.frm.doc.items[i].doctype, "items");
|
||||||
|
item_length++;
|
||||||
|
|
||||||
|
for (var key in me.frm.doc.items[i]) {
|
||||||
|
new_row[key] = me.frm.doc.items[i][key];
|
||||||
|
}
|
||||||
|
|
||||||
|
new_row.idx = item_length;
|
||||||
|
new_row["stock_qty"] = new_row.conversion_factor * qty;
|
||||||
|
new_row["qty"] = qty;
|
||||||
|
new_row["material_request"] = "";
|
||||||
|
new_row["material_request_item"] = "";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
refresh_field("items");
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}, __("Tools"));
|
||||||
},
|
},
|
||||||
|
|
||||||
tc_name: function() {
|
tc_name: function() {
|
||||||
@ -346,17 +408,6 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
|
|||||||
cur_frm.cscript.update_status('Deliver', 'Delivered')
|
cur_frm.cscript.update_status('Deliver', 'Delivered')
|
||||||
},
|
},
|
||||||
|
|
||||||
get_last_purchase_rate: function() {
|
|
||||||
frappe.call({
|
|
||||||
"method": "get_last_purchase_rate",
|
|
||||||
"doc": cur_frm.doc,
|
|
||||||
callback: function(r, rt) {
|
|
||||||
cur_frm.dirty();
|
|
||||||
cur_frm.cscript.calculate_taxes_and_totals();
|
|
||||||
}
|
|
||||||
})
|
|
||||||
},
|
|
||||||
|
|
||||||
items_on_form_rendered: function() {
|
items_on_form_rendered: function() {
|
||||||
set_schedule_date(this.frm);
|
set_schedule_date(this.frm);
|
||||||
},
|
},
|
||||||
|
@ -1238,68 +1238,6 @@
|
|||||||
"set_only_once": 0,
|
"set_only_once": 0,
|
||||||
"unique": 0
|
"unique": 0
|
||||||
},
|
},
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"depends_on": "eval:doc.docstatus===0 && (doc.items && doc.items.length)",
|
|
||||||
"fieldname": "get_last_purchase_rate",
|
|
||||||
"fieldtype": "Button",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Get last purchase rate",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"allow_bulk_edit": 0,
|
|
||||||
"allow_on_submit": 0,
|
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"depends_on": "eval:doc.docstatus===0 && (doc.items && doc.items.length)",
|
|
||||||
"fieldname": "link_to_mrs",
|
|
||||||
"fieldtype": "Button",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 0,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Link to material requests",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 0,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 0,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"allow_bulk_edit": 0,
|
||||||
"allow_on_submit": 0,
|
"allow_on_submit": 0,
|
||||||
@ -3355,7 +3293,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 0,
|
"istable": 0,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2018-07-06 11:00:05.037716",
|
"modified": "2018-07-18 07:49:53.131408",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Purchase Order",
|
"name": "Purchase Order",
|
||||||
|
@ -33,12 +33,6 @@ class PurchaseOrder(BuyingController):
|
|||||||
'percent_join_field': 'material_request'
|
'percent_join_field': 'material_request'
|
||||||
}]
|
}]
|
||||||
|
|
||||||
def onload(self):
|
|
||||||
super(PurchaseOrder, self).onload()
|
|
||||||
|
|
||||||
self.set_onload('disable_fetch_last_purchase_rate',
|
|
||||||
cint(frappe.db.get_single_value("Buying Settings", "disable_fetch_last_purchase_rate")))
|
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
super(PurchaseOrder, self).validate()
|
super(PurchaseOrder, self).validate()
|
||||||
|
|
||||||
@ -122,7 +116,6 @@ class PurchaseOrder(BuyingController):
|
|||||||
|
|
||||||
def get_last_purchase_rate(self):
|
def get_last_purchase_rate(self):
|
||||||
"""get last purchase rates for all items"""
|
"""get last purchase rates for all items"""
|
||||||
if cint(frappe.db.get_single_value("Buying Settings", "disable_fetch_last_purchase_rate")): return
|
|
||||||
|
|
||||||
conversion_rate = flt(self.get('conversion_rate')) or 1.0
|
conversion_rate = flt(self.get('conversion_rate')) or 1.0
|
||||||
for d in self.get("items"):
|
for d in self.get("items"):
|
||||||
@ -286,7 +279,6 @@ class PurchaseOrder(BuyingController):
|
|||||||
|
|
||||||
def item_last_purchase_rate(name, conversion_rate, item_code, conversion_factor= 1.0):
|
def item_last_purchase_rate(name, conversion_rate, item_code, conversion_factor= 1.0):
|
||||||
"""get last purchase rate for an item"""
|
"""get last purchase rate for an item"""
|
||||||
if cint(frappe.db.get_single_value("Buying Settings", "disable_fetch_last_purchase_rate")): return
|
|
||||||
|
|
||||||
conversion_rate = flt(conversion_rate) or 1.0
|
conversion_rate = flt(conversion_rate) or 1.0
|
||||||
|
|
||||||
|
@ -1,156 +0,0 @@
|
|||||||
QUnit.module('Buying');
|
|
||||||
|
|
||||||
QUnit.test("test: purchase order with last purchase rate", function(assert) {
|
|
||||||
assert.expect(9);
|
|
||||||
let done = assert.async();
|
|
||||||
|
|
||||||
frappe.run_serially([
|
|
||||||
() => {
|
|
||||||
return frappe.tests.make('Purchase Order', [
|
|
||||||
{supplier: 'Test Supplier'},
|
|
||||||
{is_subcontracted: 'No'},
|
|
||||||
{currency: 'INR'},
|
|
||||||
{items: [
|
|
||||||
[
|
|
||||||
{"item_code": 'Test Product 4'},
|
|
||||||
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
|
|
||||||
{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
|
|
||||||
{"qty": 1},
|
|
||||||
{"rate": 800},
|
|
||||||
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
{"item_code": 'Test Product 1'},
|
|
||||||
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
|
|
||||||
{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
|
|
||||||
{"qty": 1},
|
|
||||||
{"rate": 400},
|
|
||||||
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
|
|
||||||
]
|
|
||||||
]}
|
|
||||||
]);
|
|
||||||
},
|
|
||||||
|
|
||||||
() => {
|
|
||||||
// Get item details
|
|
||||||
assert.ok(cur_frm.doc.items[0].item_name == 'Test Product 4', "Item 1 name correct");
|
|
||||||
assert.ok(cur_frm.doc.items[1].item_name == 'Test Product 1', "Item 2 name correct");
|
|
||||||
},
|
|
||||||
|
|
||||||
() => frappe.timeout(1),
|
|
||||||
|
|
||||||
() => frappe.tests.click_button('Submit'),
|
|
||||||
() => frappe.tests.click_button('Yes'),
|
|
||||||
() => frappe.timeout(3),
|
|
||||||
|
|
||||||
() => frappe.tests.click_button('Close'),
|
|
||||||
() => frappe.timeout(1),
|
|
||||||
|
|
||||||
() => {
|
|
||||||
return frappe.tests.make('Purchase Order', [
|
|
||||||
{supplier: 'Test Supplier'},
|
|
||||||
{is_subcontracted: 'No'},
|
|
||||||
{currency: 'INR'},
|
|
||||||
{items: [
|
|
||||||
[
|
|
||||||
{"item_code": 'Test Product 4'},
|
|
||||||
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
|
|
||||||
{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
|
|
||||||
{"qty": 1},
|
|
||||||
{"rate": 600},
|
|
||||||
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
{"item_code": 'Test Product 1'},
|
|
||||||
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
|
|
||||||
{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
|
|
||||||
{"qty": 1},
|
|
||||||
{"rate": 200},
|
|
||||||
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
|
|
||||||
]
|
|
||||||
]}
|
|
||||||
]);
|
|
||||||
},
|
|
||||||
|
|
||||||
() => frappe.timeout(2),
|
|
||||||
|
|
||||||
// Get the last purchase rate of items
|
|
||||||
() => {
|
|
||||||
assert.ok(cur_frm.doc.items[0].last_purchase_rate == 800, "Last purchase rate of item 1 correct");
|
|
||||||
assert.ok(cur_frm.doc.items[1].last_purchase_rate != 0);
|
|
||||||
},
|
|
||||||
() => {
|
|
||||||
assert.ok(cur_frm.doc.items[1].last_purchase_rate == 400, "Last purchase rate of item 2 correct");
|
|
||||||
assert.ok(cur_frm.doc.items[1].last_purchase_rate != 0);
|
|
||||||
},
|
|
||||||
|
|
||||||
() => frappe.tests.click_button('Submit'),
|
|
||||||
() => frappe.tests.click_button('Yes'),
|
|
||||||
() => frappe.timeout(3),
|
|
||||||
|
|
||||||
() => frappe.tests.click_button('Close'),
|
|
||||||
|
|
||||||
() => frappe.timeout(1),
|
|
||||||
|
|
||||||
() => {
|
|
||||||
assert.ok(cur_frm.doc.status == 'To Receive and Bill', "Submitted successfully");
|
|
||||||
},
|
|
||||||
|
|
||||||
// enable allow_last_purchase_rate
|
|
||||||
() => {
|
|
||||||
return frappe.tests.make('Buying Settings', [
|
|
||||||
// values to be set
|
|
||||||
{"disable_fetch_last_purchase_rate": 1}
|
|
||||||
]);
|
|
||||||
},
|
|
||||||
|
|
||||||
() => {
|
|
||||||
return frappe.tests.make('Purchase Order', [
|
|
||||||
{supplier: 'Test Supplier'},
|
|
||||||
{is_subcontracted: 'No'},
|
|
||||||
{currency: 'INR'},
|
|
||||||
{items: [
|
|
||||||
[
|
|
||||||
{"item_code": 'Test Product 4'},
|
|
||||||
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
|
|
||||||
{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
|
|
||||||
{"qty": 1},
|
|
||||||
{"rate": 800},
|
|
||||||
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
|
|
||||||
],
|
|
||||||
[
|
|
||||||
{"item_code": 'Test Product 1'},
|
|
||||||
{"schedule_date": frappe.datetime.add_days(frappe.datetime.now_date(), 1)},
|
|
||||||
{"expected_delivery_date": frappe.datetime.add_days(frappe.datetime.now_date(), 5)},
|
|
||||||
{"qty": 1},
|
|
||||||
{"rate": 400},
|
|
||||||
{"warehouse": 'Stores - '+frappe.get_abbr(frappe.defaults.get_default("Company"))}
|
|
||||||
]
|
|
||||||
]}
|
|
||||||
]);
|
|
||||||
},
|
|
||||||
|
|
||||||
() => {
|
|
||||||
// Get item details
|
|
||||||
assert.ok(cur_frm.doc.items[0].last_purchase_rate == 0);
|
|
||||||
assert.ok(cur_frm.doc.items[1].last_purchase_rate == 0);
|
|
||||||
},
|
|
||||||
|
|
||||||
() => frappe.timeout(1),
|
|
||||||
|
|
||||||
() => frappe.tests.click_button('Submit'),
|
|
||||||
() => frappe.tests.click_button('Yes'),
|
|
||||||
() => frappe.timeout(3),
|
|
||||||
|
|
||||||
() => frappe.tests.click_button('Close'),
|
|
||||||
() => frappe.timeout(1),
|
|
||||||
|
|
||||||
// enable allow_last_purchase_rate
|
|
||||||
() => frappe.tests.make('Buying Settings', [
|
|
||||||
// values to be set
|
|
||||||
{"disable_fetch_last_purchase_rate": 0}
|
|
||||||
]),
|
|
||||||
|
|
||||||
() => done()
|
|
||||||
]);
|
|
||||||
});
|
|
@ -680,7 +680,7 @@
|
|||||||
"precision": "",
|
"precision": "",
|
||||||
"print_hide": 0,
|
"print_hide": 0,
|
||||||
"print_hide_if_no_value": 0,
|
"print_hide_if_no_value": 0,
|
||||||
"read_only": 0,
|
"read_only": 1,
|
||||||
"remember_last_selected_value": 0,
|
"remember_last_selected_value": 0,
|
||||||
"report_hide": 0,
|
"report_hide": 0,
|
||||||
"reqd": 0,
|
"reqd": 0,
|
||||||
@ -1897,7 +1897,7 @@
|
|||||||
"issingle": 0,
|
"issingle": 0,
|
||||||
"istable": 1,
|
"istable": 1,
|
||||||
"max_attachments": 0,
|
"max_attachments": 0,
|
||||||
"modified": "2017-12-14 09:36:40.837027",
|
"modified": "2018-07-18 07:53:54.677844",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"module": "Buying",
|
"module": "Buying",
|
||||||
"name": "Purchase Order Item",
|
"name": "Purchase Order Item",
|
||||||
|
@ -36,13 +36,13 @@ def get_data():
|
|||||||
"items": [
|
"items": [
|
||||||
{
|
{
|
||||||
"type": "doctype",
|
"type": "doctype",
|
||||||
"name": "Job Applicant",
|
"name": "Job Opening",
|
||||||
"description": _("Applicant for a Job."),
|
"description": _("Opening for a Job."),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "doctype",
|
"type": "doctype",
|
||||||
"name": "Job Opening",
|
"name": "Job Applicant",
|
||||||
"description": _("Opening for a Job."),
|
"description": _("Applicant for a Job."),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "doctype",
|
"type": "doctype",
|
||||||
|
@ -138,9 +138,11 @@ class AccountsController(TransactionBase):
|
|||||||
if not self.due_date:
|
if not self.due_date:
|
||||||
frappe.throw(_("Due Date is mandatory"))
|
frappe.throw(_("Due Date is mandatory"))
|
||||||
|
|
||||||
validate_due_date(self.posting_date, self.due_date, "Customer", self.customer, self.company)
|
validate_due_date(self.posting_date, self.due_date,
|
||||||
|
"Customer", self.customer, self.company, self.payment_terms_template)
|
||||||
elif self.doctype == "Purchase Invoice":
|
elif self.doctype == "Purchase Invoice":
|
||||||
validate_due_date(self.posting_date, self.due_date, "Supplier", self.supplier, self.company)
|
validate_due_date(self.posting_date, self.due_date,
|
||||||
|
"Supplier", self.supplier, self.company, self.payment_terms_template)
|
||||||
|
|
||||||
def set_price_list_currency(self, buying_or_selling):
|
def set_price_list_currency(self, buying_or_selling):
|
||||||
if self.meta.get_field("posting_date"):
|
if self.meta.get_field("posting_date"):
|
||||||
|
@ -52,9 +52,15 @@ class SellingController(StockController):
|
|||||||
def set_missing_lead_customer_details(self):
|
def set_missing_lead_customer_details(self):
|
||||||
if getattr(self, "customer", None):
|
if getattr(self, "customer", None):
|
||||||
from erpnext.accounts.party import _get_party_details
|
from erpnext.accounts.party import _get_party_details
|
||||||
|
fetch_payment_terms_template = False
|
||||||
|
if (self.get("__islocal") or
|
||||||
|
self.company != frappe.db.get_value(self.doctype, self.name, 'company')):
|
||||||
|
fetch_payment_terms_template = True
|
||||||
|
|
||||||
party_details = _get_party_details(self.customer,
|
party_details = _get_party_details(self.customer,
|
||||||
ignore_permissions=self.flags.ignore_permissions,
|
ignore_permissions=self.flags.ignore_permissions,
|
||||||
doctype=self.doctype, company=self.company)
|
doctype=self.doctype, company=self.company,
|
||||||
|
fetch_payment_terms_template=fetch_payment_terms_template)
|
||||||
if not self.meta.get_field("sales_team"):
|
if not self.meta.get_field("sales_team"):
|
||||||
party_details.pop("sales_team")
|
party_details.pop("sales_team")
|
||||||
|
|
||||||
|
@ -24,6 +24,7 @@ def get_columns(leave_types):
|
|||||||
]
|
]
|
||||||
|
|
||||||
for leave_type in leave_types:
|
for leave_type in leave_types:
|
||||||
|
columns.append(_(leave_type) + " " + _("Opening") + ":Float:160")
|
||||||
columns.append(_(leave_type) + " " + _("Taken") + ":Float:160")
|
columns.append(_(leave_type) + " " + _("Taken") + ":Float:160")
|
||||||
columns.append(_(leave_type) + " " + _("Balance") + ":Float:160")
|
columns.append(_(leave_type) + " " + _("Balance") + ":Float:160")
|
||||||
|
|
||||||
@ -32,6 +33,7 @@ def get_columns(leave_types):
|
|||||||
def get_data(filters, leave_types):
|
def get_data(filters, leave_types):
|
||||||
user = frappe.session.user
|
user = frappe.session.user
|
||||||
allocation_records_based_on_to_date = get_leave_allocation_records(filters.to_date)
|
allocation_records_based_on_to_date = get_leave_allocation_records(filters.to_date)
|
||||||
|
allocation_records_based_on_from_date = get_leave_allocation_records(filters.from_date)
|
||||||
|
|
||||||
active_employees = frappe.get_all("Employee",
|
active_employees = frappe.get_all("Employee",
|
||||||
filters = { "status": "Active", "company": filters.company},
|
filters = { "status": "Active", "company": filters.company},
|
||||||
@ -48,13 +50,17 @@ def get_data(filters, leave_types):
|
|||||||
# leaves taken
|
# leaves taken
|
||||||
leaves_taken = get_approved_leaves_for_period(employee.name, leave_type,
|
leaves_taken = get_approved_leaves_for_period(employee.name, leave_type,
|
||||||
filters.from_date, filters.to_date)
|
filters.from_date, filters.to_date)
|
||||||
|
|
||||||
|
# opening balance
|
||||||
|
opening = get_leave_balance_on(employee.name, leave_type, filters.from_date,
|
||||||
|
allocation_records_based_on_from_date.get(employee.name, frappe._dict()))
|
||||||
|
|
||||||
# closing balance
|
# closing balance
|
||||||
closing = get_leave_balance_on(employee.name, leave_type, filters.to_date,
|
closing = get_leave_balance_on(employee.name, leave_type, filters.to_date,
|
||||||
allocation_records_based_on_to_date.get(employee.name, frappe._dict()))
|
allocation_records_based_on_to_date.get(employee.name, frappe._dict()))
|
||||||
|
|
||||||
row += [leaves_taken, closing]
|
row += [opening, leaves_taken, closing]
|
||||||
|
|
||||||
data.append(row)
|
data.append(row)
|
||||||
|
|
||||||
return data
|
return data
|
||||||
|
@ -266,7 +266,6 @@ erpnext.patches.v6_24.map_customer_address_to_shipping_address_on_po
|
|||||||
erpnext.patches.v6_27.fix_recurring_order_status
|
erpnext.patches.v6_27.fix_recurring_order_status
|
||||||
erpnext.patches.v6_20x.update_product_bundle_description
|
erpnext.patches.v6_20x.update_product_bundle_description
|
||||||
erpnext.patches.v7_0.update_party_status #2016-09-22
|
erpnext.patches.v7_0.update_party_status #2016-09-22
|
||||||
erpnext.patches.v7_0.update_item_projected
|
|
||||||
erpnext.patches.v7_0.remove_features_setup
|
erpnext.patches.v7_0.remove_features_setup
|
||||||
erpnext.patches.v7_0.update_home_page
|
erpnext.patches.v7_0.update_home_page
|
||||||
execute:frappe.delete_doc_if_exists("Page", "financial-analytics")
|
execute:frappe.delete_doc_if_exists("Page", "financial-analytics")
|
||||||
@ -503,3 +502,4 @@ erpnext.patches.v10_0.taxes_issue_with_pos
|
|||||||
erpnext.patches.v10_0.set_qty_in_transactions_based_on_serial_no_input
|
erpnext.patches.v10_0.set_qty_in_transactions_based_on_serial_no_input
|
||||||
erpnext.patches.v10_0.show_leaves_of_all_department_members_in_calendar
|
erpnext.patches.v10_0.show_leaves_of_all_department_members_in_calendar
|
||||||
erpnext.patches.v10_0.update_status_in_purchase_receipt
|
erpnext.patches.v10_0.update_status_in_purchase_receipt
|
||||||
|
erpnext.patches.v10_0.update_address_template_for_india
|
12
erpnext/patches/v10_0/update_address_template_for_india.py
Normal file
12
erpnext/patches/v10_0/update_address_template_for_india.py
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# Copyright (c) 2017, Frappe and Contributors
|
||||||
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import frappe
|
||||||
|
from erpnext.regional.india.setup import update_address_template
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
if frappe.db.get_value('Company', {'country': 'India'}, 'name'):
|
||||||
|
address_template = frappe.db.get_value('Address Template', 'India', 'template')
|
||||||
|
if not address_template or "gstin" not in address_template:
|
||||||
|
update_address_template()
|
@ -9,7 +9,7 @@ def execute():
|
|||||||
|
|
||||||
def repost_bin_qty():
|
def repost_bin_qty():
|
||||||
for bin in frappe.db.sql(""" select name from `tabBin`
|
for bin in frappe.db.sql(""" select name from `tabBin`
|
||||||
where (actual_qty + ordered_qty + indented_qty + planned_qty- reserved_qty - reserved_qty_for_production) != projected_qty """, as_dict=1):
|
where (actual_qty + ordered_qty + indented_qty + planned_qty - reserved_qty - reserved_qty_for_production - reserved_qty_for_sub_contract) != projected_qty """, as_dict=1):
|
||||||
bin_doc = frappe.get_doc('Bin', bin.name)
|
bin_doc = frappe.get_doc('Bin', bin.name)
|
||||||
bin_doc.set_projected_qty()
|
bin_doc.set_projected_qty()
|
||||||
bin_doc.db_set("projected_qty", bin_doc.projected_qty, update_modified = False)
|
bin_doc.db_set("projected_qty", bin_doc.projected_qty, update_modified = False)
|
||||||
|
@ -1,7 +0,0 @@
|
|||||||
import frappe
|
|
||||||
|
|
||||||
def execute():
|
|
||||||
frappe.reload_doctype("Item")
|
|
||||||
from erpnext.stock.doctype.bin.bin import update_item_projected_qty
|
|
||||||
for item in frappe.get_all("Item", filters={"is_stock_item": 1}):
|
|
||||||
update_item_projected_qty(item.name)
|
|
@ -222,60 +222,6 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({
|
|||||||
|
|
||||||
tc_name: function() {
|
tc_name: function() {
|
||||||
this.get_terms();
|
this.get_terms();
|
||||||
},
|
|
||||||
link_to_mrs: function() {
|
|
||||||
var my_items = [];
|
|
||||||
for (var i in cur_frm.doc.items) {
|
|
||||||
if(!cur_frm.doc.items[i].material_request){
|
|
||||||
my_items.push(cur_frm.doc.items[i].item_code);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
frappe.call({
|
|
||||||
method: "erpnext.buying.utils.get_linked_material_requests",
|
|
||||||
args:{
|
|
||||||
items: my_items
|
|
||||||
},
|
|
||||||
callback: function(r) {
|
|
||||||
if(r.exc) return;
|
|
||||||
|
|
||||||
var i = 0;
|
|
||||||
var item_length = cur_frm.doc.items.length;
|
|
||||||
while (i < item_length) {
|
|
||||||
var qty = cur_frm.doc.items[i].qty;
|
|
||||||
(r.message[0] || []).forEach(function(d) {
|
|
||||||
if (d.qty > 0 && qty > 0 && cur_frm.doc.items[i].item_code == d.item_code && !cur_frm.doc.items[i].material_request_item)
|
|
||||||
{
|
|
||||||
cur_frm.doc.items[i].material_request = d.mr_name;
|
|
||||||
cur_frm.doc.items[i].material_request_item = d.mr_item;
|
|
||||||
var my_qty = Math.min(qty, d.qty);
|
|
||||||
qty = qty - my_qty;
|
|
||||||
d.qty = d.qty - my_qty;
|
|
||||||
cur_frm.doc.items[i].stock_qty = my_qty*cur_frm.doc.items[i].conversion_factor;
|
|
||||||
cur_frm.doc.items[i].qty = my_qty;
|
|
||||||
|
|
||||||
frappe.msgprint("Assigning " + d.mr_name + " to " + d.item_code + " (row " + cur_frm.doc.items[i].idx + ")");
|
|
||||||
if (qty > 0) {
|
|
||||||
frappe.msgprint("Splitting " + qty + " units of " + d.item_code);
|
|
||||||
var newrow = frappe.model.add_child(cur_frm.doc, cur_frm.doc.items[i].doctype, "items");
|
|
||||||
item_length++;
|
|
||||||
|
|
||||||
for (var key in cur_frm.doc.items[i]) {
|
|
||||||
newrow[key] = cur_frm.doc.items[i][key];
|
|
||||||
}
|
|
||||||
|
|
||||||
newrow.idx = item_length;
|
|
||||||
newrow["stock_qty"] = newrow.conversion_factor*qty;
|
|
||||||
newrow["qty"] = qty;
|
|
||||||
newrow["material_request"] = "";
|
|
||||||
newrow["material_request_item"] = "";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
refresh_field("items");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -60,6 +60,21 @@ class TestSalesOrder(unittest.TestCase):
|
|||||||
si1 = make_sales_invoice(so.name)
|
si1 = make_sales_invoice(so.name)
|
||||||
self.assertEquals(len(si1.get("items")), 0)
|
self.assertEquals(len(si1.get("items")), 0)
|
||||||
|
|
||||||
|
def test_so_billed_amount_against_return_entry(self):
|
||||||
|
from erpnext.accounts.doctype.sales_invoice.sales_invoice import make_sales_return
|
||||||
|
so = make_sales_order(do_not_submit=True)
|
||||||
|
so.submit()
|
||||||
|
|
||||||
|
si = make_sales_invoice(so.name)
|
||||||
|
si.insert()
|
||||||
|
si.submit()
|
||||||
|
|
||||||
|
si1 = make_sales_return(si.name)
|
||||||
|
si1.update_billed_amount_in_sales_order = 1
|
||||||
|
si1.submit()
|
||||||
|
so.load_from_db()
|
||||||
|
self.assertEquals(so.per_billed, 0)
|
||||||
|
|
||||||
def test_make_sales_invoice_with_terms(self):
|
def test_make_sales_invoice_with_terms(self):
|
||||||
so = make_sales_order(do_not_submit=True)
|
so = make_sales_order(do_not_submit=True)
|
||||||
|
|
||||||
|
@ -355,7 +355,7 @@ def install_country_fixtures(company):
|
|||||||
path = frappe.get_app_path('erpnext', 'regional', frappe.scrub(company_doc.country))
|
path = frappe.get_app_path('erpnext', 'regional', frappe.scrub(company_doc.country))
|
||||||
if os.path.exists(path.encode("utf-8")):
|
if os.path.exists(path.encode("utf-8")):
|
||||||
frappe.get_attr("erpnext.regional.{0}.setup.setup"
|
frappe.get_attr("erpnext.regional.{0}.setup.setup"
|
||||||
.format(frappe.scrub(company_doc.country)))(company_doc)
|
.format(frappe.scrub(company_doc.country)))(company_doc, False)
|
||||||
|
|
||||||
def update_company_current_month_sales(company):
|
def update_company_current_month_sales(company):
|
||||||
current_month_year = formatdate(today(), "MM-yyyy")
|
current_month_year = formatdate(today(), "MM-yyyy")
|
||||||
|
@ -34,7 +34,14 @@ class NamingSeries(Document):
|
|||||||
if options:
|
if options:
|
||||||
prefixes = prefixes + "\n" + options
|
prefixes = prefixes + "\n" + options
|
||||||
prefixes.replace("\n\n", "\n")
|
prefixes.replace("\n\n", "\n")
|
||||||
prefixes = "\n".join(sorted(prefixes.split("\n")))
|
prefixes = prefixes.split("\n")
|
||||||
|
|
||||||
|
custom_prefixes = frappe.get_all('DocType', fields=["autoname"],
|
||||||
|
filters={"name": ('not in', doctypes), "autoname":('like', '%.#%'), 'module': ('not in', ['Core'])})
|
||||||
|
if custom_prefixes:
|
||||||
|
prefixes = prefixes + [d.autoname.rsplit('.', 1)[0] for d in custom_prefixes]
|
||||||
|
|
||||||
|
prefixes = "\n".join(sorted(prefixes))
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"transactions": "\n".join([''] + sorted(doctypes)),
|
"transactions": "\n".join([''] + sorted(doctypes)),
|
||||||
|
@ -95,7 +95,7 @@ def get_exchange_rate(from_currency, to_currency, transaction_date=None):
|
|||||||
|
|
||||||
if not value:
|
if not value:
|
||||||
import requests
|
import requests
|
||||||
api_url = "https://exchangeratesapi.io/api/{0}".format(transaction_date)
|
api_url = "https://frankfurter.erpnext.org/{0}".format(transaction_date)
|
||||||
response = requests.get(api_url, params={
|
response = requests.get(api_url, params={
|
||||||
"base": from_currency,
|
"base": from_currency,
|
||||||
"symbols": to_currency
|
"symbols": to_currency
|
||||||
|
@ -57,7 +57,7 @@ class StockReconciliation(StockController):
|
|||||||
item.current_valuation_rate = rate
|
item.current_valuation_rate = rate
|
||||||
self.difference_amount += (flt(item.qty, item.precision("qty")) * \
|
self.difference_amount += (flt(item.qty, item.precision("qty")) * \
|
||||||
flt(item.valuation_rate or rate, item.precision("valuation_rate")) \
|
flt(item.valuation_rate or rate, item.precision("valuation_rate")) \
|
||||||
- flt(qty) * flt(rate))
|
- flt(qty, item.precision("qty")) * flt(rate, item.precision("valuation_rate")))
|
||||||
return True
|
return True
|
||||||
|
|
||||||
items = filter(lambda d: _changed(d), self.items)
|
items = filter(lambda d: _changed(d), self.items)
|
||||||
@ -245,7 +245,9 @@ class StockReconciliation(StockController):
|
|||||||
def set_total_qty_and_amount(self):
|
def set_total_qty_and_amount(self):
|
||||||
for d in self.get("items"):
|
for d in self.get("items"):
|
||||||
d.amount = flt(d.qty, d.precision("qty")) * flt(d.valuation_rate, d.precision("valuation_rate"))
|
d.amount = flt(d.qty, d.precision("qty")) * flt(d.valuation_rate, d.precision("valuation_rate"))
|
||||||
d.current_amount = flt(d.current_qty) * flt(d.current_valuation_rate)
|
d.current_amount = (flt(d.current_qty,
|
||||||
|
d.precision("current_qty")) * flt(d.current_valuation_rate, d.precision("current_valuation_rate")))
|
||||||
|
|
||||||
d.quantity_difference = flt(d.qty) - flt(d.current_qty)
|
d.quantity_difference = flt(d.qty) - flt(d.current_qty)
|
||||||
d.amount_difference = flt(d.amount) - flt(d.current_amount)
|
d.amount_difference = flt(d.amount) - flt(d.current_amount)
|
||||||
|
|
||||||
|
@ -21,32 +21,33 @@ def execute(filters=None):
|
|||||||
|
|
||||||
data = []
|
data = []
|
||||||
for (company, item, warehouse) in sorted(iwb_map):
|
for (company, item, warehouse) in sorted(iwb_map):
|
||||||
qty_dict = iwb_map[(company, item, warehouse)]
|
if item_map.get(item):
|
||||||
item_reorder_level = 0
|
qty_dict = iwb_map[(company, item, warehouse)]
|
||||||
item_reorder_qty = 0
|
item_reorder_level = 0
|
||||||
if item + warehouse in item_reorder_detail_map:
|
item_reorder_qty = 0
|
||||||
item_reorder_level = item_reorder_detail_map[item + warehouse]["warehouse_reorder_level"]
|
if item + warehouse in item_reorder_detail_map:
|
||||||
item_reorder_qty = item_reorder_detail_map[item + warehouse]["warehouse_reorder_qty"]
|
item_reorder_level = item_reorder_detail_map[item + warehouse]["warehouse_reorder_level"]
|
||||||
|
item_reorder_qty = item_reorder_detail_map[item + warehouse]["warehouse_reorder_qty"]
|
||||||
|
|
||||||
report_data = [item, item_map[item]["item_name"],
|
report_data = [item, item_map[item]["item_name"],
|
||||||
item_map[item]["item_group"],
|
item_map[item]["item_group"],
|
||||||
item_map[item]["brand"],
|
item_map[item]["brand"],
|
||||||
item_map[item]["description"], warehouse,
|
item_map[item]["description"], warehouse,
|
||||||
item_map[item]["stock_uom"], qty_dict.opening_qty,
|
item_map[item]["stock_uom"], qty_dict.opening_qty,
|
||||||
qty_dict.opening_val, qty_dict.in_qty,
|
qty_dict.opening_val, qty_dict.in_qty,
|
||||||
qty_dict.in_val, qty_dict.out_qty,
|
qty_dict.in_val, qty_dict.out_qty,
|
||||||
qty_dict.out_val, qty_dict.bal_qty,
|
qty_dict.out_val, qty_dict.bal_qty,
|
||||||
qty_dict.bal_val, qty_dict.val_rate,
|
qty_dict.bal_val, qty_dict.val_rate,
|
||||||
item_reorder_level,
|
item_reorder_level,
|
||||||
item_reorder_qty,
|
item_reorder_qty,
|
||||||
company
|
company
|
||||||
]
|
]
|
||||||
|
|
||||||
if filters.get('show_variant_attributes', 0) == 1:
|
if filters.get('show_variant_attributes', 0) == 1:
|
||||||
variants_attributes = get_variants_attributes()
|
variants_attributes = get_variants_attributes()
|
||||||
report_data += [item_map[item].get(i) for i in variants_attributes]
|
report_data += [item_map[item].get(i) for i in variants_attributes]
|
||||||
|
|
||||||
data.append(report_data)
|
data.append(report_data)
|
||||||
|
|
||||||
if filters.get('show_variant_attributes', 0) == 1:
|
if filters.get('show_variant_attributes', 0) == 1:
|
||||||
columns += ["{}:Data:100".format(i) for i in get_variants_attributes()]
|
columns += ["{}:Data:100".format(i) for i in get_variants_attributes()]
|
||||||
@ -200,12 +201,12 @@ def get_item_details(items, sle, filters):
|
|||||||
item_details = {}
|
item_details = {}
|
||||||
if not items:
|
if not items:
|
||||||
items = list(set([d.item_code for d in sle]))
|
items = list(set([d.item_code for d in sle]))
|
||||||
|
|
||||||
if items:
|
if items:
|
||||||
for item in frappe.db.sql("""
|
for item in frappe.db.sql("""
|
||||||
select name, item_name, description, item_group, brand, stock_uom
|
select name, item_name, description, item_group, brand, stock_uom
|
||||||
from `tabItem`
|
from `tabItem`
|
||||||
where name in ({0})
|
where name in ({0}) and ifnull(disabled, 0) = 0
|
||||||
""".format(', '.join(['"' + frappe.db.escape(i, percent=False) + '"' for i in items])), as_dict=1):
|
""".format(', '.join(['"' + frappe.db.escape(i, percent=False) + '"' for i in items])), as_dict=1):
|
||||||
item_details.setdefault(item.name, item)
|
item_details.setdefault(item.name, item)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user