mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-19 21:19:19 +00:00
Healthcare - Invoice Drug Prescription
This commit is contained in:
@@ -748,6 +748,9 @@ frappe.ui.form.on('Sales Invoice', {
|
|||||||
frm.add_custom_button(__('Healthcare Services'), function() {
|
frm.add_custom_button(__('Healthcare Services'), function() {
|
||||||
get_healthcare_services_to_invoice(frm);
|
get_healthcare_services_to_invoice(frm);
|
||||||
},"Get items from");
|
},"Get items from");
|
||||||
|
frm.add_custom_button(__('Prescriptions'), function() {
|
||||||
|
get_drugs_to_invoice(frm);
|
||||||
|
},"Get items from");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else{
|
else{
|
||||||
@@ -887,7 +890,10 @@ var get_healthcare_services_to_invoice = function(frm) {
|
|||||||
var patient = dialog.fields_dict.patient.input.value;
|
var patient = dialog.fields_dict.patient.input.value;
|
||||||
if(patient && patient!=selected_patient){
|
if(patient && patient!=selected_patient){
|
||||||
selected_patient = 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){
|
else if(!patient){
|
||||||
selected_patient = '';
|
selected_patient = '';
|
||||||
@@ -908,37 +914,34 @@ var get_healthcare_services_to_invoice = function(frm) {
|
|||||||
$results.find('.list-item-container .list-row-check')
|
$results.find('.list-item-container .list-row-check')
|
||||||
.prop("checked", ($(e.target).is(':checked')));
|
.prop("checked", ($(e.target).is(':checked')));
|
||||||
});
|
});
|
||||||
set_primary_action(frm, dialog, $results);
|
set_primary_action(frm, dialog, $results, true);
|
||||||
dialog.show();
|
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;
|
var me = this;
|
||||||
$results.empty();
|
$results.empty();
|
||||||
frappe.call({
|
frappe.call({
|
||||||
method:"erpnext.healthcare.utils.get_healthcare_services_to_invoice",
|
method: method,
|
||||||
args: {
|
args: args,
|
||||||
patient: patient_id
|
|
||||||
},
|
|
||||||
callback: function(data) {
|
callback: function(data) {
|
||||||
if(data.message){
|
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++){
|
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 {
|
}else {
|
||||||
$results.append($placeholder);
|
$results.append($placeholder);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
}
|
||||||
|
|
||||||
var make_list_row= function(result={}) {
|
var make_list_row= function(columns, invoice_healthcare_services, result={}) {
|
||||||
var me = this;
|
var me = this;
|
||||||
// Make a head row by default (if result not passed)
|
// Make a head row by default (if result not passed)
|
||||||
let head = Object.keys(result).length === 0;
|
let head = Object.keys(result).length === 0;
|
||||||
let contents = ``;
|
let contents = ``;
|
||||||
let columns = (["service", "reference_name", "reference_type"]);
|
|
||||||
columns.forEach(function(column) {
|
columns.forEach(function(column) {
|
||||||
contents += `<div class="list-item__content ellipsis">
|
contents += `<div class="list-item__content ellipsis">
|
||||||
${
|
${
|
||||||
@@ -958,39 +961,27 @@ var make_list_row= function(result={}) {
|
|||||||
${contents}
|
${contents}
|
||||||
</div>`);
|
</div>`);
|
||||||
|
|
||||||
head ? $row.addClass('list-item--head')
|
$row = list_row_data_items(head, $row, result, invoice_healthcare_services);
|
||||||
: $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);
|
|
||||||
return $row;
|
return $row;
|
||||||
};
|
};
|
||||||
|
|
||||||
var set_primary_action= function(frm, dialog, $results) {
|
var set_primary_action= function(frm, dialog, $results, invoice_healthcare_services) {
|
||||||
var me = this;
|
var me = this;
|
||||||
dialog.set_primary_action(__('Add'), function() {
|
dialog.set_primary_action(__('Add'), function() {
|
||||||
let checked_values = get_checked_values($results);
|
let checked_values = get_checked_values($results);
|
||||||
if(checked_values.length > 0){
|
if(checked_values.length > 0){
|
||||||
frm.set_value("patient", dialog.fields_dict.patient.input.value);
|
frm.set_value("patient", dialog.fields_dict.patient.input.value);
|
||||||
frm.set_value("items", []);
|
frm.set_value("items", []);
|
||||||
frappe.call({
|
add_to_item_line(frm, checked_values, invoice_healthcare_services);
|
||||||
doc: frm.doc,
|
|
||||||
method: "set_healthcare_services",
|
|
||||||
args:{
|
|
||||||
checked_values: checked_values
|
|
||||||
},
|
|
||||||
callback: function() {
|
|
||||||
frm.trigger("validate");
|
|
||||||
frm.refresh_fields();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
dialog.hide();
|
dialog.hide();
|
||||||
}
|
}
|
||||||
else{
|
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 @@ var get_checked_values= function($results) {
|
|||||||
}
|
}
|
||||||
}).get();
|
}).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();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|||||||
@@ -313,3 +313,19 @@ def manage_doc_for_appoitnment(dt_from_appointment, appointment, invoiced):
|
|||||||
)
|
)
|
||||||
if dn_from_appointment:
|
if dn_from_appointment:
|
||||||
frappe.db.set_value(dt_from_appointment, dn_from_appointment, "invoiced", invoiced)
|
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
|
||||||
|
|||||||
Reference in New Issue
Block a user