Maintenance schedule: get no of visits and period validation. Fixes #1591
This commit is contained in:
parent
50e962b279
commit
ce4a87ce83
@ -3,12 +3,12 @@
|
|||||||
|
|
||||||
frappe.provide("erpnext.support");
|
frappe.provide("erpnext.support");
|
||||||
|
|
||||||
frappe.ui.form.on_change("Maintenance Schedule", "customer", function(frm) {
|
frappe.ui.form.on_change("Maintenance Schedule", "customer", function(frm) {
|
||||||
erpnext.utils.get_party_details(frm) });
|
erpnext.utils.get_party_details(frm) });
|
||||||
frappe.ui.form.on_change("Maintenance Schedule", "customer_address",
|
frappe.ui.form.on_change("Maintenance Schedule", "customer_address",
|
||||||
erpnext.utils.get_address_display);
|
erpnext.utils.get_address_display);
|
||||||
frappe.ui.form.on_change("Maintenance Schedule", "contact_person",
|
frappe.ui.form.on_change("Maintenance Schedule", "contact_person",
|
||||||
erpnext.utils.get_contact_details);
|
erpnext.utils.get_contact_details);
|
||||||
|
|
||||||
// TODO commonify this code
|
// TODO commonify this code
|
||||||
erpnext.support.MaintenanceSchedule = frappe.ui.form.Controller.extend({
|
erpnext.support.MaintenanceSchedule = frappe.ui.form.Controller.extend({
|
||||||
@ -16,7 +16,7 @@ erpnext.support.MaintenanceSchedule = frappe.ui.form.Controller.extend({
|
|||||||
var me = this;
|
var me = this;
|
||||||
|
|
||||||
if (this.frm.doc.docstatus === 0) {
|
if (this.frm.doc.docstatus === 0) {
|
||||||
this.frm.add_custom_button(__('From Sales Order'),
|
this.frm.add_custom_button(__('From Sales Order'),
|
||||||
function() {
|
function() {
|
||||||
frappe.model.map_current_doc({
|
frappe.model.map_current_doc({
|
||||||
method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_schedule",
|
method: "erpnext.selling.doctype.sales_order.sales_order.make_maintenance_schedule",
|
||||||
@ -38,16 +38,52 @@ erpnext.support.MaintenanceSchedule = frappe.ui.form.Controller.extend({
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
|
start_date: function(doc, cdt, cdn) {
|
||||||
|
this.set_no_of_visits(doc, cdt, cdn);
|
||||||
|
},
|
||||||
|
|
||||||
|
end_date: function(doc, cdt, cdn) {
|
||||||
|
this.set_no_of_visits(doc, cdt, cdn);
|
||||||
|
},
|
||||||
|
|
||||||
|
periodicity: function(doc, cdt, cdn) {
|
||||||
|
this.set_no_of_visits(doc, cdt, cdn);
|
||||||
|
},
|
||||||
|
|
||||||
|
set_no_of_visits: function(doc, cdt, cdn) {
|
||||||
|
var item = frappe.get_doc(cdt, cdn);
|
||||||
|
|
||||||
|
if (item.start_date && item.end_date && item.periodicity) {
|
||||||
|
if(item.start_date > item.end_date) {
|
||||||
|
msgprint(__("Row {0}:Start Date must be before End Date", [item.idx]));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var date_diff = frappe.datetime.get_diff(item.end_date, item.start_date) + 1;
|
||||||
|
|
||||||
|
var days_in_period = {
|
||||||
|
"Weekly": 7,
|
||||||
|
"Monthly": 30,
|
||||||
|
"Quarterly": 91,
|
||||||
|
"Half Yearly": 182,
|
||||||
|
"Yearly": 365
|
||||||
|
}
|
||||||
|
|
||||||
|
var no_of_visits = cint(date_diff / days_in_period[item.periodicity]);
|
||||||
|
frappe.model.set_value(item.doctype, item.name, "no_of_visits", no_of_visits);
|
||||||
|
}
|
||||||
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
$.extend(cur_frm.cscript, new erpnext.support.MaintenanceSchedule({frm: cur_frm}));
|
$.extend(cur_frm.cscript, new erpnext.support.MaintenanceSchedule({frm: cur_frm}));
|
||||||
|
|
||||||
cur_frm.cscript.onload = function(doc, dt, dn) {
|
cur_frm.cscript.onload = function(doc, dt, dn) {
|
||||||
if(!doc.status) set_multiple(dt,dn,{status:'Draft'});
|
if(!doc.status) set_multiple(dt,dn,{status:'Draft'});
|
||||||
|
|
||||||
if(doc.__islocal){
|
if(doc.__islocal){
|
||||||
set_multiple(dt,dn,{transaction_date:get_today()});
|
set_multiple(dt,dn,{transaction_date:get_today()});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
|
cur_frm.fields_dict['customer_address'].get_query = function(doc, cdt, cdn) {
|
||||||
@ -62,7 +98,7 @@ cur_frm.fields_dict['contact_person'].get_query = function(doc, cdt, cdn) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
cur_frm.fields_dict['item_maintenance_detail'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) {
|
cur_frm.fields_dict['item_maintenance_detail'].grid.get_field('item_code').get_query = function(doc, cdt, cdn) {
|
||||||
return {
|
return {
|
||||||
filters:{ 'is_service_item': "Yes" }
|
filters:{ 'is_service_item': "Yes" }
|
||||||
@ -73,25 +109,11 @@ cur_frm.cscript.item_code = function(doc, cdt, cdn) {
|
|||||||
var fname = cur_frm.cscript.fname;
|
var fname = cur_frm.cscript.fname;
|
||||||
var d = locals[cdt][cdn];
|
var d = locals[cdt][cdn];
|
||||||
if (d.item_code) {
|
if (d.item_code) {
|
||||||
return get_server_fields('get_item_details', d.item_code, 'item_maintenance_detail',
|
return get_server_fields('get_item_details', d.item_code, 'item_maintenance_detail',
|
||||||
doc, cdt, cdn, 1);
|
doc, cdt, cdn, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
cur_frm.cscript.periodicity = function(doc, cdt, cdn){
|
|
||||||
var d = locals[cdt][cdn];
|
|
||||||
if(d.start_date && d.end_date) {
|
|
||||||
arg = {}
|
|
||||||
arg.start_date = d.start_date;
|
|
||||||
arg.end_date = d.end_date;
|
|
||||||
arg.periodicity = d.periodicity;
|
|
||||||
return get_server_fields('get_no_of_visits', docstring(arg),
|
|
||||||
'item_maintenance_detail', doc, cdt, cdn, 1);
|
|
||||||
} else {
|
|
||||||
msgprint(__("Please enter Start Date and End Date"));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cur_frm.cscript.generate_schedule = function(doc, cdt, cdn) {
|
cur_frm.cscript.generate_schedule = function(doc, cdt, cdn) {
|
||||||
if (!doc.__islocal) {
|
if (!doc.__islocal) {
|
||||||
return $c('runserverobj', args={'method':'generate_schedule', 'docs':doc},
|
return $c('runserverobj', args={'method':'generate_schedule', 'docs':doc},
|
||||||
|
|||||||
@ -133,40 +133,22 @@ class MaintenanceSchedule(TransactionBase):
|
|||||||
|
|
||||||
return schedule_date
|
return schedule_date
|
||||||
|
|
||||||
def validate_period(self, arg):
|
def validate_dates_with_periodicity(self):
|
||||||
args = eval(arg)
|
for d in self.get("item_maintenance_detail"):
|
||||||
if getdate(args['start_date']) >= getdate(args['end_date']):
|
if d.start_date and d.end_date and d.periodicity:
|
||||||
throw(_("Start date should be less than end date."))
|
date_diff = (getdate(d.end_date) - getdate(d.start_date)).days + 1
|
||||||
|
days_in_period = {
|
||||||
|
"Weekly": 7,
|
||||||
|
"Monthly": 30,
|
||||||
|
"Quarterly": 90,
|
||||||
|
"Half Yearly": 180,
|
||||||
|
"Yearly": 365
|
||||||
|
}
|
||||||
|
|
||||||
period = (getdate(args['end_date']) - getdate(args['start_date'])).days + 1
|
if date_diff < days_in_period[d.periodicity]:
|
||||||
|
throw(_("Row {0}: To set {1} periodicity, difference between from and to date \
|
||||||
if (args['periodicity'] == 'Yearly' or args['periodicity'] == 'Half Yearly' or
|
must be greater than or equal to {2}")
|
||||||
args['periodicity'] == 'Quarterly') and period < 90:
|
.format(d.idx, d.periodicity, days_in_period[d.periodicity]))
|
||||||
throw(_("Period is too short"))
|
|
||||||
elif args['periodicity'] == 'Monthly' and period < 30:
|
|
||||||
throw(_("Period is too short"))
|
|
||||||
elif args['periodicity'] == 'Weekly' and period < 7:
|
|
||||||
throw(_("Period is too short"))
|
|
||||||
|
|
||||||
def get_no_of_visits(self, arg):
|
|
||||||
args = eval(arg)
|
|
||||||
self.validate_period(arg)
|
|
||||||
period = (getdate(args['end_date']) - getdate(args['start_date'])).days + 1
|
|
||||||
count = 0
|
|
||||||
|
|
||||||
if args['periodicity'] == 'Weekly':
|
|
||||||
count = period/7
|
|
||||||
elif args['periodicity'] == 'Monthly':
|
|
||||||
count = period/30
|
|
||||||
elif args['periodicity'] == 'Quarterly':
|
|
||||||
count = period/91
|
|
||||||
elif args['periodicity'] == 'Half Yearly':
|
|
||||||
count = period/182
|
|
||||||
elif args['periodicity'] == 'Yearly':
|
|
||||||
count = period/365
|
|
||||||
|
|
||||||
ret = {'no_of_visits' : count}
|
|
||||||
return ret
|
|
||||||
|
|
||||||
def validate_maintenance_detail(self):
|
def validate_maintenance_detail(self):
|
||||||
if not self.get('item_maintenance_detail'):
|
if not self.get('item_maintenance_detail'):
|
||||||
@ -196,6 +178,7 @@ class MaintenanceSchedule(TransactionBase):
|
|||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
self.validate_maintenance_detail()
|
self.validate_maintenance_detail()
|
||||||
|
self.validate_dates_with_periodicity()
|
||||||
self.validate_sales_order()
|
self.validate_sales_order()
|
||||||
|
|
||||||
def on_update(self):
|
def on_update(self):
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user