Merge branch 'develop' into dev-work-order-bugs
This commit is contained in:
commit
a51a304cf0
@ -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'''
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -100,7 +100,10 @@ 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
|
||||||
frappe.throw(_("Please add the account to root level Company - %s" % ancestors[0]))
|
|
||||||
|
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]))
|
||||||
else:
|
else:
|
||||||
descendants = get_descendants_of('Company', self.company)
|
descendants = get_descendants_of('Company', self.company)
|
||||||
if not descendants: return
|
if not descendants: return
|
||||||
@ -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():
|
||||||
|
@ -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]
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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'),
|
||||||
|
@ -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",
|
||||||
@ -168,4 +167,4 @@
|
|||||||
"show_name_in_global_search": 1,
|
"show_name_in_global_search": 1,
|
||||||
"sort_field": "modified",
|
"sort_field": "modified",
|
||||||
"sort_order": "ASC"
|
"sort_order": "ASC"
|
||||||
}
|
}
|
@ -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) {
|
||||||
|
@ -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",
|
||||||
|
@ -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"]
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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, {})
|
||||||
|
@ -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:
|
||||||
|
@ -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)
|
||||||
@ -19,18 +22,28 @@ def execute(filters=None):
|
|||||||
for d in entries:
|
for d in entries:
|
||||||
invoice = invoice_details.get(d.against_voucher) or frappe._dict()
|
invoice = invoice_details.get(d.against_voucher) or frappe._dict()
|
||||||
|
|
||||||
if d.reference_type=="Purchase Invoice":
|
if d.reference_type == "Purchase Invoice":
|
||||||
payment_amount = flt(d.debit) or -1 * flt(d.credit)
|
payment_amount = flt(d.debit) or -1 * flt(d.credit)
|
||||||
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)
|
||||||
|
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -5,9 +5,8 @@
|
|||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"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",
|
||||||
|
@ -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",
|
||||||
|
@ -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",
|
||||||
|
@ -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):
|
||||||
|
@ -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,23 +54,40 @@ 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.submit()
|
je.save()
|
||||||
|
if not je.meta.get_workflow():
|
||||||
|
je.submit()
|
||||||
|
|
||||||
d.db_set("journal_entry", je.name)
|
d.db_set("journal_entry", je.name)
|
||||||
|
|
||||||
|
@ -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'])})
|
||||||
|
@ -1,685 +1,211 @@
|
|||||||
{
|
{
|
||||||
"allow_copy": 0,
|
"allow_import": 1,
|
||||||
"allow_guest_to_view": 0,
|
"autoname": "naming_series:",
|
||||||
"allow_import": 1,
|
"creation": "2016-04-25 18:00:23.559973",
|
||||||
"allow_rename": 0,
|
"doctype": "DocType",
|
||||||
"autoname": "ACC-ASM-.YYYY.-.#####",
|
"field_order": [
|
||||||
"beta": 0,
|
"naming_series",
|
||||||
"creation": "2016-04-25 18:00:23.559973",
|
"company",
|
||||||
"custom": 0,
|
"purpose",
|
||||||
"docstatus": 0,
|
"asset",
|
||||||
"doctype": "DocType",
|
"transaction_date",
|
||||||
"document_type": "",
|
"column_break_4",
|
||||||
"editable_grid": 0,
|
"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,
|
"fieldname": "company",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Link",
|
||||||
"allow_on_submit": 0,
|
"in_list_view": 1,
|
||||||
"bold": 0,
|
"in_standard_filter": 1,
|
||||||
"collapsible": 0,
|
"label": "Company",
|
||||||
"columns": 0,
|
"options": "Company",
|
||||||
"fieldname": "company",
|
"remember_last_selected_value": 1,
|
||||||
"fieldtype": "Link",
|
"reqd": 1
|
||||||
"hidden": 0,
|
},
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 1,
|
|
||||||
"in_standard_filter": 1,
|
|
||||||
"label": "Company",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Company",
|
|
||||||
"permlevel": 0,
|
|
||||||
"precision": "",
|
|
||||||
"print_hide": 0,
|
|
||||||
"print_hide_if_no_value": 0,
|
|
||||||
"read_only": 0,
|
|
||||||
"remember_last_selected_value": 1,
|
|
||||||
"report_hide": 0,
|
|
||||||
"reqd": 1,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"default": "Transfer",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldname": "purpose",
|
||||||
"allow_on_submit": 0,
|
"fieldtype": "Select",
|
||||||
"bold": 0,
|
"label": "Purpose",
|
||||||
"collapsible": 0,
|
"options": "\nIssue\nReceipt\nTransfer",
|
||||||
"columns": 0,
|
"reqd": 1
|
||||||
"default": "Transfer",
|
},
|
||||||
"fieldname": "purpose",
|
|
||||||
"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",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "\nIssue\nReceipt\nTransfer",
|
|
||||||
"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,
|
"fieldname": "asset",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Link",
|
||||||
"allow_on_submit": 0,
|
"in_global_search": 1,
|
||||||
"bold": 0,
|
"in_list_view": 1,
|
||||||
"collapsible": 0,
|
"in_standard_filter": 1,
|
||||||
"columns": 0,
|
"label": "Asset",
|
||||||
"fieldname": "asset",
|
"options": "Asset",
|
||||||
"fieldtype": "Link",
|
"reqd": 1
|
||||||
"hidden": 0,
|
},
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 1,
|
|
||||||
"in_list_view": 1,
|
|
||||||
"in_standard_filter": 1,
|
|
||||||
"label": "Asset",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 0,
|
|
||||||
"options": "Asset",
|
|
||||||
"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,
|
"fieldname": "transaction_date",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Datetime",
|
||||||
"allow_on_submit": 0,
|
"in_list_view": 1,
|
||||||
"bold": 0,
|
"label": "Transaction Date",
|
||||||
"collapsible": 0,
|
"reqd": 1
|
||||||
"columns": 0,
|
},
|
||||||
"fieldname": "transaction_date",
|
|
||||||
"fieldtype": "Datetime",
|
|
||||||
"hidden": 0,
|
|
||||||
"ignore_user_permissions": 0,
|
|
||||||
"ignore_xss_filter": 0,
|
|
||||||
"in_filter": 0,
|
|
||||||
"in_global_search": 0,
|
|
||||||
"in_list_view": 1,
|
|
||||||
"in_standard_filter": 0,
|
|
||||||
"label": "Transaction Date",
|
|
||||||
"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": 1,
|
|
||||||
"search_index": 0,
|
|
||||||
"set_only_once": 0,
|
|
||||||
"translatable": 0,
|
|
||||||
"unique": 0
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
"allow_bulk_edit": 0,
|
"fieldname": "column_break_4",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Column Break"
|
||||||
"allow_on_submit": 0,
|
},
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "column_break_4",
|
|
||||||
"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,
|
"fieldname": "quantity",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Float",
|
||||||
"allow_on_submit": 0,
|
"label": "Quantity"
|
||||||
"bold": 0,
|
},
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "quantity",
|
|
||||||
"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": "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,
|
"fieldname": "select_serial_no",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Link",
|
||||||
"allow_on_submit": 0,
|
"label": "Select Serial No",
|
||||||
"bold": 0,
|
"options": "Serial No"
|
||||||
"collapsible": 0,
|
},
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "select_serial_no",
|
|
||||||
"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",
|
|
||||||
"length": 0,
|
|
||||||
"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,
|
"fieldname": "serial_no",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Small Text",
|
||||||
"allow_on_submit": 0,
|
"label": "Serial No"
|
||||||
"bold": 0,
|
},
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "serial_no",
|
|
||||||
"fieldtype": "Small Text",
|
|
||||||
"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": "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,
|
"fieldname": "section_break_7",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Section Break"
|
||||||
"allow_on_submit": 0,
|
},
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "section_break_7",
|
|
||||||
"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,
|
"fieldname": "source_location",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Link",
|
||||||
"allow_on_submit": 0,
|
"label": "Source Location",
|
||||||
"bold": 0,
|
"options": "Location"
|
||||||
"collapsible": 0,
|
},
|
||||||
"columns": 0,
|
|
||||||
"fetch_from": "",
|
|
||||||
"fieldname": "source_location",
|
|
||||||
"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",
|
|
||||||
"length": 0,
|
|
||||||
"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,
|
"fieldname": "target_location",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Link",
|
||||||
"allow_on_submit": 0,
|
"label": "Target Location",
|
||||||
"bold": 0,
|
"options": "Location"
|
||||||
"collapsible": 0,
|
},
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "target_location",
|
|
||||||
"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",
|
|
||||||
"length": 0,
|
|
||||||
"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,
|
"fieldname": "column_break_10",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Column Break"
|
||||||
"allow_on_submit": 0,
|
},
|
||||||
"bold": 0,
|
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "column_break_10",
|
|
||||||
"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,
|
"fieldname": "from_employee",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Link",
|
||||||
"allow_on_submit": 0,
|
"ignore_user_permissions": 1,
|
||||||
"bold": 0,
|
"label": "From Employee",
|
||||||
"collapsible": 0,
|
"options": "Employee"
|
||||||
"columns": 0,
|
},
|
||||||
"fieldname": "from_employee",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"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",
|
|
||||||
"length": 0,
|
|
||||||
"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,
|
"fieldname": "to_employee",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Link",
|
||||||
"allow_on_submit": 0,
|
"ignore_user_permissions": 1,
|
||||||
"bold": 0,
|
"label": "To Employee",
|
||||||
"collapsible": 0,
|
"options": "Employee"
|
||||||
"columns": 0,
|
},
|
||||||
"fieldname": "to_employee",
|
|
||||||
"fieldtype": "Link",
|
|
||||||
"hidden": 0,
|
|
||||||
"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",
|
|
||||||
"length": 0,
|
|
||||||
"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,
|
"fieldname": "reference",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Section Break",
|
||||||
"allow_on_submit": 0,
|
"label": "Reference"
|
||||||
"bold": 0,
|
},
|
||||||
"collapsible": 0,
|
|
||||||
"columns": 0,
|
|
||||||
"fieldname": "reference",
|
|
||||||
"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,
|
|
||||||
"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,
|
"fieldname": "reference_doctype",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Link",
|
||||||
"allow_on_submit": 0,
|
"label": "Reference DocType",
|
||||||
"bold": 0,
|
"no_copy": 1,
|
||||||
"collapsible": 0,
|
"options": "DocType",
|
||||||
"columns": 0,
|
"read_only": 1
|
||||||
"fieldname": "reference_doctype",
|
},
|
||||||
"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",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 1,
|
|
||||||
"options": "DocType",
|
|
||||||
"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,
|
"fieldname": "reference_name",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Dynamic Link",
|
||||||
"allow_on_submit": 0,
|
"label": "Reference Name",
|
||||||
"bold": 0,
|
"no_copy": 1,
|
||||||
"collapsible": 0,
|
"options": "reference_doctype",
|
||||||
"columns": 0,
|
"read_only": 1
|
||||||
"fieldname": "reference_name",
|
},
|
||||||
"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",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 1,
|
|
||||||
"options": "reference_doctype",
|
|
||||||
"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,
|
"fieldname": "amended_from",
|
||||||
"allow_in_quick_entry": 0,
|
"fieldtype": "Link",
|
||||||
"allow_on_submit": 0,
|
"label": "Amended From",
|
||||||
"bold": 0,
|
"no_copy": 1,
|
||||||
"collapsible": 0,
|
"options": "Asset Movement",
|
||||||
"columns": 0,
|
"print_hide": 1,
|
||||||
"fieldname": "amended_from",
|
"read_only": 1
|
||||||
"fieldtype": "Link",
|
},
|
||||||
"hidden": 0,
|
{
|
||||||
"ignore_user_permissions": 0,
|
"default": "ACC-ASM-.YYYY.-",
|
||||||
"ignore_xss_filter": 0,
|
"fieldname": "naming_series",
|
||||||
"in_filter": 0,
|
"fieldtype": "Select",
|
||||||
"in_global_search": 0,
|
"label": "Series",
|
||||||
"in_list_view": 0,
|
"options": "ACC-ASM-.YYYY.-",
|
||||||
"in_standard_filter": 0,
|
"reqd": 1
|
||||||
"label": "Amended From",
|
|
||||||
"length": 0,
|
|
||||||
"no_copy": 1,
|
|
||||||
"options": "Asset Movement",
|
|
||||||
"permlevel": 0,
|
|
||||||
"print_hide": 1,
|
|
||||||
"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
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"has_web_view": 0,
|
"is_submittable": 1,
|
||||||
"hide_heading": 0,
|
"modified": "2019-09-16 16:27:53.887634",
|
||||||
"hide_toolbar": 0,
|
"modified_by": "Administrator",
|
||||||
"idx": 0,
|
"module": "Assets",
|
||||||
"image_view": 0,
|
"name": "Asset Movement",
|
||||||
"in_create": 0,
|
"owner": "Administrator",
|
||||||
"is_submittable": 1,
|
|
||||||
"issingle": 0,
|
|
||||||
"istable": 0,
|
|
||||||
"max_attachments": 0,
|
|
||||||
"modified": "2018-08-21 16:15:40.563655",
|
|
||||||
"modified_by": "Administrator",
|
|
||||||
"module": "Assets",
|
|
||||||
"name": "Asset Movement",
|
|
||||||
"name_case": "",
|
|
||||||
"owner": "Administrator",
|
|
||||||
"permissions": [
|
"permissions": [
|
||||||
{
|
{
|
||||||
"amend": 1,
|
"amend": 1,
|
||||||
"cancel": 1,
|
"cancel": 1,
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
"email": 1,
|
"email": 1,
|
||||||
"export": 1,
|
"export": 1,
|
||||||
"if_owner": 0,
|
"print": 1,
|
||||||
"import": 0,
|
"read": 1,
|
||||||
"permlevel": 0,
|
"report": 1,
|
||||||
"print": 1,
|
"role": "System Manager",
|
||||||
"read": 1,
|
"share": 1,
|
||||||
"report": 1,
|
"submit": 1,
|
||||||
"role": "System Manager",
|
|
||||||
"set_user_permissions": 0,
|
|
||||||
"share": 1,
|
|
||||||
"submit": 1,
|
|
||||||
"write": 1
|
"write": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"amend": 1,
|
"amend": 1,
|
||||||
"cancel": 1,
|
"cancel": 1,
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
"email": 1,
|
"email": 1,
|
||||||
"export": 1,
|
"export": 1,
|
||||||
"if_owner": 0,
|
"print": 1,
|
||||||
"import": 0,
|
"read": 1,
|
||||||
"permlevel": 0,
|
"report": 1,
|
||||||
"print": 1,
|
"role": "Accounts Manager",
|
||||||
"read": 1,
|
"share": 1,
|
||||||
"report": 1,
|
"submit": 1,
|
||||||
"role": "Accounts Manager",
|
|
||||||
"set_user_permissions": 0,
|
|
||||||
"share": 1,
|
|
||||||
"submit": 1,
|
|
||||||
"write": 1
|
"write": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"amend": 1,
|
"amend": 1,
|
||||||
"cancel": 1,
|
"cancel": 1,
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
"email": 1,
|
"email": 1,
|
||||||
"export": 1,
|
"export": 1,
|
||||||
"if_owner": 0,
|
"print": 1,
|
||||||
"import": 0,
|
"read": 1,
|
||||||
"permlevel": 0,
|
"report": 1,
|
||||||
"print": 1,
|
"role": "Stock Manager",
|
||||||
"read": 1,
|
"share": 1,
|
||||||
"report": 1,
|
"submit": 1,
|
||||||
"role": "Stock Manager",
|
|
||||||
"set_user_permissions": 0,
|
|
||||||
"share": 1,
|
|
||||||
"submit": 1,
|
|
||||||
"write": 1
|
"write": 1
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"quick_entry": 0,
|
"sort_field": "modified",
|
||||||
"read_only": 0,
|
"sort_order": "DESC"
|
||||||
"read_only_onload": 0,
|
|
||||||
"show_name_in_global_search": 0,
|
|
||||||
"sort_field": "modified",
|
|
||||||
"sort_order": "DESC",
|
|
||||||
"track_changes": 0,
|
|
||||||
"track_seen": 0,
|
|
||||||
"track_views": 0
|
|
||||||
}
|
}
|
@ -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,
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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'''
|
||||||
|
@ -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"],
|
||||||
}
|
filters=item_filters,
|
||||||
|
|
||||||
return frappe.get_all("Item Manufacturer",
|
|
||||||
fields = "manufacturer",
|
|
||||||
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
@ -18,12 +18,14 @@ frappe.listview_settings['Opportunity'] = {
|
|||||||
listview.call_for_selected_items(method, {"status": "Closed"});
|
listview.call_for_selected_items(method, {"status": "Closed"});
|
||||||
});
|
});
|
||||||
|
|
||||||
listview.page.fields_dict.opportunity_from.get_query = function() {
|
if(listview.page.fields_dict.opportunity_from) {
|
||||||
return {
|
listview.page.fields_dict.opportunity_from.get_query = function() {
|
||||||
"filters": {
|
return {
|
||||||
"name": ["in", ["Customer", "Lead"]],
|
"filters": {
|
||||||
}
|
"name": ["in", ["Customer", "Lead"]],
|
||||||
|
}
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -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",
|
||||||
|
@ -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",
|
||||||
|
@ -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",
|
||||||
|
@ -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
|
||||||
|
@ -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):
|
||||||
"""
|
"""
|
||||||
|
@ -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,19 +8,24 @@ import requests
|
|||||||
|
|
||||||
@frappe.whitelist(allow_guest=True)
|
@frappe.whitelist(allow_guest=True)
|
||||||
def handle_incoming_call(**kwargs):
|
def handle_incoming_call(**kwargs):
|
||||||
exotel_settings = get_exotel_settings()
|
try:
|
||||||
if not exotel_settings.enabled: return
|
exotel_settings = get_exotel_settings()
|
||||||
|
if not exotel_settings.enabled: return
|
||||||
|
|
||||||
call_payload = kwargs
|
call_payload = kwargs
|
||||||
status = call_payload.get('Status')
|
status = call_payload.get('Status')
|
||||||
if status == 'free':
|
if status == 'free':
|
||||||
return
|
return
|
||||||
|
|
||||||
call_log = get_call_log(call_payload)
|
call_log = get_call_log(call_payload)
|
||||||
if not call_log:
|
if not call_log:
|
||||||
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):
|
||||||
@ -101,4 +107,4 @@ def get_exotel_endpoint(action):
|
|||||||
api_token=settings.api_token,
|
api_token=settings.api_token,
|
||||||
sid=settings.account_sid,
|
sid=settings.account_sid,
|
||||||
action=action
|
action=action
|
||||||
)
|
)
|
||||||
|
@ -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
@ -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())
|
||||||
|
|
||||||
@ -753,4 +756,4 @@ def get_leave_approver(employee):
|
|||||||
leave_approver = frappe.db.get_value('Department Approver', {'parent': department,
|
leave_approver = frappe.db.get_value('Department Approver', {'parent': department,
|
||||||
'parentfield': 'leave_approvers', 'idx': 1}, 'approver')
|
'parentfield': 'leave_approvers', 'idx': 1}, 'approver')
|
||||||
|
|
||||||
return leave_approver
|
return leave_approver
|
||||||
|
@ -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",
|
||||||
|
@ -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
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -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 "",
|
||||||
|
@ -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",
|
||||||
|
@ -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",
|
||||||
|
@ -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):
|
||||||
|
@ -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()
|
||||||
|
@ -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) {
|
||||||
|
@ -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",
|
||||||
|
@ -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
|
@ -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()
|
@ -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")
|
@ -1,381 +1,391 @@
|
|||||||
{
|
{
|
||||||
"allow_import": 1,
|
"allow_import": 1,
|
||||||
"autoname": "TASK-.YYYY.-.#####",
|
"autoname": "TASK-.YYYY.-.#####",
|
||||||
"creation": "2013-01-29 19:25:50",
|
"creation": "2013-01-29 19:25:50",
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
"document_type": "Setup",
|
"document_type": "Setup",
|
||||||
"field_order": [
|
"engine": "InnoDB",
|
||||||
"subject",
|
"field_order": [
|
||||||
"project",
|
"subject",
|
||||||
"issue",
|
"project",
|
||||||
"type",
|
"issue",
|
||||||
"is_group",
|
"type",
|
||||||
"column_break0",
|
"is_group",
|
||||||
"status",
|
"column_break0",
|
||||||
"priority",
|
"status",
|
||||||
"task_weight",
|
"priority",
|
||||||
"color",
|
"task_weight",
|
||||||
"parent_task",
|
"completed_by",
|
||||||
"sb_timeline",
|
"color",
|
||||||
"exp_start_date",
|
"parent_task",
|
||||||
"expected_time",
|
"sb_timeline",
|
||||||
"column_break_11",
|
"exp_start_date",
|
||||||
"exp_end_date",
|
"expected_time",
|
||||||
"progress",
|
"column_break_11",
|
||||||
"is_milestone",
|
"exp_end_date",
|
||||||
"sb_details",
|
"progress",
|
||||||
"description",
|
"is_milestone",
|
||||||
"sb_depends_on",
|
"sb_details",
|
||||||
"depends_on",
|
"description",
|
||||||
"depends_on_tasks",
|
"sb_depends_on",
|
||||||
"sb_actual",
|
"depends_on",
|
||||||
"act_start_date",
|
"depends_on_tasks",
|
||||||
"actual_time",
|
"sb_actual",
|
||||||
"column_break_15",
|
"act_start_date",
|
||||||
"act_end_date",
|
"actual_time",
|
||||||
"sb_costing",
|
"column_break_15",
|
||||||
"total_costing_amount",
|
"act_end_date",
|
||||||
"total_expense_claim",
|
"sb_costing",
|
||||||
"column_break_20",
|
"total_costing_amount",
|
||||||
"total_billing_amount",
|
"total_expense_claim",
|
||||||
"sb_more_info",
|
"column_break_20",
|
||||||
"review_date",
|
"total_billing_amount",
|
||||||
"closing_date",
|
"sb_more_info",
|
||||||
"column_break_22",
|
"review_date",
|
||||||
"department",
|
"closing_date",
|
||||||
"company",
|
"column_break_22",
|
||||||
"lft",
|
"department",
|
||||||
"rgt",
|
"company",
|
||||||
"old_parent"
|
"lft",
|
||||||
],
|
"rgt",
|
||||||
"fields": [
|
"old_parent"
|
||||||
{
|
],
|
||||||
"fieldname": "subject",
|
"fields": [
|
||||||
"fieldtype": "Data",
|
{
|
||||||
"in_global_search": 1,
|
"fieldname": "subject",
|
||||||
"label": "Subject",
|
"fieldtype": "Data",
|
||||||
"reqd": 1,
|
"in_global_search": 1,
|
||||||
"search_index": 1,
|
"in_standard_filter": 1,
|
||||||
"in_standard_filter": 1
|
"label": "Subject",
|
||||||
},
|
"reqd": 1,
|
||||||
{
|
"search_index": 1
|
||||||
"bold": 1,
|
},
|
||||||
"fieldname": "project",
|
{
|
||||||
"fieldtype": "Link",
|
"bold": 1,
|
||||||
"in_global_search": 1,
|
"fieldname": "project",
|
||||||
"in_list_view": 1,
|
"fieldtype": "Link",
|
||||||
"in_standard_filter": 1,
|
"in_global_search": 1,
|
||||||
"label": "Project",
|
"in_list_view": 1,
|
||||||
"oldfieldname": "project",
|
"in_standard_filter": 1,
|
||||||
"oldfieldtype": "Link",
|
"label": "Project",
|
||||||
"options": "Project",
|
"oldfieldname": "project",
|
||||||
"remember_last_selected_value": 1,
|
"oldfieldtype": "Link",
|
||||||
"search_index": 1
|
"options": "Project",
|
||||||
},
|
"remember_last_selected_value": 1,
|
||||||
{
|
"search_index": 1
|
||||||
"fieldname": "issue",
|
},
|
||||||
"fieldtype": "Link",
|
{
|
||||||
"label": "Issue",
|
"fieldname": "issue",
|
||||||
"options": "Issue"
|
"fieldtype": "Link",
|
||||||
},
|
"label": "Issue",
|
||||||
{
|
"options": "Issue"
|
||||||
"fieldname": "type",
|
},
|
||||||
"fieldtype": "Link",
|
{
|
||||||
"label": "Type",
|
"fieldname": "type",
|
||||||
"options": "Task Type"
|
"fieldtype": "Link",
|
||||||
},
|
"label": "Type",
|
||||||
{
|
"options": "Task Type"
|
||||||
"bold": 1,
|
},
|
||||||
"default": "0",
|
{
|
||||||
"fieldname": "is_group",
|
"bold": 1,
|
||||||
"fieldtype": "Check",
|
"default": "0",
|
||||||
"in_list_view": 1,
|
"fieldname": "is_group",
|
||||||
"label": "Is Group"
|
"fieldtype": "Check",
|
||||||
},
|
"in_list_view": 1,
|
||||||
{
|
"label": "Is Group"
|
||||||
"fieldname": "column_break0",
|
},
|
||||||
"fieldtype": "Column Break",
|
{
|
||||||
"oldfieldtype": "Column Break",
|
"fieldname": "column_break0",
|
||||||
"print_width": "50%",
|
"fieldtype": "Column Break",
|
||||||
"width": "50%"
|
"oldfieldtype": "Column Break",
|
||||||
},
|
"print_width": "50%",
|
||||||
{
|
"width": "50%"
|
||||||
"bold": 1,
|
},
|
||||||
"fieldname": "status",
|
{
|
||||||
"fieldtype": "Select",
|
"bold": 1,
|
||||||
"in_list_view": 1,
|
"fieldname": "status",
|
||||||
"in_standard_filter": 1,
|
"fieldtype": "Select",
|
||||||
"label": "Status",
|
"in_list_view": 1,
|
||||||
"no_copy": 1,
|
"in_standard_filter": 1,
|
||||||
"oldfieldname": "status",
|
"label": "Status",
|
||||||
"oldfieldtype": "Select",
|
"no_copy": 1,
|
||||||
"options": "Open\nWorking\nPending Review\nOverdue\nCompleted\nCancelled"
|
"oldfieldname": "status",
|
||||||
},
|
"oldfieldtype": "Select",
|
||||||
{
|
"options": "Open\nWorking\nPending Review\nOverdue\nCompleted\nCancelled"
|
||||||
"fieldname": "priority",
|
},
|
||||||
"fieldtype": "Select",
|
{
|
||||||
"in_list_view": 1,
|
"fieldname": "priority",
|
||||||
"in_standard_filter": 1,
|
"fieldtype": "Select",
|
||||||
"label": "Priority",
|
"in_list_view": 1,
|
||||||
"oldfieldname": "priority",
|
"in_standard_filter": 1,
|
||||||
"oldfieldtype": "Select",
|
"label": "Priority",
|
||||||
"options": "Low\nMedium\nHigh\nUrgent",
|
"oldfieldname": "priority",
|
||||||
"search_index": 1
|
"oldfieldtype": "Select",
|
||||||
},
|
"options": "Low\nMedium\nHigh\nUrgent",
|
||||||
{
|
"search_index": 1
|
||||||
"fieldname": "color",
|
},
|
||||||
"fieldtype": "Color",
|
{
|
||||||
"label": "Color"
|
"fieldname": "color",
|
||||||
},
|
"fieldtype": "Color",
|
||||||
{
|
"label": "Color"
|
||||||
"bold": 1,
|
},
|
||||||
"fieldname": "parent_task",
|
{
|
||||||
"fieldtype": "Link",
|
"bold": 1,
|
||||||
"ignore_user_permissions": 1,
|
"fieldname": "parent_task",
|
||||||
"label": "Parent Task",
|
"fieldtype": "Link",
|
||||||
"options": "Task",
|
"ignore_user_permissions": 1,
|
||||||
"search_index": 1
|
"label": "Parent Task",
|
||||||
},
|
"options": "Task",
|
||||||
{
|
"search_index": 1
|
||||||
"collapsible": 1,
|
},
|
||||||
"collapsible_depends_on": "eval:doc.__islocal",
|
{
|
||||||
"fieldname": "sb_timeline",
|
"collapsible": 1,
|
||||||
"fieldtype": "Section Break",
|
"collapsible_depends_on": "eval:doc.__islocal",
|
||||||
"label": "Timeline"
|
"fieldname": "sb_timeline",
|
||||||
},
|
"fieldtype": "Section Break",
|
||||||
{
|
"label": "Timeline"
|
||||||
"fieldname": "exp_start_date",
|
},
|
||||||
"fieldtype": "Date",
|
{
|
||||||
"label": "Expected Start Date",
|
"fieldname": "exp_start_date",
|
||||||
"oldfieldname": "exp_start_date",
|
"fieldtype": "Date",
|
||||||
"oldfieldtype": "Date"
|
"label": "Expected Start Date",
|
||||||
},
|
"oldfieldname": "exp_start_date",
|
||||||
{
|
"oldfieldtype": "Date"
|
||||||
"default": "0",
|
},
|
||||||
"fieldname": "expected_time",
|
{
|
||||||
"fieldtype": "Float",
|
"default": "0",
|
||||||
"label": "Expected Time (in hours)",
|
"fieldname": "expected_time",
|
||||||
"oldfieldname": "exp_total_hrs",
|
"fieldtype": "Float",
|
||||||
"oldfieldtype": "Data"
|
"label": "Expected Time (in hours)",
|
||||||
},
|
"oldfieldname": "exp_total_hrs",
|
||||||
{
|
"oldfieldtype": "Data"
|
||||||
"fetch_from": "type.weight",
|
},
|
||||||
"fieldname": "task_weight",
|
{
|
||||||
"fieldtype": "Float",
|
"fetch_from": "type.weight",
|
||||||
"label": "Weight"
|
"fieldname": "task_weight",
|
||||||
},
|
"fieldtype": "Float",
|
||||||
{
|
"label": "Weight"
|
||||||
"fieldname": "column_break_11",
|
},
|
||||||
"fieldtype": "Column Break"
|
{
|
||||||
},
|
"fieldname": "column_break_11",
|
||||||
{
|
"fieldtype": "Column Break"
|
||||||
"bold": 1,
|
},
|
||||||
"fieldname": "exp_end_date",
|
{
|
||||||
"fieldtype": "Date",
|
"bold": 1,
|
||||||
"label": "Expected End Date",
|
"fieldname": "exp_end_date",
|
||||||
"oldfieldname": "exp_end_date",
|
"fieldtype": "Date",
|
||||||
"oldfieldtype": "Date",
|
"label": "Expected End Date",
|
||||||
"search_index": 1
|
"oldfieldname": "exp_end_date",
|
||||||
},
|
"oldfieldtype": "Date",
|
||||||
{
|
"search_index": 1
|
||||||
"fieldname": "progress",
|
},
|
||||||
"fieldtype": "Percent",
|
{
|
||||||
"label": "% Progress"
|
"fieldname": "progress",
|
||||||
},
|
"fieldtype": "Percent",
|
||||||
{
|
"label": "% Progress"
|
||||||
"fieldname": "is_milestone",
|
},
|
||||||
"fieldtype": "Check",
|
{
|
||||||
"in_list_view": 1,
|
"default": "0",
|
||||||
"label": "Is Milestone"
|
"fieldname": "is_milestone",
|
||||||
},
|
"fieldtype": "Check",
|
||||||
{
|
"in_list_view": 1,
|
||||||
"fieldname": "sb_details",
|
"label": "Is Milestone"
|
||||||
"fieldtype": "Section Break",
|
},
|
||||||
"label": "Details",
|
{
|
||||||
"oldfieldtype": "Section Break"
|
"fieldname": "sb_details",
|
||||||
},
|
"fieldtype": "Section Break",
|
||||||
{
|
"label": "Details",
|
||||||
"fieldname": "description",
|
"oldfieldtype": "Section Break"
|
||||||
"fieldtype": "Text Editor",
|
},
|
||||||
"in_preview": 1,
|
{
|
||||||
"label": "Task Description",
|
"fieldname": "description",
|
||||||
"oldfieldname": "description",
|
"fieldtype": "Text Editor",
|
||||||
"oldfieldtype": "Text Editor",
|
"in_preview": 1,
|
||||||
"print_width": "300px",
|
"label": "Task Description",
|
||||||
"width": "300px"
|
"oldfieldname": "description",
|
||||||
},
|
"oldfieldtype": "Text Editor",
|
||||||
{
|
"print_width": "300px",
|
||||||
"fieldname": "sb_depends_on",
|
"width": "300px"
|
||||||
"fieldtype": "Section Break",
|
},
|
||||||
"label": "Dependencies",
|
{
|
||||||
"oldfieldtype": "Section Break"
|
"fieldname": "sb_depends_on",
|
||||||
},
|
"fieldtype": "Section Break",
|
||||||
{
|
"label": "Dependencies",
|
||||||
"fieldname": "depends_on",
|
"oldfieldtype": "Section Break"
|
||||||
"fieldtype": "Table",
|
},
|
||||||
"label": "Dependent Tasks",
|
{
|
||||||
"options": "Task Depends On"
|
"fieldname": "depends_on",
|
||||||
},
|
"fieldtype": "Table",
|
||||||
{
|
"label": "Dependent Tasks",
|
||||||
"fieldname": "depends_on_tasks",
|
"options": "Task Depends On"
|
||||||
"fieldtype": "Code",
|
},
|
||||||
"hidden": 1,
|
{
|
||||||
"label": "Depends on Tasks",
|
"fieldname": "depends_on_tasks",
|
||||||
"read_only": 1
|
"fieldtype": "Code",
|
||||||
},
|
"hidden": 1,
|
||||||
{
|
"label": "Depends on Tasks",
|
||||||
"fieldname": "sb_actual",
|
"read_only": 1
|
||||||
"fieldtype": "Section Break",
|
},
|
||||||
"oldfieldtype": "Column Break",
|
{
|
||||||
"print_width": "50%",
|
"fieldname": "sb_actual",
|
||||||
"width": "50%"
|
"fieldtype": "Section Break",
|
||||||
},
|
"oldfieldtype": "Column Break",
|
||||||
{
|
"print_width": "50%",
|
||||||
"fieldname": "act_start_date",
|
"width": "50%"
|
||||||
"fieldtype": "Date",
|
},
|
||||||
"label": "Actual Start Date (via Time Sheet)",
|
{
|
||||||
"oldfieldname": "act_start_date",
|
"fieldname": "act_start_date",
|
||||||
"oldfieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
"read_only": 1
|
"label": "Actual Start Date (via Time Sheet)",
|
||||||
},
|
"oldfieldname": "act_start_date",
|
||||||
{
|
"oldfieldtype": "Date",
|
||||||
"fieldname": "actual_time",
|
"read_only": 1
|
||||||
"fieldtype": "Float",
|
},
|
||||||
"label": "Actual Time (in hours)",
|
{
|
||||||
"read_only": 1
|
"fieldname": "actual_time",
|
||||||
},
|
"fieldtype": "Float",
|
||||||
{
|
"label": "Actual Time (in hours)",
|
||||||
"fieldname": "column_break_15",
|
"read_only": 1
|
||||||
"fieldtype": "Column Break"
|
},
|
||||||
},
|
{
|
||||||
{
|
"fieldname": "column_break_15",
|
||||||
"fieldname": "act_end_date",
|
"fieldtype": "Column Break"
|
||||||
"fieldtype": "Date",
|
},
|
||||||
"label": "Actual End Date (via Time Sheet)",
|
{
|
||||||
"oldfieldname": "act_end_date",
|
"fieldname": "act_end_date",
|
||||||
"oldfieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
"read_only": 1
|
"label": "Actual End Date (via Time Sheet)",
|
||||||
},
|
"oldfieldname": "act_end_date",
|
||||||
{
|
"oldfieldtype": "Date",
|
||||||
"collapsible": 1,
|
"read_only": 1
|
||||||
"fieldname": "sb_costing",
|
},
|
||||||
"fieldtype": "Section Break",
|
{
|
||||||
"label": "Costing"
|
"collapsible": 1,
|
||||||
},
|
"fieldname": "sb_costing",
|
||||||
{
|
"fieldtype": "Section Break",
|
||||||
"fieldname": "total_costing_amount",
|
"label": "Costing"
|
||||||
"fieldtype": "Currency",
|
},
|
||||||
"label": "Total Costing Amount (via Time Sheet)",
|
{
|
||||||
"oldfieldname": "actual_budget",
|
"fieldname": "total_costing_amount",
|
||||||
"oldfieldtype": "Currency",
|
"fieldtype": "Currency",
|
||||||
"options": "Company:company:default_currency",
|
"label": "Total Costing Amount (via Time Sheet)",
|
||||||
"read_only": 1
|
"oldfieldname": "actual_budget",
|
||||||
},
|
"oldfieldtype": "Currency",
|
||||||
{
|
"options": "Company:company:default_currency",
|
||||||
"fieldname": "total_expense_claim",
|
"read_only": 1
|
||||||
"fieldtype": "Currency",
|
},
|
||||||
"label": "Total Expense Claim (via Expense Claim)",
|
{
|
||||||
"options": "Company:company:default_currency",
|
"fieldname": "total_expense_claim",
|
||||||
"read_only": 1
|
"fieldtype": "Currency",
|
||||||
},
|
"label": "Total Expense Claim (via Expense Claim)",
|
||||||
{
|
"options": "Company:company:default_currency",
|
||||||
"fieldname": "column_break_20",
|
"read_only": 1
|
||||||
"fieldtype": "Column Break"
|
},
|
||||||
},
|
{
|
||||||
{
|
"fieldname": "column_break_20",
|
||||||
"fieldname": "total_billing_amount",
|
"fieldtype": "Column Break"
|
||||||
"fieldtype": "Currency",
|
},
|
||||||
"label": "Total Billing Amount (via Time Sheet)",
|
{
|
||||||
"read_only": 1
|
"fieldname": "total_billing_amount",
|
||||||
},
|
"fieldtype": "Currency",
|
||||||
{
|
"label": "Total Billing Amount (via Time Sheet)",
|
||||||
"collapsible": 1,
|
"read_only": 1
|
||||||
"fieldname": "sb_more_info",
|
},
|
||||||
"fieldtype": "Section Break",
|
{
|
||||||
"label": "More Info"
|
"collapsible": 1,
|
||||||
},
|
"fieldname": "sb_more_info",
|
||||||
{
|
"fieldtype": "Section Break",
|
||||||
"depends_on": "eval:doc.status == \"Closed\" || doc.status == \"Pending Review\"",
|
"label": "More Info"
|
||||||
"fieldname": "review_date",
|
},
|
||||||
"fieldtype": "Date",
|
{
|
||||||
"label": "Review Date",
|
"depends_on": "eval:doc.status == \"Closed\" || doc.status == \"Pending Review\"",
|
||||||
"oldfieldname": "review_date",
|
"fieldname": "review_date",
|
||||||
"oldfieldtype": "Date"
|
"fieldtype": "Date",
|
||||||
},
|
"label": "Review Date",
|
||||||
{
|
"oldfieldname": "review_date",
|
||||||
"depends_on": "eval:doc.status == \"Closed\"",
|
"oldfieldtype": "Date"
|
||||||
"fieldname": "closing_date",
|
},
|
||||||
"fieldtype": "Date",
|
{
|
||||||
"label": "Closing Date",
|
"depends_on": "eval:doc.status == \"Closed\"",
|
||||||
"oldfieldname": "closing_date",
|
"fieldname": "closing_date",
|
||||||
"oldfieldtype": "Date"
|
"fieldtype": "Date",
|
||||||
},
|
"label": "Closing Date",
|
||||||
{
|
"oldfieldname": "closing_date",
|
||||||
"fieldname": "column_break_22",
|
"oldfieldtype": "Date"
|
||||||
"fieldtype": "Column Break"
|
},
|
||||||
},
|
{
|
||||||
{
|
"fieldname": "column_break_22",
|
||||||
"fieldname": "department",
|
"fieldtype": "Column Break"
|
||||||
"fieldtype": "Link",
|
},
|
||||||
"label": "Department",
|
{
|
||||||
"options": "Department"
|
"fieldname": "department",
|
||||||
},
|
"fieldtype": "Link",
|
||||||
{
|
"label": "Department",
|
||||||
"fieldname": "company",
|
"options": "Department"
|
||||||
"fieldtype": "Link",
|
},
|
||||||
"label": "Company",
|
{
|
||||||
"options": "Company",
|
"fieldname": "company",
|
||||||
"remember_last_selected_value": 1
|
"fieldtype": "Link",
|
||||||
},
|
"label": "Company",
|
||||||
{
|
"options": "Company",
|
||||||
"fieldname": "lft",
|
"remember_last_selected_value": 1
|
||||||
"fieldtype": "Int",
|
},
|
||||||
"hidden": 1,
|
{
|
||||||
"label": "lft",
|
"fieldname": "lft",
|
||||||
"read_only": 1
|
"fieldtype": "Int",
|
||||||
},
|
"hidden": 1,
|
||||||
{
|
"label": "lft",
|
||||||
"fieldname": "rgt",
|
"read_only": 1
|
||||||
"fieldtype": "Int",
|
},
|
||||||
"hidden": 1,
|
{
|
||||||
"label": "rgt",
|
"fieldname": "rgt",
|
||||||
"read_only": 1
|
"fieldtype": "Int",
|
||||||
},
|
"hidden": 1,
|
||||||
{
|
"label": "rgt",
|
||||||
"fieldname": "old_parent",
|
"read_only": 1
|
||||||
"fieldtype": "Data",
|
},
|
||||||
"hidden": 1,
|
{
|
||||||
"ignore_user_permissions": 1,
|
"fieldname": "old_parent",
|
||||||
"label": "Old Parent",
|
"fieldtype": "Data",
|
||||||
"read_only": 1
|
"hidden": 1,
|
||||||
}
|
"ignore_user_permissions": 1,
|
||||||
],
|
"label": "Old Parent",
|
||||||
"icon": "fa fa-check",
|
"read_only": 1
|
||||||
"idx": 1,
|
},
|
||||||
"max_attachments": 5,
|
{
|
||||||
"modified": "2019-06-19 09:51:15.599416",
|
"fieldname": "completed_by",
|
||||||
"modified_by": "Administrator",
|
"fieldtype": "Link",
|
||||||
"module": "Projects",
|
"label": "Completed By",
|
||||||
"name": "Task",
|
"options": "User"
|
||||||
"owner": "Administrator",
|
}
|
||||||
"permissions": [
|
],
|
||||||
{
|
"icon": "fa fa-check",
|
||||||
"create": 1,
|
"idx": 1,
|
||||||
"delete": 1,
|
"max_attachments": 5,
|
||||||
"email": 1,
|
"modified": "2019-09-10 13:46:24.631754",
|
||||||
"print": 1,
|
"modified_by": "Administrator",
|
||||||
"read": 1,
|
"module": "Projects",
|
||||||
"report": 1,
|
"name": "Task",
|
||||||
"role": "Projects User",
|
"owner": "Administrator",
|
||||||
"share": 1,
|
"permissions": [
|
||||||
"write": 1
|
{
|
||||||
}
|
"create": 1,
|
||||||
],
|
"delete": 1,
|
||||||
"search_fields": "subject",
|
"email": 1,
|
||||||
"show_name_in_global_search": 1,
|
"print": 1,
|
||||||
"show_preview_popup": 1,
|
"read": 1,
|
||||||
"sort_order": "DESC",
|
"report": 1,
|
||||||
"timeline_field": "project",
|
"role": "Projects User",
|
||||||
"title_field": "subject",
|
"share": 1,
|
||||||
"track_seen": 1
|
"write": 1
|
||||||
}
|
}
|
||||||
|
],
|
||||||
|
"search_fields": "subject",
|
||||||
|
"show_name_in_global_search": 1,
|
||||||
|
"show_preview_popup": 1,
|
||||||
|
"sort_field": "modified",
|
||||||
|
"sort_order": "DESC",
|
||||||
|
"timeline_field": "project",
|
||||||
|
"title_field": "subject",
|
||||||
|
"track_seen": 1
|
||||||
|
}
|
@ -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 {
|
||||||
|
@ -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() {
|
||||||
|
@ -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"),
|
||||||
|
@ -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) %}
|
||||||
|
@ -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",
|
||||||
|
@ -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'),
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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');
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
@ -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",
|
||||||
|
@ -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",
|
||||||
|
@ -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",
|
||||||
|
@ -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",
|
||||||
|
@ -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",
|
||||||
|
@ -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",
|
||||||
|
@ -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 || "",
|
||||||
},
|
},
|
||||||
|
58
erpnext/setup/default_energy_point_rules.py
Normal file
58
erpnext/setup/default_energy_point_rules.py
Normal 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()]
|
||||||
|
|
@ -2,26 +2,26 @@ from __future__ import unicode_literals
|
|||||||
from frappe import _
|
from frappe import _
|
||||||
|
|
||||||
doctype_list = [
|
doctype_list = [
|
||||||
'Purchase Receipt',
|
'Purchase Receipt',
|
||||||
'Purchase Invoice',
|
'Purchase Invoice',
|
||||||
'Quotation',
|
'Quotation',
|
||||||
'Sales Order',
|
'Sales Order',
|
||||||
'Delivery Note',
|
'Delivery Note',
|
||||||
'Sales Invoice'
|
'Sales Invoice'
|
||||||
]
|
]
|
||||||
|
|
||||||
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 [{
|
||||||
'doctype': 'Success Action',
|
'doctype': 'Success Action',
|
||||||
'ref_doctype': doctype,
|
'ref_doctype': doctype,
|
||||||
'message': get_message(doctype),
|
'message': get_message(doctype),
|
||||||
'first_success_message': get_first_success_message(doctype),
|
'first_success_message': get_first_success_message(doctype),
|
||||||
'next_actions': 'new\nprint\nemail'
|
'next_actions': 'new\nprint\nemail'
|
||||||
} for doctype in doctype_list]
|
} for doctype in doctype_list]
|
||||||
|
|
||||||
|
@ -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", {
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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]
|
||||||
@ -30,7 +30,7 @@ def get_bin_qty(item, warehouse):
|
|||||||
where item_code = %s and warehouse = %s""", (item, warehouse), as_dict = 1)
|
where item_code = %s and warehouse = %s""", (item, warehouse), as_dict = 1)
|
||||||
return det and det[0] or frappe._dict()
|
return det and det[0] or frappe._dict()
|
||||||
|
|
||||||
def update_packing_list_item(doc, packing_item_code, qty, main_item_row, description):
|
def update_packing_list_item(doc, packing_item_code, qty, main_item_row, description):
|
||||||
item = get_packing_item_details(packing_item_code, doc.company)
|
item = get_packing_item_details(packing_item_code, doc.company)
|
||||||
|
|
||||||
# check if exists
|
# check if exists
|
||||||
@ -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:
|
||||||
@ -108,8 +108,8 @@ def get_items_from_product_bundle(args):
|
|||||||
"qty": flt(args["quantity"]) * flt(item.qty)
|
"qty": flt(args["quantity"]) * flt(item.qty)
|
||||||
})
|
})
|
||||||
items.append(get_item_details(args))
|
items.append(get_item_details(args))
|
||||||
|
|
||||||
return items
|
return items
|
||||||
|
|
||||||
def on_doctype_update():
|
def on_doctype_update():
|
||||||
frappe.db.add_index("Packed Item", ["item_code", "warehouse"])
|
frappe.db.add_index("Packed Item", ["item_code", "warehouse"])
|
||||||
|
@ -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):
|
||||||
|
@ -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:
|
||||||
|
@ -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:
|
||||||
|
@ -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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -131,19 +131,20 @@ 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 = {}
|
||||||
|
|
||||||
sle = get_stock_ledger_entries(filters)
|
if sle == None:
|
||||||
|
sle = get_stock_ledger_entries(filters)
|
||||||
|
|
||||||
for d in sle:
|
for d in sle:
|
||||||
key = (d.name, d.warehouse) if filters.get('show_warehouse_wise_stock') else d.name
|
key = (d.name, d.warehouse) if filters.get('show_warehouse_wise_stock') else d.name
|
||||||
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
|
||||||
|
@ -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'
|
||||||
|
},
|
||||||
]
|
]
|
||||||
}
|
};
|
||||||
|
@ -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("""
|
||||||
|
@ -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"
|
||||||
|
@ -281,4 +281,36 @@ 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
@ -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"
|
||||||
|
|
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
@ -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)
|
||||||
|
|
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
Loading…
Reference in New Issue
Block a user