From 8eb71577b8c3e9448ae55bf4773753f7687255f9 Mon Sep 17 00:00:00 2001 From: NEERAJRAVIPRATAP Date: Tue, 9 Jan 2024 12:42:20 +0530 Subject: [PATCH 1/2] resolve conflicts and amount updation and locker filters --- .../doctype/gym_locker/gym_locker.json | 14 +- .../gym_member_name/gym_member_name.js | 86 +++++++++-- .../gym_membership_ui/gym_membership_ui.js | 133 +++++++++++++++--- .../gym_membership_ui/gym_membership_ui.json | 9 +- .../gym_membership_ui/gym_membership_ui.py | 41 ++++-- .../gym_subscription/gym_subscription.json | 2 +- .../doctype/gym_trainer/gym_trainer.js | 31 +++- .../doctype/gym_trainer/gym_trainer.py | 24 +++- 8 files changed, 282 insertions(+), 58 deletions(-) diff --git a/gym_management_system/gym_management_system/doctype/gym_locker/gym_locker.json b/gym_management_system/gym_management_system/doctype/gym_locker/gym_locker.json index d011ea9..aa2b4bc 100644 --- a/gym_management_system/gym_management_system/doctype/gym_locker/gym_locker.json +++ b/gym_management_system/gym_management_system/doctype/gym_locker/gym_locker.json @@ -27,24 +27,28 @@ { "fieldname": "start_date", "fieldtype": "Date", - "label": "Start Date" + "label": "Start Date", + "read_only": 1 }, { "fieldname": "end_date", "fieldtype": "Date", - "label": "End Date" + "label": "End Date", + "read_only": 1 }, { "fieldname": "gym_member", "fieldtype": "Link", "label": "Gym Member", - "options": "Gym Member Name" + "options": "Gym Member Name", + "read_only": 1 }, { "fieldname": "status", "fieldtype": "Select", "label": "Status", - "options": "Available\nOccupied" + "options": "Available\nOccupied", + "read_only": 1 }, { "fieldname": "locker_type", @@ -60,7 +64,7 @@ ], "index_web_pages_for_search": 1, "links": [], - "modified": "2024-01-06 23:41:33.956336", + "modified": "2024-01-08 18:13:06.933272", "modified_by": "Administrator", "module": "Gym Management System", "name": "Gym Locker", diff --git a/gym_management_system/gym_management_system/doctype/gym_member_name/gym_member_name.js b/gym_management_system/gym_management_system/doctype/gym_member_name/gym_member_name.js index 96af8a3..496c065 100644 --- a/gym_management_system/gym_management_system/doctype/gym_member_name/gym_member_name.js +++ b/gym_management_system/gym_management_system/doctype/gym_member_name/gym_member_name.js @@ -1,15 +1,79 @@ frappe.ui.form.on('Gym Member Name', { - validate: function (frm) { - if (frm.doc.last_name === null) { - frm.set_value("full_name", frm.doc.first_name) - } - else { - frm.set_value("full_name", frm.doc.first_name + " " + frm.doc.last_name); - } - }, - - after_save:function(frm){ - frappe.new_doc('Gym Membership UI') + + + validate: function (frm) + { + if (frm.doc.middle_name == null) + { + frm.set_value("full_name",frm.doc.first_name+" "+frm.doc.last_name) + } + else if (frm.doc.last_name == null) + { + frm.set_value("full_name",frm.doc.first_name+" "+frm.doc.middle_name) + } + else if (frm.doc.middle_name == null && frm.doc.last_name == null) + { + frm.set_value("full_name",frm.doc.first_name) + } + else { + frm.set_value("full_name",frm.doc.first_name+" "+frm.doc.middle_name+" "+frm.doc.last_name) + } + + }, + /*before_save: function (frm) { + + frm.call({ + + method: "send_email_notification", + + callback: function (r) { + if (r.message) { + frappe.msgprint(r.message); + } + } + }) + + }, + + + before_save: function (frm) + { + frm.call({ + + method: "execute", + + callback: function (r) { + if (r.message) { + frappe.msgprint(r.message); + } + } + }) + } +*/ + + + + + /*before_save: function (frm) { + frm.add_custom_button('Click me Button', function() { + var doc_name = frm.doc.name; + console.log(doc_name); + frappe.call({ + method: 'gym_management_system.gym_management_system.doctype.gym_trainer.gym_trainer.Set_Memeber_list', + args: { + abc: doc_name, + }, + callback: function(response) { + frappe.msgprint(response.message); + } + }); + }); + }*/ + + after_save: function(frm) { + frappe.new_doc('Gym Membership UI'); } + + }); diff --git a/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.js b/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.js index f922b88..09f0d9b 100644 --- a/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.js +++ b/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.js @@ -1,47 +1,91 @@ - function Ryzen(frm, cdt, cdn, row) { + function Ryzen(frm, cdt, cdn, roow) { + var totalAmount = 0; var child_table_data = frm.doc.member_subscription_details || []; $.each(child_table_data || [], function(index, row) { var llll = row.subscription_type; console.log(llll); - frappe.call({ + frappe.call({ // getting subscription duration method: 'gym_management_system.gym_management_system.doctype.gym_membership_ui.gym_membership_ui.show', args: { llll: llll }, callback: function(response) { - if (response && response.message) { + if (response.message == 0) { + console.log("Not Found") + } + else { + const membershipString = response.message[1]; + const match = membershipString.match(/\d+$/); + const integerValue = match ? parseInt(match[0], 10) : null; + console.log(integerValue); + var duration_subscription = parseInt(response.message); row.end_date = frappe.datetime.add_months(row.start_date, duration_subscription); - row.amount = 5000; - row.total_subscription_amount = 5000 * duration_subscription; - + row.amount = integerValue + row.total_subscription_amount = integerValue * duration_subscription; + totalAmount += row.total_subscription_amount; } + frm.set_value('fee', totalAmount); + frm.refresh_field('fee'); frm.refresh_field('member_subscription_details'); } }); }); } + + + function moye(frm, cdt, cdn, row) { + var totalAmount = 0; + var child_table_data = frm.doc.locker_allocated || []; + + $.each(child_table_data || [], function(index, row) { + totalAmount += row.locker_fee; + }); + frm.set_value('locker_fee', totalAmount); + frm.refresh_field('locker_fee'); + frm.refresh_field('locker_allocated'); + } frappe.ui.form.on('Member child in membership', { subscription_type: Ryzen }); +frappe.ui.form.on('Locker child in membership', { + locker_id: moye +}); frappe.ui.form.on('Gym Membership UI', { - member_subscription_details_onadd: function(frm, cdt, cdn) { - // Trigger subscription_type for each row in the 'member_subscription_details' child table - $.each(frm.doc.member_subscription_details || [], function(index, row) { - frm.events['subscription_type'](frm, cdt, cdn, row); + $.each(frm.doc.member_subscription_details || [], function(index, row1) { + frm.events['subscription_type'](frm, cdt, cdn, roow); + }); + + }, + locker_allocated_onadd: function(frm, cdt, cdn) { + $.each(frm.doc.locker_allocated || [], function(index, row) { + frm.events['locker_id'](frm, cdt, cdn, row); }); }, + // refresh: function(frm) { + // frm.fields_dict['locker_allocated'].grid.get_field('locker_id').get_query = function(doc, cdt, cdn) { + // var child = locals[cdt][cdn]; + + // // Add 3 months to the current date and time + // var threeMonthsLater = frappe.datetime.now_datetime(); + // // frm.set_value('locker_allocated', cdt, 'locker_end_time', threeMonthsLater); + // doc.set_value(cdt, cdn, 'locker_end_time', threeMonthsLater); + // return { + // default: threeMonthsLater + // }; + // }; + // }, // discount @@ -130,24 +174,39 @@ d_locker_fee:function(frm){ }, - refresh: function(frm) { - frm.fields_dict['locker_allocated'].grid.get_field('locker_id').get_query = function(doc, cdt, cdn) { - var child_row = locals[cdt][cdn]; - return { - filters: { - status: "Available" - } - }; - }; - }, +refresh: function(frm) { + frm.fields_dict['locker_allocated'].grid.get_field('locker_id').get_query = function(doc, cdt, cdn) { + var child_row = locals[cdt][cdn]; + var filters = { + status: "Available" + }; + + if (frm.doc.locker_type_filter === ''){ + filters.status = "Available" + } + if (frm.doc.locker_type_filter === 'Small'){ + filters.locker_type = 'Small'; + } + if (frm.doc.locker_type_filter === 'Medium'){ + filters.locker_type = 'Medium'; + } + if (frm.doc.locker_type_filter === 'Large'){ + filters.locker_type = 'Large'; + } + + return { + filters: filters + }; + }; +}, onload: function(frm) { frm.fields_dict['member_subscription_details'].grid.get_field('subscription_type').get_query = function(doc, cdt, cdn) { var child_row = locals[cdt][cdn]; return { filters: { - member_assign: "" + member_assign: "Create New Subscription" } }; }; @@ -182,6 +241,7 @@ d_locker_fee:function(frm){ callback: function(response) { if (response) { console.log("locker update worked") + } } }); @@ -205,6 +265,37 @@ d_locker_fee:function(frm){ // }); // }, + // refresh: function(frm){ + // frm.set_query('register_users', () => { // “link” is field-type name linked to a Table + // return { + // filters: { + // creation: frm.doc.__last_sync_on || frappe.datetime.now_datetime() + // } + // } + // }) + + // } + + // member ID Subscription update + after_submit: function(frm){ + var membership_route = frappe.get_route() + // console.log("before call") + frappe.call({ + method: 'gym_management_system.gym_management_system.doctype.gym_membership_ui.gym_membership_ui.Techi', + args: { + arg: membership_route + }, + callback: function(response) { + if (response) { + console.log("locker update worked") + + } + } + }); + + + + } }); diff --git a/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.json b/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.json index d59079f..02ab097 100644 --- a/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.json +++ b/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.json @@ -19,6 +19,7 @@ "section_break_pda3j", "trainer_allocated", "locker_allocate_section", + "locker_type_filter", "locker_allocated", "bill", "fee", @@ -169,12 +170,18 @@ "fieldname": "d_locker_fee", "fieldtype": "Check", "label": "Discount on Locker Fee" + }, + { + "fieldname": "locker_type_filter", + "fieldtype": "Select", + "label": "Select Size", + "options": "Small\nMedium\nLarge" } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-01-07 20:17:50.875944", + "modified": "2024-01-08 22:17:17.941475", "modified_by": "Administrator", "module": "Gym Management System", "name": "Gym Membership UI", diff --git a/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.py b/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.py index 530008e..88c1e08 100644 --- a/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.py +++ b/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.py @@ -7,14 +7,17 @@ class GymMembershipUI(Document): from frappe.exceptions import DoesNotExistError # subscription duration @frappe.whitelist() def show(llll): - try: - doc = frappe.get_doc('Gym Subscription', llll) - x = doc.duration_subscription - return x - except frappe.DoesNotExistError: - frappe.msgprint(f"Gym Subscription with ID {llll} not found.") - return 0 - + if (llll): + try: + doc = frappe.get_doc('Gym Subscription', llll) + x = doc.duration_subscription + y = doc.amount_01 + return x, y + except frappe.DoesNotExistError: + frappe.msgprint(f"Gym Subscription with ID {llll} not found.") + return 0 + elif (not llll): + return "Empty String" import ast # locker updation @frappe.whitelist() @@ -50,7 +53,27 @@ def snow(arg): # return "subs update worked" - +import ast # Subscription updation +@frappe.whitelist() +def techi(arg): + name = ast.literal_eval(arg) + doc = frappe.get_doc("Gym Membership UI", name[2]) + register_users = doc.get('register_users') + table_get = doc.get('member_subscription_details') + for row in table_get: + x = row.get('locker_id') + y = row.get('locker_type') + a = row.get('locker_start_time') + b = row.get('locker_end_time') + z = row.get('locker_fee') + print(f"Processing locker_id: {x}, locker_type: {y}, start_time: {a}, end_time: {b}, locker_fee: {z}") + moc = frappe.get_doc('Gym Locker', x) + moc.start_date = a + moc.end_date = b + moc.gym_member = register_users + moc.status = "Occupied" + moc.save() + return "Worked", 18 diff --git a/gym_management_system/gym_management_system/doctype/gym_subscription/gym_subscription.json b/gym_management_system/gym_management_system/doctype/gym_subscription/gym_subscription.json index 2ef44e5..86bf93c 100644 --- a/gym_management_system/gym_management_system/doctype/gym_subscription/gym_subscription.json +++ b/gym_management_system/gym_management_system/doctype/gym_subscription/gym_subscription.json @@ -8,7 +8,7 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ - "member_assign", + "gym_member", "amount_01", "duration_subscription", "section_break_fobqm", diff --git a/gym_management_system/gym_management_system/doctype/gym_trainer/gym_trainer.js b/gym_management_system/gym_management_system/doctype/gym_trainer/gym_trainer.js index 1aa8158..56323e9 100644 --- a/gym_management_system/gym_management_system/doctype/gym_trainer/gym_trainer.js +++ b/gym_management_system/gym_management_system/doctype/gym_trainer/gym_trainer.js @@ -1,9 +1,11 @@ -frappe.ui.form.on('Gym Trainer', { - zumba: function(frm) { + +frappe.ui.form.on('Gym Trainer', { + zumba: function(frm) { updateTotal(frm); }, yoga: function(frm) { updateTotal(frm); + }, cross_fit: function(frm) { updateTotal(frm); @@ -15,6 +17,7 @@ frappe.ui.form.on('Gym Trainer', { updateTotal(frm); }, + // after_save: function(frm){ // var doc_first_name = frm.doc.first_name; // var doc_name = frm.doc.name @@ -36,6 +39,24 @@ frappe.ui.form.on('Gym Trainer', { }); + // after_save: function(frm){ + // var doc_first_name = frm.doc.first_name; + // var doc_name = frm.doc.name + // console.log(doc_name); + // console.log(doc_first_name); + // frappe.call({ + // method: 'gym_management_system.gym_management_system.doctype.gym_trainer.gym_trainer.Set_Memeber_list', + // args: { + // abc: doc_name, + // }, + // callback: function(response) { + // var set_trainer = response.message.gym_trainer + // var member_name = response.message.name + // frappe.db.set_value('Gym Member Name', member_name, 'gym_trainer', set_trainer) + // console.log(set_trainer); + // }, + // }); + function updateTotal(frm) { var total = 0; if (frm.doc.zumba == 1) { @@ -53,5 +74,9 @@ function updateTotal(frm) { if (frm.doc.weight_lifting == 1) { total += frm.doc.weight_lifting_fee; } + frm.set_value('total', total); -} \ No newline at end of file +} + + + diff --git a/gym_management_system/gym_management_system/doctype/gym_trainer/gym_trainer.py b/gym_management_system/gym_management_system/doctype/gym_trainer/gym_trainer.py index 6ac3612..1f09f6d 100644 --- a/gym_management_system/gym_management_system/doctype/gym_trainer/gym_trainer.py +++ b/gym_management_system/gym_management_system/doctype/gym_trainer/gym_trainer.py @@ -1,14 +1,12 @@ # Copyright (c) 2024, Nestorbird_Trainee_Team and contributors -# For license information, please see license.txt - -from frappe.utils import getdate +# For license information, please see license.txtfrom frappe.utils import getdate import re import frappe from frappe import _ from frappe.model.document import Document -class GymTrainer(Document): - +from frappe.utils import getdate +class GymTrainer(Document): def validate(self): dob = getdate(self.dob) @@ -44,6 +42,18 @@ def on_update(self): # return member_doc - - + + +# @frappe.whitelist() +# def Set_Memeber_list(abc): +# doc_records = frappe.get_doc('Gym Trainer', abc) +# member_list = doc_records.get('member_details') +# member_name = [] +# for record in member_list: +# member_name.append(record.get('member_name')) +# member_name = member_name[0] +# member_doc = frappe.get_doc('Gym Member Name', member_name) +# member_doc.gym_trainer = abc +# member_doc.save() +# return member_doc From c30f6cb0a2b9d06cd7523ea19f31ef5b14f2d8ae Mon Sep 17 00:00:00 2001 From: NEERAJRAVIPRATAP Date: Fri, 26 Jan 2024 10:31:01 +0530 Subject: [PATCH 2/2] files --- .../doctype/group_class/group_class.js | 73 +-------- .../doctype/group_class/group_class.json | 36 ++++- .../doctype/group_class/group_class.py | 96 +++++------ .../gym_member_name/gym_member_name.py | 18 +++ .../gym_membership_ui/gym_membership_ui.js | 150 ++++++------------ .../gym_membership_ui/gym_membership_ui.json | 4 +- .../gym_membership_ui/gym_membership_ui.py | 104 +++++------- .../gym_subscription/gym_subscription.json | 34 ++-- .../locker_child_in_membership.json | 5 +- .../doctype/locker_details/__init__.py | 0 .../locker_details/locker_details.json | 31 +++- .../member_ship_details.json | 85 +++------- .../trainer_child__in_membership.json | 10 +- gym_management_system/hooks.py | 5 +- .../public/css/gym_member_name.css | 0 15 files changed, 257 insertions(+), 394 deletions(-) create mode 100644 gym_management_system/gym_management_system/doctype/locker_details/__init__.py create mode 100644 gym_management_system/public/css/gym_member_name.css diff --git a/gym_management_system/gym_management_system/doctype/group_class/group_class.js b/gym_management_system/gym_management_system/doctype/group_class/group_class.js index b9c85aa..c4d9b42 100644 --- a/gym_management_system/gym_management_system/doctype/group_class/group_class.js +++ b/gym_management_system/gym_management_system/doctype/group_class/group_class.js @@ -1,76 +1,5 @@ // File: gym_management_system/gym_management_system/doctype/group_class/public/js/group_class.js frappe.ui.form.on('Group Class', { - after_save: function(frm) { - frappe.msgprint("Assigned Class to Trainer"); - promptAndSendEmail(frm); - }, - after_insert: function(frm) { - notifyTrainer(frm); - }, - on_submit: function(frm) { - frappe.msgprint("Mail sent to trainer & member"); - }, +// }); -function notifyTrainer(frm) { - frappe.call({ - method: 'gym_management_system.gym_management_system.doctype.group_class.group_class.send_notification_to_trainer', - args: { - docname: frm.doc.name - }, - callback: function(r) { - if (r.message) { - frm.msgprint("Notification sent to Trainer!"); - } - } - }); -} - -function promptAndSendEmail(frm) { - frappe.prompt([ - { - fieldtype: 'Data', - label: 'Email Address', - fieldname: 'email', - reqd: true - } - ], function(values) { - // Send email and show progress message - console.log("check error !") - console.log(frm,values); - // console.log(email); - sendEmailToGymMember(frm, values.email); // Corrected variable name - }, 'Enter Gym Member Email', 'Submit'); -} - -function sendEmailToGymMember(frm, gymMemberEmail) { - console.log(frm,values.email) - showProgressIndicator(frm, 'Sending email to Gym Member...'); - frappe.call({ - method: 'gym_management_system.gym_management_system.doctype.group_class.group_class.send_email_to_gym_member', - args: { - docname: frm.doc.name, - email: gymMemberEmail - }, - callback: function(r) { - frm.dashboard.hide_progress(); - if (r.message) { - frm.msgprint('Mail sent to Gym Member!'); - } - } - }); -} - -function showProgressIndicator(frm, message) { - frm.dashboard.show_progress(__('Sending Email'), 0.5); - frappe.call({ - method: 'gym_management_system.gym_management_system.doctype.group_class.group_class.send_email_to_gym_member', - args: { - // Add any additional arguments as needed - }, - callback: function(r) { - frm.dashboard.hide_progress(); - frm.msgprint(message); - } - }); -} diff --git a/gym_management_system/gym_management_system/doctype/group_class/group_class.json b/gym_management_system/gym_management_system/doctype/group_class/group_class.json index 3c8faae..5abb5e1 100644 --- a/gym_management_system/gym_management_system/doctype/group_class/group_class.json +++ b/gym_management_system/gym_management_system/doctype/group_class/group_class.json @@ -14,7 +14,11 @@ "start_time", "end_time", "amended_from", - "full_name" + "members", + "gym_traainer", + "gym_member_nameeee", + "typeeee", + "emailllll" ], "fields": [ { @@ -56,16 +60,38 @@ "reqd": 1 }, { - "fieldname": "full_name", + "fieldname": "members", "fieldtype": "Table", - "label": "Gym Member Name", - "options": "Gym Member Name" + "label": "Members", + "options": "Trainer Member List" + }, + { + "fieldname": "gym_traainer", + "fieldtype": "Link", + "label": "Gym traainer", + "options": "Gym Trainer" + }, + { + "fetch_from": "member_trainer.first_name", + "fieldname": "gym_member_nameeee", + "fieldtype": "Data", + "label": "Gym Member Nameeee" + }, + { + "fieldname": "typeeee", + "fieldtype": "Data", + "label": "TYpeeee" + }, + { + "fieldname": "emailllll", + "fieldtype": "Data", + "label": "Emailllll" } ], "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-01-07 11:09:40.074927", + "modified": "2024-01-10 16:16:26.510456", "modified_by": "Administrator", "module": "Gym Management System", "name": "Group Class", diff --git a/gym_management_system/gym_management_system/doctype/group_class/group_class.py b/gym_management_system/gym_management_system/doctype/group_class/group_class.py index 7acfc32..4d35919 100644 --- a/gym_management_system/gym_management_system/doctype/group_class/group_class.py +++ b/gym_management_system/gym_management_system/doctype/group_class/group_class.py @@ -1,58 +1,48 @@ +# .py file Group class :- # File: gym_management_system/gym_management_system/doctype/group_class/group_class.py from frappe.model.document import Document import frappe class GroupClass(Document): - pass - -@frappe.whitelist() -def send_notification_to_trainer(docname): - try: - group_class = frappe.get_doc("Group Class", docname) - print(docname) - trainer_email = frappe.get_value("Gym Trainer", group_class.member_trainer, "email") - print(trainer_email) - - if trainer_email: - subject = f"Group Class '{group_class.name}' Details" - message = f"Hello Trainer {group_class.member_trainer}!\n\nGroup Class '{group_class.name}' details:\nClass Type: {group_class.class_type}\nStart Time: {group_class.start_time}\nEnd Time: {group_class.end_time}" - - frappe.sendmail( - recipients=[trainer_email], - subject=subject, - message=message - ) - - frappe.msgprint("Notification sent to Trainer!") - return True - else: - frappe.msgprint("Warning: Trainer email not found. Notification not sent.") - return False - except Exception as e: - frappe.msgprint(f"Error: {str(e)}") - return False - -@frappe.whitelist() -def send_email_to_gym_member(docname, email): - try: - group_class = frappe.get_doc("Group Class", docname) - member_email = frappe.get_value("Gym Member", {"name": group_class.gym_member_name}, "email") - - if member_email: - subject = f"Group Class '{group_class.name}' Details" - message = f"Hello Gym Member {group_class.gym_member_name}!\n\nGroup Class '{group_class.name}' details:\nClass Type: {group_class.class_type}\nStart Time: {group_class.start_time}\nEnd Time: {group_class.end_time}" - - frappe.sendmail( - recipients=[member_email], - subject=subject, - message=message - ) - - frappe.msgprint("Notification sent to Gym Member!") - return True - else: - frappe.msgprint("Warning: Gym Member email not found. Notification not sent.") - return False - except Exception as e: - frappe.msgprint(f"Error: {str(e)}") - return False + def before_submit(self): + print("before submit work") + try: + # group_class = frappe.get_doc("Group Class", self.name) + trainer = self.member_trainer + trainer_email = frappe.get_value("Gym Trainer", trainer, "email") + subject = "Group Class Details" + message = "Hello Trainer" + if trainer_email: + frappe.sendmail( + recipients=[trainer_email], + subject=subject, + message=message + ) + + except Exception as e: + frappe.msgprint(f"Error: {str(e)}") + return {'success': False} + # tnvn mpvq vdow umiu + + +# def send_email_to_gym_members(group_class): +# try: +# # Get Gym Members from the child table +# gym_members = frappe.get_all("Class Assign Member", filters={"parent": group_class.name}, pluck="gym_member") +# for gym_member in gym_members: +# # Get Gym Member's email +# member_email = frappe.get_value("Gym Member", {"name": gym_member}, "email_address") +# if member_email: +# # Send email to Gym Member +# subject = f"Group Class '{group_class.name}' Details" +# message = f"Hello Gym Member {gym_member}!\n\nGroup Class '{group_class.name}' details:\nClass Type: {group_class.class_type}\nStart Time: {group_class.start_time}\nEnd Time: {group_class.end_time}" +# frappe.sendmail( +# recipients=[member_email], +# subject=subject, +# message=message +# ) +# frappe.msgprint("Mail sent to Gym Members!") +# return {'success': True} +# except Exception as e: +# frappe.msgprint(f"Error sending email to Gym Members: {str(e)}") +# return {'success': False} diff --git a/gym_management_system/gym_management_system/doctype/gym_member_name/gym_member_name.py b/gym_management_system/gym_management_system/doctype/gym_member_name/gym_member_name.py index b33c2d6..12614f4 100644 --- a/gym_management_system/gym_management_system/doctype/gym_member_name/gym_member_name.py +++ b/gym_management_system/gym_management_system/doctype/gym_member_name/gym_member_name.py @@ -17,6 +17,24 @@ def on_submit(doc,method=None): "member_phone":doc.contact }) gym_trainer.save() + + + def before_save(doc): + try: + member_mail = doc.email_address + subject = "Welcome to Gtm Management System" + message = f"You are registered at Gym Management System with registration ID:{doc.name}" + if member_mail: + frappe.sendmail( + recipients=[member_mail], + subject=subject, + message=message + ) + frappe.msgprint("Registration mail sent to Member") + except Exception as e: + frappe.msgprint(f"Error: {str(e)}") + return {'success': False} + # a=frappe.get_doc("Gym Member Name",doc.name) # print(gym_trainer.name) # a.gym_trainer=gym_trainer.name diff --git a/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.js b/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.js index 09f0d9b..964f00b 100644 --- a/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.js +++ b/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.js @@ -1,38 +1,39 @@ - function Ryzen(frm, cdt, cdn, roow) { - var totalAmount = 0; - var child_table_data = frm.doc.member_subscription_details || []; - $.each(child_table_data || [], function(index, row) { - var llll = row.subscription_type; - console.log(llll); - frappe.call({ // getting subscription duration - method: 'gym_management_system.gym_management_system.doctype.gym_membership_ui.gym_membership_ui.show', - args: { - llll: llll - }, - callback: function(response) { - if (response.message == 0) { - console.log("Not Found") - } - else { - const membershipString = response.message[1]; - const match = membershipString.match(/\d+$/); - const integerValue = match ? parseInt(match[0], 10) : null; - console.log(integerValue); - - var duration_subscription = parseInt(response.message); - row.end_date = frappe.datetime.add_months(row.start_date, duration_subscription); - row.amount = integerValue - row.total_subscription_amount = integerValue * duration_subscription; - totalAmount += row.total_subscription_amount; - } - frm.set_value('fee', totalAmount); - frm.refresh_field('fee'); - frm.refresh_field('member_subscription_details'); +function Ryzen(frm, cdt, cdn, roow) { + var totalAmount = 0; + var child_table_data = frm.doc.member_subscription_details || []; + $.each(child_table_data || [], function(index, row) { + var llll = row.subscription_type; + // console.log(llll); + frappe.call({ // getting subscription duration + method: 'gym_management_system.gym_management_system.doctype.gym_membership_ui.gym_membership_ui.show', + args: { + llll : llll + }, + callback: function(response) { + if (response.message == 0) { + // console.log("Not Found") + } + else { + // const membershipString = response.message[1]; + // const match = membershipString.match(/\d+$/); + // const integerValue = match ? parseInt(match[0], 10) : null; + // console.log(integerValue); + + var duration_subscription = parseInt(response.message); + row.end_date = frappe.datetime.add_months(row.start_date, duration_subscription); + row.amount = response.message[1] + row.total_subscription_amount = response.message[1] * duration_subscription; + totalAmount += row.total_subscription_amount; } - }); + frm.set_value('fee', totalAmount); + frm.refresh_field('fee'); + frm.refresh_field('member_subscription_details'); + } }); - } + }); +} + function moye(frm, cdt, cdn, row) { @@ -49,10 +50,10 @@ -frappe.ui.form.on('Member child in membership', { +frappe.ui.form.on('Member child in membership',{ subscription_type: Ryzen }); -frappe.ui.form.on('Locker child in membership', { +frappe.ui.form.on('Locker child in membership',{ locker_id: moye }); @@ -61,18 +62,19 @@ frappe.ui.form.on('Locker child in membership', { frappe.ui.form.on('Gym Membership UI', { member_subscription_details_onadd: function(frm, cdt, cdn) { - $.each(frm.doc.member_subscription_details || [], function(index, row1) { - frm.events['subscription_type'](frm, cdt, cdn, roow); + $.each(frm.doc.member_subscription_details || [], function(index, row1) { //member_subscription_details is an Array here + frm.events['subscription_type'](frm, cdt, cdn, roow); }); }, locker_allocated_onadd: function(frm, cdt, cdn) { $.each(frm.doc.locker_allocated || [], function(index, row) { - frm.events['locker_id'](frm, cdt, cdn, row); + frm.events['locker_id'](frm, cdt, cdn, row); }); }, + // refresh: function(frm) { // frm.fields_dict['locker_allocated'].grid.get_field('locker_id').get_query = function(doc, cdt, cdn) { // var child = locals[cdt][cdn]; @@ -179,29 +181,27 @@ refresh: function(frm) { frm.fields_dict['locker_allocated'].grid.get_field('locker_id').get_query = function(doc, cdt, cdn) { var child_row = locals[cdt][cdn]; var filters = { - status: "Available" + status: "Available" }; - if (frm.doc.locker_type_filter === ''){ - filters.status = "Available" + filters.status = "Available" } if (frm.doc.locker_type_filter === 'Small'){ filters.locker_type = 'Small'; } if (frm.doc.locker_type_filter === 'Medium'){ - filters.locker_type = 'Medium'; + filters.locker_type = 'Medium'; } if (frm.doc.locker_type_filter === 'Large'){ - filters.locker_type = 'Large'; + filters.locker_type = 'Large'; } - return { filters: filters }; }; }, - onload: function(frm) { + onload: function(frm) { // subscription filter frm.fields_dict['member_subscription_details'].grid.get_field('subscription_type').get_query = function(doc, cdt, cdn) { var child_row = locals[cdt][cdn]; return { @@ -228,43 +228,6 @@ refresh: function(frm) { // }, - - // locker details update - before_submit: function(frm) { - var membership_route = frappe.get_route() - // console.log("before call") - frappe.call({ - method: 'gym_management_system.gym_management_system.doctype.gym_membership_ui.gym_membership_ui.snow', - args: { - arg: membership_route - }, - callback: function(response) { - if (response) { - console.log("locker update worked") - - } - } - }); - }, - - - // // subscription member update - // after_submit: function(frm) { - // var membership_route = frappe.get_route() - // console.log("before call") - // frappe.call({ - // method: 'gym_management_system.gym_management_system.doctype.gym_membership_ui.gym_membership_ui.rog', - // args: { - // arg: membership_route - // }, - // callback: function(response) { - // if (response) { - // console.log("sub update worked") - // } - // } - // }); - // }, - // refresh: function(frm){ // frm.set_query('register_users', () => { // “link” is field-type name linked to a Table // return { @@ -276,26 +239,15 @@ refresh: function(frm) { // } - // member ID Subscription update - after_submit: function(frm){ - var membership_route = frappe.get_route() - // console.log("before call") - frappe.call({ - method: 'gym_management_system.gym_management_system.doctype.gym_membership_ui.gym_membership_ui.Techi', - args: { - arg: membership_route - }, - callback: function(response) { - if (response) { - console.log("locker update worked") - - } - } - }); - + on_submit: function(frm){ + var u = frm.doc.register_users; + console.log('Worked'); + frappe.set_route("Form", "Gym Member Name", u); + } + -}); +}); diff --git a/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.json b/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.json index 02ab097..47a206b 100644 --- a/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.json +++ b/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.json @@ -1,7 +1,7 @@ { "actions": [], "allow_rename": 1, - "autoname": "format:Membership-{register_users}-{###}", + "autoname": "format:Membership-{full_name}-{###}", "creation": "2024-01-03 21:51:23.976009", "default_view": "List", "doctype": "DocType", @@ -181,7 +181,7 @@ "index_web_pages_for_search": 1, "is_submittable": 1, "links": [], - "modified": "2024-01-08 22:17:17.941475", + "modified": "2024-01-09 22:14:37.678539", "modified_by": "Administrator", "module": "Gym Management System", "name": "Gym Membership UI", diff --git a/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.py b/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.py index 88c1e08..b2c6c58 100644 --- a/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.py +++ b/gym_management_system/gym_management_system/doctype/gym_membership_ui/gym_membership_ui.py @@ -1,7 +1,48 @@ import frappe from frappe.model.document import Document class GymMembershipUI(Document): - pass + + def before_submit(self): + doc = frappe.get_doc("Gym Membership UI", self.name) # Gym-Member-Name Child- Subscription + addresss = self.register_users + table_get = doc.get('member_subscription_details') + for row in table_get: + x = row.get('subscription_type') + y = row.get('start_date') + a = row.get('end_date') + # z = row.get('total_subscription_amount') set from doctype + moc = frappe.get_doc('Gym Member Name', addresss) + child_row = moc.append('gym_subscription_details') + child_row.name = self.name + x + child_row.membership_id = self.name + child_row.membership_plan = x + child_row.start_date = y + child_row.end_date = a + # child_row.amount = z + moc.save() + + + locker_allocated = doc.get('locker_allocated') # Gym Locker Update + for row in locker_allocated: + x = row.get('locker_id') + y = row.get('locker_type') + a = row.get('locker_start_time') + b = row.get('locker_end_time') + z = row.get('locker_fee') + mocc = frappe.get_doc('Gym Locker', x) + mocc.start_date = a + mocc.end_date = b + mocc.gym_member = addresss + mocc.status = "Occupied" + mocc.save() + + for row in locker_allocated: # Gym Member Name child - locker + xx = row.get('locker_id') + mocccc = frappe.get_doc('Gym Member Name', addresss) + child_row = mocccc.append('gym_locker_details') + child_row.id = xx + mocccc.save() + from frappe.exceptions import DoesNotExistError # subscription duration @@ -11,70 +52,11 @@ def show(llll): try: doc = frappe.get_doc('Gym Subscription', llll) x = doc.duration_subscription - y = doc.amount_01 + y = doc.amount return x, y except frappe.DoesNotExistError: frappe.msgprint(f"Gym Subscription with ID {llll} not found.") return 0 elif (not llll): return "Empty String" - -import ast # locker updation -@frappe.whitelist() -def snow(arg): - name = ast.literal_eval(arg) - doc = frappe.get_doc("Gym Membership UI", name[2]) - register_users = doc.get('register_users') - locker_allocated = doc.get('locker_allocated') - for row in locker_allocated: - x = row.get('locker_id') - y = row.get('locker_type') - a = row.get('locker_start_time') - b = row.get('locker_end_time') - z = row.get('locker_fee') - print(f"Processing locker_id: {x}, locker_type: {y}, start_time: {a}, end_time: {b}, locker_fee: {z}") - moc = frappe.get_doc('Gym Locker', x) - moc.start_date = a - moc.end_date = b - moc.gym_member = register_users - moc.status = "Occupied" - moc.save() - return "Worked", 18 - -# import ast # subscription member update -# @frappe.whitelist() -# def rog(arg): -# name = ast.literal_eval(arg) -# register_users = doc.get('register_users') -# x = row.get('subscription_type') -# moc = frappe.get_doc('Gym Subscription', x) -# moc.member_assign = register_users -# moc.save() -# return "subs update worked" - - -import ast # Subscription updation -@frappe.whitelist() -def techi(arg): - name = ast.literal_eval(arg) - doc = frappe.get_doc("Gym Membership UI", name[2]) - register_users = doc.get('register_users') - table_get = doc.get('member_subscription_details') - for row in table_get: - x = row.get('locker_id') - y = row.get('locker_type') - a = row.get('locker_start_time') - b = row.get('locker_end_time') - z = row.get('locker_fee') - print(f"Processing locker_id: {x}, locker_type: {y}, start_time: {a}, end_time: {b}, locker_fee: {z}") - moc = frappe.get_doc('Gym Locker', x) - moc.start_date = a - moc.end_date = b - moc.gym_member = register_users - moc.status = "Occupied" - moc.save() - return "Worked", 18 - - - diff --git a/gym_management_system/gym_management_system/doctype/gym_subscription/gym_subscription.json b/gym_management_system/gym_management_system/doctype/gym_subscription/gym_subscription.json index 86bf93c..dcb43fd 100644 --- a/gym_management_system/gym_management_system/doctype/gym_subscription/gym_subscription.json +++ b/gym_management_system/gym_management_system/doctype/gym_subscription/gym_subscription.json @@ -1,28 +1,21 @@ { "actions": [], "allow_rename": 1, - "autoname": "format:GS-{YYYY}-{duration_subscription}", + "autoname": "format:{##}-{type}-{YYYY}-{duration_subscription}", "creation": "2024-01-03 18:02:51.926857", "default_view": "List", "doctype": "DocType", "editable_grid": 1, "engine": "InnoDB", "field_order": [ - "gym_member", - "amount_01", + "type", + "amount", "duration_subscription", "section_break_fobqm", "amended_from", "member_name" ], "fields": [ - { - "fieldname": "amount_01", - "fieldtype": "Select", - "label": "Amount", - "options": "Rs.2000 :- Weight-Lifting\nRs.3000 :- Zumba\nRs.5000:- Yoga\nRs.4000 :- Cross-Fit\nRs.5000 :-Cardio\nRs.3500 :- Strength-Fitness", - "reqd": 1 - }, { "fieldname": "duration_subscription", "fieldtype": "Select", @@ -46,21 +39,28 @@ "fieldtype": "Section Break" }, { - "fieldname": "member_assign", + "fieldname": "member_name", "fieldtype": "Link", - "label": "Member Assign Subscription", + "label": "Assign Member", "options": "Gym Member Name" }, { - "fieldname": "member_name", - "fieldtype": "Link", - "label": "Member Name", - "options": "Gym Member Name" + "fieldname": "amount", + "fieldtype": "Currency", + "label": "Amount", + "reqd": 1 + }, + { + "fieldname": "type", + "fieldtype": "Select", + "label": "Subscription Plan", + "options": "Zumba\nYoga\nCardio", + "reqd": 1 } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2024-01-08 11:19:57.024935", + "modified": "2024-01-09 13:15:06.461575", "modified_by": "Administrator", "module": "Gym Management System", "name": "Gym Subscription", diff --git a/gym_management_system/gym_management_system/doctype/locker_child_in_membership/locker_child_in_membership.json b/gym_management_system/gym_management_system/doctype/locker_child_in_membership/locker_child_in_membership.json index 78a86e3..1c19959 100644 --- a/gym_management_system/gym_management_system/doctype/locker_child_in_membership/locker_child_in_membership.json +++ b/gym_management_system/gym_management_system/doctype/locker_child_in_membership/locker_child_in_membership.json @@ -35,7 +35,8 @@ "fieldname": "locker_end_time", "fieldtype": "Datetime", "in_list_view": 1, - "label": "To" + "label": "To", + "reqd": 1 }, { "fetch_from": "locker_id.locker_type", @@ -59,7 +60,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2024-01-07 18:04:54.243477", + "modified": "2024-01-09 22:06:07.579142", "modified_by": "Administrator", "module": "Gym Management System", "name": "Locker child in membership", diff --git a/gym_management_system/gym_management_system/doctype/locker_details/__init__.py b/gym_management_system/gym_management_system/doctype/locker_details/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/gym_management_system/gym_management_system/doctype/locker_details/locker_details.json b/gym_management_system/gym_management_system/doctype/locker_details/locker_details.json index 04e520e..3a5deda 100644 --- a/gym_management_system/gym_management_system/doctype/locker_details/locker_details.json +++ b/gym_management_system/gym_management_system/doctype/locker_details/locker_details.json @@ -8,9 +8,10 @@ "engine": "InnoDB", "field_order": [ "id", + "locker_type", "statrt_date", "end_date", - "status" + "price" ], "fields": [ { @@ -19,38 +20,52 @@ "in_list_view": 1, "label": " Locker Id", "options": "Gym Locker", + "read_only": 1, "reqd": 1 }, { + "fetch_from": "id.start_date", "fieldname": "statrt_date", "fieldtype": "Datetime", "in_list_view": 1, "in_preview": 1, "in_standard_filter": 1, - "label": "Start Date" + "label": "Start Date", + "read_only": 1 }, { + "fetch_from": "id.end_date", "fieldname": "end_date", "fieldtype": "Datetime", "in_list_view": 1, "in_preview": 1, "in_standard_filter": 1, - "label": "End Date" + "label": "End Date", + "read_only": 1 }, { - "fieldname": "status", - "fieldtype": "Select", + "fetch_from": "id.locker_type", + "fieldname": "locker_type", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Locker Type", + "read_only": 1 + }, + { + "fetch_from": "id.locker_fee", + "fieldname": "price", + "fieldtype": "Currency", "in_list_view": 1, "in_preview": 1, "in_standard_filter": 1, - "label": "Status", - "options": "Available\nOccupied" + "label": "Price", + "read_only": 1 } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2024-01-08 11:41:56.579481", + "modified": "2024-01-09 21:22:00.597713", "modified_by": "Administrator", "module": "Gym Management System", "name": "Locker Details", diff --git a/gym_management_system/gym_management_system/doctype/member_ship_details/member_ship_details.json b/gym_management_system/gym_management_system/doctype/member_ship_details/member_ship_details.json index 52ad40b..7a50e07 100644 --- a/gym_management_system/gym_management_system/doctype/member_ship_details/member_ship_details.json +++ b/gym_management_system/gym_management_system/doctype/member_ship_details/member_ship_details.json @@ -7,52 +7,24 @@ "editable_grid": 1, "engine": "InnoDB", "field_order": [ - "register_users", - "full_name", + "membership_id", "membership_plan", "start_date", "end_date", - "column_break_sbje2", - "fee", - "discount_given", - "final_amount", - "locker_allocate", - "locker_end_date" + "amount" ], "fields": [ - { - "fieldname": "fee", - "fieldtype": "Currency", - "in_list_view": 1, - "in_preview": 1, - "in_standard_filter": 1, - "label": "Fee" - }, - { - "fieldname": "register_users", - "fieldtype": "Link", - "in_list_view": 1, - "in_preview": 1, - "in_standard_filter": 1, - "label": "Registered Member", - "options": "Gym Member Name" - }, - { - "fieldname": "full_name", - "fieldtype": "Data", - "in_list_view": 1, - "in_preview": 1, - "in_standard_filter": 1, - "label": "Full Name" - }, { "fieldname": "membership_plan", "fieldtype": "Link", "in_list_view": 1, "in_preview": 1, "in_standard_filter": 1, - "label": "Membership Plans", - "options": "Gym Subscription" + "label": "Subscription Plan", + "options": "Gym Subscription", + "read_only": 1, + "reqd": 1, + "unique": 1 }, { "fieldname": "start_date", @@ -60,7 +32,8 @@ "in_list_view": 1, "in_preview": 1, "in_standard_filter": 1, - "label": "Plan Start Date" + "label": "Plan Start Date", + "read_only": 1 }, { "fieldname": "end_date", @@ -68,50 +41,32 @@ "in_list_view": 1, "in_preview": 1, "in_standard_filter": 1, - "label": "Plan End Date" - }, - { - "fieldname": "discount_given", - "fieldtype": "Percent", - "in_list_view": 1, - "in_preview": 1, - "in_standard_filter": 1, - "label": "Discount given" + "label": "Plan End Date", + "read_only": 1 }, { - "fieldname": "final_amount", + "fetch_from": "membership_id.fee", + "fieldname": "amount", "fieldtype": "Currency", "in_list_view": 1, "in_preview": 1, "in_standard_filter": 1, - "label": "Final Amount" + "label": "Plan Price", + "read_only": 1 }, { - "fieldname": "locker_allocate", + "fieldname": "membership_id", "fieldtype": "Link", "in_list_view": 1, - "in_preview": 1, - "in_standard_filter": 1, - "label": "Locker Allocate", - "options": "Gym Locker" - }, - { - "fieldname": "locker_end_date", - "fieldtype": "Date", - "in_list_view": 1, - "in_preview": 1, - "in_standard_filter": 1, - "label": "Locker End Date" - }, - { - "fieldname": "column_break_sbje2", - "fieldtype": "Column Break" + "label": "Membership ID", + "options": "Gym Membership UI", + "read_only": 1 } ], "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2024-01-07 00:27:13.157966", + "modified": "2024-01-09 21:29:03.602572", "modified_by": "Administrator", "module": "Gym Management System", "name": "Member Ship Details", diff --git a/gym_management_system/gym_management_system/doctype/trainer_child__in_membership/trainer_child__in_membership.json b/gym_management_system/gym_management_system/doctype/trainer_child__in_membership/trainer_child__in_membership.json index d1269d7..a3852c3 100644 --- a/gym_management_system/gym_management_system/doctype/trainer_child__in_membership/trainer_child__in_membership.json +++ b/gym_management_system/gym_management_system/doctype/trainer_child__in_membership/trainer_child__in_membership.json @@ -8,7 +8,6 @@ "field_order": [ "trainer_name", "ttrainer_nam", - "training_type", "start_date", "end_date" ], @@ -21,13 +20,6 @@ "options": "Gym Trainer", "reqd": 1 }, - { - "fieldname": "training_type", - "fieldtype": "Select", - "in_list_view": 1, - "label": "Training Type", - "options": "Zumba\nWeight Lifting\nStretching\nCardio\nBoxing" - }, { "default": "Now", "fieldname": "start_date", @@ -53,7 +45,7 @@ "index_web_pages_for_search": 1, "istable": 1, "links": [], - "modified": "2024-01-07 17:17:48.672960", + "modified": "2024-01-10 16:22:54.271719", "modified_by": "Administrator", "module": "Gym Management System", "name": "Trainer child in membership", diff --git a/gym_management_system/hooks.py b/gym_management_system/hooks.py index c59717e..4bc4dc8 100644 --- a/gym_management_system/hooks.py +++ b/gym_management_system/hooks.py @@ -9,7 +9,7 @@ # ------------------ # include js, css files in header of desk.html -# app_include_css = "/assets/gym_management_system/css/gym_management_system.css" +# app_include_css = "/assets/gym_management_system/css/gym_member_name.css" # app_include_js = "/assets/gym_management_system/js/gym_management_system.js" # include js, css files in header of web template @@ -213,3 +213,6 @@ # auth_hooks = [ # "gym_management_system.auth.validate" # ] +doctype_list_js = { + "Gym Member Name": ["public/css/gym_member_name.css"], +} \ No newline at end of file diff --git a/gym_management_system/public/css/gym_member_name.css b/gym_management_system/public/css/gym_member_name.css new file mode 100644 index 0000000..e69de29