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" />