From f5d90abe9245010d82c79d9cee7cb26029fc7858 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Mon, 24 Dec 2012 17:02:38 +0530 Subject: [PATCH] addchild will never save added doc --- .../bank_reconciliation.py | 2 +- .../budget_distribution.py | 3 +- accounts/doctype/gl_control/gl_control.py | 6 +- .../journal_voucher/journal_voucher.py | 6 +- .../payment_to_invoice_matching_tool.py | 2 +- .../purchase_common/purchase_common.py | 3 +- .../doctype/purchase_order/purchase_order.py | 2 +- .../quality_inspection/quality_inspection.py | 2 +- controllers/tax_controller.py | 6 +- hr/doctype/holiday_list/holiday_list.py | 2 +- .../salary_structure/salary_structure.py | 2 +- manufacturing/doctype/bom/bom.py | 3 +- .../production_planning_tool.py | 4 +- .../april_2012/update_appraisal_permission.py | 2 +- patches/april_2012/update_role_in_address.py | 2 +- selling/doctype/opportunity/opportunity.py | 2 +- selling/doctype/quotation/quotation.py | 2 +- selling/doctype/sales_common/sales_common.py | 9 +- setup/doctype/setup_control/setup_control.py | 4 +- stock/doctype/bin/bin.py | 2 +- stock/doctype/item/item.py | 3 +- .../landed_cost_wizard/landed_cost_wizard.py | 8 +- .../purchase_receipt/purchase_receipt.py | 2 +- .../sales_and_purchase_return_tool.py | 83 +-- stock/doctype/stock_entry/stock_entry.py | 3 +- .../maintenance_schedule.py | 595 +++++++++--------- utilities/transaction_base.py | 2 +- 27 files changed, 386 insertions(+), 376 deletions(-) diff --git a/accounts/doctype/bank_reconciliation/bank_reconciliation.py b/accounts/doctype/bank_reconciliation/bank_reconciliation.py index 35db6fbd0e..05c043265d 100644 --- a/accounts/doctype/bank_reconciliation/bank_reconciliation.py +++ b/accounts/doctype/bank_reconciliation/bank_reconciliation.py @@ -42,7 +42,7 @@ class DocType: 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 081031892e..976fa84c95 100644 --- a/accounts/doctype/budget_distribution/budget_distribution.py +++ b/accounts/doctype/budget_distribution/budget_distribution.py @@ -31,7 +31,8 @@ class DocType: '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 e4896d35bb..44cab1e7a8 100644 --- a/accounts/doctype/gl_control/gl_control.py +++ b/accounts/doctype/gl_control/gl_control.py @@ -223,7 +223,7 @@ class DocType: 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 @@ class DocType: 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 @@ class DocType: 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 23c66a6a24..7c1dcfee8d 100644 --- a/accounts/doctype/journal_voucher/journal_voucher.py +++ b/accounts/doctype/journal_voucher/journal_voucher.py @@ -174,7 +174,7 @@ class DocType: # 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 @@ class DocType: 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 @@ class DocType: 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 005b981335..81b94a22c3 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 @@ class DocType: #-------------------------------------------------- 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 a59061ca11..e8b725ed92 100644 --- a/buying/doctype/purchase_common/purchase_common.py +++ b/buying/doctype/purchase_common/purchase_common.py @@ -612,7 +612,8 @@ class DocType(TransactionBase): 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 7182306b6d..812f59c740 100644 --- a/buying/doctype/purchase_order/purchase_order.py +++ b/buying/doctype/purchase_order/purchase_order.py @@ -314,7 +314,7 @@ class DocType(TransactionBase): 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 981bf43e41..415524f32a 100644 --- a/buying/doctype/quality_inspection/quality_inspection.py +++ b/buying/doctype/quality_inspection/quality_inspection.py @@ -41,7 +41,7 @@ class DocType: 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 009ab31628..617c4cc7df 100644 --- a/controllers/tax_controller.py +++ b/controllers/tax_controller.py @@ -19,7 +19,7 @@ import webnotes 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 @@ class TaxController(TransactionController): 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 @@ class TaxController(TransactionController): 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 63b1af425c..43f99167df 100644 --- a/hr/doctype/holiday_list/holiday_list.py +++ b/hr/doctype/holiday_list/holiday_list.py @@ -99,7 +99,7 @@ class DocType: 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 d07be6eb07..f310b7b4c8 100644 --- a/hr/doctype/salary_structure/salary_structure.py +++ b/hr/doctype/salary_structure/salary_structure.py @@ -70,7 +70,7 @@ class DocType: 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 d874d3c643..bc80bfe33b 100644 --- a/manufacturing/doctype/bom/bom.py +++ b/manufacturing/doctype/bom/bom.py @@ -357,7 +357,8 @@ class DocType: "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_planning_tool/production_planning_tool.py b/manufacturing/doctype/production_planning_tool/production_planning_tool.py index 51cb3a7612..adc80918e1 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 @@ class DocType: 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 @@ class DocType: 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 5afcdbba7a..68002ba2ae 100644 --- a/patches/april_2012/update_appraisal_permission.py +++ b/patches/april_2012/update_appraisal_permission.py @@ -7,7 +7,7 @@ def execute(): 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 3a65c30e1c..788aa7bd49 100644 --- a/patches/april_2012/update_role_in_address.py +++ b/patches/april_2012/update_role_in_address.py @@ -11,7 +11,7 @@ def execute(): 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/selling/doctype/opportunity/opportunity.py b/selling/doctype/opportunity/opportunity.py index 82a6e8e4c7..369fab72a1 100644 --- a/selling/doctype/opportunity/opportunity.py +++ b/selling/doctype/opportunity/opportunity.py @@ -123,7 +123,7 @@ class DocType(TransactionBase): 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 0e7554497e..3b452f18b7 100644 --- a/selling/doctype/quotation/quotation.py +++ b/selling/doctype/quotation/quotation.py @@ -19,7 +19,7 @@ import webnotes 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 e672abf0eb..03280e2804 100644 --- a/selling/doctype/sales_common/sales_common.py +++ b/selling/doctype/sales_common/sales_common.py @@ -75,7 +75,7 @@ class DocType(TransactionBase): 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 @@ class DocType(TransactionBase): 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 @@ class DocType(TransactionBase): 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 fb0b694454..3c073dafc1 100644 --- a/setup/doctype/setup_control/setup_control.py +++ b/setup/doctype/setup_control/setup_control.py @@ -239,13 +239,13 @@ class DocType: 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 5e3e74af50..d472e5fc4d 100644 --- a/stock/doctype/bin/bin.py +++ b/stock/doctype/bin/bin.py @@ -350,7 +350,7 @@ class DocType: 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 a9f7ee7129..e68ef7fad0 100644 --- a/stock/doctype/item/item.py +++ b/stock/doctype/item/item.py @@ -70,7 +70,8 @@ class DocType: 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 4e8015d0f1..d5abb84596 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 @@ class DocType: 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 @@ class DocType: 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 @@ class DocType: 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 4683abba66..e5e1fe110e 100644 --- a/stock/doctype/purchase_receipt/purchase_receipt.py +++ b/stock/doctype/purchase_receipt/purchase_receipt.py @@ -390,7 +390,7 @@ class DocType(TransactionBase): 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 92fa63e124..92b0cb1d09 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 . +# along with this program. If not, see . from __future__ import unicode_literals import webnotes @@ -26,45 +26,46 @@ sql = webnotes.conn.sql 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.py b/stock/doctype/stock_entry/stock_entry.py index 1e4f3001fb..dae2d10ab6 100644 --- a/stock/doctype/stock_entry/stock_entry.py +++ b/stock/doctype/stock_entry/stock_entry.py @@ -467,7 +467,8 @@ class DocType(TransactionBase): 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) diff --git a/support/doctype/maintenance_schedule/maintenance_schedule.py b/support/doctype/maintenance_schedule/maintenance_schedule.py index b703e56ac8..6560c83598 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 . +# along with this program. If not, see . from __future__ import unicode_literals import webnotes @@ -30,313 +30,314 @@ sql = webnotes.conn.sql 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 3f47237501..423459739e 100644 --- a/utilities/transaction_base.py +++ b/utilities/transaction_base.py @@ -220,7 +220,7 @@ class TransactionBase: 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