From 5683fd5d7a0ef6d2a5e662af1e3337bf786dec55 Mon Sep 17 00:00:00 2001
From: raizasafeel <89463672+raizasafeel@users.noreply.github.com>
Date: Thu, 5 Mar 2026 02:03:24 +0530
Subject: [PATCH 1/3] fix: add get_field_meta function to get doctype field
metadata
---
lms/lms/api.py | 50 +++++++++++++++++++++++++++++++++++++++++++++++-
lms/lms/utils.py | 17 ++++++++++++++++
2 files changed, 66 insertions(+), 1 deletion(-)
diff --git a/lms/lms/api.py b/lms/lms/api.py
index 5140bf60..bf973d9a 100644
--- a/lms/lms/api.py
+++ b/lms/lms/api.py
@@ -37,6 +37,7 @@ from lms.lms.utils import (
get_average_rating,
get_batch_details,
get_course_details,
+ get_field_meta,
get_instructors,
get_lesson_count,
get_lms_route,
@@ -103,7 +104,54 @@ def validate_billing_access(billing_type: str, name: str):
as_dict=1,
)
- return {"access": access, "message": message, "address": address}
+ payment_fields = get_payment_field_meta()
+ address_fields = get_field_meta(
+ "Address",
+ [
+ "address_line1",
+ "address_line2",
+ "city",
+ "state",
+ "country",
+ "pincode",
+ "phone",
+ ],
+ )
+ billing_field_meta = {**payment_fields, **address_fields}
+
+ return {
+ "access": access,
+ "message": message,
+ "address": address,
+ "billing_field_meta": billing_field_meta,
+ }
+
+
+@frappe.whitelist()
+def get_payment_field_meta():
+ return get_field_meta(
+ "LMS Payment",
+ [
+ "member",
+ "billing_name",
+ "source",
+ "payment_for_document_type",
+ "payment_for_document",
+ "currency",
+ "amount",
+ "amount_with_gst",
+ "original_amount",
+ "discount_amount",
+ "coupon",
+ "coupon_code",
+ "address",
+ "gstin",
+ "pan",
+ "payment_id",
+ "order_id",
+ "member_consent",
+ ],
+ )
def verify_billing_access(doctype, name, billing_type):
diff --git a/lms/lms/utils.py b/lms/lms/utils.py
index 513512ba..7788b0ff 100644
--- a/lms/lms/utils.py
+++ b/lms/lms/utils.py
@@ -2328,3 +2328,20 @@ def recalculate_course_progress(course: str, member: str):
)
frappe.db.set_value("LMS Enrollment", membership, "progress", progress)
update_program_progress(member)
+
+
+def get_field_meta(doctype, fieldnames):
+ """Returns field metadata for 'fieldnames' from 'doctype'"""
+ meta = frappe.get_meta(doctype)
+ fieldnames_meta = {}
+
+ for fieldname in fieldnames:
+ field = meta.get_field(fieldname)
+ if field:
+ fieldnames_meta[fieldname] = {
+ "reqd": field.reqd,
+ "default": field.default,
+ "description": field.description,
+ }
+
+ return fieldnames_meta
From a893c405d14bdd7d3609ecf9c38c8d1ca090641a Mon Sep 17 00:00:00 2001
From: raizasafeel <89463672+raizasafeel@users.noreply.github.com>
Date: Thu, 5 Mar 2026 02:05:00 +0530
Subject: [PATCH 2/3] fix: replace hardcoded meta fields with validation from
backend
---
.../Transactions/TransactionDetails.vue | 79 ++++++++++++-------
.../Settings/Transactions/Transactions.vue | 9 ++-
frontend/src/pages/Billing.vue | 56 ++++++++-----
3 files changed, 95 insertions(+), 49 deletions(-)
diff --git a/frontend/src/components/Settings/Transactions/TransactionDetails.vue b/frontend/src/components/Settings/Transactions/TransactionDetails.vue
index efd2cc88..5ad0ebba 100644
--- a/frontend/src/components/Settings/Transactions/TransactionDetails.vue
+++ b/frontend/src/components/Settings/Transactions/TransactionDetails.vue
@@ -55,17 +55,18 @@
:label="__('Member')"
doctype="User"
v-model="transactionData.member"
- :required="true"
+ :required="!!fieldMeta.member?.reqd"
/>
@@ -90,17 +93,18 @@
:label="__('Currency')"
v-model="transactionData.currency"
doctype="Currency"
- :required="true"
+ :required="!!fieldMeta.currency?.reqd"
/>
@@ -113,21 +117,25 @@
v-if="transactionData.coupon"
:label="__('Coupon Code')"
v-model="transactionData.coupon"
+ :required="!!fieldMeta.coupon?.reqd"
/>
@@ -140,17 +148,27 @@
:label="__('Address')"
v-model="transactionData.address"
doctype="Address"
- :required="true"
+ :required="!!fieldMeta.address?.reqd"
+ />
+
+
-
-
@@ -171,6 +189,10 @@ const show = defineModel('show')
const props = defineProps<{
transactions: any
data: any
+ fieldMeta: Record<
+ string,
+ { reqd?: number; default?: string; description?: string }
+ >
}>()
const saveTransaction = () => {
@@ -226,33 +248,36 @@ const openDetails = () => {
}
}
-const emptyTransactionData = {
+const getDefault = (fieldname: string) =>
+ props.fieldMeta[fieldname]?.default || null
+
+const getEmptyTransactionData = () => ({
payment_received: false,
payment_for_certificate: false,
- member: null,
- billing_name: null,
- source: null,
- payment_for_document_type: null,
- payment_for_document: null,
+ member: getDefault('member'),
+ billing_name: getDefault('billing_name'),
+ source: getDefault('source'),
+ payment_for_document_type: getDefault('payment_for_document_type'),
+ payment_for_document: getDefault('payment_for_document'),
member_consent: false,
- currency: null,
- amount: null,
- amount_with_gst: null,
- coupon: null,
- coupon_code: null,
- discount_amount: null,
- original_amount: null,
- order_id: null,
- payment_id: null,
- gstin: null,
- pan: null,
- address: null,
-}
+ currency: getDefault('currency'),
+ amount: getDefault('amount'),
+ amount_with_gst: getDefault('amount_with_gst'),
+ coupon: getDefault('coupon'),
+ coupon_code: getDefault('coupon_code'),
+ discount_amount: getDefault('discount_amount'),
+ original_amount: getDefault('original_amount'),
+ order_id: getDefault('order_id'),
+ payment_id: getDefault('payment_id'),
+ gstin: getDefault('gstin'),
+ pan: getDefault('pan'),
+ address: getDefault('address'),
+})
watch(
() => props.data,
(newVal) => {
- transactionData.value = newVal ? { ...newVal } : emptyTransactionData
+ transactionData.value = newVal ? { ...newVal } : getEmptyTransactionData()
},
{ immediate: true }
)
diff --git a/frontend/src/components/Settings/Transactions/Transactions.vue b/frontend/src/components/Settings/Transactions/Transactions.vue
index d2045b8a..eeb0d2a5 100644
--- a/frontend/src/components/Settings/Transactions/Transactions.vue
+++ b/frontend/src/components/Settings/Transactions/Transactions.vue
@@ -3,6 +3,7 @@
v-if="step == 'new'"
:transactions="transactions"
:data="data"
+ :fieldMeta="fieldMeta.data || {}"
v-model:show="show"
@updateStep="updateStep"
/>
@@ -17,13 +18,14 @@
v-else-if="step == 'details'"
:transactions="transactions"
:data="data"
+ :fieldMeta="fieldMeta.data || {}"
v-model:show="show"
@updateStep="updateStep"
/>