Frappe.client.set_value and date format

Hi,

I’m facing issue while updating custom script from ERPNext V10 to V11. I’ve build a script to show dialog box when stock entry is submited. The user can change Sales Order Item Delivery Date from that dialog box. It worked well in V10.

My custom script is :

frappe.prompt([
	{label:__("Delivery Date"), fieldtype:"Date", fieldname:"delivery_date", reqd: 1, default: res.message.delivery_date}								
],
function(data) {
	frappe.call({
		"method": "frappe.client.set_value",
		"args": {
			"doctype": "Sales Order Item",
			"name": res.message.sales_order_item,
			"fieldname": {
				"delivery_date": data.delivery_date								
			},
		}
	});
	return;
}
, __("Souhaitez-vous modifier la date de livraison du client?"), __("Terminé"));

In V11, I’ve got this error :

Traceback (most recent call last):
  File "/home/radpp/frappe-bench/apps/frappe/frappe/app.py", line 61, in application
    response = frappe.handler.handle()
  File "/home/radpp/frappe-bench/apps/frappe/frappe/handler.py", line 21, in handle
    data = execute_cmd(cmd)
  File "/home/radpp/frappe-bench/apps/frappe/frappe/handler.py", line 56, in execute_cmd
    return frappe.call(method, **frappe.form_dict)
  File "/home/radpp/frappe-bench/apps/frappe/frappe/__init__.py", line 1026, in call
    return fn(*args, **newargs)
  File "/home/radpp/frappe-bench/apps/frappe/frappe/client.py", line 136, in set_value
    doc.save()
  File "/home/radpp/frappe-bench/apps/frappe/frappe/model/document.py", line 261, in save
    return self._save(*args, **kwargs)
  File "/home/radpp/frappe-bench/apps/frappe/frappe/model/document.py", line 297, in _save
    self.run_before_save_methods()
  File "/home/radpp/frappe-bench/apps/frappe/frappe/model/document.py", line 885, in run_before_save_methods
    self.run_method("before_update_after_submit")
  File "/home/radpp/frappe-bench/apps/frappe/frappe/model/document.py", line 773, in run_method
    out = Document.hook(fn)(self, *args, **kwargs)
  File "/home/radpp/frappe-bench/apps/frappe/frappe/model/document.py", line 1049, in composer
    return composed(self, method, *args, **kwargs)
  File "/home/radpp/frappe-bench/apps/frappe/frappe/model/document.py", line 1032, in runner
    add_to_return_value(self, fn(self, *args, **kwargs))
  File "/home/radpp/frappe-bench/apps/frappe/frappe/model/document.py", line 767, in <lambda>
    fn = lambda self, *args, **kwargs: getattr(self, method)(*args, **kwargs)
  File "/home/radpp/frappe-bench/apps/erpnext/erpnext/selling/doctype/sales_order/sales_order.py", line 309, in before_update_after_submit
    self.validate_delivery_date()
  File "/home/radpp/frappe-bench/apps/erpnext/erpnext/selling/doctype/sales_order/sales_order.py", line 112, in validate_delivery_date
    max_delivery_date = max(delivery_date_list) if delivery_date_list else None
TypeError: can't compare datetime.date to unicode

I’ve add frappe.logger().debug to sales_order.py to show delivery_date_list content :
[u'2019-05-21', datetime.date(2019, 5, 24)]

u’2019-05-21’ is the first sales order item. The one is change.
datetime.date(2019, 5, 24) is the second sales order item. This one not changed.

I’ve try to change the format of data.delivery_date in the frappe.client.set_value but I still got the same error.

Did someone have an idea?

Best regards.

I think that’s better you create you own set value because even if you change the fieldtype they always will send a unicode and will show an exception, try something like this:

frappe.call({
		"method": "path-to-your-app-and-or-file",
		"args": {
			"sales_order_item": res.message.sales_order_item,
			"delivery_date": data.delivery_date								
		}
	});

Then in your python file just do a set value, something like this:

@frappe.whitelist()
def update_delivery_date(sales_order_item, delivery_date):
    frappe.db.set_value('Sales Order Item', sales_order_item, 'delivery_date', delivery_date)

OBS: I’m still on the 7 version so for me the delivery date is on the Sales Order not in Sales Order Item but in your case…

1 Like

Thanks Thuago. It work like a charm.