Merge branch 'master' of github.com:webnotes/erpnext
diff --git a/hr/doctype/job_applicant/__init__.py b/hr/doctype/job_applicant/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/hr/doctype/job_applicant/__init__.py
diff --git a/hr/doctype/job_applicant/get_job_applications.py b/hr/doctype/job_applicant/get_job_applications.py
new file mode 100644
index 0000000..c5066dc
--- /dev/null
+++ b/hr/doctype/job_applicant/get_job_applications.py
@@ -0,0 +1,55 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# 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
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import unicode_literals
+import webnotes
+from webnotes.utils import cstr, cint
+from webnotes.utils.email_lib.receive import POP3Mailbox
+from core.doctype.communication.communication import make
+
+class JobsMailbox(POP3Mailbox):	
+	def setup(self):
+		self.settings = webnotes.doc("Jobs Email Settings", "Jobs Email Settings")
+	
+	def check_mails(self):
+		return webnotes.conn.sql("select user from tabSessions where \
+			time_to_sec(timediff(now(), lastupdate)) < 1800")
+	
+	def get_existing_application(self, email_id):
+		name = webnotes.conn.sql("""select name from `tabJob Applicant` where
+			email_id = %s""", email_id)
+		return name and name[0][0] or None
+	
+	def process_message(self, mail):
+		name = self.get_existing_application(mail.from_email)
+		if name:
+			applicant = webnotes.model_wrapper("Job Applicant", name)
+		else:
+			applicant = webnotes.model_wrapper({
+				"doctype":"Job Applicant",
+				"applicant_name": mail.from_real_name or mail.from_email,
+				"email_id": mail.from_email
+			})
+			applicant.insert()
+		
+		mail.save_attachments_in_doc(applicant.doc)
+				
+		make(content=mail.content, sender=mail.from_email, 
+			doctype="Job Applicant", name=applicant.doc.name, set_lead=False)
+
+def get_job_applications():
+	if cint(webnotes.conn.get_value('Jobs Email Settings', None, 'extract_emails')):
+		JobsMailbox()
\ No newline at end of file
diff --git a/hr/doctype/job_applicant/job_applicant.js b/hr/doctype/job_applicant/job_applicant.js
new file mode 100644
index 0000000..2b8e064
--- /dev/null
+++ b/hr/doctype/job_applicant/job_applicant.js
@@ -0,0 +1,22 @@
+// For license information, please see license.txt
+
+cur_frm.cscript = {
+	refresh: function(doc) {
+		cur_frm.set_intro("");
+		if(doc.extract_emails) {
+			cur_frm.set_intro(wn._("Active: Will extract emails from ") + doc.email_id);
+		} else {
+			cur_frm.set_intro(wn._("Not Active"));
+		}
+		cur_frm.cscript.make_listing(doc);
+	},
+	make_listing: function(doc) {
+		var wrapper = cur_frm.fields_dict['thread_html'].wrapper;
+		cur_frm.communication_view = new wn.views.CommunicationList({
+			list: comm_list,
+			parent: wn.model.get("Communication", {"job_applicant": doc.name}),
+			doc: doc,
+			recipients: doc.email_id
+		})
+	},
+}
\ No newline at end of file
diff --git a/hr/doctype/job_applicant/job_applicant.py b/hr/doctype/job_applicant/job_applicant.py
new file mode 100644
index 0000000..928aa9f
--- /dev/null
+++ b/hr/doctype/job_applicant/job_applicant.py
@@ -0,0 +1,8 @@
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import webnotes
+
+class DocType:
+	def __init__(self, d, dl):
+		self.doc, self.doclist = d, dl
\ No newline at end of file
diff --git a/hr/doctype/job_applicant/job_applicant.txt b/hr/doctype/job_applicant/job_applicant.txt
new file mode 100644
index 0000000..390b659
--- /dev/null
+++ b/hr/doctype/job_applicant/job_applicant.txt
@@ -0,0 +1,90 @@
+[
+ {
+  "owner": "Administrator", 
+  "docstatus": 0, 
+  "creation": "2013-01-15 16:32:13", 
+  "modified_by": "Administrator", 
+  "modified": "2013-01-15 17:08:46"
+ }, 
+ {
+  "autoname": "field:applicant_name", 
+  "description": "Applicant for a Job", 
+  "doctype": "DocType", 
+  "module": "HR", 
+  "document_type": "Transaction", 
+  "name": "__common__"
+ }, 
+ {
+  "name": "__common__", 
+  "parent": "Job Applicant", 
+  "doctype": "DocField", 
+  "parenttype": "DocType", 
+  "permlevel": 0, 
+  "parentfield": "fields"
+ }, 
+ {
+  "parent": "Job Applicant", 
+  "read": 1, 
+  "cancel": 1, 
+  "name": "__common__", 
+  "create": 1, 
+  "doctype": "DocPerm", 
+  "write": 1, 
+  "parenttype": "DocType", 
+  "role": "HR User", 
+  "report": 1, 
+  "permlevel": 0, 
+  "parentfield": "permissions"
+ }, 
+ {
+  "name": "Job Applicant", 
+  "doctype": "DocType"
+ }, 
+ {
+  "doctype": "DocField", 
+  "label": "Applicant Name", 
+  "fieldname": "applicant_name", 
+  "fieldtype": "Data", 
+  "reqd": 1
+ }, 
+ {
+  "doctype": "DocField", 
+  "label": "Email Id", 
+  "fieldname": "email_id", 
+  "fieldtype": "Data"
+ }, 
+ {
+  "doctype": "DocField", 
+  "label": "Status", 
+  "fieldname": "status", 
+  "fieldtype": "Select", 
+  "options": "Open\nReject\nHold"
+ }, 
+ {
+  "doctype": "DocField", 
+  "width": "50%", 
+  "fieldname": "column_break_3", 
+  "fieldtype": "Column Break"
+ }, 
+ {
+  "doctype": "DocField", 
+  "label": "Job Opening", 
+  "fieldname": "job_opening", 
+  "fieldtype": "Link", 
+  "options": "Job Opening"
+ }, 
+ {
+  "doctype": "DocField", 
+  "fieldname": "section_break_5", 
+  "fieldtype": "Section Break"
+ }, 
+ {
+  "doctype": "DocField", 
+  "label": "Thread HTML", 
+  "fieldname": "thread_html", 
+  "fieldtype": "HTML"
+ }, 
+ {
+  "doctype": "DocPerm"
+ }
+]
\ No newline at end of file
diff --git a/hr/doctype/job_opening/__init__.py b/hr/doctype/job_opening/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/hr/doctype/job_opening/__init__.py
diff --git a/hr/doctype/job_opening/job_opening.py b/hr/doctype/job_opening/job_opening.py
new file mode 100644
index 0000000..928aa9f
--- /dev/null
+++ b/hr/doctype/job_opening/job_opening.py
@@ -0,0 +1,8 @@
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import webnotes
+
+class DocType:
+	def __init__(self, d, dl):
+		self.doc, self.doclist = d, dl
\ No newline at end of file
diff --git a/hr/doctype/job_opening/job_opening.txt b/hr/doctype/job_opening/job_opening.txt
new file mode 100644
index 0000000..5e26f0d
--- /dev/null
+++ b/hr/doctype/job_opening/job_opening.txt
@@ -0,0 +1,67 @@
+[
+ {
+  "owner": "Administrator", 
+  "docstatus": 0, 
+  "creation": "2013-01-15 16:13:36", 
+  "modified_by": "Administrator", 
+  "modified": "2013-01-15 16:43:05"
+ }, 
+ {
+  "autoname": "field:job_title", 
+  "description": "Description of a Job Opening", 
+  "doctype": "DocType", 
+  "module": "HR", 
+  "document_type": "Transaction", 
+  "name": "__common__"
+ }, 
+ {
+  "name": "__common__", 
+  "parent": "Job Opening", 
+  "doctype": "DocField", 
+  "parenttype": "DocType", 
+  "permlevel": 0, 
+  "parentfield": "fields"
+ }, 
+ {
+  "parent": "Job Opening", 
+  "read": 1, 
+  "cancel": 1, 
+  "name": "__common__", 
+  "create": 1, 
+  "doctype": "DocPerm", 
+  "write": 1, 
+  "parenttype": "DocType", 
+  "role": "HR User", 
+  "report": 1, 
+  "permlevel": 0, 
+  "parentfield": "permissions"
+ }, 
+ {
+  "name": "Job Opening", 
+  "doctype": "DocType"
+ }, 
+ {
+  "doctype": "DocField", 
+  "label": "Job Title", 
+  "fieldname": "job_title", 
+  "fieldtype": "Data", 
+  "reqd": 1
+ }, 
+ {
+  "doctype": "DocField", 
+  "label": "Status", 
+  "fieldname": "status", 
+  "fieldtype": "Select", 
+  "options": "Open\nClosed"
+ }, 
+ {
+  "description": "Job profile, qualifications required etc.", 
+  "doctype": "DocField", 
+  "label": "Description", 
+  "fieldname": "description", 
+  "fieldtype": "Text Editor"
+ }, 
+ {
+  "doctype": "DocPerm"
+ }
+]
\ No newline at end of file
diff --git a/setup/doctype/jobs_email_settings/__init__.py b/setup/doctype/jobs_email_settings/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/setup/doctype/jobs_email_settings/__init__.py
diff --git a/setup/doctype/jobs_email_settings/jobs_email_settings.js b/setup/doctype/jobs_email_settings/jobs_email_settings.js
new file mode 100644
index 0000000..0a75b89
--- /dev/null
+++ b/setup/doctype/jobs_email_settings/jobs_email_settings.js
@@ -0,0 +1,12 @@
+// For license information, please see license.txt
+
+cur_frm.cscript = {
+	refresh: function(doc) {
+		cur_frm.set_intro("");
+		if(doc.extract_emails) {
+			cur_frm.set_intro(wn._("Active: Will extract emails from ") + doc.email_id);
+		} else {
+			cur_frm.set_intro(wn._("Not Active"));
+		}
+	}
+}
\ No newline at end of file
diff --git a/setup/doctype/jobs_email_settings/jobs_email_settings.py b/setup/doctype/jobs_email_settings/jobs_email_settings.py
new file mode 100644
index 0000000..b09cefd
--- /dev/null
+++ b/setup/doctype/jobs_email_settings/jobs_email_settings.py
@@ -0,0 +1,17 @@
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import webnotes
+from webnotes import _
+from webnotes.utils import cint
+
+class DocType:
+	def __init__(self, d, dl):
+		self.doc, self.doclist = d, dl
+		
+	def validate(self):
+		if cint(self.doc.extract_emails) and not (self.doc.email_id and self.doc.host and \
+			self.doc.username and self.doc.password):
+			
+			webnotes.msgprint(_("""Host, Email and Password required if emails are to be pulled"""),
+				raise_exception=True)
\ No newline at end of file
diff --git a/setup/doctype/jobs_email_settings/jobs_email_settings.txt b/setup/doctype/jobs_email_settings/jobs_email_settings.txt
new file mode 100644
index 0000000..788f51b
--- /dev/null
+++ b/setup/doctype/jobs_email_settings/jobs_email_settings.txt
@@ -0,0 +1,89 @@
+[
+ {
+  "owner": "Administrator", 
+  "docstatus": 0, 
+  "creation": "2013-01-15 16:50:01", 
+  "modified_by": "Administrator", 
+  "modified": "2013-01-15 16:57:08"
+ }, 
+ {
+  "issingle": 1, 
+  "description": "Email settings for jobs email id \"jobs@example.com\"", 
+  "doctype": "DocType", 
+  "module": "Setup", 
+  "name": "__common__"
+ }, 
+ {
+  "name": "__common__", 
+  "parent": "Jobs Email Settings", 
+  "doctype": "DocField", 
+  "parenttype": "DocType", 
+  "permlevel": 0, 
+  "parentfield": "fields"
+ }, 
+ {
+  "parent": "Jobs Email Settings", 
+  "read": 1, 
+  "name": "__common__", 
+  "create": 1, 
+  "doctype": "DocPerm", 
+  "write": 1, 
+  "parenttype": "DocType", 
+  "role": "System Manager", 
+  "permlevel": 0, 
+  "parentfield": "permissions"
+ }, 
+ {
+  "name": "Jobs Email Settings", 
+  "doctype": "DocType"
+ }, 
+ {
+  "description": "Settings to extract Job Applicants from a mailbox e.g. \"jobs@example.com\"", 
+  "doctype": "DocField", 
+  "label": "POP3 Mail Settings", 
+  "fieldname": "pop3_mail_settings", 
+  "fieldtype": "Section Break"
+ }, 
+ {
+  "description": "Check to activate", 
+  "doctype": "DocField", 
+  "label": "Extract Emails", 
+  "fieldname": "extract_emails", 
+  "fieldtype": "Check"
+ }, 
+ {
+  "description": "Email Id where a job applicant will email e.g. \"jobs@example.com\"", 
+  "doctype": "DocField", 
+  "label": "Email Id", 
+  "fieldname": "email_id", 
+  "fieldtype": "Data"
+ }, 
+ {
+  "description": "POP3 server e.g. (pop.gmail.com)", 
+  "doctype": "DocField", 
+  "label": "Host", 
+  "fieldname": "host", 
+  "fieldtype": "Data"
+ }, 
+ {
+  "doctype": "DocField", 
+  "label": "Use SSL", 
+  "fieldname": "use_ssl", 
+  "fieldtype": "Check"
+ }, 
+ {
+  "doctype": "DocField", 
+  "label": "Username", 
+  "fieldname": "username", 
+  "fieldtype": "Data"
+ }, 
+ {
+  "doctype": "DocField", 
+  "label": "Password", 
+  "fieldname": "password", 
+  "fieldtype": "Password"
+ }, 
+ {
+  "doctype": "DocPerm"
+ }
+]
\ No newline at end of file
diff --git a/startup/schedule_handlers.py b/startup/schedule_handlers.py
index 668c11d..ab53b21 100644
--- a/startup/schedule_handlers.py
+++ b/startup/schedule_handlers.py
@@ -26,8 +26,11 @@
 		* recurring invoice
 	"""
 	# pull emails
-	from support.doctype.support_ticket import get_support_mails
+	from support.doctype.support_ticket.get_support_mails import get_support_mails
 	run_fn(get_support_mails)
+
+	from hr.doctype.job_applicant.get_job_applications import get_job_applications
+	run_fn(get_job_applications)
 	
 	# bulk email
 	from webnotes.utils.email_lib.bulk import flush
diff --git a/support/doctype/newsletter/newsletter.py b/support/doctype/newsletter/newsletter.py
index c4b622a..48ed21a 100644
--- a/support/doctype/newsletter/newsletter.py
+++ b/support/doctype/newsletter/newsletter.py
@@ -87,7 +87,7 @@
 
 		args = self.dt_map[doctype]
 
-		sender = self.doc.send_from or webnotes.utils.get_email_id(self.doc.owner)
+		sender = self.doc.send_from or webnotes.utils.get_formatted_email(self.doc.owner)
 		recipients = self.doc.test_email_id.split(",")
 		from webnotes.utils.email_lib.bulk import send
 		send(recipients = recipients, sender = sender, 
@@ -109,7 +109,7 @@
 			recipients = self.get_recipients(query_key)
 		else:
 			recipients = query_key
-		sender = self.doc.send_from or webnotes.utils.get_email_id(self.doc.owner)
+		sender = self.doc.send_from or webnotes.utils.get_formatted_email(self.doc.owner)
 		args = self.dt_map[doctype]
 		self.send_count[doctype] = self.send_count.setdefault(doctype, 0) + \
 			len(recipients)
diff --git a/support/doctype/support_ticket/__init__.py b/support/doctype/support_ticket/__init__.py
index da1755f..e69de29 100644
--- a/support/doctype/support_ticket/__init__.py
+++ b/support/doctype/support_ticket/__init__.py
@@ -1,183 +0,0 @@
-# ERPNext - web based ERP (http://erpnext.com)
-# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
-# 
-# This program is free software: you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation, either version 3 of the License, or
-# (at your option) any later version.
-# 
-# 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
-# GNU General Public License for more details.
-# 
-# You should have received a copy of the GNU General Public License
-# along with this program.  If not, see <http://www.gnu.org/licenses/>.
-
-from __future__ import unicode_literals
-import webnotes
-from webnotes.utils import cstr, cint
-
-from webnotes.utils.email_lib.receive import POP3Mailbox
-
-class SupportMailbox(POP3Mailbox):
-	def __init__(self):
-		"""
-			settings_doc must contain
-			use_ssl, host, username, password
-		"""
-		from webnotes.model.doc import Document
-
-		# extract email settings
-		self.email_settings = Document('Email Settings','Email Settings')
-		if not self.email_settings.fields.get('sync_support_mails'): return
-		
-		s = Document('Support Email Settings')
-		s.use_ssl = self.email_settings.support_use_ssl
-		s.host = self.email_settings.support_host
-		s.username = self.email_settings.support_username
-		s.password = self.email_settings.support_password
-		
-		POP3Mailbox.__init__(self, s)
-	
-	def check_mails(self):
-		"""
-			returns true if there are active sessions
-		"""
-		self.auto_close_tickets()
-		return webnotes.conn.sql("select user from tabSessions where time_to_sec(timediff(now(), lastupdate)) < 1800")
-	
-	def process_message(self, mail):
-		"""
-			Updates message from support email as either new or reply
-		"""
-		from home import update_feed
-
-		content, content_type = '[Blank Email]', 'text/plain'
-		if mail.text_content:
-			content, content_type = mail.text_content, 'text/plain'
-		else:
-			content, content_type = mail.html_content, 'text/html'
-			
-		thread_list = mail.get_thread_id()
-
-		email_id = mail.mail['From']
-		if "<" in mail.mail['From']:
-			import re
-			re_result = re.findall('(?<=\<)(\S+)(?=\>)', mail.mail['From'])
-			if re_result and re_result[0]: 
-				email_id = re_result[0]
-		
-		from webnotes.utils import decode_email_header
-		
-		full_email_id = decode_email_header(mail.mail['From'])
-
-		for thread_id in thread_list:
-			exists = webnotes.conn.sql("""\
-				SELECT name
-				FROM `tabSupport Ticket`
-				WHERE name=%s AND raised_by REGEXP %s
-				""" , (thread_id, '(' + email_id + ')'))
-			if exists and exists[0] and exists[0][0]:
-				st = webnotes.get_obj('Support Ticket', thread_id)
-				
-				from core.doctype.communication.communication import make
-				
-				make(content=content, sender=full_email_id, doctype="Support Ticket",
-					name=thread_id, lead = st.doc.lead, contact=st.doc.contact)
-				
-				st.doc.status = 'Open'
-				st.doc.save()
-				
-				update_feed(st, 'on_update')
-				# extract attachments
-				self.save_attachments(st.doc, mail.attachments)
-				return
-				
-		from webnotes.model.doctype import get_property
-		opts = get_property('Support Ticket', 'options', 'naming_series')
-		# new ticket
-		from webnotes.model.doc import Document
-		d = Document('Support Ticket')
-		d.description = content
-		
-		d.subject = decode_email_header(mail.mail['Subject'])
-		
-		d.raised_by = full_email_id
-		d.content_type = content_type
-		d.status = 'Open'
-		d.naming_series = opts and opts.split("\n")[0] or 'SUP'
-		try:
-			d.save(1)
-			try:
-				# extract attachments
-				self.save_attachments(d, mail.attachments)
-			except Exception, e:
-				self.description += "\n\n[Did not pull attachment]"
-		except:
-			d.description = 'Unable to extract message'
-			d.save(1)
-		else:
-			# send auto reply
-			if cint(self.email_settings.send_autoreply):
-				if "mailer-daemon" not in d.raised_by.lower():
-					self.send_auto_reply(d)
-
-			
-	def save_attachments(self, doc, attachment_list=[]):
-		"""
-			Saves attachments from email
-
-			attachment_list is a list of dict containing:
-			'filename', 'content', 'content-type'
-		"""
-		from webnotes.utils.file_manager import save_file, add_file_list
-		for attachment in attachment_list:
-			fid = save_file(attachment['filename'], attachment['content'], 'Support')
-			status = add_file_list('Support Ticket', doc.name, fid, fid)
-			if not status:
-				doc.description = doc.description \
-					+ "\nCould not attach: " + cstr(attachment['filename'])
-				doc.save()
-		
-	def send_auto_reply(self, d):
-		"""
-			Send auto reply to emails
-		"""
-		from webnotes.utils import cstr
-
-		signature = self.email_settings.fields.get('support_signature') or ''
-
-		response = self.email_settings.fields.get('support_autoreply') or ("""
-A new Ticket has been raised for your query. If you have any additional information, please
-reply back to this mail.
-		
-We will get back to you as soon as possible
-----------------------
-Original Query:
-
-""" + d.description + "\n----------------------\n" + cstr(signature))
-
-		from webnotes.utils.email_lib import sendmail		
-		
-		sendmail(\
-			recipients = [cstr(d.raised_by)], \
-			sender = cstr(self.email_settings.fields.get('support_email')), \
-			subject = '['+cstr(d.name)+'] ' + cstr(d.subject), \
-			msg = cstr(response))
-		
-	def auto_close_tickets(self):
-		"""
-			Auto Closes Waiting for Customer Support Ticket after 15 days
-		"""
-		webnotes.conn.sql("update `tabSupport Ticket` set status = 'Closed' where status = 'Waiting for Customer' and date_sub(curdate(),interval 15 Day) > modified")
-
-
-def get_support_mails():
-	"""
-		Gets new emails from support inbox and updates / creates Support Ticket records
-	"""
-	import webnotes
-	from webnotes.utils import cint
-	if cint(webnotes.conn.get_value('Email Settings', None, 'sync_support_mails')):
-		SupportMailbox().get_messages()
\ No newline at end of file
diff --git a/support/doctype/support_ticket/get_support_mails.py b/support/doctype/support_ticket/get_support_mails.py
new file mode 100644
index 0000000..c0b85e4
--- /dev/null
+++ b/support/doctype/support_ticket/get_support_mails.py
@@ -0,0 +1,96 @@
+# ERPNext - web based ERP (http://erpnext.com)
+# Copyright (C) 2012 Web Notes Technologies Pvt Ltd
+# 
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+# 
+# 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
+# GNU General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+from __future__ import unicode_literals
+import webnotes
+from webnotes.utils import cstr, cint
+from webnotes.utils.email_lib import sendmail		
+from webnotes.utils.email_lib.receive import POP3Mailbox
+from core.doctype.communication.communication import make
+
+class SupportMailbox(POP3Mailbox):	
+	def setup(self):
+		self.email_settings = webnotes.doc("Email Settings", "Email Settings")
+		self.settings = webnotes._dict({
+			"use_ssl": self.email_settings.support_use_ssl,
+			"host": self.email_settings.support_host,
+			"username": self.email_settings.support_username,
+			"password": self.email_settings.support_password
+		})
+	
+	def check_mails(self):
+		self.auto_close_tickets()
+		return webnotes.conn.sql("select user from tabSessions where \
+			time_to_sec(timediff(now(), lastupdate)) < 1800")
+	
+	def process_message(self, mail):
+		if mail.from_email == self.email_settings.fields.get('support_email'):
+			return
+		thread_id = mail.get_thread_id()
+		ticket = None
+
+		if thread_id and webnotes.conn.exists("Support Ticket", thread_id):
+			ticket = webnotes.model_wrapper("Support Ticket", thread_id)
+			ticket.doc.status = 'Open'
+			ticket.doc.save()
+				
+		else:
+			ticket = webnotes.model_wrapper([{
+				"doctype":"Support Ticket",
+				"description": mail.content,
+				"subject": mail.mail["Subject"],
+				"raised_by": mail.from_email,
+				"content_type": mail.content_type,
+				"status": "Open"
+			}])
+			ticket.insert()
+
+			if cint(self.email_settings.send_autoreply):
+				if "mailer-daemon" not in mail.from_email.lower():
+					self.send_auto_reply(ticket.doc)
+
+		mail.save_attachments_in_doc(ticket.doc)
+				
+		make(content=mail.content, sender=mail.from_email, 
+			doctype="Support Ticket", name=ticket.doc.name, 
+			lead = ticket.doc.lead, contact=ticket.doc.contact)
+
+	def send_auto_reply(self, d):
+		signature = self.email_settings.fields.get('support_signature') or ''
+		response = self.email_settings.fields.get('support_autoreply') or ("""
+A new Ticket has been raised for your query. If you have any additional information, please
+reply back to this mail.
+		
+We will get back to you as soon as possible
+----------------------
+Original Query:
+
+""" + d.description + "\n----------------------\n" + cstr(signature))
+
+		sendmail(\
+			recipients = [cstr(d.raised_by)], \
+			sender = cstr(self.email_settings.fields.get('support_email')), \
+			subject = '['+cstr(d.name)+'] ' + cstr(d.subject), \
+			msg = cstr(response))
+		
+	def auto_close_tickets(self):
+		webnotes.conn.sql("""update `tabSupport Ticket` set status = 'Closed' 
+			where status = 'Waiting for Customer' 
+			and date_sub(curdate(),interval 15 Day) > modified""")
+
+def get_support_mails():
+	if cint(webnotes.conn.get_value('Email Settings', None, 'sync_support_mails')):
+		SupportMailbox()
\ No newline at end of file
diff --git a/support/doctype/support_ticket/support_ticket.js b/support/doctype/support_ticket/support_ticket.js
index 159dddd..bbaf95b 100644
--- a/support/doctype/support_ticket/support_ticket.js
+++ b/support/doctype/support_ticket/support_ticket.js
@@ -49,11 +49,17 @@
 		var wrapper = cur_frm.fields_dict['thread_html'].wrapper;
 		
 		var comm_list = wn.model.get("Communication", {"support_ticket": doc.name})
-		comm_list.push({
-			"sender": doc.raised_by,
-			"creation": doc.creation,
-			"modified": doc.creation,
-			"content": doc.description});
+
+		var sortfn = function (a, b) { return (b.creation > a.creation) ? 1 : -1; }
+		comm_list = comm_list.sort(sortfn);
+		
+		if(!comm_list.length || (comm_list[0].sender != doc.raised_by)) {
+			comm_list.push({
+				"sender": doc.raised_by,
+				"creation": doc.creation,
+				"modified": doc.creation,
+				"content": doc.description});
+		}
 					
 		cur_frm.communication_view = new wn.views.CommunicationList({
 			list: comm_list,
@@ -63,16 +69,7 @@
 		})
 
 	},
-	
-	send: function(doc, dt, dn) {
-		$c_obj(make_doclist(doc.doctype, doc.name), 'send_response', '', function(r,rt) {
-			locals[dt][dn].new_response = '';
-			if(!(r.exc || r.server_messages)) {
-				cur_frm.refresh();
-			}
-		});
-	},
-	
+		
 	customer: function(doc, dt, dn) {
 		var callback = function(r,rt) {
 			var doc = locals[cur_frm.doctype][cur_frm.docname];