Merge branch 'master' of git://github.com/nijil/erpnext
diff --git a/erpnext/accounts/Module Def/Accounts/Accounts.txt b/erpnext/accounts/Module Def/Accounts/Accounts.txt
index 0a6921a..f9c36c8 100644
--- a/erpnext/accounts/Module Def/Accounts/Accounts.txt
+++ b/erpnext/accounts/Module Def/Accounts/Accounts.txt
@@ -5,7 +5,7 @@
{
'creation': '2010-09-25 10:50:37',
'docstatus': 0,
- 'modified': '2011-09-27 12:44:04',
+ 'modified': '2011-12-07 16:18:28',
'modified_by': 'Administrator',
'owner': 'Administrator'
},
@@ -181,6 +181,15 @@
# Module Def Item
{
+ 'description': 'Track C-Form received from customers',
+ 'display_name': 'C-Form',
+ 'doc_name': 'C-Form',
+ 'doc_type': 'Setup Forms',
+ 'doctype': 'Module Def Item'
+ },
+
+ # Module Def Item
+ {
'display_name': 'General Ledger',
'doc_name': 'GL Entry',
'doc_type': 'Reports',
diff --git a/erpnext/accounts/doctype/c_form/__init__.py b/erpnext/accounts/doctype/c_form/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/doctype/c_form/__init__.py
diff --git a/erpnext/accounts/doctype/c_form/c_form.js b/erpnext/accounts/doctype/c_form/c_form.js
new file mode 100644
index 0000000..6629de6
--- /dev/null
+++ b/erpnext/accounts/doctype/c_form/c_form.js
@@ -0,0 +1,10 @@
+//c-form js file
+// -----------------------------
+cur_frm.fields_dict.invoice_details.grid.get_field("invoice_no").get_query = function(doc) {
+ return 'SELECT `tabReceivable Voucher`.`name` FROM `tabReceivable Voucher` WHERE `tabReceivable Voucher`.`company` = "' +doc.company+'" AND `tabReceivable Voucher`.%(key)s LIKE "%s" AND `tabReceivable Voucher`.`customer` = "' + doc.customer + '" AND `tabReceivable Voucher`.`docstatus` = 1 and `tabReceivable Voucher`.`c_form_applicable` = "Yes" and ifnull(`tabReceivable Voucher`.c_form_no, "") = "" ORDER BY `tabReceivable Voucher`.`name` ASC LIMIT 50';
+}
+
+cur_frm.cscript.invoice_no = function(doc, cdt, cdn) {
+ var d = locals[cdt][cdn];
+ get_server_fields('get_invoice_details', d.invoice_no, 'invoice_details', doc, cdt, cdn, 1);
+}
diff --git a/erpnext/accounts/doctype/c_form/c_form.py b/erpnext/accounts/doctype/c_form/c_form.py
new file mode 100644
index 0000000..7228f11
--- /dev/null
+++ b/erpnext/accounts/doctype/c_form/c_form.py
@@ -0,0 +1,61 @@
+# Please edit this list and import only required elements
+import webnotes
+from webnotes.utils import add_days, cint, cstr, date_diff, default_fields, flt, getdate, now, nowdate
+from webnotes.model.doc import Document, addchild, removechild, getchildren, make_autoname, SuperDocType
+from webnotes.model.doclist import getlist, copy_doclist
+from webnotes.model.code import get_obj
+from webnotes import msgprint, errprint
+
+sql = webnotes.conn.sql
+# -----------------------------------------------------------------------------------------
+
+
+class DocType:
+ def __init__(self,d,dl):
+ self.doc, self.doclist = d,dl
+
+ def autoname(self):
+ self.doc.name = make_autoname(self.doc.naming_series + '.#####')
+
+
+ def on_update(self):
+ """ Update C-Form No on invoices"""
+
+ if len(getlist(self.doclist, 'invoice_details')):
+ inv = "'" + "', '".join([d.invoice_no for d in getlist(self.doclist, 'invoice_details')]) + "'"
+ sql("""update `tabReceivable Voucher` set c_form_no = '%s', modified ='%s'
+ where name in (%s)"""%(self.doc.name, self.doc.modified, inv))
+ sql("""update `tabReceivable Voucher` set c_form_no = '', modified = %s where name not
+ in (%s) and ifnull(c_form_no, '') = %s""", (self.doc.modified, self.doc.name, inv))
+ else:
+ msgprint("Please enter atleast 1 invoice in the table below", raise_exception=1)
+
+
+ def get_invoice_details(self, invoice_no):
+ """ Pull details from invoices for referrence """
+
+ inv = sql("""select posting_date, territory, net_total, grand_total from
+ `tabReceivable Voucher` where name = %s""", invoice_no)
+ ret = {
+ 'invoice_date' : inv and getdate(inv[0][0]).strftime('%Y-%m-%d') or '',
+ 'territory' : inv and inv[0][1] or '',
+ 'net_total' : inv and flt(inv[0][2]) or '',
+ 'grand_total' : inv and flt(inv[0][3]) or ''
+ }
+ return ret
+
+
+ def validate_invoice(self):
+ """Validate invoice that c-form is applicable and no other c-form is
+ received for that"""
+
+ for d in getlist(self.doclist, 'invoice_details'):
+ inv = sql("""select c_form_applicable, c_form_no from
+ `tabReceivable Voucher` where name = %s""", invoice_no)
+ if not inv:
+ msgprint("Invoice: %s is not exists in the system, please check." % d.invoice_no, raise_exception=1)
+ elif inv[0][0] != 'Yes':
+ msgprint("C-form is not applicable for Invoice: %s" % d.invoice_no, raise_exception=1)
+ elif inv[0][1] and inv[0][1] != self.doc.name:
+ msgprint("""Invoice %s is tagged in another C-form: %s. \nIf you want to change C-form no for this invoice,
+ please remove invoice no from the previous c-form and then try again""" % (d.invoice_no, inv[0][1]), raise_exception=1)
diff --git a/erpnext/accounts/doctype/c_form/c_form.txt b/erpnext/accounts/doctype/c_form/c_form.txt
new file mode 100644
index 0000000..987bc9a
--- /dev/null
+++ b/erpnext/accounts/doctype/c_form/c_form.txt
@@ -0,0 +1,190 @@
+# DocType, C-Form
+[
+
+ # These values are common in all dictionaries
+ {
+ 'creation': '2011-12-07 16:16:16',
+ 'docstatus': 0,
+ 'modified': '2011-12-07 17:50:17',
+ 'modified_by': 'Administrator',
+ 'owner': 'Administrator'
+ },
+
+ # These values are common for all DocType
+ {
+ '_last_update': '1323255350',
+ 'colour': 'White:FFF',
+ 'doctype': 'DocType',
+ 'module': 'Accounts',
+ 'name': '__common__',
+ 'section_style': 'Simple',
+ 'show_in_menu': 0,
+ 'version': 11
+ },
+
+ # These values are common for all DocField
+ {
+ 'doctype': 'DocField',
+ 'name': '__common__',
+ 'parent': 'C-Form',
+ 'parentfield': 'fields',
+ 'parenttype': 'DocType',
+ 'permlevel': 0
+ },
+
+ # These values are common for all DocPerm
+ {
+ 'doctype': 'DocPerm',
+ 'name': '__common__',
+ 'parent': 'C-Form',
+ 'parentfield': 'permissions',
+ 'parenttype': 'DocType',
+ 'read': 1
+ },
+
+ # DocType, C-Form
+ {
+ 'doctype': 'DocType',
+ 'name': 'C-Form'
+ },
+
+ # DocPerm
+ {
+ 'create': 1,
+ 'doctype': 'DocPerm',
+ 'permlevel': 0,
+ 'role': 'Accounts User',
+ 'write': 1
+ },
+
+ # DocPerm
+ {
+ 'create': 1,
+ 'doctype': 'DocPerm',
+ 'permlevel': 0,
+ 'role': 'Accounts Manager',
+ 'submit': 0,
+ 'write': 1
+ },
+
+ # DocPerm
+ {
+ 'doctype': 'DocPerm',
+ 'permlevel': 1,
+ 'role': 'All'
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldtype': 'Column Break',
+ 'width': '50%'
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'naming_series',
+ 'fieldtype': 'Select',
+ 'label': 'Series',
+ 'options': '\nC-FORM/',
+ 'reqd': 1
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'c_form_no',
+ 'fieldtype': 'Data',
+ 'label': 'C-Form No',
+ 'reqd': 1
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'received_date',
+ 'fieldtype': 'Date',
+ 'label': 'Received Date',
+ 'reqd': 1
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'customer',
+ 'fieldtype': 'Link',
+ 'label': 'Customer',
+ 'options': 'Customer',
+ 'reqd': 1
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldtype': 'Column Break',
+ 'width': '50%'
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'company',
+ 'fieldtype': 'Select',
+ 'label': 'Company',
+ 'options': 'link:Company'
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'fiscal_year',
+ 'fieldtype': 'Select',
+ 'label': 'Fiscal Year',
+ 'options': 'link:Fiscal Year',
+ 'reqd': 1
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'quarter',
+ 'fieldtype': 'Select',
+ 'label': 'Quarter',
+ 'options': '\nI\nII\nIII\nIV'
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'total_amount',
+ 'fieldtype': 'Currency',
+ 'label': 'Total Amount',
+ 'reqd': 1
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'state',
+ 'fieldtype': 'Select',
+ 'label': 'State',
+ 'options': "link:State\ncountry='India'",
+ 'reqd': 1
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldtype': 'Section Break'
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'invoice_details',
+ 'fieldtype': 'Table',
+ 'label': 'Invoice Details',
+ 'options': 'C-Form Invoice Detail'
+ }
+]
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/c_form_invoice_detail/__init__.py b/erpnext/accounts/doctype/c_form_invoice_detail/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/accounts/doctype/c_form_invoice_detail/__init__.py
diff --git a/erpnext/accounts/doctype/c_form_invoice_detail/c_form_invoice_detail.txt b/erpnext/accounts/doctype/c_form_invoice_detail/c_form_invoice_detail.txt
new file mode 100644
index 0000000..d6be6c0d
--- /dev/null
+++ b/erpnext/accounts/doctype/c_form_invoice_detail/c_form_invoice_detail.txt
@@ -0,0 +1,91 @@
+# DocType, C-Form Invoice Detail
+[
+
+ # These values are common in all dictionaries
+ {
+ 'creation': '2011-12-07 16:15:39',
+ 'docstatus': 0,
+ 'modified': '2011-12-07 16:21:55',
+ 'modified_by': 'Administrator',
+ 'owner': 'Administrator'
+ },
+
+ # These values are common for all DocType
+ {
+ 'colour': 'White:FFF',
+ 'doctype': 'DocType',
+ 'istable': 1,
+ 'module': 'Accounts',
+ 'name': '__common__',
+ 'section_style': 'Simple',
+ 'show_in_menu': 0,
+ 'version': 5
+ },
+
+ # These values are common for all DocField
+ {
+ 'doctype': 'DocField',
+ 'name': '__common__',
+ 'parent': 'C-Form Invoice Detail',
+ 'parentfield': 'fields',
+ 'parenttype': 'DocType'
+ },
+
+ # DocType, C-Form Invoice Detail
+ {
+ 'doctype': 'DocType',
+ 'name': 'C-Form Invoice Detail'
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'invoice_no',
+ 'fieldtype': 'Link',
+ 'label': 'Invoice No',
+ 'options': 'Receivable Voucher',
+ 'permlevel': 0,
+ 'width': '160px'
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'invoice_date',
+ 'fieldtype': 'Date',
+ 'label': 'Invoice Date',
+ 'permlevel': 1,
+ 'width': '120px'
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'territory',
+ 'fieldtype': 'Link',
+ 'label': 'Territory',
+ 'options': 'Territory',
+ 'permlevel': 1,
+ 'width': '120px'
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'net_total',
+ 'fieldtype': 'Currency',
+ 'label': 'Net Total',
+ 'permlevel': 1,
+ 'width': '120px'
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'grand_total',
+ 'fieldtype': 'Currency',
+ 'label': 'Grand Total',
+ 'permlevel': 1,
+ 'width': '120px'
+ }
+]
\ No newline at end of file
diff --git a/erpnext/accounts/doctype/gl_control/gl_control.py b/erpnext/accounts/doctype/gl_control/gl_control.py
index 01f31eb..bab8626 100644
--- a/erpnext/accounts/doctype/gl_control/gl_control.py
+++ b/erpnext/accounts/doctype/gl_control/gl_control.py
@@ -515,6 +515,7 @@
send_notification(new_rv)
+
def create_new_invoice(prev_rv):
# clone rv
new_rv = clone(prev_rv)
@@ -533,6 +534,61 @@
return new_rv
+
def send_notification(new_rv):
"""Notify concerned persons about recurring invoice generation"""
- pass
+ subject = "Invoice : " + new_rv.doc.name
+
+ com = new_rv.doc.company # get_value('Control Panel', '', 'letter_head')
+
+ hd = '''<div><h2>%s</h2></div>
+ <div><h3>Invoice: %s</h3></div>
+ <table cellspacing= "5" cellpadding="5" width = "100%%">
+ <tr>
+ <td width = "50%%"><b>Customer</b><br>%s<br>%s</td>
+ <td width = "50%%">Invoice Date: %s<br>Due Date: %s</td>
+ </tr>
+ </table>
+ ''' % (com, new_rv.doc.name, new_rv.doc.customer, new_rv.doc.address_display, new_rv.doc.posting_date, new_rv.doc.due_date)
+
+
+ tbl = '''<table border="1px solid #CCC" width="100%%" cellpadding="0px" cellspacing="0px">
+ <tr>
+ <td width = "15%%" bgcolor="#CCC" align="left"><b>Item</b></td>
+ <td width = "40%%" bgcolor="#CCC" align="left"><b>Description</b></td>
+ <td width = "15%%" bgcolor="#CCC" align="center"><b>Qty</b></td>
+ <td width = "15%%" bgcolor="#CCC" align="center"><b>Rate</b></td>
+ <td width = "15%%" bgcolor="#CCC" align="center"><b>Amount</b></td>
+ </tr>
+ '''
+ for d in getlist(new_rv.doclist, 'entries'):
+ tbl += '<tr><td>' + d.item_code +'</td><td>' + d.description+'</td><td>' + cstr(d.qty) +'</td><td>' + cstr(d.basic_rate) +'</td><td>' + cstr(d.amount) +'</td></tr>'
+ tbl += '</table>'
+
+ totals =''' <table cellspacing= "5" cellpadding="5" width = "100%%">
+ <tr>
+ <td width = "50%%"></td>
+ <td width = "50%%">
+ <table width = "100%%">
+ <tr>
+ <td width = "50%%">Net Total: </td><td>%s </td>
+ </tr><tr>
+ <td width = "50%%">Total Tax: </td><td>%s </td>
+ </tr><tr>
+ <td width = "50%%">Grand Total: </td><td>%s</td>
+ </tr><tr>
+ <td width = "50%%">In Words: </td><td>%s</td>
+ </tr>
+ </table>
+ </td>
+ </tr>
+ <tr><td>Terms:</td></tr>
+ <tr><td>%s</td></tr>
+ </table>
+ ''' % (new_rv.doc.net_total, new_rv.doc.total_tax,new_rv.doc.grand_total, new_rv.doc.in_words,new_rv.doc.terms)
+
+
+ msg = hd + tbl + totals
+ from webnotes.utils.email_lib import sendmail
+ sendmail(recipients = [new_rv.doc.email_notification_address], \
+ sender=new_rv.doc.owner, subject=subject, parts=[['text/plain', msg]])
diff --git a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.js b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.js
index 363da2e..12b57d9 100644
--- a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.js
+++ b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.js
@@ -67,6 +67,12 @@
}
}
}
+
+ // India related fields
+ var cp = locals['Control Panel']['Control Panel'];
+ if (cp.country == 'India') unhide_field(['c_form_applicable', 'c_form_no']);
+ else hide_field(['c_form_applicable', 'c_form_no']);
+
}
diff --git a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py
index 13ed8d3..57d8c55 100644
--- a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py
+++ b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.py
@@ -397,6 +397,14 @@
if flt(self.doc.write_off_amount) and not self.doc.write_off_account:
msgprint("Please enter Write Off Account", raise_exception=1)
+
+ def validate_c_form(self):
+ """ Blank C-form no if C-form applicable marked as 'No'"""
+ if self.doc.amended_from and self.doc.c_form_applicable == 'No' and self.doc.c_form_no:
+ sql("""delete from `tabC-Form Invoice Detail` where invoice_no = %s
+ and parent = %s""", (self.doc.amended_from, self.doc.c_form_no))
+
+ set(self.doc, 'c_form_no', '')
# VALIDATE
# ====================================================================================
@@ -432,6 +440,7 @@
self.clear_advances()
# Set against account
self.set_against_income_account()
+ self.validate_c_form()
# *************************************************** ON SUBMIT **********************************************
@@ -554,10 +563,21 @@
if not cint(self.doc.is_pos) == 1:
self.update_against_document_in_jv()
-
+
+ self.update_c_form()
+
# on submit notification
# get_obj('Notification Control').notify_contact('Sales Invoice', self.doc.doctype,self.doc.name, self.doc.email_id, self.doc.contact_person)
-
+
+
+ def update_c_form(self):
+ """Update amended id in C-form"""
+ if self.doc.c_form_no and self.doc.amended_from:
+ 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
diff --git a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.txt b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.txt
index e2fc0c6..eedb01c 100644
--- a/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.txt
+++ b/erpnext/accounts/doctype/receivable_voucher/receivable_voucher.txt
@@ -5,7 +5,7 @@
{
'creation': '2010-08-08 17:09:18',
'docstatus': 0,
- 'modified': '2011-12-06 13:17:26',
+ 'modified': '2011-12-08 16:28:22',
'modified_by': 'Administrator',
'owner': 'Administrator'
},
@@ -21,7 +21,7 @@
# These values are common for all DocType
{
- '_last_update': '1323156733',
+ '_last_update': '1323341785',
'change_log': '1. Change in pull_details method dt.-26-06-2009',
'colour': 'White:FFF',
'default_print_format': 'Standard',
@@ -34,7 +34,7 @@
'server_code_error': ' ',
'show_in_menu': 0,
'subject': 'To %(customer_name)s worth %(currency)s %(grand_total_export)s due on %(due_date)s | %(outstanding_amount)s outstanding',
- 'version': 383
+ 'version': 388
},
# These values are common for all DocFormat
@@ -974,6 +974,31 @@
# DocField
{
'doctype': 'DocField',
+ 'fieldname': 'c_form_applicable',
+ 'fieldtype': 'Select',
+ 'label': 'C-Form Applicable',
+ 'no_copy': 1,
+ 'options': 'No\nYes',
+ 'permlevel': 0,
+ 'print_hide': 1,
+ 'report_hide': 0
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
+ 'fieldname': 'c_form_no',
+ 'fieldtype': 'Link',
+ 'label': 'C-Form No',
+ 'no_copy': 1,
+ 'options': 'C-Form',
+ 'permlevel': 1,
+ 'print_hide': 1
+ },
+
+ # DocField
+ {
+ 'doctype': 'DocField',
'fieldname': 'company',
'fieldtype': 'Link',
'in_filter': 1,
diff --git a/erpnext/patches/c_form_patch.py b/erpnext/patches/c_form_patch.py
new file mode 100644
index 0000000..a55768d
--- /dev/null
+++ b/erpnext/patches/c_form_patch.py
@@ -0,0 +1,12 @@
+def execute():
+ import webnotes
+ from webnotes.modules.module_manager import reload_doc
+
+ reload_doc('accounts', 'doctype', 'receivable_voucher')
+ reload_doc('accounts', 'doctype', 'c_form')
+ reload_doc('accounts', 'doctype', 'c_form_invoice_details')
+ reload_doc('accounts', 'Module Def', 'Accounts')
+
+ sql = webnotes.conn.sql
+ sql("update `tabReceivable Voucher` set c_form_applicable = 'Yes' where c_form_applicable = 'Y'")
+ sql("update `tabReceivable Voucher` set c_form_applicable = 'No' where c_form_applicable = 'N'")