mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-26 16:34:46 +00:00
Merge branch '4.0.0-wip' of github.com:webnotes/erpnext into 4.0.0-wip
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -5,7 +5,7 @@ from __future__ import unicode_literals
|
|||||||
import webnotes
|
import webnotes
|
||||||
|
|
||||||
from webnotes.utils import flt, fmt_money, cstr, cint
|
from webnotes.utils import flt, fmt_money, cstr, cint
|
||||||
from webnotes import msgprint, _
|
from webnotes import msgprint, throw, _
|
||||||
|
|
||||||
get_value = webnotes.conn.get_value
|
get_value = webnotes.conn.get_value
|
||||||
|
|
||||||
@@ -43,7 +43,7 @@ class DocType:
|
|||||||
msgprint(_("Please enter Master Name once the account is created."))
|
msgprint(_("Please enter Master Name once the account is created."))
|
||||||
elif not webnotes.conn.exists(self.doc.master_type or self.doc.account_type,
|
elif not webnotes.conn.exists(self.doc.master_type or self.doc.account_type,
|
||||||
self.doc.master_name):
|
self.doc.master_name):
|
||||||
webnotes.throw(_("Invalid Master Name"))
|
throw(_("Invalid Master Name"))
|
||||||
|
|
||||||
def validate_parent(self):
|
def validate_parent(self):
|
||||||
"""Fetch Parent Details and validation for account not to be created under ledger"""
|
"""Fetch Parent Details and validation for account not to be created under ledger"""
|
||||||
@@ -51,14 +51,19 @@ class DocType:
|
|||||||
par = webnotes.conn.sql("""select name, group_or_ledger, is_pl_account, debit_or_credit
|
par = webnotes.conn.sql("""select name, group_or_ledger, is_pl_account, debit_or_credit
|
||||||
from tabAccount where name =%s""", self.doc.parent_account)
|
from tabAccount where name =%s""", self.doc.parent_account)
|
||||||
if not par:
|
if not par:
|
||||||
msgprint("Parent account does not exists", raise_exception=1)
|
throw(_("Parent account does not exists"))
|
||||||
elif par[0][0] == self.doc.name:
|
elif par[0][0] == self.doc.name:
|
||||||
msgprint("You can not assign itself as parent account", raise_exception=1)
|
throw(_("You can not assign itself as parent account"))
|
||||||
elif par[0][1] != 'Group':
|
elif par[0][1] != 'Group':
|
||||||
msgprint("Parent account can not be a ledger", raise_exception=1)
|
throw(_("Parent account can not be a ledger"))
|
||||||
elif self.doc.debit_or_credit and par[0][3] != self.doc.debit_or_credit:
|
elif self.doc.debit_or_credit and par[0][3] != self.doc.debit_or_credit:
|
||||||
msgprint("You can not move a %s account under %s account" %
|
throw("{msg} {debit_or_credit} {under} {account} {acc}".format(**{
|
||||||
(self.doc.debit_or_credit, par[0][3]), raise_exception=1)
|
"msg": _("You cannot move a"),
|
||||||
|
"debit_or_credit": self.doc.debit_or_credit,
|
||||||
|
"under": _("account under"),
|
||||||
|
"account": par[0][3],
|
||||||
|
"acc": _("account")
|
||||||
|
}))
|
||||||
|
|
||||||
if not self.doc.is_pl_account:
|
if not self.doc.is_pl_account:
|
||||||
self.doc.is_pl_account = par[0][2]
|
self.doc.is_pl_account = par[0][2]
|
||||||
@@ -70,22 +75,25 @@ class DocType:
|
|||||||
if webnotes.conn.sql("""select count(*) from tabAccount where
|
if webnotes.conn.sql("""select count(*) from tabAccount where
|
||||||
company=%s and ifnull(parent_account,'')='' and docstatus != 2""",
|
company=%s and ifnull(parent_account,'')='' and docstatus != 2""",
|
||||||
self.doc.company)[0][0] > 4:
|
self.doc.company)[0][0] > 4:
|
||||||
webnotes.msgprint("One company cannot have more than 4 root Accounts",
|
throw(_("One company cannot have more than 4 root Accounts"))
|
||||||
raise_exception=1)
|
|
||||||
|
|
||||||
def validate_duplicate_account(self):
|
def validate_duplicate_account(self):
|
||||||
if self.doc.fields.get('__islocal') or not self.doc.name:
|
if self.doc.fields.get('__islocal') or not self.doc.name:
|
||||||
company_abbr = webnotes.conn.get_value("Company", self.doc.company, "abbr")
|
company_abbr = webnotes.conn.get_value("Company", self.doc.company, "abbr")
|
||||||
if webnotes.conn.sql("""select name from tabAccount where name=%s""",
|
if webnotes.conn.sql("""select name from tabAccount where name=%s""",
|
||||||
(self.doc.account_name + " - " + company_abbr)):
|
(self.doc.account_name + " - " + company_abbr)):
|
||||||
msgprint("Account Name: %s already exists, please rename"
|
throw("{name}: {acc_name} {exist}, {rename}".format(**{
|
||||||
% self.doc.account_name, raise_exception=1)
|
"name": _("Account Name"),
|
||||||
|
"acc_name": self.doc.account_name,
|
||||||
|
"exist": _("already exists"),
|
||||||
|
"rename": _("please rename")
|
||||||
|
}))
|
||||||
|
|
||||||
def validate_root_details(self):
|
def validate_root_details(self):
|
||||||
#does not exists parent
|
#does not exists parent
|
||||||
if webnotes.conn.exists("Account", self.doc.name):
|
if webnotes.conn.exists("Account", self.doc.name):
|
||||||
if not webnotes.conn.get_value("Account", self.doc.name, "parent_account"):
|
if not webnotes.conn.get_value("Account", self.doc.name, "parent_account"):
|
||||||
webnotes.msgprint("Root cannot be edited.", raise_exception=1)
|
throw(_("Root cannot be edited."))
|
||||||
|
|
||||||
def validate_frozen_accounts_modifier(self):
|
def validate_frozen_accounts_modifier(self):
|
||||||
old_value = webnotes.conn.get_value("Account", self.doc.name, "freeze_account")
|
old_value = webnotes.conn.get_value("Account", self.doc.name, "freeze_account")
|
||||||
@@ -94,15 +102,18 @@ class DocType:
|
|||||||
'frozen_accounts_modifier')
|
'frozen_accounts_modifier')
|
||||||
if not frozen_accounts_modifier or \
|
if not frozen_accounts_modifier or \
|
||||||
frozen_accounts_modifier not in webnotes.user.get_roles():
|
frozen_accounts_modifier not in webnotes.user.get_roles():
|
||||||
webnotes.throw(_("You are not authorized to set Frozen value"))
|
throw(_("You are not authorized to set Frozen value"))
|
||||||
|
|
||||||
def convert_group_to_ledger(self):
|
def convert_group_to_ledger(self):
|
||||||
if self.check_if_child_exists():
|
if self.check_if_child_exists():
|
||||||
msgprint("Account: %s has existing child. You can not convert this account to ledger" %
|
throw("{acc}: {account_name} {child}. {msg}".format(**{
|
||||||
(self.doc.name), raise_exception=1)
|
"acc": _("Account"),
|
||||||
|
"account_name": self.doc.name,
|
||||||
|
"child": _("has existing child"),
|
||||||
|
"msg": _("You can not convert this account to ledger")
|
||||||
|
}))
|
||||||
elif self.check_gle_exists():
|
elif self.check_gle_exists():
|
||||||
msgprint("Account with existing transaction can not be converted to ledger.",
|
throw(_("Account with existing transaction can not be converted to ledger."))
|
||||||
raise_exception=1)
|
|
||||||
else:
|
else:
|
||||||
self.doc.group_or_ledger = 'Ledger'
|
self.doc.group_or_ledger = 'Ledger'
|
||||||
self.doc.save()
|
self.doc.save()
|
||||||
@@ -110,11 +121,9 @@ class DocType:
|
|||||||
|
|
||||||
def convert_ledger_to_group(self):
|
def convert_ledger_to_group(self):
|
||||||
if self.check_gle_exists():
|
if self.check_gle_exists():
|
||||||
msgprint("Account with existing transaction can not be converted to group.",
|
throw(_("Account with existing transaction can not be converted to group."))
|
||||||
raise_exception=1)
|
|
||||||
elif self.doc.master_type or self.doc.account_type:
|
elif self.doc.master_type or self.doc.account_type:
|
||||||
msgprint("Cannot covert to Group because Master Type or Account Type is selected.",
|
throw(_("Cannot covert to Group because Master Type or Account Type is selected."))
|
||||||
raise_exception=1)
|
|
||||||
else:
|
else:
|
||||||
self.doc.group_or_ledger = 'Group'
|
self.doc.group_or_ledger = 'Group'
|
||||||
self.doc.save()
|
self.doc.save()
|
||||||
@@ -130,9 +139,9 @@ class DocType:
|
|||||||
|
|
||||||
def validate_mandatory(self):
|
def validate_mandatory(self):
|
||||||
if not self.doc.debit_or_credit:
|
if not self.doc.debit_or_credit:
|
||||||
msgprint("Debit or Credit field is mandatory", raise_exception=1)
|
throw(_("Debit or Credit field is mandatory"))
|
||||||
if not self.doc.is_pl_account:
|
if not self.doc.is_pl_account:
|
||||||
msgprint("Is PL Account field is mandatory", raise_exception=1)
|
throw(_("Is PL Account field is mandatory"))
|
||||||
|
|
||||||
def validate_warehouse_account(self):
|
def validate_warehouse_account(self):
|
||||||
if not cint(webnotes.defaults.get_global_default("auto_accounting_for_stock")):
|
if not cint(webnotes.defaults.get_global_default("auto_accounting_for_stock")):
|
||||||
@@ -146,11 +155,11 @@ class DocType:
|
|||||||
if self.doc.master_name:
|
if self.doc.master_name:
|
||||||
self.validate_warehouse(self.doc.master_name)
|
self.validate_warehouse(self.doc.master_name)
|
||||||
else:
|
else:
|
||||||
webnotes.throw(_("Master Name is mandatory if account type is Warehouse"))
|
throw(_("Master Name is mandatory if account type is Warehouse"))
|
||||||
|
|
||||||
def validate_warehouse(self, warehouse):
|
def validate_warehouse(self, warehouse):
|
||||||
if webnotes.conn.get_value("Stock Ledger Entry", {"warehouse": warehouse}):
|
if webnotes.conn.get_value("Stock Ledger Entry", {"warehouse": warehouse}):
|
||||||
webnotes.throw(_("Stock transactions exist against warehouse ") + warehouse +
|
throw(_("Stock transactions exist against warehouse ") + warehouse +
|
||||||
_(" .You can not assign / modify / remove Master Name"))
|
_(" .You can not assign / modify / remove Master Name"))
|
||||||
|
|
||||||
def update_nsm_model(self):
|
def update_nsm_model(self):
|
||||||
@@ -183,22 +192,21 @@ class DocType:
|
|||||||
# If outstanding greater than credit limit and not authorized person raise exception
|
# If outstanding greater than credit limit and not authorized person raise exception
|
||||||
if credit_limit > 0 and flt(total_outstanding) > credit_limit \
|
if credit_limit > 0 and flt(total_outstanding) > credit_limit \
|
||||||
and not self.get_authorized_user():
|
and not self.get_authorized_user():
|
||||||
msgprint("""Total Outstanding amount (%s) for <b>%s</b> can not be \
|
throw("""Total Outstanding amount (%s) for <b>%s</b> can not be \
|
||||||
greater than credit limit (%s). To change your credit limit settings, \
|
greater than credit limit (%s). To change your credit limit settings, \
|
||||||
please update in the <b>%s</b> master""" % (fmt_money(total_outstanding),
|
please update in the <b>%s</b> master""" % (fmt_money(total_outstanding),
|
||||||
self.doc.name, fmt_money(credit_limit), credit_limit_from), raise_exception=1)
|
self.doc.name, fmt_money(credit_limit), credit_limit_from))
|
||||||
|
|
||||||
def validate_trash(self):
|
def validate_trash(self):
|
||||||
"""checks gl entries and if child exists"""
|
"""checks gl entries and if child exists"""
|
||||||
if not self.doc.parent_account:
|
if not self.doc.parent_account:
|
||||||
msgprint("Root account can not be deleted", raise_exception=1)
|
throw(_("Root account can not be deleted"))
|
||||||
|
|
||||||
if self.check_gle_exists():
|
if self.check_gle_exists():
|
||||||
msgprint("""Account with existing transaction (Sales Invoice / Purchase Invoice / \
|
throw("""Account with existing transaction (Sales Invoice / Purchase Invoice / \
|
||||||
Journal Voucher) can not be deleted""", raise_exception=1)
|
Journal Voucher) can not be deleted""")
|
||||||
if self.check_if_child_exists():
|
if self.check_if_child_exists():
|
||||||
msgprint("Child account exists for this account. You can not delete this account.",
|
throw(_("Child account exists for this account. You can not delete this account."))
|
||||||
raise_exception=1)
|
|
||||||
|
|
||||||
def on_trash(self):
|
def on_trash(self):
|
||||||
self.validate_trash()
|
self.validate_trash()
|
||||||
@@ -212,13 +220,13 @@ class DocType:
|
|||||||
# Validate properties before merging
|
# Validate properties before merging
|
||||||
if merge:
|
if merge:
|
||||||
if not webnotes.conn.exists("Account", new):
|
if not webnotes.conn.exists("Account", new):
|
||||||
webnotes.throw(_("Account ") + new +_(" does not exists"))
|
throw(_("Account ") + new +_(" does not exists"))
|
||||||
|
|
||||||
val = list(webnotes.conn.get_value("Account", new_account,
|
val = list(webnotes.conn.get_value("Account", new_account,
|
||||||
["group_or_ledger", "debit_or_credit", "is_pl_account"]))
|
["group_or_ledger", "debit_or_credit", "is_pl_account"]))
|
||||||
|
|
||||||
if val != [self.doc.group_or_ledger, self.doc.debit_or_credit, self.doc.is_pl_account]:
|
if val != [self.doc.group_or_ledger, self.doc.debit_or_credit, self.doc.is_pl_account]:
|
||||||
webnotes.throw(_("""Merging is only possible if following \
|
throw(_("""Merging is only possible if following \
|
||||||
properties are same in both records.
|
properties are same in both records.
|
||||||
Group or Ledger, Debit or Credit, Is PL Account"""))
|
Group or Ledger, Debit or Credit, Is PL Account"""))
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||||
// License: GNU General Public License v3. See license.txt
|
// License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
|
||||||
cur_frm.add_fetch("bank_account", "company", "company");
|
cur_frm.add_fetch("bank_account", "company", "company");
|
||||||
cur_frm.cscript.onload = function(doc, cdt, cdn){
|
cur_frm.cscript.onload = function(doc, cdt, cdn){
|
||||||
cur_frm.set_intro('<i class="icon-question" /> ' +
|
cur_frm.set_intro('<i class="icon-question" /> ' +
|
||||||
|
|||||||
@@ -54,9 +54,9 @@ cur_frm.cscript.refresh = function(doc, cdt, cdn) {
|
|||||||
function() { wn.set_route("Accounts Browser", "Cost Center"); }, 'icon-sitemap')
|
function() { wn.set_route("Accounts Browser", "Cost Center"); }, 'icon-sitemap')
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.parent_cost_center = function(doc,cdt,cdn){
|
cur_frm.cscript.parent_cost_center = function(doc, cdt, cdn) {
|
||||||
if(!doc.company){
|
if(!doc.company){
|
||||||
alert(wn._('Please enter company name first'));
|
msgprint(wn._('Please enter company name first'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-05-24 12:15:51",
|
"creation": "2013-05-24 12:15:51",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2014-01-15 16:23:58",
|
"modified": "2014-01-29 13:08:24",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -22,6 +22,8 @@
|
|||||||
"permlevel": 0
|
"permlevel": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"cancel": 0,
|
||||||
|
"delete": 0,
|
||||||
"doctype": "DocPerm",
|
"doctype": "DocPerm",
|
||||||
"email": 1,
|
"email": 1,
|
||||||
"name": "__common__",
|
"name": "__common__",
|
||||||
@@ -191,9 +193,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "charge",
|
"fieldname": "taxes_and_charges",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Charge",
|
"label": "Taxes and Charges",
|
||||||
"oldfieldname": "charge",
|
"oldfieldname": "charge",
|
||||||
"oldfieldtype": "Link",
|
"oldfieldtype": "Link",
|
||||||
"options": "Sales Taxes and Charges Master",
|
"options": "Sales Taxes and Charges Master",
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
cur_frm.cscript.tname = "Purchase Invoice Item";
|
cur_frm.cscript.tname = "Purchase Invoice Item";
|
||||||
cur_frm.cscript.fname = "entries";
|
cur_frm.cscript.fname = "entries";
|
||||||
cur_frm.cscript.other_fname = "purchase_tax_details";
|
cur_frm.cscript.other_fname = "other_charges";
|
||||||
|
|
||||||
wn.provide("erpnext.accounts");
|
wn.provide("erpnext.accounts");
|
||||||
{% include 'buying/doctype/purchase_common/purchase_common.js' %};
|
{% include 'buying/doctype/purchase_common/purchase_common.js' %};
|
||||||
|
|||||||
@@ -32,6 +32,9 @@ class DocType(BuyingController):
|
|||||||
}]
|
}]
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
|
if not self.doc.is_opening:
|
||||||
|
self.doc.is_opening = 'No'
|
||||||
|
|
||||||
super(DocType, self).validate()
|
super(DocType, self).validate()
|
||||||
|
|
||||||
self.po_required()
|
self.po_required()
|
||||||
@@ -45,15 +48,8 @@ class DocType(BuyingController):
|
|||||||
self.check_for_stopped_status()
|
self.check_for_stopped_status()
|
||||||
self.validate_with_previous_doc()
|
self.validate_with_previous_doc()
|
||||||
self.validate_uom_is_integer("uom", "qty")
|
self.validate_uom_is_integer("uom", "qty")
|
||||||
|
|
||||||
if not self.doc.is_opening:
|
|
||||||
self.doc.is_opening = 'No'
|
|
||||||
|
|
||||||
self.set_aging_date()
|
self.set_aging_date()
|
||||||
|
|
||||||
#set against account for credit to
|
|
||||||
self.set_against_expense_account()
|
self.set_against_expense_account()
|
||||||
|
|
||||||
self.validate_write_off_account()
|
self.validate_write_off_account()
|
||||||
self.update_raw_material_cost()
|
self.update_raw_material_cost()
|
||||||
self.update_valuation_rate("entries")
|
self.update_valuation_rate("entries")
|
||||||
@@ -215,7 +211,8 @@ class DocType(BuyingController):
|
|||||||
against_accounts = []
|
against_accounts = []
|
||||||
stock_items = self.get_stock_items()
|
stock_items = self.get_stock_items()
|
||||||
for item in self.doclist.get({"parentfield": "entries"}):
|
for item in self.doclist.get({"parentfield": "entries"}):
|
||||||
if auto_accounting_for_stock and item.item_code in stock_items:
|
if auto_accounting_for_stock and item.item_code in stock_items \
|
||||||
|
and self.doc.is_opening == 'No':
|
||||||
# in case of auto inventory accounting, against expense account is always
|
# in case of auto inventory accounting, against expense account is always
|
||||||
# Stock Received But Not Billed for a stock item
|
# Stock Received But Not Billed for a stock item
|
||||||
item.expense_head = stock_not_billed_account
|
item.expense_head = stock_not_billed_account
|
||||||
@@ -325,7 +322,7 @@ class DocType(BuyingController):
|
|||||||
|
|
||||||
# tax table gl entries
|
# tax table gl entries
|
||||||
valuation_tax = {}
|
valuation_tax = {}
|
||||||
for tax in self.doclist.get({"parentfield": "purchase_tax_details"}):
|
for tax in self.doclist.get({"parentfield": "other_charges"}):
|
||||||
if tax.category in ("Total", "Valuation and Total") and flt(tax.tax_amount):
|
if tax.category in ("Total", "Valuation and Total") and flt(tax.tax_amount):
|
||||||
gl_entries.append(
|
gl_entries.append(
|
||||||
self.get_gl_dict({
|
self.get_gl_dict({
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-05-21 16:16:39",
|
"creation": "2013-05-21 16:16:39",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2014-01-20 17:49:04",
|
"modified": "2014-01-29 15:26:54",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -324,16 +324,16 @@
|
|||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "taxes",
|
"fieldname": "taxes",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"label": "Taxes",
|
"label": "Taxes and Charges",
|
||||||
"oldfieldtype": "Section Break",
|
"oldfieldtype": "Section Break",
|
||||||
"options": "icon-money",
|
"options": "icon-money",
|
||||||
"read_only": 0
|
"read_only": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "purchase_other_charges",
|
"fieldname": "taxes_and_charges",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Tax Master",
|
"label": "Taxes and Charges",
|
||||||
"oldfieldname": "purchase_other_charges",
|
"oldfieldname": "purchase_other_charges",
|
||||||
"oldfieldtype": "Link",
|
"oldfieldtype": "Link",
|
||||||
"options": "Purchase Taxes and Charges Master",
|
"options": "Purchase Taxes and Charges Master",
|
||||||
@@ -342,7 +342,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "purchase_tax_details",
|
"fieldname": "other_charges",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"label": "Purchase Taxes and Charges",
|
"label": "Purchase Taxes and Charges",
|
||||||
"oldfieldname": "purchase_tax_details",
|
"oldfieldname": "purchase_tax_details",
|
||||||
@@ -352,9 +352,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "tax_calculation",
|
"fieldname": "other_charges_calculation",
|
||||||
"fieldtype": "HTML",
|
"fieldtype": "HTML",
|
||||||
"label": "Tax Calculation",
|
"label": "Taxes and Charges Calculation",
|
||||||
"oldfieldtype": "HTML",
|
"oldfieldtype": "HTML",
|
||||||
"print_hide": 1,
|
"print_hide": 1,
|
||||||
"read_only": 0
|
"read_only": 0
|
||||||
|
|||||||
@@ -130,7 +130,7 @@ class TestPurchaseInvoice(unittest.TestCase):
|
|||||||
["_Test Account Discount - _TC", 168.03, 1512.30],
|
["_Test Account Discount - _TC", 168.03, 1512.30],
|
||||||
]
|
]
|
||||||
|
|
||||||
for i, tax in enumerate(wrapper.doclist.get({"parentfield": "purchase_tax_details"})):
|
for i, tax in enumerate(wrapper.doclist.get({"parentfield": "other_charges"})):
|
||||||
self.assertEqual(tax.account_head, expected_values[i][0])
|
self.assertEqual(tax.account_head, expected_values[i][0])
|
||||||
self.assertEqual(tax.tax_amount, expected_values[i][1])
|
self.assertEqual(tax.tax_amount, expected_values[i][1])
|
||||||
self.assertEqual(tax.total, expected_values[i][2])
|
self.assertEqual(tax.total, expected_values[i][2])
|
||||||
@@ -165,7 +165,7 @@ class TestPurchaseInvoice(unittest.TestCase):
|
|||||||
["_Test Account Discount - _TC", 168.03, 1512.30],
|
["_Test Account Discount - _TC", 168.03, 1512.30],
|
||||||
]
|
]
|
||||||
|
|
||||||
for i, tax in enumerate(wrapper.doclist.get({"parentfield": "purchase_tax_details"})):
|
for i, tax in enumerate(wrapper.doclist.get({"parentfield": "other_charges"})):
|
||||||
self.assertEqual(tax.account_head, expected_values[i][0])
|
self.assertEqual(tax.account_head, expected_values[i][0])
|
||||||
self.assertEqual(tax.tax_amount, expected_values[i][1])
|
self.assertEqual(tax.tax_amount, expected_values[i][1])
|
||||||
self.assertEqual(tax.total, expected_values[i][2])
|
self.assertEqual(tax.total, expected_values[i][2])
|
||||||
@@ -258,7 +258,7 @@ test_records = [
|
|||||||
# taxes
|
# taxes
|
||||||
{
|
{
|
||||||
"doctype": "Purchase Taxes and Charges",
|
"doctype": "Purchase Taxes and Charges",
|
||||||
"parentfield": "purchase_tax_details",
|
"parentfield": "other_charges",
|
||||||
"charge_type": "Actual",
|
"charge_type": "Actual",
|
||||||
"account_head": "_Test Account Shipping Charges - _TC",
|
"account_head": "_Test Account Shipping Charges - _TC",
|
||||||
"cost_center": "_Test Cost Center - _TC",
|
"cost_center": "_Test Cost Center - _TC",
|
||||||
@@ -269,7 +269,7 @@ test_records = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "Purchase Taxes and Charges",
|
"doctype": "Purchase Taxes and Charges",
|
||||||
"parentfield": "purchase_tax_details",
|
"parentfield": "other_charges",
|
||||||
"charge_type": "On Net Total",
|
"charge_type": "On Net Total",
|
||||||
"account_head": "_Test Account Customs Duty - _TC",
|
"account_head": "_Test Account Customs Duty - _TC",
|
||||||
"cost_center": "_Test Cost Center - _TC",
|
"cost_center": "_Test Cost Center - _TC",
|
||||||
@@ -280,7 +280,7 @@ test_records = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "Purchase Taxes and Charges",
|
"doctype": "Purchase Taxes and Charges",
|
||||||
"parentfield": "purchase_tax_details",
|
"parentfield": "other_charges",
|
||||||
"charge_type": "On Net Total",
|
"charge_type": "On Net Total",
|
||||||
"account_head": "_Test Account Excise Duty - _TC",
|
"account_head": "_Test Account Excise Duty - _TC",
|
||||||
"cost_center": "_Test Cost Center - _TC",
|
"cost_center": "_Test Cost Center - _TC",
|
||||||
@@ -291,7 +291,7 @@ test_records = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "Purchase Taxes and Charges",
|
"doctype": "Purchase Taxes and Charges",
|
||||||
"parentfield": "purchase_tax_details",
|
"parentfield": "other_charges",
|
||||||
"charge_type": "On Previous Row Amount",
|
"charge_type": "On Previous Row Amount",
|
||||||
"account_head": "_Test Account Education Cess - _TC",
|
"account_head": "_Test Account Education Cess - _TC",
|
||||||
"cost_center": "_Test Cost Center - _TC",
|
"cost_center": "_Test Cost Center - _TC",
|
||||||
@@ -303,7 +303,7 @@ test_records = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "Purchase Taxes and Charges",
|
"doctype": "Purchase Taxes and Charges",
|
||||||
"parentfield": "purchase_tax_details",
|
"parentfield": "other_charges",
|
||||||
"charge_type": "On Previous Row Amount",
|
"charge_type": "On Previous Row Amount",
|
||||||
"account_head": "_Test Account S&H Education Cess - _TC",
|
"account_head": "_Test Account S&H Education Cess - _TC",
|
||||||
"cost_center": "_Test Cost Center - _TC",
|
"cost_center": "_Test Cost Center - _TC",
|
||||||
@@ -315,7 +315,7 @@ test_records = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "Purchase Taxes and Charges",
|
"doctype": "Purchase Taxes and Charges",
|
||||||
"parentfield": "purchase_tax_details",
|
"parentfield": "other_charges",
|
||||||
"charge_type": "On Previous Row Total",
|
"charge_type": "On Previous Row Total",
|
||||||
"account_head": "_Test Account CST - _TC",
|
"account_head": "_Test Account CST - _TC",
|
||||||
"cost_center": "_Test Cost Center - _TC",
|
"cost_center": "_Test Cost Center - _TC",
|
||||||
@@ -327,7 +327,7 @@ test_records = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "Purchase Taxes and Charges",
|
"doctype": "Purchase Taxes and Charges",
|
||||||
"parentfield": "purchase_tax_details",
|
"parentfield": "other_charges",
|
||||||
"charge_type": "On Net Total",
|
"charge_type": "On Net Total",
|
||||||
"account_head": "_Test Account VAT - _TC",
|
"account_head": "_Test Account VAT - _TC",
|
||||||
"cost_center": "_Test Cost Center - _TC",
|
"cost_center": "_Test Cost Center - _TC",
|
||||||
@@ -338,7 +338,7 @@ test_records = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "Purchase Taxes and Charges",
|
"doctype": "Purchase Taxes and Charges",
|
||||||
"parentfield": "purchase_tax_details",
|
"parentfield": "other_charges",
|
||||||
"charge_type": "On Previous Row Total",
|
"charge_type": "On Previous Row Total",
|
||||||
"account_head": "_Test Account Discount - _TC",
|
"account_head": "_Test Account Discount - _TC",
|
||||||
"cost_center": "_Test Cost Center - _TC",
|
"cost_center": "_Test Cost Center - _TC",
|
||||||
@@ -380,7 +380,7 @@ test_records = [
|
|||||||
# taxes
|
# taxes
|
||||||
{
|
{
|
||||||
"doctype": "Purchase Taxes and Charges",
|
"doctype": "Purchase Taxes and Charges",
|
||||||
"parentfield": "purchase_tax_details",
|
"parentfield": "other_charges",
|
||||||
"charge_type": "Actual",
|
"charge_type": "Actual",
|
||||||
"account_head": "_Test Account Shipping Charges - _TC",
|
"account_head": "_Test Account Shipping Charges - _TC",
|
||||||
"cost_center": "_Test Cost Center - _TC",
|
"cost_center": "_Test Cost Center - _TC",
|
||||||
@@ -391,7 +391,7 @@ test_records = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "Purchase Taxes and Charges",
|
"doctype": "Purchase Taxes and Charges",
|
||||||
"parentfield": "purchase_tax_details",
|
"parentfield": "other_charges",
|
||||||
"charge_type": "Actual",
|
"charge_type": "Actual",
|
||||||
"account_head": "_Test Account VAT - _TC",
|
"account_head": "_Test Account VAT - _TC",
|
||||||
"cost_center": "_Test Cost Center - _TC",
|
"cost_center": "_Test Cost Center - _TC",
|
||||||
@@ -402,7 +402,7 @@ test_records = [
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "Purchase Taxes and Charges",
|
"doctype": "Purchase Taxes and Charges",
|
||||||
"parentfield": "purchase_tax_details",
|
"parentfield": "other_charges",
|
||||||
"charge_type": "Actual",
|
"charge_type": "Actual",
|
||||||
"account_head": "_Test Account Customs Duty - _TC",
|
"account_head": "_Test Account Customs Duty - _TC",
|
||||||
"cost_center": "_Test Cost Center - _TC",
|
"cost_center": "_Test Cost Center - _TC",
|
||||||
|
|||||||
@@ -1,17 +1,10 @@
|
|||||||
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||||
// License: GNU General Public License v3. See license.txt
|
// License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
//
|
|
||||||
|
|
||||||
//--------- ONLOAD -------------
|
|
||||||
{% include "public/js/controllers/accounts.js" %}
|
{% include "public/js/controllers/accounts.js" %}
|
||||||
|
|
||||||
cur_frm.cscript.onload = function(doc, cdt, cdn) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
|
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
|
||||||
cur_frm.set_footnote(wn.markdown(cur_frm.meta.description));
|
cur_frm.set_footnote(wn.markdown(cur_frm.meta.description));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For customizing print
|
// For customizing print
|
||||||
@@ -27,120 +20,123 @@ cur_frm.pformat.in_words_import = function(doc) {
|
|||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.pformat.purchase_tax_details= function(doc){
|
cur_frm.pformat.other_charges= function(doc) {
|
||||||
|
|
||||||
//function to make row of table
|
//function to make row of table
|
||||||
var make_row = function(title,val,bold){
|
var make_row = function(title, val, bold) {
|
||||||
var bstart = '<b>'; var bend = '</b>';
|
var bstart = '<b>'; var bend = '</b>';
|
||||||
return '<tr><td style="width:50%;">'+(bold?bstart:'')+title+(bold?bend:'')+'</td>'
|
return '<tr><td style="width:50%;">' + (bold?bstart:'') + title + (bold?bend:'') + '</td>'
|
||||||
+'<td style="width:25%;text-align:right;"></td>'
|
+ '<td style="width:25%;text-align:right;"></td>'
|
||||||
+'<td style="width:25%;text-align:right;">'+format_currency(val, doc.currency)+'</td>'
|
+ '<td style="width:25%;text-align:right;">' + format_currency(val, doc.currency) + '</td>'
|
||||||
+'</tr>'
|
+ '</tr>';
|
||||||
}
|
|
||||||
|
|
||||||
function convert_rate(val){
|
|
||||||
var new_val = flt(val)/flt(doc.conversion_rate);
|
|
||||||
return new_val;
|
|
||||||
}
|
|
||||||
|
|
||||||
function print_hide(fieldname) {
|
|
||||||
var doc_field = wn.meta.get_docfield(doc.doctype, fieldname, doc.name);
|
|
||||||
return doc_field.print_hide;
|
|
||||||
}
|
|
||||||
|
|
||||||
var cl = getchildren('Purchase Taxes and Charges',doc.name,'purchase_tax_details');
|
|
||||||
|
|
||||||
// outer table
|
|
||||||
var out='<div><table class="noborder" style="width:100%">\
|
|
||||||
<tr><td style="width: 60%"></td><td>';
|
|
||||||
|
|
||||||
// main table
|
|
||||||
out +='<table class="noborder" style="width:100%">';
|
|
||||||
if(!print_hide('net_total_import')) {
|
|
||||||
out += make_row('Net Total', doc.net_total_import, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// add rows
|
|
||||||
if(cl.length){
|
|
||||||
for(var i=0;i<cl.length;i++){
|
|
||||||
out += make_row(cl[i].description,convert_rate(cl[i].tax_amount),0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// grand total
|
|
||||||
if(!print_hide('grand_total_import')) {
|
|
||||||
out += make_row('Grand Total', doc.grand_total_import, 1);
|
|
||||||
}
|
}
|
||||||
if(doc.in_words_import && !print_hide('in_words_import')){
|
|
||||||
out +='</table></td></tr>';
|
function convert_rate(val) {
|
||||||
out += '<tr><td colspan = "2">';
|
var new_val = flt(val)/flt(doc.conversion_rate);
|
||||||
out += '<table><tr><td style="width:25%;"><b>In Words</b></td>';
|
return new_val;
|
||||||
out+= '<td style="width:50%;">'+doc.in_words_import+'</td></tr>';
|
}
|
||||||
}
|
|
||||||
out +='</table></td></tr></table></div>';
|
function print_hide(fieldname) {
|
||||||
return out;
|
var doc_field = wn.meta.get_docfield(doc.doctype, fieldname, doc.name);
|
||||||
|
return doc_field.print_hide;
|
||||||
|
}
|
||||||
|
|
||||||
|
var cl = getchildren('Purchase Taxes and Charges', doc.name, 'other_charges');
|
||||||
|
|
||||||
|
// outer table
|
||||||
|
var out='<div><table class="noborder" style="width:100%">\
|
||||||
|
<tr><td style="width: 60%"></td><td>';
|
||||||
|
|
||||||
|
// main table
|
||||||
|
out +='<table class="noborder" style="width:100%">';
|
||||||
|
if(!print_hide('net_total_import'))
|
||||||
|
out += make_row('Net Total', doc.net_total_import, 1);
|
||||||
|
|
||||||
|
// add rows
|
||||||
|
if(cl.length){
|
||||||
|
for(var i=0; i<cl.length; i++) {
|
||||||
|
out += make_row(cl[i].description, convert_rate(cl[i].tax_amount), 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// grand total
|
||||||
|
if(!print_hide('grand_total_import'))
|
||||||
|
out += make_row('Grand Total', doc.grand_total_import, 1);
|
||||||
|
|
||||||
|
if(doc.in_words_import && !print_hide('in_words_import')) {
|
||||||
|
out += '</table></td></tr>';
|
||||||
|
out += '<tr><td colspan = "2">';
|
||||||
|
out += '<table><tr><td style="width:25%;"><b>In Words</b></td>';
|
||||||
|
out += '<td style="width:50%;">' + doc.in_words_import + '</td></tr>';
|
||||||
|
}
|
||||||
|
|
||||||
|
out +='</table></td></tr></table></div>';
|
||||||
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.add_deduct_tax = function(doc, cdt, cdn) {
|
cur_frm.cscript.add_deduct_tax = function(doc, cdt, cdn) {
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
if(!d.category && d.add_deduct_tax){
|
|
||||||
alert(wn._("Please select Category first"));
|
|
||||||
d.add_deduct_tax = '';
|
|
||||||
}
|
|
||||||
else if(d.category != 'Total' && d.add_deduct_tax == 'Deduct') {
|
|
||||||
console.log([d.category, d.add_deduct_tax]);
|
|
||||||
msgprint(wn._("You cannot deduct when category is for 'Valuation' or 'Valuation and Total'"));
|
|
||||||
d.add_deduct_tax = '';
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if(!d.category && d.add_deduct_tax) {
|
||||||
|
msgprint(wn._("Please select Category first"));
|
||||||
|
d.add_deduct_tax = '';
|
||||||
|
}
|
||||||
|
else if(d.category != 'Total' && d.add_deduct_tax == 'Deduct') {
|
||||||
|
msgprint(wn._("You cannot deduct when category is for 'Valuation' or 'Valuation and Total'"));
|
||||||
|
d.add_deduct_tax = '';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.charge_type = function(doc, cdt, cdn) {
|
cur_frm.cscript.charge_type = function(doc, cdt, cdn) {
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
if(!d.category && d.charge_type){
|
|
||||||
alert(wn._("Please select Category first"));
|
|
||||||
d.charge_type = '';
|
|
||||||
}
|
|
||||||
else if(d.idx == 1 && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')){
|
|
||||||
alert(wn._("You cannot select Charge Type as 'On Previous Row Amount' or 'On Previous Row Total' for first row"));
|
|
||||||
d.charge_type = '';
|
|
||||||
}
|
|
||||||
else if((d.category == 'Valuation' || d.category == 'Valuation and Total') && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')){
|
|
||||||
alert(wn._("You cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for valuation. You can select only 'Total' option for previous row amount or previous row total"))
|
|
||||||
d.charge_type = '';
|
|
||||||
}
|
|
||||||
validated = false;
|
|
||||||
refresh_field('charge_type',d.name,'purchase_tax_details');
|
|
||||||
|
|
||||||
cur_frm.cscript.row_id(doc, cdt, cdn);
|
if(!d.category && d.charge_type) {
|
||||||
cur_frm.cscript.rate(doc, cdt, cdn);
|
msgprint(wn._("Please select Category first"));
|
||||||
cur_frm.cscript.tax_amount(doc, cdt, cdn);
|
d.charge_type = '';
|
||||||
|
}
|
||||||
|
else if(d.idx == 1 && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')) {
|
||||||
|
msgprint(wn._("You cannot select Charge Type as 'On Previous Row Amount' or 'On Previous Row Total' for first row"));
|
||||||
|
d.charge_type = '';
|
||||||
|
}
|
||||||
|
else if((d.category == 'Valuation' || d.category == 'Valuation and Total') && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')) {
|
||||||
|
msgprint(wn._("You cannot select charge type as 'On Previous Row Amount' or 'On Previous Row Total' for valuation. You can select only 'Total' option for previous row amount or previous row total"));
|
||||||
|
d.charge_type = '';
|
||||||
|
}
|
||||||
|
|
||||||
|
validated = false;
|
||||||
|
refresh_field('charge_type', d.name, 'other_charges');
|
||||||
|
|
||||||
|
cur_frm.cscript.row_id(doc, cdt, cdn);
|
||||||
|
cur_frm.cscript.rate(doc, cdt, cdn);
|
||||||
|
cur_frm.cscript.tax_amount(doc, cdt, cdn);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
cur_frm.cscript.row_id = function(doc, cdt, cdn) {
|
cur_frm.cscript.row_id = function(doc, cdt, cdn) {
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
if(!d.charge_type && d.row_id){
|
|
||||||
alert(wn._("Please select Charge Type first"));
|
if(!d.charge_type && d.row_id) {
|
||||||
d.row_id = '';
|
msgprint(wn._("Please select Charge Type first"));
|
||||||
}
|
d.row_id = '';
|
||||||
else if((d.charge_type == 'Actual' || d.charge_type == 'On Net Total') && d.row_id) {
|
}
|
||||||
alert(wn._("You can Enter Row only if your Charge Type is 'On Previous Row Amount' or ' Previous Row Total'"));
|
else if((d.charge_type == 'Actual' || d.charge_type == 'On Net Total') && d.row_id) {
|
||||||
d.row_id = '';
|
msgprint(wn._("You can Enter Row only if your Charge Type is 'On Previous Row Amount' or ' Previous Row Total'"));
|
||||||
}
|
d.row_id = '';
|
||||||
else if((d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total') && d.row_id){
|
}
|
||||||
if(d.row_id >= d.idx){
|
else if((d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total') && d.row_id) {
|
||||||
alert(wn._("You cannot Enter Row no. greater than or equal to current row no. for this Charge type"));
|
if(d.row_id >= d.idx){
|
||||||
d.row_id = '';
|
msgprint(wn._("You cannot Enter Row no. greater than or equal to current row no. for this Charge type"));
|
||||||
}
|
d.row_id = '';
|
||||||
}
|
}
|
||||||
validated = false;
|
}
|
||||||
refresh_field('row_id',d.name,'purchase_tax_details');
|
validated = false;
|
||||||
|
refresh_field('row_id', d.name, 'other_charges');
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.set_query("account_head", "purchase_tax_details", function(doc) {
|
cur_frm.set_query("account_head", "other_charges", function(doc) {
|
||||||
return {
|
return {
|
||||||
query: "erpnext.controllers.queries.tax_account_query",
|
query: "erpnext.controllers.queries.tax_account_query",
|
||||||
filters: {
|
filters: {
|
||||||
"account_type": ["Tax", "Chargeable", "Expense Account"],
|
"account_type": ["Tax", "Chargeable", "Expense Account"],
|
||||||
"debit_or_credit": "Debit",
|
"debit_or_credit": "Debit",
|
||||||
"company": doc.company
|
"company": doc.company
|
||||||
@@ -148,35 +144,38 @@ cur_frm.set_query("account_head", "purchase_tax_details", function(doc) {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
cur_frm.fields_dict['purchase_tax_details'].grid.get_field("cost_center").get_query = function(doc) {
|
cur_frm.fields_dict['other_charges'].grid.get_field("cost_center").get_query = function(doc) {
|
||||||
return {
|
return {
|
||||||
filters: {
|
filters: {
|
||||||
'company': doc.company,
|
'company': doc.company,
|
||||||
'group_or_ledger': "Ledger"
|
'group_or_ledger': "Ledger"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.rate = function(doc, cdt, cdn) {
|
cur_frm.cscript.rate = function(doc, cdt, cdn) {
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
if(!d.charge_type && d.rate) {
|
|
||||||
alert(wn._("Please select Charge Type first"));
|
if(!d.charge_type && d.rate) {
|
||||||
d.rate = '';
|
msgprint(wn._("Please select Charge Type first"));
|
||||||
}
|
d.rate = '';
|
||||||
validated = false;
|
}
|
||||||
refresh_field('rate',d.name,'purchase_tax_details');
|
validated = false;
|
||||||
|
refresh_field('rate', d.name, 'other_charges');
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.tax_amount = function(doc, cdt, cdn) {
|
cur_frm.cscript.tax_amount = function(doc, cdt, cdn) {
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
if(!d.charge_type && d.tax_amount){
|
|
||||||
alert(wn._("Please select Charge Type first"));
|
if(!d.charge_type && d.tax_amount) {
|
||||||
d.tax_amount = '';
|
msgprint(wn._("Please select Charge Type first"));
|
||||||
}
|
d.tax_amount = '';
|
||||||
else if(d.charge_type && d.tax_amount) {
|
}
|
||||||
alert(wn._("You cannot directly enter Amount and if your Charge Type is Actual enter your amount in Rate"));
|
else if(d.charge_type && d.tax_amount) {
|
||||||
d.tax_amount = '';
|
msgprint(wn._("You cannot directly enter Amount and if your Charge Type is Actual enter your amount in Rate"));
|
||||||
}
|
d.tax_amount = '';
|
||||||
validated = false;
|
}
|
||||||
refresh_field('tax_amount',d.name,'purchase_tax_details');
|
|
||||||
|
validated = false;
|
||||||
|
refresh_field('tax_amount', d.name, 'other_charges');
|
||||||
}
|
}
|
||||||
@@ -2,12 +2,13 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-01-10 16:34:08",
|
"creation": "2013-01-10 16:34:08",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2014-01-20 17:49:14",
|
"modified": "2014-01-29 12:26:38",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "wasim@webnotestech.com"
|
"owner": "wasim@webnotestech.com"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_import": 1,
|
"allow_import": 1,
|
||||||
|
"allow_rename": 1,
|
||||||
"autoname": "field:title",
|
"autoname": "field:title",
|
||||||
"description": "Standard tax template that can be applied to all Purchase Transactions. This template can contain list of tax heads and also other expense heads like \"Shipping\", \"Insurance\", \"Handling\" etc.\n\n#### Note\n\nThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.\n\n#### Description of Columns\n\n1. Calculation Type: \n - This can be on **Net Total** (that is the sum of basic amount).\n - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total.\n - **Actual** (as mentioned).\n2. Account Head: The Account ledger under which this tax will be booked\n3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.\n4. Description: Description of the tax (that will be printed in invoices / quotes).\n5. Rate: Tax rate.\n6. Amount: Tax amount.\n7. Total: Cumulative total to this point.\n8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).\n9. Consider Tax or Charge for: In this section you can specify if the tax / charge is only for valuation (not a part of total) or only for total (does not add value to the item) or for both.\n10. Add or Deduct: Whether you want to add or deduct the tax.",
|
"description": "Standard tax template that can be applied to all Purchase Transactions. This template can contain list of tax heads and also other expense heads like \"Shipping\", \"Insurance\", \"Handling\" etc.\n\n#### Note\n\nThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.\n\n#### Description of Columns\n\n1. Calculation Type: \n - This can be on **Net Total** (that is the sum of basic amount).\n - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total.\n - **Actual** (as mentioned).\n2. Account Head: The Account ledger under which this tax will be booked\n3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.\n4. Description: Description of the tax (that will be printed in invoices / quotes).\n5. Rate: Tax rate.\n6. Amount: Tax amount.\n7. Total: Cumulative total to this point.\n8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).\n9. Consider Tax or Charge for: In this section you can specify if the tax / charge is only for valuation (not a part of total) or only for total (does not add value to the item) or for both.\n10. Add or Deduct: Whether you want to add or deduct the tax.",
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
@@ -70,7 +71,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "purchase_tax_details",
|
"fieldname": "other_charges",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"label": "Purchase Taxes and Charges",
|
"label": "Purchase Taxes and Charges",
|
||||||
"oldfieldname": "purchase_tax_details",
|
"oldfieldname": "purchase_tax_details",
|
||||||
|
|||||||
@@ -194,7 +194,7 @@ class DocType(SellingController):
|
|||||||
self.doc.customer = pos.customer
|
self.doc.customer = pos.customer
|
||||||
self.set_customer_defaults()
|
self.set_customer_defaults()
|
||||||
|
|
||||||
for fieldname in ('territory', 'naming_series', 'currency', 'charge', 'letter_head', 'tc_name',
|
for fieldname in ('territory', 'naming_series', 'currency', 'taxes_and_charges', 'letter_head', 'tc_name',
|
||||||
'selling_price_list', 'company', 'select_print_heading', 'cash_bank_account'):
|
'selling_price_list', 'company', 'select_print_heading', 'cash_bank_account'):
|
||||||
if (not for_validate) or (for_validate and not self.doc.fields.get(fieldname)):
|
if (not for_validate) or (for_validate and not self.doc.fields.get(fieldname)):
|
||||||
self.doc.fields[fieldname] = pos.get(fieldname)
|
self.doc.fields[fieldname] = pos.get(fieldname)
|
||||||
@@ -214,8 +214,8 @@ class DocType(SellingController):
|
|||||||
self.doc.terms = webnotes.conn.get_value("Terms and Conditions", self.doc.tc_name, "terms")
|
self.doc.terms = webnotes.conn.get_value("Terms and Conditions", self.doc.tc_name, "terms")
|
||||||
|
|
||||||
# fetch charges
|
# fetch charges
|
||||||
if self.doc.charge and not len(self.doclist.get({"parentfield": "other_charges"})):
|
if self.doc.taxes_and_charges and not len(self.doclist.get({"parentfield": "other_charges"})):
|
||||||
self.set_taxes("other_charges", "charge")
|
self.set_taxes("other_charges", "taxes_and_charges")
|
||||||
|
|
||||||
def get_customer_account(self):
|
def get_customer_account(self):
|
||||||
"""Get Account Head to which amount needs to be Debited based on Customer"""
|
"""Get Account Head to which amount needs to be Debited based on Customer"""
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-05-24 19:29:05",
|
"creation": "2013-05-24 19:29:05",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2014-01-20 17:49:20",
|
"modified": "2014-01-28 18:43:10",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -376,9 +376,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "charge",
|
"fieldname": "taxes_and_charges",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Tax Master",
|
"label": "Taxes and Charges",
|
||||||
"oldfieldname": "charge",
|
"oldfieldname": "charge",
|
||||||
"oldfieldtype": "Link",
|
"oldfieldtype": "Link",
|
||||||
"options": "Sales Taxes and Charges Master",
|
"options": "Sales Taxes and Charges Master",
|
||||||
@@ -1231,6 +1231,7 @@
|
|||||||
"write": 1
|
"write": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"cancel": 0,
|
||||||
"delete": 0,
|
"delete": 0,
|
||||||
"doctype": "DocPerm",
|
"doctype": "DocPerm",
|
||||||
"role": "Customer"
|
"role": "Customer"
|
||||||
|
|||||||
@@ -756,7 +756,8 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
|
|
||||||
def _test_recurring_invoice(self, base_si, first_and_last_day):
|
def _test_recurring_invoice(self, base_si, first_and_last_day):
|
||||||
from webnotes.utils import add_months, get_last_day
|
from webnotes.utils import add_months, get_last_day
|
||||||
from erpnext.accounts.doctype.sales_invoice.sales_invoice import manage_recurring_invoices
|
from accounts.doctype.sales_invoice.sales_invoice \
|
||||||
|
import manage_recurring_invoices, get_next_date
|
||||||
|
|
||||||
no_of_months = ({"Monthly": 1, "Quarterly": 3, "Yearly": 12})[base_si.doc.recurring_type]
|
no_of_months = ({"Monthly": 1, "Quarterly": 3, "Yearly": 12})[base_si.doc.recurring_type]
|
||||||
|
|
||||||
@@ -764,7 +765,8 @@ class TestSalesInvoice(unittest.TestCase):
|
|||||||
self.assertEquals(i+1, webnotes.conn.sql("""select count(*) from `tabSales Invoice`
|
self.assertEquals(i+1, webnotes.conn.sql("""select count(*) from `tabSales Invoice`
|
||||||
where recurring_id=%s and docstatus=1""", base_si.doc.recurring_id)[0][0])
|
where recurring_id=%s and docstatus=1""", base_si.doc.recurring_id)[0][0])
|
||||||
|
|
||||||
next_date = add_months(base_si.doc.posting_date, no_of_months)
|
next_date = get_next_date(base_si.doc.posting_date, no_of_months,
|
||||||
|
base_si.doc.repeat_on_day_of_month)
|
||||||
|
|
||||||
manage_recurring_invoices(next_date=next_date, commit=False)
|
manage_recurring_invoices(next_date=next_date, commit=False)
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,6 @@
|
|||||||
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||||
// License: GNU General Public License v3. See license.txt
|
// License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
//--------- ONLOAD -------------
|
|
||||||
|
|
||||||
{% include "public/js/controllers/accounts.js" %}
|
{% include "public/js/controllers/accounts.js" %}
|
||||||
|
|
||||||
cur_frm.cscript.onload = function(doc, cdt, cdn) {
|
cur_frm.cscript.onload = function(doc, cdt, cdn) {
|
||||||
@@ -11,7 +9,7 @@ cur_frm.cscript.onload = function(doc, cdt, cdn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
|
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
|
||||||
cur_frm.set_footnote(wn.markdown(cur_frm.meta.description));
|
cur_frm.set_footnote(wn.markdown(cur_frm.meta.description));
|
||||||
}
|
}
|
||||||
|
|
||||||
// For customizing print
|
// For customizing print
|
||||||
@@ -40,11 +38,11 @@ cur_frm.pformat.other_charges= function(doc){
|
|||||||
var make_row = function(title, val, bold){
|
var make_row = function(title, val, bold){
|
||||||
var bstart = '<b>'; var bend = '</b>';
|
var bstart = '<b>'; var bend = '</b>';
|
||||||
return '<tr><td style="width:50%;">' + (bold?bstart:'') + title + (bold?bend:'') + '</td>'
|
return '<tr><td style="width:50%;">' + (bold?bstart:'') + title + (bold?bend:'') + '</td>'
|
||||||
+'<td style="width:50%;text-align:right;">' + format_currency(val, doc.currency) + '</td>'
|
+ '<td style="width:50%;text-align:right;">' + format_currency(val, doc.currency) + '</td>'
|
||||||
+'</tr>'
|
+ '</tr>';
|
||||||
}
|
}
|
||||||
|
|
||||||
function convert_rate(val){
|
function convert_rate(val) {
|
||||||
var new_val = flt(val)/flt(doc.conversion_rate);
|
var new_val = flt(val)/flt(doc.conversion_rate);
|
||||||
return new_val;
|
return new_val;
|
||||||
}
|
}
|
||||||
@@ -71,31 +69,28 @@ cur_frm.pformat.other_charges= function(doc){
|
|||||||
|
|
||||||
// add rows
|
// add rows
|
||||||
if(cl.length){
|
if(cl.length){
|
||||||
for(var i=0;i<cl.length;i++){
|
for(var i=0;i<cl.length;i++) {
|
||||||
if(convert_rate(cl[i].tax_amount)!=0 && !cl[i].included_in_print_rate)
|
if(convert_rate(cl[i].tax_amount)!=0 && !cl[i].included_in_print_rate)
|
||||||
out += make_row(cl[i].description, convert_rate(cl[i].tax_amount), 0);
|
out += make_row(cl[i].description, convert_rate(cl[i].tax_amount), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Discount Amount
|
// Discount Amount
|
||||||
if(!print_hide('discount_amount') && doc.discount_amount) {
|
if(!print_hide('discount_amount') && doc.discount_amount)
|
||||||
out += make_row('Discount Amount', convert_rate(doc.discount_amount), 0);
|
out += make_row('Discount Amount', convert_rate(doc.discount_amount), 0);
|
||||||
}
|
|
||||||
|
|
||||||
// grand total
|
// grand total
|
||||||
if(!print_hide('grand_total_export')) {
|
if(!print_hide('grand_total_export'))
|
||||||
out += make_row('Grand Total', doc.grand_total_export, 1);
|
out += make_row('Grand Total', doc.grand_total_export, 1);
|
||||||
}
|
|
||||||
|
|
||||||
if(!print_hide('rounded_total_export')) {
|
if(!print_hide('rounded_total_export'))
|
||||||
out += make_row('Rounded Total', doc.rounded_total_export, 1);
|
out += make_row('Rounded Total', doc.rounded_total_export, 1);
|
||||||
}
|
|
||||||
|
|
||||||
if(doc.in_words_export && !print_hide('in_words_export')){
|
if(doc.in_words_export && !print_hide('in_words_export')) {
|
||||||
out +='</table></td></tr>';
|
out +='</table></td></tr>';
|
||||||
out += '<tr><td colspan = "2">';
|
out += '<tr><td colspan = "2">';
|
||||||
out += '<table><tr><td style="width:25%;"><b>In Words</b></td>'
|
out += '<table><tr><td style="width:25%;"><b>In Words</b></td>';
|
||||||
out += '<td style="width:50%;">' + doc.in_words_export + '</td></tr>'
|
out += '<td style="width:50%;">' + doc.in_words_export + '</td></tr>';
|
||||||
}
|
}
|
||||||
out += '</table></td></tr></table></div>';
|
out += '</table></td></tr></table></div>';
|
||||||
}
|
}
|
||||||
@@ -104,8 +99,8 @@ cur_frm.pformat.other_charges= function(doc){
|
|||||||
|
|
||||||
cur_frm.cscript.charge_type = function(doc, cdt, cdn) {
|
cur_frm.cscript.charge_type = function(doc, cdt, cdn) {
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
if(d.idx == 1 && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')){
|
if(d.idx == 1 && (d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total')) {
|
||||||
alert(wn._("You cannot select Charge Type as 'On Previous Row Amount' or 'On Previous Row Total' for first row"));
|
msgprint(wn._("You cannot select Charge Type as 'On Previous Row Amount' or 'On Previous Row Total' for first row"));
|
||||||
d.charge_type = '';
|
d.charge_type = '';
|
||||||
}
|
}
|
||||||
validated = false;
|
validated = false;
|
||||||
@@ -117,17 +112,17 @@ cur_frm.cscript.charge_type = function(doc, cdt, cdn) {
|
|||||||
|
|
||||||
cur_frm.cscript.row_id = function(doc, cdt, cdn) {
|
cur_frm.cscript.row_id = function(doc, cdt, cdn) {
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
if(!d.charge_type && d.row_id){
|
if(!d.charge_type && d.row_id) {
|
||||||
alert(wn._("Please select Charge Type first"));
|
msgprint(wn._("Please select Charge Type first"));
|
||||||
d.row_id = '';
|
d.row_id = '';
|
||||||
}
|
}
|
||||||
else if((d.charge_type == 'Actual' || d.charge_type == 'On Net Total') && d.row_id) {
|
else if((d.charge_type == 'Actual' || d.charge_type == 'On Net Total') && d.row_id) {
|
||||||
alert(wn._("You can Enter Row only if your Charge Type is 'On Previous Row Amount' or ' Previous Row Total'"));
|
msgprint(wn._("You can Enter Row only if your Charge Type is 'On Previous Row Amount' or ' Previous Row Total'"));
|
||||||
d.row_id = '';
|
d.row_id = '';
|
||||||
}
|
}
|
||||||
else if((d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total') && d.row_id){
|
else if((d.charge_type == 'On Previous Row Amount' || d.charge_type == 'On Previous Row Total') && d.row_id) {
|
||||||
if(d.row_id >= d.idx){
|
if(d.row_id >= d.idx){
|
||||||
alert(wn._("You cannot Enter Row no. greater than or equal to current row no. for this Charge type"));
|
msgprint(wn._("You cannot Enter Row no. greater than or equal to current row no. for this Charge type"));
|
||||||
d.row_id = '';
|
d.row_id = '';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -158,7 +153,7 @@ cur_frm.fields_dict['other_charges'].grid.get_field("cost_center").get_query = f
|
|||||||
cur_frm.cscript.rate = function(doc, cdt, cdn) {
|
cur_frm.cscript.rate = function(doc, cdt, cdn) {
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
if(!d.charge_type && d.rate) {
|
if(!d.charge_type && d.rate) {
|
||||||
alert(wn._("Please select Charge Type first"));
|
msgprint(wn._("Please select Charge Type first"));
|
||||||
d.rate = '';
|
d.rate = '';
|
||||||
}
|
}
|
||||||
validated = false;
|
validated = false;
|
||||||
@@ -167,12 +162,12 @@ cur_frm.cscript.rate = function(doc, cdt, cdn) {
|
|||||||
|
|
||||||
cur_frm.cscript.tax_amount = function(doc, cdt, cdn) {
|
cur_frm.cscript.tax_amount = function(doc, cdt, cdn) {
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
if(!d.charge_type && d.tax_amount){
|
if(!d.charge_type && d.tax_amount) {
|
||||||
alert(wn._("Please select Charge Type first"));
|
msgprint(wn._("Please select Charge Type first"));
|
||||||
d.tax_amount = '';
|
d.tax_amount = '';
|
||||||
}
|
}
|
||||||
else if(d.charge_type && d.tax_amount) {
|
else if(d.charge_type && d.tax_amount) {
|
||||||
alert(wn._("You cannot directly enter Amount and if your Charge Type is Actual enter your amount in Rate"));
|
msgprint(wn._("You cannot directly enter Amount and if your Charge Type is Actual enter your amount in Rate"));
|
||||||
d.tax_amount = '';
|
d.tax_amount = '';
|
||||||
}
|
}
|
||||||
validated = false;
|
validated = false;
|
||||||
|
|||||||
@@ -2,12 +2,13 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-01-10 16:34:09",
|
"creation": "2013-01-10 16:34:09",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2014-01-20 17:49:25",
|
"modified": "2014-01-28 12:28:27",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_import": 1,
|
"allow_import": 1,
|
||||||
|
"allow_rename": 1,
|
||||||
"autoname": "field:title",
|
"autoname": "field:title",
|
||||||
"description": "Standard tax template that can be applied to all Sales Transactions. This template can contain list of tax heads and also other expense / income heads like \"Shipping\", \"Insurance\", \"Handling\" etc.\n\n#### Note\n\nThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.\n\n#### Description of Columns\n\n1. Calculation Type: \n - This can be on **Net Total** (that is the sum of basic amount).\n - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total.\n - **Actual** (as mentioned).\n2. Account Head: The Account ledger under which this tax will be booked\n3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.\n4. Description: Description of the tax (that will be printed in invoices / quotes).\n5. Rate: Tax rate.\n6. Amount: Tax amount.\n7. Total: Cumulative total to this point.\n8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).\n9. Is this Tax included in Basic Rate?: If you check this, it means that this tax will not be shown below the item table, but will be included in the Basic Rate in your main item table. This is useful where you want give a flat price (inclusive of all taxes) price to customers.",
|
"description": "Standard tax template that can be applied to all Sales Transactions. This template can contain list of tax heads and also other expense / income heads like \"Shipping\", \"Insurance\", \"Handling\" etc.\n\n#### Note\n\nThe tax rate you define here will be the standard tax rate for all **Items**. If there are **Items** that have different rates, they must be added in the **Item Tax** table in the **Item** master.\n\n#### Description of Columns\n\n1. Calculation Type: \n - This can be on **Net Total** (that is the sum of basic amount).\n - **On Previous Row Total / Amount** (for cumulative taxes or charges). If you select this option, the tax will be applied as a percentage of the previous row (in the tax table) amount or total.\n - **Actual** (as mentioned).\n2. Account Head: The Account ledger under which this tax will be booked\n3. Cost Center: If the tax / charge is an income (like shipping) or expense it needs to be booked against a Cost Center.\n4. Description: Description of the tax (that will be printed in invoices / quotes).\n5. Rate: Tax rate.\n6. Amount: Tax amount.\n7. Total: Cumulative total to this point.\n8. Enter Row: If based on \"Previous Row Total\" you can select the row number which will be taken as a base for this calculation (default is the previous row).\n9. Is this Tax included in Basic Rate?: If you check this, it means that this tax will not be shown below the item table, but will be included in the Basic Rate in your main item table. This is useful where you want give a flat price (inclusive of all taxes) price to customers.",
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
|
|||||||
@@ -132,7 +132,7 @@ class AccountsReceivableReport(object):
|
|||||||
if not hasattr(self, "gl_entries"):
|
if not hasattr(self, "gl_entries"):
|
||||||
conditions, values = self.prepare_conditions()
|
conditions, values = self.prepare_conditions()
|
||||||
self.gl_entries = webnotes.conn.sql("""select * from `tabGL Entry`
|
self.gl_entries = webnotes.conn.sql("""select * from `tabGL Entry`
|
||||||
where docstatus < 2 {} order by posting_date, account""".format(conditions),
|
where docstatus < 2 {0} order by posting_date, account""".format(conditions),
|
||||||
values, as_dict=True)
|
values, as_dict=True)
|
||||||
|
|
||||||
return self.gl_entries
|
return self.gl_entries
|
||||||
@@ -153,8 +153,8 @@ class AccountsReceivableReport(object):
|
|||||||
if not account_map:
|
if not account_map:
|
||||||
webnotes.throw(_("No Customer Accounts found."))
|
webnotes.throw(_("No Customer Accounts found."))
|
||||||
else:
|
else:
|
||||||
accounts_list = ['"{}"'.format(ac) for ac in account_map]
|
accounts_list = ['"{0}"'.format(ac) for ac in account_map]
|
||||||
conditions.append("account in ({})".format(", ".join(accounts_list)))
|
conditions.append("account in ({0})".format(", ".join(accounts_list)))
|
||||||
|
|
||||||
return " and ".join(conditions), values
|
return " and ".join(conditions), values
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ from __future__ import unicode_literals
|
|||||||
import webnotes
|
import webnotes
|
||||||
from webnotes.utils import nowdate, cstr, flt, now, getdate, add_months
|
from webnotes.utils import nowdate, cstr, flt, now, getdate, add_months
|
||||||
from webnotes.model.doc import addchild
|
from webnotes.model.doc import addchild
|
||||||
from webnotes import msgprint, _
|
from webnotes import msgprint, throw, _
|
||||||
from webnotes.utils import formatdate
|
from webnotes.utils import formatdate
|
||||||
from erpnext.utilities import build_filter_conditions
|
from erpnext.utilities import build_filter_conditions
|
||||||
|
|
||||||
@@ -41,12 +41,12 @@ def get_fiscal_years(date=None, fiscal_year=None, label="Date", verbose=1):
|
|||||||
def validate_fiscal_year(date, fiscal_year, label="Date"):
|
def validate_fiscal_year(date, fiscal_year, label="Date"):
|
||||||
years = [f[0] for f in get_fiscal_years(date, label=label)]
|
years = [f[0] for f in get_fiscal_years(date, label=label)]
|
||||||
if fiscal_year not in years:
|
if fiscal_year not in years:
|
||||||
webnotes.msgprint(("%(label)s '%(posting_date)s': " + _("not within Fiscal Year") + \
|
throw(("%(label)s '%(posting_date)s': " + _("not within Fiscal Year") + \
|
||||||
": '%(fiscal_year)s'") % {
|
": '%(fiscal_year)s'") % {
|
||||||
"label": label,
|
"label": label,
|
||||||
"posting_date": formatdate(date),
|
"posting_date": formatdate(date),
|
||||||
"fiscal_year": fiscal_year
|
"fiscal_year": fiscal_year
|
||||||
}, raise_exception=1)
|
})
|
||||||
|
|
||||||
@webnotes.whitelist()
|
@webnotes.whitelist()
|
||||||
def get_balance_on(account=None, date=None):
|
def get_balance_on(account=None, date=None):
|
||||||
@@ -169,8 +169,7 @@ def check_if_jv_modified(args):
|
|||||||
and t1.docstatus=1 and t2.%(dr_or_cr)s = %(unadjusted_amt)s""" % args)
|
and t1.docstatus=1 and t2.%(dr_or_cr)s = %(unadjusted_amt)s""" % args)
|
||||||
|
|
||||||
if not ret:
|
if not ret:
|
||||||
msgprint(_("""Payment Entry has been modified after you pulled it.
|
throw(_("""Payment Entry has been modified after you pulled it. Please pull it again."""))
|
||||||
Please pull it again."""), raise_exception=1)
|
|
||||||
|
|
||||||
def update_against_doc(d, jv_obj):
|
def update_against_doc(d, jv_obj):
|
||||||
"""
|
"""
|
||||||
@@ -247,9 +246,9 @@ def get_company_default(company, fieldname):
|
|||||||
value = webnotes.conn.get_value("Company", company, fieldname)
|
value = webnotes.conn.get_value("Company", company, fieldname)
|
||||||
|
|
||||||
if not value:
|
if not value:
|
||||||
msgprint(_("Please mention default value for '") +
|
throw(_("Please mention default value for '") +
|
||||||
_(webnotes.get_doctype("company").get_label(fieldname) +
|
_(webnotes.get_doctype("company").get_label(fieldname) +
|
||||||
_("' in Company: ") + company), raise_exception=True)
|
_("' in Company: ") + company))
|
||||||
|
|
||||||
return value
|
return value
|
||||||
|
|
||||||
@@ -318,11 +317,11 @@ def validate_expense_against_budget(args):
|
|||||||
if action_for:
|
if action_for:
|
||||||
actual_expense = get_actual_expense(args)
|
actual_expense = get_actual_expense(args)
|
||||||
if actual_expense > budget_amount:
|
if actual_expense > budget_amount:
|
||||||
webnotes.msgprint(action_for + _(" budget ") + cstr(budget_amount) +
|
throw(action_for + _(" budget ") + cstr(budget_amount) +
|
||||||
_(" for account ") + args.account + _(" against cost center ") +
|
_(" for account ") + args.account + _(" against cost center ") +
|
||||||
args.cost_center + _(" will exceed by ") +
|
args.cost_center + _(" will exceed by ") +
|
||||||
cstr(actual_expense - budget_amount) + _(" after this transaction.")
|
cstr(actual_expense - budget_amount) + _(" after this transaction.")
|
||||||
, raise_exception=BudgetError if action=="Stop" else False)
|
, exc=BudgetError if action=="Stop" else False)
|
||||||
|
|
||||||
def get_allocated_budget(distribution_id, posting_date, fiscal_year, yearly_budget):
|
def get_allocated_budget(distribution_id, posting_date, fiscal_year, yearly_budget):
|
||||||
if distribution_id:
|
if distribution_id:
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -62,14 +62,13 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({
|
|||||||
},
|
},
|
||||||
|
|
||||||
supplier: function() {
|
supplier: function() {
|
||||||
|
var me = this;
|
||||||
if(this.frm.doc.supplier || this.frm.doc.credit_to) {
|
if(this.frm.doc.supplier || this.frm.doc.credit_to) {
|
||||||
if(!this.frm.doc.company) {
|
if(!this.frm.doc.company) {
|
||||||
this.frm.set_value("supplier", null);
|
this.frm.set_value("supplier", null);
|
||||||
msgprint(wn._("Please specify Company"));
|
msgprint(wn._("Please specify Company"));
|
||||||
} else {
|
} else {
|
||||||
var me = this;
|
|
||||||
var buying_price_list = this.frm.doc.buying_price_list;
|
var buying_price_list = this.frm.doc.buying_price_list;
|
||||||
|
|
||||||
return this.frm.call({
|
return this.frm.call({
|
||||||
doc: this.frm.doc,
|
doc: this.frm.doc,
|
||||||
method: "set_supplier_defaults",
|
method: "set_supplier_defaults",
|
||||||
@@ -77,6 +76,8 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({
|
|||||||
callback: function(r) {
|
callback: function(r) {
|
||||||
if(!r.exc) {
|
if(!r.exc) {
|
||||||
if(me.frm.doc.buying_price_list !== buying_price_list) me.buying_price_list();
|
if(me.frm.doc.buying_price_list !== buying_price_list) me.buying_price_list();
|
||||||
|
if (me.frm.doc.taxes_and_charges)
|
||||||
|
me.frm.script_manager.trigger("taxes_and_charges")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -241,21 +242,6 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
purchase_other_charges: function() {
|
|
||||||
var me = this;
|
|
||||||
if(this.frm.doc.purchase_other_charges) {
|
|
||||||
return this.frm.call({
|
|
||||||
doc: this.frm.doc,
|
|
||||||
method: "get_purchase_tax_details",
|
|
||||||
callback: function(r) {
|
|
||||||
if(!r.exc) {
|
|
||||||
me.calculate_taxes_and_totals();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
calculate_taxes_and_totals: function() {
|
calculate_taxes_and_totals: function() {
|
||||||
this._super();
|
this._super();
|
||||||
this.calculate_total_advance("Purchase Invoice", "advance_allocation_details");
|
this.calculate_total_advance("Purchase Invoice", "advance_allocation_details");
|
||||||
@@ -398,13 +384,6 @@ erpnext.buying.BuyingController = erpnext.TransactionController.extend({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
show_item_wise_taxes: function() {
|
|
||||||
if(this.frm.fields_dict.tax_calculation) {
|
|
||||||
$(this.get_item_wise_taxes_html())
|
|
||||||
.appendTo($(this.frm.fields_dict.tax_calculation.wrapper).empty());
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
change_form_labels: function(company_currency) {
|
change_form_labels: function(company_currency) {
|
||||||
var me = this;
|
var me = this;
|
||||||
var field_label_map = {};
|
var field_label_map = {};
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ wn.provide("erpnext.buying");
|
|||||||
|
|
||||||
cur_frm.cscript.tname = "Purchase Order Item";
|
cur_frm.cscript.tname = "Purchase Order Item";
|
||||||
cur_frm.cscript.fname = "po_details";
|
cur_frm.cscript.fname = "po_details";
|
||||||
cur_frm.cscript.other_fname = "purchase_tax_details";
|
cur_frm.cscript.other_fname = "other_charges";
|
||||||
|
|
||||||
{% include 'buying/doctype/purchase_common/purchase_common.js' %};
|
{% include 'buying/doctype/purchase_common/purchase_common.js' %};
|
||||||
{% include 'accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js' %}
|
{% include 'accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js' %}
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-05-21 16:16:39",
|
"creation": "2013-05-21 16:16:39",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2014-01-20 17:49:08",
|
"modified": "2014-01-29 15:26:21",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -299,7 +299,7 @@
|
|||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "taxes",
|
"fieldname": "taxes",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"label": "Taxes",
|
"label": "Taxes and Charges",
|
||||||
"oldfieldtype": "Section Break",
|
"oldfieldtype": "Section Break",
|
||||||
"options": "icon-money",
|
"options": "icon-money",
|
||||||
"print_hide": 0
|
"print_hide": 0
|
||||||
@@ -307,9 +307,9 @@
|
|||||||
{
|
{
|
||||||
"description": "If you have created a standard template in Purchase Taxes and Charges Master, select one and click on the button below.",
|
"description": "If you have created a standard template in Purchase Taxes and Charges Master, select one and click on the button below.",
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "purchase_other_charges",
|
"fieldname": "taxes_and_charges",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Tax Master",
|
"label": "Taxes and Charges",
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
"oldfieldname": "purchase_other_charges",
|
"oldfieldname": "purchase_other_charges",
|
||||||
"oldfieldtype": "Link",
|
"oldfieldtype": "Link",
|
||||||
@@ -318,7 +318,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "purchase_tax_details",
|
"fieldname": "other_charges",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"label": "Purchase Taxes and Charges",
|
"label": "Purchase Taxes and Charges",
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
@@ -328,9 +328,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "tax_calculation",
|
"fieldname": "other_charges_calculation",
|
||||||
"fieldtype": "HTML",
|
"fieldtype": "HTML",
|
||||||
"label": "Tax Calculation",
|
"label": "Taxes and Charges Calculation",
|
||||||
"no_copy": 1,
|
"no_copy": 1,
|
||||||
"oldfieldtype": "HTML",
|
"oldfieldtype": "HTML",
|
||||||
"print_hide": 1
|
"print_hide": 1
|
||||||
@@ -699,6 +699,7 @@
|
|||||||
"write": 1
|
"write": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"cancel": 0,
|
||||||
"delete": 0,
|
"delete": 0,
|
||||||
"doctype": "DocPerm",
|
"doctype": "DocPerm",
|
||||||
"role": "Supplier"
|
"role": "Supplier"
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-01-10 16:34:11",
|
"creation": "2013-01-10 16:34:11",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2014-01-20 17:49:29",
|
"modified": "2014-01-28 19:05:55",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -157,6 +157,14 @@
|
|||||||
"reqd": 1,
|
"reqd": 1,
|
||||||
"search_index": 0
|
"search_index": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"doctype": "DocField",
|
||||||
|
"fieldname": "default_currency",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"label": "Default Currency",
|
||||||
|
"no_copy": 1,
|
||||||
|
"options": "Currency"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "default_price_list",
|
"fieldname": "default_price_list",
|
||||||
@@ -166,11 +174,10 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "default_currency",
|
"fieldname": "default_taxes_and_charges",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Default Currency",
|
"label": "Taxes and Charges",
|
||||||
"no_copy": 1,
|
"options": "Purchase Taxes and Charges Master"
|
||||||
"options": "Currency"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
// define defaults for purchase common
|
// define defaults for purchase common
|
||||||
cur_frm.cscript.tname = "Supplier Quotation Item";
|
cur_frm.cscript.tname = "Supplier Quotation Item";
|
||||||
cur_frm.cscript.fname = "quotation_items";
|
cur_frm.cscript.fname = "quotation_items";
|
||||||
cur_frm.cscript.other_fname = "purchase_tax_details";
|
cur_frm.cscript.other_fname = "other_charges";
|
||||||
|
|
||||||
// attach required files
|
// attach required files
|
||||||
{% include 'buying/doctype/purchase_common/purchase_common.js' %};
|
{% include 'buying/doctype/purchase_common/purchase_common.js' %};
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-05-21 16:16:45",
|
"creation": "2013-05-21 16:16:45",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2014-01-20 17:49:29",
|
"modified": "2014-01-29 15:25:52",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -290,16 +290,16 @@
|
|||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "taxes",
|
"fieldname": "taxes",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"label": "Taxes",
|
"label": "Taxes and Charges",
|
||||||
"oldfieldtype": "Section Break",
|
"oldfieldtype": "Section Break",
|
||||||
"options": "icon-money"
|
"options": "icon-money"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "If you have created a standard template in Purchase Taxes and Charges Master, select one and click on the button below.",
|
"description": "If you have created a standard template in Purchase Taxes and Charges Master, select one and click on the button below.",
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "purchase_other_charges",
|
"fieldname": "taxes_and_charges",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Purchase Taxes and Charges",
|
"label": "Taxes and Charges",
|
||||||
"no_copy": 1,
|
"no_copy": 1,
|
||||||
"oldfieldname": "purchase_other_charges",
|
"oldfieldname": "purchase_other_charges",
|
||||||
"oldfieldtype": "Link",
|
"oldfieldtype": "Link",
|
||||||
@@ -308,7 +308,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "purchase_tax_details",
|
"fieldname": "other_charges",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"label": "Purchase Taxes and Charges",
|
"label": "Purchase Taxes and Charges",
|
||||||
"no_copy": 0,
|
"no_copy": 0,
|
||||||
@@ -318,9 +318,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "tax_calculation",
|
"fieldname": "other_charges_calculation",
|
||||||
"fieldtype": "HTML",
|
"fieldtype": "HTML",
|
||||||
"label": "Tax Calculation",
|
"label": "Taxes and Charges Calculation",
|
||||||
"no_copy": 1,
|
"no_copy": 1,
|
||||||
"oldfieldtype": "HTML",
|
"oldfieldtype": "HTML",
|
||||||
"print_hide": 1
|
"print_hide": 1
|
||||||
|
|||||||
@@ -131,6 +131,10 @@ class AccountsController(TransactionBase):
|
|||||||
|
|
||||||
self.doclist.append(tax)
|
self.doclist.append(tax)
|
||||||
|
|
||||||
|
def get_other_charges(self):
|
||||||
|
self.doclist = self.doc.clear_table(self.doclist, "other_charges")
|
||||||
|
self.set_taxes("other_charges", "taxes_and_charges")
|
||||||
|
|
||||||
def calculate_taxes_and_totals(self):
|
def calculate_taxes_and_totals(self):
|
||||||
self.discount_amount_applied = False
|
self.discount_amount_applied = False
|
||||||
self._calculate_taxes_and_totals()
|
self._calculate_taxes_and_totals()
|
||||||
|
|||||||
@@ -38,7 +38,7 @@ class BuyingController(StockController):
|
|||||||
|
|
||||||
self.set_missing_item_details(get_item_details)
|
self.set_missing_item_details(get_item_details)
|
||||||
if self.doc.fields.get("__islocal"):
|
if self.doc.fields.get("__islocal"):
|
||||||
self.set_taxes("purchase_tax_details", "purchase_other_charges")
|
self.set_taxes("other_charges", "taxes_and_charges")
|
||||||
|
|
||||||
def set_supplier_from_item_default(self):
|
def set_supplier_from_item_default(self):
|
||||||
if self.meta.get_field("supplier") and not self.doc.supplier:
|
if self.meta.get_field("supplier") and not self.doc.supplier:
|
||||||
@@ -57,14 +57,10 @@ class BuyingController(StockController):
|
|||||||
for w in warehouses:
|
for w in warehouses:
|
||||||
validate_warehouse_company(w, self.doc.company)
|
validate_warehouse_company(w, self.doc.company)
|
||||||
|
|
||||||
def get_purchase_tax_details(self):
|
|
||||||
self.doclist = self.doc.clear_table(self.doclist, "purchase_tax_details")
|
|
||||||
self.set_taxes("purchase_tax_details", "purchase_other_charges")
|
|
||||||
|
|
||||||
def validate_stock_or_nonstock_items(self):
|
def validate_stock_or_nonstock_items(self):
|
||||||
if not self.get_stock_items():
|
if not self.get_stock_items():
|
||||||
tax_for_valuation = [d.account_head for d in
|
tax_for_valuation = [d.account_head for d in
|
||||||
self.doclist.get({"parentfield": "purchase_tax_details"})
|
self.doclist.get({"parentfield": "other_charges"})
|
||||||
if d.category in ["Valuation", "Valuation and Total"]]
|
if d.category in ["Valuation", "Valuation and Total"]]
|
||||||
if tax_for_valuation:
|
if tax_for_valuation:
|
||||||
webnotes.msgprint(_("""Tax Category can not be 'Valuation' or 'Valuation and Total' as all items are non-stock items"""), raise_exception=1)
|
webnotes.msgprint(_("""Tax Category can not be 'Valuation' or 'Valuation and Total' as all items are non-stock items"""), raise_exception=1)
|
||||||
@@ -79,7 +75,7 @@ class BuyingController(StockController):
|
|||||||
self.doc.currency)
|
self.doc.currency)
|
||||||
|
|
||||||
def calculate_taxes_and_totals(self):
|
def calculate_taxes_and_totals(self):
|
||||||
self.other_fname = "purchase_tax_details"
|
self.other_fname = "other_charges"
|
||||||
super(BuyingController, self).calculate_taxes_and_totals()
|
super(BuyingController, self).calculate_taxes_and_totals()
|
||||||
self.calculate_total_advance("Purchase Invoice", "advance_allocation_details")
|
self.calculate_total_advance("Purchase Invoice", "advance_allocation_details")
|
||||||
|
|
||||||
@@ -203,7 +199,7 @@ class BuyingController(StockController):
|
|||||||
last_stock_item_idx = d.idx
|
last_stock_item_idx = d.idx
|
||||||
|
|
||||||
total_valuation_amount = sum([flt(d.tax_amount) for d in
|
total_valuation_amount = sum([flt(d.tax_amount) for d in
|
||||||
self.doclist.get({"parentfield": "purchase_tax_details"})
|
self.doclist.get({"parentfield": "other_charges"})
|
||||||
if d.category in ["Valuation", "Valuation and Total"]])
|
if d.category in ["Valuation", "Valuation and Total"]])
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ class SellingController(StockController):
|
|||||||
self.set_missing_lead_customer_details()
|
self.set_missing_lead_customer_details()
|
||||||
self.set_price_list_and_item_details()
|
self.set_price_list_and_item_details()
|
||||||
if self.doc.fields.get("__islocal"):
|
if self.doc.fields.get("__islocal"):
|
||||||
self.set_taxes("other_charges", "charge")
|
self.set_taxes("other_charges", "taxes_and_charges")
|
||||||
|
|
||||||
def set_missing_lead_customer_details(self):
|
def set_missing_lead_customer_details(self):
|
||||||
if self.doc.customer:
|
if self.doc.customer:
|
||||||
@@ -50,10 +50,6 @@ class SellingController(StockController):
|
|||||||
self.set_price_list_currency("Selling")
|
self.set_price_list_currency("Selling")
|
||||||
self.set_missing_item_details(get_item_details)
|
self.set_missing_item_details(get_item_details)
|
||||||
|
|
||||||
def get_other_charges(self):
|
|
||||||
self.doclist = self.doc.clear_table(self.doclist, "other_charges")
|
|
||||||
self.set_taxes("other_charges", "charge")
|
|
||||||
|
|
||||||
def apply_shipping_rule(self):
|
def apply_shipping_rule(self):
|
||||||
if self.doc.shipping_rule:
|
if self.doc.shipping_rule:
|
||||||
shipping_rule = webnotes.bean("Shipping Rule", self.doc.shipping_rule)
|
shipping_rule = webnotes.bean("Shipping Rule", self.doc.shipping_rule)
|
||||||
|
|||||||
@@ -4,10 +4,10 @@
|
|||||||
wn.provide("erpnext.hr");
|
wn.provide("erpnext.hr");
|
||||||
erpnext.hr.EmployeeController = wn.ui.form.Controller.extend({
|
erpnext.hr.EmployeeController = wn.ui.form.Controller.extend({
|
||||||
setup: function() {
|
setup: function() {
|
||||||
this.frm.fields_dict.user_id.get_query = function(doc,cdt,cdn) {
|
this.frm.fields_dict.user_id.get_query = function(doc, cdt, cdn) {
|
||||||
return { query:"webnotes.core.doctype.profile.profile.profile_query"} }
|
return { query:"webnotes.core.doctype.profile.profile.profile_query"} }
|
||||||
this.frm.fields_dict.reports_to.get_query = function(doc,cdt,cdn) {
|
this.frm.fields_dict.reports_to.get_query = function(doc, cdt, cdn) {
|
||||||
return{ query: "erpnext.controllers.queries.employee_query"} }
|
return { query: "erpnext.controllers.queries.employee_query"} }
|
||||||
},
|
},
|
||||||
|
|
||||||
onload: function() {
|
onload: function() {
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import webnotes
|
|||||||
|
|
||||||
from webnotes.utils import getdate, validate_email_add, cstr, cint
|
from webnotes.utils import getdate, validate_email_add, cstr, cint
|
||||||
from webnotes.model.doc import make_autoname
|
from webnotes.model.doc import make_autoname
|
||||||
from webnotes import msgprint, _
|
from webnotes import msgprint, throw, _
|
||||||
import webnotes.permissions
|
import webnotes.permissions
|
||||||
from webnotes.defaults import get_restrictions
|
from webnotes.defaults import get_restrictions
|
||||||
from webnotes.model.controller import DocListController
|
from webnotes.model.controller import DocListController
|
||||||
@@ -15,7 +15,7 @@ class DocType(DocListController):
|
|||||||
def autoname(self):
|
def autoname(self):
|
||||||
naming_method = webnotes.conn.get_value("HR Settings", None, "emp_created_by")
|
naming_method = webnotes.conn.get_value("HR Settings", None, "emp_created_by")
|
||||||
if not naming_method:
|
if not naming_method:
|
||||||
webnotes.throw(_("Please setup Employee Naming System in Human Resource > HR Settings"))
|
throw(_("Please setup Employee Naming System in Human Resource > HR Settings"))
|
||||||
else:
|
else:
|
||||||
if naming_method=='Naming Series':
|
if naming_method=='Naming Series':
|
||||||
self.doc.name = make_autoname(self.doc.naming_series + '.####')
|
self.doc.name = make_autoname(self.doc.naming_series + '.####')
|
||||||
@@ -33,7 +33,10 @@ class DocType(DocListController):
|
|||||||
self.validate_email()
|
self.validate_email()
|
||||||
self.validate_status()
|
self.validate_status()
|
||||||
self.validate_employee_leave_approver()
|
self.validate_employee_leave_approver()
|
||||||
self.update_dob_event()
|
|
||||||
|
if self.doc.user_id:
|
||||||
|
self.validate_for_enabled_user_id()
|
||||||
|
self.validate_duplicate_user_id()
|
||||||
|
|
||||||
def on_update(self):
|
def on_update(self):
|
||||||
if self.doc.user_id:
|
if self.doc.user_id:
|
||||||
@@ -41,6 +44,7 @@ class DocType(DocListController):
|
|||||||
self.update_user_default()
|
self.update_user_default()
|
||||||
self.update_profile()
|
self.update_profile()
|
||||||
|
|
||||||
|
self.update_dob_event()
|
||||||
self.restrict_leave_approver()
|
self.restrict_leave_approver()
|
||||||
|
|
||||||
def restrict_user(self):
|
def restrict_user(self):
|
||||||
@@ -111,41 +115,53 @@ class DocType(DocListController):
|
|||||||
|
|
||||||
def validate_date(self):
|
def validate_date(self):
|
||||||
if self.doc.date_of_birth and self.doc.date_of_joining and getdate(self.doc.date_of_birth) >= getdate(self.doc.date_of_joining):
|
if self.doc.date_of_birth and self.doc.date_of_joining and getdate(self.doc.date_of_birth) >= getdate(self.doc.date_of_joining):
|
||||||
msgprint('Date of Joining must be greater than Date of Birth')
|
throw(_("Date of Joining must be greater than Date of Birth"))
|
||||||
raise Exception
|
|
||||||
|
|
||||||
elif self.doc.scheduled_confirmation_date and self.doc.date_of_joining and (getdate(self.doc.scheduled_confirmation_date) < getdate(self.doc.date_of_joining)):
|
elif self.doc.scheduled_confirmation_date and self.doc.date_of_joining and (getdate(self.doc.scheduled_confirmation_date) < getdate(self.doc.date_of_joining)):
|
||||||
msgprint('Scheduled Confirmation Date must be greater than Date of Joining')
|
throw(_("Scheduled Confirmation Date must be greater than Date of Joining"))
|
||||||
raise Exception
|
|
||||||
|
|
||||||
elif self.doc.final_confirmation_date and self.doc.date_of_joining and (getdate(self.doc.final_confirmation_date) < getdate(self.doc.date_of_joining)):
|
elif self.doc.final_confirmation_date and self.doc.date_of_joining and (getdate(self.doc.final_confirmation_date) < getdate(self.doc.date_of_joining)):
|
||||||
msgprint('Final Confirmation Date must be greater than Date of Joining')
|
throw(_("Final Confirmation Date must be greater than Date of Joining"))
|
||||||
raise Exception
|
|
||||||
|
|
||||||
elif self.doc.date_of_retirement and self.doc.date_of_joining and (getdate(self.doc.date_of_retirement) <= getdate(self.doc.date_of_joining)):
|
elif self.doc.date_of_retirement and self.doc.date_of_joining and (getdate(self.doc.date_of_retirement) <= getdate(self.doc.date_of_joining)):
|
||||||
msgprint('Date Of Retirement must be greater than Date of Joining')
|
throw(_("Date Of Retirement must be greater than Date of Joining"))
|
||||||
raise Exception
|
|
||||||
|
|
||||||
elif self.doc.relieving_date and self.doc.date_of_joining and (getdate(self.doc.relieving_date) <= getdate(self.doc.date_of_joining)):
|
elif self.doc.relieving_date and self.doc.date_of_joining and (getdate(self.doc.relieving_date) <= getdate(self.doc.date_of_joining)):
|
||||||
msgprint('Relieving Date must be greater than Date of Joining')
|
throw(_("Relieving Date must be greater than Date of Joining"))
|
||||||
raise Exception
|
|
||||||
|
|
||||||
elif self.doc.contract_end_date and self.doc.date_of_joining and (getdate(self.doc.contract_end_date)<=getdate(self.doc.date_of_joining)):
|
elif self.doc.contract_end_date and self.doc.date_of_joining and (getdate(self.doc.contract_end_date)<=getdate(self.doc.date_of_joining)):
|
||||||
msgprint('Contract End Date must be greater than Date of Joining')
|
throw(_("Contract End Date must be greater than Date of Joining"))
|
||||||
raise Exception
|
|
||||||
|
|
||||||
def validate_email(self):
|
def validate_email(self):
|
||||||
if self.doc.company_email and not validate_email_add(self.doc.company_email):
|
if self.doc.company_email and not validate_email_add(self.doc.company_email):
|
||||||
msgprint("Please enter valid Company Email")
|
throw(_("Please enter valid Company Email"))
|
||||||
raise Exception
|
|
||||||
if self.doc.personal_email and not validate_email_add(self.doc.personal_email):
|
if self.doc.personal_email and not validate_email_add(self.doc.personal_email):
|
||||||
msgprint("Please enter valid Personal Email")
|
throw(_("Please enter valid Personal Email"))
|
||||||
raise Exception
|
|
||||||
|
|
||||||
def validate_status(self):
|
def validate_status(self):
|
||||||
if self.doc.status == 'Left' and not self.doc.relieving_date:
|
if self.doc.status == 'Left' and not self.doc.relieving_date:
|
||||||
msgprint("Please enter relieving date.")
|
throw(_("Please enter relieving date."))
|
||||||
raise Exception
|
|
||||||
|
def validate_for_enabled_user_id(self):
|
||||||
|
enabled = webnotes.conn.sql("""select name from `tabProfile` where
|
||||||
|
name=%s and enabled=1""", self.doc.user_id)
|
||||||
|
if not enabled:
|
||||||
|
throw("{id}: {user_id} {msg}".format(**{
|
||||||
|
"id": _("User ID"),
|
||||||
|
"user_id": self.doc.user_id,
|
||||||
|
"msg": _("is disabled.")
|
||||||
|
}))
|
||||||
|
|
||||||
|
def validate_duplicate_user_id(self):
|
||||||
|
employee = webnotes.conn.sql_list("""select name from `tabEmployee` where
|
||||||
|
user_id=%s and status='Active' and name!=%s""", (self.doc.user_id, self.doc.name))
|
||||||
|
if employee:
|
||||||
|
throw("{id}: {user_id} {msg}: {employee}".format(**{
|
||||||
|
"id": _("User ID"),
|
||||||
|
"user_id": self.doc.user_id,
|
||||||
|
"msg": _("is already assigned to Employee"),
|
||||||
|
"employee": employee[0]
|
||||||
|
}))
|
||||||
|
|
||||||
def validate_employee_leave_approver(self):
|
def validate_employee_leave_approver(self):
|
||||||
from webnotes.profile import Profile
|
from webnotes.profile import Profile
|
||||||
@@ -153,8 +169,8 @@ class DocType(DocListController):
|
|||||||
|
|
||||||
for l in self.doclist.get({"parentfield": "employee_leave_approvers"}):
|
for l in self.doclist.get({"parentfield": "employee_leave_approvers"}):
|
||||||
if "Leave Approver" not in Profile(l.leave_approver).get_roles():
|
if "Leave Approver" not in Profile(l.leave_approver).get_roles():
|
||||||
msgprint(_("Invalid Leave Approver") + ": \"" + l.leave_approver + "\"",
|
throw(_("Invalid Leave Approver") + ": \"" + l.leave_approver + "\"",
|
||||||
raise_exception=InvalidLeaveApproverError)
|
exc=InvalidLeaveApproverError)
|
||||||
|
|
||||||
def update_dob_event(self):
|
def update_dob_event(self):
|
||||||
if self.doc.status == "Active" and self.doc.date_of_birth \
|
if self.doc.status == "Active" and self.doc.date_of_birth \
|
||||||
|
|||||||
@@ -8,9 +8,7 @@ from webnotes.utils import add_days, add_years, cint, getdate
|
|||||||
from webnotes.model import db_exists
|
from webnotes.model import db_exists
|
||||||
from webnotes.model.doc import addchild, make_autoname
|
from webnotes.model.doc import addchild, make_autoname
|
||||||
from webnotes.model.bean import copy_doclist
|
from webnotes.model.bean import copy_doclist
|
||||||
from webnotes import msgprint
|
from webnotes import msgprint, throw, _
|
||||||
|
|
||||||
|
|
||||||
import datetime
|
import datetime
|
||||||
|
|
||||||
class DocType:
|
class DocType:
|
||||||
@@ -19,7 +17,7 @@ class DocType:
|
|||||||
self.doclist = doclist
|
self.doclist = doclist
|
||||||
|
|
||||||
def autoname(self):
|
def autoname(self):
|
||||||
self.doc.name = make_autoname(self.doc.fiscal_year +"/"+ self.doc.holiday_list_name+"/.###")
|
self.doc.name = make_autoname(self.doc.fiscal_year + "/" + self.doc.holiday_list_name + "/.###")
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
self.update_default_holiday_list()
|
self.update_default_holiday_list()
|
||||||
@@ -38,11 +36,9 @@ class DocType:
|
|||||||
|
|
||||||
def validate_values(self):
|
def validate_values(self):
|
||||||
if not self.doc.fiscal_year:
|
if not self.doc.fiscal_year:
|
||||||
msgprint("Please select Fiscal Year")
|
throw(_("Please select Fiscal Year"))
|
||||||
raise Exception
|
|
||||||
if not self.doc.weekly_off:
|
if not self.doc.weekly_off:
|
||||||
msgprint("Please select weekly off day")
|
throw(_("Please select weekly off day"))
|
||||||
raise Exception
|
|
||||||
|
|
||||||
def get_fy_start_end_dates(self):
|
def get_fy_start_end_dates(self):
|
||||||
return webnotes.conn.sql("""select year_start_date, year_end_date
|
return webnotes.conn.sql("""select year_start_date, year_end_date
|
||||||
|
|||||||
@@ -1,31 +1,27 @@
|
|||||||
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||||
// License: GNU General Public License v3. See license.txt
|
// License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
cur_frm.cscript.onload = function(doc,dt,dn){
|
cur_frm.cscript.onload = function(doc, dt, dn){
|
||||||
if(!doc.posting_date) set_multiple(dt,dn,{posting_date:get_today()});
|
if(!doc.posting_date)
|
||||||
if(!doc.leave_transaction_type) set_multiple(dt,dn,{leave_transaction_type:'Allocation'});
|
set_multiple(dt, dn, {posting_date: get_today()});
|
||||||
|
if(!doc.leave_transaction_type)
|
||||||
|
set_multiple(dt, dn, {leave_transaction_type: 'Allocation'});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Validation For To Date
|
|
||||||
// ================================================================================================
|
|
||||||
cur_frm.cscript.to_date = function(doc, cdt, cdn) {
|
cur_frm.cscript.to_date = function(doc, cdt, cdn) {
|
||||||
return $c('runserverobj', args={'method':'to_date_validation','docs':wn.model.compress(make_doclist(doc.doctype, doc.name))},
|
return $c('runserverobj', args={'method':'to_date_validation','docs':wn.model.compress(make_doclist(doc.doctype, doc.name))},
|
||||||
function(r, rt) {
|
function(r, rt) {
|
||||||
var doc = locals[cdt][cdn];
|
var doc = locals[cdt][cdn];
|
||||||
if (r.message) {
|
if (r.message) {
|
||||||
alert(wn._("To date cannot be before from date"));
|
msgprint(wn._("To date cannot be before from date"));
|
||||||
doc.to_date = '';
|
doc.to_date = '';
|
||||||
refresh_field('to_date');
|
refresh_field('to_date');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocation Type
|
|
||||||
// ================================================================================================
|
|
||||||
cur_frm.cscript.allocation_type = function (doc, cdt, cdn){
|
cur_frm.cscript.allocation_type = function (doc, cdt, cdn){
|
||||||
doc.no_of_days = '';
|
doc.no_of_days = '';
|
||||||
refresh_field('no_of_days');
|
refresh_field('no_of_days');
|
||||||
}
|
}
|
||||||
@@ -2,21 +2,18 @@ erpnext.patches.1401.enable_all_price_list
|
|||||||
erpnext.patches.4_0.update_user_properties
|
erpnext.patches.4_0.update_user_properties
|
||||||
erpnext.patches.4_0.move_warehouse_user_to_restrictions
|
erpnext.patches.4_0.move_warehouse_user_to_restrictions
|
||||||
erpnext.patches.4_0.new_permissions
|
erpnext.patches.4_0.new_permissions
|
||||||
|
erpnext.patches.4_0.update_incharge_name_to_sales_person_in_maintenance_schedule
|
||||||
execute:webnotes.reload_doc('accounts', 'doctype', 'sales_invoice') # 2014-01-03
|
execute:webnotes.reload_doc('accounts', 'doctype', 'sales_invoice') # 2014-01-29
|
||||||
execute:webnotes.reload_doc('selling', 'doctype', 'sales_order') # 2014-01-03
|
execute:webnotes.reload_doc('selling', 'doctype', 'sales_order') # 2014-01-29
|
||||||
execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2014-01-03
|
execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2014-01-29
|
||||||
execute:webnotes.reload_doc('stock', 'doctype', 'delivery_note') # 2014-01-03
|
execute:webnotes.reload_doc('stock', 'doctype', 'delivery_note') # 2014-01-29
|
||||||
execute:webnotes.reload_doc('accounts', 'Print Format', 'POS Invoice') # 2014-01-03
|
erpnext.patches.4_0.reload_sales_print_format
|
||||||
execute:webnotes.reload_doc('accounts', 'Print Format', 'Sales Invoice Classic') # 2014-01-03
|
execute:webnotes.reload_doc('accounts', 'doctype', 'purchase_invoice') # 2014-01-29
|
||||||
execute:webnotes.reload_doc('accounts', 'Print Format', 'Sales Invoice Modern') # 2014-01-03
|
execute:webnotes.reload_doc('buying', 'doctype', 'purchase_order') # 2014-01-29
|
||||||
execute:webnotes.reload_doc('accounts', 'Print Format', 'Sales Invoice Spartan') # 2014-01-03
|
execute:webnotes.reload_doc('buying', 'doctype', 'supplier_quotation') # 2014-01-29
|
||||||
execute:webnotes.reload_doc('selling', 'Print Format', 'Quotation Classic') # 2014-01-03
|
execute:webnotes.reload_doc('stock', 'doctype', 'purchase_receipt') # 2014-01-29
|
||||||
execute:webnotes.reload_doc('selling', 'Print Format', 'Quotation Modern') # 2014-01-03
|
erpnext.patches.4_0.reload_purchase_print_format
|
||||||
execute:webnotes.reload_doc('selling', 'Print Format', 'Quotation Spartan') # 2014-01-03
|
execute:webnotes.reload_doc('accounts', 'doctype', 'pos_setting') # 2014-01-29
|
||||||
execute:webnotes.reload_doc('selling', 'Print Format', 'Sales Order Classic') # 2014-01-03
|
execute:webnotes.reload_doc('selling', 'doctype', 'customer') # 2014-01-29
|
||||||
execute:webnotes.reload_doc('selling', 'Print Format', 'Sales Order Modern') # 2014-01-03
|
execute:webnotes.reload_doc('buying', 'doctype', 'supplier') # 2014-01-29
|
||||||
execute:webnotes.reload_doc('selling', 'Print Format', 'Sales Order Spartan') # 2014-01-03
|
erpnext.patches.4_0.map_charge_to_taxes_and_charges
|
||||||
execute:webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Classic') # 2014-01-03
|
|
||||||
execute:webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Modern') # 2014-01-03
|
|
||||||
execute:webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Spartan') # 2014-01-03
|
|
||||||
16
erpnext/patches/4_0/map_charge_to_taxes_and_charges.py
Normal file
16
erpnext/patches/4_0/map_charge_to_taxes_and_charges.py
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||||
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import webnotes
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
# udpate sales cycle
|
||||||
|
for d in ['Sales Invoice', 'Sales Order', 'Quotation', 'Delivery Note']:
|
||||||
|
webnotes.conn.sql("""update `tab%s` set taxes_and_charges=charge""" % d)
|
||||||
|
|
||||||
|
# udpate purchase cycle
|
||||||
|
for d in ['Purchase Invoice', 'Purchase Order', 'Supplier Quotation', 'Purchase Receipt']:
|
||||||
|
webnotes.conn.sql("""update `tab%s` set taxes_and_charges=purchase_other_charges""" % d)
|
||||||
|
|
||||||
|
webnotes.conn.sql("""update `tabPurchase Taxes and Charges` set parentfield='other_charges'""")
|
||||||
10
erpnext/patches/4_0/reload_purchase_print_format.py
Normal file
10
erpnext/patches/4_0/reload_purchase_print_format.py
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||||
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import webnotes
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
webnotes.reload_doc('buying', 'Print Format', 'Purchase Order Classic')
|
||||||
|
webnotes.reload_doc('buying', 'Print Format', 'Purchase Order Modern')
|
||||||
|
webnotes.reload_doc('buying', 'Print Format', 'Purchase Order Spartan')
|
||||||
20
erpnext/patches/4_0/reload_sales_print_format.py
Normal file
20
erpnext/patches/4_0/reload_sales_print_format.py
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||||
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import webnotes
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
webnotes.reload_doc('accounts', 'Print Format', 'POS Invoice')
|
||||||
|
webnotes.reload_doc('accounts', 'Print Format', 'Sales Invoice Classic')
|
||||||
|
webnotes.reload_doc('accounts', 'Print Format', 'Sales Invoice Modern')
|
||||||
|
webnotes.reload_doc('accounts', 'Print Format', 'Sales Invoice Spartan')
|
||||||
|
webnotes.reload_doc('selling', 'Print Format', 'Quotation Classic')
|
||||||
|
webnotes.reload_doc('selling', 'Print Format', 'Quotation Modern')
|
||||||
|
webnotes.reload_doc('selling', 'Print Format', 'Quotation Spartan')
|
||||||
|
webnotes.reload_doc('selling', 'Print Format', 'Sales Order Classic')
|
||||||
|
webnotes.reload_doc('selling', 'Print Format', 'Sales Order Modern')
|
||||||
|
webnotes.reload_doc('selling', 'Print Format', 'Sales Order Spartan')
|
||||||
|
webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Classic')
|
||||||
|
webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Modern')
|
||||||
|
webnotes.reload_doc('stock', 'Print Format', 'Delivery Note Spartan')
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||||
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import webnotes
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
webnotes.reload_doc("support", "doctype", "maintenance_schedule_detail")
|
||||||
|
webnotes.reload_doc("support", "doctype", "maintenance_schedule_item")
|
||||||
|
|
||||||
|
webnotes.conn.sql("""update `tabMaintenance Schedule Detail` set sales_person=incharge_name""")
|
||||||
|
webnotes.conn.sql("""update `tabMaintenance Schedule Item` set sales_person=incharge_name""")
|
||||||
@@ -271,4 +271,6 @@ patch_list = [
|
|||||||
"execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2013-12-26",
|
"execute:webnotes.reload_doc('selling', 'doctype', 'quotation') # 2013-12-26",
|
||||||
"execute:webnotes.reload_doc('stock', 'doctype', 'delivery_note') # 2013-12-26",
|
"execute:webnotes.reload_doc('stock', 'doctype', 'delivery_note') # 2013-12-26",
|
||||||
"patches.1401.enable_all_price_list",
|
"patches.1401.enable_all_price_list",
|
||||||
|
"patches.1401.fix_serial_no_status_and_warehouse",
|
||||||
|
"patches.1401.fix_planned_qty",
|
||||||
]
|
]
|
||||||
@@ -33,7 +33,7 @@ $.extend(erpnext.queries, {
|
|||||||
},
|
},
|
||||||
|
|
||||||
task: function() {
|
task: function() {
|
||||||
return { query: "projects.utils.query_task" };
|
return { query: "erpnext.projects.utils.query_task" };
|
||||||
},
|
},
|
||||||
|
|
||||||
customer_filter: function(doc) {
|
customer_filter: function(doc) {
|
||||||
@@ -54,8 +54,16 @@ $.extend(erpnext.queries, {
|
|||||||
return { filters: { supplier: doc.supplier } };
|
return { filters: { supplier: doc.supplier } };
|
||||||
},
|
},
|
||||||
|
|
||||||
|
lead_filter: function(doc) {
|
||||||
|
if(!doc.lead) {
|
||||||
|
wn.throw(wn._("Please specify a") + " " +
|
||||||
|
wn._(wn.meta.get_label(doc.doctype, "lead", doc.name)));
|
||||||
|
}
|
||||||
|
|
||||||
|
return { filters: { lead: doc.lead } };
|
||||||
|
},
|
||||||
|
|
||||||
not_a_group_filter: function() {
|
not_a_group_filter: function() {
|
||||||
return { filters: { is_group: "No" } };
|
return { filters: { is_group: "No" } };
|
||||||
},
|
},
|
||||||
|
|
||||||
});
|
});
|
||||||
@@ -708,4 +708,26 @@ erpnext.TransactionController = erpnext.stock.StockController.extend({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
taxes_and_charges: function() {
|
||||||
|
var me = this;
|
||||||
|
if(this.frm.doc.taxes_and_charges) {
|
||||||
|
return this.frm.call({
|
||||||
|
doc: this.frm.doc,
|
||||||
|
method: "get_other_charges",
|
||||||
|
callback: function(r) {
|
||||||
|
if(!r.exc) {
|
||||||
|
me.calculate_taxes_and_totals();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
show_item_wise_taxes: function() {
|
||||||
|
if(this.frm.fields_dict.other_charges_calculation) {
|
||||||
|
$(this.get_item_wise_taxes_html())
|
||||||
|
.appendTo($(this.frm.fields_dict.other_charges_calculation.wrapper).empty());
|
||||||
|
}
|
||||||
|
},
|
||||||
});
|
});
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-06-11 14:26:44",
|
"creation": "2013-06-11 14:26:44",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2014-01-20 17:48:32",
|
"modified": "2014-01-28 19:06:18",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -26,6 +26,7 @@
|
|||||||
"parenttype": "DocType"
|
"parenttype": "DocType"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"cancel": 0,
|
||||||
"doctype": "DocPerm",
|
"doctype": "DocPerm",
|
||||||
"name": "__common__",
|
"name": "__common__",
|
||||||
"parent": "Customer",
|
"parent": "Customer",
|
||||||
@@ -252,6 +253,14 @@
|
|||||||
"options": "Price List",
|
"options": "Price List",
|
||||||
"permlevel": 0
|
"permlevel": 0
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"doctype": "DocField",
|
||||||
|
"fieldname": "default_taxes_and_charges",
|
||||||
|
"fieldtype": "Link",
|
||||||
|
"label": "Taxes and Charges",
|
||||||
|
"options": "Sales Taxes and Charges Master",
|
||||||
|
"permlevel": 0
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "credit_days",
|
"fieldname": "credit_days",
|
||||||
@@ -343,7 +352,6 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"amend": 0,
|
"amend": 0,
|
||||||
"cancel": 0,
|
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 0,
|
"delete": 0,
|
||||||
"doctype": "DocPerm",
|
"doctype": "DocPerm",
|
||||||
@@ -363,7 +371,6 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"amend": 0,
|
"amend": 0,
|
||||||
"cancel": 0,
|
|
||||||
"create": 1,
|
"create": 1,
|
||||||
"delete": 1,
|
"delete": 1,
|
||||||
"doctype": "DocPerm",
|
"doctype": "DocPerm",
|
||||||
|
|||||||
@@ -7,18 +7,18 @@
|
|||||||
wn.provide("erpnext");
|
wn.provide("erpnext");
|
||||||
erpnext.LeadController = wn.ui.form.Controller.extend({
|
erpnext.LeadController = wn.ui.form.Controller.extend({
|
||||||
setup: function() {
|
setup: function() {
|
||||||
this.frm.fields_dict.customer.get_query = function(doc,cdt,cdn) {
|
this.frm.fields_dict.customer.get_query = function(doc, cdt, cdn) {
|
||||||
return { query: "erpnext.controllers.queries.customer_query" } }
|
return { query: "erpnext.controllers.queries.customer_query" } }
|
||||||
},
|
},
|
||||||
|
|
||||||
onload: function() {
|
onload: function() {
|
||||||
if(cur_frm.fields_dict.lead_owner.df.options.match(/^Profile/)) {
|
if(cur_frm.fields_dict.lead_owner.df.options.match(/^Profile/)) {
|
||||||
cur_frm.fields_dict.lead_owner.get_query = function(doc,cdt,cdn) {
|
cur_frm.fields_dict.lead_owner.get_query = function(doc, cdt, cdn) {
|
||||||
return { query:"webnotes.core.doctype.profile.profile.profile_query" } }
|
return { query:"webnotes.core.doctype.profile.profile.profile_query" } }
|
||||||
}
|
}
|
||||||
|
|
||||||
if(cur_frm.fields_dict.contact_by.df.options.match(/^Profile/)) {
|
if(cur_frm.fields_dict.contact_by.df.options.match(/^Profile/)) {
|
||||||
cur_frm.fields_dict.contact_by.get_query = function(doc,cdt,cdn) {
|
cur_frm.fields_dict.contact_by.get_query = function(doc, cdt, cdn) {
|
||||||
return { query:"webnotes.core.doctype.profile.profile.profile_query" } }
|
return { query:"webnotes.core.doctype.profile.profile.profile_query" } }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -15,13 +15,13 @@ erpnext.selling.Opportunity = wn.ui.form.Controller.extend({
|
|||||||
if(!this.frm.doc.enquiry_from)
|
if(!this.frm.doc.enquiry_from)
|
||||||
hide_field(['customer', 'customer_address', 'contact_person', 'customer_name','lead', 'address_display', 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']);
|
hide_field(['customer', 'customer_address', 'contact_person', 'customer_name','lead', 'address_display', 'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']);
|
||||||
if(!this.frm.doc.status)
|
if(!this.frm.doc.status)
|
||||||
set_multiple(cdt,cdn,{status:'Draft'});
|
set_multiple(cdt, cdn, { status:'Draft' });
|
||||||
if(!this.frm.doc.date)
|
if(!this.frm.doc.date)
|
||||||
this.frm.doc.transaction_date = date.obj_to_str(new Date());
|
this.frm.doc.transaction_date = date.obj_to_str(new Date());
|
||||||
if(!this.frm.doc.company && wn.defaults.get_default("company"))
|
if(!this.frm.doc.company && wn.defaults.get_default("company"))
|
||||||
set_multiple(cdt,cdn,{company:wn.defaults.get_default("company")});
|
set_multiple(cdt, cdn, { company:wn.defaults.get_default("company") });
|
||||||
if(!this.frm.doc.fiscal_year && sys_defaults.fiscal_year)
|
if(!this.frm.doc.fiscal_year && sys_defaults.fiscal_year)
|
||||||
set_multiple(cdt,cdn,{fiscal_year:sys_defaults.fiscal_year});
|
set_multiple(cdt, cdn, { fiscal_year:sys_defaults.fiscal_year });
|
||||||
|
|
||||||
if(this.frm.doc.enquiry_from) {
|
if(this.frm.doc.enquiry_from) {
|
||||||
if(this.frm.doc.enquiry_from == 'Customer') {
|
if(this.frm.doc.enquiry_from == 'Customer') {
|
||||||
@@ -99,15 +99,15 @@ erpnext.selling.Opportunity = wn.ui.form.Controller.extend({
|
|||||||
|
|
||||||
$.extend(cur_frm.cscript, new erpnext.selling.Opportunity({frm: cur_frm}));
|
$.extend(cur_frm.cscript, new erpnext.selling.Opportunity({frm: cur_frm}));
|
||||||
|
|
||||||
cur_frm.cscript.refresh = function(doc, cdt, cdn){
|
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
|
||||||
erpnext.hide_naming_series();
|
erpnext.hide_naming_series();
|
||||||
cur_frm.clear_custom_buttons();
|
cur_frm.clear_custom_buttons();
|
||||||
|
|
||||||
if(doc.docstatus === 1 && doc.status!=="Lost") {
|
if(doc.docstatus === 1 && doc.status!=="Lost") {
|
||||||
cur_frm.add_custom_button(wn._('Create Quotation'), cur_frm.cscript.create_quotation);
|
cur_frm.add_custom_button(wn._('Create Quotation'), cur_frm.cscript.create_quotation);
|
||||||
if(doc.status!=="Quotation") {
|
if(doc.status!=="Quotation")
|
||||||
cur_frm.add_custom_button(wn._('Opportunity Lost'), cur_frm.cscript['Declare Opportunity Lost']);
|
cur_frm.add_custom_button(wn._('Opportunity Lost'), cur_frm.cscript['Declare Opportunity Lost']);
|
||||||
}
|
|
||||||
cur_frm.add_custom_button(wn._('Send SMS'), cur_frm.cscript.send_sms, "icon-mobile-phone");
|
cur_frm.add_custom_button(wn._('Send SMS'), cur_frm.cscript.send_sms, "icon-mobile-phone");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -116,31 +116,29 @@ cur_frm.cscript.refresh = function(doc, cdt, cdn){
|
|||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) {
|
cur_frm.cscript.onload_post_render = function(doc, cdt, cdn) {
|
||||||
if(doc.enquiry_from == 'Lead' && doc.lead) {
|
if(doc.enquiry_from == 'Lead' && doc.lead)
|
||||||
cur_frm.cscript.lead(doc,cdt,cdn);
|
cur_frm.cscript.lead(doc, cdt, cdn);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.item_code = function(doc, cdt, cdn) {
|
cur_frm.cscript.item_code = function(doc, cdt, cdn) {
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
if (d.item_code) {
|
if (d.item_code)
|
||||||
return get_server_fields('get_item_details',d.item_code, 'enquiry_details',doc, cdt,cdn,1);
|
return get_server_fields('get_item_details', d.item_code, 'enquiry_details', doc, cdt, cdn, 1);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// hide - unhide fields on basis of enquiry_from lead or customer
|
// hide - unhide fields on basis of enquiry_from lead or customer
|
||||||
cur_frm.cscript.enquiry_from = function(doc,cdt,cdn){
|
cur_frm.cscript.enquiry_from = function(doc, cdt, cdn) {
|
||||||
cur_frm.cscript.lead_cust_show(doc,cdt,cdn);
|
cur_frm.cscript.lead_cust_show(doc, cdt, cdn);
|
||||||
}
|
}
|
||||||
|
|
||||||
// hide - unhide fields based on lead or customer
|
// hide - unhide fields based on lead or customer
|
||||||
cur_frm.cscript.lead_cust_show = function(doc,cdt,cdn){
|
cur_frm.cscript.lead_cust_show = function(doc, cdt, cdn) {
|
||||||
if(doc.enquiry_from == 'Lead'){
|
if(doc.enquiry_from == 'Lead') {
|
||||||
unhide_field(['lead']);
|
unhide_field(['lead']);
|
||||||
hide_field(['customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
|
hide_field(['customer','customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
|
||||||
doc.lead = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = "";
|
doc.lead = doc.customer = doc.customer_address = doc.contact_person = doc.address_display = doc.contact_display = doc.contact_mobile = doc.contact_email = doc.territory = doc.customer_group = "";
|
||||||
}
|
}
|
||||||
else if(doc.enquiry_from == 'Customer'){
|
else if(doc.enquiry_from == 'Customer') {
|
||||||
unhide_field(['customer']);
|
unhide_field(['customer']);
|
||||||
hide_field(['lead', 'address_display', 'contact_display', 'contact_mobile',
|
hide_field(['lead', 'address_display', 'contact_display', 'contact_mobile',
|
||||||
'contact_email', 'territory', 'customer_group']);
|
'contact_email', 'territory', 'customer_group']);
|
||||||
@@ -164,15 +162,13 @@ cur_frm.cscript.lead = function(doc, cdt, cdn) {
|
|||||||
wn.model.map_current_doc({
|
wn.model.map_current_doc({
|
||||||
method: "erpnext.selling.doctype.lead.lead.make_opportunity",
|
method: "erpnext.selling.doctype.lead.lead.make_opportunity",
|
||||||
source_name: cur_frm.doc.lead
|
source_name: cur_frm.doc.lead
|
||||||
})
|
});
|
||||||
|
|
||||||
unhide_field(['customer_name', 'address_display','contact_mobile', 'customer_address',
|
unhide_field(['customer_name', 'address_display','contact_mobile', 'customer_address',
|
||||||
'contact_email', 'territory']);
|
'contact_email', 'territory']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cur_frm.cscript['Declare Opportunity Lost'] = function() {
|
||||||
|
|
||||||
cur_frm.cscript['Declare Opportunity Lost'] = function(){
|
|
||||||
var dialog = new wn.ui.Dialog({
|
var dialog = new wn.ui.Dialog({
|
||||||
title: wn._("Set as Lost"),
|
title: wn._("Set as Lost"),
|
||||||
fields: [
|
fields: [
|
||||||
@@ -200,5 +196,4 @@ cur_frm.cscript['Declare Opportunity Lost'] = function(){
|
|||||||
})
|
})
|
||||||
});
|
});
|
||||||
dialog.show();
|
dialog.show();
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -15,12 +15,21 @@ cur_frm.cscript.sales_team_fname = "sales_team";
|
|||||||
|
|
||||||
erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({
|
erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({
|
||||||
onload: function(doc, dt, dn) {
|
onload: function(doc, dt, dn) {
|
||||||
|
var me = this;
|
||||||
this._super(doc, dt, dn);
|
this._super(doc, dt, dn);
|
||||||
if(doc.customer && !doc.quotation_to)
|
if(doc.customer && !doc.quotation_to)
|
||||||
doc.quotation_to = "Customer";
|
doc.quotation_to = "Customer";
|
||||||
else if(doc.lead && !doc.quotation_to)
|
else if(doc.lead && !doc.quotation_to)
|
||||||
doc.quotation_to = "Lead";
|
doc.quotation_to = "Lead";
|
||||||
|
|
||||||
|
// to overwrite the customer_filter trigger from queries.js
|
||||||
|
if (doc.lead) {
|
||||||
|
$.each(["customer_address", "shipping_address_name"],
|
||||||
|
function(i, opts) {
|
||||||
|
me.frm.set_query(opts, erpnext.queries["lead_filter"]);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
},
|
},
|
||||||
refresh: function(doc, dt, dn) {
|
refresh: function(doc, dt, dn) {
|
||||||
this._super(doc, dt, dn);
|
this._super(doc, dt, dn);
|
||||||
@@ -68,6 +77,12 @@ erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({
|
|||||||
quotation_to: function() {
|
quotation_to: function() {
|
||||||
this.frm.toggle_reqd("lead", this.frm.doc.quotation_to == "Lead");
|
this.frm.toggle_reqd("lead", this.frm.doc.quotation_to == "Lead");
|
||||||
this.frm.toggle_reqd("customer", this.frm.doc.quotation_to == "Customer");
|
this.frm.toggle_reqd("customer", this.frm.doc.quotation_to == "Customer");
|
||||||
|
if (this.frm.doc.quotation_to == "Lead") {
|
||||||
|
this.frm.set_value("customer", null);
|
||||||
|
this.frm.set_value("contact_person", null);
|
||||||
|
}
|
||||||
|
else if (this.frm.doc.quotation_to == "Customer")
|
||||||
|
this.frm.set_value("lead", null);
|
||||||
},
|
},
|
||||||
|
|
||||||
tc_name: function() {
|
tc_name: function() {
|
||||||
@@ -90,7 +105,8 @@ erpnext.selling.QuotationController = erpnext.selling.SellingController.extend({
|
|||||||
cur_frm.script_manager.make(erpnext.selling.QuotationController);
|
cur_frm.script_manager.make(erpnext.selling.QuotationController);
|
||||||
|
|
||||||
cur_frm.fields_dict.lead.get_query = function(doc,cdt,cdn) {
|
cur_frm.fields_dict.lead.get_query = function(doc,cdt,cdn) {
|
||||||
return{ query: "erpnext.controllers.queries.lead_query" } }
|
return{ query: "erpnext.controllers.queries.lead_query" }
|
||||||
|
}
|
||||||
|
|
||||||
cur_frm.cscript.lead = function(doc, cdt, cdn) {
|
cur_frm.cscript.lead = function(doc, cdt, cdn) {
|
||||||
if(doc.lead) {
|
if(doc.lead) {
|
||||||
@@ -152,7 +168,6 @@ cur_frm.cscript['Declare Order Lost'] = function(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.on_submit = function(doc, cdt, cdn) {
|
cur_frm.cscript.on_submit = function(doc, cdt, cdn) {
|
||||||
if(cint(wn.boot.notification_settings.quotation)) {
|
if(cint(wn.boot.notification_settings.quotation))
|
||||||
cur_frm.email_doc(wn.boot.notification_settings.quotation_message);
|
cur_frm.email_doc(wn.boot.notification_settings.quotation_message);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -3,14 +3,11 @@
|
|||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import webnotes
|
import webnotes
|
||||||
|
|
||||||
from webnotes.utils import cstr
|
from webnotes.utils import cstr
|
||||||
from webnotes.model.bean import getlist
|
from webnotes.model.bean import getlist
|
||||||
from webnotes.model.code import get_obj
|
from webnotes.model.code import get_obj
|
||||||
from webnotes import _, msgprint
|
from webnotes import _, msgprint
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
from erpnext.controllers.selling_controller import SellingController
|
from erpnext.controllers.selling_controller import SellingController
|
||||||
|
|
||||||
class DocType(SellingController):
|
class DocType(SellingController):
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-05-24 19:29:08",
|
"creation": "2013-05-24 19:29:08",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2014-01-20 17:49:16",
|
"modified": "2014-01-31 19:42:32",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -373,17 +373,17 @@
|
|||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "taxes",
|
"fieldname": "taxes",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"label": "Taxes",
|
"label": "Taxes and Charges",
|
||||||
"oldfieldtype": "Section Break",
|
"oldfieldtype": "Section Break",
|
||||||
"options": "icon-money",
|
"options": "icon-money",
|
||||||
"read_only": 0
|
"read_only": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "charge",
|
"fieldname": "taxes_and_charges",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"hidden": 0,
|
"hidden": 0,
|
||||||
"label": "Tax Master",
|
"label": "Taxes and Charges",
|
||||||
"oldfieldname": "charge",
|
"oldfieldname": "charge",
|
||||||
"oldfieldtype": "Link",
|
"oldfieldtype": "Link",
|
||||||
"options": "Sales Taxes and Charges Master",
|
"options": "Sales Taxes and Charges Master",
|
||||||
@@ -674,6 +674,7 @@
|
|||||||
"read_only": 0
|
"read_only": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"depends_on": "eval:doc.customer",
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "contact_person",
|
"fieldname": "contact_person",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-06-18 12:39:59",
|
"creation": "2013-06-18 12:39:59",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2014-01-20 17:49:23",
|
"modified": "2014-01-28 18:47:42",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -398,16 +398,16 @@
|
|||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "taxes",
|
"fieldname": "taxes",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"label": "Taxes",
|
"label": "Taxes and Charges",
|
||||||
"oldfieldtype": "Section Break",
|
"oldfieldtype": "Section Break",
|
||||||
"options": "icon-money",
|
"options": "icon-money",
|
||||||
"print_hide": 0
|
"print_hide": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "charge",
|
"fieldname": "taxes_and_charges",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Tax Master",
|
"label": "Taxes and Charges",
|
||||||
"oldfieldname": "charge",
|
"oldfieldname": "charge",
|
||||||
"oldfieldtype": "Link",
|
"oldfieldtype": "Link",
|
||||||
"options": "Sales Taxes and Charges Master",
|
"options": "Sales Taxes and Charges Master",
|
||||||
@@ -928,11 +928,13 @@
|
|||||||
"write": 1
|
"write": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"cancel": 0,
|
||||||
"delete": 0,
|
"delete": 0,
|
||||||
"doctype": "DocPerm",
|
"doctype": "DocPerm",
|
||||||
"role": "Accounts User"
|
"role": "Accounts User"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"cancel": 0,
|
||||||
"delete": 0,
|
"delete": 0,
|
||||||
"doctype": "DocPerm",
|
"doctype": "DocPerm",
|
||||||
"role": "Customer"
|
"role": "Customer"
|
||||||
|
|||||||
17
erpnext/selling/doctype/sms_center/sms_center.js
Normal file
17
erpnext/selling/doctype/sms_center/sms_center.js
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||||
|
// License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
$.extend(cur_frm.cscript, {
|
||||||
|
message: function () {
|
||||||
|
var total_words = this.frm.doc.message.length;
|
||||||
|
var total_msg = 1;
|
||||||
|
|
||||||
|
if (total_words > 160) {
|
||||||
|
total_msg = cint(total_words / 160);
|
||||||
|
total_msg = (total_words % 160 == 0 ? total_msg : total_msg + 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.frm.set_value("total_words", total_words);
|
||||||
|
this.frm.set_value("total_messages", this.frm.doc.message ? total_msg : 0);
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -8,54 +8,65 @@ from webnotes.utils import cstr
|
|||||||
from webnotes.model import db_exists
|
from webnotes.model import db_exists
|
||||||
from webnotes.model.bean import copy_doclist
|
from webnotes.model.bean import copy_doclist
|
||||||
from webnotes.model.code import get_obj
|
from webnotes.model.code import get_obj
|
||||||
from webnotes import msgprint
|
from webnotes import msgprint, _
|
||||||
|
|
||||||
|
|
||||||
# ----------
|
|
||||||
|
|
||||||
class DocType:
|
class DocType:
|
||||||
def __init__(self, doc, doclist=[]):
|
def __init__(self, doc, doclist=[]):
|
||||||
self.doc = doc
|
self.doc = doc
|
||||||
self.doclist = doclist
|
self.doclist = doclist
|
||||||
|
|
||||||
def create_receiver_list(self):
|
def create_receiver_list(self):
|
||||||
rec, where_clause = '', ''
|
rec, where_clause = '', ''
|
||||||
if self.doc.send_to == 'All Customer Contact':
|
if self.doc.send_to == 'All Customer Contact':
|
||||||
where_clause = self.doc.customer and " and customer = '%s'" % self.doc.customer or " and ifnull(customer, '') != ''"
|
where_clause = self.doc.customer and " and customer = '%s'" % self.doc.customer or " and ifnull(customer, '') != ''"
|
||||||
if self.doc.send_to == 'All Supplier Contact':
|
if self.doc.send_to == 'All Supplier Contact':
|
||||||
where_clause = self.doc.supplier and " and ifnull(is_supplier, 0) = 1 and supplier = '%s'" % self.doc.supplier or " and ifnull(supplier, '') != ''"
|
where_clause = self.doc.supplier and " and ifnull(is_supplier, 0) = 1 and supplier = '%s'" % self.doc.supplier or " and ifnull(supplier, '') != ''"
|
||||||
if self.doc.send_to == 'All Sales Partner Contact':
|
if self.doc.send_to == 'All Sales Partner Contact':
|
||||||
where_clause = self.doc.sales_partner and " and ifnull(is_sales_partner, 0) = 1 and sales_partner = '%s'" % self.doc.sales_partner or " and ifnull(sales_partner, '') != ''"
|
where_clause = self.doc.sales_partner and " and ifnull(is_sales_partner, 0) = 1 and sales_partner = '%s'" % self.doc.sales_partner or " and ifnull(sales_partner, '') != ''"
|
||||||
|
|
||||||
if self.doc.send_to in ['All Contact', 'All Customer Contact', 'All Supplier Contact', 'All Sales Partner Contact']:
|
if self.doc.send_to in ['All Contact', 'All Customer Contact', 'All Supplier Contact', 'All Sales Partner Contact']:
|
||||||
rec = webnotes.conn.sql("select CONCAT(ifnull(first_name,''),'',ifnull(last_name,'')), mobile_no from `tabContact` where ifnull(mobile_no,'')!='' and docstatus != 2 %s" % where_clause)
|
rec = webnotes.conn.sql("""select CONCAT(ifnull(first_name,''), '', ifnull(last_name,'')),
|
||||||
elif self.doc.send_to == 'All Lead (Open)':
|
mobile_no from `tabContact` where ifnull(mobile_no,'')!='' and
|
||||||
rec = webnotes.conn.sql("select lead_name, mobile_no from tabLead where ifnull(mobile_no,'')!='' and docstatus != 2 and status = 'Open'")
|
docstatus != 2 %s""", where_clause)
|
||||||
elif self.doc.send_to == 'All Employee (Active)':
|
|
||||||
where_clause = self.doc.department and " and department = '%s'" % self.doc.department or ""
|
|
||||||
where_clause += self.doc.branch and " and branch = '%s'" % self.doc.branch or ""
|
|
||||||
rec = webnotes.conn.sql("select employee_name, cell_number from `tabEmployee` where status = 'Active' and docstatus < 2 and ifnull(cell_number,'')!='' %s" % where_clause)
|
|
||||||
elif self.doc.send_to == 'All Sales Person':
|
|
||||||
rec = webnotes.conn.sql("select sales_person_name, mobile_no from `tabSales Person` where docstatus != 2 and ifnull(mobile_no,'')!=''")
|
|
||||||
rec_list = ''
|
|
||||||
for d in rec:
|
|
||||||
rec_list += d[0] + ' - ' + d[1] + '\n'
|
|
||||||
self.doc.receiver_list = rec_list
|
|
||||||
|
|
||||||
def get_receiver_nos(self):
|
elif self.doc.send_to == 'All Lead (Open)':
|
||||||
receiver_nos = []
|
rec = webnotes.conn.sql("""select lead_name, mobile_no from `tabLead` where
|
||||||
for d in self.doc.receiver_list.split('\n'):
|
ifnull(mobile_no,'')!='' and docstatus != 2 and status='Open'""")
|
||||||
receiver_no = d
|
|
||||||
if '-' in d:
|
|
||||||
receiver_no = receiver_no.split('-')[1]
|
|
||||||
if receiver_no.strip():
|
|
||||||
receiver_nos.append(cstr(receiver_no).strip())
|
|
||||||
return receiver_nos
|
|
||||||
|
|
||||||
def send_sms(self):
|
elif self.doc.send_to == 'All Employee (Active)':
|
||||||
if not self.doc.message:
|
where_clause = self.doc.department and " and department = '%s'" % self.doc.department or ""
|
||||||
msgprint("Please enter message before sending")
|
where_clause += self.doc.branch and " and branch = '%s'" % self.doc.branch or ""
|
||||||
else:
|
rec = webnotes.conn.sql("""select employee_name, cell_number from
|
||||||
receiver_list = self.get_receiver_nos()
|
`tabEmployee` where status = 'Active' and docstatus < 2 and
|
||||||
if receiver_list:
|
ifnull(cell_number,'')!='' %s""", where_clause)
|
||||||
msgprint(get_obj('SMS Control', 'SMS Control').send_sms(receiver_list, cstr(self.doc.message)))
|
|
||||||
|
elif self.doc.send_to == 'All Sales Person':
|
||||||
|
rec = webnotes.conn.sql("""select sales_person_name, mobile_no from
|
||||||
|
`tabSales Person` where docstatus!=2 and ifnull(mobile_no,'')!=''""")
|
||||||
|
rec_list = ''
|
||||||
|
|
||||||
|
for d in rec:
|
||||||
|
rec_list += d[0] + ' - ' + d[1] + '\n'
|
||||||
|
self.doc.receiver_list = rec_list
|
||||||
|
|
||||||
|
def get_receiver_nos(self):
|
||||||
|
receiver_nos = []
|
||||||
|
if self.doc.receiver_list:
|
||||||
|
for d in self.doc.receiver_list.split('\n'):
|
||||||
|
receiver_no = d
|
||||||
|
if '-' in d:
|
||||||
|
receiver_no = receiver_no.split('-')[1]
|
||||||
|
if receiver_no.strip():
|
||||||
|
receiver_nos.append(cstr(receiver_no).strip())
|
||||||
|
else:
|
||||||
|
msgprint(_("Receiver List is empty. Please create Receiver List"))
|
||||||
|
|
||||||
|
return receiver_nos
|
||||||
|
|
||||||
|
def send_sms(self):
|
||||||
|
if not self.doc.message:
|
||||||
|
msgprint(_("Please enter message before sending"))
|
||||||
|
else:
|
||||||
|
receiver_list = self.get_receiver_nos()
|
||||||
|
if receiver_list:
|
||||||
|
msgprint(get_obj('SMS Control', 'SMS Control').send_sms(receiver_list, cstr(self.doc.message)))
|
||||||
@@ -2,15 +2,13 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-01-10 16:34:22",
|
"creation": "2013-01-10 16:34:22",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2013-07-05 14:55:36",
|
"modified": "2014-01-30 15:29:04",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"allow_attach": 0,
|
"allow_attach": 0,
|
||||||
"allow_copy": 1,
|
"allow_copy": 1,
|
||||||
"allow_email": 1,
|
|
||||||
"allow_print": 1,
|
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
"hide_heading": 0,
|
"hide_heading": 0,
|
||||||
"hide_toolbar": 0,
|
"hide_toolbar": 0,
|
||||||
@@ -30,15 +28,19 @@
|
|||||||
"permlevel": 0
|
"permlevel": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"cancel": 0,
|
||||||
"create": 1,
|
"create": 1,
|
||||||
|
"delete": 0,
|
||||||
"doctype": "DocPerm",
|
"doctype": "DocPerm",
|
||||||
|
"export": 0,
|
||||||
|
"import": 0,
|
||||||
"name": "__common__",
|
"name": "__common__",
|
||||||
"parent": "SMS Center",
|
"parent": "SMS Center",
|
||||||
"parentfield": "permissions",
|
"parentfield": "permissions",
|
||||||
"parenttype": "DocType",
|
"parenttype": "DocType",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"read": 1,
|
"read": 1,
|
||||||
"report": 1,
|
"report": 0,
|
||||||
"role": "System Manager",
|
"role": "System Manager",
|
||||||
"submit": 0,
|
"submit": 0,
|
||||||
"write": 1
|
"write": 1
|
||||||
@@ -119,6 +121,20 @@
|
|||||||
"label": "Message",
|
"label": "Message",
|
||||||
"reqd": 1
|
"reqd": 1
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"doctype": "DocField",
|
||||||
|
"fieldname": "total_words",
|
||||||
|
"fieldtype": "Int",
|
||||||
|
"label": "Total Words",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"doctype": "DocField",
|
||||||
|
"fieldname": "total_messages",
|
||||||
|
"fieldtype": "Int",
|
||||||
|
"label": "Total Message(s)",
|
||||||
|
"read_only": 1
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "send_sms",
|
"fieldname": "send_sms",
|
||||||
|
|||||||
@@ -35,8 +35,8 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({
|
|||||||
me.frm.set_query(opts[0], erpnext.queries[opts[1]]);
|
me.frm.set_query(opts[0], erpnext.queries[opts[1]]);
|
||||||
});
|
});
|
||||||
|
|
||||||
if(this.frm.fields_dict.charge) {
|
if(this.frm.fields_dict.taxes_and_charges) {
|
||||||
this.frm.set_query("charge", function() {
|
this.frm.set_query("taxes_and_charges", function() {
|
||||||
return {
|
return {
|
||||||
filters: [
|
filters: [
|
||||||
['Sales Taxes and Charges Master', 'company', '=', me.frm.doc.company],
|
['Sales Taxes and Charges Master', 'company', '=', me.frm.doc.company],
|
||||||
@@ -80,7 +80,7 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({
|
|||||||
if(item.warehouse) filters["warehouse"] = item.warehouse
|
if(item.warehouse) filters["warehouse"] = item.warehouse
|
||||||
|
|
||||||
return {
|
return {
|
||||||
query : "controllers.queries.get_batch_no",
|
query : "erpnext.controllers.queries.get_batch_no",
|
||||||
filters: filters
|
filters: filters
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -119,6 +119,8 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({
|
|||||||
(me.frm.doc.selling_price_list !== selling_price_list) ?
|
(me.frm.doc.selling_price_list !== selling_price_list) ?
|
||||||
me.selling_price_list() :
|
me.selling_price_list() :
|
||||||
me.price_list_currency();
|
me.price_list_currency();
|
||||||
|
if (me.frm.doc.taxes_and_charges)
|
||||||
|
me.frm.script_manager.trigger("taxes_and_charges")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -511,28 +513,6 @@ erpnext.selling.SellingController = erpnext.TransactionController.extend({
|
|||||||
this.frm.doc.in_words = this.frm.doc.in_words_export = "";
|
this.frm.doc.in_words = this.frm.doc.in_words_export = "";
|
||||||
},
|
},
|
||||||
|
|
||||||
show_item_wise_taxes: function() {
|
|
||||||
if(this.frm.fields_dict.other_charges_calculation) {
|
|
||||||
$(this.get_item_wise_taxes_html())
|
|
||||||
.appendTo($(this.frm.fields_dict.other_charges_calculation.wrapper).empty());
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
charge: function() {
|
|
||||||
var me = this;
|
|
||||||
if(this.frm.doc.charge) {
|
|
||||||
return this.frm.call({
|
|
||||||
doc: this.frm.doc,
|
|
||||||
method: "get_other_charges",
|
|
||||||
callback: function(r) {
|
|
||||||
if(!r.exc) {
|
|
||||||
me.calculate_taxes_and_totals();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
shipping_rule: function() {
|
shipping_rule: function() {
|
||||||
var me = this;
|
var me = this;
|
||||||
if(this.frm.doc.shipping_rule) {
|
if(this.frm.doc.shipping_rule) {
|
||||||
|
|||||||
@@ -1,114 +1,113 @@
|
|||||||
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
// Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||||
// License: GNU General Public License v3. See license.txt
|
// License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//--------- ONLOAD -------------
|
|
||||||
cur_frm.cscript.onload = function(doc, cdt, cdn) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
// Settings Module
|
// Settings Module
|
||||||
|
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
|
||||||
|
if (doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable')
|
||||||
|
hide_field('master_name');
|
||||||
|
else
|
||||||
|
unhide_field('master_name');
|
||||||
|
|
||||||
cur_frm.cscript.refresh = function(doc,cdt,cdn){
|
if (doc.based_on == 'Not Applicable')
|
||||||
|
hide_field('value');
|
||||||
|
else
|
||||||
|
unhide_field('value');
|
||||||
|
|
||||||
|
if (doc.transaction == 'Appraisal') {
|
||||||
|
hide_field(['master_name','system_role', 'system_user']);
|
||||||
|
unhide_field(['to_emp','to_designation']);
|
||||||
|
|
||||||
if(doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable') hide_field('master_name');
|
if (doc.transaction == 'Appraisal')
|
||||||
else unhide_field('master_name');
|
hide_field('value');
|
||||||
|
else
|
||||||
if(doc.based_on == 'Not Applicable') hide_field('value');
|
unhide_field('value');
|
||||||
else unhide_field('value');
|
}
|
||||||
|
else {
|
||||||
if(doc.transaction == 'Appraisal'){
|
unhide_field(['master_name','system_role', 'system_user','value']);
|
||||||
hide_field(['master_name','system_role', 'system_user']);
|
hide_field(['to_emp','to_designation']);
|
||||||
unhide_field(['to_emp','to_designation']);
|
}
|
||||||
if(doc.transaction == 'Appraisal') hide_field('value');
|
|
||||||
else unhide_field('value');
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
unhide_field(['master_name','system_role', 'system_user','value']);
|
|
||||||
hide_field(['to_emp','to_designation']);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.based_on = function(doc){
|
cur_frm.cscript.based_on = function(doc) {
|
||||||
if(doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable'){
|
if (doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Not Applicable') {
|
||||||
doc.master_name = '';
|
doc.master_name = '';
|
||||||
refresh_field('master_name');
|
refresh_field('master_name');
|
||||||
hide_field('master_name');
|
hide_field('master_name');
|
||||||
}
|
}
|
||||||
else{
|
else
|
||||||
unhide_field('master_name');
|
unhide_field('master_name');
|
||||||
}
|
|
||||||
|
|
||||||
if(doc.based_on == 'Not Applicable') {
|
if (doc.based_on == 'Not Applicable') {
|
||||||
doc.value =0;
|
doc.value =0;
|
||||||
refresh_field('value');
|
refresh_field('value');
|
||||||
hide_field('value');
|
hide_field('value');
|
||||||
}
|
}
|
||||||
else unhide_field('value');
|
else
|
||||||
|
unhide_field('value');
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.transaction = function(doc,cdt,cdn){
|
cur_frm.cscript.transaction = function(doc, cdt, cdn){
|
||||||
if (doc.transaction == 'Appraisal'){
|
if (doc.transaction == 'Appraisal') {
|
||||||
doc.master_name = doc.system_role = doc.system_user = '';
|
doc.based_on == 'Not Applicable';
|
||||||
refresh_many(['master_name','system_role', 'system_user']);
|
doc.master_name = doc.system_role = doc.system_user = '';
|
||||||
hide_field(['master_name','system_role', 'system_user']);
|
refresh_many(['master_name','system_role', 'system_user', 'based_on']);
|
||||||
unhide_field(['to_emp','to_designation']);
|
hide_field(['master_name','system_role', 'system_user']);
|
||||||
doc.value =0;
|
unhide_field(['to_emp','to_designation']);
|
||||||
refresh_many('value');
|
doc.value = 0;
|
||||||
hide_field('value');
|
refresh_many('value');
|
||||||
}
|
hide_field('value');
|
||||||
else {
|
}
|
||||||
unhide_field(['master_name','system_role', 'system_user','value']);
|
else {
|
||||||
hide_field(['to_emp','to_designation']);
|
unhide_field(['master_name','system_role', 'system_user','value']);
|
||||||
}
|
hide_field(['to_emp','to_designation']);
|
||||||
|
}
|
||||||
|
|
||||||
if(doc.transaction == 'Appraisal') doc.based_on == 'Not Applicable';
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cur_frm.fields_dict.system_user.get_query = function(doc, cdt, cdn) {
|
||||||
|
return { query:"webnotes.core.doctype.profile.profile.profile_query" }
|
||||||
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict.system_user.get_query = function(doc,cdt,cdn) {
|
cur_frm.fields_dict.approving_user.get_query = function(doc, cdt, cdn) {
|
||||||
return{ query:"webnotes.core.doctype.profile.profile.profile_query" } }
|
return { query:"webnotes.core.doctype.profile.profile.profile_query" }
|
||||||
|
}
|
||||||
cur_frm.fields_dict.approving_user.get_query = function(doc,cdt,cdn) {
|
|
||||||
return{ query:"webnotes.core.doctype.profile.profile.profile_query" } }
|
|
||||||
|
|
||||||
cur_frm.fields_dict['approving_role'].get_query = cur_frm.fields_dict['system_role'].get_query;
|
cur_frm.fields_dict['approving_role'].get_query = cur_frm.fields_dict['system_role'].get_query;
|
||||||
|
|
||||||
// System Role Trigger
|
// System Role Trigger
|
||||||
// -----------------------
|
// -----------------------
|
||||||
cur_frm.fields_dict['system_role'].get_query = function(doc) {
|
cur_frm.fields_dict['system_role'].get_query = function(doc) {
|
||||||
return{
|
return {
|
||||||
filters:[
|
filters:[
|
||||||
['Role', 'name', 'not in', 'Administrator, Guest, All']
|
['Role', 'name', 'not in', 'Administrator, Guest, All']
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Master Name Trigger
|
// Master Name Trigger
|
||||||
// --------------------
|
// --------------------
|
||||||
cur_frm.fields_dict['master_name'].get_query = function(doc){
|
cur_frm.fields_dict['master_name'].get_query = function(doc) {
|
||||||
if(doc.based_on == 'Customerwise Discount')
|
if (doc.based_on == 'Customerwise Discount')
|
||||||
return {
|
return {
|
||||||
doctype: "Customer",
|
doctype: "Customer",
|
||||||
filters:[
|
filters:[
|
||||||
['Customer', 'docstatus', '!=', 2]
|
['Customer', 'docstatus', '!=', 2]
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
else if(doc.based_on == 'Itemwise Discount')
|
else if (doc.based_on == 'Itemwise Discount')
|
||||||
return {
|
return {
|
||||||
doctype: "Item",
|
doctype: "Item",
|
||||||
query: "erpnext.controllers.queries.item_query"
|
query: "erpnext.controllers.queries.item_query"
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
return {
|
return {
|
||||||
filters: [
|
filters: [
|
||||||
['Item', 'name', '=', 'cheating done to avoid null']
|
['Item', 'name', '=', 'cheating done to avoid null']
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict.to_emp.get_query = function(doc,cdt,cdn) {
|
cur_frm.fields_dict.to_emp.get_query = function(doc, cdt, cdn) {
|
||||||
return{ query: "erpnext.controllers.queries.employee_query" } }
|
return { query: "erpnext.controllers.queries.employee_query" }
|
||||||
|
}
|
||||||
|
|||||||
@@ -15,15 +15,10 @@ cur_frm.cscript.set_root_readonly = function(doc) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
cur_frm.cscript.onload = function(){
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
//get query select sales person
|
//get query select sales person
|
||||||
cur_frm.fields_dict['parent_sales_person'].get_query = function(doc,cdt,cdn) {
|
cur_frm.fields_dict['parent_sales_person'].get_query = function(doc, cdt, cdn) {
|
||||||
return{
|
return{
|
||||||
filters:[
|
filters: [
|
||||||
['Sales Person', 'is_group', '=', 'Yes'],
|
['Sales Person', 'is_group', '=', 'Yes'],
|
||||||
['Sales Person', 'name', '!=', doc.sales_person_name]
|
['Sales Person', 'name', '!=', doc.sales_person_name]
|
||||||
]
|
]
|
||||||
@@ -31,10 +26,11 @@ cur_frm.fields_dict['parent_sales_person'].get_query = function(doc,cdt,cdn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict['target_details'].grid.get_field("item_group").get_query = function(doc, cdt, cdn) {
|
cur_frm.fields_dict['target_details'].grid.get_field("item_group").get_query = function(doc, cdt, cdn) {
|
||||||
return{
|
return {
|
||||||
filters:{ 'is_group': "No" }
|
filters: { 'is_group': "No" }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict.employee.get_query = function(doc,cdt,cdn) {
|
cur_frm.fields_dict.employee.get_query = function(doc, cdt, cdn) {
|
||||||
return{ query: "erpnext.controllers.queries.employee_query" } }
|
return { query: "erpnext.controllers.queries.employee_query" }
|
||||||
|
}
|
||||||
@@ -3,10 +3,8 @@
|
|||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import webnotes
|
import webnotes
|
||||||
|
|
||||||
from webnotes.model.bean import getlist
|
from webnotes.model.bean import getlist
|
||||||
from webnotes.utils import flt
|
from webnotes.utils import flt
|
||||||
|
|
||||||
from webnotes.utils.nestedset import DocTypeNestedSet
|
from webnotes.utils.nestedset import DocTypeNestedSet
|
||||||
|
|
||||||
class DocType(DocTypeNestedSet):
|
class DocType(DocTypeNestedSet):
|
||||||
@@ -18,8 +16,7 @@ class DocType(DocTypeNestedSet):
|
|||||||
def validate(self):
|
def validate(self):
|
||||||
for d in getlist(self.doclist, 'target_details'):
|
for d in getlist(self.doclist, 'target_details'):
|
||||||
if not flt(d.target_qty) and not flt(d.target_amount):
|
if not flt(d.target_qty) and not flt(d.target_amount):
|
||||||
webnotes.msgprint("Either target qty or target amount is mandatory.")
|
webnotes.throw(_("Either target qty or target amount is mandatory."))
|
||||||
raise Exception
|
|
||||||
|
|
||||||
def on_update(self):
|
def on_update(self):
|
||||||
super(DocType, self).on_update()
|
super(DocType, self).on_update()
|
||||||
@@ -28,8 +25,7 @@ class DocType(DocTypeNestedSet):
|
|||||||
def get_email_id(self):
|
def get_email_id(self):
|
||||||
profile = webnotes.conn.get_value("Employee", self.doc.employee, "user_id")
|
profile = webnotes.conn.get_value("Employee", self.doc.employee, "user_id")
|
||||||
if not profile:
|
if not profile:
|
||||||
webnotes.msgprint("User ID (Profile) no set for Employee %s" % self.doc.employee,
|
webnotes.throw("User ID (Profile) not set for Employee %s" % self.doc.employee)
|
||||||
raise_exception=True)
|
|
||||||
else:
|
else:
|
||||||
return webnotes.conn.get_value("Profile", profile, "email") or profile
|
return webnotes.conn.get_value("Profile", profile, "email") or profile
|
||||||
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
[
|
|
||||||
{
|
|
||||||
"owner": "Administrator",
|
|
||||||
"docstatus": 0,
|
|
||||||
"creation": "2010-08-08 17:09:34",
|
|
||||||
"modified_by": "Administrator",
|
|
||||||
"modified": "2011-10-19 14:18:26"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "__common__",
|
|
||||||
"module": "Stock",
|
|
||||||
"standard": "Yes",
|
|
||||||
"html": "<html>\n<head>\n<!--Other charges function-->\n<script>\n var make_row = function(title,val,bold){\n var bstart = '<b>'; var bend = '</b>';\n return '<tr><td style=\"width:50%\">'+(bold?bstart:'')+title+(bold?bend:'')+'</td>'\n +'<td style=\"width:20%;text-align:right\">'+doc.currency+'</td>'\n +'<td style=\"width:30%;text-align:right\">'+(val?val:'0.00')+'</td>'\n +'</tr>'\n }\n\n function get_other_charges(){\n var out ='';\n out += '<div><table class=\"noborder\" style=\"width:100%\">';\n out += make_row('Total Amount',fmt_money(convert_rate(doc.total_amount)),1)\n +make_row('Grand Total',fmt_money(convert_rate(doc.grand_total)),1);\n out += '</table></div>';\n return out;\n }\n\n function get_buying_costs(){\n var out ='';\n if(doc.buying_cost_transport || doc.buying_cost_taxes || doc.buying_cost_other){\n out += '<div><table class=\"noborder\" style=\"width:100%\">'\n + '<tr><td style=\"width:100%\"><b>'+'Buying Cost Details'+'</b></td></tr>';\n if(doc.buying_cost_transport){ out += make_row('Transport Cost',fmt_money(convert_rate(doc.buying_cost_transport)),0)}\n if(doc.buying_cost_taxes){ out += make_row('Taxes',fmt_money(convert_rate(doc.buying_cost_taxes)),0)}\n if(doc.buying_cost_other){ out += make_row('Other Cost',fmt_money(convert_rate(doc.buying_cost_other)),0)}\n out += '</table></div>';\n }\n return out;\n }\n\nfunction get_letter_head() {\n\t// add letter head\n\tvar cp = locals['Control Panel']['Control Panel'];\n\tif(doc.letter_head)\n\t\tvar lh= cstr(_p.letter_heads[doc.letter_head]);\n\telse if(cp.letter_head)\n\t\tvar lh= cp.letter_head;\n\telse \n\t\tvar lh= '';\n\t\t\n\treturn lh;\n}\n\n \n function convert_rate(val){\n var new_val = flt(val)/flt(doc.conversion_rate);\n return new_val;\n }\n \n function get_transport_details(){\n var out = '';\n if(doc.transporter_name || doc.lr_no || doc.lr_date){\n out += '<div><table class=\"noborder\" style=\"width:40%\">'\n +'<tr><td style=\"width:80%\"><b>' + 'Transporter Details'+'</b></td><td style=\"width:20%\"></td></tr>'\n\n if(doc.transporter_name){ out += '<tr><td style=\"width:40%\">' + 'Transporter Name'+'</td><td style=\"width:60%\">'+doc.transporter_name+'</td></tr>'}\n if(doc.lr_no){ out += '<tr><td style=\"width:40%\">' + 'LR No'+'</td><td style=\"width:60%\">'+doc.lr_no+'</td></tr>'}\n if(doc.lr_date){ out += '<tr><td style=\"width:40%\">' + 'LR Date'+'</td><td style=\"width:60%\">'+doc.lr_date+'</td></tr>'}\n out += '</table></div>'\n }\n return out;\n }\n\n</script>\n</head>\n<body>\n<div style=\"border:1px solid black;padding:15px\">\n<!--header-->\n<div><script>get_letter_head()</script></div>\n<div style=\"border-bottom: 1px solid; padding-bottom: 5px;\">\n <div><br><b>Purchase Receipt: <script>doc.name</script></b></div>\n <div>Date: <script>date.str_to_user(doc.transaction_date)</script></div>\n</div>\n\n<div style=\"padding-top:15px\">\n<div><script>doc.supplier</script></div>\n<div><br><script>replace_newlines(doc.address_display)</script></div>\n</div>\n\n<div>\n<br>\n <script>\n var t = print_table('Purchase Receipt', doc.name, 'purchase_receipt_details', 'Purchase Receipt Item', ['SR', 'item_code','description','received_qty','qty','rejected_qty','po_rate','amount','billed_qty'], ['Sr', 'Item Code', 'Description','Received Quantity','Accepted Qty','Rejected Qty','Rate','Amount','Billed Qty'], ['4%','12%', '24%', '10%','10%','10%','10%','10%','10%'])\n if(t.appendChild) {\n // single\n out = t.innerHTML;\n } \n else {//multiple\n out = ''\n for(var i=0;i<t.length;i++) {\n if(i!=t.length-1){\n out += '<div style:\"padding-top:5px;\"></div>' + t[i].innerHTML +'<div style=\"page-break-after:always\"></div>';\n }\n else out += '<div style:\"padding-top:5px;\"></div>' + t[i].innerHTML;\n }\n }\n out;\n </script>\n\n</div>\n\n<!--Other charges table-->\n<div>\n<table style=\"width:100%\">\n <tr><td style=\"width:40%\"><script>get_buying_costs()</script></td>\n <td style=\"width:20%\"></td><td style=\"width:40%\"><script>get_other_charges()</script></td></tr>\n</table>\n</div>\n<div><script>get_transport_details()</script></div>\n<div><br>Payment Terms</div>\n<div><br><script>replace_newlines(doc.payment_terms)</script></div>\n<div><br>For NCSCI</div>\n<div><br><br>(Authorised Signatory)</div>\n</div></body>\n</html>",
|
|
||||||
"doctype": "Print Format"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "Purchase Receipt Format",
|
|
||||||
"doctype": "Print Format"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-05-24 19:29:09",
|
"creation": "2013-05-24 19:29:09",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2014-01-20 17:48:35",
|
"modified": "2014-01-28 18:51:42",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -402,7 +402,7 @@
|
|||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "taxes",
|
"fieldname": "taxes",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"label": "Taxes",
|
"label": "Taxes and Charges",
|
||||||
"oldfieldtype": "Section Break",
|
"oldfieldtype": "Section Break",
|
||||||
"options": "icon-money",
|
"options": "icon-money",
|
||||||
"read_only": 0
|
"read_only": 0
|
||||||
@@ -410,9 +410,9 @@
|
|||||||
{
|
{
|
||||||
"description": "If you have created a standard template in Sales Taxes and Charges Master, select one and click on the button below.",
|
"description": "If you have created a standard template in Sales Taxes and Charges Master, select one and click on the button below.",
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "charge",
|
"fieldname": "taxes_and_charges",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Tax Master",
|
"label": "Taxes and Charges",
|
||||||
"oldfieldname": "charge",
|
"oldfieldname": "charge",
|
||||||
"oldfieldtype": "Link",
|
"oldfieldtype": "Link",
|
||||||
"options": "Sales Taxes and Charges Master",
|
"options": "Sales Taxes and Charges Master",
|
||||||
@@ -1071,6 +1071,7 @@
|
|||||||
"write": 0
|
"write": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"cancel": 0,
|
||||||
"delete": 0,
|
"delete": 0,
|
||||||
"doctype": "DocPerm",
|
"doctype": "DocPerm",
|
||||||
"role": "Customer"
|
"role": "Customer"
|
||||||
|
|||||||
@@ -34,26 +34,27 @@ cur_frm.cscript.edit_prices_button = function() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.item_code = function(doc) {
|
cur_frm.cscript.item_code = function(doc) {
|
||||||
if(!doc.item_name) cur_frm.set_value("item_name", doc.item_code);
|
if(!doc.item_name)
|
||||||
if(!doc.description) cur_frm.set_value("description", doc.item_code);
|
cur_frm.set_value("item_name", doc.item_code);
|
||||||
|
if(!doc.description)
|
||||||
|
cur_frm.set_value("description", doc.item_code);
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict['default_bom'].get_query = function(doc) {
|
cur_frm.fields_dict['default_bom'].get_query = function(doc) {
|
||||||
//var d = locals[this.doctype][this.docname];
|
return {
|
||||||
return{
|
filters: {
|
||||||
filters:{
|
'item': doc.item_code,
|
||||||
'item': doc.item_code,
|
'is_active': 0
|
||||||
'is_active': 0
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Expense Account
|
// Expense Account
|
||||||
// ---------------------------------
|
// ---------------------------------
|
||||||
cur_frm.fields_dict['purchase_account'].get_query = function(doc){
|
cur_frm.fields_dict['purchase_account'].get_query = function(doc) {
|
||||||
return{
|
return {
|
||||||
filters:{
|
filters: {
|
||||||
'debit_or_credit': "Debit",
|
'debit_or_credit': "Debit",
|
||||||
'group_or_ledger': "Ledger"
|
'group_or_ledger': "Ledger"
|
||||||
}
|
}
|
||||||
@@ -63,8 +64,8 @@ cur_frm.fields_dict['purchase_account'].get_query = function(doc){
|
|||||||
// Income Account
|
// Income Account
|
||||||
// --------------------------------
|
// --------------------------------
|
||||||
cur_frm.fields_dict['default_income_account'].get_query = function(doc) {
|
cur_frm.fields_dict['default_income_account'].get_query = function(doc) {
|
||||||
return{
|
return {
|
||||||
filters:{
|
filters: {
|
||||||
'debit_or_credit': "Credit",
|
'debit_or_credit': "Credit",
|
||||||
'group_or_ledger': "Ledger",
|
'group_or_ledger': "Ledger",
|
||||||
'account_type': "Income Account"
|
'account_type': "Income Account"
|
||||||
@@ -76,7 +77,7 @@ cur_frm.fields_dict['default_income_account'].get_query = function(doc) {
|
|||||||
// Purchase Cost Center
|
// Purchase Cost Center
|
||||||
// -----------------------------
|
// -----------------------------
|
||||||
cur_frm.fields_dict['cost_center'].get_query = function(doc) {
|
cur_frm.fields_dict['cost_center'].get_query = function(doc) {
|
||||||
return{
|
return {
|
||||||
filters:{ 'group_or_ledger': "Ledger" }
|
filters:{ 'group_or_ledger': "Ledger" }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -85,15 +86,15 @@ cur_frm.fields_dict['cost_center'].get_query = function(doc) {
|
|||||||
// Sales Cost Center
|
// Sales Cost Center
|
||||||
// -----------------------------
|
// -----------------------------
|
||||||
cur_frm.fields_dict['default_sales_cost_center'].get_query = function(doc) {
|
cur_frm.fields_dict['default_sales_cost_center'].get_query = function(doc) {
|
||||||
return{
|
return {
|
||||||
filters:{ 'group_or_ledger': "Ledger" }
|
filters:{ 'group_or_ledger': "Ledger" }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
cur_frm.fields_dict['item_tax'].grid.get_field("tax_type").get_query = function(doc, cdt, cdn) {
|
cur_frm.fields_dict['item_tax'].grid.get_field("tax_type").get_query = function(doc, cdt, cdn) {
|
||||||
return{
|
return {
|
||||||
filters:[
|
filters: [
|
||||||
['Account', 'account_type', 'in',
|
['Account', 'account_type', 'in',
|
||||||
'Tax, Chargeable, Income Account, Expense Account'],
|
'Tax, Chargeable, Income Account, Expense Account'],
|
||||||
['Account', 'docstatus', '!=', 2]
|
['Account', 'docstatus', '!=', 2]
|
||||||
@@ -102,12 +103,10 @@ cur_frm.fields_dict['item_tax'].grid.get_field("tax_type").get_query = function(
|
|||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.tax_type = function(doc, cdt, cdn){
|
cur_frm.cscript.tax_type = function(doc, cdt, cdn){
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
return get_server_fields('get_tax_rate',d.tax_type,'item_tax',doc, cdt, cdn, 1);
|
return get_server_fields('get_tax_rate', d.tax_type, 'item_tax', doc, cdt, cdn, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//get query select item group
|
|
||||||
cur_frm.fields_dict['item_group'].get_query = function(doc,cdt,cdn) {
|
cur_frm.fields_dict['item_group'].get_query = function(doc,cdt,cdn) {
|
||||||
return {
|
return {
|
||||||
filters: [
|
filters: [
|
||||||
@@ -116,44 +115,39 @@ cur_frm.fields_dict['item_group'].get_query = function(doc,cdt,cdn) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// for description from attachment
|
|
||||||
// takes the first attachment and creates
|
|
||||||
// a table with both image and attachment in HTML
|
|
||||||
// in the "alternate_description" field
|
|
||||||
cur_frm.cscript.add_image = function(doc, dt, dn) {
|
cur_frm.cscript.add_image = function(doc, dt, dn) {
|
||||||
if(!doc.image) {
|
if(!doc.image) {
|
||||||
msgprint(wn._('Please select an "Image" first'));
|
msgprint(wn._('Please select an "Image" first'));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
doc.description_html = repl('<table style="width: 100%; table-layout: fixed;">'+
|
doc.description_html = repl('<table style="width: 100%; table-layout: fixed;">' +
|
||||||
'<tr><td style="width:110px"><img src="%(imgurl)s" width="100px"></td>'+
|
'<tr><td style="width:110px"><img src="%(imgurl)s" width="100px"></td>' +
|
||||||
'<td>%(desc)s</td></tr>'+
|
'<td>%(desc)s</td></tr>' +
|
||||||
'</table>', {imgurl: wn.utils.get_file_link(doc.image), desc:doc.description});
|
'</table>', {imgurl: wn.utils.get_file_link(doc.image), desc:doc.description});
|
||||||
|
|
||||||
refresh_field('description_html');
|
refresh_field('description_html');
|
||||||
}
|
}
|
||||||
|
|
||||||
// Quotation to validation - either customer or lead mandatory
|
// Quotation to validation - either customer or lead mandatory
|
||||||
cur_frm.cscript.weight_to_validate = function(doc,cdt,cdn){
|
cur_frm.cscript.weight_to_validate = function(doc, cdt, cdn){
|
||||||
|
if((doc.nett_weight || doc.gross_weight) && !doc.weight_uom) {
|
||||||
if((doc.nett_weight || doc.gross_weight) && !doc.weight_uom)
|
msgprint(wn._('Weight is mentioned,\nPlease mention "Weight UOM" too'));
|
||||||
{
|
validated = 0;
|
||||||
alert(wn._('Weight is mentioned,\nPlease mention "Weight UOM" too'));
|
}
|
||||||
validated=0;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.validate = function(doc,cdt,cdn){
|
cur_frm.cscript.validate = function(doc, cdt, cdn){
|
||||||
cur_frm.cscript.weight_to_validate(doc,cdt,cdn);
|
cur_frm.cscript.weight_to_validate(doc, cdt, cdn);
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict.item_customer_details.grid.get_field("customer_name").get_query =
|
cur_frm.fields_dict.item_customer_details.grid.get_field("customer_name").get_query = function(doc, cdt, cdn) {
|
||||||
function(doc,cdt,cdn) {
|
return { query: "erpnext.controllers.queries.customer_query" }
|
||||||
return{ query: "erpnext.controllers.queries.customer_query" } }
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict.item_supplier_details.grid.get_field("supplier").get_query =
|
cur_frm.fields_dict.item_supplier_details.grid.get_field("supplier").get_query = function(doc, cdt, cdn) {
|
||||||
function(doc,cdt,cdn) {
|
return { query: "erpnext.controllers.queries.supplier_query" }
|
||||||
return{ query: "erpnext.controllers.queries.supplier_query" } }
|
}
|
||||||
|
|
||||||
cur_frm.cscript.copy_from_item_group = function(doc) {
|
cur_frm.cscript.copy_from_item_group = function(doc) {
|
||||||
wn.model.with_doc("Item Group", doc.item_group, function() {
|
wn.model.with_doc("Item Group", doc.item_group, function() {
|
||||||
@@ -172,9 +166,9 @@ cur_frm.cscript.copy_from_item_group = function(doc) {
|
|||||||
cur_frm.cscript.image = function() {
|
cur_frm.cscript.image = function() {
|
||||||
refresh_field("image_view");
|
refresh_field("image_view");
|
||||||
|
|
||||||
if(!cur_frm.doc.description_html) {
|
if(!cur_frm.doc.description_html)
|
||||||
cur_frm.cscript.add_image(cur_frm.doc);
|
cur_frm.cscript.add_image(cur_frm.doc);
|
||||||
} else {
|
else {
|
||||||
msgprint(wn._("You may need to update: ") +
|
msgprint(wn._("You may need to update: ") +
|
||||||
wn.meta.get_docfield(cur_frm.doc.doctype, "description_html").label);
|
wn.meta.get_docfield(cur_frm.doc.doctype, "description_html").label);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -39,13 +39,13 @@ class DocType:
|
|||||||
|
|
||||||
for pr in purchase_receipts:
|
for pr in purchase_receipts:
|
||||||
pr_bean = webnotes.bean('Purchase Receipt', pr)
|
pr_bean = webnotes.bean('Purchase Receipt', pr)
|
||||||
idx = max([d.idx for d in pr_bean.doclist.get({"parentfield": "purchase_tax_details"})])
|
idx = max([d.idx for d in pr_bean.doclist.get({"parentfield": "other_charges"})])
|
||||||
|
|
||||||
for lc in self.doclist.get({"parentfield": "landed_cost_details"}):
|
for lc in self.doclist.get({"parentfield": "landed_cost_details"}):
|
||||||
amt = flt(lc.amount) * flt(pr_bean.doc.net_total)/ flt(total_amt)
|
amt = flt(lc.amount) * flt(pr_bean.doc.net_total)/ flt(total_amt)
|
||||||
|
|
||||||
matched_row = pr_bean.doclist.get({
|
matched_row = pr_bean.doclist.get({
|
||||||
"parentfield": "purchase_tax_details",
|
"parentfield": "other_charges",
|
||||||
"category": "Valuation",
|
"category": "Valuation",
|
||||||
"add_deduct_tax": "Add",
|
"add_deduct_tax": "Add",
|
||||||
"charge_type": "Actual",
|
"charge_type": "Actual",
|
||||||
@@ -53,7 +53,7 @@ class DocType:
|
|||||||
})
|
})
|
||||||
|
|
||||||
if not matched_row: # add if not exists
|
if not matched_row: # add if not exists
|
||||||
ch = addchild(pr_bean.doc, 'purchase_tax_details', 'Purchase Taxes and Charges')
|
ch = addchild(pr_bean.doc, 'other_charges', 'Purchase Taxes and Charges')
|
||||||
ch.category = 'Valuation'
|
ch.category = 'Valuation'
|
||||||
ch.add_deduct_tax = 'Add'
|
ch.add_deduct_tax = 'Add'
|
||||||
ch.charge_type = 'Actual'
|
ch.charge_type = 'Actual'
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-01-25 11:35:09",
|
"creation": "2013-01-25 11:35:09",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2014-01-20 17:50:00",
|
"modified": "2014-01-27 11:11:08",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -10,6 +10,9 @@
|
|||||||
"allow_attach": 0,
|
"allow_attach": 0,
|
||||||
"allow_copy": 0,
|
"allow_copy": 0,
|
||||||
"allow_import": 1,
|
"allow_import": 1,
|
||||||
|
"allow_email": 1,
|
||||||
|
"allow_print": 1,
|
||||||
|
"allow_rename": 1,
|
||||||
"autoname": "field:price_list_name",
|
"autoname": "field:price_list_name",
|
||||||
"description": "Price List Master",
|
"description": "Price List Master",
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
|
|||||||
@@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
cur_frm.cscript.tname = "Purchase Receipt Item";
|
cur_frm.cscript.tname = "Purchase Receipt Item";
|
||||||
cur_frm.cscript.fname = "purchase_receipt_details";
|
cur_frm.cscript.fname = "purchase_receipt_details";
|
||||||
cur_frm.cscript.other_fname = "purchase_tax_details";
|
cur_frm.cscript.other_fname = "other_charges";
|
||||||
|
|
||||||
{% include 'buying/doctype/purchase_common/purchase_common.js' %};
|
{% include 'buying/doctype/purchase_common/purchase_common.js' %};
|
||||||
{% include 'accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js' %}
|
{% include 'accounts/doctype/purchase_taxes_and_charges_master/purchase_taxes_and_charges_master.js' %}
|
||||||
@@ -106,27 +106,28 @@ erpnext.stock.PurchaseReceiptController = erpnext.buying.BuyingController.extend
|
|||||||
$.extend(cur_frm.cscript, new erpnext.stock.PurchaseReceiptController({frm: cur_frm}));
|
$.extend(cur_frm.cscript, new erpnext.stock.PurchaseReceiptController({frm: cur_frm}));
|
||||||
|
|
||||||
cur_frm.fields_dict['supplier_address'].get_query = function(doc, cdt, cdn) {
|
cur_frm.fields_dict['supplier_address'].get_query = function(doc, cdt, cdn) {
|
||||||
return{
|
return {
|
||||||
filters:{ 'supplier': doc.supplier}
|
filters: { 'supplier': doc.supplier}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
|
cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
|
||||||
return{
|
return {
|
||||||
filters:{ 'supplier': doc.supplier}
|
filters: { 'supplier': doc.supplier }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.new_contact = function(){
|
cur_frm.cscript.new_contact = function() {
|
||||||
tn = wn.model.make_new_doc_and_get_name('Contact');
|
tn = wn.model.make_new_doc_and_get_name('Contact');
|
||||||
locals['Contact'][tn].is_supplier = 1;
|
locals['Contact'][tn].is_supplier = 1;
|
||||||
if(doc.supplier) locals['Contact'][tn].supplier = doc.supplier;
|
if(doc.supplier)
|
||||||
|
locals['Contact'][tn].supplier = doc.supplier;
|
||||||
loaddoc('Contact', tn);
|
loaddoc('Contact', tn);
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict['purchase_receipt_details'].grid.get_field('project_name').get_query = function(doc, cdt, cdn) {
|
cur_frm.fields_dict['purchase_receipt_details'].grid.get_field('project_name').get_query = function(doc, cdt, cdn) {
|
||||||
return{
|
return {
|
||||||
filters:[
|
filters: [
|
||||||
['Project', 'status', 'not in', 'Completed, Cancelled']
|
['Project', 'status', 'not in', 'Completed, Cancelled']
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -134,28 +135,25 @@ cur_frm.fields_dict['purchase_receipt_details'].grid.get_field('project_name').g
|
|||||||
|
|
||||||
cur_frm.fields_dict['purchase_receipt_details'].grid.get_field('batch_no').get_query= function(doc, cdt, cdn) {
|
cur_frm.fields_dict['purchase_receipt_details'].grid.get_field('batch_no').get_query= function(doc, cdt, cdn) {
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
if(d.item_code){
|
if(d.item_code) {
|
||||||
return{
|
return {
|
||||||
filters:{'item': d.item_code}
|
filters: {'item': d.item_code}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else
|
||||||
alert(wn._("Please enter Item Code."));
|
msgprint(wn._("Please enter Item Code."));
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.select_print_heading = function(doc,cdt,cdn){
|
cur_frm.cscript.select_print_heading = function(doc, cdt, cdn) {
|
||||||
if(doc.select_print_heading){
|
if(doc.select_print_heading)
|
||||||
// print heading
|
|
||||||
cur_frm.pformat.print_heading = doc.select_print_heading;
|
cur_frm.pformat.print_heading = doc.select_print_heading;
|
||||||
}
|
|
||||||
else
|
else
|
||||||
cur_frm.pformat.print_heading = "Purchase Receipt";
|
cur_frm.pformat.print_heading = "Purchase Receipt";
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) {
|
cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) {
|
||||||
return{
|
return {
|
||||||
filters:[
|
filters: [
|
||||||
['Print Heading', 'docstatus', '!=', '2']
|
['Print Heading', 'docstatus', '!=', '2']
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -170,7 +168,6 @@ cur_frm.fields_dict.purchase_receipt_details.grid.get_field("qa_no").get_query =
|
|||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.on_submit = function(doc, cdt, cdn) {
|
cur_frm.cscript.on_submit = function(doc, cdt, cdn) {
|
||||||
if(cint(wn.boot.notification_settings.purchase_receipt)) {
|
if(cint(wn.boot.notification_settings.purchase_receipt))
|
||||||
cur_frm.email_doc(wn.boot.notification_settings.purchase_receipt_message);
|
cur_frm.email_doc(wn.boot.notification_settings.purchase_receipt_message);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-05-21 16:16:39",
|
"creation": "2013-05-21 16:16:39",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2014-01-20 17:49:12",
|
"modified": "2014-01-29 15:25:14",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -329,16 +329,16 @@
|
|||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "taxes",
|
"fieldname": "taxes",
|
||||||
"fieldtype": "Section Break",
|
"fieldtype": "Section Break",
|
||||||
"label": "Taxes",
|
"label": "Taxes and Charges",
|
||||||
"oldfieldtype": "Section Break",
|
"oldfieldtype": "Section Break",
|
||||||
"options": "icon-money"
|
"options": "icon-money"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"description": "If you have created a standard template in Purchase Taxes and Charges Master, select one and click on the button below.",
|
"description": "If you have created a standard template in Purchase Taxes and Charges Master, select one and click on the button below.",
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "purchase_other_charges",
|
"fieldname": "taxes_and_charges",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"label": "Purchase Taxes and Charges",
|
"label": "Taxes and Charges",
|
||||||
"oldfieldname": "purchase_other_charges",
|
"oldfieldname": "purchase_other_charges",
|
||||||
"oldfieldtype": "Link",
|
"oldfieldtype": "Link",
|
||||||
"options": "Purchase Taxes and Charges Master",
|
"options": "Purchase Taxes and Charges Master",
|
||||||
@@ -346,7 +346,7 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "purchase_tax_details",
|
"fieldname": "other_charges",
|
||||||
"fieldtype": "Table",
|
"fieldtype": "Table",
|
||||||
"label": "Purchase Taxes and Charges",
|
"label": "Purchase Taxes and Charges",
|
||||||
"oldfieldname": "purchase_tax_details",
|
"oldfieldname": "purchase_tax_details",
|
||||||
@@ -355,9 +355,9 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "tax_calculation",
|
"fieldname": "other_charges_calculation",
|
||||||
"fieldtype": "HTML",
|
"fieldtype": "HTML",
|
||||||
"label": "Tax Calculation",
|
"label": "Taxes and Charges Calculation",
|
||||||
"oldfieldtype": "HTML",
|
"oldfieldtype": "HTML",
|
||||||
"print_hide": 1
|
"print_hide": 1
|
||||||
},
|
},
|
||||||
@@ -836,6 +836,7 @@
|
|||||||
"write": 1
|
"write": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"cancel": 0,
|
||||||
"delete": 0,
|
"delete": 0,
|
||||||
"doctype": "DocPerm",
|
"doctype": "DocPerm",
|
||||||
"role": "Supplier"
|
"role": "Supplier"
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ test_records = [
|
|||||||
"charge_type": "Actual",
|
"charge_type": "Actual",
|
||||||
"description": "Shipping Charges",
|
"description": "Shipping Charges",
|
||||||
"doctype": "Purchase Taxes and Charges",
|
"doctype": "Purchase Taxes and Charges",
|
||||||
"parentfield": "purchase_tax_details",
|
"parentfield": "other_charges",
|
||||||
"rate": 100.0,
|
"rate": 100.0,
|
||||||
"tax_amount": 100.0,
|
"tax_amount": 100.0,
|
||||||
},
|
},
|
||||||
@@ -195,7 +195,7 @@ test_records = [
|
|||||||
"charge_type": "Actual",
|
"charge_type": "Actual",
|
||||||
"description": "VAT",
|
"description": "VAT",
|
||||||
"doctype": "Purchase Taxes and Charges",
|
"doctype": "Purchase Taxes and Charges",
|
||||||
"parentfield": "purchase_tax_details",
|
"parentfield": "other_charges",
|
||||||
"rate": 120.0,
|
"rate": 120.0,
|
||||||
"tax_amount": 120.0,
|
"tax_amount": 120.0,
|
||||||
},
|
},
|
||||||
@@ -206,7 +206,7 @@ test_records = [
|
|||||||
"charge_type": "Actual",
|
"charge_type": "Actual",
|
||||||
"description": "Customs Duty",
|
"description": "Customs Duty",
|
||||||
"doctype": "Purchase Taxes and Charges",
|
"doctype": "Purchase Taxes and Charges",
|
||||||
"parentfield": "purchase_tax_details",
|
"parentfield": "other_charges",
|
||||||
"rate": 150.0,
|
"rate": 150.0,
|
||||||
"tax_amount": 150.0,
|
"tax_amount": 150.0,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -94,6 +94,8 @@ class DocType(StockController):
|
|||||||
self.doc.status = "Delivered"
|
self.doc.status = "Delivered"
|
||||||
else:
|
else:
|
||||||
self.doc.status = "Not Available"
|
self.doc.status = "Not Available"
|
||||||
|
else:
|
||||||
|
self.doc.status = "Not Available"
|
||||||
|
|
||||||
def set_purchase_details(self, purchase_sle):
|
def set_purchase_details(self, purchase_sle):
|
||||||
if purchase_sle:
|
if purchase_sle:
|
||||||
@@ -185,10 +187,9 @@ class DocType(StockController):
|
|||||||
def on_stock_ledger_entry(self):
|
def on_stock_ledger_entry(self):
|
||||||
if self.via_stock_ledger and not self.doc.fields.get("__islocal"):
|
if self.via_stock_ledger and not self.doc.fields.get("__islocal"):
|
||||||
last_sle = self.get_last_sle()
|
last_sle = self.get_last_sle()
|
||||||
if last_sle:
|
self.set_status(last_sle.get("last_sle"))
|
||||||
self.set_status(last_sle.get("last_sle"))
|
self.set_purchase_details(last_sle.get("purchase_sle"))
|
||||||
self.set_purchase_details(last_sle.get("purchase_sle"))
|
self.set_sales_details(last_sle.get("delivery_sle"))
|
||||||
self.set_sales_details(last_sle.get("delivery_sle"))
|
|
||||||
|
|
||||||
def on_communication(self):
|
def on_communication(self):
|
||||||
return
|
return
|
||||||
|
|||||||
@@ -288,12 +288,11 @@ cur_frm.cscript.purchase_receipt_no = function(doc, cdt, cdn) {
|
|||||||
cur_frm.cscript.supplier = function(doc, cdt, cdn) {
|
cur_frm.cscript.supplier = function(doc, cdt, cdn) {
|
||||||
if(doc.supplier)
|
if(doc.supplier)
|
||||||
return get_server_fields('get_supp_addr', '', '', doc, cdt, cdn, 1);
|
return get_server_fields('get_supp_addr', '', '', doc, cdt, cdn, 1);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict['production_order'].get_query = function(doc) {
|
cur_frm.fields_dict['production_order'].get_query = function(doc) {
|
||||||
return{
|
return {
|
||||||
filters:[
|
filters: [
|
||||||
['Production Order', 'docstatus', '=', 1],
|
['Production Order', 'docstatus', '=', 1],
|
||||||
['Production Order', 'qty', '>','`tabProduction Order`.produced_qty']
|
['Production Order', 'qty', '>','`tabProduction Order`.produced_qty']
|
||||||
]
|
]
|
||||||
@@ -371,7 +370,7 @@ cur_frm.cscript.validate = function(doc, cdt, cdn) {
|
|||||||
cur_frm.cscript.validate_items = function(doc) {
|
cur_frm.cscript.validate_items = function(doc) {
|
||||||
cl = getchildren('Stock Entry Detail', doc.name, 'mtn_details');
|
cl = getchildren('Stock Entry Detail', doc.name, 'mtn_details');
|
||||||
if (!cl.length) {
|
if (!cl.length) {
|
||||||
alert(wn._("Item table can not be blank"));
|
msgprint(wn._("Item table can not be blank"));
|
||||||
validated = false;
|
validated = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -385,9 +384,9 @@ cur_frm.cscript.cost_center = function(doc, cdt, cdn) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict.customer.get_query = function(doc, cdt, cdn) {
|
cur_frm.fields_dict.customer.get_query = function(doc, cdt, cdn) {
|
||||||
return{ query: "erpnext.controllers.queries.customer_query" }
|
return { query: "erpnext.controllers.queries.customer_query" }
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict.supplier.get_query = function(doc, cdt, cdn) {
|
cur_frm.fields_dict.supplier.get_query = function(doc, cdt, cdn) {
|
||||||
return{ query: "erpnext.controllers.queries.supplier_query" }
|
return { query: "erpnext.controllers.queries.supplier_query" }
|
||||||
}
|
}
|
||||||
@@ -344,7 +344,8 @@ class DocType(StockController):
|
|||||||
pro_bean = webnotes.bean("Production Order", self.doc.production_order)
|
pro_bean = webnotes.bean("Production Order", self.doc.production_order)
|
||||||
_validate_production_order(pro_bean)
|
_validate_production_order(pro_bean)
|
||||||
self.update_produced_qty(pro_bean)
|
self.update_produced_qty(pro_bean)
|
||||||
self.update_planned_qty(pro_bean)
|
if self.doc.purpose == "Manufacture/Repack":
|
||||||
|
self.update_planned_qty(pro_bean)
|
||||||
|
|
||||||
def update_produced_qty(self, pro_bean):
|
def update_produced_qty(self, pro_bean):
|
||||||
if self.doc.purpose == "Manufacture/Repack":
|
if self.doc.purpose == "Manufacture/Repack":
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import webnotes, unittest
|
|||||||
from webnotes.utils import flt
|
from webnotes.utils import flt
|
||||||
from erpnext.stock.doctype.serial_no.serial_no import *
|
from erpnext.stock.doctype.serial_no.serial_no import *
|
||||||
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory
|
from erpnext.stock.doctype.purchase_receipt.test_purchase_receipt import set_perpetual_inventory
|
||||||
|
from erpnext.stock.doctype.stock_ledger_entry.stock_ledger_entry import StockFreezeError
|
||||||
|
|
||||||
class TestStockEntry(unittest.TestCase):
|
class TestStockEntry(unittest.TestCase):
|
||||||
def tearDown(self):
|
def tearDown(self):
|
||||||
@@ -30,6 +31,7 @@ class TestStockEntry(unittest.TestCase):
|
|||||||
st2.submit()
|
st2.submit()
|
||||||
|
|
||||||
from erpnext.stock.utils import reorder_item
|
from erpnext.stock.utils import reorder_item
|
||||||
|
|
||||||
reorder_item()
|
reorder_item()
|
||||||
|
|
||||||
mr_name = webnotes.conn.sql("""select parent from `tabMaterial Request Item`
|
mr_name = webnotes.conn.sql("""select parent from `tabMaterial Request Item`
|
||||||
@@ -481,7 +483,7 @@ class TestStockEntry(unittest.TestCase):
|
|||||||
d.expense_head = "_Test Account Cost for Goods Sold - _TC"
|
d.expense_head = "_Test Account Cost for Goods Sold - _TC"
|
||||||
d.cost_center = "_Test Cost Center - _TC"
|
d.cost_center = "_Test Cost Center - _TC"
|
||||||
|
|
||||||
for d in pi.doclist.get({"parentfield": "purchase_tax_details"}):
|
for d in pi.doclist.get({"parentfield": "other_charges"}):
|
||||||
d.cost_center = "_Test Cost Center - _TC"
|
d.cost_center = "_Test Cost Center - _TC"
|
||||||
|
|
||||||
pi.run_method("calculate_taxes_and_totals")
|
pi.run_method("calculate_taxes_and_totals")
|
||||||
@@ -583,7 +585,7 @@ class TestStockEntry(unittest.TestCase):
|
|||||||
for d in pi.doclist.get({"parentfield": "entries"}):
|
for d in pi.doclist.get({"parentfield": "entries"}):
|
||||||
d.expense_head = "_Test Account Cost for Goods Sold - _TC"
|
d.expense_head = "_Test Account Cost for Goods Sold - _TC"
|
||||||
d.cost_center = "_Test Cost Center - _TC"
|
d.cost_center = "_Test Cost Center - _TC"
|
||||||
for d in pi.doclist.get({"parentfield": "purchase_tax_details"}):
|
for d in pi.doclist.get({"parentfield": "other_charges"}):
|
||||||
d.cost_center = "_Test Cost Center - _TC"
|
d.cost_center = "_Test Cost Center - _TC"
|
||||||
|
|
||||||
pi.run_method("calculate_taxes_and_totals")
|
pi.run_method("calculate_taxes_and_totals")
|
||||||
@@ -802,6 +804,23 @@ class TestStockEntry(unittest.TestCase):
|
|||||||
webnotes.defaults.clear_default("Warehouse", "_Test Warehouse 1 - _TC1", "test@example.com", parenttype="Restriction")
|
webnotes.defaults.clear_default("Warehouse", "_Test Warehouse 1 - _TC1", "test@example.com", parenttype="Restriction")
|
||||||
webnotes.defaults.clear_default("Warehouse", "_Test Warehouse 2 - _TC1", "test2@example.com", parenttype="Restriction")
|
webnotes.defaults.clear_default("Warehouse", "_Test Warehouse 2 - _TC1", "test2@example.com", parenttype="Restriction")
|
||||||
|
|
||||||
|
def test_freeze_stocks (self):
|
||||||
|
self._clear_stock_account_balance()
|
||||||
|
webnotes.conn.set_value('Stock Settings', None,'stock_auth_role', '')
|
||||||
|
|
||||||
|
# test freeze_stocks_upto
|
||||||
|
date_newer_than_test_records = add_days(getdate(test_records[0][0]['posting_date']), 5)
|
||||||
|
webnotes.conn.set_value("Stock Settings", None, "stock_frozen_upto", date_newer_than_test_records)
|
||||||
|
se = webnotes.bean(copy=test_records[0]).insert()
|
||||||
|
self.assertRaises (StockFreezeError, se.submit)
|
||||||
|
webnotes.conn.set_value("Stock Settings", None, "stock_frozen_upto", '')
|
||||||
|
|
||||||
|
# test freeze_stocks_upto_days
|
||||||
|
webnotes.conn.set_value("Stock Settings", None, "stock_frozen_upto_days", 7)
|
||||||
|
se = webnotes.bean(copy=test_records[0]).insert()
|
||||||
|
self.assertRaises (StockFreezeError, se.submit)
|
||||||
|
webnotes.conn.set_value("Stock Settings", None, "stock_frozen_upto_days", 0)
|
||||||
|
|
||||||
def make_serialized_item():
|
def make_serialized_item():
|
||||||
se = webnotes.bean(copy=test_records[0])
|
se = webnotes.bean(copy=test_records[0])
|
||||||
se.doclist[1].item_code = "_Test Serialized Item With Series"
|
se.doclist[1].item_code = "_Test Serialized Item With Series"
|
||||||
|
|||||||
@@ -1,11 +1,15 @@
|
|||||||
|
|
||||||
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||||
# License: GNU General Public License v3. See license.txt
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import webnotes
|
import webnotes
|
||||||
from webnotes import msgprint
|
from webnotes import msgprint
|
||||||
from webnotes.utils import flt, getdate
|
from webnotes.utils import flt, getdate, add_days
|
||||||
from webnotes.model.controller import DocListController
|
from webnotes.model.controller import DocListController
|
||||||
|
from datetime import date
|
||||||
|
|
||||||
|
class StockFreezeError(webnotes.ValidationError): pass
|
||||||
|
|
||||||
class DocType(DocListController):
|
class DocType(DocListController):
|
||||||
def __init__(self, doc, doclist=[]):
|
def __init__(self, doc, doclist=[]):
|
||||||
@@ -20,7 +24,8 @@ class DocType(DocListController):
|
|||||||
self.scrub_posting_time()
|
self.scrub_posting_time()
|
||||||
|
|
||||||
from erpnext.accounts.utils import validate_fiscal_year
|
from erpnext.accounts.utils import validate_fiscal_year
|
||||||
validate_fiscal_year(self.doc.posting_date, self.doc.fiscal_year, self.meta.get_label("posting_date"))
|
validate_fiscal_year(self.doc.posting_date, self.doc.fiscal_year,
|
||||||
|
self.meta.get_label("posting_date"))
|
||||||
|
|
||||||
def on_submit(self):
|
def on_submit(self):
|
||||||
self.check_stock_frozen_date()
|
self.check_stock_frozen_date()
|
||||||
@@ -85,7 +90,15 @@ class DocType(DocListController):
|
|||||||
if stock_frozen_upto:
|
if stock_frozen_upto:
|
||||||
stock_auth_role = webnotes.conn.get_value('Stock Settings', None,'stock_auth_role')
|
stock_auth_role = webnotes.conn.get_value('Stock Settings', None,'stock_auth_role')
|
||||||
if getdate(self.doc.posting_date) <= getdate(stock_frozen_upto) and not stock_auth_role in webnotes.user.get_roles():
|
if getdate(self.doc.posting_date) <= getdate(stock_frozen_upto) and not stock_auth_role in webnotes.user.get_roles():
|
||||||
msgprint("You are not authorized to do / modify back dated stock entries before %s" % getdate(stock_frozen_upto).strftime('%d-%m-%Y'), raise_exception=1)
|
msgprint("You are not authorized to do / modify back dated stock entries before %s" % getdate(stock_frozen_upto).strftime('%d-%m-%Y'), raise_exception=StockFreezeError)
|
||||||
|
|
||||||
|
stock_frozen_upto_days = int(webnotes.conn.get_value('Stock Settings', None, 'stock_frozen_upto_days') or 0)
|
||||||
|
if stock_frozen_upto_days:
|
||||||
|
stock_auth_role = webnotes.conn.get_value('Stock Settings', None,'stock_auth_role')
|
||||||
|
older_than_x_days_ago = (add_days(getdate(self.doc.posting_date), stock_frozen_upto_days) <= date.today())
|
||||||
|
if older_than_x_days_ago and not stock_auth_role in webnotes.user.get_roles():
|
||||||
|
msgprint("You are not authorized to do / modify back dated stock entries older than %d days ago" %stock_frozen_upto_days, raise_exception=StockFreezeError)
|
||||||
|
|
||||||
|
|
||||||
def scrub_posting_time(self):
|
def scrub_posting_time(self):
|
||||||
if not self.doc.posting_time or self.doc.posting_time == '00:0':
|
if not self.doc.posting_time or self.doc.posting_time == '00:0':
|
||||||
|
|||||||
@@ -40,6 +40,14 @@ erpnext.stock.StockReconciliation = erpnext.stock.StockController.extend({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
this.frm.fields_dict["cost_center"].get_query = function() {
|
||||||
|
return {
|
||||||
|
"filters": {
|
||||||
|
'company': me.frm.doc.company,
|
||||||
|
'group_or_ledger': 'Ledger'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import webnotes
|
import webnotes
|
||||||
|
from webnotes import _
|
||||||
|
|
||||||
class DocType:
|
class DocType:
|
||||||
def __init__(self, d, dl):
|
def __init__(self, d, dl):
|
||||||
@@ -20,3 +20,8 @@ class DocType:
|
|||||||
set_by_naming_series("Item", "item_code",
|
set_by_naming_series("Item", "item_code",
|
||||||
self.doc.get("item_naming_by")=="Naming Series", hide_name_field=True)
|
self.doc.get("item_naming_by")=="Naming Series", hide_name_field=True)
|
||||||
|
|
||||||
|
stock_frozen_limit = 356
|
||||||
|
submitted_stock_frozen = self.doc.stock_frozen_upto_days
|
||||||
|
if submitted_stock_frozen > stock_frozen_limit:
|
||||||
|
self.doc.stock_frozen_upto_days = stock_frozen_limit
|
||||||
|
webnotes.msgprint (_("`Freeze Stocks Older Than` should be smaller than %d days.") %stock_frozen_limit)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-06-24 16:37:54",
|
"creation": "2013-06-24 16:37:54",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2013-12-20 19:21:48",
|
"modified": "2014-01-27 20:00:56",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -117,6 +117,12 @@
|
|||||||
"fieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
"label": "Stock Frozen Upto"
|
"label": "Stock Frozen Upto"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"doctype": "DocField",
|
||||||
|
"fieldname": "stock_frozen_upto_days",
|
||||||
|
"fieldtype": "Int",
|
||||||
|
"label": "Freeze Stocks Older Than [Days]"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "stock_auth_role",
|
"fieldname": "stock_auth_role",
|
||||||
|
|||||||
@@ -5,34 +5,36 @@ wn.provide("erpnext.support");
|
|||||||
// TODO commonify this code
|
// TODO commonify this code
|
||||||
erpnext.support.MaintenanceSchedule = wn.ui.form.Controller.extend({
|
erpnext.support.MaintenanceSchedule = wn.ui.form.Controller.extend({
|
||||||
refresh: function() {
|
refresh: function() {
|
||||||
if (this.frm.doc.docstatus===0) {
|
var me = this;
|
||||||
cur_frm.add_custom_button(wn._('From Sales Order'),
|
|
||||||
|
if (this.frm.doc.docstatus === 0) {
|
||||||
|
this.frm.add_custom_button(wn._('From Sales Order'),
|
||||||
function() {
|
function() {
|
||||||
wn.model.map_current_doc({
|
wn.model.map_current_doc({
|
||||||
method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_schedule",
|
method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_schedule",
|
||||||
source_doctype: "Sales Order",
|
source_doctype: "Sales Order",
|
||||||
get_query_filters: {
|
get_query_filters: {
|
||||||
docstatus: 1,
|
docstatus: 1,
|
||||||
order_type: cur_frm.doc.order_type,
|
order_type: me.frm.doc.order_type,
|
||||||
customer: cur_frm.doc.customer || undefined,
|
customer: me.frm.doc.customer || undefined,
|
||||||
company: cur_frm.doc.company
|
company: me.frm.doc.company
|
||||||
}
|
}
|
||||||
})
|
});
|
||||||
});
|
});
|
||||||
} else if (this.frm.doc.docstatus===1) {
|
} else if (this.frm.doc.docstatus === 1) {
|
||||||
cur_frm.add_custom_button(wn._("Make Maintenance Visit"), function() {
|
this.frm.add_custom_button(wn._("Make Maintenance Visit"), function() {
|
||||||
wn.model.open_mapped_doc({
|
wn.model.open_mapped_doc({
|
||||||
method: "erpnext.support.doctype.maintenance_schedule.maintenance_schedule.make_maintenance_visit",
|
method: "erpnext.support.doctype.maintenance_schedule.maintenance_schedule.make_maintenance_visit",
|
||||||
source_name: cur_frm.doc.name
|
source_name: me.frm.doc.name
|
||||||
})
|
})
|
||||||
})
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
customer: function() {
|
customer: function() {
|
||||||
var me = this;
|
var me = this;
|
||||||
if(this.frm.doc.customer) {
|
if(this.frm.doc.customer) {
|
||||||
return this.frm.call({
|
return this.frm.call({
|
||||||
doc: this.frm.doc,
|
doc: me.frm.doc,
|
||||||
method: "set_customer_defaults",
|
method: "set_customer_defaults",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -42,70 +44,78 @@ erpnext.support.MaintenanceSchedule = wn.ui.form.Controller.extend({
|
|||||||
$.extend(cur_frm.cscript, new erpnext.support.MaintenanceSchedule({frm: cur_frm}));
|
$.extend(cur_frm.cscript, new erpnext.support.MaintenanceSchedule({frm: cur_frm}));
|
||||||
|
|
||||||
cur_frm.cscript.onload = function(doc, dt, dn) {
|
cur_frm.cscript.onload = function(doc, dt, dn) {
|
||||||
if(!doc.status) set_multiple(dt,dn,{status:'Draft'});
|
if (!doc.status)
|
||||||
|
set_multiple(dt, dn, { status:'Draft' });
|
||||||
|
|
||||||
if(doc.__islocal){
|
if (doc.__islocal) {
|
||||||
set_multiple(dt,dn,{transaction_date:get_today()});
|
set_multiple(dt, dn, { transaction_date:get_today() });
|
||||||
hide_field(['customer_address','contact_person','customer_name','address_display','contact_display','contact_mobile','contact_email','territory','customer_group']);
|
hide_field(['customer_address', 'contact_person', 'customer_name', 'address_display',
|
||||||
}
|
'contact_display', 'contact_mobile', 'contact_email', 'territory', 'customer_group']);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc,dt,dn) {
|
cur_frm.cscript.customer_address = cur_frm.cscript.contact_person = function(doc, dt, dn) {
|
||||||
if(doc.customer) return get_server_fields('get_customer_address', JSON.stringify({customer: doc.customer, address: doc.customer_address, contact: doc.contact_person}),'', doc, dt, dn, 1);
|
if (doc.customer) {
|
||||||
|
return get_server_fields('get_customer_address',
|
||||||
|
JSON.stringify({customer: doc.customer, address: doc.customer_address,
|
||||||
|
contact: doc.contact_person}), '', doc, dt, dn, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
|
cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
|
||||||
return{
|
return {
|
||||||
filters:{ 'customer': doc.customer}
|
filters:{ 'customer': doc.customer }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
|
cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
|
||||||
return{
|
return {
|
||||||
filters:{ 'customer': doc.customer}
|
filters:{ 'customer': doc.customer }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
cur_frm.fields_dict['item_maintenance_detail'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) {
|
cur_frm.fields_dict['item_maintenance_detail'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) {
|
||||||
return{
|
return {
|
||||||
filters:{ 'is_service_item': "Yes"}
|
filters:{ 'is_service_item': "Yes" }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.item_code = function(doc, cdt, cdn) {
|
cur_frm.cscript.item_code = function(doc, cdt, cdn) {
|
||||||
var fname = cur_frm.cscript.fname;
|
var fname = cur_frm.cscript.fname;
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
if (d.item_code) {
|
if (d.item_code) {
|
||||||
return get_server_fields('get_item_details',d.item_code, 'item_maintenance_detail',doc,cdt,cdn,1);
|
return get_server_fields('get_item_details', d.item_code, 'item_maintenance_detail',
|
||||||
}
|
doc, cdt, cdn, 1);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.periodicity = function(doc, cdt, cdn){
|
cur_frm.cscript.periodicity = function(doc, cdt, cdn){
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
if(d.start_date && d.end_date){
|
if(d.start_date && d.end_date) {
|
||||||
arg = {}
|
arg = {}
|
||||||
arg.start_date = d.start_date;
|
arg.start_date = d.start_date;
|
||||||
arg.end_date = d.end_date;
|
arg.end_date = d.end_date;
|
||||||
arg.periodicity = d.periodicity;
|
arg.periodicity = d.periodicity;
|
||||||
return get_server_fields('get_no_of_visits',docstring(arg),'item_maintenance_detail',doc, cdt, cdn, 1);
|
return get_server_fields('get_no_of_visits', docstring(arg),
|
||||||
}
|
'item_maintenance_detail', doc, cdt, cdn, 1);
|
||||||
else{
|
} else {
|
||||||
msgprint(wn._("Please enter Start Date and End Date"));
|
msgprint(wn._("Please enter Start Date and End Date"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.generate_schedule = function(doc, cdt, cdn) {
|
cur_frm.cscript.generate_schedule = function(doc, cdt, cdn) {
|
||||||
if (!doc.__islocal) {
|
if (!doc.__islocal) {
|
||||||
return $c('runserverobj', args={'method':'generate_schedule', 'docs':wn.model.compress(make_doclist(cdt,cdn))},
|
return $c('runserverobj', args={'method':'generate_schedule',
|
||||||
function(r,rt){
|
'docs':wn.model.compress(make_doclist(cdt,cdn))},
|
||||||
refresh_field('maintenance_schedule_detail');
|
function(r, rt) {
|
||||||
}
|
refresh_field('maintenance_schedule_detail');
|
||||||
);
|
});
|
||||||
} else {
|
} else {
|
||||||
alert(wn._("Please save the document before generating maintenance schedule"));
|
msgprint(wn._("Please save the document before generating maintenance schedule"));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict.customer.get_query = function(doc,cdt,cdn) {
|
cur_frm.fields_dict.customer.get_query = function(doc,cdt,cdn) {
|
||||||
return{ query: "erpnext.controllers.queries.customer_query" } }
|
return { query: "erpnext.controllers.queries.customer_query" }
|
||||||
|
}
|
||||||
|
|||||||
@@ -4,13 +4,10 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import webnotes
|
import webnotes
|
||||||
|
|
||||||
from webnotes.utils import add_days, cstr, getdate
|
from webnotes.utils import add_days, cstr, getdate, cint
|
||||||
from webnotes.model.doc import addchild
|
from webnotes.model.doc import addchild
|
||||||
from webnotes.model.bean import getlist
|
from webnotes.model.bean import getlist
|
||||||
from webnotes import msgprint
|
from webnotes import msgprint, throw, _
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
from erpnext.utilities.transaction_base import TransactionBase, delete_events
|
from erpnext.utilities.transaction_base import TransactionBase, delete_events
|
||||||
|
|
||||||
class DocType(TransactionBase):
|
class DocType(TransactionBase):
|
||||||
@@ -19,7 +16,8 @@ class DocType(TransactionBase):
|
|||||||
self.doclist = doclist
|
self.doclist = doclist
|
||||||
|
|
||||||
def get_item_details(self, item_code):
|
def get_item_details(self, item_code):
|
||||||
item = webnotes.conn.sql("select item_name, description from `tabItem` where name = '%s'" %(item_code), as_dict=1)
|
item = webnotes.conn.sql("""select item_name, description from `tabItem`
|
||||||
|
where name=%s""", (item_code), as_dict=1)
|
||||||
ret = {
|
ret = {
|
||||||
'item_name': item and item[0]['item_name'] or '',
|
'item_name': item and item[0]['item_name'] or '',
|
||||||
'description' : item and item[0]['description'] or ''
|
'description' : item and item[0]['description'] or ''
|
||||||
@@ -28,12 +26,13 @@ class DocType(TransactionBase):
|
|||||||
|
|
||||||
def generate_schedule(self):
|
def generate_schedule(self):
|
||||||
self.doclist = self.doc.clear_table(self.doclist, 'maintenance_schedule_detail')
|
self.doclist = self.doc.clear_table(self.doclist, 'maintenance_schedule_detail')
|
||||||
count = 0
|
webnotes.conn.sql("""delete from `tabMaintenance Schedule Detail`
|
||||||
webnotes.conn.sql("delete from `tabMaintenance Schedule Detail` where parent='%s'" %(self.doc.name))
|
where parent=%s""", (self.doc.name))
|
||||||
|
count = 1
|
||||||
for d in getlist(self.doclist, 'item_maintenance_detail'):
|
for d in getlist(self.doclist, 'item_maintenance_detail'):
|
||||||
self.validate_maintenance_detail()
|
self.validate_maintenance_detail()
|
||||||
s_list =[]
|
s_list = []
|
||||||
s_list = self.create_schedule_list(d.start_date, d.end_date, d.no_of_visits)
|
s_list = self.create_schedule_list(d.start_date, d.end_date, d.no_of_visits, d.sales_person)
|
||||||
for i in range(d.no_of_visits):
|
for i in range(d.no_of_visits):
|
||||||
child = addchild(self.doc, 'maintenance_schedule_detail',
|
child = addchild(self.doc, 'maintenance_schedule_detail',
|
||||||
'Maintenance Schedule Detail', self.doclist)
|
'Maintenance Schedule Detail', self.doclist)
|
||||||
@@ -43,40 +42,39 @@ class DocType(TransactionBase):
|
|||||||
if d.serial_no:
|
if d.serial_no:
|
||||||
child.serial_no = d.serial_no
|
child.serial_no = d.serial_no
|
||||||
child.idx = count
|
child.idx = count
|
||||||
count = count+1
|
count = count + 1
|
||||||
child.incharge_name = d.incharge_name
|
child.sales_person = d.sales_person
|
||||||
child.save(1)
|
child.save(1)
|
||||||
|
|
||||||
self.on_update()
|
self.on_update()
|
||||||
|
|
||||||
def on_submit(self):
|
def on_submit(self):
|
||||||
if not getlist(self.doclist, 'maintenance_schedule_detail'):
|
if not getlist(self.doclist, 'maintenance_schedule_detail'):
|
||||||
msgprint("Please click on 'Generate Schedule' to get schedule")
|
throw("Please click on 'Generate Schedule' to get schedule")
|
||||||
raise Exception
|
|
||||||
self.check_serial_no_added()
|
self.check_serial_no_added()
|
||||||
self.validate_serial_no_warranty()
|
self.validate_serial_no_warranty()
|
||||||
self.validate_schedule()
|
self.validate_schedule()
|
||||||
|
|
||||||
email_map ={}
|
email_map = {}
|
||||||
for d in getlist(self.doclist, 'item_maintenance_detail'):
|
for d in getlist(self.doclist, 'item_maintenance_detail'):
|
||||||
if d.serial_no:
|
if d.serial_no:
|
||||||
self.update_amc_date(d.serial_no, d.end_date)
|
self.update_amc_date(d.serial_no, d.end_date)
|
||||||
|
|
||||||
if d.incharge_name not in email_map:
|
if d.sales_person not in email_map:
|
||||||
email_map[d.incharge_name] = webnotes.bean("Sales Person",
|
sp = webnotes.bean("Sales Person", d.sales_person).make_controller()
|
||||||
d.incharge_name).run_method("get_email_id")
|
email_map[d.sales_person] = sp.get_email_id()
|
||||||
|
|
||||||
scheduled_date =webnotes.conn.sql("select scheduled_date from `tabMaintenance Schedule Detail` \
|
scheduled_date = webnotes.conn.sql("""select scheduled_date from
|
||||||
where incharge_name='%s' and item_code='%s' and parent='%s' " %(d.incharge_name, \
|
`tabMaintenance Schedule Detail` where sales_person=%s and item_code=%s and
|
||||||
d.item_code, self.doc.name), as_dict=1)
|
parent=%s""", (d.sales_person, d.item_code, self.doc.name), as_dict=1)
|
||||||
|
|
||||||
for key in scheduled_date:
|
for key in scheduled_date:
|
||||||
if email_map[d.incharge_name]:
|
if email_map[d.sales_person]:
|
||||||
description = "Reference: %s, Item Code: %s and Customer: %s" % \
|
description = "Reference: %s, Item Code: %s and Customer: %s" % \
|
||||||
(self.doc.name, d.item_code, self.doc.customer)
|
(self.doc.name, d.item_code, self.doc.customer)
|
||||||
webnotes.bean({
|
webnotes.bean({
|
||||||
"doctype": "Event",
|
"doctype": "Event",
|
||||||
"owner": email_map[d.incharge_name] or self.doc.owner,
|
"owner": email_map[d.sales_person] or self.doc.owner,
|
||||||
"subject": description,
|
"subject": description,
|
||||||
"description": description,
|
"description": description,
|
||||||
"starts_on": key["scheduled_date"] + " 10:00:00",
|
"starts_on": key["scheduled_date"] + " 10:00:00",
|
||||||
@@ -89,92 +87,121 @@ class DocType(TransactionBase):
|
|||||||
|
|
||||||
#get schedule dates
|
#get schedule dates
|
||||||
#----------------------
|
#----------------------
|
||||||
def create_schedule_list(self, start_date, end_date, no_of_visit):
|
def create_schedule_list(self, start_date, end_date, no_of_visit, sales_person):
|
||||||
schedule_list = []
|
schedule_list = []
|
||||||
start_date1 = start_date
|
start_date_copy = start_date
|
||||||
date_diff = (getdate(end_date) - getdate(start_date)).days
|
date_diff = (getdate(end_date) - getdate(start_date)).days
|
||||||
add_by = date_diff/no_of_visit
|
add_by = date_diff / no_of_visit
|
||||||
#schedule_list.append(start_date1)
|
|
||||||
while(getdate(start_date1) < getdate(end_date)):
|
for visit in range(cint(no_of_visit)):
|
||||||
start_date1 = add_days(start_date1, add_by)
|
if (getdate(start_date_copy) < getdate(end_date)):
|
||||||
if len(schedule_list) < no_of_visit:
|
start_date_copy = add_days(start_date_copy, add_by)
|
||||||
schedule_list.append(getdate(start_date1))
|
if len(schedule_list) < no_of_visit:
|
||||||
|
schedule_date = self.validate_schedule_date_for_holiday_list(getdate(start_date_copy),
|
||||||
|
sales_person)
|
||||||
|
if schedule_date > getdate(end_date):
|
||||||
|
schedule_date = getdate(end_date)
|
||||||
|
schedule_list.append(schedule_date)
|
||||||
|
|
||||||
return schedule_list
|
return schedule_list
|
||||||
|
|
||||||
|
def validate_schedule_date_for_holiday_list(self, schedule_date, sales_person):
|
||||||
|
from erpnext.accounts.utils import get_fiscal_year
|
||||||
|
validated = False
|
||||||
|
fy_details = ""
|
||||||
|
|
||||||
|
try:
|
||||||
|
fy_details = get_fiscal_year(date=schedule_date, verbose=0)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if fy_details and fy_details[0]:
|
||||||
|
# check holiday list in employee master
|
||||||
|
holiday_list = webnotes.conn.sql_list("""select h.holiday_date from `tabEmployee` emp,
|
||||||
|
`tabSales Person` sp, `tabHoliday` h, `tabHoliday List` hl
|
||||||
|
where sp.name=%s and emp.name=sp.employee
|
||||||
|
and hl.name=emp.holiday_list and
|
||||||
|
h.parent=hl.name and
|
||||||
|
hl.fiscal_year=%s""", (sales_person, fy_details[0]))
|
||||||
|
if not holiday_list:
|
||||||
|
# check global holiday list
|
||||||
|
holiday_list = webnotes.conn.sql("""select h.holiday_date from
|
||||||
|
`tabHoliday` h, `tabHoliday List` hl
|
||||||
|
where h.parent=hl.name and ifnull(hl.is_default, 0) = 1
|
||||||
|
and hl.fiscal_year=%s""", fy_details[0])
|
||||||
|
|
||||||
|
if not validated and holiday_list:
|
||||||
|
if schedule_date in holiday_list:
|
||||||
|
schedule_date = add_days(schedule_date, -1)
|
||||||
|
else:
|
||||||
|
validated = True
|
||||||
|
|
||||||
|
return schedule_date
|
||||||
|
|
||||||
#validate date range and periodicity selected
|
#validate date range and periodicity selected
|
||||||
#-------------------------------------------------
|
#-------------------------------------------------
|
||||||
def validate_period(self, arg):
|
def validate_period(self, arg):
|
||||||
arg1 = eval(arg)
|
args = eval(arg)
|
||||||
if getdate(arg1['start_date']) >= getdate(arg1['end_date']):
|
if getdate(args['start_date']) >= getdate(args['end_date']):
|
||||||
msgprint("Start date should be less than end date ")
|
throw(_("Start date should be less than end date."))
|
||||||
raise Exception
|
|
||||||
|
|
||||||
period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1
|
period = (getdate(args['end_date']) - getdate(args['start_date'])).days + 1
|
||||||
|
|
||||||
if (arg1['periodicity']=='Yearly' or arg1['periodicity']=='Half Yearly' or arg1['periodicity']=='Quarterly') and period<365:
|
if (args['periodicity'] == 'Yearly' or args['periodicity'] == 'Half Yearly' or
|
||||||
msgprint(cstr(arg1['periodicity'])+ " periodicity can be set for period of atleast 1 year or more only")
|
args['periodicity'] == 'Quarterly') and period < 365:
|
||||||
raise Exception
|
throw(cstr(args['periodicity']) + " periodicity can be set for period of atleast 1 year or more only")
|
||||||
elif arg1['periodicity']=='Monthly' and period<30:
|
elif args['periodicity'] == 'Monthly' and period < 30:
|
||||||
msgprint("Monthly periodicity can be set for period of atleast 1 month or more")
|
throw("Monthly periodicity can be set for period of atleast 1 month or more")
|
||||||
raise Exception
|
elif args['periodicity'] == 'Weekly' and period < 7:
|
||||||
elif arg1['periodicity']=='Weekly' and period<7:
|
throw("Weekly periodicity can be set for period of atleast 1 week or more")
|
||||||
msgprint("Weekly periodicity can be set for period of atleast 1 week or more")
|
|
||||||
raise Exception
|
|
||||||
|
|
||||||
def get_no_of_visits(self, arg):
|
def get_no_of_visits(self, arg):
|
||||||
arg1 = eval(arg)
|
args = eval(arg)
|
||||||
self.validate_period(arg)
|
self.validate_period(arg)
|
||||||
period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1
|
period = (getdate(args['end_date']) - getdate(args['start_date'])).days + 1
|
||||||
|
count = 0
|
||||||
|
|
||||||
count =0
|
if args['periodicity'] == 'Weekly':
|
||||||
if arg1['periodicity'] == 'Weekly':
|
|
||||||
count = period/7
|
count = period/7
|
||||||
elif arg1['periodicity'] == 'Monthly':
|
elif args['periodicity'] == 'Monthly':
|
||||||
count = period/30
|
count = period/30
|
||||||
elif arg1['periodicity'] == 'Quarterly':
|
elif args['periodicity'] == 'Quarterly':
|
||||||
count = period/91
|
count = period/91
|
||||||
elif arg1['periodicity'] == 'Half Yearly':
|
elif args['periodicity'] == 'Half Yearly':
|
||||||
count = period/182
|
count = period/182
|
||||||
elif arg1['periodicity'] == 'Yearly':
|
elif args['periodicity'] == 'Yearly':
|
||||||
count = period/365
|
count = period/365
|
||||||
|
|
||||||
ret = {'no_of_visits':count}
|
ret = {'no_of_visits' : count}
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def validate_maintenance_detail(self):
|
def validate_maintenance_detail(self):
|
||||||
if not getlist(self.doclist, 'item_maintenance_detail'):
|
if not getlist(self.doclist, 'item_maintenance_detail'):
|
||||||
msgprint("Please enter Maintaince Details first")
|
throw(_("Please enter Maintaince Details first"))
|
||||||
raise Exception
|
|
||||||
|
|
||||||
for d in getlist(self.doclist, 'item_maintenance_detail'):
|
for d in getlist(self.doclist, 'item_maintenance_detail'):
|
||||||
if not d.item_code:
|
if not d.item_code:
|
||||||
msgprint("Please select item code")
|
throw(_("Please select item code"))
|
||||||
raise Exception
|
|
||||||
elif not d.start_date or not d.end_date:
|
elif not d.start_date or not d.end_date:
|
||||||
msgprint("Please select Start Date and End Date for item "+d.item_code)
|
throw(_("Please select Start Date and End Date for item") + " " + d.item_code)
|
||||||
raise Exception
|
|
||||||
elif not d.no_of_visits:
|
elif not d.no_of_visits:
|
||||||
msgprint("Please mention no of visits required")
|
throw(_("Please mention no of visits required"))
|
||||||
raise Exception
|
elif not d.sales_person:
|
||||||
elif not d.incharge_name:
|
throw(_("Please select Incharge Person's name"))
|
||||||
msgprint("Please select Incharge Person's name")
|
|
||||||
raise Exception
|
|
||||||
|
|
||||||
if getdate(d.start_date) >= getdate(d.end_date):
|
if getdate(d.start_date) >= getdate(d.end_date):
|
||||||
msgprint("Start date should be less than end date for item "+d.item_code)
|
throw(_("Start date should be less than end date for item") + " " + d.item_code)
|
||||||
raise Exception
|
|
||||||
|
|
||||||
#check if maintenance schedule already created against same sales order
|
#check if maintenance schedule already created against same sales order
|
||||||
#-----------------------------------------------------------------------------------
|
#-----------------------------------------------------------------------------------
|
||||||
def validate_sales_order(self):
|
def validate_sales_order(self):
|
||||||
for d in getlist(self.doclist, 'item_maintenance_detail'):
|
for d in getlist(self.doclist, 'item_maintenance_detail'):
|
||||||
if d.prevdoc_docname:
|
if d.prevdoc_docname:
|
||||||
chk = webnotes.conn.sql("select t1.name from `tabMaintenance Schedule` t1, `tabMaintenance Schedule Item` t2 where t2.parent=t1.name and t2.prevdoc_docname=%s and t1.docstatus=1", d.prevdoc_docname)
|
chk = webnotes.conn.sql("""select ms.name from `tabMaintenance Schedule` ms,
|
||||||
|
`tabMaintenance Schedule Item` msi where msi.parent=ms.name and
|
||||||
|
msi.prevdoc_docname=%s and ms.docstatus=1""", d.prevdoc_docname)
|
||||||
if chk:
|
if chk:
|
||||||
msgprint("Maintenance Schedule against "+d.prevdoc_docname+" already exist")
|
throw("Maintenance Schedule against " + d.prevdoc_docname + " already exist")
|
||||||
raise Exception
|
|
||||||
|
|
||||||
|
|
||||||
def validate_serial_no(self):
|
def validate_serial_no(self):
|
||||||
@@ -185,13 +212,13 @@ class DocType(TransactionBase):
|
|||||||
cur_s_no = cur_serial_no.split(',')
|
cur_s_no = cur_serial_no.split(',')
|
||||||
|
|
||||||
for x in cur_s_no:
|
for x in cur_s_no:
|
||||||
chk = webnotes.conn.sql("select name, status from `tabSerial No` where docstatus!=2 and name=%s", (x))
|
chk = webnotes.conn.sql("""select name, status from `tabSerial No`
|
||||||
|
where docstatus!=2 and name=%s""", (x))
|
||||||
chk1 = chk and chk[0][0] or ''
|
chk1 = chk and chk[0][0] or ''
|
||||||
status = chk and chk[0][1] or ''
|
status = chk and chk[0][1] or ''
|
||||||
|
|
||||||
if not chk1:
|
if not chk1:
|
||||||
msgprint("Serial no "+x+" does not exist in system.")
|
throw("Serial no " + x + " does not exist in system.")
|
||||||
raise Exception
|
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
self.validate_maintenance_detail()
|
self.validate_maintenance_detail()
|
||||||
@@ -208,13 +235,13 @@ class DocType(TransactionBase):
|
|||||||
cur_s_no = cur_serial_no.split(',')
|
cur_s_no = cur_serial_no.split(',')
|
||||||
|
|
||||||
for x in cur_s_no:
|
for x in cur_s_no:
|
||||||
dt = webnotes.conn.sql("select delivery_date from `tabSerial No` where name = %s", x)
|
dt = webnotes.conn.sql("""select delivery_date from `tabSerial No`
|
||||||
|
where name=%s""", x)
|
||||||
dt = dt and dt[0][0] or ''
|
dt = dt and dt[0][0] or ''
|
||||||
|
|
||||||
if dt:
|
if dt:
|
||||||
if dt > getdate(d.start_date):
|
if dt > getdate(d.start_date):
|
||||||
msgprint("Maintenance start date can not be before delivery date "+dt.strftime('%Y-%m-%d')+" for serial no "+x)
|
throw("Maintenance start date can not be before delivery date " + dt.strftime('%Y-%m-%d') + " for serial no " + x)
|
||||||
raise Exception
|
|
||||||
|
|
||||||
#update amc expiry date in serial no
|
#update amc expiry date in serial no
|
||||||
#------------------------------------------
|
#------------------------------------------
|
||||||
@@ -224,7 +251,8 @@ class DocType(TransactionBase):
|
|||||||
cur_s_no = cur_serial_no.split(',')
|
cur_s_no = cur_serial_no.split(',')
|
||||||
|
|
||||||
for x in cur_s_no:
|
for x in cur_s_no:
|
||||||
webnotes.conn.sql("update `tabSerial No` set amc_expiry_date = '%s', maintenance_status = 'Under AMC' where name = '%s'"% (amc_end_date,x))
|
webnotes.conn.sql("""update `tabSerial No` set amc_expiry_date=%s,
|
||||||
|
maintenance_status='Under AMC' where name=%s""", (amc_end_date, x))
|
||||||
|
|
||||||
def on_update(self):
|
def on_update(self):
|
||||||
webnotes.conn.set(self.doc, 'status', 'Draft')
|
webnotes.conn.set(self.doc, 'status', 'Draft')
|
||||||
@@ -233,16 +261,16 @@ class DocType(TransactionBase):
|
|||||||
for d in getlist(self.doclist, 'item_maintenance_detail'):
|
for d in getlist(self.doclist, 'item_maintenance_detail'):
|
||||||
if cstr(d.serial_no).strip():
|
if cstr(d.serial_no).strip():
|
||||||
dt = webnotes.conn.sql("""select warranty_expiry_date, amc_expiry_date
|
dt = webnotes.conn.sql("""select warranty_expiry_date, amc_expiry_date
|
||||||
from `tabSerial No` where name = %s""", d.serial_no, as_dict=1)
|
from `tabSerial No` where name=%s""", d.serial_no, as_dict=1)
|
||||||
if dt[0]['warranty_expiry_date'] and dt[0]['warranty_expiry_date'] >= d.start_date:
|
if dt[0]['warranty_expiry_date'] and dt[0]['warranty_expiry_date'] >= d.start_date:
|
||||||
webnotes.msgprint("""Serial No: %s is already under warranty upto %s.
|
throw("""Serial No: %s is already under warranty upto %s.
|
||||||
Please check AMC Start Date.""" %
|
Please check AMC Start Date.""" %
|
||||||
(d.serial_no, dt[0]["warranty_expiry_date"]), raise_exception=1)
|
(d.serial_no, dt[0]["warranty_expiry_date"]))
|
||||||
|
|
||||||
if dt[0]['amc_expiry_date'] and dt[0]['amc_expiry_date'] >= d.start_date:
|
if dt[0]['amc_expiry_date'] and dt[0]['amc_expiry_date'] >= d.start_date:
|
||||||
webnotes.msgprint("""Serial No: %s is already under AMC upto %s.
|
throw("""Serial No: %s is already under AMC upto %s.
|
||||||
Please check AMC Start Date.""" %
|
Please check AMC Start Date.""" %
|
||||||
(d.serial_no, dt[0]["amc_expiry_date"]), raise_exception=1)
|
(d.serial_no, dt[0]["amc_expiry_date"]))
|
||||||
|
|
||||||
def validate_schedule(self):
|
def validate_schedule(self):
|
||||||
item_lst1 =[]
|
item_lst1 =[]
|
||||||
@@ -256,13 +284,11 @@ class DocType(TransactionBase):
|
|||||||
item_lst2.append(m.item_code)
|
item_lst2.append(m.item_code)
|
||||||
|
|
||||||
if len(item_lst1) != len(item_lst2):
|
if len(item_lst1) != len(item_lst2):
|
||||||
msgprint("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'")
|
throw("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'")
|
||||||
raise Exception
|
|
||||||
else:
|
else:
|
||||||
for x in item_lst1:
|
for x in item_lst1:
|
||||||
if x not in item_lst2:
|
if x not in item_lst2:
|
||||||
msgprint("Maintenance Schedule is not generated for item "+x+". Please click on 'Generate Schedule'")
|
throw("Maintenance Schedule is not generated for item "+x+". Please click on 'Generate Schedule'")
|
||||||
raise Exception
|
|
||||||
|
|
||||||
#check if serial no present in item maintenance table
|
#check if serial no present in item maintenance table
|
||||||
#-----------------------------------------------------------
|
#-----------------------------------------------------------
|
||||||
@@ -275,10 +301,7 @@ class DocType(TransactionBase):
|
|||||||
for m in getlist(self.doclist, 'maintenance_schedule_detail'):
|
for m in getlist(self.doclist, 'maintenance_schedule_detail'):
|
||||||
if serial_present:
|
if serial_present:
|
||||||
if m.item_code in serial_present and not m.serial_no:
|
if m.item_code in serial_present and not m.serial_no:
|
||||||
msgprint("Please click on 'Generate Schedule' to fetch serial no added for item "+m.item_code)
|
throw("Please click on 'Generate Schedule' to fetch serial no added for item "+m.item_code)
|
||||||
raise Exception
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def on_cancel(self):
|
def on_cancel(self):
|
||||||
for d in getlist(self.doclist, 'item_maintenance_detail'):
|
for d in getlist(self.doclist, 'item_maintenance_detail'):
|
||||||
@@ -313,7 +336,7 @@ def make_maintenance_visit(source_name, target_doclist=None):
|
|||||||
"field_map": {
|
"field_map": {
|
||||||
"parent": "prevdoc_docname",
|
"parent": "prevdoc_docname",
|
||||||
"parenttype": "prevdoc_doctype",
|
"parenttype": "prevdoc_doctype",
|
||||||
"incharge_name": "service_person"
|
"sales_person": "service_person"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}, target_doclist)
|
}, target_doclist)
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-02-22 01:28:05",
|
"creation": "2013-02-22 01:28:05",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2013-12-20 19:23:20",
|
"modified": "2013-12-31 12:13:38",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -52,6 +52,7 @@
|
|||||||
"search_index": 0
|
"search_index": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_on_submit": 0,
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "scheduled_date",
|
"fieldname": "scheduled_date",
|
||||||
"fieldtype": "Date",
|
"fieldtype": "Date",
|
||||||
@@ -78,12 +79,13 @@
|
|||||||
"report_hide": 1
|
"report_hide": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
"allow_on_submit": 0,
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "incharge_name",
|
"fieldname": "sales_person",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"in_filter": 1,
|
"in_filter": 1,
|
||||||
"in_list_view": 1,
|
"in_list_view": 1,
|
||||||
"label": "Incharge Name",
|
"label": "Sales Person",
|
||||||
"oldfieldname": "incharge_name",
|
"oldfieldname": "incharge_name",
|
||||||
"oldfieldtype": "Link",
|
"oldfieldtype": "Link",
|
||||||
"options": "Sales Person",
|
"options": "Sales Person",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-02-22 01:28:05",
|
"creation": "2013-02-22 01:28:05",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2013-12-20 19:23:20",
|
"modified": "2013-12-31 12:08:32",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -112,10 +112,10 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocField",
|
"doctype": "DocField",
|
||||||
"fieldname": "incharge_name",
|
"fieldname": "sales_person",
|
||||||
"fieldtype": "Link",
|
"fieldtype": "Link",
|
||||||
"in_filter": 1,
|
"in_filter": 1,
|
||||||
"label": "Sales Person Incharge",
|
"label": "Sales Person",
|
||||||
"oldfieldname": "incharge_name",
|
"oldfieldname": "incharge_name",
|
||||||
"oldfieldtype": "Link",
|
"oldfieldtype": "Link",
|
||||||
"options": "Sales Person",
|
"options": "Sales Person",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-01-10 16:34:31",
|
"creation": "2013-01-10 16:34:31",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2014-01-24 13:00:11",
|
"modified": "2014-01-31 17:32:47",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -26,20 +26,20 @@
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
"cancel": 0,
|
"cancel": 0,
|
||||||
"create": 0,
|
"create": 1,
|
||||||
"delete": 0,
|
"delete": 0,
|
||||||
"doctype": "DocPerm",
|
"doctype": "DocPerm",
|
||||||
"email": 1,
|
"email": 0,
|
||||||
"name": "__common__",
|
"name": "__common__",
|
||||||
"parent": "Newsletter",
|
"parent": "Newsletter",
|
||||||
"parentfield": "permissions",
|
"parentfield": "permissions",
|
||||||
"parenttype": "DocType",
|
"parenttype": "DocType",
|
||||||
"permlevel": 0,
|
"permlevel": 0,
|
||||||
"print": 1,
|
"print": 0,
|
||||||
"read": 1,
|
"read": 1,
|
||||||
"report": 1,
|
"report": 0,
|
||||||
"submit": 0,
|
"submit": 0,
|
||||||
"write": 0
|
"write": 1
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"doctype": "DocType",
|
"doctype": "DocType",
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
{
|
{
|
||||||
"creation": "2013-05-06 14:25:21",
|
"creation": "2013-05-06 14:25:21",
|
||||||
"docstatus": 0,
|
"docstatus": 0,
|
||||||
"modified": "2013-10-09 12:23:27",
|
"modified": "2013-12-31 12:24:48",
|
||||||
"modified_by": "Administrator",
|
"modified_by": "Administrator",
|
||||||
"owner": "Administrator"
|
"owner": "Administrator"
|
||||||
},
|
},
|
||||||
@@ -10,7 +10,7 @@
|
|||||||
"doctype": "Report",
|
"doctype": "Report",
|
||||||
"is_standard": "Yes",
|
"is_standard": "Yes",
|
||||||
"name": "__common__",
|
"name": "__common__",
|
||||||
"query": "SELECT\n ms_sch.scheduled_date as \"Schedule Date:Date:120\",\n\tms_sch.item_code as \"Item Code:Link/Item:120\",\n\tms_sch.item_name as \"Item Name::120\",\n\tms_sch.serial_no as \"Serial No::120\",\n\tms_sch.incharge_name as \"Incharge::120\",\n\tms.customer_name as \"Customer:Link/Customer:120\",\n\tms.address_display as \"Customer Address::120\",\n\tms_item.prevdoc_docname as \"Sales Order:Link/Sales Order:120\",\n\tms.company as \"Company:Link/Company:120\"\n\t\nFROM\n\t`tabMaintenance Schedule` ms, \n `tabMaintenance Schedule Detail` ms_sch, \n `tabMaintenance Schedule Item` ms_item\nWHERE\n\tms.name = ms_sch.parent and ms.name = ms_item.parent and ms.docstatus = 1\nORDER BY\n\tms_sch.scheduled_date asc, ms_sch.item_code asc",
|
"query": "SELECT\n ms_sch.scheduled_date as \"Schedule Date:Date:120\",\n\tms_sch.item_code as \"Item Code:Link/Item:120\",\n\tms_sch.item_name as \"Item Name::120\",\n\tms_sch.serial_no as \"Serial No::120\",\n\tms_sch.sales_person as \"Sales Person::120\",\n\tms.customer_name as \"Customer:Link/Customer:120\",\n\tms.address_display as \"Customer Address::120\",\n\tms_item.prevdoc_docname as \"Sales Order:Link/Sales Order:120\",\n\tms.company as \"Company:Link/Company:120\"\n\t\nFROM\n\t`tabMaintenance Schedule` ms, \n `tabMaintenance Schedule Detail` ms_sch, \n `tabMaintenance Schedule Item` ms_item\nWHERE\n\tms.name = ms_sch.parent and ms.name = ms_item.parent and ms.docstatus = 1\nORDER BY\n\tms_sch.scheduled_date asc, ms_sch.item_code asc",
|
||||||
"ref_doctype": "Maintenance Schedule",
|
"ref_doctype": "Maintenance Schedule",
|
||||||
"report_name": "Maintenance Schedules",
|
"report_name": "Maintenance Schedules",
|
||||||
"report_type": "Query Report"
|
"report_type": "Query Report"
|
||||||
|
|||||||
@@ -11,11 +11,10 @@
|
|||||||
<script>
|
<script>
|
||||||
$("#footer-subscribe-button").click(function() {
|
$("#footer-subscribe-button").click(function() {
|
||||||
|
|
||||||
$("#footer-subscribe-email").attr('disabled', true);
|
|
||||||
$("#footer-subscribe-button").html("Sending...")
|
|
||||||
.attr("disabled", true);
|
|
||||||
|
|
||||||
if($("#footer-subscribe-email").val()) {
|
if($("#footer-subscribe-email").val()) {
|
||||||
|
$("#footer-subscribe-email").attr('disabled', true);
|
||||||
|
$("#footer-subscribe-button").html("Sending...")
|
||||||
|
.attr("disabled", true);
|
||||||
erpnext.send_message({
|
erpnext.send_message({
|
||||||
subject:"Subscribe me",
|
subject:"Subscribe me",
|
||||||
sender: $("#footer-subscribe-email").val(),
|
sender: $("#footer-subscribe-email").val(),
|
||||||
@@ -32,5 +31,7 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
wn.msgprint(wn._("Please enter email address"))
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import webnotes
|
import webnotes
|
||||||
|
|
||||||
from webnotes import msgprint
|
from webnotes import msgprint, throw, _
|
||||||
from webnotes.utils import cstr, cint
|
from webnotes.utils import cstr, cint
|
||||||
|
|
||||||
class DocType:
|
class DocType:
|
||||||
@@ -20,7 +20,7 @@ class DocType:
|
|||||||
if self.doc.address_title:
|
if self.doc.address_title:
|
||||||
self.doc.name = cstr(self.doc.address_title).strip() + "-" + cstr(self.doc.address_type).strip()
|
self.doc.name = cstr(self.doc.address_title).strip() + "-" + cstr(self.doc.address_type).strip()
|
||||||
else:
|
else:
|
||||||
webnotes.msgprint("""Address Title is mandatory.""" + self.doc.customer, raise_exception=True)
|
throw(_("Address Title is mandatory."))
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
self.validate_primary_address()
|
self.validate_primary_address()
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ import webnotes, json
|
|||||||
from webnotes.utils import nowdate, cstr
|
from webnotes.utils import nowdate, cstr
|
||||||
from webnotes.model.code import get_obj
|
from webnotes.model.code import get_obj
|
||||||
from webnotes.model.doc import Document
|
from webnotes.model.doc import Document
|
||||||
from webnotes import msgprint
|
from webnotes import msgprint, throw, _
|
||||||
from webnotes.model.bean import getlist, copy_doclist
|
from webnotes.model.bean import getlist, copy_doclist
|
||||||
|
|
||||||
class DocType:
|
class DocType:
|
||||||
@@ -26,7 +26,7 @@ class DocType:
|
|||||||
validated_receiver_list.append(d)
|
validated_receiver_list.append(d)
|
||||||
|
|
||||||
if not validated_receiver_list:
|
if not validated_receiver_list:
|
||||||
msgprint("Please enter valid mobile nos", raise_exception=1)
|
throw(_("Please enter valid mobile nos"))
|
||||||
|
|
||||||
return validated_receiver_list
|
return validated_receiver_list
|
||||||
|
|
||||||
@@ -37,12 +37,12 @@ class DocType:
|
|||||||
'ERPNXT'
|
'ERPNXT'
|
||||||
if len(sender_name) > 6 and \
|
if len(sender_name) > 6 and \
|
||||||
webnotes.conn.get_value("Control Panel", None, "country") == "India":
|
webnotes.conn.get_value("Control Panel", None, "country") == "India":
|
||||||
msgprint("""
|
throw(_("""
|
||||||
As per TRAI rule, sender name must be exactly 6 characters.
|
As per TRAI rule, sender name must be exactly 6 characters.
|
||||||
Kindly change sender name in Setup --> Global Defaults.
|
Kindly change sender name in Setup --> Global Defaults.
|
||||||
|
|
||||||
Note: Hyphen, space, numeric digit, special characters are not allowed.
|
Note: Hyphen, space, numeric digit, special characters are not allowed.
|
||||||
""", raise_exception=1)
|
"""))
|
||||||
return sender_name
|
return sender_name
|
||||||
|
|
||||||
def get_contact_number(self, arg):
|
def get_contact_number(self, arg):
|
||||||
|
|||||||
@@ -64,7 +64,7 @@ class TransactionBase(StatusUpdater):
|
|||||||
out[f] = customer.fields.get(f)
|
out[f] = customer.fields.get(f)
|
||||||
|
|
||||||
# fields prepended with default in Customer doctype
|
# fields prepended with default in Customer doctype
|
||||||
for f in ['sales_partner', 'commission_rate', 'currency', 'price_list']:
|
for f in ['sales_partner', 'commission_rate', 'currency', 'price_list', 'taxes_and_charges']:
|
||||||
if customer.fields.get("default_" + f):
|
if customer.fields.get("default_" + f):
|
||||||
out[f] = customer.fields.get("default_" + f)
|
out[f] = customer.fields.get("default_" + f)
|
||||||
|
|
||||||
@@ -115,7 +115,7 @@ class TransactionBase(StatusUpdater):
|
|||||||
sales_person.update({
|
sales_person.update({
|
||||||
"doctype": "Sales Team",
|
"doctype": "Sales Team",
|
||||||
"parentfield": "sales_team",
|
"parentfield": "sales_team",
|
||||||
"idx": i+1
|
"idx": i + 1
|
||||||
})
|
})
|
||||||
|
|
||||||
# add child
|
# add child
|
||||||
@@ -129,6 +129,11 @@ class TransactionBase(StatusUpdater):
|
|||||||
if supplier.default_currency:
|
if supplier.default_currency:
|
||||||
out["currency"] = supplier.default_currency
|
out["currency"] = supplier.default_currency
|
||||||
|
|
||||||
|
# fields prepended with default in Customer doctype
|
||||||
|
for f in ['currency', 'taxes_and_charges']:
|
||||||
|
if supplier.fields.get("default_" + f):
|
||||||
|
out[f] = supplier.fields.get("default_" + f)
|
||||||
|
|
||||||
out["buying_price_list"] = self.get_user_default_price_list("buying_price_list") or \
|
out["buying_price_list"] = self.get_user_default_price_list("buying_price_list") or \
|
||||||
supplier.default_price_list or self.doc.buying_price_list
|
supplier.default_price_list or self.doc.buying_price_list
|
||||||
|
|
||||||
|
|||||||
13
patches/1401/fix_planned_qty.py
Normal file
13
patches/1401/fix_planned_qty.py
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||||
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
import webnotes
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
webnotes.conn.auto_commit_on_many_writes = 1
|
||||||
|
from utilities.repost_stock import repost_stock
|
||||||
|
for d in webnotes.conn.sql("""select distinct production_item, fg_warehouse
|
||||||
|
from `tabProduction Order` where docstatus>0""", as_dict=1):
|
||||||
|
repost_stock(d.production_item, d.fg_warehouse)
|
||||||
|
|
||||||
|
webnotes.conn.auto_commit_on_many_writes = 0
|
||||||
19
patches/1401/fix_serial_no_status_and_warehouse.py
Normal file
19
patches/1401/fix_serial_no_status_and_warehouse.py
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
|
||||||
|
# License: GNU General Public License v3. See license.txt
|
||||||
|
|
||||||
|
from __future__ import unicode_literals
|
||||||
|
import webnotes
|
||||||
|
|
||||||
|
|
||||||
|
def execute():
|
||||||
|
serial_nos = webnotes.conn.sql("""select name from `tabSerial No` where docstatus=0
|
||||||
|
and status in ('Available', 'Sales Returned') and ifnull(warehouse, '') = ''""")
|
||||||
|
for sr in serial_nos:
|
||||||
|
try:
|
||||||
|
last_sle = webnotes.bean("Serial No", sr[0]).make_controller().get_last_sle()
|
||||||
|
if last_sle.actual_qty > 0:
|
||||||
|
webnotes.conn.set_value("Serial No", sr[0], "warehouse", last_sle.warehouse)
|
||||||
|
|
||||||
|
webnotes.conn.commit()
|
||||||
|
except:
|
||||||
|
pass
|
||||||
Reference in New Issue
Block a user