Beispiel #1
0
def create_invoice(company, patient, lab_tests, prescriptions):
	test_ids = json.loads(lab_tests)
	line_ids = json.loads(prescriptions)
	if not test_ids and not line_ids:
		return
	sales_invoice = frappe.new_doc("Sales Invoice")
	sales_invoice.customer = frappe.get_value("Patient", patient, "customer")
	sales_invoice.due_date = getdate()
	sales_invoice.is_pos = '0'
	sales_invoice.debit_to = get_receivable_account(company)
	for line in line_ids:
		test_code = frappe.get_value("Lab Prescription", line, "test_code")
		create_item_line(test_code, sales_invoice)
	for test in test_ids:
		template = frappe.get_value("Lab Test", test, "template")
		test_code = frappe.get_value("Lab Test Template", template, "item")
		create_item_line(test_code, sales_invoice)
	sales_invoice.set_missing_values()
	sales_invoice.save()
	#set invoice in lab test
	for test in test_ids:
		frappe.db.set_value("Lab Test", test, "invoice", sales_invoice.name)
		prescription = frappe.db.get_value("Lab Test", test, "prescription")
		if prescription:
			frappe.db.set_value("Lab Prescription", prescription, "invoice", sales_invoice.name)
	#set invoice in prescription
	for line in line_ids:
		frappe.db.set_value("Lab Prescription", line, "invoice", sales_invoice.name)
	return sales_invoice.name
def create_invoice(company, patient, lab_tests, prescriptions):
    test_ids = json.loads(lab_tests)
    line_ids = json.loads(prescriptions)
    if not test_ids and not line_ids:
        return
    sales_invoice = frappe.new_doc("Sales Invoice")
    sales_invoice.customer = frappe.get_value("Patient", patient, "customer")
    sales_invoice.due_date = getdate()
    sales_invoice.is_pos = '0'
    sales_invoice.debit_to = get_receivable_account(company)
    for line in line_ids:
        test_code = frappe.get_value("Lab Prescription", line, "test_code")
        create_item_line(test_code, sales_invoice)
    for test in test_ids:
        template = frappe.get_value("Lab Test", test, "template")
        test_code = frappe.get_value("Lab Test Template", template, "item")
        create_item_line(test_code, sales_invoice)
    sales_invoice.set_missing_values()
    sales_invoice.save()
    #set invoice in lab test
    for test in test_ids:
        frappe.db.set_value("Lab Test", test, "invoice", sales_invoice.name)
        prescription = frappe.db.get_value("Lab Test", test, "prescription")
        if prescription:
            frappe.db.set_value("Lab Prescription", prescription, "invoice",
                                sales_invoice.name)
    #set invoice in prescription
    for line in line_ids:
        frappe.db.set_value("Lab Prescription", line, "invoice",
                            sales_invoice.name)
    return sales_invoice.name
def create_invoice(company, physician, patient, appointment_id,
                   appointment_date):
    if not appointment_id:
        return False
    sales_invoice = frappe.new_doc("Sales Invoice")
    sales_invoice.customer = frappe.get_value("Patient", patient, "customer")
    sales_invoice.appointment = appointment_id
    sales_invoice.due_date = getdate()
    sales_invoice.is_pos = '0'
    sales_invoice.debit_to = get_receivable_account(company)

    fee_validity = get_fee_validity(physician, patient, appointment_date)
    create_invoice_items(appointment_id, physician, company, sales_invoice)

    sales_invoice.save(ignore_permissions=True)
    frappe.db.sql(
        """update `tabPatient Appointment` set sales_invoice=%s where name=%s""",
        (sales_invoice.name, appointment_id))
    frappe.db.set_value("Fee Validity", fee_validity.name, "ref_invoice",
                        sales_invoice.name)
    consultation = frappe.db.exists({
        "doctype": "Consultation",
        "appointment": appointment_id
    })
    if consultation:
        frappe.db.set_value("Consultation", consultation[0][0], "invoice",
                            sales_invoice.name)
    return sales_invoice.name
Beispiel #4
0
def create_sales_invoice():
    patient = create_patient()
    medical_department = create_medical_department()
    insulin_resistance_template = create_lab_test_template()
    blood_test_template = create_blood_test_template(medical_department)

    sales_invoice = frappe.new_doc('Sales Invoice')
    sales_invoice.patient = patient
    sales_invoice.customer = frappe.db.get_value('Patient', patient,
                                                 'customer')
    sales_invoice.due_date = getdate()
    sales_invoice.company = '_Test Company'
    sales_invoice.debit_to = get_receivable_account('_Test Company')

    tests = [insulin_resistance_template, blood_test_template]
    for entry in tests:
        sales_invoice.append(
            'items', {
                'item_code': entry.item,
                'item_name': entry.lab_test_name,
                'description': entry.lab_test_description,
                'qty': 1,
                'uom': 'Nos',
                'conversion_factor': 1,
                'income_account': get_income_account(None, '_Test Company'),
                'rate': entry.lab_test_rate,
                'amount': entry.lab_test_rate
            })

    sales_invoice.set_missing_values()

    sales_invoice.submit()
    return sales_invoice
Beispiel #5
0
def invoice_appointment(appointment_doc):
	if not appointment_doc.name:
		return False
	sales_invoice = frappe.new_doc("Sales Invoice")
	sales_invoice.customer = frappe.get_value("Patient", appointment_doc.patient, "customer")
	sales_invoice.appointment = appointment_doc.name
	sales_invoice.due_date = getdate()
	sales_invoice.is_pos = True
	sales_invoice.company = appointment_doc.company
	sales_invoice.debit_to = get_receivable_account(appointment_doc.company)

	item_line = sales_invoice.append("items")
	service_item, practitioner_charge = service_item_and_practitioner_charge(appointment_doc)
	item_line.item_code = service_item
	item_line.description = "Consulting Charges:  " + appointment_doc.practitioner
	item_line.income_account = get_income_account(appointment_doc.practitioner, appointment_doc.company)
	item_line.rate = practitioner_charge
	item_line.amount = practitioner_charge
	item_line.qty = 1
	item_line.reference_dt = "Patient Appointment"
	item_line.reference_dn = appointment_doc.name

	payments_line = sales_invoice.append("payments")
	payments_line.mode_of_payment = appointment_doc.mode_of_payment
	payments_line.amount = appointment_doc.paid_amount

	sales_invoice.set_missing_values(for_validate = True)

	sales_invoice.save(ignore_permissions=True)
	sales_invoice.submit()
	frappe.msgprint(_("Sales Invoice {0} created as paid".format(sales_invoice.name)), alert=True)
def invoice_appointment(appointment_doc):
	if not appointment_doc.name:
		return False
	sales_invoice = frappe.new_doc("Sales Invoice")
	sales_invoice.customer = frappe.get_value("Patient", appointment_doc.patient, "customer")
	sales_invoice.appointment = appointment_doc.name
	sales_invoice.due_date = getdate()
	sales_invoice.is_pos = True
	sales_invoice.company = appointment_doc.company
	sales_invoice.debit_to = get_receivable_account(appointment_doc.company)

	item_line = sales_invoice.append("items")
	service_item, practitioner_charge = service_item_and_practitioner_charge(appointment_doc)
	item_line.item_code = service_item
	item_line.description = "Consulting Charges:  " + appointment_doc.practitioner
	item_line.income_account = get_income_account(appointment_doc.practitioner, appointment_doc.company)
	item_line.rate = practitioner_charge
	item_line.amount = practitioner_charge
	item_line.qty = 1
	item_line.reference_dt = "Patient Appointment"
	item_line.reference_dn = appointment_doc.name

	payments_line = sales_invoice.append("payments")
	payments_line.mode_of_payment = appointment_doc.mode_of_payment
	payments_line.amount = appointment_doc.paid_amount

	sales_invoice.set_missing_values(for_validate = True)

	sales_invoice.save(ignore_permissions=True)
	sales_invoice.submit()
	frappe.msgprint(_("Sales Invoice {0} created as paid".format(sales_invoice.name)), alert=True)
def create_sales_invoice(appointment_doc):
	sales_invoice = frappe.new_doc('Sales Invoice')
	sales_invoice.patient = appointment_doc.patient
	sales_invoice.customer = frappe.get_value('Patient', appointment_doc.patient, 'customer')
	sales_invoice.appointment = appointment_doc.name
	sales_invoice.due_date = getdate()
	sales_invoice.company = appointment_doc.company
	sales_invoice.debit_to = get_receivable_account(appointment_doc.company)

	item = sales_invoice.append('items', {})
	item = get_appointment_item(appointment_doc, item)

	# Add payments if payment details are supplied else proceed to create invoice as Unpaid
	if appointment_doc.mode_of_payment and appointment_doc.paid_amount:
		sales_invoice.is_pos = 1
		payment = sales_invoice.append('payments', {})
		payment.mode_of_payment = appointment_doc.mode_of_payment
		payment.amount = appointment_doc.paid_amount

	sales_invoice.set_missing_values(for_validate=True)
	sales_invoice.flags.ignore_mandatory = True
	sales_invoice.save(ignore_permissions=True)
	sales_invoice.submit()
	frappe.msgprint(_('Sales Invoice {0} created').format(sales_invoice.name), alert=True)
	frappe.db.set_value('Patient Appointment', appointment_doc.name, {
		'invoiced': 1,
		'ref_sales_invoice': sales_invoice.name
	})
Beispiel #8
0
	def set_missing_values(source, target):
		target.customer = frappe.db.get_value('Patient', source.patient, 'customer')
		target.due_date = getdate()
		target.debit_to = get_receivable_account(source.company)
		item = target.append('items', {})
		item = get_therapy_item(source, item)
		target.set_missing_values(for_validate=True)
Beispiel #9
0
def set_sales_invoice_fields(company, patient):
    sales_invoice = frappe.new_doc("Sales Invoice")
    sales_invoice.customer = frappe.get_value("Patient", patient, "customer")
    # patient is custom field in sales inv.
    sales_invoice.due_date = getdate()
    sales_invoice.is_pos = '0'
    sales_invoice.debit_to = get_receivable_account(company)

    return sales_invoice
Beispiel #10
0
def set_sales_invoice_fields(company, patient):
	sales_invoice = frappe.new_doc("Sales Invoice")
	sales_invoice.customer = frappe.get_value("Patient", patient, "customer")
	# patient is custom field in sales inv.
	sales_invoice.due_date = getdate()
	sales_invoice.is_pos = '0'
	sales_invoice.debit_to = get_receivable_account(company)

	return sales_invoice
def invoice_appointment(appointment_doc):
    automate_invoicing = frappe.db.get_single_value(
        'Healthcare Settings', 'automate_appointment_invoicing')
    appointment_invoiced = frappe.db.get_value('Patient Appointment',
                                               appointment_doc.name,
                                               'invoiced')
    enable_free_follow_ups = frappe.db.get_single_value(
        'Healthcare Settings', 'enable_free_follow_ups')
    if enable_free_follow_ups:
        fee_validity = check_fee_validity(appointment_doc)
        if fee_validity and fee_validity.status == 'Completed':
            fee_validity = None
        elif not fee_validity:
            if frappe.db.exists('Fee Validity Reference',
                                {'appointment': appointment_doc.name}):
                return
            if check_is_new_patient(appointment_doc.patient,
                                    appointment_doc.name):
                return
    else:
        fee_validity = None

    if automate_invoicing and not appointment_invoiced and not fee_validity:
        sales_invoice = frappe.new_doc('Sales Invoice')
        sales_invoice.patient = appointment_doc.patient
        sales_invoice.customer = frappe.get_value('Patient',
                                                  appointment_doc.patient,
                                                  'customer')
        sales_invoice.appointment = appointment_doc.name
        sales_invoice.due_date = getdate()
        sales_invoice.company = appointment_doc.company
        sales_invoice.debit_to = get_receivable_account(
            appointment_doc.company)

        item = sales_invoice.append('items', {})
        item = get_appointment_item(appointment_doc, item)

        # Add payments if payment details are supplied else proceed to create invoice as Unpaid
        if appointment_doc.mode_of_payment and appointment_doc.paid_amount:
            sales_invoice.is_pos = 1
            payment = sales_invoice.append('payments', {})
            payment.mode_of_payment = appointment_doc.mode_of_payment
            payment.amount = appointment_doc.paid_amount

        sales_invoice.set_missing_values(for_validate=True)
        sales_invoice.flags.ignore_mandatory = True
        sales_invoice.save(ignore_permissions=True)
        sales_invoice.submit()
        frappe.msgprint(_('Sales Invoice {0} created'.format(
            sales_invoice.name)),
                        alert=True)
        frappe.db.set_value('Patient Appointment', appointment_doc.name,
                            'invoiced', 1)
        frappe.db.set_value('Patient Appointment', appointment_doc.name,
                            'ref_sales_invoice', sales_invoice.name)
def invoice_appointment(name):
    appointment_doc = frappe.get_doc("Patient Appointment", name)
    automate_invoicing = frappe.db.get_single_value(
        'Healthcare Settings', 'automate_appointment_invoicing')
    appointment_invoiced = frappe.db.get_value(
        'Patient Appointment', appointment_doc.name, 'invoiced')

    if not automate_invoicing and not appointment_doc.insurance_subscription and appointment_doc.mode_of_payment and not appointment_invoiced:
        sales_invoice = frappe.new_doc('Sales Invoice')
        sales_invoice.patient = appointment_doc.patient
        sales_invoice.customer = frappe.get_value(
            'Patient', appointment_doc.patient, 'customer')
        sales_invoice.appointment = appointment_doc.name
        sales_invoice.due_date = getdate()
        sales_invoice.company = appointment_doc.company
        sales_invoice.debit_to = get_receivable_account(
            appointment_doc.company)
        sales_invoice.healthcare_service_unit = appointment_doc.service_unit
        sales_invoice.healthcare_practitioner = appointment_doc.practitioner

        item = sales_invoice.append('items', {})
        item = get_appointment_item(appointment_doc, item)
        item.rate = appointment_doc.paid_amount
        item.amount = appointment_doc.paid_amount

        # Add payments if payment details are supplied else proceed to create invoice as Unpaid
        if appointment_doc.mode_of_payment and appointment_doc.paid_amount:
            sales_invoice.is_pos = 1
            payment = sales_invoice.append('payments', {})
            payment.mode_of_payment = appointment_doc.mode_of_payment
            payment.amount = appointment_doc.paid_amount

        sales_invoice.set_taxes()
        sales_invoice.set_missing_values(for_validate=True)
        sales_invoice.flags.ignore_mandatory = True
        sales_invoice.save(ignore_permissions=True)
        sales_invoice.calculate_taxes_and_totals()
        sales_invoice.submit()
        frappe.msgprint(_('Sales Invoice {0} created'.format(
            sales_invoice.name)))
        appointment_doc = frappe.get_doc(
            "Patient Appointment", appointment_doc.name)
        appointment_doc.ref_sales_invoice = sales_invoice.name
        appointment_doc.invoiced = 1
        appointment_doc.db_update()
        make_vital(appointment_doc, 'patient_appointment')
        return "true"
Beispiel #13
0
def create_invoice(company, patient, physician, consultation_id):
	if not consultation_id:
		return False
	sales_invoice = frappe.new_doc("Sales Invoice")
	sales_invoice.customer = frappe.get_value("Patient", patient, "customer")
	sales_invoice.due_date = getdate()
	sales_invoice.is_pos = '0'
	sales_invoice.debit_to = get_receivable_account(company)

	create_invoice_items(physician, sales_invoice, company)

	sales_invoice.save(ignore_permissions=True)
	frappe.db.sql("""update tabConsultation set invoice=%s where name=%s""", (sales_invoice.name, consultation_id))
	appointment = frappe.db.get_value("Consultation", consultation_id, "appointment")
	if appointment:
		frappe.db.set_value("Patient Appointment", appointment, "sales_invoice", sales_invoice.name)
	return sales_invoice.name
Beispiel #14
0
def create_invoice(company, patient, physician, consultation_id):
	if not consultation_id:
		return False
	sales_invoice = frappe.new_doc("Sales Invoice")
	sales_invoice.customer = frappe.get_value("Patient", patient, "customer")
	sales_invoice.due_date = getdate()
	sales_invoice.is_pos = '0'
	sales_invoice.debit_to = get_receivable_account(company)

	create_invoice_items(physician, sales_invoice, company)

	sales_invoice.save(ignore_permissions=True)
	frappe.db.sql("""update tabConsultation set invoice=%s where name=%s""", (sales_invoice.name, consultation_id))
	appointment = frappe.db.get_value("Consultation", consultation_id, "appointment")
	if appointment:
		frappe.db.set_value("Patient Appointment", appointment, "sales_invoice", sales_invoice.name)
	return sales_invoice.name
Beispiel #15
0
def make_invoice(patient, company):
	sales_invoice = frappe.new_doc("Sales Invoice")
	sales_invoice.customer = frappe.get_value("Patient", patient, "customer")
	sales_invoice.due_date = getdate()
	sales_invoice.company = company
	sales_invoice.is_pos = '0'
	sales_invoice.debit_to = get_receivable_account(company)

	item_line = sales_invoice.append("items")
	item_line.item_name = "Registeration Fee"
	item_line.description = "Registeration Fee"
	item_line.qty = 1
	item_line.uom = "Nos"
	item_line.conversion_factor = 1
	item_line.income_account = get_income_account(None, company)
	item_line.rate = frappe.get_value("Healthcare Settings", None, "registration_fee")
	item_line.amount = item_line.rate
	sales_invoice.set_missing_values()
	return sales_invoice
Beispiel #16
0
def make_invoice(patient, company):
	sales_invoice = frappe.new_doc("Sales Invoice")
	sales_invoice.customer = frappe.get_value("Patient", patient, "customer")
	sales_invoice.due_date = getdate()
	sales_invoice.company = company
	sales_invoice.is_pos = '0'
	sales_invoice.debit_to = get_receivable_account(company)

	item_line = sales_invoice.append("items")
	item_line.item_name = "Registeration Fee"
	item_line.description = "Registeration Fee"
	item_line.qty = 1
	item_line.uom = "Nos"
	item_line.conversion_factor = 1
	item_line.income_account = get_income_account(None, company)
	item_line.rate = frappe.get_value("Healthcare Settings", None, "registration_fee")
	item_line.amount = item_line.rate
	sales_invoice.set_missing_values()
	return sales_invoice
Beispiel #17
0
def make_invoice(patient, company):
	uom = frappe.db.exists('UOM', 'Nos') or frappe.db.get_single_value('Stock Settings', 'stock_uom')
	sales_invoice = frappe.new_doc('Sales Invoice')
	sales_invoice.customer = frappe.db.get_value('Patient', patient, 'customer')
	sales_invoice.due_date = getdate()
	sales_invoice.company = company
	sales_invoice.is_pos = 0
	sales_invoice.debit_to = get_receivable_account(company)

	item_line = sales_invoice.append('items')
	item_line.item_name = 'Registeration Fee'
	item_line.description = 'Registeration Fee'
	item_line.qty = 1
	item_line.uom = uom
	item_line.conversion_factor = 1
	item_line.income_account = get_income_account(None, company)
	item_line.rate = frappe.db.get_single_value('Healthcare Settings', 'registration_fee')
	item_line.amount = item_line.rate
	sales_invoice.set_missing_values()
	return sales_invoice
Beispiel #18
0
def create_invoice(company, physician, patient, appointment_id, appointment_date):
	if not appointment_id:
		return False
	sales_invoice = frappe.new_doc("Sales Invoice")
	sales_invoice.customer = frappe.get_value("Patient", patient, "customer")
	sales_invoice.appointment = appointment_id
	sales_invoice.due_date = getdate()
	sales_invoice.is_pos = '0'
	sales_invoice.debit_to = get_receivable_account(company)

	fee_validity = get_fee_validity(physician, patient, appointment_date)
	create_invoice_items(appointment_id, physician, company, sales_invoice)

	sales_invoice.save(ignore_permissions=True)
	frappe.db.sql("""update `tabPatient Appointment` set sales_invoice=%s where name=%s""", (sales_invoice.name, appointment_id))
	frappe.db.set_value("Fee Validity", fee_validity.name, "ref_invoice", sales_invoice.name)
	consultation = frappe.db.exists({
			"doctype": "Consultation",
			"appointment": appointment_id})
	if consultation:
		frappe.db.set_value("Consultation", consultation[0][0], "invoice", sales_invoice.name)
	return sales_invoice.name
Beispiel #19
0
def create_sales_invoice(appointment_doc):
    sales_invoice = frappe.new_doc("Sales Invoice")
    sales_invoice.patient = appointment_doc.patient
    sales_invoice.customer = frappe.get_value("Patient",
                                              appointment_doc.patient,
                                              "customer")
    sales_invoice.currency = frappe.get_value(
        "Customer", sales_invoice.customer,
        "default_currency") or get_company_currency(appointment_doc.company)

    sales_invoice.appointment = appointment_doc.name
    sales_invoice.due_date = getdate()
    sales_invoice.company = appointment_doc.company
    sales_invoice.debit_to = get_receivable_account(appointment_doc.company)

    item = sales_invoice.append("items", {})
    item = get_appointment_item(appointment_doc, item)

    # Add payments if payment details are supplied else proceed to create invoice as Unpaid
    if appointment_doc.mode_of_payment and appointment_doc.paid_amount:
        sales_invoice.is_pos = 1
        payment = sales_invoice.append("payments", {})
        payment.mode_of_payment = appointment_doc.mode_of_payment
        payment.amount = appointment_doc.paid_amount

    sales_invoice.set_missing_values(for_validate=True)
    sales_invoice.flags.ignore_mandatory = True
    sales_invoice.save(ignore_permissions=True)
    sales_invoice.submit()
    frappe.msgprint(_("Sales Invoice {0} created").format(sales_invoice.name),
                    alert=True)
    frappe.db.set_value(
        "Patient Appointment",
        appointment_doc.name,
        {
            "invoiced": 1,
            "ref_sales_invoice": sales_invoice.name
        },
    )
Beispiel #20
0
def invoice_appointment(appointment_doc):
    if not appointment_doc.name:
        return False
    sales_invoice = frappe.new_doc("Sales Invoice")
    sales_invoice.customer = frappe.get_value("Patient",
                                              appointment_doc.patient,
                                              "customer")
    sales_invoice.appointment = appointment_doc.name
    sales_invoice.due_date = getdate()
    sales_invoice.is_pos = '0'
    sales_invoice.company = appointment_doc.company
    sales_invoice.debit_to = get_receivable_account(appointment_doc.company)

    fee_validity = get_fee_validity(appointment_doc.practitioner,
                                    appointment_doc.patient,
                                    appointment_doc.appointment_date)
    procedure_template = False
    if appointment_doc.procedure_template:
        procedure_template = appointment_doc.procedure_template
    create_invoice_items(appointment_doc.practitioner, appointment_doc.company,
                         sales_invoice, procedure_template)

    sales_invoice.save(ignore_permissions=True)
    frappe.db.sql(
        """update `tabPatient Appointment` set sales_invoice=%s where name=%s""",
        (sales_invoice.name, appointment_doc.name))
    frappe.db.set_value("Fee Validity", fee_validity.name, "ref_invoice",
                        sales_invoice.name)
    encounter = frappe.db.exists({
        "doctype": "Patient Encounter",
        "appointment": appointment_doc.name
    })
    if encounter:
        frappe.db.set_value("Patient Encounter", encounter[0][0], "invoice",
                            sales_invoice.name)
    return sales_invoice.name
Beispiel #21
0
def create_sales_invoice():
    patient = create_patient()
    medical_department = create_medical_department()
    insulin_resistance_template = create_lab_test_template()
    blood_test_template = create_blood_test_template(medical_department)

    sales_invoice = frappe.new_doc("Sales Invoice")
    sales_invoice.patient = patient
    sales_invoice.customer = frappe.db.get_value("Patient", patient,
                                                 "customer")
    sales_invoice.due_date = getdate()
    sales_invoice.company = "_Test Company"
    sales_invoice.currency = "INR"
    sales_invoice.debit_to = get_receivable_account("_Test Company")

    tests = [insulin_resistance_template, blood_test_template]
    for entry in tests:
        sales_invoice.append(
            "items",
            {
                "item_code": entry.item,
                "item_name": entry.lab_test_name,
                "description": entry.lab_test_description,
                "qty": 1,
                "uom": "Nos",
                "conversion_factor": 1,
                "income_account": get_income_account(None, "_Test Company"),
                "rate": entry.lab_test_rate,
                "amount": entry.lab_test_rate,
            },
        )

    sales_invoice.set_missing_values()

    sales_invoice.submit()
    return sales_invoice
def invoice_appointment(name):
    appointment_doc = frappe.get_doc("Patient Appointment", name)
    if appointment_doc.billing_item:
        if appointment_doc.mode_of_payment:
            appointment_doc.paid_amount = get_mop_amount(
                appointment_doc.billing_item,
                appointment_doc.mode_of_payment,
                appointment_doc.company,
                appointment_doc.patient,
            )
        else:
            appointment_doc.paid_amount = get_insurance_amount(
                appointment_doc.insurance_subscription,
                appointment_doc.billing_item,
                appointment_doc.company,
                appointment_doc.insurance_company,
            )
        appointment_doc.save()
        appointment_doc.reload()
    set_follow_up(appointment_doc, "invoice_appointment")
    automate_invoicing = frappe.db.get_single_value(
        "Healthcare Settings", "automate_appointment_invoicing")

    if (not automate_invoicing and not appointment_doc.insurance_subscription
            and appointment_doc.mode_of_payment
            and not appointment_doc.invoiced
            and not appointment_doc.ref_sales_invoice
            and not appointment_doc.follow_up):
        sales_invoice = frappe.new_doc("Sales Invoice")
        sales_invoice.patient = appointment_doc.patient
        sales_invoice.customer = frappe.get_value("Patient",
                                                  appointment_doc.patient,
                                                  "customer")
        sales_invoice.appointment = appointment_doc.name
        sales_invoice.due_date = getdate()
        sales_invoice.company = appointment_doc.company
        sales_invoice.debit_to = get_receivable_account(
            appointment_doc.company)
        sales_invoice.healthcare_service_unit = appointment_doc.service_unit
        sales_invoice.healthcare_practitioner = appointment_doc.practitioner

        item = sales_invoice.append("items", {})
        item = get_appointment_item(appointment_doc, item)
        item.rate = appointment_doc.paid_amount
        item.amount = appointment_doc.paid_amount

        # Add payments if payment details are supplied else proceed to create invoice as Unpaid
        if appointment_doc.mode_of_payment and appointment_doc.paid_amount:
            sales_invoice.is_pos = 1
            payment = sales_invoice.append("payments", {})
            payment.mode_of_payment = appointment_doc.mode_of_payment
            payment.amount = appointment_doc.paid_amount

        sales_invoice.set_taxes()
        sales_invoice.set_missing_values(for_validate=True)
        sales_invoice.flags.ignore_mandatory = True
        sales_invoice.save(ignore_permissions=True)
        sales_invoice.calculate_taxes_and_totals()
        sales_invoice.submit()
        frappe.msgprint(
            _("Sales Invoice {0} created".format(sales_invoice.name)))
        appointment_doc = frappe.get_doc("Patient Appointment",
                                         appointment_doc.name)
        appointment_doc.ref_sales_invoice = sales_invoice.name
        appointment_doc.invoiced = 1
        appointment_doc.db_update()
        make_next_doc(appointment_doc, "validate")
        return "true"