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.
+
+
+
+__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.
+
+
+
+__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.
+
+
+
+__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.
+
+
+
+### 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:
+
+
+
+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(