Merge branch 'stable' of github.com:webnotes/erpnext into stable

This commit is contained in:
Rushabh Mehta 2011-08-30 16:02:51 +05:30
commit d8cae39a8b
9 changed files with 143 additions and 170 deletions

View File

@ -1,17 +1,15 @@
report.customize_filters = function() {
//this.hide_all_filters();
this.mytabs.items['Select Columns'].hide();
this.mytabs.items['More Filters'].hide();
this.add_filter({fieldname:'period', label:'Period', fieldtype:'Select', options:'Monthly'+NEWLINE+'Quarterly'+NEWLINE+'Half Yearly'+NEWLINE+'Annual',report_default:'Quarterly',ignore : 1, parent:'Budget Detail'});
this.add_filter({fieldname:'company', label:'Company', fieldtype:'Link', options:'Company', report_default:sys_defaults.company, ignore : 1, parent:'Budget Detail', in_first_page:1});
this.filter_fields_dict['Budget Detail'+FILTER_SEP +'Fiscal Year'].df.in_first_page = 1;
this.filter_fields_dict['Budget Detail'+FILTER_SEP +'Period'].df.in_first_page = 1;
this.filter_fields_dict['Budget Detail'+FILTER_SEP +'Fiscal Year'].df['report_default'] = sys_defaults.fiscal_year;
}
report.aftertableprint = function(t) {
$yt(t,'*',1,{whiteSpace:'pre'});
}
this.mytabs.items['More Filters'].hide();
this.mytabs.items['Select Columns'].hide();

View File

@ -131,11 +131,6 @@ def append_colnames(name, colnames, coltypes, colwidths, coloptions, col_idx):
col_idx[str(c) + n ] = len(colnames) - 1
# make default columns
#coltypes[col_idx[based_on]] = 'Link'
#coloptions[col_idx[based_on]]= based_on
# get start date
start_date = get_value('Fiscal Year', fiscal_year, 'year_start_date')
if not start_date:
@ -162,7 +157,7 @@ for r in res:
ch = make_child_lst(based_on,r[0].strip())
actual = sql("select sum(ifnull(t1.debit,0))-sum(ifnull(t1.credit,0)) from `tabGL Entry` t1, `tabAccount` t2 where t2.is_pl_account = 'Yes' and t1.is_cancelled = 'No' and t1.cost_center in %s and t2.debit_or_credit = 'Debit' and t1.posting_date between '%s' and '%s' and t1.account = t2.name"%(ch, mon_list[count][data['start_date']], mon_list[count][data['end_date']]))
actual = sql("select sum(ifnull(t1.debit,0))-sum(ifnull(t1.credit,0)) from `tabGL Entry` t1, `tabAccount` t2 where ifnull(t2.is_pl_account, 'No') = 'Yes' and ifnull(t1.is_cancelled, 'No') = 'No' and t1.cost_center in %s and t2.debit_or_credit = 'Debit' and t1.posting_date between '%s' and '%s' and t1.account = t2.name"%(ch, mon_list[count][data['start_date']], mon_list[count][data['end_date']]))
#----------------------------------------------------------
actual = flt(actual[0][0])

View File

@ -1 +1,10 @@
SELECT CONCAT(REPEAT(' ', COUNT(parent.name) - 1), node.name) AS name FROM `tabCost Center` AS node,`tabCost Center` AS parent WHERE node.lft BETWEEN parent.lft AND parent.rgt AND node.docstatus !=2 GROUP BY node.name ORDER BY node.lft
SELECT
CONCAT(REPEAT(' ', COUNT(parent.name) - 1), node.name) AS name
FROM
`tabCost Center` AS node,`tabCost Center` AS parent
WHERE
node.lft BETWEEN parent.lft AND parent.rgt
AND node.docstatus !=2
AND node.company_name like '%(company)s%%'
GROUP BY node.name
ORDER BY node.lft

View File

@ -3,9 +3,9 @@
# These values are common in all dictionaries
{
'creation': '2011-02-17 11:16:08',
'creation': '2010-08-08 17:08:59',
'docstatus': 0,
'modified': '2011-06-27 14:39:04',
'modified': '2011-08-11 17:27:12',
'modified_by': 'Administrator',
'owner': 'Administrator'
},
@ -26,7 +26,7 @@
'show_in_menu': 0,
'subject': '%(employee_name)s',
'tag_fields': 'status',
'version': 443
'version': 444
},
# These values are common for all DocField
@ -40,12 +40,14 @@
# These values are common for all DocPerm
{
'amend': 0,
'doctype': 'DocPerm',
'name': '__common__',
'parent': 'Employee',
'parentfield': 'permissions',
'parenttype': 'DocType',
'read': 1
'read': 1,
'submit': 0
},
# DocType, Employee
@ -56,21 +58,24 @@
# DocPerm
{
'cancel': 1,
'create': 1,
'cancel': 0,
'create': 0,
'doctype': 'DocPerm',
'idx': 1,
'permlevel': 0,
'role': 'System Manager',
'write': 1
'role': 'Employee',
'write': 0
},
# DocPerm
{
'cancel': 0,
'create': 0,
'doctype': 'DocPerm',
'idx': 2,
'permlevel': 1,
'role': 'All'
'role': 'All',
'write': 0
},
# DocPerm
@ -95,22 +100,6 @@
'write': 1
},
# DocPerm
{
'doctype': 'DocPerm',
'idx': 5,
'permlevel': 1,
'role': 'HR User'
},
# DocPerm
{
'doctype': 'DocPerm',
'idx': 6,
'permlevel': 1,
'role': 'HR Manager'
},
# DocField
{
'doctype': 'DocField',
@ -141,7 +130,7 @@
'no_copy': 1,
'oldfieldname': 'naming_series',
'oldfieldtype': 'Select',
'options': 'WN-EMP\nEMP/',
'options': 'EMP/',
'permlevel': 0,
'reqd': 0
},
@ -173,8 +162,7 @@
'oldfieldname': 'employee_name',
'oldfieldtype': 'Data',
'permlevel': 0,
'reqd': 1,
'search_index': 1
'reqd': 1
},
# DocField
@ -276,7 +264,7 @@
'options': '\nActive\nLeft',
'permlevel': 0,
'reqd': 1,
'search_index': 0
'search_index': 1
},
# DocField
@ -409,8 +397,7 @@
'oldfieldtype': 'Link',
'options': 'Department',
'permlevel': 0,
'reqd': 1,
'search_index': 1
'reqd': 1
},
# DocField
@ -474,21 +461,11 @@
'reqd': 0
},
# DocField
{
'doctype': 'DocField',
'fieldname': 'is_sales_person',
'fieldtype': 'Check',
'idx': 27,
'label': 'Is Sales Person',
'permlevel': 0
},
# DocField
{
'doctype': 'DocField',
'fieldtype': 'Column Break',
'idx': 28,
'idx': 27,
'label': 'Salary Information',
'oldfieldtype': 'Section Break',
'permlevel': 0,
@ -501,11 +478,11 @@
'doctype': 'DocField',
'fieldname': 'salary_mode',
'fieldtype': 'Select',
'idx': 29,
'idx': 28,
'label': 'Salary Mode',
'oldfieldname': 'salary_mode',
'oldfieldtype': 'Select',
'options': '\nBank\nCash \nCheque',
'options': '\nBank\nCash\nCheque',
'permlevel': 0,
'trigger': 'Client'
},
@ -518,7 +495,7 @@
'fieldname': 'bank_name',
'fieldtype': 'Data',
'hidden': 0,
'idx': 30,
'idx': 29,
'in_filter': 1,
'label': 'Bank Name',
'oldfieldname': 'bank_name',
@ -535,7 +512,7 @@
'fieldname': 'bank_ac_no',
'fieldtype': 'Data',
'hidden': 0,
'idx': 31,
'idx': 30,
'label': 'Bank A/C No.',
'oldfieldname': 'bank_ac_no',
'oldfieldtype': 'Data',
@ -547,7 +524,7 @@
'doctype': 'DocField',
'fieldname': 'esic_card_no',
'fieldtype': 'Data',
'idx': 32,
'idx': 31,
'label': 'ESIC CARD No',
'oldfieldname': 'esic_card_no',
'oldfieldtype': 'Data',
@ -559,7 +536,7 @@
'doctype': 'DocField',
'fieldname': 'pf_number',
'fieldtype': 'Data',
'idx': 33,
'idx': 32,
'label': 'PF Number',
'oldfieldname': 'pf_number',
'oldfieldtype': 'Data',
@ -571,7 +548,7 @@
'doctype': 'DocField',
'fieldname': 'gratuity_lic_id',
'fieldtype': 'Data',
'idx': 34,
'idx': 33,
'label': 'Gratuity LIC ID',
'oldfieldname': 'gratuity_lic_id',
'oldfieldtype': 'Data',
@ -582,7 +559,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Section Break',
'idx': 35,
'idx': 34,
'label': 'Contact Details',
'permlevel': 0
},
@ -591,7 +568,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Column Break',
'idx': 36,
'idx': 35,
'permlevel': 0,
'width': '50%'
},
@ -601,7 +578,7 @@
'doctype': 'DocField',
'fieldname': 'cell_number',
'fieldtype': 'Data',
'idx': 37,
'idx': 36,
'label': 'Cell Number',
'permlevel': 0
},
@ -611,7 +588,7 @@
'doctype': 'DocField',
'fieldname': 'personal_email',
'fieldtype': 'Data',
'idx': 38,
'idx': 37,
'label': 'Personal Email',
'permlevel': 0
},
@ -621,7 +598,7 @@
'doctype': 'DocField',
'fieldname': 'notice_number_of_days',
'fieldtype': 'Int',
'idx': 39,
'idx': 38,
'label': 'Notice - Number of Days',
'oldfieldname': 'notice_number_of_days',
'oldfieldtype': 'Int',
@ -632,7 +609,7 @@
{
'doctype': 'DocField',
'fieldtype': 'HTML',
'idx': 40,
'idx': 39,
'label': 'Emergency Contact Details',
'options': '<b>Emergency Contact Details</b>',
'permlevel': 0
@ -643,7 +620,7 @@
'doctype': 'DocField',
'fieldname': 'person_to_be_contacted',
'fieldtype': 'Data',
'idx': 41,
'idx': 40,
'label': 'Person To Be Contacted',
'permlevel': 0
},
@ -653,7 +630,7 @@
'doctype': 'DocField',
'fieldname': 'relation',
'fieldtype': 'Data',
'idx': 42,
'idx': 41,
'label': 'Relation',
'permlevel': 0
},
@ -663,7 +640,7 @@
'doctype': 'DocField',
'fieldname': 'emergency_phone_number',
'fieldtype': 'Data',
'idx': 43,
'idx': 42,
'label': 'Emergency Phone Number',
'permlevel': 0
},
@ -672,7 +649,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Column Break',
'idx': 44,
'idx': 43,
'permlevel': 0,
'width': '50%'
},
@ -682,7 +659,7 @@
'doctype': 'DocField',
'fieldname': 'permanent_accommodation_type',
'fieldtype': 'Select',
'idx': 45,
'idx': 44,
'label': 'Permanent Accommodation Type',
'options': '\nRented\nOwned',
'permlevel': 0
@ -693,7 +670,7 @@
'doctype': 'DocField',
'fieldname': 'permanent_address',
'fieldtype': 'Small Text',
'idx': 46,
'idx': 45,
'label': 'Permanent Address',
'permlevel': 0
},
@ -703,7 +680,7 @@
'doctype': 'DocField',
'fieldname': 'current_accommodation_type',
'fieldtype': 'Select',
'idx': 47,
'idx': 46,
'label': 'Current Accommodation Type',
'options': '\nRented\nOwned',
'permlevel': 0
@ -714,7 +691,7 @@
'doctype': 'DocField',
'fieldname': 'current_address',
'fieldtype': 'Small Text',
'idx': 48,
'idx': 47,
'label': 'Current Address',
'permlevel': 0
},
@ -723,7 +700,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Section Break',
'idx': 49,
'idx': 48,
'label': 'Personal Details',
'permlevel': 0
},
@ -732,7 +709,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Column Break',
'idx': 50,
'idx': 49,
'permlevel': 0,
'width': '50%'
},
@ -742,7 +719,7 @@
'doctype': 'DocField',
'fieldname': 'pan_number',
'fieldtype': 'Data',
'idx': 51,
'idx': 50,
'label': 'PAN Number',
'permlevel': 0
},
@ -752,7 +729,7 @@
'doctype': 'DocField',
'fieldname': 'passport_number',
'fieldtype': 'Data',
'idx': 52,
'idx': 51,
'label': 'Passport Number',
'permlevel': 0
},
@ -763,7 +740,7 @@
'doctype': 'DocField',
'fieldtype': 'Button',
'hidden': 1,
'idx': 53,
'idx': 52,
'label': 'Employee Profile',
'oldfieldtype': 'Button',
'permlevel': 0,
@ -775,7 +752,7 @@
'doctype': 'DocField',
'fieldname': 'date_of_issue',
'fieldtype': 'Date',
'idx': 54,
'idx': 53,
'label': 'Date of Issue',
'permlevel': 0
},
@ -785,7 +762,7 @@
'doctype': 'DocField',
'fieldname': 'valid_upto',
'fieldtype': 'Date',
'idx': 55,
'idx': 54,
'label': 'Valid Upto',
'permlevel': 0
},
@ -796,7 +773,7 @@
'doctype': 'DocField',
'fieldtype': 'Button',
'hidden': 1,
'idx': 56,
'idx': 55,
'label': 'Salary Structure',
'oldfieldtype': 'Button',
'permlevel': 0,
@ -808,7 +785,7 @@
'doctype': 'DocField',
'fieldname': 'place_of_issue',
'fieldtype': 'Data',
'idx': 57,
'idx': 56,
'label': 'Place of Issue',
'permlevel': 0
},
@ -818,7 +795,7 @@
'doctype': 'DocField',
'fieldname': 'marital_status',
'fieldtype': 'Select',
'idx': 58,
'idx': 57,
'label': 'Marital Status',
'options': '\nSingle\nMarried\nDivorced\nWidowed',
'permlevel': 0
@ -829,7 +806,7 @@
'doctype': 'DocField',
'fieldname': 'blood_group',
'fieldtype': 'Select',
'idx': 59,
'idx': 58,
'label': 'Blood Group',
'options': '\nA+\nA-\nB+\nB-\nAB+\nAB-\nO+\nO-',
'permlevel': 0
@ -839,7 +816,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Column Break',
'idx': 60,
'idx': 59,
'permlevel': 0,
'width': '50%'
},
@ -851,7 +828,7 @@
'doctype': 'DocField',
'fieldname': 'family_background',
'fieldtype': 'Small Text',
'idx': 61,
'idx': 60,
'label': 'Family Background',
'permlevel': 0
},
@ -863,7 +840,7 @@
'doctype': 'DocField',
'fieldname': 'health_details',
'fieldtype': 'Small Text',
'idx': 62,
'idx': 61,
'label': 'Health Details',
'permlevel': 0
},
@ -872,7 +849,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Section Break',
'idx': 63,
'idx': 62,
'label': 'Educational Qualification',
'permlevel': 0
},
@ -882,7 +859,7 @@
'doctype': 'DocField',
'fieldname': 'educational_qualification_details',
'fieldtype': 'Table',
'idx': 64,
'idx': 63,
'label': 'Educational Qualification Details',
'options': 'Educational Qualifications Detail',
'permlevel': 0
@ -892,7 +869,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Section Break',
'idx': 65,
'idx': 64,
'label': 'Career History',
'permlevel': 0
},
@ -901,7 +878,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Section Break',
'idx': 66,
'idx': 65,
'label': 'Previous Work Experience',
'options': 'Simple',
'permlevel': 0
@ -912,7 +889,7 @@
'doctype': 'DocField',
'fieldname': 'previous_experience_details',
'fieldtype': 'Table',
'idx': 67,
'idx': 66,
'label': 'Previous Experience Details',
'options': 'Previous Experience Detail',
'permlevel': 0
@ -922,7 +899,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Section Break',
'idx': 68,
'idx': 67,
'label': 'History In Company',
'options': 'Simple',
'permlevel': 0
@ -933,7 +910,7 @@
'doctype': 'DocField',
'fieldname': 'experience_in_company_details',
'fieldtype': 'Table',
'idx': 69,
'idx': 68,
'label': 'Experience In Company Details',
'options': 'Experience In Company Detail',
'permlevel': 0
@ -943,7 +920,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Section Break',
'idx': 70,
'idx': 69,
'label': 'Exit',
'oldfieldtype': 'Section Break',
'permlevel': 0
@ -953,7 +930,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Column Break',
'idx': 71,
'idx': 70,
'permlevel': 0,
'width': '50%'
},
@ -963,7 +940,7 @@
'doctype': 'DocField',
'fieldname': 'resignation_letter_date',
'fieldtype': 'Date',
'idx': 72,
'idx': 71,
'label': 'Resignation Letter Date',
'oldfieldname': 'resignation_letter_date',
'oldfieldtype': 'Date',
@ -975,7 +952,7 @@
'doctype': 'DocField',
'fieldname': 'relieving_date',
'fieldtype': 'Date',
'idx': 73,
'idx': 72,
'in_filter': 1,
'label': 'Relieving Date',
'oldfieldname': 'relieving_date',
@ -988,7 +965,7 @@
'doctype': 'DocField',
'fieldname': 'reason_for_leaving',
'fieldtype': 'Data',
'idx': 74,
'idx': 73,
'label': 'Reason for Leaving',
'oldfieldname': 'reason_for_leaving',
'oldfieldtype': 'Data',
@ -1000,7 +977,7 @@
'doctype': 'DocField',
'fieldname': 'leave_encashed',
'fieldtype': 'Select',
'idx': 75,
'idx': 74,
'label': 'Leave Encashed?',
'oldfieldname': 'leave_encashed',
'oldfieldtype': 'Select',
@ -1013,7 +990,7 @@
'doctype': 'DocField',
'fieldname': 'encashment_date',
'fieldtype': 'Date',
'idx': 76,
'idx': 75,
'label': 'Encashment Date',
'oldfieldname': 'encashment_date',
'oldfieldtype': 'Date',
@ -1024,7 +1001,7 @@
{
'doctype': 'DocField',
'fieldtype': 'Column Break',
'idx': 77,
'idx': 76,
'label': 'Exit Interview Details',
'oldfieldname': 'col_brk6',
'oldfieldtype': 'Column Break',
@ -1037,7 +1014,7 @@
'doctype': 'DocField',
'fieldname': 'held_on',
'fieldtype': 'Date',
'idx': 78,
'idx': 77,
'label': 'Held On',
'oldfieldname': 'held_on',
'oldfieldtype': 'Date',
@ -1049,7 +1026,7 @@
'doctype': 'DocField',
'fieldname': 'reason_for_resignation',
'fieldtype': 'Select',
'idx': 79,
'idx': 78,
'label': 'Reason for Resignation',
'oldfieldname': 'reason_for_resignation',
'oldfieldtype': 'Select',
@ -1062,7 +1039,7 @@
'doctype': 'DocField',
'fieldname': 'new_workplace',
'fieldtype': 'Data',
'idx': 80,
'idx': 79,
'label': 'New Workplace',
'oldfieldname': 'new_workplace',
'oldfieldtype': 'Data',
@ -1074,7 +1051,7 @@
'doctype': 'DocField',
'fieldname': 'feedback',
'fieldtype': 'Small Text',
'idx': 81,
'idx': 80,
'label': 'Feedback',
'oldfieldname': 'feedback',
'oldfieldtype': 'Text',
@ -1087,7 +1064,7 @@
'fieldname': 'file_list',
'fieldtype': 'Text',
'hidden': 1,
'idx': 82,
'idx': 81,
'label': 'File List',
'permlevel': 0,
'print_hide': 1
@ -1098,7 +1075,7 @@
'doctype': 'DocField',
'fieldname': 'trash_reason',
'fieldtype': 'Small Text',
'idx': 83,
'idx': 82,
'label': 'Trash Reason',
'oldfieldname': 'trash_reason',
'oldfieldtype': 'Small Text',

View File

@ -37,9 +37,13 @@ class DocType:
self.doc.projected_qty = flt(self.doc.actual_qty) + flt(self.doc.ordered_qty) + flt(self.doc.indented_qty) + flt(self.doc.planned_qty) - flt(self.doc.reserved_qty)
self.doc.save()
# update valuation for post dated entry
if actual_qty:
# check actual qty with total number of 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
@ -48,6 +52,18 @@ class DocType:
self.update_item_valuation(sle_id, dt, posting_time, serial_no, prev_sle)
def check_qty_with_serial_no(self):
"""
check actual qty with total number of serial no in store
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]
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)
msgprint(msg, raise_exception=1)
sendmail(['developer@iwebnotes.com'], sender='automail@webnotestech.com', subject='Serial No Count vs Bin Actual Qty', parts=[['text/plain', msg]])
# --------------------------------
# get first stock ledger entry
# --------------------------------

View File

@ -7,15 +7,16 @@ cur_frm.cscript.onload = function(doc, cdt, cdn) {
// ************************************** refresh ***************************************************
cur_frm.cscript.refresh = function(doc, cdt, cdn) {
if(!doc.__islocal && doc.warehouse) set_field_permlevel('warehouse', 1);
if(!doc.__islocal && doc.item_code) set_field_permlevel('item_code', 1);
if(doc.__islocal) set_field_permlevel('status', 0);
if(!doc.__islocal) {
flds = ['item_code', 'warehouse', 'purchase_document_type', 'purchase_document_no', 'purchase_date', 'purchase_time', 'purchase_rate', 'supplier']
for(i=0;i<flds.length;i++)
set_field_permlevel(flds[i], 1);
}
}
// ************************************** triggers **************************************************
// -------------
// item details
// -------------
cur_frm.add_fetch('item_code', 'item_name', 'item_name')
@ -24,23 +25,12 @@ cur_frm.add_fetch('item_code', 'brand', 'brand')
cur_frm.add_fetch('item_code', 'description', 'description')
cur_frm.add_fetch('item_code', 'warranty_period', 'warranty_period')
// ---------
// customer
// ---------
cur_frm.add_fetch('customer', 'customer_name', 'customer_name')
cur_frm.add_fetch('customer', 'address', 'delivery_address')
cur_frm.add_fetch('customer', 'territory', 'territory')
// ---------
// supplier
// ---------
//cur_frm.add_fetch('supplier', 'supplier_name', 'supplier_name')
//cur_frm.add_fetch('customer', 'address', 'supplier_address')
// ----------
// territory
// ----------
cur_frm.fields_dict['territory'].get_query = function(doc,cdt,cdn) {
@ -48,10 +38,8 @@ cur_frm.fields_dict['territory'].get_query = function(doc,cdt,cdn) {
}
// Supplier
//-------------
cur_frm.cscript.supplier = function(doc,dt,dn) {
if(doc.supplier) get_server_fields('get_default_supplier_address', JSON.stringify({supplier: doc.supplier}),'', doc, dt, dn, 1);
if(doc.supplier) unhide_field(['supplier_name','address_display']);
}

View File

@ -16,39 +16,19 @@ class DocType(TransactionBase):
self.doc = doc
self.doclist = doclist
# ********************************* validate warranty / amc status ***************************************
# --------------------
# validate amc status
# --------------------
def validate_amc_status(self):
if self.doc.amc_expiry_date and getdate(self.doc.amc_expiry_date) >= datetime.date.today() and self.doc.maintenance_status == 'Out of AMC':
msgprint("AMC expiry date and maintenance status mismatch. Please verify")
raise Exception
elif (not self.doc.amc_expiry_date or getdate(self.doc.amc_expiry_date) < datetime.date.today()) and self.doc.maintenance_status == 'Under AMC':
msgprint("AMC expiry date and maintenance status mismatch. Please verify")
raise Exception
"""
validate amc status
"""
if (self.doc.maintenance_status == 'Out of AMC' and self.doc.amc_expiry_date and getdate(self.doc.amc_expiry_date) >= datetime.date.today()) or (self.doc.maintenance_status == 'Under AMC' and (not self.doc.amc_expiry_date or getdate(self.doc.amc_expiry_date) < datetime.date.today())):
msgprint("AMC expiry date and maintenance status mismatch. Please verify", raise_exception=1)
# -------------------------
# validate warranty status
# -------------------------
def validate_warranty_status(self):
if self.doc.warranty_expiry_date and getdate(self.doc.warranty_expiry_date) >= datetime.date.today() and self.doc.maintenance_status == 'Out of Warranty':
msgprint("Warranty expiry date and maintenance status mismatch. Please verify")
raise Exception
elif (not self.doc.warranty_expiry_date or getdate(self.doc.warranty_expiry_date) < datetime.date.today()) and self.doc.maintenance_status == 'Under Warranty':
msgprint("Warranty expiry date and maintenance status mismatch. Please verify")
raise Exception
# -------------------------------
# validate warranty / amc status
# -------------------------------
def validate_warranty_amc_status(self):
self.validate_warranty_status()
self.validate_amc_status()
"""
validate warranty status
"""
if (self.doc.maintenance_status == 'Out of Warranty' and self.doc.warranty_expiry_date and getdate(self.doc.warranty_expiry_date) >= datetime.date.today()) or (self.doc.maintenance_status == 'Under Warranty' and (not self.doc.warranty_expiry_date or getdate(self.doc.warranty_expiry_date) < datetime.date.today())):
msgprint("Warranty expiry date and maintenance status mismatch. Please verify", raise_exception=1)
def validate_warehouse(self):
@ -56,6 +36,9 @@ class DocType(TransactionBase):
msgprint("Warehouse is mandatory if this Serial No is <b>In Store</b>", raise_exception=1)
def validate_item(self):
"""
Validate whether serial no is required for this item
"""
item = sql("select name, has_serial_no from tabItem where name = '%s'" % self.doc.item_code)
if not item:
msgprint("Item is not exists in the system", raise_exception=1)
@ -67,7 +50,8 @@ class DocType(TransactionBase):
# validate
# ---------
def validate(self):
self.validate_warranty_amc_status()
self.validate_warranty_status()
self.validate_amc_status()
self.validate_warehouse()
self.validate_item()
@ -102,7 +86,7 @@ class DocType(TransactionBase):
# on update
# ----------
def on_update(self):
if self.doc.warehouse and not sql("select name from `tabStock Ledger Entry` where serial_no = '%s'" % (self.doc.name)) and self.doc.status == 'In Store':
if self.doc.localname and self.doc.warehouse and self.doc.status == 'In Store' and not sql("select name from `tabStock Ledger Entry` where serial_no = '%s' and ifnull(is_cancelled, 'No') = 'No'" % (self.doc.name)):
self.make_stock_ledger_entry(update_stock = 1)

View File

@ -355,6 +355,9 @@ class DocType:
# ----------------------------------
def update_serial_no(self, is_submit):
sl_obj = get_obj('Stock Ledger')
if is_submit:
sl_obj.validate_serial_no_warehouse(self, 'mtn_details')
for d in getlist(self.doclist, 'mtn_details'):
if d.serial_no:
serial_nos = sl_obj.get_sr_no_list(d.serial_no)
@ -363,7 +366,7 @@ class DocType:
if d.s_warehouse:
sl_obj.update_serial_delivery_details(self, d, serial_no, is_submit)
if d.t_warehouse:
sl_obj.update_serial_purchase_details(self, d, serial_no, is_submit, (self.doc.purpose in ['Material Transfer', 'Sales Return']) and 1 or 0)
sl_obj.update_serial_purchase_details(self, d, serial_no, is_submit, self.doc.purpose)
if self.doc.purpose == 'Purchase Return':
delete_doc("Serial No", serial_no)

View File

@ -57,11 +57,11 @@ class DocType:
s = s.strip()
sr_war = sql("select warehouse,name from `tabSerial No` where name = '%s'" % (s))
if not sr_war:
msgprint("Serial No %s does not exists",s, raise_exception = 1)
msgprint("Serial No %s does not exists"%s, raise_exception = 1)
elif not sr_war[0][0]:
msgprint("Please set a warehouse in the Serial No <b>%s</b>" % s, raise_exception = 1)
elif sr_war[0][0] != d.warehouse:
msgprint("Serial No : %s for Item : %s doesn't exists in Warehouse : %s" % (s, d.item_code, d.warehouse), raise_exception = 1)
msgprint("Warehouse not mentioned in the Serial No <b>%s</b>" % s, raise_exception = 1)
elif (d.warehouse and sr_war[0][0] != d.warehouse) or (d.s_warehouse and sr_war[0][0] != d.s_warehouse):
msgprint("Serial No : %s for Item : %s doesn't exists in Warehouse : %s" % (s, d.item_code, d.warehouse or d.s_warehouse), raise_exception = 1)
# ------------------------------------
@ -119,10 +119,10 @@ class DocType:
# ----------------------------------
# update serial no purchase details
# ----------------------------------
def update_serial_purchase_details(self, obj, d, serial_no, is_submit, is_transfer = 0):
def update_serial_purchase_details(self, obj, d, serial_no, is_submit, purpose = ''):
exists = sql("select name, status, docstatus from `tabSerial No` where name = '%s'" % (serial_no))
if is_submit:
if exists and exists[0][2] != 2 and not is_transfer:
if exists and exists[0][2] != 2 and purpose not in ['Material Transfer', 'Sales Return']:
msgprint("Serial No: %s already %s" % (serial_no, exists and exists[0][1]), raise_exception = 1)
elif exists:
s = Document('Serial No', exists and exists[0][0])
@ -133,8 +133,10 @@ class DocType:
else:
if exists and exists[0][1] == 'Delivered' and exists[0][2] != 2:
msgprint("Serial No: %s is already delivered, you can not cancel the document." % serial_no, raise_exception=1)
elif purpose in ['Material Transfer', 'Sales Return']:
sql("update `tabSerial No` set status = '%s', purchase_document_type = '', purchase_document_no = '', warehouse = '%s' where name = '%s'" % (purpose == 'Material Transfer' and 'In Store' or 'Delivered', d.s_warehouse, serial_no))
else:
sql("update `tabSerial No` set docstatus = '%s', status = '%s', purchase_document_type = '', purchase_document_no = '', purchase_date = '', purchase_rate = '', supplier = null, supplier_name = '', supplier_address = '', warehouse = null where name = '%s'" % (not is_transfer and 2 or 0, is_transfer and 'In Store' or 'Not in Use', serial_no))
sql("update `tabSerial No` set docstatus = 2, status = 'Not in Use', purchase_document_type = '', purchase_document_no = '', purchase_date = '', purchase_rate = '', supplier = null, supplier_name = '', supplier_address = '', warehouse = '' where name = '%s'" % serial_no)
# -------------------------------
@ -233,6 +235,7 @@ class DocType:
sle.fields['warehouse_type'] = get_value('Warehouse' , args[k], 'warehouse_type')
sle.fields[k] = args[k]
sle_obj = get_obj(doc=sle)
# validate
sle_obj.validate()
sle.save(new = 1)