Merge pull request #4892 from agusputra/patch-22

Update update-stock-option-in-sales-invoice.md
diff --git a/erpnext/__version__.py b/erpnext/__version__.py
index c672c5b..9926511 100644
--- a/erpnext/__version__.py
+++ b/erpnext/__version__.py
@@ -1,2 +1,2 @@
 from __future__ import unicode_literals
-__version__ = '6.23.6'
+__version__ = '6.23.7'
diff --git a/erpnext/docs/user/manual/es/accounts/accounting-entries.md b/erpnext/docs/user/manual/es/accounts/accounting-entries.md
new file mode 100644
index 0000000..ffda0b5
--- /dev/null
+++ b/erpnext/docs/user/manual/es/accounts/accounting-entries.md
@@ -0,0 +1,73 @@
+<!---
+WORK IN PROGRESS
+-->
+
+El concepto de contabilidad se explica con el siguiente ejemplo: Se toma a 
+"Tea Stall" como compañía y se observa como registrar entradas contables
+para el negocio. 
+
+  * Mama (El propietario de Tea-stall) invierte $25000 para iniciar el negocio.
+
+![A&L]({{docs_base_url}}/assets/old_images/erpnext/assets-1.png)
+
+__Análisis:__ Mama invierte 25000 en la compañía, con la esperanza de obtener alguna
+ganancia. En otras palabras, la compañía es responsable del pago de $25000 a mama en 
+el futuro. Así, la cuenta "Mama" es una cuenta de pasivo y es un crédito. El balance de
+efectivo de la compañía se incrementa debido a la inversión, "Caja" es un activo de
+la compañía y debe ser debitado.
+
+  * La compañía necesita equipos (Estufa, tetera, pocillos, etc) y materias primas (te, 
+  azucar, leche, etc) de inmediato. Decide comprar en una tienda cercana "Super Bazaar"
+  que pertenece a un amigo y le concede cierto crédito. Los equipos cuestan 2800 y las
+  materias primas valen 2200. La compañía paga 2000 de un total de 5000.
+  
+![A&L]({{docs_base_url}}/assets/old_images/erpnext/assets-2.png)
+
+__Análisis:__ Los equipos son "Activos Fijos" (porque tienen una larga vida útil) de la
+compañía y las materias primas son "Activos corrientes" (porque son usados en la 
+operación diaria del negocio). Entonces, "Equipos" y "Existencias disponibles" deben
+ser debitadas para incrementar su valor. La compañía pagó 2000, entonces la cuenta
+"Caja" debe ser reducida en dicha cantidad, es decir debe ser crédito. Y dado que la
+compañía tiene la obligación de pagar 3000 a "Super Bazaar", dicha cuenta debe tener
+un crédito de 3000.
+
+
+  * Mama (quien está pendiente de todas las entradas)decide anotar las ventas al finalizar
+  cada día, de tal manera que pueda analizar las ventas diarias. Al finaliza el primer
+  día, Tea Stall vende 325 tazas de té, lo cual da una venta neta de RS. 1575. El propietario
+  registra feliz su primer día de ventas.
+
+![A&L]({{docs_base_url}}/assets/old_images/erpnext/assets-3.png)
+
+__Análisis:__ Los ingresos han sido anotados en la cuenta "Ventas de Té", la cual se 
+debita para incrementar el valor y la misma cantidad se acredita de la cuenta
+"Caja". Digamos, para hacer 325 tazas de té cuestan Rs 800, entonces la 
+cuenta "Existencias disponibles" debe ser reducidas (crédito) en 800 y el gasto
+debe ser registado en la cuenta "Costos de bienes vendidos" en la misma cantidad.
+
+Al finalizar el mes, la compañía paga el arriendo del local (5000) y el salario de
+un empleado (8000), el cual trabajó desde el primer día.
+
+![A&L]({{docs_base_url}}/assets/old_images/erpnext/assets-4.png)
+
+### Registro de ganancias
+
+A medida que avanza el mes, la compañía compra más materias primas para el negocio.
+Después de un mes se anotan las ganancias en el "Libro de Balance" y en el de 
+"Estado de Pérdidas y Ganancias". Ya que las ganacias pertenecen a Mama y no a
+la compañía, se considera que dichas ganacias son una obligación (la compañía tiene
+que pagárselas a Mama). Cuando el Libro de Balance no está balanceado, p.e. el
+débito no es igual al crédito, la ganacia aún no ha sido anotada. Se debe realziar
+la siguiente entrada:
+
+![A&L]({{docs_base_url}}/assets/old_images/erpnext/assets-5.png)
+
+Explicación: Las ventas y gastos netos son 40000 y 20000 respectivamente.
+Entonces, la compañía tuvo una ganancia de 20000. Para registrar esa entrada,
+la cuenta "Pérdidas y Ganancias" debe ser debitada y la cuenta "Capital"
+debe ser acreditada. El balance neto de caja es 44000 y existe alguna materia
+prima que vale $1000.
+
+**Trabajo en progreso.**
+
+{next}
diff --git a/erpnext/docs/user/manual/es/accounts/accounting-reports.md b/erpnext/docs/user/manual/es/accounts/accounting-reports.md
new file mode 100644
index 0000000..925ea1f
--- /dev/null
+++ b/erpnext/docs/user/manual/es/accounts/accounting-reports.md
@@ -0,0 +1,48 @@
+<!---
+WORK IN PROGRESS
+-->
+
+Algunos de los principales reportes contables son:
+
+### Libro Mayor
+
+El Libro Mayor está basada en la tabla de Entradas y puede ser filtrado por
+cuenta y por periodo específico de tiempo. Esto ayuda a tener un reporte
+actualizado de todas las entradas que existan para una cuetna dada en un 
+periodo determinado. 
+
+<img alt="Libro Mayor" class="screenshot"
+    src="{{docs_base_url}}/assets/img/accounts/general-ledger.png">
+
+### Balance Contable
+
+Es el listado del balance para todas las cuentas ("Libro Mayor" y "Grupo")
+en una fecha particular. Para cada cuenta proporciona:
+
+  * Apertura
+  * Débitos
+  * Creditos
+  * Cierre
+
+<img alt="Balance Contable" class="screenshot" src="{{docs_base_url}}/assets/img/accounts/trial-balance.png">
+
+La suma de todos los balances de cierre en el Balance Contable debe ser igual a cero.
+
+### Cuentas por Pagar y Cuentas por Cobrar (CP / CC)
+
+Este reporte permite hacer seguimiento a las facturas enviadas a los clientes y proveedores. En este 
+reporte, se resaltan diferentes periodos de tiempo. p.e. entre 0-30 días, 30-60 días y así por el estilo.
+
+<img alt="Accounts Receivable" class="screenshot" src="{{docs_base_url}}/assets/img/accounts/accounts-receivable.png">
+
+### Registro de Ventas y Compras
+
+En este reporte, cada cuenta de impuestos es transpuesta en columnas. For cada factura y por cada item
+se puede obtener la cantidad de impuestos individuales que debe ser pagados, de acuerdo a la
+tabla de Impuestos y Contribuciones,
+
+<img alt="Sales Register" class="screenshot" src="{{docs_base_url}}/assets/img/accounts/sales-register.png">
+
+**Trabajo en progreso.**
+
+{next}
diff --git a/erpnext/docs/user/manual/es/accounts/advance-payment-entry.md b/erpnext/docs/user/manual/es/accounts/advance-payment-entry.md
new file mode 100644
index 0000000..81491bc
--- /dev/null
+++ b/erpnext/docs/user/manual/es/accounts/advance-payment-entry.md
@@ -0,0 +1,67 @@
+<!---
+WORK IN PROGRESS
+-->
+Los pagos realizados por el cliente antes de recibir el envío del producto se
+denominan Anticipos. Para ordenes de alto costo, los negocios esperan recibir
+dcho tipos de pago.
+
+  
+__Por Ejemplo:__ Consider a customer- Jane D'souza placing an order for a double
+bed costing $10000 She is asked to give some advance before the furniture
+house begins work on her order. She gives them $5000 in cash.
+
+  
+Go to Accounts and open a new Journal Entry to make the advance entry.
+
+> Accounts > Documents > Journal Entry > New Journal Entry  
+
+Mention the voucher type as cash voucher. This differs for different
+customers. If somebody pays by cheque the voucher type will be Bank Voucher.
+Then select the customer account and make the respective debit and credit
+entries.  
+
+Since the customer has given $5000 as cash advance,it will be recorded as a
+credit entry against the customer. To balance it with the debit entry [Double
+accounting Entry] enter $5000 as debit against the company's cash account. In
+the row "Is Advance" click 'Yes'.
+
+#### Figure 1 : Journal Entry -Advance Entry  
+
+<img class="screenshot" alt="Advace Payment" src="{{docs_base_url}}/assets/img/accounts/advance-payment-1.png">
+
+### Double Entry Accounting  
+
+Double entry bookkeeping is a system of accounting in which every transaction
+has a corresponding positive and negative entry : debits and credits. Every
+transaction involves a [debit entry
+](http://www.e-conomic.co.uk/accountingsystem/glossary/debit)in one account
+and a [credit
+entry](http://www.e-conomic.co.uk/accountingsystem/glossary/credit) in another
+account. This means that every transaction must be recorded in two accounts;
+one account will be debited because it receives value and the other account
+will be credited because it has given value.
+
+  
+#### Figure 2: Transaction and Difference Entry
+
+<img class="screenshot" alt="Advace Payment" src="{{docs_base_url}}/assets/img/accounts/advance-payment-2.png">
+
+Save and submit the JV. If this document is not saved it will not be pulled in
+other accounting documents.
+
+When you make a new Sales Invoice for the same customer, mention the advance
+in the Sales Invoice Form.
+
+To link the Sales Invoice to the Journal Entry which mentions the advance
+payment entry, click on ‘Get Advances Received’.  Allocate the amount of
+advance in the advances table. The accounting will be adjusted accordingly.
+
+#### Figure 3: Receive Advance 
+
+<img class="screenshot" alt="Advace Payment" src="{{docs_base_url}}/assets/img/accounts/advance-payment-3.png">
+
+Save and submit the Sales Invoice.
+
+**Trabajo en progreso.**
+
+{next}
diff --git a/erpnext/docs/user/manual/es/accounts/index.md b/erpnext/docs/user/manual/es/accounts/index.md
new file mode 100644
index 0000000..9599bf9
--- /dev/null
+++ b/erpnext/docs/user/manual/es/accounts/index.md
@@ -0,0 +1,33 @@
+<!---
+WORK IN PROGRESS
+-->
+Al final del ciclo de compra y venta viene la facturación y los pagos.
+Quizás se tenga un contador en el equipo, quizás se haga la contabilidad
+por cuenta propia o quizás se tenga contratado un tercero que realice la tarea.
+En todos los casos, la contabilidad finaciera forma parte del núcleo de
+cualquier sistema de gestión del negocio tal como los ERP.
+
+En **ERPNext**, las operaciones contables consisten en 3 transacciones principales: 
+
+  * Factura de ventas: Las facturas que se entregan al Cliente correspondientes a 
+    los servicios o productos que se proveen.
+  * Factura de Compra: Facturas que los proveedores le entregan a la compañía por
+    la compra de sus productos o servicios.
+  * Entradas 
+
+
+At the end of sales and purchase cycle comes billing and payments. You may have
+an accountant in your team, or you may be doing accounting yourself, or you may
+have outsourced your accounting. In all the cases financial accounting forms the core of any business management system like an ERP.
+
+In ERPNext, your accounting operations consists of 3 main transactions:
+
+  * Sales Invoice: The bills that you raise to your Customers for the products or services you provide.
+  * Purchase Invoice: Bills that your Suppliers give you for their products or services.
+  * Entradas Diarias: Para contabilizar entradas, tales cvomo pagos, créditos y otros tipos.
+
+### Temas
+
+**Trabajo en progreso.**
+
+{index}
diff --git a/erpnext/docs/user/manual/es/accounts/index.txt b/erpnext/docs/user/manual/es/accounts/index.txt
new file mode 100644
index 0000000..bad8436
--- /dev/null
+++ b/erpnext/docs/user/manual/es/accounts/index.txt
@@ -0,0 +1,3 @@
+advance-payment-entry
+accounting-reports
+accounting-entries
diff --git a/erpnext/docs/user/manual/es/index.md b/erpnext/docs/user/manual/es/index.md
new file mode 100644
index 0000000..5c2bcef
--- /dev/null
+++ b/erpnext/docs/user/manual/es/index.md
@@ -0,0 +1,12 @@
+<!---
+WORK IN PROGRESS
+-->
+# Manual de Usuario (Español)
+
+### Contenido: 
+
+{index}
+
+**Trabajo en progreso.**
+
+[The Spanish Translation of the ERPNext manual is in progress. Click here to see the english manual]({{ docs_base_url }}/user/manual/en)
diff --git a/erpnext/docs/user/manual/es/index.txt b/erpnext/docs/user/manual/es/index.txt
new file mode 100644
index 0000000..e6573f2
--- /dev/null
+++ b/erpnext/docs/user/manual/es/index.txt
@@ -0,0 +1 @@
+accounts
diff --git a/erpnext/docs/user/manual/index.md b/erpnext/docs/user/manual/index.md
index 3a992d9..a2db1ba 100644
--- a/erpnext/docs/user/manual/index.md
+++ b/erpnext/docs/user/manual/index.md
@@ -1,6 +1,10 @@
+<!---
+WORK IN PROGRESS
+-->
 # ERPNext User Manual
 
 Select your language
 
 1. [English](en)
 1. [Deutsch](de)
+1. [Español](es)
\ No newline at end of file
diff --git a/erpnext/docs/user/manual/index.txt b/erpnext/docs/user/manual/index.txt
index c574d07..2c4c454 100644
--- a/erpnext/docs/user/manual/index.txt
+++ b/erpnext/docs/user/manual/index.txt
@@ -1 +1 @@
-en
+en
\ No newline at end of file
diff --git a/erpnext/hooks.py b/erpnext/hooks.py
index 958fc83..ab3d393 100644
--- a/erpnext/hooks.py
+++ b/erpnext/hooks.py
@@ -7,7 +7,7 @@
 app_description = """ERP made simple"""
 app_icon = "icon-th"
 app_color = "#e74c3c"
-app_version = "6.23.6"
+app_version = "6.23.7"
 app_email = "info@erpnext.com"
 app_license = "GNU General Public License (v3)"
 source_link = "https://github.com/frappe/erpnext"
@@ -68,6 +68,13 @@
 			"doctype": "Delivery Note",
 			"parents": [{"title": _("Shipments"), "name": "shipments"}]
 		}
+	},
+	{"from_route": "/jobs", "to_route": "Job Opening"},
+	{"from_route": "/jobs/<path:name>", "to_route": "job_opening",
+		"defaults": {
+			"doctype": "Job Opening",
+			"parents": [{"title": _("Job Opening"), "name": "jobs"}]
+		}
 	}
 ]
 
diff --git a/erpnext/hr/doctype/employee/test_employee.py b/erpnext/hr/doctype/employee/test_employee.py
index 618be1b..dbd510b 100644
--- a/erpnext/hr/doctype/employee/test_employee.py
+++ b/erpnext/hr/doctype/employee/test_employee.py
@@ -12,7 +12,7 @@
 class TestEmployee(unittest.TestCase):
 	def test_birthday_reminders(self):
 		employee = frappe.get_doc("Employee", frappe.db.sql_list("select name from tabEmployee limit 1")[0])
-		employee.date_of_birth = "1990" + frappe.utils.nowdate()[4:]
+		employee.date_of_birth = "1992" + frappe.utils.nowdate()[4:]
 		employee.company_email = "test@example.com"
 		employee.save()
 
diff --git a/erpnext/hr/doctype/job_applicant/job_applicant.json b/erpnext/hr/doctype/job_applicant/job_applicant.json
index 423ab7e..fc579cb 100644
--- a/erpnext/hr/doctype/job_applicant/job_applicant.json
+++ b/erpnext/hr/doctype/job_applicant/job_applicant.json
@@ -108,7 +108,7 @@
    "allow_on_submit": 0, 
    "bold": 0, 
    "collapsible": 0, 
-   "fieldname": "job_opening", 
+   "fieldname": "job_title", 
    "fieldtype": "Link", 
    "hidden": 0, 
    "ignore_user_permissions": 0, 
@@ -184,7 +184,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2016-02-12 00:38:31.773297", 
+ "modified": "2016-02-19 16:43:24.705867", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Job Applicant", 
@@ -204,11 +204,33 @@
    "print": 1, 
    "read": 1, 
    "report": 1, 
+   "restrict": 0, 
+   "restricted": 0, 
    "role": "HR User", 
    "set_user_permissions": 0, 
    "share": 1, 
    "submit": 0, 
    "write": 1
+  }, 
+  {
+   "amend": 0, 
+   "apply_user_permissions": 0, 
+   "cancel": 0, 
+   "create": 0, 
+   "delete": 0, 
+   "email": 0, 
+   "export": 0, 
+   "if_owner": 0, 
+   "import": 0, 
+   "permlevel": 0, 
+   "print": 0, 
+   "read": 1, 
+   "report": 0, 
+   "role": "Guest", 
+   "set_user_permissions": 0, 
+   "share": 0, 
+   "submit": 0, 
+   "write": 0
   }
  ], 
  "read_only": 0, 
diff --git a/erpnext/hr/doctype/job_applicant/job_applicant.py b/erpnext/hr/doctype/job_applicant/job_applicant.py
index b0482cd..f1c0362 100644
--- a/erpnext/hr/doctype/job_applicant/job_applicant.py
+++ b/erpnext/hr/doctype/job_applicant/job_applicant.py
@@ -7,10 +7,12 @@
 from frappe.model.document import Document
 import frappe
 from frappe import _
-from frappe.utils import comma_and
+from frappe.utils import comma_and, validate_email_add
 
 sender_field = "email_id"
 
+class DuplicationError(frappe.ValidationError): pass
+
 class JobApplicant(Document):
 	def onload(self):
 		offer_letter = frappe.get_all("Offer Letter", filters={"job_applicant": self.name})
@@ -25,6 +27,14 @@
 
 	def validate(self):
 		self.check_email_id_is_unique()
+		validate_email_add(self.email_id, True)
+		if frappe.db.sql("""select applicant_name from `tabJob Applicant` where email_id= %s and job_title= %s""",
+				(self.email_id, self.job_title)):
+					frappe.throw(_("Application already exist for {0} against Job Opening - {1}")
+						.format(self.applicant_name, self.job_title), DuplicationError)
+		
+		if not self.get("__islocal") and not self.upload_cv:
+			frappe.throw(_("CV Required"))
 
 	def check_email_id_is_unique(self):
 		if self.email_id:
@@ -33,3 +43,5 @@
 
 			if names:
 				frappe.throw(_("Email id must be unique, already exists for {0}").format(comma_and(names)), frappe.DuplicateEntryError)
+
+		
\ No newline at end of file
diff --git a/erpnext/hr/doctype/job_opening/job_opening.js b/erpnext/hr/doctype/job_opening/job_opening.js
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/erpnext/hr/doctype/job_opening/job_opening.js
diff --git a/erpnext/hr/doctype/job_opening/job_opening.json b/erpnext/hr/doctype/job_opening/job_opening.json
index f4380ad..d05fe48 100644
--- a/erpnext/hr/doctype/job_opening/job_opening.json
+++ b/erpnext/hr/doctype/job_opening/job_opening.json
@@ -25,6 +25,7 @@
    "no_copy": 0, 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 1, 
@@ -48,6 +49,7 @@
    "options": "Open\nClosed", 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -71,6 +73,7 @@
    "no_copy": 0, 
    "permlevel": 0, 
    "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
    "read_only": 0, 
    "report_hide": 0, 
    "reqd": 0, 
@@ -89,7 +92,7 @@
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 0, 
- "modified": "2015-11-16 06:29:48.769149", 
+ "modified": "2016-02-17 17:29:04.401527", 
  "modified_by": "Administrator", 
  "module": "HR", 
  "name": "Job Opening", 
@@ -114,8 +117,29 @@
    "share": 1, 
    "submit": 0, 
    "write": 1
+  }, 
+  {
+   "amend": 0, 
+   "apply_user_permissions": 0, 
+   "cancel": 0, 
+   "create": 0, 
+   "delete": 0, 
+   "email": 0, 
+   "export": 0, 
+   "if_owner": 0, 
+   "import": 0, 
+   "permlevel": 0, 
+   "print": 0, 
+   "read": 1, 
+   "report": 0, 
+   "role": "Guest", 
+   "set_user_permissions": 0, 
+   "share": 0, 
+   "submit": 0, 
+   "write": 0
   }
  ], 
  "read_only": 0, 
- "read_only_onload": 0
+ "read_only_onload": 0, 
+ "sort_order": "ASC"
 }
\ No newline at end of file
diff --git a/erpnext/projects/doctype/time_log/test_time_log.py b/erpnext/projects/doctype/time_log/test_time_log.py
index 8d5694f..81a352f 100644
--- a/erpnext/projects/doctype/time_log/test_time_log.py
+++ b/erpnext/projects/doctype/time_log/test_time_log.py
@@ -20,6 +20,22 @@
 			from_time= tl1.from_time, to_time= tl1.to_time, do_not_save= 1)
 
 		self.assertRaises(OverlapError, tl2.insert)
+		
+		tl3 = make_time_log_test_record(user= "test@example.com", employee= "_T-Employee-0002",
+			from_time= tl1.from_time - datetime.timedelta(hours=1), 
+			to_time= tl1.to_time + datetime.timedelta(hours=1), do_not_save= 1)
+
+		self.assertRaises(OverlapError, tl3.insert)
+		
+		tl4 = make_time_log_test_record(user= "test@example.com", employee= "_T-Employee-0002",
+			from_time= tl1.from_time + datetime.timedelta(minutes=20), 
+			to_time= tl1.to_time + datetime.timedelta(minutes=30), do_not_save= 1)
+
+		self.assertRaises(OverlapError, tl4.insert)
+		
+		make_time_log_test_record(user= "test@example.com", employee= "_T-Employee-0002",
+			from_time= tl1.to_time, 
+			to_time= tl1.to_time + datetime.timedelta(hours=1))
 
 	def test_production_order_status(self):
 		prod_order = make_prod_order_test_record(item= "_Test FG Item 2", qty= 1, do_not_submit= True)
diff --git a/erpnext/projects/doctype/time_log/time_log.py b/erpnext/projects/doctype/time_log/time_log.py
index 5242b2c..b2a855d 100644
--- a/erpnext/projects/doctype/time_log/time_log.py
+++ b/erpnext/projects/doctype/time_log/time_log.py
@@ -88,8 +88,8 @@
 		existing = frappe.db.sql("""select name, from_time, to_time from `tabTime Log`
 			where `{0}`=%(val)s and
 			(
-				(%(from_time)s between from_time and to_time) or 
-				(%(to_time)s between from_time and to_time) or 
+				(%(from_time)s > from_time and %(from_time)s < to_time) or 
+				(%(to_time)s > from_time and %(to_time)s < to_time) or 
 				(%(from_time)s <= from_time and %(to_time)s >= to_time))
 			and name!=%(name)s
 			and docstatus < 2""".format(fieldname),
diff --git a/erpnext/stock/doctype/material_request/material_request.py b/erpnext/stock/doctype/material_request/material_request.py
index 95b2dd1..679bd2d 100644
--- a/erpnext/stock/doctype/material_request/material_request.py
+++ b/erpnext/stock/doctype/material_request/material_request.py
@@ -71,7 +71,7 @@
 
 		from erpnext.controllers.status_updater import validate_status
 		validate_status(self.status, ["Draft", "Submitted", "Stopped", "Cancelled"])
-		
+
 		pc_obj = frappe.get_doc('Purchase Common')
 		pc_obj.validate_for_items(self)
 
@@ -125,7 +125,7 @@
 					if d.ordered_qty and d.ordered_qty > d.qty:
 						frappe.throw(_("The total Issue / Transfer quantity {0} in Material Request {1}  \
 							cannot be greater than requested quantity {2} for Item {3}").format(d.ordered_qty, d.parent, d.qty, d.item_code))
-					
+
 				elif self.material_request_type == "Manufacture":
 					d.ordered_qty = flt(frappe.db.sql("""select sum(qty)
 						from `tabProduction Order` where material_request = %s
@@ -133,7 +133,7 @@
 						(self.name, d.name))[0][0])
 
 				frappe.db.set_value(d.doctype, d.name, "ordered_qty", d.ordered_qty)
-		
+
 		self._update_percent_field({
 			"target_dt": "Material Request Item",
 			"target_parent_dt": self.doctype,
@@ -228,7 +228,7 @@
 
 		target_doc.set("items", [d for d in target_doc.get("items")
 			if d.get("item_code") in supplier_items and d.get("qty") > 0])
-		
+
 		set_missing_values(source, target_doc)
 
 	for mr in material_requests:
@@ -263,7 +263,7 @@
 			and mr.material_request_type = 'Purchase'
 			and mr.per_ordered < 99.99
 			and mr.docstatus = 1
-			and mr.status != 'Stopped' 
+			and mr.status != 'Stopped'
                         order by mr_item.item_code ASC""" % ', '.join(['%s']*len(supplier_items)),
 			tuple(supplier_items))
 	else:
@@ -360,10 +360,10 @@
 				production_orders.append(prod_order.name)
 			else:
 				errors.append(d.item_code + " in Row " + cstr(d.idx))
-	if production_orders: 
+	if production_orders:
 		message = ["""<a href="#Form/Production Order/%s" target="_blank">%s</a>""" % \
 			(p, p) for p in production_orders]
-		msgprint(_("The following Production Orders were created : \n {0} ").format(new_line_sep(message)))
+		msgprint(_("The following Production Orders were created:" + '\n' + new_line_sep(message)))
 	if errors:
-		msgprint(_("Productions Orders cannot be raised for : \n {0}").format(new_line_sep(errors)))
-	return production_orders
\ No newline at end of file
+		msgprint(_("Productions Orders cannot be raised for:" + '\n' + new_line_sep(errors)))
+	return production_orders
diff --git a/erpnext/templates/pages/job_opening.html b/erpnext/templates/pages/job_opening.html
new file mode 100644
index 0000000..6a7ceb1
--- /dev/null
+++ b/erpnext/templates/pages/job_opening.html
@@ -0,0 +1,20 @@
+
+<head>
+<title>{{doc.job_title}}</title>
+</head>
+{% extends "templates/web.html" %}
+{% block header %}
+<h1>{{ doc.job_title }}</h1>
+{% endblock %}
+
+{% block breadcrumbs %}
+	{% include "templates/includes/breadcrumbs.html" %}
+{% endblock %}
+
+{% block page_content %}
+
+<p>{{ doc.description }}</p>
+
+<input class="btn btn-large btn-primary" type="button" onclick="location.href='/job_application?job_title={{ doc.job_title }}';" value="Apply Now" />
+
+{% endblock %}
\ No newline at end of file
diff --git a/erpnext/templates/pages/job_opening.py b/erpnext/templates/pages/job_opening.py
new file mode 100644
index 0000000..1bcfce2
--- /dev/null
+++ b/erpnext/templates/pages/job_opening.py
@@ -0,0 +1,16 @@
+# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors
+# License: GNU General Public License v3. See license.txt
+
+from __future__ import unicode_literals
+import frappe
+
+from frappe import _
+
+def get_context(context):
+	context.no_cache = 1
+	context.doc = frappe.get_doc(frappe.form_dict.doctype, frappe.form_dict.name)
+	context.parents = frappe.form_dict.parents
+
+	if not context.doc.has_website_permission("read"):
+		frappe.throw(_("Not Permitted"), frappe.PermissionError)
+
diff --git a/setup.py b/setup.py
index 92e4a92..76c0c12 100644
--- a/setup.py
+++ b/setup.py
@@ -1,7 +1,7 @@
 from setuptools import setup, find_packages
 from pip.req import parse_requirements
 
-version = "6.23.6"
+version = "6.23.7"
 requirements = parse_requirements("requirements.txt", session="")
 
 setup(