fixed conflict while merging
diff --git a/erpnext/home/__init__.py b/erpnext/home/__init__.py
index 75556e3..5f9c447 100644
--- a/erpnext/home/__init__.py
+++ b/erpnext/home/__init__.py
@@ -66,7 +66,7 @@
def update_feed(doc, method=None):
"adds a new feed"
- if method=='on_update':
+ if method in ['on_update', 'on_submit']:
subject, color = feed_dict.get(doc.doctype, [None, None])
if subject:
make_feed('', doc.doctype, doc.name, doc.owner, subject % doc.fields, color)
diff --git a/erpnext/patches/jan_mar_2012/fix_packing_slip.py b/erpnext/patches/jan_mar_2012/fix_packing_slip.py
new file mode 100644
index 0000000..98eb825
--- /dev/null
+++ b/erpnext/patches/jan_mar_2012/fix_packing_slip.py
@@ -0,0 +1,20 @@
+def execute():
+ """
+ * Change DN to PS mapper
+ + Set Ref doc should be submitted to 0
+ + Set validation logic of DN PS Table mapper record to docstatus=0
+ """
+ import webnotes
+ webnotes.conn.sql("""\
+ UPDATE `tabDocType Mapper`
+ SET ref_doc_submitted=0
+ WHERE name='Delivery Note-Packing Slip'""")
+
+ webnotes.conn.sql("""\
+ UPDATE `tabTable Mapper Detail`
+ SET validation_logic='docstatus=0'
+ WHERE parent='Delivery Note-Packing Slip'
+ AND docstatus=0
+ AND from_table='Delivery Note'
+ AND to_table='Packing Slip'""")
+
diff --git a/erpnext/patches/jan_mar_2012/remove_archive.py b/erpnext/patches/jan_mar_2012/remove_archive.py
index cce4d8e..1b914d5 100644
--- a/erpnext/patches/jan_mar_2012/remove_archive.py
+++ b/erpnext/patches/jan_mar_2012/remove_archive.py
@@ -8,6 +8,7 @@
from webnotes.utils import archive
arc_tables = webnotes.conn.sql('show tables like "arc%"')
try:
+ webnotes.conn.auto_commit_on_many_writes = 1
for tab in arc_tables:
tab = tab[0]
dt = tab[3:]
diff --git a/erpnext/patches/jan_mar_2012/website/all.py b/erpnext/patches/jan_mar_2012/website/all.py
index c68e653..1443f36 100644
--- a/erpnext/patches/jan_mar_2012/website/all.py
+++ b/erpnext/patches/jan_mar_2012/website/all.py
@@ -5,6 +5,7 @@
import patches.jan_mar_2012.website.domain_list
import patches.jan_mar_2012.website.file_data_rename
import patches.jan_mar_2012.website.analytics
+import patches.jan_mar_2012.website.allow_product_delete
def execute():
@@ -15,3 +16,4 @@
patches.jan_mar_2012.website.domain_list.execute()
patches.jan_mar_2012.website.file_data_rename.execute()
patches.jan_mar_2012.website.analytics.execute()
+ patches.jan_mar_2012.website.allow_product_delete.execute()
diff --git a/erpnext/patches/jan_mar_2012/website/allow_product_delete.py b/erpnext/patches/jan_mar_2012/website/allow_product_delete.py
new file mode 100644
index 0000000..fbef48f
--- /dev/null
+++ b/erpnext/patches/jan_mar_2012/website/allow_product_delete.py
@@ -0,0 +1,8 @@
+def execute():
+ """
+ Allow deletion of products
+ """
+ import webnotes
+ webnotes.conn.sql("""UPDATE `tabDocPerm` SET cancel=1
+ WHERE parent='Product' AND role='Website Manager'
+ AND permlevel=0""")
diff --git a/erpnext/patches/jan_mar_2012/website/getfile_rename.py b/erpnext/patches/jan_mar_2012/website/getfile_rename.py
index 8f7cede..15aa815 100644
--- a/erpnext/patches/jan_mar_2012/website/getfile_rename.py
+++ b/erpnext/patches/jan_mar_2012/website/getfile_rename.py
@@ -23,17 +23,23 @@
txt = get_file_id(txt)
webnotes.conn.sql("""update `tab%s` set %s=%s where name=%s""" % \
- (table[0], table[1], '%s', '%s'), (txt, item[0]), debug=1)
+ (table[0], table[1], '%s', '%s'), (txt, item[0]))
# control panel, client name
txt = webnotes.conn.get_value('Control Panel',None,'client_name')
- txt = get_file_id(txt)
- webnotes.conn.set_value('Control Panel', None, 'client_name', txt.replace('index.cgi?cmd=get_file&fname=', 'files/'))
-
+ if txt:
+ txt = get_file_id(txt)
+ webnotes.conn.set_value('Control Panel', None, 'client_name', txt.replace('index.cgi?cmd=get_file&fname=', 'files/'))
+
def get_file_id(txt):
"""old file links may be from fileid or filename"""
import re
match = re.search('files/([^"\']*)', txt)
+
+ if not match:
+ print txt
+ return txt
+
fname = match.groups()[0]
if not fname.startswith('FileData'):
fid = webnotes.conn.sql("""select name from `tabFile Data`
@@ -41,4 +47,4 @@
if fid:
fid = fid[0][0].replace('/', '-')
txt = txt.replace(fname, fid)
- return txt
\ No newline at end of file
+ return txt
diff --git a/erpnext/patches/patch_list.py b/erpnext/patches/patch_list.py
index ccaebae..e83d2a6 100644
--- a/erpnext/patches/patch_list.py
+++ b/erpnext/patches/patch_list.py
@@ -99,5 +99,10 @@
'patch_module': 'patches.jan_mar_2012',
'patch_file': 'reload_item',
'description': 'reload item'
- }
+ },
+ {
+ 'patch_module': 'patches.jan_mar_2012',
+ 'patch_file': 'fix_packing_slip',
+ 'description': 'Update Mapper Delivery Note-Packing Slip'
+ },
]
diff --git a/erpnext/setup/page/permission_engine/permission_engine.html b/erpnext/setup/page/permission_engine/permission_engine.html
index 1b9cab2..7831447 100644
--- a/erpnext/setup/page/permission_engine/permission_engine.html
+++ b/erpnext/setup/page/permission_engine/permission_engine.html
@@ -1,4 +1,8 @@
<div class="layout_wrapper">
<div id="pe_header"></div>
<div id="perm_engine_div" style="margin: 16px;"></div>
-</div>
\ No newline at end of file
+<div id="submittable_warning" class='help-box' style='display: None'>
+ One of the Roles has <b>Submit</b> permission.
+ You will have to <b>Cancel</b> and then <b>Amend</b> a submitted Document for making changes.
+</div>
+</div>
diff --git a/erpnext/setup/page/permission_engine/permission_engine.js b/erpnext/setup/page/permission_engine/permission_engine.js
index 378ad0c..f4f6fe8 100644
--- a/erpnext/setup/page/permission_engine/permission_engine.js
+++ b/erpnext/setup/page/permission_engine/permission_engine.js
@@ -1,397 +1,421 @@
pscript['onload_Permission Engine'] = function() {
- // header and toolbar
- var h = new PageHeader('pe_header','Permissions Manager','Set specific permissions for Roles')
-
- if(!pscript.perm_engine) pscript.perm_engine = new pscript.PermEngine();
+ // header and toolbar
+ var h = new PageHeader('pe_header','Permissions Manager','Set specific permissions for Roles')
+
+ if(!pscript.perm_engine) pscript.perm_engine = new pscript.PermEngine();
}
pscript.PermEngine = function() {
- // create UI elements
- this.wrapper = $i('perm_engine_div');
-
- this.head = $a(this.wrapper, 'div');
- this.body = $a(this.wrapper, 'div');
- this.footer = $a(this.wrapper, 'div');
+ // create UI elements
+ this.wrapper = $i('perm_engine_div');
+
+ this.head = $a(this.wrapper, 'div');
+ this.body = $a(this.wrapper, 'div');
+ this.footer = $a(this.wrapper, 'div');
- var lab = $a(this.body,'div', '', {backgroundColor:'#FFD', padding:'8px', margin:'16px 0px'});
- lab.innerHTML = 'Please select the item for which you want to set permissions';
-
- this.make_head();
- this.load_options();
+ var lab = $a(this.body,'div', '', {backgroundColor:'#FFD', padding:'8px', margin:'16px 0px'});
+ lab.innerHTML = 'Please select the item for which you want to set permissions';
+
+ this.make_head();
+ this.load_options();
}
// Make Head
// -------------
pscript.PermEngine.prototype.make_head = function() {
- var me = this;
-
- var make_select = function(label) {
- var w = $a(me.head, 'div', '', {margin:'8px 0px'});
- var t = make_table(w,1,2,'300px',['50%','50%']);
- $td(t,0,0).innerHTML = label;
- var s = $a($td(t,0,1),'select','',{width:'140px'});
- s.wrapper = w;
- return s;
- }
-
- var make_button = function(label, parent, green) {
- return $btn(parent, label, null, {margin:'8px 0px', display:'none'}, (green ? 'green' : null));
- }
-
-
- // Set Permissions for
- this.type_select = make_select('Set Permissions For');
- this.type_select.onchange = function() {
- me.get_permissions();
- }
-
- // Update Button
- this.add_button = make_button('+ Add A New Rule', this.head, 0);
- this.add_button.onclick = function() {
- me.add_permission();
- }
+ var me = this;
+
+ var make_select = function(label) {
+ var w = $a(me.head, 'div', '', {margin:'8px 0px'});
+ var t = make_table(w,1,2,'300px',['50%','50%']);
+ $td(t,0,0).innerHTML = label;
+ var s = $a($td(t,0,1),'select','',{width:'140px'});
+ s.wrapper = w;
+ return s;
+ }
+
+ var make_button = function(label, parent, green) {
+ return $btn(parent, label, null, {margin:'8px 0px', display:'none'}, (green ? 'green' : null));
+ }
+
+
+ // Set Permissions for
+ this.type_select = make_select('Set Permissions For');
+ this.type_select.onchange = function() {
+ me.get_permissions();
+ }
+
+ // Update Button
+ this.add_button = make_button('+ Add A New Rule', this.head, 0);
+ this.add_button.onclick = function() {
+ me.add_permission();
+ }
- // Update Button
- this.update_button = make_button('Update', this.footer, 1);
- this.update_button.onclick = function() {
- me.update_permissions();
- }
+ // Update Button
+ this.update_button = make_button('Update', this.footer, 1);
+ this.update_button.onclick = function() {
+ me.update_permissions();
+ }
}
// Add Permissions
// -----------------
pscript.PermEngine.prototype.add_permission = function() {
- var me = this;
- if(!this.add_permission_dialog) {
-
- // dialog
- var d = new Dialog(400,400,'Add Permission');
- d.make_body([['Select','Role'],['Select','Level'],['Button','Add']])
+ var me = this;
+ if(!this.add_permission_dialog) {
+
+ // dialog
+ var d = new Dialog(400,400,'Add Permission');
+ d.make_body([['Select','Role'],['Select','Level'],['Button','Add']])
- add_sel_options(d.widgets['Role'], this.roles, '');
- add_sel_options(d.widgets['Level'], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 0);
+ add_sel_options(d.widgets['Role'], this.roles, '');
+ add_sel_options(d.widgets['Level'], [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 0);
- // add
- d.widgets['Add'].onclick = function() {
- if(!sel_val(d.widgets['Role'])) {
- msgprint('Please select Role'); return;
- }
- var callback = function(r, rt) {
- // reload
- me.get_permissions();
- d.hide();
- }
- $c_obj('Permission Control','add_permission',JSON.stringify([sel_val(me.type_select), sel_val(d.widgets['Role']), sel_val(d.widgets['Level'])]), callback);
- }
+ // add
+ d.widgets['Add'].onclick = function() {
+ if(!sel_val(d.widgets['Role'])) {
+ msgprint('Please select Role'); return;
+ }
+ var callback = function(r, rt) {
+ // reload
+ me.get_permissions();
+ d.hide();
+ }
+ $c_obj('Permission Control','add_permission',JSON.stringify([sel_val(me.type_select), sel_val(d.widgets['Role']), sel_val(d.widgets['Level'])]), callback);
+ }
- this.add_permission_dialog = d;
- }
- this.add_permission_dialog.show();
+ this.add_permission_dialog = d;
+ }
+ this.add_permission_dialog.show();
}
// Hide Fields
// -----------------
pscript.PermEngine.prototype.hide_fields = function() {
- $dh(this.role_select.wrapper);
- this.type_select.disabled = false;
- this.body.innerHTML = '';
+ $dh(this.role_select.wrapper);
+ this.type_select.disabled = false;
+ this.body.innerHTML = '';
}
// Load Roles And Modules
// -----------------------
pscript.PermEngine.prototype.load_options = function() {
- var me = this;
- $dh(me.update_button);
- $dh(me.add_button);
+ var me = this;
+ $dh(me.update_button);
+ $dh(me.add_button);
- $c_obj('Permission Control','get_doctype_list','', function(r,rt) {
- me.roles = r.message.roles;
-
- // Type
- empty_select(me.type_select);
- add_sel_options(me.type_select,add_lists([''], r.message.doctypes));
-
- });
+ $c_obj('Permission Control','get_doctype_list','', function(r,rt) {
+ me.roles = r.message.roles;
+
+ // Type
+ empty_select(me.type_select);
+ add_sel_options(me.type_select,add_lists([''], r.message.doctypes));
+
+ });
}
// Get DocType and Permissions related to module
// --------------------------------------------------
pscript.PermEngine.prototype.get_permissions = function() {
- var me = this;
-
- if(!sel_val(me.type_select)) {
- msgprint('Please select a type first!'); return;
- }
-
- $c_obj('Permission Control','get_permissions',sel_val(me.type_select), function(r,rt) {
- // Get permissions
- if(r.message.perms.length)me.get_results(r.message);
- else me.body.innerHTML = '<div style = "color : red; margin:8px 0px;">No Records Found</div>'
- });
+ var me = this;
+
+ if(!sel_val(me.type_select)) {
+ msgprint('Please select a type first!'); return;
+ }
+
+ $c_obj('Permission Control','get_permissions',sel_val(me.type_select), function(r,rt) {
+ // Get permissions
+ if(r.message.perms.length) {
+ me.get_results(r.message);
+ }
+ else me.body.innerHTML = '<div style = "color : red; margin:8px 0px;">No Records Found</div>'
+ pscript.show_submittable();
+ });
}
// Get Results
// ------------------
pscript.PermEngine.prototype.get_results = function(r){
- var perms = r.perms;
- var me = this;
- var doctype = sel_val(me.type_select);
-
- // show update button
- $ds(me.update_button);
- $ds(me.add_button);
+ var perms = r.perms;
+ var me = this;
+ var doctype = sel_val(me.type_select);
+
+ // show update button
+ $ds(me.update_button);
+ $ds(me.add_button);
- this.body.innerHTML = ''
- pscript.all_checkboxes = [];
- pscript.all_matches = [];
-
- var head = $a(this.body, 'h3'); head.innerHTML = 'Rules for ' + doctype;
- var permt = make_table(me.body, perms.length+1,9,'80%',[],{border:'1px solid #AAA', padding:'3px', verticalAlign:'middle', height:'30px'});
-
- // Create Grid for particular DocType
- // ------------------------------------
-
- // Columns
- var col_labels = ['Role','Level','Read','Write','Create','Submit','Cancel','Amend','Restrict By']
- for(var n = 0; n < col_labels.length; n++){
- $y($td(permt,0,n), {backgroundColor:'#DDD', width:(n==0?'30%':(n==8?'21%':'7%'))})
- $td(permt,0,n).innerHTML = col_labels[n];
- $td(permt,0,n).fieldname = col_labels[n].toLowerCase();
- }
-
- // Rows for Column Level / Role
- for(var j = 0; j < perms.length; j++){
- var plevel = $a($td(permt,j+1,1), 'span', 'link_type');
- plevel.innerHTML = perms[j].permlevel;
- plevel.doctype = doctype;
- plevel.value = perms[j].permlevel;
- plevel.onclick = function() {me.get_fields(this.doctype, this.value)}
+ this.body.innerHTML = ''
+ pscript.all_checkboxes = [];
+ pscript.all_matches = [];
+
+ var head = $a(this.body, 'h3'); head.innerHTML = 'Rules for ' + doctype;
+ var permt = make_table(me.body, perms.length+1,9,'80%',[],{border:'1px solid #AAA', padding:'3px', verticalAlign:'middle', height:'30px'});
+
+ // Create Grid for particular DocType
+ // ------------------------------------
+
+ // Columns
+ var col_labels = ['Role','Level','Read','Write','Create','Submit','Cancel','Amend','Restrict By']
+ for(var n = 0; n < col_labels.length; n++){
+ $y($td(permt,0,n), {backgroundColor:'#DDD', width:(n==0?'30%':(n==8?'21%':'7%'))})
+ $td(permt,0,n).innerHTML = col_labels[n];
+ $td(permt,0,n).fieldname = col_labels[n].toLowerCase();
+ }
+
+ // Rows for Column Level / Role
+ for(var j = 0; j < perms.length; j++){
+ var plevel = $a($td(permt,j+1,1), 'span', 'link_type');
+ plevel.innerHTML = perms[j].permlevel;
+ plevel.doctype = doctype;
+ plevel.value = perms[j].permlevel;
+ plevel.onclick = function() {me.get_fields(this.doctype, this.value)}
- // role
- $td(permt,j+1,0).innerHTML = perms[j].role;
+ // role
+ $td(permt,j+1,0).innerHTML = perms[j].role;
- }
-
- // Get values
- for(var l = 0; l < perms.length; l++){
- for(var m = 0; m < 6; m++){ // (read,write,create,submit,cancel,amend)
- var chk = $a_input($td(permt,l+1,m+2), 'checkbox');
- var val = perms[l][$td(permt,0,m+2).fieldname];
- if(val == 1) chk.checked = 1;
- else chk.checked = 0;
- chk.doctype = doctype;
- chk.permlevel = perms[l].permlevel; chk.perm_type = col_labels[m+2].toLowerCase(); chk.role = perms[l].role;
- pscript.all_checkboxes.push(chk);
- }
- }
-
- // add selects for match
- me.add_match_select(r, perms, permt, doctype);
+ }
+
+ // Get values
+ for(var l = 0; l < perms.length; l++){
+ for(var m = 0; m < 6; m++){ // (read,write,create,submit,cancel,amend)
+ var chk = $a_input($td(permt,l+1,m+2), 'checkbox');
+ var val = perms[l][$td(permt,0,m+2).fieldname];
+ if(val == 1) chk.checked = 1;
+ else chk.checked = 0;
+
+ if(m==3) { chk.onclick = pscript.show_submittable }
+
+ chk.doctype = doctype;
+ chk.permlevel = perms[l].permlevel; chk.perm_type = col_labels[m+2].toLowerCase(); chk.role = perms[l].role;
+ pscript.all_checkboxes.push(chk);
+ }
+ }
+
+ // add selects for match
+ me.add_match_select(r, perms, permt, doctype);
}
+// Show submittable warning
+pscript.show_submittable = function() {
+ var submittable = 0;
+ for(i in pscript.all_checkboxes) {
+ c = pscript.all_checkboxes[i];
+ if(c.perm_type=='submit' && c.checked) {
+ submittable = 1;
+ break;
+ }
+ }
+ if(submittable) {
+ $('#submittable_warning').toggle(true);
+ } else {
+ $('#submittable_warning').toggle(false);
+ }
+}
+
+
// render selects for match
// --------------------------------------------
pscript.PermEngine.prototype.add_match_select = function(r, perms, permt, doctype) {
- var me = this;
-
- // add select for match
- for(var i=0; i<perms.length; i++) {
- if(perms[i].permlevel==0) {
- // select
- var sel = $a($td(permt,i+1,8),'select','',{width:'100%'});
- add_sel_options(sel, r.fields);
- sel.details = perms[i]; sel.details.parent = doctype;
- sel.onchange = function() {
- if(sel_val(this) && sel_val(this)!='owner') $ds(this.div);
- else $dh(this.div); }
-
- // link
- var div = $a($td(permt,i+1,8),'div','link_type',{marginTop: '2px', fontSize:'10px', display:'none'});
- div.onclick = function() { this.details.match = sel_val(this.sel); me.show_match_dialog(this.details); }
- div.innerHTML = 'Set Users / Roles';
- div.details = perms[i];
- sel.div = div; div.sel = sel;
+ var me = this;
+
+ // add select for match
+ for(var i=0; i<perms.length; i++) {
+ if(perms[i].permlevel==0) {
+ // select
+ var sel = $a($td(permt,i+1,8),'select','',{width:'100%'});
+ add_sel_options(sel, r.fields);
+ sel.details = perms[i]; sel.details.parent = doctype;
+ sel.onchange = function() {
+ if(sel_val(this) && sel_val(this)!='owner') $ds(this.div);
+ else $dh(this.div); }
+
+ // link
+ var div = $a($td(permt,i+1,8),'div','link_type',{marginTop: '2px', fontSize:'10px', display:'none'});
+ div.onclick = function() { this.details.match = sel_val(this.sel); me.show_match_dialog(this.details); }
+ div.innerHTML = 'Set Users / Roles';
+ div.details = perms[i];
+ sel.div = div; div.sel = sel;
- // set the value
- if(perms[i].match) { sel.value = perms[i].match; $ds(div); }
-
- pscript.all_matches.push(sel);
- }
- }
+ // set the value
+ if(perms[i].match) { sel.value = perms[i].match; $ds(div); }
+
+ pscript.all_matches.push(sel);
+ }
+ }
}
// match users Dialog
// =======================================================
pscript.PermEngine.prototype.show_match_dialog=function(details) {
- if(!this.match_defaults_dialog) {
- var d = new Dialog(750, 500, 'Permission Applies To');
- d.make_body([['HTML','Body']]);
- var w = d.widgets['Body'];
- $y(w,{height:'350px', overflow:'auto'});
- this.match_defaults_dialog = d;
- }
-
- // dialog
- this.match_defaults_dialog.show();
-
- // render the rules
- var me = this;
- var callback = function(r,rt) {
- me.render_match_dialog(r, details);
- }
- // load the rules
- $c_obj('Permission Control','get_defaults', details.match + '~~~' + (this.profiles ? 'No' : 'Yes'), callback);
+ if(!this.match_defaults_dialog) {
+ var d = new Dialog(750, 500, 'Permission Applies To');
+ d.make_body([['HTML','Body']]);
+ var w = d.widgets['Body'];
+ $y(w,{height:'350px', overflow:'auto'});
+ this.match_defaults_dialog = d;
+ }
+
+ // dialog
+ this.match_defaults_dialog.show();
+
+ // render the rules
+ var me = this;
+ var callback = function(r,rt) {
+ me.render_match_dialog(r, details);
+ }
+ // load the rules
+ $c_obj('Permission Control','get_defaults', details.match + '~~~' + (this.profiles ? 'No' : 'Yes'), callback);
}
// --------------------------------------------
pscript.PermEngine.prototype.render_match_dialog=function(r, details) {
- var d = this.match_defaults_dialog;
- var w = d.widgets['Body'];
- w.innerHTML = '<div style="background-color:#FFD; padding: 4px; color: #440; margin-bottom:16px">Please Note: Any action will also affect other permissions with similar rules!</div>'
-
- // header
- var t=make_table($a(w,'div','',{borderBottom:'1px solid #AAA'}),1,3,'90%',['40%','40%','20%'],{fontWeight:'bold', padding:'3px', fontSize:'14px'});
- $td(t,0,0).innerHTML = 'Who?'; $td(t,0,1).innerHTML = 'Is allowed if '+details.match+' equals';
-
- // existing defaults
- var dl = r.message.dl; this.options = r.message.ol;
- if(!this.profiles) {
- this.profiles = r.message.pl;
- }
-
- for(var i=0; i<dl.length; i++) {
- new MatchDefaultValue(this, w, dl[i], details.match);
- }
-
- this.add_new_match_row(details.match);
+ var d = this.match_defaults_dialog;
+ var w = d.widgets['Body'];
+ w.innerHTML = '<div style="background-color:#FFD; padding: 4px; color: #440; margin-bottom:16px">Please Note: Any action will also affect other permissions with similar rules!</div>'
+
+ // header
+ var t=make_table($a(w,'div','',{borderBottom:'1px solid #AAA'}),1,3,'90%',['40%','40%','20%'],{fontWeight:'bold', padding:'3px', fontSize:'14px'});
+ $td(t,0,0).innerHTML = 'Who?'; $td(t,0,1).innerHTML = 'Is allowed if '+details.match+' equals';
+
+ // existing defaults
+ var dl = r.message.dl; this.options = r.message.ol;
+ if(!this.profiles) {
+ this.profiles = r.message.pl;
+ }
+
+ for(var i=0; i<dl.length; i++) {
+ new MatchDefaultValue(this, w, dl[i], details.match);
+ }
+
+ this.add_new_match_row(details.match);
}
pscript.PermEngine.prototype.add_new_match_row = function(fieldname) {
- // add new default
- new MatchDefaultValue(this, this.match_defaults_dialog.widgets['Body'], null, fieldname, 1);
-}
-
+ // add new default
+ new MatchDefaultValue(this, this.match_defaults_dialog.widgets['Body'], null, fieldname, 1);
+}
+
// --------------------------------------------
MatchDefaultValue = function(pe, parent, details, fieldname, editable) {
- this.pe = pe;
- this.wrapper = $a(parent, 'div', '', {margin:'4px'});
- this.clear();
- this.details = details;
- this.fieldname = fieldname;
- this.render(editable);
+ this.pe = pe;
+ this.wrapper = $a(parent, 'div', '', {margin:'4px'});
+ this.clear();
+ this.details = details;
+ this.fieldname = fieldname;
+ this.render(editable);
}
// --------------------------------------------
MatchDefaultValue.prototype.clear = function() {
- this.wrapper.innerHTML = '';
- this.tab = make_table(this.wrapper, 1, 3, '90%', ['40%','40%','20%'], {verticalAlign:'middle', padding:'3px'});
+ this.wrapper.innerHTML = '';
+ this.tab = make_table(this.wrapper, 1, 3, '90%', ['40%','40%','20%'], {verticalAlign:'middle', padding:'3px'});
}
// --------------------------------------------
MatchDefaultValue.prototype.render = function(editable) {
- if(editable) {
- this.render_editable();
- } else {
- this.render_static();
- }
+ if(editable) {
+ this.render_editable();
+ } else {
+ this.render_static();
+ }
}
// --------------------------------------------
MatchDefaultValue.prototype.render_editable = function() {
- var me = this;
+ var me = this;
- // profile or role
- this.profile_or_role = $a($td(this.tab,0,0), 'select', '', {width:'60px', marginRight:'8px'});
- add_sel_options(this.profile_or_role,['Profile', 'Role'], 'Profile');
- this.profile_or_role.onchange = function() {
- if(sel_val(this)=='Profile') { $di(me.profile_sel); $dh(me.role_sel); }
- else { $dh(me.profile_sel); $di(me.role_sel); }
- }
+ // profile or role
+ this.profile_or_role = $a($td(this.tab,0,0), 'select', '', {width:'60px', marginRight:'8px'});
+ add_sel_options(this.profile_or_role,['Profile', 'Role'], 'Profile');
+ this.profile_or_role.onchange = function() {
+ if(sel_val(this)=='Profile') { $di(me.profile_sel); $dh(me.role_sel); }
+ else { $dh(me.profile_sel); $di(me.role_sel); }
+ }
- // role sel
- this.role_sel = $a($td(this.tab,0,0), 'select', '', {width:'100px',display:'none'});
- add_sel_options(this.role_sel,this.pe.roles);
-
- // profile sel
- this.profile_sel = $a($td(this.tab,0,0), 'select', '', {width:'100px'});
- add_sel_options(this.profile_sel,this.pe.profiles);
+ // role sel
+ this.role_sel = $a($td(this.tab,0,0), 'select', '', {width:'100px',display:'none'});
+ add_sel_options(this.role_sel,this.pe.roles);
+
+ // profile sel
+ this.profile_sel = $a($td(this.tab,0,0), 'select', '', {width:'100px'});
+ add_sel_options(this.profile_sel,this.pe.profiles);
- // options sel
- this.options_sel = $a($td(this.tab,0,1), 'select', '', {width:'120px'});
- add_sel_options(this.options_sel,this.pe.options);
+ // options sel
+ this.options_sel = $a($td(this.tab,0,1), 'select', '', {width:'120px'});
+ add_sel_options(this.options_sel,this.pe.options);
- // add
- var span = $a($td(this.tab,0,2),'span','link_type',{marginLeft:'8px'});
- span.innerHTML = 'Add'
- span.onclick = function() { me.save(); }
+ // add
+ var span = $a($td(this.tab,0,2),'span','link_type',{marginLeft:'8px'});
+ span.innerHTML = 'Add'
+ span.onclick = function() { me.save(); }
}
// --------------------------------------------
MatchDefaultValue.prototype.render_static = function() {
- var me = this;
-
- $td(this.tab,0,0).innerHTML = this.details.parenttype;
- $td(this.tab,0,0).innerHTML += ' ' + this.details.parent;
- $td(this.tab,0,1).innerHTML = this.details.defvalue;
+ var me = this;
+
+ $td(this.tab,0,0).innerHTML = this.details.parenttype;
+ $td(this.tab,0,0).innerHTML += ' ' + this.details.parent;
+ $td(this.tab,0,1).innerHTML = this.details.defvalue;
- // delete
- var span = $a($td(this.tab,0,2),'span','link_type',{marginLeft:'8px'});
- span.innerHTML = 'Cancel'
- span.onclick = function() { me.delete_def(); }
+ // delete
+ var span = $a($td(this.tab,0,2),'span','link_type',{marginLeft:'8px'});
+ span.innerHTML = 'Cancel'
+ span.onclick = function() { me.delete_def(); }
}
// --------------------------------------------
MatchDefaultValue.prototype.delete_def = function() {
- var me = this;
- this.wrapper.innerHTML = '<div style="color: #888; padding: 3px;">Deleting...</div>';
- var callback = function(r,rt) {
- $dh(me.wrapper);
- if(r.exc) msgprint('There were errors!')
- }
- $c_obj('Permission Control','delete_default'
- ,[this.details.parent, this.fieldname, this.details.defvalue].join('~~~')
- ,callback)
+ var me = this;
+ this.wrapper.innerHTML = '<div style="color: #888; padding: 3px;">Deleting...</div>';
+ var callback = function(r,rt) {
+ $dh(me.wrapper);
+ if(r.exc) msgprint('There were errors!')
+ }
+ $c_obj('Permission Control','delete_default'
+ ,[this.details.parent, this.fieldname, this.details.defvalue].join('~~~')
+ ,callback)
}
// --------------------------------------------
MatchDefaultValue.prototype.save = function() {
- var me= this;
-
- var callback = function(r,rt) {
- me.details = r.message;
- me.clear();
- me.render();
- me.pe.add_new_match_row(me.fieldname);
- }
-
- // values
- if(sel_val(this.profile_or_role)=='Profile') { var parent = sel_val(this.profile_sel); var parenttype = 'Profile'; }
- else { var parent = sel_val(this.role_sel); var parenttype = 'Role'; }
+ var me= this;
+
+ var callback = function(r,rt) {
+ me.details = r.message;
+ me.clear();
+ me.render();
+ me.pe.add_new_match_row(me.fieldname);
+ }
+
+ // values
+ if(sel_val(this.profile_or_role)=='Profile') { var parent = sel_val(this.profile_sel); var parenttype = 'Profile'; }
+ else { var parent = sel_val(this.role_sel); var parenttype = 'Role'; }
- if(!sel_val(this.options_sel) || !parent) { msgprint("Please select all values"); return; }
-
- $c_obj('Permission Control','add_default'
- ,[parent, parenttype, this.fieldname, sel_val(this.options_sel)].join('~~~')
- ,callback);
-
- this.wrapper.innerHTML = '<div style="color: #888; padding: 3px;">Adding...</div>';
+ if(!sel_val(this.options_sel) || !parent) { msgprint("Please select all values"); return; }
+
+ $c_obj('Permission Control','add_default'
+ ,[parent, parenttype, this.fieldname, sel_val(this.options_sel)].join('~~~')
+ ,callback);
+
+ this.wrapper.innerHTML = '<div style="color: #888; padding: 3px;">Adding...</div>';
}
@@ -399,36 +423,36 @@
// =======================================================
pscript.PermEngine.prototype.make_fields_dialog=function(){
- if(!pscript.get_field_dialog) {
- pscript.get_field_dialog = new Dialog(750,500,'Fields');
- pscript.get_field_dialog.make_body([['HTML','Fields','<div id="perm_engine_get_fields"></div>'],['Button','OK']]);
- }
- else $i('perm_engine_get_fields').innerHTML = '';
+ if(!pscript.get_field_dialog) {
+ pscript.get_field_dialog = new Dialog(750,500,'Fields');
+ pscript.get_field_dialog.make_body([['HTML','Fields','<div id="perm_engine_get_fields"></div>'],['Button','OK']]);
+ }
+ else $i('perm_engine_get_fields').innerHTML = '';
}
// Get Fields
// --------------------
pscript.PermEngine.prototype.get_fields = function(dt, permlevel) {
- var me = this;
- var callback = function(r,rt){
- // Get Parent DocType Fields
- var parent_fields_dict = r.message.parent_fields_dict;
-
- // Get Child Table Fields if any
- var table_fields_dict = r.message.table_fields_dict;
-
- // Make Fields Dialog Box
- me.make_fields_dialog();
-
- me.make_fields_table(dt, parent_fields_dict, table_fields_dict, permlevel);
-
- pscript.get_field_dialog.show();
- pscript.get_field_dialog.widgets['OK'].onclick=function(){
- pscript.get_field_dialog.hide();
- }
- }
- var args = "{'dt':'"+dt+"','permlevel':"+permlevel+"}"
- $c_obj('Permission Control','get_fields', args, callback);
+ var me = this;
+ var callback = function(r,rt){
+ // Get Parent DocType Fields
+ var parent_fields_dict = r.message.parent_fields_dict;
+
+ // Get Child Table Fields if any
+ var table_fields_dict = r.message.table_fields_dict;
+
+ // Make Fields Dialog Box
+ me.make_fields_dialog();
+
+ me.make_fields_table(dt, parent_fields_dict, table_fields_dict, permlevel);
+
+ pscript.get_field_dialog.show();
+ pscript.get_field_dialog.widgets['OK'].onclick=function(){
+ pscript.get_field_dialog.hide();
+ }
+ }
+ var args = "{'dt':'"+dt+"','permlevel':"+permlevel+"}"
+ $c_obj('Permission Control','get_fields', args, callback);
}
@@ -436,90 +460,90 @@
// Make Table of Fields for Dialog Box
// --------------------------------------
pscript.PermEngine.prototype.make_fields_table = function(dt, parent_fields_dict, table_fields_dict, permlevel) {
-
- var make_grid = function(table, fields_dict) {
- var col_labels = ['Label','Fieldtype','Fieldname','Options'];
- for(var n = 0; n < col_labels.length; n++){
- $a_input(($td(table,0,n)), 'data');
- $td(table,0,n).innerHTML = '<b>'+col_labels[n]+'</b>';
- $td(table,0,n).fieldname = col_labels[n].toLowerCase();
- }
-
- // Add values
- for(var i = 0; i < keys(fields_dict).length; i++){
- for(var j = 0; j < 4; j++){
- $a_input(($td(table,i+1,j)), 'data');
- $td(table,i+1,j).innerHTML = cstr(fields_dict[i][$td(table,0,j).fieldname])
- }
- }
- }
+
+ var make_grid = function(table, fields_dict) {
+ var col_labels = ['Label','Fieldtype','Fieldname','Options'];
+ for(var n = 0; n < col_labels.length; n++){
+ $a_input(($td(table,0,n)), 'data');
+ $td(table,0,n).innerHTML = '<b>'+col_labels[n]+'</b>';
+ $td(table,0,n).fieldname = col_labels[n].toLowerCase();
+ }
+
+ // Add values
+ for(var i = 0; i < keys(fields_dict).length; i++){
+ for(var j = 0; j < 4; j++){
+ $a_input(($td(table,i+1,j)), 'data');
+ $td(table,i+1,j).innerHTML = cstr(fields_dict[i][$td(table,0,j).fieldname])
+ }
+ }
+ }
-
- $i('perm_engine_get_fields').innerHTML = '<b>'+ dt + ' Fields at Level '+ permlevel +':</b><br><br>';
- var parent_field_table = make_table('perm_engine_get_fields',keys(parent_fields_dict).length+1, 4,'100%',['25%','25%','25%','25%'],{border:'1px solid #AAA',padding:'2px'});
- make_grid(parent_field_table, parent_fields_dict);
-
- child_tables = keys(table_fields_dict)
- if(child_tables.length > 0){
- for(var k = 0; k < child_tables.length; k++){
- var tab_fields_det = table_fields_dict[child_tables[k]];
- if(keys(tab_fields_det).length > 0){
- $i('perm_engine_get_fields').innerHTML += '<br><b>'+ child_tables[k] + ' Fields at Level '+ permlevel +':</b><br><br>'
- var child_field_table = make_table('perm_engine_get_fields',keys(tab_fields_det).length+1, 4,'100%',['25%','25%','25%','25%'],{border:'1px solid #AAA',padding:'2px'});
- make_grid(child_field_table, tab_fields_det);
- }
- }
- }
+
+ $i('perm_engine_get_fields').innerHTML = '<b>'+ dt + ' Fields at Level '+ permlevel +':</b><br><br>';
+ var parent_field_table = make_table('perm_engine_get_fields',keys(parent_fields_dict).length+1, 4,'100%',['25%','25%','25%','25%'],{border:'1px solid #AAA',padding:'2px'});
+ make_grid(parent_field_table, parent_fields_dict);
+
+ child_tables = keys(table_fields_dict)
+ if(child_tables.length > 0){
+ for(var k = 0; k < child_tables.length; k++){
+ var tab_fields_det = table_fields_dict[child_tables[k]];
+ if(keys(tab_fields_det).length > 0){
+ $i('perm_engine_get_fields').innerHTML += '<br><b>'+ child_tables[k] + ' Fields at Level '+ permlevel +':</b><br><br>'
+ var child_field_table = make_table('perm_engine_get_fields',keys(tab_fields_det).length+1, 4,'100%',['25%','25%','25%','25%'],{border:'1px solid #AAA',padding:'2px'});
+ make_grid(child_field_table, tab_fields_det);
+ }
+ }
+ }
}
// Update Permissions
// -----------------------
pscript.PermEngine.prototype.update_permissions = function() {
- var me = this;
- var out = {};
+ var me = this;
+ var out = {};
- var add_to_out = function(doctype, permlevel, role, key, value) {
- if(!out[doctype]) out[doctype] = {};
- if(!out[doctype][permlevel]) out[doctype][permlevel] = {};
- if(!out[doctype][permlevel][role]) out[doctype][permlevel][role] = {};
- out[doctype][permlevel][role][key] = value;
- }
+ var add_to_out = function(doctype, permlevel, role, key, value) {
+ if(!out[doctype]) out[doctype] = {};
+ if(!out[doctype][permlevel]) out[doctype][permlevel] = {};
+ if(!out[doctype][permlevel][role]) out[doctype][permlevel][role] = {};
+ out[doctype][permlevel][role][key] = value;
+ }
- // check boxes
- for(i in pscript.all_checkboxes) {
- c = pscript.all_checkboxes[i];
- add_to_out(c.doctype, c.permlevel, c.role, c.perm_type, c.checked ? 1 : 0);
- }
-
- // matches
- for(var i=0; i<pscript.all_matches.length; i++) {
- var s = pscript.all_matches[i];
- if(sel_val(s))
- add_to_out(s.details.parent, s.details.permlevel, s.details.role, 'match', sel_val(s));
- }
-
- var args = "{'perm_dict': "+JSON.stringify(out)+"}"
- $c_obj('Permission Control','update_permissions', args, function(r,rt) {});
+ // check boxes
+ for(i in pscript.all_checkboxes) {
+ c = pscript.all_checkboxes[i];
+ add_to_out(c.doctype, c.permlevel, c.role, c.perm_type, c.checked ? 1 : 0);
+ }
+
+ // matches
+ for(var i=0; i<pscript.all_matches.length; i++) {
+ var s = pscript.all_matches[i];
+ if(sel_val(s))
+ add_to_out(s.details.parent, s.details.permlevel, s.details.role, 'match', sel_val(s));
+ }
+
+ var args = "{'perm_dict': "+JSON.stringify(out)+"}"
+ $c_obj('Permission Control','update_permissions', args, function(r,rt) {});
}
// Update Page Roles
// ----------------------
pscript.PermEngine.prototype.update_page_roles = function() {
- var me = this;
- var out = {};
- for(i in pscript.all_pg_checkboxes) {
- c = pscript.all_pg_checkboxes[i];
- out[c.page_name] = c.checked ? 1 : 0
- }
- var args = "{'page_role_dict': "+JSON.stringify(out)+", 'role': '"+sel_val(me.role_select)+"'}"
- $c_obj('Permission Control','update_page_role', args, function(r,rt) {});
+ var me = this;
+ var out = {};
+ for(i in pscript.all_pg_checkboxes) {
+ c = pscript.all_pg_checkboxes[i];
+ out[c.page_name] = c.checked ? 1 : 0
+ }
+ var args = "{'page_role_dict': "+JSON.stringify(out)+", 'role': '"+sel_val(me.role_select)+"'}"
+ $c_obj('Permission Control','update_page_role', args, function(r,rt) {});
}
// Reset Permission Engine
// -------------------------
pscript.PermEngine.prototype.reset_perm_engine = function(){
- this.type_select.selectedIndex = 0;
- this.load_options();
+ this.type_select.selectedIndex = 0;
+ this.load_options();
}
diff --git a/erpnext/startup/event_handlers.py b/erpnext/startup/event_handlers.py
index b6b1f9f..9740be4 100644
--- a/erpnext/startup/event_handlers.py
+++ b/erpnext/startup/event_handlers.py
@@ -7,7 +7,7 @@
"""
called from login manager, before login
"""
- if login_manager.user not in ('Guest', None, ''):
+ if login_manager.user not in ('Guest', None, '') and webnotes.conn.cur_db_name!='accounts' and webnotes.conn.get_value('Control Panel', 'Control Panel', 'account_id')!='s5u011':
try:
login_manager = login_as(login_manager)
update_account_details()
@@ -32,7 +32,7 @@
sid!=%s""", \
(webnotes.session['user'], webnotes.session['sid']), as_list=1)
- if webnotes.session['user'] not in ('Guest'):
+ if webnotes.session['user'] not in ('Guest') and webnotes.conn.cur_db_name!='accounts':
# create feed
from webnotes.utils import nowtime
home.make_feed('Login', 'Profile', login_manager.user, login_manager.user,
diff --git a/erpnext/stock/DocType Mapper/Delivery Note-Packing Slip/Delivery Note-Packing Slip.txt b/erpnext/stock/DocType Mapper/Delivery Note-Packing Slip/Delivery Note-Packing Slip.txt
index baf2b74..f59ab73 100644
--- a/erpnext/stock/DocType Mapper/Delivery Note-Packing Slip/Delivery Note-Packing Slip.txt
+++ b/erpnext/stock/DocType Mapper/Delivery Note-Packing Slip/Delivery Note-Packing Slip.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-02-13 11:28:48',
+ 'creation': '2012-02-02 11:50:33',
'docstatus': 0,
- 'modified': '2012-02-13 11:28:48',
+ 'modified': '2012-02-21 16:11:29',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -34,7 +34,7 @@
'from_doctype': u'Delivery Note',
'module': u'Stock',
'name': '__common__',
- 'ref_doc_submitted': 1,
+ 'ref_doc_submitted': 0,
'to_doctype': u'Packing Slip'
},
@@ -77,7 +77,7 @@
'from_table': u'Delivery Note',
'match_id': 0,
'to_table': u'Packing Slip',
- 'validation_logic': u'docstatus=1'
+ 'validation_logic': u'docstatus=0'
},
# Table Mapper Detail
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.js b/erpnext/stock/doctype/delivery_note/delivery_note.js
index 79cdc3e..b9e7503 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.js
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.js
@@ -51,7 +51,7 @@
unhide_field(['SMS','Send SMS', 'message', 'customer_mobile_no', 'Repair Delivery Note']);
}
- if(doc.docstatus==1) {
+ if(doc.docstatus==0 && !doc.__islocal) {
cur_frm.add_custom_button('Make Packing Slip', cur_frm.cscript['Make Packing Slip']);
}
diff --git a/erpnext/stock/doctype/delivery_note/delivery_note.py b/erpnext/stock/doctype/delivery_note/delivery_note.py
index a5b907e..013245a 100644
--- a/erpnext/stock/doctype/delivery_note/delivery_note.py
+++ b/erpnext/stock/doctype/delivery_note/delivery_note.py
@@ -318,6 +318,7 @@
# ON SUBMIT
# =================================================================================================
def on_submit(self):
+ self.validate_packed_qty()
set(self.doc, 'message', 'Items against your Order #%s have been delivered. Delivery #%s: ' % (self.doc.po_no, self.doc.name))
self.check_qty_in_stock()
# Check for Approving Authority
@@ -335,6 +336,28 @@
set(self.doc, 'status', 'Submitted')
+ def validate_packed_qty(self):
+ """
+ Validate that if packed qty exists, it should be equal to qty
+ """
+ if not any([d.fields.get('packed_qty') for d in self.doclist]):
+ return
+ packing_error_list = []
+ for d in self.doclist:
+ if d.doctype != 'Delivery Note Detail': continue
+ if d.fields.get('qty') != d.fields.get('packed_qty'):
+ packing_error_list.append([
+ d.fields.get('item_code', ''),
+ d.fields.get('qty', ''),
+ d.fields.get('packed_qty', '')
+ ])
+ if packing_error_list:
+ from webnotes.utils import cstr
+ err_msg = "\n".join([("Item: " + d[0] + ", Qty: " + cstr(d[1]) \
+ + ", Packed: " + cstr(d[2])) for d in packing_error_list])
+ webnotes.msgprint("Packing Error:\n" + err_msg, raise_exception=1)
+
+
# *********** Checks whether actual quantity is present in warehouse *************
def check_qty_in_stock(self):
for d in getlist(self.doclist, 'packing_details'):
diff --git a/erpnext/stock/doctype/packing_slip/packing_slip.js b/erpnext/stock/doctype/packing_slip/packing_slip.js
index 2e728f6..7359ffa 100644
--- a/erpnext/stock/doctype/packing_slip/packing_slip.js
+++ b/erpnext/stock/doctype/packing_slip/packing_slip.js
@@ -1,12 +1,12 @@
cur_frm.fields_dict['delivery_note'].get_query = function(doc, cdt, cdn) {
- return 'SELECT name FROM `tabDelivery Note` WHERE docstatus=1 AND %(key)s LIKE "%s"';
+ return 'SELECT name FROM `tabDelivery Note` WHERE docstatus=0 AND %(key)s LIKE "%s"';
}
cur_frm.fields_dict['item_details'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) {
return 'SELECT name, description FROM `tabItem` WHERE name IN ( \
- SELECT item_code FROM `tabDelivery Note Detail` \
- WHERE parent="' + doc.delivery_note + '") AND %(key)s LIKE "%s" LIMIT 50';
+ SELECT item_code FROM `tabDelivery Note Detail` dnd \
+ WHERE parent="' + doc.delivery_note + '" AND qty > packed_qty) AND %(key)s LIKE "%s" LIMIT 50';
}
@@ -39,8 +39,7 @@
if(r.exc) {
msgprint(r.exc);
} else {
- refresh_field('item_details');
- refresh_field('naming_series');
+ refresh_many(['item_details', 'naming_series', 'from_case_no', 'to_case_no'])
}
});
}
diff --git a/erpnext/stock/doctype/packing_slip/packing_slip.py b/erpnext/stock/doctype/packing_slip/packing_slip.py
index 33ec2b5..23367c7 100644
--- a/erpnext/stock/doctype/packing_slip/packing_slip.py
+++ b/erpnext/stock/doctype/packing_slip/packing_slip.py
@@ -28,9 +28,10 @@
WHERE name=%(delivery_note)s
""", self.doc.fields)
- if not(res and res[0][0]==1):
+ if not(res and res[0][0]==0):
webnotes.msgprint("""Invalid Delivery Note. Delivery Note should exist
- and should be submitted. Please rectify and try again.""", raise_exception=1)
+ and should be in draft state. Please rectify and try again.""",
+ raise_exception=1)
def validate_case_nos(self):
@@ -46,12 +47,8 @@
""", self.doc.fields)
if res:
- recommended_case_no = webnotes.conn.sql("""\
- SELECT MAX(to_case_no) FROM `tabPacking Slip`
- WHERE delivery_note = %(delivery_note)s AND docstatus=1""", self.doc.fields)
-
webnotes.msgprint("""Case No(s). already in use. Please rectify and try again.
- Recommended <b>From Case No. = %s</b>""" % (cint(recommended_case_no[0][0]) + 1),
+ Recommended <b>From Case No. = %s</b>""" % self.get_recommended_case_no(),
raise_exception=1)
@@ -75,13 +72,18 @@
* Item Quantity dict of current packing slip doc
* No. of Cases of this packing slip
"""
- item_codes = ", ".join([('"' + d.item_code + '"') for d in self.doclist])
+ item_codes = ", ".join([('"' + d.item_code + '"') for d in
+ self.doclist])
+
+ if not item_codes: webnotes.msgprint("No Items to Pack",
+ raise_exception=1)
res = webnotes.conn.sql("""\
SELECT item_code, IFNULL(SUM(qty), 0) as qty, IFNULL(packed_qty, 0) as packed_qty, stock_uom
FROM `tabDelivery Note Detail`
WHERE parent = "%s" AND item_code IN (%s)
- GROUP BY item_code""" % (self.doc.delivery_note, item_codes), as_dict=1)
+ GROUP BY item_code""" % (self.doc.delivery_note, item_codes),
+ as_dict=1)
ps_item_qty = dict([[d.item_code, d.qty] for d in self.doclist])
@@ -150,7 +152,23 @@
"""
Fill empty columns in Packing Slip Detail
"""
+ self.doc.from_case_no = self.get_recommended_case_no()
+
from webnotes.model.code import get_obj
for d in self.doclist:
psd_obj = get_obj(doc=d)
psd_obj.get_item_details(self.doc.delivery_note)
+
+
+ def get_recommended_case_no(self):
+ """
+ Returns the next case no. for a new packing slip for a delivery
+ note
+ """
+ recommended_case_no = webnotes.conn.sql("""\
+ SELECT MAX(to_case_no) FROM `tabPacking Slip`
+ WHERE delivery_note = %(delivery_note)s AND docstatus=1""", self.doc.fields)
+
+ return cint(recommended_case_no[0][0]) + 1
+
+
diff --git a/erpnext/website/doctype/product/product.txt b/erpnext/website/doctype/product/product.txt
index 26300b6..1c2b472 100644
--- a/erpnext/website/doctype/product/product.txt
+++ b/erpnext/website/doctype/product/product.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-02-14 11:53:45',
+ 'creation': '2012-02-17 15:53:22',
'docstatus': 0,
- 'modified': '2012-02-22 18:28:20',
+ 'modified': '2012-02-22 18:32:46',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -249,4 +249,4 @@
'permlevel': 0,
'print_hide': 1
}
-]
\ No newline at end of file
+]