Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/accounts/doctype/bank_reconciliation/bank_reconciliation.py b/accounts/doctype/bank_reconciliation/bank_reconciliation.py
index 35db6fb..05c0432 100644
--- a/accounts/doctype/bank_reconciliation/bank_reconciliation.py
+++ b/accounts/doctype/bank_reconciliation/bank_reconciliation.py
@@ -42,7 +42,7 @@
self.doc.total_amount = 0.0
for d in dl:
- nl = addchild(self.doc, 'entries', 'Bank Reconciliation Detail', 1, self.doclist)
+ nl = addchild(self.doc, 'entries', 'Bank Reconciliation Detail', self.doclist)
nl.posting_date = cstr(d[5])
nl.voucher_id = cstr(d[0])
nl.cheque_number = cstr(d[1])
diff --git a/accounts/doctype/budget_distribution/budget_distribution.py b/accounts/doctype/budget_distribution/budget_distribution.py
index 08103189..976fa84 100644
--- a/accounts/doctype/budget_distribution/budget_distribution.py
+++ b/accounts/doctype/budget_distribution/budget_distribution.py
@@ -31,7 +31,8 @@
'October','November','December']
idx =1
for m in month_list:
- mnth = addchild(self.doc,'budget_distribution_details','Budget Distribution Detail',1,self.doclist)
+ mnth = addchild(self.doc, 'budget_distribution_details',
+ 'Budget Distribution Detail', self.doclist)
mnth.month = m or ''
mnth.idx = idx
idx += 1
diff --git a/accounts/doctype/gl_control/gl_control.py b/accounts/doctype/gl_control/gl_control.py
index e4896d3..44cab1e 100644
--- a/accounts/doctype/gl_control/gl_control.py
+++ b/accounts/doctype/gl_control/gl_control.py
@@ -223,7 +223,7 @@
obj.doclist = obj.doc.clear_table(obj.doclist,table_field_name)
# Create advance table
for d in jv_detail:
- add = addchild(obj.doc, table_field_name, table_name, 1, obj.doclist)
+ add = addchild(obj.doc, table_field_name, table_name, obj.doclist)
add.journal_voucher = d[0]
add.jv_detail_no = d[3]
add.remarks = d[1]
@@ -286,7 +286,7 @@
webnotes.conn.sql("update `tabJournal Voucher Detail` set %s = '%s', %s = '%s' where name = '%s'" % (dr_or_cr, flt(allocate), doctype == "Purchase Invoice" and 'against_voucher' or 'against_invoice',cstr(against_document_no), jv_detail_no))
# new entry with balance amount
- add = addchild(jv_obj.doc, 'entries', 'Journal Voucher Detail', 1, jv_obj.doclist)
+ add = addchild(jv_obj.doc, 'entries', 'Journal Voucher Detail', jv_obj.doclist)
add.account = account_head
add.cost_center = cstr(jvd[0][1])
add.balance = cstr(jvd[0][2])
@@ -353,7 +353,7 @@
if d['allocated_amt'] < d['unadjusted_amt']:
jvd = webnotes.conn.sql("select cost_center, balance, against_account, is_advance from `tabJournal Voucher Detail` where name = '%s'" % d['voucher_detail_no'])
# new entry with balance amount
- ch = addchild(jv_obj.doc, 'entries', 'Journal Voucher Detail', 1)
+ ch = addchild(jv_obj.doc, 'entries', 'Journal Voucher Detail')
ch.account = d['account']
ch.cost_center = cstr(jvd[0][0])
ch.balance = cstr(jvd[0][1])
diff --git a/accounts/doctype/journal_voucher/journal_voucher.py b/accounts/doctype/journal_voucher/journal_voucher.py
index 23c66a6..7c1dcfe 100644
--- a/accounts/doctype/journal_voucher/journal_voucher.py
+++ b/accounts/doctype/journal_voucher/journal_voucher.py
@@ -174,7 +174,7 @@
# Set the diff in a new row
if flag == 0 and (flt(diff) != 0):
- jd = addchild(self.doc, 'entries', 'Journal Voucher Detail', 1, self.doclist)
+ jd = addchild(self.doc, 'entries', 'Journal Voucher Detail', self.doclist)
if diff>0:
jd.credit = flt(diff)
elif diff<0:
@@ -256,7 +256,7 @@
total = 0
for d in self.get_values():
total += flt(d[2])
- jd = addchild(self.doc, 'entries', 'Journal Voucher Detail', 1, self.doclist)
+ jd = addchild(self.doc, 'entries', 'Journal Voucher Detail', self.doclist)
jd.account = cstr(d[1])
if self.doc.write_off_based_on == 'Accounts Receivable':
jd.credit = flt(d[2])
@@ -265,7 +265,7 @@
jd.debit = flt(d[2])
jd.against_voucher = cstr(d[0])
jd.save(1)
- jd = addchild(self.doc, 'entries', 'Journal Voucher Detail', 1, self.doclist)
+ jd = addchild(self.doc, 'entries', 'Journal Voucher Detail', self.doclist)
if self.doc.write_off_based_on == 'Accounts Receivable':
jd.debit = total
elif self.doc.write_off_based_on == 'Accounts Payable':
diff --git a/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py b/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py
index 005b981..81b94a2 100644
--- a/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py
+++ b/accounts/doctype/payment_to_invoice_matching_tool/payment_to_invoice_matching_tool.py
@@ -100,7 +100,7 @@
#--------------------------------------------------
def create_payment_table(self, gle):
for d in gle:
- ch = addchild(self.doc, 'ir_payment_details', 'Payment to Invoice Matching Tool Detail', 1, self.doclist)
+ ch = addchild(self.doc, 'ir_payment_details', 'Payment to Invoice Matching Tool Detail', self.doclist)
ch.voucher_no = d.get('voucher_no')
ch.posting_date = d.get('posting_date')
ch.amt_due = self.acc_type == 'debit' and flt(d.get('amt_due')) or -1*flt(d.get('amt_due'))
diff --git a/buying/doctype/purchase_common/purchase_common.py b/buying/doctype/purchase_common/purchase_common.py
index a59061c..e8b725e 100644
--- a/buying/doctype/purchase_common/purchase_common.py
+++ b/buying/doctype/purchase_common/purchase_common.py
@@ -612,7 +612,8 @@
idx = 0
for other in other_charge:
- d = addchild(obj.doc, 'purchase_tax_details', 'Purchase Taxes and Charges', 1, obj.doclist)
+ d = addchild(obj.doc, 'purchase_tax_details', 'Purchase Taxes and Charges',
+ obj.doclist)
d.category = other['category']
d.add_deduct_tax = other['add_deduct_tax']
d.charge_type = other['charge_type']
diff --git a/buying/doctype/purchase_order/purchase_order.py b/buying/doctype/purchase_order/purchase_order.py
index 7182306..812f59c 100644
--- a/buying/doctype/purchase_order/purchase_order.py
+++ b/buying/doctype/purchase_order/purchase_order.py
@@ -314,7 +314,7 @@
for i in bom_det:
if i and not sql("select name from `tabPurchase Order Item Supplied` where reference_name = '%s' and bom_detail_no = '%s' and parent = '%s' " %(d.name, i[6], self.doc.name)):
- rm_child = addchild(self.doc, 'po_raw_material_details', 'Purchase Order Item Supplied', 1, self.doclist)
+ rm_child = addchild(self.doc, 'po_raw_material_details', 'Purchase Order Item Supplied', self.doclist)
rm_child.reference_name = d.name
rm_child.bom_detail_no = i and i[6] or ''
diff --git a/buying/doctype/quality_inspection/quality_inspection.py b/buying/doctype/quality_inspection/quality_inspection.py
index 981bf43..415524f 100644
--- a/buying/doctype/quality_inspection/quality_inspection.py
+++ b/buying/doctype/quality_inspection/quality_inspection.py
@@ -41,7 +41,7 @@
specification = sql("select specification, value from `tabItem Quality Inspection Parameter` \
where parent = '%s' order by idx" % (self.doc.item_code))
for d in specification:
- child = addchild(self.doc, 'qa_specification_details', 'Quality Inspection Reading', 1, self.doclist)
+ child = addchild(self.doc, 'qa_specification_details', 'Quality Inspection Reading', self.doclist)
child.specification = d[0]
child.value = d[1]
child.status = 'Accepted'
diff --git a/controllers/tax_controller.py b/controllers/tax_controller.py
index 009ab31..617c4cc 100644
--- a/controllers/tax_controller.py
+++ b/controllers/tax_controller.py
@@ -19,7 +19,7 @@
import webnotes.model
from webnotes import _, msgprint
from webnotes.utils import cint, flt
-from webnotes.model.utils import round_doc
+from webnotes.model.utils import round_floats_in_doc
import json
from controllers.transaction_controller import TransactionController
@@ -83,7 +83,7 @@
self.precision.item[base_field])
for item in self.item_doclist:
- round_doc(item, self.precision.item)
+ round_floats_in_doc(item, self.precision.item)
if item.fields.get(self.fmap.discount) == 100:
if not item.fields.get(self.fmap.print_ref_rate):
@@ -126,7 +126,7 @@
self.validate_included_tax(tax)
# round relevant values
- round_doc(tax, self.precision.tax)
+ round_floats_in_doc(tax, self.precision.tax)
def calculate_net_total(self):
self.doc.net_total = 0
diff --git a/hr/doctype/holiday_list/holiday_list.py b/hr/doctype/holiday_list/holiday_list.py
index 63b1af4..43f9916 100644
--- a/hr/doctype/holiday_list/holiday_list.py
+++ b/hr/doctype/holiday_list/holiday_list.py
@@ -99,7 +99,7 @@
yr_start_date, yr_end_date = self.get_fy_start_end_dates()
date_list = self.get_weekly_off_date_list(yr_start_date, yr_end_date)
for d in date_list:
- ch = addchild(self.doc, 'holiday_list_details', 'Holiday', 1, self.doclist)
+ ch = addchild(self.doc, 'holiday_list_details', 'Holiday', self.doclist)
ch.description = self.doc.weekly_off
ch.holiday_date = d
diff --git a/hr/doctype/salary_structure/salary_structure.py b/hr/doctype/salary_structure/salary_structure.py
index d07be6e..f310b7b 100644
--- a/hr/doctype/salary_structure/salary_structure.py
+++ b/hr/doctype/salary_structure/salary_structure.py
@@ -70,7 +70,7 @@
def make_table(self, doct_name, tab_fname, tab_name):
list1 = sql("select name from `tab%s` where docstatus != 2" % doct_name)
for li in list1:
- child = addchild(self.doc, tab_fname, tab_name, 1, self.doclist)
+ child = addchild(self.doc, tab_fname, tab_name, self.doclist)
if(tab_fname == 'earning_details'):
child.e_type = cstr(li[0])
child.modified_value = 0
diff --git a/manufacturing/doctype/bom/bom.py b/manufacturing/doctype/bom/bom.py
index d874d3c..bc80bfe 100644
--- a/manufacturing/doctype/bom/bom.py
+++ b/manufacturing/doctype/bom/bom.py
@@ -357,7 +357,8 @@
"Add items to Flat BOM table"
self.doclist = self.doc.clear_table(self.doclist, 'flat_bom_details', 1)
for d in self.cur_exploded_items:
- ch = addchild(self.doc, 'flat_bom_details', 'BOM Explosion Item', 1, self.doclist)
+ ch = addchild(self.doc, 'flat_bom_details', 'BOM Explosion Item',
+ self.doclist)
for i in d.keys():
ch.fields[i] = d[i]
ch.docstatus = self.doc.docstatus
diff --git a/manufacturing/doctype/production_order/production_order.js b/manufacturing/doctype/production_order/production_order.js
index 2ec91e7..5243026 100644
--- a/manufacturing/doctype/production_order/production_order.js
+++ b/manufacturing/doctype/production_order/production_order.js
@@ -91,7 +91,7 @@
se.company = doc.company;
se.fg_completed_qty = doc.qty - doc.produced_qty;
se.bom_no = doc.bom_no;
- se.use_multi_level_bom = 1;
+ se.use_multi_level_bom = doc.use_multi_level_bom;
loaddoc('Stock Entry', se.name);
}
diff --git a/manufacturing/doctype/production_order/production_order.txt b/manufacturing/doctype/production_order/production_order.txt
index 0f94d4e..9266084 100644
--- a/manufacturing/doctype/production_order/production_order.txt
+++ b/manufacturing/doctype/production_order/production_order.txt
@@ -4,7 +4,7 @@
"docstatus": 0,
"creation": "2012-12-20 14:31:18",
"modified_by": "Administrator",
- "modified": "2012-12-20 15:50:43"
+ "modified": "2012-12-24 18:39:00"
},
{
"is_submittable": 1,
@@ -143,6 +143,14 @@
"depends_on": "production_item"
},
{
+ "description": "If checked, BOM for sub-assembly items will be considered for getting raw materials. Otherwise, all sub-assembly items will be treated as a raw material.",
+ "default": "1",
+ "doctype": "DocField",
+ "label": "Use Multi-Level BOM",
+ "fieldname": "use_multi_level_bom",
+ "fieldtype": "Check"
+ },
+ {
"read_only": 0,
"doctype": "DocField",
"label": "More Info",
diff --git a/manufacturing/doctype/production_plan_item/production_plan_item.txt b/manufacturing/doctype/production_plan_item/production_plan_item.txt
index ab3ce11..6ae2a04 100644
--- a/manufacturing/doctype/production_plan_item/production_plan_item.txt
+++ b/manufacturing/doctype/production_plan_item/production_plan_item.txt
@@ -2,9 +2,9 @@
{
"owner": "Administrator",
"docstatus": 0,
- "creation": "2012-07-03 13:30:04",
+ "creation": "2012-12-20 18:14:55",
"modified_by": "Administrator",
- "modified": "2012-12-10 18:30:00"
+ "modified": "2012-12-24 19:37:34"
},
{
"istable": 1,
@@ -18,6 +18,7 @@
"parent": "Production Plan Item",
"doctype": "DocField",
"parenttype": "DocType",
+ "permlevel": 0,
"parentfield": "fields"
},
{
@@ -25,14 +26,11 @@
"doctype": "DocType"
},
{
- "permlevel": 0,
"oldfieldtype": "Link",
- "colour": "White:FFF",
"doctype": "DocField",
"label": "Item Code",
"oldfieldname": "item_code",
"width": "150px",
- "trigger": "Client",
"fieldname": "item_code",
"fieldtype": "Link",
"reqd": 1,
@@ -44,11 +42,10 @@
"label": "BOM No",
"oldfieldname": "bom_no",
"width": "100px",
- "options": "BOM",
"fieldname": "bom_no",
"fieldtype": "Link",
"reqd": 1,
- "permlevel": 0
+ "options": "BOM"
},
{
"default": "0.00",
@@ -59,20 +56,20 @@
"width": "100px",
"fieldname": "planned_qty",
"fieldtype": "Currency",
- "reqd": 1,
- "permlevel": 0
+ "reqd": 1
},
{
+ "read_only": 1,
"oldfieldtype": "Data",
"doctype": "DocField",
"label": "Sales Order",
"oldfieldname": "source_docname",
- "options": "Sales Order",
"fieldname": "sales_order",
"fieldtype": "Link",
- "permlevel": 1
+ "options": "Sales Order"
},
{
+ "read_only": 1,
"default": "0.00",
"oldfieldtype": "Currency",
"doctype": "DocField",
@@ -81,10 +78,10 @@
"width": "100px",
"fieldname": "so_pending_qty",
"fieldtype": "Currency",
- "reqd": 0,
- "permlevel": 1
+ "reqd": 0
},
{
+ "read_only": 1,
"oldfieldtype": "Data",
"doctype": "DocField",
"label": "UOM",
@@ -92,17 +89,16 @@
"width": "80px",
"fieldname": "stock_uom",
"fieldtype": "Data",
- "reqd": 1,
- "permlevel": 1
+ "reqd": 1
},
{
+ "read_only": 1,
"oldfieldtype": "Text",
"doctype": "DocField",
"label": "Description",
"oldfieldname": "description",
"width": "200px",
"fieldname": "description",
- "fieldtype": "Text",
- "permlevel": 1
+ "fieldtype": "Text"
}
]
\ No newline at end of file
diff --git a/manufacturing/doctype/production_plan_sales_order/production_plan_sales_order.txt b/manufacturing/doctype/production_plan_sales_order/production_plan_sales_order.txt
index 37e0f8a..8834180 100644
--- a/manufacturing/doctype/production_plan_sales_order/production_plan_sales_order.txt
+++ b/manufacturing/doctype/production_plan_sales_order/production_plan_sales_order.txt
@@ -2,9 +2,9 @@
{
"owner": "Administrator",
"docstatus": 0,
- "creation": "2012-07-03 13:30:04",
+ "creation": "2012-12-20 18:14:56",
"modified_by": "Administrator",
- "modified": "2012-12-10 18:30:00"
+ "modified": "2012-12-24 19:38:10"
},
{
"istable": 1,
@@ -18,6 +18,7 @@
"parent": "Production Plan Sales Order",
"doctype": "DocField",
"parenttype": "DocType",
+ "permlevel": 0,
"parentfield": "fields"
},
{
@@ -39,37 +40,36 @@
"label": "Sales Order",
"oldfieldname": "prevdoc_docname",
"width": "150px",
- "options": "Sales Order",
"fieldname": "sales_order",
"fieldtype": "Link",
- "permlevel": 0
+ "options": "Sales Order"
},
{
+ "read_only": 1,
"oldfieldtype": "Date",
"doctype": "DocField",
"label": "SO Date",
"oldfieldname": "document_date",
"width": "120px",
"fieldname": "sales_order_date",
- "fieldtype": "Date",
- "permlevel": 1
+ "fieldtype": "Date"
},
{
+ "read_only": 1,
"doctype": "DocField",
"label": "Customer",
"width": "150px",
- "options": "Customer",
"fieldname": "customer",
"fieldtype": "Link",
- "permlevel": 1
+ "options": "Customer"
},
{
+ "read_only": 1,
"doctype": "DocField",
"label": "Grand Total",
"width": "120px",
"fieldname": "grand_total",
- "fieldtype": "Currency",
- "permlevel": 1
+ "fieldtype": "Currency"
},
{
"write": 1,
diff --git a/manufacturing/doctype/production_planning_tool/production_planning_tool.py b/manufacturing/doctype/production_planning_tool/production_planning_tool.py
index 51cb3a7..adc8091 100644
--- a/manufacturing/doctype/production_planning_tool/production_planning_tool.py
+++ b/manufacturing/doctype/production_planning_tool/production_planning_tool.py
@@ -101,7 +101,7 @@
for r in open_so:
if cstr(r['name']) not in so_list:
pp_so = addchild(self.doc, 'pp_so_details',
- 'Production Plan Sales Order', 1, self.doclist)
+ 'Production Plan Sales Order', self.doclist)
pp_so.sales_order = r['name']
pp_so.sales_order_date = cstr(r['transaction_date'])
pp_so.customer = cstr(r['customer'])
@@ -150,7 +150,7 @@
for p in items:
item_details = sql("""select description, stock_uom, default_bom
from tabItem where name=%s""", p['item_code'])
- pi = addchild(self.doc, 'pp_details', 'Production Plan Item', 1, self.doclist)
+ pi = addchild(self.doc, 'pp_details', 'Production Plan Item', self.doclist)
pi.sales_order = p['parent']
pi.item_code = p['item_code']
pi.description = item_details and item_details[0][0] or ''
diff --git a/patches/april_2012/update_appraisal_permission.py b/patches/april_2012/update_appraisal_permission.py
index 5afcdbb..68002ba 100644
--- a/patches/april_2012/update_appraisal_permission.py
+++ b/patches/april_2012/update_appraisal_permission.py
@@ -7,7 +7,7 @@
webnotes.conn.sql("delete from `tabDocPerm` where role = 'All' and permlevel = 0 and parent in ('Appraisal', 'Ticket', 'Project')")
appr = get_obj('DocType', 'Appraisal', with_children=1)
- ch = addchild(appr.doc, 'permissions', 'DocPerm', 0)
+ ch = addchild(appr.doc, 'permissions', 'DocPerm')
ch.permlevel = 0
ch.role = 'Employee'
ch.read = 1
diff --git a/patches/april_2012/update_role_in_address.py b/patches/april_2012/update_role_in_address.py
index 3a65c30..788aa7b 100644
--- a/patches/april_2012/update_role_in_address.py
+++ b/patches/april_2012/update_role_in_address.py
@@ -11,7 +11,7 @@
addr = get_obj('DocType', 'Address', with_children=1)
for d in role1+role2:
- ch = addchild(addr.doc, 'permissions', 'DocPerm', 0)
+ ch = addchild(addr.doc, 'permissions', 'DocPerm')
ch.role = d
ch.read = 1
ch.write = 1
diff --git a/patches/november_2012/production_order_patch.py b/patches/november_2012/production_order_patch.py
index e64af59..e6a1192 100644
--- a/patches/november_2012/production_order_patch.py
+++ b/patches/november_2012/production_order_patch.py
@@ -6,4 +6,7 @@
webnotes.conn.sql("""update `tabStock Entry`
set use_multi_level_bom = if(consider_sa_items_as_raw_materials='Yes', 0, 1)""")
-
\ No newline at end of file
+
+ webnotes.conn.sql("""update `tabProduction Order`
+ set use_multi_level_bom = if(consider_sa_items_as_raw_materials='Yes', 0, 1)
+ where use_multi_level_bom is null""")
diff --git a/projects/doctype/task/task.js b/projects/doctype/task/task.js
index e9ca4d8..20629c5 100644
--- a/projects/doctype/task/task.js
+++ b/projects/doctype/task/task.js
@@ -14,15 +14,29 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
-cur_frm.fields_dict['project'].get_query = function(doc,cdt,cdn){
- var cond='';
- if(doc.customer) cond = 'ifnull(`tabProject`.customer, "") = "'+doc.customer+'" AND';
- return repl('SELECT distinct `tabProject`.`name` FROM `tabProject` \
- WHERE %(cond)s `tabProject`.`name` LIKE "%s" \
- ORDER BY `tabProject`.`name` ASC LIMIT 50', {cond:cond});
-}
+wn.provide("erpnext.projects");
+
+erpnext.projects.Task = erpnext.utils.Controller.extend({
+ setup: function() {
+ this.frm.fields_dict.project.get_query = function() {
+ return "select name from `tabProject` \
+ where %(key)s like \"%s\" \
+ order by name asc limit 50";
+ };
+ },
+
+ project: function() {
+ if(this.frm.doc.project) {
+ get_server_fields('get_project_details', '','', doc, cdt, cdn, 1);
+ }
+ },
+
+ after_save: function() {
+ this.frm.doc.project && wn.model.remove_from_locals("Project",
+ this.frm.doc.project);
+ },
+});
-cur_frm.cscript.project = function(doc, cdt, cdn){
- if(doc.project) get_server_fields('get_project_details', '','', doc, cdt, cdn, 1);
-}
+cur_frm.cscript = new erpnext.projects.Task({frm: cur_frm});
+
diff --git a/public/js/toolbar.js b/public/js/toolbar.js
index 71fb082..f1eddb0 100644
--- a/public/js/toolbar.js
+++ b/public/js/toolbar.js
@@ -60,7 +60,7 @@
for(var i in modules_list) {
var m = modules_list[i]
- if(m!='Setup' && wn.boot.profile.allow_modules.indexOf(m)!=-1) {
+ if(m!='Setup' && wn.boot.profile.allow_modules.indexOf(m)!=-1 && wn.modules[m]) {
args = {
module: m,
module_page: wn.modules[m].link,
diff --git a/public/js/website_utils.js b/public/js/website_utils.js
index f35ad4c..ff480ed 100644
--- a/public/js/website_utils.js
+++ b/public/js/website_utils.js
@@ -14,6 +14,7 @@
cmd: "website.send_message",
subject: opts.subject,
sender: opts.sender,
+ status: opts.status,
message: typeof opts.message == "string"
? opts.message
: JSON.stringify(opts.message)
diff --git a/selling/doctype/opportunity/opportunity.py b/selling/doctype/opportunity/opportunity.py
index 82a6e8e..369fab7 100644
--- a/selling/doctype/opportunity/opportunity.py
+++ b/selling/doctype/opportunity/opportunity.py
@@ -123,7 +123,7 @@
user_lst.append(chk[0][0])
for d in user_lst:
- ch = addchild(ev, 'event_individuals', 'Event User', 0)
+ ch = addchild(ev, 'event_individuals', 'Event User')
ch.person = d
ch.save(1)
diff --git a/selling/doctype/quotation/quotation.py b/selling/doctype/quotation/quotation.py
index 0e75544..3b452f1 100644
--- a/selling/doctype/quotation/quotation.py
+++ b/selling/doctype/quotation/quotation.py
@@ -19,7 +19,7 @@
from webnotes.utils import cstr, load_json
from webnotes.model import db_exists
-from webnotes.model.doc import Document, addchild
+from webnotes.model.doc import Document
from webnotes.model.wrapper import getlist, copy_doclist
from webnotes.model.code import get_obj
from webnotes import msgprint
diff --git a/selling/doctype/sales_common/sales_common.py b/selling/doctype/sales_common/sales_common.py
index e672abf..03280e2 100644
--- a/selling/doctype/sales_common/sales_common.py
+++ b/selling/doctype/sales_common/sales_common.py
@@ -75,7 +75,7 @@
obj.doclist = obj.doc.clear_table(obj.doclist,'sales_team')
idx = 0
for d in webnotes.conn.sql("select sales_person, allocated_percentage, allocated_amount, incentives from `tabSales Team` where parent = '%s'" % obj.doc.customer):
- ch = addchild(obj.doc, 'sales_team', 'Sales Team', 1, obj.doclist)
+ ch = addchild(obj.doc, 'sales_team', 'Sales Team', obj.doclist)
ch.sales_person = d and cstr(d[0]) or ''
ch.allocated_percentage = d and flt(d[1]) or 0
ch.allocated_amount = d and flt(d[2]) or 0
@@ -265,8 +265,8 @@
for field in default_fields:
if field in other: del other[field]
- d = addchild(obj.doc, 'other_charges', 'Sales Taxes and Charges', 1,
- obj.doclist)
+ d = addchild(obj.doc, 'other_charges', 'Sales Taxes and Charges',
+ obj.doclist)
d.fields.update(other)
d.rate = flt(d.rate)
d.tax_amount = flt(d.tax_rate)
@@ -481,7 +481,8 @@
break
if not exists:
- pi = addchild(obj.doc, 'packing_details', 'Delivery Note Packing Item', 1, obj.doclist)
+ pi = addchild(obj.doc, 'packing_details', 'Delivery Note Packing Item',
+ obj.doclist)
pi.parent_item = line.item_code
pi.item_code = packing_item_code
diff --git a/setup/doctype/setup_control/setup_control.py b/setup/doctype/setup_control/setup_control.py
index fb0b694..3c073da 100644
--- a/setup/doctype/setup_control/setup_control.py
+++ b/setup/doctype/setup_control/setup_control.py
@@ -239,13 +239,13 @@
def add_roles(self, pr):
roles_list = ['Accounts Manager', 'Accounts User', 'Blogger', 'HR Manager', 'HR User', 'Maintenance User', 'Maintenance Manager', 'Material Manager', 'Material User', 'Material Master Manager', 'Manufacturing Manager', 'Manufacturing User', 'Projects User', 'Purchase Manager', 'Purchase User', 'Purchase Master Manager', 'Quality Manager', 'Sales Manager', 'Sales User', 'Sales Master Manager', 'Support Manager', 'Support Team', 'System Manager', 'Website Manager']
for r in roles_list:
- d = addchild(pr, 'userroles', 'UserRole', 1)
+ d = addchild(pr, 'userroles', 'UserRole')
d.role = r
d.save(1)
# Add roles to Administrator profile
pr = Document('Profile','Administrator')
for r in roles_list:
- d = addchild(pr,'userroles', 'UserRole', 1)
+ d = addchild(pr,'userroles', 'UserRole')
d.role = r
d.save(1)
\ No newline at end of file
diff --git a/stock/doctype/bin/bin.py b/stock/doctype/bin/bin.py
index 5e3e74a..d472e5f 100644
--- a/stock/doctype/bin/bin.py
+++ b/stock/doctype/bin/bin.py
@@ -350,7 +350,7 @@
reaches re-order level when %s %s was created""" % (doc_type,doc_name)
indent.save(1)
indent_obj = get_obj('Purchase Request',indent.name,with_children=1)
- indent_details_child = addchild(indent_obj.doc,'indent_details','Purchase Request Item',0)
+ indent_details_child = addchild(indent_obj.doc,'indent_details','Purchase Request Item')
indent_details_child.item_code = self.doc.item_code
indent_details_child.uom = self.doc.stock_uom
indent_details_child.warehouse = self.doc.warehouse
diff --git a/stock/doctype/item/item.py b/stock/doctype/item/item.py
index e54df15..7f17a3b 100644
--- a/stock/doctype/item/item.py
+++ b/stock/doctype/item/item.py
@@ -70,7 +70,8 @@
raise Exception
if not cstr(self.doc.stock_uom) in check_list :
- child = addchild( self.doc, 'uom_conversion_details', 'UOM Conversion Detail', 1, self.doclist)
+ child = addchild( self.doc, 'uom_conversion_details',
+ 'UOM Conversion Detail', self.doclist)
child.uom = self.doc.stock_uom
child.conversion_factor = 1
child.save()
diff --git a/stock/doctype/landed_cost_wizard/landed_cost_wizard.py b/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
index 4e8015d..d5abb84 100644
--- a/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
+++ b/stock/doctype/landed_cost_wizard/landed_cost_wizard.py
@@ -51,7 +51,8 @@
msgprint("Please enter date of shorter duration as there are too many purchase receipt, hence it cannot be loaded.", raise_exception=1)
for i in pr:
- ch = addchild(self.doc, 'lc_pr_details', 'Landed Cost Purchase Receipt', 1, self.doclist)
+ ch = addchild(self.doc, 'lc_pr_details', 'Landed Cost Purchase Receipt',
+ self.doclist)
ch.purchase_receipt = i and i['name'] or ''
ch.save()
@@ -62,7 +63,8 @@
idx = 0
landed_cost = sql("select account_head, description from `tabLanded Cost Master Detail` where parent=%s", (self.doc.landed_cost), as_dict = 1)
for cost in landed_cost:
- lct = addchild(self.doc, 'landed_cost_details', 'Landed Cost Item', 1, self.doclist)
+ lct = addchild(self.doc, 'landed_cost_details', 'Landed Cost Item',
+ self.doclist)
lct.account_head = cost['account_head']
lct.description = cost['description']
@@ -100,7 +102,7 @@
pr_oc_row = sql("select name from `tabPurchase Taxes and Charges` where parent = %s and category = 'Valuation' and add_deduct_tax = 'Add' and charge_type = 'Actual' and account_head = %s",(pr, lc.account_head))
if not pr_oc_row: # add if not exists
- ch = addchild(pr_obj.doc, 'purchase_tax_details', 'Purchase Taxes and Charges', 1)
+ ch = addchild(pr_obj.doc, 'purchase_tax_details', 'Purchase Taxes and Charges')
ch.category = 'Valuation'
ch.add_deduct_tax = 'Add'
ch.charge_type = 'Actual'
diff --git a/stock/doctype/purchase_receipt/purchase_receipt.py b/stock/doctype/purchase_receipt/purchase_receipt.py
index 4683abb..e5e1fe1 100644
--- a/stock/doctype/purchase_receipt/purchase_receipt.py
+++ b/stock/doctype/purchase_receipt/purchase_receipt.py
@@ -390,7 +390,7 @@
if i and not sql("select name from `tabPurchase Receipt Item Supplied` where reference_name = '%s' and bom_detail_no = '%s' and parent = '%s' " %(d.name, i[6], self.doc.name)):
- rm_child = addchild(self.doc, 'pr_raw_material_details', 'Purchase Receipt Item Supplied', 1, self.doclist)
+ rm_child = addchild(self.doc, 'pr_raw_material_details', 'Purchase Receipt Item Supplied', self.doclist)
rm_child.reference_name = d.name
rm_child.bom_detail_no = i and i[6] or ''
diff --git a/stock/doctype/sales_and_purchase_return_tool/sales_and_purchase_return_tool.py b/stock/doctype/sales_and_purchase_return_tool/sales_and_purchase_return_tool.py
index 92fa63e..92b0cb1 100644
--- a/stock/doctype/sales_and_purchase_return_tool/sales_and_purchase_return_tool.py
+++ b/stock/doctype/sales_and_purchase_return_tool/sales_and_purchase_return_tool.py
@@ -8,11 +8,11 @@
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
from __future__ import unicode_literals
import webnotes
@@ -26,45 +26,46 @@
class DocType :
- def __init__(self, doc, doclist=[]):
- self.doc = doc
- self.doclist = doclist
+ def __init__(self, doc, doclist=[]):
+ self.doc = doc
+ self.doclist = doclist
- # Pull Item Details
- # ---------------------------
- def pull_item_details(self):
- if self.doc.return_type == 'Sales Return':
- if self.doc.delivery_note_no:
- det = sql("select t1.name, t1.item_code, t1.description, t1.qty, t1.uom, t2.export_rate * t3.conversion_rate, t3.customer, t3.customer_name, t3.customer_address, t2.serial_no, t2.batch_no from `tabDelivery Note Packing Item` t1, `tabDelivery Note Item` t2, `tabDelivery Note` t3 where t1.parent = t3.name and t2.parent = t3.name and t1.parent_detail_docname = t2.name and t3.name = '%s' and t3.docstatus = 1" % self.doc.delivery_note_no)
- elif self.doc.sales_invoice_no:
- det = sql("select t1.name, t1.item_code, t1.description, t1.qty, t1.stock_uom, t1.export_rate * t2.conversion_rate, t2.customer, t2.customer_name, t2.customer_address, t1.serial_no from `tabSales Invoice Item` t1, `tabSales Invoice` t2 where t1.parent = t2.name and t2.name = '%s' and t2.docstatus = 1" % self.doc.sales_invoice_no)
- elif self.doc.return_type == 'Purchase Return' and self.doc.purchase_receipt_no:
- det = sql("select t1.name, t1.item_code, t1.description, t1.received_qty, t1.uom, t1.purchase_rate, t2.supplier, t2.supplier_name, t2.supplier_address, t1.serial_no, t1.batch_no from `tabPurchase Receipt Item` t1, `tabPurchase Receipt` t2 where t1.parent = t2.name and t2.name = '%s' and t2.docstatus = 1" % self.doc.purchase_receipt_no)
+ # Pull Item Details
+ # ---------------------------
+ def pull_item_details(self):
+ if self.doc.return_type == 'Sales Return':
+ if self.doc.delivery_note_no:
+ det = sql("select t1.name, t1.item_code, t1.description, t1.qty, t1.uom, t2.export_rate * t3.conversion_rate, t3.customer, t3.customer_name, t3.customer_address, t2.serial_no, t2.batch_no from `tabDelivery Note Packing Item` t1, `tabDelivery Note Item` t2, `tabDelivery Note` t3 where t1.parent = t3.name and t2.parent = t3.name and t1.parent_detail_docname = t2.name and t3.name = '%s' and t3.docstatus = 1" % self.doc.delivery_note_no)
+ elif self.doc.sales_invoice_no:
+ det = sql("select t1.name, t1.item_code, t1.description, t1.qty, t1.stock_uom, t1.export_rate * t2.conversion_rate, t2.customer, t2.customer_name, t2.customer_address, t1.serial_no from `tabSales Invoice Item` t1, `tabSales Invoice` t2 where t1.parent = t2.name and t2.name = '%s' and t2.docstatus = 1" % self.doc.sales_invoice_no)
+ elif self.doc.return_type == 'Purchase Return' and self.doc.purchase_receipt_no:
+ det = sql("select t1.name, t1.item_code, t1.description, t1.received_qty, t1.uom, t1.purchase_rate, t2.supplier, t2.supplier_name, t2.supplier_address, t1.serial_no, t1.batch_no from `tabPurchase Receipt Item` t1, `tabPurchase Receipt` t2 where t1.parent = t2.name and t2.name = '%s' and t2.docstatus = 1" % self.doc.purchase_receipt_no)
- self.doc.cust_supp = det and det[0][6] or ''
- self.doc.cust_supp_name = det and det[0][7] or ''
- self.doc.cust_supp_address = det and det[0][8] or ''
- self.create_item_table(det)
- self.doc.save()
-
- # Create Item Table
- # -----------------------------
- def create_item_table(self, det):
- self.doclist = self.doc.clear_table(self.doclist, 'return_details', 1)
- for i in det:
- ch = addchild(self.doc, 'return_details', 'Sales and Purchase Return Item', 1, self.doclist)
- ch.detail_name = i and i[0] or ''
- ch.item_code = i and i[1] or ''
- ch.description = i and i[2] or ''
- ch.qty = i and flt(i[3]) or 0
- ch.uom = i and i[4] or ''
- ch.rate = i and flt(i[5]) or 0
- ch.serial_no = i and i[9] or ''
- ch.batch_no = (len(i) == 11) and i[10] or ''
- ch.save()
+ self.doc.cust_supp = det and det[0][6] or ''
+ self.doc.cust_supp_name = det and det[0][7] or ''
+ self.doc.cust_supp_address = det and det[0][8] or ''
+ self.create_item_table(det)
+ self.doc.save()
+
+ # Create Item Table
+ # -----------------------------
+ def create_item_table(self, det):
+ self.doclist = self.doc.clear_table(self.doclist, 'return_details', 1)
+ for i in det:
+ ch = addchild(self.doc, 'return_details', 'Sales and Purchase Return Item',
+ self.doclist)
+ ch.detail_name = i and i[0] or ''
+ ch.item_code = i and i[1] or ''
+ ch.description = i and i[2] or ''
+ ch.qty = i and flt(i[3]) or 0
+ ch.uom = i and i[4] or ''
+ ch.rate = i and flt(i[5]) or 0
+ ch.serial_no = i and i[9] or ''
+ ch.batch_no = (len(i) == 11) and i[10] or ''
+ ch.save()
- # Clear return table
- # --------------------------------
- def clear_return_table(self):
- self.doclist = self.doc.clear_table(self.doclist, 'return_details', 1)
- self.doc.save()
+ # Clear return table
+ # --------------------------------
+ def clear_return_table(self):
+ self.doclist = self.doc.clear_table(self.doclist, 'return_details', 1)
+ self.doc.save()
\ No newline at end of file
diff --git a/stock/doctype/stock_entry/stock_entry.js b/stock/doctype/stock_entry/stock_entry.js
index 724b215..a6d233e 100644
--- a/stock/doctype/stock_entry/stock_entry.js
+++ b/stock/doctype/stock_entry/stock_entry.js
@@ -160,6 +160,7 @@
return 'SELECT tabItem.name, tabItem.description, tabBin.actual_qty '
+ 'FROM tabItem, tabBin '
+ 'WHERE tabItem.name = tabBin.item_code '
+ + 'AND tabItem.is_stock_item = "Yes"'
+ 'AND ifnull(`tabBin`.`actual_qty`,0) > 0 '
+ 'AND tabBin.warehouse="'+ d.s_warehouse +'" '
+ 'AND tabItem.docstatus < 2 '
@@ -171,6 +172,7 @@
return 'SELECT tabItem.name, tabItem.description '
+ 'FROM tabItem '
+ 'WHERE tabItem.docstatus < 2 '
+ + 'AND tabItem.is_stock_item = "Yes"'
+ 'AND (ifnull(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` > NOW() OR `tabItem`.`end_of_life`="0000-00-00") '
+ 'AND tabItem.%(key)s LIKE "%s" '
+ 'ORDER BY tabItem.name ASC '
diff --git a/stock/doctype/stock_entry/stock_entry.py b/stock/doctype/stock_entry/stock_entry.py
index 1e4f300..2e26a1a 100644
--- a/stock/doctype/stock_entry/stock_entry.py
+++ b/stock/doctype/stock_entry/stock_entry.py
@@ -36,7 +36,6 @@
def validate(self):
self.validate_serial_nos()
-
pro_obj = self.doc.production_order and \
get_obj('Production Order', self.doc.production_order) or None
@@ -467,7 +466,8 @@
def add_to_stock_entry_detail(self, source_wh, target_wh, item_dict, bom_no=None):
for d in item_dict:
- se_child = addchild(self.doc, 'mtn_details', 'Stock Entry Detail', 0, self.doclist)
+ se_child = addchild(self.doc, 'mtn_details', 'Stock Entry Detail',
+ self.doclist)
se_child.s_warehouse = source_wh
se_child.t_warehouse = target_wh
se_child.item_code = cstr(d)
@@ -543,6 +543,6 @@
@webnotes.whitelist()
def get_production_order_details(production_order):
result = webnotes.conn.sql("""select bom_no,
- ifnull(qty, 0) - ifnull(produced_qty, 0) as fg_completed_qty
+ ifnull(qty, 0) - ifnull(produced_qty, 0) as fg_completed_qty, use_multi_level_bom
from `tabProduction Order` where name = %s""", production_order, as_dict=1)
return result and result[0] or {}
\ No newline at end of file
diff --git a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index 0994e50..fae2fcb 100644
--- a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -28,6 +28,14 @@
def __init__(self, doc, doclist=[]):
self.doc = doc
self.doclist = doclist
+
+ def validate(self):
+ self.validate_mandatory()
+ self.validate_posting_time()
+ self.validate_item()
+ self.actual_amt_check()
+ self.check_stock_frozen_date()
+ self.scrub_posting_time()
#check for item quantity available in stock
def actual_amt_check(self):
@@ -53,13 +61,19 @@
msgprint("Warehouse: '%s' does not exist in the system. Please check." % self.doc.fields.get(k), raise_exception = 1)
def validate_item(self):
- item_det = sql("select name, has_batch_no, docstatus from tabItem where name = '%s'" % self.doc.item_code)
+ item_det = sql("""select name, has_batch_no, docstatus,
+ ifnull(is_stock_item, 'No') from tabItem where name=%s""",
+ self.doc.item_code)
# check item exists
if item_det:
item_det = item_det and item_det[0]
else:
msgprint("Item: '%s' does not exist in the system. Please check." % self.doc.item_code, raise_exception = 1)
+
+ if item_det[3]!='Yes':
+ webnotes.msgprint("""Item: "%s" is not a Stock Item.""" % self.doc.item_code,
+ raise_exception=1)
# check if item is trashed
if cint(item_det[2])==2:
@@ -96,12 +110,4 @@
self.doc.posting_time = '00:00'
if len(self.doc.posting_time.split(':')) > 2:
self.doc.posting_time = '00:00'
-
-
- def validate(self):
- self.validate_mandatory()
- self.validate_posting_time()
- self.validate_item()
- self.actual_amt_check()
- self.check_stock_frozen_date()
- self.scrub_posting_time()
+
\ No newline at end of file
diff --git a/support/doctype/maintenance_schedule/maintenance_schedule.py b/support/doctype/maintenance_schedule/maintenance_schedule.py
index b703e56..6560c83 100644
--- a/support/doctype/maintenance_schedule/maintenance_schedule.py
+++ b/support/doctype/maintenance_schedule/maintenance_schedule.py
@@ -8,11 +8,11 @@
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
-# along with this program. If not, see <http://www.gnu.org/licenses/>.
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
from __future__ import unicode_literals
import webnotes
@@ -30,313 +30,314 @@
from utilities.transaction_base import TransactionBase
class DocType(TransactionBase):
- def __init__(self, doc, doclist=[]):
- self.doc = doc
- self.doclist = doclist
-
- # pull sales order details
- #--------------------------
- def pull_sales_order_detail(self):
- self.doclist = self.doc.clear_table(self.doclist, 'item_maintenance_detail')
- self.doclist = self.doc.clear_table(self.doclist, 'maintenance_schedule_detail')
- self.doclist = get_obj('DocType Mapper', 'Sales Order-Maintenance Schedule').dt_map('Sales Order', 'Maintenance Schedule', self.doc.sales_order_no, self.doc, self.doclist, "[['Sales Order', 'Maintenance Schedule'],['Sales Order Item', 'Maintenance Schedule Item']]")
-
- #pull item details
- #-------------------
- def get_item_details(self, item_code):
- item = sql("select item_name, description from `tabItem` where name = '%s'" %(item_code), as_dict=1)
- ret = {
- 'item_name': item and item[0]['item_name'] or '',
- 'description' : item and item[0]['description'] or ''
- }
- return ret
-
- # generate maintenance schedule
- #-------------------------------------
- def generate_schedule(self):
- import datetime
- self.doclist = self.doc.clear_table(self.doclist, 'maintenance_schedule_detail')
- count = 0
- sql("delete from `tabMaintenance Schedule Detail` where parent='%s'" %(self.doc.name))
- for d in getlist(self.doclist, 'item_maintenance_detail'):
- self.validate_maintenance_detail()
- s_list =[]
- s_list = self.create_schedule_list(d.start_date, d.end_date, d.no_of_visits)
- for i in range(d.no_of_visits):
- child = addchild(self.doc,'maintenance_schedule_detail','Maintenance Schedule Detail',1,self.doclist)
- child.item_code = d.item_code
- child.item_name = d.item_name
- child.scheduled_date = s_list[i].strftime('%Y-%m-%d')
- if d.serial_no:
- child.serial_no = d.serial_no
- child.idx = count
- count = count+1
- child.incharge_name = d.incharge_name
- child.save(1)
-
- self.on_update()
+ def __init__(self, doc, doclist=[]):
+ self.doc = doc
+ self.doclist = doclist
+
+ # pull sales order details
+ #--------------------------
+ def pull_sales_order_detail(self):
+ self.doclist = self.doc.clear_table(self.doclist, 'item_maintenance_detail')
+ self.doclist = self.doc.clear_table(self.doclist, 'maintenance_schedule_detail')
+ self.doclist = get_obj('DocType Mapper', 'Sales Order-Maintenance Schedule').dt_map('Sales Order', 'Maintenance Schedule', self.doc.sales_order_no, self.doc, self.doclist, "[['Sales Order', 'Maintenance Schedule'],['Sales Order Item', 'Maintenance Schedule Item']]")
+
+ #pull item details
+ #-------------------
+ def get_item_details(self, item_code):
+ item = sql("select item_name, description from `tabItem` where name = '%s'" %(item_code), as_dict=1)
+ ret = {
+ 'item_name': item and item[0]['item_name'] or '',
+ 'description' : item and item[0]['description'] or ''
+ }
+ return ret
+
+ # generate maintenance schedule
+ #-------------------------------------
+ def generate_schedule(self):
+ import datetime
+ self.doclist = self.doc.clear_table(self.doclist, 'maintenance_schedule_detail')
+ count = 0
+ sql("delete from `tabMaintenance Schedule Detail` where parent='%s'" %(self.doc.name))
+ for d in getlist(self.doclist, 'item_maintenance_detail'):
+ self.validate_maintenance_detail()
+ s_list =[]
+ s_list = self.create_schedule_list(d.start_date, d.end_date, d.no_of_visits)
+ for i in range(d.no_of_visits):
+ child = addchild(self.doc, 'maintenance_schedule_detail',
+ 'Maintenance Schedule Detail', self.doclist)
+ child.item_code = d.item_code
+ child.item_name = d.item_name
+ child.scheduled_date = s_list[i].strftime('%Y-%m-%d')
+ if d.serial_no:
+ child.serial_no = d.serial_no
+ child.idx = count
+ count = count+1
+ child.incharge_name = d.incharge_name
+ child.save(1)
+
+ self.on_update()
- def on_submit(self):
- if not getlist(self.doclist, 'maintenance_schedule_detail'):
- msgprint("Please click on 'Generate Schedule' to get schedule")
- raise Exception
- self.check_serial_no_added()
- self.validate_serial_no_warranty()
- self.validate_schedule()
+ def on_submit(self):
+ if not getlist(self.doclist, 'maintenance_schedule_detail'):
+ msgprint("Please click on 'Generate Schedule' to get schedule")
+ raise Exception
+ self.check_serial_no_added()
+ self.validate_serial_no_warranty()
+ self.validate_schedule()
- email_map ={}
- for d in getlist(self.doclist, 'item_maintenance_detail'):
- if d.serial_no:
- self.update_amc_date(d.serial_no, d.end_date)
+ email_map ={}
+ for d in getlist(self.doclist, 'item_maintenance_detail'):
+ if d.serial_no:
+ self.update_amc_date(d.serial_no, d.end_date)
- if d.incharge_name not in email_map:
- e = sql("select email_id, name from `tabSales Person` where name='%s' " %(d.incharge_name),as_dict=1)[0]
- email_map[d.incharge_name] = (e['email_id'])
+ if d.incharge_name not in email_map:
+ e = sql("select email_id, name from `tabSales Person` where name='%s' " %(d.incharge_name),as_dict=1)[0]
+ email_map[d.incharge_name] = (e['email_id'])
- scheduled_date =sql("select scheduled_date from `tabMaintenance Schedule Detail` \
- where incharge_name='%s' and item_code='%s' and parent='%s' " %(d.incharge_name, \
- d.item_code, self.doc.name), as_dict=1)
+ scheduled_date =sql("select scheduled_date from `tabMaintenance Schedule Detail` \
+ where incharge_name='%s' and item_code='%s' and parent='%s' " %(d.incharge_name, \
+ d.item_code, self.doc.name), as_dict=1)
- for key in scheduled_date:
- if email_map[d.incharge_name]:
- self.add_calender_event(key["scheduled_date"],email_map[d.incharge_name],d.item_code)
- webnotes.conn.set(self.doc, 'status', 'Submitted')
-
+ for key in scheduled_date:
+ if email_map[d.incharge_name]:
+ self.add_calender_event(key["scheduled_date"],email_map[d.incharge_name],d.item_code)
+ webnotes.conn.set(self.doc, 'status', 'Submitted')
+
- def add_calender_event(self,scheduled_date,incharge_email,item_code):
- """ Add calendar event for Maintenece Schedule in calendar of Allocated person"""
- event = Document('Event')
- event.owner = incharge_email
- event.description = "Reference:%s, Item Code:%s and Customer: %s" %(self.doc.name, item_code, self.doc.customer)
- event.event_date = scheduled_date
- event.event_hour = '10:00'
- event.event_type = 'Private'
- event.ref_type = 'Maintenance Schedule'
- event.ref_name = self.doc.name
- event.save(1)
+ def add_calender_event(self,scheduled_date,incharge_email,item_code):
+ """ Add calendar event for Maintenece Schedule in calendar of Allocated person"""
+ event = Document('Event')
+ event.owner = incharge_email
+ event.description = "Reference:%s, Item Code:%s and Customer: %s" %(self.doc.name, item_code, self.doc.customer)
+ event.event_date = scheduled_date
+ event.event_hour = '10:00'
+ event.event_type = 'Private'
+ event.ref_type = 'Maintenance Schedule'
+ event.ref_name = self.doc.name
+ event.save(1)
- #get schedule dates
- #----------------------
- def create_schedule_list(self, start_date, end_date, no_of_visit):
- schedule_list = []
- start_date1 = start_date
- date_diff = (getdate(end_date) - getdate(start_date)).days
- add_by = date_diff/no_of_visit
- #schedule_list.append(start_date1)
- while(getdate(start_date1) < getdate(end_date)):
- start_date1 = add_days(start_date1, add_by)
- if len(schedule_list) < no_of_visit:
- schedule_list.append(getdate(start_date1))
- return schedule_list
-
- #validate date range and periodicity selected
- #-------------------------------------------------
- def validate_period(self, arg):
- arg1 = eval(arg)
- if getdate(arg1['start_date']) >= getdate(arg1['end_date']):
- msgprint("Start date should be less than end date ")
- raise Exception
-
- period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1
-
- if (arg1['periodicity']=='Yearly' or arg1['periodicity']=='Half Yearly' or arg1['periodicity']=='Quarterly') and period<365:
- msgprint(cstr(arg1['periodicity'])+ " periodicity can be set for period of atleast 1 year or more only")
- raise Exception
- elif arg1['periodicity']=='Monthly' and period<30:
- msgprint("Monthly periodicity can be set for period of atleast 1 month or more")
- raise Exception
- elif arg1['periodicity']=='Weekly' and period<7:
- msgprint("Weekly periodicity can be set for period of atleast 1 week or more")
- raise Exception
-
+ #get schedule dates
+ #----------------------
+ def create_schedule_list(self, start_date, end_date, no_of_visit):
+ schedule_list = []
+ start_date1 = start_date
+ date_diff = (getdate(end_date) - getdate(start_date)).days
+ add_by = date_diff/no_of_visit
+ #schedule_list.append(start_date1)
+ while(getdate(start_date1) < getdate(end_date)):
+ start_date1 = add_days(start_date1, add_by)
+ if len(schedule_list) < no_of_visit:
+ schedule_list.append(getdate(start_date1))
+ return schedule_list
+
+ #validate date range and periodicity selected
+ #-------------------------------------------------
+ def validate_period(self, arg):
+ arg1 = eval(arg)
+ if getdate(arg1['start_date']) >= getdate(arg1['end_date']):
+ msgprint("Start date should be less than end date ")
+ raise Exception
+
+ period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1
+
+ if (arg1['periodicity']=='Yearly' or arg1['periodicity']=='Half Yearly' or arg1['periodicity']=='Quarterly') and period<365:
+ msgprint(cstr(arg1['periodicity'])+ " periodicity can be set for period of atleast 1 year or more only")
+ raise Exception
+ elif arg1['periodicity']=='Monthly' and period<30:
+ msgprint("Monthly periodicity can be set for period of atleast 1 month or more")
+ raise Exception
+ elif arg1['periodicity']=='Weekly' and period<7:
+ msgprint("Weekly periodicity can be set for period of atleast 1 week or more")
+ raise Exception
+
- #get count on the basis of periodicity selected
- #----------------------------------------------------
- def get_no_of_visits(self, arg):
- arg1 = eval(arg)
- start_date = arg1['start_date']
-
- self.validate_period(arg)
- period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1
-
- count =0
- if arg1['periodicity'] == 'Weekly':
- count = period/7
- elif arg1['periodicity'] == 'Monthly':
- count = period/30
- elif arg1['periodicity'] == 'Quarterly':
- count = period/91
- elif arg1['periodicity'] == 'Half Yearly':
- count = period/182
- elif arg1['periodicity'] == 'Yearly':
- count = period/365
-
- ret = {'no_of_visits':count}
- return ret
-
+ #get count on the basis of periodicity selected
+ #----------------------------------------------------
+ def get_no_of_visits(self, arg):
+ arg1 = eval(arg)
+ start_date = arg1['start_date']
+
+ self.validate_period(arg)
+ period = (getdate(arg1['end_date'])-getdate(arg1['start_date'])).days+1
+
+ count =0
+ if arg1['periodicity'] == 'Weekly':
+ count = period/7
+ elif arg1['periodicity'] == 'Monthly':
+ count = period/30
+ elif arg1['periodicity'] == 'Quarterly':
+ count = period/91
+ elif arg1['periodicity'] == 'Half Yearly':
+ count = period/182
+ elif arg1['periodicity'] == 'Yearly':
+ count = period/365
+
+ ret = {'no_of_visits':count}
+ return ret
+
- def validate_maintenance_detail(self):
- if not getlist(self.doclist, 'item_maintenance_detail'):
- msgprint("Please enter Maintaince Details first")
- raise Exception
-
- for d in getlist(self.doclist, 'item_maintenance_detail'):
- if not d.item_code:
- msgprint("Please select item code")
- raise Exception
- elif not d.start_date or not d.end_date:
- msgprint("Please select Start Date and End Date for item "+d.item_code)
- raise Exception
- elif not d.no_of_visits:
- msgprint("Please mention no of visits required")
- raise Exception
- elif not d.incharge_name:
- msgprint("Please select Incharge Person's name")
- raise Exception
-
- if getdate(d.start_date) >= getdate(d.end_date):
- msgprint("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
- #-----------------------------------------------------------------------------------
- def validate_sales_order(self):
- for d in getlist(self.doclist, 'item_maintenance_detail'):
- if d.prevdoc_docname:
- chk = 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)
- if chk:
- msgprint("Maintenance Schedule against "+d.prevdoc_docname+" already exist")
- raise Exception
-
- # Validate values with reference document
- #----------------------------------------
- def validate_reference_value(self):
- get_obj('DocType Mapper', 'Sales Order-Maintenance Schedule', with_children = 1).validate_reference_value(self, self.doc.name)
-
- def validate_serial_no(self):
- for d in getlist(self.doclist, 'item_maintenance_detail'):
- cur_s_no=[]
- if d.serial_no:
- cur_serial_no = d.serial_no.replace(' ', '')
- cur_s_no = cur_serial_no.split(',')
-
- for x in cur_s_no:
- chk = sql("select name, status from `tabSerial No` where docstatus!=2 and name=%s", (x))
- chk1 = chk and chk[0][0] or ''
- status = chk and chk[0][1] or ''
-
- if not chk1:
- msgprint("Serial no "+x+" does not exist in system.")
- raise Exception
- else:
- if status=='In Store' or status=='Note in Use' or status=='Scrapped':
- msgprint("Serial no "+x+" is '"+status+"'")
- raise Exception
-
- def validate(self):
- self.validate_maintenance_detail()
- self.validate_sales_order()
- if self.doc.sales_order_no:
- self.validate_reference_value()
- self.validate_serial_no()
- self.validate_start_date()
-
- # validate that maintenance start date can not be before serial no delivery date
- #-------------------------------------------------------------------------------------------
- def validate_start_date(self):
- for d in getlist(self.doclist, 'item_maintenance_detail'):
- if d.serial_no:
- cur_serial_no = d.serial_no.replace(' ', '')
- cur_s_no = cur_serial_no.split(',')
-
- for x in cur_s_no:
- dt = sql("select delivery_date from `tabSerial No` where name = %s", x)
- dt = dt and dt[0][0] or ''
-
- if dt:
- 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)
- raise Exception
-
- #update amc expiry date in serial no
- #------------------------------------------
- def update_amc_date(self,serial_no,amc_end_date):
- #get current list of serial no
- cur_serial_no = serial_no.replace(' ', '')
- cur_s_no = cur_serial_no.split(',')
-
- for x in cur_s_no:
- sql("update `tabSerial No` set amc_expiry_date = '%s', maintenance_status = 'Under AMC' where name = '%s'"% (amc_end_date,x))
-
- def on_update(self):
- webnotes.conn.set(self.doc, 'status', 'Draft')
-
- #validate that new maintenance start date does not clash with existing mntc end date
- #-------------------------------------------------------------------------------------------------
- def validate_serial_no_warranty(self):
- for d in getlist(self.doclist, 'item_maintenance_detail'):
- if d.serial_no:
- dt = sql("select warranty_expiry_date, amc_expiry_date from `tabSerial No` where name = %s", d.serial_no, as_dict=1)
-
- if dt[0]['warranty_expiry_date']:
- if dt[0]['warranty_expiry_date'] >= getdate(d.start_date):
- msgprint("Serial no "+d.serial_no+" for item "+d.item_code+" is already under warranty till "+(dt[0]['warranty_expiry_date']).strftime('%Y-%m-%d')+". You can schedule AMC start date after "+(dt[0]['warranty_expiry_date']).strftime('%Y-%m-%d'))
- raise Exception
- if dt[0]['amc_expiry_date']:
- if dt[0]['amc_expiry_date'] >= getdate(d.start_date):
- msgprint("Serial no "+d.serial_no+" for item "+d.item_code+" is already under AMC till "+(dt[0]['amc_expiry_date']).strftime('%Y-%m-%d')+". You can schedule new AMC start date after "+(dt[0]['amc_expiry_date']).strftime('%Y-%m-%d'))
- raise Exception
-
- #validate if schedule generated for all items
- #-------------------------------------------------
- def validate_schedule(self):
- item_lst1 =[]
- item_lst2 =[]
- for d in getlist(self.doclist, 'item_maintenance_detail'):
- if d.item_code not in item_lst1:
- item_lst1.append(d.item_code)
-
- for m in getlist(self.doclist, 'maintenance_schedule_detail'):
- if m.item_code not in item_lst2:
- item_lst2.append(m.item_code)
-
- if len(item_lst1) != len(item_lst2):
- msgprint("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'")
- raise Exception
- else:
- for x in item_lst1:
- if x not in item_lst2:
- msgprint("Maintenance Schedule is not generated for item "+x+". Please click on 'Generate Schedule'")
- raise Exception
-
- #check if serial no present in item maintenance table
- #-----------------------------------------------------------
- def check_serial_no_added(self):
- serial_present =[]
- for d in getlist(self.doclist, 'item_maintenance_detail'):
- if d.serial_no:
- serial_present.append(d.item_code)
-
- for m in getlist(self.doclist, 'maintenance_schedule_detail'):
- if serial_present:
- 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)
- raise Exception
-
-
-
- def on_cancel(self):
- for d in getlist(self.doclist, 'item_maintenance_detail'):
- if d.serial_no:
- self.update_amc_date(d.serial_no, '')
- webnotes.conn.set(self.doc, 'status', 'Cancelled')
- sql("delete from `tabEvent` where ref_type='Maintenance Schedule' and ref_name='%s' " %(self.doc.name))
- def on_trash(self):
- sql("delete from `tabEvent` where ref_type='Maintenance Schedule' and ref_name='%s' " %(self.doc.name))
-
+ def validate_maintenance_detail(self):
+ if not getlist(self.doclist, 'item_maintenance_detail'):
+ msgprint("Please enter Maintaince Details first")
+ raise Exception
+
+ for d in getlist(self.doclist, 'item_maintenance_detail'):
+ if not d.item_code:
+ msgprint("Please select item code")
+ raise Exception
+ elif not d.start_date or not d.end_date:
+ msgprint("Please select Start Date and End Date for item "+d.item_code)
+ raise Exception
+ elif not d.no_of_visits:
+ msgprint("Please mention no of visits required")
+ raise Exception
+ elif not d.incharge_name:
+ msgprint("Please select Incharge Person's name")
+ raise Exception
+
+ if getdate(d.start_date) >= getdate(d.end_date):
+ msgprint("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
+ #-----------------------------------------------------------------------------------
+ def validate_sales_order(self):
+ for d in getlist(self.doclist, 'item_maintenance_detail'):
+ if d.prevdoc_docname:
+ chk = 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)
+ if chk:
+ msgprint("Maintenance Schedule against "+d.prevdoc_docname+" already exist")
+ raise Exception
+
+ # Validate values with reference document
+ #----------------------------------------
+ def validate_reference_value(self):
+ get_obj('DocType Mapper', 'Sales Order-Maintenance Schedule', with_children = 1).validate_reference_value(self, self.doc.name)
+
+ def validate_serial_no(self):
+ for d in getlist(self.doclist, 'item_maintenance_detail'):
+ cur_s_no=[]
+ if d.serial_no:
+ cur_serial_no = d.serial_no.replace(' ', '')
+ cur_s_no = cur_serial_no.split(',')
+
+ for x in cur_s_no:
+ chk = sql("select name, status from `tabSerial No` where docstatus!=2 and name=%s", (x))
+ chk1 = chk and chk[0][0] or ''
+ status = chk and chk[0][1] or ''
+
+ if not chk1:
+ msgprint("Serial no "+x+" does not exist in system.")
+ raise Exception
+ else:
+ if status=='In Store' or status=='Note in Use' or status=='Scrapped':
+ msgprint("Serial no "+x+" is '"+status+"'")
+ raise Exception
+
+ def validate(self):
+ self.validate_maintenance_detail()
+ self.validate_sales_order()
+ if self.doc.sales_order_no:
+ self.validate_reference_value()
+ self.validate_serial_no()
+ self.validate_start_date()
+
+ # validate that maintenance start date can not be before serial no delivery date
+ #-------------------------------------------------------------------------------------------
+ def validate_start_date(self):
+ for d in getlist(self.doclist, 'item_maintenance_detail'):
+ if d.serial_no:
+ cur_serial_no = d.serial_no.replace(' ', '')
+ cur_s_no = cur_serial_no.split(',')
+
+ for x in cur_s_no:
+ dt = sql("select delivery_date from `tabSerial No` where name = %s", x)
+ dt = dt and dt[0][0] or ''
+
+ if dt:
+ 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)
+ raise Exception
+
+ #update amc expiry date in serial no
+ #------------------------------------------
+ def update_amc_date(self,serial_no,amc_end_date):
+ #get current list of serial no
+ cur_serial_no = serial_no.replace(' ', '')
+ cur_s_no = cur_serial_no.split(',')
+
+ for x in cur_s_no:
+ sql("update `tabSerial No` set amc_expiry_date = '%s', maintenance_status = 'Under AMC' where name = '%s'"% (amc_end_date,x))
+
+ def on_update(self):
+ webnotes.conn.set(self.doc, 'status', 'Draft')
+
+ #validate that new maintenance start date does not clash with existing mntc end date
+ #-------------------------------------------------------------------------------------------------
+ def validate_serial_no_warranty(self):
+ for d in getlist(self.doclist, 'item_maintenance_detail'):
+ if d.serial_no:
+ dt = sql("select warranty_expiry_date, amc_expiry_date from `tabSerial No` where name = %s", d.serial_no, as_dict=1)
+
+ if dt[0]['warranty_expiry_date']:
+ if dt[0]['warranty_expiry_date'] >= getdate(d.start_date):
+ msgprint("Serial no "+d.serial_no+" for item "+d.item_code+" is already under warranty till "+(dt[0]['warranty_expiry_date']).strftime('%Y-%m-%d')+". You can schedule AMC start date after "+(dt[0]['warranty_expiry_date']).strftime('%Y-%m-%d'))
+ raise Exception
+ if dt[0]['amc_expiry_date']:
+ if dt[0]['amc_expiry_date'] >= getdate(d.start_date):
+ msgprint("Serial no "+d.serial_no+" for item "+d.item_code+" is already under AMC till "+(dt[0]['amc_expiry_date']).strftime('%Y-%m-%d')+". You can schedule new AMC start date after "+(dt[0]['amc_expiry_date']).strftime('%Y-%m-%d'))
+ raise Exception
+
+ #validate if schedule generated for all items
+ #-------------------------------------------------
+ def validate_schedule(self):
+ item_lst1 =[]
+ item_lst2 =[]
+ for d in getlist(self.doclist, 'item_maintenance_detail'):
+ if d.item_code not in item_lst1:
+ item_lst1.append(d.item_code)
+
+ for m in getlist(self.doclist, 'maintenance_schedule_detail'):
+ if m.item_code not in item_lst2:
+ item_lst2.append(m.item_code)
+
+ if len(item_lst1) != len(item_lst2):
+ msgprint("Maintenance Schedule is not generated for all the items. Please click on 'Generate Schedule'")
+ raise Exception
+ else:
+ for x in item_lst1:
+ if x not in item_lst2:
+ msgprint("Maintenance Schedule is not generated for item "+x+". Please click on 'Generate Schedule'")
+ raise Exception
+
+ #check if serial no present in item maintenance table
+ #-----------------------------------------------------------
+ def check_serial_no_added(self):
+ serial_present =[]
+ for d in getlist(self.doclist, 'item_maintenance_detail'):
+ if d.serial_no:
+ serial_present.append(d.item_code)
+
+ for m in getlist(self.doclist, 'maintenance_schedule_detail'):
+ if serial_present:
+ 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)
+ raise Exception
+
+
+
+ def on_cancel(self):
+ for d in getlist(self.doclist, 'item_maintenance_detail'):
+ if d.serial_no:
+ self.update_amc_date(d.serial_no, '')
+ webnotes.conn.set(self.doc, 'status', 'Cancelled')
+ sql("delete from `tabEvent` where ref_type='Maintenance Schedule' and ref_name='%s' " %(self.doc.name))
+ def on_trash(self):
+ sql("delete from `tabEvent` where ref_type='Maintenance Schedule' and ref_name='%s' " %(self.doc.name))
+
diff --git a/utilities/transaction_base.py b/utilities/transaction_base.py
index 3f47237..4234597 100644
--- a/utilities/transaction_base.py
+++ b/utilities/transaction_base.py
@@ -220,7 +220,7 @@
self.doclist = self.doc.clear_table(self.doclist,'sales_team')
idx = 0
for d in webnotes.conn.sql("select sales_person, allocated_percentage, allocated_amount, incentives from `tabSales Team` where parent = '%s'" % name):
- ch = addchild(self.doc, 'sales_team', 'Sales Team', 1, self.doclist)
+ ch = addchild(self.doc, 'sales_team', 'Sales Team', self.doclist)
ch.sales_person = d and cstr(d[0]) or ''
ch.allocated_percentage = d and flt(d[1]) or 0
ch.allocated_amount = d and flt(d[2]) or 0
diff --git a/website/__init__.py b/website/__init__.py
index 32d7116..909a936 100644
--- a/website/__init__.py
+++ b/website/__init__.py
@@ -11,13 +11,13 @@
@webnotes.whitelist(allow_guest=True)
def send_message():
from webnotes.model.doc import Document
- args = webnotes.form_dict
d = Document('Support Ticket')
d.subject = webnotes.form_dict.get('subject', 'Website Query')
d.description = webnotes.form_dict.get('message')
d.raised_by = webnotes.form_dict.get('sender')
-
+ d.status = webnotes.form_dict.get("status") or "Open"
+
if not d.description:
webnotes.response["message"] = 'Please write something'
return