Merge branch 'develop' into dev-work-order-bugs

This commit is contained in:
Rohan 2019-09-24 11:53:00 +05:30 committed by GitHub
commit a51a304cf0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
150 changed files with 12520 additions and 10649 deletions

View File

@ -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__ = '12.1.2' __version__ = '12.1.4'
def get_default_company(user=None): def get_default_company(user=None):
'''Get default company for user''' '''Get default company for user'''

View File

@ -1,792 +1,260 @@
{ {
"allow_copy": 1, "allow_copy": 1,
"allow_events_in_timeline": 0,
"allow_guest_to_view": 0,
"allow_import": 1, "allow_import": 1,
"allow_rename": 0,
"beta": 0,
"creation": "2013-01-30 12:49:46", "creation": "2013-01-30 12:49:46",
"custom": 0,
"description": "Heads (or groups) against which Accounting Entries are made and balances are maintained.", "description": "Heads (or groups) against which Accounting Entries are made and balances are maintained.",
"docstatus": 0,
"doctype": "DocType", "doctype": "DocType",
"document_type": "Setup", "document_type": "Setup",
"editable_grid": 0, "engine": "InnoDB",
"field_order": [
"properties",
"column_break0",
"disabled",
"account_name",
"account_number",
"is_group",
"company",
"root_type",
"report_type",
"account_currency",
"inter_company_account",
"column_break1",
"parent_account",
"account_type",
"tax_rate",
"freeze_account",
"balance_must_be",
"lft",
"rgt",
"old_parent",
"include_in_gross"
],
"fields": [ "fields": [
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "properties", "fieldname": "properties",
"fieldtype": "Section Break", "fieldtype": "Section Break",
"hidden": 0, "oldfieldtype": "Section Break"
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "",
"length": 0,
"no_copy": 0,
"oldfieldtype": "Section Break",
"permlevel": 0,
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break0", "fieldname": "column_break0",
"fieldtype": "Column Break", "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,
"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,
"translatable": 0,
"unique": 0,
"width": "50%" "width": "50%"
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "account_name", "fieldname": "account_name",
"fieldtype": "Data", "fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1, "in_list_view": 1,
"in_standard_filter": 0,
"label": "Account Name", "label": "Account Name",
"length": 0,
"no_copy": 1, "no_copy": 1,
"oldfieldname": "account_name", "oldfieldname": "account_name",
"oldfieldtype": "Data", "oldfieldtype": "Data",
"permlevel": 0, "reqd": 1
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "account_number", "fieldname": "account_number",
"fieldtype": "Data", "fieldtype": "Data",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1, "in_list_view": 1,
"in_standard_filter": 1, "in_standard_filter": 1,
"label": "Account Number", "label": "Account Number",
"length": 0, "read_only": 1
"no_copy": 0,
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0", "default": "0",
"fieldname": "is_group", "fieldname": "is_group",
"fieldtype": "Check", "fieldtype": "Check",
"hidden": 0, "label": "Is Group"
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Is Group",
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "company", "fieldname": "company",
"fieldtype": "Link", "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": 1, "in_standard_filter": 1,
"label": "Company", "label": "Company",
"length": 0,
"no_copy": 0,
"oldfieldname": "company", "oldfieldname": "company",
"oldfieldtype": "Link", "oldfieldtype": "Link",
"options": "Company", "options": "Company",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1, "read_only": 1,
"remember_last_selected_value": 1, "remember_last_selected_value": 1,
"report_hide": 0, "reqd": 1
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "root_type", "fieldname": "root_type",
"fieldtype": "Select", "fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 1, "in_standard_filter": 1,
"label": "Root Type", "label": "Root Type",
"length": 0,
"no_copy": 0,
"options": "\nAsset\nLiability\nIncome\nExpense\nEquity", "options": "\nAsset\nLiability\nIncome\nExpense\nEquity",
"permlevel": 0, "read_only": 1
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "report_type", "fieldname": "report_type",
"fieldtype": "Select", "fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 1, "in_standard_filter": 1,
"label": "Report Type", "label": "Report Type",
"length": 0,
"no_copy": 0,
"options": "\nBalance Sheet\nProfit and Loss", "options": "\nBalance Sheet\nProfit and Loss",
"permlevel": 0, "read_only": 1
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:doc.is_group==0", "depends_on": "eval:doc.is_group==0",
"fieldname": "account_currency", "fieldname": "account_currency",
"fieldtype": "Link", "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": "Currency", "label": "Currency",
"length": 0, "options": "Currency"
"no_copy": 0,
"options": "Currency",
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "0", "default": "0",
"fieldname": "inter_company_account", "fieldname": "inter_company_account",
"fieldtype": "Check", "fieldtype": "Check",
"hidden": 0, "label": "Inter Company Account"
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Inter Company Account",
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break1", "fieldname": "column_break1",
"fieldtype": "Column Break", "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,
"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,
"translatable": 0,
"unique": 0,
"width": "50%" "width": "50%"
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "parent_account", "fieldname": "parent_account",
"fieldtype": "Link", "fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 1, "ignore_user_permissions": 1,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Parent Account", "label": "Parent Account",
"length": 0,
"no_copy": 0,
"oldfieldname": "parent_account", "oldfieldname": "parent_account",
"oldfieldtype": "Link", "oldfieldtype": "Link",
"options": "Account", "options": "Account",
"permlevel": 0,
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1, "reqd": 1,
"search_index": 1, "search_index": 1
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"description": "Setting Account Type helps in selecting this Account in transactions.", "description": "Setting Account Type helps in selecting this Account in transactions.",
"fieldname": "account_type", "fieldname": "account_type",
"fieldtype": "Select", "fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 1, "in_standard_filter": 1,
"label": "Account Type", "label": "Account Type",
"length": 0,
"no_copy": 0,
"oldfieldname": "account_type", "oldfieldname": "account_type",
"oldfieldtype": "Select", "oldfieldtype": "Select",
"options": "\nAccumulated Depreciation\nAsset Received But Not Billed\nBank\nCash\nChargeable\nCapital Work in Progress\nCost of Goods Sold\nDepreciation\nEquity\nExpense Account\nExpenses Included In Asset Valuation\nExpenses Included In Valuation\nFixed Asset\nIncome Account\nPayable\nReceivable\nRound Off\nStock\nStock Adjustment\nStock Received But Not Billed\nTax\nTemporary", "options": "\nAccumulated Depreciation\nAsset Received But Not Billed\nBank\nCash\nChargeable\nCapital Work in Progress\nCost of Goods Sold\nDepreciation\nEquity\nExpense Account\nExpenses Included In Asset Valuation\nExpenses Included In Valuation\nFixed Asset\nIncome Account\nPayable\nReceivable\nRound Off\nStock\nStock Adjustment\nStock Received But Not Billed\nTax\nTemporary"
"permlevel": 0,
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"description": "Rate at which this tax is applied", "description": "Rate at which this tax is applied",
"fieldname": "tax_rate", "fieldname": "tax_rate",
"fieldtype": "Float", "fieldtype": "Float",
"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": "Rate", "label": "Rate",
"length": 0,
"no_copy": 0,
"oldfieldname": "tax_rate", "oldfieldname": "tax_rate",
"oldfieldtype": "Currency", "oldfieldtype": "Currency"
"permlevel": 0,
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"description": "If the account is frozen, entries are allowed to restricted users.", "description": "If the account is frozen, entries are allowed to restricted users.",
"fieldname": "freeze_account", "fieldname": "freeze_account",
"fieldtype": "Select", "fieldtype": "Select",
"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": "Frozen", "label": "Frozen",
"length": 0,
"no_copy": 0,
"oldfieldname": "freeze_account", "oldfieldname": "freeze_account",
"oldfieldtype": "Select", "oldfieldtype": "Select",
"options": "No\nYes", "options": "No\nYes"
"permlevel": 0,
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "balance_must_be", "fieldname": "balance_must_be",
"fieldtype": "Select", "fieldtype": "Select",
"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": "Balance must be", "label": "Balance must be",
"length": 0, "options": "\nDebit\nCredit"
"no_copy": 0,
"options": "\nDebit\nCredit",
"permlevel": 0,
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "lft", "fieldname": "lft",
"fieldtype": "Int", "fieldtype": "Int",
"hidden": 1, "hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Lft", "label": "Lft",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"print_hide": 1, "print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 1, "read_only": 1,
"remember_last_selected_value": 0, "search_index": 1
"report_hide": 0,
"reqd": 0,
"search_index": 1,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "rgt", "fieldname": "rgt",
"fieldtype": "Int", "fieldtype": "Int",
"hidden": 1, "hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Rgt", "label": "Rgt",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"print_hide": 1, "print_hide": 1,
"print_hide_if_no_value": 0,
"read_only": 1, "read_only": 1,
"remember_last_selected_value": 0, "search_index": 1
"report_hide": 0,
"reqd": 0,
"search_index": 1,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "old_parent", "fieldname": "old_parent",
"fieldtype": "Data", "fieldtype": "Data",
"hidden": 1, "hidden": 1,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Old Parent", "label": "Old Parent",
"length": 0,
"no_copy": 0,
"permlevel": 0,
"print_hide": 1, "print_hide": 1,
"print_hide_if_no_value": 0, "read_only": 1
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0, "default": "0",
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"depends_on": "eval:(doc.report_type == 'Profit and Loss' && !doc.is_group)", "depends_on": "eval:(doc.report_type == 'Profit and Loss' && !doc.is_group)",
"fieldname": "include_in_gross", "fieldname": "include_in_gross",
"fieldtype": "Check", "fieldtype": "Check",
"hidden": 0, "label": "Include in gross"
"ignore_user_permissions": 0, },
"ignore_xss_filter": 0, {
"in_filter": 0, "bold": 1,
"in_global_search": 0, "default": "0",
"in_list_view": 0, "fieldname": "disabled",
"in_standard_filter": 0, "fieldtype": "Check",
"label": "Include in gross", "label": "Disable"
"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,
"translatable": 0,
"unique": 0
} }
], ],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"icon": "fa fa-money", "icon": "fa fa-money",
"idx": 1, "idx": 1,
"image_view": 0, "modified": "2019-08-23 03:40:58.441295",
"in_create": 0,
"is_submittable": 0,
"issingle": 0,
"istable": 0,
"max_attachments": 0,
"modified": "2019-03-04 14:42:07.208893",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Account", "name": "Account",
"owner": "Administrator", "owner": "Administrator",
"permissions": [ "permissions": [
{ {
"amend": 0,
"cancel": 0,
"create": 1, "create": 1,
"delete": 1, "delete": 1,
"email": 1, "email": 1,
"export": 1, "export": 1,
"if_owner": 0,
"import": 1, "import": 1,
"permlevel": 0,
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Accounts User", "role": "Accounts User",
"set_user_permissions": 0,
"share": 1, "share": 1,
"submit": 0,
"write": 1 "write": 1
}, },
{ {
"amend": 0,
"cancel": 0,
"create": 0,
"delete": 0,
"email": 1, "email": 1,
"export": 0,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Auditor", "role": "Auditor"
"set_user_permissions": 0,
"share": 0,
"submit": 0,
"write": 0
}, },
{ {
"amend": 0,
"cancel": 0,
"create": 0,
"delete": 0,
"email": 1, "email": 1,
"export": 0,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Sales User", "role": "Sales User"
"set_user_permissions": 0,
"share": 0,
"submit": 0,
"write": 0
}, },
{ {
"amend": 0,
"cancel": 0,
"create": 0,
"delete": 0,
"email": 1, "email": 1,
"export": 0,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Purchase User", "role": "Purchase User"
"set_user_permissions": 0,
"share": 0,
"submit": 0,
"write": 0
}, },
{ {
"amend": 0,
"cancel": 0,
"create": 1, "create": 1,
"delete": 1, "delete": 1,
"email": 1, "email": 1,
"export": 1, "export": 1,
"if_owner": 0,
"import": 1, "import": 1,
"permlevel": 0,
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Accounts Manager", "role": "Accounts Manager",
"set_user_permissions": 1, "set_user_permissions": 1,
"share": 1, "share": 1,
"submit": 0,
"write": 1 "write": 1
} }
], ],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"search_fields": "account_number", "search_fields": "account_number",
"show_name_in_global_search": 1, "show_name_in_global_search": 1,
"sort_field": "modified",
"sort_order": "ASC", "sort_order": "ASC",
"track_changes": 1, "track_changes": 1
"track_seen": 0,
"track_views": 0
} }

View File

@ -100,6 +100,9 @@ class Account(NestedSet):
if ancestors: if ancestors:
if frappe.get_value("Company", self.company, "allow_account_creation_against_child_company"): if frappe.get_value("Company", self.company, "allow_account_creation_against_child_company"):
return return
if not frappe.db.get_value("Account",
{'account_name': self.account_name, 'company': ancestors[0]}, 'name'):
frappe.throw(_("Please add the account to root level Company - %s" % ancestors[0])) frappe.throw(_("Please add the account to root level Company - %s" % ancestors[0]))
else: else:
descendants = get_descendants_of('Company', self.company) descendants = get_descendants_of('Company', self.company)
@ -114,24 +117,7 @@ class Account(NestedSet):
if not parent_acc_name_map: return if not parent_acc_name_map: return
for company in descendants: self.create_account_for_child_company(parent_acc_name_map, descendants)
if not parent_acc_name_map.get(company):
frappe.throw(_("While creating account for child Company {0}, parent account {1} not found. Please create the parent account in corresponding COA")
.format(company, parent_acc_name))
doc = frappe.copy_doc(self)
doc.flags.ignore_root_company_validation = True
doc.update({
"company": company,
# parent account's currency should be passed down to child account's curreny
# if it is None, it picks it up from default company currency, which might be unintended
"account_currency": self.account_currency,
"parent_account": parent_acc_name_map[company]
})
if not self.check_if_child_acc_exists(doc):
doc.save()
frappe.msgprint(_("Account {0} is added in the child company {1}")
.format(doc.name, company))
def validate_group_or_ledger(self): def validate_group_or_ledger(self):
if self.get("__islocal"): if self.get("__islocal"):
@ -173,23 +159,48 @@ class Account(NestedSet):
if frappe.db.get_value("GL Entry", {"account": self.name}): if frappe.db.get_value("GL Entry", {"account": self.name}):
frappe.throw(_("Currency can not be changed after making entries using some other currency")) frappe.throw(_("Currency can not be changed after making entries using some other currency"))
def check_if_child_acc_exists(self, doc): def create_account_for_child_company(self, parent_acc_name_map, descendants):
''' Checks if a account in parent company exists in the ''' for company in descendants:
info = frappe.db.get_value("Account", { if not parent_acc_name_map.get(company):
"account_name": doc.account_name, frappe.throw(_("While creating account for child Company {0}, parent account {1} not found. Please create the parent account in corresponding COA")
"account_number": doc.account_number .format(company, parent_acc_name))
}, ['company', 'account_currency', 'is_group', 'root_type', 'account_type', 'balance_must_be', 'account_name'], as_dict=1)
if not info: filters = {
return "account_name": self.account_name,
"company": company
}
doc = vars(doc) if self.account_number:
dict_diff = [k for k in info if k in doc and info[k] != doc[k] and k != "company"] filters["account_number"] = self.account_number
if dict_diff:
frappe.throw(_("Account {0} already exists in child company {1}. The following fields have different values, they should be same:<ul><li>{2}</li></ul>") child_account = frappe.db.get_value("Account", filters, 'name')
.format(info.account_name, info.company, '</li><li>'.join(dict_diff)))
else: if not child_account:
return True doc = frappe.copy_doc(self)
doc.flags.ignore_root_company_validation = True
doc.update({
"company": company,
# parent account's currency should be passed down to child account's curreny
# if it is None, it picks it up from default company currency, which might be unintended
"account_currency": self.account_currency,
"parent_account": parent_acc_name_map[company]
})
doc.save()
frappe.msgprint(_("Account {0} is added in the child company {1}")
.format(doc.name, company))
elif child_account:
# update the parent company's value in child companies
doc = frappe.get_doc("Account", child_account)
parent_value_changed = False
for field in ['account_type', 'account_currency',
'freeze_account', 'balance_must_be']:
if doc.get(field) != self.get(field):
parent_value_changed = True
doc.set(field, self.get(field))
if parent_value_changed:
doc.save()
def convert_group_to_ledger(self): def convert_group_to_ledger(self):
if self.check_if_child_exists(): if self.check_if_child_exists():

View File

@ -5,9 +5,13 @@ frappe.ui.form.on('Accounting Dimension', {
refresh: function(frm) { refresh: function(frm) {
frm.set_query('document_type', () => { frm.set_query('document_type', () => {
let invalid_doctypes = frappe.model.core_doctypes_list;
invalid_doctypes.push('Accounting Dimension', 'Project',
'Cost Center', 'Accounting Dimension Detail');
return { return {
filters: { filters: {
name: ['not in', ['Accounting Dimension', 'Project', 'Cost Center', 'Accounting Dimension Detail']] name: ['not in', invalid_doctypes]
} }
}; };
}); });

View File

@ -11,10 +11,20 @@ from frappe.custom.doctype.custom_field.custom_field import create_custom_field
from frappe import scrub from frappe import scrub
from frappe.utils import cstr from frappe.utils import cstr
from frappe.utils.background_jobs import enqueue from frappe.utils.background_jobs import enqueue
from frappe.model import core_doctypes_list
class AccountingDimension(Document): class AccountingDimension(Document):
def before_insert(self): def before_insert(self):
self.set_fieldname_and_label() self.set_fieldname_and_label()
def validate(self):
if self.document_type in core_doctypes_list + ('Accounting Dimension', 'Project',
'Cost Center', 'Accounting Dimension Detail') :
msg = _("Not allowed to create accounting dimension for {0}").format(self.document_type)
frappe.throw(msg)
def after_insert(self):
if frappe.flags.in_test: if frappe.flags.in_test:
make_dimension_in_accounting_doctypes(doc=self) make_dimension_in_accounting_doctypes(doc=self)
else: else:
@ -164,7 +174,7 @@ def get_accounting_dimensions(as_list=True):
return accounting_dimensions return accounting_dimensions
def get_checks_for_pl_and_bs_accounts(): def get_checks_for_pl_and_bs_accounts():
dimensions = frappe.db.sql("""SELECT p.label, p.disabled, p.fieldname, c.company, c.mandatory_for_pl, c.mandatory_for_bs dimensions = frappe.db.sql("""SELECT p.label, p.disabled, p.fieldname, c.default_dimension, c.company, c.mandatory_for_pl, c.mandatory_for_bs
FROM `tabAccounting Dimension`p ,`tabAccounting Dimension Detail` c FROM `tabAccounting Dimension`p ,`tabAccounting Dimension Detail` c
WHERE p.name = c.parent""", as_dict=1) WHERE p.name = c.parent""", as_dict=1)

View File

@ -9,12 +9,11 @@ def get_data():
'non_standard_fieldnames': { 'non_standard_fieldnames': {
'Customer': 'default_bank_account', 'Customer': 'default_bank_account',
'Supplier': 'default_bank_account', 'Supplier': 'default_bank_account',
'Journal Entry': 'bank_account_no'
}, },
'transactions': [ 'transactions': [
{ {
'label': _('Payments'), 'label': _('Payments'),
'items': ['Payment Entry', 'Payment Request', 'Payment Order'] 'items': ['Payment Entry', 'Payment Request', 'Payment Order', 'Payroll Entry']
}, },
{ {
'label': _('Party'), 'label': _('Party'),

View File

@ -2,7 +2,6 @@
"allow_copy": 1, "allow_copy": 1,
"allow_import": 1, "allow_import": 1,
"allow_rename": 1, "allow_rename": 1,
"autoname": "field:cost_center_name",
"creation": "2013-01-23 19:57:17", "creation": "2013-01-23 19:57:17",
"description": "Track separate Income and Expense for product verticals or divisions.", "description": "Track separate Income and Expense for product verticals or divisions.",
"doctype": "DocType", "doctype": "DocType",
@ -16,7 +15,7 @@
"company", "company",
"cb0", "cb0",
"is_group", "is_group",
"enabled", "disabled",
"lft", "lft",
"rgt", "rgt",
"old_parent" "old_parent"
@ -117,15 +116,15 @@
}, },
{ {
"default": "0", "default": "0",
"fieldname": "enabled", "fieldname": "disabled",
"fieldtype": "Check", "fieldtype": "Check",
"label": "Enabled" "label": "Disabled"
} }
], ],
"icon": "fa fa-money", "icon": "fa fa-money",
"idx": 1, "idx": 1,
"modified": "2019-08-22 15:05:05.559862", "modified": "2019-09-16 14:44:17.103548",
"modified_by": "sammish.thundiyil@gmail.com", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Cost Center", "name": "Cost Center",
"owner": "Administrator", "owner": "Administrator",

View File

@ -7,7 +7,7 @@ frappe.provide("erpnext.journal_entry");
frappe.ui.form.on("Journal Entry", { frappe.ui.form.on("Journal Entry", {
setup: function(frm) { setup: function(frm) {
frm.add_fetch("bank_account_no", "account", "account"); frm.add_fetch("bank_account", "account", "account");
}, },
refresh: function(frm) { refresh: function(frm) {

View File

@ -10,7 +10,7 @@
"account_type", "account_type",
"balance", "balance",
"col_break1", "col_break1",
"bank_account_no", "bank_account",
"party_type", "party_type",
"party", "party",
"party_balance", "party_balance",
@ -89,12 +89,6 @@
"fieldname": "col_break1", "fieldname": "col_break1",
"fieldtype": "Column Break" "fieldtype": "Column Break"
}, },
{
"fieldname": "bank_account_no",
"fieldtype": "Link",
"label": "Bank Account No",
"options": "Bank Account"
},
{ {
"fieldname": "party_type", "fieldname": "party_type",
"fieldtype": "Link", "fieldtype": "Link",
@ -266,11 +260,17 @@
{ {
"fieldname": "dimension_col_break", "fieldname": "dimension_col_break",
"fieldtype": "Column Break" "fieldtype": "Column Break"
},
{
"fieldname": "bank_account",
"fieldtype": "Link",
"label": "Bank Account",
"options": "Bank Account"
} }
], ],
"idx": 1, "idx": 1,
"istable": 1, "istable": 1,
"modified": "2019-07-16 17:12:08.238334", "modified": "2019-09-12 12:16:17.588399",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Journal Entry Account", "name": "Journal Entry Account",

View File

@ -66,10 +66,10 @@ frappe.ui.form.on('Payment Order', {
get_query_filters: { get_query_filters: {
bank: frm.doc.bank, bank: frm.doc.bank,
docstatus: 1, docstatus: 1,
payment_type: ("!=", "Receive"), payment_type: ["!=", "Receive"],
bank_account: frm.doc.company_bank_account, bank_account: frm.doc.company_bank_account,
paid_from: frm.doc.account, paid_from: frm.doc.account,
payment_order_status: ["=", "Initiated"], payment_order_status: ["=", "Initiated"]
} }
}); });
}, },

View File

@ -41,6 +41,8 @@ def get_pos_data():
items_list = get_items_list(pos_profile, doc.company) items_list = get_items_list(pos_profile, doc.company)
customers = get_customers_list(pos_profile) customers = get_customers_list(pos_profile)
doc.plc_conversion_rate = update_plc_conversion_rate(doc, pos_profile)
return { return {
'doc': doc, 'doc': doc,
'default_customer': pos_profile.get('customer'), 'default_customer': pos_profile.get('customer'),
@ -53,7 +55,7 @@ def get_pos_data():
'batch_no_data': get_batch_no_data(), 'batch_no_data': get_batch_no_data(),
'barcode_data': get_barcode_data(items_list), 'barcode_data': get_barcode_data(items_list),
'tax_data': get_item_tax_data(), 'tax_data': get_item_tax_data(),
'price_list_data': get_price_list_data(doc.selling_price_list), 'price_list_data': get_price_list_data(doc.selling_price_list, doc.plc_conversion_rate),
'customer_wise_price_list': get_customer_wise_price_list(), 'customer_wise_price_list': get_customer_wise_price_list(),
'bin_data': get_bin_data(pos_profile), 'bin_data': get_bin_data(pos_profile),
'pricing_rules': get_pricing_rule_data(doc), 'pricing_rules': get_pricing_rule_data(doc),
@ -62,6 +64,15 @@ def get_pos_data():
'meta': get_meta() 'meta': get_meta()
} }
def update_plc_conversion_rate(doc, pos_profile):
conversion_rate = 1.0
price_list_currency = frappe.get_cached_value("Price List", doc.selling_price_list, "currency")
if pos_profile.get("currency") != price_list_currency:
conversion_rate = get_exchange_rate(price_list_currency,
pos_profile.get("currency"), nowdate(), args="for_selling") or 1.0
return conversion_rate
def get_meta(): def get_meta():
doctype_meta = { doctype_meta = {
@ -317,14 +328,14 @@ def get_item_tax_data():
return itemwise_tax return itemwise_tax
def get_price_list_data(selling_price_list): def get_price_list_data(selling_price_list, conversion_rate):
itemwise_price_list = {} itemwise_price_list = {}
price_lists = frappe.db.sql("""Select ifnull(price_list_rate, 0) as price_list_rate, price_lists = frappe.db.sql("""Select ifnull(price_list_rate, 0) as price_list_rate,
item_code from `tabItem Price` ip where price_list = %(price_list)s""", item_code from `tabItem Price` ip where price_list = %(price_list)s""",
{'price_list': selling_price_list}, as_dict=1) {'price_list': selling_price_list}, as_dict=1)
for item in price_lists: for item in price_lists:
itemwise_price_list[item.item_code] = item.price_list_rate itemwise_price_list[item.item_code] = item.price_list_rate * conversion_rate
return itemwise_price_list return itemwise_price_list

View File

@ -12,7 +12,7 @@ from frappe.utils import (add_days, getdate, formatdate, date_diff,
from frappe.contacts.doctype.address.address import (get_address_display, from frappe.contacts.doctype.address.address import (get_address_display,
get_default_address, get_company_address) get_default_address, get_company_address)
from frappe.contacts.doctype.contact.contact import get_contact_details, get_default_contact from frappe.contacts.doctype.contact.contact import get_contact_details, get_default_contact
from erpnext.exceptions import PartyFrozen, PartyDisabled, InvalidAccountCurrency from erpnext.exceptions import PartyFrozen, InvalidAccountCurrency
from erpnext.accounts.utils import get_fiscal_year from erpnext.accounts.utils import get_fiscal_year
from erpnext import get_company_currency from erpnext import get_company_currency
@ -446,9 +446,7 @@ def validate_party_frozen_disabled(party_type, party_name):
if party_type and party_name: if party_type and party_name:
if party_type in ("Customer", "Supplier"): if party_type in ("Customer", "Supplier"):
party = frappe.get_cached_value(party_type, party_name, ["is_frozen", "disabled"], as_dict=True) party = frappe.get_cached_value(party_type, party_name, ["is_frozen", "disabled"], as_dict=True)
if party.disabled: if party.get("is_frozen"):
frappe.throw(_("{0} {1} is disabled").format(party_type, party_name), PartyDisabled)
elif party.get("is_frozen"):
frozen_accounts_modifier = frappe.db.get_single_value( 'Accounts Settings', 'frozen_accounts_modifier') frozen_accounts_modifier = frappe.db.get_single_value( 'Accounts Settings', 'frozen_accounts_modifier')
if not frozen_accounts_modifier in frappe.get_roles(): if not frozen_accounts_modifier in frappe.get_roles():
frappe.throw(_("{0} {1} is frozen").format(party_type, party_name), PartyFrozen) frappe.throw(_("{0} {1} is frozen").format(party_type, party_name), PartyFrozen)

View File

@ -446,6 +446,10 @@ class ReceivablePayableReport(object):
row.age = (getdate(self.age_as_on) - getdate(entry_date)).days or 0 row.age = (getdate(self.age_as_on) - getdate(entry_date)).days or 0
index = None index = None
if not (self.filters.range1 and self.filters.range2 and self.filters.range3 and self.filters.range4):
self.filters.range1, self.filters.range2, self.filters.range3, self.filters.range4 = 30, 60, 90, 120
for i, days in enumerate([self.filters.range1, self.filters.range2, self.filters.range3, self.filters.range4]): for i, days in enumerate([self.filters.range1, self.filters.range2, self.filters.range3, self.filters.range4]):
if row.age <= days: if row.age <= days:
index = i index = i

View File

@ -286,14 +286,14 @@ class PartyLedgerSummaryReport(object):
if parties and accounts: if parties and accounts:
if len(parties) == 1: if len(parties) == 1:
party = parties.keys()[0] party = list(parties.keys())[0]
for account, amount in iteritems(accounts): for account, amount in iteritems(accounts):
self.party_adjustment_accounts.add(account) self.party_adjustment_accounts.add(account)
self.party_adjustment_details.setdefault(party, {}) self.party_adjustment_details.setdefault(party, {})
self.party_adjustment_details[party].setdefault(account, 0) self.party_adjustment_details[party].setdefault(account, 0)
self.party_adjustment_details[party][account] += amount self.party_adjustment_details[party][account] += amount
elif len(accounts) == 1 and not has_irrelevant_entry: elif len(accounts) == 1 and not has_irrelevant_entry:
account = accounts.keys()[0] account = list(accounts.keys())[0]
self.party_adjustment_accounts.add(account) self.party_adjustment_accounts.add(account)
for party, amount in iteritems(parties): for party, amount in iteritems(parties):
self.party_adjustment_details.setdefault(party, {}) self.party_adjustment_details.setdefault(party, {})

View File

@ -17,7 +17,7 @@ def _execute(filters=None, additional_table_columns=None, additional_query_colum
filters.update({"from_date": filters.get("date_range") and filters.get("date_range")[0], "to_date": filters.get("date_range") and filters.get("date_range")[1]}) filters.update({"from_date": filters.get("date_range") and filters.get("date_range")[0], "to_date": filters.get("date_range") and filters.get("date_range")[1]})
columns = get_columns(additional_table_columns) columns = get_columns(additional_table_columns)
company_currency = erpnext.get_company_currency(filters.get('company')) company_currency = frappe.get_cached_value('Company', filters.get("company"), "default_currency")
item_list = get_items(filters, additional_query_columns) item_list = get_items(filters, additional_query_columns)
if item_list: if item_list:

View File

@ -4,11 +4,14 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import frappe import frappe
from frappe import _ from frappe import _
from erpnext.accounts.report.accounts_receivable.accounts_receivable import get_ageing_data from erpnext.accounts.report.accounts_receivable.accounts_receivable import ReceivablePayableReport
from frappe.utils import getdate, flt from frappe.utils import getdate, flt
def execute(filters=None): def execute(filters=None):
if not filters: filters = {} if not filters:
filters = {}
validate_filters(filters) validate_filters(filters)
columns = get_columns(filters) columns = get_columns(filters)
@ -24,13 +27,23 @@ def execute(filters=None):
else: else:
payment_amount = flt(d.credit) or -1 * flt(d.debit) payment_amount = flt(d.credit) or -1 * flt(d.debit)
row = [d.voucher_type, d.voucher_no, d.party_type, d.party, d.posting_date, d.against_voucher, d.update({
invoice.posting_date, invoice.due_date, d.debit, d.credit, d.remarks] "range1": 0,
"range2": 0,
"range3": 0,
"range4": 0,
"outstanding": payment_amount
})
if d.against_voucher: if d.against_voucher:
row += get_ageing_data(30, 60, 90, 120, d.posting_date, invoice.posting_date, payment_amount) ReceivablePayableReport(filters).get_ageing_data(invoice.posting_date, d)
else:
row += ["", "", "", "", ""] row = [
d.voucher_type, d.voucher_no, d.party_type, d.party, d.posting_date, d.against_voucher,
invoice.posting_date, invoice.due_date, d.debit, d.credit, d.remarks,
d.age, d.range1, d.range2, d.range3, d.range4
]
if invoice.due_date: if invoice.due_date:
row.append((getdate(d.posting_date) - getdate(invoice.due_date)).days or 0) row.append((getdate(d.posting_date) - getdate(invoice.due_date)).days or 0)

View File

@ -68,7 +68,8 @@ def _execute(filters, additional_table_columns=None, additional_query_columns=No
total_tax = 0 total_tax = 0
for tax_acc in tax_accounts: for tax_acc in tax_accounts:
if tax_acc not in income_accounts: if tax_acc not in income_accounts:
tax_amount = flt(invoice_tax_map.get(inv.name, {}).get(tax_acc)) tax_amount_precision = get_field_precision(frappe.get_meta("Sales Taxes and Charges").get_field("tax_amount"), currency=company_currency) or 2
tax_amount = flt(invoice_tax_map.get(inv.name, {}).get(tax_acc), tax_amount_precision)
total_tax += tax_amount total_tax += tax_amount
row.append(tax_amount) row.append(tax_amount)

View File

@ -6,8 +6,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "Capital Traders", "modified": "2019-02-12 05:10:02.987274",
"modified": "2018-12-12 05:10:02.987274",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "Supplier Ledger Summary", "name": "Supplier Ledger Summary",

View File

@ -6,8 +6,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "Gadgets International", "modified": "2018-09-21 11:25:00.551823",
"modified": "2018-08-21 11:25:00.551823",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "TDS Computation Summary", "name": "TDS Computation Summary",

View File

@ -6,8 +6,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "Gadgets International", "modified": "2019-09-24 13:46:16.473711",
"modified": "2018-08-21 11:33:40.804532",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Accounts", "module": "Accounts",
"name": "TDS Payable Monthly", "name": "TDS Payable Monthly",

View File

@ -345,6 +345,7 @@ class Asset(AccountsController):
if asset_movement: if asset_movement:
doc = frappe.get_doc('Asset Movement', asset_movement) doc = frappe.get_doc('Asset Movement', asset_movement)
doc.naming_series = 'ACC-ASM-.YYYY.-'
doc.submit() doc.submit()
def make_gl_entries(self): def make_gl_entries(self):

View File

@ -6,6 +6,7 @@ from __future__ import unicode_literals
import frappe import frappe
from frappe import _ from frappe import _
from frappe.utils import flt, today, getdate, cint from frappe.utils import flt, today, getdate, cint
from erpnext.accounts.doctype.accounting_dimension.accounting_dimension import get_checks_for_pl_and_bs_accounts
def post_depreciation_entries(date=None): def post_depreciation_entries(date=None):
# Return if automatic booking of asset depreciation is disabled # Return if automatic booking of asset depreciation is disabled
@ -41,6 +42,8 @@ def make_depreciation_entry(asset_name, date=None):
depreciation_cost_center = asset.cost_center or depreciation_cost_center depreciation_cost_center = asset.cost_center or depreciation_cost_center
accounting_dimensions = get_checks_for_pl_and_bs_accounts()
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):
je = frappe.new_doc("Journal Entry") je = frappe.new_doc("Journal Entry")
@ -51,22 +54,39 @@ def make_depreciation_entry(asset_name, date=None):
je.finance_book = d.finance_book je.finance_book = d.finance_book
je.remark = "Depreciation Entry against {0} worth {1}".format(asset_name, d.depreciation_amount) je.remark = "Depreciation Entry against {0} worth {1}".format(asset_name, d.depreciation_amount)
je.append("accounts", { credit_entry = {
"account": accumulated_depreciation_account, "account": accumulated_depreciation_account,
"credit_in_account_currency": d.depreciation_amount, "credit_in_account_currency": d.depreciation_amount,
"reference_type": "Asset", "reference_type": "Asset",
"reference_name": asset.name "reference_name": asset.name
}) }
je.append("accounts", { debit_entry = {
"account": depreciation_expense_account, "account": depreciation_expense_account,
"debit_in_account_currency": d.depreciation_amount, "debit_in_account_currency": d.depreciation_amount,
"reference_type": "Asset", "reference_type": "Asset",
"reference_name": asset.name, "reference_name": asset.name,
"cost_center": depreciation_cost_center "cost_center": depreciation_cost_center
}
for dimension in accounting_dimensions:
if (asset.get(dimension['fieldname']) or dimension.get('mandatory_for_bs')):
credit_entry.update({
dimension['fieldname']: asset.get(dimension['fieldname']) or dimension.get('default_dimension')
}) })
if (asset.get(dimension['fieldname']) or dimension.get('mandatory_for_pl')):
debit_entry.update({
dimension['fieldname']: asset.get(dimension['fieldname']) or dimension.get('default_dimension')
})
je.append("accounts", credit_entry)
je.append("accounts", debit_entry)
je.flags.ignore_permissions = True je.flags.ignore_permissions = True
je.save()
if not je.meta.get_workflow():
je.submit() je.submit()
d.db_set("journal_entry", je.name) d.db_set("journal_entry", je.name)

View File

@ -57,7 +57,7 @@ def calculate_next_due_date(periodicity, start_date = None, end_date = None, las
if not start_date and not last_completion_date: if not start_date and not last_completion_date:
start_date = frappe.utils.now() start_date = frappe.utils.now()
if last_completion_date and (last_completion_date > start_date or not start_date): if last_completion_date and ((start_date and last_completion_date > start_date) or not start_date):
start_date = last_completion_date start_date = last_completion_date
if periodicity == 'Daily': if periodicity == 'Daily':
next_due_date = add_days(start_date, 1) next_due_date = add_days(start_date, 1)
@ -71,10 +71,11 @@ def calculate_next_due_date(periodicity, start_date = None, end_date = None, las
next_due_date = add_years(start_date, 2) next_due_date = add_years(start_date, 2)
if periodicity == 'Quarterly': if periodicity == 'Quarterly':
next_due_date = add_months(start_date, 3) next_due_date = add_months(start_date, 3)
if end_date and (start_date >= end_date or last_completion_date >= end_date or next_due_date): if end_date and ((start_date and start_date >= end_date) or (last_completion_date and last_completion_date >= end_date) or next_due_date):
next_due_date = "" next_due_date = ""
return next_due_date return next_due_date
def update_maintenance_log(asset_maintenance, item_code, item_name, task): def update_maintenance_log(asset_maintenance, item_code, item_name, task):
asset_maintenance_log = frappe.get_value("Asset Maintenance Log", {"asset_maintenance": asset_maintenance, asset_maintenance_log = frappe.get_value("Asset Maintenance Log", {"asset_maintenance": asset_maintenance,
"task": task.maintenance_task, "maintenance_status": ('in',['Planned','Overdue'])}) "task": task.maintenance_task, "maintenance_status": ('in',['Planned','Overdue'])})

View File

@ -1,618 +1,163 @@
{ {
"allow_copy": 0,
"allow_guest_to_view": 0,
"allow_import": 1, "allow_import": 1,
"allow_rename": 0, "autoname": "naming_series:",
"autoname": "ACC-ASM-.YYYY.-.#####",
"beta": 0,
"creation": "2016-04-25 18:00:23.559973", "creation": "2016-04-25 18:00:23.559973",
"custom": 0,
"docstatus": 0,
"doctype": "DocType", "doctype": "DocType",
"document_type": "", "field_order": [
"editable_grid": 0, "naming_series",
"company",
"purpose",
"asset",
"transaction_date",
"column_break_4",
"quantity",
"select_serial_no",
"serial_no",
"section_break_7",
"source_location",
"target_location",
"column_break_10",
"from_employee",
"to_employee",
"reference",
"reference_doctype",
"reference_name",
"amended_from"
],
"fields": [ "fields": [
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "company", "fieldname": "company",
"fieldtype": "Link", "fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1, "in_list_view": 1,
"in_standard_filter": 1, "in_standard_filter": 1,
"label": "Company", "label": "Company",
"length": 0,
"no_copy": 0,
"options": "Company", "options": "Company",
"permlevel": 0,
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 1, "remember_last_selected_value": 1,
"report_hide": 0, "reqd": 1
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"default": "Transfer", "default": "Transfer",
"fieldname": "purpose", "fieldname": "purpose",
"fieldtype": "Select", "fieldtype": "Select",
"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": "Purpose", "label": "Purpose",
"length": 0,
"no_copy": 0,
"options": "\nIssue\nReceipt\nTransfer", "options": "\nIssue\nReceipt\nTransfer",
"permlevel": 0, "reqd": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "asset", "fieldname": "asset",
"fieldtype": "Link", "fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 1, "in_global_search": 1,
"in_list_view": 1, "in_list_view": 1,
"in_standard_filter": 1, "in_standard_filter": 1,
"label": "Asset", "label": "Asset",
"length": 0,
"no_copy": 0,
"options": "Asset", "options": "Asset",
"permlevel": 0, "reqd": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 0,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "transaction_date", "fieldname": "transaction_date",
"fieldtype": "Datetime", "fieldtype": "Datetime",
"hidden": 0,
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 1, "in_list_view": 1,
"in_standard_filter": 0,
"label": "Transaction Date", "label": "Transaction Date",
"length": 0, "reqd": 1
"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": 1,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_4", "fieldname": "column_break_4",
"fieldtype": "Column Break", "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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "quantity", "fieldname": "quantity",
"fieldtype": "Float", "fieldtype": "Float",
"hidden": 0, "label": "Quantity"
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Quantity",
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "select_serial_no", "fieldname": "select_serial_no",
"fieldtype": "Link", "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": "Select Serial No", "label": "Select Serial No",
"length": 0, "options": "Serial No"
"no_copy": 0,
"options": "Serial No",
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "serial_no", "fieldname": "serial_no",
"fieldtype": "Small Text", "fieldtype": "Small Text",
"hidden": 0, "label": "Serial No"
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Serial No",
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "section_break_7", "fieldname": "section_break_7",
"fieldtype": "Section Break", "fieldtype": "Section 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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fetch_from": "",
"fieldname": "source_location", "fieldname": "source_location",
"fieldtype": "Link", "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": "Source Location", "label": "Source Location",
"length": 0, "options": "Location"
"no_copy": 0,
"options": "Location",
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "target_location", "fieldname": "target_location",
"fieldtype": "Link", "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": "Target Location", "label": "Target Location",
"length": 0, "options": "Location"
"no_copy": 0,
"options": "Location",
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "column_break_10", "fieldname": "column_break_10",
"fieldtype": "Column Break", "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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "from_employee", "fieldname": "from_employee",
"fieldtype": "Link", "fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 1, "ignore_user_permissions": 1,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "From Employee", "label": "From Employee",
"length": 0, "options": "Employee"
"no_copy": 0,
"options": "Employee",
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "to_employee", "fieldname": "to_employee",
"fieldtype": "Link", "fieldtype": "Link",
"hidden": 0,
"ignore_user_permissions": 1, "ignore_user_permissions": 1,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "To Employee", "label": "To Employee",
"length": 0, "options": "Employee"
"no_copy": 0,
"options": "Employee",
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "reference", "fieldname": "reference",
"fieldtype": "Section Break", "fieldtype": "Section Break",
"hidden": 0, "label": "Reference"
"ignore_user_permissions": 0,
"ignore_xss_filter": 0,
"in_filter": 0,
"in_global_search": 0,
"in_list_view": 0,
"in_standard_filter": 0,
"label": "Reference",
"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,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "reference_doctype", "fieldname": "reference_doctype",
"fieldtype": "Link", "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": "Reference DocType", "label": "Reference DocType",
"length": 0,
"no_copy": 1, "no_copy": 1,
"options": "DocType", "options": "DocType",
"permlevel": 0, "read_only": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "reference_name", "fieldname": "reference_name",
"fieldtype": "Dynamic Link", "fieldtype": "Dynamic 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": "Reference Name", "label": "Reference Name",
"length": 0,
"no_copy": 1, "no_copy": 1,
"options": "reference_doctype", "options": "reference_doctype",
"permlevel": 0, "read_only": 1
"precision": "",
"print_hide": 0,
"print_hide_if_no_value": 0,
"read_only": 1,
"remember_last_selected_value": 0,
"report_hide": 0,
"reqd": 0,
"search_index": 0,
"set_only_once": 0,
"translatable": 0,
"unique": 0
}, },
{ {
"allow_bulk_edit": 0,
"allow_in_quick_entry": 0,
"allow_on_submit": 0,
"bold": 0,
"collapsible": 0,
"columns": 0,
"fieldname": "amended_from", "fieldname": "amended_from",
"fieldtype": "Link", "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": "Amended From", "label": "Amended From",
"length": 0,
"no_copy": 1, "no_copy": 1,
"options": "Asset Movement", "options": "Asset Movement",
"permlevel": 0,
"print_hide": 1, "print_hide": 1,
"print_hide_if_no_value": 0, "read_only": 1
"read_only": 1, },
"remember_last_selected_value": 0, {
"report_hide": 0, "default": "ACC-ASM-.YYYY.-",
"reqd": 0, "fieldname": "naming_series",
"search_index": 0, "fieldtype": "Select",
"set_only_once": 0, "label": "Series",
"translatable": 0, "options": "ACC-ASM-.YYYY.-",
"unique": 0 "reqd": 1
} }
], ],
"has_web_view": 0,
"hide_heading": 0,
"hide_toolbar": 0,
"idx": 0,
"image_view": 0,
"in_create": 0,
"is_submittable": 1, "is_submittable": 1,
"issingle": 0, "modified": "2019-09-16 16:27:53.887634",
"istable": 0,
"max_attachments": 0,
"modified": "2018-08-21 16:15:40.563655",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Assets", "module": "Assets",
"name": "Asset Movement", "name": "Asset Movement",
"name_case": "",
"owner": "Administrator", "owner": "Administrator",
"permissions": [ "permissions": [
{ {
@ -622,14 +167,10 @@
"delete": 1, "delete": 1,
"email": 1, "email": 1,
"export": 1, "export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "System Manager", "role": "System Manager",
"set_user_permissions": 0,
"share": 1, "share": 1,
"submit": 1, "submit": 1,
"write": 1 "write": 1
@ -641,14 +182,10 @@
"delete": 1, "delete": 1,
"email": 1, "email": 1,
"export": 1, "export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Accounts Manager", "role": "Accounts Manager",
"set_user_permissions": 0,
"share": 1, "share": 1,
"submit": 1, "submit": 1,
"write": 1 "write": 1
@ -660,26 +197,15 @@
"delete": 1, "delete": 1,
"email": 1, "email": 1,
"export": 1, "export": 1,
"if_owner": 0,
"import": 0,
"permlevel": 0,
"print": 1, "print": 1,
"read": 1, "read": 1,
"report": 1, "report": 1,
"role": "Stock Manager", "role": "Stock Manager",
"set_user_permissions": 0,
"share": 1, "share": 1,
"submit": 1, "submit": 1,
"write": 1 "write": 1
} }
], ],
"quick_entry": 0,
"read_only": 0,
"read_only_onload": 0,
"show_name_in_global_search": 0,
"sort_field": "modified", "sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC"
"track_changes": 0,
"track_seen": 0,
"track_views": 0
} }

View File

@ -10,7 +10,8 @@ frappe.ui.form.on("Purchase Order", {
frm.custom_make_buttons = { frm.custom_make_buttons = {
'Purchase Receipt': 'Receipt', 'Purchase Receipt': 'Receipt',
'Purchase Invoice': 'Invoice', 'Purchase Invoice': 'Invoice',
'Stock Entry': 'Material to Supplier' 'Stock Entry': 'Material to Supplier',
'Payment Entry': 'Payment'
} }
frm.set_query("reserve_warehouse", "supplied_items", function() { frm.set_query("reserve_warehouse", "supplied_items", function() {
@ -196,10 +197,10 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
if(items.length >= 1){ if(items.length >= 1){
me.raw_material_data = []; me.raw_material_data = [];
me.show_dialog = 1; me.show_dialog = 1;
let title = ""; let title = __('Transfer Material to Supplier');
let fields = [ let fields = [
{fieldtype:'Section Break', label: __('Raw Materials')}, {fieldtype:'Section Break', label: __('Raw Materials')},
{fieldname: 'sub_con_rm_items', fieldtype: 'Table', {fieldname: 'sub_con_rm_items', fieldtype: 'Table', label: __('Items'),
fields: [ fields: [
{ {
fieldtype:'Data', fieldtype:'Data',
@ -271,7 +272,7 @@ erpnext.buying.PurchaseOrderController = erpnext.buying.BuyingController.extend(
'item_code': item.main_item_code, 'item_code': item.main_item_code,
'rm_item_code': item.rm_item_code, 'rm_item_code': item.rm_item_code,
'item_name': item.rm_item_code, 'item_name': item.rm_item_code,
'qty': item.required_qty, 'qty': item.required_qty - item.supplied_qty,
'warehouse':item.reserve_warehouse, 'warehouse':item.reserve_warehouse,
'rate':item.rate, 'rate':item.rate,
'amount':item.amount, 'amount':item.amount,

View File

@ -5,7 +5,6 @@ from __future__ import unicode_literals
import frappe, unittest import frappe, unittest
from erpnext.accounts.party import get_due_date from erpnext.accounts.party import get_due_date
from erpnext.exceptions import PartyDisabled
from frappe.test_runner import make_test_records from frappe.test_runner import make_test_records
test_dependencies = ['Payment Term', 'Payment Terms Template'] test_dependencies = ['Payment Term', 'Payment Terms Template']
@ -71,7 +70,7 @@ class TestSupplier(unittest.TestCase):
po = create_purchase_order(do_not_save=True) po = create_purchase_order(do_not_save=True)
self.assertRaises(PartyDisabled, po.save) self.assertRaises(frappe.ValidationError, po.save)
frappe.db.set_value("Supplier", "_Test Supplier", "disabled", 0) frappe.db.set_value("Supplier", "_Test Supplier", "disabled", 0)

View File

@ -60,7 +60,7 @@ def get_employees_with_number(number):
employee_emails = [employee.user_id for employee in employees] employee_emails = [employee.user_id for employee in employees]
frappe.cache().hset('employees_with_number', number, employee_emails) frappe.cache().hset('employees_with_number', number, employee_emails)
return employee return employee_emails
def set_caller_information(doc, state): def set_caller_information(doc, state):
'''Called from hooks on creation of Lead or Contact''' '''Called from hooks on creation of Lead or Contact'''

View File

@ -440,17 +440,17 @@ def get_batch_numbers(doctype, txt, searchfield, start, page_len, filters):
@frappe.whitelist() @frappe.whitelist()
def item_manufacturer_query(doctype, txt, searchfield, start, page_len, filters): def item_manufacturer_query(doctype, txt, searchfield, start, page_len, filters):
search_txt = "{0}%".format(txt) item_filters = [
['manufacturer', 'like', '%' + txt + '%'],
['item_code', '=', filters.get("item_code")]
]
item_filters = { item_manufacturers = frappe.get_all(
'manufacturer': ('like', search_txt), "Item Manufacturer",
'item_code': filters.get("item_code") fields=["manufacturer", "manufacturer_part_no"],
}
return frappe.get_all("Item Manufacturer",
fields = "manufacturer",
filters=item_filters, filters=item_filters,
limit_start=start, limit_start=start,
limit_page_length=page_len, limit_page_length=page_len,
as_list=1 as_list=1
) )
return item_manufacturers

File diff suppressed because it is too large Load Diff

View File

@ -18,6 +18,7 @@ frappe.listview_settings['Opportunity'] = {
listview.call_for_selected_items(method, {"status": "Closed"}); listview.call_for_selected_items(method, {"status": "Closed"});
}); });
if(listview.page.fields_dict.opportunity_from) {
listview.page.fields_dict.opportunity_from.get_query = function() { listview.page.fields_dict.opportunity_from.get_query = function() {
return { return {
"filters": { "filters": {
@ -26,4 +27,5 @@ frappe.listview_settings['Opportunity'] = {
}; };
}; };
} }
}
}; };

View File

@ -7,8 +7,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "", "modified": "2019-04-17 00:20:27.248275",
"modified": "2017-04-17 00:20:27.248275",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "CRM", "module": "CRM",
"name": "Campaign Efficiency", "name": "Campaign Efficiency",

View File

@ -6,8 +6,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "", "modified": "2019-09-19 14:40:52.035394",
"modified": "2018-09-17 14:40:52.035394",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "CRM", "module": "CRM",
"name": "Lead Conversion Time", "name": "Lead Conversion Time",

View File

@ -7,8 +7,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "Shishuvan Secondary School", "modified": "2019-02-08 15:11:35.339434",
"modified": "2018-02-08 15:11:35.339434",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Education", "module": "Education",
"name": "Final Assessment Grades", "name": "Final Assessment Grades",

View File

@ -89,8 +89,6 @@ def request_and_fetch_report_id(report_type, start_date=None, end_date=None, mar
end_date=end_date, end_date=end_date,
marketplaceids=marketplaceids) marketplaceids=marketplaceids)
#add time delay to wait for amazon to generate report
time.sleep(20)
report_request_id = report_response.parsed["ReportRequestInfo"]["ReportRequestId"]["value"] report_request_id = report_response.parsed["ReportRequestInfo"]["ReportRequestId"]["value"]
generated_report_id = None generated_report_id = None
#poll to get generated report #poll to get generated report

View File

@ -10,6 +10,7 @@ import urllib
import hashlib import hashlib
import hmac import hmac
import base64 import base64
import six
from erpnext.erpnext_integrations.doctype.amazon_mws_settings import xml_utils from erpnext.erpnext_integrations.doctype.amazon_mws_settings import xml_utils
import re import re
try: try:
@ -77,6 +78,7 @@ def remove_empty(d):
return d return d
def remove_namespace(xml): def remove_namespace(xml):
xml = xml.decode('utf-8')
regex = re.compile(' xmlns(:ns2)?="[^"]+"|(ns2:)|(xml:)') regex = re.compile(' xmlns(:ns2)?="[^"]+"|(ns2:)|(xml:)')
return regex.sub('', xml) return regex.sub('', xml)
@ -172,9 +174,10 @@ class MWS(object):
'SignatureMethod': 'HmacSHA256', 'SignatureMethod': 'HmacSHA256',
} }
params.update(extra_data) params.update(extra_data)
request_description = '&'.join(['%s=%s' % (k, urllib.quote(params[k], safe='-_.~').encode('utf-8')) for k in sorted(params)]) quote = urllib.quote if six.PY2 else urllib.parse.quote
request_description = '&'.join(['%s=%s' % (k, quote(params[k], safe='-_.~')) for k in sorted(params)])
signature = self.calc_signature(method, request_description) signature = self.calc_signature(method, request_description)
url = '%s%s?%s&Signature=%s' % (self.domain, self.uri, request_description, urllib.quote(signature)) url = '%s%s?%s&Signature=%s' % (self.domain, self.uri, request_description, quote(signature))
headers = {'User-Agent': 'python-amazon-mws/0.0.1 (Language=Python)'} headers = {'User-Agent': 'python-amazon-mws/0.0.1 (Language=Python)'}
headers.update(kwargs.get('extra_headers', {})) headers.update(kwargs.get('extra_headers', {}))
@ -218,7 +221,10 @@ class MWS(object):
"""Calculate MWS signature to interface with Amazon """Calculate MWS signature to interface with Amazon
""" """
sig_data = method + '\n' + self.domain.replace('https://', '').lower() + '\n' + self.uri + '\n' + request_description sig_data = method + '\n' + self.domain.replace('https://', '').lower() + '\n' + self.uri + '\n' + request_description
return base64.b64encode(hmac.new(str(self.secret_key), sig_data, hashlib.sha256).digest()) sig_data = sig_data.encode('utf-8')
secret_key = self.secret_key.encode('utf-8')
digest = hmac.new(secret_key, sig_data, hashlib.sha256).digest()
return base64.b64encode(digest).decode('utf-8')
def get_timestamp(self): def get_timestamp(self):
""" """

View File

@ -1,5 +1,6 @@
import frappe import frappe
import requests import requests
from frappe import _
# api/method/erpnext.erpnext_integrations.exotel_integration.handle_incoming_call # api/method/erpnext.erpnext_integrations.exotel_integration.handle_incoming_call
# api/method/erpnext.erpnext_integrations.exotel_integration.handle_end_call # api/method/erpnext.erpnext_integrations.exotel_integration.handle_end_call
@ -7,6 +8,7 @@ import requests
@frappe.whitelist(allow_guest=True) @frappe.whitelist(allow_guest=True)
def handle_incoming_call(**kwargs): def handle_incoming_call(**kwargs):
try:
exotel_settings = get_exotel_settings() exotel_settings = get_exotel_settings()
if not exotel_settings.enabled: return if not exotel_settings.enabled: return
@ -20,6 +22,10 @@ def handle_incoming_call(**kwargs):
create_call_log(call_payload) create_call_log(call_payload)
else: else:
update_call_log(call_payload, call_log=call_log) update_call_log(call_payload, call_log=call_log)
except Exception as e:
frappe.db.rollback()
frappe.log_error(title=_('Error in Exotel incoming call'))
frappe.db.commit()
@frappe.whitelist(allow_guest=True) @frappe.whitelist(allow_guest=True)
def handle_end_call(**kwargs): def handle_end_call(**kwargs):

View File

@ -5,4 +5,3 @@ import frappe
class PartyFrozen(frappe.ValidationError): pass class PartyFrozen(frappe.ValidationError): pass
class InvalidAccountCurrency(frappe.ValidationError): pass class InvalidAccountCurrency(frappe.ValidationError): pass
class InvalidCurrency(frappe.ValidationError): pass class InvalidCurrency(frappe.ValidationError): pass
class PartyDisabled(frappe.ValidationError):pass

File diff suppressed because it is too large Load Diff

View File

@ -439,7 +439,7 @@ def get_leave_details(employee, date):
return ret return ret
@frappe.whitelist() @frappe.whitelist()
def get_leave_balance_on(employee, leave_type, date, to_date=nowdate(), consider_all_leaves_in_the_allocation_period=False): def get_leave_balance_on(employee, leave_type, date, to_date=None, consider_all_leaves_in_the_allocation_period=False):
''' '''
Returns leave balance till date Returns leave balance till date
:param employee: employee name :param employee: employee name
@ -449,6 +449,9 @@ def get_leave_balance_on(employee, leave_type, date, to_date=nowdate(), consider
:param consider_all_leaves_in_the_allocation_period: consider all leaves taken till the allocation end date :param consider_all_leaves_in_the_allocation_period: consider all leaves taken till the allocation end date
''' '''
if not to_date:
to_date = nowdate()
allocation_records = get_leave_allocation_records(employee, date, leave_type) allocation_records = get_leave_allocation_records(employee, date, leave_type)
allocation = allocation_records.get(leave_type, frappe._dict()) allocation = allocation_records.get(leave_type, frappe._dict())

View File

@ -37,8 +37,9 @@
"cost_center", "cost_center",
"account", "account",
"payment_account", "payment_account",
"section_break2",
"amended_from", "amended_from",
"column_break_33",
"bank_account",
"salary_slips_created", "salary_slips_created",
"salary_slips_submitted" "salary_slips_submitted"
], ],
@ -206,15 +207,12 @@
{ {
"allow_on_submit": 1, "allow_on_submit": 1,
"description": "Select Payment Account to make Bank Entry", "description": "Select Payment Account to make Bank Entry",
"fetch_from": "bank_account.account",
"fieldname": "payment_account", "fieldname": "payment_account",
"fieldtype": "Link", "fieldtype": "Link",
"label": "Payment Account", "label": "Payment Account",
"options": "Account" "options": "Account"
}, },
{
"fieldname": "section_break2",
"fieldtype": "Section Break"
},
{ {
"fieldname": "amended_from", "fieldname": "amended_from",
"fieldtype": "Link", "fieldtype": "Link",
@ -248,11 +246,21 @@
{ {
"fieldname": "dimension_col_break", "fieldname": "dimension_col_break",
"fieldtype": "Column Break" "fieldtype": "Column Break"
},
{
"fieldname": "bank_account",
"fieldtype": "Link",
"label": "Bank Account",
"options": "Bank Account"
},
{
"fieldname": "column_break_33",
"fieldtype": "Column Break"
} }
], ],
"icon": "fa fa-cog", "icon": "fa fa-cog",
"is_submittable": 1, "is_submittable": 1,
"modified": "2019-05-25 22:47:49.977955", "modified": "2019-09-12 15:46:31.436381",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "HR", "module": "HR",
"name": "Payroll Entry", "name": "Payroll Entry",

View File

@ -39,7 +39,7 @@ class PayrollEntry(Document):
and for which salary structure exists and for which salary structure exists
""" """
cond = self.get_filter_condition() cond = self.get_filter_condition()
cond += self.get_joining_releiving_condition() cond += self.get_joining_relieving_condition()
condition = '' condition = ''
if self.payroll_frequency: if self.payroll_frequency:
@ -93,7 +93,7 @@ class PayrollEntry(Document):
return cond return cond
def get_joining_releiving_condition(self): def get_joining_relieving_condition(self):
cond = """ cond = """
and ifnull(t1.date_of_joining, '0000-00-00') <= '%(end_date)s' and ifnull(t1.date_of_joining, '0000-00-00') <= '%(end_date)s'
and ifnull(t1.relieving_date, '2199-12-31') >= '%(start_date)s' and ifnull(t1.relieving_date, '2199-12-31') >= '%(start_date)s'
@ -341,6 +341,7 @@ class PayrollEntry(Document):
journal_entry.set("accounts", [ journal_entry.set("accounts", [
{ {
"account": self.payment_account, "account": self.payment_account,
"bank_account": self.bank_account,
"credit_in_account_currency": payment_amount "credit_in_account_currency": payment_amount
}, },
{ {

View File

@ -60,8 +60,8 @@ def get_data(args):
existing_attendance = {} existing_attendance = {}
if existing_attendance_records \ if existing_attendance_records \
and tuple([getdate(date), employee.name]) in existing_attendance_records \ and tuple([getdate(date), employee.name]) in existing_attendance_records \
and getdate(employee.date_of_joining) >= getdate(date) \ and getdate(employee.date_of_joining) <= getdate(date) \
and getdate(employee.relieving_date) <= getdate(date): and getdate(employee.relieving_date) >= getdate(date):
existing_attendance = existing_attendance_records[tuple([getdate(date), employee.name])] existing_attendance = existing_attendance_records[tuple([getdate(date), employee.name])]
row = [ row = [
existing_attendance and existing_attendance.name or "", existing_attendance and existing_attendance.name or "",

View File

@ -7,8 +7,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "Gadgets International", "modified": "2019-04-26 16:57:52.558895",
"modified": "2019-03-26 16:57:52.558895",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "HR", "module": "HR",
"name": "Bank Remittance", "name": "Bank Remittance",

View File

@ -7,8 +7,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "sapcon-old", "modified": "2019-09-06 11:18:06.209397",
"modified": "2019-09-05 11:18:06.209397",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "HR", "module": "HR",
"name": "Employee Leave Balance Summary", "name": "Employee Leave Balance Summary",

View File

@ -648,7 +648,7 @@ def get_bom_items_as_dict(bom, company, qty=1, fetch_exploded=1, fetch_scrap_ite
item_dict[item.item_code] = item item_dict[item.item_code] = item
for item, item_details in item_dict.items(): for item, item_details in item_dict.items():
for d in [["Account", "expense_account", "default_expense_account"], for d in [["Account", "expense_account", "stock_adjustment_account"],
["Cost Center", "cost_center", "cost_center"], ["Warehouse", "default_warehouse", ""]]: ["Cost Center", "cost_center", "cost_center"], ["Warehouse", "default_warehouse", ""]]:
company_in_record = frappe.db.get_value(d[0], item_details.get(d[1]), "company") company_in_record = frappe.db.get_value(d[0], item_details.get(d[1]), "company")
if not item_details.get(d[1]) or (company_in_record and company != company_in_record): if not item_details.get(d[1]) or (company_in_record and company != company_in_record):

View File

@ -105,7 +105,6 @@ class JobCard(Document):
for_quantity, time_in_mins = 0, 0 for_quantity, time_in_mins = 0, 0
from_time_list, to_time_list = [], [] from_time_list, to_time_list = [], []
for d in frappe.get_all('Job Card', for d in frappe.get_all('Job Card',
filters = {'docstatus': 1, 'operation_id': self.operation_id}): filters = {'docstatus': 1, 'operation_id': self.operation_id}):
doc = frappe.get_doc('Job Card', d.name) doc = frappe.get_doc('Job Card', d.name)
@ -125,8 +124,8 @@ class JobCard(Document):
if data.name == self.operation_id: if data.name == self.operation_id:
data.completed_qty = for_quantity data.completed_qty = for_quantity
data.actual_operation_time = time_in_mins data.actual_operation_time = time_in_mins
data.actual_start_time = min(from_time_list) data.actual_start_time = min(from_time_list) if from_time_list else None
data.actual_end_time = max(to_time_list) data.actual_end_time = max(to_time_list) if to_time_list else None
wo.flags.ignore_validate_update_after_submit = True wo.flags.ignore_validate_update_after_submit = True
wo.update_operation_status() wo.update_operation_status()

View File

@ -272,11 +272,12 @@ frappe.ui.form.on("Production Plan Item", {
frappe.ui.form.on("Material Request Plan Item", { frappe.ui.form.on("Material Request Plan Item", {
warehouse: function(frm, cdt, cdn) { warehouse: function(frm, cdt, cdn) {
const row = locals[cdt][cdn]; const row = locals[cdt][cdn];
if (row.warehouse && row.item_code) { if (row.warehouse && row.item_code && frm.doc.company) {
frappe.call({ frappe.call({
method: "erpnext.manufacturing.doctype.production_plan.production_plan.get_bin_details", method: "erpnext.manufacturing.doctype.production_plan.production_plan.get_bin_details",
args: { args: {
row: row, row: row,
company: frm.doc.company,
for_warehouse: row.warehouse for_warehouse: row.warehouse
}, },
callback: function(r) { callback: function(r) {

View File

@ -6,8 +6,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "Gadgets International", "modified": "2018-06-28 16:22:24.040106",
"modified": "2018-05-28 16:22:24.040106",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Manufacturing", "module": "Manufacturing",
"name": "BOM Variance Report", "name": "BOM Variance Report",

View File

@ -635,3 +635,5 @@ erpnext.patches.v12_0.remove_bank_remittance_custom_fields
erpnext.patches.v12_0.generate_leave_ledger_entries erpnext.patches.v12_0.generate_leave_ledger_entries
erpnext.patches.v12_0.move_credit_limit_to_customer_credit_limit erpnext.patches.v12_0.move_credit_limit_to_customer_credit_limit
erpnext.patches.v12_0.add_variant_of_in_item_attribute_table erpnext.patches.v12_0.add_variant_of_in_item_attribute_table
erpnext.patches.v12_0.rename_bank_account_field_in_journal_entry_account
erpnext.patches.v12_0.create_default_energy_point_rules

View File

@ -0,0 +1,6 @@
import frappe
from erpnext.setup.install import create_default_energy_point_rules
def execute():
frappe.reload_doc('social', 'doctype', 'energy_point_rule')
create_default_energy_point_rules()

View File

@ -0,0 +1,17 @@
# Copyright (c) 2019, Frappe and Contributors
# License: GNU General Public License v3. See license.txt
from __future__ import unicode_literals
import frappe
from frappe.model.utils.rename_field import rename_field
def execute():
''' Change the fieldname from bank_account_no to bank_account '''
if not frappe.get_meta("Journal Entry Account").has_field("bank_account"):
frappe.reload_doc("Accounts", "doctype", "Journal Entry Account")
update_journal_entry_account_fieldname()
def update_journal_entry_account_fieldname():
''' maps data from old field to the new field '''
if frappe.db.has_column('Journal Entry Account', 'bank_account_no'):
rename_field("Journal Entry Account", "bank_account_no", "bank_account")

View File

@ -4,6 +4,7 @@
"creation": "2013-01-29 19:25:50", "creation": "2013-01-29 19:25:50",
"doctype": "DocType", "doctype": "DocType",
"document_type": "Setup", "document_type": "Setup",
"engine": "InnoDB",
"field_order": [ "field_order": [
"subject", "subject",
"project", "project",
@ -14,6 +15,7 @@
"status", "status",
"priority", "priority",
"task_weight", "task_weight",
"completed_by",
"color", "color",
"parent_task", "parent_task",
"sb_timeline", "sb_timeline",
@ -53,10 +55,10 @@
"fieldname": "subject", "fieldname": "subject",
"fieldtype": "Data", "fieldtype": "Data",
"in_global_search": 1, "in_global_search": 1,
"in_standard_filter": 1,
"label": "Subject", "label": "Subject",
"reqd": 1, "reqd": 1,
"search_index": 1, "search_index": 1
"in_standard_filter": 1
}, },
{ {
"bold": 1, "bold": 1,
@ -183,6 +185,7 @@
"label": "% Progress" "label": "% Progress"
}, },
{ {
"default": "0",
"fieldname": "is_milestone", "fieldname": "is_milestone",
"fieldtype": "Check", "fieldtype": "Check",
"in_list_view": 1, "in_list_view": 1,
@ -348,12 +351,18 @@
"ignore_user_permissions": 1, "ignore_user_permissions": 1,
"label": "Old Parent", "label": "Old Parent",
"read_only": 1 "read_only": 1
},
{
"fieldname": "completed_by",
"fieldtype": "Link",
"label": "Completed By",
"options": "User"
} }
], ],
"icon": "fa fa-check", "icon": "fa fa-check",
"idx": 1, "idx": 1,
"max_attachments": 5, "max_attachments": 5,
"modified": "2019-06-19 09:51:15.599416", "modified": "2019-09-10 13:46:24.631754",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Projects", "module": "Projects",
"name": "Task", "name": "Task",
@ -374,6 +383,7 @@
"search_fields": "subject", "search_fields": "subject",
"show_name_in_global_search": 1, "show_name_in_global_search": 1,
"show_preview_popup": 1, "show_preview_popup": 1,
"sort_field": "modified",
"sort_order": "DESC", "sort_order": "DESC",
"timeline_field": "project", "timeline_field": "project",
"title_field": "subject", "title_field": "subject",

View File

@ -293,7 +293,7 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({
items: my_items items: my_items
}, },
callback: function(r) { callback: function(r) {
if(!r.message) { if(!r.message || r.message.length == 0) {
frappe.throw(__("No pending Material Requests found to link for the given items.")) frappe.throw(__("No pending Material Requests found to link for the given items."))
} }
else { else {

View File

@ -277,8 +277,30 @@ erpnext.TransactionController = erpnext.taxes_and_totals.extend({
this.set_dynamic_labels(); this.set_dynamic_labels();
this.setup_sms(); this.setup_sms();
this.setup_quality_inspection(); this.setup_quality_inspection();
this.frm.fields_dict["scan_barcode"] && this.frm.fields_dict["scan_barcode"].set_value(""); let scan_barcode_field = this.frm.get_field('scan_barcode');
this.frm.fields_dict["scan_barcode"] && this.frm.fields_dict["scan_barcode"].set_new_description(""); if (scan_barcode_field) {
scan_barcode_field.set_value("");
scan_barcode_field.set_new_description("");
if (frappe.is_mobile()) {
if (scan_barcode_field.$input_wrapper.find('.input-group').length) return;
let $input_group = $('<div class="input-group">');
scan_barcode_field.$input_wrapper.find('.control-input').append($input_group);
$input_group.append(scan_barcode_field.$input);
$(`<span class="input-group-btn" style="vertical-align: top">
<button class="btn btn-default border" type="button">
<i class="fa fa-camera text-muted"></i>
</button>
</span>`)
.on('click', '.btn', () => {
frappe.barcode.scan_barcode().then(barcode => {
scan_barcode_field.set_value(barcode);
});
})
.appendTo($input_group);
}
}
}, },
scan_barcode: function() { scan_barcode: function() {

View File

@ -2,6 +2,7 @@ frappe.provide('frappe.ui.form');
frappe.ui.form.CustomerQuickEntryForm = frappe.ui.form.QuickEntryForm.extend({ frappe.ui.form.CustomerQuickEntryForm = frappe.ui.form.QuickEntryForm.extend({
init: function(doctype, after_insert) { init: function(doctype, after_insert) {
this.skip_redirect_on_error = true;
this._super(doctype, after_insert); this._super(doctype, after_insert);
}, },
@ -37,8 +38,7 @@ frappe.ui.form.CustomerQuickEntryForm = frappe.ui.form.QuickEntryForm.extend({
{ {
label: __("Address Line 1"), label: __("Address Line 1"),
fieldname: "address_line1", fieldname: "address_line1",
fieldtype: "Data", fieldtype: "Data"
reqd: 1
}, },
{ {
label: __("Address Line 2"), label: __("Address Line 2"),
@ -56,8 +56,7 @@ frappe.ui.form.CustomerQuickEntryForm = frappe.ui.form.QuickEntryForm.extend({
{ {
label: __("City"), label: __("City"),
fieldname: "city", fieldname: "city",
fieldtype: "Data", fieldtype: "Data"
reqd: 1,
}, },
{ {
label: __("State"), label: __("State"),
@ -68,8 +67,7 @@ frappe.ui.form.CustomerQuickEntryForm = frappe.ui.form.QuickEntryForm.extend({
label: __("Country"), label: __("Country"),
fieldname: "country", fieldname: "country",
fieldtype: "Link", fieldtype: "Link",
options: "Country", options: "Country"
reqd: 1
}, },
{ {
label: __("Customer POS Id"), label: __("Customer POS Id"),

View File

@ -1,5 +1,11 @@
{%- macro format_float(value, precision=2) -%} {%- macro format_float(value, precision=2) -%}
{{ value|round(frappe.utils.cint(precision)) }} {%- if frappe.utils.cint(precision) == 3 %}
{{ "%.3f" % value|abs }}
{%- elif frappe.utils.cint(precision) == 4 -%}
{{ "%.4f" % value|abs }}
{%- else -%}
{{ "%.2f" % value|abs }}
{%- endif %}
{%- endmacro -%} {%- endmacro -%}
{%- macro render_address(address) %} {%- macro render_address(address) %}

View File

@ -6,8 +6,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "Standard", "modified": "2019-04-26 12:59:38.603649",
"modified": "2018-04-26 12:59:38.603649",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Regional", "module": "Regional",
"name": "HSN-wise-summary of outward supplies", "name": "HSN-wise-summary of outward supplies",

View File

@ -357,6 +357,16 @@ def make_contact(args, is_primary_contact=1):
return contact return contact
def make_address(args, is_primary_address=1): def make_address(args, is_primary_address=1):
reqd_fields = []
for field in ['city', 'country']:
if not args.get(field):
reqd_fields.append( '<li>' + field.title() + '</li>')
if reqd_fields:
msg = _("Following fields are mandatory to create address:")
frappe.throw("{0} <br><br> <ul>{1}</ul>".format(msg, '\n'.join(reqd_fields)),
title = _("Missing Values Required"))
address = frappe.get_doc({ address = frappe.get_doc({
'doctype': 'Address', 'doctype': 'Address',
'address_title': args.get('name'), 'address_title': args.get('name'),

View File

@ -8,7 +8,7 @@ import unittest
from erpnext.accounts.party import get_due_date from erpnext.accounts.party import get_due_date
from frappe.test_runner import make_test_records from frappe.test_runner import make_test_records
from erpnext.exceptions import PartyFrozen, PartyDisabled from erpnext.exceptions import PartyFrozen
from frappe.utils import flt from frappe.utils import flt
from erpnext.selling.doctype.customer.customer import get_credit_limit, get_customer_outstanding from erpnext.selling.doctype.customer.customer import get_credit_limit, get_customer_outstanding
from erpnext.tests.utils import create_test_contact_and_address from erpnext.tests.utils import create_test_contact_and_address
@ -178,7 +178,7 @@ class TestCustomer(unittest.TestCase):
so = make_sales_order(do_not_save=True) so = make_sales_order(do_not_save=True)
self.assertRaises(PartyDisabled, so.save) self.assertRaises(frappe.ValidationError, so.save)
frappe.db.set_value("Customer", "_Test Customer", "disabled", 0) frappe.db.set_value("Customer", "_Test Customer", "disabled", 0)

View File

@ -11,7 +11,8 @@ frappe.ui.form.on("Sales Order", {
'Sales Invoice': 'Invoice', 'Sales Invoice': 'Invoice',
'Material Request': 'Material Request', 'Material Request': 'Material Request',
'Purchase Order': 'Purchase Order', 'Purchase Order': 'Purchase Order',
'Project': 'Project' 'Project': 'Project',
'Payment Entry': "Payment"
} }
frm.add_fetch('customer', 'tax_id', 'tax_id'); frm.add_fetch('customer', 'tax_id', 'tax_id');

View File

@ -60,7 +60,7 @@ def get_details(filters):
conditions = "" conditions = ""
if filters.get("customer"): if filters.get("customer"):
conditions += " AND c.name = " + filters.get("customer") conditions += " AND c.name = '" + filters.get("customer") + "'"
return frappe.db.sql("""SELECT return frappe.db.sql("""SELECT
c.name, c.customer_name, c.name, c.customer_name,
@ -69,6 +69,6 @@ def get_details(filters):
FROM `tabCustomer` c, `tabCustomer Credit Limit` ccl FROM `tabCustomer` c, `tabCustomer Credit Limit` ccl
WHERE WHERE
c.name = ccl.parent c.name = ccl.parent
AND ccl.company = %s AND ccl.company = '{0}'
{0} {1}
""".format(conditions), (filters.get("company")), as_dict=1) #nosec """.format( filters.get("company"),conditions), as_dict=1) #nosec

View File

@ -7,8 +7,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "Delta9", "modified": "2019-06-14 03:25:36.263179",
"modified": "2019-06-12 03:25:36.263179",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Selling", "module": "Selling",
"name": "Customer-wise Item Price", "name": "Customer-wise Item Price",

View File

@ -7,8 +7,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "Gadgets International", "modified": "2019-04-15 15:22:15.012318",
"modified": "2019-03-15 15:22:15.012318",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Selling", "module": "Selling",
"name": "Sales Partner Commission Summary", "name": "Sales Partner Commission Summary",

View File

@ -7,8 +7,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "Gadgets International", "modified": "2019-04-25 18:22:37.323995",
"modified": "2019-03-25 18:22:37.323995",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Selling", "module": "Selling",
"name": "Sales Partner Target Variance based on Item Group", "name": "Sales Partner Target Variance based on Item Group",

View File

@ -7,8 +7,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "Gadgets International", "modified": "2019-04-25 18:15:09.920739",
"modified": "2019-03-25 18:15:09.920739",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Selling", "module": "Selling",
"name": "Sales Partner Transaction Summary", "name": "Sales Partner Transaction Summary",

View File

@ -7,8 +7,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "Gadgets International", "modified": "2019-04-25 22:16:49.040998",
"modified": "2019-03-25 22:16:49.040998",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Selling", "module": "Selling",
"name": "Sales Person Target Variance Based On Item Group", "name": "Sales Person Target Variance Based On Item Group",

View File

@ -7,8 +7,7 @@
"doctype": "Report", "doctype": "Report",
"idx": 0, "idx": 0,
"is_standard": "Yes", "is_standard": "Yes",
"letter_head": "Gadgets International", "modified": "2019-04-25 22:20:59.033199",
"modified": "2019-03-25 22:20:59.033199",
"modified_by": "Administrator", "modified_by": "Administrator",
"module": "Selling", "module": "Selling",
"name": "Territory Target Variance Based On Item Group", "name": "Territory Target Variance Based On Item Group",

View File

@ -234,7 +234,7 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({
args: { args: {
item_code: item.item_code, item_code: item.item_code,
warehouse: item.warehouse, warehouse: item.warehouse,
has_batch_no: has_batch_no, has_batch_no: has_batch_no || 0,
stock_qty: item.stock_qty, stock_qty: item.stock_qty,
serial_no: item.serial_no || "", serial_no: item.serial_no || "",
}, },

View File

@ -0,0 +1,58 @@
from __future__ import unicode_literals
from frappe import _
doctype_rule_map = {
'Item': {
'points': 5,
'for_doc_event': 'New'
},
'Customer': {
'points': 5,
'for_doc_event': 'New'
},
'Supplier': {
'points': 5,
'for_doc_event': 'New'
},
'Lead': {
'points': 2,
'for_doc_event': 'New'
},
'Opportunity': {
'points': 10,
'for_doc_event': 'Custom',
'condition': 'doc.status=="Converted"',
'rule_name': _('On Converting Opportunity'),
'user_field': 'converted_by'
},
'Sales Order': {
'points': 10,
'for_doc_event': 'Submit',
'rule_name': _('On Sales Order Submission'),
'user_field': 'modified_by'
},
'Purchase Order': {
'points': 10,
'for_doc_event': 'Submit',
'rule_name': _('On Purchase Order Submission'),
'user_field': 'modified_by'
},
'Task': {
'points': 5,
'condition': 'doc.status == "Completed"',
'rule_name': _('On Task Completion'),
'user_field': 'completed_by'
}
}
def get_default_energy_point_rules():
return [{
'doctype': 'Energy Point Rule',
'reference_doctype': doctype,
'for_doc_event': rule.get('for_doc_event') or 'Custom',
'condition': rule.get('condition'),
'rule_name': rule.get('rule_name') or _('On {0} Creation').format(doctype),
'points': rule.get('points'),
'user_field': rule.get('user_field') or 'owner'
} for doctype, rule in doctype_rule_map.items()]

View File

@ -11,10 +11,10 @@ doctype_list = [
] ]
def get_message(doctype): def get_message(doctype):
return _("{0} has been submitted successfully".format(_(doctype))) return _("{0} has been submitted successfully").format(_(doctype))
def get_first_success_message(doctype): def get_first_success_message(doctype):
return _("{0} has been submitted successfully".format(_(doctype))) return get_message(doctype)
def get_default_success_action(): def get_default_success_action():
return [{ return [{

View File

@ -9,6 +9,7 @@ from .default_success_action import get_default_success_action
from frappe import _ from frappe import _
from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to from frappe.desk.page.setup_wizard.setup_wizard import add_all_roles_to
from frappe.custom.doctype.custom_field.custom_field import create_custom_field from frappe.custom.doctype.custom_field.custom_field import create_custom_field
from erpnext.setup.default_energy_point_rules import get_default_energy_point_rules
default_mail_footer = """<div style="padding: 7px; text-align: right; color: #888"><small>Sent via default_mail_footer = """<div style="padding: 7px; text-align: right; color: #888"><small>Sent via
<a style="color: #888" href="http://erpnext.org">ERPNext</a></div>""" <a style="color: #888" href="http://erpnext.org">ERPNext</a></div>"""
@ -22,6 +23,7 @@ def after_install():
add_all_roles_to("Administrator") add_all_roles_to("Administrator")
create_default_cash_flow_mapper_templates() create_default_cash_flow_mapper_templates()
create_default_success_action() create_default_success_action()
create_default_energy_point_rules()
add_company_to_session_defaults() add_company_to_session_defaults()
frappe.db.commit() frappe.db.commit()
@ -86,6 +88,17 @@ def create_default_success_action():
doc = frappe.get_doc(success_action) doc = frappe.get_doc(success_action)
doc.insert(ignore_permissions=True) doc.insert(ignore_permissions=True)
def create_default_energy_point_rules():
for rule in get_default_energy_point_rules():
# check if any rule for ref. doctype exists
rule_exists = frappe.db.exists('Energy Point Rule', {
'reference_doctype': rule.get('reference_doctype')
})
if rule_exists: continue
doc = frappe.get_doc(rule)
doc.insert(ignore_permissions=True)
def add_company_to_session_defaults(): def add_company_to_session_defaults():
settings = frappe.get_single("Session Default Settings") settings = frappe.get_single("Session Default Settings")
settings.append("session_defaults", { settings.append("session_defaults", {

View File

@ -125,6 +125,7 @@ class Item(WebsiteGenerator):
self.validate_auto_reorder_enabled_in_stock_settings() self.validate_auto_reorder_enabled_in_stock_settings()
self.cant_change() self.cant_change()
self.update_show_in_website() self.update_show_in_website()
self.validate_manufacturer()
if not self.get("__islocal"): if not self.get("__islocal"):
self.old_item_group = frappe.db.get_value(self.doctype, self.name, "item_group") self.old_item_group = frappe.db.get_value(self.doctype, self.name, "item_group")
@ -144,6 +145,13 @@ class Item(WebsiteGenerator):
if cint(frappe.db.get_single_value('Stock Settings', 'clean_description_html')): if cint(frappe.db.get_single_value('Stock Settings', 'clean_description_html')):
self.description = clean_html(self.description) self.description = clean_html(self.description)
def validate_manufacturer(self):
list_man = [(x.manufacturer, x.manufacturer_part_no) for x in self.get('manufacturers')]
set_man = set(list_man)
if len(list_man) != len(set_man):
frappe.throw(_("Duplicate entry in Manufacturers table"))
def validate_customer_provided_part(self): def validate_customer_provided_part(self):
if self.is_customer_provided_item: if self.is_customer_provided_item:
if self.is_purchase_item: if self.is_purchase_item:
@ -921,7 +929,6 @@ def validate_cancelled_item(item_code, docstatus=None, verbose=1):
msg = _("Item {0} is cancelled").format(item_code) msg = _("Item {0} is cancelled").format(item_code)
_msgprint(msg, verbose) _msgprint(msg, verbose)
def _msgprint(msg, verbose): def _msgprint(msg, verbose):
if verbose: if verbose:
msgprint(msg, raise_exception=True) msgprint(msg, raise_exception=True)

View File

@ -15,12 +15,17 @@ class LandedCostVoucher(Document):
for pr in self.get("purchase_receipts"): for pr in self.get("purchase_receipts"):
if pr.receipt_document_type and pr.receipt_document: if pr.receipt_document_type and pr.receipt_document:
pr_items = frappe.db.sql("""select pr_item.item_code, pr_item.description, pr_items = frappe.db.sql("""select pr_item.item_code, pr_item.description,
pr_item.qty, pr_item.base_rate, pr_item.base_amount, pr_item.name, pr_item.cost_center pr_item.qty, pr_item.base_rate, pr_item.base_amount, pr_item.name,
pr_item.cost_center, pr_item.asset
from `tab{doctype} Item` pr_item where parent = %s from `tab{doctype} Item` pr_item where parent = %s
and exists(select name from tabItem where name = pr_item.item_code and is_stock_item = 1) and exists(select name from tabItem
where name = pr_item.item_code and (is_stock_item = 1 or is_fixed_asset=1))
""".format(doctype=pr.receipt_document_type), pr.receipt_document, as_dict=True) """.format(doctype=pr.receipt_document_type), pr.receipt_document, as_dict=True)
for d in pr_items: for d in pr_items:
if d.asset and frappe.db.get_value("Asset", d.asset, 'docstatus') == 1:
continue
item = self.append("items") item = self.append("items")
item.item_code = d.item_code item.item_code = d.item_code
item.description = d.description item.description = d.description

View File

@ -20,7 +20,7 @@ def get_product_bundle_items(item_code):
def get_packing_item_details(item, company): def get_packing_item_details(item, company):
return frappe.db.sql(""" return frappe.db.sql("""
select i.item_name, i.description, i.stock_uom, id.default_warehouse select i.item_name, i.is_stock_item, i.description, i.stock_uom, id.default_warehouse
from `tabItem` i LEFT JOIN `tabItem Default` id ON id.parent=i.name and id.company=%s from `tabItem` i LEFT JOIN `tabItem Default` id ON id.parent=i.name and id.company=%s
where i.name = %s""", where i.name = %s""",
(company, item), as_dict = 1)[0] (company, item), as_dict = 1)[0]
@ -53,7 +53,7 @@ def update_packing_list_item(doc, packing_item_code, qty, main_item_row, descrip
if description and not pi.description: if description and not pi.description:
pi.description = description pi.description = description
if not pi.warehouse: if not pi.warehouse:
pi.warehouse = (main_item_row.warehouse if ((doc.get('is_pos') pi.warehouse = (main_item_row.warehouse if ((doc.get('is_pos') or item.is_stock_item \
or not item.default_warehouse) and main_item_row.warehouse) else item.default_warehouse) or not item.default_warehouse) and main_item_row.warehouse) else item.default_warehouse)
if not pi.batch_no: if not pi.batch_no:

View File

@ -15,6 +15,7 @@ from frappe.desk.notifications import clear_doctype_notifications
from frappe.model.mapper import get_mapped_doc from frappe.model.mapper import get_mapped_doc
from erpnext.buying.utils import check_on_hold_or_closed_status from erpnext.buying.utils import check_on_hold_or_closed_status
from erpnext.assets.doctype.asset.asset import get_asset_account, is_cwip_accounting_disabled from erpnext.assets.doctype.asset.asset import get_asset_account, is_cwip_accounting_disabled
from erpnext.assets.doctype.asset_category.asset_category import get_asset_category_account
from six import iteritems from six import iteritems
form_grid_templates = { form_grid_templates = {
@ -278,8 +279,7 @@ class PurchaseReceipt(BuyingController):
d.rejected_warehouse not in warehouse_with_no_account: d.rejected_warehouse not in warehouse_with_no_account:
warehouse_with_no_account.append(d.warehouse) warehouse_with_no_account.append(d.warehouse)
if not is_cwip_accounting_disabled(): self.get_asset_gl_entry(gl_entries, expenses_included_in_valuation)
self.get_asset_gl_entry(gl_entries)
# Cost center-wise amount breakup for other charges included for valuation # Cost center-wise amount breakup for other charges included for valuation
valuation_tax = {} valuation_tax = {}
for tax in self.get("taxes"): for tax in self.get("taxes"):
@ -333,15 +333,24 @@ class PurchaseReceipt(BuyingController):
return process_gl_map(gl_entries) return process_gl_map(gl_entries)
def get_asset_gl_entry(self, gl_entries): def get_asset_gl_entry(self, gl_entries, expenses_included_in_valuation=None):
arbnb_account, cwip_account = None, None
cwip_disabled = is_cwip_accounting_disabled()
if not expenses_included_in_valuation:
expenses_included_in_valuation = self.get_company_default("expenses_included_in_valuation")
for d in self.get("items"): for d in self.get("items"):
if d.is_fixed_asset: if d.is_fixed_asset and not (arbnb_account and cwip_account):
arbnb_account = self.get_company_default("asset_received_but_not_billed") arbnb_account = self.get_company_default("asset_received_but_not_billed")
# CWIP entry # CWIP entry
cwip_account = get_asset_account("capital_work_in_progress_account", d.asset, cwip_account = get_asset_account("capital_work_in_progress_account", d.asset,
company = self.company) company = self.company)
if d.is_fixed_asset and not cwip_disabled:
asset_amount = flt(d.net_amount) + flt(d.item_tax_amount/self.conversion_rate) asset_amount = flt(d.net_amount) + flt(d.item_tax_amount/self.conversion_rate)
base_asset_amount = flt(d.base_net_amount + d.item_tax_amount) base_asset_amount = flt(d.base_net_amount + d.item_tax_amount)
@ -368,6 +377,36 @@ class PurchaseReceipt(BuyingController):
if asset_rbnb_currency == self.company_currency else asset_amount) if asset_rbnb_currency == self.company_currency else asset_amount)
}, item=d)) }, item=d))
if d.is_fixed_asset and flt(d.landed_cost_voucher_amount):
asset_account = (get_asset_category_account(d.asset, 'fixed_asset_account',
company = self.company) if cwip_disabled else cwip_account)
gl_entries.append(self.get_gl_dict({
"account": expenses_included_in_valuation,
"against": asset_account,
"cost_center": d.cost_center,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
"credit": flt(d.landed_cost_voucher_amount),
"project": d.project
}, item=d))
gl_entries.append(self.get_gl_dict({
"account": asset_account,
"against": expenses_included_in_valuation,
"cost_center": d.cost_center,
"remarks": self.get("remarks") or _("Accounting Entry for Stock"),
"debit": flt(d.landed_cost_voucher_amount),
"project": d.project
}, item=d))
if d.asset:
doc = frappe.get_doc("Asset", d.asset)
frappe.db.set_value("Asset", d.asset, "gross_purchase_amount",
doc.gross_purchase_amount + flt(d.landed_cost_voucher_amount))
frappe.db.set_value("Asset", d.asset, "purchase_receipt_amount",
doc.purchase_receipt_amount + flt(d.landed_cost_voucher_amount))
return gl_entries return gl_entries
def update_status(self, status): def update_status(self, status):

View File

@ -254,7 +254,7 @@ class StockEntry(StockController):
target_mandatory = ["Material Receipt", "Material Transfer", "Send to Subcontractor", target_mandatory = ["Material Receipt", "Material Transfer", "Send to Subcontractor",
"Material Transfer for Manufacture", "Send to Warehouse", "Receive at Warehouse"] "Material Transfer for Manufacture", "Send to Warehouse", "Receive at Warehouse"]
validate_for_manufacture_repack = any([d.bom_no for d in self.get("items")]) validate_for_manufacture = any([d.bom_no for d in self.get("items")])
if self.purpose in source_mandatory and self.purpose not in target_mandatory: if self.purpose in source_mandatory and self.purpose not in target_mandatory:
self.to_warehouse = None self.to_warehouse = None
@ -285,8 +285,8 @@ class StockEntry(StockController):
else: else:
frappe.throw(_("Target warehouse is mandatory for row {0}").format(d.idx)) frappe.throw(_("Target warehouse is mandatory for row {0}").format(d.idx))
if self.purpose in ["Manufacture", "Repack"]: if self.purpose == "Manufacture":
if validate_for_manufacture_repack: if validate_for_manufacture:
if d.bom_no: if d.bom_no:
d.s_warehouse = None d.s_warehouse = None
@ -812,7 +812,7 @@ class StockEntry(StockController):
self.add_to_stock_entry_detail(item_dict) self.add_to_stock_entry_detail(item_dict)
if self.purpose != "Send to Subcontractor" and self.purpose == "Manufacture": if self.purpose != "Send to Subcontractor" and self.purpose in ["Manufacture", "Repack"]:
scrap_item_dict = self.get_bom_scrap_material(self.fg_completed_qty) scrap_item_dict = self.get_bom_scrap_material(self.fg_completed_qty)
for item in itervalues(scrap_item_dict): for item in itervalues(scrap_item_dict):
if self.pro_doc and self.pro_doc.scrap_warehouse: if self.pro_doc and self.pro_doc.scrap_warehouse:

View File

@ -808,7 +808,7 @@ def get_serial_no_details(item_code, warehouse, stock_qty, serial_no):
return {'serial_no': serial_no} return {'serial_no': serial_no}
@frappe.whitelist() @frappe.whitelist()
def get_bin_details_and_serial_nos(item_code, warehouse, has_batch_no, stock_qty=None, serial_no=None): def get_bin_details_and_serial_nos(item_code, warehouse, has_batch_no=None, stock_qty=None, serial_no=None):
bin_details_and_serial_nos = {} bin_details_and_serial_nos = {}
bin_details_and_serial_nos.update(get_bin_details(item_code, warehouse)) bin_details_and_serial_nos.update(get_bin_details(item_code, warehouse))
if flt(stock_qty) > 0: if flt(stock_qty) > 0:

View File

@ -0,0 +1,34 @@
{
"add_total_row": 0,
"creation": "2019-09-16 14:10:33.102865",
"disable_prepared_report": 0,
"disabled": 0,
"docstatus": 0,
"doctype": "Report",
"idx": 0,
"is_standard": "Yes",
"modified": "2019-09-21 15:19:55.710578",
"modified_by": "Administrator",
"module": "Stock",
"name": "Purchase Order Items To Be Received or Billed",
"owner": "Administrator",
"prepared_report": 0,
"query": "SELECT\n\t`poi_pri`.`purchase_order` as \"Purchase Order:Link/Purchase Order:120\",\n\t`poi_pri`.`status` as \"Status:Data:120\",\n\t`poi_pri`.`transaction_date` as \"Date:Date:100\",\n\t`poi_pri`.`schedule_date` as \"Reqd by Date:Date:110\",\n\t`poi_pri`.`supplier` as \"Supplier:Link/Supplier:120\",\n\t`poi_pri`.`supplier_name` as \"Supplier Name::150\",\n\t`poi_pri`.`item_code` as \"Item Code:Link/Item:120\",\n\t`poi_pri`.`qty` as \"Qty:Float:100\",\n\t`poi_pri`.`base_amount` as \"Base Amount:Currency:100\",\n\t`poi_pri`.`received_qty` as \"Received Qty:Float:100\",\n\t`poi_pri`.`received_amount` as \"Received Qty Amount:Currency:100\",\n\t`poi_pri`.`qty_to_receive` as \"Qty to Receive:Float:100\",\n\t`poi_pri`.`amount_to_be_received` as \"Amount to Receive:Currency:100\",\n\t`poi_pri`.`billed_amount` as \"Billed Amount:Currency:100\",\n\t`poi_pri`.`amount_to_be_billed` as \"Amount To Be Billed:Currency:100\",\n\tSUM(`pii`.`qty`) AS \"Billed Qty:Float:100\",\n\t`poi_pri`.qty - SUM(`pii`.`qty`) AS \"Qty To Be Billed:Float:100\",\n\t`poi_pri`.`warehouse` as \"Warehouse:Link/Warehouse:150\",\n\t`poi_pri`.`item_name` as \"Item Name::150\",\n\t`poi_pri`.`description` as \"Description::200\",\n\t`poi_pri`.`brand` as \"Brand::100\",\n\t`poi_pri`.`project` as \"Project\",\n\t`poi_pri`.`company` as \"Company:Link/Company:\"\nFROM\n\t(SELECT\n\t\t`po`.`name` AS 'purchase_order',\n\t\t`po`.`status`,\n\t\t`po`.`company`,\n\t\t`poi`.`warehouse`,\n\t\t`poi`.`brand`,\n\t\t`poi`.`description`,\n\t\t`po`.`transaction_date`,\n\t\t`poi`.`schedule_date`,\n\t\t`po`.`supplier`,\n\t\t`po`.`supplier_name`,\n\t\t`poi`.`project`,\n\t\t`poi`.`item_code`,\n\t\t`poi`.`item_name`,\n\t\t`poi`.`qty`,\n\t\t`poi`.`base_amount`,\n\t\t`poi`.`received_qty`,\n\t\t(`poi`.billed_amt * ifnull(`po`.conversion_rate, 1)) as billed_amount,\n\t\t(`poi`.base_amount - (`poi`.billed_amt * ifnull(`po`.conversion_rate, 1))) as amount_to_be_billed,\n\t\t`poi`.`qty` - IFNULL(`poi`.`received_qty`, 0) AS 'qty_to_receive',\n\t\t(`poi`.`qty` - IFNULL(`poi`.`received_qty`, 0)) * `poi`.`rate` AS 'amount_to_be_received',\n\t\tSUM(`pri`.`amount`) AS 'received_amount',\n\t\t`poi`.`name` AS 'poi_name',\n\t\t`pri`.`name` AS 'pri_name'\n\tFROM\n\t\t`tabPurchase Order` po\n\t\tLEFT JOIN `tabPurchase Order Item` poi\n\t\tON `poi`.`parent` = `po`.`name`\n\t\tLEFT JOIN `tabPurchase Receipt Item` pri\n\t\tON `pri`.`purchase_order_item` = `poi`.`name`\n\t\t\tAND `pri`.`docstatus`=1\n\tWHERE\n\t\t`po`.`status` not in ('Stopped', 'Closed')\n\t\tAND `po`.`docstatus` = 1\n\t\tAND IFNULL(`poi`.`received_qty`, 0) < IFNULL(`poi`.`qty`, 0)\n\tGROUP BY `poi`.`name`\n\tORDER BY `po`.`transaction_date` ASC\n\t) poi_pri\n\tLEFT JOIN `tabPurchase Invoice Item` pii\n\tON `pii`.`po_detail` = `poi_pri`.`poi_name`\n\t\tAND `pii`.`docstatus`=1\nGROUP BY `poi_pri`.`poi_name`",
"ref_doctype": "Purchase Order",
"report_name": "Purchase Order Items To Be Received or Billed1",
"report_type": "Query Report",
"roles": [
{
"role": "Purchase Manager"
},
{
"role": "Purchase User"
},
{
"role": "Stock User"
},
{
"role": "Stock Manager"
}
]
}

View File

@ -131,11 +131,12 @@ def get_columns(filters):
return columns return columns
def get_fifo_queue(filters): def get_fifo_queue(filters, sle=None):
item_details = {} item_details = {}
transfered_item_details = {} transferred_item_details = {}
serial_no_batch_purchase_details = {} serial_no_batch_purchase_details = {}
if sle == None:
sle = get_stock_ledger_entries(filters) sle = get_stock_ledger_entries(filters)
for d in sle: for d in sle:
@ -143,7 +144,7 @@ def get_fifo_queue(filters):
item_details.setdefault(key, {"details": d, "fifo_queue": []}) item_details.setdefault(key, {"details": d, "fifo_queue": []})
fifo_queue = item_details[key]["fifo_queue"] fifo_queue = item_details[key]["fifo_queue"]
transfered_item_details.setdefault((d.voucher_no, d.name), []) transferred_item_details.setdefault((d.voucher_no, d.name), [])
if d.voucher_type == "Stock Reconciliation": if d.voucher_type == "Stock Reconciliation":
d.actual_qty = flt(d.qty_after_transaction) - flt(item_details[key].get("qty_after_transaction", 0)) d.actual_qty = flt(d.qty_after_transaction) - flt(item_details[key].get("qty_after_transaction", 0))
@ -151,10 +152,10 @@ def get_fifo_queue(filters):
serial_no_list = get_serial_nos(d.serial_no) if d.serial_no else [] serial_no_list = get_serial_nos(d.serial_no) if d.serial_no else []
if d.actual_qty > 0: if d.actual_qty > 0:
if transfered_item_details.get((d.voucher_no, d.name)): if transferred_item_details.get((d.voucher_no, d.name)):
batch = transfered_item_details[(d.voucher_no, d.name)][0] batch = transferred_item_details[(d.voucher_no, d.name)][0]
fifo_queue.append(batch) fifo_queue.append(batch)
transfered_item_details[((d.voucher_no, d.name))].pop(0) transferred_item_details[((d.voucher_no, d.name))].pop(0)
else: else:
if serial_no_list: if serial_no_list:
for serial_no in serial_no_list: for serial_no in serial_no_list:
@ -178,11 +179,11 @@ def get_fifo_queue(filters):
# if batch qty > 0 # if batch qty > 0
# not enough or exactly same qty in current batch, clear batch # not enough or exactly same qty in current batch, clear batch
qty_to_pop -= batch[0] qty_to_pop -= batch[0]
transfered_item_details[(d.voucher_no, d.name)].append(fifo_queue.pop(0)) transferred_item_details[(d.voucher_no, d.name)].append(fifo_queue.pop(0))
else: else:
# all from current batch # all from current batch
batch[0] -= qty_to_pop batch[0] -= qty_to_pop
transfered_item_details[(d.voucher_no, d.name)].append([qty_to_pop, batch[1]]) transferred_item_details[(d.voucher_no, d.name)].append([qty_to_pop, batch[1]])
qty_to_pop = 0 qty_to_pop = 0
item_details[key]["qty_after_transaction"] = d.qty_after_transaction item_details[key]["qty_after_transaction"] = d.qty_after_transaction

View File

@ -41,7 +41,7 @@ frappe.query_reports["Stock Balance"] = {
"get_query": function() { "get_query": function() {
return { return {
query: "erpnext.controllers.queries.item_query", query: "erpnext.controllers.queries.item_query",
} };
} }
}, },
{ {
@ -57,7 +57,7 @@ frappe.query_reports["Stock Balance"] = {
filters: { filters: {
'warehouse_type': warehouse_type 'warehouse_type': warehouse_type
} }
} };
} }
} }
}, },
@ -79,5 +79,10 @@ frappe.query_reports["Stock Balance"] = {
"label": __("Show Variant Attributes"), "label": __("Show Variant Attributes"),
"fieldtype": "Check" "fieldtype": "Check"
}, },
{
"fieldname": 'show_stock_ageing_data',
"label": __('Show Stock Ageing Data'),
"fieldtype": 'Check'
},
] ]
} };

View File

@ -4,10 +4,12 @@
from __future__ import unicode_literals from __future__ import unicode_literals
import frappe import frappe
from frappe import _ from frappe import _
from frappe.utils import flt, cint, getdate, now from frappe.utils import flt, cint, getdate, now, date_diff
from erpnext.stock.utils import update_included_uom_in_report from erpnext.stock.utils import add_additional_uom_columns
from erpnext.stock.report.stock_ledger.stock_ledger import get_item_group_condition from erpnext.stock.report.stock_ledger.stock_ledger import get_item_group_condition
from erpnext.stock.report.stock_ageing.stock_ageing import get_fifo_queue, get_average_age
from six import iteritems from six import iteritems
def execute(filters=None): def execute(filters=None):
@ -15,11 +17,18 @@ def execute(filters=None):
validate_filters(filters) validate_filters(filters)
from_date = filters.get('from_date')
to_date = filters.get('to_date')
include_uom = filters.get("include_uom") include_uom = filters.get("include_uom")
columns = get_columns() columns = get_columns(filters)
items = get_items(filters) items = get_items(filters)
sle = get_stock_ledger_entries(filters, items) sle = get_stock_ledger_entries(filters, items)
if filters.get('show_stock_ageing_data'):
filters['show_warehouse_wise_stock'] = True
item_wise_fifo_queue = get_fifo_queue(filters, sle)
# if no stock ledger entry found return # if no stock ledger entry found return
if not sle: if not sle:
return columns, [] return columns, []
@ -29,7 +38,7 @@ def execute(filters=None):
item_reorder_detail_map = get_item_reorder_details(item_map.keys()) item_reorder_detail_map = get_item_reorder_details(item_map.keys())
data = [] data = []
conversion_factors = [] conversion_factors = {}
for (company, item, warehouse) in sorted(iwb_map): for (company, item, warehouse) in sorted(iwb_map):
if item_map.get(item): if item_map.get(item):
qty_dict = iwb_map[(company, item, warehouse)] qty_dict = iwb_map[(company, item, warehouse)]
@ -39,36 +48,41 @@ def execute(filters=None):
item_reorder_level = item_reorder_detail_map[item + warehouse]["warehouse_reorder_level"] item_reorder_level = item_reorder_detail_map[item + warehouse]["warehouse_reorder_level"]
item_reorder_qty = item_reorder_detail_map[item + warehouse]["warehouse_reorder_qty"] item_reorder_qty = item_reorder_detail_map[item + warehouse]["warehouse_reorder_qty"]
report_data = [item, item_map[item]["item_name"], report_data = {
item_map[item]["item_group"], 'item_code': item,
item_map[item]["brand"], 'warehouse': warehouse,
item_map[item]["description"], warehouse, 'company': company,
item_map[item]["stock_uom"], qty_dict.bal_qty, 'reorder_level': item_reorder_qty,
qty_dict.bal_val, qty_dict.opening_qty, 'reorder_qty': item_reorder_qty,
qty_dict.opening_val, qty_dict.in_qty, }
qty_dict.in_val, qty_dict.out_qty, report_data.update(item_map[item])
qty_dict.out_val, qty_dict.val_rate, report_data.update(qty_dict)
item_reorder_level,
item_reorder_qty,
company
]
if filters.get('show_variant_attributes', 0) == 1:
variants_attributes = get_variants_attributes()
report_data += [item_map[item].get(i) for i in variants_attributes]
if include_uom: if include_uom:
conversion_factors.append(item_map[item].conversion_factor) conversion_factors.setdefault(item, item_map[item].conversion_factor)
if filters.get('show_stock_ageing_data'):
fifo_queue = item_wise_fifo_queue[(item, warehouse)].get('fifo_queue')
stock_ageing_data = {
'average_age': 0,
'earliest_age': 0,
'latest_age': 0
}
if fifo_queue:
fifo_queue = sorted(fifo_queue, key=lambda fifo_data: fifo_data[1])
stock_ageing_data['average_age'] = get_average_age(fifo_queue, to_date)
stock_ageing_data['earliest_age'] = date_diff(to_date, fifo_queue[0][1])
stock_ageing_data['latest_age'] = date_diff(to_date, fifo_queue[-1][1])
report_data.update(stock_ageing_data)
data.append(report_data) data.append(report_data)
if filters.get('show_variant_attributes', 0) == 1: add_additional_uom_columns(columns, data, include_uom, conversion_factors)
columns += ["{}:Data:100".format(i) for i in get_variants_attributes()]
update_included_uom_in_report(columns, data, include_uom, conversion_factors)
return columns, data return columns, data
def get_columns(): def get_columns(filters):
"""return columns""" """return columns"""
columns = [ columns = [
@ -93,6 +107,14 @@ def get_columns():
{"label": _("Company"), "fieldname": "company", "fieldtype": "Link", "options": "Company", "width": 100} {"label": _("Company"), "fieldname": "company", "fieldtype": "Link", "options": "Company", "width": 100}
] ]
if filters.get('show_stock_ageing_data'):
columns += [{'label': _('Average Age'), 'fieldname': 'average_age', 'width': 100},
{'label': _('Earliest Age'), 'fieldname': 'earliest_age', 'width': 100},
{'label': _('Latest Age'), 'fieldname': 'latest_age', 'width': 100}]
if filters.get('show_variant_attributes'):
columns += [{'label': att_name, 'fieldname': att_name, 'width': 100} for att_name in get_variants_attributes()]
return columns return columns
def get_conditions(filters): def get_conditions(filters):
@ -130,11 +152,12 @@ def get_stock_ledger_entries(filters, items):
return frappe.db.sql(""" return frappe.db.sql("""
select select
sle.item_code, warehouse, sle.posting_date, sle.actual_qty, sle.valuation_rate, sle.item_code, warehouse, sle.posting_date, sle.actual_qty, sle.valuation_rate,
sle.company, sle.voucher_type, sle.qty_after_transaction, sle.stock_value_difference sle.company, sle.voucher_type, sle.qty_after_transaction, sle.stock_value_difference,
sle.item_code as name, sle.voucher_no
from from
`tabStock Ledger Entry` sle force index (posting_sort_index) `tabStock Ledger Entry` sle force index (posting_sort_index)
where sle.docstatus < 2 %s %s where sle.docstatus < 2 %s %s
order by sle.posting_date, sle.posting_time, sle.creation""" % order by sle.posting_date, sle.posting_time, sle.creation, sle.actual_qty""" % #nosec
(item_conditions_sql, conditions), as_dict=1) (item_conditions_sql, conditions), as_dict=1)
def get_item_warehouse_map(filters, sle): def get_item_warehouse_map(filters, sle):
@ -226,7 +249,7 @@ def get_item_details(items, sle, filters):
cf_field = cf_join = "" cf_field = cf_join = ""
if filters.get("include_uom"): if filters.get("include_uom"):
cf_field = ", ucd.conversion_factor" cf_field = ", ucd.conversion_factor"
cf_join = "left join `tabUOM Conversion Detail` ucd on ucd.parent=item.name and ucd.uom='%s'" \ cf_join = "left join `tabUOM Conversion Detail` ucd on ucd.parent=item.name and ucd.uom=%s" \
% frappe.db.escape(filters.get("include_uom")) % frappe.db.escape(filters.get("include_uom"))
res = frappe.db.sql(""" res = frappe.db.sql("""

View File

@ -15,8 +15,8 @@ def execute(filters=None):
def get_columns(): def get_columns():
columns = [ columns = [
_("Company") + ":Link/Item:250", _("Company") + ":Link/Company:250",
_("Warehouse") + ":Link/Item:150", _("Warehouse") + ":Link/Warehouse:150",
_("Item") + ":Link/Item:150", _("Item") + ":Link/Item:150",
_("Description") + "::300", _("Description") + "::300",
_("Current Qty") + ":Float:100", _("Current Qty") + ":Float:100",
@ -30,7 +30,7 @@ def get_total_stock(filters):
if filters.get("group_by") == "Warehouse": if filters.get("group_by") == "Warehouse":
if filters.get("company"): if filters.get("company"):
conditions += " AND warehouse.company = %s" % frappe.db.escape(filters.get("company"), percent=False) conditions += " AND warehouse.company = '%s'" % frappe.db.escape(filters.get("company"), percent=False)
conditions += " GROUP BY ledger.warehouse, item.item_code" conditions += " GROUP BY ledger.warehouse, item.item_code"
columns += "'' as company, ledger.warehouse" columns += "'' as company, ledger.warehouse"

View File

@ -282,3 +282,35 @@ def update_included_uom_in_report(columns, result, include_uom, conversion_facto
def get_available_serial_nos(item_code, warehouse): def get_available_serial_nos(item_code, warehouse):
return frappe.get_all("Serial No", filters = {'item_code': item_code, return frappe.get_all("Serial No", filters = {'item_code': item_code,
'warehouse': warehouse, 'delivery_document_no': ''}) or [] 'warehouse': warehouse, 'delivery_document_no': ''}) or []
def add_additional_uom_columns(columns, result, include_uom, conversion_factors):
if not include_uom or not conversion_factors:
return
convertible_column_map = {}
for col_idx in list(reversed(range(0, len(columns)))):
col = columns[col_idx]
if isinstance(col, dict) and col.get('convertible') in ['rate', 'qty']:
next_col = col_idx + 1
columns.insert(next_col, col.copy())
columns[next_col]['fieldname'] += '_alt'
convertible_column_map[col.get('fieldname')] = frappe._dict({
'converted_col': columns[next_col]['fieldname'],
'for_type': col.get('convertible')
})
if col.get('convertible') == 'rate':
columns[next_col]['label'] += ' (per {})'.format(include_uom)
else:
columns[next_col]['label'] += ' ({})'.format(include_uom)
for row_idx, row in enumerate(result):
for convertible_col, data in convertible_column_map.items():
conversion_factor = conversion_factors[row.get('item_code')] or 1
for_type = data.for_type
value_before_conversion = row.get(convertible_col)
if for_type == 'rate':
row[data.converted_col] = flt(value_before_conversion) * conversion_factor
else:
row[data.converted_col] = flt(value_before_conversion) / conversion_factor
result[row_idx] = row

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Åbning' apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py,'Opening','Åbning'
DocType: Email Campaign,Lead,Bly DocType: Call Log,Lead,Bly
apps/erpnext/erpnext/config/selling.py,Default settings for selling transactions.,Standardindstillinger for at sælge transaktioner. apps/erpnext/erpnext/config/selling.py,Default settings for selling transactions.,Standardindstillinger for at sælge transaktioner.
DocType: Timesheet,% Amount Billed,% Beløb Billed DocType: Timesheet,% Amount Billed,% Beløb Billed
DocType: Purchase Order,% Billed,% Billed DocType: Purchase Order,% Billed,% Billed
@ -23,5 +23,5 @@ apps/erpnext/erpnext/controllers/sales_and_purchase_return.py,'Update Stock' can
apps/erpnext/erpnext/patches/v4_0/create_price_list_if_missing.py,Standard Selling,Standard Selling apps/erpnext/erpnext/patches/v4_0/create_price_list_if_missing.py,Standard Selling,Standard Selling
,Lead Details,Bly Detaljer ,Lead Details,Bly Detaljer
DocType: Selling Settings,Settings for Selling Module,Indstillinger for Selling modul DocType: Selling Settings,Settings for Selling Module,Indstillinger for Selling modul
,Lead Name,Bly navn DocType: Call Log,Lead Name,Bly navn
DocType: Rename Tool,"Attach .csv file with two columns, one for the old name and one for the new name","Vedhæfte .csv fil med to kolonner, en for det gamle navn og et til det nye navn" DocType: Rename Tool,"Attach .csv file with two columns, one for the old name and one for the new name","Vedhæfte .csv fil med to kolonner, en for det gamle navn og et til det nye navn"

1 apps/erpnext/erpnext/stock/report/stock_ledger/stock_ledger.py 'Opening' 'Åbning'
2 DocType: Email Campaign DocType: Call Log Lead Bly
3 apps/erpnext/erpnext/config/selling.py Default settings for selling transactions. Standardindstillinger for at sælge transaktioner.
4 DocType: Timesheet % Amount Billed % Beløb Billed
5 DocType: Purchase Order % Billed % Billed
23 apps/erpnext/erpnext/patches/v4_0/create_price_list_if_missing.py Standard Selling Standard Selling
24 Lead Details Bly Detaljer
25 DocType: Selling Settings Settings for Selling Module Indstillinger for Selling modul
26 DocType: Call Log Lead Name Bly navn
27 DocType: Rename Tool Attach .csv file with two columns, one for the old name and one for the new name Vedhæfte .csv fil med to kolonner, en for det gamle navn og et til det nye navn

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -57,7 +57,7 @@ DocType: Email Digest,New Sales Orders,Nueva Órden de Venta
DocType: Work Order Operation,Updated via 'Time Log',Actualizado a través de 'Hora de Registro' DocType: Work Order Operation,Updated via 'Time Log',Actualizado a través de 'Hora de Registro'
DocType: Naming Series,Series List for this Transaction,Lista de series para esta transacción DocType: Naming Series,Series List for this Transaction,Lista de series para esta transacción
DocType: Delivery Note Item,Against Sales Invoice Item,Contra la Factura de Venta de Artículos DocType: Delivery Note Item,Against Sales Invoice Item,Contra la Factura de Venta de Artículos
DocType: Delivery Stop,Contact Name,Nombre del Contacto DocType: Call Log,Contact Name,Nombre del Contacto
apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py,Row {0}: Please check 'Is Advance' against Account {1} if this is an advance entry.,"Fila {0}: Por favor, consulte ""¿Es Avance 'contra la Cuenta {1} si se trata de una entrada con antelación." apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py,Row {0}: Please check 'Is Advance' against Account {1} if this is an advance entry.,"Fila {0}: Por favor, consulte ""¿Es Avance 'contra la Cuenta {1} si se trata de una entrada con antelación."
apps/erpnext/erpnext/stock/utils.py,Warehouse {0} does not belong to company {1},Almacén {0} no pertenece a la empresa {1} apps/erpnext/erpnext/stock/utils.py,Warehouse {0} does not belong to company {1},Almacén {0} no pertenece a la empresa {1}
DocType: Stock Reconciliation Item,Stock Reconciliation Item,Articulo de Reconciliación de Inventario DocType: Stock Reconciliation Item,Stock Reconciliation Item,Articulo de Reconciliación de Inventario
@ -70,7 +70,7 @@ DocType: Territory,Set Item Group-wise budgets on this Territory. You can also i
DocType: Maintenance Schedule,Generate Schedule,Generar Horario DocType: Maintenance Schedule,Generate Schedule,Generar Horario
apps/erpnext/erpnext/config/crm.py,Manage Sales Person Tree.,Vista en árbol para la administración de las categoría de vendedores apps/erpnext/erpnext/config/crm.py,Manage Sales Person Tree.,Vista en árbol para la administración de las categoría de vendedores
DocType: Item,Synced With Hub,Sincronizado con Hub DocType: Item,Synced With Hub,Sincronizado con Hub
apps/erpnext/erpnext/manufacturing/doctype/production_order/production_order.py,Completed Qty can not be greater than 'Qty to Manufacture',La cantidad completada no puede ser mayor que la cantidad a producir apps/erpnext/erpnext/manufacturing/doctype/work_order/work_order.py,Completed Qty can not be greater than 'Qty to Manufacture',La cantidad completada no puede ser mayor que la cantidad a producir
DocType: Period Closing Voucher,Closing Account Head,Cuenta de cierre principal DocType: Period Closing Voucher,Closing Account Head,Cuenta de cierre principal
DocType: Stock Settings,Notify by Email on creation of automatic Material Request,Notificarme por Email cuando se genere una nueva solicitud de materiales DocType: Stock Settings,Notify by Email on creation of automatic Material Request,Notificarme por Email cuando se genere una nueva solicitud de materiales
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.js,Delivery Note,Notas de Entrega apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.js,Delivery Note,Notas de Entrega
@ -179,7 +179,7 @@ DocType: Purchase Taxes and Charges,On Previous Row Total,En la Anterior Fila To
apps/erpnext/erpnext/public/js/setup_wizard.js,The name of your company for which you are setting up this system.,El nombre de su empresa para la que va a configurar el sistema. apps/erpnext/erpnext/public/js/setup_wizard.js,The name of your company for which you are setting up this system.,El nombre de su empresa para la que va a configurar el sistema.
apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js,Purchase Receipt,Recibos de Compra apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js,Purchase Receipt,Recibos de Compra
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py,Serial No {0} does not belong to Item {1},Número de orden {0} no pertenece al elemento {1} apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py,Serial No {0} does not belong to Item {1},Número de orden {0} no pertenece al elemento {1}
DocType: Purchase Receipt Item Supplied,Required Qty,Cant. Necesaria DocType: Purchase Order Item Supplied,Required Qty,Cant. Necesaria
DocType: Bank Reconciliation,Account Currency,Moneda de la Cuenta DocType: Bank Reconciliation,Account Currency,Moneda de la Cuenta
apps/erpnext/erpnext/accounts/general_ledger.py,Please mention Round Off Account in Company,"Por favor, indique la cuenta que utilizará para el redondeo--" apps/erpnext/erpnext/accounts/general_ledger.py,Please mention Round Off Account in Company,"Por favor, indique la cuenta que utilizará para el redondeo--"
apps/erpnext/erpnext/hr/doctype/attendance/attendance.py,Employee {0} is not active or does not exist,Empleado {0} no está activo o no existe apps/erpnext/erpnext/hr/doctype/attendance/attendance.py,Employee {0} is not active or does not exist,Empleado {0} no está activo o no existe
@ -229,7 +229,7 @@ DocType: Salary Slip,Net Pay (in words) will be visible once you save the Salary
DocType: Tally Migration,UOMs,Unidades de Medida DocType: Tally Migration,UOMs,Unidades de Medida
apps/erpnext/erpnext/stock/utils.py,{0} valid serial nos for Item {1},{0} No. de serie válidos para el producto {1} apps/erpnext/erpnext/stock/utils.py,{0} valid serial nos for Item {1},{0} No. de serie válidos para el producto {1}
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.js,Cost Center For Item with Item Code ',Centro de Costos para artículo con Código del artículo ' apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.js,Cost Center For Item with Item Code ',Centro de Costos para artículo con Código del artículo '
DocType: Email Campaign,Lead,Iniciativas DocType: Call Log,Lead,Iniciativas
apps/erpnext/erpnext/controllers/buying_controller.py,Row #{0}: Rejected Qty can not be entered in Purchase Return,Fila # {0}: Rechazado Cantidad no se puede introducir en la Compra de Retorno apps/erpnext/erpnext/controllers/buying_controller.py,Row #{0}: Rejected Qty can not be entered in Purchase Return,Fila # {0}: Rechazado Cantidad no se puede introducir en la Compra de Retorno
,Purchase Order Items To Be Billed,Ordenes de Compra por Facturar ,Purchase Order Items To Be Billed,Ordenes de Compra por Facturar
DocType: Purchase Invoice Item,Net Rate,Tasa neta DocType: Purchase Invoice Item,Net Rate,Tasa neta
@ -366,7 +366,7 @@ DocType: Employee,Leave Encashed?,Vacaciones Descansadas?
apps/erpnext/erpnext/hr/doctype/leave_application/leave_application.py,There is not enough leave balance for Leave Type {0},No hay suficiente saldo para Tipo de Vacaciones {0} apps/erpnext/erpnext/hr/doctype/leave_application/leave_application.py,There is not enough leave balance for Leave Type {0},No hay suficiente saldo para Tipo de Vacaciones {0}
DocType: Sales Invoice Item,Customer's Item Code,Código de artículo del Cliente DocType: Sales Invoice Item,Customer's Item Code,Código de artículo del Cliente
DocType: Stock Reconciliation,Stock Reconciliation,Reconciliación de Inventario DocType: Stock Reconciliation,Stock Reconciliation,Reconciliación de Inventario
apps/erpnext/erpnext/manufacturing/doctype/production_order/production_order.py,Work-in-Progress Warehouse is required before Submit,Se requiere un Almacen de Trabajo en Proceso antes de Enviar apps/erpnext/erpnext/manufacturing/doctype/work_order/work_order.py,Work-in-Progress Warehouse is required before Submit,Se requiere un Almacen de Trabajo en Proceso antes de Enviar
DocType: Supplier,Statutory info and other general information about your Supplier,Información legal y otra información general acerca de su proveedor DocType: Supplier,Statutory info and other general information about your Supplier,Información legal y otra información general acerca de su proveedor
apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py,Against Journal Entry {0} does not have any unmatched {1} entry,Contra la Entrada de Diario {0} no tiene ninguna {1} entrada que vincular apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py,Against Journal Entry {0} does not have any unmatched {1} entry,Contra la Entrada de Diario {0} no tiene ninguna {1} entrada que vincular
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py,Duplicate Serial No entered for Item {0},Duplicar Serie No existe para la partida {0} apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py,Duplicate Serial No entered for Item {0},Duplicar Serie No existe para la partida {0}
@ -429,7 +429,6 @@ apps/erpnext/erpnext/hooks.py,Shipments,Los envíos
DocType: Purchase Invoice,In Words (Company Currency),En palabras (Moneda Local) DocType: Purchase Invoice,In Words (Company Currency),En palabras (Moneda Local)
DocType: Bank Guarantee,Supplier,Proveedores DocType: Bank Guarantee,Supplier,Proveedores
apps/erpnext/erpnext/controllers/stock_controller.py,Expense or Difference account is mandatory for Item {0} as it impacts overall stock value,"Cuenta de Gastos o Diferencia es obligatorio para el elemento {0} , ya que impacta el valor del stock" apps/erpnext/erpnext/controllers/stock_controller.py,Expense or Difference account is mandatory for Item {0} as it impacts overall stock value,"Cuenta de Gastos o Diferencia es obligatorio para el elemento {0} , ya que impacta el valor del stock"
apps/erpnext/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py,-Above,-Mayor
DocType: Leave Application,Total Leave Days,Total Vacaciones DocType: Leave Application,Total Leave Days,Total Vacaciones
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py,{0} is mandatory for Item {1},{0} es obligatorio para el producto {1} apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py,{0} is mandatory for Item {1},{0} es obligatorio para el producto {1}
apps/erpnext/erpnext/stock/doctype/delivery_note/delivery_note.py,Sales Order required for Item {0},Orden de Venta requerida para el punto {0} apps/erpnext/erpnext/stock/doctype/delivery_note/delivery_note.py,Sales Order required for Item {0},Orden de Venta requerida para el punto {0}
@ -445,8 +444,6 @@ DocType: Purchase Invoice Item,Weight UOM,Peso Unidad de Medida
DocType: Employee Leave Approver,Users who can approve a specific employee's leave applications,Los usuarios que pueden aprobar las solicitudes de licencia de un empleado específico DocType: Employee Leave Approver,Users who can approve a specific employee's leave applications,Los usuarios que pueden aprobar las solicitudes de licencia de un empleado específico
apps/erpnext/erpnext/setup/setup_wizard/data/industry_type.py,Electronics,Electrónica apps/erpnext/erpnext/setup/setup_wizard/data/industry_type.py,Electronics,Electrónica
DocType: Stock Settings,Raise Material Request when stock reaches re-order level,Enviar solicitud de materiales cuando se alcance un nivel bajo el stock DocType: Stock Settings,Raise Material Request when stock reaches re-order level,Enviar solicitud de materiales cuando se alcance un nivel bajo el stock
DocType: Employee,Contact Details,Datos del Contacto
apps/erpnext/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py,Total Invoiced Amt,Total Monto Facturado
DocType: Cashier Closing,To Time,Para Tiempo DocType: Cashier Closing,To Time,Para Tiempo
apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py,Credit To account must be a Payable account,Crédito a la cuenta debe ser una cuenta por pagar apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py,Credit To account must be a Payable account,Crédito a la cuenta debe ser una cuenta por pagar
DocType: Job Card Time Log,Completed Qty,Cant. Completada DocType: Job Card Time Log,Completed Qty,Cant. Completada
@ -483,7 +480,6 @@ DocType: Maintenance Schedule Detail,Maintenance Schedule Detail,Detalle de Cale
DocType: Supplier,Is Frozen,Está Inactivo DocType: Supplier,Is Frozen,Está Inactivo
DocType: Payment Gateway Account,Payment Account,Pago a cuenta DocType: Payment Gateway Account,Payment Account,Pago a cuenta
apps/erpnext/erpnext/setup/doctype/company/company.js,Please make sure you really want to delete all the transactions for this company. Your master data will remain as it is. This action cannot be undone.,"Por favor, asegúrese que realmente desea borrar todas las transacciones de esta compañía. Sus datos maestros permanecerán intactos. Esta acción no se puede deshacer." apps/erpnext/erpnext/setup/doctype/company/company.js,Please make sure you really want to delete all the transactions for this company. Your master data will remain as it is. This action cannot be undone.,"Por favor, asegúrese que realmente desea borrar todas las transacciones de esta compañía. Sus datos maestros permanecerán intactos. Esta acción no se puede deshacer."
apps/erpnext/erpnext/manufacturing/doctype/production_order/production_order.py,{0} ({1}) cannot be greater than planned quanitity ({2}) in Production Order {3},{0} ({1}) no puede ser mayor que cantidad planificada ({2}) en la Orden de Producción {3}
DocType: Shipping Rule,Shipping Rule Label,Regla Etiqueta de envío DocType: Shipping Rule,Shipping Rule Label,Regla Etiqueta de envío
apps/erpnext/erpnext/manufacturing/doctype/bom/bom.py,Raw Materials cannot be blank.,Materias primas no pueden estar en blanco. apps/erpnext/erpnext/manufacturing/doctype/bom/bom.py,Raw Materials cannot be blank.,Materias primas no pueden estar en blanco.
apps/erpnext/erpnext/manufacturing/doctype/bom/bom.js,You can not change rate if BOM mentioned agianst any item,No se puede cambiar la tasa si hay una Solicitud de Materiales contra cualquier artículo apps/erpnext/erpnext/manufacturing/doctype/bom/bom.js,You can not change rate if BOM mentioned agianst any item,No se puede cambiar la tasa si hay una Solicitud de Materiales contra cualquier artículo
@ -506,7 +502,6 @@ apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py,Stock Entry
apps/erpnext/erpnext/config/accounting.py,"e.g. Bank, Cash, Credit Card","por ejemplo Banco, Efectivo , Tarjeta de crédito" apps/erpnext/erpnext/config/accounting.py,"e.g. Bank, Cash, Credit Card","por ejemplo Banco, Efectivo , Tarjeta de crédito"
DocType: Warranty Claim,Service Address,Dirección del Servicio DocType: Warranty Claim,Service Address,Dirección del Servicio
DocType: Purchase Invoice Item,Manufacture,Manufactura DocType: Purchase Invoice Item,Manufacture,Manufactura
apps/erpnext/erpnext/stock/doctype/packing_slip/packing_slip.js,Please Delivery Note first,Primero la nota de entrega
DocType: Purchase Invoice,Currency and Price List,Divisa y Lista de precios DocType: Purchase Invoice,Currency and Price List,Divisa y Lista de precios
apps/erpnext/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js,Row {0}:Start Date must be before End Date,Fila {0}: Fecha de inicio debe ser anterior Fecha de finalización apps/erpnext/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js,Row {0}:Start Date must be before End Date,Fila {0}: Fecha de inicio debe ser anterior Fecha de finalización
DocType: Purchase Receipt,Time at which materials were received,Momento en que se recibieron los materiales DocType: Purchase Receipt,Time at which materials were received,Momento en que se recibieron los materiales
@ -561,7 +556,7 @@ DocType: Quotation,Rate at which customer's currency is converted to company's b
DocType: Purchase Invoice Item,Net Rate (Company Currency),Tasa neta (Moneda Local) DocType: Purchase Invoice Item,Net Rate (Company Currency),Tasa neta (Moneda Local)
apps/erpnext/erpnext/config/crm.py,Manage Territory Tree.,Vista en árbol para la administración de los territorios apps/erpnext/erpnext/config/crm.py,Manage Territory Tree.,Vista en árbol para la administración de los territorios
DocType: Journal Entry Account,Party Balance,Saldo de socio DocType: Journal Entry Account,Party Balance,Saldo de socio
DocType: Stock Entry,Material Transfer for Manufacture,Trasferencia de Material para Manufactura DocType: Pick List,Material Transfer for Manufacture,Trasferencia de Material para Manufactura
apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py,Accounting Entry for Stock,Asiento contable de inventario apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py,Accounting Entry for Stock,Asiento contable de inventario
DocType: Sales Invoice,Sales Team1,Team1 Ventas DocType: Sales Invoice,Sales Team1,Team1 Ventas
DocType: Account,Root Type,Tipo Root DocType: Account,Root Type,Tipo Root
@ -579,7 +574,6 @@ DocType: Account,Expense Account,Cuenta de gastos
apps/erpnext/erpnext/setup/setup_wizard/data/industry_type.py,Software,Software apps/erpnext/erpnext/setup/setup_wizard/data/industry_type.py,Software,Software
DocType: Email Campaign,Scheduled,Programado DocType: Email Campaign,Scheduled,Programado
apps/erpnext/erpnext/config/selling.py,Manage Sales Partners.,Administrar Puntos de venta. apps/erpnext/erpnext/config/selling.py,Manage Sales Partners.,Administrar Puntos de venta.
DocType: BOM,Exploded_items,Vista detallada
apps/erpnext/erpnext/hr/doctype/job_applicant/job_applicant.py,Name or Email is mandatory,Nombre o Email es obligatorio apps/erpnext/erpnext/hr/doctype/job_applicant/job_applicant.py,Name or Email is mandatory,Nombre o Email es obligatorio
apps/erpnext/erpnext/accounts/doctype/account/account.py,Root Type is mandatory,Tipo Root es obligatorio apps/erpnext/erpnext/accounts/doctype/account/account.py,Root Type is mandatory,Tipo Root es obligatorio
apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py,Serial No {0} created,Número de orden {0} creado apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py,Serial No {0} created,Número de orden {0} creado
@ -613,6 +607,7 @@ apps/erpnext/erpnext/buying/doctype/purchase_order/purchase_order.py,Material Re
apps/erpnext/erpnext/setup/setup_wizard/operations/install_fixtures.py,Lower Income,Ingreso Bajo apps/erpnext/erpnext/setup/setup_wizard/operations/install_fixtures.py,Lower Income,Ingreso Bajo
apps/erpnext/erpnext/stock/doctype/stock_entry/stock_entry.py,Source and target warehouse cannot be same for row {0},Fuente y el almacén de destino no pueden ser la misma para la fila {0} apps/erpnext/erpnext/stock/doctype/stock_entry/stock_entry.py,Source and target warehouse cannot be same for row {0},Fuente y el almacén de destino no pueden ser la misma para la fila {0}
apps/erpnext/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py,Purchase Order number required for Item {0},Número de la Orden de Compra se requiere para el elemento {0} apps/erpnext/erpnext/stock/doctype/purchase_receipt/purchase_receipt.py,Purchase Order number required for Item {0},Número de la Orden de Compra se requiere para el elemento {0}
DocType: Leave Allocation,Carry Forwarded Leaves,Mover ausencias reenviadas
apps/erpnext/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py,'From Date' must be after 'To Date','Desde fecha' debe ser después de 'Hasta Fecha' apps/erpnext/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py,'From Date' must be after 'To Date','Desde fecha' debe ser después de 'Hasta Fecha'
,Stock Projected Qty,Cantidad de Inventario Proyectada ,Stock Projected Qty,Cantidad de Inventario Proyectada
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py,Customer {0} does not belong to project {1},Cliente {0} no pertenece a proyectar {1} apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py,Customer {0} does not belong to project {1},Cliente {0} no pertenece a proyectar {1}
@ -678,7 +673,6 @@ DocType: POS Item Group,Item Group,Grupo de artículos
DocType: Purchase Invoice,Taxes and Charges Added (Company Currency),Impuestos y Cargos Añadidos (Moneda Local) DocType: Purchase Invoice,Taxes and Charges Added (Company Currency),Impuestos y Cargos Añadidos (Moneda Local)
apps/erpnext/erpnext/accounts/doctype/item_tax_template/item_tax_template.py,Item Tax Row {0} must have account of type Tax or Income or Expense or Chargeable,"Campo de impuesto del producto {0} debe tener un tipo de cuenta de impuestos, ingresos, cargos o gastos" apps/erpnext/erpnext/accounts/doctype/item_tax_template/item_tax_template.py,Item Tax Row {0} must have account of type Tax or Income or Expense or Chargeable,"Campo de impuesto del producto {0} debe tener un tipo de cuenta de impuestos, ingresos, cargos o gastos"
DocType: Item,Default BOM,Solicitud de Materiales por Defecto DocType: Item,Default BOM,Solicitud de Materiales por Defecto
apps/erpnext/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py,Total Outstanding Amt,Monto Total Soprepasado
apps/erpnext/erpnext/setup/setup_wizard/data/industry_type.py,Automotive,Automotor apps/erpnext/erpnext/setup/setup_wizard/data/industry_type.py,Automotive,Automotor
DocType: Cashier Closing,From Time,Desde fecha DocType: Cashier Closing,From Time,Desde fecha
apps/erpnext/erpnext/setup/setup_wizard/data/industry_type.py,Investment Banking,Banca de Inversión apps/erpnext/erpnext/setup/setup_wizard/data/industry_type.py,Investment Banking,Banca de Inversión
@ -803,7 +797,7 @@ apps/erpnext/erpnext/setup/setup_wizard/operations/install_fixtures.py,Piecework
DocType: Task,Actual Time (in Hours),Tiempo actual (En horas) DocType: Task,Actual Time (in Hours),Tiempo actual (En horas)
DocType: Department,Leave Block List,Lista de Bloqueo de Vacaciones DocType: Department,Leave Block List,Lista de Bloqueo de Vacaciones
DocType: Purchase Invoice,Return,Retorno DocType: Purchase Invoice,Return,Retorno
DocType: Accounting Dimension,Disable,Inhabilitar DocType: Account,Disable,Inhabilitar
apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py,Sales Order {0} is not submitted,Órden de Venta {0} no esta presentada apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py,Sales Order {0} is not submitted,Órden de Venta {0} no esta presentada
DocType: Purchase Order Item,Last Purchase Rate,Tasa de Cambio de la Última Compra DocType: Purchase Order Item,Last Purchase Rate,Tasa de Cambio de la Última Compra
apps/erpnext/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py,Stock cannot exist for Item {0} since has variants,Inventario no puede existir para el punto {0} ya tiene variantes apps/erpnext/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py,Stock cannot exist for Item {0} since has variants,Inventario no puede existir para el punto {0} ya tiene variantes
@ -876,7 +870,6 @@ DocType: Purchase Invoice Item,Amount (Company Currency),Importe (Moneda Local)
apps/erpnext/erpnext/config/retail.py,Point-of-Sale Profile,Perfiles del Punto de Venta POS apps/erpnext/erpnext/config/retail.py,Point-of-Sale Profile,Perfiles del Punto de Venta POS
DocType: Cost Center,Cost Center Name,Nombre Centro de Costo DocType: Cost Center,Cost Center Name,Nombre Centro de Costo
DocType: Maintenance Schedule Detail,Scheduled Date,Fecha prevista DocType: Maintenance Schedule Detail,Scheduled Date,Fecha prevista
apps/erpnext/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py,Total Paid Amt,Total Pagado Amt
DocType: SMS Center,Messages greater than 160 characters will be split into multiple messages,Los mensajes de más de 160 caracteres se dividirá en varios mensajes DocType: SMS Center,Messages greater than 160 characters will be split into multiple messages,Los mensajes de más de 160 caracteres se dividirá en varios mensajes
,Serial No Service Contract Expiry,Número de orden de servicio Contrato de caducidad ,Serial No Service Contract Expiry,Número de orden de servicio Contrato de caducidad
DocType: Naming Series,Help HTML,Ayuda HTML DocType: Naming Series,Help HTML,Ayuda HTML
@ -979,7 +972,7 @@ DocType: Manufacturing Settings,Allow Production on Holidays,Permitir Producció
apps/erpnext/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py,Capital Stock,Capital Social apps/erpnext/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py,Capital Stock,Capital Social
DocType: Packing Slip,Package Weight Details,Peso Detallado del Paquete DocType: Packing Slip,Package Weight Details,Peso Detallado del Paquete
apps/erpnext/erpnext/config/projects.py,Project master.,Proyecto maestro apps/erpnext/erpnext/config/projects.py,Project master.,Proyecto maestro
DocType: Leave Type,Is Carry Forward,Es llevar adelante DocType: Leave Ledger Entry,Is Carry Forward,Es llevar adelante
apps/erpnext/erpnext/stock/doctype/material_request/material_request.js,Get Items from BOM,Obtener elementos de la Solicitud de Materiales apps/erpnext/erpnext/stock/doctype/material_request/material_request.js,Get Items from BOM,Obtener elementos de la Solicitud de Materiales
apps/erpnext/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py,Lead Time Days,Tiempo de Entrega en Días apps/erpnext/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py,Lead Time Days,Tiempo de Entrega en Días
apps/erpnext/erpnext/stock/doctype/material_request/material_request.js,Bill of Materials,Lista de materiales (LdM) apps/erpnext/erpnext/stock/doctype/material_request/material_request.js,Bill of Materials,Lista de materiales (LdM)

1 DocType: Employee Salary Mode Modo de Salario
57 DocType: Work Order Operation Updated via 'Time Log' Actualizado a través de 'Hora de Registro'
58 DocType: Naming Series Series List for this Transaction Lista de series para esta transacción
59 DocType: Delivery Note Item Against Sales Invoice Item Contra la Factura de Venta de Artículos
60 DocType: Delivery Stop DocType: Call Log Contact Name Nombre del Contacto
61 apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py Row {0}: Please check 'Is Advance' against Account {1} if this is an advance entry. Fila {0}: Por favor, consulte "¿Es Avance 'contra la Cuenta {1} si se trata de una entrada con antelación.
62 apps/erpnext/erpnext/stock/utils.py Warehouse {0} does not belong to company {1} Almacén {0} no pertenece a la empresa {1}
63 DocType: Stock Reconciliation Item Stock Reconciliation Item Articulo de Reconciliación de Inventario
70 DocType: Maintenance Schedule Generate Schedule Generar Horario
71 apps/erpnext/erpnext/config/crm.py Manage Sales Person Tree. Vista en árbol para la administración de las categoría de vendedores
72 DocType: Item Synced With Hub Sincronizado con Hub
73 apps/erpnext/erpnext/manufacturing/doctype/production_order/production_order.py apps/erpnext/erpnext/manufacturing/doctype/work_order/work_order.py Completed Qty can not be greater than 'Qty to Manufacture' La cantidad completada no puede ser mayor que la cantidad a producir
74 DocType: Period Closing Voucher Closing Account Head Cuenta de cierre principal
75 DocType: Stock Settings Notify by Email on creation of automatic Material Request Notificarme por Email cuando se genere una nueva solicitud de materiales
76 apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.js Delivery Note Notas de Entrega
179 apps/erpnext/erpnext/public/js/setup_wizard.js The name of your company for which you are setting up this system. El nombre de su empresa para la que va a configurar el sistema.
180 apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.js Purchase Receipt Recibos de Compra
181 apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py Serial No {0} does not belong to Item {1} Número de orden {0} no pertenece al elemento {1}
182 DocType: Purchase Receipt Item Supplied DocType: Purchase Order Item Supplied Required Qty Cant. Necesaria
183 DocType: Bank Reconciliation Account Currency Moneda de la Cuenta
184 apps/erpnext/erpnext/accounts/general_ledger.py Please mention Round Off Account in Company Por favor, indique la cuenta que utilizará para el redondeo--
185 apps/erpnext/erpnext/hr/doctype/attendance/attendance.py Employee {0} is not active or does not exist Empleado {0} no está activo o no existe
229 DocType: Tally Migration UOMs Unidades de Medida
230 apps/erpnext/erpnext/stock/utils.py {0} valid serial nos for Item {1} {0} No. de serie válidos para el producto {1}
231 apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.js Cost Center For Item with Item Code ' Centro de Costos para artículo con Código del artículo '
232 DocType: Email Campaign DocType: Call Log Lead Iniciativas
233 apps/erpnext/erpnext/controllers/buying_controller.py Row #{0}: Rejected Qty can not be entered in Purchase Return Fila # {0}: Rechazado Cantidad no se puede introducir en la Compra de Retorno
234 Purchase Order Items To Be Billed Ordenes de Compra por Facturar
235 DocType: Purchase Invoice Item Net Rate Tasa neta
366 DocType: Stock Reconciliation Stock Reconciliation Reconciliación de Inventario
367 apps/erpnext/erpnext/manufacturing/doctype/production_order/production_order.py apps/erpnext/erpnext/manufacturing/doctype/work_order/work_order.py Work-in-Progress Warehouse is required before Submit Se requiere un Almacen de Trabajo en Proceso antes de Enviar
368 DocType: Supplier Statutory info and other general information about your Supplier Información legal y otra información general acerca de su proveedor
369 apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py Against Journal Entry {0} does not have any unmatched {1} entry Contra la Entrada de Diario {0} no tiene ninguna {1} entrada que vincular
370 apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py Duplicate Serial No entered for Item {0} Duplicar Serie No existe para la partida {0}
371 DocType: Packing Slip The net weight of this package. (calculated automatically as sum of net weight of items) El peso neto de este paquete . ( calculados automáticamente como la suma del peso neto del material)
372 DocType: Sales Order To Deliver and Bill Para Entregar y Bill
429 DocType: Leave Application apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py Total Leave Days {0} is mandatory for Item {1} Total Vacaciones {0} es obligatorio para el producto {1}
430 apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py apps/erpnext/erpnext/stock/doctype/delivery_note/delivery_note.py {0} is mandatory for Item {1} Sales Order required for Item {0} {0} es obligatorio para el producto {1} Orden de Venta requerida para el punto {0}
431 apps/erpnext/erpnext/stock/doctype/delivery_note/delivery_note.py DocType: Purchase Invoice Item Sales Order required for Item {0} Rate (Company Currency) Orden de Venta requerida para el punto {0} Precio (Moneda Local)
DocType: Purchase Invoice Item Rate (Company Currency) Precio (Moneda Local)
432 DocType: Blanket Order Item Ordered Quantity Cantidad Pedida
433 apps/erpnext/erpnext/public/js/setup_wizard.js e.g. "Build tools for builders" por ejemplo " Herramientas para los Constructores "
434 apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py {0} against Sales Order {1} {0} contra orden de venta {1}
444 apps/erpnext/erpnext/accounts/report/accounts_receivable_summary/accounts_receivable_summary.py apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py Total Invoiced Amt Credit To account must be a Payable account Total Monto Facturado Crédito a la cuenta debe ser una cuenta por pagar
445 DocType: Cashier Closing DocType: Job Card Time Log To Time Completed Qty Para Tiempo Cant. Completada
446 apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py DocType: Manufacturing Settings Credit To account must be a Payable account Allow Overtime Crédito a la cuenta debe ser una cuenta por pagar Permitir horas extras
DocType: Job Card Time Log Completed Qty Cant. Completada
DocType: Manufacturing Settings Allow Overtime Permitir horas extras
447 DocType: Quality Inspection Sample Size Tamaño de la muestra
448 apps/erpnext/erpnext/stock/doctype/packing_slip/packing_slip.py Please specify a valid 'From Case No.' Por favor, especifique 'Desde el caso No.' válido
449 DocType: Branch Branch Rama
480 DocType: Shipping Rule apps/erpnext/erpnext/manufacturing/doctype/bom/bom.py Shipping Rule Label Raw Materials cannot be blank. Regla Etiqueta de envío Materias primas no pueden estar en blanco.
481 apps/erpnext/erpnext/manufacturing/doctype/bom/bom.py apps/erpnext/erpnext/manufacturing/doctype/bom/bom.js Raw Materials cannot be blank. You can not change rate if BOM mentioned agianst any item Materias primas no pueden estar en blanco. No se puede cambiar la tasa si hay una Solicitud de Materiales contra cualquier artículo
482 apps/erpnext/erpnext/manufacturing/doctype/bom/bom.js apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py You can not change rate if BOM mentioned agianst any item {0} {1} is not submitted No se puede cambiar la tasa si hay una Solicitud de Materiales contra cualquier artículo {0} {1} no esta presentado
apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py {0} {1} is not submitted {0} {1} no esta presentado
483 DocType: Purchase Invoice Terms and Conditions1 Términos y Condiciones 1
484 DocType: Accounts Settings Accounting entry frozen up to this date, nobody can do / modify entry except role specified below. Asiento contable congelado actualmente ; nadie puede modificar el asiento excepto el rol que se especifica a continuación .
485 apps/erpnext/erpnext/stock/doctype/stock_entry/stock_entry.py Item or Warehouse for row {0} does not match Material Request Artículo o Bodega para la fila {0} no coincide Solicitud de material
502 DocType: Purchase Invoice apps/erpnext/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js Currency and Price List Row {0}:Start Date must be before End Date Divisa y Lista de precios Fila {0}: Fecha de inicio debe ser anterior Fecha de finalización
503 apps/erpnext/erpnext/maintenance/doctype/maintenance_schedule/maintenance_schedule.js DocType: Purchase Receipt Row {0}:Start Date must be before End Date Time at which materials were received Fila {0}: Fecha de inicio debe ser anterior Fecha de finalización Momento en que se recibieron los materiales
504 DocType: Purchase Receipt apps/erpnext/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py Time at which materials were received Utility Expenses Momento en que se recibieron los materiales Los gastos de servicios públicos
apps/erpnext/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py Utility Expenses Los gastos de servicios públicos
505 apps/erpnext/erpnext/accounts/report/payment_period_based_on_invoice_date/payment_period_based_on_invoice_date.py 90-Above 90-Mayor
506 DocType: Buying Settings Default Buying Price List Lista de precios predeterminada
507 apps/erpnext/erpnext/config/settings.py Set Default Values like Company, Currency, Current Fiscal Year, etc. Establecer Valores Predeterminados , como Empresa , Moneda, Año Fiscal Actual, etc
556 apps/erpnext/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.py Accounting Entry for Stock Asiento contable de inventario
557 DocType: Sales Invoice Sales Team1 Team1 Ventas
558 DocType: Account Root Type Tipo Root
559 apps/erpnext/erpnext/controllers/sales_and_purchase_return.py Row # {0}: Cannot return more than {1} for Item {2} Fila # {0}: No se puede devolver más de {1} para el artículo {2}
560 DocType: BOM Item UOM Unidad de Medida del Artículo
561 DocType: Sales Taxes and Charges Tax Amount After Discount Amount (Company Currency) Monto de impuestos Después Cantidad de Descuento (Compañía moneda)
562 apps/erpnext/erpnext/stock/doctype/stock_entry/stock_entry.py Target warehouse is mandatory for row {0} Almacenes de destino es obligatorio para la fila {0}
574 apps/erpnext/erpnext/hr/doctype/job_applicant/job_applicant.py apps/erpnext/erpnext/accounts/doctype/account/account.py Name or Email is mandatory Root Type is mandatory Nombre o Email es obligatorio Tipo Root es obligatorio
575 apps/erpnext/erpnext/accounts/doctype/account/account.py apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py Root Type is mandatory Serial No {0} created Tipo Root es obligatorio Número de orden {0} creado
576 apps/erpnext/erpnext/stock/doctype/serial_no/serial_no.py DocType: Customer Group Serial No {0} created Only leaf nodes are allowed in transaction Número de orden {0} creado Sólo las Cuentas de Detalle se permiten en una transacción
DocType: Customer Group Only leaf nodes are allowed in transaction Sólo las Cuentas de Detalle se permiten en una transacción
577 DocType: Purchase Receipt Item Supplied Purchase Receipt Item Supplied Recibo de Compra del Artículo Adquirido
578 apps/erpnext/erpnext/hr/doctype/employee/employee.py Please enter relieving date. Por favor, introduzca la fecha de recepción.
579 DocType: Opportunity Enter name of campaign if source of enquiry is campaign Introduzca el nombre de la campaña si el origen de la encuesta es una campaña
607 apps/erpnext/erpnext/stock/report/itemwise_recommended_reorder_level/itemwise_recommended_reorder_level.py Stock Projected Qty 'From Date' must be after 'To Date' Cantidad de Inventario Proyectada 'Desde fecha' debe ser después de 'Hasta Fecha'
608 apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py Customer {0} does not belong to project {1} Stock Projected Qty Cliente {0} no pertenece a proyectar {1} Cantidad de Inventario Proyectada
609 DocType: Purchase Invoice apps/erpnext/erpnext/accounts/doctype/sales_invoice/sales_invoice.py Purchase Taxes and Charges Customer {0} does not belong to project {1} Impuestos de Compra y Cargos Cliente {0} no pertenece a proyectar {1}
610 DocType: Purchase Invoice Purchase Taxes and Charges Impuestos de Compra y Cargos
611 DocType: Leave Block List Leave Block List Allowed Lista de Bloqueo de Vacaciones Permitida
612 apps/erpnext/erpnext/selling/doctype/sales_order/sales_order.py Quotation {0} not of type {1} Cotización {0} no es de tipo {1}
613 apps/erpnext/erpnext/accounts/doctype/account/chart_of_accounts/verified/standard_chart_of_accounts_with_account_number.py Bank Overdraft Account Cuenta de sobregiros
673 apps/erpnext/erpnext/setup/setup_wizard/data/industry_type.py DocType: Cashier Closing Automotive From Time Automotor Desde fecha
674 DocType: Cashier Closing apps/erpnext/erpnext/setup/setup_wizard/data/industry_type.py From Time Investment Banking Desde fecha Banca de Inversión
675 apps/erpnext/erpnext/setup/setup_wizard/data/industry_type.py apps/erpnext/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py Investment Banking Stock transactions before {0} are frozen Banca de Inversión Operaciones de Inventario antes de {0} se congelan
apps/erpnext/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py Stock transactions before {0} are frozen Operaciones de Inventario antes de {0} se congelan
676 apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py Reference No is mandatory if you entered Reference Date Referencia No es obligatorio si introdujo Fecha de Referencia
677 apps/erpnext/erpnext/hr/doctype/employee/employee.py Date of Joining must be greater than Date of Birth Fecha de acceso debe ser mayor que Fecha de Nacimiento
678 DocType: Production Plan For Warehouse Por almacén
797 DocType: Purchase Order Item Last Purchase Rate Tasa de Cambio de la Última Compra
798 apps/erpnext/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py Stock cannot exist for Item {0} since has variants Inventario no puede existir para el punto {0} ya tiene variantes
799 Sales Person-wise Transaction Summary Resumen de Transacción por Vendedor
800 apps/erpnext/erpnext/stock/doctype/warehouse/warehouse.py Warehouse {0} does not exist Almacén {0} no existe
801 DocType: Monthly Distribution Monthly Distribution Percentages Los porcentajes de distribución mensuales
802 apps/erpnext/erpnext/stock/doctype/batch/batch.py The selected item cannot have Batch El elemento seleccionado no puede tener lotes
803 DocType: Project Customer Details Datos del Cliente
870 DocType: Naming Series Serial No Service Contract Expiry Help HTML Número de orden de servicio Contrato de caducidad Ayuda HTML
871 DocType: Naming Series DocType: Item Help HTML Has Serial No Ayuda HTML Tiene No de Serie
872 DocType: Item DocType: Employee Has Serial No Date of Issue Tiene No de Serie Fecha de emisión
DocType: Employee Date of Issue Fecha de emisión
873 apps/erpnext/erpnext/accounts/doctype/account/account.py You are not authorized to set Frozen value Usted no está autorizado para fijar el valor congelado
874 apps/erpnext/erpnext/public/js/setup_wizard.js What does it do? ¿Qué hace?
875 apps/erpnext/erpnext/stock/doctype/item/item.py 'Has Serial No' can not be 'Yes' for non-stock item 'Tiene Número de Serie' no puede ser "Sí" para elementos que son de inventario
972 apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py Row {0}: Party Type and Party is required for Receivable / Payable account {1} Fila {0}: el tipo de entidad se requiere para las cuentas por cobrar/pagar {1}
973 apps/erpnext/erpnext/accounts/report/bank_reconciliation_statement/bank_reconciliation_statement.py Ref Date Fecha Ref
974 DocType: Expense Claim Detail Sanctioned Amount importe sancionado
975 DocType: GL Entry Is Opening Es apertura
976 apps/erpnext/erpnext/accounts/doctype/journal_entry/journal_entry.py Row {0}: Debit entry can not be linked with a {1} Fila {0}: Débito no puede vincularse con {1}
977 DocType: Employee Short biography for website and other publications. Breve biografía de la página web y otras publicaciones.
978

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

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