Merge branch 'master' of git://github.com/webnotes/erpnext
This commit is contained in:
commit
eb8233c779
Binary file not shown.
@ -5,7 +5,7 @@
|
||||
{
|
||||
'creation': '2010-08-08 17:09:35',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-09-15 15:04:43',
|
||||
'modified': '2011-10-12 12:10:15',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
@ -107,6 +107,15 @@
|
||||
'to_field': 'naming_series'
|
||||
},
|
||||
|
||||
# Field Mapper Detail
|
||||
{
|
||||
'doctype': 'Field Mapper Detail',
|
||||
'from_field': 'total_tax',
|
||||
'map': 'Yes',
|
||||
'match_id': 0,
|
||||
'to_field': 'total_tax'
|
||||
},
|
||||
|
||||
# Table Mapper Detail
|
||||
{
|
||||
'doctype': 'Table Mapper Detail',
|
||||
@ -116,17 +125,6 @@
|
||||
'validation_logic': 'docstatus =1'
|
||||
},
|
||||
|
||||
# Table Mapper Detail
|
||||
{
|
||||
'doctype': 'Table Mapper Detail',
|
||||
'from_field': 'po_details',
|
||||
'from_table': 'PO Detail',
|
||||
'match_id': 1,
|
||||
'to_field': 'entries',
|
||||
'to_table': 'PV Detail',
|
||||
'validation_logic': 'ifnull(billed_qty,0) < qty'
|
||||
},
|
||||
|
||||
# Table Mapper Detail
|
||||
{
|
||||
'doctype': 'Table Mapper Detail',
|
||||
|
@ -5,7 +5,7 @@
|
||||
{
|
||||
'creation': '2010-08-08 17:09:35',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-09-15 15:04:44',
|
||||
'modified': '2011-10-12 10:49:26',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
@ -125,6 +125,33 @@
|
||||
'to_field': 'naming_series'
|
||||
},
|
||||
|
||||
# Field Mapper Detail
|
||||
{
|
||||
'doctype': 'Field Mapper Detail',
|
||||
'from_field': 'net_total',
|
||||
'map': 'Yes',
|
||||
'match_id': 0,
|
||||
'to_field': 'net_total'
|
||||
},
|
||||
|
||||
# Field Mapper Detail
|
||||
{
|
||||
'doctype': 'Field Mapper Detail',
|
||||
'from_field': 'grand_total',
|
||||
'map': 'Yes',
|
||||
'match_id': 0,
|
||||
'to_field': 'grand_total'
|
||||
},
|
||||
|
||||
# Field Mapper Detail
|
||||
{
|
||||
'doctype': 'Field Mapper Detail',
|
||||
'from_field': 'total_tax',
|
||||
'map': 'Yes',
|
||||
'match_id': 0,
|
||||
'to_field': 'total_tax'
|
||||
},
|
||||
|
||||
# Table Mapper Detail
|
||||
{
|
||||
'doctype': 'Table Mapper Detail',
|
||||
|
@ -3,10 +3,10 @@
|
||||
|
||||
# These values are common in all dictionaries
|
||||
{
|
||||
'creation': '2011-03-25 15:26:02',
|
||||
'creation': '2011-03-28 15:17:25',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-03-28 12:33:24',
|
||||
'modified_by': 'Administrator',
|
||||
'modified_by': 'umair@iwebnotes.com',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
|
||||
|
File diff suppressed because one or more lines are too long
27
erpnext/accounts/Print Format/POS Invoice/POS Invoice.txt
Normal file
27
erpnext/accounts/Print Format/POS Invoice/POS Invoice.txt
Normal file
@ -0,0 +1,27 @@
|
||||
# Print Format, POS Invoice
|
||||
[
|
||||
|
||||
# These values are common in all dictionaries
|
||||
{
|
||||
'creation': '2011-10-19 14:27:47',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-10-19 14:29:45',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
|
||||
# These values are common for all Print Format
|
||||
{
|
||||
'doctype': 'Print Format',
|
||||
'html': '<html>\n<head>\n<!--Other charges function-->\n<script>\n var make_row = function(title,val,bold){\n var bstart = \'<b>\'; var bend = \'</b>\';\n return \'<tr><td style="width:50%">\'+(bold?bstart:\'\')+title+(bold?bend:\'\')+\'</td>\'\n +\'<td style="width:20%">\'+doc.currency+\'</td>\'\n +\'<td style="width:30%;text-align:right">\'+(val?val:\'0.00\')+\'</td>\'\n +\'</tr>\'\n }\n var make_row1 = function(title,val,bold){\n var bstart = \'<b>\'; var bend = \'</b>\';\n \n return \'<tr style="font-family:courier new; line-height:150%"><td style="width:50%">\'+(bold?bstart:\'\')+title+(bold?bend:\'\')+\'</td>\'\n +\'<td style="width:50%;text-align:right">\'+(bold?bstart:\'\')+(val?val:\'0.00\')+(bold?bend:\'\')+\'</td>\'\n +\'</tr>\'\n }\n\nfunction get_letter_head() {\n\t// add letter head\n\tvar cp = locals[\'Control Panel\'][\'Control Panel\'];\n\tif(doc.letter_head)\n\t\tvar lh= cstr(_p.letter_heads[doc.letter_head]);\n\telse if(cp.letter_head)\n\t\tvar lh= cp.letter_head;\n\telse \n\t\tvar lh= \'\';\n\t\t\n\treturn lh;\n}\n\n function get_tax_details(){\n \n var cl = getchildren(\'RV Tax Detail\',doc.name,\'other_charges\');\n var out = \'\';\n\n// if(cl.length){\n out += \'<div><table style="float: right;">\';\n for(var i=0;i<cl.length;i++){\n out += make_row1(cl[i].description,fmt_money(convert_rate(cl[i].tax_amount)),0);\n }\n\n out += make_row1(\'TOTAL\',fmt_money(doc.grand_total),1);\n // }\n out +=\'</table></div>\';\n return out;\n }\n function get_other_charges(){\n var out =\'\';\n out += \'<div><table cssClass="noborder" style="width:100%">\';\n \n out += make_row(\'Net Total\',fmt_money(convert_rate(doc.net_total)),1)\n +make_row(\'Total Taxes\',fmt_money(convert_rate(doc.other_charges_total)),0)\n +make_row(\'Grand Total\',fmt_money(convert_rate(doc.grand_total)),1)\n +make_row(\'Rounded Total\',fmt_money(convert_rate(doc.rounded_total)),1)\n +make_row(\'Outstanding Amount\',fmt_money(convert_rate(doc.outstanding_amount)),1)\n out += \'</table></div>\';\n return out;\n }\n\n \n function convert_rate(val){ \n var new_val = flt(val)/flt(doc.conversion_rate);\n return new_val;\n }\n \n</script>\n</head>\n<body>\n\n<div><script>get_letter_head()</script></div>\n<table width="100%" style="font-family: courier new; line-height:200%">\n<tr>\n<td align="left">NO: <script>doc.name</script></td>\n<td align="right">DATE: <script>date.str_to_user(doc.voucher_date)</script></td>\n</tr>\n<tr>\n<td>M/s <script>doc.contact_display</script></td>\n</tr>\n</table>\n<!--Item Table-->\n<div>\n <script>\n var t = print_table(\'Receivable Voucher\', doc.name, \'entries\', \'RV Detail\', [\'description\',\'qty\',\'basic_rate\',\'amount\'], [\'ITEM\', \'QTY\',\'RATE\',\'AMOUNT\'], [\'35%\',\'20%\',\'20%\',\'25%\'])\n if(t.appendChild) {\n // single\n out = t.innerHTML.replace(/border: 1px/gi,\'border: 0px\').replace(/style="/gi,\'style="font-family:courier new;line-height:150%;\');\n }\n else {//multiple\n out = \'<table class="None" border="0px" width="100%" style="border:0px; font-family:courier-new">\';\n\n for(var i=0;i<t.length;i++) \n {\n\t\tif(i==0)\n\t\t{\n\t\t\tout+=\'<tr>\'+t[i].childNodes[0].childNodes[0].childNodes[0].innerHTML.replace(/style="border: 1px solid rgb\\(0, 0, 0\\);/gi,\'style="font-family:courier new;\')+\'</tr>\'\n\t\t}\n\t\tout+=\'<tr>\'+t[i].childNodes[0].childNodes[0].childNodes[1].innerHTML.replace(/style="border: 1px solid rgb\\(0, 0, 0\\);/gi,\'style="font-family:courier new;\')+\'</tr>\'\n }\n\tout += \'</table>\'\n }\n out;\n </script>\n\n</div>\n\n<!--Tax table-->\n<div><script>get_tax_details();</script>\n </table>\n</div>\n\n<br>\n<table style="font-family:courier new;">\n<tr><td><b><script>doc.terms</script></b></td></tr>\n<tr><td nowrap><b>For <script>doc.company</script></b></td></tr>\n<tr><td> </td></tr>\n<tr><td nowrap><b>Signatory</b></td></tr>\n</table>\n</body>\n</html>',
|
||||
'module': 'Accounts',
|
||||
'name': '__common__',
|
||||
'standard': 'Yes'
|
||||
},
|
||||
|
||||
# Print Format, POS Invoice
|
||||
{
|
||||
'doctype': 'Print Format',
|
||||
'name': 'POS Invoice'
|
||||
}
|
||||
]
|
@ -3,17 +3,17 @@
|
||||
|
||||
# These values are common in all dictionaries
|
||||
{
|
||||
'creation': '2011-03-25 17:30:45',
|
||||
'creation': '2011-03-28 15:17:25',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-04-27 11:44:30',
|
||||
'modified_by': 'Administrator',
|
||||
'modified': '2011-03-28 12:31:40',
|
||||
'modified_by': 'umair@iwebnotes.com',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
|
||||
# These values are common for all Print Format
|
||||
{
|
||||
'doctype': 'Print Format',
|
||||
'html': '<div style="position: relative;">\n<h3 align="center"><script>doc.company</script>\n</div>\n\n<font size="4">\n<table class=\'simpletable\'>\n<tr>\n<td><b> Receipt No.: </b></td>\n<td><script>doc.name</script></td>\n</tr>\n<tr>\n<td><b> Date : </b></td>\n<td><script>date.str_to_user(doc.voucher_date)</script></td>\n</tr> \n<tr>\n<td><b> Remark: </b></td>\n<td><script> doc.remark </script></td>\n</tr>\n<tr>\n<td><b> Received From: </b></td>\n<td><b><script> doc.pay_to_rec_from </script></b></td>\n</tr>\n</table>\n<br>\n\n<div><b><script>doc.total_amount</script></b> </td></div><br>\n<div style="text-align:left"><b><script>doc.total_amount_in_words</script></b></div><br>\n<div>This receipt is issued subject to realization of the <script>if(doc.cheque_no){\'Cheque\'}else{\'Cash\'}</script></div>\n</font>\n<br>\n<table class="noborder">\n<tr>\n<td style = "text-align = right;"><h3>For <script>doc.company</script>,</h3><br><div>(Authorised Signatory)</div></td>\n</tr>\n</table>',
|
||||
'html': '<div style="position: relative;">\n<h3 align="center"><script>doc.company</script>\n</div>\n\n<font size="4">\n<table class=\'simpletable\'>\n<tr>\n<td><b> Receipt No.: </b></td>\n<td><script>doc.name</script></td>\n</tr>\n<tr>\n<td><b> Date : </b></td>\n<td><script>date.str_to_user(doc.voucher_date)</script></td>\n</tr> \n<tr>\n<td><b> Remark: </b></td>\n<td><script> doc.remark </script></td>\n</tr>\n<tr>\n<td><b> Received From: </b></td>\n<td><b><script> doc.pay_to_rec_from </script></b></td>\n</tr>\n</table>\n<br>\n\n<div><b><script>doc.total_amount</script></b> </td></div><br>\n<div style="text-align:left"><b><script>doc.total_amount_in_words</script></b></div><br>\n<div>This receipt is issued subject to realization of the Cheque</div>\n</font>\n<br>\n<table class="noborder">\n<tr>\n<td style = "text-align = right;"><h3>For <script>doc.company</script>,</h3><br><div>(Authorised Signatory)</div></td>\n</tr>\n</table>',
|
||||
'module': 'Accounts',
|
||||
'name': '__common__',
|
||||
'standard': 'Yes'
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -75,4 +75,4 @@ cur_frm.add_fetch('invoice','grand_total','invoice_amount');
|
||||
cur_frm.fields_dict.invoice.get_query=function(doc){
|
||||
|
||||
return "SELECT tv.name FROM `tabReceivable Voucher` tv WHERE debit_to='"+doc.account+"' and tv.%(key)s like '%s' ORDER BY tv.name LIMIT 50"
|
||||
}
|
||||
}
|
||||
|
@ -52,7 +52,6 @@ cur_frm.cscript.refresh = function(doc, dt, dn) {
|
||||
|
||||
//Supplier
|
||||
cur_frm.cscript.supplier = function(doc,dt,dn) {
|
||||
|
||||
var callback = function(r,rt) {
|
||||
var doc = locals[cur_frm.doctype][cur_frm.docname];
|
||||
get_server_fields('get_credit_to','','',doc, dt, dn, 0, callback2);
|
||||
@ -144,13 +143,6 @@ cur_frm.cscript.is_opening = function(doc, dt, dn) {
|
||||
}
|
||||
|
||||
/* ******************************** TRIGGERS **************************************** */
|
||||
/*
|
||||
// Supplier
|
||||
// ---------
|
||||
cur_frm.cscript.supplier = function(doc,cdt,cdn){
|
||||
get_server_fields('get_credit_to','','',doc,cdt,cdn);
|
||||
}
|
||||
*/
|
||||
|
||||
// Conversion Rate
|
||||
// ----------------
|
||||
@ -420,7 +412,7 @@ cur_frm.cscript.make_jv = function(doc, dt, dn, det) {
|
||||
}
|
||||
|
||||
// ***************** Get project name *****************
|
||||
cur_frm.fields_dict['project_name'].get_query = function(doc, cdt, cdn) {
|
||||
cur_frm.fields_dict['pv_details'].grid.get_field('project_name').get_query = function(doc, cdt, cdn) {
|
||||
return 'SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50';
|
||||
}
|
||||
|
||||
|
@ -232,15 +232,11 @@ class DocType(TransactionBase):
|
||||
# Validate Acc Head of Supplier and Credit To Account entered
|
||||
# ------------------------------------------------------------
|
||||
def check_for_acc_head_of_supplier(self):
|
||||
acc_head = sql("select name from `tabAccount` where name = %s", (cstr(self.doc.supplier) + " - " + self.get_company_abbr()))
|
||||
if self.doc.supplier:
|
||||
if acc_head and acc_head[0][0]:
|
||||
if not cstr(acc_head[0][0]) == cstr(self.doc.credit_to):
|
||||
msgprint("Credit To: %s do not match with Supplier: %s for Company: %s i.e. %s" %(self.doc.credit_to,self.doc.supplier,self.doc.company,cstr(acc_head[0][0])))
|
||||
raise Exception, "Validation Error "
|
||||
if not acc_head:
|
||||
msgprint("Supplier %s does not have an Account Head in %s. You must first create it from the Supplier Master" % (self.doc.supplier, self.doc.company))
|
||||
raise Exception, "Validation Error "
|
||||
if self.doc.supplier and self.doc.credit_to:
|
||||
acc_head = sql("select master_name from `tabAccount` where name = %s", self.doc.credit_to)
|
||||
|
||||
if (acc_head and cstr(acc_head[0][0]) != cstr(self.doc.supplier)) or (not acc_head and (self.doc.credit_to != cstr(self.doc.supplier) + " - " + self.get_company_abbr())):
|
||||
msgprint("Credit To: %s do not match with Supplier: %s for Company: %s.\n If both correctly entered, please select Master Type and Master Name in account master." %(self.doc.credit_to,self.doc.supplier,self.doc.company), raise_exception=1)
|
||||
|
||||
# Check for Stopped PO
|
||||
# ---------------------
|
||||
|
@ -1,109 +1,38 @@
|
||||
cur_frm.cscript.onload = function(doc,cdt,cdn){
|
||||
$c_obj(make_doclist(cdt,cdn),'get_series','',function(r,rt){
|
||||
if(r.message) set_field_options('naming_series', r.message);
|
||||
});
|
||||
|
||||
|
||||
//--------- ONLOAD -------------
|
||||
cur_frm.cscript.onload = function(doc, cdt, cdn) {
|
||||
|
||||
}
|
||||
|
||||
// Settings Module
|
||||
|
||||
cur_frm.cscript.refresh = function(doc,cdt,cdn){
|
||||
|
||||
|
||||
if(doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Total Claimed Amount' || doc.based_on == 'Not Applicable') hide_field('master_name');
|
||||
else unhide_field('master_name');
|
||||
|
||||
if(doc.based_on == 'Not Applicable') hide_field('value');
|
||||
else unhide_field('value');
|
||||
|
||||
if(doc.transaction == 'Expense Voucher' || doc.transaction == 'Appraisal'){
|
||||
hide_field(['master_name','system_role', 'system_user']);
|
||||
unhide_field(['to_emp','to_designation']);
|
||||
if(doc.transaction == 'Appraisal') hide_field('value');
|
||||
else unhide_field('value');
|
||||
}
|
||||
else {
|
||||
unhide_field(['master_name','system_role', 'system_user','value']);
|
||||
hide_field(['to_emp','to_designation']);
|
||||
}
|
||||
}
|
||||
|
||||
cur_frm.cscript.based_on = function(doc){
|
||||
if(doc.based_on == 'Grand Total' || doc.based_on == 'Average Discount' || doc.based_on == 'Total Claimed Amount' || doc.based_on == 'Not Applicable'){
|
||||
doc.master_name = '';
|
||||
refresh_field('master_name');
|
||||
hide_field('master_name');
|
||||
}
|
||||
else{
|
||||
unhide_field('master_name');
|
||||
}
|
||||
|
||||
if(doc.based_on == 'Not Applicable') {
|
||||
doc.value =0;
|
||||
refresh_field('value');
|
||||
hide_field('value');
|
||||
}
|
||||
else unhide_field('value');
|
||||
//cash bank account
|
||||
//------------------------------------
|
||||
cur_frm.fields_dict['cash_bank_account'].get_query = function(doc,cdt,cdn) {
|
||||
return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.debit_or_credit="Debit" AND tabAccount.is_pl_account = "No" AND tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus!=2 AND tabAccount.company="'+doc.company+'" AND tabAccount.%(key)s LIKE "%s"'
|
||||
}
|
||||
|
||||
cur_frm.cscript.transaction = function(doc,cdt,cdn){
|
||||
if(doc.transaction == 'Expense Voucher' || doc.transaction == 'Appraisal'){
|
||||
doc.master_name = doc.system_role = doc.system_user = '';
|
||||
refresh_many(['master_name','system_role', 'system_user']);
|
||||
hide_field(['master_name','system_role', 'system_user']);
|
||||
unhide_field(['to_emp','to_designation']);
|
||||
if(doc.transaction == 'Appraisal') {
|
||||
doc.value =0;
|
||||
refresh_many('value');
|
||||
hide_field('value');
|
||||
}
|
||||
else unhide_field('value');
|
||||
}
|
||||
else {
|
||||
unhide_field(['master_name','system_role', 'system_user','value']);
|
||||
hide_field(['to_emp','to_designation']);
|
||||
}
|
||||
|
||||
if(doc.transaction == 'Expense Voucher') doc.based_on = 'Total Claimed Amount';
|
||||
if(doc.transaction == 'Appraisal') doc.based_on == 'Not Applicable';
|
||||
// Income Account
|
||||
// --------------------------------
|
||||
cur_frm.fields_dict['income_account'].get_query = function(doc,cdt,cdn) {
|
||||
return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.debit_or_credit="Credit" AND tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus!=2 AND tabAccount.company="'+doc.company+'" AND tabAccount.account_type ="Income Account" AND tabAccount.%(key)s LIKE "%s"'
|
||||
}
|
||||
|
||||
|
||||
// System User Trigger
|
||||
// -------------------
|
||||
cur_frm.fields_dict['system_user'].get_query = function(doc) {
|
||||
return 'SELECT tabProfile.name, tabProfile.first_name FROM tabProfile WHERE tabProfile.name not in ("Administrator","Guest") AND tabProfile.docstatus != 2 AND tabProfile.%(key)s LIKE "%s" LIMIT 50'
|
||||
// Cost Center
|
||||
// -----------------------------
|
||||
cur_frm.fields_dict['cost_center'].get_query = function(doc,cdt,cdn) {
|
||||
return 'SELECT `tabCost Center`.`name` FROM `tabCost Center` WHERE `tabCost Center`.`company_name` = "' +doc.company+'" AND `tabCost Center`.%(key)s LIKE "%s" AND `tabCost Center`.`group_or_ledger` = "Ledger" AND `tabCost Center`.`docstatus`!= 2 ORDER BY `tabCost Center`.`name` ASC LIMIT 50';
|
||||
}
|
||||
|
||||
//get query select Territory
|
||||
//=================================================================
|
||||
cur_frm.fields_dict['territory'].get_query = function(doc,cdt,cdn) {
|
||||
return 'SELECT `tabTerritory`.`name`,`tabTerritory`.`parent_territory` FROM `tabTerritory` WHERE `tabTerritory`.`is_group` = "No" AND `tabTerritory`.`docstatus`!= 2 AND `tabTerritory`.%(key)s LIKE "%s" ORDER BY `tabTerritory`.`name` ASC LIMIT 50';
|
||||
}
|
||||
|
||||
|
||||
// System Role Trigger
|
||||
// -----------------------
|
||||
cur_frm.fields_dict['system_role'].get_query = function(doc) {
|
||||
return 'SELECT tabRole.name FROM tabRole WHERE tabRole.name not in ("Administrator","Guest","All") AND tabRole.docstatus != 2 AND tabRole.%(key)s LIKE "%s" LIMIT 50'
|
||||
}
|
||||
|
||||
|
||||
// Approving User Trigger
|
||||
// -----------------------
|
||||
cur_frm.fields_dict['approving_user'].get_query = function(doc) {
|
||||
return 'SELECT tabProfile.name, tabProfile.first_name FROM tabProfile WHERE tabProfile.name not in ("Administrator","Guest") AND tabProfile.docstatus != 2 AND tabProfile.%(key)s LIKE "%s" LIMIT 50'
|
||||
}
|
||||
|
||||
|
||||
// Approving Role Trigger
|
||||
// -----------------------
|
||||
cur_frm.fields_dict['approving_role'].get_query = function(doc) {
|
||||
return 'SELECT tabRole.name FROM tabRole WHERE tabRole.name not in ("Administrator","Guest","All") AND tabRole.docstatus != 2 AND tabRole.%(key)s LIKE "%s" LIMIT 50'
|
||||
}
|
||||
|
||||
|
||||
// Master Name Trigger
|
||||
// --------------------
|
||||
cur_frm.fields_dict['master_name'].get_query = function(doc){
|
||||
if(doc.based_on == 'Customerwise Discount')
|
||||
return 'SELECT `tabCustomer`.`name` FROM `tabCustomer` WHERE `tabCustomer`.docstatus !=2 and `tabCustomer`.`name` LIKE "%s" ORDER BY `tabCustomer`.`name` DESC LIMIT 50';
|
||||
else if(doc.based_on == 'Itemwise Discount')
|
||||
return 'SELECT `tabItem`.`name` FROM `tabItem` WHERE (IFNULL(`tabItem`.`end_of_life`,"") = "" OR `tabItem`.`end_of_life` = "0000-00-00" OR `tabItem`.`end_of_life` > NOW()) and `tabItem`.is_sales_item = "Yes" and tabItem.%(key)s LIKE "%s" ORDER BY `tabItem`.`name` DESC LIMIT 50';
|
||||
else
|
||||
return 'SELECT `tabItem`.`name` FROM `tabItem` WHERE `tabItem`.`name` = "cheating done to avoid null" ORDER BY `tabItem`.`name` DESC LIMIT 50';
|
||||
// ------------------ Get Print Heading ------------------------------------
|
||||
cur_frm.fields_dict['select_print_heading'].get_query = function(doc, cdt, cdn) {
|
||||
return 'SELECT `tabPrint Heading`.name FROM `tabPrint Heading` WHERE `tabPrint Heading`.docstatus !=2 AND `tabPrint Heading`.name LIKE "%s" ORDER BY `tabPrint Heading`.name ASC LIMIT 50';
|
||||
}
|
||||
|
@ -5,8 +5,8 @@
|
||||
{
|
||||
'creation': '2010-08-08 17:09:16',
|
||||
'docstatus': 0,
|
||||
'modified': '2010-09-20 14:06:57',
|
||||
'modified_by': 'umair@iwebnotes.com',
|
||||
'modified': '2011-11-16 15:41:42',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'wasim@webnotestech.com'
|
||||
},
|
||||
|
||||
@ -14,6 +14,7 @@
|
||||
{
|
||||
'autoname': 'PVTD.######',
|
||||
'colour': 'White:FFF',
|
||||
'default_print_format': 'Standard',
|
||||
'doctype': 'DocType',
|
||||
'hide_heading': 1,
|
||||
'istable': 1,
|
||||
@ -22,7 +23,7 @@
|
||||
'section_style': 'Tray',
|
||||
'server_code_error': ' ',
|
||||
'show_in_menu': 0,
|
||||
'version': 10
|
||||
'version': 12
|
||||
},
|
||||
|
||||
# These values are common for all DocField
|
||||
@ -45,7 +46,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'category',
|
||||
'fieldtype': 'Select',
|
||||
'idx': 1,
|
||||
'label': 'Category',
|
||||
'oldfieldname': 'category',
|
||||
'oldfieldtype': 'Select',
|
||||
@ -60,7 +60,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'add_deduct_tax',
|
||||
'fieldtype': 'Select',
|
||||
'idx': 2,
|
||||
'label': 'Add or Deduct',
|
||||
'oldfieldname': 'add_deduct_tax',
|
||||
'oldfieldtype': 'Select',
|
||||
@ -75,7 +74,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'charge_type',
|
||||
'fieldtype': 'Select',
|
||||
'idx': 3,
|
||||
'label': 'Type',
|
||||
'oldfieldname': 'charge_type',
|
||||
'oldfieldtype': 'Select',
|
||||
@ -91,7 +89,6 @@
|
||||
'fieldname': 'row_id',
|
||||
'fieldtype': 'Data',
|
||||
'hidden': 0,
|
||||
'idx': 4,
|
||||
'label': 'Enter Row',
|
||||
'oldfieldname': 'row_id',
|
||||
'oldfieldtype': 'Data',
|
||||
@ -104,7 +101,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'item_wise_tax_detail',
|
||||
'fieldtype': 'Small Text',
|
||||
'idx': 5,
|
||||
'label': 'Item Wise Tax Detail ',
|
||||
'oldfieldname': 'item_wise_tax_detail',
|
||||
'oldfieldtype': 'Small Text',
|
||||
@ -116,7 +112,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'description',
|
||||
'fieldtype': 'Small Text',
|
||||
'idx': 6,
|
||||
'label': 'Description',
|
||||
'oldfieldname': 'description',
|
||||
'oldfieldtype': 'Small Text',
|
||||
@ -130,7 +125,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'account_head',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 7,
|
||||
'label': 'Account Head',
|
||||
'oldfieldname': 'account_head',
|
||||
'oldfieldtype': 'Link',
|
||||
@ -145,13 +139,11 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'cost_center',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 8,
|
||||
'label': 'Cost Center',
|
||||
'oldfieldname': 'cost_center',
|
||||
'oldfieldtype': 'Link',
|
||||
'options': 'Cost Center',
|
||||
'permlevel': 0,
|
||||
'search_index': 0,
|
||||
'trigger': 'Client'
|
||||
},
|
||||
|
||||
@ -160,7 +152,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'rate',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 9,
|
||||
'label': 'Rate',
|
||||
'oldfieldname': 'rate',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -174,7 +165,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'tax_amount',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 10,
|
||||
'label': 'Amount',
|
||||
'oldfieldname': 'tax_amount',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -188,7 +178,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'total',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 11,
|
||||
'label': 'Aggregate Total',
|
||||
'oldfieldname': 'total',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -201,7 +190,6 @@
|
||||
'fieldname': 'parenttype',
|
||||
'fieldtype': 'Data',
|
||||
'hidden': 1,
|
||||
'idx': 12,
|
||||
'in_filter': 1,
|
||||
'label': 'Parenttype',
|
||||
'oldfieldname': 'parenttype',
|
||||
@ -218,7 +206,6 @@
|
||||
'fieldname': 'total_tax_amount',
|
||||
'fieldtype': 'Currency',
|
||||
'hidden': 1,
|
||||
'idx': 13,
|
||||
'label': 'Total +Tax',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'total_tax_amount',
|
||||
@ -235,7 +222,6 @@
|
||||
'fieldname': 'total_amount',
|
||||
'fieldtype': 'Currency',
|
||||
'hidden': 1,
|
||||
'idx': 14,
|
||||
'label': 'Tax Amount',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'total_amount',
|
||||
|
@ -5,7 +5,7 @@
|
||||
{
|
||||
'creation': '2010-08-08 17:09:17',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-03-30 11:23:38',
|
||||
'modified': '2011-10-20 18:41:17',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
@ -14,6 +14,7 @@
|
||||
{
|
||||
'autoname': 'EVD.######',
|
||||
'colour': 'White:FFF',
|
||||
'default_print_format': 'Standard',
|
||||
'doctype': 'DocType',
|
||||
'istable': 1,
|
||||
'module': 'Accounts',
|
||||
@ -21,7 +22,7 @@
|
||||
'section_style': 'Tray',
|
||||
'server_code_error': ' ',
|
||||
'show_in_menu': 0,
|
||||
'version': 26
|
||||
'version': 27
|
||||
},
|
||||
|
||||
# These values are common for all DocField
|
||||
@ -44,7 +45,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'item_code',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 1,
|
||||
'in_filter': 1,
|
||||
'label': 'Item',
|
||||
'oldfieldname': 'item_code',
|
||||
@ -62,7 +62,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'item_name',
|
||||
'fieldtype': 'Data',
|
||||
'idx': 2,
|
||||
'in_filter': 0,
|
||||
'label': 'Item Name',
|
||||
'oldfieldname': 'item_name',
|
||||
@ -77,7 +76,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'brand',
|
||||
'fieldtype': 'Data',
|
||||
'idx': 3,
|
||||
'label': 'Brand',
|
||||
'oldfieldname': 'brand',
|
||||
'oldfieldtype': 'Data',
|
||||
@ -90,7 +88,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'description',
|
||||
'fieldtype': 'Text',
|
||||
'idx': 4,
|
||||
'label': 'Description',
|
||||
'oldfieldname': 'description',
|
||||
'oldfieldtype': 'Text',
|
||||
@ -103,7 +100,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'item_group',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 5,
|
||||
'in_filter': 1,
|
||||
'label': 'Item Group',
|
||||
'oldfieldname': 'item_group',
|
||||
@ -111,7 +107,7 @@
|
||||
'options': 'Item Group',
|
||||
'permlevel': 1,
|
||||
'print_hide': 1,
|
||||
'search_index': 0
|
||||
'search_index': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
@ -119,7 +115,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'rate',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 6,
|
||||
'label': 'Rate (Default Curr.)',
|
||||
'oldfieldname': 'rate',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -134,7 +129,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'import_rate',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 7,
|
||||
'label': 'Rate',
|
||||
'oldfieldname': 'import_rate',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -149,7 +143,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'qty',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 8,
|
||||
'label': 'Qty',
|
||||
'oldfieldname': 'qty',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -164,7 +157,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'amount',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 9,
|
||||
'label': 'Amount (Default Curr.)',
|
||||
'oldfieldname': 'amount',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -178,7 +170,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'import_amount',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 10,
|
||||
'label': 'Amount',
|
||||
'oldfieldname': 'import_amount',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -192,7 +183,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'expense_head',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 11,
|
||||
'label': 'Expense Head',
|
||||
'oldfieldname': 'expense_head',
|
||||
'oldfieldtype': 'Link',
|
||||
@ -210,7 +200,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'cost_center',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 12,
|
||||
'label': 'Cost Center',
|
||||
'oldfieldname': 'cost_center',
|
||||
'oldfieldtype': 'Link',
|
||||
@ -221,12 +210,24 @@
|
||||
'width': '120px'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'colour': 'White:FFF',
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'project_name',
|
||||
'fieldtype': 'Link',
|
||||
'in_filter': 1,
|
||||
'label': 'Project Name',
|
||||
'options': 'Project',
|
||||
'permlevel': 0,
|
||||
'print_hide': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'purchase_order',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 13,
|
||||
'in_filter': 1,
|
||||
'label': 'Pur Order',
|
||||
'oldfieldname': 'purchase_order',
|
||||
@ -243,7 +244,6 @@
|
||||
'fieldname': 'po_detail',
|
||||
'fieldtype': 'Data',
|
||||
'hidden': 1,
|
||||
'idx': 14,
|
||||
'in_filter': 1,
|
||||
'label': 'PO Detail',
|
||||
'oldfieldname': 'po_detail',
|
||||
@ -258,7 +258,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'purchase_receipt',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 15,
|
||||
'in_filter': 1,
|
||||
'label': 'Pur Receipt',
|
||||
'oldfieldname': 'purchase_receipt',
|
||||
@ -275,7 +274,6 @@
|
||||
'fieldname': 'pr_detail',
|
||||
'fieldtype': 'Data',
|
||||
'hidden': 1,
|
||||
'idx': 16,
|
||||
'in_filter': 1,
|
||||
'label': 'PR Detail',
|
||||
'oldfieldname': 'pr_detail',
|
||||
@ -291,7 +289,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'item_tax_rate',
|
||||
'fieldtype': 'Small Text',
|
||||
'idx': 17,
|
||||
'label': 'Item Tax Rate',
|
||||
'oldfieldname': 'item_tax_rate',
|
||||
'oldfieldtype': 'Small Text',
|
||||
@ -306,7 +303,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'page_break',
|
||||
'fieldtype': 'Check',
|
||||
'idx': 18,
|
||||
'label': 'Page Break',
|
||||
'no_copy': 1,
|
||||
'permlevel': 0,
|
||||
|
@ -48,9 +48,9 @@ cur_frm.cscript.onload_post_render = function(doc, dt, dn) {
|
||||
// Hide Fields
|
||||
// ------------
|
||||
cur_frm.cscript.hide_fields = function(doc, cdt, cdn) {
|
||||
par_flds =['project_name', 'due_date', 'posting_time', 'sales_order_main', 'delivery_note_main', 'Get Items', 'company', 'is_opening', 'currency', 'conversion_rate', 'price_list_name', 'cash_bank_account', 'source', 'cancel_reason', 'total_advance', 'gross_profit', 'gross_profit_percent', 'Get Advances Received', 'advance_adjustment_details', 'sales_partner', 'commission_rate', 'total_commission', 'Repair Outstanding Amt'];
|
||||
par_flds =['project_name', 'due_date', 'posting_time', 'sales_order_main', 'delivery_note_main', 'Get Items', 'is_opening', 'conversion_rate', 'source', 'cancel_reason', 'total_advance', 'gross_profit', 'gross_profit_percent', 'Get Advances Received', 'advance_adjustment_details', 'sales_partner', 'commission_rate', 'total_commission', 'Repair Outstanding Amt'];
|
||||
|
||||
ch_flds = {'entries': ['income_account', 'warehouse', 'cost_center', 'sales_order', 'delivery_note']}
|
||||
ch_flds = {'entries': ['sales_order', 'delivery_note']}
|
||||
|
||||
if(cint(doc.is_pos) == 1) {
|
||||
hide_field(par_flds);
|
||||
@ -74,6 +74,9 @@ cur_frm.cscript.hide_fields = function(doc, cdt, cdn) {
|
||||
// -------
|
||||
cur_frm.cscript.refresh = function(doc, dt, dn) {
|
||||
|
||||
cur_frm.cscript.is_opening(doc, dt, dn);
|
||||
cur_frm.cscript.hide_fields(doc, cdt, cdn);
|
||||
|
||||
// Show / Hide button
|
||||
cur_frm.clear_custom_buttons();
|
||||
|
||||
@ -90,8 +93,6 @@ cur_frm.cscript.refresh = function(doc, dt, dn) {
|
||||
}
|
||||
else
|
||||
hide_field('Repair Outstanding Amt');
|
||||
cur_frm.cscript.is_opening(doc, dt, dn);
|
||||
cur_frm.cscript.hide_fields(doc, cdt, cdn);
|
||||
}
|
||||
|
||||
//fetch retail transaction related fields
|
||||
|
@ -5,14 +5,23 @@
|
||||
{
|
||||
'creation': '2010-08-08 17:09:18',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-10-10 12:29:26',
|
||||
'modified': '2011-10-19 16:31:54',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
|
||||
# These values are common for all DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'name': '__common__',
|
||||
'parent': 'Receivable Voucher',
|
||||
'parentfield': 'fields',
|
||||
'parenttype': 'DocType'
|
||||
},
|
||||
|
||||
# These values are common for all DocType
|
||||
{
|
||||
'_last_update': '1317986484',
|
||||
'_last_update': '1319014846',
|
||||
'change_log': '1. Change in pull_details method dt.-26-06-2009',
|
||||
'colour': 'White:FFF',
|
||||
'default_print_format': 'Standard',
|
||||
@ -25,15 +34,16 @@
|
||||
'server_code_error': ' ',
|
||||
'show_in_menu': 0,
|
||||
'subject': 'To %(customer_name)s worth %(currency)s %(grand_total_export)s due on %(due_date)s | %(outstanding_amount)s outstanding',
|
||||
'version': 359
|
||||
'version': 363
|
||||
},
|
||||
|
||||
# These values are common for all DocField
|
||||
# These values are common for all DocFormat
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'doctype': 'DocFormat',
|
||||
'format': 'POS Invoice',
|
||||
'name': '__common__',
|
||||
'parent': 'Receivable Voucher',
|
||||
'parentfield': 'fields',
|
||||
'parentfield': 'formats',
|
||||
'parenttype': 'DocType'
|
||||
},
|
||||
|
||||
@ -114,6 +124,11 @@
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocFormat
|
||||
{
|
||||
'doctype': 'DocFormat'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
|
@ -5,7 +5,7 @@ report.customize_filters = function() {
|
||||
|
||||
this.add_filter({fieldname:'period', label:'Period', fieldtype:'Select', options:'Monthly'+NEWLINE+'Quarterly'+NEWLINE+'Half Yearly'+NEWLINE+'Annual',report_default:'Quarterly',ignore : 1, parent:'Profile',in_first_page:1,single_select:1});
|
||||
|
||||
this.add_filter({fieldname:'based_on', label:'Based On', fieldtype:'Select', options:'Item'+NEWLINE+'Item Group'+NEWLINE+'Customer'+NEWLINE+'Customer Group'+NEWLINE+'Territory'+NEWLINE+'Supplier'+NEWLINE+'Supplier Type', ignore : 1, parent:'Profile', report_default:'Item', in_first_page : 1,single_select:1});
|
||||
this.add_filter({fieldname:'based_on', label:'Based On', fieldtype:'Select', options:'Item'+NEWLINE+'Item Group'+NEWLINE+'Customer'+NEWLINE+'Customer Group'+NEWLINE+'Territory'+NEWLINE+'Supplier'+NEWLINE+'Supplier Type'+NEWLINE+'Project', ignore : 1, parent:'Profile', report_default:'Item', in_first_page : 1,single_select:1});
|
||||
|
||||
this.add_filter({fieldname:'group_by', label:'Group By', fieldtype:'Select', options:NEWLINE+'Item'+NEWLINE+'Customer'+NEWLINE+'Supplier', ignore : 1, parent:'Profile',single_select:1});
|
||||
|
||||
@ -24,6 +24,7 @@ report.customize_filters = function() {
|
||||
this.add_filter({fieldname:'territory', label:'Territory', fieldtype:'Link', options:'Territory', ignore : 1, parent:'Profile'});
|
||||
this.add_filter({fieldname:'supplier', label:'Supplier', fieldtype:'Link', options:'Supplier', ignore : 1, parent:'Profile'});
|
||||
this.add_filter({fieldname:'supplier_type', label:'Supplier Type', fieldtype:'Link', options:'Supplier Type', ignore : 1, parent:'Profile'});
|
||||
this.add_filter({fieldname:'project', label:'Project', fieldtype:'Link', options:'Project', ignore : 1, parent:'Profile'});
|
||||
}
|
||||
|
||||
|
||||
@ -99,6 +100,15 @@ report.get_query = function() {
|
||||
add_cond += ' AND t1.supplier = t3.name';
|
||||
if(supp_type) add_cond += ' AND t1.supplier_type = "'+supp_type+'"';
|
||||
break;
|
||||
case 'Project' : pro = this.get_filter('Profile', 'Project').get_value();
|
||||
if (inList(['Purchase Order', 'Purchase Receipt', 'Payable Voucher'], trans)) {
|
||||
col = 'DISTINCT t2.project_name';
|
||||
if(pro) add_cond += ' AND t2.project_name = "'+pro+'"';
|
||||
} else {
|
||||
col = 'DISTINCT t1.project_name';
|
||||
if(pro) add_cond += ' AND t1.project_name = "'+pro+'"';
|
||||
}
|
||||
break;
|
||||
case 'Item Group' : ig = this.get_filter('Profile', 'Item Group').get_value();
|
||||
if(ig) sp_cond += ' AND parent.name = "'+ig+'"';
|
||||
break;
|
||||
@ -108,10 +118,11 @@ report.get_query = function() {
|
||||
case 'Territory' : ter = this.get_filter('Profile', 'Territory').get_value();
|
||||
if(ter) sp_cond += ' AND parent.name = "'+ter+'"';
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
|
||||
if(based_on == 'Item' || based_on == 'Customer' || based_on == 'Supplier' || based_on == 'Supplier Type')
|
||||
if(based_on == 'Item' || based_on == 'Customer' || based_on == 'Supplier' || based_on == 'Supplier Type' || based_on == 'Project')
|
||||
var q ='SELECT '+col+' FROM `tab'+trans+'` t1, `tab'+trans_det+'` t2 '+add_tables+' WHERE t1.fiscal_year = "'+fiscal_year+'" and t1.company = "'+company+'" and t2.parent = t1.name '+add_cond;
|
||||
else
|
||||
var q = 'SELECT CONCAT(REPEAT(" ", COUNT(parent.name) - 1), node.name) AS "Name" FROM `tab'+based_on+'` node,`tab'+based_on+'` parent WHERE node.lft BETWEEN parent.lft and parent.rgt and node.docstatus !=2 '+sp_cond+' GROUP BY node.name ORDER BY node.lft';
|
||||
|
@ -17,7 +17,7 @@ customer_group = filter_values.get('customer_group')
|
||||
territory = filter_values.get('territory')
|
||||
supplier = filter_values.get('supplier')
|
||||
supplier_type = filter_values.get('supplier_type')
|
||||
|
||||
project = filter_values.get('project')
|
||||
|
||||
|
||||
# ********************************************* SET DEFAULTS **************************************************
|
||||
@ -41,41 +41,41 @@ col_names.append('Total (Amt)')
|
||||
|
||||
# ********************************************* VALIDATIONS ***************************************************
|
||||
if (based_on in ['Customer','Customer Group','Territory'] and group_by == 'Supplier') or (based_on in ['Supplier','Supplier Type'] and group_by == 'Customer'):
|
||||
msgprint("Sorry! You cannot group Trend Analyzer based on %s by %s" % (based_on,group_by))
|
||||
raise Exception
|
||||
msgprint("Sorry! You cannot group Trend Analyzer based on %s by %s" % (based_on,group_by))
|
||||
raise Exception
|
||||
|
||||
if based_on == group_by:
|
||||
msgprint("Based On and Group By value cannot be same for Trend Analyzer")
|
||||
raise Exception
|
||||
msgprint("Based On and Group By value cannot be same for Trend Analyzer")
|
||||
raise Exception
|
||||
|
||||
|
||||
# ********************************************** ADD COLUMNS **********************************************
|
||||
cols = [[based_on, 'Data', '300px', '']]
|
||||
cr = 1
|
||||
if based_on == 'Item':
|
||||
cols.append(['Item Name','Data','200px',''])
|
||||
cr = 2
|
||||
cols.append(['Item Name','Data','200px',''])
|
||||
cr = 2
|
||||
elif based_on == 'Customer':
|
||||
cols.append(['Territory','Link','150px','Territory'])
|
||||
cr = 2
|
||||
cols.append(['Territory','Link','150px','Territory'])
|
||||
cr = 2
|
||||
elif based_on == 'Supplier':
|
||||
cols.append(['Supplier Type','Link','150px','Supplier Type'])
|
||||
cr = 2
|
||||
cols.append(['Supplier Type','Link','150px','Supplier Type'])
|
||||
cr = 2
|
||||
if group_by:
|
||||
cr += 1
|
||||
cr += 1
|
||||
|
||||
if group_by:
|
||||
cols.append([group_by,'Data','150px',''])
|
||||
cols.append([group_by,'Data','150px',''])
|
||||
|
||||
for c in col_names:
|
||||
cols.append([c,'Currency','150px',''])
|
||||
cols.append([c,'Currency','150px',''])
|
||||
|
||||
for c in cols:
|
||||
colnames.append(c[0])
|
||||
coltypes.append(c[1])
|
||||
colwidths.append(c[2])
|
||||
coloptions.append(c[3])
|
||||
col_idx[c[0]] = len(colnames)-1
|
||||
colnames.append(c[0])
|
||||
coltypes.append(c[1])
|
||||
colwidths.append(c[2])
|
||||
coloptions.append(c[3])
|
||||
col_idx[c[0]] = len(colnames)-1
|
||||
|
||||
|
||||
# ******************************************* ADDITIONAL CONDITION ************************************************
|
||||
@ -86,75 +86,81 @@ if order_type: add_cond += ' AND t1.order_type = "%s"' % order_type
|
||||
|
||||
# Item
|
||||
if item or based_on == 'Item':
|
||||
add_cond += ' AND t2.item_code = "%s"' % (based_on != 'Item' and item or '%(value)s')
|
||||
add_cond += ' AND t2.item_code = "%s"' % (based_on != 'Item' and item or '%(value)s')
|
||||
|
||||
# Item Group
|
||||
if item_group or based_on == 'Item Group':
|
||||
add_tab += ' ,`tabItem` t3, `tabItem Group` t4 '
|
||||
add_cond += ' AND t3.name = t2.item_code AND t3.item_group = t4.name and (t4.name = "%s" or t4.name IN (SELECT t5.name FROM `tabItem Group` t5,`tabItem Group` t6 WHERE t5.lft BETWEEN t6.lft and t6.rgt and t5.docstatus !=2 and ifnull(t5.is_group,"No") = "No" and t6.name = "%s"))' % (based_on != 'Item Group' and item_group or '%(value)s', based_on != 'Item Group' and item_group or '%(value)s')
|
||||
add_tab += ' ,`tabItem` t3, `tabItem Group` t4 '
|
||||
add_cond += ' AND t3.name = t2.item_code AND t3.item_group = t4.name and (t4.name = "%s" or t4.name IN (SELECT t5.name FROM `tabItem Group` t5,`tabItem Group` t6 WHERE t5.lft BETWEEN t6.lft and t6.rgt and t5.docstatus !=2 and ifnull(t5.is_group,"No") = "No" and t6.name = "%s"))' % (based_on != 'Item Group' and item_group or '%(value)s', based_on != 'Item Group' and item_group or '%(value)s')
|
||||
|
||||
# Customer
|
||||
if customer or based_on == 'Customer':
|
||||
add_cond += ' AND t1.customer = "%s"' % (based_on != 'Customer' and customer or '%(value)s')
|
||||
add_cond += ' AND t1.customer = "%s"' % (based_on != 'Customer' and customer or '%(value)s')
|
||||
|
||||
# Customer Group
|
||||
if customer_group or based_on == 'Customer Group':
|
||||
add_tab += ' ,`tabCustomer` t7, `tabCustomer Group` t8 '
|
||||
add_cond += ' AND t7.name = t1.customer AND t7.customer_group = t8.name and (t8.name = "%s" or t8.name IN (SELECT t9.name FROM `tabCustomer Group` t9,`tabCustomer Group` t10 WHERE t9.lft BETWEEN t10.lft and t10.rgt and t9.docstatus !=2 and ifnull(t9.is_group,"No") = "No" and t10.name = "%s"))' % (based_on != 'Customer Group' and customer_group or '%(value)s', based_on != 'Customer Group' and customer_group or '%(value)s')
|
||||
|
||||
add_tab += ' ,`tabCustomer` t7, `tabCustomer Group` t8 '
|
||||
add_cond += ' AND t7.name = t1.customer AND t7.customer_group = t8.name and (t8.name = "%s" or t8.name IN (SELECT t9.name FROM `tabCustomer Group` t9,`tabCustomer Group` t10 WHERE t9.lft BETWEEN t10.lft and t10.rgt and t9.docstatus !=2 and ifnull(t9.is_group,"No") = "No" and t10.name = "%s"))' % (based_on != 'Customer Group' and customer_group or '%(value)s', based_on != 'Customer Group' and customer_group or '%(value)s')
|
||||
|
||||
# Territory
|
||||
if territory or based_on == 'Territory':
|
||||
add_tab += ' ,`tabTerritory` t11 '
|
||||
add_cond += ' AND t1.territory = t11.name AND t1.territory = t11.name and (t11.name = "%s" or t11.name IN (SELECT t12.name FROM `tabTerritory` t12,`tabTerritory` t13 WHERE t12.lft BETWEEN t13.lft and t13.rgt and t12.docstatus !=2 and ifnull(t12.is_group,"No") = "No" and t13.name = "%s"))' % (based_on != 'Territory' and territory or '%(value)s', based_on != 'Territory' and territory or '%(value)s')
|
||||
add_tab += ' ,`tabTerritory` t11 '
|
||||
add_cond += ' AND t1.territory = t11.name AND t1.territory = t11.name and (t11.name = "%s" or t11.name IN (SELECT t12.name FROM `tabTerritory` t12,`tabTerritory` t13 WHERE t12.lft BETWEEN t13.lft and t13.rgt and t12.docstatus !=2 and ifnull(t12.is_group,"No") = "No" and t13.name = "%s"))' % (based_on != 'Territory' and territory or '%(value)s', based_on != 'Territory' and territory or '%(value)s')
|
||||
|
||||
# Supplier
|
||||
if supplier or based_on == 'Supplier':
|
||||
add_cond += ' AND t1.supplier = "%s"' % (based_on != 'Supplier' and supplier or '%(value)s')
|
||||
|
||||
add_cond += ' AND t1.supplier = "%s"' % (based_on != 'Supplier' and supplier or '%(value)s')
|
||||
|
||||
# Supplier Type
|
||||
if supplier_type or based_on == 'Supplier Type':
|
||||
add_tab += ' ,`tabSupplier` t14, `tabSupplier Type` t15 '
|
||||
add_cond += ' AND t14.name = t1.supplier AND t14.supplier_type = t15.name and t15.name = "%s"' % (based_on != 'Supplier Type' and supplier_type or '%(value)s')
|
||||
add_tab += ' ,`tabSupplier` t14, `tabSupplier Type` t15 '
|
||||
add_cond += ' AND t14.name = t1.supplier AND t14.supplier_type = t15.name and t15.name = "%s"' % (based_on != 'Supplier Type' and supplier_type or '%(value)s')
|
||||
|
||||
|
||||
# Project
|
||||
if project or based_on == 'Project':
|
||||
if trans in ['Purchase Order', 'Purchase Receipt', 'Payable Voucher']:
|
||||
add_cond += ' AND t2.project_name = "%s"' % (based_on != 'Project' and project or '%(value)s')
|
||||
else:
|
||||
add_cond += ' AND t1.project_name = "%s"' % (based_on != 'Project' and project or '%(value)s')
|
||||
|
||||
# Column to be seleted for group by condition
|
||||
# ==============================================
|
||||
sel_col = ''
|
||||
if group_by == 'Item':
|
||||
sel_col = 't2.item_code'
|
||||
sel_col = 't2.item_code'
|
||||
elif group_by == 'Customer':
|
||||
sel_col = 't1.customer'
|
||||
sel_col = 't1.customer'
|
||||
elif group_by == 'Supplier':
|
||||
sel_col = 't1.supplier'
|
||||
|
||||
|
||||
sel_col = 't1.supplier'
|
||||
|
||||
|
||||
# ********************************************** Result Set ************************************************
|
||||
for r in res:
|
||||
main_det = sql("SELECT %s FROM %s WHERE %s" % (query_val, add_tab, add_cond % {'value':cstr(r[col_idx[based_on]]).strip()}))
|
||||
if group_by:
|
||||
for col in range(cr,cr+1): # this would make all first row blank. just for look
|
||||
r.append('')
|
||||
if main_det[0][len(colnames) - cr - 1]:
|
||||
for d in range(len(colnames) - cr):
|
||||
r.append(flt(main_det[0][d]))
|
||||
out.append(r)
|
||||
|
||||
if group_by:
|
||||
flag = 1
|
||||
# check for root nodes
|
||||
if based_on in ['Item Group','Customer Group','Territory']:
|
||||
is_grp = sql("select is_group from `tab%s` where name = '%s'" % (based_on, cstr(r[col_idx[based_on]]).strip()))
|
||||
is_grp = is_grp and cstr(is_grp[0][0]) or ''
|
||||
if is_grp != 'No':
|
||||
flag = 0
|
||||
main_det = sql("SELECT %s FROM %s WHERE %s" % (query_val, add_tab, add_cond % {'value':cstr(r[col_idx[based_on]]).strip()}))
|
||||
if group_by:
|
||||
for col in range(cr,cr+1): # this would make all first row blank. just for look
|
||||
r.append('')
|
||||
if main_det[0][len(colnames) - cr - 1]:
|
||||
for d in range(len(colnames) - cr):
|
||||
r.append(flt(main_det[0][d]))
|
||||
out.append(r)
|
||||
|
||||
if group_by:
|
||||
flag = 1
|
||||
# check for root nodes
|
||||
if based_on in ['Item Group','Customer Group','Territory']:
|
||||
is_grp = sql("select is_group from `tab%s` where name = '%s'" % (based_on, cstr(r[col_idx[based_on]]).strip()))
|
||||
is_grp = is_grp and cstr(is_grp[0][0]) or ''
|
||||
if is_grp != 'No':
|
||||
flag = 0
|
||||
|
||||
if flag == 1:
|
||||
det = [x[0] for x in sql("SELECT DISTINCT %s FROM %s where %s" % (sel_col, add_tab, add_cond % {'value':cstr(r[col_idx[based_on]]).strip()}))]
|
||||
if flag == 1:
|
||||
det = [x[0] for x in sql("SELECT DISTINCT %s FROM %s where %s" % (sel_col, add_tab, add_cond % {'value':cstr(r[col_idx[based_on]]).strip()}))]
|
||||
|
||||
for des in range(len(det)):
|
||||
t_row = ['' for i in range(len(colnames))]
|
||||
t_row[col_idx[group_by]] = cstr(det[des])
|
||||
gr_det = sql("SELECT %s FROM %s WHERE %s = '%s' and %s" % (query_val, add_tab, sel_col, cstr(det[des]), add_cond % {'value':cstr(r[col_idx[based_on]]).strip()}))
|
||||
for d in range(len(col_names)):
|
||||
t_row[col_idx[col_names[d]]] = flt(gr_det[0][d])
|
||||
out.append(t_row)
|
||||
for des in range(len(det)):
|
||||
t_row = ['' for i in range(len(colnames))]
|
||||
t_row[col_idx[group_by]] = cstr(det[des])
|
||||
gr_det = sql("SELECT %s FROM %s WHERE %s = '%s' and %s" % (query_val, add_tab, sel_col, cstr(det[des]), add_cond % {'value':cstr(r[col_idx[based_on]]).strip()}))
|
||||
for d in range(len(col_names)):
|
||||
t_row[col_idx[col_names[d]]] = flt(gr_det[0][d])
|
||||
out.append(t_row)
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -5,16 +5,17 @@
|
||||
{
|
||||
'creation': '2010-08-08 17:09:04',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-05-04 14:53:17',
|
||||
'modified': '2011-10-12 13:09:38',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
|
||||
# These values are common for all DocType
|
||||
{
|
||||
'_last_update': '1304500997',
|
||||
'_last_update': '1318404775',
|
||||
'allow_print': 0,
|
||||
'colour': 'White:FFF',
|
||||
'default_print_format': 'Standard',
|
||||
'doctype': 'DocType',
|
||||
'module': 'Buying',
|
||||
'name': '__common__',
|
||||
@ -24,7 +25,7 @@
|
||||
'server_code_error': ' ',
|
||||
'show_in_menu': 0,
|
||||
'subject': '%(per_ordered)s% ordered',
|
||||
'version': 186
|
||||
'version': 188
|
||||
},
|
||||
|
||||
# These values are common for all DocField
|
||||
@ -52,13 +53,24 @@
|
||||
'name': 'Indent'
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 1,
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
'doctype': 'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': 'Production Manager',
|
||||
'submit': 1,
|
||||
'write': 1
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 1,
|
||||
'permlevel': 1,
|
||||
'role': 'Purchase Manager',
|
||||
'submit': 0,
|
||||
@ -71,7 +83,6 @@
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 2,
|
||||
'permlevel': 0,
|
||||
'role': 'Purchase Manager',
|
||||
'submit': 1,
|
||||
@ -84,7 +95,6 @@
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 3,
|
||||
'permlevel': 1,
|
||||
'role': 'Material Manager',
|
||||
'submit': 0,
|
||||
@ -97,7 +107,6 @@
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 4,
|
||||
'permlevel': 0,
|
||||
'role': 'Material Manager',
|
||||
'submit': 1,
|
||||
@ -110,7 +119,6 @@
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 5,
|
||||
'permlevel': 1,
|
||||
'role': 'Material User',
|
||||
'submit': 0,
|
||||
@ -123,7 +131,6 @@
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 6,
|
||||
'permlevel': 0,
|
||||
'role': 'Material User',
|
||||
'submit': 1,
|
||||
@ -136,7 +143,6 @@
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 7,
|
||||
'permlevel': 0,
|
||||
'role': 'Purchase User',
|
||||
'submit': 1,
|
||||
@ -145,10 +151,14 @@
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 8,
|
||||
'permlevel': 1,
|
||||
'role': 'Purchase User'
|
||||
'role': 'Purchase User',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
@ -158,7 +168,6 @@
|
||||
'description': 'Enter items and their details for which you want your purchase department to raise a purchase order.',
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'idx': 1,
|
||||
'label': 'Basic Info',
|
||||
'oldfieldtype': 'Section Break',
|
||||
'permlevel': 0,
|
||||
@ -169,7 +178,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Column Break',
|
||||
'idx': 2,
|
||||
'oldfieldtype': 'Column Break',
|
||||
'permlevel': 0,
|
||||
'print_hide': 0,
|
||||
@ -183,7 +191,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'naming_series',
|
||||
'fieldtype': 'Select',
|
||||
'idx': 3,
|
||||
'label': 'Series',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'naming_series',
|
||||
@ -199,7 +206,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'status',
|
||||
'fieldtype': 'Select',
|
||||
'idx': 4,
|
||||
'in_filter': 1,
|
||||
'label': 'Status',
|
||||
'no_copy': 1,
|
||||
@ -216,7 +222,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Column Break',
|
||||
'idx': 5,
|
||||
'oldfieldtype': 'Column Break',
|
||||
'permlevel': 0,
|
||||
'width': '50%'
|
||||
@ -229,7 +234,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'transaction_date',
|
||||
'fieldtype': 'Date',
|
||||
'idx': 6,
|
||||
'in_filter': 1,
|
||||
'label': 'Indent Date',
|
||||
'no_copy': 1,
|
||||
@ -249,7 +253,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'per_ordered',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 7,
|
||||
'label': '% Ordered',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'per_ordered',
|
||||
@ -262,7 +265,6 @@
|
||||
'colour': 'White:FFF',
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'idx': 8,
|
||||
'label': 'Items',
|
||||
'oldfieldtype': 'Section Break',
|
||||
'permlevel': 0
|
||||
@ -275,14 +277,12 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'sales_order_no',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 9,
|
||||
'label': 'Sales Order No',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'sales_order_no',
|
||||
'oldfieldtype': 'Data',
|
||||
'options': 'Sales Order',
|
||||
'permlevel': 0,
|
||||
'search_index': 0,
|
||||
'width': '100px'
|
||||
},
|
||||
|
||||
@ -290,7 +290,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Button',
|
||||
'idx': 10,
|
||||
'label': 'Pull Sales Order Details',
|
||||
'options': 'pull_so_details',
|
||||
'permlevel': 0
|
||||
@ -298,10 +297,11 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'allow_on_submit': 1,
|
||||
'colour': 'White:FFF',
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'indent_details',
|
||||
'fieldtype': 'Table',
|
||||
'idx': 11,
|
||||
'label': 'Indent Details',
|
||||
'no_copy': 0,
|
||||
'oldfieldname': 'indent_details',
|
||||
@ -317,7 +317,6 @@
|
||||
'description': 'Filing in Additional Information about the Indent will help you analyze your data better.',
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'idx': 12,
|
||||
'label': 'More Info',
|
||||
'oldfieldtype': 'Section Break',
|
||||
'permlevel': 0
|
||||
@ -330,7 +329,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'company',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 13,
|
||||
'in_filter': 1,
|
||||
'label': 'Company',
|
||||
'oldfieldname': 'company',
|
||||
@ -339,7 +337,7 @@
|
||||
'permlevel': 0,
|
||||
'print_hide': 1,
|
||||
'reqd': 1,
|
||||
'search_index': 0,
|
||||
'search_index': 1,
|
||||
'width': '150px'
|
||||
},
|
||||
|
||||
@ -349,7 +347,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'fiscal_year',
|
||||
'fieldtype': 'Select',
|
||||
'idx': 14,
|
||||
'in_filter': 1,
|
||||
'label': 'Fiscal Year',
|
||||
'oldfieldname': 'fiscal_year',
|
||||
@ -358,7 +355,7 @@
|
||||
'permlevel': 0,
|
||||
'print_hide': 1,
|
||||
'reqd': 1,
|
||||
'search_index': 0,
|
||||
'search_index': 1,
|
||||
'width': '150px'
|
||||
},
|
||||
|
||||
@ -369,7 +366,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'requested_by',
|
||||
'fieldtype': 'Data',
|
||||
'idx': 15,
|
||||
'label': 'Requested By',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'requested_by',
|
||||
@ -382,7 +378,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Column Break',
|
||||
'idx': 16,
|
||||
'oldfieldtype': 'Column Break',
|
||||
'permlevel': 0,
|
||||
'width': '50%'
|
||||
@ -393,7 +388,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'remark',
|
||||
'fieldtype': 'Small Text',
|
||||
'idx': 17,
|
||||
'label': 'Remarks',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'remark',
|
||||
@ -410,7 +404,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'cancel_reason',
|
||||
'fieldtype': 'Data',
|
||||
'idx': 18,
|
||||
'label': 'Cancel Reason',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'cancel_reason',
|
||||
@ -424,7 +417,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'amended_from',
|
||||
'fieldtype': 'Data',
|
||||
'idx': 19,
|
||||
'label': 'Amended From',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'amended_from',
|
||||
@ -440,7 +432,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'amendment_date',
|
||||
'fieldtype': 'Date',
|
||||
'idx': 20,
|
||||
'label': 'Amendment Date',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'amendment_date',
|
||||
@ -455,7 +446,6 @@
|
||||
'description': 'Add Terms and Conditions for the Indent. You can also prepare a master Term Sheet and use the Template',
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'idx': 21,
|
||||
'label': 'Terms',
|
||||
'oldfieldtype': 'Section Break',
|
||||
'permlevel': 0
|
||||
@ -467,7 +457,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'letter_head',
|
||||
'fieldtype': 'Select',
|
||||
'idx': 22,
|
||||
'label': 'Letter Head',
|
||||
'oldfieldname': 'letter_head',
|
||||
'oldfieldtype': 'Select',
|
||||
@ -481,22 +470,19 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'tc_name',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 23,
|
||||
'label': 'Select Terms',
|
||||
'oldfieldname': 'tc_name',
|
||||
'oldfieldtype': 'Link',
|
||||
'options': 'Term',
|
||||
'permlevel': 0,
|
||||
'print_hide': 1,
|
||||
'report_hide': 1,
|
||||
'search_index': 0
|
||||
'report_hide': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Button',
|
||||
'idx': 24,
|
||||
'label': 'Get Terms',
|
||||
'oldfieldtype': 'Button',
|
||||
'options': 'get_tc_details',
|
||||
@ -507,7 +493,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'HTML',
|
||||
'idx': 25,
|
||||
'label': 'Terms HTML',
|
||||
'oldfieldtype': 'HTML',
|
||||
'options': 'You can add Terms and Notes that will be printed in the Transaction',
|
||||
@ -520,7 +505,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'terms',
|
||||
'fieldtype': 'Text Editor',
|
||||
'idx': 26,
|
||||
'label': 'Terms1',
|
||||
'oldfieldname': 'terms',
|
||||
'oldfieldtype': 'Text Editor',
|
||||
@ -531,7 +515,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Column Break',
|
||||
'idx': 27,
|
||||
'oldfieldtype': 'Column Break',
|
||||
'permlevel': 0,
|
||||
'print_hide': 1
|
||||
@ -543,7 +526,6 @@
|
||||
'colour': 'White:FFF',
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Button',
|
||||
'idx': 28,
|
||||
'label': 'Repair Indent',
|
||||
'oldfieldtype': 'Button',
|
||||
'options': 'repair_indent',
|
||||
|
@ -5,7 +5,7 @@
|
||||
{
|
||||
'creation': '2010-08-08 17:09:04',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-05-04 14:41:43',
|
||||
'modified': '2011-10-12 13:02:13',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
@ -14,6 +14,7 @@
|
||||
{
|
||||
'autoname': 'IDTD/.#####',
|
||||
'colour': 'White:FFF',
|
||||
'default_print_format': 'Standard',
|
||||
'doctype': 'DocType',
|
||||
'istable': 1,
|
||||
'module': 'Buying',
|
||||
@ -21,7 +22,7 @@
|
||||
'section_style': 'Tray',
|
||||
'server_code_error': ' ',
|
||||
'show_in_menu': 0,
|
||||
'version': 29
|
||||
'version': 34
|
||||
},
|
||||
|
||||
# These values are common for all DocField
|
||||
@ -44,7 +45,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'schedule_date',
|
||||
'fieldtype': 'Date',
|
||||
'idx': 1,
|
||||
'label': 'Required Date',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'schedule_date',
|
||||
@ -60,7 +60,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'item_code',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 2,
|
||||
'in_filter': 1,
|
||||
'label': 'Item Code',
|
||||
'oldfieldname': 'item_code',
|
||||
@ -78,14 +77,13 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'item_name',
|
||||
'fieldtype': 'Data',
|
||||
'idx': 3,
|
||||
'in_filter': 1,
|
||||
'label': 'Item Name',
|
||||
'oldfieldname': 'item_name',
|
||||
'oldfieldtype': 'Data',
|
||||
'permlevel': 0,
|
||||
'reqd': 1,
|
||||
'search_index': 0,
|
||||
'search_index': 1,
|
||||
'width': '100px'
|
||||
},
|
||||
|
||||
@ -94,7 +92,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'description',
|
||||
'fieldtype': 'Text',
|
||||
'idx': 4,
|
||||
'label': 'Description',
|
||||
'oldfieldname': 'description',
|
||||
'oldfieldtype': 'Text',
|
||||
@ -108,7 +105,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'warehouse',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 5,
|
||||
'label': 'Warehouse',
|
||||
'oldfieldname': 'warehouse',
|
||||
'oldfieldtype': 'Link',
|
||||
@ -125,14 +121,12 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'brand',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 6,
|
||||
'label': 'Brand',
|
||||
'oldfieldname': 'brand',
|
||||
'oldfieldtype': 'Link',
|
||||
'options': 'Brand',
|
||||
'permlevel': 1,
|
||||
'print_hide': 1,
|
||||
'search_index': 0,
|
||||
'width': '100px'
|
||||
},
|
||||
|
||||
@ -142,7 +136,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'item_group',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 7,
|
||||
'in_filter': 1,
|
||||
'label': 'Item Group',
|
||||
'no_copy': 0,
|
||||
@ -152,7 +145,7 @@
|
||||
'permlevel': 1,
|
||||
'print_hide': 1,
|
||||
'reqd': 0,
|
||||
'search_index': 0
|
||||
'search_index': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
@ -162,7 +155,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'qty',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 8,
|
||||
'label': 'Quantity',
|
||||
'no_copy': 0,
|
||||
'oldfieldname': 'qty',
|
||||
@ -178,7 +170,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'lead_time_date',
|
||||
'fieldtype': 'Date',
|
||||
'idx': 9,
|
||||
'label': 'Lead Time Date',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'lead_time_date',
|
||||
@ -192,7 +183,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'uom',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 10,
|
||||
'label': 'Stock UOM',
|
||||
'no_copy': 0,
|
||||
'oldfieldname': 'uom',
|
||||
@ -200,7 +190,6 @@
|
||||
'options': 'UOM',
|
||||
'permlevel': 1,
|
||||
'reqd': 1,
|
||||
'search_index': 0,
|
||||
'width': '50px'
|
||||
},
|
||||
|
||||
@ -209,7 +198,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'min_order_qty',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 11,
|
||||
'label': 'Min Order Qty',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'min_order_qty',
|
||||
@ -225,7 +213,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'projected_qty',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 12,
|
||||
'label': 'Projected Qty',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'projected_qty',
|
||||
@ -240,7 +227,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'ordered_qty',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 13,
|
||||
'label': 'Ordered Qty',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'ordered_qty',
|
||||
@ -253,9 +239,9 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'sales_order_no',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 14,
|
||||
'label': 'Sales Order No',
|
||||
'no_copy': 1,
|
||||
'options': 'Sales Order',
|
||||
'permlevel': 1,
|
||||
'print_hide': 1
|
||||
},
|
||||
@ -266,7 +252,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'page_break',
|
||||
'fieldtype': 'Check',
|
||||
'idx': 15,
|
||||
'label': 'Page Break',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'page_break',
|
||||
|
@ -5,8 +5,8 @@
|
||||
{
|
||||
'creation': '2010-08-08 17:09:12',
|
||||
'docstatus': 0,
|
||||
'modified': '2010-11-12 16:53:30',
|
||||
'modified_by': 'sneha@webnotestech.com',
|
||||
'modified': '2011-10-20 18:39:20',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
|
||||
@ -14,6 +14,7 @@
|
||||
{
|
||||
'autoname': 'POD/.#####',
|
||||
'colour': 'White:FFF',
|
||||
'default_print_format': 'Standard',
|
||||
'doctype': 'DocType',
|
||||
'istable': 1,
|
||||
'module': 'Buying',
|
||||
@ -21,7 +22,7 @@
|
||||
'section_style': 'Tray',
|
||||
'server_code_error': ' ',
|
||||
'show_in_menu': 0,
|
||||
'version': 46
|
||||
'version': 54
|
||||
},
|
||||
|
||||
# These values are common for all DocField
|
||||
@ -45,7 +46,6 @@
|
||||
'fieldname': 'schedule_date',
|
||||
'fieldtype': 'Date',
|
||||
'hidden': 0,
|
||||
'idx': 1,
|
||||
'in_filter': 1,
|
||||
'label': 'Reqd By Date',
|
||||
'no_copy': 1,
|
||||
@ -54,7 +54,7 @@
|
||||
'permlevel': 0,
|
||||
'print_hide': 1,
|
||||
'reqd': 1,
|
||||
'search_index': 0
|
||||
'search_index': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
@ -62,7 +62,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'item_code',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 2,
|
||||
'in_filter': 1,
|
||||
'label': 'Item Code',
|
||||
'oldfieldname': 'item_code',
|
||||
@ -81,7 +80,6 @@
|
||||
'fieldname': 'item_name',
|
||||
'fieldtype': 'Data',
|
||||
'hidden': 0,
|
||||
'idx': 3,
|
||||
'in_filter': 1,
|
||||
'label': 'Item Name',
|
||||
'oldfieldname': 'item_name',
|
||||
@ -89,7 +87,7 @@
|
||||
'permlevel': 0,
|
||||
'print_hide': 1,
|
||||
'reqd': 1,
|
||||
'search_index': 0
|
||||
'search_index': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
@ -97,7 +95,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'description',
|
||||
'fieldtype': 'Small Text',
|
||||
'idx': 4,
|
||||
'label': 'Description',
|
||||
'oldfieldname': 'description',
|
||||
'oldfieldtype': 'Small Text',
|
||||
@ -106,13 +103,43 @@
|
||||
'width': '300px'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'default': '0.00',
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'qty',
|
||||
'fieldtype': 'Currency',
|
||||
'label': 'Quantity',
|
||||
'oldfieldname': 'qty',
|
||||
'oldfieldtype': 'Currency',
|
||||
'permlevel': 0,
|
||||
'reqd': 1,
|
||||
'trigger': 'Client',
|
||||
'width': '60px'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'uom',
|
||||
'fieldtype': 'Link',
|
||||
'label': 'UOM',
|
||||
'oldfieldname': 'uom',
|
||||
'oldfieldtype': 'Link',
|
||||
'options': 'UOM',
|
||||
'permlevel': 0,
|
||||
'print_hide': 0,
|
||||
'reqd': 1,
|
||||
'trigger': 'Client',
|
||||
'width': '100px'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'default': '0.00',
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'purchase_rate',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 7,
|
||||
'label': 'Rate (Default Curr.)',
|
||||
'oldfieldname': 'purchase_rate',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -129,7 +156,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'amount',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 8,
|
||||
'label': 'Amount (Default Curr.)',
|
||||
'oldfieldname': 'amount',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -138,29 +164,12 @@
|
||||
'reqd': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'default': '0.00',
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'qty',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 9,
|
||||
'label': 'Quantity',
|
||||
'oldfieldname': 'qty',
|
||||
'oldfieldtype': 'Currency',
|
||||
'permlevel': 0,
|
||||
'reqd': 1,
|
||||
'trigger': 'Client',
|
||||
'width': '60px'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'import_rate',
|
||||
'fieldtype': 'Currency',
|
||||
'hidden': 0,
|
||||
'idx': 9,
|
||||
'label': 'Rate',
|
||||
'oldfieldname': 'import_rate',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -169,30 +178,11 @@
|
||||
'trigger': 'Client'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'uom',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 10,
|
||||
'label': 'UOM',
|
||||
'oldfieldname': 'uom',
|
||||
'oldfieldtype': 'Link',
|
||||
'options': 'UOM',
|
||||
'permlevel': 0,
|
||||
'print_hide': 0,
|
||||
'reqd': 1,
|
||||
'search_index': 0,
|
||||
'trigger': 'Client',
|
||||
'width': '100px'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'import_amount',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 10,
|
||||
'label': 'Amount',
|
||||
'oldfieldname': 'import_amount',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -205,7 +195,6 @@
|
||||
'fieldname': 'warehouse',
|
||||
'fieldtype': 'Link',
|
||||
'hidden': 0,
|
||||
'idx': 11,
|
||||
'label': 'Warehouse',
|
||||
'oldfieldname': 'warehouse',
|
||||
'oldfieldtype': 'Link',
|
||||
@ -223,7 +212,6 @@
|
||||
'fieldname': 'conversion_factor',
|
||||
'fieldtype': 'Currency',
|
||||
'hidden': 0,
|
||||
'idx': 11,
|
||||
'label': 'Conversion Factor',
|
||||
'oldfieldname': 'conversion_factor',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -238,16 +226,17 @@
|
||||
{
|
||||
'colour': 'White:FFF',
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'prevdoc_doctype',
|
||||
'fieldtype': 'Data',
|
||||
'hidden': 1,
|
||||
'idx': 12,
|
||||
'label': 'Prevdoc DocType',
|
||||
'no_copy': 0,
|
||||
'oldfieldname': 'prevdoc_doctype',
|
||||
'oldfieldtype': 'Data',
|
||||
'permlevel': 1,
|
||||
'print_hide': 1
|
||||
'fieldname': 'stock_qty',
|
||||
'fieldtype': 'Currency',
|
||||
'hidden': 0,
|
||||
'label': 'Stock Qty',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'stock_qty',
|
||||
'oldfieldtype': 'Currency',
|
||||
'permlevel': 0,
|
||||
'print_hide': 1,
|
||||
'trigger': 'Client',
|
||||
'width': '100px'
|
||||
},
|
||||
|
||||
# DocField
|
||||
@ -256,7 +245,6 @@
|
||||
'fieldname': 'stock_uom',
|
||||
'fieldtype': 'Data',
|
||||
'hidden': 0,
|
||||
'idx': 12,
|
||||
'label': 'Stock UOM',
|
||||
'oldfieldname': 'stock_uom',
|
||||
'oldfieldtype': 'Data',
|
||||
@ -266,6 +254,34 @@
|
||||
'width': '100px'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'project_name',
|
||||
'fieldtype': 'Link',
|
||||
'in_filter': 1,
|
||||
'label': 'Project Name',
|
||||
'options': 'Project',
|
||||
'permlevel': 0,
|
||||
'print_hide': 1,
|
||||
'report_hide': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'colour': 'White:FFF',
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'prevdoc_doctype',
|
||||
'fieldtype': 'Data',
|
||||
'hidden': 1,
|
||||
'label': 'Prevdoc DocType',
|
||||
'no_copy': 0,
|
||||
'oldfieldname': 'prevdoc_doctype',
|
||||
'oldfieldtype': 'Data',
|
||||
'permlevel': 1,
|
||||
'print_hide': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'colour': 'White:FFF',
|
||||
@ -273,7 +289,6 @@
|
||||
'fieldname': 'prevdoc_docname',
|
||||
'fieldtype': 'Link',
|
||||
'hidden': 0,
|
||||
'idx': 13,
|
||||
'in_filter': 1,
|
||||
'label': 'Indent No',
|
||||
'no_copy': 0,
|
||||
@ -292,7 +307,6 @@
|
||||
'fieldname': 'prevdoc_date',
|
||||
'fieldtype': 'Date',
|
||||
'hidden': 0,
|
||||
'idx': 14,
|
||||
'in_filter': 1,
|
||||
'label': 'Indent Date',
|
||||
'oldfieldname': 'prevdoc_date',
|
||||
@ -309,7 +323,6 @@
|
||||
'fieldname': 'prevdoc_detail_docname',
|
||||
'fieldtype': 'Data',
|
||||
'hidden': 1,
|
||||
'idx': 15,
|
||||
'in_filter': 1,
|
||||
'label': 'Indent Detail No',
|
||||
'no_copy': 0,
|
||||
@ -326,14 +339,12 @@
|
||||
'fieldname': 'brand',
|
||||
'fieldtype': 'Link',
|
||||
'hidden': 0,
|
||||
'idx': 16,
|
||||
'label': 'Brand',
|
||||
'oldfieldname': 'brand',
|
||||
'oldfieldtype': 'Link',
|
||||
'options': 'Brand',
|
||||
'permlevel': 1,
|
||||
'print_hide': 1,
|
||||
'search_index': 0
|
||||
'print_hide': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
@ -342,7 +353,6 @@
|
||||
'fieldname': 'item_group',
|
||||
'fieldtype': 'Link',
|
||||
'hidden': 0,
|
||||
'idx': 17,
|
||||
'in_filter': 1,
|
||||
'label': 'Item Group',
|
||||
'oldfieldname': 'item_group',
|
||||
@ -350,24 +360,7 @@
|
||||
'options': 'Item Group',
|
||||
'permlevel': 1,
|
||||
'print_hide': 1,
|
||||
'search_index': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'stock_qty',
|
||||
'fieldtype': 'Currency',
|
||||
'hidden': 0,
|
||||
'idx': 20,
|
||||
'label': 'Stock Qty',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'stock_qty',
|
||||
'oldfieldtype': 'Currency',
|
||||
'permlevel': 0,
|
||||
'print_hide': 1,
|
||||
'trigger': 'Client',
|
||||
'width': '100px'
|
||||
'search_index': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
@ -376,7 +369,6 @@
|
||||
'fieldname': 'received_qty',
|
||||
'fieldtype': 'Currency',
|
||||
'hidden': 0,
|
||||
'idx': 21,
|
||||
'label': 'Received Qty',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'received_qty',
|
||||
@ -392,7 +384,6 @@
|
||||
'fieldname': 'billed_qty',
|
||||
'fieldtype': 'Currency',
|
||||
'hidden': 0,
|
||||
'idx': 22,
|
||||
'label': 'Billed Quantity',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'billed_qty',
|
||||
@ -409,7 +400,6 @@
|
||||
'fieldname': 'item_tax_rate',
|
||||
'fieldtype': 'Small Text',
|
||||
'hidden': 1,
|
||||
'idx': 23,
|
||||
'label': 'Item Tax Rate',
|
||||
'oldfieldname': 'item_tax_rate',
|
||||
'oldfieldtype': 'Small Text',
|
||||
@ -420,12 +410,11 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'allow_on_submit': 1,
|
||||
'allow_on_submit': 0,
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'page_break',
|
||||
'fieldtype': 'Check',
|
||||
'hidden': 0,
|
||||
'idx': 24,
|
||||
'label': 'Page Break',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'page_break',
|
||||
|
@ -111,11 +111,10 @@ cur_frm.cscript.transaction_date = function(doc,cdt,cdn){
|
||||
|
||||
|
||||
// ---------------------- Get project name --------------------------
|
||||
cur_frm.fields_dict['project_name'].get_query = function(doc, cdt, cdn) {
|
||||
cur_frm.fields_dict['po_details'].grid.get_field('project_name').get_query = function(doc, cdt, cdn) {
|
||||
return 'SELECT `tabProject`.name FROM `tabProject` WHERE `tabProject`.status = "Open" AND `tabProject`.name LIKE "%s" ORDER BY `tabProject`.name ASC LIMIT 50';
|
||||
}
|
||||
|
||||
|
||||
//==================== Indent No Get Query =======================================================
|
||||
//===== Only those Indents status != 'Completed' and docstatus = 1 i.e. submitted=================
|
||||
cur_frm.fields_dict['indent_no'].get_query = function(doc) {
|
||||
|
@ -31,6 +31,8 @@ class DocType:
|
||||
def get_modules(self):
|
||||
rl = webnotes.user.get_roles()
|
||||
ml = sql("select distinct t1.name, t1.module_icon, t1.module_label, t1.module_desc, t1.module_page from `tabModule Def` t1, `tabModule Def Role` t2 where t2.role in ('%s') and t1.disabled !='Yes' and ifnull(t1.is_hidden, 'No') != 'Yes' and t1.name = t2.parent order by t1.module_seq asc" % "','".join(rl), as_dict=1)
|
||||
webnotes.response['login_url'] = session['data'].get('login_from', '')
|
||||
|
||||
return ml
|
||||
|
||||
def get_module_details(self,m):
|
||||
@ -48,8 +50,6 @@ class DocType:
|
||||
AND t2.role IN ("%s")
|
||||
AND ifnull(standard,"No")="No"''' % (m, '", "'.join(webnotes.user.get_roles())), as_dict=1)
|
||||
|
||||
ret['login_url'] = session['data'].get('login_from', '')
|
||||
|
||||
return ret
|
||||
|
||||
# ----------------------------------------------------------------------------------------------------------------
|
||||
|
@ -242,7 +242,7 @@ MemberItem = function(parent, det, mlist) {
|
||||
// working img
|
||||
var div = $a($td(this.tab, 0, 1), 'div');
|
||||
this.working_img = $a(div,'img','',{display:'none'});
|
||||
this.working_img.src = 'images/ui/button-load.gif';
|
||||
this.working_img.src = 'lib/images/ui/button-load.gif';
|
||||
|
||||
this.refresh_name_link();
|
||||
|
||||
@ -731,7 +731,7 @@ RoleObj = function(profile_id){
|
||||
this.make_role_body(profile_id);
|
||||
this.make_help_body();
|
||||
|
||||
this.body.innerHTML = '<span style="color:#888">Loading...</span> <img src="images/ui/button-load.gif">'
|
||||
this.body.innerHTML = '<span style="color:#888">Loading...</span> <img src="lib/images/ui/button-load.gif">'
|
||||
var me=this;
|
||||
|
||||
d.onshow = function() {
|
||||
@ -829,7 +829,7 @@ RoleObj.prototype.make_label = function(tbl, ridx, cidx, role){
|
||||
|
||||
var t = make_table($td(tbl, ridx, cidx),1,2,null,['16px', null],{marginRight:'5px'});
|
||||
var ic = $a($td(t,0,0), 'img','',{cursor:'pointer', marginRight:'5px'});
|
||||
ic.src= 'images/icons/help.gif';
|
||||
ic.src= 'lib/images/icons/help.gif';
|
||||
ic.role = role;
|
||||
|
||||
ic.onclick = function(){
|
||||
@ -942,8 +942,8 @@ RoleObj.prototype.set_permissions = function(perm, role){
|
||||
for(var i=0; i<(head_lst.length-1);i++){
|
||||
$td(perm_tbl,0,i).innerHTML= "<b>"+head_lst[i]+"</b>";
|
||||
}
|
||||
var accept_img1 = 'images/icons/accept.gif';
|
||||
var cancel_img1 = 'images/icons/cancel.gif';
|
||||
var accept_img1 = 'lib/images/icons/accept.gif';
|
||||
var cancel_img1 = 'lib/images/icons/cancel.gif';
|
||||
|
||||
for(i=1; i<perm.length+1; i++){
|
||||
$td(perm_tbl,i,0).innerHTML= get_doctype_label(perm[i-1][0]);
|
||||
|
@ -1,13 +1,20 @@
|
||||
cur_frm.add_fetch('employee', 'company', 'company');
|
||||
|
||||
cur_frm.cscript.onload = function(doc,cdt,cdn){
|
||||
if(!doc.status) set_multiple(dt,dn,{status:'Draft'});
|
||||
if(doc.employee) cur_frm.cscript.employee(doc,cdt,cdn);
|
||||
if(doc.amended_from && doc.__islocal) cur_frm.cscript.refresh_appraisal_details(doc, cdt, cdn);
|
||||
if(!doc.status)
|
||||
set_multiple(cdt,cdn,{status:'Draft'});
|
||||
if(doc.amended_from && doc.__islocal)
|
||||
cur_frm.cscript.refresh_appraisal_details(doc, cdt, cdn);
|
||||
}
|
||||
|
||||
cur_frm.cscript.onload_post_render = function(doc,cdt,cdn){
|
||||
if(doc.employee)
|
||||
cur_frm.cscript.employee(doc,cdt,cdn);
|
||||
}
|
||||
|
||||
cur_frm.cscript.refresh = function(doc,cdt,cdn){
|
||||
if(user == doc.kra_approver && doc.status == 'Submitted') unhide_field(['Update', 'Declare Completed', 'Calculate Total Score']);
|
||||
if(user == doc.kra_approver && doc.status == 'Submitted')
|
||||
unhide_field(['Update', 'Declare Completed', 'Calculate Total Score']);
|
||||
else hide_field(['Update', 'Declare Completed', 'Calculate Total Score']);
|
||||
|
||||
if(!doc.docstatus) unhide_field('Fetch Template');
|
||||
|
@ -17,108 +17,116 @@ import datetime
|
||||
|
||||
# -----------------------------------------------------------------------------------------
|
||||
class DocType:
|
||||
def __init__(self, doc, doclist):
|
||||
self.doc = doc
|
||||
self.doclist = doclist
|
||||
def __init__(self, doc, doclist):
|
||||
self.doc = doc
|
||||
self.doclist = doclist
|
||||
|
||||
|
||||
# ******************************************** client triggers ***********************************************
|
||||
|
||||
# ------------------
|
||||
# get leave balance
|
||||
# ------------------
|
||||
def get_leave_balance(self):
|
||||
leave_all = sql("select total_leaves_allocated from `tabLeave Allocation` where employee = '%s' and leave_type = '%s' and fiscal_year = '%s' and docstatus = 1" % (self.doc.employee, self.doc.leave_type, self.doc.fiscal_year))
|
||||
leave_all = leave_all and flt(leave_all[0][0]) or 0
|
||||
leave_app = sql("select total_leave_days from `tabLeave Application` where employee = '%s' and leave_type = '%s' and fiscal_year = '%s' and docstatus = 1" % (self.doc.employee, self.doc.leave_type, self.doc.fiscal_year))
|
||||
leave_app = leave_app and flt(leave_app[0][0]) or 0
|
||||
ret = {'leave_balance':leave_all - leave_app}
|
||||
return ret
|
||||
# ------------------
|
||||
# get leave balance
|
||||
# ------------------
|
||||
def get_leave_balance(self):
|
||||
leave_all = sql("select total_leaves_allocated from `tabLeave Allocation` where employee = '%s' and leave_type = '%s' and fiscal_year = '%s' and docstatus = 1" % (self.doc.employee, self.doc.leave_type, self.doc.fiscal_year))
|
||||
leave_all = leave_all and flt(leave_all[0][0]) or 0
|
||||
leave_app = sql("select total_leave_days from `tabLeave Application` where employee = '%s' and leave_type = '%s' and fiscal_year = '%s' and docstatus = 1" % (self.doc.employee, self.doc.leave_type, self.doc.fiscal_year))
|
||||
leave_app = leave_app and flt(leave_app[0][0]) or 0
|
||||
ret = {'leave_balance':leave_all - leave_app}
|
||||
return ret
|
||||
|
||||
|
||||
# ************************************************ utilities *************************************************
|
||||
|
||||
# -------------------
|
||||
# get total holidays
|
||||
# -------------------
|
||||
def get_holidays(self):
|
||||
tot_hol = sql("select count(*) from `tabHoliday List Detail` h1, `tabHoliday List` h2, `tabEmployee` e1 where e1.name = '%s' and h1.parent = h2.name and e1.holiday_list = h2.name and h1.holiday_date between '%s' and '%s'"% (self.doc.employee, self.doc.from_date, self.doc.to_date))
|
||||
if not tot_hol:
|
||||
tot_hol = sql("select count(*) from `tabHoliday List Detail` h1, `tabHoliday List` h2 where h1.parent = h2.name and h1.holiday_date between '%s' and '%s' and ifnull(h2.is_default,0) = 1 and h2.fiscal_year = %s"% (self.doc.from_date, self.doc.to_date, self.doc.fiscal_year))
|
||||
return tot_hol and flt(tot_hol[0][0]) or 0
|
||||
# -------------------
|
||||
def get_holidays(self):
|
||||
"""
|
||||
get total holidays
|
||||
"""
|
||||
tot_hol = sql("select count(*) from `tabHoliday List Detail` h1, `tabHoliday List` h2, `tabEmployee` e1 where e1.name = '%s' and h1.parent = h2.name and e1.holiday_list = h2.name and h1.holiday_date between '%s' and '%s'"% (self.doc.employee, self.doc.from_date, self.doc.to_date))
|
||||
if not tot_hol:
|
||||
tot_hol = sql("select count(*) from `tabHoliday List Detail` h1, `tabHoliday List` h2 where h1.parent = h2.name and h1.holiday_date between '%s' and '%s' and ifnull(h2.is_default,0) = 1 and h2.fiscal_year = %s"% (self.doc.from_date, self.doc.to_date, self.doc.fiscal_year))
|
||||
return tot_hol and flt(tot_hol[0][0]) or 0
|
||||
|
||||
|
||||
# ---------------------
|
||||
# get total leave days
|
||||
# ---------------------
|
||||
def get_total_leave_days(self):
|
||||
tot_days = date_diff(self.doc.to_date, self.doc.from_date) + 1
|
||||
holidays = self.get_holidays()
|
||||
ret = {'total_leave_days':flt(tot_days)-flt(holidays)}
|
||||
return ret
|
||||
|
||||
# ---------------------
|
||||
# get total leave days
|
||||
# ---------------------
|
||||
def get_total_leave_days(self):
|
||||
"""
|
||||
Calculates total leave days based on input and holidays
|
||||
"""
|
||||
ret = {'total_leave_days' : 0.5}
|
||||
if not self.doc.half_day:
|
||||
tot_days = date_diff(self.doc.to_date, self.doc.from_date) + 1
|
||||
holidays = self.get_holidays()
|
||||
ret = {
|
||||
'total_leave_days' : flt(tot_days)-flt(holidays)
|
||||
}
|
||||
return ret
|
||||
|
||||
|
||||
# ************************************************ validate *************************************************
|
||||
|
||||
# -----------------
|
||||
# validate to date
|
||||
# -----------------
|
||||
def validate_to_date(self):
|
||||
if (getdate(self.doc.to_date) < getdate(self.doc.from_date)):
|
||||
msgprint("To date cannot be before from date")
|
||||
raise Exception
|
||||
# -----------------
|
||||
# validate to date
|
||||
# -----------------
|
||||
def validate_to_date(self):
|
||||
if self.doc.from_date and self.doc.to_date and (getdate(self.doc.to_date) < getdate(self.doc.from_date)):
|
||||
msgprint("To date cannot be before from date")
|
||||
raise Exception
|
||||
|
||||
# --------------------------------
|
||||
# check whether leave type is lwp
|
||||
# --------------------------------
|
||||
def is_lwp(self):
|
||||
lwp = sql("select is_lwp from `tabLeave Type` where name = %s", self.doc.leave_type)
|
||||
return lwp and cint(lwp[0][0]) or 0
|
||||
# --------------------------------
|
||||
# check whether leave type is lwp
|
||||
# --------------------------------
|
||||
def is_lwp(self):
|
||||
lwp = sql("select is_lwp from `tabLeave Type` where name = %s", self.doc.leave_type)
|
||||
return lwp and cint(lwp[0][0]) or 0
|
||||
|
||||
# ------------------------
|
||||
# validate balance leaves
|
||||
# ------------------------
|
||||
def validate_balance_leaves(self):
|
||||
if not self.is_lwp():
|
||||
bal = self.get_leave_balance()
|
||||
tot_leaves = self.get_total_leave_days()
|
||||
bal, tot_leaves = bal, tot_leaves
|
||||
set(self.doc,'leave_balance',flt(bal['leave_balance']))
|
||||
set(self.doc,'total_leave_days',flt(tot_leaves['total_leave_days']))
|
||||
if flt(bal['leave_balance']) < flt(tot_leaves['total_leave_days']):
|
||||
msgprint("Employee : %s cannot apply for %s of more than %s days" % (self.doc.employee, self.doc.leave_type, flt(bal['leave_balance'])))
|
||||
raise Exception
|
||||
# ------------------------
|
||||
# validate balance leaves
|
||||
# ------------------------
|
||||
def validate_balance_leaves(self):
|
||||
if self.doc.from_date and self.doc.to_date and not self.is_lwp():
|
||||
bal = self.get_leave_balance()
|
||||
tot_leaves = self.get_total_leave_days()
|
||||
bal, tot_leaves = bal, tot_leaves
|
||||
set(self.doc,'leave_balance',flt(bal['leave_balance']))
|
||||
set(self.doc,'total_leave_days',flt(tot_leaves['total_leave_days']))
|
||||
if flt(bal['leave_balance']) < flt(tot_leaves['total_leave_days']):
|
||||
msgprint("Employee : %s cannot apply for %s of more than %s days" % (self.doc.employee, self.doc.leave_type, flt(bal['leave_balance'])))
|
||||
raise Exception
|
||||
|
||||
#
|
||||
# validate overlapping leaves
|
||||
#
|
||||
def validate_leave_overlap(self):
|
||||
for d in sql("""select name, leave_type, posting_date, from_date, to_date
|
||||
from `tabLeave Application`
|
||||
where
|
||||
(from_date <= %(to_date)s and to_date >= %(from_date)s)
|
||||
and employee = %(employee)s
|
||||
and docstatus = 1
|
||||
and name != %(name)s""", self.doc.fields, as_dict = 1):
|
||||
#
|
||||
# validate overlapping leaves
|
||||
#
|
||||
def validate_leave_overlap(self):
|
||||
for d in sql("""select name, leave_type, posting_date, from_date, to_date
|
||||
from `tabLeave Application`
|
||||
where
|
||||
(from_date <= %(to_date)s and to_date >= %(from_date)s)
|
||||
and employee = %(employee)s
|
||||
and docstatus = 1
|
||||
and name != %(name)s""", self.doc.fields, as_dict = 1):
|
||||
|
||||
msgprint("Employee : %s has already applied for %s between %s and %s on %s. Please refer Leave Application : %s" % (self.doc.employee, cstr(d['leave_type']), formatdate(d['from_date']), formatdate(d['to_date']), formatdate(d['posting_date']), d['name']), raise_exception = 1)
|
||||
msgprint("Employee : %s has already applied for %s between %s and %s on %s. Please refer Leave Application : %s" % (self.doc.employee, cstr(d['leave_type']), formatdate(d['from_date']), formatdate(d['to_date']), formatdate(d['posting_date']), d['name']), raise_exception = 1)
|
||||
|
||||
# ---------------------------------------------------------------------
|
||||
# validate max days for which leave can be applied for particular type
|
||||
# ---------------------------------------------------------------------
|
||||
def validate_max_days(self):
|
||||
max_days = sql("select max_days_allowed from `tabLeave Type` where name = '%s'" %(self.doc.leave_type))
|
||||
max_days = max_days and flt(max_days[0][0]) or 0
|
||||
if max_days and self.doc.total_leave_days > max_days:
|
||||
msgprint("Sorry ! You cannot apply for %s for more than %s days" % (self.doc.leave_type, max_days))
|
||||
raise Exception
|
||||
# ---------------------------------------------------------------------
|
||||
# validate max days for which leave can be applied for particular type
|
||||
# ---------------------------------------------------------------------
|
||||
def validate_max_days(self):
|
||||
max_days = sql("select max_days_allowed from `tabLeave Type` where name = '%s'" %(self.doc.leave_type))
|
||||
max_days = max_days and flt(max_days[0][0]) or 0
|
||||
if max_days and self.doc.total_leave_days > max_days:
|
||||
msgprint("Sorry ! You cannot apply for %s for more than %s days" % (self.doc.leave_type, max_days))
|
||||
raise Exception
|
||||
|
||||
|
||||
# ---------
|
||||
# validate
|
||||
# ---------
|
||||
def validate(self):
|
||||
self.validate_to_date()
|
||||
self.validate_balance_leaves()
|
||||
self.validate_leave_overlap()
|
||||
self.validate_max_days()
|
||||
# ---------
|
||||
# validate
|
||||
# ---------
|
||||
def validate(self):
|
||||
self.validate_to_date()
|
||||
self.validate_balance_leaves()
|
||||
self.validate_leave_overlap()
|
||||
self.validate_max_days()
|
||||
|
@ -46,7 +46,7 @@ class DocType:
|
||||
self.check_mandatory()
|
||||
|
||||
cond = ''
|
||||
for f in ['company', 'branch', 'department', 'designation', 'grade', 'employment_type']:
|
||||
for f in ['company', 'branch', 'department', 'designation', 'grade']:
|
||||
if self.doc.fields.get(f):
|
||||
cond += " and t1." + f + " = '" + self.doc.fields.get(f) + "'"
|
||||
|
||||
|
@ -5,18 +5,19 @@
|
||||
{
|
||||
'creation': '2011-08-11 16:40:04',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-08-25 12:02:57',
|
||||
'modified': '2011-11-07 10:47:32',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
|
||||
# These values are common for all DocType
|
||||
{
|
||||
'_last_update': '1314179318',
|
||||
'_last_update': '1314253977',
|
||||
'allow_copy': 1,
|
||||
'allow_email': 1,
|
||||
'allow_print': 1,
|
||||
'colour': 'White:FFF',
|
||||
'default_print_format': 'Standard',
|
||||
'doctype': 'DocType',
|
||||
'document_type': 'Other',
|
||||
'issingle': 1,
|
||||
@ -24,7 +25,7 @@
|
||||
'name': '__common__',
|
||||
'section_style': 'Simple',
|
||||
'show_in_menu': 1,
|
||||
'version': 29
|
||||
'version': 30
|
||||
},
|
||||
|
||||
# These values are common for all DocField
|
||||
@ -59,21 +60,18 @@
|
||||
# DocPerm
|
||||
{
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 1,
|
||||
'role': 'System Manager'
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 2,
|
||||
'role': 'HR User'
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 3,
|
||||
'role': 'HR Manager'
|
||||
},
|
||||
|
||||
@ -82,7 +80,6 @@
|
||||
'colour': 'White:FFF',
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'HTML',
|
||||
'idx': 1,
|
||||
'label': 'Document Description',
|
||||
'options': '<div class="field_description">You can generate multiple salary slips based on the selected criteria, submit and mail those to the employee directly from here</div>'
|
||||
},
|
||||
@ -90,15 +87,13 @@
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'idx': 2
|
||||
'fieldtype': 'Section Break'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Column Break',
|
||||
'idx': 3,
|
||||
'width': '50%'
|
||||
},
|
||||
|
||||
@ -107,7 +102,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'company',
|
||||
'fieldtype': 'Select',
|
||||
'idx': 4,
|
||||
'label': 'Company',
|
||||
'options': 'link:Company',
|
||||
'reqd': 1
|
||||
@ -118,7 +112,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'branch',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 5,
|
||||
'label': 'Branch',
|
||||
'options': 'Branch'
|
||||
},
|
||||
@ -128,7 +121,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'department',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 6,
|
||||
'label': 'Department',
|
||||
'options': 'Department'
|
||||
},
|
||||
@ -138,7 +130,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'designation',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 7,
|
||||
'label': 'Designation',
|
||||
'options': 'Designation'
|
||||
},
|
||||
@ -147,7 +138,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Column Break',
|
||||
'idx': 8,
|
||||
'width': '50%'
|
||||
},
|
||||
|
||||
@ -156,28 +146,16 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'grade',
|
||||
'fieldtype': 'Select',
|
||||
'idx': 9,
|
||||
'label': 'Grade',
|
||||
'options': 'link:Grade'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'employment_type',
|
||||
'fieldtype': 'Select',
|
||||
'idx': 10,
|
||||
'label': 'Employment Type',
|
||||
'options': 'link:Employment Type'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'colour': 'White:FFF',
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'fiscal_year',
|
||||
'fieldtype': 'Select',
|
||||
'idx': 11,
|
||||
'label': 'Fiscal Year',
|
||||
'options': 'link:Fiscal Year',
|
||||
'reqd': 1
|
||||
@ -189,7 +167,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'month',
|
||||
'fieldtype': 'Select',
|
||||
'idx': 12,
|
||||
'label': 'Month',
|
||||
'options': '\n01\n02\n03\n04\n05\n06\n07\n08\n09\n10\n11\n12',
|
||||
'reqd': 1
|
||||
@ -202,22 +179,19 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'send_email',
|
||||
'fieldtype': 'Check',
|
||||
'idx': 13,
|
||||
'label': 'Send Email'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'idx': 14
|
||||
'fieldtype': 'Section Break'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Column Break',
|
||||
'idx': 15,
|
||||
'width': '50%'
|
||||
},
|
||||
|
||||
@ -227,7 +201,6 @@
|
||||
'description': 'Creates salary slip for above mentioned criteria.',
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Button',
|
||||
'idx': 16,
|
||||
'label': 'Create Salary Slip',
|
||||
'trigger': 'Client'
|
||||
},
|
||||
@ -236,7 +209,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Column Break',
|
||||
'idx': 17,
|
||||
'width': '25%'
|
||||
},
|
||||
|
||||
@ -246,7 +218,6 @@
|
||||
'description': 'Submit all salary slips for the above selected criteria',
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Button',
|
||||
'idx': 18,
|
||||
'label': 'Submit Salary Slip',
|
||||
'trigger': 'Client'
|
||||
},
|
||||
@ -255,7 +226,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Column Break',
|
||||
'idx': 19,
|
||||
'width': '25%'
|
||||
},
|
||||
|
||||
@ -265,7 +235,6 @@
|
||||
'description': 'Create Bank Voucher for the total salary paid for the above selected criteria',
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Button',
|
||||
'idx': 20,
|
||||
'label': 'Make Bank Voucher',
|
||||
'trigger': 'Client'
|
||||
},
|
||||
@ -273,15 +242,13 @@
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'idx': 21
|
||||
'fieldtype': 'Section Break'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'HTML',
|
||||
'idx': 22,
|
||||
'label': 'Activity Log'
|
||||
}
|
||||
]
|
@ -1,3 +1,24 @@
|
||||
this.mytabs.items['Select Columns'].hide();
|
||||
|
||||
this.mytabs.tabs['More Filters'].hide();
|
||||
this.mytabs.tabs['More Filters'].hide();
|
||||
|
||||
report.customize_filters = function() {
|
||||
this.add_filter({
|
||||
fieldname:'fiscal_year',
|
||||
label:'Fiscal Year',
|
||||
fieldtype:'Link',
|
||||
ignore : 1,
|
||||
options: 'Fiscal Year',
|
||||
parent:'Leave Allocation',
|
||||
in_first_page:1
|
||||
});
|
||||
this.add_filter({
|
||||
fieldname:'employee_name',
|
||||
label:'Employee Name',
|
||||
fieldtype:'Data',
|
||||
ignore : 1,
|
||||
options: '',
|
||||
parent:'Leave Allocation',
|
||||
in_first_page:1
|
||||
});
|
||||
}
|
@ -1,20 +1,55 @@
|
||||
leave_types = sql("select name from `tabLeave Type` where docstatus != 2 and name not in ('Compensatory Off','Leave Without Pay')")
|
||||
msgprint(leave_types)
|
||||
leave_types = sql("""
|
||||
SELECT name FROM `tabLeave Type`
|
||||
WHERE
|
||||
docstatus!=2 AND
|
||||
name NOT IN ('Compensatory Off', 'Leave Without Pay')""")
|
||||
col=[]
|
||||
col.append(['Employee ID', 'Data', '150px', ''])
|
||||
col.append(['Employee Name', 'Data', '150px', ''])
|
||||
col.append(['Fiscal Year', 'Data', '150px', ''])
|
||||
|
||||
for e in leave_types:
|
||||
l = (len(e)*9)
|
||||
if l < 150 : col_width = '150px'
|
||||
else: col_width = '%spx'%(l)
|
||||
|
||||
col.append([e,'Currency',col_width,''])
|
||||
|
||||
l = (len(e[0])*9)
|
||||
if l < 150 : col_width = '150px'
|
||||
else: col_width = '%spx'%(l)
|
||||
col.append([e[0],'Currency',col_width,''])
|
||||
|
||||
col.append(['Total Balance','Currency','150px',''])
|
||||
|
||||
for c in col:
|
||||
colnames.append(c[0])
|
||||
coltypes.append(c[1])
|
||||
colwidths.append(c[2])
|
||||
coloptions.append(c[3])
|
||||
col_idx[c[0]] = len(colnames)
|
||||
colnames.append(c[0])
|
||||
coltypes.append(c[1])
|
||||
colwidths.append(c[2])
|
||||
coloptions.append(c[3])
|
||||
col_idx[c[0]] = len(colnames)
|
||||
|
||||
data = res
|
||||
res = []
|
||||
|
||||
try:
|
||||
for d in data:
|
||||
exists = 0
|
||||
ind = None
|
||||
|
||||
# Check if the employee record exists in list 'res'
|
||||
for r in res:
|
||||
if r[0] == d[0] and r[1] == d[1]:
|
||||
exists = 1
|
||||
ind = res.index(r)
|
||||
break
|
||||
if d[3] in colnames:
|
||||
# If exists, then append the leave type data
|
||||
if exists:
|
||||
res[ind][colnames.index(d[3])] = d[4] - d[5]
|
||||
res[ind][len(colnames)-1] = sum(res[ind][3:-1])
|
||||
# Else create a new row in res
|
||||
else:
|
||||
new_row = [0.0 for c in colnames]
|
||||
new_row[0] = d[0]
|
||||
new_row[1] = d[1]
|
||||
new_row[2] = d[2]
|
||||
new_row[colnames.index(d[3])] = d[4] - d[5]
|
||||
new_row[len(colnames)-1] = sum(new_row[3:-1])
|
||||
res.append(new_row)
|
||||
except Exception, e:
|
||||
msgprint(e)
|
@ -0,0 +1,26 @@
|
||||
SELECT
|
||||
leave_alloc.employee AS 'employee',
|
||||
leave_alloc.employee_name AS 'employee_name',
|
||||
leave_alloc.fiscal_year AS 'fiscal_year',
|
||||
leave_alloc.leave_type AS 'leave_type',
|
||||
leave_alloc.total_leaves_allocated AS 'total_leaves_allocated',
|
||||
SUM(leave_app.total_leave_days) AS 'total_leaves_applied'
|
||||
FROM
|
||||
`tabLeave Allocation` AS leave_alloc,
|
||||
`tabLeave Application` AS leave_app
|
||||
WHERE
|
||||
leave_alloc.employee=leave_app.employee AND
|
||||
leave_alloc.leave_type=leave_app.leave_type AND
|
||||
leave_alloc.fiscal_year=leave_app.fiscal_year AND
|
||||
leave_alloc.docstatus=1 AND
|
||||
leave_app.docstatus=1 AND
|
||||
leave_alloc.fiscal_year LIKE '%(fiscal_year)s%%' AND
|
||||
leave_alloc.employee_name LIKE '%(employee_name)s%%'
|
||||
GROUP BY
|
||||
employee,
|
||||
fiscal_year,
|
||||
leave_type
|
||||
ORDER BY
|
||||
employee,
|
||||
fiscal_year,
|
||||
leave_type
|
@ -3,9 +3,9 @@
|
||||
|
||||
# These values are common in all dictionaries
|
||||
{
|
||||
'creation': '2010-12-14 10:23:25',
|
||||
'creation': '2010-12-14 10:33:09',
|
||||
'docstatus': 0,
|
||||
'modified': '2010-12-01 10:39:56',
|
||||
'modified': '2011-10-31 15:42:36',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'harshada@webnotestech.com'
|
||||
},
|
||||
@ -13,7 +13,8 @@
|
||||
# These values are common for all Search Criteria
|
||||
{
|
||||
'columns': 'Employee\x01ID',
|
||||
'criteria_name': 'Employeewise Balance Leave Report',
|
||||
'criteria_name': 'Employee Leave Balance Report',
|
||||
'description': 'Employeewise Balance Leave Report',
|
||||
'doc_type': 'Employee',
|
||||
'doctype': 'Search Criteria',
|
||||
'filters': "{'Employee\x01Saved':1,'Employee\x01Submitted':1,'Employee\x01Gender':'','Employee\x01Month of Birth':'','Employee\x01Status':'Active'}",
|
||||
|
@ -71,8 +71,8 @@ KBPoints = function(parent, points, voted, dt, dn, owner) {
|
||||
// if user has not already voted
|
||||
|
||||
if(user!='Guest' && !in_list(voted, user) && user!=owner) {
|
||||
this.vote_up = $a(this.wrapper, 'img', 'images/ui/vote_up.gif', {margin:'0px 0px -2px 7px', cursor: 'pointer'});
|
||||
this.vote_down = $a(this.wrapper, 'img', 'images/ui/vote_down.gif', {margin:'0px 0px -3px 0px', cursor: 'pointer'});
|
||||
this.vote_up = $a(this.wrapper, 'img', 'lib/images/ui/vote_up.gif', {margin:'0px 0px -2px 7px', cursor: 'pointer'});
|
||||
this.vote_down = $a(this.wrapper, 'img', 'lib/images/ui/vote_down.gif', {margin:'0px 0px -3px 0px', cursor: 'pointer'});
|
||||
|
||||
this.vote_up.title = 'Vote Up'; this.vote_down.title = 'Vote Down';
|
||||
|
||||
|
@ -35,8 +35,6 @@ function KnowledgeBase(w) {
|
||||
|
||||
this.make_search_bar = function() {
|
||||
this.search = $a($a(w,'div','kb-search-wrapper'), 'textarea');
|
||||
|
||||
$(this.search).add_default_text('Enter keywords or a new Question');
|
||||
|
||||
var div = $a(w,'div','kb-btn-wrapper');
|
||||
$btn(div, 'Search', function() { me.run() }, {fontSize:'14px'});
|
||||
|
12
erpnext/patches/employeewise_balance_leave_report.py
Normal file
12
erpnext/patches/employeewise_balance_leave_report.py
Normal file
@ -0,0 +1,12 @@
|
||||
"""
|
||||
This patch changes criteria name
|
||||
of search criteria "employeewise_balance_leave_report"
|
||||
from "Employeewise Balance Leave Report"
|
||||
to "Employee Leave Balance Report"
|
||||
"""
|
||||
def execute():
|
||||
from webnotes.model.doc import Document
|
||||
d = Document('Search Criteria', 'employeewise_balance_leave_report')
|
||||
d.criteria_name = 'Employee Leave Balance Report'
|
||||
d.description = 'Employeewise Balance Leave Report'
|
||||
d.save()
|
108
erpnext/patches/install_print_formats.py
Normal file
108
erpnext/patches/install_print_formats.py
Normal file
@ -0,0 +1,108 @@
|
||||
import os, sys
|
||||
import webnotes
|
||||
|
||||
path_to_file = os.sep.join(os.path.abspath(__file__).split(os.sep)[:-1] + ['print_formats'])
|
||||
|
||||
def prepare_pf_dict(args_list):
|
||||
"""
|
||||
|
||||
"""
|
||||
pf_list = []
|
||||
for a in args_list:
|
||||
for pf_type in ['Classic', 'Modern', 'Spartan']:
|
||||
pf = {}
|
||||
pf['name'] = " ".join([a['name'], pf_type])
|
||||
pf['file'] = os.sep.join([path_to_file, "".join(pf['name'].split(" ")) + ".html"])
|
||||
pf['module'] = a['module']
|
||||
pf['doc_type'] = a['doc_type']
|
||||
pf['standard'] = 'Yes'
|
||||
pf_list += [pf]
|
||||
return pf_list
|
||||
|
||||
|
||||
pf_to_install = prepare_pf_dict([
|
||||
{
|
||||
'name' : 'Sales Invoice',
|
||||
'doc_type' : 'Receivable Voucher',
|
||||
'module' : 'Accounts'
|
||||
},
|
||||
{
|
||||
'name' : 'Sales Order',
|
||||
'doc_type' : 'Sales Order',
|
||||
'module' : 'Selling'
|
||||
},
|
||||
{
|
||||
'name' : 'Quotation',
|
||||
'doc_type' : 'Quotation',
|
||||
'module' : 'Selling'
|
||||
},
|
||||
{
|
||||
'name' : 'Delivery Note',
|
||||
'doc_type' : 'Delivery Note',
|
||||
'module' : 'Stock'
|
||||
},
|
||||
{
|
||||
'name' : 'Purchase Order',
|
||||
'doc_type' : 'Purchase Order',
|
||||
'module' : 'Buying'
|
||||
}
|
||||
])
|
||||
|
||||
def execute():
|
||||
"""
|
||||
Install print formats
|
||||
"""
|
||||
from webnotes.modules.module_manager import reload_doc
|
||||
#reload_doc('core', 'doctype', 'print_format')
|
||||
|
||||
#copy_doctype_to_pfs()
|
||||
global pf_to_install
|
||||
for pf in pf_to_install:
|
||||
# install_print_format(pf)
|
||||
# print "Installed PF: " + pf['name']
|
||||
reload_doc(pf['module'], 'Print Format', pf['name'])
|
||||
|
||||
|
||||
def copy_doctype_to_pfs():
|
||||
"""
|
||||
Copy doctype to existing print formats
|
||||
"""
|
||||
pf_dt_list = webnotes.conn.sql("""
|
||||
SELECT format, parent
|
||||
FROM `tabDocFormat`""", as_list=1)
|
||||
|
||||
from webnotes.model.doc import Document
|
||||
|
||||
for pf, dt in pf_dt_list:
|
||||
try:
|
||||
d = Document('Print Format', pf)
|
||||
d.doc_type = dt
|
||||
d.save()
|
||||
except Exception, e:
|
||||
print e.args
|
||||
pass
|
||||
|
||||
|
||||
def install_print_format(args):
|
||||
"""
|
||||
Installs print format
|
||||
args is a dict consisting of following keys:
|
||||
* name
|
||||
* module
|
||||
* doctype
|
||||
* standard = "Yes"/"No"
|
||||
* file
|
||||
"""
|
||||
from webnotes.model.doc import Document
|
||||
d = Document('Print Format')
|
||||
d.name = args['name']
|
||||
f = open(args['file'])
|
||||
d.html = f.read()
|
||||
f.close()
|
||||
d.module = args['module']
|
||||
d.doc_type = args['doc_type']
|
||||
d.standard = args['standard']
|
||||
d.save(1)
|
||||
from webnotes.model.code import get_obj
|
||||
obj = get_obj('Print Format', args['name'])
|
||||
obj.on_update()
|
9
erpnext/patches/lcw_patch.py
Normal file
9
erpnext/patches/lcw_patch.py
Normal file
@ -0,0 +1,9 @@
|
||||
def execute():
|
||||
import webnotes
|
||||
from webnotes.modules.module_manager import reload_doc
|
||||
|
||||
|
||||
reload_doc('stock', 'doctype', 'landed_cost_wizard')
|
||||
reload_doc('stock', 'doctype', 'lc_pr_detail')
|
||||
|
||||
webnotes.conn.sql("delete from `tabDocField` where parent ='LC PR Detail' and fieldname in ('purchase_receipt_no', 'include_in_landed_cost')")
|
4
erpnext/patches/p1.py
Normal file
4
erpnext/patches/p1.py
Normal file
@ -0,0 +1,4 @@
|
||||
def execute():
|
||||
import webnotes
|
||||
if not webnotes.conn.sql("select name from tabDocFormat where parent = 'Receivable Voucher' and format != 'POS Invoice'"):
|
||||
webnotes.conn.sql("update tabDocType set default_print_format = 'Standard' where name = 'Receivable Voucher'")
|
8
erpnext/patches/packing_slip.py
Normal file
8
erpnext/patches/packing_slip.py
Normal file
@ -0,0 +1,8 @@
|
||||
def execute():
|
||||
import webnotes
|
||||
from webnotes.modules.module_manager import reload_doc
|
||||
reload_doc('stock', 'doctype', 'delivery_note_detail')
|
||||
reload_doc('stock', 'Print Format', 'Delivery Note Packing List Wise')
|
||||
|
||||
webnotes.conn.sql("delete from `tabDocField` where fieldname in ('packed_by', 'packing_checked_by', 'pack_size') and parent = 'Delivery Note'")
|
||||
|
@ -1,7 +1,7 @@
|
||||
# REMEMBER to update this
|
||||
# ========================
|
||||
|
||||
last_patch = 384
|
||||
last_patch = 388
|
||||
|
||||
#-------------------------------------------
|
||||
|
||||
@ -344,8 +344,7 @@ def execute(patch_no):
|
||||
bin = sql("select name from tabBin")
|
||||
for b in bin:
|
||||
bobj = get_obj('Bin',b[0])
|
||||
prev_sle = bobj.get_prev_sle(posting_date = '2011-09-01', posting_time = '01:00')
|
||||
bobj.update_item_valuation(posting_date = '2011-09-01', posting_time = '01:00', prev_sle = prev_sle)
|
||||
bobj.update_entries_after(posting_date = '2011-09-01', posting_time = '01:00')
|
||||
elif patch_no == 368:
|
||||
from webnotes.utils import nestedset
|
||||
t = [
|
||||
@ -454,3 +453,12 @@ def execute(patch_no):
|
||||
reload_doc('stock', 'Module Def', 'Stock')
|
||||
sql("delete from `tabModule Def Item` where display_name = 'Serial No' and parent = 'Support'")
|
||||
sql("update `tabDocType` set subject = 'Item Code: %(item_code)s, Warehouse: %(warehouse)s' where name = 'Serial No'")
|
||||
elif patch_no == 385:
|
||||
# Patch for adding packing related columns (packed by, checked by, shipping mark etc)
|
||||
reload_doc('stock','doctype','delivery_note')
|
||||
elif patch_no == 386:
|
||||
sql("update `tabDocField` set allow_on_submit = 1 where fieldname = 'page_break'")
|
||||
elif patch_no == 387:
|
||||
sql("update `tabDocField` set allow_on_submit = 1 where fieldname in ('indent_details', 'po_details', 'purchase_receipt_details', 'entries', 'sales_order_details', 'delivery_note_details', 'quotation_details') and fieldtype = 'Table'")
|
||||
elif patch_no == 388:
|
||||
pass
|
||||
|
279
erpnext/patches/print_formats/DeliveryNoteClassic.html
Normal file
279
erpnext/patches/print_formats/DeliveryNoteClassic.html
Normal file
@ -0,0 +1,279 @@
|
||||
<!--
|
||||
Sample Print Format for ERPNext
|
||||
Please use at your own discretion
|
||||
For suggestions and contributions:
|
||||
https://github.com/webnotes/erpnext-print-templates
|
||||
|
||||
Freely usable under MIT license
|
||||
-->
|
||||
|
||||
<!-- Style Settings -->
|
||||
<style>
|
||||
/*
|
||||
common style for whole page
|
||||
This should include:
|
||||
+ page size related settings
|
||||
+ font family settings
|
||||
+ line spacing settings
|
||||
*/
|
||||
@media screen {
|
||||
body {
|
||||
width: 8.3in;
|
||||
}
|
||||
}
|
||||
|
||||
html, body, div, span, td {
|
||||
font-family: "Georgia", serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 10px;
|
||||
margin: auto;
|
||||
font-size: 12px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.common {
|
||||
font-family: "Georgia", serif !important;
|
||||
font-size: 12px;
|
||||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table td {
|
||||
padding: 2px 0px;
|
||||
}
|
||||
|
||||
table h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
table.header-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.header-table thead {
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
|
||||
table.header-table h3 {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
table.header-table thead td {
|
||||
padding: 5px 0px;
|
||||
}
|
||||
|
||||
div.page-body table td:nth-child(6),
|
||||
div.page-body table td:nth-child(7) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
table.footer-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.footer-table td table td:nth-child(2),
|
||||
table.footer-table td table td:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<!-- Javascript -->
|
||||
<script>
|
||||
si_std = {
|
||||
print_item_table: function() {
|
||||
var table = print_table(
|
||||
'Delivery Note',
|
||||
doc.name,
|
||||
'delivery_note_details',
|
||||
'Delivery Note Detail',
|
||||
[// Here specify the table columns to be displayed
|
||||
'SR', 'item_code', 'item_name', 'description', 'qty', 'stock_uom',
|
||||
'basic_rate', 'amount'
|
||||
],
|
||||
[// Here specify the labels of column headings
|
||||
'Sr', 'Item Code', 'Item Name', 'Description', 'Qty',
|
||||
'UoM', 'Basic Rate', 'Amount'
|
||||
],
|
||||
[// Here specify the column widths
|
||||
'3%', '10%', '15%', '32%', '5%',
|
||||
'5%', '15%', '15%'
|
||||
],
|
||||
null,
|
||||
null,
|
||||
{
|
||||
'description' : function(data_row) {
|
||||
if(data_row.serial_no) {
|
||||
return (
|
||||
data_row.description +
|
||||
'<div style="padding-left: 15px;"><i>Serial No.:' +
|
||||
((data_row.serial_no.indexOf('\n')>-1)?'<br />':' ') +
|
||||
data_row.serial_no + '</i></div>'
|
||||
);
|
||||
} else {
|
||||
return data_row.description;
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// This code takes care of page breaks
|
||||
if(table.appendChild) {
|
||||
out = table.innerHTML;
|
||||
} else {
|
||||
out = '';
|
||||
for(var i=0; i < (table.length-1); i++) {
|
||||
out += table[i].innerHTML +
|
||||
'<div style = "page-break-after: always;" \
|
||||
class = "page_break"></div>\
|
||||
<div class="page-settings"></div>';
|
||||
}
|
||||
out += table[table.length-1].innerHTML;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
|
||||
print_other_charges: function(parent) {
|
||||
var oc = getchildren('RV Tax Detail', doc.name, 'other_charges');
|
||||
var rows = '<table width=100%>\n';
|
||||
for(var i=0; i<oc.length; i++) {
|
||||
rows +=
|
||||
'<tr>\n' +
|
||||
'\t<td>' + oc[i].description + '</td>\n' +
|
||||
'\t<td></td>\n' +
|
||||
'\t<td width=38%>' + fmt_money(oc[i].tax_amount) + '</td>\n' +
|
||||
'</tr>\n';
|
||||
}
|
||||
return rows + '</table>\n';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Page Layout Settings -->
|
||||
<div class='common page-header'>
|
||||
<!--
|
||||
Page Header will contain
|
||||
+ table 1
|
||||
+ table 1a
|
||||
- Name
|
||||
- Address
|
||||
- Contact
|
||||
- Mobile No
|
||||
+ table 1b
|
||||
- Voucher Date
|
||||
- Due Date
|
||||
-->
|
||||
<table class='header-table' cellspacing=0>
|
||||
<thead>
|
||||
<tr><td><h1>Delivery Note</h1></td></tr>
|
||||
<tr><td><h3><script>cur_frm.docname</script></h3></td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60%><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=22%><b>Name</b></td>
|
||||
<td><script>doc.customer_name</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Address</b></td>
|
||||
<td><script>replace_newlines(doc.address_display)</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Contact</b></td>
|
||||
<td><script>doc.contact_display</script></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
<td><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=63%><b>Delivery Note Date</b></td>
|
||||
<td><script>date.str_to_user(doc.transaction_date)</script></td>
|
||||
<tr>
|
||||
<tr>
|
||||
<td><b>Sales Order No.</b></td>
|
||||
<td>
|
||||
<script>doc.sales_order_no</script><br />
|
||||
<i>(<script>date.str_to_user(doc.posting_date)</script>)</i>
|
||||
</td>
|
||||
<tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
<div class='common page-body'>
|
||||
<!--
|
||||
Page Body will contain
|
||||
+ table 2
|
||||
- Sales Invoice Data
|
||||
-->
|
||||
<script>si_std.print_item_table()</script>
|
||||
</div>
|
||||
<div class='common page-footer'>
|
||||
<!--
|
||||
Page Footer will contain
|
||||
+ table 3
|
||||
- Terms and Conditions
|
||||
- Total Rounded Amount Calculation
|
||||
- Total Rounded Amount in Words
|
||||
-->
|
||||
<table class='footer-table' width=100% cellspacing=0>
|
||||
<thead>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60% style='padding-right: 10px;'>
|
||||
<b>Terms, Conditions & Other Information:</b><br />
|
||||
<script>doc.terms</script>
|
||||
</td>
|
||||
<td>
|
||||
<table cellspacing=0 width=100%><tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td></td>
|
||||
<td width=38%><script>
|
||||
fmt_money(doc.net_total)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>
|
||||
<tr>
|
||||
<td>Grand Total</td>
|
||||
<td></td>
|
||||
<td><script>
|
||||
fmt_money(doc.grand_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr style='font-weight: bold'>
|
||||
<td>Rounded Total</td>
|
||||
<td><script>doc.currency</script></td>
|
||||
<td><script>
|
||||
fmt_money(doc.rounded_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br /><b>In Words</b><br />
|
||||
<i><script>doc.in_words_export</script></i>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
|
306
erpnext/patches/print_formats/DeliveryNoteModern.html
Normal file
306
erpnext/patches/print_formats/DeliveryNoteModern.html
Normal file
@ -0,0 +1,306 @@
|
||||
<!--
|
||||
Sample Print Format for ERPNext
|
||||
Please use at your own discretion
|
||||
For suggestions and contributions:
|
||||
https://github.com/webnotes/erpnext-print-templates
|
||||
|
||||
Freely usable under MIT license
|
||||
-->
|
||||
|
||||
<!-- Style Settings -->
|
||||
<style>
|
||||
/*
|
||||
common style for whole page
|
||||
This should include:
|
||||
+ page size related settings
|
||||
+ font family settings
|
||||
+ line spacing settings
|
||||
*/
|
||||
@media screen {
|
||||
body {
|
||||
width: 8.3in;
|
||||
}
|
||||
}
|
||||
|
||||
html, body, div, span, td {
|
||||
font-family: "Helvetica", "Arial", sans-serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 10px;
|
||||
margin: auto;
|
||||
font-size: 12px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.common {
|
||||
font-family: "Helvetica", "Arial", sans-serif !important;
|
||||
font-size: 12px;
|
||||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
vertical-align: top;
|
||||
border-style: none !important;
|
||||
}
|
||||
|
||||
table td {
|
||||
padding: 2px 0px;
|
||||
border-style: none !important;
|
||||
}
|
||||
|
||||
table h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
table.header-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.header-table h1 {
|
||||
text-transform: uppercase;
|
||||
color: white;
|
||||
font-size: 55px;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
table.header-table thead tr:nth-child(1) div {
|
||||
height: 24px;
|
||||
background-color: #696969;
|
||||
vertical-align: middle;
|
||||
padding: 12px 0px 0px 0px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.page-body table td:nth-child(6),
|
||||
div.page-body table td:nth-child(7) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.page-body table tr td {
|
||||
background-color: #DCDCDC !important;
|
||||
}
|
||||
|
||||
div.page-body table tr:nth-child(1) td {
|
||||
background-color: #696969 !important;
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
table.footer-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.footer-table td table td:nth-child(2),
|
||||
table.footer-table td table td:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
table.footer-table tfoot td {
|
||||
background-color: #696969;
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
.imp-details {
|
||||
background-color: #DCDCDC;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<!-- Javascript -->
|
||||
<script>
|
||||
si_std = {
|
||||
print_item_table: function() {
|
||||
var table = print_table(
|
||||
'Delivery Note',
|
||||
doc.name,
|
||||
'delivery_note_details',
|
||||
'Delivery Note Detail',
|
||||
[// Here specify the table columns to be displayed
|
||||
'SR', 'item_code', 'item_name', 'description', 'qty', 'stock_uom',
|
||||
'basic_rate', 'amount'
|
||||
],
|
||||
[// Here specify the labels of column headings
|
||||
'Sr', 'Item Code', 'Item Name', 'Description', 'Qty',
|
||||
'UoM', 'Basic Rate', 'Amount'
|
||||
],
|
||||
[// Here specify the column widths
|
||||
'3%', '10%', '15%', '32%', '5%',
|
||||
'5%', '15%', '15%'
|
||||
],
|
||||
null,
|
||||
null,
|
||||
{
|
||||
'description' : function(data_row) {
|
||||
if(data_row.serial_no) {
|
||||
return (
|
||||
data_row.description +
|
||||
'<div style="padding-left: 15px;"><i>Serial No.:' +
|
||||
((data_row.serial_no.indexOf('\n')>-1)?'<br />':' ') +
|
||||
data_row.serial_no + '</i></div>'
|
||||
);
|
||||
} else {
|
||||
return data_row.description;
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// This code takes care of page breaks
|
||||
if(table.appendChild) {
|
||||
out = table.innerHTML;
|
||||
} else {
|
||||
out = '';
|
||||
for(var i=0; i < (table.length-1); i++) {
|
||||
out += table[i].innerHTML +
|
||||
'<div style = "page-break-after: always;" \
|
||||
class = "page_break"></div>\
|
||||
<div class="page-settings"></div>';
|
||||
}
|
||||
out += table[table.length-1].innerHTML;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
|
||||
print_other_charges: function(parent) {
|
||||
var oc = getchildren('RV Tax Detail', doc.name, 'other_charges');
|
||||
var rows = '<table width=100%>\n';
|
||||
for(var i=0; i<oc.length; i++) {
|
||||
rows +=
|
||||
'<tr>\n' +
|
||||
'\t<td>' + oc[i].description + '</td>\n' +
|
||||
'\t<td></td>\n' +
|
||||
'\t<td width=38%>' + fmt_money(oc[i].tax_amount) + '</td>\n' +
|
||||
'</tr>\n';
|
||||
}
|
||||
return rows + '</table>\n';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Page Layout Settings -->
|
||||
<div class='common page-header'>
|
||||
<!--
|
||||
Page Header will contain
|
||||
+ table 1
|
||||
+ table 1a
|
||||
- Name
|
||||
- Address
|
||||
- Contact
|
||||
- Mobile No
|
||||
+ table 1b
|
||||
- Voucher Date
|
||||
- Due Date
|
||||
-->
|
||||
<table class='header-table' cellspacing=0>
|
||||
<thead>
|
||||
<tr><td colspan=2><div><h1>Delivery Note</h1></div></td></tr>
|
||||
<tr><td colspan=2><div style="height:15px"></div></td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60%><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=22%><b>Name</b></td>
|
||||
<td><script>doc.customer_name</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Address</b></td>
|
||||
<td><script>replace_newlines(doc.address_display)</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Contact</b></td>
|
||||
<td><script>doc.contact_display</script></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
<td><table width=100% cellspacing=0><tbody>
|
||||
<tr class='imp-details'>
|
||||
<td><b>Delivery Note No.</b></td>
|
||||
<td><script>cur_frm.docname</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width=63%><b>Delivery Note Date</b></td>
|
||||
<td><script>date.str_to_user(doc.transaction_date)</script></td>
|
||||
<tr>
|
||||
<tr>
|
||||
<td><b>Sales Order No.</b></td>
|
||||
<td>
|
||||
<script>doc.sales_order_no</script><br />
|
||||
<i>(<script>date.str_to_user(doc.posting_date)</script>)</i>
|
||||
</td>
|
||||
<tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
<div class='common page-body'>
|
||||
<!--
|
||||
Page Body will contain
|
||||
+ table 2
|
||||
- Sales Invoice Data
|
||||
-->
|
||||
<script>si_std.print_item_table()</script>
|
||||
</div>
|
||||
<div class='common page-footer'>
|
||||
<!--
|
||||
Page Footer will contain
|
||||
+ table 3
|
||||
- Terms and Conditions
|
||||
- Total Rounded Amount Calculation
|
||||
- Total Rounded Amount in Words
|
||||
-->
|
||||
<table class='footer-table' width=100% cellspacing=0>
|
||||
<thead>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60% style='padding-right: 10px;'>
|
||||
<b>Terms, Conditions & Other Information:</b><br />
|
||||
<script>doc.terms</script>
|
||||
</td>
|
||||
<td>
|
||||
<table cellspacing=0 width=100%><tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td></td>
|
||||
<td width=38%><script>
|
||||
fmt_money(doc.net_total)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>
|
||||
<tr>
|
||||
<td>Grand Total</td>
|
||||
<td></td>
|
||||
<td><script>
|
||||
fmt_money(doc.grand_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr style='font-weight: bold' class='imp-details'>
|
||||
<td>Rounded Total</td>
|
||||
<td><script>doc.currency</script></td>
|
||||
<td><script>
|
||||
fmt_money(doc.rounded_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br /><b>In Words</b><br />
|
||||
<i><script>doc.in_words_export</script></i>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr><td colspan=2><div></div></td><tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
|
302
erpnext/patches/print_formats/DeliveryNoteSpartan.html
Normal file
302
erpnext/patches/print_formats/DeliveryNoteSpartan.html
Normal file
@ -0,0 +1,302 @@
|
||||
<!--
|
||||
Sample Print Format for ERPNext
|
||||
Please use at your own discretion
|
||||
For suggestions and contributions:
|
||||
https://github.com/webnotes/erpnext-print-templates
|
||||
|
||||
Freely usable under MIT license
|
||||
-->
|
||||
|
||||
<!-- Style Settings -->
|
||||
<style>
|
||||
/*
|
||||
common style for whole page
|
||||
This should include:
|
||||
+ page size related settings
|
||||
+ font family settings
|
||||
+ line spacing settings
|
||||
*/
|
||||
@media screen {
|
||||
body {
|
||||
width: 8.3in;
|
||||
}
|
||||
}
|
||||
|
||||
html, body, div, span, td {
|
||||
font-family: "Arial", sans-serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 10px;
|
||||
margin: auto;
|
||||
font-size: 12px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.common {
|
||||
font-family: "Arial", sans-serif !important;
|
||||
font-size: 12px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100% !important;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table td {
|
||||
padding: 2px 0px;
|
||||
}
|
||||
|
||||
table, td {
|
||||
border-collapse: collapse !important;
|
||||
padding: 0px;
|
||||
margin: 0px !important;
|
||||
}
|
||||
|
||||
table h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
table.header-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.header-table h3 {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
table.header-table thead td {
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
table.header-table > thead,
|
||||
table.header-table > tbody > tr > td,
|
||||
table.footer-table > tbody > tr > td {
|
||||
border: 1px solid black;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
table.footer-table > tbody,
|
||||
table.header-table > thead {
|
||||
border-bottom: 3px solid black;
|
||||
}
|
||||
|
||||
table.header-table > thead {
|
||||
border-top: 3px solid black;
|
||||
}
|
||||
|
||||
div.page-body table td:nth-child(6),
|
||||
div.page-body table td:nth-child(7) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.page-body td {
|
||||
background-color: white !important;
|
||||
border: 1px solid black !important;
|
||||
}
|
||||
|
||||
table.footer-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.footer-table td table td:nth-child(2),
|
||||
table.footer-table td table td:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<!-- Javascript -->
|
||||
<script>
|
||||
si_std = {
|
||||
print_item_table: function() {
|
||||
var table = print_table(
|
||||
'Delivery Note',
|
||||
doc.name,
|
||||
'delivery_note_details',
|
||||
'Delivery Note Detail',
|
||||
[// Here specify the table columns to be displayed
|
||||
'SR', 'item_code', 'item_name', 'description', 'qty', 'stock_uom',
|
||||
'basic_rate', 'amount'
|
||||
],
|
||||
[// Here specify the labels of column headings
|
||||
'Sr', 'Item Code', 'Item Name', 'Description', 'Qty',
|
||||
'UoM', 'Basic Rate', 'Amount'
|
||||
],
|
||||
[// Here specify the column widths
|
||||
'3%', '10%', '15%', '32%', '5%',
|
||||
'5%', '15%', '15%'
|
||||
],
|
||||
null,
|
||||
null,
|
||||
{
|
||||
'description' : function(data_row) {
|
||||
if(data_row.serial_no) {
|
||||
return (
|
||||
data_row.description +
|
||||
'<div style="padding-left: 15px;"><i>Serial No.:' +
|
||||
((data_row.serial_no.indexOf('\n')>-1)?'<br />':' ') +
|
||||
data_row.serial_no + '</i></div>'
|
||||
);
|
||||
} else {
|
||||
return data_row.description;
|
||||
}
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
// This code takes care of page breaks
|
||||
if(table.appendChild) {
|
||||
out = table.innerHTML;
|
||||
} else {
|
||||
out = '';
|
||||
for(var i=0; i < (table.length-1); i++) {
|
||||
out += table[i].innerHTML +
|
||||
'<div style = "page-break-after: always;" \
|
||||
class = "page_break"></div>\
|
||||
<div class="page-settings"></div>';
|
||||
}
|
||||
out += table[table.length-1].innerHTML;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
|
||||
print_other_charges: function(parent) {
|
||||
var oc = getchildren('RV Tax Detail', doc.name, 'other_charges');
|
||||
var rows = '<table width=100%>\n';
|
||||
for(var i=0; i<oc.length; i++) {
|
||||
rows +=
|
||||
'<tr>\n' +
|
||||
'\t<td>' + oc[i].description + '</td>\n' +
|
||||
'\t<td></td>\n' +
|
||||
'\t<td width=38%>' + fmt_money(oc[i].tax_amount) + '</td>\n' +
|
||||
'</tr>\n';
|
||||
}
|
||||
return rows + '</table>\n';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Page Layout Settings -->
|
||||
<div class='common page-header'>
|
||||
<!--
|
||||
Page Header will contain
|
||||
+ table 1
|
||||
+ table 1a
|
||||
- Name
|
||||
- Address
|
||||
- Contact
|
||||
- Mobile No
|
||||
+ table 1b
|
||||
- Voucher Date
|
||||
- Due Date
|
||||
-->
|
||||
<table class='header-table' cellspacing=0>
|
||||
<thead>
|
||||
<tr><td colspan=2><h1>Delivery Note</h1></td></tr>
|
||||
<tr><td colspan=2><h3><script>cur_frm.docname</script></h3></td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60%><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=22%><b>Name</b></td>
|
||||
<td><script>doc.customer_name</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Address</b></td>
|
||||
<td><script>replace_newlines(doc.address_display)</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Contact</b></td>
|
||||
<td><script>doc.contact_display</script></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
<td><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=63%><b>Delivery Note Date</b></td>
|
||||
<td><script>date.str_to_user(doc.transaction_date)</script></td>
|
||||
<tr>
|
||||
<tr>
|
||||
<td><b>Sales Order No.</b></td>
|
||||
<td>
|
||||
<script>doc.sales_order_no</script><br />
|
||||
<i>(<script>date.str_to_user(doc.posting_date)</script>)</i>
|
||||
</td>
|
||||
<tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
<div class='common page-body'>
|
||||
<!--
|
||||
Page Body will contain
|
||||
+ table 2
|
||||
- Sales Invoice Data
|
||||
-->
|
||||
<script>si_std.print_item_table()</script>
|
||||
</div>
|
||||
<div class='common page-footer'>
|
||||
<!--
|
||||
Page Footer will contain
|
||||
+ table 3
|
||||
- Terms and Conditions
|
||||
- Total Rounded Amount Calculation
|
||||
- Total Rounded Amount in Words
|
||||
-->
|
||||
<table class='footer-table' width=100% cellspacing=0>
|
||||
<thead>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60% style='padding-right: 10px;'>
|
||||
<b>Terms, Conditions & Other Information:</b><br />
|
||||
<script>doc.terms</script>
|
||||
</td>
|
||||
<td>
|
||||
<table cellspacing=0 width=100%><tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td></td>
|
||||
<td width=38%><script>
|
||||
fmt_money(doc.net_total)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>
|
||||
<tr>
|
||||
<td>Grand Total</td>
|
||||
<td></td>
|
||||
<td><script>
|
||||
fmt_money(doc.grand_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr style='font-weight: bold'>
|
||||
<td>Rounded Total</td>
|
||||
<td><script>doc.currency</script></td>
|
||||
<td><script>
|
||||
fmt_money(doc.rounded_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br /><b>In Words</b><br />
|
||||
<i><script>doc.in_words_export</script></i>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
249
erpnext/patches/print_formats/PurchaseOrderClassic.html
Normal file
249
erpnext/patches/print_formats/PurchaseOrderClassic.html
Normal file
@ -0,0 +1,249 @@
|
||||
<!--
|
||||
Sample Print Format for ERPNext
|
||||
Please use at your own discretion
|
||||
For suggestions and contributions:
|
||||
https://github.com/webnotes/erpnext-print-templates
|
||||
|
||||
Freely usable under MIT license
|
||||
-->
|
||||
|
||||
<!-- Style Settings -->
|
||||
<style>
|
||||
/*
|
||||
common style for whole page
|
||||
This should include:
|
||||
+ page size related settings
|
||||
+ font family settings
|
||||
+ line spacing settings
|
||||
*/
|
||||
@media screen {
|
||||
body {
|
||||
width: 8.3in;
|
||||
}
|
||||
}
|
||||
|
||||
html, body, div, span, td {
|
||||
font-family: "Georgia", serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 10px;
|
||||
margin: auto;
|
||||
font-size: 12px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.common {
|
||||
font-family: "Georgia", serif !important;
|
||||
font-size: 12px;
|
||||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table td {
|
||||
padding: 2px 0px;
|
||||
}
|
||||
|
||||
table h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
table.header-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.header-table thead {
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
|
||||
table.header-table h3 {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
table.header-table thead td {
|
||||
padding: 5px 0px;
|
||||
}
|
||||
|
||||
div.page-body table td:nth-child(6),
|
||||
div.page-body table td:nth-child(7) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
table.footer-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.footer-table td table td:nth-child(2),
|
||||
table.footer-table td table td:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<!-- Javascript -->
|
||||
<script>
|
||||
si_std = {
|
||||
print_item_table: function() {
|
||||
var table = print_table(
|
||||
'Purchase Order',
|
||||
doc.name,
|
||||
'po_details',
|
||||
'PO Detail',
|
||||
[// Here specify the table columns to be displayed
|
||||
'SR', 'item_code', 'item_name', 'description', 'qty', 'stock_uom',
|
||||
'import_rate', 'import_amount'
|
||||
],
|
||||
[// Here specify the labels of column headings
|
||||
'Sr', 'Item Code', 'Item Name', 'Description', 'Qty',
|
||||
'UoM', 'Basic Rate', 'Amount'
|
||||
],
|
||||
[// Here specify the column widths
|
||||
'3%', '10%', '15%', '32%', '5%',
|
||||
'5%', '15%', '15%'
|
||||
]
|
||||
);
|
||||
|
||||
// This code takes care of page breaks
|
||||
if(table.appendChild) {
|
||||
out = table.innerHTML;
|
||||
} else {
|
||||
out = '';
|
||||
for(var i=0; i < (table.length-1); i++) {
|
||||
out += table[i].innerHTML +
|
||||
'<div style = "page-break-after: always;" \
|
||||
class = "page_break"></div>\
|
||||
<div class="page-settings"></div>';
|
||||
}
|
||||
out += table[table.length-1].innerHTML;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
|
||||
print_other_charges: function(parent) {
|
||||
var oc = getchildren('Purchase Tax Detail', doc.name, 'purchase_tax_details');
|
||||
var rows = '<table width=100%>\n';
|
||||
for(var i=0; i<oc.length; i++) {
|
||||
rows +=
|
||||
'<tr>\n' +
|
||||
'\t<td>' + oc[i].description + '</td>\n' +
|
||||
'\t<td></td>\n' +
|
||||
'\t<td width=38%>' + fmt_money(oc[i].tax_amount / (doc.conversion_rate || 1)) + '</td>\n' +
|
||||
'</tr>\n';
|
||||
}
|
||||
return rows + '</table>\n';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Page Layout Settings -->
|
||||
<div class='common page-header'>
|
||||
<!--
|
||||
Page Header will contain
|
||||
+ table 1
|
||||
+ table 1a
|
||||
- Name
|
||||
- Address
|
||||
- Contact
|
||||
- Mobile No
|
||||
+ table 1b
|
||||
- Voucher Date
|
||||
- Due Date
|
||||
-->
|
||||
<table class='header-table' cellspacing=0>
|
||||
<thead>
|
||||
<tr><td><h1>Purchase Order</h1></td></tr>
|
||||
<tr><td><h3><script>cur_frm.docname</script></h3></td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60%><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=22%><b>Name</b></td>
|
||||
<td><script>doc.supplier_name</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Address</b></td>
|
||||
<td><script>replace_newlines(doc.address_display)</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Contact</b></td>
|
||||
<td><script>doc.contact_display</script></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
<td><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=63%><b>Purchase Order Date</b></td>
|
||||
<td><script>date.str_to_user(doc.transaction_date)</script></td>
|
||||
<tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
<div class='common page-body'>
|
||||
<!--
|
||||
Page Body will contain
|
||||
+ table 2
|
||||
- Sales Invoice Data
|
||||
-->
|
||||
<script>si_std.print_item_table()</script>
|
||||
</div>
|
||||
<div class='common page-footer'>
|
||||
<!--
|
||||
Page Footer will contain
|
||||
+ table 3
|
||||
- Terms and Conditions
|
||||
- Total Rounded Amount Calculation
|
||||
- Total Rounded Amount in Words
|
||||
-->
|
||||
<table class='footer-table' width=100% cellspacing=0>
|
||||
<thead>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60% style='padding-right: 10px;'>
|
||||
<b>Terms, Conditions & Other Information:</b><br />
|
||||
<script>doc.terms</script>
|
||||
</td>
|
||||
<td>
|
||||
<table cellspacing=0 width=100%><tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td></td>
|
||||
<td width=38%><script>
|
||||
fmt_money(doc.net_total_import)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>
|
||||
<tr style='font-weight: bold'>
|
||||
<td>Grand Total</td>
|
||||
<td><script>doc.currency</script></td>
|
||||
<td><script>
|
||||
fmt_money(doc.grand_total_import)
|
||||
</script></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br /><b>In Words</b><br />
|
||||
<i><script>doc.in_words_import</script></i>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
|
276
erpnext/patches/print_formats/PurchaseOrderModern.html
Normal file
276
erpnext/patches/print_formats/PurchaseOrderModern.html
Normal file
@ -0,0 +1,276 @@
|
||||
<!--
|
||||
Sample Print Format for ERPNext
|
||||
Please use at your own discretion
|
||||
For suggestions and contributions:
|
||||
https://github.com/webnotes/erpnext-print-templates
|
||||
|
||||
Freely usable under MIT license
|
||||
-->
|
||||
|
||||
<!-- Style Settings -->
|
||||
<style>
|
||||
/*
|
||||
common style for whole page
|
||||
This should include:
|
||||
+ page size related settings
|
||||
+ font family settings
|
||||
+ line spacing settings
|
||||
*/
|
||||
@media screen {
|
||||
body {
|
||||
width: 8.3in;
|
||||
}
|
||||
}
|
||||
|
||||
html, body, div, span, td {
|
||||
font-family: "Helvetica", "Arial", sans-serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 10px;
|
||||
margin: auto;
|
||||
font-size: 12px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.common {
|
||||
font-family: "Helvetica", "Arial", sans-serif !important;
|
||||
font-size: 12px;
|
||||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
vertical-align: top;
|
||||
border-style: none !important;
|
||||
}
|
||||
|
||||
table td {
|
||||
padding: 2px 0px;
|
||||
border-style: none !important;
|
||||
}
|
||||
|
||||
table h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
table.header-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.header-table h1 {
|
||||
text-transform: uppercase;
|
||||
color: white;
|
||||
font-size: 55px;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
table.header-table thead tr:nth-child(1) div {
|
||||
height: 24px;
|
||||
background-color: #696969;
|
||||
vertical-align: middle;
|
||||
padding: 12px 0px 0px 0px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.page-body table td:nth-child(6),
|
||||
div.page-body table td:nth-child(7) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.page-body table tr td {
|
||||
background-color: #DCDCDC !important;
|
||||
}
|
||||
|
||||
div.page-body table tr:nth-child(1) td {
|
||||
background-color: #696969 !important;
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
table.footer-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.footer-table td table td:nth-child(2),
|
||||
table.footer-table td table td:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
table.footer-table tfoot td {
|
||||
background-color: #696969;
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
.imp-details {
|
||||
background-color: #DCDCDC;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<!-- Javascript -->
|
||||
<script>
|
||||
si_std = {
|
||||
print_item_table: function() {
|
||||
var table = print_table(
|
||||
'Purchase Order',
|
||||
doc.name,
|
||||
'po_details',
|
||||
'PO Detail',
|
||||
[// Here specify the table columns to be displayed
|
||||
'SR', 'item_code', 'item_name', 'description', 'qty', 'stock_uom',
|
||||
'import_rate', 'import_amount'
|
||||
],
|
||||
[// Here specify the labels of column headings
|
||||
'Sr', 'Item Code', 'Item Name', 'Description', 'Qty',
|
||||
'UoM', 'Basic Rate', 'Amount'
|
||||
],
|
||||
[// Here specify the column widths
|
||||
'3%', '10%', '15%', '32%', '5%',
|
||||
'5%', '15%', '15%'
|
||||
]
|
||||
);
|
||||
|
||||
// This code takes care of page breaks
|
||||
if(table.appendChild) {
|
||||
out = table.innerHTML;
|
||||
} else {
|
||||
out = '';
|
||||
for(var i=0; i < (table.length-1); i++) {
|
||||
out += table[i].innerHTML +
|
||||
'<div style = "page-break-after: always;" \
|
||||
class = "page_break"></div>\
|
||||
<div class="page-settings"></div>';
|
||||
}
|
||||
out += table[table.length-1].innerHTML;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
|
||||
print_other_charges: function(parent) {
|
||||
var oc = getchildren('Purchase Tax Detail', doc.name, 'purchase_tax_details');
|
||||
var rows = '<table width=100%>\n';
|
||||
for(var i=0; i<oc.length; i++) {
|
||||
rows +=
|
||||
'<tr>\n' +
|
||||
'\t<td>' + oc[i].description + '</td>\n' +
|
||||
'\t<td></td>\n' +
|
||||
'\t<td width=38%>' + fmt_money(oc[i].tax_amount / (doc.conversion_rate || 1)) + '</td>\n' +
|
||||
'</tr>\n';
|
||||
}
|
||||
return rows + '</table>\n';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Page Layout Settings -->
|
||||
<div class='common page-header'>
|
||||
<!--
|
||||
Page Header will contain
|
||||
+ table 1
|
||||
+ table 1a
|
||||
- Name
|
||||
- Address
|
||||
- Contact
|
||||
- Mobile No
|
||||
+ table 1b
|
||||
- Voucher Date
|
||||
- Due Date
|
||||
-->
|
||||
<table class='header-table' cellspacing=0>
|
||||
<thead>
|
||||
<tr><td colspan=2><div><h1>Purchase Order</h1></div></td></tr>
|
||||
<tr><td colspan=2><div style="height:15px"></div></td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60%><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=22%><b>Name</b></td>
|
||||
<td><script>doc.supplier_name</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Address</b></td>
|
||||
<td><script>replace_newlines(doc.address_display)</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Contact</b></td>
|
||||
<td><script>doc.contact_display</script></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
<td><table width=100% cellspacing=0><tbody>
|
||||
<tr class='imp-details'>
|
||||
<td><b>Purchase Order No.</b></td>
|
||||
<td><script>cur_frm.docname</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width=63%><b>Purchase Order Date</b></td>
|
||||
<td><script>date.str_to_user(doc.transaction_date)</script></td>
|
||||
<tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
<div class='common page-body'>
|
||||
<!--
|
||||
Page Body will contain
|
||||
+ table 2
|
||||
- Sales Invoice Data
|
||||
-->
|
||||
<script>si_std.print_item_table()</script>
|
||||
</div>
|
||||
<div class='common page-footer'>
|
||||
<!--
|
||||
Page Footer will contain
|
||||
+ table 3
|
||||
- Terms and Conditions
|
||||
- Total Rounded Amount Calculation
|
||||
- Total Rounded Amount in Words
|
||||
-->
|
||||
<table class='footer-table' width=100% cellspacing=0>
|
||||
<thead>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60% style='padding-right: 10px;'>
|
||||
<b>Terms, Conditions & Other Information:</b><br />
|
||||
<script>doc.terms</script>
|
||||
</td>
|
||||
<td>
|
||||
<table cellspacing=0 width=100%><tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td></td>
|
||||
<td width=38%><script>
|
||||
fmt_money(doc.net_total_import)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>
|
||||
<tr style='font-weight: bold' class='imp-details'>
|
||||
<td>Grand Total</td>
|
||||
<td><script>doc.currency</script></td>
|
||||
<td><script>
|
||||
fmt_money(doc.grand_total_import)
|
||||
</script></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br /><b>In Words</b><br />
|
||||
<i><script>doc.in_words_import</script></i>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr><td colspan=2><div></div></td><tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
|
272
erpnext/patches/print_formats/PurchaseOrderSpartan.html
Normal file
272
erpnext/patches/print_formats/PurchaseOrderSpartan.html
Normal file
@ -0,0 +1,272 @@
|
||||
<!--
|
||||
Sample Print Format for ERPNext
|
||||
Please use at your own discretion
|
||||
For suggestions and contributions:
|
||||
https://github.com/webnotes/erpnext-print-templates
|
||||
|
||||
Freely usable under MIT license
|
||||
-->
|
||||
|
||||
<!-- Style Settings -->
|
||||
<style>
|
||||
/*
|
||||
common style for whole page
|
||||
This should include:
|
||||
+ page size related settings
|
||||
+ font family settings
|
||||
+ line spacing settings
|
||||
*/
|
||||
@media screen {
|
||||
body {
|
||||
width: 8.3in;
|
||||
}
|
||||
}
|
||||
|
||||
html, body, div, span, td {
|
||||
font-family: "Arial", sans-serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 10px;
|
||||
margin: auto;
|
||||
font-size: 12px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.common {
|
||||
font-family: "Arial", sans-serif !important;
|
||||
font-size: 12px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100% !important;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table td {
|
||||
padding: 2px 0px;
|
||||
}
|
||||
|
||||
table, td {
|
||||
border-collapse: collapse !important;
|
||||
padding: 0px;
|
||||
margin: 0px !important;
|
||||
}
|
||||
|
||||
table h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
table.header-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.header-table h3 {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
table.header-table thead td {
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
table.header-table > thead,
|
||||
table.header-table > tbody > tr > td,
|
||||
table.footer-table > tbody > tr > td {
|
||||
border: 1px solid black;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
table.footer-table > tbody,
|
||||
table.header-table > thead {
|
||||
border-bottom: 3px solid black;
|
||||
}
|
||||
|
||||
table.header-table > thead {
|
||||
border-top: 3px solid black;
|
||||
}
|
||||
|
||||
div.page-body table td:nth-child(6),
|
||||
div.page-body table td:nth-child(7) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.page-body td {
|
||||
background-color: white !important;
|
||||
border: 1px solid black !important;
|
||||
}
|
||||
|
||||
table.footer-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.footer-table td table td:nth-child(2),
|
||||
table.footer-table td table td:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<!-- Javascript -->
|
||||
<script>
|
||||
si_std = {
|
||||
print_item_table: function() {
|
||||
var table = print_table(
|
||||
'Purchase Order',
|
||||
doc.name,
|
||||
'po_details',
|
||||
'PO Detail',
|
||||
[// Here specify the table columns to be displayed
|
||||
'SR', 'item_code', 'item_name', 'description', 'qty', 'stock_uom',
|
||||
'import_rate', 'import_amount'
|
||||
],
|
||||
[// Here specify the labels of column headings
|
||||
'Sr', 'Item Code', 'Item Name', 'Description', 'Qty',
|
||||
'UoM', 'Basic Rate', 'Amount'
|
||||
],
|
||||
[// Here specify the column widths
|
||||
'3%', '10%', '15%', '32%', '5%',
|
||||
'5%', '15%', '15%'
|
||||
]
|
||||
);
|
||||
|
||||
// This code takes care of page breaks
|
||||
if(table.appendChild) {
|
||||
out = table.innerHTML;
|
||||
} else {
|
||||
out = '';
|
||||
for(var i=0; i < (table.length-1); i++) {
|
||||
out += table[i].innerHTML +
|
||||
'<div style = "page-break-after: always;" \
|
||||
class = "page_break"></div>\
|
||||
<div class="page-settings"></div>';
|
||||
}
|
||||
out += table[table.length-1].innerHTML;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
|
||||
print_other_charges: function(parent) {
|
||||
var oc = getchildren('Purchase Tax Detail', doc.name, 'purchase_tax_details');
|
||||
var rows = '<table width=100%>\n';
|
||||
for(var i=0; i<oc.length; i++) {
|
||||
rows +=
|
||||
'<tr>\n' +
|
||||
'\t<td>' + oc[i].description + '</td>\n' +
|
||||
'\t<td></td>\n' +
|
||||
'\t<td width=38%>' + fmt_money(oc[i].tax_amount / (doc.conversion_rate || 1)) + '</td>\n' +
|
||||
'</tr>\n';
|
||||
}
|
||||
return rows + '</table>\n';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Page Layout Settings -->
|
||||
<div class='common page-header'>
|
||||
<!--
|
||||
Page Header will contain
|
||||
+ table 1
|
||||
+ table 1a
|
||||
- Name
|
||||
- Address
|
||||
- Contact
|
||||
- Mobile No
|
||||
+ table 1b
|
||||
- Voucher Date
|
||||
- Due Date
|
||||
-->
|
||||
<table class='header-table' cellspacing=0>
|
||||
<thead>
|
||||
<tr><td colspan=2><h1>Purchase Order</h1></td></tr>
|
||||
<tr><td colspan=2><h3><script>cur_frm.docname</script></h3></td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60%><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=22%><b>Name</b></td>
|
||||
<td><script>doc.supplier_name</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Address</b></td>
|
||||
<td><script>replace_newlines(doc.address_display)</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Contact</b></td>
|
||||
<td><script>doc.contact_display</script></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
<td><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=63%><b>Purchase Order Date</b></td>
|
||||
<td><script>date.str_to_user(doc.transaction_date)</script></td>
|
||||
<tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
<div class='common page-body'>
|
||||
<!--
|
||||
Page Body will contain
|
||||
+ table 2
|
||||
- Sales Invoice Data
|
||||
-->
|
||||
<script>si_std.print_item_table()</script>
|
||||
</div>
|
||||
<div class='common page-footer'>
|
||||
<!--
|
||||
Page Footer will contain
|
||||
+ table 3
|
||||
- Terms and Conditions
|
||||
- Total Rounded Amount Calculation
|
||||
- Total Rounded Amount in Words
|
||||
-->
|
||||
<table class='footer-table' width=100% cellspacing=0>
|
||||
<thead>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60% style='padding-right: 10px;'>
|
||||
<b>Terms, Conditions & Other Information:</b><br />
|
||||
<script>doc.terms</script>
|
||||
</td>
|
||||
<td>
|
||||
<table cellspacing=0 width=100%><tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td></td>
|
||||
<td width=38%><script>
|
||||
fmt_money(doc.net_total_import)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>
|
||||
<tr style='font-weight: bold'>
|
||||
<td>Grand Total</td>
|
||||
<td><script>doc.currency</script></td>
|
||||
<td><script>
|
||||
fmt_money(doc.grand_total_import)
|
||||
</script></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br /><b>In Words</b><br />
|
||||
<i><script>doc.in_words_import</script></i>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
256
erpnext/patches/print_formats/QuotationClassic.html
Normal file
256
erpnext/patches/print_formats/QuotationClassic.html
Normal file
@ -0,0 +1,256 @@
|
||||
<!--
|
||||
Sample Print Format for ERPNext
|
||||
Please use at your own discretion
|
||||
For suggestions and contributions:
|
||||
https://github.com/webnotes/erpnext-print-templates
|
||||
|
||||
Freely usable under MIT license
|
||||
-->
|
||||
|
||||
<!-- Style Settings -->
|
||||
<style>
|
||||
/*
|
||||
common style for whole page
|
||||
This should include:
|
||||
+ page size related settings
|
||||
+ font family settings
|
||||
+ line spacing settings
|
||||
*/
|
||||
@media screen {
|
||||
body {
|
||||
width: 8.3in;
|
||||
}
|
||||
}
|
||||
|
||||
html, body, div, span, td {
|
||||
font-family: "Georgia", serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 10px;
|
||||
margin: auto;
|
||||
font-size: 12px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.common {
|
||||
font-family: "Georgia", serif !important;
|
||||
font-size: 12px;
|
||||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table td {
|
||||
padding: 2px 0px;
|
||||
}
|
||||
|
||||
table h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
table.header-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.header-table thead {
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
|
||||
table.header-table h3 {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
table.header-table thead td {
|
||||
padding: 5px 0px;
|
||||
}
|
||||
|
||||
div.page-body table td:nth-child(6),
|
||||
div.page-body table td:nth-child(7) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
table.footer-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.footer-table td table td:nth-child(2),
|
||||
table.footer-table td table td:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<!-- Javascript -->
|
||||
<script>
|
||||
si_std = {
|
||||
print_item_table: function() {
|
||||
var table = print_table(
|
||||
'Quotation',
|
||||
doc.name,
|
||||
'quotation_details',
|
||||
'Quotation Detail',
|
||||
[// Here specify the table columns to be displayed
|
||||
'SR', 'item_code', 'item_name', 'description', 'qty', 'stock_uom',
|
||||
'export_rate', 'export_amount'
|
||||
],
|
||||
[// Here specify the labels of column headings
|
||||
'Sr', 'Item Code', 'Item Name', 'Description', 'Qty',
|
||||
'UoM', 'Basic Rate', 'Amount'
|
||||
],
|
||||
[// Here specify the column widths
|
||||
'3%', '10%', '15%', '32%', '5%',
|
||||
'5%', '15%', '15%'
|
||||
]
|
||||
);
|
||||
|
||||
// This code takes care of page breaks
|
||||
if(table.appendChild) {
|
||||
out = table.innerHTML;
|
||||
} else {
|
||||
out = '';
|
||||
for(var i=0; i < (table.length-1); i++) {
|
||||
out += table[i].innerHTML +
|
||||
'<div style = "page-break-after: always;" \
|
||||
class = "page_break"></div>\
|
||||
<div class="page-settings"></div>';
|
||||
}
|
||||
out += table[table.length-1].innerHTML;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
|
||||
print_other_charges: function(parent) {
|
||||
var oc = getchildren('RV Tax Detail', doc.name, 'other_charges');
|
||||
var rows = '<table width=100%>\n';
|
||||
for(var i=0; i<oc.length; i++) {
|
||||
rows +=
|
||||
'<tr>\n' +
|
||||
'\t<td>' + oc[i].description + '</td>\n' +
|
||||
'\t<td></td>\n' +
|
||||
'\t<td width=38%>' + fmt_money(oc[i].tax_amount) + '</td>\n' +
|
||||
'</tr>\n';
|
||||
}
|
||||
return rows + '</table>\n';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Page Layout Settings -->
|
||||
<div class='common page-header'>
|
||||
<!--
|
||||
Page Header will contain
|
||||
+ table 1
|
||||
+ table 1a
|
||||
- Name
|
||||
- Address
|
||||
- Contact
|
||||
- Mobile No
|
||||
+ table 1b
|
||||
- Voucher Date
|
||||
- Due Date
|
||||
-->
|
||||
<table class='header-table' cellspacing=0>
|
||||
<thead>
|
||||
<tr><td><h1>Quotation</h1></td></tr>
|
||||
<tr><td><h3><script>cur_frm.docname</script></h3></td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60%><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=39%><b>Name</b></td>
|
||||
<td><script>doc.customer?doc.customer:doc.lead_name</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Address</b></td>
|
||||
<td><script>replace_newlines(doc.address_display)</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Contact</b></td>
|
||||
<td><script>doc.contact_display</script></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
<td><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=63%><b>Quotation Date</b></td>
|
||||
<td><script>date.str_to_user(doc.transaction_date)</script></td>
|
||||
<tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
<div class='common page-body'>
|
||||
<!--
|
||||
Page Body will contain
|
||||
+ table 2
|
||||
- Sales Invoice Data
|
||||
-->
|
||||
<script>si_std.print_item_table()</script>
|
||||
</div>
|
||||
<div class='common page-footer'>
|
||||
<!--
|
||||
Page Footer will contain
|
||||
+ table 3
|
||||
- Terms and Conditions
|
||||
- Total Rounded Amount Calculation
|
||||
- Total Rounded Amount in Words
|
||||
-->
|
||||
<table class='footer-table' width=100% cellspacing=0>
|
||||
<thead>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60% style='padding-right: 10px;'>
|
||||
<b>Terms, Conditions & Other Information:</b><br />
|
||||
<script>doc.terms</script>
|
||||
</td>
|
||||
<td>
|
||||
<table cellspacing=0 width=100%><tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td></td>
|
||||
<td width=38%><script>
|
||||
fmt_money(doc.net_total/doc.conversion_rate)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>
|
||||
<tr>
|
||||
<td>Grand Total</td>
|
||||
<td></td>
|
||||
<td><script>
|
||||
fmt_money(doc.grand_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr style='font-weight: bold'>
|
||||
<td>Rounded Total</td>
|
||||
<td><script>doc.currency</script></td>
|
||||
<td><script>
|
||||
fmt_money(doc.rounded_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br /><b>In Words</b><br />
|
||||
<i><script>doc.in_words_export</script></i>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
|
283
erpnext/patches/print_formats/QuotationModern.html
Normal file
283
erpnext/patches/print_formats/QuotationModern.html
Normal file
@ -0,0 +1,283 @@
|
||||
<!--
|
||||
Sample Print Format for ERPNext
|
||||
Please use at your own discretion
|
||||
For suggestions and contributions:
|
||||
https://github.com/webnotes/erpnext-print-templates
|
||||
|
||||
Freely usable under MIT license
|
||||
-->
|
||||
|
||||
<!-- Style Settings -->
|
||||
<style>
|
||||
/*
|
||||
common style for whole page
|
||||
This should include:
|
||||
+ page size related settings
|
||||
+ font family settings
|
||||
+ line spacing settings
|
||||
*/
|
||||
@media screen {
|
||||
body {
|
||||
width: 8.3in;
|
||||
}
|
||||
}
|
||||
|
||||
html, body, div, span, td {
|
||||
font-family: "Helvetica", "Arial", sans-serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 10px;
|
||||
margin: auto;
|
||||
font-size: 12px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.common {
|
||||
font-family: "Helvetica", "Arial", sans-serif !important;
|
||||
font-size: 12px;
|
||||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
vertical-align: top;
|
||||
border-style: none !important;
|
||||
}
|
||||
|
||||
table td {
|
||||
padding: 2px 0px;
|
||||
border-style: none !important;
|
||||
}
|
||||
|
||||
table h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
table.header-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.header-table h1 {
|
||||
text-transform: uppercase;
|
||||
color: white;
|
||||
font-size: 55px;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
table.header-table thead tr:nth-child(1) div {
|
||||
height: 24px;
|
||||
background-color: #696969;
|
||||
vertical-align: middle;
|
||||
padding: 12px 0px 0px 0px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.page-body table td:nth-child(6),
|
||||
div.page-body table td:nth-child(7) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.page-body table tr td {
|
||||
background-color: #DCDCDC !important;
|
||||
}
|
||||
|
||||
div.page-body table tr:nth-child(1) td {
|
||||
background-color: #696969 !important;
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
table.footer-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.footer-table td table td:nth-child(2),
|
||||
table.footer-table td table td:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
table.footer-table tfoot td {
|
||||
background-color: #696969;
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
.imp-details {
|
||||
background-color: #DCDCDC;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<!-- Javascript -->
|
||||
<script>
|
||||
si_std = {
|
||||
print_item_table: function() {
|
||||
var table = print_table(
|
||||
'Quotation',
|
||||
doc.name,
|
||||
'quotation_details',
|
||||
'Quotation Detail',
|
||||
[// Here specify the table columns to be displayed
|
||||
'SR', 'item_code', 'item_name', 'description', 'qty', 'stock_uom',
|
||||
'export_rate', 'export_amount'
|
||||
],
|
||||
[// Here specify the labels of column headings
|
||||
'Sr', 'Item Code', 'Item Name', 'Description', 'Qty',
|
||||
'UoM', 'Basic Rate', 'Amount'
|
||||
],
|
||||
[// Here specify the column widths
|
||||
'3%', '10%', '15%', '32%', '5%',
|
||||
'5%', '15%', '15%'
|
||||
]
|
||||
);
|
||||
|
||||
// This code takes care of page breaks
|
||||
if(table.appendChild) {
|
||||
out = table.innerHTML;
|
||||
} else {
|
||||
out = '';
|
||||
for(var i=0; i < (table.length-1); i++) {
|
||||
out += table[i].innerHTML +
|
||||
'<div style = "page-break-after: always;" \
|
||||
class = "page_break"></div>\
|
||||
<div class="page-settings"></div>';
|
||||
}
|
||||
out += table[table.length-1].innerHTML;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
|
||||
print_other_charges: function(parent) {
|
||||
var oc = getchildren('RV Tax Detail', doc.name, 'other_charges');
|
||||
var rows = '<table width=100%>\n';
|
||||
for(var i=0; i<oc.length; i++) {
|
||||
rows +=
|
||||
'<tr>\n' +
|
||||
'\t<td>' + oc[i].description + '</td>\n' +
|
||||
'\t<td></td>\n' +
|
||||
'\t<td width=38%>' + fmt_money(oc[i].tax_amount) + '</td>\n' +
|
||||
'</tr>\n';
|
||||
}
|
||||
return rows + '</table>\n';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Page Layout Settings -->
|
||||
<div class='common page-header'>
|
||||
<!--
|
||||
Page Header will contain
|
||||
+ table 1
|
||||
+ table 1a
|
||||
- Name
|
||||
- Address
|
||||
- Contact
|
||||
- Mobile No
|
||||
+ table 1b
|
||||
- Voucher Date
|
||||
- Due Date
|
||||
-->
|
||||
<table class='header-table' cellspacing=0>
|
||||
<thead>
|
||||
<tr><td colspan=2><div><h1>Quotation</h1></div></td></tr>
|
||||
<tr><td colspan=2><div style="height:15px"></div></td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60%><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=39%><b>Name</b></td>
|
||||
<td><script>doc.customer?doc.customer:doc.lead_name</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Address</b></td>
|
||||
<td><script>replace_newlines(doc.address_display)</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Contact</b></td>
|
||||
<td><script>doc.contact_display</script></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
<td><table width=100% cellspacing=0><tbody>
|
||||
<tr class='imp-details'>
|
||||
<td><b>Quotation No.</b></td>
|
||||
<td><script>cur_frm.docname</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width=63%><b>Quotation Date</b></td>
|
||||
<td><script>date.str_to_user(doc.transaction_date)</script></td>
|
||||
<tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
<div class='common page-body'>
|
||||
<!--
|
||||
Page Body will contain
|
||||
+ table 2
|
||||
- Sales Invoice Data
|
||||
-->
|
||||
<script>si_std.print_item_table()</script>
|
||||
</div>
|
||||
<div class='common page-footer'>
|
||||
<!--
|
||||
Page Footer will contain
|
||||
+ table 3
|
||||
- Terms and Conditions
|
||||
- Total Rounded Amount Calculation
|
||||
- Total Rounded Amount in Words
|
||||
-->
|
||||
<table class='footer-table' width=100% cellspacing=0>
|
||||
<thead>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60% style='padding-right: 10px;'>
|
||||
<b>Terms, Conditions & Other Information:</b><br />
|
||||
<script>doc.terms</script>
|
||||
</td>
|
||||
<td>
|
||||
<table cellspacing=0 width=100%><tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td></td>
|
||||
<td width=38%><script>
|
||||
fmt_money(doc.net_total/doc.conversion_rate)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>
|
||||
<tr>
|
||||
<td>Grand Total</td>
|
||||
<td></td>
|
||||
<td><script>
|
||||
fmt_money(doc.grand_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr style='font-weight: bold' class='imp-details'>
|
||||
<td>Rounded Total</td>
|
||||
<td><script>doc.currency</script></td>
|
||||
<td><script>
|
||||
fmt_money(doc.rounded_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br /><b>In Words</b><br />
|
||||
<i><script>doc.in_words_export</script></i>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr><td colspan=2><div></div></td><tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
|
279
erpnext/patches/print_formats/QuotationSpartan.html
Normal file
279
erpnext/patches/print_formats/QuotationSpartan.html
Normal file
@ -0,0 +1,279 @@
|
||||
<!--
|
||||
Sample Print Format for ERPNext
|
||||
Please use at your own discretion
|
||||
For suggestions and contributions:
|
||||
https://github.com/webnotes/erpnext-print-templates
|
||||
|
||||
Freely usable under MIT license
|
||||
-->
|
||||
|
||||
<!-- Style Settings -->
|
||||
<style>
|
||||
/*
|
||||
common style for whole page
|
||||
This should include:
|
||||
+ page size related settings
|
||||
+ font family settings
|
||||
+ line spacing settings
|
||||
*/
|
||||
@media screen {
|
||||
body {
|
||||
width: 8.3in;
|
||||
}
|
||||
}
|
||||
|
||||
html, body, div, span, td {
|
||||
font-family: "Arial", sans-serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 10px;
|
||||
margin: auto;
|
||||
font-size: 12px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.common {
|
||||
font-family: "Arial", sans-serif !important;
|
||||
font-size: 12px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100% !important;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table td {
|
||||
padding: 2px 0px;
|
||||
}
|
||||
|
||||
table, td {
|
||||
border-collapse: collapse !important;
|
||||
padding: 0px;
|
||||
margin: 0px !important;
|
||||
}
|
||||
|
||||
table h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
table.header-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.header-table h3 {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
table.header-table thead td {
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
table.header-table > thead,
|
||||
table.header-table > tbody > tr > td,
|
||||
table.footer-table > tbody > tr > td {
|
||||
border: 1px solid black;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
table.footer-table > tbody,
|
||||
table.header-table > thead {
|
||||
border-bottom: 3px solid black;
|
||||
}
|
||||
|
||||
table.header-table > thead {
|
||||
border-top: 3px solid black;
|
||||
}
|
||||
|
||||
div.page-body table td:nth-child(6),
|
||||
div.page-body table td:nth-child(7) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.page-body td {
|
||||
background-color: white !important;
|
||||
border: 1px solid black !important;
|
||||
}
|
||||
|
||||
table.footer-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.footer-table td table td:nth-child(2),
|
||||
table.footer-table td table td:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<!-- Javascript -->
|
||||
<script>
|
||||
si_std = {
|
||||
print_item_table: function() {
|
||||
var table = print_table(
|
||||
'Quotation',
|
||||
doc.name,
|
||||
'quotation_details',
|
||||
'Quotation Detail',
|
||||
[// Here specify the table columns to be displayed
|
||||
'SR', 'item_code', 'item_name', 'description', 'qty', 'stock_uom',
|
||||
'export_rate', 'export_amount'
|
||||
],
|
||||
[// Here specify the labels of column headings
|
||||
'Sr', 'Item Code', 'Item Name', 'Description', 'Qty',
|
||||
'UoM', 'Basic Rate', 'Amount'
|
||||
],
|
||||
[// Here specify the column widths
|
||||
'3%', '10%', '15%', '32%', '5%',
|
||||
'5%', '15%', '15%'
|
||||
]
|
||||
);
|
||||
|
||||
// This code takes care of page breaks
|
||||
if(table.appendChild) {
|
||||
out = table.innerHTML;
|
||||
} else {
|
||||
out = '';
|
||||
for(var i=0; i < (table.length-1); i++) {
|
||||
out += table[i].innerHTML +
|
||||
'<div style = "page-break-after: always;" \
|
||||
class = "page_break"></div>\
|
||||
<div class="page-settings"></div>';
|
||||
}
|
||||
out += table[table.length-1].innerHTML;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
|
||||
print_other_charges: function(parent) {
|
||||
var oc = getchildren('RV Tax Detail', doc.name, 'other_charges');
|
||||
var rows = '<table width=100%>\n';
|
||||
for(var i=0; i<oc.length; i++) {
|
||||
rows +=
|
||||
'<tr>\n' +
|
||||
'\t<td>' + oc[i].description + '</td>\n' +
|
||||
'\t<td></td>\n' +
|
||||
'\t<td width=38%>' + fmt_money(oc[i].tax_amount) + '</td>\n' +
|
||||
'</tr>\n';
|
||||
}
|
||||
return rows + '</table>\n';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Page Layout Settings -->
|
||||
<div class='common page-header'>
|
||||
<!--
|
||||
Page Header will contain
|
||||
+ table 1
|
||||
+ table 1a
|
||||
- Name
|
||||
- Address
|
||||
- Contact
|
||||
- Mobile No
|
||||
+ table 1b
|
||||
- Voucher Date
|
||||
- Due Date
|
||||
-->
|
||||
<table class='header-table' cellspacing=0>
|
||||
<thead>
|
||||
<tr><td colspan=2><h1>Quotation</h1></td></tr>
|
||||
<tr><td colspan=2><h3><script>cur_frm.docname</script></h3></td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60%><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=39%><b>Name</b></td>
|
||||
<td><script>doc.customer?doc.customer:doc.lead_name</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Address</b></td>
|
||||
<td><script>replace_newlines(doc.address_display)</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Contact</b></td>
|
||||
<td><script>doc.contact_display</script></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
<td><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=63%><b>Quotation Date</b></td>
|
||||
<td><script>date.str_to_user(doc.transaction_date)</script></td>
|
||||
<tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
<div class='common page-body'>
|
||||
<!--
|
||||
Page Body will contain
|
||||
+ table 2
|
||||
- Sales Invoice Data
|
||||
-->
|
||||
<script>si_std.print_item_table()</script>
|
||||
</div>
|
||||
<div class='common page-footer'>
|
||||
<!--
|
||||
Page Footer will contain
|
||||
+ table 3
|
||||
- Terms and Conditions
|
||||
- Total Rounded Amount Calculation
|
||||
- Total Rounded Amount in Words
|
||||
-->
|
||||
<table class='footer-table' width=100% cellspacing=0>
|
||||
<thead>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60% style='padding-right: 10px;'>
|
||||
<b>Terms, Conditions & Other Information:</b><br />
|
||||
<script>doc.terms</script>
|
||||
</td>
|
||||
<td>
|
||||
<table cellspacing=0 width=100%><tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td></td>
|
||||
<td width=38%><script>
|
||||
fmt_money(doc.net_total/doc.conversion_rate)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>
|
||||
<tr>
|
||||
<td>Grand Total</td>
|
||||
<td></td>
|
||||
<td><script>
|
||||
fmt_money(doc.grand_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr style='font-weight: bold'>
|
||||
<td>Rounded Total</td>
|
||||
<td><script>doc.currency</script></td>
|
||||
<td><script>
|
||||
fmt_money(doc.rounded_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br /><b>In Words</b><br />
|
||||
<i><script>doc.in_words_export</script></i>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
261
erpnext/patches/print_formats/SalesInvoiceClassic.html
Normal file
261
erpnext/patches/print_formats/SalesInvoiceClassic.html
Normal file
@ -0,0 +1,261 @@
|
||||
<!--
|
||||
Sample Print Format for ERPNext
|
||||
Please use at your own discretion
|
||||
For suggestions and contributions:
|
||||
https://github.com/webnotes/erpnext-print-templates
|
||||
|
||||
Freely usable under MIT license
|
||||
-->
|
||||
|
||||
<!-- Style Settings -->
|
||||
<style>
|
||||
/*
|
||||
common style for whole page
|
||||
This should include:
|
||||
+ page size related settings
|
||||
+ font family settings
|
||||
+ line spacing settings
|
||||
*/
|
||||
@media screen {
|
||||
body {
|
||||
width: 8.3in;
|
||||
}
|
||||
}
|
||||
|
||||
html, body, div, span, td {
|
||||
font-family: "Georgia", serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 10px;
|
||||
margin: auto;
|
||||
font-size: 12px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.common {
|
||||
font-family: "Georgia", serif !important;
|
||||
font-size: 12px;
|
||||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table td {
|
||||
padding: 2px 0px;
|
||||
}
|
||||
|
||||
table h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
table.header-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.header-table thead {
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
|
||||
table.header-table h3 {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
table.header-table thead td {
|
||||
padding: 5px 0px;
|
||||
}
|
||||
|
||||
div.page-body table td:nth-child(6),
|
||||
div.page-body table td:nth-child(7) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
table.footer-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.footer-table td table td:nth-child(2),
|
||||
table.footer-table td table td:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<!-- Javascript -->
|
||||
<script>
|
||||
si_std = {
|
||||
print_item_table: function() {
|
||||
var table = print_table(
|
||||
'Receivable Voucher',
|
||||
doc.name,
|
||||
'entries',
|
||||
'RV Detail',
|
||||
[// Here specify the table columns to be displayed
|
||||
'SR', 'item_name', 'description', 'qty', 'stock_uom',
|
||||
'export_rate', 'export_amount'
|
||||
],
|
||||
[// Here specify the labels of column headings
|
||||
'Sr', 'Item Name', 'Description', 'Qty',
|
||||
'UoM', 'Basic Rate', 'Amount'
|
||||
],
|
||||
[// Here specify the column widths
|
||||
'3%', '20%', '37%', '5%',
|
||||
'5%', '15%', '15%'
|
||||
]
|
||||
);
|
||||
|
||||
// This code takes care of page breaks
|
||||
if(table.appendChild) {
|
||||
out = table.innerHTML;
|
||||
} else {
|
||||
out = '';
|
||||
for(var i=0; i < (table.length-1); i++) {
|
||||
out += table[i].innerHTML +
|
||||
'<div style = "page-break-after: always;" \
|
||||
class = "page_break"></div>\
|
||||
<div class="page-settings"></div>';
|
||||
}
|
||||
out += table[table.length-1].innerHTML;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
|
||||
print_other_charges: function(parent) {
|
||||
console.log(parent);
|
||||
var oc = getchildren('RV Tax Detail', doc.name, 'other_charges');
|
||||
var rows = '<table width=100%>\n';
|
||||
for(var i=0; i<oc.length; i++) {
|
||||
rows +=
|
||||
'<tr>\n' +
|
||||
'\t<td>' + oc[i].description + '</td>\n' +
|
||||
'\t<td></td>\n' +
|
||||
'\t<td width=38%>' + fmt_money(oc[i].tax_amount) + '</td>\n' +
|
||||
'</tr>\n';
|
||||
}
|
||||
return rows + '</table>\n';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Page Layout Settings -->
|
||||
<div class='common page-header'>
|
||||
<!--
|
||||
Page Header will contain
|
||||
+ table 1
|
||||
+ table 1a
|
||||
- Name
|
||||
- Address
|
||||
- Contact
|
||||
- Mobile No
|
||||
+ table 1b
|
||||
- Voucher Date
|
||||
- Due Date
|
||||
-->
|
||||
<table class='header-table' cellspacing=0>
|
||||
<thead>
|
||||
<tr><td><h1>Invoice</h1></td></tr>
|
||||
<tr><td><h3><script>cur_frm.docname</script></h3></td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60%><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=39%><b>Name</b></td>
|
||||
<td><script>doc.customer_name</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Address</b></td>
|
||||
<td><script>replace_newlines(doc.address_display)</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Contact</b></td>
|
||||
<td><script>doc.contact_display</script></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
<td><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=40%><b>Invoice Date</b></td>
|
||||
<td><script>date.str_to_user(doc.voucher_date)</script></td>
|
||||
<tr>
|
||||
<tr>
|
||||
<td><b>Due Date</b></td>
|
||||
<td><script>date.str_to_user(doc.due_date)</script></td>
|
||||
<tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
<div class='common page-body'>
|
||||
<!--
|
||||
Page Body will contain
|
||||
+ table 2
|
||||
- Sales Invoice Data
|
||||
-->
|
||||
<script>si_std.print_item_table()</script>
|
||||
</div>
|
||||
<div class='common page-footer'>
|
||||
<!--
|
||||
Page Footer will contain
|
||||
+ table 3
|
||||
- Terms and Conditions
|
||||
- Total Rounded Amount Calculation
|
||||
- Total Rounded Amount in Words
|
||||
-->
|
||||
<table class='footer-table' width=100% cellspacing=0>
|
||||
<thead>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60% style='padding-right: 10px;'>
|
||||
<b>Terms, Conditions & Other Information:</b><br />
|
||||
<script>doc.terms</script>
|
||||
</td>
|
||||
<td>
|
||||
<table cellspacing=0 width=100%><tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td></td>
|
||||
<td width=38%><script>
|
||||
fmt_money(doc.net_total/doc.conversion_rate)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>
|
||||
<tr>
|
||||
<td>Grand Total</td>
|
||||
<td></td>
|
||||
<td><script>
|
||||
fmt_money(doc.grand_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr style='font-weight: bold'>
|
||||
<td>Rounded Total</td>
|
||||
<td><script>doc.currency</script></td>
|
||||
<td><script>
|
||||
fmt_money(doc.rounded_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br /><b>In Words</b><br />
|
||||
<i><script>doc.in_words_export</script></i>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
|
288
erpnext/patches/print_formats/SalesInvoiceModern.html
Normal file
288
erpnext/patches/print_formats/SalesInvoiceModern.html
Normal file
@ -0,0 +1,288 @@
|
||||
<!--
|
||||
Sample Print Format for ERPNext
|
||||
Please use at your own discretion
|
||||
For suggestions and contributions:
|
||||
https://github.com/webnotes/erpnext-print-templates
|
||||
|
||||
Freely usable under MIT license
|
||||
-->
|
||||
|
||||
<!-- Style Settings -->
|
||||
<style>
|
||||
/*
|
||||
common style for whole page
|
||||
This should include:
|
||||
+ page size related settings
|
||||
+ font family settings
|
||||
+ line spacing settings
|
||||
*/
|
||||
@media screen {
|
||||
body {
|
||||
width: 8.3in;
|
||||
}
|
||||
}
|
||||
|
||||
html, body, div, span, td {
|
||||
font-family: "Helvetica", "Arial", sans-serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 10px;
|
||||
margin: auto;
|
||||
font-size: 12px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.common {
|
||||
font-family: "Helvetica", "Arial", sans-serif !important;
|
||||
font-size: 12px;
|
||||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
vertical-align: top;
|
||||
border-style: none !important;
|
||||
}
|
||||
|
||||
table td {
|
||||
padding: 2px 0px;
|
||||
border-style: none !important;
|
||||
}
|
||||
|
||||
table h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
table.header-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.header-table h1 {
|
||||
text-transform: uppercase;
|
||||
color: white;
|
||||
font-size: 55px;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
table.header-table thead tr:nth-child(1) div {
|
||||
height: 24px;
|
||||
background-color: #696969;
|
||||
vertical-align: middle;
|
||||
padding: 12px 0px 0px 0px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.page-body table td:nth-child(6),
|
||||
div.page-body table td:nth-child(7) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.page-body table tr td {
|
||||
background-color: #DCDCDC !important;
|
||||
}
|
||||
|
||||
div.page-body table tr:nth-child(1) td {
|
||||
background-color: #696969 !important;
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
table.footer-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.footer-table td table td:nth-child(2),
|
||||
table.footer-table td table td:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
table.footer-table tfoot td {
|
||||
background-color: #696969;
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
.imp-details {
|
||||
background-color: #DCDCDC;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<!-- Javascript -->
|
||||
<script>
|
||||
si_std = {
|
||||
print_item_table: function() {
|
||||
var table = print_table(
|
||||
'Receivable Voucher',
|
||||
doc.name,
|
||||
'entries',
|
||||
'RV Detail',
|
||||
[// Here specify the table columns to be displayed
|
||||
'SR', 'item_name', 'description', 'qty', 'stock_uom',
|
||||
'export_rate', 'export_amount'
|
||||
],
|
||||
[// Here specify the labels of column headings
|
||||
'Sr', 'Item Name', 'Description', 'Qty',
|
||||
'UoM', 'Basic Rate', 'Amount'
|
||||
],
|
||||
[// Here specify the column widths
|
||||
'3%', '20%', '37%', '5%',
|
||||
'5%', '15%', '15%'
|
||||
]
|
||||
);
|
||||
|
||||
// This code takes care of page breaks
|
||||
if(table.appendChild) {
|
||||
out = table.innerHTML;
|
||||
} else {
|
||||
out = '';
|
||||
for(var i=0; i < (table.length-1); i++) {
|
||||
out += table[i].innerHTML +
|
||||
'<div style = "page-break-after: always;" \
|
||||
class = "page_break"></div>\
|
||||
<div class="page-settings"></div>';
|
||||
}
|
||||
out += table[table.length-1].innerHTML;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
|
||||
print_other_charges: function(parent) {
|
||||
console.log(parent);
|
||||
var oc = getchildren('RV Tax Detail', doc.name, 'other_charges');
|
||||
var rows = '<table width=100%>\n';
|
||||
for(var i=0; i<oc.length; i++) {
|
||||
rows +=
|
||||
'<tr>\n' +
|
||||
'\t<td>' + oc[i].description + '</td>\n' +
|
||||
'\t<td></td>\n' +
|
||||
'\t<td width=38%>' + fmt_money(oc[i].tax_amount) + '</td>\n' +
|
||||
'</tr>\n';
|
||||
}
|
||||
return rows + '</table>\n';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Page Layout Settings -->
|
||||
<div class='common page-header'>
|
||||
<!--
|
||||
Page Header will contain
|
||||
+ table 1
|
||||
+ table 1a
|
||||
- Name
|
||||
- Address
|
||||
- Contact
|
||||
- Mobile No
|
||||
+ table 1b
|
||||
- Voucher Date
|
||||
- Due Date
|
||||
-->
|
||||
<table class='header-table' cellspacing=0>
|
||||
<thead>
|
||||
<tr><td colspan=2><div><h1>Invoice</h1></div></td></tr>
|
||||
<tr><td colspan=2><div style="height:15px"></div></td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60%><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=39%><b>Name</b></td>
|
||||
<td><script>doc.customer_name</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Address</b></td>
|
||||
<td><script>replace_newlines(doc.address_display)</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Contact</b></td>
|
||||
<td><script>doc.contact_display</script></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
<td><table width=100% cellspacing=0><tbody>
|
||||
<tr class='imp-details'>
|
||||
<td><b>Invoice No.</b></td>
|
||||
<td><script>cur_frm.docname</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width=40%><b>Invoice Date</b></td>
|
||||
<td><script>date.str_to_user(doc.voucher_date)</script></td>
|
||||
<tr>
|
||||
<tr>
|
||||
<td><b>Due Date</b></td>
|
||||
<td><script>date.str_to_user(doc.due_date)</script></td>
|
||||
<tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
<div class='common page-body'>
|
||||
<!--
|
||||
Page Body will contain
|
||||
+ table 2
|
||||
- Sales Invoice Data
|
||||
-->
|
||||
<script>si_std.print_item_table()</script>
|
||||
</div>
|
||||
<div class='common page-footer'>
|
||||
<!--
|
||||
Page Footer will contain
|
||||
+ table 3
|
||||
- Terms and Conditions
|
||||
- Total Rounded Amount Calculation
|
||||
- Total Rounded Amount in Words
|
||||
-->
|
||||
<table class='footer-table' width=100% cellspacing=0>
|
||||
<thead>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60% style='padding-right: 10px;'>
|
||||
<b>Terms, Conditions & Other Information:</b><br />
|
||||
<script>doc.terms</script>
|
||||
</td>
|
||||
<td>
|
||||
<table cellspacing=0 width=100%><tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td></td>
|
||||
<td width=38%><script>
|
||||
fmt_money(doc.net_total/doc.conversion_rate)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>
|
||||
<tr>
|
||||
<td>Grand Total</td>
|
||||
<td></td>
|
||||
<td><script>
|
||||
fmt_money(doc.grand_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr style='font-weight: bold' class='imp-details'>
|
||||
<td>Rounded Total</td>
|
||||
<td><script>doc.currency</script></td>
|
||||
<td><script>
|
||||
fmt_money(doc.rounded_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br /><b>In Words</b><br />
|
||||
<i><script>doc.in_words_export</script></i>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr><td colspan=2><div></div></td><tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
|
284
erpnext/patches/print_formats/SalesInvoiceSpartan.html
Normal file
284
erpnext/patches/print_formats/SalesInvoiceSpartan.html
Normal file
@ -0,0 +1,284 @@
|
||||
<!--
|
||||
Sample Print Format for ERPNext
|
||||
Please use at your own discretion
|
||||
For suggestions and contributions:
|
||||
https://github.com/webnotes/erpnext-print-templates
|
||||
|
||||
Freely usable under MIT license
|
||||
-->
|
||||
|
||||
<!-- Style Settings -->
|
||||
<style>
|
||||
/*
|
||||
common style for whole page
|
||||
This should include:
|
||||
+ page size related settings
|
||||
+ font family settings
|
||||
+ line spacing settings
|
||||
*/
|
||||
@media screen {
|
||||
body {
|
||||
width: 8.3in;
|
||||
}
|
||||
}
|
||||
|
||||
html, body, div, span, td {
|
||||
font-family: "Arial", sans-serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 10px;
|
||||
margin: auto;
|
||||
font-size: 12px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.common {
|
||||
font-family: "Arial", sans-serif !important;
|
||||
font-size: 12px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100% !important;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table td {
|
||||
padding: 2px 0px;
|
||||
}
|
||||
|
||||
table, td {
|
||||
border-collapse: collapse !important;
|
||||
padding: 0px;
|
||||
margin: 0px !important;
|
||||
}
|
||||
|
||||
table h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
table.header-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.header-table h3 {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
table.header-table thead td {
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
table.header-table > thead,
|
||||
table.header-table > tbody > tr > td,
|
||||
table.footer-table > tbody > tr > td {
|
||||
border: 1px solid black;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
table.footer-table > tbody,
|
||||
table.header-table > thead {
|
||||
border-bottom: 3px solid black;
|
||||
}
|
||||
|
||||
table.header-table > thead {
|
||||
border-top: 3px solid black;
|
||||
}
|
||||
|
||||
div.page-body table td:nth-child(6),
|
||||
div.page-body table td:nth-child(7) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.page-body td {
|
||||
background-color: white !important;
|
||||
border: 1px solid black !important;
|
||||
}
|
||||
|
||||
table.footer-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.footer-table td table td:nth-child(2),
|
||||
table.footer-table td table td:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<!-- Javascript -->
|
||||
<script>
|
||||
si_std = {
|
||||
print_item_table: function() {
|
||||
var table = print_table(
|
||||
'Receivable Voucher',
|
||||
doc.name,
|
||||
'entries',
|
||||
'RV Detail',
|
||||
[// Here specify the table columns to be displayed
|
||||
'SR', 'item_name', 'description', 'qty', 'stock_uom',
|
||||
'export_rate', 'export_amount'
|
||||
],
|
||||
[// Here specify the labels of column headings
|
||||
'Sr', 'Item Name', 'Description', 'Qty',
|
||||
'UoM', 'Basic Rate', 'Amount'
|
||||
],
|
||||
[// Here specify the column widths
|
||||
'3%', '20%', '37%', '5%',
|
||||
'5%', '15%', '15%'
|
||||
]
|
||||
);
|
||||
|
||||
// This code takes care of page breaks
|
||||
if(table.appendChild) {
|
||||
out = table.innerHTML;
|
||||
} else {
|
||||
out = '';
|
||||
for(var i=0; i < (table.length-1); i++) {
|
||||
out += table[i].innerHTML +
|
||||
'<div style = "page-break-after: always;" \
|
||||
class = "page_break"></div>\
|
||||
<div class="page-settings"></div>';
|
||||
}
|
||||
out += table[table.length-1].innerHTML;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
|
||||
print_other_charges: function(parent) {
|
||||
console.log(parent);
|
||||
var oc = getchildren('RV Tax Detail', doc.name, 'other_charges');
|
||||
var rows = '<table width=100%>\n';
|
||||
for(var i=0; i<oc.length; i++) {
|
||||
rows +=
|
||||
'<tr>\n' +
|
||||
'\t<td>' + oc[i].description + '</td>\n' +
|
||||
'\t<td></td>\n' +
|
||||
'\t<td width=38%>' + fmt_money(oc[i].tax_amount) + '</td>\n' +
|
||||
'</tr>\n';
|
||||
}
|
||||
return rows + '</table>\n';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Page Layout Settings -->
|
||||
<div class='common page-header'>
|
||||
<!--
|
||||
Page Header will contain
|
||||
+ table 1
|
||||
+ table 1a
|
||||
- Name
|
||||
- Address
|
||||
- Contact
|
||||
- Mobile No
|
||||
+ table 1b
|
||||
- Voucher Date
|
||||
- Due Date
|
||||
-->
|
||||
<table class='header-table' cellspacing=0>
|
||||
<thead>
|
||||
<tr><td colspan=2><h1>Invoice</h1></td></tr>
|
||||
<tr><td colspan=2><h3><script>cur_frm.docname</script></h3></td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60%><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=39%><b>Name</b></td>
|
||||
<td><script>doc.customer_name</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Address</b></td>
|
||||
<td><script>replace_newlines(doc.address_display)</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Contact</b></td>
|
||||
<td><script>doc.contact_display</script></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
<td><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=40%><b>Invoice Date</b></td>
|
||||
<td><script>date.str_to_user(doc.voucher_date)</script></td>
|
||||
<tr>
|
||||
<tr>
|
||||
<td><b>Due Date</b></td>
|
||||
<td><script>date.str_to_user(doc.due_date)</script></td>
|
||||
<tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
<div class='common page-body'>
|
||||
<!--
|
||||
Page Body will contain
|
||||
+ table 2
|
||||
- Sales Invoice Data
|
||||
-->
|
||||
<script>si_std.print_item_table()</script>
|
||||
</div>
|
||||
<div class='common page-footer'>
|
||||
<!--
|
||||
Page Footer will contain
|
||||
+ table 3
|
||||
- Terms and Conditions
|
||||
- Total Rounded Amount Calculation
|
||||
- Total Rounded Amount in Words
|
||||
-->
|
||||
<table class='footer-table' width=100% cellspacing=0>
|
||||
<thead>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60% style='padding-right: 10px;'>
|
||||
<b>Terms, Conditions & Other Information:</b><br />
|
||||
<script>doc.terms</script>
|
||||
</td>
|
||||
<td>
|
||||
<table cellspacing=0 width=100%><tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td></td>
|
||||
<td width=38%><script>
|
||||
fmt_money(doc.net_total/doc.conversion_rate)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>
|
||||
<tr>
|
||||
<td>Grand Total</td>
|
||||
<td></td>
|
||||
<td><script>
|
||||
fmt_money(doc.grand_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr style='font-weight: bold'>
|
||||
<td>Rounded Total</td>
|
||||
<td><script>doc.currency</script></td>
|
||||
<td><script>
|
||||
fmt_money(doc.rounded_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br /><b>In Words</b><br />
|
||||
<i><script>doc.in_words_export</script></i>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
260
erpnext/patches/print_formats/SalesOrderClassic.html
Normal file
260
erpnext/patches/print_formats/SalesOrderClassic.html
Normal file
@ -0,0 +1,260 @@
|
||||
<!--
|
||||
Sample Print Format for ERPNext
|
||||
Please use at your own discretion
|
||||
For suggestions and contributions:
|
||||
https://github.com/webnotes/erpnext-print-templates
|
||||
|
||||
Freely usable under MIT license
|
||||
-->
|
||||
|
||||
<!-- Style Settings -->
|
||||
<style>
|
||||
/*
|
||||
common style for whole page
|
||||
This should include:
|
||||
+ page size related settings
|
||||
+ font family settings
|
||||
+ line spacing settings
|
||||
*/
|
||||
@media screen {
|
||||
body {
|
||||
width: 8.3in;
|
||||
}
|
||||
}
|
||||
|
||||
html, body, div, span, td {
|
||||
font-family: "Georgia", serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 10px;
|
||||
margin: auto;
|
||||
font-size: 12px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.common {
|
||||
font-family: "Georgia", serif !important;
|
||||
font-size: 12px;
|
||||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table td {
|
||||
padding: 2px 0px;
|
||||
}
|
||||
|
||||
table h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
table.header-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.header-table thead {
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
|
||||
table.header-table h3 {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
table.header-table thead td {
|
||||
padding: 5px 0px;
|
||||
}
|
||||
|
||||
div.page-body table td:nth-child(6),
|
||||
div.page-body table td:nth-child(7) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
table.footer-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.footer-table td table td:nth-child(2),
|
||||
table.footer-table td table td:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<!-- Javascript -->
|
||||
<script>
|
||||
si_std = {
|
||||
print_item_table: function() {
|
||||
var table = print_table(
|
||||
'Sales Order',
|
||||
doc.name,
|
||||
'sales_order_details',
|
||||
'Sales Order Detail',
|
||||
[// Here specify the table columns to be displayed
|
||||
'SR', 'item_code', 'description', 'qty', 'stock_uom',
|
||||
'basic_rate', 'amount'
|
||||
],
|
||||
[// Here specify the labels of column headings
|
||||
'Sr', 'Item Code', 'Description', 'Qty',
|
||||
'UoM', 'Basic Rate', 'Amount'
|
||||
],
|
||||
[// Here specify the column widths
|
||||
'3%', '20%', '37%', '5%',
|
||||
'5%', '15%', '15%'
|
||||
]
|
||||
);
|
||||
|
||||
// This code takes care of page breaks
|
||||
if(table.appendChild) {
|
||||
out = table.innerHTML;
|
||||
} else {
|
||||
out = '';
|
||||
for(var i=0; i < (table.length-1); i++) {
|
||||
out += table[i].innerHTML +
|
||||
'<div style = "page-break-after: always;" \
|
||||
class = "page_break"></div>\
|
||||
<div class="page-settings"></div>';
|
||||
}
|
||||
out += table[table.length-1].innerHTML;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
|
||||
print_other_charges: function(parent) {
|
||||
var oc = getchildren('RV Tax Detail', doc.name, 'other_charges');
|
||||
var rows = '<table width=100%>\n';
|
||||
for(var i=0; i<oc.length; i++) {
|
||||
rows +=
|
||||
'<tr>\n' +
|
||||
'\t<td>' + oc[i].description + '</td>\n' +
|
||||
'\t<td></td>\n' +
|
||||
'\t<td width=38%>' + fmt_money(oc[i].tax_amount) + '</td>\n' +
|
||||
'</tr>\n';
|
||||
}
|
||||
return rows + '</table>\n';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Page Layout Settings -->
|
||||
<div class='common page-header'>
|
||||
<!--
|
||||
Page Header will contain
|
||||
+ table 1
|
||||
+ table 1a
|
||||
- Name
|
||||
- Address
|
||||
- Contact
|
||||
- Mobile No
|
||||
+ table 1b
|
||||
- Voucher Date
|
||||
- Due Date
|
||||
-->
|
||||
<table class='header-table' cellspacing=0>
|
||||
<thead>
|
||||
<tr><td><h1>Sales Order</h1></td></tr>
|
||||
<tr><td><h3><script>cur_frm.docname</script></h3></td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60%><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=39%><b>Name</b></td>
|
||||
<td><script>doc.customer_name</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Address</b></td>
|
||||
<td><script>replace_newlines(doc.address_display)</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Contact</b></td>
|
||||
<td><script>doc.contact_display</script></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
<td><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=63%><b>Sales Order Date</b></td>
|
||||
<td><script>date.str_to_user(doc.transaction_date)</script></td>
|
||||
<tr>
|
||||
<tr>
|
||||
<td><b>Delivery Date</b></td>
|
||||
<td><script>date.str_to_user(doc.delivery_date)</script></td>
|
||||
<tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
<div class='common page-body'>
|
||||
<!--
|
||||
Page Body will contain
|
||||
+ table 2
|
||||
- Sales Invoice Data
|
||||
-->
|
||||
<script>si_std.print_item_table()</script>
|
||||
</div>
|
||||
<div class='common page-footer'>
|
||||
<!--
|
||||
Page Footer will contain
|
||||
+ table 3
|
||||
- Terms and Conditions
|
||||
- Total Rounded Amount Calculation
|
||||
- Total Rounded Amount in Words
|
||||
-->
|
||||
<table class='footer-table' width=100% cellspacing=0>
|
||||
<thead>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60% style='padding-right: 10px;'>
|
||||
<b>Terms, Conditions & Other Information:</b><br />
|
||||
<script>doc.terms</script>
|
||||
</td>
|
||||
<td>
|
||||
<table cellspacing=0 width=100%><tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td></td>
|
||||
<td width=38%><script>
|
||||
fmt_money(doc.net_total)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>
|
||||
<tr>
|
||||
<td>Grand Total</td>
|
||||
<td></td>
|
||||
<td><script>
|
||||
fmt_money(doc.grand_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr style='font-weight: bold'>
|
||||
<td>Rounded Total</td>
|
||||
<td><script>doc.currency</script></td>
|
||||
<td><script>
|
||||
fmt_money(doc.rounded_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br /><b>In Words</b><br />
|
||||
<i><script>doc.in_words_export</script></i>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
|
287
erpnext/patches/print_formats/SalesOrderModern.html
Normal file
287
erpnext/patches/print_formats/SalesOrderModern.html
Normal file
@ -0,0 +1,287 @@
|
||||
<!--
|
||||
Sample Print Format for ERPNext
|
||||
Please use at your own discretion
|
||||
For suggestions and contributions:
|
||||
https://github.com/webnotes/erpnext-print-templates
|
||||
|
||||
Freely usable under MIT license
|
||||
-->
|
||||
|
||||
<!-- Style Settings -->
|
||||
<style>
|
||||
/*
|
||||
common style for whole page
|
||||
This should include:
|
||||
+ page size related settings
|
||||
+ font family settings
|
||||
+ line spacing settings
|
||||
*/
|
||||
@media screen {
|
||||
body {
|
||||
width: 8.3in;
|
||||
}
|
||||
}
|
||||
|
||||
html, body, div, span, td {
|
||||
font-family: "Helvetica", "Arial", sans-serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 10px;
|
||||
margin: auto;
|
||||
font-size: 12px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.common {
|
||||
font-family: "Helvetica", "Arial", sans-serif !important;
|
||||
font-size: 12px;
|
||||
padding: 10px 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
width: 100%;
|
||||
vertical-align: top;
|
||||
border-style: none !important;
|
||||
}
|
||||
|
||||
table td {
|
||||
padding: 2px 0px;
|
||||
border-style: none !important;
|
||||
}
|
||||
|
||||
table h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
table.header-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.header-table h1 {
|
||||
text-transform: uppercase;
|
||||
color: white;
|
||||
font-size: 55px;
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
table.header-table thead tr:nth-child(1) div {
|
||||
height: 24px;
|
||||
background-color: #696969;
|
||||
vertical-align: middle;
|
||||
padding: 12px 0px 0px 0px;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.page-body table td:nth-child(6),
|
||||
div.page-body table td:nth-child(7) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.page-body table tr td {
|
||||
background-color: #DCDCDC !important;
|
||||
}
|
||||
|
||||
div.page-body table tr:nth-child(1) td {
|
||||
background-color: #696969 !important;
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
table.footer-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.footer-table td table td:nth-child(2),
|
||||
table.footer-table td table td:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
table.footer-table tfoot td {
|
||||
background-color: #696969;
|
||||
height: 10px;
|
||||
}
|
||||
|
||||
.imp-details {
|
||||
background-color: #DCDCDC;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<!-- Javascript -->
|
||||
<script>
|
||||
si_std = {
|
||||
print_item_table: function() {
|
||||
var table = print_table(
|
||||
'Sales Order',
|
||||
doc.name,
|
||||
'sales_order_details',
|
||||
'Sales Order Detail',
|
||||
[// Here specify the table columns to be displayed
|
||||
'SR', 'item_code', 'description', 'qty', 'stock_uom',
|
||||
'basic_rate', 'amount'
|
||||
],
|
||||
[// Here specify the labels of column headings
|
||||
'Sr', 'Item Code', 'Description', 'Qty',
|
||||
'UoM', 'Basic Rate', 'Amount'
|
||||
],
|
||||
[// Here specify the column widths
|
||||
'3%', '20%', '37%', '5%',
|
||||
'5%', '15%', '15%'
|
||||
]
|
||||
);
|
||||
|
||||
// This code takes care of page breaks
|
||||
if(table.appendChild) {
|
||||
out = table.innerHTML;
|
||||
} else {
|
||||
out = '';
|
||||
for(var i=0; i < (table.length-1); i++) {
|
||||
out += table[i].innerHTML +
|
||||
'<div style = "page-break-after: always;" \
|
||||
class = "page_break"></div>\
|
||||
<div class="page-settings"></div>';
|
||||
}
|
||||
out += table[table.length-1].innerHTML;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
|
||||
print_other_charges: function(parent) {
|
||||
var oc = getchildren('RV Tax Detail', doc.name, 'other_charges');
|
||||
var rows = '<table width=100%>\n';
|
||||
for(var i=0; i<oc.length; i++) {
|
||||
rows +=
|
||||
'<tr>\n' +
|
||||
'\t<td>' + oc[i].description + '</td>\n' +
|
||||
'\t<td></td>\n' +
|
||||
'\t<td width=38%>' + fmt_money(oc[i].tax_amount) + '</td>\n' +
|
||||
'</tr>\n';
|
||||
}
|
||||
return rows + '</table>\n';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Page Layout Settings -->
|
||||
<div class='common page-header'>
|
||||
<!--
|
||||
Page Header will contain
|
||||
+ table 1
|
||||
+ table 1a
|
||||
- Name
|
||||
- Address
|
||||
- Contact
|
||||
- Mobile No
|
||||
+ table 1b
|
||||
- Voucher Date
|
||||
- Due Date
|
||||
-->
|
||||
<table class='header-table' cellspacing=0>
|
||||
<thead>
|
||||
<tr><td colspan=2><div><h1>Sales Order</h1></div></td></tr>
|
||||
<tr><td colspan=2><div style="height:15px"></div></td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60%><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=39%><b>Name</b></td>
|
||||
<td><script>doc.customer_name</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Address</b></td>
|
||||
<td><script>replace_newlines(doc.address_display)</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Contact</b></td>
|
||||
<td><script>doc.contact_display</script></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
<td><table width=100% cellspacing=0><tbody>
|
||||
<tr class='imp-details'>
|
||||
<td><b>Sales Order No.</b></td>
|
||||
<td><script>cur_frm.docname</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td width=63%><b>Sales Order Date</b></td>
|
||||
<td><script>date.str_to_user(doc.transaction_date)</script></td>
|
||||
<tr>
|
||||
<tr>
|
||||
<td><b>Delivery Date</b></td>
|
||||
<td><script>date.str_to_user(doc.delivery_date)</script></td>
|
||||
<tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
<div class='common page-body'>
|
||||
<!--
|
||||
Page Body will contain
|
||||
+ table 2
|
||||
- Sales Invoice Data
|
||||
-->
|
||||
<script>si_std.print_item_table()</script>
|
||||
</div>
|
||||
<div class='common page-footer'>
|
||||
<!--
|
||||
Page Footer will contain
|
||||
+ table 3
|
||||
- Terms and Conditions
|
||||
- Total Rounded Amount Calculation
|
||||
- Total Rounded Amount in Words
|
||||
-->
|
||||
<table class='footer-table' width=100% cellspacing=0>
|
||||
<thead>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60% style='padding-right: 10px;'>
|
||||
<b>Terms, Conditions & Other Information:</b><br />
|
||||
<script>doc.terms</script>
|
||||
</td>
|
||||
<td>
|
||||
<table cellspacing=0 width=100%><tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td></td>
|
||||
<td width=38%><script>
|
||||
fmt_money(doc.net_total)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>
|
||||
<tr>
|
||||
<td>Grand Total</td>
|
||||
<td></td>
|
||||
<td><script>
|
||||
fmt_money(doc.grand_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr style='font-weight: bold' class='imp-details'>
|
||||
<td>Rounded Total</td>
|
||||
<td><script>doc.currency</script></td>
|
||||
<td><script>
|
||||
fmt_money(doc.rounded_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br /><b>In Words</b><br />
|
||||
<i><script>doc.in_words_export</script></i>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
<tr><td colspan=2><div></div></td><tr>
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
|
283
erpnext/patches/print_formats/SalesOrderSpartan.html
Normal file
283
erpnext/patches/print_formats/SalesOrderSpartan.html
Normal file
@ -0,0 +1,283 @@
|
||||
<!--
|
||||
Sample Print Format for ERPNext
|
||||
Please use at your own discretion
|
||||
For suggestions and contributions:
|
||||
https://github.com/webnotes/erpnext-print-templates
|
||||
|
||||
Freely usable under MIT license
|
||||
-->
|
||||
|
||||
<!-- Style Settings -->
|
||||
<style>
|
||||
/*
|
||||
common style for whole page
|
||||
This should include:
|
||||
+ page size related settings
|
||||
+ font family settings
|
||||
+ line spacing settings
|
||||
*/
|
||||
@media screen {
|
||||
body {
|
||||
width: 8.3in;
|
||||
}
|
||||
}
|
||||
|
||||
html, body, div, span, td {
|
||||
font-family: "Arial", sans-serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
body {
|
||||
padding: 10px;
|
||||
margin: auto;
|
||||
font-size: 12px;
|
||||
line-height: 150%;
|
||||
}
|
||||
|
||||
.common {
|
||||
font-family: "Arial", sans-serif !important;
|
||||
font-size: 12px;
|
||||
padding: 0px;
|
||||
}
|
||||
|
||||
table {
|
||||
width: 100% !important;
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table td {
|
||||
padding: 2px 0px;
|
||||
}
|
||||
|
||||
table, td {
|
||||
border-collapse: collapse !important;
|
||||
padding: 0px;
|
||||
margin: 0px !important;
|
||||
}
|
||||
|
||||
table h1, h2, h3, h4, h5, h6 {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
}
|
||||
|
||||
table.header-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.header-table h3 {
|
||||
color: gray;
|
||||
}
|
||||
|
||||
table.header-table thead td {
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
table.header-table > thead,
|
||||
table.header-table > tbody > tr > td,
|
||||
table.footer-table > tbody > tr > td {
|
||||
border: 1px solid black;
|
||||
padding: 5px;
|
||||
}
|
||||
|
||||
table.footer-table > tbody,
|
||||
table.header-table > thead {
|
||||
border-bottom: 3px solid black;
|
||||
}
|
||||
|
||||
table.header-table > thead {
|
||||
border-top: 3px solid black;
|
||||
}
|
||||
|
||||
div.page-body table td:nth-child(6),
|
||||
div.page-body table td:nth-child(7) {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
div.page-body td {
|
||||
background-color: white !important;
|
||||
border: 1px solid black !important;
|
||||
}
|
||||
|
||||
table.footer-table td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
table.footer-table td table td:nth-child(2),
|
||||
table.footer-table td table td:nth-child(3) {
|
||||
text-align: right;
|
||||
}
|
||||
</style>
|
||||
|
||||
|
||||
<!-- Javascript -->
|
||||
<script>
|
||||
si_std = {
|
||||
print_item_table: function() {
|
||||
var table = print_table(
|
||||
'Sales Order',
|
||||
doc.name,
|
||||
'sales_order_details',
|
||||
'Sales Order Detail',
|
||||
[// Here specify the table columns to be displayed
|
||||
'SR', 'item_code', 'description', 'qty', 'stock_uom',
|
||||
'basic_rate', 'amount'
|
||||
],
|
||||
[// Here specify the labels of column headings
|
||||
'Sr', 'Item Code', 'Description', 'Qty',
|
||||
'UoM', 'Basic Rate', 'Amount'
|
||||
],
|
||||
[// Here specify the column widths
|
||||
'3%', '20%', '37%', '5%',
|
||||
'5%', '15%', '15%'
|
||||
]
|
||||
);
|
||||
|
||||
// This code takes care of page breaks
|
||||
if(table.appendChild) {
|
||||
out = table.innerHTML;
|
||||
} else {
|
||||
out = '';
|
||||
for(var i=0; i < (table.length-1); i++) {
|
||||
out += table[i].innerHTML +
|
||||
'<div style = "page-break-after: always;" \
|
||||
class = "page_break"></div>\
|
||||
<div class="page-settings"></div>';
|
||||
}
|
||||
out += table[table.length-1].innerHTML;
|
||||
}
|
||||
return out;
|
||||
},
|
||||
|
||||
|
||||
print_other_charges: function(parent) {
|
||||
var oc = getchildren('RV Tax Detail', doc.name, 'other_charges');
|
||||
var rows = '<table width=100%>\n';
|
||||
for(var i=0; i<oc.length; i++) {
|
||||
rows +=
|
||||
'<tr>\n' +
|
||||
'\t<td>' + oc[i].description + '</td>\n' +
|
||||
'\t<td></td>\n' +
|
||||
'\t<td width=38%>' + fmt_money(oc[i].tax_amount) + '</td>\n' +
|
||||
'</tr>\n';
|
||||
}
|
||||
return rows + '</table>\n';
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
|
||||
<!-- Page Layout Settings -->
|
||||
<div class='common page-header'>
|
||||
<!--
|
||||
Page Header will contain
|
||||
+ table 1
|
||||
+ table 1a
|
||||
- Name
|
||||
- Address
|
||||
- Contact
|
||||
- Mobile No
|
||||
+ table 1b
|
||||
- Voucher Date
|
||||
- Due Date
|
||||
-->
|
||||
<table class='header-table' cellspacing=0>
|
||||
<thead>
|
||||
<tr><td colspan=2><h1>Sales Order</h1></td></tr>
|
||||
<tr><td colspan=2><h3><script>cur_frm.docname</script></h3></td></tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60%><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=39%><b>Name</b></td>
|
||||
<td><script>doc.customer_name</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Address</b></td>
|
||||
<td><script>replace_newlines(doc.address_display)</script></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><b>Contact</b></td>
|
||||
<td><script>doc.contact_display</script></td>
|
||||
</tr>
|
||||
</tbody></table></td>
|
||||
<td><table width=100% cellspacing=0><tbody>
|
||||
<tr>
|
||||
<td width=63%><b>Sales Order Date</b></td>
|
||||
<td><script>date.str_to_user(doc.transaction_date)</script></td>
|
||||
<tr>
|
||||
<tr>
|
||||
<td><b>Delivery Date</b></td>
|
||||
<td><script>date.str_to_user(doc.delivery_date)</script></td>
|
||||
<tr>
|
||||
</tbody></table></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
<div class='common page-body'>
|
||||
<!--
|
||||
Page Body will contain
|
||||
+ table 2
|
||||
- Sales Invoice Data
|
||||
-->
|
||||
<script>si_std.print_item_table()</script>
|
||||
</div>
|
||||
<div class='common page-footer'>
|
||||
<!--
|
||||
Page Footer will contain
|
||||
+ table 3
|
||||
- Terms and Conditions
|
||||
- Total Rounded Amount Calculation
|
||||
- Total Rounded Amount in Words
|
||||
-->
|
||||
<table class='footer-table' width=100% cellspacing=0>
|
||||
<thead>
|
||||
|
||||
</thead>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td width=60% style='padding-right: 10px;'>
|
||||
<b>Terms, Conditions & Other Information:</b><br />
|
||||
<script>doc.terms</script>
|
||||
</td>
|
||||
<td>
|
||||
<table cellspacing=0 width=100%><tbody>
|
||||
<tr>
|
||||
<td>Net Total</td>
|
||||
<td></td>
|
||||
<td width=38%><script>
|
||||
fmt_money(doc.net_total)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr><td colspan=3><script>si_std.print_other_charges()</script></td></tr>
|
||||
<tr>
|
||||
<td>Grand Total</td>
|
||||
<td></td>
|
||||
<td><script>
|
||||
fmt_money(doc.grand_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
<tr style='font-weight: bold'>
|
||||
<td>Rounded Total</td>
|
||||
<td><script>doc.currency</script></td>
|
||||
<td><script>
|
||||
fmt_money(doc.rounded_total_export)
|
||||
</script></td>
|
||||
</tr>
|
||||
</tbody></table>
|
||||
<br /><b>In Words</b><br />
|
||||
<i><script>doc.in_words_export</script></i>
|
||||
</td>
|
||||
</tr>
|
||||
</tbody>
|
||||
<tfoot>
|
||||
|
||||
</tfoot>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
18
erpnext/patches/project_patch.py
Normal file
18
erpnext/patches/project_patch.py
Normal file
@ -0,0 +1,18 @@
|
||||
def execute():
|
||||
import webnotes
|
||||
from webnotes.modules.module_manager import reload_doc
|
||||
sql = webnotes.conn.sql
|
||||
|
||||
# Reload item table
|
||||
reload_doc('accounts', 'doctype', 'pv_detail')
|
||||
reload_doc('buying', 'doctype', 'po_detail')
|
||||
reload_doc('stock', 'doctype', 'purchase_receipt_detail')
|
||||
|
||||
# copy project value from parent to child
|
||||
sql("update `tabPO Detail` t1, `tabPurchase Order` t2 set t1.project_name = t2.project_name where t1.parent = t2.name and ifnull(t1.project_name, '') = ''")
|
||||
sql("update `tabPV Detail` t1, `tabPayable Voucher` t2 set t1.project_name = t2.project_name where t1.parent = t2.name and ifnull(t1.project_name, '') = ''")
|
||||
sql("update `tabPurchase Receipt Detail` t1, `tabPurchase Receipt` t2 set t1.project_name = t2.project_name where t1.parent = t2.name and ifnull(t1.project_name, '') = ''")
|
||||
|
||||
# delete project from parent
|
||||
sql("delete from `tabDocField` where fieldname = 'project_name' and parent in ('Purchase Order', 'Purchase Receipt', 'Payable Voucher')")
|
||||
|
5
erpnext/patches/reload_bom.py
Normal file
5
erpnext/patches/reload_bom.py
Normal file
@ -0,0 +1,5 @@
|
||||
def execute():
|
||||
import webnotes
|
||||
from webnotes.modules.module_manager import reload_doc
|
||||
|
||||
reload_doc('production', 'doctype', 'bill_of_materials')
|
6
erpnext/patches/reload_flat_bom.py
Normal file
6
erpnext/patches/reload_flat_bom.py
Normal file
@ -0,0 +1,6 @@
|
||||
def execute():
|
||||
from webnotes.modules import webnotes
|
||||
from webnotes.modules.module_manager import reload_doc
|
||||
|
||||
reload_doc('production', 'doctype', 'flat_bom_detail')
|
||||
reload_doc('production', 'doctype', 'bom_material')
|
9
erpnext/patches/reload_lc_wizard.py
Normal file
9
erpnext/patches/reload_lc_wizard.py
Normal file
@ -0,0 +1,9 @@
|
||||
def execute():
|
||||
import webnotes
|
||||
from webnotes.modules.module_manager import reload_doc
|
||||
from webnotes.model import delete_doc
|
||||
|
||||
delete_doc('DocType', 'Landed Cost Wizard')
|
||||
delete_doc('DocType', 'LC PR Detail')
|
||||
reload_doc('stock', 'doctype', 'landed_cost_wizard')
|
||||
reload_doc('stock', 'doctype', 'lc_pr_detail')
|
17
erpnext/patches/reload_print_format.py
Normal file
17
erpnext/patches/reload_print_format.py
Normal file
@ -0,0 +1,17 @@
|
||||
def execute():
|
||||
import webnotes
|
||||
from webnotes.modules.module_manager import reload_doc
|
||||
from webnotes.model.doc import addchild
|
||||
from webnotes.model.code import get_obj
|
||||
reload_doc('stock', 'Print Format', 'Delivery Note Packing List Wise')
|
||||
reload_doc('stock', 'Print Format', 'Purchase Receipt Format')
|
||||
reload_doc('accounts', 'Print Format', 'Payment Receipt Voucher')
|
||||
reload_doc('accounts', 'Print Format', 'POS Invoice')
|
||||
reload_doc('accounts', 'Print Format', 'Form 16A Print Format')
|
||||
reload_doc('accounts', 'Print Format', 'Cheque Printing Format')
|
||||
|
||||
if not webnotes.conn.sql("select format from `tabDocFormat` where name = 'POS Invoice' and parent = 'Receivable Voucher'"):
|
||||
dt_obj = get_obj('DocType', 'Receivable Voucher', with_children = 1)
|
||||
ch = addchild(dt_obj.doc, 'formats', 'DocFormat', 1)
|
||||
ch.format = 'POS Invoice'
|
||||
ch.save(1)
|
31
erpnext/patches/repost_account_bal.py
Normal file
31
erpnext/patches/repost_account_bal.py
Normal file
@ -0,0 +1,31 @@
|
||||
|
||||
def execute():
|
||||
import webnotes
|
||||
sql = webnotes.conn.sql
|
||||
from webnotes.model.code import get_obj
|
||||
|
||||
# stop session
|
||||
webnotes.conn.set_global('__session_status', 'stop')
|
||||
webnotes.conn.set_global('__session_status_message', 'Patch is running in background. \nPlease wait until it completed...\n')
|
||||
|
||||
webnotes.conn.commit()
|
||||
webnotes.conn.begin()
|
||||
|
||||
# repost
|
||||
comp = sql("select name from tabCompany where docstatus!=2")
|
||||
fy = sql("select name from `tabFiscal Year` order by year_start_date asc")
|
||||
for c in comp:
|
||||
prev_fy = ''
|
||||
for f in fy:
|
||||
fy_obj = get_obj('Fiscal Year', f[0])
|
||||
fy_obj.doc.past_year = prev_fy
|
||||
fy_obj.doc.company = c[0]
|
||||
fy_obj.doc.save()
|
||||
fy_obj.repost()
|
||||
prev_fy = f[0]
|
||||
sql("commit")
|
||||
sql("start transaction")
|
||||
|
||||
# free session
|
||||
webnotes.conn.set_global('__session_status', '')
|
||||
webnotes.conn.set_global('__session_status_message', '')
|
8
erpnext/patches/sal_man_patch.py
Normal file
8
erpnext/patches/sal_man_patch.py
Normal file
@ -0,0 +1,8 @@
|
||||
|
||||
def execute():
|
||||
import webnotes
|
||||
from webnotes.modules.module_manager import reload_doc
|
||||
sql = webnotes.conn.sql
|
||||
|
||||
reload_doc('hr', 'doctype', 'salary_manager')
|
||||
sql("delete from `tabDocField` where parent = 'Salary Manager' and fieldname = 'employment_type'")
|
@ -32,9 +32,10 @@ class DocType:
|
||||
|
||||
#----------- Client Trigger function ----------
|
||||
def get_item_detail(self, item_code):
|
||||
item = sql("select description from `tabItem` where (ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life > now()) and name = %s",item_code , as_dict =1)
|
||||
item = sql("select description, stock_uom from `tabItem` where (ifnull(end_of_life,'')='' or end_of_life = '0000-00-00' or end_of_life > now()) and name = %s",item_code , as_dict =1)
|
||||
ret={
|
||||
'description' : item and item[0]['description'] or ''
|
||||
'description' : item and item[0]['description'] or '',
|
||||
'uom' : item and item[0]['stock_uom'] or ''
|
||||
}
|
||||
return ret
|
||||
|
||||
@ -411,8 +412,8 @@ class DocType:
|
||||
if val_method == 'FIFO':
|
||||
if warehouse:
|
||||
bin_obj = get_obj('Warehouse',warehouse).get_bin(item_code)
|
||||
prev_sle = bin_obj.get_prev_sle('',nowdate(), (now().split(' ')[1])[:-3])
|
||||
fcfs_stack = prev_sle and (prev_sle[0][3] and eval(prev_sle[0][3]) or []) or []
|
||||
prev_sle = bin_obj.get_prev_sle(nowdate(), (now().split(' ')[1])[:-3])
|
||||
fcfs_stack = prev_sle and prev_sle['fcfs_stack'] and eval(prev_sle['fcfs_stack']) or []
|
||||
else:
|
||||
prev_sle = sql("select fcfs_stack from `tabStock Ledger Entry` where item_code = '%s' and posting_date <= '%s' order by posting_date DESC, posting_time DESC, name DESC limit 1" % (item_code, nowdate()))
|
||||
fcfs_stack = prev_sle and (prev_sle[0][0] and eval(prev_sle[0][0]) or []) or []
|
||||
@ -499,20 +500,11 @@ class DocType:
|
||||
def get_child_flat_bom_items(self, item, d):
|
||||
|
||||
child_flat_bom_items=[]
|
||||
# if item and (item[0]['is_sub_contracted_item'] == 'Yes' or item[0]['is_pro_applicable'] == 'Yes'):
|
||||
|
||||
child_flat_bom_items = sql("select item_code, description, qty_consumed_per_unit, stock_uom, moving_avg_rate, last_purchase_rate, standard_rate, '%s' as parent_bom, bom_mat_no, 'No' as is_pro_applicable from `tabFlat BOM Detail` where parent = '%s' and is_pro_applicable = 'No' and docstatus = 1" % ( d.bom_no, cstr(d.bom_no)))
|
||||
child_flat_bom_items = sql("select fbom.item_code, fbom.description, fbom.qty_consumed_per_unit, fbom.stock_uom, fbom.moving_avg_rate, fbom.last_purchase_rate, fbom.standard_rate, '%s' as parent_bom, fbom.bom_mat_no, 'No' as is_pro_applicable from `tabFlat BOM Detail` fbom,`tabBill Of Materials` bom where fbom.parent=bom.name and fbom.parent = '%s' and fbom.is_pro_applicable = 'No' and bom.docstatus = 1" % ( d.bom_no, cstr(d.bom_no)))
|
||||
self.cur_flat_bom_items.append([d.item_code, d.description, flt(d.qty), d.stock_uom, flt(d.moving_avg_rate), flt(d.amount_as_per_mar), flt(d.last_purchase_rate), flt(d.amount_as_per_lpr), flt(d.standard_rate), flt(d.amount_as_per_sr), flt(d.qty_consumed_per_unit), (item[0]['is_sub_contracted_item'] == 'Yes') and d.parent or d.bom_no, d.name, (item[0]['is_sub_contracted_item'] == 'Yes') and 'No' or 'Yes'])
|
||||
return child_flat_bom_items
|
||||
|
||||
# else:
|
||||
# child_flat_bom_items = sql("select item_code, description, qty_consumed_per_unit, stock_uom, moving_avg_rate, last_purchase_rate, standard_rate, if(parent_bom = '%s', '%s', parent_bom) as parent_bom, bom_mat_no, is_pro_applicable from `tabFlat BOM Detail` where parent = '%s' and docstatus = 1" % ( d.bom_no, d.parent, cstr(d.bom_no)))
|
||||
|
||||
# if not child_flat_bom_items:
|
||||
# msgprint("Please Submit Child BOM := %s first." % cstr(d.bom_no))
|
||||
# raise Exception
|
||||
# else:"""
|
||||
|
||||
|
||||
# Get Current Flat BOM Items
|
||||
# -----------------------------
|
||||
|
@ -5,14 +5,14 @@
|
||||
{
|
||||
'creation': '2010-08-08 17:08:52',
|
||||
'docstatus': 0,
|
||||
'modified': '2010-12-20 17:27:58',
|
||||
'modified_by': 'umair@iwebnotes.com',
|
||||
'modified': '2011-11-09 12:47:50',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
|
||||
# These values are common for all DocType
|
||||
{
|
||||
'_last_update': '1309508837',
|
||||
'_last_update': '1319016431',
|
||||
'allow_attach': 0,
|
||||
'allow_copy': 0,
|
||||
'allow_email': 0,
|
||||
@ -20,6 +20,7 @@
|
||||
'allow_rename': 0,
|
||||
'allow_trash': 1,
|
||||
'colour': 'White:FFF',
|
||||
'default_print_format': 'Standard',
|
||||
'doctype': 'DocType',
|
||||
'document_type': 'Master',
|
||||
'hide_heading': 0,
|
||||
@ -35,7 +36,7 @@
|
||||
'server_code_error': ' ',
|
||||
'show_in_menu': 0,
|
||||
'subject': '%(item)s',
|
||||
'version': 170
|
||||
'version': 171
|
||||
},
|
||||
|
||||
# These values are common for all DocField
|
||||
@ -49,6 +50,7 @@
|
||||
|
||||
# These values are common for all DocPerm
|
||||
{
|
||||
'amend': 0,
|
||||
'doctype': 'DocPerm',
|
||||
'name': '__common__',
|
||||
'parent': 'Bill Of Materials',
|
||||
@ -68,7 +70,6 @@
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 1,
|
||||
'permlevel': 0,
|
||||
'role': 'System Manager',
|
||||
'submit': 1,
|
||||
@ -77,10 +78,13 @@
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 2,
|
||||
'permlevel': 1,
|
||||
'role': 'System Manager'
|
||||
'role': 'System Manager',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
@ -88,7 +92,6 @@
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 3,
|
||||
'permlevel': 0,
|
||||
'role': 'Production Manager',
|
||||
'submit': 1,
|
||||
@ -97,10 +100,13 @@
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 4,
|
||||
'permlevel': 1,
|
||||
'role': 'Production Manager'
|
||||
'role': 'Production Manager',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
@ -108,7 +114,6 @@
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 5,
|
||||
'permlevel': 0,
|
||||
'role': 'Production User',
|
||||
'submit': 1,
|
||||
@ -117,10 +122,13 @@
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'cancel': 0,
|
||||
'create': 0,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 6,
|
||||
'permlevel': 1,
|
||||
'role': 'Production User'
|
||||
'role': 'Production User',
|
||||
'submit': 0,
|
||||
'write': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
@ -128,7 +136,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'trash_reason',
|
||||
'fieldtype': 'Small Text',
|
||||
'idx': 1,
|
||||
'label': 'Trash Reason',
|
||||
'oldfieldname': 'trash_reason',
|
||||
'oldfieldtype': 'Small Text',
|
||||
@ -139,7 +146,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'HTML',
|
||||
'idx': 2,
|
||||
'label': 'TreeView1',
|
||||
'oldfieldtype': 'HTML',
|
||||
'options': '<div style=\'border: 1px solid #CCF; padding: 8px;margin-bottom: 8px;\'><div class=\'link_type\' onclick=\'loadpage("Bill of Materials"); \'>Go To BOM Tree View</div></div>',
|
||||
@ -150,7 +156,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'idx': 3,
|
||||
'oldfieldtype': 'Section Break',
|
||||
'options': 'Simple',
|
||||
'permlevel': 0
|
||||
@ -162,7 +167,6 @@
|
||||
'colour': 'White:FFF',
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Button',
|
||||
'idx': 4,
|
||||
'label': 'Set as Default BOM',
|
||||
'oldfieldtype': 'Button',
|
||||
'permlevel': 0,
|
||||
@ -173,7 +177,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Column Break',
|
||||
'idx': 5,
|
||||
'oldfieldtype': 'Column Break',
|
||||
'permlevel': 0
|
||||
},
|
||||
@ -185,7 +188,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Button',
|
||||
'hidden': 1,
|
||||
'idx': 6,
|
||||
'label': 'Activate BOM',
|
||||
'oldfieldtype': 'Button',
|
||||
'permlevel': 0,
|
||||
@ -199,7 +201,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Button',
|
||||
'hidden': 1,
|
||||
'idx': 7,
|
||||
'label': 'Inactivate BOM',
|
||||
'oldfieldtype': 'Button',
|
||||
'permlevel': 0,
|
||||
@ -210,7 +211,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'idx': 8,
|
||||
'label': 'Details',
|
||||
'oldfieldtype': 'Section Break',
|
||||
'permlevel': 0
|
||||
@ -223,7 +223,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'item',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 9,
|
||||
'in_filter': 1,
|
||||
'label': 'Item',
|
||||
'oldfieldname': 'item',
|
||||
@ -240,7 +239,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'description',
|
||||
'fieldtype': 'Text',
|
||||
'idx': 10,
|
||||
'label': 'Description',
|
||||
'oldfieldname': 'description',
|
||||
'oldfieldtype': 'Text',
|
||||
@ -255,7 +253,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'quantity',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 11,
|
||||
'label': 'Quantity',
|
||||
'oldfieldname': 'quantity',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -263,13 +260,22 @@
|
||||
'reqd': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'uom',
|
||||
'fieldtype': 'Select',
|
||||
'label': 'UOM',
|
||||
'options': 'link:UOM',
|
||||
'permlevel': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'colour': 'White:FFF',
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'is_active',
|
||||
'fieldtype': 'Select',
|
||||
'idx': 12,
|
||||
'label': 'Is Active',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'is_active',
|
||||
@ -285,7 +291,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'is_default',
|
||||
'fieldtype': 'Check',
|
||||
'idx': 13,
|
||||
'label': 'Is Default',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'is_default',
|
||||
@ -299,7 +304,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'project_name',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 14,
|
||||
'in_filter': 1,
|
||||
'label': 'Project Name',
|
||||
'oldfieldname': 'project_name',
|
||||
@ -313,7 +317,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'idx': 15,
|
||||
'label': 'Operations',
|
||||
'oldfieldtype': 'Section Break',
|
||||
'permlevel': 0
|
||||
@ -326,7 +329,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'bom_operations',
|
||||
'fieldtype': 'Table',
|
||||
'idx': 16,
|
||||
'label': 'BOM Operations',
|
||||
'oldfieldname': 'bom_operations',
|
||||
'oldfieldtype': 'Table',
|
||||
@ -338,7 +340,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'idx': 17,
|
||||
'label': 'Materials',
|
||||
'oldfieldtype': 'Section Break',
|
||||
'permlevel': 0
|
||||
@ -351,7 +352,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'bom_materials',
|
||||
'fieldtype': 'Table',
|
||||
'idx': 18,
|
||||
'label': 'BOM Material',
|
||||
'oldfieldname': 'bom_materials',
|
||||
'oldfieldtype': 'Table',
|
||||
@ -363,7 +363,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'idx': 19,
|
||||
'label': 'Costing',
|
||||
'oldfieldtype': 'Section Break',
|
||||
'permlevel': 0
|
||||
@ -375,7 +374,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'remarks',
|
||||
'fieldtype': 'Text',
|
||||
'idx': 20,
|
||||
'label': 'Remarks',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'remarks',
|
||||
@ -388,7 +386,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'cost_as_per_mar',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 21,
|
||||
'label': 'Cost As Per Valuation Rate',
|
||||
'oldfieldname': 'cost_as_per_mar',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -400,7 +397,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'cost_as_per_lpr',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 22,
|
||||
'label': 'Cost As Per LPR',
|
||||
'oldfieldname': 'cost_as_per_lpr',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -412,7 +408,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'cost_as_per_sr',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 23,
|
||||
'label': 'Cost As Per SR',
|
||||
'oldfieldname': 'cost_as_per_sr',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -425,7 +420,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'cost_as_on',
|
||||
'fieldtype': 'Data',
|
||||
'idx': 24,
|
||||
'label': 'Cost as on',
|
||||
'oldfieldname': 'cost_as_on',
|
||||
'oldfieldtype': 'Data',
|
||||
@ -437,7 +431,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'dir_mat_as_per_mar',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 25,
|
||||
'label': 'Direct Material As Per Valuation',
|
||||
'oldfieldname': 'dir_mat_as_per_mar',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -449,7 +442,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'dir_mat_as_per_lpr',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 26,
|
||||
'label': 'Direct Material As Per LPR',
|
||||
'oldfieldname': 'dir_mat_as_per_lpr',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -461,7 +453,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'dir_mat_as_per_sr',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 27,
|
||||
'label': 'Direct Material As Per SR',
|
||||
'oldfieldname': 'dir_mat_as_per_sr',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -473,7 +464,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'operating_cost',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 28,
|
||||
'label': 'Operating Cost',
|
||||
'oldfieldname': 'operating_cost',
|
||||
'oldfieldtype': 'Currency',
|
||||
@ -485,7 +475,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'maintained_by',
|
||||
'fieldtype': 'Data',
|
||||
'idx': 29,
|
||||
'label': 'Maintained By',
|
||||
'oldfieldname': 'maintained_by',
|
||||
'oldfieldtype': 'Data',
|
||||
@ -497,7 +486,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'hidden': 1,
|
||||
'idx': 30,
|
||||
'label': 'BOM Report',
|
||||
'oldfieldtype': 'Section Break',
|
||||
'permlevel': 0
|
||||
@ -508,7 +496,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'hidden': 0,
|
||||
'idx': 31,
|
||||
'label': 'Flat BOM',
|
||||
'oldfieldtype': 'Section Break',
|
||||
'permlevel': 0
|
||||
@ -522,7 +509,6 @@
|
||||
'fieldname': 'flat_bom_details',
|
||||
'fieldtype': 'Table',
|
||||
'hidden': 0,
|
||||
'idx': 32,
|
||||
'label': 'Flat BOM Detail',
|
||||
'no_copy': 1,
|
||||
'oldfieldname': 'flat_bom_details',
|
||||
|
@ -329,11 +329,11 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'qty_consumed_per_unit',
|
||||
'fieldtype': 'Currency',
|
||||
'fieldtype': 'Float',
|
||||
'idx': 21,
|
||||
'label': 'Qty Consumed Per Unit',
|
||||
'oldfieldname': 'qty_consumed_per_unit',
|
||||
'oldfieldtype': 'Currency',
|
||||
'oldfieldtype': 'Float',
|
||||
'permlevel': 1
|
||||
}
|
||||
]
|
||||
]
|
||||
|
@ -5,8 +5,8 @@
|
||||
{
|
||||
'creation': '2010-08-08 17:09:02',
|
||||
'docstatus': 0,
|
||||
'modified': '2010-09-20 14:06:57',
|
||||
'modified_by': 'umair@iwebnotes.com',
|
||||
'modified': '2011-11-10 14:21:40',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'jai@webnotestech.com'
|
||||
},
|
||||
|
||||
@ -14,6 +14,7 @@
|
||||
{
|
||||
'autoname': 'FBD/.######',
|
||||
'colour': 'White:FFF',
|
||||
'default_print_format': 'Standard',
|
||||
'doctype': 'DocType',
|
||||
'istable': 1,
|
||||
'module': 'Production',
|
||||
@ -22,7 +23,7 @@
|
||||
'section_style': 'Simple',
|
||||
'server_code_error': ' ',
|
||||
'show_in_menu': 0,
|
||||
'version': 15
|
||||
'version': 18
|
||||
},
|
||||
|
||||
# These values are common for all DocField
|
||||
@ -46,7 +47,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'item_code',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 1,
|
||||
'label': 'Item Code',
|
||||
'oldfieldname': 'item_code',
|
||||
'oldfieldtype': 'Link',
|
||||
@ -58,7 +58,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'description',
|
||||
'fieldtype': 'Text',
|
||||
'idx': 2,
|
||||
'label': 'Description',
|
||||
'oldfieldname': 'description',
|
||||
'oldfieldtype': 'Text',
|
||||
@ -70,7 +69,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'moving_avg_rate',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 5,
|
||||
'label': 'Valuation Rate',
|
||||
'oldfieldname': 'moving_avg_rate',
|
||||
'oldfieldtype': 'Currency'
|
||||
@ -81,7 +79,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'amount_as_per_mar',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 6,
|
||||
'label': 'Amount As Per Valuation Rate',
|
||||
'oldfieldname': 'amount_as_per_mar',
|
||||
'oldfieldtype': 'Currency'
|
||||
@ -92,7 +89,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'last_purchase_rate',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 7,
|
||||
'label': 'Last Purchase Rate',
|
||||
'oldfieldname': 'last_purchase_rate',
|
||||
'oldfieldtype': 'Currency'
|
||||
@ -103,7 +99,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'amount_as_per_lpr',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 8,
|
||||
'label': 'Amount As Per LPR',
|
||||
'oldfieldname': 'amount_as_per_lpr',
|
||||
'oldfieldtype': 'Currency'
|
||||
@ -114,7 +109,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'qty',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 9,
|
||||
'label': 'Qty',
|
||||
'oldfieldname': 'qty',
|
||||
'oldfieldtype': 'Currency'
|
||||
@ -125,7 +119,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'standard_rate',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 9,
|
||||
'label': 'Standard Rate',
|
||||
'oldfieldname': 'standard_rate',
|
||||
'oldfieldtype': 'Currency'
|
||||
@ -136,7 +129,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'amount_as_per_sr',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 10,
|
||||
'label': 'Amount As Per SR',
|
||||
'oldfieldname': 'amount_as_per_sr',
|
||||
'oldfieldtype': 'Currency'
|
||||
@ -146,11 +138,10 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'qty_consumed_per_unit',
|
||||
'fieldtype': 'Currency',
|
||||
'idx': 11,
|
||||
'fieldtype': 'Float',
|
||||
'label': 'Qty Consumed Per Unit',
|
||||
'oldfieldname': 'qty_consumed_per_unit',
|
||||
'oldfieldtype': 'Currency'
|
||||
'oldfieldtype': 'Float'
|
||||
},
|
||||
|
||||
# DocField
|
||||
@ -158,12 +149,10 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'stock_uom',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 12,
|
||||
'label': 'Stock UOM',
|
||||
'oldfieldname': 'stock_uom',
|
||||
'oldfieldtype': 'Link',
|
||||
'options': 'UOM',
|
||||
'search_index': 0
|
||||
'options': 'UOM'
|
||||
},
|
||||
|
||||
# DocField
|
||||
@ -172,7 +161,6 @@
|
||||
'fieldname': 'flat_bom_no',
|
||||
'fieldtype': 'Data',
|
||||
'hidden': 1,
|
||||
'idx': 12,
|
||||
'label': 'Flat BOM No',
|
||||
'oldfieldname': 'flat_bom_no',
|
||||
'oldfieldtype': 'Data'
|
||||
@ -184,7 +172,6 @@
|
||||
'fieldname': 'bom_mat_no',
|
||||
'fieldtype': 'Data',
|
||||
'hidden': 0,
|
||||
'idx': 13,
|
||||
'label': 'BOM Mat No',
|
||||
'oldfieldname': 'bom_mat_no',
|
||||
'oldfieldtype': 'Data'
|
||||
@ -196,7 +183,6 @@
|
||||
'fieldname': 'parent_bom',
|
||||
'fieldtype': 'Link',
|
||||
'hidden': 0,
|
||||
'idx': 14,
|
||||
'label': 'Parent BOM',
|
||||
'oldfieldname': 'parent_bom',
|
||||
'oldfieldtype': 'Link'
|
||||
@ -207,11 +193,10 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'is_pro_applicable',
|
||||
'fieldtype': 'Select',
|
||||
'idx': 15,
|
||||
'label': 'Is PRO Applicable',
|
||||
'oldfieldname': 'is_pro_applicable',
|
||||
'oldfieldtype': 'Select',
|
||||
'options': '\nYes\nNo',
|
||||
'reqd': 0
|
||||
}
|
||||
]
|
||||
]
|
||||
|
55
erpnext/sandbox/test_leave.py
Normal file
55
erpnext/sandbox/test_leave.py
Normal file
@ -0,0 +1,55 @@
|
||||
import unittest
|
||||
|
||||
import webnotes
|
||||
import webnotes.profile
|
||||
webnotes.user = webnotes.profile.Profile()
|
||||
|
||||
|
||||
from webnotes.model.doc import Document
|
||||
from webnotes.model.code import get_obj
|
||||
from webnotes.utils import cstr, flt
|
||||
from webnotes.model.doclist import getlist
|
||||
sql = webnotes.conn.sql
|
||||
|
||||
from sandbox.testdata import leaves
|
||||
#----------------------------------------------------------
|
||||
|
||||
|
||||
class TestStockEntry(unittest.TestCase):
|
||||
#===========================================================================
|
||||
def setUp(self):
|
||||
webnotes.conn.begin()
|
||||
leaves.emp.save(new = 1, make_autoname = 0)
|
||||
|
||||
def test_leave_bal(self):
|
||||
leaves.l_all.save(1)
|
||||
leaves.l_app1.save(1)
|
||||
leaves.l_app2.save(1)
|
||||
|
||||
la1 = get_obj('Leave Application', leaves.l_app1.name, with_children=1)
|
||||
la1.validate()
|
||||
la1.doc.docstatus = 1
|
||||
la1.doc.save()
|
||||
|
||||
self.assertTrue(la1.doc.total_leave_days == 2)
|
||||
|
||||
la1.doc.half_day = 1
|
||||
la1.validate()
|
||||
la1.doc.save()
|
||||
|
||||
self.assertTrue(la1.doc.total_leave_days == .5)
|
||||
|
||||
print "Test case for leave applied no of days"
|
||||
|
||||
|
||||
la2 = get_obj('Leave Application', leaves.l_app2.name, with_children=1)
|
||||
la2.validate()
|
||||
bal = la2.get_leave_balance()
|
||||
self.assertTrue(bal, 18)
|
||||
print "Test case for leave balance"
|
||||
|
||||
|
||||
|
||||
|
||||
def tearDown(self):
|
||||
webnotes.conn.rollback()
|
@ -101,7 +101,7 @@ class TestStockEntry(unittest.TestCase):
|
||||
|
||||
self.save_stock_entry('Material Transfer')
|
||||
mtn = get_obj('Stock Entry', stock_entry.mtn[0].name, with_children=1)
|
||||
tn = self.submit_stock_entry(mtn)
|
||||
mtn = self.submit_stock_entry(mtn)
|
||||
|
||||
# stock ledger entry
|
||||
print "Checking stock ledger entry........."
|
||||
@ -202,8 +202,54 @@ class TestStockEntry(unittest.TestCase):
|
||||
[{'doctype': 'Serial No', 'item_code': 'it', 'warehouse': 'wh1', 'status': 'In Store', 'docstatus': 0}, 10]
|
||||
])
|
||||
|
||||
#===========================================================================
|
||||
def test_entries_on_same_datetime(self):
|
||||
print "Test Case: Multiple entries on same datetime, cancel first one"
|
||||
|
||||
# submitted 1st MR
|
||||
self.save_stock_entry('Material Receipt')
|
||||
mr = get_obj('Stock Entry', stock_entry.mr[0].name, with_children=1)
|
||||
mr = self.submit_stock_entry(mr)
|
||||
|
||||
# submitted 2nd MR
|
||||
for each in stock_entry.mr1:
|
||||
each.save(1)
|
||||
for t in stock_entry.mr1[1:]:
|
||||
sql("update `tabStock Entry Detail` set parent = '%s' where name = '%s'" % (stock_entry.mr1[0].name, t.name))
|
||||
|
||||
mr1 = get_obj('Stock Entry', stock_entry.mr1[0].name, with_children=1)
|
||||
mr1 = self.submit_stock_entry(mr1)
|
||||
|
||||
|
||||
# submitted MTN
|
||||
self.save_stock_entry('Material Transfer')
|
||||
mtn = get_obj('Stock Entry', stock_entry.mtn[0].name, with_children=1)
|
||||
mtn = self.submit_stock_entry(mtn)
|
||||
|
||||
# cancel prev MR
|
||||
mr.on_cancel()
|
||||
mr.doc.cancel_reason = "testing"
|
||||
mr.doc.docstatus = 2
|
||||
mr.doc.save()
|
||||
|
||||
|
||||
# stock ledger entry
|
||||
print "Checking stock ledger entry........."
|
||||
self.assertDoc(self.get_expected_sle('entries_on_same_datetime'))
|
||||
|
||||
# bin qty
|
||||
print "Checking Bin qty........."
|
||||
self.assertDoc([
|
||||
{'doctype':'Bin', 'actual_qty':0, 'item_code':'it', 'warehouse':'wh1'},
|
||||
{'doctype':'Bin', 'actual_qty':5, 'item_code':'it', 'warehouse':'wh2'}
|
||||
])
|
||||
|
||||
# serial no
|
||||
self.assertCount([
|
||||
[{'doctype': 'Serial No', 'item_code': 'it', 'warehouse': 'wh1', 'status': 'In Store', 'docstatus': 0}, 0],
|
||||
[{'doctype': 'Serial No', 'item_code': 'it', 'warehouse': 'wh2', 'status': 'In Store', 'docstatus': 0}, 5]
|
||||
])
|
||||
|
||||
#===========================================================================
|
||||
def save_stock_entry(self, t):
|
||||
if t == 'Material Receipt':
|
||||
@ -373,8 +419,58 @@ class TestStockEntry(unittest.TestCase):
|
||||
'ifnull(bin_aqat, 0)': 0,
|
||||
'ifnull(valuation_rate, 0)': 0,
|
||||
"ifnull(is_cancelled, 'No')": 'Yes'
|
||||
}],
|
||||
'entries_on_same_datetime': [{
|
||||
'doctype': 'Stock Ledger Entry',
|
||||
'item_code':'it',
|
||||
'warehouse':'wh1',
|
||||
'voucher_type': 'Stock Entry',
|
||||
'voucher_no': stock_entry.mr[0].name,
|
||||
'actual_qty': 10,
|
||||
'bin_aqat': 10,
|
||||
'valuation_rate': 100,
|
||||
'is_cancelled': 'Yes'
|
||||
}, {
|
||||
'doctype': 'Stock Ledger Entry',
|
||||
'item_code':'it',
|
||||
'warehouse':'wh1',
|
||||
'voucher_type': 'Stock Entry',
|
||||
'voucher_no': stock_entry.mr[0].name,
|
||||
'actual_qty': -10,
|
||||
'ifnull(bin_aqat, 0)': 0,
|
||||
'ifnull(valuation_rate, 0)': 0,
|
||||
"ifnull(is_cancelled, 'No')": 'Yes'
|
||||
}, {
|
||||
'doctype': 'Stock Ledger Entry',
|
||||
'item_code':'it',
|
||||
'warehouse':'wh1',
|
||||
'voucher_type': 'Stock Entry',
|
||||
'voucher_no': stock_entry.mr1[0].name,
|
||||
'actual_qty': 5,
|
||||
'bin_aqat': 5,
|
||||
'valuation_rate': 400,
|
||||
'is_cancelled': 'No'
|
||||
}, {
|
||||
'doctype': 'Stock Ledger Entry',
|
||||
'item_code':'it',
|
||||
'warehouse':'wh1',
|
||||
'voucher_type': 'Stock Entry',
|
||||
'voucher_no': stock_entry.mtn[0].name,
|
||||
'actual_qty': -5,
|
||||
'bin_aqat': 0,
|
||||
'valuation_rate': 400,
|
||||
'is_cancelled': 'No'
|
||||
}, {
|
||||
'doctype': 'Stock Ledger Entry',
|
||||
'item_code':'it',
|
||||
'warehouse':'wh2',
|
||||
'voucher_type': 'Stock Entry',
|
||||
'voucher_no': stock_entry.mtn[0].name,
|
||||
'actual_qty': 5,
|
||||
'bin_aqat': 5,
|
||||
'valuation_rate': 100,
|
||||
'is_cancelled': 'No'
|
||||
}]
|
||||
|
||||
}
|
||||
|
||||
return expected_sle[action]
|
||||
|
54
erpnext/sandbox/testdata/leaves.py
vendored
Normal file
54
erpnext/sandbox/testdata/leaves.py
vendored
Normal file
@ -0,0 +1,54 @@
|
||||
from webnotes.model.doc import Document
|
||||
|
||||
emp = Document(
|
||||
fielddata = {
|
||||
'doctype': 'Employee',
|
||||
'name': 'emp1',
|
||||
'employee_name': 'Nijil',
|
||||
'status': 'Active',
|
||||
'date_of_joining': '2011-01-01'
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
|
||||
l_all = Document(
|
||||
fielddata = {
|
||||
'doctype' : 'Leave Allocation',
|
||||
'name': 'l_all',
|
||||
'employee' : 'emp1',
|
||||
'leave_type' : 'Casual Leave',
|
||||
'posting_date': '2011-03-01',
|
||||
'fiscal_year': '2011-2012',
|
||||
'total_leaves_allocated': 20,
|
||||
'docstatus': 1
|
||||
}
|
||||
)
|
||||
|
||||
l_app1 = Document(
|
||||
fielddata = {
|
||||
'doctype' : 'Leave Application',
|
||||
'name': 'l_app1',
|
||||
'employee' : 'emp1',
|
||||
'leave_type' : 'Casual Leave',
|
||||
'posting_date': '2011-03-01',
|
||||
'fiscal_year': '2011-2012',
|
||||
'from_date': '2011-08-01',
|
||||
'to_date': '2011-08-02',
|
||||
'total_leave_days': 2
|
||||
}
|
||||
)
|
||||
|
||||
l_app2 = Document(
|
||||
fielddata = {
|
||||
'doctype' : 'Leave Application',
|
||||
'name': 'l_app2',
|
||||
'employee' : 'emp1',
|
||||
'leave_type' : 'Casual Leave',
|
||||
'posting_date': '2011-03-01',
|
||||
'fiscal_year': '2011-2012',
|
||||
'from_date': '2011-08-15',
|
||||
'to_date': '2011-08-17',
|
||||
'total_leave_days': 3
|
||||
}
|
||||
)
|
34
erpnext/sandbox/testdata/stock_entry.py
vendored
34
erpnext/sandbox/testdata/stock_entry.py
vendored
@ -34,6 +34,38 @@ mr = [
|
||||
)
|
||||
]
|
||||
|
||||
mr1 = [
|
||||
Document(
|
||||
fielddata = {
|
||||
'doctype': 'Stock Entry',
|
||||
'posting_date': '2011-09-01',
|
||||
'transfer_date': '2011-09-01',
|
||||
'posting_time': '12:00',
|
||||
'company': 'comp',
|
||||
'fiscal_year' : '2011-2012',
|
||||
'purpose': 'Material Receipt',
|
||||
'name': 'mr1'
|
||||
}
|
||||
),
|
||||
Document(
|
||||
fielddata ={
|
||||
'doctype': 'Stock Entry Detail',
|
||||
'parenttype': 'Stock Entry',
|
||||
'parentfield' : 'mtn_details',
|
||||
'parent' : 'mr1',
|
||||
'item_code' : 'it',
|
||||
't_warehouse' : 'wh1',
|
||||
'qty' : 5,
|
||||
'transfer_qty' : 5,
|
||||
'incoming_rate': 400,
|
||||
'stock_uom': 'Nos',
|
||||
'conversion_factor': 1,
|
||||
'serial_no': 'srno11, srno12, srno13, srno14, srno15'
|
||||
}
|
||||
)
|
||||
]
|
||||
|
||||
|
||||
# Material Transfer
|
||||
#--------------------
|
||||
|
||||
@ -43,7 +75,7 @@ mtn = [
|
||||
'doctype': 'Stock Entry',
|
||||
'posting_date': '2011-09-01',
|
||||
'transfer_date': '2011-09-01',
|
||||
'posting_time': '13:00',
|
||||
'posting_time': '12:00',
|
||||
'company': 'comp',
|
||||
'fiscal_year' : '2011-2012',
|
||||
'purpose': 'Material Transfer',
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -133,24 +133,13 @@ class DocType(TransactionBase):
|
||||
# Does not allow same item code to be entered twice
|
||||
# -------------------------------------------------
|
||||
def validate_for_items(self):
|
||||
check_list=[]
|
||||
chk_dupl_itm = []
|
||||
for d in getlist(self.doclist,'quotation_details'):
|
||||
ch = sql("select is_stock_item from `tabItem` where name = '%s'"%d.item_code)
|
||||
if ch and ch[0][0]=='Yes':
|
||||
if cstr(d.item_code) in check_list:
|
||||
msgprint("Item %s has been entered twice." % d.item_code)
|
||||
raise Exception
|
||||
else:
|
||||
check_list.append(cstr(d.item_code))
|
||||
|
||||
if ch and ch[0][0]=='No':
|
||||
f = [cstr(d.item_code),cstr(d.description)]
|
||||
if f in chk_dupl_itm:
|
||||
msgprint("Item %s has been entered twice." % d.item_code)
|
||||
raise Exception
|
||||
else:
|
||||
chk_dupl_itm.append(f)
|
||||
if [cstr(d.item_code),cstr(d.description)] in chk_dupl_itm:
|
||||
msgprint("Item %s has been entered twice. Please change description atleast to continue" % d.item_code)
|
||||
raise Exception
|
||||
else:
|
||||
chk_dupl_itm.append([cstr(d.item_code),cstr(d.description)])
|
||||
|
||||
|
||||
#do not allow sales item in maintenance quotation and service item in sales quotation
|
||||
|
@ -4,7 +4,7 @@ h1, h2, h3, h4 {
|
||||
}
|
||||
|
||||
body, span, div, td, input, textarea, button, select {
|
||||
font-family: Verdana, Arial, Sans Serif;
|
||||
font-family: 'Lucida Grande', 'Lucida Sans Unicode', Verdana, sans-serif;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
|
@ -43,18 +43,8 @@ function startup_setup() {
|
||||
// ------------------
|
||||
$dh(page_body.footer);
|
||||
|
||||
// for logout and payment
|
||||
var callback = function(r,rt) {
|
||||
if(r.message){
|
||||
login_file = 'http://' + r.message;
|
||||
}
|
||||
else if(pscript.is_erpnext_saas) {
|
||||
login_file = 'https://www.erpnext.com';
|
||||
}
|
||||
// setup toolbar
|
||||
pscript.startup_setup_toolbar();
|
||||
}
|
||||
$c_obj('Home Control', 'get_login_url', '', callback);
|
||||
// setup toolbar
|
||||
pscript.startup_setup_toolbar();
|
||||
}
|
||||
|
||||
// ====================================================================
|
||||
@ -66,6 +56,14 @@ pscript.startup_make_sidebar = function() {
|
||||
// menu
|
||||
var ml = r.message;
|
||||
|
||||
// login-file
|
||||
if(r.login_url){
|
||||
login_file = 'http://' + r.login_url;
|
||||
}
|
||||
else if(pscript.is_erpnext_saas) {
|
||||
login_file = 'https://www.erpnext.com';
|
||||
}
|
||||
|
||||
// clear
|
||||
page_body.left_sidebar.innerHTML = '';
|
||||
|
||||
@ -299,10 +297,10 @@ SidebarItem.prototype.show_items = function() {
|
||||
|
||||
// add to menu-item mapper
|
||||
menu_item_map['Page'][me.det.module_label + ' Custom Reports'] = smi.pointer;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
$(me.items_area).slideDown();
|
||||
|
||||
// high light
|
||||
@ -565,7 +563,7 @@ pscript.feature_dict = {
|
||||
'Timesheet': {'timesheet_details':['project_name']}
|
||||
},
|
||||
'fs_packing_details': {
|
||||
'Delivery Note': {'fields':['packing_details','print_packing_slip'],'delivery_note_details':['no_of_packs','pack_gross_wt','pack_nett_wt','pack_no','pack_unit']},
|
||||
'Delivery Note': {'fields':['packing_details','print_packing_slip','packing_checked_by','packed_by','pack_size','shipping_mark'],'delivery_note_details':['no_of_packs','pack_gross_wt','pack_nett_wt','pack_no','pack_unit']},
|
||||
'Sales Order': {'fields':['packing_details']}
|
||||
},
|
||||
'fs_discounts': {
|
||||
|
@ -5,7 +5,7 @@
|
||||
{
|
||||
'creation': '2010-08-08 17:09:35',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-10-07 12:10:26',
|
||||
'modified': '2011-10-12 10:49:40',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
@ -153,6 +153,30 @@
|
||||
'to_field': 'schedule_date'
|
||||
},
|
||||
|
||||
# Field Mapper Detail
|
||||
{
|
||||
'doctype': 'Field Mapper Detail',
|
||||
'from_field': 'net_total',
|
||||
'match_id': 0,
|
||||
'to_field': 'net_total'
|
||||
},
|
||||
|
||||
# Field Mapper Detail
|
||||
{
|
||||
'doctype': 'Field Mapper Detail',
|
||||
'from_field': 'grand_total',
|
||||
'match_id': 0,
|
||||
'to_field': 'grand_total'
|
||||
},
|
||||
|
||||
# Field Mapper Detail
|
||||
{
|
||||
'doctype': 'Field Mapper Detail',
|
||||
'from_field': 'total_tax',
|
||||
'match_id': 0,
|
||||
'to_field': 'total_tax'
|
||||
},
|
||||
|
||||
# Table Mapper Detail
|
||||
{
|
||||
'doctype': 'Table Mapper Detail',
|
||||
|
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@ -3,9 +3,9 @@
|
||||
|
||||
# These values are common in all dictionaries
|
||||
{
|
||||
'creation': '2011-08-18 16:29:14',
|
||||
'creation': '2011-08-23 16:49:40',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-08-23 13:24:12',
|
||||
'modified': '2011-10-19 14:12:11',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
@ -13,7 +13,7 @@
|
||||
# These values are common for all Print Format
|
||||
{
|
||||
'doctype': 'Print Format',
|
||||
'html': "<html>\n<head>\n\n<script>\nfunction replaceAll(s,s1,s2){ return s.split(s1).join(s2);}\n\nfunction get_letter_head(){\n var cp = locals['Control Panel']['Control Panel'];\n if(cp.letter_head != 'None') {return cp.letter_head; }\n else{ return ''};\n }\n</script>\n<style>\n.cust_tbl { border-collapse:collapse; }\n.cust_tbl td { border:1px solid #848484; }\n</style>\n</head>\n\n<body>\n<script>\nreplaceAll(doc.print_packing_slip,'[HEADER GOES HERE]',get_letter_head());\n</script>\n</body>\n</html>",
|
||||
'html': "<html>\n<head>\n\n<script>\nfunction replaceAll(s,s1,s2){ return s.split(s1).join(s2);}\n\nfunction get_letter_head() {\n\t// add letter head\n\tvar cp = locals['Control Panel']['Control Panel'];\n\tif(doc.letter_head)\n\t\tvar lh= cstr(_p.letter_heads[doc.letter_head]);\n\telse if(cp.letter_head)\n\t\tvar lh= cp.letter_head;\n\telse \n\t\tvar lh= '';\n\t\t\n\treturn lh;\n}\n\n</script>\n<style>\n.cust_tbl { border-collapse:collapse; }\n.cust_tbl td { border:1px solid #848484; font-size: 13px}\n.large_font td {font-size: 13px}\n</style>\n</head>\n\n<body>\n<script>\nreplaceAll(doc.print_packing_slip,'[HEADER GOES HERE]',get_letter_head());\n</script>\n</body>\n</html>",
|
||||
'module': 'Stock',
|
||||
'name': '__common__',
|
||||
'standard': 'Yes'
|
||||
|
File diff suppressed because one or more lines are too long
@ -5,7 +5,7 @@
|
||||
{
|
||||
'creation': '2010-08-08 17:09:34',
|
||||
'docstatus': 0,
|
||||
'modified': '2009-09-07 11:03:11',
|
||||
'modified': '2011-10-19 14:18:26',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
@ -13,7 +13,7 @@
|
||||
# These values are common for all Print Format
|
||||
{
|
||||
'doctype': 'Print Format',
|
||||
'html': '<html>\n<head>\n<!--Other charges function-->\n<script>\n var make_row = function(title,val,bold){\n var bstart = \'<b>\'; var bend = \'</b>\';\n return \'<tr><td style="width:50%">\'+(bold?bstart:\'\')+title+(bold?bend:\'\')+\'</td>\'\n +\'<td style="width:20%;text-align:right">\'+doc.currency+\'</td>\'\n +\'<td style="width:30%;text-align:right">\'+(val?val:\'0.00\')+\'</td>\'\n +\'</tr>\'\n }\n\n function get_other_charges(){\n var out =\'\';\n out += \'<div><table class="noborder" style="width:100%">\';\n out += make_row(\'Total Amount\',fmt_money(convert_rate(doc.total_amount)),1)\n +make_row(\'Grand Total\',fmt_money(convert_rate(doc.grand_total)),1);\n out += \'</table></div>\';\n return out;\n }\n\n function get_buying_costs(){\n var out =\'\';\n if(doc.buying_cost_transport || doc.buying_cost_taxes || doc.buying_cost_other){\n out += \'<div><table class="noborder" style="width:100%">\'\n + \'<tr><td style="width:100%"><b>\'+\'Buying Cost Details\'+\'</b></td></tr>\';\n if(doc.buying_cost_transport){ out += make_row(\'Transport Cost\',fmt_money(convert_rate(doc.buying_cost_transport)),0)}\n if(doc.buying_cost_taxes){ out += make_row(\'Taxes\',fmt_money(convert_rate(doc.buying_cost_taxes)),0)}\n if(doc.buying_cost_other){ out += make_row(\'Other Cost\',fmt_money(convert_rate(doc.buying_cost_other)),0)}\n out += \'</table></div>\';\n }\n return out;\n }\n\n function get_letter_head(){\n var cp = locals[\'Control Panel\'][\'Control Panel\'];\n \tif(cp.letter_head) {return cp.letter_head; }\n }\n \n function convert_rate(val){\n var new_val = flt(val)/flt(doc.conversion_rate);\n return new_val;\n }\n \n function get_transport_details(){\n var out = \'\';\n if(doc.transporter_name || doc.lr_no || doc.lr_date){\n out += \'<div><table class="noborder" style="width:40%">\'\n +\'<tr><td style="width:80%"><b>\' + \'Transporter Details\'+\'</b></td><td style="width:20%"></td></tr>\'\n\n if(doc.transporter_name){ out += \'<tr><td style="width:40%">\' + \'Transporter Name\'+\'</td><td style="width:60%">\'+doc.transporter_name+\'</td></tr>\'}\n if(doc.lr_no){ out += \'<tr><td style="width:40%">\' + \'LR No\'+\'</td><td style="width:60%">\'+doc.lr_no+\'</td></tr>\'}\n if(doc.lr_date){ out += \'<tr><td style="width:40%">\' + \'LR Date\'+\'</td><td style="width:60%">\'+doc.lr_date+\'</td></tr>\'}\n out += \'</table></div>\'\n }\n return out;\n }\n\n</script>\n</head>\n<body>\n<div style="border:1px solid black;padding:15px">\n<!--header-->\n<div><script>get_letter_head()</script></div>\n<div style="border-bottom: 1px solid; padding-bottom: 5px;">\n <div><br><b>Purchase Receipt: <script>doc.name</script></b></div>\n <div>Date: <script>date.str_to_user(doc.transaction_date)</script></div>\n</div>\n\n<div style="padding-top:15px">\n<div><script>doc.supplier</script></div>\n<div><br><script>replace_newlines(doc.address_display)</script></div>\n</div>\n\n<div>\n<br>\n <script>\n var t = print_table(\'Purchase Receipt\', doc.name, \'purchase_receipt_details\', \'Purchase Receipt Detail\', [\'SR\', \'item_code\',\'description\',\'received_qty\',\'qty\',\'rejected_qty\',\'po_rate\',\'amount\',\'billed_qty\'], [\'Sr\', \'Item Code\', \'Description\',\'Received Quantity\',\'Accepted Qty\',\'Rejected Qty\',\'Rate\',\'Amount\',\'Billed Qty\'], [\'4%\',\'12%\', \'24%\', \'10%\',\'10%\',\'10%\',\'10%\',\'10%\',\'10%\'])\n if(t.appendChild) {\n // single\n out = t.innerHTML;\n } \n else {//multiple\n out = \'\'\n for(var i=0;i<t.length;i++) {\n if(i!=t.length-1){\n out += \'<div style:"padding-top:5px;"></div>\' + t[i].innerHTML +\'<div style="page-break-after:always"></div>\';\n }\n else out += \'<div style:"padding-top:5px;"></div>\' + t[i].innerHTML;\n }\n }\n out;\n </script>\n\n</div>\n\n<!--Other charges table-->\n<div>\n<table style="width:100%">\n <tr><td style="width:40%"><script>get_buying_costs()</script></td>\n <td style="width:20%"></td><td style="width:40%"><script>get_other_charges()</script></td></tr>\n</table>\n</div>\n<div><script>get_transport_details()</script></div>\n<div><br>Payment Terms</div>\n<div><br><script>replace_newlines(doc.payment_terms)</script></div>\n<div><br>For NCSCI</div>\n<div><br><br>(Authorised Signatory)</div>\n</div></body>\n</html>',
|
||||
'html': '<html>\n<head>\n<!--Other charges function-->\n<script>\n var make_row = function(title,val,bold){\n var bstart = \'<b>\'; var bend = \'</b>\';\n return \'<tr><td style="width:50%">\'+(bold?bstart:\'\')+title+(bold?bend:\'\')+\'</td>\'\n +\'<td style="width:20%;text-align:right">\'+doc.currency+\'</td>\'\n +\'<td style="width:30%;text-align:right">\'+(val?val:\'0.00\')+\'</td>\'\n +\'</tr>\'\n }\n\n function get_other_charges(){\n var out =\'\';\n out += \'<div><table class="noborder" style="width:100%">\';\n out += make_row(\'Total Amount\',fmt_money(convert_rate(doc.total_amount)),1)\n +make_row(\'Grand Total\',fmt_money(convert_rate(doc.grand_total)),1);\n out += \'</table></div>\';\n return out;\n }\n\n function get_buying_costs(){\n var out =\'\';\n if(doc.buying_cost_transport || doc.buying_cost_taxes || doc.buying_cost_other){\n out += \'<div><table class="noborder" style="width:100%">\'\n + \'<tr><td style="width:100%"><b>\'+\'Buying Cost Details\'+\'</b></td></tr>\';\n if(doc.buying_cost_transport){ out += make_row(\'Transport Cost\',fmt_money(convert_rate(doc.buying_cost_transport)),0)}\n if(doc.buying_cost_taxes){ out += make_row(\'Taxes\',fmt_money(convert_rate(doc.buying_cost_taxes)),0)}\n if(doc.buying_cost_other){ out += make_row(\'Other Cost\',fmt_money(convert_rate(doc.buying_cost_other)),0)}\n out += \'</table></div>\';\n }\n return out;\n }\n\nfunction get_letter_head() {\n\t// add letter head\n\tvar cp = locals[\'Control Panel\'][\'Control Panel\'];\n\tif(doc.letter_head)\n\t\tvar lh= cstr(_p.letter_heads[doc.letter_head]);\n\telse if(cp.letter_head)\n\t\tvar lh= cp.letter_head;\n\telse \n\t\tvar lh= \'\';\n\t\t\n\treturn lh;\n}\n\n \n function convert_rate(val){\n var new_val = flt(val)/flt(doc.conversion_rate);\n return new_val;\n }\n \n function get_transport_details(){\n var out = \'\';\n if(doc.transporter_name || doc.lr_no || doc.lr_date){\n out += \'<div><table class="noborder" style="width:40%">\'\n +\'<tr><td style="width:80%"><b>\' + \'Transporter Details\'+\'</b></td><td style="width:20%"></td></tr>\'\n\n if(doc.transporter_name){ out += \'<tr><td style="width:40%">\' + \'Transporter Name\'+\'</td><td style="width:60%">\'+doc.transporter_name+\'</td></tr>\'}\n if(doc.lr_no){ out += \'<tr><td style="width:40%">\' + \'LR No\'+\'</td><td style="width:60%">\'+doc.lr_no+\'</td></tr>\'}\n if(doc.lr_date){ out += \'<tr><td style="width:40%">\' + \'LR Date\'+\'</td><td style="width:60%">\'+doc.lr_date+\'</td></tr>\'}\n out += \'</table></div>\'\n }\n return out;\n }\n\n</script>\n</head>\n<body>\n<div style="border:1px solid black;padding:15px">\n<!--header-->\n<div><script>get_letter_head()</script></div>\n<div style="border-bottom: 1px solid; padding-bottom: 5px;">\n <div><br><b>Purchase Receipt: <script>doc.name</script></b></div>\n <div>Date: <script>date.str_to_user(doc.transaction_date)</script></div>\n</div>\n\n<div style="padding-top:15px">\n<div><script>doc.supplier</script></div>\n<div><br><script>replace_newlines(doc.address_display)</script></div>\n</div>\n\n<div>\n<br>\n <script>\n var t = print_table(\'Purchase Receipt\', doc.name, \'purchase_receipt_details\', \'Purchase Receipt Detail\', [\'SR\', \'item_code\',\'description\',\'received_qty\',\'qty\',\'rejected_qty\',\'po_rate\',\'amount\',\'billed_qty\'], [\'Sr\', \'Item Code\', \'Description\',\'Received Quantity\',\'Accepted Qty\',\'Rejected Qty\',\'Rate\',\'Amount\',\'Billed Qty\'], [\'4%\',\'12%\', \'24%\', \'10%\',\'10%\',\'10%\',\'10%\',\'10%\',\'10%\'])\n if(t.appendChild) {\n // single\n out = t.innerHTML;\n } \n else {//multiple\n out = \'\'\n for(var i=0;i<t.length;i++) {\n if(i!=t.length-1){\n out += \'<div style:"padding-top:5px;"></div>\' + t[i].innerHTML +\'<div style="page-break-after:always"></div>\';\n }\n else out += \'<div style:"padding-top:5px;"></div>\' + t[i].innerHTML;\n }\n }\n out;\n </script>\n\n</div>\n\n<!--Other charges table-->\n<div>\n<table style="width:100%">\n <tr><td style="width:40%"><script>get_buying_costs()</script></td>\n <td style="width:20%"></td><td style="width:40%"><script>get_other_charges()</script></td></tr>\n</table>\n</div>\n<div><script>get_transport_details()</script></div>\n<div><br>Payment Terms</div>\n<div><br><script>replace_newlines(doc.payment_terms)</script></div>\n<div><br>For NCSCI</div>\n<div><br><br>(Authorised Signatory)</div>\n</div></body>\n</html>',
|
||||
'module': 'Stock',
|
||||
'name': '__common__',
|
||||
'standard': 'Yes'
|
||||
|
@ -1,18 +1,11 @@
|
||||
# Please edit this list and import only required elements
|
||||
import webnotes
|
||||
|
||||
from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add
|
||||
from webnotes.model import db_exists
|
||||
from webnotes.model.doc import Document, addchild, removechild, getchildren, make_autoname, SuperDocType
|
||||
from webnotes.model.doclist import getlist, copy_doclist
|
||||
from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
|
||||
from webnotes import session, form, is_testing, msgprint, errprint
|
||||
from webnotes.utils import cint, cstr, flt, nowdate
|
||||
from webnotes.model.code import get_obj
|
||||
from webnotes import msgprint
|
||||
|
||||
set = webnotes.conn.set
|
||||
sql = webnotes.conn.sql
|
||||
get_value = webnotes.conn.get_value
|
||||
in_transaction = webnotes.conn.in_transaction
|
||||
convert_to_lists = webnotes.conn.convert_to_lists
|
||||
|
||||
# -----------------------------------------------------------------------------------------
|
||||
|
||||
@ -39,19 +32,13 @@ class DocType:
|
||||
self.doc.save()
|
||||
|
||||
|
||||
# update valuation for post dated entry
|
||||
if actual_qty:
|
||||
# check actual qty with total number of serial no
|
||||
if serial_no:
|
||||
self.check_qty_with_serial_no()
|
||||
|
||||
prev_sle = self.get_prev_sle(dt, posting_time, sle_id)
|
||||
cqty = flt(prev_sle.get('bin_aqat', 0))
|
||||
# Block if actual qty becomes negative
|
||||
if (flt(cqty) + flt(actual_qty)) < 0 and flt(actual_qty) < 0 and is_cancelled == 'No':
|
||||
msgprint('Not enough quantity (requested: %s, current: %s) for Item <b>%s</b> in Warehouse <b>%s</b> as on %s %s' % (flt(actual_qty), flt(cqty), self.doc.item_code, self.doc.warehouse, dt, posting_time), raise_exception = 1)
|
||||
|
||||
self.update_item_valuation(sle_id, dt, posting_time, serial_no, prev_sle)
|
||||
|
||||
# update valuation and qty after transaction for post dated entry
|
||||
self.update_entries_after(dt, posting_time)
|
||||
|
||||
def check_qty_with_serial_no(self):
|
||||
"""
|
||||
@ -59,11 +46,19 @@ class DocType:
|
||||
Temporary validation added on: 18-07-2011
|
||||
"""
|
||||
if sql("select name from `tabItem` where ifnull(has_serial_no, 'No') = 'Yes' and name = '%s'" % self.doc.item_code):
|
||||
sr_count = sql("select count(name) from `tabSerial No` where item_code = '%s' and warehouse = '%s' and status ='In Store' and docstatus != 2" % (self.doc.item_code, self.doc.warehouse))[0][0]
|
||||
sr_count = sql("""select count(name) from `tabSerial No`
|
||||
where item_code = '%s' and warehouse = '%s'
|
||||
and status ='In Store' and docstatus != 2
|
||||
""" % (self.doc.item_code, self.doc.warehouse))[0][0]
|
||||
|
||||
if sr_count != self.doc.actual_qty:
|
||||
msg = "Actual Qty(%s) in Bin is mismatched with total number(%s) of serial no in store for item: '%s' and warehouse: '%s'" % (self.doc.actual_qty, sr_count, self.doc.item_code, self.doc.warehouse)
|
||||
msg = """Actual Qty(%s) in Bin is mismatched with total number(%s) of serial no in store
|
||||
for item: '%s' and warehouse: '%s'""" % \
|
||||
(self.doc.actual_qty, sr_count, self.doc.item_code, self.doc.warehouse)
|
||||
|
||||
if getattr(webnotes.defs,'admin_email_notification',1):
|
||||
sendmail(['developers@iwebnotes.com'], sender='automail@webnotestech.com', subject='Serial No Count vs Bin Actual Qty', parts=[['text/plain', msg]])
|
||||
sendmail(['developers@iwebnotes.com'], sender='automail@webnotestech.com', \
|
||||
subject='Serial No Count vs Bin Actual Qty', parts=[['text/plain', msg]])
|
||||
msgprint(msg, raise_exception=1)
|
||||
|
||||
# --------------------------------
|
||||
@ -81,29 +76,19 @@ class DocType:
|
||||
""", (self.doc.item_code, self.doc.warehouse), as_dict=1)
|
||||
return sle and sle[0] or None
|
||||
|
||||
# --------------------------------
|
||||
# get previous stock ledger entry
|
||||
# --------------------------------
|
||||
|
||||
def get_prev_sle(self, posting_date, posting_time, sle_id = ''):
|
||||
# this function will only be called for a live entry
|
||||
# for which the "name" will be the latest (even for the same timestamp)
|
||||
# and even for a back-dated entry
|
||||
# hence there cannot be any "backdated entries" with a name greater than the
|
||||
# current one
|
||||
def get_prev_sle(self, posting_date = '1900-01-01', posting_time = '12:00', sle_id = ''):
|
||||
"""
|
||||
get the last sle on or before the current time-bucket,
|
||||
to get actual qty before transaction, this function
|
||||
is called from various transaction like stock entry, reco etc
|
||||
"""
|
||||
|
||||
# if there are multiple entries on this timestamp, then the last one will be with
|
||||
# the last "name"
|
||||
# else, the last entry will be the highest name at the previous timestamp
|
||||
# hence, the double sort on timestamp and name should be sufficient condition
|
||||
# to get the last sle
|
||||
|
||||
sle = sql("""
|
||||
select * from `tabStock Ledger Entry`
|
||||
where item_code = %s
|
||||
and warehouse = %s
|
||||
and name != %s
|
||||
and ifnull(is_cancelled, 'No') = 'No'
|
||||
and name != %s
|
||||
and timestamp(posting_date, posting_time) <= timestamp(%s, %s)
|
||||
order by timestamp(posting_date, posting_time) desc, name desc
|
||||
limit 1
|
||||
@ -112,23 +97,49 @@ class DocType:
|
||||
return sle and sle[0] or {}
|
||||
|
||||
|
||||
def get_sle_prev_timebucket(self, posting_date = '1900-01-01', posting_time = '12:00'):
|
||||
"""get previous stock ledger entry before current time-bucket"""
|
||||
# get the last sle before the current time-bucket, so that all values
|
||||
# are reposted from the current time-bucket onwards.
|
||||
# this is necessary because at the time of cancellation, there may be
|
||||
# entries between the cancelled entries in the same time-bucket
|
||||
|
||||
sle = sql("""
|
||||
select * from `tabStock Ledger Entry`
|
||||
where item_code = %s
|
||||
and warehouse = %s
|
||||
and ifnull(is_cancelled, 'No') = 'No'
|
||||
and timestamp(posting_date, posting_time) < timestamp(%s, %s)
|
||||
order by timestamp(posting_date, posting_time) desc, name desc
|
||||
limit 1
|
||||
""", (self.doc.item_code, self.doc.warehouse, posting_date, posting_time), as_dict=1)
|
||||
|
||||
return sle and sle[0] or {}
|
||||
|
||||
|
||||
# --------------------------------------------------------------------------------------------------------------------------------------
|
||||
# validate negative stock (validate if stock is going -ve in between for back dated entries will consider only is_cancel = 'No' entries)
|
||||
# --------------------------------------------------------------------------------------------------------------------------------------
|
||||
#-------------------------------------------------------------
|
||||
def validate_negative_stock(self, cqty, s):
|
||||
if cqty + s['actual_qty'] < 0 and s['is_cancelled'] != 'Yes':
|
||||
msgprint(cqty)
|
||||
msgprint(s['actual_qty'])
|
||||
msgprint('Cannot complete this transaction because stock will become negative in future transaction for Item <b>%s</b> in Warehouse <b>%s</b> on <b>%s %s</b>' % \
|
||||
(self.doc.item_code, self.doc.warehouse, s['posting_date'], s['posting_time']))
|
||||
raise Exception
|
||||
"""
|
||||
validate negative stock for entries current datetime onwards
|
||||
will not consider cancelled entries
|
||||
"""
|
||||
diff = cqty + s['actual_qty']
|
||||
if diff < 0 and (abs(diff) > 0.0001) and s['is_cancelled'] == 'No':
|
||||
msgprint("""
|
||||
Negative stock error:
|
||||
Cannot complete this transaction because stock will
|
||||
become negative (%s) for Item <b>%s</b> in Warehouse
|
||||
<b>%s</b> on <b>%s %s</b> in Transaction %s %s""" % \
|
||||
(str(diff), self.doc.item_code, self.doc.warehouse, \
|
||||
s['posting_date'], s['posting_time'], s['voucher_type'], s['voucher_no']), \
|
||||
raise_exception=1)
|
||||
|
||||
|
||||
# ------------------------------------
|
||||
# get serialized inventory values
|
||||
# ------------------------------------
|
||||
def get_serialized_inventory_values(self, val_rate, in_rate, opening_qty, actual_qty, is_cancelled, serial_nos):
|
||||
"""
|
||||
get serialized inventory values
|
||||
"""
|
||||
if flt(in_rate) < 0: # wrong incoming rate
|
||||
in_rate = val_rate
|
||||
elif flt(in_rate) == 0: # In case of delivery/stock issue, get average purchase rate of serial nos of current entry
|
||||
@ -220,11 +231,16 @@ class DocType:
|
||||
stock_val = sum([flt(d[0])*flt(d[1]) for d in self.fcfs_bal])
|
||||
return stock_val
|
||||
|
||||
# ----------------------
|
||||
# update item valuation
|
||||
# ----------------------
|
||||
def update_item_valuation(self, sle_id=None, posting_date=None, posting_time=None, serial_no=None, prev_sle=None):
|
||||
# no sle given, start from the first one (for repost)
|
||||
def update_entries_after(self, posting_date, posting_time):
|
||||
"""
|
||||
update valution rate and qty after transaction
|
||||
from the current time-bucket onwards
|
||||
"""
|
||||
|
||||
# Get prev sle
|
||||
prev_sle = self.get_sle_prev_timebucket(posting_date, posting_time)
|
||||
|
||||
# if no prev sle, start from the first one (for repost)
|
||||
if not prev_sle:
|
||||
cqty, cval, val_rate, self.fcfs_bal = 0, 0, 0, []
|
||||
|
||||
@ -235,11 +251,11 @@ class DocType:
|
||||
val_rate = flt(prev_sle.get('valuation_rate', 0))
|
||||
self.fcfs_bal = eval(prev_sle.get('fcfs_stack', '[]') or '[]')
|
||||
|
||||
val_method = get_obj('Valuation Control').get_valuation_method(self.doc.item_code) # get valuation method
|
||||
# get valuation method
|
||||
val_method = get_obj('Valuation Control').get_valuation_method(self.doc.item_code)
|
||||
|
||||
# recalculate the balances for all stock ledger entries
|
||||
# after this one (so that the corrected balance will reflect
|
||||
# correctly in all entries after this one)
|
||||
# after the prev sle
|
||||
sll = sql("""
|
||||
select *
|
||||
from `tabStock Ledger Entry`
|
||||
@ -248,30 +264,32 @@ class DocType:
|
||||
and ifnull(is_cancelled, 'No') = 'No'
|
||||
and timestamp(posting_date, posting_time) > timestamp(%s, %s)
|
||||
order by timestamp(posting_date, posting_time) asc, name asc""", \
|
||||
(self.doc.item_code, self.doc.warehouse, posting_date, posting_time), as_dict = 1)
|
||||
(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)
|
||||
|
||||
# if in live entry - update the values of the current sle
|
||||
if sle_id:
|
||||
sll = sql("select * from `tabStock Ledger Entry` where name=%s and ifnull(is_cancelled, 'No') = 'No'", sle_id, as_dict=1) + sll
|
||||
for s in sll:
|
||||
for sle in sll:
|
||||
# block if stock level goes negative on any date
|
||||
self.validate_negative_stock(cqty, s)
|
||||
self.validate_negative_stock(cqty, sle)
|
||||
|
||||
stock_val, in_rate = 0, s['incoming_rate'] # IN
|
||||
serial_nos = s["serial_no"] and ("'"+"', '".join(cstr(s["serial_no"]).split('\n')) + "'") or ''
|
||||
stock_val, in_rate = 0, sle['incoming_rate'] # IN
|
||||
serial_nos = sle["serial_no"] and ("'"+"', '".join(cstr(sle["serial_no"]).split('\n')) \
|
||||
+ "'") or ''
|
||||
|
||||
# Get valuation rate
|
||||
val_rate, stock_val = self.get_valuation_rate(val_method, serial_nos, val_rate, in_rate, stock_val, cqty, s)
|
||||
val_rate, stock_val = self.get_valuation_rate(val_method, serial_nos, \
|
||||
val_rate, in_rate, stock_val, cqty, sle)
|
||||
|
||||
# Qty upto the sle
|
||||
cqty += s['actual_qty']
|
||||
cqty += sle['actual_qty']
|
||||
|
||||
# Stock Value upto the sle
|
||||
stock_val = self.get_stock_value(val_method, cqty, stock_val, serial_nos)
|
||||
# update current sle --> will it be good to update incoming rate in sle for outgoing stock entry?????
|
||||
|
||||
# update current sle --> will it be good to update incoming rate in sle
|
||||
# for outgoing stock entry?????
|
||||
sql("""update `tabStock Ledger Entry`
|
||||
set bin_aqat=%s, valuation_rate=%s, fcfs_stack=%s, stock_value=%s
|
||||
where name=%s""", (cqty, flt(val_rate), cstr(self.fcfs_bal), stock_val, s['name']))
|
||||
where name=%s""", (cqty, flt(val_rate), cstr(self.fcfs_bal), stock_val, sle['name']))
|
||||
|
||||
# update the bin
|
||||
if sll:
|
||||
|
@ -19,463 +19,504 @@ convert_to_lists = webnotes.conn.convert_to_lists
|
||||
from utilities.transaction_base import TransactionBase
|
||||
|
||||
class DocType(TransactionBase):
|
||||
def __init__(self, doc, doclist=[]):
|
||||
self.doc = doc
|
||||
self.doclist = doclist
|
||||
self.tname = 'Delivery Note Detail'
|
||||
self.fname = 'delivery_note_details'
|
||||
def __init__(self, doc, doclist=[]):
|
||||
self.doc = doc
|
||||
self.doclist = doclist
|
||||
self.tname = 'Delivery Note Detail'
|
||||
self.fname = 'delivery_note_details'
|
||||
|
||||
# Notification objects
|
||||
self.notify_obj = get_obj('Notification Control')
|
||||
# Notification objects
|
||||
self.notify_obj = get_obj('Notification Control')
|
||||
|
||||
# Autoname
|
||||
# ---------
|
||||
def autoname(self):
|
||||
self.doc.name = make_autoname(self.doc.naming_series+'.#####')
|
||||
# Autoname
|
||||
# ---------
|
||||
def autoname(self):
|
||||
self.doc.name = make_autoname(self.doc.naming_series+'.#####')
|
||||
|
||||
|
||||
# DOCTYPE TRIGGERS FUNCTIONS
|
||||
# ==============================================================================
|
||||
#************Fiscal Year Validation*****************************
|
||||
def validate_fiscal_year(self):
|
||||
get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.posting_date,'Posting Date')
|
||||
def validate_fiscal_year(self):
|
||||
get_obj('Sales Common').validate_fiscal_year(self.doc.fiscal_year,self.doc.posting_date,'Posting Date')
|
||||
|
||||
|
||||
# ****** Get contact person details based on customer selected ****
|
||||
def get_contact_details(self):
|
||||
return get_obj('Sales Common').get_contact_details(self,0)
|
||||
# ****** Get contact person details based on customer selected ****
|
||||
def get_contact_details(self):
|
||||
return get_obj('Sales Common').get_contact_details(self,0)
|
||||
|
||||
# *********** Get Commission rate of Sales Partner ****************
|
||||
def get_comm_rate(self, sales_partner):
|
||||
return get_obj('Sales Common').get_comm_rate(sales_partner, self)
|
||||
# *********** Get Commission rate of Sales Partner ****************
|
||||
def get_comm_rate(self, sales_partner):
|
||||
return get_obj('Sales Common').get_comm_rate(sales_partner, self)
|
||||
|
||||
# *************** Pull Sales Order Details ************************
|
||||
def pull_sales_order_details(self):
|
||||
self.validate_prev_docname()
|
||||
self.doc.clear_table(self.doclist,'other_charges')
|
||||
# *************** Pull Sales Order Details ************************
|
||||
def pull_sales_order_details(self):
|
||||
self.validate_prev_docname()
|
||||
self.doc.clear_table(self.doclist,'other_charges')
|
||||
|
||||
if self.doc.sales_order_no:
|
||||
get_obj('DocType Mapper', 'Sales Order-Delivery Note').dt_map('Sales Order', 'Delivery Note', self.doc.sales_order_no, self.doc, self.doclist, "[['Sales Order', 'Delivery Note'],['Sales Order Detail', 'Delivery Note Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team']]")
|
||||
else:
|
||||
msgprint("Please select Sales Order No. whose details need to be pulled")
|
||||
if self.doc.sales_order_no:
|
||||
get_obj('DocType Mapper', 'Sales Order-Delivery Note').dt_map('Sales Order', 'Delivery Note', self.doc.sales_order_no, self.doc, self.doclist, "[['Sales Order', 'Delivery Note'],['Sales Order Detail', 'Delivery Note Detail'],['RV Tax Detail','RV Tax Detail'],['Sales Team','Sales Team']]")
|
||||
else:
|
||||
msgprint("Please select Sales Order No. whose details need to be pulled")
|
||||
|
||||
return cstr(self.doc.sales_order_no)
|
||||
return cstr(self.doc.sales_order_no)
|
||||
|
||||
|
||||
|
||||
#-------------------set item details -uom and item group----------------
|
||||
def set_item_details(self):
|
||||
for d in getlist(self.doclist,'delivery_note_details'):
|
||||
res = sql("select stock_uom, item_group from `tabItem` where name ='%s'"%d.item_code)
|
||||
if not d.stock_uom: d.stock_uom = res and cstr(res[0][0]) or ''
|
||||
if not d.item_group: d.item_group = res and cstr(res[0][1]) or ''
|
||||
d.save()
|
||||
#-------------------set item details -uom and item group----------------
|
||||
def set_item_details(self):
|
||||
for d in getlist(self.doclist,'delivery_note_details'):
|
||||
res = sql("select stock_uom, item_group from `tabItem` where name ='%s'"%d.item_code)
|
||||
if not d.stock_uom: d.stock_uom = res and cstr(res[0][0]) or ''
|
||||
if not d.item_group: d.item_group = res and cstr(res[0][1]) or ''
|
||||
d.save()
|
||||
|
||||
# ::::: Validates that Sales Order is not pulled twice :::::::
|
||||
def validate_prev_docname(self):
|
||||
for d in getlist(self.doclist, 'delivery_note_details'):
|
||||
if self.doc.sales_order_no == d.prevdoc_docname:
|
||||
msgprint(cstr(self.doc.sales_order_no) + " sales order details have already been pulled. ")
|
||||
raise Exception, "Validation Error. "
|
||||
# ::::: Validates that Sales Order is not pulled twice :::::::
|
||||
def validate_prev_docname(self):
|
||||
for d in getlist(self.doclist, 'delivery_note_details'):
|
||||
if self.doc.sales_order_no == d.prevdoc_docname:
|
||||
msgprint(cstr(self.doc.sales_order_no) + " sales order details have already been pulled. ")
|
||||
raise Exception, "Validation Error. "
|
||||
|
||||
#Set Actual Qty based on item code and warehouse
|
||||
#------------------------------------------------------
|
||||
def set_actual_qty(self):
|
||||
for d in getlist(self.doclist, 'delivery_note_details'):
|
||||
if d.item_code and d.warehouse:
|
||||
actual_qty = sql("select actual_qty from `tabBin` where item_code = '%s' and warehouse = '%s'" % (d.item_code, d.warehouse))
|
||||
d.actual_qty = actual_qty and flt(actual_qty[0][0]) or 0
|
||||
#Set Actual Qty based on item code and warehouse
|
||||
#------------------------------------------------------
|
||||
def set_actual_qty(self):
|
||||
for d in getlist(self.doclist, 'delivery_note_details'):
|
||||
if d.item_code and d.warehouse:
|
||||
actual_qty = sql("select actual_qty from `tabBin` where item_code = '%s' and warehouse = '%s'" % (d.item_code, d.warehouse))
|
||||
d.actual_qty = actual_qty and flt(actual_qty[0][0]) or 0
|
||||
|
||||
|
||||
# GET TERMS & CONDITIONS
|
||||
# -------------------------------------
|
||||
def get_tc_details(self):
|
||||
return get_obj('Sales Common').get_tc_details(self)
|
||||
# GET TERMS & CONDITIONS
|
||||
# -------------------------------------
|
||||
def get_tc_details(self):
|
||||
return get_obj('Sales Common').get_tc_details(self)
|
||||
|
||||
#pull project customer
|
||||
#-------------------------
|
||||
def pull_project_customer(self):
|
||||
res = sql("select customer from `tabProject` where name = '%s'"%self.doc.project_name)
|
||||
if res:
|
||||
get_obj('DocType Mapper', 'Project-Delivery Note').dt_map('Project', 'Delivery Note', self.doc.project_name, self.doc, self.doclist, "[['Project', 'Delivery Note']]")
|
||||
#pull project customer
|
||||
#-------------------------
|
||||
def pull_project_customer(self):
|
||||
res = sql("select customer from `tabProject` where name = '%s'"%self.doc.project_name)
|
||||
if res:
|
||||
get_obj('DocType Mapper', 'Project-Delivery Note').dt_map('Project', 'Delivery Note', self.doc.project_name, self.doc, self.doclist, "[['Project', 'Delivery Note']]")
|
||||
|
||||
# DELIVERY NOTE DETAILS TRIGGER FUNCTIONS
|
||||
# ================================================================================
|
||||
|
||||
# ***************** Get Item Details ******************************
|
||||
def get_item_details(self, item_code):
|
||||
return get_obj('Sales Common').get_item_details(item_code, self)
|
||||
# ***************** Get Item Details ******************************
|
||||
def get_item_details(self, item_code):
|
||||
return get_obj('Sales Common').get_item_details(item_code, self)
|
||||
|
||||
# *** Re-calculates Basic Rate & amount based on Price List Selected ***
|
||||
def get_adj_percent(self, arg=''):
|
||||
get_obj('Sales Common').get_adj_percent(self)
|
||||
# *** Re-calculates Basic Rate & amount based on Price List Selected ***
|
||||
def get_adj_percent(self, arg=''):
|
||||
get_obj('Sales Common').get_adj_percent(self)
|
||||
|
||||
# ********** Get Actual Qty of item in warehouse selected *************
|
||||
def get_actual_qty(self,args):
|
||||
args = eval(args)
|
||||
actual_qty = sql("select actual_qty from `tabBin` where item_code = '%s' and warehouse = '%s'" % (args['item_code'], args['warehouse']), as_dict=1)
|
||||
ret = {
|
||||
'actual_qty' : actual_qty and flt(actual_qty[0]['actual_qty']) or 0
|
||||
}
|
||||
return ret
|
||||
# ********** Get Actual Qty of item in warehouse selected *************
|
||||
def get_actual_qty(self,args):
|
||||
args = eval(args)
|
||||
actual_qty = sql("select actual_qty from `tabBin` where item_code = '%s' and warehouse = '%s'" % (args['item_code'], args['warehouse']), as_dict=1)
|
||||
ret = {
|
||||
'actual_qty' : actual_qty and flt(actual_qty[0]['actual_qty']) or 0
|
||||
}
|
||||
return ret
|
||||
|
||||
|
||||
# OTHER CHARGES TRIGGER FUNCTIONS
|
||||
# ====================================================================================
|
||||
|
||||
# *********** Get Tax rate if account type is TAX ********************
|
||||
def get_rate(self,arg):
|
||||
return get_obj('Sales Common').get_rate(arg)
|
||||
# *********** Get Tax rate if account type is TAX ********************
|
||||
def get_rate(self,arg):
|
||||
return get_obj('Sales Common').get_rate(arg)
|
||||
|
||||
# Load Default Charges
|
||||
# ----------------------------------------------------------
|
||||
def load_default_taxes(self):
|
||||
return get_obj('Sales Common').load_default_taxes(self)
|
||||
# Load Default Charges
|
||||
# ----------------------------------------------------------
|
||||
def load_default_taxes(self):
|
||||
return get_obj('Sales Common').load_default_taxes(self)
|
||||
|
||||
|
||||
# **** Pull details from other charges master (Get Other Charges) ****
|
||||
def get_other_charges(self):
|
||||
return get_obj('Sales Common').get_other_charges(self)
|
||||
# **** Pull details from other charges master (Get Other Charges) ****
|
||||
def get_other_charges(self):
|
||||
return get_obj('Sales Common').get_other_charges(self)
|
||||
|
||||
|
||||
#check in manage account if sales order required or not.
|
||||
# ====================================================================================
|
||||
def so_required(self):
|
||||
res = sql("select value from `tabSingles` where doctype = 'Manage Account' and field = 'so_required'")
|
||||
if res and res[0][0] == 'Yes':
|
||||
for d in getlist(self.doclist,'delivery_note_details'):
|
||||
if not d.prevdoc_docname:
|
||||
msgprint("Sales Order No. required against item %s"%d.item_code)
|
||||
raise Exception
|
||||
#check in manage account if sales order required or not.
|
||||
# ====================================================================================
|
||||
def so_required(self):
|
||||
res = sql("select value from `tabSingles` where doctype = 'Manage Account' and field = 'so_required'")
|
||||
if res and res[0][0] == 'Yes':
|
||||
for d in getlist(self.doclist,'delivery_note_details'):
|
||||
if not d.prevdoc_docname:
|
||||
msgprint("Sales Order No. required against item %s"%d.item_code)
|
||||
raise Exception
|
||||
|
||||
|
||||
|
||||
# VALIDATE
|
||||
# ====================================================================================
|
||||
def validate(self):
|
||||
self.so_required()
|
||||
self.validate_fiscal_year()
|
||||
self.validate_proj_cust()
|
||||
sales_com_obj = get_obj(dt = 'Sales Common')
|
||||
sales_com_obj.check_stop_sales_order(self)
|
||||
sales_com_obj.check_active_sales_items(self)
|
||||
sales_com_obj.get_prevdoc_date(self)
|
||||
self.validate_mandatory()
|
||||
#self.validate_prevdoc_details()
|
||||
self.validate_reference_value()
|
||||
self.validate_for_items()
|
||||
sales_com_obj.make_packing_list(self,'delivery_note_details')
|
||||
get_obj('Stock Ledger').validate_serial_no(self, 'packing_details')
|
||||
sales_com_obj.validate_max_discount(self, 'delivery_note_details') #verify whether rate is not greater than max discount
|
||||
sales_com_obj.get_allocated_sum(self) # this is to verify that the allocated % of sales persons is 100%
|
||||
sales_com_obj.check_conversion_rate(self)
|
||||
# ::::::: Get total in Words ::::::::
|
||||
dcc = TransactionBase().get_company_currency(self.doc.company)
|
||||
self.doc.in_words = sales_com_obj.get_total_in_words(dcc, self.doc.rounded_total)
|
||||
self.doc.in_words_export = sales_com_obj.get_total_in_words(self.doc.currency, self.doc.rounded_total_export)
|
||||
def validate(self):
|
||||
self.so_required()
|
||||
self.validate_fiscal_year()
|
||||
self.validate_proj_cust()
|
||||
sales_com_obj = get_obj(dt = 'Sales Common')
|
||||
sales_com_obj.check_stop_sales_order(self)
|
||||
sales_com_obj.check_active_sales_items(self)
|
||||
sales_com_obj.get_prevdoc_date(self)
|
||||
self.validate_mandatory()
|
||||
#self.validate_prevdoc_details()
|
||||
self.validate_reference_value()
|
||||
self.validate_for_items()
|
||||
sales_com_obj.make_packing_list(self,'delivery_note_details')
|
||||
get_obj('Stock Ledger').validate_serial_no(self, 'packing_details')
|
||||
sales_com_obj.validate_max_discount(self, 'delivery_note_details') #verify whether rate is not greater than max discount
|
||||
sales_com_obj.get_allocated_sum(self) # this is to verify that the allocated % of sales persons is 100%
|
||||
sales_com_obj.check_conversion_rate(self)
|
||||
# ::::::: Get total in Words ::::::::
|
||||
dcc = TransactionBase().get_company_currency(self.doc.company)
|
||||
self.doc.in_words = sales_com_obj.get_total_in_words(dcc, self.doc.rounded_total)
|
||||
self.doc.in_words_export = sales_com_obj.get_total_in_words(self.doc.currency, self.doc.rounded_total_export)
|
||||
|
||||
# ::::::: Set Net Weight of each Packing
|
||||
self.update_pack_nett_weight()
|
||||
self.print_packing_slip()
|
||||
# ::::::: Set actual qty for each item in selected warehouse :::::::
|
||||
self.update_current_stock()
|
||||
# :::::: set DN status :::::::
|
||||
# ::::::: Set Net Weight of each Packing
|
||||
self.update_pack_nett_weight()
|
||||
self.print_packing_slip()
|
||||
# ::::::: Set actual qty for each item in selected warehouse :::::::
|
||||
self.update_current_stock()
|
||||
# :::::: set DN status :::::::
|
||||
|
||||
self.doc.status = 'Draft'
|
||||
if not self.doc.billing_status: self.doc.billing_status = 'Not Billed'
|
||||
if not self.doc.installation_status: self.doc.installation_status = 'Not Installed'
|
||||
self.doc.status = 'Draft'
|
||||
if not self.doc.billing_status: self.doc.billing_status = 'Not Billed'
|
||||
if not self.doc.installation_status: self.doc.installation_status = 'Not Installed'
|
||||
|
||||
# ************** Validate Mandatory *************************
|
||||
def validate_mandatory(self):
|
||||
# :::::::::: Amendment Date ::::::::::::::
|
||||
if self.doc.amended_from and not self.doc.amendment_date:
|
||||
msgprint("Please Enter Amendment Date")
|
||||
raise Exception, "Validation Error. "
|
||||
# ************** Validate Mandatory *************************
|
||||
def validate_mandatory(self):
|
||||
# :::::::::: Amendment Date ::::::::::::::
|
||||
if self.doc.amended_from and not self.doc.amendment_date:
|
||||
msgprint("Please Enter Amendment Date")
|
||||
raise Exception, "Validation Error. "
|
||||
|
||||
#check for does customer belong to same project as entered..
|
||||
#-------------------------------------------------------------------------------------------------
|
||||
def validate_proj_cust(self):
|
||||
if self.doc.project_name and self.doc.customer:
|
||||
res = sql("select name from `tabProject` where name = '%s' and (customer = '%s' or ifnull(customer,'')='')"%(self.doc.project_name, self.doc.customer))
|
||||
if not res:
|
||||
msgprint("Customer - %s does not belong to project - %s. \n\nIf you want to use project for multiple customers then please make customer details blank in project - %s."%(self.doc.customer,self.doc.project_name,self.doc.project_name))
|
||||
raise Exception
|
||||
#check for does customer belong to same project as entered..
|
||||
#-------------------------------------------------------------------------------------------------
|
||||
def validate_proj_cust(self):
|
||||
if self.doc.project_name and self.doc.customer:
|
||||
res = sql("select name from `tabProject` where name = '%s' and (customer = '%s' or ifnull(customer,'')='')"%(self.doc.project_name, self.doc.customer))
|
||||
if not res:
|
||||
msgprint("Customer - %s does not belong to project - %s. \n\nIf you want to use project for multiple customers then please make customer details blank in project - %s."%(self.doc.customer,self.doc.project_name,self.doc.project_name))
|
||||
raise Exception
|
||||
|
||||
# Validate values with reference document
|
||||
#----------------------------------------
|
||||
def validate_reference_value(self):
|
||||
get_obj('DocType Mapper', 'Sales Order-Delivery Note', with_children = 1).validate_reference_value(self, self.doc.name)
|
||||
# Validate values with reference document
|
||||
#----------------------------------------
|
||||
def validate_reference_value(self):
|
||||
get_obj('DocType Mapper', 'Sales Order-Delivery Note', with_children = 1).validate_reference_value(self, self.doc.name)
|
||||
|
||||
|
||||
# ******* Validate Previous Document Details ************
|
||||
def validate_prevdoc_details(self):
|
||||
for d in getlist(self.doclist,'delivery_note_details'):
|
||||
# ******* Validate Previous Document Details ************
|
||||
def validate_prevdoc_details(self):
|
||||
for d in getlist(self.doclist,'delivery_note_details'):
|
||||
|
||||
prevdoc = d.prevdoc_doctype
|
||||
prevdoc_docname = d.prevdoc_docname
|
||||
prevdoc = d.prevdoc_doctype
|
||||
prevdoc_docname = d.prevdoc_docname
|
||||
|
||||
if prevdoc_docname and prevdoc:
|
||||
# ::::::::::: Validates Transaction Date of DN and previous doc (i.e. SO , PO, PR) *********
|
||||
trans_date = sql("select transaction_date from `tab%s` where name = '%s'" %(prevdoc,prevdoc_docname))[0][0]
|
||||
if trans_date and getdate(self.doc.transaction_date) < (trans_date):
|
||||
msgprint("Your Voucher Date cannot be before "+cstr(prevdoc)+" Date.")
|
||||
raise Exception
|
||||
# ::::::::: Validates DN and previous doc details ::::::::::::::::::
|
||||
get_name = sql("select name from `tab%s` where name = '%s'" % (prevdoc, prevdoc_docname))
|
||||
name = get_name and get_name[0][0] or ''
|
||||
if name: #check for incorrect docname
|
||||
if prevdoc == 'Sales Order':
|
||||
dt = sql("select company, docstatus, customer, currency, sales_partner from `tab%s` where name = '%s'" % (prevdoc, name))
|
||||
cust_name = dt and dt[0][2] or ''
|
||||
if cust_name != self.doc.customer:
|
||||
msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " customer :" + cstr(cust_name) + " does not match with customer : " + cstr(self.doc.customer) + " of current document.")
|
||||
raise Exception, "Validation Error. "
|
||||
sal_partner = dt and dt[0][4] or ''
|
||||
if sal_partner != self.doc.sales_partner:
|
||||
msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " sales partner name :" + cstr(sal_partner) + " does not match with sales partner name : " + cstr(self.doc.sales_partner_name) + " of current document.")
|
||||
raise Exception, "Validation Error. "
|
||||
else:
|
||||
dt = sql("select company, docstatus, supplier, currency from `tab%s` where name = '%s'" % (prevdoc, name))
|
||||
supp_name = dt and dt[0][2] or ''
|
||||
company_name = dt and dt[0][0] or ''
|
||||
docstatus = dt and dt[0][1] or 0
|
||||
currency = dt and dt[0][3] or ''
|
||||
if (currency != self.doc.currency):
|
||||
msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " currency : "+ cstr(currency) + "does not match with Currency: " + cstr(self.doc.currency) + "of current document")
|
||||
raise Exception, "Validation Error."
|
||||
if (company_name != self.doc.company):
|
||||
msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " does not belong to the Company: " + cstr(self.doc.company_name))
|
||||
raise Exception, "Validation Error."
|
||||
if (docstatus != 1):
|
||||
msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " is not Submitted Document.")
|
||||
raise Exception, "Validation Error."
|
||||
else:
|
||||
msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " is not a valid " + cstr(prevdoc))
|
||||
raise Exception, "Validation Error."
|
||||
if prevdoc_docname and prevdoc:
|
||||
# ::::::::::: Validates Transaction Date of DN and previous doc (i.e. SO , PO, PR) *********
|
||||
trans_date = sql("select transaction_date from `tab%s` where name = '%s'" %(prevdoc,prevdoc_docname))[0][0]
|
||||
if trans_date and getdate(self.doc.transaction_date) < (trans_date):
|
||||
msgprint("Your Voucher Date cannot be before "+cstr(prevdoc)+" Date.")
|
||||
raise Exception
|
||||
# ::::::::: Validates DN and previous doc details ::::::::::::::::::
|
||||
get_name = sql("select name from `tab%s` where name = '%s'" % (prevdoc, prevdoc_docname))
|
||||
name = get_name and get_name[0][0] or ''
|
||||
if name: #check for incorrect docname
|
||||
if prevdoc == 'Sales Order':
|
||||
dt = sql("select company, docstatus, customer, currency, sales_partner from `tab%s` where name = '%s'" % (prevdoc, name))
|
||||
cust_name = dt and dt[0][2] or ''
|
||||
if cust_name != self.doc.customer:
|
||||
msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " customer :" + cstr(cust_name) + " does not match with customer : " + cstr(self.doc.customer) + " of current document.")
|
||||
raise Exception, "Validation Error. "
|
||||
sal_partner = dt and dt[0][4] or ''
|
||||
if sal_partner != self.doc.sales_partner:
|
||||
msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " sales partner name :" + cstr(sal_partner) + " does not match with sales partner name : " + cstr(self.doc.sales_partner_name) + " of current document.")
|
||||
raise Exception, "Validation Error. "
|
||||
else:
|
||||
dt = sql("select company, docstatus, supplier, currency from `tab%s` where name = '%s'" % (prevdoc, name))
|
||||
supp_name = dt and dt[0][2] or ''
|
||||
company_name = dt and dt[0][0] or ''
|
||||
docstatus = dt and dt[0][1] or 0
|
||||
currency = dt and dt[0][3] or ''
|
||||
if (currency != self.doc.currency):
|
||||
msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " currency : "+ cstr(currency) + "does not match with Currency: " + cstr(self.doc.currency) + "of current document")
|
||||
raise Exception, "Validation Error."
|
||||
if (company_name != self.doc.company):
|
||||
msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " does not belong to the Company: " + cstr(self.doc.company_name))
|
||||
raise Exception, "Validation Error."
|
||||
if (docstatus != 1):
|
||||
msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " is not Submitted Document.")
|
||||
raise Exception, "Validation Error."
|
||||
else:
|
||||
msgprint(cstr(prevdoc) + ": " + cstr(prevdoc_docname) + " is not a valid " + cstr(prevdoc))
|
||||
raise Exception, "Validation Error."
|
||||
|
||||
|
||||
# ******************** Validate Items **************************
|
||||
def validate_for_items(self):
|
||||
check_list, chk_dupl_itm = [], []
|
||||
for d in getlist(self.doclist,'delivery_note_details'):
|
||||
ch = sql("select is_stock_item from `tabItem` where name = '%s'"%d.item_code)
|
||||
if d.prevdoc_doctype and d.prevdoc_detail_docname and ch and ch[0][0]=='Yes':
|
||||
self.validate_items_with_prevdoc(d)
|
||||
# ******************** Validate Items **************************
|
||||
def validate_for_items(self):
|
||||
check_list, chk_dupl_itm = [], []
|
||||
for d in getlist(self.doclist,'delivery_note_details'):
|
||||
ch = sql("select is_stock_item from `tabItem` where name = '%s'"%d.item_code)
|
||||
if d.prevdoc_doctype and d.prevdoc_detail_docname and ch and ch[0][0]=='Yes':
|
||||
self.validate_items_with_prevdoc(d)
|
||||
|
||||
# validates whether item is not entered twice
|
||||
e = [d.item_code, d.description, d.warehouse, d.prevdoc_docname or '', d.batch_no or '']
|
||||
f = [d.item_code, d.description, d.prevdoc_docname or '']
|
||||
# validates whether item is not entered twice
|
||||
e = [d.item_code, d.description, d.warehouse, d.prevdoc_docname or '', d.batch_no or '']
|
||||
f = [d.item_code, d.description, d.prevdoc_docname or '']
|
||||
|
||||
if ch and ch[0][0] == 'Yes':
|
||||
if e in check_list:
|
||||
msgprint("Please check whether item %s has been entered twice wrongly." % d.item_code)
|
||||
else:
|
||||
check_list.append(e)
|
||||
elif ch and ch[0][0] == 'No':
|
||||
if f in chk_dupl_itm:
|
||||
msgprint("Please check whether item %s has been entered twice wrongly." % d.item_code)
|
||||
else:
|
||||
chk_dupl_itm.append(f)
|
||||
if ch and ch[0][0] == 'Yes':
|
||||
if e in check_list:
|
||||
msgprint("Please check whether item %s has been entered twice wrongly." % d.item_code)
|
||||
else:
|
||||
check_list.append(e)
|
||||
elif ch and ch[0][0] == 'No':
|
||||
if f in chk_dupl_itm:
|
||||
msgprint("Please check whether item %s has been entered twice wrongly." % d.item_code)
|
||||
else:
|
||||
chk_dupl_itm.append(f)
|
||||
|
||||
|
||||
# check if same item, warehouse present in prevdoc
|
||||
# ------------------------------------------------------------------
|
||||
def validate_items_with_prevdoc(self, d):
|
||||
if d.prevdoc_doctype == 'Sales Order':
|
||||
data = sql("select item_code, reserved_warehouse from `tabSales Order Detail` where parent = '%s' and name = '%s'" % (d.prevdoc_docname, d.prevdoc_detail_docname))
|
||||
if d.prevdoc_doctype == 'Purchase Receipt':
|
||||
data = sql("select item_code, rejected_warehouse from `tabPurchase Receipt Detail` where parent = '%s' and name = '%s'" % (d.prevdoc_docname, d.prevdoc_detail_docname))
|
||||
if not data or data[0][0] != d.item_code or data[0][1] != d.warehouse:
|
||||
msgprint("Item: %s / Warehouse: %s is not matching with Sales Order: %s. Sales Order might be modified after fetching data from it. Please delete items and fetch again." % (d.item_code, d.warehouse, d.prevdoc_docname))
|
||||
raise Exception
|
||||
# check if same item, warehouse present in prevdoc
|
||||
# ------------------------------------------------------------------
|
||||
def validate_items_with_prevdoc(self, d):
|
||||
if d.prevdoc_doctype == 'Sales Order':
|
||||
data = sql("select item_code, reserved_warehouse from `tabSales Order Detail` where parent = '%s' and name = '%s'" % (d.prevdoc_docname, d.prevdoc_detail_docname))
|
||||
if d.prevdoc_doctype == 'Purchase Receipt':
|
||||
data = sql("select item_code, rejected_warehouse from `tabPurchase Receipt Detail` where parent = '%s' and name = '%s'" % (d.prevdoc_docname, d.prevdoc_detail_docname))
|
||||
if not data or data[0][0] != d.item_code or data[0][1] != d.warehouse:
|
||||
msgprint("Item: %s / Warehouse: %s is not matching with Sales Order: %s. Sales Order might be modified after fetching data from it. Please delete items and fetch again." % (d.item_code, d.warehouse, d.prevdoc_docname))
|
||||
raise Exception
|
||||
|
||||
|
||||
# ********* UPDATE CURRENT STOCK *****************************
|
||||
def update_current_stock(self):
|
||||
for d in getlist(self.doclist, 'delivery_note_details'):
|
||||
bin = sql("select actual_qty from `tabBin` where item_code = %s and warehouse = %s", (d.item_code, d.warehouse), as_dict = 1)
|
||||
d.actual_qty = bin and flt(bin[0]['actual_qty']) or 0
|
||||
# ********* UPDATE CURRENT STOCK *****************************
|
||||
def update_current_stock(self):
|
||||
for d in getlist(self.doclist, 'delivery_note_details'):
|
||||
bin = sql("select actual_qty from `tabBin` where item_code = %s and warehouse = %s", (d.item_code, d.warehouse), as_dict = 1)
|
||||
d.actual_qty = bin and flt(bin[0]['actual_qty']) or 0
|
||||
|
||||
for d in getlist(self.doclist, 'packing_details'):
|
||||
bin = sql("select actual_qty, projected_qty from `tabBin` where item_code = %s and warehouse = %s", (d.item_code, d.warehouse), as_dict = 1)
|
||||
d.actual_qty = bin and flt(bin[0]['actual_qty']) or 0
|
||||
d.projected_qty = bin and flt(bin[0]['projected_qty']) or 0
|
||||
for d in getlist(self.doclist, 'packing_details'):
|
||||
bin = sql("select actual_qty, projected_qty from `tabBin` where item_code = %s and warehouse = %s", (d.item_code, d.warehouse), as_dict = 1)
|
||||
d.actual_qty = bin and flt(bin[0]['actual_qty']) or 0
|
||||
d.projected_qty = bin and flt(bin[0]['projected_qty']) or 0
|
||||
|
||||
|
||||
# ON SUBMIT
|
||||
# =================================================================================================
|
||||
def on_submit(self):
|
||||
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
|
||||
get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total, self)
|
||||
sl_obj = get_obj("Stock Ledger")
|
||||
sl_obj.validate_serial_no_warehouse(self, 'packing_details')
|
||||
sl_obj.update_serial_record(self, 'packing_details', is_submit = 1, is_incoming = 0)
|
||||
get_obj("Sales Common").update_prevdoc_detail(1,self)
|
||||
self.update_stock_ledger(update_stock = 1)
|
||||
def on_submit(self):
|
||||
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
|
||||
get_obj('Authorization Control').validate_approving_authority(self.doc.doctype, self.doc.company, self.doc.grand_total, self)
|
||||
sl_obj = get_obj("Stock Ledger")
|
||||
sl_obj.validate_serial_no_warehouse(self, 'packing_details')
|
||||
sl_obj.update_serial_record(self, 'packing_details', is_submit = 1, is_incoming = 0)
|
||||
get_obj("Sales Common").update_prevdoc_detail(1,self)
|
||||
self.update_stock_ledger(update_stock = 1)
|
||||
|
||||
#------------Check Credit Limit---------------------
|
||||
self.credit_limit()
|
||||
#------------Check Credit Limit---------------------
|
||||
self.credit_limit()
|
||||
|
||||
# set DN status
|
||||
set(self.doc, 'status', 'Submitted')
|
||||
# set DN status
|
||||
set(self.doc, 'status', 'Submitted')
|
||||
|
||||
# on submit notification
|
||||
self.notify_obj.notify_contact('Delivery Note',self.doc.doctype,self.doc.name, self.doc.email_id, self.doc.contact_person)
|
||||
# on submit notification
|
||||
self.notify_obj.notify_contact('Delivery Note',self.doc.doctype,self.doc.name, self.doc.email_id, self.doc.contact_person)
|
||||
|
||||
|
||||
# *********** Checks whether actual quantity is present in warehouse *************
|
||||
def check_qty_in_stock(self):
|
||||
for d in getlist(self.doclist, 'packing_details'):
|
||||
is_stock_item = sql("select is_stock_item from `tabItem` where name = '%s'" % d.item_code)[0][0]
|
||||
if is_stock_item == 'Yes' and d.warehouse and flt(d.qty) > flt(d.actual_qty):
|
||||
msgprint("For Item: " + cstr(d.item_code) + " at Warehouse: " + cstr(d.warehouse) + " Quantity: " + cstr(d.qty) +" is not Available. (Must be less than or equal to " + cstr(d.actual_qty) + " )")
|
||||
raise Exception, "Validation Error"
|
||||
# *********** Checks whether actual quantity is present in warehouse *************
|
||||
def check_qty_in_stock(self):
|
||||
for d in getlist(self.doclist, 'packing_details'):
|
||||
is_stock_item = sql("select is_stock_item from `tabItem` where name = '%s'" % d.item_code)[0][0]
|
||||
if is_stock_item == 'Yes' and d.warehouse and flt(d.qty) > flt(d.actual_qty):
|
||||
msgprint("For Item: " + cstr(d.item_code) + " at Warehouse: " + cstr(d.warehouse) + " Quantity: " + cstr(d.qty) +" is not Available. (Must be less than or equal to " + cstr(d.actual_qty) + " )")
|
||||
raise Exception, "Validation Error"
|
||||
|
||||
|
||||
|
||||
# ON CANCEL
|
||||
# =================================================================================================
|
||||
def on_cancel(self):
|
||||
sales_com_obj = get_obj(dt = 'Sales Common')
|
||||
sales_com_obj.check_stop_sales_order(self)
|
||||
self.check_next_docstatus()
|
||||
get_obj('Stock Ledger').update_serial_record(self, 'packing_details', is_submit = 0, is_incoming = 0)
|
||||
sales_com_obj.update_prevdoc_detail(0,self)
|
||||
self.update_stock_ledger(update_stock = -1)
|
||||
# :::::: set DN status :::::::
|
||||
set(self.doc, 'status', 'Cancelled')
|
||||
def on_cancel(self):
|
||||
sales_com_obj = get_obj(dt = 'Sales Common')
|
||||
sales_com_obj.check_stop_sales_order(self)
|
||||
self.check_next_docstatus()
|
||||
get_obj('Stock Ledger').update_serial_record(self, 'packing_details', is_submit = 0, is_incoming = 0)
|
||||
sales_com_obj.update_prevdoc_detail(0,self)
|
||||
self.update_stock_ledger(update_stock = -1)
|
||||
# :::::: set DN status :::::::
|
||||
set(self.doc, 'status', 'Cancelled')
|
||||
|
||||
|
||||
# ******************** Check Next DocStatus **************************
|
||||
def check_next_docstatus(self):
|
||||
submit_rv = sql("select t1.name from `tabReceivable Voucher` t1,`tabRV Detail` t2 where t1.name = t2.parent and t2.delivery_note = '%s' and t1.docstatus = 1" % (self.doc.name))
|
||||
if submit_rv:
|
||||
msgprint("Sales Invoice : " + cstr(submit_rv[0][0]) + " has already been submitted !")
|
||||
raise Exception , "Validation Error."
|
||||
# ******************** Check Next DocStatus **************************
|
||||
def check_next_docstatus(self):
|
||||
submit_rv = sql("select t1.name from `tabReceivable Voucher` t1,`tabRV Detail` t2 where t1.name = t2.parent and t2.delivery_note = '%s' and t1.docstatus = 1" % (self.doc.name))
|
||||
if submit_rv:
|
||||
msgprint("Sales Invoice : " + cstr(submit_rv[0][0]) + " has already been submitted !")
|
||||
raise Exception , "Validation Error."
|
||||
|
||||
submit_in = sql("select t1.name from `tabInstallation Note` t1, `tabInstalled Item Details` t2 where t1.name = t2.parent and t2.prevdoc_docname = '%s' and t1.docstatus = 1" % (self.doc.name))
|
||||
if submit_in:
|
||||
msgprint("Installation Note : "+cstr(submit_in[0][0]) +" has already been submitted !")
|
||||
raise Exception , "Validation Error."
|
||||
submit_in = sql("select t1.name from `tabInstallation Note` t1, `tabInstalled Item Details` t2 where t1.name = t2.parent and t2.prevdoc_docname = '%s' and t1.docstatus = 1" % (self.doc.name))
|
||||
if submit_in:
|
||||
msgprint("Installation Note : "+cstr(submit_in[0][0]) +" has already been submitted !")
|
||||
raise Exception , "Validation Error."
|
||||
|
||||
|
||||
# UPDATE STOCK LEDGER
|
||||
# =================================================================================================
|
||||
def update_stock_ledger(self, update_stock, is_stopped = 0):
|
||||
self.values = []
|
||||
for d in self.get_item_list(is_stopped):
|
||||
stock_item = sql("SELECT is_stock_item, is_sample_item FROM tabItem where name = '%s'"%(d[1]), as_dict = 1) # stock ledger will be updated only if it is a stock item
|
||||
if stock_item[0]['is_stock_item'] == "Yes":
|
||||
if not d[0]:
|
||||
msgprint("Message: Please enter Warehouse for item %s as it is stock item."% d[1])
|
||||
raise Exception
|
||||
# if prevdoc_doctype = "Sales Order"
|
||||
if d[3] < 0 :
|
||||
# Reduce Reserved Qty from warehouse
|
||||
bin = get_obj('Warehouse', d[0]).update_bin(0, flt(update_stock) * flt(d[3]), 0, 0, 0, d[1], self.doc.transaction_date)
|
||||
def update_stock_ledger(self, update_stock, is_stopped = 0):
|
||||
self.values = []
|
||||
for d in self.get_item_list(is_stopped):
|
||||
stock_item = sql("SELECT is_stock_item, is_sample_item FROM tabItem where name = '%s'"%(d[1]), as_dict = 1) # stock ledger will be updated only if it is a stock item
|
||||
if stock_item[0]['is_stock_item'] == "Yes":
|
||||
if not d[0]:
|
||||
msgprint("Message: Please enter Warehouse for item %s as it is stock item."% d[1])
|
||||
raise Exception
|
||||
# if prevdoc_doctype = "Sales Order"
|
||||
if d[3] < 0 :
|
||||
# Reduce Reserved Qty from warehouse
|
||||
bin = get_obj('Warehouse', d[0]).update_bin(0, flt(update_stock) * flt(d[3]), 0, 0, 0, d[1], self.doc.transaction_date)
|
||||
|
||||
# Reduce actual qty from warehouse
|
||||
self.make_sl_entry(d, d[0], - flt(d[2]) , 0, update_stock)
|
||||
get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values)
|
||||
# Reduce actual qty from warehouse
|
||||
self.make_sl_entry(d, d[0], - flt(d[2]) , 0, update_stock)
|
||||
get_obj('Stock Ledger', 'Stock Ledger').update_stock(self.values)
|
||||
|
||||
|
||||
# ***************** Gets Items from packing list *****************
|
||||
def get_item_list(self, is_stopped):
|
||||
return get_obj('Sales Common').get_item_list(self, is_stopped)
|
||||
# ***************** Gets Items from packing list *****************
|
||||
def get_item_list(self, is_stopped):
|
||||
return get_obj('Sales Common').get_item_list(self, is_stopped)
|
||||
|
||||
|
||||
# ********************** Make Stock Entry ************************************
|
||||
def make_sl_entry(self, d, wh, qty, in_value, update_stock):
|
||||
self.values.append({
|
||||
'item_code' : d[1],
|
||||
'warehouse' : wh,
|
||||
'transaction_date' : self.doc.transaction_date,
|
||||
'posting_date' : self.doc.posting_date,
|
||||
'posting_time' : self.doc.posting_time,
|
||||
'voucher_type' : 'Delivery Note',
|
||||
'voucher_no' : self.doc.name,
|
||||
'voucher_detail_no' : '',
|
||||
'actual_qty' : qty,
|
||||
'stock_uom' : d[4],
|
||||
'incoming_rate' : in_value,
|
||||
'company' : self.doc.company,
|
||||
'fiscal_year' : self.doc.fiscal_year,
|
||||
'is_cancelled' : (update_stock==1) and 'No' or 'Yes',
|
||||
'batch_no' : d[5],
|
||||
'serial_no' : d[6]
|
||||
})
|
||||
# ********************** Make Stock Entry ************************************
|
||||
def make_sl_entry(self, d, wh, qty, in_value, update_stock):
|
||||
self.values.append({
|
||||
'item_code' : d[1],
|
||||
'warehouse' : wh,
|
||||
'transaction_date' : self.doc.transaction_date,
|
||||
'posting_date' : self.doc.posting_date,
|
||||
'posting_time' : self.doc.posting_time,
|
||||
'voucher_type' : 'Delivery Note',
|
||||
'voucher_no' : self.doc.name,
|
||||
'voucher_detail_no' : '',
|
||||
'actual_qty' : qty,
|
||||
'stock_uom' : d[4],
|
||||
'incoming_rate' : in_value,
|
||||
'company' : self.doc.company,
|
||||
'fiscal_year' : self.doc.fiscal_year,
|
||||
'is_cancelled' : (update_stock==1) and 'No' or 'Yes',
|
||||
'batch_no' : d[5],
|
||||
'serial_no' : d[6]
|
||||
})
|
||||
|
||||
|
||||
# SEND SMS
|
||||
# ============================================================================================
|
||||
def send_sms(self):
|
||||
if not self.doc.customer_mobile_no:
|
||||
msgprint("Please enter customer mobile no")
|
||||
elif not self.doc.message:
|
||||
msgprint("Please enter the message you want to send")
|
||||
else:
|
||||
msgprint(get_obj("SMS Control", "SMS Control").send_sms([self.doc.customer_mobile_no,], self.doc.message))
|
||||
# SEND SMS
|
||||
# ============================================================================================
|
||||
def send_sms(self):
|
||||
if not self.doc.customer_mobile_no:
|
||||
msgprint("Please enter customer mobile no")
|
||||
elif not self.doc.message:
|
||||
msgprint("Please enter the message you want to send")
|
||||
else:
|
||||
msgprint(get_obj("SMS Control", "SMS Control").send_sms([self.doc.customer_mobile_no,], self.doc.message))
|
||||
|
||||
|
||||
#------------ check credit limit of items in DN Detail which are not fetched from sales order----------
|
||||
def credit_limit(self):
|
||||
amount, total = 0, 0
|
||||
for d in getlist(self.doclist, 'delivery_note_details'):
|
||||
if not d.prevdoc_docname:
|
||||
amount += d.amount
|
||||
if amount != 0:
|
||||
total = (amount/self.doc.net_total)*self.doc.grand_total
|
||||
get_obj('Sales Common').check_credit(self, total)
|
||||
|
||||
# on update
|
||||
def on_update(self):
|
||||
self.set_actual_qty()
|
||||
get_obj('Stock Ledger').scrub_serial_nos(self)
|
||||
|
||||
# Repair Delivery Note
|
||||
# ===========================================
|
||||
def repair_delivery_note(self):
|
||||
get_obj('Sales Common', 'Sales Common').repair_curr_doctype_details(self)
|
||||
|
||||
# Packing Slip Related
|
||||
# ==========================================
|
||||
def update_pack_nett_weight(self):
|
||||
for d in getlist(self.doclist, 'delivery_note_details'):
|
||||
if d.item_code:
|
||||
item_wt = sql("select nett_weight from `tabItem` where name = %s", (d.item_code))
|
||||
d.pack_nett_wt = item_wt and flt(item_wt[0][0])*flt(d.qty) or 0
|
||||
|
||||
# ==========================================
|
||||
def print_packing_slip(self):
|
||||
prev_pack='0'
|
||||
sno=0
|
||||
html=''
|
||||
tot_nett_wt,tot_gross_wt=0,0
|
||||
for d in getlist(self.doclist, 'delivery_note_details'):
|
||||
sno=sno+1
|
||||
if sno!=1:#Footer goes here
|
||||
html+='</table><table width="100%"><tr><td>CASE NO</td><td>'+cstr(d.pack_no)+'</td><td>NETT WT</td><td>'+cstr(tot_nett_wt)+'</td><td>CHECKED BY</td><td></td></tr><tr><td>SIZE</td><td></td><td>GROSS WT</td><td>'+cstr(tot_gross_wt)+'</td><td>PACKED BY</td><td></td></tr></table>'
|
||||
if prev_pack!=d.pack_no: #Prepare Header Here
|
||||
#Header code goes here
|
||||
html+='<div align="center">[HEADER GOES HERE]</div><div><center><h2>Packing Slip</h2></center></div> <table width="100%"><tr><td>Order No.</td><td>'+cstr(self.doc.sales_order_no)+'</td><td>Shipping Marks</td><td>'+cstr(d.pack_no)+'</td></tr></table>'
|
||||
html+='<table class="cust_tbl" style="page-break-after:always" width="100%"><tr><td>S.NO.</td><td>QUANTITY</td><td>CS.NO.</td><td>DESCRIPTION</td><td>WEIGHT</td><tr>'
|
||||
sno=0
|
||||
tot_nett_wt,to_gross_wt=flt(d.pack_nett_wt),flt(d.pack_gross_wt)
|
||||
#Body code goes here
|
||||
html+='<tr><td>'+cstr(sno+1)+'</td><td>'+cstr(d.qty)+'</td><td></td><td>'+d.item_code+'</td><td>'+cstr(d.pack_nett_wt)+'</td></tr>'
|
||||
prev_pack=d.pack_no
|
||||
tot_nett_wt+=flt(d.pack_nett_wt)
|
||||
tot_gross_wt+=flt(d.pack_gross_wt)
|
||||
html+='</html>'
|
||||
self.doc.print_packing_slip=html
|
||||
|
||||
|
||||
def credit_limit(self):
|
||||
amount, total = 0, 0
|
||||
for d in getlist(self.doclist, 'delivery_note_details'):
|
||||
if not d.prevdoc_docname:
|
||||
amount += d.amount
|
||||
if amount != 0:
|
||||
total = (amount/self.doc.net_total)*self.doc.grand_total
|
||||
get_obj('Sales Common').check_credit(self, total)
|
||||
|
||||
# on update
|
||||
def on_update(self):
|
||||
self.set_actual_qty()
|
||||
get_obj('Stock Ledger').scrub_serial_nos(self)
|
||||
|
||||
# Repair Delivery Note
|
||||
# ===========================================
|
||||
def repair_delivery_note(self):
|
||||
get_obj('Sales Common', 'Sales Common').repair_curr_doctype_details(self)
|
||||
|
||||
# Packing Slip Related
|
||||
# ==========================================
|
||||
def update_pack_nett_weight(self):
|
||||
for d in getlist(self.doclist, 'delivery_note_details'):
|
||||
if d.item_code and not d.pack_nett_wt:
|
||||
item_wt = sql("select nett_weight from `tabItem` where name = %s", (d.item_code))
|
||||
d.pack_nett_wt = item_wt and flt(item_wt[0][0]) or 0
|
||||
|
||||
|
||||
# ==========================================
|
||||
def get_header(self, so_no, shipping_mark):
|
||||
header = '''
|
||||
<div align="center">[HEADER GOES HERE]</div>
|
||||
<div><center><h2>Packing Slip</h2></center></div>
|
||||
<table width="100%" class="large_font">
|
||||
<tr>
|
||||
<td width="20%">ORDER NO.</td>
|
||||
<td width="30%">'''+cstr(so_no)+'''</td>
|
||||
<td width="20%">SHIPPING MARKS</td>
|
||||
<td width="30%">'''+cstr(shipping_mark)+'''</td>
|
||||
</tr>
|
||||
</table>''';
|
||||
|
||||
return header
|
||||
|
||||
def get_footer(self, row, tot_nett, tot_gross):
|
||||
footer = '''
|
||||
<table style="page-break-after:always" width="100%" class="large_font">
|
||||
<tr>
|
||||
<td>CASE NO</td><td>'''+cstr(row.pack_no)+'''</td>
|
||||
<td>NETT WT</td><td>'''+cstr(tot_nett)+'''</td>
|
||||
<td>CHECKED BY</td><td>'''+cstr(row.packing_checked_by)+'''</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>SIZE</td><td>'''+cstr(row.pack_size)+'''</td>
|
||||
<td>GROSS WT</td><td>'''+cstr(tot_gross)+'''</td>
|
||||
<td>PACKED BY</td><td>'''+cstr(row.packed_by)+'''</td>
|
||||
</tr>
|
||||
</table>'''
|
||||
|
||||
return footer
|
||||
|
||||
def print_packing_slip(self):
|
||||
plist = {}
|
||||
for d in getlist(self.doclist, 'delivery_note_details'):
|
||||
if not plist.has_key(cstr(d.pack_no)):
|
||||
plist[cstr(d.pack_no)] = [d]
|
||||
else:
|
||||
plist.get(cstr(d.pack_no)).append(d)
|
||||
|
||||
html=''
|
||||
|
||||
for d in sorted(plist.keys()):
|
||||
tot_nett_wt,tot_gross_wt=0,0
|
||||
|
||||
# header
|
||||
html += self.get_header(self.doc.sales_order_no, self.doc.shipping_mark)
|
||||
|
||||
# item table header
|
||||
html += '''
|
||||
<table class="cust_tbl" width="100%">
|
||||
<tr>
|
||||
<td><b>SR.NO.</b></td><td><b>CS.NO.</b></td><td><b>DESCRIPTION</b></td>
|
||||
<td><b>QUANTITY</b></td><td><b>WEIGHT</b></td>
|
||||
</tr>'''
|
||||
|
||||
# item table data
|
||||
sr_no = 1
|
||||
for r in plist.get(d):
|
||||
html += '<tr><td>'+cstr(sr_no)+'</td><td>'+r.item_code+'</td><td>'+r.description+'</td><td>'+cstr(r.qty)+'</td><td>'+cstr(r.pack_nett_wt)+'</td></tr>'
|
||||
|
||||
tot_nett_wt += flt(r.pack_nett_wt)
|
||||
tot_gross_wt += flt(r.pack_gross_wt)
|
||||
|
||||
sr_no += 1
|
||||
|
||||
html += '</table>'
|
||||
|
||||
# footer
|
||||
html += self.get_footer(r, tot_nett_wt, tot_gross_wt)
|
||||
self.doc.print_packing_slip=html
|
||||
|
@ -5,7 +5,7 @@
|
||||
{
|
||||
'creation': '2011-04-18 15:58:20',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-09-07 17:36:34',
|
||||
'modified': '2011-10-18 13:57:23',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
@ -21,7 +21,7 @@
|
||||
|
||||
# These values are common for all DocType
|
||||
{
|
||||
'_last_update': '1314093417',
|
||||
'_last_update': '1318321312',
|
||||
'colour': 'White:FFF',
|
||||
'default_print_format': 'Standard',
|
||||
'doctype': 'DocType',
|
||||
@ -37,7 +37,7 @@
|
||||
'show_in_menu': 0,
|
||||
'subject': 'To %(customer_name)s on %(transaction_date)s | %(per_billed)s% billed',
|
||||
'tag_fields': 'billing_status',
|
||||
'version': 450
|
||||
'version': 454
|
||||
},
|
||||
|
||||
# These values are common for all DocFormat
|
||||
@ -114,6 +114,18 @@
|
||||
'write': 1
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'amend': 1,
|
||||
'cancel': 1,
|
||||
'create': 1,
|
||||
'doctype': 'DocPerm',
|
||||
'permlevel': 0,
|
||||
'role': 'Sales Manager',
|
||||
'submit': 1,
|
||||
'write': 1
|
||||
},
|
||||
|
||||
# DocPerm
|
||||
{
|
||||
'doctype': 'DocPerm',
|
||||
@ -133,11 +145,6 @@
|
||||
'doctype': 'DocFormat'
|
||||
},
|
||||
|
||||
# DocFormat
|
||||
{
|
||||
'doctype': 'DocFormat'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'colour': 'White:FFF',
|
||||
@ -627,6 +634,7 @@
|
||||
|
||||
# DocField
|
||||
{
|
||||
'allow_on_submit': 1,
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'delivery_note_details',
|
||||
'fieldtype': 'Table',
|
||||
@ -1390,6 +1398,42 @@
|
||||
'in_filter': 0,
|
||||
'label': 'Print Packing Slip',
|
||||
'permlevel': 0,
|
||||
'print_hide': 0
|
||||
'print_hide': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'shipping_mark',
|
||||
'fieldtype': 'Text',
|
||||
'label': 'Shipping Mark',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'packed_by',
|
||||
'fieldtype': 'Text',
|
||||
'label': 'Packed By',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'packing_checked_by',
|
||||
'fieldtype': 'Text',
|
||||
'label': 'Packing Checked By',
|
||||
'permlevel': 0
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'pack_size',
|
||||
'fieldtype': 'Text',
|
||||
'label': 'Pack Size',
|
||||
'permlevel': 0
|
||||
}
|
||||
]
|
@ -5,15 +5,17 @@
|
||||
{
|
||||
'creation': '2010-08-08 17:08:58',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-09-07 17:34:13',
|
||||
'modified': '2011-10-18 16:32:44',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'Administrator'
|
||||
},
|
||||
|
||||
# These values are common for all DocType
|
||||
{
|
||||
'_last_update': '1311621379',
|
||||
'autoname': 'DND/.#######',
|
||||
'colour': 'White:FFF',
|
||||
'default_print_format': 'Standard',
|
||||
'doctype': 'DocType',
|
||||
'istable': 1,
|
||||
'module': 'Stock',
|
||||
@ -21,7 +23,7 @@
|
||||
'section_style': 'Tray',
|
||||
'server_code_error': ' ',
|
||||
'show_in_menu': 0,
|
||||
'version': 40
|
||||
'version': 43
|
||||
},
|
||||
|
||||
# These values are common for all DocField
|
||||
@ -354,6 +356,37 @@
|
||||
'width': '100px'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'pack_size',
|
||||
'fieldtype': 'Data',
|
||||
'label': 'Pack Size',
|
||||
'no_copy': 0,
|
||||
'permlevel': 0,
|
||||
'print_hide': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'packed_by',
|
||||
'fieldtype': 'Data',
|
||||
'label': 'Packed By',
|
||||
'permlevel': 0,
|
||||
'print_hide': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'packing_checked_by',
|
||||
'fieldtype': 'Data',
|
||||
'label': 'Packing Checked By',
|
||||
'permlevel': 0,
|
||||
'print_hide': 1
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
|
@ -63,6 +63,9 @@ class DocType:
|
||||
child.conversion_factor = 1
|
||||
child.save()
|
||||
|
||||
# On delete 1. Delete BIN (if none of the corrosponding transactions present, it gets deleted. if present, rolled back due to exception)
|
||||
def on_trash(self):
|
||||
sql("delete from tabBin where item_code='%s'"%(self.doc.item_code))
|
||||
|
||||
# Check whether Ref Rate is not entered twice for same Price List and Currency
|
||||
def check_ref_rate_detail(self):
|
||||
@ -124,7 +127,7 @@ class DocType:
|
||||
self.doc.min_order_qty = 0
|
||||
self.check_non_asset_warehouse()
|
||||
|
||||
if self.doc.is_pro_applicable == 'Yes' and self.doc.is_manufactured_item != 'Yes':
|
||||
if self.doc.is_pro_applicable and self.doc.is_pro_applicable == 'Yes' and self.doc.is_manufactured_item and self.doc.is_manufactured_item != 'Yes':
|
||||
msgprint("If making Production Order is allowed then, it should also allow to make Bill of Materials. Refer Manufacturing section.")
|
||||
raise Exception
|
||||
|
||||
|
62
erpnext/stock/doctype/item/test_item.py
Normal file
62
erpnext/stock/doctype/item/test_item.py
Normal file
@ -0,0 +1,62 @@
|
||||
import unittest
|
||||
import webnotes
|
||||
import copy
|
||||
|
||||
from webnotes.model.doclist import DocList
|
||||
from webnotes.model.doc import Document
|
||||
from webnotes.model.code import get_obj
|
||||
from webnotes.utils import flt
|
||||
|
||||
sql = webnotes.conn.sql
|
||||
|
||||
|
||||
class TestItem(unittest.TestCase):
|
||||
def setUp(self):
|
||||
webnotes.conn.begin()
|
||||
|
||||
def tearDown(self):
|
||||
webnotes.conn.rollback()
|
||||
|
||||
def testInsert(self):
|
||||
d = DocList()
|
||||
|
||||
count_before = flt(sql("select count(*) from tab"+_doctype)[0][0])
|
||||
if docok:
|
||||
for i in docok:
|
||||
d.doc = i
|
||||
d.children = None
|
||||
d.doc.fields['__islocal']=1
|
||||
d.save(1)
|
||||
count_after = flt(sql("select count(*) from tab"+_doctype)[0][0])
|
||||
self.assertTrue(count_before+len(docok)==count_after)
|
||||
|
||||
def testFailAssert(self):
|
||||
if docnotok:
|
||||
with self.assertRaises(Exception) as context:
|
||||
d = DocList()
|
||||
d.doc = docnotok[0]
|
||||
d.children = None
|
||||
d.doc.fields['__islocal']=1
|
||||
d.save(1)
|
||||
|
||||
# Test Data
|
||||
|
||||
tabOK = [
|
||||
{'is_purchase_item': None, 'is_pro_applicable': 'No', 'is_manufactured_item': None, 'description': 'Gel Ink', 'default_warehouse': None, 'item_name': 'Gel Ink', 'item_group': 'Ink', 'item_code': 'GELINK', 'is_sub_contracted_item': None, 'is_stock_item': 'Yes', 'stock_uom': 'Nos', 'docstatus': '0'},
|
||||
{'is_purchase_item': None, 'is_pro_applicable': 'No', 'is_manufactured_item': None, 'description': 'Gel Refill', 'default_warehouse': None, 'item_name': 'Gel Refill', 'item_group': 'Refill', 'item_code': 'GELREF', 'is_sub_contracted_item': None, 'is_stock_item': 'Yes', 'stock_uom': 'Nos', 'docstatus': '0'},
|
||||
{'is_purchase_item': None, 'is_pro_applicable': 'No', 'is_manufactured_item': None, 'description': 'Gel Pen', 'default_warehouse': None, 'item_name': 'Gel Pen', 'item_group': 'Pen', 'item_code': 'GELPEN', 'is_sub_contracted_item': None, 'is_stock_item': 'Yes', 'stock_uom': 'Nos', 'docstatus': '0'}
|
||||
]
|
||||
|
||||
tabNotOK = [
|
||||
{'is_purchase_item': None, 'is_pro_applicable': None, 'is_manufactured_item': None, 'description': 'F Ink', 'default_warehouse': None, 'item_name': 'F Ink', 'item_group': 'F Ink', 'item_code': None, 'is_sub_contracted_item': None, 'is_stock_item': 'No', 'stock_uom': 'Nos', 'docstatus': '0'}
|
||||
]
|
||||
|
||||
_doctype = 'Item'
|
||||
|
||||
for i in tabOK: i['doctype']=_doctype
|
||||
for i in tabNotOK: i['doctype']=_doctype
|
||||
|
||||
docok = [Document(fielddata=r) for r in tabOK]
|
||||
docnotok = [Document(fielddata=r) for r in tabNotOK]
|
||||
|
||||
|
@ -2,10 +2,7 @@ cur_frm.cscript.onload = function(doc, cdt, cdn) {
|
||||
if(!doc.currency){doc.currency = sys_defaults.currency;}
|
||||
}
|
||||
|
||||
cur_frm.fields_dict['landed_cost_details'].grid.get_field("account_head").get_query = function(doc,cdt,cdn) {
|
||||
return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus != 2 AND tabAccount.account_type = "Chargeable" AND tabAccount.name LIKE "%s"'
|
||||
}
|
||||
|
||||
cur_frm.fields_dict['landed_cost_details'].grid.get_field("account_head").get_query = function(doc,cdt,cdn) {
|
||||
return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus != 2 AND (tabAccount.account_type = "Tax" OR tabAccount.account_type = "Chargeable") AND tabAccount.name LIKE "%s"'
|
||||
}
|
||||
return 'SELECT tabAccount.name FROM tabAccount WHERE tabAccount.group_or_ledger="Ledger" AND tabAccount.docstatus != 2 AND (tabAccount.account_type = "Tax" OR tabAccount.account_type = "Chargeable" or (tabAccount.is_pl_account = "Yes" and tabAccount.debit_or_credit = "Debit")) AND tabAccount.name LIKE "%s"';
|
||||
}
|
||||
|
@ -1,236 +1,47 @@
|
||||
# Please edit this list and import only required elements
|
||||
import webnotes
|
||||
from webnotes.utils import cint, cstr, flt
|
||||
from webnotes.model.doc import addchild, getchildren
|
||||
from webnotes.model.doclist import getlist
|
||||
from webnotes.model.code import get_obj
|
||||
from webnotes import msgprint
|
||||
|
||||
from webnotes.utils import add_days, add_months, add_years, cint, cstr, date_diff, default_fields, flt, fmt_money, formatdate, generate_hash, getTraceback, get_defaults, get_first_day, get_last_day, getdate, has_common, month_name, now, nowdate, replace_newlines, sendmail, set_default, str_esc_quote, user_format, validate_email_add
|
||||
from webnotes.model import db_exists
|
||||
from webnotes.model.doc import Document, addchild, removechild, getchildren, make_autoname, SuperDocType
|
||||
from webnotes.model.doclist import getlist, copy_doclist
|
||||
from webnotes.model.code import get_obj, get_server_obj, run_server_obj, updatedb, check_syntax
|
||||
from webnotes import session, form, is_testing, msgprint, errprint
|
||||
|
||||
set = webnotes.conn.set
|
||||
sql = webnotes.conn.sql
|
||||
get_value = webnotes.conn.get_value
|
||||
in_transaction = webnotes.conn.in_transaction
|
||||
convert_to_lists = webnotes.conn.convert_to_lists
|
||||
|
||||
# -----------------------------------------------------------------------------------------
|
||||
|
||||
|
||||
class DocType:
|
||||
def __init__(self, doc, doclist=[]):
|
||||
self.doc = doc
|
||||
self.doclist = doclist
|
||||
self.prwise_cost = {}
|
||||
|
||||
def check_mandatory(self):
|
||||
""" Check mandatory fields """
|
||||
if not self.doc.from_pr_date or not self.doc.to_pr_date:
|
||||
msgprint("Please enter From and To PR Date", raise_exception=1)
|
||||
|
||||
if not self.doc.currency:
|
||||
msgprint("Please enter Currency.", raise_exception=1)
|
||||
|
||||
|
||||
def get_purchase_receipts(self):
|
||||
""" Get purchase receipts for given period """
|
||||
|
||||
self.doc.clear_table(self.doclist,'lc_pr_details',1)
|
||||
if not self.doc.from_pr_date or not self.doc.to_pr_date:
|
||||
msgprint("Please enter From and To PR Date")
|
||||
raise Exception
|
||||
if not self.doc.currency:
|
||||
msgprint("Please enter Currency.")
|
||||
raise Exception
|
||||
pr = sql("select name from `tabPurchase Receipt` where docstatus = 1 and posting_date >= '%s' and posting_date <= '%s' and currency = '%s' order by name "%(self.doc.from_pr_date,self.doc.to_pr_date,self.doc.currency), as_dict = 1)
|
||||
self.check_mandatory()
|
||||
|
||||
pr = sql("select name from `tabPurchase Receipt` where docstatus = 1 and posting_date >= '%s' and posting_date <= '%s' and currency = '%s' order by name " % (self.doc.from_pr_date, self.doc.to_pr_date, self.doc.currency), as_dict = 1)
|
||||
if len(pr)>200:
|
||||
msgprint("Please enter date of shorter duration as there are too many purchase receipt, hence it cannot be loaded.")
|
||||
raise Exception
|
||||
msgprint("Please enter date of shorter duration as there are too many purchase receipt, hence it cannot be loaded.", raise_exception=1)
|
||||
|
||||
for i in pr:
|
||||
if i and i['name']:
|
||||
pr_no = addchild(self.doc, 'lc_pr_details', 'LC PR Detail', 1, self.doclist)
|
||||
pr_no.purchase_receipt_no = i and i['name'] or ''
|
||||
pr_no.save()
|
||||
ch = addchild(self.doc, 'lc_pr_details', 'LC PR Detail', 1, self.doclist)
|
||||
ch.purchase_receipt = i and i['name'] or ''
|
||||
ch.save()
|
||||
|
||||
|
||||
def update_pr_lc_se(self):
|
||||
lst = []
|
||||
condition = ' name in('
|
||||
|
||||
amt = 0
|
||||
for d in getlist(self.doclist, 'lc_pr_details'):
|
||||
|
||||
if cint(d.include_in_landed_cost) == 1:
|
||||
condition += '"'+d.purchase_receipt_no+'",'
|
||||
lst.append(d.purchase_receipt_no)
|
||||
condition += '"")'
|
||||
|
||||
amount = sql("SELECT SUM(net_total) FROM `tabPurchase Receipt` WHERE docstatus = 1 AND %s"%condition)
|
||||
amt = amount and flt(amount[0][0]) or 0
|
||||
for lc in getlist(self.doclist, 'landed_cost_details'):
|
||||
for name in lst:
|
||||
pr_oc_det = sql("select name from `tabPurchase Tax Detail` where parent = %s and category = 'For Valuation' and add_deduct_tax = 'Add' and charge_type = 'Actual' and account_head = %s ",(name, lc.account_head))
|
||||
#obj = get_obj('Purchase Receipt', name, with_children = 1)
|
||||
if not pr_oc_det:
|
||||
obj = get_obj('Purchase Receipt', name, with_children = 1)
|
||||
lgth = cint(sql("select count(name) from `tabPurchase Tax Detail` where parent = '%s' "%(name))[0][0])
|
||||
pr_oc = addchild(obj.doc, 'purchase_tax_details', 'Purchase Tax Detail', 1)
|
||||
pr_oc.category = 'For Valuation'
|
||||
pr_oc.add_deduct_tax = 'Add'
|
||||
pr_oc.charge_type = 'Actual'
|
||||
pr_oc.description = lc.description
|
||||
pr_oc.account_head = lc.account_head
|
||||
pr_oc.rate = flt(flt(lc.amount) * flt(obj.doc.net_total/ amt))
|
||||
pr_oc.tax_amount = flt(flt(lc.amount) * flt(obj.doc.net_total/ amt))
|
||||
pr_oc.total = obj.doc.grand_total
|
||||
pr_oc.docstatus = 1
|
||||
pr_oc.idx = cint(lgth)
|
||||
pr_oc.save()
|
||||
else:
|
||||
obj = get_obj('Purchase Receipt', name)
|
||||
sql("update `tabPurchase Tax Detail` set rate = %s, tax_amount = %s where name = %s and parent = %s",(flt(flt(lc.amount) * flt(obj.doc.net_total/ amt)),flt(flt(lc.amount) * flt(obj.doc.net_total/ amt)),pr_oc_det[0][0],name))
|
||||
|
||||
self.calc_pr_other_charges(name)
|
||||
obj = get_obj('Purchase Receipt', name, with_children = 1)
|
||||
for d in getlist(obj.doclist, 'purchase_receipt_details'):
|
||||
if flt(d.qty):
|
||||
d.valuation_rate = (flt(d.purchase_rate) + (flt(d.rm_supp_cost) / flt(d.qty)) + (flt(d.item_tax_amount)/flt(d.qty))) / flt(d.conversion_factor)
|
||||
d.save()
|
||||
sql("update `tabStock Ledger Entry` set incoming_rate = '%s' where voucher_detail_no = '%s'"%(flt(d.valuation_rate), d.name))
|
||||
|
||||
bin_name = sql("select t1.name, t2.name, t2.posting_date, t2.posting_time from `tabBin` t1, `tabStock Ledger Entry` t2 where t2.voucher_detail_no = '%s' and t2.item_code = t1.item_code and t2.warehouse = t1.warehouse LIMIT 1"%(d.name))
|
||||
if bin_name and bin_name[0][0]:
|
||||
obj = get_obj('Bin', bin_name[0][0]).update_item_valuation(bin_name[0][1], bin_name[0][2], bin_name[0][3])
|
||||
|
||||
# now distribute the taxes among the PRs
|
||||
for lc in getlist(self.doclist, 'landed_cost_details'):
|
||||
for d in lst:
|
||||
pr_id = d.purchase_receipt_no
|
||||
|
||||
# load the purchase receipt object
|
||||
pr = get_obj('Purchase Receipt', pr_id, with_children = 1)
|
||||
|
||||
# get the tax detail (for valuation) in the PR if it exists
|
||||
pr_oc_det = sql("select name from `tabPurchase Tax Detail` where parent = %s and category = 'For Valuation' and add_deduct_tax = 'Add' and charge_type = 'Actual' and account_head = %s ",(pr_id, lc.account_head))
|
||||
|
||||
# update tax rate and tax amount
|
||||
tax_amount = flt(flt(lc.amount) * flt(pr.doc.net_total/ amt))
|
||||
|
||||
# for display
|
||||
d.net_total = pr.doc.net_total
|
||||
d.added_cost = tax_amount
|
||||
d.save()
|
||||
|
||||
# if not exist, create the tax detail for valuation
|
||||
if not pr_oc_det:
|
||||
lgth = cint(sql("select count(name) from `tabPurchase Tax Detail` where parent = '%s' "%(pr_id))[0][0])
|
||||
pr_oc = addchild(pr.doc, 'purchase_tax_details', 'Purchase Tax Detail', 1)
|
||||
pr_oc.category = 'For Valuation'
|
||||
pr_oc.add_deduct_tax = 'Add'
|
||||
pr_oc.charge_type = 'Actual'
|
||||
pr_oc.description = lc.description
|
||||
pr_oc.account_head = lc.account_head
|
||||
pr_oc.rate = tax_amount
|
||||
pr_oc.tax_amount = tax_amount
|
||||
pr_oc.total = obj.doc.grand_total
|
||||
pr_oc.docstatus = 1
|
||||
pr_oc.idx = cint(lgth)
|
||||
pr_oc.save()
|
||||
else:
|
||||
obj = get_obj('Purchase Receipt', name)
|
||||
sql("update `tabPurchase Tax Detail` set rate = %s, tax_amount = %s where name = %s and parent = %s", \
|
||||
(tax_amount, tax_amount, pr_oc_det[0][0], pr_id))
|
||||
|
||||
self.calc_pr_other_charges(name)
|
||||
|
||||
# reload - and update the stock entries with the
|
||||
# additional valuations
|
||||
|
||||
obj = get_obj('Purchase Receipt', name, with_children = 1)
|
||||
for d in getlist(obj.doclist, 'purchase_receipt_details'):
|
||||
if flt(d.qty):
|
||||
d.valuation_rate = (flt(d.purchase_rate) + (flt(d.rm_supp_cost) / flt(d.qty)) + (flt(d.item_tax_amount)/flt(d.qty))) / flt(d.conversion_factor)
|
||||
d.save()
|
||||
sql("update `tabStock Ledger Entry` set incoming_rate = '%s' where voucher_detail_no = '%s'"%(flt(d.valuation_rate), d.name))
|
||||
bin_name = sql("select t1.name, t2.name, t2.posting_date, t2.posting_time from `tabBin` t1, `tabStock Ledger Entry` t2 where t2.voucher_detail_no = '%s' and t2.item_code = t1.item_code and t2.warehouse = t1.warehouse LIMIT 1"%(d.name))
|
||||
|
||||
# update valuation of the item
|
||||
if bin_name and bin_name[0][0]:
|
||||
obj = get_obj('Bin', bin_name[0][0]).update_item_valuation(bin_name[0][1], bin_name[0][2], bin_name[0][3])
|
||||
|
||||
def add_deduct_taxes(self, ocd, oc, tax_amount, total_amount, total, prev_total, f=1):
|
||||
ocd[oc].total_amount = flt(tax_amount.toFixed(2))
|
||||
ocd[oc].total_tax_amount = flt(prev_total.toFixed(2))
|
||||
ocd[oc].tax_amount += flt(tax_amount.toFixed(2))
|
||||
|
||||
total_amount = flt(ocd[oc].tax_amount)
|
||||
total_tax_amount = flt(ocd[oc].total_tax_amount) + (f * flt(total_amount))
|
||||
|
||||
if ocd[oc].category != "For Valuation":
|
||||
prev_total += f * flt(ocd[oc].total_amount)
|
||||
total += f * flt(ocd[oc].tax_amount)
|
||||
ocd[oc].total = flt(total) + (f * flt(tax[t].tax_amount))
|
||||
else:
|
||||
prev_total = prev_total
|
||||
ocd[oc].total = flt(total)
|
||||
if ocd[oc].category != "For Total":
|
||||
item_tax += f * ocd[oc].total_amount
|
||||
ocd[oc].save()
|
||||
|
||||
return total, prev_total
|
||||
|
||||
# calculate the taxes for these PRs
|
||||
def calc_pr_other_charges(self, name):
|
||||
|
||||
# re-calculate other charges
|
||||
obj = get_obj('Purchase Receipt', name, with_children = 1)
|
||||
total = 0
|
||||
net_total = obj.doc.net_total
|
||||
|
||||
|
||||
for prd in getlist(obj.doclist, 'purchase_receipt_details'):
|
||||
prev_total, item_tax = flt(prd.amount), 0
|
||||
total += flt(flt(prd.qty) * flt(prd.purchase_rate))
|
||||
|
||||
check_tax = prd.item_tax_rate and eval(prd.item_tax_rate) or {}
|
||||
ocd = getlist(obj.doclist, 'purchase_tax_details')
|
||||
|
||||
# calculate tax for other charges
|
||||
for oc in range(len(ocd)):
|
||||
if check_tax.get(ocd[oc].account_head) and ocd[oc].charge_type != 'Actual':
|
||||
rate = check_tax[ocd[oc].account_head]
|
||||
else:
|
||||
rate = flt(ocd[oc].rate)
|
||||
|
||||
tax_amount = self.cal_tax(ocd, prd, rate, net_total, oc)
|
||||
if ocd[oc].add_deduct_tax == 'Add':
|
||||
add_deduct_taxes(self, ocd, oc, tax_amount, total_amount, total, prev_total, f=1)
|
||||
|
||||
elif ocd[oc].add_deduct_tax == 'Deduct':
|
||||
add_deduct_taxes(self, ocd, oc, tax_amount, total_amount, total, prev_total, f=-1)
|
||||
|
||||
prd.item_tax_amount = flt(item_tax)
|
||||
prd.save()
|
||||
obj.doc.save()
|
||||
|
||||
def cal_tax(self, ocd, prd, rate, net_total, oc):
|
||||
tax_amount = 0
|
||||
if ocd[oc].charge_type == 'Actual':
|
||||
value = flt(flt(rate) / flt(net_total))
|
||||
return flt(flt(value) * flt(prd.amount))
|
||||
|
||||
elif ocd[oc].charge_type == 'On Net Total':
|
||||
return flt(flt(rate) * flt(prd.amount) / 100)
|
||||
|
||||
elif ocd[oc].charge_type == 'On Previous Row Amount':
|
||||
|
||||
row_no = cstr(ocd[oc].row_id)
|
||||
row = (row_no).split("+")
|
||||
for r in range(0, len(row.length)):
|
||||
id = cint(row[r])
|
||||
tax_amount += flt((flt(rate) * flt(ocd[id-1].total_amount) / 100))
|
||||
row_id = row_no.find("/")
|
||||
if row_id != -1:
|
||||
rate = ''
|
||||
row = (row_no).split("/")
|
||||
|
||||
id1 = cint(row[0])
|
||||
id2 = cint(row[1])
|
||||
tax_amount = flt(flt(ocd[id1-1].total_amount) / flt(ocd[id2-1].total_amount))
|
||||
|
||||
return tax_amount
|
||||
|
||||
# get details for landed cost table from master
|
||||
# ---------------------------------------------
|
||||
def get_landed_cost_master_details(self):
|
||||
""" pull details from landed cost master"""
|
||||
self.doc.clear_table(self.doclist, 'landed_cost_details')
|
||||
idx = 0
|
||||
landed_cost = sql("select account_head, description from `tabLanded Cost Master Detail` where parent=%s", (self.doc.landed_cost), as_dict = 1)
|
||||
@ -238,3 +49,177 @@ class DocType:
|
||||
lct = addchild(self.doc, 'landed_cost_details', 'Landed Cost Detail', 1, self.doclist)
|
||||
lct.account_head = cost['account_head']
|
||||
lct.description = cost['description']
|
||||
|
||||
|
||||
def get_selected_pr(self):
|
||||
""" Get selected purchase receipt no """
|
||||
self.selected_pr = [d.purchase_receipt for d in getlist(self.doclist, 'lc_pr_details') if d.select_pr]
|
||||
if not self.selected_pr:
|
||||
msgprint("Please select atleast one PR to proceed.", raise_exception=1)
|
||||
|
||||
def validate_selected_pr(self):
|
||||
"""Validate selected PR as submitted"""
|
||||
invalid_pr = sql("SELECT name FROM `tabPurchase Receipt` WHERE docstatus != 1 and name in (%s)" % ("'" + "', '".join(self.selected_pr) + "'"))
|
||||
if invalid_pr:
|
||||
msgprint("Selected purchase receipts must be submitted. Following PR are not submitted: %s" % invalid_pr, raise_exception=1)
|
||||
|
||||
|
||||
def get_total_amt(self):
|
||||
""" Get sum of net total of all selected PR"""
|
||||
return sql("SELECT SUM(net_total) FROM `tabPurchase Receipt` WHERE name in (%s)" % ("'" + "', '".join(self.selected_pr) + "'"))[0][0]
|
||||
|
||||
|
||||
def add_charges_in_pr(self):
|
||||
""" Add additional charges in selected pr proportionately"""
|
||||
total_amt = self.get_total_amt()
|
||||
|
||||
for pr in self.selected_pr:
|
||||
pr_obj = get_obj('Purchase Receipt', pr, with_children = 1)
|
||||
cumulative_grand_total = flt(pr_obj.doc.grand_total)
|
||||
|
||||
for lc in getlist(self.doclist, 'landed_cost_details'):
|
||||
amt = flt(lc.amount) * flt(pr_obj.doc.net_total)/ flt(total_amt)
|
||||
self.prwise_cost[pr] = self.prwise_cost.get(pr, 0) + amt
|
||||
cumulative_grand_total += amt
|
||||
|
||||
pr_oc_row = sql("select name from `tabPurchase Tax Detail` where parent = %s and category = 'For Valuation' and add_deduct_tax = 'Add' and charge_type = 'Actual' and account_head = %s",(pr, lc.account_head))
|
||||
if not pr_oc_row: # add if not exists
|
||||
ch = addchild(pr_obj.doc, 'purchase_tax_details', 'Purchase Tax Detail', 1)
|
||||
ch.category = 'For Valuation'
|
||||
ch.add_deduct_tax = 'Add'
|
||||
ch.charge_type = 'Actual'
|
||||
ch.description = lc.description
|
||||
ch.account_head = lc.account_head
|
||||
ch.rate = amt
|
||||
ch.tax_amount = amt
|
||||
ch.total = cumulative_grand_total
|
||||
ch.docstatus = 1
|
||||
ch.idx = 500 # add at the end
|
||||
ch.save(1)
|
||||
else: # overwrite if exists
|
||||
sql("update `tabPurchase Tax Detail` set rate = %s, tax_amount = %s where name = %s and parent = %s ", (amt, amt, pr_oc_row[0][0], pr))
|
||||
|
||||
|
||||
def reset_other_charges(self, pr_obj):
|
||||
""" Reset all calculated values to zero"""
|
||||
for t in getlist(pr_obj.doclist, 'purchase_tax_details'):
|
||||
t.total_tax_amount = 0;
|
||||
t.total_amount = 0;
|
||||
t.tax_amount = 0;
|
||||
t.total = 0;
|
||||
t.save()
|
||||
|
||||
|
||||
def cal_charges_and_item_tax_amt(self):
|
||||
""" Re-calculates other charges values and itemwise tax amount for getting valuation rate"""
|
||||
for pr in self.selected_pr:
|
||||
obj = get_obj('Purchase Receipt', pr, with_children = 1)
|
||||
total = 0
|
||||
self.reset_other_charges(obj)
|
||||
|
||||
for prd in getlist(obj.doclist, 'purchase_receipt_details'):
|
||||
prev_total, item_tax = flt(prd.amount), 0
|
||||
total += flt(prd.qty) * flt(prd.purchase_rate)
|
||||
|
||||
item_tax_rate = prd.item_tax_rate and eval(prd.item_tax_rate) or {}
|
||||
|
||||
ocd = getlist(obj.doclist, 'purchase_tax_details')
|
||||
# calculate tax for other charges
|
||||
for oc in range(len(ocd)):
|
||||
# Get rate : consider if diff for this item
|
||||
if item_tax_rate.get(ocd[oc].account_head) and ocd[oc].charge_type != 'Actual':
|
||||
rate = item_tax_rate[ocd[oc].account_head]
|
||||
else:
|
||||
rate = flt(ocd[oc].rate)
|
||||
|
||||
tax_amount = self.cal_tax(ocd, prd, rate, obj.doc.net_total, oc)
|
||||
total, prev_total, item_tax = self.add_deduct_taxes(ocd, oc, tax_amount, total, prev_total, item_tax)
|
||||
|
||||
prd.item_tax_amount = flt(item_tax)
|
||||
prd.save()
|
||||
obj.doc.save()
|
||||
|
||||
|
||||
def cal_tax(self, ocd, prd, rate, net_total, oc):
|
||||
""" Calculates tax amount for one item"""
|
||||
tax_amount = 0
|
||||
if ocd[oc].charge_type == 'Actual':
|
||||
tax_amount = flt(rate) * flt(prd.amount) / flt(net_total)
|
||||
elif ocd[oc].charge_type == 'On Net Total':
|
||||
tax_amount = flt(rate) * flt(prd.amount) / 100
|
||||
elif ocd[oc].charge_type == 'On Previous Row Amount':
|
||||
row_no = cstr(ocd[oc].row_id)
|
||||
row = row_no.split("+")
|
||||
for r in range(0, len(row)):
|
||||
id = cint(row[r])
|
||||
tax_amount += flt((flt(rate) * flt(ocd[id-1].total_amount) / 100))
|
||||
row_id = row_no.find("/")
|
||||
if row_id != -1:
|
||||
rate = ''
|
||||
row = (row_no).split("/")
|
||||
id1 = cint(row[0])
|
||||
id2 = cint(row[1])
|
||||
tax_amount = flt(flt(ocd[id1-1].total_amount) / flt(ocd[id2-1].total_amount))
|
||||
elif ocd[oc].charge_type == 'On Previous Row Total':
|
||||
row = cint(ocd[oc].row_id)
|
||||
if ocd[row-1].add_deduct_tax == 'Add':
|
||||
tax_amount = flt(rate) * (flt(ocd[row-1].total_tax_amount)+flt(ocd[row-1].total_amount)) / 100
|
||||
elif ocd[row-1].add_deduct_tax == 'Deduct':
|
||||
tax_amount = flt(rate) * (flt(ocd[row-1].total_tax_amount)-flt(ocd[row-1].total_amount)) / 100
|
||||
|
||||
return tax_amount
|
||||
|
||||
def add_deduct_taxes(self, ocd, oc, tax_amount, total, prev_total, item_tax):
|
||||
"""Calculates other charges values"""
|
||||
add_ded = ocd[oc].add_deduct_tax == 'Add' and 1 or ocd[oc].add_or_deduct == 'Deduct' and -1
|
||||
ocd[oc].total_amount = flt(tax_amount)
|
||||
ocd[oc].total_tax_amount = flt(prev_total)
|
||||
ocd[oc].tax_amount += flt(tax_amount)
|
||||
|
||||
total_amount = flt(ocd[oc].tax_amount)
|
||||
total_tax_amount = flt(ocd[oc].total_tax_amount) + (add_ded * flt(total_amount))
|
||||
|
||||
if ocd[oc].category != "For Valuation":
|
||||
prev_total += add_ded * flt(ocd[oc].total_amount)
|
||||
total += add_ded * flt(ocd[oc].tax_amount)
|
||||
ocd[oc].total = total
|
||||
else:
|
||||
prev_total = prev_total
|
||||
ocd[oc].total = flt(total)
|
||||
ocd[oc].save()
|
||||
|
||||
if ocd[oc].category != "For Total":
|
||||
item_tax += add_ded * ocd[oc].total_amount
|
||||
|
||||
return total, prev_total, item_tax
|
||||
|
||||
|
||||
def update_sle(self):
|
||||
""" Recalculate valuation rate in all sle after pr posting date"""
|
||||
for pr in self.selected_pr:
|
||||
pr_obj = get_obj('Purchase Receipt', pr, with_children = 1)
|
||||
|
||||
for d in getlist(pr_obj.doclist, 'purchase_receipt_details'):
|
||||
if flt(d.qty):
|
||||
d.valuation_rate = (flt(d.purchase_rate) + (flt(d.rm_supp_cost)/flt(d.qty)) + (flt(d.item_tax_amount)/flt(d.qty))) / flt(d.conversion_factor)
|
||||
d.save()
|
||||
sql("update `tabStock Ledger Entry` set incoming_rate = '%s' where voucher_detail_no = '%s'"%(flt(d.valuation_rate), d.name))
|
||||
|
||||
bin = sql("select t1.name, t2.posting_date, t2.posting_time from `tabBin` t1, `tabStock Ledger Entry` t2 where t2.voucher_detail_no = '%s' and t2.item_code = t1.item_code and t2.warehouse = t1.warehouse LIMIT 1" % d.name)
|
||||
|
||||
# update valuation rate after pr posting date
|
||||
if bin and bin[0][0]:
|
||||
obj = get_obj('Bin', bin[0][0]).update_entries_after(bin[0][1], bin[0][2])
|
||||
|
||||
|
||||
def update_landed_cost(self):
|
||||
"""
|
||||
Add extra cost and recalculate all values in pr,
|
||||
Recalculate valuation rate in all sle after pr posting date
|
||||
"""
|
||||
self.get_selected_pr()
|
||||
self.validate_selected_pr()
|
||||
self.add_charges_in_pr()
|
||||
self.cal_charges_and_item_tax_amt()
|
||||
self.update_sle()
|
||||
msgprint("Landed Cost updated successfully")
|
||||
|
@ -3,16 +3,18 @@
|
||||
|
||||
# These values are common in all dictionaries
|
||||
{
|
||||
'creation': '2010-08-08 17:09:07',
|
||||
'creation': '2011-11-16 16:17:22',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-06-30 18:47:46',
|
||||
'modified': '2011-11-16 16:32:18',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'wasim@webnotestech.com'
|
||||
},
|
||||
|
||||
# These values are common for all DocType
|
||||
{
|
||||
'_last_update': '1321441191',
|
||||
'colour': 'White:FFF',
|
||||
'default_print_format': 'Standard',
|
||||
'doctype': 'DocType',
|
||||
'issingle': 1,
|
||||
'module': 'Stock',
|
||||
@ -20,7 +22,7 @@
|
||||
'section_style': 'Simple',
|
||||
'server_code_error': ' ',
|
||||
'show_in_menu': 1,
|
||||
'version': 31
|
||||
'version': 35
|
||||
},
|
||||
|
||||
# These values are common for all DocField
|
||||
@ -52,7 +54,6 @@
|
||||
# DocPerm
|
||||
{
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 1,
|
||||
'permlevel': 0,
|
||||
'role': 'All',
|
||||
'write': 0
|
||||
@ -64,7 +65,6 @@
|
||||
'cancel': 0,
|
||||
'create': 1,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 2,
|
||||
'permlevel': 0,
|
||||
'role': 'Purchase Manager',
|
||||
'submit': 0,
|
||||
@ -75,7 +75,6 @@
|
||||
{
|
||||
'create': 1,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 3,
|
||||
'permlevel': 0,
|
||||
'role': 'System Manager',
|
||||
'write': 1
|
||||
@ -85,7 +84,6 @@
|
||||
{
|
||||
'create': 1,
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 4,
|
||||
'permlevel': 0,
|
||||
'role': 'Purchase User',
|
||||
'write': 1
|
||||
@ -94,7 +92,6 @@
|
||||
# DocPerm
|
||||
{
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 5,
|
||||
'permlevel': 1,
|
||||
'role': 'All'
|
||||
},
|
||||
@ -102,7 +99,6 @@
|
||||
# DocPerm
|
||||
{
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 6,
|
||||
'permlevel': 1,
|
||||
'role': 'System Manager'
|
||||
},
|
||||
@ -110,7 +106,6 @@
|
||||
# DocPerm
|
||||
{
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 7,
|
||||
'permlevel': 1,
|
||||
'role': 'Purchase User'
|
||||
},
|
||||
@ -118,17 +113,30 @@
|
||||
# DocPerm
|
||||
{
|
||||
'doctype': 'DocPerm',
|
||||
'idx': 8,
|
||||
'permlevel': 1,
|
||||
'role': 'Purchase Manager'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'HTML',
|
||||
'label': 'Process',
|
||||
'options': '<div class="field_description"><b>Process:</b><br>1. Fetch and select Purchase Receipt<br>2. Enter extra costs<br>3. Click on Update Landed Cost button<br> 4. Cost will be added into other charges table of selected PR proportionately based on net total<br>5. Item Valuation Rate will be recalculated</div>'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'options': 'Simple'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'from_pr_date',
|
||||
'fieldtype': 'Date',
|
||||
'idx': 1,
|
||||
'label': 'From PR Date',
|
||||
'reqd': 1
|
||||
},
|
||||
@ -138,7 +146,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'to_pr_date',
|
||||
'fieldtype': 'Date',
|
||||
'idx': 2,
|
||||
'label': 'To PR Date',
|
||||
'reqd': 1
|
||||
},
|
||||
@ -148,7 +155,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'currency',
|
||||
'fieldtype': 'Select',
|
||||
'idx': 3,
|
||||
'label': 'Currency',
|
||||
'options': 'link:Currency',
|
||||
'reqd': 1
|
||||
@ -158,26 +164,15 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Button',
|
||||
'idx': 4,
|
||||
'label': 'Get Purchase Receipt',
|
||||
'options': 'get_purchase_receipts'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'idx': 5,
|
||||
'label': 'LC PR Detail',
|
||||
'options': 'Simple'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'lc_pr_details',
|
||||
'fieldtype': 'Table',
|
||||
'idx': 6,
|
||||
'label': 'LC PR Details',
|
||||
'options': 'LC PR Detail'
|
||||
},
|
||||
@ -186,8 +181,6 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Section Break',
|
||||
'idx': 7,
|
||||
'label': 'Landed Cost Detail',
|
||||
'options': 'Simple'
|
||||
},
|
||||
|
||||
@ -196,7 +189,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'landed_cost',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 8,
|
||||
'label': 'Select Landed Cost Details Master',
|
||||
'options': 'Landed Cost Master'
|
||||
},
|
||||
@ -206,7 +198,6 @@
|
||||
'colour': 'White:FFF',
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Button',
|
||||
'idx': 9,
|
||||
'label': 'Get Details',
|
||||
'options': 'get_landed_cost_master_details'
|
||||
},
|
||||
@ -216,7 +207,6 @@
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'landed_cost_details',
|
||||
'fieldtype': 'Table',
|
||||
'idx': 10,
|
||||
'label': 'Landed Cost Details',
|
||||
'options': 'Landed Cost Detail'
|
||||
},
|
||||
@ -225,8 +215,7 @@
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldtype': 'Button',
|
||||
'idx': 11,
|
||||
'label': 'Update PR',
|
||||
'options': 'update_pr_lc_se'
|
||||
'options': 'update_landed_cost'
|
||||
}
|
||||
]
|
@ -5,7 +5,7 @@
|
||||
{
|
||||
'creation': '2010-08-08 17:09:07',
|
||||
'docstatus': 0,
|
||||
'modified': '2011-06-30 18:47:22',
|
||||
'modified': '2011-11-16 16:10:00',
|
||||
'modified_by': 'Administrator',
|
||||
'owner': 'wasim@webnotestech.com'
|
||||
},
|
||||
@ -13,6 +13,7 @@
|
||||
# These values are common for all DocType
|
||||
{
|
||||
'colour': 'White:FFF',
|
||||
'default_print_format': 'Standard',
|
||||
'doctype': 'DocType',
|
||||
'istable': 1,
|
||||
'module': 'Stock',
|
||||
@ -20,7 +21,7 @@
|
||||
'section_style': 'Simple',
|
||||
'server_code_error': ' ',
|
||||
'show_in_menu': 0,
|
||||
'version': 2
|
||||
'version': 5
|
||||
},
|
||||
|
||||
# These values are common for all DocField
|
||||
@ -42,25 +43,23 @@
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'purchase_receipt_no',
|
||||
'fieldname': 'purchase_receipt',
|
||||
'fieldtype': 'Link',
|
||||
'idx': 1,
|
||||
'label': 'Purchase Receipt No',
|
||||
'label': 'Purchase Receipt',
|
||||
'oldfieldname': 'purchase_receipt_no',
|
||||
'oldfieldtype': 'Link',
|
||||
'options': 'Purchase Receipt',
|
||||
'search_index': 1
|
||||
'width': '220px'
|
||||
},
|
||||
|
||||
# DocField
|
||||
{
|
||||
'doctype': 'DocField',
|
||||
'fieldname': 'include_in_landed_cost',
|
||||
'fieldname': 'select_pr',
|
||||
'fieldtype': 'Check',
|
||||
'idx': 2,
|
||||
'label': 'Include In Landed Cost',
|
||||
'label': 'Select PR',
|
||||
'oldfieldname': 'include_in_landed_cost',
|
||||
'oldfieldtype': 'Check',
|
||||
'width': '150px'
|
||||
'width': '120px'
|
||||
}
|
||||
]
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user