Healthcare - Invoice Drug Prescription
diff --git a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
index 42363ce..36d69fa 100644
--- a/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
+++ b/erpnext/accounts/doctype/sales_invoice/sales_invoice.js
@@ -748,6 +748,9 @@
 				frm.add_custom_button(__('Healthcare Services'), function() {
 					get_healthcare_services_to_invoice(frm);
 				},"Get items from");
+				frm.add_custom_button(__('Prescriptions'), function() {
+					get_drugs_to_invoice(frm);
+				},"Get items from");
 			}
 		}
 		else{
@@ -887,7 +890,10 @@
 		var patient = dialog.fields_dict.patient.input.value;
 		if(patient && patient!=selected_patient){
 			selected_patient = patient;
-			get_services(frm, patient, $results, $placeholder)
+			var method = "erpnext.healthcare.utils.get_healthcare_services_to_invoice";
+			var args = {patient: patient};
+			var columns = (["service", "reference_name", "reference_type"]);
+			get_healthcare_items(frm, true, $results, $placeholder, method, args, columns);
 		}
 		else if(!patient){
 			selected_patient = '';
@@ -908,37 +914,34 @@
 		$results.find('.list-item-container .list-row-check')
 			.prop("checked", ($(e.target).is(':checked')));
 	});
-	set_primary_action(frm, dialog, $results);
+	set_primary_action(frm, dialog, $results, true);
 	dialog.show();
 };
 
-var get_services= function(frm, patient_id, $results, $placeholder) {
+var get_healthcare_items = function(frm, invoice_healthcare_services, $results, $placeholder, method, args, columns) {
 	var me = this;
 	$results.empty();
 	frappe.call({
-		method:"erpnext.healthcare.utils.get_healthcare_services_to_invoice",
-		args: {
-			patient: patient_id
-		},
+		method: method,
+		args: args,
 		callback: function(data) {
 			if(data.message){
-				$results.append(make_list_row());
+				$results.append(make_list_row(columns, invoice_healthcare_services));
 				for(let i=0; i<data.message.length; i++){
-					$results.append(make_list_row(data.message[i]));
+					$results.append(make_list_row(columns, invoice_healthcare_services, data.message[i]));
 				}
 			}else {
 				$results.append($placeholder);
 			}
 		}
 	});
-};
+}
 
-var make_list_row= function(result={}) {
+var make_list_row= function(columns, invoice_healthcare_services, result={}) {
 	var me = this;
 	// Make a head row by default (if result not passed)
 	let head = Object.keys(result).length === 0;
 	let contents = ``;
-	let columns = (["service", "reference_name", "reference_type"]);
 	columns.forEach(function(column) {
 		contents += `<div class="list-item__content ellipsis">
 			${
@@ -958,39 +961,27 @@
 		${contents}
 	</div>`);
 
-	head ? $row.addClass('list-item--head')
-		: $row = $(`<div class="list-item-container"
-			data-dn= "${result.reference_name}" data-dt= "${result.reference_type}" data-item= "${result.service}"
-			data-rate = ${result.rate}
-			data-income-account = "${result.income_account}"
-			data-qty = ${result.qty}
-			data-description = "${result.description}">
-			</div>`).append($row);
+	$row = list_row_data_items(head, $row, result, invoice_healthcare_services);
 	return $row;
 };
 
-var set_primary_action= function(frm, dialog, $results) {
+var set_primary_action= function(frm, dialog, $results, invoice_healthcare_services) {
 	var me = this;
 	dialog.set_primary_action(__('Add'), function() {
 		let checked_values = get_checked_values($results);
 		if(checked_values.length > 0){
 			frm.set_value("patient", dialog.fields_dict.patient.input.value);
 			frm.set_value("items", []);
-			frappe.call({
-				doc: frm.doc,
-				method: "set_healthcare_services",
-				args:{
-					checked_values: checked_values
-				},
-				callback: function() {
-					frm.trigger("validate");
-					frm.refresh_fields();
-				}
-			});
+			add_to_item_line(frm, checked_values, invoice_healthcare_services);
 			dialog.hide();
 		}
 		else{
-			frappe.msgprint(__("Please select Healthcare Service"));
+			if(invoice_healthcare_services){
+				frappe.msgprint(__("Please select Healthcare Service"));
+			}
+			else{
+				frappe.msgprint(__("Please select Drug"));
+			}
 		}
 	});
 };
@@ -1030,3 +1021,110 @@
 		}
 	}).get();
 };
+
+var get_drugs_to_invoice = function(frm) {
+	var me = this;
+	let selected_encounter = '';
+	var dialog = new frappe.ui.Dialog({
+		title: __("Get Items from Prescriptions"),
+		fields:[
+			{ fieldtype: 'Link', options: 'Patient', label: 'Patient', fieldname: "patient", reqd: true },
+			{ fieldtype: 'Link', options: 'Patient Encounter', label: 'Patient Encounter', fieldname: "encounter", reqd: true,
+				description:'Quantity will be calculated only for items which has "Nos" as UoM. You may change as required for each invoice item.',
+				get_query: function(doc) {
+					return {
+						filters: { patient :dialog.get_value("patient") }
+					};
+				}
+			},
+			{ fieldtype: 'Section Break' },
+			{ fieldtype: 'HTML', fieldname: 'results_area' }
+		]
+	});
+	var $wrapper;
+	var $results;
+	var $placeholder;
+	dialog.set_values({
+		'patient': frm.doc.patient,
+		'encounter': ""
+	});
+	dialog.fields_dict["encounter"].df.onchange = () => {
+		var encounter = dialog.fields_dict.encounter.input.value;
+		if(encounter && encounter!=selected_encounter){
+			selected_encounter = encounter;
+			var method = "erpnext.healthcare.utils.get_drugs_to_invoice";
+			var args = {encounter: encounter};
+			var columns = (["drug_code", "quantity", "description"]);
+			get_healthcare_items(frm, false, $results, $placeholder, method, args, columns);
+		}
+		else if(!encounter){
+			selected_encounter = '';
+			$results.empty();
+			$results.append($placeholder);
+		}
+	}
+	$wrapper = dialog.fields_dict.results_area.$wrapper.append(`<div class="results"
+		style="border: 1px solid #d1d8dd; border-radius: 3px; height: 300px; overflow: auto;"></div>`);
+	$results = $wrapper.find('.results');
+	$placeholder = $(`<div class="multiselect-empty-state">
+				<span class="text-center" style="margin-top: -40px;">
+					<i class="fa fa-2x fa-heartbeat text-extra-muted"></i>
+					<p class="text-extra-muted">No Drug Prescription found</p>
+				</span>
+			</div>`);
+	$results.on('click', '.list-item--head :checkbox', (e) => {
+		$results.find('.list-item-container .list-row-check')
+			.prop("checked", ($(e.target).is(':checked')));
+	});
+	set_primary_action(frm, dialog, $results, false);
+	dialog.show();
+};
+
+var list_row_data_items = function(head, $row, result, invoice_healthcare_services) {
+	if(invoice_healthcare_services){
+		head ? $row.addClass('list-item--head')
+			: $row = $(`<div class="list-item-container"
+				data-dn= "${result.reference_name}" data-dt= "${result.reference_type}" data-item= "${result.service}"
+				data-rate = ${result.rate}
+				data-income-account = "${result.income_account}"
+				data-qty = ${result.qty}
+				data-description = "${result.description}">
+				</div>`).append($row);
+	}
+	else{
+		head ? $row.addClass('list-item--head')
+			: $row = $(`<div class="list-item-container"
+				data-item= "${result.drug_code}"
+				data-qty = ${result.quantity}
+				data-description = "${result.description}">
+				</div>`).append($row);
+	}
+	return $row
+};
+
+var add_to_item_line = function(frm, checked_values, invoice_healthcare_services){
+	if(invoice_healthcare_services){
+		frappe.call({
+			doc: frm.doc,
+			method: "set_healthcare_services",
+			args:{
+				checked_values: checked_values
+			},
+			callback: function() {
+				frm.trigger("validate");
+				frm.refresh_fields();
+			}
+		});
+	}
+	else{
+		for(let i=0; i<checked_values.length; i++){
+			var si_item = frappe.model.add_child(frm.doc, 'Sales Invoice Item', 'items');
+			frappe.model.set_value(si_item.doctype, si_item.name, 'item_code', checked_values[i]['item']);
+			frappe.model.set_value(si_item.doctype, si_item.name, 'qty', 1);
+			if(checked_values[i]['qty'] > 1){
+				frappe.model.set_value(si_item.doctype, si_item.name, 'qty', parseFloat(checked_values[i]['qty']));
+			}
+		}
+		frm.refresh_fields();
+	}
+};
diff --git a/erpnext/healthcare/utils.py b/erpnext/healthcare/utils.py
index 0b300b0..b966721 100644
--- a/erpnext/healthcare/utils.py
+++ b/erpnext/healthcare/utils.py
@@ -313,3 +313,19 @@
 	)
 	if dn_from_appointment:
 		frappe.db.set_value(dt_from_appointment, dn_from_appointment, "invoiced", invoiced)
+
+@frappe.whitelist()
+def get_drugs_to_invoice(encounter):
+	encounter = frappe.get_doc("Patient Encounter", encounter)
+	if encounter:
+		patient = frappe.get_doc("Patient", encounter.patient)
+		if patient and patient.customer:
+				item_to_invoice = []
+				for drug_line in encounter.drug_prescription:
+					if drug_line.drug_code:
+						qty = 1
+						if frappe.db.get_value("Item", drug_line.drug_code, "stock_uom") == "Nos":
+							qty = drug_line.get_quantity()
+						item_to_invoice.append({'drug_code': drug_line.drug_code, 'quantity': qty,
+						'description': drug_line.dosage+" for "+drug_line.period})
+				return item_to_invoice