From 9e5059f6b9f2594231f459be441ce8cf4845da4c Mon Sep 17 00:00:00 2001 From: Nabin Hait Date: Wed, 11 Jul 2012 13:15:57 +0530 Subject: [PATCH] packing list introduced in pos invoice --- .../doctype/sales_invoice/sales_invoice.py | 338 ++++++++---------- .../doctype/sales_invoice/sales_invoice.txt | 35 +- erpnext/production/doctype/bom/bom.py | 4 - 3 files changed, 181 insertions(+), 196 deletions(-) diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py index 82314ca1331..eb869e5d084 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.py +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.py @@ -40,18 +40,12 @@ class DocType(TransactionBase): self.fname = 'entries' - # Autoname - # --------- def autoname(self): self.doc.name = make_autoname(self.doc.naming_series+ '.#####') - -# ********************************* Trigger Functions ****************************** - - #Set retail related fields from pos settings - #------------------------------------------------------------------------- def set_pos_fields(self): + """Set retail related fields from pos settings""" pos = webnotes.conn.sql("select * from `tabPOS Setting` where ifnull(user,'') = '%s' and company = '%s'" % (session['user'], self.doc.company), as_dict=1) if not pos: pos = webnotes.conn.sql("select * from `tabPOS Setting` where ifnull(user,'') = '' and company = '%s'" % (self.doc.company), as_dict=1) @@ -79,9 +73,8 @@ class DocType(TransactionBase): if self.doc.charge: self.get_other_charges() - # Set default values related to pos for previously created sales invoice. - # -------------------------------------------------------------------------- def set_pos_item_values(self): + """Set default values related to pos for previously created sales invoice.""" if cint(self.doc.is_pos) ==1: dtl = webnotes.conn.sql("select income_account, warehouse, cost_center from `tabPOS Setting` where ifnull(user,'') = '%s' and company = '%s'" % (session['user'], self.doc.company), as_dict=1) if not dtl: @@ -94,10 +87,8 @@ class DocType(TransactionBase): d.warehouse = item and item[0]['default_warehouse'] or dtl and dtl[0]['warehouse'] or d.warehouse - - # Get Account Head to which amount needs to be Debited based on Customer - # ---------------------------------------------------------------------- def get_customer_account(self): + """Get Account Head to which amount needs to be Debited based on Customer""" if not self.doc.company: msgprint("Please select company first and re-select the customer after doing so", raise_exception=1) @@ -115,10 +106,8 @@ class DocType(TransactionBase): return acc_head and {'debit_to' : acc_head} or {} - - # Set Due Date = Posting Date + Credit Days - # ----------------------------------------- def get_cust_and_due_date(self): + """Set Due Date = Posting Date + Credit Days""" credit_days = 0 if self.doc.debit_to: credit_days = webnotes.conn.sql("select credit_days from `tabAccount` where name='%s' and docstatus != 2" % self.doc.debit_to) @@ -134,9 +123,8 @@ class DocType(TransactionBase): self.doc.customer = webnotes.conn.get_value('Account',self.doc.debit_to,'master_name') - # Pull Details of Delivery Note or Sales Order Selected - # ------------------------------------------------------ def pull_details(self): + """Pull Details of Delivery Note or Sales Order Selected""" # Delivery Note if self.doc.delivery_note_main: self.validate_prev_docname('delivery note') @@ -153,14 +141,14 @@ class DocType(TransactionBase): ret = self.get_debit_to() self.doc.debit_to = ret.get('debit_to') - # onload pull income account - # -------------------------- + def load_default_accounts(self): """ Loads default accounts from items, customer when called from mapper """ self.get_income_account('entries') + def get_income_account(self,doctype): for d in getlist(self.doclist, doctype): if d.item_code: @@ -168,8 +156,7 @@ class DocType(TransactionBase): d.income_account = item and item[0]['default_income_account'] or '' d.cost_center = item and item[0]['default_sales_cost_center'] or '' - # Item Details - # ------------- + def get_item_details(self, args=None): import json args = args and json.loads(args) or {} @@ -215,61 +202,49 @@ class DocType(TransactionBase): return get_obj('Sales Common').get_barcode_details(barcode) - # Fetch ref rate from item master as per selected price list def get_adj_percent(self, arg=''): + """Fetch ref rate from item master as per selected price list""" get_obj('Sales Common').get_adj_percent(self) - # Get tax rate if account type is tax - # ------------------------------------ def get_rate(self,arg): + """Get tax rate if account type is tax""" get_obj('Sales Common').get_rate(arg) - # Get Commission rate of Sales Partner - # ------------------------------------- def get_comm_rate(self, sales_partner): + """Get Commission rate of Sales Partner""" return get_obj('Sales Common').get_comm_rate(sales_partner, self) - - # GET TERMS & CONDITIONS - # ------------------------------------- + def get_tc_details(self): return get_obj('Sales Common').get_tc_details(self) - # Load Default Charges - # ---------------------------------------------------------- + def load_default_taxes(self): self.doclist = get_obj('Sales Common').load_default_taxes(self) - # Get Sales Taxes and Charges Master Details - # -------------------------- + def get_other_charges(self): self.doclist = get_obj('Sales Common').get_other_charges(self) - # Get Advances - # ------------- + def get_advances(self): self.doclist = get_obj('GL Control').get_advances(self, self.doc.debit_to, 'Sales Invoice Advance', 'advance_adjustment_details', 'credit') - #pull project customer - #------------------------- + def pull_project_customer(self): res = webnotes.conn.sql("select customer from `tabProject` where name = '%s'"%self.doc.project_name) if res: get_obj('DocType Mapper', 'Project-Sales Invoice').dt_map('Project', 'Sales Invoice', self.doc.project_name, self.doc, self.doclist, "[['Project', 'Sales Invoice']]") -# ********************************** Server Utility Functions ****************************** - - # Get Company Abbr. - # ------------------ + def get_company_abbr(self): return webnotes.conn.sql("select abbr from tabCompany where name=%s", self.doc.company)[0][0] - - # Check whether sales order / delivery note items already pulled - #---------------------------------------------------------------- + def validate_prev_docname(self,doctype): + """Check whether sales order / delivery note items already pulled""" for d in getlist(self.doclist, 'entries'): if doctype == 'delivery note' and self.doc.delivery_note_main == d.delivery_note: msgprint(cstr(self.doc.delivery_note_main) + " delivery note details have already been pulled.") @@ -279,7 +254,6 @@ class DocType(TransactionBase): raise Exception , "Validation Error. Sales order details have already been pulled." - #----------------------------------------------------------------- def update_against_document_in_jv(self): """ Links invoice and advance voucher: @@ -308,11 +282,8 @@ class DocType(TransactionBase): get_obj('GL Control').reconcile_against_document(lst) - # ------------------------------------------------------------------------ def validate_customer(self): - """ - Validate customer name with SO and DN - """ + """ Validate customer name with SO and DN""" for d in getlist(self.doclist,'entries'): dt = d.delivery_note and 'Delivery Note' or d.sales_order and 'Sales Order' or '' if dt: @@ -322,9 +293,8 @@ class DocType(TransactionBase): msgprint("Customer %s does not match with customer of %s: %s." %(self.doc.customer, dt, dt_no), raise_exception=1) - # Validates Debit To Account and Customer Matches - # ------------------------------------------------ - def validate_debit_to_acc(self): + def validate_customer_account(self): + """Validates Debit To Account and Customer Matches""" if self.doc.customer and self.doc.debit_to and not cint(self.doc.is_pos): acc_head = webnotes.conn.sql("select master_name from `tabAccount` where name = %s and docstatus != 2", self.doc.debit_to) @@ -334,11 +304,6 @@ class DocType(TransactionBase): and Master Name in account master." %(self.doc.debit_to, self.doc.customer,self.doc.company), raise_exception=1) - # Validate Debit To Account - # 1. Account Exists - # 2. Is a Debit Account - # 3. Is a PL Account - # --------------------------- def validate_debit_acc(self): acc = webnotes.conn.sql("select debit_or_credit, is_pl_account from tabAccount where name = '%s' and docstatus != 2" % self.doc.debit_to) if not acc: @@ -352,9 +317,8 @@ class DocType(TransactionBase): raise Exception - # Validate Fixed Asset Account and whether Income Account Entered Exists - # ----------------------------------------------------------------------- def validate_fixed_asset_account(self): + """Validate Fixed Asset Account and whether Income Account Entered Exists""" for d in getlist(self.doclist,'entries'): item = webnotes.conn.sql("select name,is_asset_item,is_sales_item from `tabItem` where name = '%s' and (ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life > now())"% d.item_code) acc = webnotes.conn.sql("select account_type from `tabAccount` where name = '%s' and docstatus != 2" % d.income_account) @@ -366,22 +330,16 @@ class DocType(TransactionBase): raise Exception - - # Set totals in words - #-------------------- def set_in_words(self): dcc = TransactionBase().get_company_currency(self.doc.company) self.doc.in_words = get_obj('Sales Common').get_total_in_words(dcc, self.doc.rounded_total) self.doc.in_words_export = get_obj('Sales Common').get_total_in_words(self.doc.currency, self.doc.rounded_total_export) - # Clear Advances - # -------------- + def clear_advances(self): get_obj('GL Control').clear_advances(self, 'Sales Invoice Advance','advance_adjustment_details') - # set aging date - #------------------- def set_aging_date(self): if self.doc.is_opening != 'Yes': self.doc.aging_date = self.doc.posting_date @@ -390,20 +348,21 @@ class DocType(TransactionBase): raise Exception - # Set against account for debit to account - #------------------------------------------ def set_against_income_account(self): + """Set against account for debit to account""" against_acc = [] for d in getlist(self.doclist, 'entries'): if d.income_account not in against_acc: against_acc.append(d.income_account) self.doc.against_income_account = ','.join(against_acc) + def add_remarks(self): if not self.doc.remarks: self.doc.remarks = 'No Remarks' - #check in manage account if sales order / delivery note required or not. + def so_dn_required(self): + """check in manage account if sales order / delivery note required or not.""" dict = {'Sales Order':'so_required','Delivery Note':'dn_required'} for i in dict: res = webnotes.conn.sql("select value from `tabSingles` where doctype = 'Global Defaults' and field = '%s'"%dict[i]) @@ -413,9 +372,9 @@ class DocType(TransactionBase): msgprint("%s No. required against item %s"%(i,d.item_code)) raise Exception - #check for does customer belong to same project as entered.. - #------------------------------------------------------------------------------------------------- + def validate_proj_cust(self): + """check for does customer belong to same project as entered..""" if self.doc.project_name and self.doc.customer: res = webnotes.conn.sql("select name from `tabProject` where name = '%s' and (customer = '%s' or ifnull(customer,'')='')"%(self.doc.project_name, self.doc.customer)) if not res: @@ -431,20 +390,13 @@ class DocType(TransactionBase): raise Exception - # ********* UPDATE CURRENT STOCK ***************************** - def update_current_stock(self): - for d in getlist(self.doclist, 'entries'): - bin = webnotes.conn.sql("select actual_qty from `tabBin` where item_code = %s and warehouse = %s", (d.item_code, d.warehouse), as_dict = 1) - d.actual_qty = bin and flt(bin[0]['actual_qty']) or 0 - def validate_item_code(self): for d in getlist(self.doclist, 'entries'): if not d.item_code: msgprint("Please enter Item Code at line no : %s to update stock for POS or remove check from Update Stock in Basic Info Tab." % (d.idx)) raise Exception - # Validate Write Off Account - # ------------------------------- + def validate_write_off_account(self): if flt(self.doc.write_off_amount) and not self.doc.write_off_account: msgprint("Please enter Write Off Account", raise_exception=1) @@ -457,12 +409,22 @@ class DocType(TransactionBase): and parent = %s""", (self.doc.amended_from, self.doc.c_form_no)) webnotes.conn.set(self.doc, 'c_form_no', '') + + + def update_current_stock(self): + for d in getlist(self.doclist, 'entries'): + if d.item_code and d.warehouse: + bin = webnotes.conn.sql("select actual_qty from `tabBin` where item_code = %s and warehouse = %s", (d.item_code, d.warehouse), as_dict = 1) + d.actual_qty = bin and flt(bin[0]['actual_qty']) or 0 + + for d in getlist(self.doclist, 'packing_details'): + bin = sql("select actual_qty, projected_qty from `tabBin` where item_code = %s and warehouse = %s", (d.item_code, d.warehouse), as_dict = 1) + d.actual_qty = bin and flt(bin[0]['actual_qty']) or 0 + d.projected_qty = bin and flt(bin[0]['projected_qty']) or 0 - # VALIDATE - # ==================================================================================== + def validate(self): self.so_dn_required() - #self.dn_required() self.validate_proj_cust() sales_com_obj = get_obj('Sales Common') sales_com_obj.check_stop_sales_order(self) @@ -472,7 +434,7 @@ class DocType(TransactionBase): sales_com_obj.get_allocated_sum(self) # this is to verify that the allocated % of sales persons is 100% sales_com_obj.validate_fiscal_year(self.doc.fiscal_year,self.doc.posting_date,'Posting Date') self.validate_customer() - self.validate_debit_to_acc() + self.validate_customer_account() self.validate_debit_acc() self.validate_fixed_asset_account() self.add_remarks() @@ -480,7 +442,9 @@ class DocType(TransactionBase): self.validate_pos() self.validate_write_off_account() if cint(self.doc.update_stock): - get_obj('Stock Ledger').validate_serial_no(self, 'entries') + sl = get_obj('Stock Ledger') + sl.validate_serial_no(self, 'entries') + sl.validate_serial_no(self, 'packing_details') self.validate_item_code() self.update_current_stock() self.set_in_words() @@ -488,14 +452,62 @@ class DocType(TransactionBase): self.doc.is_opening = 'No' self.set_aging_date() self.clear_advances() - # Set against account self.set_against_income_account() self.validate_c_form() + + def get_warehouse(self): + w = webnotes.conn.sql("select warehouse from `tabPOS Setting` where ifnull(user,'') = '%s' and company = '%s'" % (session['user'], self.doc.company)) + w = w and w[0][0] or '' + if not w: + ps = webnotes.conn.sql("select name, warehouse from `tabPOS Setting` where ifnull(user,'') = '' and company = '%s'" % self.doc.company) + if not ps: + msgprint("To make POS entry, please create POS Setting from Accounts --> POS Setting page and refresh the system.") + raise Exception + elif not ps[0][1]: + msgprint("Please enter warehouse in POS Setting") + else: + w = ps[0][1] + return w + + + def make_packing_list(self): + get_obj('Sales Common').make_packing_list(self,'entries') + sl = get_obj('Stock Ledger') + sl.scrub_serial_nos(self) + sl.scrub_serial_nos(self, 'packing_details') + + + def on_update(self): + # Set default warehouse from pos setting + if cint(self.doc.is_pos) == 1: + if cint(self.doc.update_stock) == 1: + w = self.get_warehouse() + if w: + for d in getlist(self.doclist, 'entries'): + if not d.warehouse: + d.warehouse = cstr(w) + + self.make_packing_list() + else: + self.doclist = self.doc.clear_table(self.doclist, 'packing_details') + + if flt(self.doc.paid_amount) == 0: + if self.doc.cash_bank_account: + webnotes.conn.set(self.doc, 'paid_amount', + (flt(self.doc.grand_total) - flt(self.doc.write_off_amount))) + else: + # show message that the amount is not paid + webnotes.conn.set(self.doc,'paid_amount',0) + webnotes.msgprint("Note: Payment Entry will not be created since 'Cash/Bank Account' was not specified.") + + else: + self.doclist = self.doc.clear_table(self.doclist, 'packing_details') + webnotes.conn.set(self.doc,'paid_amount',0) + + webnotes.conn.set(self.doc,'outstanding_amount',flt(self.doc.grand_total) - flt(self.doc.total_advance) - flt(self.doc.paid_amount) - flt(self.doc.write_off_amount)) + -# *************************************************** ON SUBMIT ********************************************** - # Check Ref Document's docstatus - # ------------------------------- def check_prev_docstatus(self): for d in getlist(self.doclist,'entries'): if d.sales_order: @@ -511,56 +523,45 @@ class DocType(TransactionBase): raise Exception , "Validation Error." - #Set Actual Qty based on item code and warehouse - #------------------------------------------------------ - def set_actual_qty(self): - for d in getlist(self.doclist, 'entries'): - if d.item_code and d.warehouse: - actual_qty = webnotes.conn.sql("select actual_qty from `tabBin` where item_code = '%s' and warehouse = '%s'" % (d.item_code, d.warehouse)) - d.actual_qty = actual_qty and flt(actual_qty[0][0]) or 0 - - - - # ********************** Make Stock Entry ************************************ def make_sl_entry(self, d, wh, qty, in_value, update_stock): - st_uom = webnotes.conn.sql("select stock_uom from `tabItem` where name = '%s'"%d.item_code) + st_uom = webnotes.conn.sql("select stock_uom from `tabItem` where name = '%s'"%d['item_code']) self.values.append({ - 'item_code' : d.item_code, + 'item_code' : d['item_code'], 'warehouse' : wh, 'transaction_date' : getdate(self.doc.modified).strftime('%Y-%m-%d'), 'posting_date' : self.doc.posting_date, 'posting_time' : self.doc.posting_time, 'voucher_type' : 'Sales Invoice', 'voucher_no' : cstr(self.doc.name), - 'voucher_detail_no' : cstr(d.name), + 'voucher_detail_no' : cstr(d['name']), 'actual_qty' : qty, 'stock_uom' : st_uom and st_uom[0][0] or '', 'incoming_rate' : in_value, 'company' : self.doc.company, 'fiscal_year' : self.doc.fiscal_year, 'is_cancelled' : (update_stock==1) and 'No' or 'Yes', - 'batch_no' : cstr(d.batch_no), - 'serial_no' : d.serial_no - }) + 'batch_no' : cstr(d['batch_no']), + 'serial_no' : d['serial_no'] + }) - # UPDATE STOCK LEDGER - # --------------------------------------------------------------------------- - def update_stock_ledger(self, update_stock, clear = 0): + def update_stock_ledger(self, update_stock): self.values = [] - for d in getlist(self.doclist, 'entries'): - stock_item = webnotes.conn.sql("SELECT is_stock_item, is_sample_item FROM tabItem where name = '%s'"%(d.item_code), as_dict = 1) # stock ledger will be updated only if it is a stock item + items = get_obj('Sales Common').get_item_list(self) + for d in items: + stock_item = webnotes.conn.sql("SELECT is_stock_item, is_sample_item \ + FROM tabItem where name = '%s'"%(d['item_code']), as_dict = 1) if stock_item[0]['is_stock_item'] == "Yes": + if not d['warehouse']: + msgprint("Message: Please enter Warehouse for item %s as it is stock item." \ + % d['item_code'], raise_exception=1) + # Reduce actual qty from warehouse - self.make_sl_entry( d, d.warehouse, - flt(d.qty) , 0, update_stock) - get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values, self.doc.amended_from and 'Yes' or 'No') - - - #-------------------POS Stock Updatation Part---------------------------------------------- - def pos_update_stock(self): - self.update_stock_ledger(update_stock = 1) + self.make_sl_entry( d, d['warehouse'], - flt(d['qty']) , 0, update_stock) + + get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values) - # ********** Get Actual Qty of item in warehouse selected ************* + def get_actual_qty(self,args): args = eval(args) actual_qty = webnotes.conn.sql("select actual_qty from `tabBin` where item_code = '%s' and warehouse = '%s'" % (args['item_code'], args['warehouse']), as_dict=1) @@ -569,23 +570,39 @@ class DocType(TransactionBase): } return ret - # Make GL Entries - # ------------------------- + def make_gl_entries(self, is_cancel=0): mapper = self.doc.is_pos and self.doc.write_off_account and 'POS with write off' or self.doc.is_pos and not self.doc.write_off_account and 'POS' or '' update_outstanding = self.doc.is_pos and self.doc.write_off_account and 'No' or 'Yes' get_obj(dt='GL Control').make_gl_entries(self.doc, self.doclist,cancel = is_cancel, use_mapper = mapper, update_outstanding = update_outstanding, merge_entries = cint(self.doc.is_pos) != 1 and 1 or 0) - # On Submit - # --------- + def update_c_form(self): + """Update amended id in C-form""" + if self.doc.c_form_no and self.doc.amended_from: + webnotes.conn.sql("""update `tabC-Form Invoice Detail` set invoice_no = %s, + invoice_date = %s, territory = %s, net_total = %s, + grand_total = %s where invoice_no = %s and parent = %s""", (self.doc.name, self.doc.amended_from, self.doc.c_form_no)) + + + def check_next_docstatus(self): + submit_jv = webnotes.conn.sql("select t1.name from `tabJournal Voucher` t1,`tabJournal Voucher Detail` t2 where t1.name = t2.parent and t2.against_invoice = '%s' and t1.docstatus = 1" % (self.doc.name)) + if submit_jv: + msgprint("Journal Voucher : " + cstr(submit_jv[0][0]) + " has been created against " + cstr(self.doc.doctype) + ". So " + cstr(self.doc.doctype) + " cannot be Cancelled.") + raise Exception, "Validation Error." + + def on_submit(self): if cint(self.doc.is_pos) == 1: if cint(self.doc.update_stock) == 1: sl_obj = get_obj("Stock Ledger") sl_obj.validate_serial_no_warehouse(self, 'entries') + sl_obj.validate_serial_no_warehouse(self, 'packing_details') + sl_obj.update_serial_record(self, 'entries', is_submit = 1, is_incoming = 0) - self.pos_update_stock() + sl_obj.update_serial_record(self, 'packing_details', is_submit = 1, is_incoming = 0) + + self.update_stock_ledger(update_stock=1) else: self.check_prev_docstatus() get_obj("Sales Common").update_prevdoc_detail(1,self) @@ -603,31 +620,13 @@ class DocType(TransactionBase): self.update_c_form() - def update_c_form(self): - """Update amended id in C-form""" - if self.doc.c_form_no and self.doc.amended_from: - webnotes.conn.sql("""update `tabC-Form Invoice Detail` set invoice_no = %s, - invoice_date = %s, territory = %s, net_total = %s, - grand_total = %s where invoice_no = %s and parent = %s""", (self.doc.name, self.doc.amended_from, self.doc.c_form_no)) - - - -# *************************************************** ON CANCEL ********************************************** - # Check Next Document's docstatus - # -------------------------------- - def check_next_docstatus(self): - submit_jv = webnotes.conn.sql("select t1.name from `tabJournal Voucher` t1,`tabJournal Voucher Detail` t2 where t1.name = t2.parent and t2.against_invoice = '%s' and t1.docstatus = 1" % (self.doc.name)) - if submit_jv: - msgprint("Journal Voucher : " + cstr(submit_jv[0][0]) + " has been created against " + cstr(self.doc.doctype) + ". So " + cstr(self.doc.doctype) + " cannot be Cancelled.") - raise Exception, "Validation Error." - - - # On Cancel - # ---------- def on_cancel(self): if cint(self.doc.is_pos) == 1: if cint(self.doc.update_stock) == 1: - get_obj('Stock Ledger').update_serial_record(self, 'entries', is_submit = 0, is_incoming = 0) + sl = get_obj('Stock Ledger') + sl.update_serial_record(self, 'entries', is_submit = 0, is_incoming = 0) + sl.update_serial_record(self, 'packing_details', is_submit = 0, is_incoming = 0) + self.update_stock_ledger(update_stock = -1) else: sales_com_obj = get_obj(dt = 'Sales Common') @@ -636,51 +635,6 @@ class DocType(TransactionBase): sales_com_obj.update_prevdoc_detail(0,self) self.make_gl_entries(is_cancel=1) - - # Get Warehouse - def get_warehouse(self): - w = webnotes.conn.sql("select warehouse from `tabPOS Setting` where ifnull(user,'') = '%s' and company = '%s'" % (session['user'], self.doc.company)) - w = w and w[0][0] or '' - if not w: - ps = webnotes.conn.sql("select name, warehouse from `tabPOS Setting` where ifnull(user,'') = '' and company = '%s'" % self.doc.company) - if not ps: - msgprint("To make POS entry, please create POS Setting from Setup --> Accounts --> POS Setting and refresh the system.") - raise Exception - elif not ps[0][1]: - msgprint("Please enter warehouse in POS Setting") - else: - w = ps[0][1] - return w - - # on update - def on_update(self): - # Set default warehouse from pos setting - #---------------------------------------- - if cint(self.doc.is_pos) == 1: - self.set_actual_qty() - w = self.get_warehouse() - if w: - for d in getlist(self.doclist, 'entries'): - if not d.warehouse: - d.warehouse = cstr(w) - - if flt(self.doc.paid_amount) == 0: - if self.doc.cash_bank_account: - webnotes.conn.set(self.doc, 'paid_amount', - (flt(self.doc.grand_total) - flt(self.doc.write_off_amount))) - else: - # show message that the amount is not paid - webnotes.conn.set(self.doc,'paid_amount',0) - webnotes.msgprint("Note: Payment Entry not created since 'Cash/Bank Account' was not specified.") - - else: - webnotes.conn.set(self.doc,'paid_amount',0) - - webnotes.conn.set(self.doc,'outstanding_amount',flt(self.doc.grand_total) - flt(self.doc.total_advance) - flt(self.doc.paid_amount) - flt(self.doc.write_off_amount)) - - #------------------------------------------------------------------------------------- - def on_update_after_submit(self): - self.convert_into_recurring() def convert_into_recurring(self): @@ -717,3 +671,7 @@ class DocType(TransactionBase): next_date = next_date.strftime("%Y-%m-%d") webnotes.conn.set(self.doc, 'next_date', next_date) + + + def on_update_after_submit(self): + self.convert_into_recurring() \ No newline at end of file diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt b/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt index 969a7dc6d73..a2b341fd4fe 100644 --- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt +++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.txt @@ -3,9 +3,9 @@ # These values are common in all dictionaries { - 'creation': '2012-06-11 12:09:54', + 'creation': '2012-07-05 11:04:09', 'docstatus': 0, - 'modified': '2012-06-17 21:37:40', + 'modified': '2012-07-11 12:19:49', 'modified_by': u'Administrator', 'owner': u'Administrator' }, @@ -350,6 +350,16 @@ 'permlevel': 0 }, + # DocField + { + 'doctype': u'DocField', + 'fieldname': u'sales_bom_help', + 'fieldtype': u'HTML', + 'label': u'Sales BOM Help', + 'permlevel': 0, + 'print_hide': 1 + }, + # DocField { 'doctype': u'DocField', @@ -1343,6 +1353,27 @@ 'print_hide': 1 }, + # DocField + { + 'doctype': u'DocField', + 'fieldname': u'packing_list', + 'fieldtype': u'Section Break', + 'label': u'Packing List', + 'permlevel': 0, + 'print_hide': 1 + }, + + # DocField + { + 'doctype': u'DocField', + 'fieldname': u'packing_details', + 'fieldtype': u'Table', + 'label': u'Packing Details', + 'options': u'Delivery Note Packing Item', + 'permlevel': 0, + 'print_hide': 1 + }, + # DocField { 'doctype': u'DocField', diff --git a/erpnext/production/doctype/bom/bom.py b/erpnext/production/doctype/bom/bom.py index 81297b4f1b7..bc166ceb860 100644 --- a/erpnext/production/doctype/bom/bom.py +++ b/erpnext/production/doctype/bom/bom.py @@ -106,7 +106,6 @@ class DocType: return ret_item - def get_rm_rate(self, arg): """ Get raw material rate as per selected method, if bom exists takes bom cost """ @@ -293,7 +292,6 @@ class DocType: self.validate_main_item() self.validate_operations() self.validate_materials() - self.validate_operations() @@ -353,8 +351,6 @@ class DocType: }) - - # Get Current Flat BOM Items # ----------------------------- def get_current_flat_bom_items(self):