diff --git a/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py b/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py
index 48da3ea..636da69 100644
--- a/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py
+++ b/erpnext/patches/v8_8/update_gl_due_date_for_pi_and_si.py
@@ -3,35 +3,25 @@
 
 """
 This will update existing GL Entries by saving its linked Purchase/Sales Invoice's
-due date as the due date for the GL Entry
+and Journal Entry's due date as the due date for the GL Entry
 """
 
 
 def execute():
-	pi_kwargs = dict(
-		voucher_type='Purchase Invoice', doctype='GL Entry', fields=['voucher_no'],
-		limit_start=0, limit_page_length=5, filters={
-			"ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''),
-			'voucher_type': 'Purchase Invoice', 'debit': ('!=', '0')
-		}
-	)
-	si_kwargs = dict(
-		voucher_type='Sales Invoice', doctype='GL Entry', fields=['voucher_no'],
-		limit_start=0, limit_page_length=5, filters={
-			"ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''),
-			'voucher_type': 'Sales Invoice', 'credit': ('!=', '0')
-		}
-	)
-	kwargs = [pi_kwargs, si_kwargs]
+	kwargs = get_query_kwargs()
 
 	for kwarg in kwargs:
 		for batch in get_result_in_batches(**kwarg):
-			conditions, names = build_conditions(batch, kwarg.get('voucher_type'))
+			voucher_num_col = kwarg.get('voucher_num_col', 'voucher_no')
+			voucher_type = kwarg.get('use_voucher_type') or kwarg.get('voucher_type')
+			conditions, names = build_conditions(batch, voucher_type, voucher_num_col)
 			if conditions and names:
 				start = 'UPDATE `tabGL Entry` SET `due_date` = CASE '
 				cond = ' '.join(conditions)
+				else_cond = ' ELSE `due_date` END WHERE '
+
 				frappe.db.sql(
-					start + cond + ' ELSE `due_date` END WHERE `voucher_no` IN %s',
+					start + cond + else_cond + voucher_num_col + ' IN %s',
 					values=(names,)
 				)
 
@@ -53,16 +43,17 @@
 	limit_start = kwargs.get('limit_start')
 	limit_page_length = kwargs.get('limit_page_length')
 	filters = kwargs.get('filters')
+	or_filters = kwargs.get('or_filters')
 
 	results = frappe.get_list(
 		doctype, fields=fields, limit_start=limit_start, limit_page_length=limit_page_length,
-		filters=filters
+		filters=filters, or_filters=or_filters
 	)
 
 	return results
 
 
-def build_conditions(query_results, voucher_type):
+def build_conditions(query_results, voucher_type, voucher_num_col):
 	"""
 	builds the string to be used is sql CASE statement. Returns the a tuple of
 	the string for the CASE statement and a tuple of applicable voucher names
@@ -70,9 +61,8 @@
 	conditions = []
 	invoice_names = []
 
-	# first extract the voucher names into two separate lists so it can be easy to query the db
 	for result in query_results:
-		voucher_no = result.get('voucher_no')
+		voucher_no = result.get(voucher_num_col)
 		if voucher_no:
 			invoice_names.append("%s" % (voucher_no,))
 
@@ -83,6 +73,45 @@
 
 	if invoice_details:
 		for d in invoice_details:
-			conditions.append('WHEN `voucher_no`="{number}" THEN "{date}"'.format(number=d.name, date=d.due_date))
+			conditions.append('WHEN `{voucher_no}`="{number}" THEN "{date}"'.format(
+				number=d.name, date=d.due_date, voucher_no=voucher_num_col))
 
 	return conditions, invoice_names
+
+
+def get_query_kwargs():
+	pi_kwargs = dict(
+		voucher_type='Purchase Invoice', doctype='GL Entry', fields=['voucher_no'],
+		limit_start=0, limit_page_length=5, filters={
+			"ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''),
+			'voucher_type': 'Purchase Invoice', 'debit': ('!=', '0')
+		}
+	)
+
+	si_kwargs = dict(
+		voucher_type='Sales Invoice', doctype='GL Entry', fields=['voucher_no'],
+		limit_start=0, limit_page_length=5, filters={
+			"ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''),
+			'voucher_type': 'Sales Invoice', 'credit': ('!=', '0')
+		}
+	)
+
+	journal_kwargs_si = dict(
+		voucher_type='Journal Entry', doctype='GL Entry', fields=['against_voucher'],
+		limit_start=0, limit_page_length=5, filters={
+			"ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''),
+			'voucher_type': 'Journal Entry', 'against_voucher_type': 'Sales Invoice'
+		},
+		voucher_num_col='against_voucher', use_voucher_type='Sales Invoice',
+	)
+
+	journal_kwargs_pi = dict(
+		voucher_type='Journal Entry', doctype='GL Entry', fields=['against_voucher'],
+		limit_start=0, limit_page_length=5, filters={
+			"ifnull(due_date, '')": ('=', ''), "ifnull(party, '')": ('!=', ''),
+			'voucher_type': 'Journal Entry', 'against_voucher_type': 'Purchase Invoice'
+		},
+		voucher_num_col='against_voucher', use_voucher_type='Purchase Invoice',
+	)
+
+	return [pi_kwargs, si_kwargs, journal_kwargs_pi, journal_kwargs_si]
