Merge branch 'develop' of https://github.com/webnotes/erpnext into develop
diff --git a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index f059451..13aaee6 100644
--- a/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -1,11 +1,13 @@
+
# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
# License: GNU General Public License v3. See license.txt
from __future__ import unicode_literals
import webnotes
from webnotes import msgprint
-from webnotes.utils import flt, getdate
+from webnotes.utils import flt, getdate, add_date
from webnotes.model.controller import DocListController
+from datetime import date
class DocType(DocListController):
def __init__(self, doc, doclist=[]):
@@ -19,30 +21,30 @@
validate_warehouse_user(self.doc.warehouse)
validate_warehouse_company(self.doc.warehouse, self.doc.company)
self.scrub_posting_time()
-
+
from accounts.utils import validate_fiscal_year
validate_fiscal_year(self.doc.posting_date, self.doc.fiscal_year, self.meta.get_label("posting_date"))
-
+
def on_submit(self):
self.check_stock_frozen_date()
self.actual_amt_check()
-
+
from stock.doctype.serial_no.serial_no import process_serial_no
process_serial_no(self.doc)
-
+
#check for item quantity available in stock
def actual_amt_check(self):
if self.doc.batch_no:
- batch_bal_after_transaction = flt(webnotes.conn.sql("""select sum(actual_qty)
- from `tabStock Ledger Entry`
- where warehouse=%s and item_code=%s and batch_no=%s""",
+ batch_bal_after_transaction = flt(webnotes.conn.sql("""select sum(actual_qty)
+ from `tabStock Ledger Entry`
+ where warehouse=%s and item_code=%s and batch_no=%s""",
(self.doc.warehouse, self.doc.item_code, self.doc.batch_no))[0][0])
-
+
if batch_bal_after_transaction < 0:
self.doc.fields.update({
'batch_bal': batch_bal_after_transaction - self.doc.actual_qty
})
-
+
webnotes.throw("""Not enough quantity (requested: %(actual_qty)s, \
current: %(batch_bal)s in Batch <b>%(batch_no)s</b> for Item \
<b>%(item_code)s</b> at Warehouse <b>%(warehouse)s</b> \
@@ -60,27 +62,27 @@
msgprint("Warehouse: '%s' does not exist in the system. Please check." % self.doc.fields.get(k), raise_exception = 1)
def validate_item(self):
- item_det = webnotes.conn.sql("""select name, has_batch_no, docstatus,
- is_stock_item, has_serial_no, serial_no_series
- from tabItem where name=%s""",
+ item_det = webnotes.conn.sql("""select name, has_batch_no, docstatus,
+ is_stock_item, has_serial_no, serial_no_series
+ from tabItem where name=%s""",
self.doc.item_code, as_dict=True)[0]
if item_det.is_stock_item != 'Yes':
webnotes.throw("""Item: "%s" is not a Stock Item.""" % self.doc.item_code)
-
+
# check if batch number is required
if item_det.has_batch_no =='Yes' and self.doc.voucher_type != 'Stock Reconciliation':
if not self.doc.batch_no:
webnotes.throw("Batch number is mandatory for Item '%s'" % self.doc.item_code)
-
+
# check if batch belongs to item
- if not webnotes.conn.sql("""select name from `tabBatch`
+ if not webnotes.conn.sql("""select name from `tabBatch`
where item='%s' and name ='%s' and docstatus != 2""" % (self.doc.item_code, self.doc.batch_no)):
webnotes.throw("'%s' is not a valid Batch Number for Item '%s'" % (self.doc.batch_no, self.doc.item_code))
-
+
if not self.doc.stock_uom:
self.doc.stock_uom = item_det.stock_uom
-
+
def check_stock_frozen_date(self):
stock_frozen_upto = webnotes.conn.get_value('Stock Settings', None, 'stock_frozen_upto') or ''
if stock_frozen_upto:
@@ -88,13 +90,21 @@
if getdate(self.doc.posting_date) <= getdate(stock_frozen_upto) and not stock_auth_role in webnotes.user.get_roles():
msgprint("You are not authorized to do / modify back dated stock entries before %s" % getdate(stock_frozen_upto).strftime('%d-%m-%Y'), raise_exception=1)
+ stock_frozen_upto_days = webnotes.conn.get_value('Stock Settings', None, 'stock_frozen_upto_days') or 0
+ if stock_frozen_upto_days:
+ stock_auth_role = webnotes.conn.get_value('Stock Settings', None,'stock_auth_role')
+ older_than_x_days_ago = (add_date(getdate(self.doc.posting_date), stock_frozen_upto_days) <= date.today())
+ if older_than_x_days_ago and not stock_auth_role in webnotes.user.get_roles():
+ msgprint("You are not authorized to do / modify back dated stock entries older than %d days ago" %stock_frozen_upto_days, raise_exception=1)
+
+
def scrub_posting_time(self):
if not self.doc.posting_time or self.doc.posting_time == '00:0':
self.doc.posting_time = '00:00'
def on_doctype_update():
- if not webnotes.conn.sql("""show index from `tabStock Ledger Entry`
+ if not webnotes.conn.sql("""show index from `tabStock Ledger Entry`
where Key_name="posting_sort_index" """):
webnotes.conn.commit()
- webnotes.conn.sql("""alter table `tabStock Ledger Entry`
+ webnotes.conn.sql("""alter table `tabStock Ledger Entry`
add index posting_sort_index(posting_date, posting_time, name)""")
\ No newline at end of file
diff --git a/stock/doctype/stock_settings/stock_settings.py b/stock/doctype/stock_settings/stock_settings.py
index 48e1ee1..87e940d 100644
--- a/stock/doctype/stock_settings/stock_settings.py
+++ b/stock/doctype/stock_settings/stock_settings.py
@@ -5,18 +5,23 @@
from __future__ import unicode_literals
import webnotes
-
+from webnotes import _
class DocType:
def __init__(self, d, dl):
self.doc, self.doclist = d, dl
-
+
def validate(self):
- for key in ["item_naming_by", "item_group", "stock_uom",
+ for key in ["item_naming_by", "item_group", "stock_uom",
"allow_negative_stock"]:
webnotes.conn.set_default(key, self.doc.fields.get(key, ""))
-
+
from setup.doctype.naming_series.naming_series import set_by_naming_series
- set_by_naming_series("Item", "item_code",
+ set_by_naming_series("Item", "item_code",
self.doc.get("item_naming_by")=="Naming Series", hide_name_field=True)
-
+
+ stock_frozen_limit = 356
+ submitted_stock_frozen = self.doc.stock_frozen_upto_days
+ if submitted_stock_frozen > stock_frozen_limit:
+ self.doc.stock_frozen_upto_days = stock_frozen_limit
+ webnotes.msgprint (_("`Freeze Stocks Older Than` should be smaller than %d days.") %stock_frozen_limit)
diff --git a/stock/doctype/stock_settings/stock_settings.txt b/stock/doctype/stock_settings/stock_settings.txt
index 634ee3a..a179091 100644
--- a/stock/doctype/stock_settings/stock_settings.txt
+++ b/stock/doctype/stock_settings/stock_settings.txt
@@ -1,128 +1,134 @@
[
{
- "creation": "2013-06-24 16:37:54",
- "docstatus": 0,
- "modified": "2013-11-02 19:41:56",
- "modified_by": "Administrator",
+ "creation": "2013-06-24 16:37:54",
+ "docstatus": 0,
+ "modified": "2014-01-27 20:00:56",
+ "modified_by": "Administrator",
"owner": "Administrator"
- },
+ },
{
- "description": "Settings",
- "doctype": "DocType",
- "icon": "icon-cog",
- "issingle": 1,
- "module": "Stock",
+ "description": "Settings",
+ "doctype": "DocType",
+ "icon": "icon-cog",
+ "issingle": 1,
+ "module": "Stock",
"name": "__common__"
- },
+ },
{
- "doctype": "DocField",
- "name": "__common__",
- "parent": "Stock Settings",
- "parentfield": "fields",
- "parenttype": "DocType",
+ "doctype": "DocField",
+ "name": "__common__",
+ "parent": "Stock Settings",
+ "parentfield": "fields",
+ "parenttype": "DocType",
"permlevel": 0
- },
+ },
{
- "create": 1,
- "doctype": "DocPerm",
- "name": "__common__",
- "parent": "Stock Settings",
- "parentfield": "permissions",
- "parenttype": "DocType",
- "permlevel": 0,
- "read": 1,
- "role": "Material Manager",
+ "create": 1,
+ "doctype": "DocPerm",
+ "name": "__common__",
+ "parent": "Stock Settings",
+ "parentfield": "permissions",
+ "parenttype": "DocType",
+ "permlevel": 0,
+ "read": 1,
+ "role": "Material Manager",
"write": 1
- },
+ },
{
- "doctype": "DocType",
+ "doctype": "DocType",
"name": "Stock Settings"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "item_naming_by",
- "fieldtype": "Select",
- "label": "Item Naming By",
+ "doctype": "DocField",
+ "fieldname": "item_naming_by",
+ "fieldtype": "Select",
+ "label": "Item Naming By",
"options": "Item Code\nNaming Series"
- },
+ },
{
- "description": "<a href=\"#Sales Browser/Item Group\">Add / Edit</a>",
- "doctype": "DocField",
- "fieldname": "item_group",
- "fieldtype": "Link",
- "label": "Default Item Group",
+ "description": "<a href=\"#Sales Browser/Item Group\">Add / Edit</a>",
+ "doctype": "DocField",
+ "fieldname": "item_group",
+ "fieldtype": "Link",
+ "label": "Default Item Group",
"options": "Item Group"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "stock_uom",
- "fieldtype": "Link",
- "label": "Default Stock UOM",
+ "doctype": "DocField",
+ "fieldname": "stock_uom",
+ "fieldtype": "Link",
+ "label": "Default Stock UOM",
"options": "UOM"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "column_break_4",
+ "doctype": "DocField",
+ "fieldname": "column_break_4",
"fieldtype": "Column Break"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "allow_negative_stock",
- "fieldtype": "Check",
+ "doctype": "DocField",
+ "fieldname": "allow_negative_stock",
+ "fieldtype": "Check",
"label": "Allow Negative Stock"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "valuation_method",
- "fieldtype": "Select",
- "label": "Default Valuation Method",
+ "doctype": "DocField",
+ "fieldname": "valuation_method",
+ "fieldtype": "Select",
+ "label": "Default Valuation Method",
"options": "FIFO\nMoving Average"
- },
+ },
{
- "description": "Percentage you are allowed to receive or deliver more against the quantity ordered. For example: If you have ordered 100 units. and your Allowance is 10% then you are allowed to receive 110 units.",
- "doctype": "DocField",
- "fieldname": "tolerance",
- "fieldtype": "Float",
+ "description": "Percentage you are allowed to receive or deliver more against the quantity ordered. For example: If you have ordered 100 units. and your Allowance is 10% then you are allowed to receive 110 units.",
+ "doctype": "DocField",
+ "fieldname": "tolerance",
+ "fieldtype": "Float",
"label": "Allowance Percent"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "auto_material_request",
- "fieldtype": "Section Break",
+ "doctype": "DocField",
+ "fieldname": "auto_material_request",
+ "fieldtype": "Section Break",
"label": "Auto Material Request"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "auto_indent",
- "fieldtype": "Check",
+ "doctype": "DocField",
+ "fieldname": "auto_indent",
+ "fieldtype": "Check",
"label": "Raise Material Request when stock reaches re-order level"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "reorder_email_notify",
- "fieldtype": "Check",
+ "doctype": "DocField",
+ "fieldname": "reorder_email_notify",
+ "fieldtype": "Check",
"label": "Notify by Email on creation of automatic Material Request"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "freeze_stock_entries",
- "fieldtype": "Section Break",
+ "doctype": "DocField",
+ "fieldname": "freeze_stock_entries",
+ "fieldtype": "Section Break",
"label": "Freeze Stock Entries"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "stock_frozen_upto",
- "fieldtype": "Date",
+ "doctype": "DocField",
+ "fieldname": "stock_frozen_upto",
+ "fieldtype": "Date",
"label": "Stock Frozen Upto"
- },
+ },
{
- "doctype": "DocField",
- "fieldname": "stock_auth_role",
- "fieldtype": "Link",
- "label": "Role Allowed to edit frozen stock",
+ "doctype": "DocField",
+ "fieldname": "stock_frozen_upto_days",
+ "fieldtype": "Int",
+ "label": "Freeze Stocks Older Than [Days]"
+ },
+ {
+ "doctype": "DocField",
+ "fieldname": "stock_auth_role",
+ "fieldtype": "Link",
+ "label": "Role Allowed to edit frozen stock",
"options": "Role"
- },
+ },
{
"doctype": "DocPerm"
}
-]
\ No newline at end of file
+]