diff --git a/member_management/member_management/doctype/corporate_documents/__init__.py b/member_management/member_management/doctype/corporate_document/__init__.py
similarity index 100%
rename from member_management/member_management/doctype/corporate_documents/__init__.py
rename to member_management/member_management/doctype/corporate_document/__init__.py
diff --git a/member_management/member_management/doctype/corporate_documents/corporate_documents.json b/member_management/member_management/doctype/corporate_document/corporate_document.json
similarity index 97%
rename from member_management/member_management/doctype/corporate_documents/corporate_documents.json
rename to member_management/member_management/doctype/corporate_document/corporate_document.json
index 51d308c..4a9fd8d 100644
--- a/member_management/member_management/doctype/corporate_documents/corporate_documents.json
+++ b/member_management/member_management/doctype/corporate_document/corporate_document.json
@@ -45,7 +45,7 @@
"modified": "2025-11-11 18:44:43.209834",
"modified_by": "Administrator",
"module": "Member Management",
- "name": "Corporate Documents",
+ "name": "Corporate Document",
"naming_rule": "Expression",
"owner": "Administrator",
"permissions": [],
diff --git a/member_management/member_management/doctype/corporate_documents/corporate_documents.py b/member_management/member_management/doctype/corporate_document/corporate_document.py
similarity index 83%
rename from member_management/member_management/doctype/corporate_documents/corporate_documents.py
rename to member_management/member_management/doctype/corporate_document/corporate_document.py
index 91072c6..ac3c538 100644
--- a/member_management/member_management/doctype/corporate_documents/corporate_documents.py
+++ b/member_management/member_management/doctype/corporate_document/corporate_document.py
@@ -5,5 +5,5 @@
from frappe.model.document import Document
-class CorporateDocuments(Document):
+class CorporateDocument(Document):
pass
diff --git a/member_management/member_management/doctype/member_agreements/__init__.py b/member_management/member_management/doctype/member_agreement/__init__.py
similarity index 100%
rename from member_management/member_management/doctype/member_agreements/__init__.py
rename to member_management/member_management/doctype/member_agreement/__init__.py
diff --git a/member_management/member_management/doctype/member_agreements/member_agreements.json b/member_management/member_management/doctype/member_agreement/member_agreement.json
similarity index 97%
rename from member_management/member_management/doctype/member_agreements/member_agreements.json
rename to member_management/member_management/doctype/member_agreement/member_agreement.json
index e0d5f82..e5e32f0 100644
--- a/member_management/member_management/doctype/member_agreements/member_agreements.json
+++ b/member_management/member_management/doctype/member_agreement/member_agreement.json
@@ -54,7 +54,7 @@
"modified": "2025-11-09 11:48:36.156523",
"modified_by": "Administrator",
"module": "Member Management",
- "name": "Member Agreements",
+ "name": "Member Agreement",
"owner": "Administrator",
"permissions": [],
"row_format": "Dynamic",
diff --git a/member_management/member_management/doctype/member_agreements/member_agreements.py b/member_management/member_management/doctype/member_agreement/member_agreement.py
similarity index 84%
rename from member_management/member_management/doctype/member_agreements/member_agreements.py
rename to member_management/member_management/doctype/member_agreement/member_agreement.py
index a1ad86b..c4d8019 100644
--- a/member_management/member_management/doctype/member_agreements/member_agreements.py
+++ b/member_management/member_management/doctype/member_agreement/member_agreement.py
@@ -5,5 +5,5 @@
from frappe.model.document import Document
-class MemberAgreements(Document):
+class MemberAgreement(Document):
pass
diff --git a/member_management/member_management/doctype/member_profile/member_profile.json b/member_management/member_management/doctype/member_profile/member_profile.json
index 57965ca..42d758e 100644
--- a/member_management/member_management/doctype/member_profile/member_profile.json
+++ b/member_management/member_management/doctype/member_profile/member_profile.json
@@ -47,7 +47,7 @@
"inspection_records_section",
"table_yzvn",
"menus_section",
- "tempattach",
+ "menu",
"associates_tab",
"associates_section",
"table_cdln",
@@ -150,7 +150,7 @@
{
"fieldname": "table_cabr",
"fieldtype": "Table",
- "options": "Member Agreements"
+ "options": "Member Agreement"
},
{
"fieldname": "corporate_documents_section",
@@ -160,7 +160,7 @@
{
"fieldname": "table_rkkt",
"fieldtype": "Table",
- "options": "Corporate Documents"
+ "options": "Corporate Document"
},
{
"fieldname": "food_manager_records_section",
@@ -197,10 +197,6 @@
"fieldtype": "Section Break",
"label": "Menus"
},
- {
- "fieldname": "tempattach",
- "fieldtype": "Attach"
- },
{
"fieldname": "associates_tab",
"fieldtype": "Tab Break",
@@ -279,6 +275,12 @@
"fieldtype": "Table",
"label": "Schedule Access",
"options": "Booked Member"
+ },
+ {
+ "fieldname": "menu",
+ "fieldtype": "Table",
+ "label": "Menus",
+ "options": "Menu"
}
],
"grid_page_length": 50,
@@ -299,7 +301,7 @@
"link_fieldname": "member_id"
}
],
- "modified": "2025-11-14 00:19:01.685822",
+ "modified": "2025-11-14 16:36:17.759476",
"modified_by": "Administrator",
"module": "Member Management",
"name": "Member Profile",
diff --git a/member_management/member_management/doctype/menu/__init__.py b/member_management/member_management/doctype/menu/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/member_management/member_management/doctype/menu/menu.json b/member_management/member_management/doctype/menu/menu.json
new file mode 100644
index 0000000..0079b42
--- /dev/null
+++ b/member_management/member_management/doctype/menu/menu.json
@@ -0,0 +1,54 @@
+{
+ "actions": [],
+ "allow_rename": 1,
+ "autoname": "field:title",
+ "creation": "2025-11-14 16:28:31.135453",
+ "doctype": "DocType",
+ "editable_grid": 1,
+ "engine": "InnoDB",
+ "field_order": [
+ "title",
+ "file",
+ "current"
+ ],
+ "fields": [
+ {
+ "fieldname": "title",
+ "fieldtype": "Data",
+ "in_list_view": 1,
+ "label": "Title",
+ "reqd": 1,
+ "unique": 1
+ },
+ {
+ "fieldname": "file",
+ "fieldtype": "Attach",
+ "in_list_view": 1,
+ "label": "File",
+ "reqd": 1
+ },
+ {
+ "default": "1",
+ "fieldname": "current",
+ "fieldtype": "Check",
+ "in_list_view": 1,
+ "label": "Current"
+ }
+ ],
+ "grid_page_length": 50,
+ "index_web_pages_for_search": 1,
+ "istable": 1,
+ "links": [],
+ "modified": "2025-11-14 16:32:51.511787",
+ "modified_by": "Administrator",
+ "module": "Member Management",
+ "name": "Menu",
+ "naming_rule": "By fieldname",
+ "owner": "Administrator",
+ "permissions": [],
+ "row_format": "Dynamic",
+ "rows_threshold_for_grid_search": 20,
+ "sort_field": "modified",
+ "sort_order": "DESC",
+ "states": []
+}
\ No newline at end of file
diff --git a/member_management/member_management/doctype/menu/menu.py b/member_management/member_management/doctype/menu/menu.py
new file mode 100644
index 0000000..80bc141
--- /dev/null
+++ b/member_management/member_management/doctype/menu/menu.py
@@ -0,0 +1,9 @@
+# Copyright (c) 2025, Haddon Kitchen Incubator LLC and contributors
+# For license information, please see license.txt
+
+# import frappe
+from frappe.model.document import Document
+
+
+class Menu(Document):
+ pass
diff --git a/member_management/member_management/web_form/agreements/__init__.py b/member_management/member_management/web_form/agreements/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/member_management/member_management/web_form/agreements/agreements.js b/member_management/member_management/web_form/agreements/agreements.js
new file mode 100644
index 0000000..8f56ebb
--- /dev/null
+++ b/member_management/member_management/web_form/agreements/agreements.js
@@ -0,0 +1,3 @@
+frappe.ready(function () {
+ // bind events here
+});
diff --git a/member_management/member_management/web_form/agreements/agreements.json b/member_management/member_management/web_form/agreements/agreements.json
new file mode 100644
index 0000000..8614c0b
--- /dev/null
+++ b/member_management/member_management/web_form/agreements/agreements.json
@@ -0,0 +1,85 @@
+{
+ "allow_comments": 0,
+ "allow_delete": 0,
+ "allow_edit": 1,
+ "allow_incomplete": 0,
+ "allow_multiple": 0,
+ "allow_print": 0,
+ "anonymous": 0,
+ "apply_document_permissions": 1,
+ "button_label": "Save",
+ "condition_json": "[]",
+ "creation": "2025-11-14 16:09:19.953363",
+ "doc_type": "Member Profile",
+ "docstatus": 0,
+ "doctype": "Web Form",
+ "idx": 0,
+ "introduction_text": "
Your member contracts will appear here when completed.
",
+ "is_standard": 1,
+ "list_columns": [
+ {
+ "fieldname": "member_id",
+ "fieldtype": "Int",
+ "label": "Member ID"
+ },
+ {
+ "fieldname": "member_name",
+ "fieldtype": "Data",
+ "label": "Name"
+ },
+ {
+ "fieldname": "membership_type",
+ "fieldtype": "Select",
+ "label": "Membership Type",
+ "options": "Standard\nCold Pack\nMobile Only\nWarewashing Only"
+ },
+ {
+ "fieldname": "join_date",
+ "fieldtype": "Date",
+ "label": "Joined"
+ }
+ ],
+ "list_title": "Member Profile",
+ "login_required": 1,
+ "max_attachment_size": 0,
+ "modified": "2025-11-14 17:51:47.145410",
+ "modified_by": "Administrator",
+ "module": "Member Management",
+ "name": "agreements",
+ "owner": "Administrator",
+ "published": 1,
+ "route": "profile-agreement",
+ "show_attachments": 1,
+ "show_list": 0,
+ "show_sidebar": 1,
+ "title": "Agreements",
+ "web_form_fields": [
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "agreements_section",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "label": "Agreements",
+ "max_length": 0,
+ "max_value": 0,
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "table_cabr",
+ "fieldtype": "Table",
+ "hidden": 0,
+ "max_length": 0,
+ "max_value": 0,
+ "options": "Member Agreement",
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ }
+ ],
+ "website_sidebar": "Member Sidebar"
+}
\ No newline at end of file
diff --git a/member_management/member_management/web_form/agreements/agreements.py b/member_management/member_management/web_form/agreements/agreements.py
new file mode 100644
index 0000000..80b7b87
--- /dev/null
+++ b/member_management/member_management/web_form/agreements/agreements.py
@@ -0,0 +1,6 @@
+import frappe
+
+
+def get_context(context):
+ # do your magic here
+ pass
diff --git a/member_management/member_management/web_form/associates/__init__.py b/member_management/member_management/web_form/associates/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/member_management/member_management/web_form/associates/associates.js b/member_management/member_management/web_form/associates/associates.js
new file mode 100644
index 0000000..8f56ebb
--- /dev/null
+++ b/member_management/member_management/web_form/associates/associates.js
@@ -0,0 +1,3 @@
+frappe.ready(function () {
+ // bind events here
+});
diff --git a/member_management/member_management/web_form/associates/associates.json b/member_management/member_management/web_form/associates/associates.json
new file mode 100644
index 0000000..c4060ce
--- /dev/null
+++ b/member_management/member_management/web_form/associates/associates.json
@@ -0,0 +1,85 @@
+{
+ "allow_comments": 0,
+ "allow_delete": 0,
+ "allow_edit": 1,
+ "allow_incomplete": 0,
+ "allow_multiple": 0,
+ "allow_print": 0,
+ "anonymous": 0,
+ "apply_document_permissions": 1,
+ "button_label": "Save",
+ "condition_json": "[]",
+ "creation": "2025-11-14 16:12:49.189895",
+ "doc_type": "Member Profile",
+ "docstatus": 0,
+ "doctype": "Web Form",
+ "idx": 0,
+ "introduction_text": "All employees or business associates who will be present in the facility must be individually identified.
Each person with access to the facility should have an individual record in this list. Each record may have multiple contact entries for email and phone as necessary. Every person must have an associated photo identification document. Acceptable documents include a Driver's License, Passport, or State-issued ID card. ",
+ "is_standard": 1,
+ "list_columns": [
+ {
+ "fieldname": "member_id",
+ "fieldtype": "Int",
+ "label": "Member ID"
+ },
+ {
+ "fieldname": "member_name",
+ "fieldtype": "Data",
+ "label": "Name"
+ },
+ {
+ "fieldname": "membership_type",
+ "fieldtype": "Select",
+ "label": "Membership Type",
+ "options": "Standard\nCold Pack\nMobile Only\nWarewashing Only"
+ },
+ {
+ "fieldname": "join_date",
+ "fieldtype": "Date",
+ "label": "Joined"
+ }
+ ],
+ "list_title": "Member Profile",
+ "login_required": 1,
+ "max_attachment_size": 0,
+ "modified": "2025-11-14 17:46:20.191842",
+ "modified_by": "Administrator",
+ "module": "Member Management",
+ "name": "associates",
+ "owner": "Administrator",
+ "published": 1,
+ "route": "profile-associate",
+ "show_attachments": 1,
+ "show_list": 0,
+ "show_sidebar": 1,
+ "title": "Associates",
+ "web_form_fields": [
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "associates_section",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "label": "Associates",
+ "max_length": 0,
+ "max_value": 0,
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "table_cdln",
+ "fieldtype": "Table",
+ "hidden": 0,
+ "max_length": 0,
+ "max_value": 0,
+ "options": "Associate List",
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ }
+ ],
+ "website_sidebar": "Member Sidebar"
+}
\ No newline at end of file
diff --git a/member_management/member_management/web_form/associates/associates.py b/member_management/member_management/web_form/associates/associates.py
new file mode 100644
index 0000000..80b7b87
--- /dev/null
+++ b/member_management/member_management/web_form/associates/associates.py
@@ -0,0 +1,6 @@
+import frappe
+
+
+def get_context(context):
+ # do your magic here
+ pass
diff --git a/member_management/member_management/web_form/corporate_documents/__init__.py b/member_management/member_management/web_form/corporate_documents/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/member_management/member_management/web_form/corporate_documents/corporate_documents.js b/member_management/member_management/web_form/corporate_documents/corporate_documents.js
new file mode 100644
index 0000000..8f56ebb
--- /dev/null
+++ b/member_management/member_management/web_form/corporate_documents/corporate_documents.js
@@ -0,0 +1,3 @@
+frappe.ready(function () {
+ // bind events here
+});
diff --git a/member_management/member_management/web_form/corporate_documents/corporate_documents.json b/member_management/member_management/web_form/corporate_documents/corporate_documents.json
new file mode 100644
index 0000000..0c94c2d
--- /dev/null
+++ b/member_management/member_management/web_form/corporate_documents/corporate_documents.json
@@ -0,0 +1,87 @@
+{
+ "allow_comments": 0,
+ "allow_delete": 0,
+ "allow_edit": 1,
+ "allow_incomplete": 0,
+ "allow_multiple": 0,
+ "allow_print": 0,
+ "anonymous": 0,
+ "apply_document_permissions": 1,
+ "button_label": "Save",
+ "condition_json": "[]",
+ "creation": "2025-11-14 16:14:03.424015",
+ "doc_type": "Member Profile",
+ "docstatus": 0,
+ "doctype": "Web Form",
+ "idx": 0,
+ "introduction_text": "Corporate Identity Documents Upload one per required document type.
Corporation (including LLC):
Certificate of Formation (example ) State Business Registration Certificate (example ) Certificate of Trade Name, if any (example ) IRS EIN Letter (example )
Sole Proprietorship:
Certificate of Trade Name
All Business Types:
State Sales Tax Registration Certificate (example ) ",
+ "is_standard": 1,
+ "list_columns": [
+ {
+ "fieldname": "member_id",
+ "fieldtype": "Int",
+ "label": "Member ID"
+ },
+ {
+ "fieldname": "member_name",
+ "fieldtype": "Data",
+ "label": "Name"
+ },
+ {
+ "fieldname": "membership_type",
+ "fieldtype": "Select",
+ "label": "Membership Type",
+ "options": "Standard\nCold Pack\nMobile Only\nWarewashing Only"
+ },
+ {
+ "fieldname": "join_date",
+ "fieldtype": "Date",
+ "label": "Joined"
+ }
+ ],
+ "list_title": "Member Profile",
+ "login_required": 1,
+ "max_attachment_size": 0,
+ "modified": "2025-11-14 17:33:25.426606",
+ "modified_by": "Administrator",
+ "module": "Member Management",
+ "name": "corporate-documents",
+ "owner": "Administrator",
+ "published": 1,
+ "route": "profile-corporate",
+ "show_attachments": 1,
+ "show_list": 0,
+ "show_sidebar": 1,
+ "title": "Corporate Documents",
+ "web_form_fields": [
+ {
+ "allow_read_on_all_link_options": 0,
+ "description": "",
+ "fieldname": "corporate_documents_section",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "label": "Corporate Documents",
+ "max_length": 0,
+ "max_value": 0,
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "description": "Description",
+ "fieldname": "table_rkkt",
+ "fieldtype": "Table",
+ "hidden": 0,
+ "max_length": 0,
+ "max_value": 0,
+ "options": "Corporate Document",
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ }
+ ],
+ "website_sidebar": "Member Sidebar"
+}
\ No newline at end of file
diff --git a/member_management/member_management/web_form/corporate_documents/corporate_documents.py b/member_management/member_management/web_form/corporate_documents/corporate_documents.py
new file mode 100644
index 0000000..80b7b87
--- /dev/null
+++ b/member_management/member_management/web_form/corporate_documents/corporate_documents.py
@@ -0,0 +1,6 @@
+import frappe
+
+
+def get_context(context):
+ # do your magic here
+ pass
diff --git a/member_management/member_management/web_form/demographics/__init__.py b/member_management/member_management/web_form/demographics/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/member_management/member_management/web_form/demographics/demographics.js b/member_management/member_management/web_form/demographics/demographics.js
new file mode 100644
index 0000000..8f56ebb
--- /dev/null
+++ b/member_management/member_management/web_form/demographics/demographics.js
@@ -0,0 +1,3 @@
+frappe.ready(function () {
+ // bind events here
+});
diff --git a/member_management/member_management/web_form/demographics/demographics.json b/member_management/member_management/web_form/demographics/demographics.json
new file mode 100644
index 0000000..a736d6b
--- /dev/null
+++ b/member_management/member_management/web_form/demographics/demographics.json
@@ -0,0 +1,153 @@
+{
+ "allow_comments": 0,
+ "allow_delete": 0,
+ "allow_edit": 1,
+ "allow_incomplete": 0,
+ "allow_multiple": 0,
+ "allow_print": 0,
+ "anonymous": 0,
+ "apply_document_permissions": 1,
+ "button_label": "Save",
+ "condition_json": "[]",
+ "creation": "2025-11-14 16:16:01.324909",
+ "doc_type": "Member Profile",
+ "docstatus": 0,
+ "doctype": "Web Form",
+ "idx": 0,
+ "introduction_text": "Member Details Confirm your legal business name Your Member ID is pre-generated and cannot be changed Risk class is determined by the Authorizing Jurisdiction. You may leave it blank if unsure. Type 1 is prepackaged commercial food (grocery items) Type 2 is limited preparation of pre-cooked food, bread, or other low-risk items Type 3 includes preparation of melons, dairy, raw meat or fish, or complex operations involving reheating or hot holding of food. Most members are Type 3. Please provide your EIN if you are organized as an LLC, S or C corp.
",
+ "is_standard": 1,
+ "list_columns": [
+ {
+ "fieldname": "member_id",
+ "fieldtype": "Int",
+ "label": "Member ID"
+ },
+ {
+ "fieldname": "member_name",
+ "fieldtype": "Data",
+ "label": "Name"
+ },
+ {
+ "fieldname": "membership_type",
+ "fieldtype": "Select",
+ "label": "Membership Type",
+ "options": "Standard\nCold Pack\nMobile Only\nWarewashing Only"
+ },
+ {
+ "fieldname": "join_date",
+ "fieldtype": "Date",
+ "label": "Joined"
+ }
+ ],
+ "list_title": "Member Profile",
+ "login_required": 1,
+ "max_attachment_size": 0,
+ "modified": "2025-11-14 17:46:51.140689",
+ "modified_by": "Administrator",
+ "module": "Member Management",
+ "name": "demographics",
+ "owner": "Administrator",
+ "published": 1,
+ "route": "profile-demographic",
+ "show_attachments": 1,
+ "show_list": 0,
+ "show_sidebar": 1,
+ "title": "Demographics",
+ "web_form_fields": [
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "member_data_section",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "label": "Member Data",
+ "max_length": 0,
+ "max_value": 0,
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "column_break_vdps",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "max_length": 0,
+ "max_value": 0,
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "description": "Legal Business Name",
+ "fieldname": "member_name",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "label": "Name",
+ "max_length": 0,
+ "max_value": 0,
+ "precision": "",
+ "read_only": 0,
+ "reqd": 1,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "description": "As determined by the authorizing jurisdiction",
+ "fieldname": "risk_class",
+ "fieldtype": "Select",
+ "hidden": 0,
+ "label": "Risk Class",
+ "max_length": 0,
+ "max_value": 0,
+ "options": "1\n2\n3",
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "column_break_jznx",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "max_length": 0,
+ "max_value": 0,
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "description": "Auto-generated. Cannot be changed.",
+ "fieldname": "member_id",
+ "fieldtype": "Int",
+ "hidden": 0,
+ "label": "Member ID",
+ "max_length": 0,
+ "max_value": 0,
+ "precision": "",
+ "read_only": 0,
+ "reqd": 1,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "description": "Federal Employer Identification (if Incorporated)",
+ "fieldname": "member_ein",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "label": "EIN",
+ "max_length": 0,
+ "max_value": 0,
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ }
+ ],
+ "website_sidebar": "Member Sidebar"
+}
\ No newline at end of file
diff --git a/member_management/member_management/web_form/demographics/demographics.py b/member_management/member_management/web_form/demographics/demographics.py
new file mode 100644
index 0000000..80b7b87
--- /dev/null
+++ b/member_management/member_management/web_form/demographics/demographics.py
@@ -0,0 +1,6 @@
+import frappe
+
+
+def get_context(context):
+ # do your magic here
+ pass
diff --git a/member_management/member_management/web_form/food_manager_records/__init__.py b/member_management/member_management/web_form/food_manager_records/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/member_management/member_management/web_form/food_manager_records/food_manager_records.js b/member_management/member_management/web_form/food_manager_records/food_manager_records.js
new file mode 100644
index 0000000..8f56ebb
--- /dev/null
+++ b/member_management/member_management/web_form/food_manager_records/food_manager_records.js
@@ -0,0 +1,3 @@
+frappe.ready(function () {
+ // bind events here
+});
diff --git a/member_management/member_management/web_form/food_manager_records/food_manager_records.json b/member_management/member_management/web_form/food_manager_records/food_manager_records.json
new file mode 100644
index 0000000..eba8cf2
--- /dev/null
+++ b/member_management/member_management/web_form/food_manager_records/food_manager_records.json
@@ -0,0 +1,85 @@
+{
+ "allow_comments": 0,
+ "allow_delete": 0,
+ "allow_edit": 1,
+ "allow_incomplete": 0,
+ "allow_multiple": 0,
+ "allow_print": 0,
+ "anonymous": 0,
+ "apply_document_permissions": 1,
+ "button_label": "Save",
+ "condition_json": "[]",
+ "creation": "2025-11-14 16:18:00.648370",
+ "doc_type": "Member Profile",
+ "docstatus": 0,
+ "doctype": "Web Form",
+ "idx": 0,
+ "introduction_text": "Food Protection Manager Certificate Risk Type 3 members must upload a valid unexpired food protection manager certificate from an acceptable issuer.
",
+ "is_standard": 1,
+ "list_columns": [
+ {
+ "fieldname": "member_id",
+ "fieldtype": "Int",
+ "label": "Member ID"
+ },
+ {
+ "fieldname": "member_name",
+ "fieldtype": "Data",
+ "label": "Name"
+ },
+ {
+ "fieldname": "membership_type",
+ "fieldtype": "Select",
+ "label": "Membership Type",
+ "options": "Standard\nCold Pack\nMobile Only\nWarewashing Only"
+ },
+ {
+ "fieldname": "join_date",
+ "fieldtype": "Date",
+ "label": "Joined"
+ }
+ ],
+ "list_title": "Member Profile",
+ "login_required": 1,
+ "max_attachment_size": 0,
+ "modified": "2025-11-14 16:18:00.648370",
+ "modified_by": "Administrator",
+ "module": "Member Management",
+ "name": "food-manager-records",
+ "owner": "Administrator",
+ "published": 1,
+ "route": "profile-manager",
+ "show_attachments": 1,
+ "show_list": 0,
+ "show_sidebar": 1,
+ "title": "Food Manager Records",
+ "web_form_fields": [
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "food_manager_records_section",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "label": "Food Manager Records",
+ "max_length": 0,
+ "max_value": 0,
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "table_wsni",
+ "fieldtype": "Table",
+ "hidden": 0,
+ "max_length": 0,
+ "max_value": 0,
+ "options": "Food Protection Manager Record",
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ }
+ ],
+ "website_sidebar": "Member Sidebar"
+}
\ No newline at end of file
diff --git a/member_management/member_management/web_form/food_manager_records/food_manager_records.py b/member_management/member_management/web_form/food_manager_records/food_manager_records.py
new file mode 100644
index 0000000..80b7b87
--- /dev/null
+++ b/member_management/member_management/web_form/food_manager_records/food_manager_records.py
@@ -0,0 +1,6 @@
+import frappe
+
+
+def get_context(context):
+ # do your magic here
+ pass
diff --git a/member_management/member_management/web_form/inspection_records/__init__.py b/member_management/member_management/web_form/inspection_records/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/member_management/member_management/web_form/inspection_records/inspection_records.js b/member_management/member_management/web_form/inspection_records/inspection_records.js
new file mode 100644
index 0000000..8f56ebb
--- /dev/null
+++ b/member_management/member_management/web_form/inspection_records/inspection_records.js
@@ -0,0 +1,3 @@
+frappe.ready(function () {
+ // bind events here
+});
diff --git a/member_management/member_management/web_form/inspection_records/inspection_records.json b/member_management/member_management/web_form/inspection_records/inspection_records.json
new file mode 100644
index 0000000..0197ae4
--- /dev/null
+++ b/member_management/member_management/web_form/inspection_records/inspection_records.json
@@ -0,0 +1,85 @@
+{
+ "allow_comments": 0,
+ "allow_delete": 0,
+ "allow_edit": 1,
+ "allow_incomplete": 0,
+ "allow_multiple": 0,
+ "allow_print": 0,
+ "anonymous": 0,
+ "apply_document_permissions": 1,
+ "button_label": "Save",
+ "condition_json": "[]",
+ "creation": "2025-11-14 16:20:04.313860",
+ "doc_type": "Member Profile",
+ "docstatus": 0,
+ "doctype": "Web Form",
+ "idx": 0,
+ "introduction_text": "Inspection Records If you have a dedicated sales location or warehouse for finished goods, please upload inspection/approval related records here. Otherwise, this area will hold your completed inspection records when approved.
",
+ "is_standard": 1,
+ "list_columns": [
+ {
+ "fieldname": "member_id",
+ "fieldtype": "Int",
+ "label": "Member ID"
+ },
+ {
+ "fieldname": "member_name",
+ "fieldtype": "Data",
+ "label": "Name"
+ },
+ {
+ "fieldname": "membership_type",
+ "fieldtype": "Select",
+ "label": "Membership Type",
+ "options": "Standard\nCold Pack\nMobile Only\nWarewashing Only"
+ },
+ {
+ "fieldname": "join_date",
+ "fieldtype": "Date",
+ "label": "Joined"
+ }
+ ],
+ "list_title": "Member Profile",
+ "login_required": 1,
+ "max_attachment_size": 0,
+ "modified": "2025-11-14 16:20:08.458609",
+ "modified_by": "Administrator",
+ "module": "Member Management",
+ "name": "inspection-records",
+ "owner": "Administrator",
+ "published": 1,
+ "route": "profile-inspection",
+ "show_attachments": 1,
+ "show_list": 0,
+ "show_sidebar": 1,
+ "title": "Inspection Records",
+ "web_form_fields": [
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "inspection_records_section",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "label": "Inspection Records",
+ "max_length": 0,
+ "max_value": 0,
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "table_yzvn",
+ "fieldtype": "Table",
+ "hidden": 0,
+ "max_length": 0,
+ "max_value": 0,
+ "options": "Inspection Record",
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ }
+ ],
+ "website_sidebar": "Member Sidebar"
+}
\ No newline at end of file
diff --git a/member_management/member_management/web_form/inspection_records/inspection_records.py b/member_management/member_management/web_form/inspection_records/inspection_records.py
new file mode 100644
index 0000000..80b7b87
--- /dev/null
+++ b/member_management/member_management/web_form/inspection_records/inspection_records.py
@@ -0,0 +1,6 @@
+import frappe
+
+
+def get_context(context):
+ # do your magic here
+ pass
diff --git a/member_management/member_management/web_form/insurance/__init__.py b/member_management/member_management/web_form/insurance/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/member_management/member_management/web_form/insurance/insurance.js b/member_management/member_management/web_form/insurance/insurance.js
new file mode 100644
index 0000000..8f56ebb
--- /dev/null
+++ b/member_management/member_management/web_form/insurance/insurance.js
@@ -0,0 +1,3 @@
+frappe.ready(function () {
+ // bind events here
+});
diff --git a/member_management/member_management/web_form/insurance/insurance.json b/member_management/member_management/web_form/insurance/insurance.json
new file mode 100644
index 0000000..75a7da1
--- /dev/null
+++ b/member_management/member_management/web_form/insurance/insurance.json
@@ -0,0 +1,85 @@
+{
+ "allow_comments": 0,
+ "allow_delete": 0,
+ "allow_edit": 1,
+ "allow_incomplete": 0,
+ "allow_multiple": 0,
+ "allow_print": 0,
+ "anonymous": 0,
+ "apply_document_permissions": 1,
+ "button_label": "Save",
+ "condition_json": "[]",
+ "creation": "2025-11-14 15:53:28.559060",
+ "doc_type": "Member Profile",
+ "docstatus": 0,
+ "doctype": "Web Form",
+ "idx": 0,
+ "introduction_text": "Please upload your current unexpired insurance declaration page. (EXAMPLE FORM )
Under the Certificate Holder section there must be the following:
Haddon Kitchen Incubator LLC
SJKJSN Enterprises LLC
901 White Horse Pike
Haddon Township, NJ 0107
Contact your insurer to add us as a \"Named Insured/Loss Payee\" to obtain this form. You can usually obtain it on their self-service website.
",
+ "is_standard": 1,
+ "list_columns": [
+ {
+ "fieldname": "member_id",
+ "fieldtype": "Int",
+ "label": "Member ID"
+ },
+ {
+ "fieldname": "member_name",
+ "fieldtype": "Data",
+ "label": "Name"
+ },
+ {
+ "fieldname": "membership_type",
+ "fieldtype": "Select",
+ "label": "Membership Type",
+ "options": "Standard\nCold Pack\nMobile Only\nWarewashing Only"
+ },
+ {
+ "fieldname": "join_date",
+ "fieldtype": "Date",
+ "label": "Joined"
+ }
+ ],
+ "list_title": "Member Profile",
+ "login_required": 1,
+ "max_attachment_size": 0,
+ "modified": "2025-11-14 16:10:31.673901",
+ "modified_by": "Administrator",
+ "module": "Member Management",
+ "name": "insurance",
+ "owner": "Administrator",
+ "published": 1,
+ "route": "profile-insurance",
+ "show_attachments": 1,
+ "show_list": 0,
+ "show_sidebar": 1,
+ "title": "Insurance",
+ "web_form_fields": [
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "insurance_records_section",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "label": "Insurance Records",
+ "max_length": 0,
+ "max_value": 0,
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "table_wmpy",
+ "fieldtype": "Table",
+ "hidden": 0,
+ "max_length": 0,
+ "max_value": 0,
+ "options": "Insurance Record",
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ }
+ ],
+ "website_sidebar": "Member Sidebar"
+}
\ No newline at end of file
diff --git a/member_management/member_management/web_form/insurance/insurance.py b/member_management/member_management/web_form/insurance/insurance.py
new file mode 100644
index 0000000..80b7b87
--- /dev/null
+++ b/member_management/member_management/web_form/insurance/insurance.py
@@ -0,0 +1,6 @@
+import frappe
+
+
+def get_context(context):
+ # do your magic here
+ pass
diff --git a/member_management/member_management/web_form/member_profile/member_profile.json b/member_management/member_management/web_form/member_profile/member_profile.json
index b6583c6..45ea66a 100644
--- a/member_management/member_management/web_form/member_profile/member_profile.json
+++ b/member_management/member_management/web_form/member_profile/member_profile.json
@@ -42,7 +42,7 @@
"list_title": "Member Profile",
"login_required": 1,
"max_attachment_size": 0,
- "modified": "2025-11-09 22:28:13.460426",
+ "modified": "2025-11-14 17:49:40.577567",
"modified_by": "Administrator",
"module": "Member Management",
"name": "member-profile",
@@ -170,7 +170,7 @@
"hidden": 0,
"max_length": 0,
"max_value": 0,
- "options": "Corporate Documents",
+ "options": "Corporate Document",
"precision": "",
"read_only": 0,
"reqd": 0,
@@ -269,11 +269,13 @@
},
{
"allow_read_on_all_link_options": 0,
- "fieldname": "tempattach",
- "fieldtype": "Attach",
+ "fieldname": "menu",
+ "fieldtype": "Table",
"hidden": 0,
+ "label": "Menus",
"max_length": 0,
"max_value": 0,
+ "options": "Menu",
"precision": "",
"read_only": 0,
"reqd": 0,
@@ -325,7 +327,7 @@
"hidden": 0,
"max_length": 0,
"max_value": 0,
- "options": "Member Agreements",
+ "options": "Member Agreement",
"precision": "",
"read_only": 0,
"reqd": 0,
diff --git a/member_management/member_management/web_form/menu/__init__.py b/member_management/member_management/web_form/menu/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/member_management/member_management/web_form/menu/menu.js b/member_management/member_management/web_form/menu/menu.js
new file mode 100644
index 0000000..8f56ebb
--- /dev/null
+++ b/member_management/member_management/web_form/menu/menu.js
@@ -0,0 +1,3 @@
+frappe.ready(function () {
+ // bind events here
+});
diff --git a/member_management/member_management/web_form/menu/menu.json b/member_management/member_management/web_form/menu/menu.json
new file mode 100644
index 0000000..aeb2417
--- /dev/null
+++ b/member_management/member_management/web_form/menu/menu.json
@@ -0,0 +1,86 @@
+{
+ "allow_comments": 0,
+ "allow_delete": 0,
+ "allow_edit": 1,
+ "allow_incomplete": 0,
+ "allow_multiple": 0,
+ "allow_print": 0,
+ "anonymous": 0,
+ "apply_document_permissions": 1,
+ "button_label": "Save",
+ "condition_json": "[]",
+ "creation": "2025-11-14 16:21:38.135396",
+ "doc_type": "Member Profile",
+ "docstatus": 0,
+ "doctype": "Web Form",
+ "idx": 0,
+ "introduction_text": "Menu A menu is required to be submitted to the authorizing jurisdiction to determine risk type. This will be submitted with any application paperwork.
",
+ "is_standard": 1,
+ "list_columns": [
+ {
+ "fieldname": "member_id",
+ "fieldtype": "Int",
+ "label": "Member ID"
+ },
+ {
+ "fieldname": "member_name",
+ "fieldtype": "Data",
+ "label": "Name"
+ },
+ {
+ "fieldname": "membership_type",
+ "fieldtype": "Select",
+ "label": "Membership Type",
+ "options": "Standard\nCold Pack\nMobile Only\nWarewashing Only"
+ },
+ {
+ "fieldname": "join_date",
+ "fieldtype": "Date",
+ "label": "Joined"
+ }
+ ],
+ "list_title": "Member Profile",
+ "login_required": 1,
+ "max_attachment_size": 0,
+ "modified": "2025-11-14 16:38:22.424003",
+ "modified_by": "Administrator",
+ "module": "Member Management",
+ "name": "menu",
+ "owner": "Administrator",
+ "published": 1,
+ "route": "profile-menu",
+ "show_attachments": 1,
+ "show_list": 0,
+ "show_sidebar": 1,
+ "title": "Menu",
+ "web_form_fields": [
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "menus_section",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "label": "Menus",
+ "max_length": 0,
+ "max_value": 0,
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "menu",
+ "fieldtype": "Table",
+ "hidden": 0,
+ "label": "Menus",
+ "max_length": 0,
+ "max_value": 0,
+ "options": "Menu",
+ "precision": "",
+ "read_only": 0,
+ "reqd": 0,
+ "show_in_filter": 0
+ }
+ ],
+ "website_sidebar": "Member Sidebar"
+}
\ No newline at end of file
diff --git a/member_management/member_management/web_form/menu/menu.py b/member_management/member_management/web_form/menu/menu.py
new file mode 100644
index 0000000..80b7b87
--- /dev/null
+++ b/member_management/member_management/web_form/menu/menu.py
@@ -0,0 +1,6 @@
+import frappe
+
+
+def get_context(context):
+ # do your magic here
+ pass
diff --git a/member_management/member_management/web_form/provisioning_information/__init__.py b/member_management/member_management/web_form/provisioning_information/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/member_management/member_management/web_form/provisioning_information/provisioning_information.js b/member_management/member_management/web_form/provisioning_information/provisioning_information.js
new file mode 100644
index 0000000..8f56ebb
--- /dev/null
+++ b/member_management/member_management/web_form/provisioning_information/provisioning_information.js
@@ -0,0 +1,3 @@
+frappe.ready(function () {
+ // bind events here
+});
diff --git a/member_management/member_management/web_form/provisioning_information/provisioning_information.json b/member_management/member_management/web_form/provisioning_information/provisioning_information.json
new file mode 100644
index 0000000..5710809
--- /dev/null
+++ b/member_management/member_management/web_form/provisioning_information/provisioning_information.json
@@ -0,0 +1,89 @@
+{
+ "allow_comments": 0,
+ "allow_delete": 0,
+ "allow_edit": 0,
+ "allow_incomplete": 0,
+ "allow_multiple": 0,
+ "allow_print": 0,
+ "anonymous": 0,
+ "apply_document_permissions": 1,
+ "button_label": "Save",
+ "condition_json": "[]",
+ "creation": "2025-11-14 18:04:49.430009",
+ "doc_type": "Member Profile",
+ "docstatus": 0,
+ "doctype": "Web Form",
+ "idx": 0,
+ "is_standard": 1,
+ "list_columns": [],
+ "login_required": 1,
+ "max_attachment_size": 0,
+ "modified": "2025-11-14 18:05:41.364810",
+ "modified_by": "Administrator",
+ "module": "Member Management",
+ "name": "provisioning-information",
+ "owner": "Administrator",
+ "published": 1,
+ "route": "profile-provisioning",
+ "show_attachments": 1,
+ "show_list": 0,
+ "show_sidebar": 1,
+ "title": "Provisioning Information",
+ "web_form_fields": [
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "access_card_count",
+ "fieldtype": "Int",
+ "hidden": 0,
+ "label": "Number of Access Cards Issued",
+ "max_length": 0,
+ "max_value": 0,
+ "precision": "",
+ "read_only": 1,
+ "reqd": 0,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "wifi_codes_issued",
+ "fieldtype": "Text",
+ "hidden": 0,
+ "label": "Wifi Codes Issued",
+ "max_length": 0,
+ "max_value": 0,
+ "precision": "",
+ "read_only": 1,
+ "reqd": 0,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "unifi_profile",
+ "fieldtype": "Table",
+ "hidden": 0,
+ "label": "Facility Access",
+ "max_length": 0,
+ "max_value": 0,
+ "options": "UniFi Access Profile",
+ "precision": "",
+ "read_only": 1,
+ "reqd": 0,
+ "show_in_filter": 0
+ },
+ {
+ "allow_read_on_all_link_options": 0,
+ "fieldname": "booked_member",
+ "fieldtype": "Table",
+ "hidden": 0,
+ "label": "Schedule Access",
+ "max_length": 0,
+ "max_value": 0,
+ "options": "Booked Member",
+ "precision": "",
+ "read_only": 1,
+ "reqd": 0,
+ "show_in_filter": 0
+ }
+ ],
+ "website_sidebar": "Member Sidebar"
+}
\ No newline at end of file
diff --git a/member_management/member_management/web_form/provisioning_information/provisioning_information.py b/member_management/member_management/web_form/provisioning_information/provisioning_information.py
new file mode 100644
index 0000000..80b7b87
--- /dev/null
+++ b/member_management/member_management/web_form/provisioning_information/provisioning_information.py
@@ -0,0 +1,6 @@
+import frappe
+
+
+def get_context(context):
+ # do your magic here
+ pass
diff --git a/member_management/templates/base.html b/member_management/templates/base.html
new file mode 100644
index 0000000..e547e26
--- /dev/null
+++ b/member_management/templates/base.html
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+ {% block meta_block %}
+ {% include "templates/includes/meta_block.html" %}
+ {% endblock %}
+
+ {% block title %}{{ title | striptags }}{% endblock %}
+
+ {% block favicon %}
+
+ {% endblock %}
+
+ {%- block head -%}
+ {% include "templates/includes/head.html" %}
+ {%- endblock -%}
+
+ {%- block head_include %}
+ {{ head_include or "" }}
+ {% endblock -%}
+
+ {%- block style %}
+ {% if colocated_css -%}
+
+ {%- endif %}
+ {%- endblock -%}
+
+ {% if boot.lang == "eo" %}
+
+
+ {% endif %}
+
+
+
+
+ {% include "public/icons/timeless/icons.svg" %}
+ {% include "public/icons/espresso/icons.svg" %}
+ {%- block banner -%}
+ {% include "templates/includes/banner_extension.html" ignore missing %}
+
+ {% if banner_html -%}
+ {{ banner_html or "" }}
+ {%- endif %}
+ {%- endblock -%}
+
+ {%- block navbar -%}
+ {{ web_block(
+ navbar_template or 'Standard Navbar',
+ values=_context_dict,
+ add_container=0,
+ add_top_padding=0,
+ add_bottom_padding=0,
+ ) }}
+ {%- endblock -%}
+
+ {% block content %}
+ {{ content }}
+ {% endblock %}
+
+ {%- block footer -%}
+ {{ web_block(
+ footer_template or 'Standard Footer',
+ values=_context_dict,
+ add_container=0,
+ add_top_padding=0,
+ add_bottom_padding=0
+ ) }}
+ {%- endblock -%}
+
+ {% block base_scripts %}
+
+
+ {{ include_script('frappe-web.bundle.js') }}
+ {% endblock %}
+
+ {%- for link in web_include_js %}
+ {{ include_script(link) }}
+ {%- endfor -%}
+
+ {%- block script %}
+ {% if colocated_js -%}
+
+ {%- endif %}
+ {%- endblock %}
+
+ {%- block body_include %}{{ body_include or "" }}{% endblock -%}
+
+
diff --git a/member_management/templates/doc.html b/member_management/templates/doc.html
new file mode 100644
index 0000000..c7b3696
--- /dev/null
+++ b/member_management/templates/doc.html
@@ -0,0 +1,116 @@
+{% extends "templates/base.html" %}
+{%- from "templates/includes/navbar/navbar_items.html" import render_item -%}
+
+{%- block head_include %}
+
+{% endblock -%}
+
+{%- block navbar -%}
+
+
+
+
+
+
+
+
+ {%- set items = docs_navbar_items or [] -%}
+ {%- for item in items -%}
+ {{ render_item(item, parent=True) }}
+ {%- endfor -%}
+
+ {% include "templates/includes/web_sidebar.html" %}
+
+
+
+
+
+{%- endblock -%}
+
+{% block content %}
+
+
+{% macro container_attributes() -%}
+id="page-{{ name or route | e }}" data-path="{{ pathname | e }}"
+{%- if page_or_generator=="Generator" %}source-type="Generator" data-doctype="{{ doctype }}"{%- endif %}
+{%- if source_content_type %}source-content-type="{{ source_content_type }}"{%- endif %}
+{%- endmacro %}
+
+
+
+
+
+
+
+
+ {% block page_container %}
+
+
+ {%- if add_breadcrumbs -%}
+ {% include "templates/includes/breadcrumbs.html" %}
+ {%- endif -%}
+ {%- block page_content -%}{%- endblock -%}
+
+
+ {% endblock %}
+
+
+ {%- if page_toc_html -%}
+
+ {% block page_toc %}
+ {% if page_toc_html %}
+
+
On this page
+ {{ page_toc_html }}
+
+ {% endif %}
+ {% endblock %}
+
+ {%- endif -%}
+
+
+
+{% endblock %}
+
+{%- block script -%}
+
+{%- endblock -%}
diff --git a/member_management/templates/pages/base.html b/member_management/templates/pages/base.html
new file mode 100644
index 0000000..e547e26
--- /dev/null
+++ b/member_management/templates/pages/base.html
@@ -0,0 +1,113 @@
+
+
+
+
+
+
+
+
+ {% block meta_block %}
+ {% include "templates/includes/meta_block.html" %}
+ {% endblock %}
+
+ {% block title %}{{ title | striptags }}{% endblock %}
+
+ {% block favicon %}
+
+ {% endblock %}
+
+ {%- block head -%}
+ {% include "templates/includes/head.html" %}
+ {%- endblock -%}
+
+ {%- block head_include %}
+ {{ head_include or "" }}
+ {% endblock -%}
+
+ {%- block style %}
+ {% if colocated_css -%}
+
+ {%- endif %}
+ {%- endblock -%}
+
+ {% if boot.lang == "eo" %}
+
+
+ {% endif %}
+
+
+
+
+ {% include "public/icons/timeless/icons.svg" %}
+ {% include "public/icons/espresso/icons.svg" %}
+ {%- block banner -%}
+ {% include "templates/includes/banner_extension.html" ignore missing %}
+
+ {% if banner_html -%}
+ {{ banner_html or "" }}
+ {%- endif %}
+ {%- endblock -%}
+
+ {%- block navbar -%}
+ {{ web_block(
+ navbar_template or 'Standard Navbar',
+ values=_context_dict,
+ add_container=0,
+ add_top_padding=0,
+ add_bottom_padding=0,
+ ) }}
+ {%- endblock -%}
+
+ {% block content %}
+ {{ content }}
+ {% endblock %}
+
+ {%- block footer -%}
+ {{ web_block(
+ footer_template or 'Standard Footer',
+ values=_context_dict,
+ add_container=0,
+ add_top_padding=0,
+ add_bottom_padding=0
+ ) }}
+ {%- endblock -%}
+
+ {% block base_scripts %}
+
+
+ {{ include_script('frappe-web.bundle.js') }}
+ {% endblock %}
+
+ {%- for link in web_include_js %}
+ {{ include_script(link) }}
+ {%- endfor -%}
+
+ {%- block script %}
+ {% if colocated_js -%}
+
+ {%- endif %}
+ {%- endblock %}
+
+ {%- block body_include %}{{ body_include or "" }}{% endblock -%}
+
+
diff --git a/member_management/templates/styles/card_style.css b/member_management/templates/styles/card_style.css
new file mode 100644
index 0000000..d400347
--- /dev/null
+++ b/member_management/templates/styles/card_style.css
@@ -0,0 +1,92 @@
+.hero-and-content {
+ background-color: var(--bg-color);
+}
+
+.page-card {
+ max-width: 360px;
+ padding: 15px;
+ margin: 70px auto;
+ border-radius: var(--border-radius-md);
+ background-color: var(--fg-color);
+ border: 1px solid var(--border-color);
+}
+
+.for-reset-password {
+ margin: 80px 0;
+}
+
+.for-reset-password .page-card {
+ border: 0;
+ max-width: 450px;
+ margin: auto;
+ border-radius: var(--border-radius-md);
+ padding: 40px 60px;
+}
+
+@media (max-width: 425px) {
+ .for-reset-password .page-card {
+ box-shadow: none;
+ background: none;
+ padding: 0px;
+ }
+}
+
+.page-card .page-card-head {
+ padding: 10px 15px;
+ margin: -15px;
+ margin-bottom: 15px;
+ border-bottom: 1px solid var(--border-color);
+}
+
+.for-reset-password .page-card .page-card-head {
+ border-bottom: 0;
+}
+
+.page-card-head h4 {
+ font-size: var(--text-xl);
+ font-weight: var(--weight-semibold);
+ letter-spacing: 0.01em;
+}
+
+#reset-password .form-group {
+ margin-bottom: 10px;
+ font-size: var(--font-size-sm);
+}
+
+.page-card .page-card-head .indicator {
+ color: #36414c;
+ font-size: 14px;
+}
+
+.sign-up-message {
+ margin-top: 20px;
+ font-size: 13px;
+ color: var(--text-color);
+}
+
+.page-card .page-card-head .indicator::before {
+ margin: 0 6px 0.5px 0px;
+}
+
+button#update {
+ font-size: var(--font-size-sm);
+}
+
+.page-card .btn {
+ margin-top: 30px;
+}
+
+.page-card p:empty {
+ display: none;
+}
+
+.page-card p {
+ font-size: 14px;
+}
+
+.ellipsis {
+ overflow: hidden;
+ text-overflow: ellipsis;
+ max-width: 100%;
+ vertical-align: middle;
+}
diff --git a/member_management/templates/styles/discussion_style.css b/member_management/templates/styles/discussion_style.css
new file mode 100644
index 0000000..b39de1d
--- /dev/null
+++ b/member_management/templates/styles/discussion_style.css
@@ -0,0 +1,293 @@
+.modal .comment-footer div:first-child {
+ display: none;
+}
+
+.discussions-header {
+ display: flex;
+ align-items: center;
+}
+
+@media (max-width: 500px) {
+ .discussions-header {
+ flex-direction: column;
+ align-items: inherit;
+ }
+}
+
+.discussions-header .button {
+ float: right;
+}
+
+.search-field {
+ background-image: url(/assets/frappe/icons/timeless/search.svg);
+ background-repeat: no-repeat;
+ text-indent: 1.5rem;
+ background-position: 1rem 0.45rem;
+ font-size: var(--text-md);
+ padding: 0.3rem 1rem;
+ border: 1px solid var(--dark-border-color);
+ border-radius: var(--border-radius-md);
+ margin-right: 0.5rem;
+}
+
+@media (max-width: 500px) {
+ .search-field {
+ margin: 0.75rem 0;
+ }
+}
+
+.sidebar-topic {
+ display: flex;
+ align-items: center;
+}
+
+.comment-footer {
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.reply-card {
+ padding: 1.25rem 0;
+ border-bottom: 1px solid var(--border-color);
+}
+
+.reply-card:last-of-type {
+ border-bottom: none;
+ padding-bottom: 0;
+}
+
+.reply-card .dropdown {
+ float: right;
+}
+
+.discussion-topic-title {
+ color: var(--text-color);
+ font-size: var(--text-lg);
+ font-weight: 600;
+}
+
+.discussion-on-page .topic-title {
+ display: none;
+}
+
+.discussion-on-page {
+ flex-direction: column;
+}
+
+.submit-discussion {
+ cursor: pointer;
+}
+
+.reply-actions {
+ display: flex;
+ align-items: center;
+ font-size: var(--text-sm);
+ margin-left: auto;
+}
+
+.reply-text h1 {
+ font-size: 1.3rem;
+}
+
+.reply-text h2 {
+ font-size: 1.2rem;
+}
+
+.reply-text h3 {
+ font-size: 1.1rem;
+}
+
+.reply-text h4 {
+ font-size: 1rem;
+}
+
+.reply-text p {
+ margin-bottom: 0;
+}
+
+.sidebar-info {
+ margin-top: 0.5rem;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.discussions-section-title {
+ font-size: var(--text-2xl);
+ font-weight: var(--weight-semibold);
+ letter-spacing: 0.01em;
+ color: var(--text-color);
+ flex-grow: 1;
+}
+
+.discussion-heading {
+ font-weight: 600;
+ font-size: var(--text-lg);
+ line-height: 146%;
+ letter-spacing: -0.0175em;
+ color: var(--text-color);
+ flex-grow: 1;
+}
+
+.card-style {
+ display: flex;
+ background: white;
+ border-radius: 8px;
+ position: relative;
+ box-shadow: var(--shadow-sm);
+}
+
+.discussions-card {
+ display: grid;
+ grid-gap: 2rem;
+ grid-template-columns: 2fr minmax(600px, 5fr);
+}
+
+@media (max-width: 1024px) {
+ .discussions-card {
+ grid-template-columns: 3fr minmax(400px, 5fr);
+ }
+}
+
+@media (max-width: 768px) {
+ .discussions-card {
+ grid-template-columns: 4fr minmax(400px, 5fr);
+ }
+}
+
+@media (max-width: 550px) {
+ .discussions-card {
+ display: flex;
+ }
+}
+
+.back-button {
+ display: flex;
+ margin-right: 1rem;
+ cursor: pointer;
+}
+
+.reply-author {
+ display: flex;
+ align-items: center;
+ margin: 0px 8px;
+ font-size: var(--text-sm);
+ line-height: 135%;
+ color: var(--text-color);
+}
+
+.discussions-header .btn {
+ float: right;
+}
+
+.empty-state {
+ border: 1px solid var(--gray-300);
+ border-radius: var(--border-radius-lg);
+ padding: 2rem;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+}
+
+.empty-state-text {
+ flex: 1;
+ margin-left: 1.25rem;
+}
+
+.empty-state-heading {
+ font-size: var(--text-xl);
+ color: var(--text-color);
+ font-weight: 600;
+}
+
+.sidebar-parent {
+ display: flex;
+ align-items: center;
+ padding: 1.25rem 0;
+ cursor: pointer;
+}
+
+@media (max-width: 500px) {
+ .sidebar-parent {
+ padding: 0.5rem;
+ }
+}
+
+@media (max-width: 400px) {
+ .sidebar-parent {
+ font-size: var(--text-sm);
+ }
+}
+
+.topic-author {
+ color: var(--text-light);
+ font-weight: 500;
+}
+
+.reply-section-header {
+ display: flex;
+ align-items: center;
+ margin-top: 1.5rem;
+}
+
+.reply-header {
+ display: flex;
+ align-items: center;
+ margin-bottom: 1rem;
+}
+
+.dismiss-reply {
+ cursor: pointer;
+}
+
+.discussions-sidebar {
+ flex-direction: column;
+}
+
+.card-divider {
+ border-top: 1px solid var(--dark-border-color);
+ margin-bottom: 0;
+}
+
+.reply-header .dropdown-menu {
+ min-width: 7rem;
+}
+
+.discussions-parent .ql-editor {
+ border-radius: var(--border-radius-md);
+}
+
+.mention {
+ display: inline-block;
+ height: auto;
+ width: auto;
+ border-radius: var(--border-radius-lg);
+ border: 1px solid var(--border-color);
+ padding: 2px 5px;
+ font-size: var(--text-sm);
+ background-color: var(--fg-color);
+}
+
+.mention a {
+ text-decoration: none;
+ color: inherit;
+}
+
+.ql-editor.read-mode .mention {
+ background-color: var(--control-bg);
+}
+
+.ql-editor.read-mode .mention a {
+ color: inherit;
+ background-color: inherit;
+}
+
+.discussion-form .form-group {
+ margin-bottom: 0;
+}
+
+.discussions-parent .ql-editor.ql-blank::before {
+ color: var(--gray-600);
+ font-style: normal;
+}
\ No newline at end of file
diff --git a/member_management/templates/styles/standard.css b/member_management/templates/styles/standard.css
new file mode 100644
index 0000000..d800893
--- /dev/null
+++ b/member_management/templates/styles/standard.css
@@ -0,0 +1,187 @@
+@media screen {
+ .print-format-gutter {
+ background-color: #d1d8dd;
+ padding: 30px 0px;
+ }
+ .print-format {
+ background-color: white;
+ border-radius: 8px;
+ max-width: 8.3in;
+ min-height: 11.69in;
+ padding: 0.75in;
+ margin: auto;
+ color: var(--gray-900);
+ }
+
+ .print-format.landscape {
+ max-width: 11.69in;
+ padding: 0.2in;
+ }
+
+ .page-break {
+ /* padding: 15px 0px; */
+ border-bottom: 1px dashed #888;
+ }
+
+ /* .page-break:first-child {
+ padding-top: 0px;
+ } */
+
+ .page-break:last-child {
+ border-bottom: 0px;
+ }
+
+ /* mozilla hack for images in table */
+ body:last-child .print-format td img {
+ width: 100% !important;
+ }
+
+ @media(max-width: 767px) {
+ .print-format {
+ padding: 0.2in;
+ }
+ }
+}
+
+@media print {
+ .print-format p {
+ margin-left: 1px;
+ margin-right: 1px;
+ }
+}
+
+.disabled-check {
+ color: #eee;
+}
+
+.data-field {
+ margin-top: 5px;
+ margin-bottom: 5px;
+}
+
+.data-field .value {
+ word-wrap: break-word;
+}
+
+.important .value {
+ font-size: 120%;
+ font-weight: bold;
+}
+
+.important label {
+ line-height: 1.8;
+ margin: 0px;
+}
+
+.table {
+ font-size: inherit;
+ margin: 20px 0px;
+}
+
+.checkbox-options {
+ columns: var(--checkbox-options-columns);
+}
+
+.square-image {
+ width: 100%;
+ height: 0;
+ padding: 50% 0;
+ background-size: contain;
+ /*background-size: cover;*/
+ background-repeat: no-repeat !important;
+ background-position: center center;
+ border-radius: 4px;
+}
+
+.print-item-image {
+ object-fit: contain;
+}
+
+.pdf-variables,
+.pdf-variable,
+.visible-pdf {
+ display: none !important;
+}
+
+.print-format {
+ font-size: {{ print_settings.font_size|flt or 9 }}pt;
+ font-family: {{ font }};
+ -webkit-print-color-adjust:exact;
+}
+
+.page-break {
+ page-break-after: always;
+}
+
+.print-heading {
+ border-bottom: 1px solid #aaa;
+ margin-bottom: 10px;
+}
+
+.print-heading h2 {
+ margin: 0px;
+}
+.print-heading h4 {
+ margin-top: 5px;
+}
+
+table.no-border, table.no-border td {
+ border: 0px;
+}
+
+.print-format label {
+ /* wkhtmltopdf breaks label into multiple lines when it is inline-block */
+ display: block;
+ font-weight: 700;
+}
+
+.print-format img {
+ max-width: 100%;
+}
+
+.print-format table td > .primary:first-child {
+ font-weight: bold;
+}
+
+.print-format td, .print-format th {
+ vertical-align: top !important;
+ padding: 6px !important;
+}
+
+.print-format p {
+ margin: 3px 0px 3px;
+}
+
+.print-format table td pre {
+ white-space: normal;
+ word-break: normal;
+}
+
+table td div {
+ {% if not print_settings.allow_page_break_inside_tables %}
+ /* needed to avoid partial cutting of text between page break in wkhtmltopdf */
+ page-break-inside: avoid !important;
+ {% endif %}
+}
+
+/* hack for webkit specific browser */
+@media (-webkit-min-device-pixel-ratio:0) {
+ thead, tfoot {
+ display: table-header-group;
+ }
+}
+
+[document-status] {
+ margin-bottom: 5mm;
+}
+
+.signature-img {
+ background: #fff;
+ border-radius: 3px;
+ margin-top: 5px;
+ max-height: 150px;
+}
+
+.print-format-preview [data-fieldtype="Table"] {
+ overflow: auto;
+}
diff --git a/member_management/templates/web.html b/member_management/templates/web.html
new file mode 100644
index 0000000..48fbce7
--- /dev/null
+++ b/member_management/templates/web.html
@@ -0,0 +1,76 @@
+{% extends base_template_path %}
+{% block hero %}{% endblock %}
+
+{% block content %}
+
+{% macro main_content() %}
+
+
+
+ {% block breadcrumbs %}
+ {% include 'templates/includes/breadcrumbs.html' %}
+ {% endblock %}
+
+
+ {% block page_container %}
+
+
+
+
+ {%- block page_content -%}{%- endblock -%}
+
+
+
+
+ {% endblock %}
+
+{% endmacro %}
+
+{% macro container_attributes() -%}
+id="page-{{ name or route | e }}" data-path="{{ pathname | e }}"
+{%- if page_or_generator=="Generator" %}source-type="Generator" data-doctype="{{ doctype }}"{%- endif %}
+{%- if source_content_type %}source-content-type="{{ source_content_type }}"{%- endif %}
+{%- endmacro %}
+
+{% macro sidebar() %}
+
+ {% block page_sidebar %}
+ {% include "templates/includes/web_sidebar.html" %}
+ {% endblock %}
+
+{% endmacro %}
+
+{% if show_sidebar %}
+
+
+ {%- set columns = sidebar_columns or 2 -%}
+ {%- if not sidebar_right -%}
+ {{ sidebar() }}
+ {%- endif -%}
+
+ {{ main_content() }}
+
+ {%- if sidebar_right -%}
+ {{ sidebar() }}
+ {%- endif -%}
+
+
+{% else %}
+
+ {{ main_content() }}
+
+{% endif %}
+
+{% endblock %}
diff --git a/member_management/www/profile-provisioning.html b/member_management/www/profile-provisioning.html
new file mode 100644
index 0000000..3fee6a7
--- /dev/null
+++ b/member_management/www/profile-provisioning.html
@@ -0,0 +1,6 @@
+### List of Users
+
+{% for user in users %}
+ 2. {{ user.first_name }} {{ user.get("last_name", "") }}
+
+{% endfor %}
diff --git a/member_management/www/profile-provisioning.py b/member_management/www/profile-provisioning.py
new file mode 100644
index 0000000..a06c994
--- /dev/null
+++ b/member_management/www/profile-provisioning.py
@@ -0,0 +1,5 @@
+import frappe
+
+
+def get_context(context):
+ context.users = frappe.get_list("User", fields=["first_name", "last_name"])