Merge branch 'shf_rename' of github.com:webnotes/erpnext into shf_rename
diff --git a/.gitignore b/.gitignore
index 95255be..29bb624 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,7 +1,7 @@
*.pyc
*.comp.js
.DS_Store
-user_files
+files
patch.log
lib
conf.py
diff --git a/css/all-app.css b/css/all-app.css
index 8ee043f..41feae8 100644
--- a/css/all-app.css
+++ b/css/all-app.css
@@ -1728,7 +1728,6 @@
padding: 0px;
font-size: 14px;
color: #000;
- background-color: #e2e2e2;
}
/* font settings */
@@ -1848,12 +1847,12 @@
div#body_div {
display: none;
padding-right: 7px;
- width: 900px;
- margin: auto;
- margin-top: 56px;
+ padding-top: 70px;
+ padding-bottom: 50px;
}
.content {
+ margin: auto;
width: 900px;
}
@@ -1864,23 +1863,19 @@
transition: background 1s ease-in;
}
-footer {
- width: 900px;
- margin: auto;
-}
header .container {
width: 900px;
margin: auto;
}
@media (max-width: 1200px) {
- div#body_div, header .container, .content, #opened-page-selector, footer {
+ header .container, .content {
width: 900px;
}
}
@media (min-width: 1200px) {
- div#body_div, header .container, .content, #opened-page-selector, footer {
+ header .container, .content {
width: 1100px;
}
}
@@ -1931,7 +1926,6 @@
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
- margin-bottom: 30px;
overflow: hidden;
}
@@ -3581,7 +3575,6 @@
}
body {
- background: url(../images/redbeech.jpg) repeat;
color: #616161;
}
diff --git a/css/all-web.css b/css/all-web.css
index cf8fe99..c3139d4 100644
--- a/css/all-web.css
+++ b/css/all-web.css
@@ -1196,6 +1196,387 @@
}
/*
+ * lib/css/bootstrap/icons.css
+ */
+[class^="icon-"], [class*=" icon-"] {
+ display: inline-block;
+ width: 14px;
+ height: 14px;
+ line-height: 14px;
+ vertical-align: text-top;
+ background-image: url("../lib/images/icons/glyphicons-halflings.png");
+ background-position: 14px 14px;
+ background-repeat: no-repeat;
+ *margin-right: .3em;
+}
+[class^="icon-"]:last-child, [class*=" icon-"]:last-child {
+ *margin-left: 0;
+}
+.icon-white {
+ background-image: url("../lib/images/icons/glyphicons-halflings-white.png");
+}
+.icon-glass {
+ background-position: 0 0;
+}
+.icon-music {
+ background-position: -24px 0;
+}
+.icon-search {
+ background-position: -48px 0;
+}
+.icon-envelope {
+ background-position: -72px 0;
+}
+.icon-heart {
+ background-position: -96px 0;
+}
+.icon-star {
+ background-position: -120px 0;
+}
+.icon-star-empty {
+ background-position: -144px 0;
+}
+.icon-user {
+ background-position: -168px 0;
+}
+.icon-film {
+ background-position: -192px 0;
+}
+.icon-th-large {
+ background-position: -216px 0;
+}
+.icon-th {
+ background-position: -240px 0;
+}
+.icon-th-list {
+ background-position: -264px 0;
+}
+.icon-ok {
+ background-position: -288px 0;
+}
+.icon-remove {
+ background-position: -312px 0;
+}
+.icon-zoom-in {
+ background-position: -336px 0;
+}
+.icon-zoom-out {
+ background-position: -360px 0;
+}
+.icon-off {
+ background-position: -384px 0;
+}
+.icon-signal {
+ background-position: -408px 0;
+}
+.icon-cog {
+ background-position: -432px 0;
+}
+.icon-trash {
+ background-position: -456px 0;
+}
+.icon-home {
+ background-position: 0 -24px;
+}
+.icon-file {
+ background-position: -24px -24px;
+}
+.icon-time {
+ background-position: -48px -24px;
+}
+.icon-road {
+ background-position: -72px -24px;
+}
+.icon-download-alt {
+ background-position: -96px -24px;
+}
+.icon-download {
+ background-position: -120px -24px;
+}
+.icon-upload {
+ background-position: -144px -24px;
+}
+.icon-inbox {
+ background-position: -168px -24px;
+}
+.icon-play-circle {
+ background-position: -192px -24px;
+}
+.icon-repeat {
+ background-position: -216px -24px;
+}
+.icon-refresh {
+ background-position: -240px -24px;
+}
+.icon-list-alt {
+ background-position: -264px -24px;
+}
+.icon-lock {
+ background-position: -287px -24px;
+}
+.icon-flag {
+ background-position: -312px -24px;
+}
+.icon-headphones {
+ background-position: -336px -24px;
+}
+.icon-volume-off {
+ background-position: -360px -24px;
+}
+.icon-volume-down {
+ background-position: -384px -24px;
+}
+.icon-volume-up {
+ background-position: -408px -24px;
+}
+.icon-qrcode {
+ background-position: -432px -24px;
+}
+.icon-barcode {
+ background-position: -456px -24px;
+}
+.icon-tag {
+ background-position: 0 -48px;
+}
+.icon-tags {
+ background-position: -25px -48px;
+}
+.icon-book {
+ background-position: -48px -48px;
+}
+.icon-bookmark {
+ background-position: -72px -48px;
+}
+.icon-print {
+ background-position: -96px -48px;
+}
+.icon-camera {
+ background-position: -120px -48px;
+}
+.icon-font {
+ background-position: -144px -48px;
+}
+.icon-bold {
+ background-position: -167px -48px;
+}
+.icon-italic {
+ background-position: -192px -48px;
+}
+.icon-text-height {
+ background-position: -216px -48px;
+}
+.icon-text-width {
+ background-position: -240px -48px;
+}
+.icon-align-left {
+ background-position: -264px -48px;
+}
+.icon-align-center {
+ background-position: -288px -48px;
+}
+.icon-align-right {
+ background-position: -312px -48px;
+}
+.icon-align-justify {
+ background-position: -336px -48px;
+}
+.icon-list {
+ background-position: -360px -48px;
+}
+.icon-indent-left {
+ background-position: -384px -48px;
+}
+.icon-indent-right {
+ background-position: -408px -48px;
+}
+.icon-facetime-video {
+ background-position: -432px -48px;
+}
+.icon-picture {
+ background-position: -456px -48px;
+}
+.icon-pencil {
+ background-position: 0 -72px;
+}
+.icon-map-marker {
+ background-position: -24px -72px;
+}
+.icon-adjust {
+ background-position: -48px -72px;
+}
+.icon-tint {
+ background-position: -72px -72px;
+}
+.icon-edit {
+ background-position: -96px -72px;
+}
+.icon-share {
+ background-position: -120px -72px;
+}
+.icon-check {
+ background-position: -144px -72px;
+}
+.icon-move {
+ background-position: -168px -72px;
+}
+.icon-step-backward {
+ background-position: -192px -72px;
+}
+.icon-fast-backward {
+ background-position: -216px -72px;
+}
+.icon-backward {
+ background-position: -240px -72px;
+}
+.icon-play {
+ background-position: -264px -72px;
+}
+.icon-pause {
+ background-position: -288px -72px;
+}
+.icon-stop {
+ background-position: -312px -72px;
+}
+.icon-forward {
+ background-position: -336px -72px;
+}
+.icon-fast-forward {
+ background-position: -360px -72px;
+}
+.icon-step-forward {
+ background-position: -384px -72px;
+}
+.icon-eject {
+ background-position: -408px -72px;
+}
+.icon-chevron-left {
+ background-position: -432px -72px;
+}
+.icon-chevron-right {
+ background-position: -456px -72px;
+}
+.icon-plus-sign {
+ background-position: 0 -96px;
+}
+.icon-minus-sign {
+ background-position: -24px -96px;
+}
+.icon-remove-sign {
+ background-position: -48px -96px;
+}
+.icon-ok-sign {
+ background-position: -72px -96px;
+}
+.icon-question-sign {
+ background-position: -96px -96px;
+}
+.icon-info-sign {
+ background-position: -120px -96px;
+}
+.icon-screenshot {
+ background-position: -144px -96px;
+}
+.icon-remove-circle {
+ background-position: -168px -96px;
+}
+.icon-ok-circle {
+ background-position: -192px -96px;
+}
+.icon-ban-circle {
+ background-position: -216px -96px;
+}
+.icon-arrow-left {
+ background-position: -240px -96px;
+}
+.icon-arrow-right {
+ background-position: -264px -96px;
+}
+.icon-arrow-up {
+ background-position: -289px -96px;
+}
+.icon-arrow-down {
+ background-position: -312px -96px;
+}
+.icon-share-alt {
+ background-position: -336px -96px;
+}
+.icon-resize-full {
+ background-position: -360px -96px;
+}
+.icon-resize-small {
+ background-position: -384px -96px;
+}
+.icon-plus {
+ background-position: -408px -96px;
+}
+.icon-minus {
+ background-position: -433px -96px;
+}
+.icon-asterisk {
+ background-position: -456px -96px;
+}
+.icon-exclamation-sign {
+ background-position: 0 -120px;
+}
+.icon-gift {
+ background-position: -24px -120px;
+}
+.icon-leaf {
+ background-position: -48px -120px;
+}
+.icon-fire {
+ background-position: -72px -120px;
+}
+.icon-eye-open {
+ background-position: -96px -120px;
+}
+.icon-eye-close {
+ background-position: -120px -120px;
+}
+.icon-warning-sign {
+ background-position: -144px -120px;
+}
+.icon-plane {
+ background-position: -168px -120px;
+}
+.icon-calendar {
+ background-position: -192px -120px;
+}
+.icon-random {
+ background-position: -216px -120px;
+}
+.icon-comment {
+ background-position: -240px -120px;
+}
+.icon-magnet {
+ background-position: -264px -120px;
+}
+.icon-chevron-up {
+ background-position: -288px -120px;
+}
+.icon-chevron-down {
+ background-position: -313px -119px;
+}
+.icon-retweet {
+ background-position: -336px -120px;
+}
+.icon-shopping-cart {
+ background-position: -360px -120px;
+}
+.icon-folder-close {
+ background-position: -384px -120px;
+}
+.icon-folder-open {
+ background-position: -408px -120px;
+}
+.icon-resize-vertical {
+ background-position: -432px -119px;
+}
+.icon-resize-horizontal {
+ background-position: -456px -118px;
+}
+
+/*
* lib/css/legacy/body.css
*/
html {
@@ -1208,7 +1589,6 @@
padding: 0px;
font-size: 14px;
color: #000;
- background-color: #e2e2e2;
}
/* font settings */
@@ -1328,12 +1708,12 @@
div#body_div {
display: none;
padding-right: 7px;
- width: 900px;
- margin: auto;
- margin-top: 56px;
+ padding-top: 70px;
+ padding-bottom: 50px;
}
.content {
+ margin: auto;
width: 900px;
}
@@ -1344,23 +1724,19 @@
transition: background 1s ease-in;
}
-footer {
- width: 900px;
- margin: auto;
-}
header .container {
width: 900px;
margin: auto;
}
@media (max-width: 1200px) {
- div#body_div, header .container, .content, #opened-page-selector, footer {
+ header .container, .content {
width: 900px;
}
}
@media (min-width: 1200px) {
- div#body_div, header .container, .content, #opened-page-selector, footer {
+ header .container, .content {
width: 1100px;
}
}
@@ -1411,7 +1787,6 @@
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
- margin-bottom: 30px;
overflow: hidden;
}
@@ -1898,7 +2273,6 @@
}
body {
- background: url(../images/redbeech.jpg) repeat;
color: #616161;
}
@@ -1952,12 +2326,13 @@
/*
* erpnext/website/css/website.css
*/
-div#body_div, header .container, .content, #opened-page-selector, footer {
+header .container, .content {
width: 900px;
}
div#body_div {
- margin-top: 90px;
+ padding-top: 90px;
+ min-height: 400px;
}
p, li {
@@ -2016,19 +2391,23 @@
background-color: #444;
}
+
footer {
- color: #777;
+ background-color: #eee;
+ box-shadow: inset 0 10px 10px rgba(0,0,0,0.3), inset 0 3px 3px rgba(0,0,0,0.3);
+ border-top: 1px solid #555;
+ padding-top: 10px;
+ text-align: center;
}
.web-footer {
color: inherit;
- text-align: center;
- margin: 10px;
+ padding: 10px;
line-height: 1.7;
}
.web-footer div, .web-footer a {
- font-size: 14px;
+ font-size: 12px;
}
.web-footer-menu {
@@ -2047,10 +2426,20 @@
border-right: 1px solid #999;
}
+.web-footer-menu ul li:first-child {
+ padding-left: 0px;
+}
+
.web-footer-menu ul li:last-child {
border-right: 0px solid #777 !important;
}
+.web-footer-powered {
+ color: #888;
+ float: right;
+ margin-top: -12px;
+}
+
/* slide view */
.next-slide {
diff --git a/erpnext/accounts/doctype/gl_control/gl_control.py b/erpnext/accounts/doctype/gl_control/gl_control.py
index 84fea75..2edd2dc 100644
--- a/erpnext/accounts/doctype/gl_control/gl_control.py
+++ b/erpnext/accounts/doctype/gl_control/gl_control.py
@@ -198,10 +198,17 @@
# ----------------
def save_entries(self, cancel, adv_adj, update_outstanding):
for le in self.entries:
- # cancel
- if cancel or flt(le.debit) < 0 or flt(le.credit) < 0:
+ #toggle debit, credit if negative entry
+ if flt(le.debit) < 0 or flt(le.credit) < 0:
tmp=le.debit
le.debit, le.credit = abs(flt(le.credit)), abs(flt(tmp))
+
+ # toggled debit/credit in two separate condition because both should be executed at the
+ # time of cancellation when there is negative amount (tax discount)
+ if cancel:
+ tmp=le.debit
+ le.debit, le.credit = abs(flt(le.credit)), abs(flt(tmp))
+
le_obj = get_obj(doc=le)
# validate except on_cancel
diff --git a/erpnext/accounts/doctype/multi_ledger_report/multi_ledger_report.py b/erpnext/accounts/doctype/multi_ledger_report/multi_ledger_report.py
index 88a31f2..79ccfa9 100755
--- a/erpnext/accounts/doctype/multi_ledger_report/multi_ledger_report.py
+++ b/erpnext/accounts/doctype/multi_ledger_report/multi_ledger_report.py
@@ -49,14 +49,14 @@
def add_header(self):
title = 'Ledger Balances Between ' + getdate(self.doc.from_date).strftime('%d-%m-%Y') + ' and ' + getdate(self.doc.to_date).strftime('%d-%m-%Y')
- return [[title], ['Account', 'Opening(Dr)', 'Opening (Cr)', 'Debit', 'Credit', 'Closing(Dr)', 'Closing(Cr)'], ['', '', '', '', '', '', '', 'Posting Date', 'Voucher Type', 'Voucher No', 'Debit', 'Credit', 'Remarks']]
+ return [[title], ['Account', 'Posting Date', 'Voucher Type', 'Voucher No', 'Debit', 'Credit', 'Remarks']]
def get_account_subtree(self, acc):
return sql("""
SELECT
- CONCAT(REPEAT(' ', COUNT(parent.name) - (sub_tree.depth + 1)), node.name) as account,
+ CONCAT(REPEAT(' ', COUNT(parent.name) - (sub_tree.depth + 1)), node.name) as account,
node.lft AS lft, node.rgt AS rgt,
node.debit_or_credit as dr_or_cr, node.group_or_ledger as group_or_ledger, node.is_pl_account as is_pl_account
FROM tabAccount AS node,
@@ -78,7 +78,7 @@
- def show_acc_summary(self, glc, acc_det):
+ def get_acc_summary(self, glc, acc_det):
from_date_year = self.get_year(add_days(self.doc.from_date, -1))
to_date_year = self.get_year(self.doc.to_date)
acc = acc_det['account'].strip()
@@ -104,8 +104,8 @@
if acc_det['dr_or_cr'] == 'Credit':
opening, closing = -1*opening, -1*closing
- return [acc_det['account'], flt(opening>0 and opening or 0), flt(opening<0 and -opening or 0),
- debit, credit, flt(closing>0.01 and closing or 0), flt(closing<-0.01 and -closing or 0)]
+ return flt(opening>0 and opening or 0), flt(opening<0 and -opening or 0), \
+ debit, credit, flt(closing>0.01 and closing or 0), flt(closing<-0.01 and -closing or 0)
def show_gl_entries(self, acc):
@@ -113,7 +113,7 @@
gle = sql("select posting_date, voucher_type, voucher_no, debit, credit, remarks from `tabGL Entry` WHERE account = %s and posting_date >= %s AND posting_date <= %s and ifnull(is_opening, 'No') = 'No' and ifnull(is_cancelled, 'No') = 'No'", (acc, self.doc.from_date, self.doc.to_date), as_dict=1)
entries, dr, cr = [], 0, 0
for d in gle:
- entries.append(['', '', '', '', '', '', '', d['posting_date'], d['voucher_type'], d['voucher_no'], d['debit'], d['credit'], d['remarks']])
+ entries.append(['', d['posting_date'], d['voucher_type'], d['voucher_no'], d['debit'], d['credit'], d['remarks']])
return entries
@@ -133,13 +133,17 @@
sub_tree = self.get_account_subtree(d.account)
for acc_det in sub_tree:
- acc_summary = self.show_acc_summary(glc, acc_det)
- res.append(acc_summary)
-
- # Show gl entries if account is ledger
- if acc_det['group_or_ledger'] == 'Ledger' and (acc_summary[3] or acc_summary[4]):
- gle = self.show_gl_entries(acc_det['account'].strip())
- res += gle
-
+ acc_summary = self.get_acc_summary(glc, acc_det)
+ if acc_summary[0] or acc_summary[1] or acc_summary[2] or acc_summary[3] or acc_summary[4] or acc_summary[5]:
+ res.append([acc_det['account']])
+ # Show gl entries if account is ledger
+ if acc_det['group_or_ledger'] == 'Ledger' and (acc_summary[2] or acc_summary[3]):
+ gle = self.show_gl_entries(acc_det['account'].strip())
+ res += gle
+
+ # Totals
+ res.append(['', '', '', 'Total Debit/Credit', acc_summary[2], acc_summary[3]])
+ res.append(['', '', '', 'Opening Balance', acc_summary[0], acc_summary[1]])
+ res.append(['', '', '', 'Closing Balance', acc_summary[4], acc_summary[5]])
return res
diff --git a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.txt b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.txt
index 666cd1c..18bd789 100755
--- a/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.txt
+++ b/erpnext/accounts/doctype/purchase_invoice/purchase_invoice.txt
@@ -5,7 +5,7 @@
{
'creation': '2012-04-13 11:56:17',
'docstatus': 0,
- 'modified': '2012-04-23 12:08:52',
+ 'modified': '2012-04-27 11:21:21',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -188,20 +188,6 @@
# DocField
{
- 'doctype': u'DocField',
- 'fieldname': u'amended_from',
- 'fieldtype': u'Link',
- 'label': u'Amended From',
- 'no_copy': 1,
- 'oldfieldname': u'amended_from',
- 'oldfieldtype': u'Link',
- 'options': u'Purchase Invoice',
- 'permlevel': 1,
- 'print_hide': 1
- },
-
- # DocField
- {
'colour': u'White:FFF',
'doctype': u'DocField',
'fieldname': u'supplier',
@@ -361,6 +347,20 @@
# DocField
{
+ 'doctype': u'DocField',
+ 'fieldname': u'amended_from',
+ 'fieldtype': u'Link',
+ 'label': u'Amended From',
+ 'no_copy': 1,
+ 'oldfieldname': u'amended_from',
+ 'oldfieldtype': u'Link',
+ 'options': u'Purchase Invoice',
+ 'permlevel': 1,
+ 'print_hide': 1
+ },
+
+ # DocField
+ {
'description': u'The date at which current entry is corrected in the system.',
'doctype': u'DocField',
'fieldname': u'amendment_date',
diff --git a/erpnext/buying/doctype/purchase_order/purchase_order.js b/erpnext/buying/doctype/purchase_order/purchase_order.js
index 33dc481..096fec83 100644
--- a/erpnext/buying/doctype/purchase_order/purchase_order.js
+++ b/erpnext/buying/doctype/purchase_order/purchase_order.js
@@ -60,22 +60,10 @@
if (!cur_frm.cscript.is_onload) cur_frm.cscript.dynamic_label(doc, cdt, cdn);
if(doc.docstatus == 1 && doc.status != 'Stopped'){
- var ch = getchildren('Purchase Order Item',doc.name,'po_details');
- var allow_billing = 0; var allow_receipt = 0;
- cur_frm.add_custom_button('Send SMS', cur_frm.cscript.send_sms);
-
- for(var i in ch){
- if(ch[i].qty > ch[i].received_qty) allow_receipt = 1;
- if(ch[i].qty > ch[i].billed_qty) allow_billing = 1;
- }
- if(allow_receipt)
- cur_frm.add_custom_button('Make Purchase Receipt', cur_frm.cscript['Make Purchase Receipt']);
-
- if(allow_billing)
- cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Purchase Invoice']);
-
- if(allow_billing || allow_receipt)
- cur_frm.add_custom_button('Stop', cur_frm.cscript['Stop Purchase Order']);
+ cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
+ if(doc.per_received < 100) cur_frm.add_custom_button('Make Purchase Receipt', cur_frm.cscript['Make Purchase Receipt']);
+ if(doc.per_billed < 100) cur_frm.add_custom_button('Make Invoice', cur_frm.cscript['Make Purchase Invoice']);
+ if(doc.per_billed < 100 || doc.per_received < 100) cur_frm.add_custom_button('Stop', cur_frm.cscript['Stop Purchase Order']);
}
if(doc.docstatus == 1 && doc.status == 'Stopped')
diff --git a/erpnext/buying/doctype/purchase_request/purchase_request.js b/erpnext/buying/doctype/purchase_request/purchase_request.js
index d20d50a..8e66543 100644
--- a/erpnext/buying/doctype/purchase_request/purchase_request.js
+++ b/erpnext/buying/doctype/purchase_request/purchase_request.js
@@ -46,19 +46,10 @@
//======================= Refresh =====================================
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
-
- // Unhide Fields in Next Steps
- // ---------------------------------
-
cur_frm.clear_custom_buttons();
if(doc.docstatus == 1 && doc.status != 'Stopped'){
- var ch = getchildren('Purchase Request Item',doc.name,'indent_details');
- var is_closed = 1;
- for(var i in ch){
- if(flt(ch[i].qty) > flt(ch[i].ordered_qty)) is_closed = 0;
- }
- if(!is_closed) {
+ if(doc.per_ordered < 100) {
cur_frm.add_custom_button('Make Purchase Order', cur_frm.cscript['Make Purchase Order'])
cur_frm.add_custom_button('Stop Purchase Request', cur_frm.cscript['Stop Purchase Request'])
}
diff --git a/erpnext/patches/april_2012/after_sync_cleanup.py b/erpnext/patches/april_2012/after_sync_cleanup.py
index ab9e70e..33840a0 100644
--- a/erpnext/patches/april_2012/after_sync_cleanup.py
+++ b/erpnext/patches/april_2012/after_sync_cleanup.py
@@ -1,5 +1,5 @@
def execute():
import webnotes
from webnotes.model import delete_doc
-
+ webnotes.conn.sql("update `tabDocType` set module = 'Utilities' where name in ('Question', 'Answer')")
delete_doc('Module Def', 'Knowledge Base')
diff --git a/erpnext/patches/april_2012/change_cacheitem_schema.py b/erpnext/patches/april_2012/change_cacheitem_schema.py
index ab127e3..dc3c253 100644
--- a/erpnext/patches/april_2012/change_cacheitem_schema.py
+++ b/erpnext/patches/april_2012/change_cacheitem_schema.py
@@ -1,3 +1,5 @@
def execute():
import webnotes
+ webnotes.conn.commit()
webnotes.conn.sql("alter table __CacheItem modify `value` longtext")
+ webnotes.conn.begin()
diff --git a/erpnext/patches/april_2012/remove_default_from_rv_detail.py b/erpnext/patches/april_2012/remove_default_from_rv_detail.py
new file mode 100644
index 0000000..cf81f6d
--- /dev/null
+++ b/erpnext/patches/april_2012/remove_default_from_rv_detail.py
@@ -0,0 +1,3 @@
+def execute():
+ import webnotes
+ webnotes.conn.sql("update `tabDocField` set `default` = '' where fieldname = 'cost_center' and parent = 'RV Detail' and `default` = 'Purchase - TC'")
diff --git a/erpnext/patches/april_2012/serial_no_fixes.py b/erpnext/patches/april_2012/serial_no_fixes.py
new file mode 100644
index 0000000..b4fcf75
--- /dev/null
+++ b/erpnext/patches/april_2012/serial_no_fixes.py
@@ -0,0 +1,6 @@
+def execute():
+ import webnotes
+ from webnotes.modules.module_manager import reload_doc
+ reload_doc('stock', 'doctype', 'serial_no')
+
+ webnotes.conn.sql("update `tabSerial No` set sle_exists = 1")
diff --git a/erpnext/patches/april_2012/update_appraisal_permission.py b/erpnext/patches/april_2012/update_appraisal_permission.py
new file mode 100644
index 0000000..bd4578f
--- /dev/null
+++ b/erpnext/patches/april_2012/update_appraisal_permission.py
@@ -0,0 +1,14 @@
+def execute():
+ import webnotes
+ from webnotes.model.doc import addchild
+ from webnotes.model.code import get_obj
+
+ webnotes.conn.sql("delete from `tabDocPerm` where role = 'All' and permlevel = 0 and parent in ('Appraisal', 'Ticket', 'Project')")
+
+ appr = get_obj('DocType', 'Appraisal', with_children=1)
+ ch = addchild(appr.doc, 'permissions', 'DocPerm', 0)
+ ch.permlevel = 0
+ ch.role = 'Employee'
+ ch.read = 1
+ ch.write = 1
+ ch.save()
diff --git a/erpnext/patches/april_2012/update_permlevel_in_address.py b/erpnext/patches/april_2012/update_permlevel_in_address.py
new file mode 100644
index 0000000..f8deb2c
--- /dev/null
+++ b/erpnext/patches/april_2012/update_permlevel_in_address.py
@@ -0,0 +1,3 @@
+def execute():
+ import webnotes
+ webnotes.conn.sql("update `tabDocPerm` set permlevel = 0 where parent = 'Address'")
diff --git a/erpnext/patches/april_2012/update_role_in_address.py b/erpnext/patches/april_2012/update_role_in_address.py
new file mode 100644
index 0000000..6917da4
--- /dev/null
+++ b/erpnext/patches/april_2012/update_role_in_address.py
@@ -0,0 +1,21 @@
+def execute():
+ import webnotes
+ from webnotes.model.doc import addchild
+ from webnotes.model.code import get_obj
+
+ webnotes.conn.sql("delete from `tabDocPerm` where role = 'All' and parent = 'Address'")
+
+ role1 = ['Sales User', 'Purchase User', 'Accounts User', 'Maintenance User']
+ role2 = ['Sales Manager', 'Sales Master Manager', 'Purchase Manager', 'Purchase Master Manager', 'Accounts Manager', 'Maintenance Manager']
+
+ addr = get_obj('DocType', 'Address', with_children=1)
+ for d in role1+role2:
+ ch = addchild(addr.doc, 'permissions', 'DocPerm', 0)
+ ch.role = d
+ ch.read = 1
+ ch.write = 1
+ ch.create = 1
+ if d in role2:
+ ch.cancel = 1
+
+ ch.save()
diff --git a/erpnext/patches/patch_list.py b/erpnext/patches/patch_list.py
index 7d8a095..e0f9ea3 100644
--- a/erpnext/patches/patch_list.py
+++ b/erpnext/patches/patch_list.py
@@ -282,4 +282,30 @@
'patch_file': 'change_cacheitem_schema',
'description': 'Modified datatype of `value` column from text to longtext'
},
+ {
+ 'patch_module': 'patches.april_2012',
+ 'patch_file': 'remove_default_from_rv_detail',
+ 'description': ''
+ },
+ {
+ 'patch_module': 'patches.april_2012',
+ 'patch_file': 'update_role_in_address',
+ 'description': 'updated roles in address'
+ },
+ {
+ 'patch_module': 'patches.april_2012',
+ 'patch_file': 'update_permlevel_in_address',
+ 'description': 'updated permlevel in address'
+ },
+ {
+ 'patch_module': 'patches.april_2012',
+ 'patch_file': 'update_appraisal_permission',
+ 'description': 'updated permission in appraisal'
+ },
+ {
+ 'patch_module': 'patches.april_2012',
+ 'patch_file': 'serial_no_fixes',
+ 'description': 'fixes for sle creation while import'
+ },
+
]
diff --git a/erpnext/setup/doctype/notification_control/notification_control.js b/erpnext/setup/doctype/notification_control/notification_control.js
index 32919b6..5512697 100644
--- a/erpnext/setup/doctype/notification_control/notification_control.js
+++ b/erpnext/setup/doctype/notification_control/notification_control.js
@@ -14,19 +14,19 @@
// You should have received a copy of the GNU General Public License
// along with this program. If not, see <http://www.gnu.org/licenses/>.
-cur_frm.cscript.select_transaction = function(doc, dt, dn) {
+cur_frm.cscript.select_transaction = function(doc, cdt, cdn) {
if(doc.select_transaction) {
var callback = function(r,rt) {
- var doc = locals[dt][dn];
+ var doc = locals[cdt][cdn];
doc.custom_message = r.message;
refresh_field('custom_message');
}
- $c_obj('Notification Control','get_message',doc.select_transaction, callback)
+ $c_obj(make_doclist(cdt, cdn),'get_message',doc.select_transaction, callback)
}
}
cur_frm.cscript.notify = function(doc, args) {
- $c_obj('Notification Control', 'get_formatted_message', {
+ $c_obj(make_doclist(doc.doctype, doc.name), 'get_formatted_message', {
type: args['type'],
doctype: args['doctype'],
contact_name: args['contact_name'] || doc.contact_display
diff --git a/erpnext/setup/doctype/notification_control/notification_control.py b/erpnext/setup/doctype/notification_control/notification_control.py
index 650486e..2a21e80 100644
--- a/erpnext/setup/doctype/notification_control/notification_control.py
+++ b/erpnext/setup/doctype/notification_control/notification_control.py
@@ -39,7 +39,7 @@
# set custom text
# ---------------
- def set_message(self, arg=''):
+ def set_message(self, arg = ''):
fn = self.doc.select_transaction.lower().replace(' ', '_') + '_message'
webnotes.conn.set(self.doc, fn, self.doc.custom_message)
msgprint("Custom Message for %s updated!" % self.doc.select_transaction)
diff --git a/erpnext/startup/startup.css b/erpnext/startup/startup.css
index 47f188b..490b2f4 100644
--- a/erpnext/startup/startup.css
+++ b/erpnext/startup/startup.css
@@ -13,7 +13,6 @@
}
body {
- background: url(../images/redbeech.jpg) repeat;
color: #616161;
}
diff --git a/erpnext/startup/startup.js b/erpnext/startup/startup.js
index c96a6a8..23a02cf 100644
--- a/erpnext/startup/startup.js
+++ b/erpnext/startup/startup.js
@@ -188,7 +188,7 @@
}
erpnext.set_user_background = function(src) {
- set_style(repl('body { background: url("files/%(src)s") repeat;}', {src:src}))
+ set_style(repl('#body_div { background: url("files/%(src)s") repeat;}', {src:src}))
}
// start
diff --git a/erpnext/stock/doctype/bin/bin.py b/erpnext/stock/doctype/bin/bin.py
index a6fc1c4..f645e8f 100644
--- a/erpnext/stock/doctype/bin/bin.py
+++ b/erpnext/stock/doctype/bin/bin.py
@@ -44,6 +44,7 @@
def update_stock(self, actual_qty=0, reserved_qty=0, ordered_qty=0, indented_qty=0, planned_qty=0, dt=None, sle_id='', posting_time='', serial_no = '', is_cancelled = 'No',doc_type='',doc_name='',is_amended='No'):
if not dt:
dt = nowdate()
+
# update the stock values (for current quantities)
self.doc.actual_qty = flt(self.doc.actual_qty) + flt(actual_qty)
self.doc.ordered_qty = flt(self.doc.ordered_qty) + flt(ordered_qty)
@@ -295,7 +296,7 @@
order by timestamp(posting_date, posting_time) asc, name asc""", \
(self.doc.item_code, self.doc.warehouse, \
prev_sle.get('posting_date','1900-01-01'), prev_sle.get('posting_time', '12:00')), as_dict = 1)
- for sle in sll:
+ for sle in sll:
# block if stock level goes negative on any date
if val_method != 'Moving Average' or flt(allow_negative_stock) == 0:
self.validate_negative_stock(cqty, sle)
diff --git a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
index 8761881..e32439c 100644
--- a/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
+++ b/erpnext/stock/doctype/purchase_receipt/purchase_receipt.js
@@ -63,13 +63,8 @@
if(doc.docstatus == 1){
- var ch = getchildren('Purchase Receipt Item',doc.name,'purchase_receipt_details');
- allow_billing = 0;
- for(var i in ch){
- if(ch[i].qty > ch[i].billed_qty) allow_billing = 1;
- }
- cur_frm.add_custom_button('Make Purchase Invoice', cur_frm.cscript['Make Purchase Invoice']);
- cur_frm.add_custom_button('Send SMS', cur_frm.cscript.send_sms);
+ if (doc.per_billed < 100) cur_frm.add_custom_button('Make Purchase Invoice', cur_frm.cscript['Make Purchase Invoice']);
+ cur_frm.add_custom_button('Send SMS', cur_frm.cscript['Send SMS']);
}
}
diff --git a/erpnext/stock/doctype/sales_bom/sales_bom.py b/erpnext/stock/doctype/sales_bom/sales_bom.py
index ae3378e..f292164 100644
--- a/erpnext/stock/doctype/sales_bom/sales_bom.py
+++ b/erpnext/stock/doctype/sales_bom/sales_bom.py
@@ -67,7 +67,7 @@
msgprint("Sales Bom Item " + d.item_code +" cannot be child item.")
raise Exception
# Check if is_main_item is modified once saved
- if not self.doc.fields.get('__islocal') and d.is_main_item == "Yes" and cstr(d.item_code) != cstr(self.doc.name)[:-3] :
+ if not self.doc.fields.get('__islocal') and d.is_main_item == "Yes" and cstr(d.item_code) != cstr(self.doc.new_item_code)[:-3] :
msgprint("Modifying the main item is not allowed.")
raise Exception
if len(is_main_item) > 1:
@@ -165,19 +165,18 @@
return
# get all Sales BOM that have the first item
- sbl = sql("select distinct parent from `tabSales BOM Item` where item_code=%s", il[0].item_code)
+ sbl = sql("select distinct parent from `tabSales BOM Item` where item_code=%s and parent != %s and docstatus != 2", (il[0].item_code, self.doc.name))
# check all siblings
sub_items = [[d.item_code, flt(d.qty)] for d in il]
for s in sbl:
- if not cstr(s[0]) == cstr(self.doc.name) :
- t = sql("select item_code, qty from `tabSales BOM Item` where parent=%s", s[0])
- t = [[d[0], flt(d[1])] for d in t]
+ t = sql("select item_code, qty from `tabSales BOM Item` where parent=%s and docstatus != 2", s[0])
+ t = [[d[0], flt(d[1])] for d in t]
- if self.has_same_items(sub_items, t):
- msgprint("%s has the same Sales BOM details" % s[0])
- raise Exception
+ if self.has_same_items(sub_items, t):
+ msgprint("%s has the same Sales BOM details" % s[0])
+ raise Exception
if finder:
msgprint("There is no Sales BOM present with the following Combination.")
diff --git a/erpnext/stock/doctype/sales_bom/sales_bom.txt b/erpnext/stock/doctype/sales_bom/sales_bom.txt
index 476a319..dfc2a65 100644
--- a/erpnext/stock/doctype/sales_bom/sales_bom.txt
+++ b/erpnext/stock/doctype/sales_bom/sales_bom.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-04-23 16:00:21',
+ 'creation': '2012-04-26 13:04:56',
'docstatus': 0,
- 'modified': '2012-04-24 15:07:42',
+ 'modified': '2012-04-27 11:00:18',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -15,7 +15,6 @@
'_last_update': u'1322549701',
'allow_trash': 1,
'colour': u'White:FFF',
- 'default_print_format': u'Standard',
'doctype': 'DocType',
'document_type': u'Master',
'is_submittable': 1,
@@ -127,6 +126,24 @@
# DocField
{
'doctype': u'DocField',
+ 'fieldname': u'basic_section',
+ 'fieldtype': u'Section Break',
+ 'label': u'Basic Section',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'col1',
+ 'fieldtype': u'Column Break',
+ 'permlevel': 0,
+ 'width': u'50%'
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
'fieldname': u'new_item_code',
'fieldtype': u'Data',
'label': u'New Item Code',
@@ -176,6 +193,15 @@
# DocField
{
'doctype': u'DocField',
+ 'fieldname': u'col2',
+ 'fieldtype': u'Column Break',
+ 'permlevel': 0,
+ 'width': u'50%'
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
'fieldname': u'item_group',
'fieldtype': u'Link',
'label': u'Item Group',
@@ -188,6 +214,18 @@
# DocField
{
+ 'doctype': u'DocField',
+ 'fieldname': u'stock_uom',
+ 'fieldtype': u'Link',
+ 'label': u'Stock UOM',
+ 'oldfieldname': u'stock_uom',
+ 'oldfieldtype': u'Link',
+ 'options': u'UOM',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
'colour': u'White:FFF',
'doctype': u'DocField',
'fieldname': u'price_list',
@@ -216,42 +254,6 @@
# DocField
{
- 'colour': u'White:FFF',
- 'doctype': u'DocField',
- 'fieldname': u'find_sales_bom',
- 'fieldtype': u'Button',
- 'label': u'Find Sales BOM',
- 'oldfieldtype': u'Button',
- 'permlevel': 0,
- 'trigger': u'Client'
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'sales_bom_items',
- 'fieldtype': u'Table',
- 'label': u'Sales BOM Items',
- 'oldfieldname': u'sales_bom_items',
- 'oldfieldtype': u'Table',
- 'options': u'Sales BOM Item',
- 'permlevel': 0
- },
-
- # DocField
- {
- 'doctype': u'DocField',
- 'fieldname': u'stock_uom',
- 'fieldtype': u'Link',
- 'label': u'Stock UOM',
- 'oldfieldname': u'stock_uom',
- 'oldfieldtype': u'Link',
- 'options': u'UOM',
- 'permlevel': 0
- },
-
- # DocField
- {
'depends_on': u'eval:doc.amended_from',
'description': u'The date at which current entry is corrected in the system.',
'doctype': u'DocField',
@@ -270,13 +272,46 @@
'fieldtype': u'Link',
'label': u'Amended From',
'no_copy': 1,
- 'options': u'Sales Invoice',
+ 'options': u'Sales BOM',
'permlevel': 1,
'print_hide': 1
},
# DocField
{
+ 'colour': u'White:FFF',
+ 'doctype': u'DocField',
+ 'fieldname': u'find_sales_bom',
+ 'fieldtype': u'Button',
+ 'label': u'Find Sales BOM',
+ 'oldfieldtype': u'Button',
+ 'permlevel': 0,
+ 'trigger': u'Client'
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'item_section',
+ 'fieldtype': u'Section Break',
+ 'label': u'Items',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'sales_bom_items',
+ 'fieldtype': u'Table',
+ 'label': u'Sales BOM Items',
+ 'oldfieldname': u'sales_bom_items',
+ 'oldfieldtype': u'Table',
+ 'options': u'Sales BOM Item',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
'doctype': u'DocField',
'fieldname': u'trash_reason',
'fieldtype': u'Small Text',
diff --git a/erpnext/stock/doctype/serial_no/serial_no.py b/erpnext/stock/doctype/serial_no/serial_no.py
index 2384171..88f1bf2 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.py
+++ b/erpnext/stock/doctype/serial_no/serial_no.py
@@ -71,10 +71,13 @@
self.validate_warehouse()
self.validate_item()
+ def on_update(self):
+ if self.doc.warehouse and self.doc.status == 'In Store' and cint(self.doc.sle_exists) == 0 and \
+ not sql("select name from `tabStock Ledger Entry` where serial_no = %s and ifnull(is_cancelled, 'No') = 'No'", self.doc.name):
+ self.make_stock_ledger_entry(1)
+ webnotes.conn.set(self.doc, 'sle_exists', 1)
- # ------------------------
- # make stock ledger entry
- # ------------------------
+
def make_stock_ledger_entry(self, qty):
from webnotes.model.code import get_obj
values = [{
@@ -91,21 +94,13 @@
'incoming_rate' : self.doc.purchase_rate,
'company' : self.doc.company,
'fiscal_year' : self.doc.fiscal_year,
- 'is_cancelled' : 'No', # is_cancelled is always 'No' because while deleted it can not find creation entry if it not created directly, voucher no != serial no.
+ 'is_cancelled' : 'No', # is_cancelled is always 'No' because while deleted it can not find creation entry if it not created directly, voucher no != serial no
'batch_no' : '',
'serial_no' : self.doc.name
}]
get_obj('Stock Ledger', 'Stock Ledger').update_stock(values)
- # ----------
- # on update
- # ----------
- def on_update(self):
- if self.doc.localname and self.doc.warehouse and self.doc.status == 'In Store' and not sql("select name from `tabStock Ledger Entry` where serial_no = '%s' and ifnull(is_cancelled, 'No') = 'No'" % (self.doc.name)):
- self.make_stock_ledger_entry(1)
-
-
# ---------
# on trash
# ---------
diff --git a/erpnext/stock/doctype/serial_no/serial_no.txt b/erpnext/stock/doctype/serial_no/serial_no.txt
index aa0ea66..8e32243 100644
--- a/erpnext/stock/doctype/serial_no/serial_no.txt
+++ b/erpnext/stock/doctype/serial_no/serial_no.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-03-27 14:36:37',
+ 'creation': '2012-04-23 16:00:23',
'docstatus': 0,
- 'modified': '2012-03-27 14:36:37',
+ 'modified': '2012-04-26 13:01:57',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -13,6 +13,7 @@
# These values are common for all DocType
{
'_last_update': u'1325570647',
+ 'allow_attach': 1,
'allow_trash': 1,
'autoname': u'field:serial_no',
'colour': u'White:FFF',
@@ -27,7 +28,7 @@
'show_in_menu': 0,
'subject': u'Item Code: %(item_code)s, Warehouse: %(warehouse)s',
'tag_fields': u'status',
- 'version': 191
+ 'version': 1
},
# These values are common for all DocField
@@ -57,6 +58,54 @@
# DocPerm
{
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 1,
+ 'role': u'Material Manager',
+ 'submit': 0,
+ 'write': 0
+ },
+
+ # DocPerm
+ {
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 0,
+ 'role': u'Material Manager',
+ 'submit': 0,
+ 'write': 0
+ },
+
+ # DocPerm
+ {
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 1,
+ 'role': u'Material User',
+ 'submit': 0,
+ 'write': 0
+ },
+
+ # DocPerm
+ {
+ 'amend': 0,
+ 'cancel': 0,
+ 'create': 0,
+ 'doctype': u'DocPerm',
+ 'permlevel': 0,
+ 'role': u'Material User',
+ 'submit': 0,
+ 'write': 0
+ },
+
+ # DocPerm
+ {
'cancel': 1,
'create': 1,
'doctype': u'DocPerm',
@@ -89,54 +138,6 @@
'role': u'Sales Master Manager'
},
- # DocPerm
- {
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 1,
- 'role': u'Material Manager',
- 'submit': 0,
- 'write': 0
- },
-
- # DocPerm
- {
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 0,
- 'role': u'Material Manager',
- 'submit': 0,
- 'write': 0
- },
-
- # DocPerm
- {
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 1,
- 'role': u'Material User',
- 'submit': 0,
- 'write': 0
- },
-
- # DocPerm
- {
- 'amend': 0,
- 'cancel': 0,
- 'create': 0,
- 'doctype': u'DocPerm',
- 'permlevel': 0,
- 'role': u'Material User',
- 'submit': 0,
- 'write': 0
- },
-
# DocField
{
'doctype': u'DocField',
@@ -700,5 +701,30 @@
'oldfieldname': u'trash_reason',
'oldfieldtype': u'Small Text',
'permlevel': 1
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'file_list',
+ 'fieldtype': u'Text',
+ 'hidden': 1,
+ 'label': u'File List',
+ 'no_copy': 1,
+ 'permlevel': 0,
+ 'print_hide': 1
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
+ 'fieldname': u'sle_exists',
+ 'fieldtype': u'Check',
+ 'hidden': 1,
+ 'label': u'SLE Exists',
+ 'no_copy': 1,
+ 'permlevel': 1,
+ 'print_hide': 1,
+ 'report_hide': 1
}
]
\ No newline at end of file
diff --git a/erpnext/stock/doctype/stock_ledger/stock_ledger.py b/erpnext/stock/doctype/stock_ledger/stock_ledger.py
index 577d2ef..1d3aabe 100644
--- a/erpnext/stock/doctype/stock_ledger/stock_ledger.py
+++ b/erpnext/stock/doctype/stock_ledger/stock_ledger.py
@@ -128,6 +128,7 @@
s.modified = nowdate()
s.modified_by = session['user']
s.serial_no = serial_no
+ s.sle_exists = 1
s.fiscal_year = obj.doc.fiscal_year
s.company = obj.doc.company
s.save(new_rec)
@@ -211,7 +212,7 @@
import datetime
for d in getlist(obj.doclist, fname):
if d.serial_no:
- serial_nos = self.get_sr_no_list(d.serial_no, d.qty)
+ serial_nos = self.get_sr_no_list(d.serial_no)
for a in serial_nos:
serial_no = a.strip()
if is_incoming:
diff --git a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
index bb23226..cf3bd2f 100644
--- a/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
+++ b/erpnext/stock/doctype/stock_ledger_entry/stock_ledger_entry.py
@@ -35,11 +35,14 @@
def actual_amt_check(self):
if self.doc.batch_no:
batch_bal = flt(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])
-
+ self.doc.fields.update({'batch_bal': batch_bal})
+
if (batch_bal + self.doc.actual_qty) < 0:
msgprint("""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>
- as on %(posting_date)s %(posting_time)s""" % self.doc.fields.update({'batch_bal': batch_bal}), raise_exception = 1)
+ as on %(posting_date)s %(posting_time)s""" % self.doc.fields, raise_exception = 1)
+
+ self.doc.fields.pop('batch_bal')
# mandatory
@@ -89,9 +92,17 @@
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)
+ def validate_posting_time(self):
+ """ Validate posting time format"""
+ if self.doc.posting_time and len(cstr(self.doc.posting_time)) == 8 and cstr(self.doc.posting_time)[-2:] != '00':
+ msgprint("Wrong format of posting time, can not complete the transaction. If you think \
+ you entered posting time correctly, please contact ERPNext support team.")
+ raise Exception
+
def validate(self):
self.validate_mandatory()
+ self.validate_posting_time()
self.validate_item()
self.actual_amt_check()
self.check_stock_frozen_date()
diff --git a/erpnext/stock/search_criteria/stock_report/stock_report.js b/erpnext/stock/search_criteria/stock_report/stock_report.js
index 5451eb1..d08d1e7 100644
--- a/erpnext/stock/search_criteria/stock_report/stock_report.js
+++ b/erpnext/stock/search_criteria/stock_report/stock_report.js
@@ -19,7 +19,7 @@
this.mytabs.items['Select Columns'].hide()
this.mytabs.items['More Filters'].hide()
this.hide_all_filters();
- this.add_filter({fieldname:'based_on', label:'Based On', fieldtype:'Select', options:'Warehouse'+NEWLINE+'Item Code',report_default:'Warehouse',ignore : 1,parent:'Stock Ledger Entry'});
+ this.add_filter({fieldname:'based_on', label:'Based On', fieldtype:'Select', options:'Warehouse'+NEWLINE+'Item Code',ignore : 1,parent:'Stock Ledger Entry'});
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'To Posting Date'].df.filter_hide = 0;
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'Item Code'].df.filter_hide = 0;
this.filter_fields_dict['Stock Ledger Entry'+FILTER_SEP +'Warehouse'].df.filter_hide = 0;
@@ -57,8 +57,8 @@
ware_type_cond = repl(' AND `tabWarehouse`.warehouse_type IN (%(war)s)', {war: war.substr(0,war.length-1)})
}
- if(based_on.length == 1){
- if(based_on == 'Item Code'){
+ if(based_on.length == 1 && based_on[0]){
+ if(based_on[0] == 'Item Code'){
cols = '`tabItem`.name AS "Item Code", `tabItem`.item_name AS "Item Name", `tabItem`.description AS "Description", `tabItem`.stock_uom AS "Stock UOM"';
cond = '(IFNULL(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` = "0000-00-00" OR `tabItem`.`end_of_life` > NOW()) AND `tabItem`.is_stock_item = "Yes"';
if(item_code) cond += repl(' AND `tabItem`.name = %(item)s', {item:'"'+item_code+'"'});
@@ -66,7 +66,7 @@
tables = '`tabItem`';
group_by = '`tabStock Ledger Entry`.item_code';
}
- else if(based_on == 'Warehouse'){
+ else if(based_on[0] == 'Warehouse'){
cols = '`tabWarehouse`.name AS "Warehouse", `tabWarehouse`.warehouse_type AS "Warehouse Type"';
cond = '`tabWarehouse`.docstatus < 2'
if(warehouse) cond += repl(' AND `tabWarehouse`.name = %(warehouse)s', {warehouse:'"'+warehouse+'"'});
@@ -74,8 +74,7 @@
tables = '`tabWarehouse`';
group_by = '`tabStock Ledger Entry`.warehouse';
}
- }
- else if(based_on.length == 2){
+ } else {
cols = '`tabItem`.name AS "Item Code", `tabItem`.item_name AS "Item Name", `tabItem`.description AS "Description", `tabItem`.stock_uom AS "Stock UOM", `tabWarehouse`.name AS "Warehouse", `tabWarehouse`.warehouse_type AS "Warehouse Type"';
cond = '(IFNULL(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` = "0000-00-00" OR `tabItem`.`end_of_life` > NOW()) AND `tabItem`.is_stock_item = "Yes" AND `tabWarehouse`.docstatus < 2';
if(item_code) cond += repl(" AND `tabItem`.name = %(item)s", {item:"'"+item_code+"'"});
@@ -87,4 +86,4 @@
q = repl("SELECT %(cols)s FROM %(tables)s, `tabStock Ledger Entry` WHERE %(cond)s %(date_cond)s GROUP BY %(group_by)s", {cols:cols, tables:tables, cond:cond, date_cond:date_cond, group_by:group_by});
return q;
-}
\ No newline at end of file
+}
diff --git a/erpnext/stock/search_criteria/stock_report/stock_report.py b/erpnext/stock/search_criteria/stock_report/stock_report.py
index 84866e9..b87f684 100644
--- a/erpnext/stock/search_criteria/stock_report/stock_report.py
+++ b/erpnext/stock/search_criteria/stock_report/stock_report.py
@@ -14,19 +14,16 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-if not filter_values.get('based_on'):
- msgprint("Please Select Based On")
- raise Exception
cols, columns = [], []
# Add columns
# ------------
based_on = filter_values.get('based_on').split(NEWLINE)
-if len(based_on) == 1:
+if len(based_on) == 1 and based_on[0]:
if based_on[0] == 'Item Code':
cols = ["Item Code", "Item Name", "Description", "Stock UOM"]
elif based_on[0] == 'Warehouse':
cols = ["Warehouse", "Warehouse Type"]
-elif len(based_on) == 2:
+else:
cols = ["Item Code", "Item Name", "Description", "Stock UOM", "Warehouse", "Warehouse Type"]
for d in cols:
@@ -65,7 +62,7 @@
cl_bal,tot_stock = 0,0
for r in res:
- if len(based_on) == 1:
+ if len(based_on) == 1 and based_on[0]:
if based_on[0] == 'Item Code': closing_balance, stock_value = get_values(msgprint, flt, posting_date, item_code = r[col_idx['Item Code']])
elif based_on[0] == 'Warehouse': closing_balance, stock_value = get_values(msgprint, flt, posting_date, warehouse = r[col_idx['Warehouse']])
r.append(closing_balance)
diff --git a/erpnext/website/css/website.css b/erpnext/website/css/website.css
index ad8702a..fa27d4a 100644
--- a/erpnext/website/css/website.css
+++ b/erpnext/website/css/website.css
@@ -1,9 +1,10 @@
-div#body_div, header .container, .content, #opened-page-selector, footer {
+header .container, .content {
width: 900px;
}
div#body_div {
- margin-top: 90px;
+ padding-top: 90px;
+ min-height: 400px;
}
p, li {
@@ -62,19 +63,23 @@
background-color: #444;
}
+
footer {
- color: #777;
+ background-color: #eee;
+ box-shadow: inset 0 10px 10px rgba(0,0,0,0.3), inset 0 3px 3px rgba(0,0,0,0.3);
+ border-top: 1px solid #555;
+ padding-top: 10px;
+ text-align: center;
}
.web-footer {
color: inherit;
- text-align: center;
- margin: 10px;
+ padding: 10px;
line-height: 1.7;
}
.web-footer div, .web-footer a {
- font-size: 14px;
+ font-size: 12px;
}
.web-footer-menu {
@@ -93,10 +98,20 @@
border-right: 1px solid #999;
}
+.web-footer-menu ul li:first-child {
+ padding-left: 0px;
+}
+
.web-footer-menu ul li:last-child {
border-right: 0px solid #777 !important;
}
+.web-footer-powered {
+ color: #888;
+ float: right;
+ margin-top: -12px;
+}
+
/* slide view */
.next-slide {
diff --git a/erpnext/website/doctype/blog/blog.py b/erpnext/website/doctype/blog/blog.py
index 1f1b98b..c78a9cc 100644
--- a/erpnext/website/doctype/blog/blog.py
+++ b/erpnext/website/doctype/blog/blog.py
@@ -32,9 +32,11 @@
self.doc.name = website.utils.page_name(self.doc.title)
def validate(self):
- """write/update 'Page' with the blog"""
+ """write/update 'Page' with the blog"""
+ if self.doc.page_name:
+ webnotes.conn.sql("""delete from tabPage where name=%s""", self.doc.page_name)
+
p = website.utils.add_page(self.doc.title)
- self.doc.name = p.name
from jinja2 import Template
import markdown2
@@ -54,11 +56,11 @@
p.save()
website.utils.add_guest_access_to_page(p.name)
+ self.doc.page_name = p.name
# cleanup
for f in ['content_html', 'full_name', 'updated']:
if f in self.doc.fields:
- del self.doc.fields[f]
-
+ del self.doc.fields[f]
\ No newline at end of file
diff --git a/erpnext/website/doctype/blog/blog.txt b/erpnext/website/doctype/blog/blog.txt
index f9ff6fd..ad44d13 100644
--- a/erpnext/website/doctype/blog/blog.txt
+++ b/erpnext/website/doctype/blog/blog.txt
@@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
- 'creation': '2012-03-27 14:36:47',
+ 'creation': '2012-04-02 16:02:43',
'docstatus': 0,
- 'modified': '2012-03-27 14:36:47',
+ 'modified': '2012-04-26 16:58:27',
'modified_by': u'Administrator',
'owner': u'Administrator'
},
@@ -21,7 +21,7 @@
'name': '__common__',
'section_style': u'Simple',
'show_in_menu': 0,
- 'version': 3
+ 'version': 5
},
# These values are common for all DocField
@@ -35,15 +35,12 @@
# These values are common for all DocPerm
{
- 'create': 1,
'doctype': u'DocPerm',
'name': '__common__',
'parent': u'Blog',
'parentfield': u'permissions',
'parenttype': u'DocType',
- 'permlevel': 0,
- 'read': 1,
- 'write': 1
+ 'read': 1
},
# DocType, Blog
@@ -54,14 +51,27 @@
# DocPerm
{
+ 'create': 1,
'doctype': u'DocPerm',
- 'role': u'Website Manager'
+ 'permlevel': 0,
+ 'role': u'Website Manager',
+ 'write': 1
+ },
+
+ # DocPerm
+ {
+ 'create': 1,
+ 'doctype': u'DocPerm',
+ 'permlevel': 0,
+ 'role': u'Blogger',
+ 'write': 1
},
# DocPerm
{
'doctype': u'DocPerm',
- 'role': u'Blogger'
+ 'permlevel': 1,
+ 'role': u'All'
},
# DocField
@@ -70,7 +80,8 @@
'fieldname': u'title',
'fieldtype': u'Data',
'label': u'Title',
- 'permlevel': 0
+ 'permlevel': 0,
+ 'reqd': 1
},
# DocField
@@ -88,7 +99,8 @@
'fieldname': u'content',
'fieldtype': u'Code',
'label': u'Content',
- 'permlevel': 0
+ 'permlevel': 0,
+ 'reqd': 0
},
# DocField
@@ -96,13 +108,22 @@
'doctype': u'DocField',
'fieldname': u'content_html',
'fieldtype': u'Text',
- 'label': u'Preview',
+ 'label': u'Content HTML',
'permlevel': 1
},
# DocField
{
'doctype': u'DocField',
+ 'fieldname': u'page_name',
+ 'fieldtype': u'Data',
+ 'label': u'Page Name',
+ 'permlevel': 0
+ },
+
+ # DocField
+ {
+ 'doctype': u'DocField',
'fieldname': u'file_list',
'fieldtype': u'Text',
'hidden': 1,
diff --git a/erpnext/website/doctype/blog/blog_page.js b/erpnext/website/doctype/blog/blog_page.js
index aa3f4c5..dddc6e0 100644
--- a/erpnext/website/doctype/blog/blog_page.js
+++ b/erpnext/website/doctype/blog/blog_page.js
@@ -18,32 +18,28 @@
pscript['onload_{{ doc.name }}'] = function(wrapper) {
// sidebar
- var side = $(wrapper).find('.web-side-section')
- .append('<h4>Recent Posts</h4>').get(0);
-
wrapper.recent_list = new wn.ui.Listing({
- parent: side,
+ parent: $(wrapper).find('.recent-posts'),
+ no_toolbar: true,
query: 'select name, title, left(content, 100) as content from tabBlog\
- where ifnull(published,1)=1',
+ where ifnull(published,0)=1 and name!="{{ doc.name }}" order by modified desc',
hide_refresh: true,
render_row: function(parent, data) {
- if(data.content.length==100) data.content += '...';
+ console.log(data);
+ if(data.content && data.content.length==100) data.content += '...';
parent.innerHTML = repl('<a href="#!%(name)s">%(title)s</a>\
<div class="comment">%(content)s</div><br>', data);
},
- page_length: 5
+ page_length: 5,
});
wrapper.recent_list.run();
-
-
- // comments
- $(wrapper).find('.web-main-section').append('<hr><h3>Comments</h3>');
-
+
wrapper.comment_list = new wn.ui.Listing({
- parent: $(wrapper).find('.web-main-section').get(0),
+ parent: $(wrapper).find('.blog-comments').get(0),
+ no_toolbar: true,
query: 'select comment, comment_by_fullname, modified\
from `tabComment` where comment_doctype="Page"\
- and comment_docname="{{ doc.name }}"',
+ and comment_docname="{{ doc.name }}" order by modified desc',
no_result_message: 'Be the first one to comment',
render_row: function(parent, data) {
data.comment_date = prettyDate(data.modified);
@@ -57,7 +53,7 @@
wrapper.comment_list.run();
// add comment
- $(wrapper).find('.web-main-section').append('<br><button class="btn add-comment">\
+ $(wrapper).find('.layout-main-section').append('<br><button class="btn add-comment">\
Add Comment</button>');
$(wrapper).find('button.add-comment').click(function(){
d = new wn.widgets.Dialog({
diff --git a/erpnext/website/doctype/blog/template.html b/erpnext/website/doctype/blog/template.html
index 467f301..688ffac 100644
--- a/erpnext/website/doctype/blog/template.html
+++ b/erpnext/website/doctype/blog/template.html
@@ -1,14 +1,18 @@
<div class="layout-wrapper layout-wrapper-background">
<div class="web-content" id="blog-{{ doc.name }}">
<div class="layout-main-section">
- <h1>Blog</h1>
- <h3>{{ doc.title }}</h3>
+ <h2>{{ doc.title }}</h2>
<div class="help">By {{ doc.full_name }} on {{ doc.updated }}</div>
<br>
{{ doc.content_html }}
+ <hr><h3>Comments</h3>
+ <br>
+ <div class="blog-comments"></div>
</div>
<div class="layout-side-section">
<p><a href="#!blog">All Blogs</a></p>
+ <h4>Recent Posts</h4>
+ <div class="recent-posts" style="min-height: 100px;"></div>
<h4>Subscribe</h4>
<p>
<img src="images/feed.png" style="margin-right: 4px; margin-bottom: -4px">
diff --git a/erpnext/website/doctype/style_settings/custom_template.css b/erpnext/website/doctype/style_settings/custom_template.css
index 8c987f8..4866ac7 100644
--- a/erpnext/website/doctype/style_settings/custom_template.css
+++ b/erpnext/website/doctype/style_settings/custom_template.css
@@ -1,4 +1,4 @@
-body {
+#body_div {
{% if doc.background_image %}
background: url("files/{{ doc.background_image }}") repeat;
{% elif doc.background_color %}
diff --git a/erpnext/website/doctype/web_page/template.html b/erpnext/website/doctype/web_page/template.html
index 471c95c..b66aded 100644
--- a/erpnext/website/doctype/web_page/template.html
+++ b/erpnext/website/doctype/web_page/template.html
@@ -28,6 +28,3 @@
<div style="clear: both"></div>
</div>
</div>
-<div class="web-page-status small">
- Last Modified: {{ doc.updated }} <a href="#contact">Feedback</a>
-</div>
diff --git a/erpnext/website/doctype/web_page/web_page.js b/erpnext/website/doctype/web_page/web_page.js
index 0b7b78d..17e7f15 100644
--- a/erpnext/website/doctype/web_page/web_page.js
+++ b/erpnext/website/doctype/web_page/web_page.js
@@ -24,10 +24,10 @@
refresh: function(doc) {
cur_frm.cscript.layout(doc);
},
- insert_style: function() {
+ insert_style: function(doc) {
cur_frm.cscript.layout(doc);
},
- insert_code: function() {
+ insert_code: function(doc) {
cur_frm.cscript.layout(doc);
}
})
\ No newline at end of file
diff --git a/erpnext/website/js/topbar.js b/erpnext/website/js/topbar.js
index aec0f02..8caf8dc 100644
--- a/erpnext/website/js/topbar.js
+++ b/erpnext/website/js/topbar.js
@@ -91,8 +91,7 @@
init: function() {
$('footer').html(repl('<div class="web-footer">\
<div class="web-footer-menu"><ul></ul></div>\
- <div class="web-footer-address">%(address)s</div>\
- <div class="web-footer-copyright">© %(copyright)s</div>\
+ <div class="web-footer-copyright">© %(copyright)s | %(address)s</div>\
<div class="web-footer-powered">Powered by \
<a href="https://erpnext.com">erpnext.com</a></div>\
</div>', wn.boot.website_settings));
diff --git a/erpnext/website/page/blog/blog.html b/erpnext/website/page/blog/blog.html
index ffb8128..8d7cd00 100644
--- a/erpnext/website/page/blog/blog.html
+++ b/erpnext/website/page/blog/blog.html
@@ -3,6 +3,7 @@
<div class="layout-main-section">
<h1>Blog</h1>
<br>
+ <div id="blog-list"></div>
</div>
<div class="layout-side-section">
<!-- for later
diff --git a/erpnext/website/page/blog/blog.js b/erpnext/website/page/blog/blog.js
index 418fc6c..3836f90 100644
--- a/erpnext/website/page/blog/blog.js
+++ b/erpnext/website/page/blog/blog.js
@@ -17,18 +17,22 @@
pscript.onload_blog = function(wrapper) {
wrapper.blog_list = new wn.ui.Listing({
- parent: $(wrapper).find('.layout-main-section').get(0),
- query: 'select tabBlog.name, title, left(content, 300) as content, tabBlog.modified, \
+ parent: $(wrapper).find('#blog-list').get(0),
+ query: 'select tabBlog.name, title, left(content, 1000) as content, tabBlog.modified, \
ifnull(first_name, "") as first_name, ifnull(last_name, "") as last_name \
from tabProfile, tabBlog\
- where ifnull(published,1)=1 and tabBlog.owner = tabProfile.name',
+ where ifnull(published,0)=1 and tabBlog.owner = tabProfile.name',
hide_refresh: true,
+ no_toolbar: true,
render_row: function(parent, data) {
- if(data.content.length==300) data.content += '...';
+ if(data.content && data.content.length==1000) data.content += '... (read on)';
+ data.content = wn.markdown(data.content);
+ if(data.last_name) data.last_name = ' ' + data.last_name;
data.date = prettyDate(data.modified);
- parent.innerHTML = repl('<h3><a href="#!%(name)s">%(title)s</a></h3>\
- <p><div class="help">By %(first_name)s %(last_name)s on %(date)s</div></p>\
- <div class="comment">%(content)s</div><br>', data);
+ parent.innerHTML = repl('<h2>%(title)s</h2>\
+ <p><div class="help">By %(first_name)s%(last_name)s, %(date)s</div></p>\
+ <p>%(content)s</p>\
+ <a href="#!%(name)s">Read Full Text</a><br>', data);
},
page_length: 10
});
diff --git a/js/all-app.js b/js/all-app.js
index 647a888..7090e15 100644
--- a/js/all-app.js
+++ b/js/all-app.js
@@ -1288,7 +1288,7 @@
delete locals[dt][dn];}
function get_local(dt,dn){return locals[dt]?locals[dt][dn]:null;}
LocalDB.sync=function(list){if(list._kl)list=expand_doclist(list);for(var i=0;i<list.length;i++){var d=list[i];if(!d.name)
-d.name=LocalDB.get_localname(d.doctype);LocalDB.add(d.doctype,d.name);locals[d.doctype][d.name]=d;if(d.doctype=='DocField')wn.meta.add_field(d);if(d.localname){wn.model.new_names[d.localname]=d.name;$(document).trigger('rename',[d.doctype,d.localname,d.name]);delete locals[d.doctype][d.localname];}}}
+d.name=LocalDB.get_localname(d.doctype);LocalDB.add(d.doctype,d.name);locals[d.doctype][d.name]=d;if(d.doctype=='DocField')wn.meta.add_field(d);if(d.localname){wn.model.new_names[d.localname]=d.name;console.log(d.localname);$(document).trigger('rename',[d.doctype,d.localname,d.name]);delete locals[d.doctype][d.localname];}}}
local_name_idx={};LocalDB.get_localname=function(doctype){if(!local_name_idx[doctype])local_name_idx[doctype]=1;var n='New '+get_doctype_label(doctype)+' '+local_name_idx[doctype];local_name_idx[doctype]++;return n;}
LocalDB.set_default_values=function(doc){var doctype=doc.doctype;var docfields=wn.meta.docfield_list[doctype];if(!docfields){return;}
var fields_to_refresh=[];for(var fid=0;fid<docfields.length;fid++){var f=docfields[fid];if(!in_list(no_value_fields,f.fieldtype)&&doc[f.fieldname]==null){var v=LocalDB.get_default_value(f.fieldname,f.fieldtype,f['default']);if(v){doc[f.fieldname]=v;fields_to_refresh.push(f.fieldname);}}}
@@ -1687,7 +1687,8 @@
/*
* lib/js/legacy/widgets/form/form.js
*/
-wn.provide('_f');_f.frms={};_f.Frm=function(doctype,parent){this.docname='';this.doctype=doctype;this.display=0;var me=this;this.is_editable={};this.opendocs={};this.sections=[];this.grids=[];this.cscript={};this.pformat={};this.fetch_dict={};this.parent=parent;this.tinymce_id_list=[];this.setup_meta(doctype);var me=this;$(document).bind('rename',function(event,dt,old_name,new_name){if(dt==me.doctype)
+wn.provide('_f');_f.frms={};_f.Frm=function(doctype,parent){this.docname='';this.doctype=doctype;this.display=0;var me=this;this.is_editable={};this.opendocs={};this.sections=[];this.grids=[];this.cscript={};this.pformat={};this.fetch_dict={};this.parent=parent;this.tinymce_id_list=[];this.setup_meta(doctype);var me=this;$(document).bind('rename',function(event,dt,old_name,new_name){console.log(arguments)
+if(dt==me.doctype)
me.rename_notify(dt,old_name,new_name)});}
_f.Frm.prototype.check_doctype_conflict=function(docname){var me=this;if(this.doctype=='DocType'&&docname=='DocType'){msgprint('Allowing DocType, DocType. Be careful!')}else if(this.doctype=='DocType'){if(wn.views.formview[docname]){msgprint("Cannot open DocType when its instance is open")
throw'doctype open conflict'}}else{if(wn.views.formview.DocType&&wn.views.formview.DocType.frm.opendocs[this.doctype]){msgprint("Cannot open instance when its DocType is open")
@@ -1709,9 +1710,9 @@
_f.Frm.prototype.email_doc=function(){if(!_e.dialog)_e.make();sel=this.print_sel;var c=$td(_e.dialog.rows['Format'].tab,0,1);if(c.cur_sel){c.removeChild(c.cur_sel);c.cur_sel=null;}
c.appendChild(this.print_sel);c.cur_sel=this.print_sel;_e.dialog.widgets['Send With Attachments'].checked=0;if(cur_frm.doc.file_list){$ds(_e.dialog.rows['Send With Attachments']);}else{$dh(_e.dialog.rows['Send With Attachments']);}
_e.dialog.widgets['Subject'].value=get_doctype_label(this.meta.name)+': '+this.docname;_e.dialog.show();}
-_f.Frm.prototype.rename_notify=function(dt,old,name){this.is_editable[name]=this.is_editable[old];delete this.is_editable[old];if(this.docname==old)
+_f.Frm.prototype.rename_notify=function(dt,old,name){if(this.docname==old)
this.docname=name;else
-return;if(this&&this.opendocs[old]){local_dt[dt][name]=local_dt[dt][old];local_dt[dt][old]=null;}
+return;this.is_editable[name]=this.is_editable[old];delete this.is_editable[old];if(this&&this.opendocs[old]){local_dt[dt][name]=local_dt[dt][old];local_dt[dt][old]=null;}
delete this.opendocs[old];this.opendocs[name]=true;wn.re_route[window.location.hash]='Form/'+encodeURIComponent(this.doctype)+'/'+encodeURIComponent(name);wn.set_route('Form',this.doctype,name);}
_f.Frm.prototype.setup_meta=function(){this.meta=get_local('DocType',this.doctype);this.perm=get_perm(this.doctype);if(this.meta.istable){this.meta.in_dialog=1}
this.setup_print();}
@@ -2239,7 +2240,7 @@
wn.call({method:'startup.startup.get_global_status_messages',callback:set_messages});}else{wn.container.wntoolbar.set_new_comments(0);$('#unread_messages').toggle(false);}}
erpnext.startup.set_periodic_updates=function(){wn.updates={};if(wn.updates.id){clearInterval(wn.updates.id);}
wn.updates.id=setInterval(update_messages,60000);}
-erpnext.set_user_background=function(src){set_style(repl('body { background: url("files/%(src)s") repeat;}',{src:src}))}
+erpnext.set_user_background=function(src){set_style(repl('#body_div { background: url("files/%(src)s") repeat;}',{src:src}))}
$(document).bind('startup',function(){erpnext.startup.start();});
/*
* erpnext/startup/js/modules.js
diff --git a/js/all-web.js b/js/all-web.js
index 503f088..b2b1fb8 100644
--- a/js/all-web.js
+++ b/js/all-web.js
@@ -739,7 +739,7 @@
delete locals[dt][dn];}
function get_local(dt,dn){return locals[dt]?locals[dt][dn]:null;}
LocalDB.sync=function(list){if(list._kl)list=expand_doclist(list);for(var i=0;i<list.length;i++){var d=list[i];if(!d.name)
-d.name=LocalDB.get_localname(d.doctype);LocalDB.add(d.doctype,d.name);locals[d.doctype][d.name]=d;if(d.doctype=='DocField')wn.meta.add_field(d);if(d.localname){wn.model.new_names[d.localname]=d.name;$(document).trigger('rename',[d.doctype,d.localname,d.name]);delete locals[d.doctype][d.localname];}}}
+d.name=LocalDB.get_localname(d.doctype);LocalDB.add(d.doctype,d.name);locals[d.doctype][d.name]=d;if(d.doctype=='DocField')wn.meta.add_field(d);if(d.localname){wn.model.new_names[d.localname]=d.name;console.log(d.localname);$(document).trigger('rename',[d.doctype,d.localname,d.name]);delete locals[d.doctype][d.localname];}}}
local_name_idx={};LocalDB.get_localname=function(doctype){if(!local_name_idx[doctype])local_name_idx[doctype]=1;var n='New '+get_doctype_label(doctype)+' '+local_name_idx[doctype];local_name_idx[doctype]++;return n;}
LocalDB.set_default_values=function(doc){var doctype=doc.doctype;var docfields=wn.meta.docfield_list[doctype];if(!docfields){return;}
var fields_to_refresh=[];for(var fid=0;fid<docfields.length;fid++){var f=docfields[fid];if(!in_list(no_value_fields,f.fieldtype)&&doc[f.fieldname]==null){var v=LocalDB.get_default_value(f.fieldname,f.fieldtype,f['default']);if(v){doc[f.fieldname]=v;fields_to_refresh.push(f.fieldname);}}}
@@ -847,7 +847,7 @@
wn.call({method:'startup.startup.get_global_status_messages',callback:set_messages});}else{wn.container.wntoolbar.set_new_comments(0);$('#unread_messages').toggle(false);}}
erpnext.startup.set_periodic_updates=function(){wn.updates={};if(wn.updates.id){clearInterval(wn.updates.id);}
wn.updates.id=setInterval(update_messages,60000);}
-erpnext.set_user_background=function(src){set_style(repl('body { background: url("files/%(src)s") repeat;}',{src:src}))}
+erpnext.set_user_background=function(src){set_style(repl('#body_div { background: url("files/%(src)s") repeat;}',{src:src}))}
$(document).bind('startup',function(){erpnext.startup.start();});
/*
* erpnext/website/js/topbar.js
@@ -870,8 +870,7 @@
item.route=item.url||item.custom_page;$parent_li.find('.dropdown-menu').append(repl('<li data-label="%(label)s">\
<a href="#!%(route)s">%(label)s</a></li>',item))}}}});erpnext.Footer=Class.extend({init:function(){$('footer').html(repl('<div class="web-footer">\
<div class="web-footer-menu"><ul></ul></div>\
- <div class="web-footer-address">%(address)s</div>\
- <div class="web-footer-copyright">© %(copyright)s</div>\
+ <div class="web-footer-copyright">© %(copyright)s | %(address)s</div>\
<div class="web-footer-powered">Powered by \
<a href="https://erpnext.com">erpnext.com</a></div>\
</div>',wn.boot.website_settings));this.make_items();},make_items:function(){var items=wn.boot.website_menus