diff --git a/member_management/member_management/doctype/__init__.py b/member_management/member_management/doctype/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/member_management/member_management/doctype/associate_list/__init__.py b/member_management/member_management/doctype/associate_list/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/member_management/member_management/doctype/associate_list/associate_list.json b/member_management/member_management/doctype/associate_list/associate_list.json new file mode 100644 index 0000000..4703e65 --- /dev/null +++ b/member_management/member_management/doctype/associate_list/associate_list.json @@ -0,0 +1,32 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2025-11-09 09:57:45.397759", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "section_break_ppay" + ], + "fields": [ + { + "fieldname": "section_break_ppay", + "fieldtype": "Section Break" + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2025-11-09 09:57:45.397759", + "modified_by": "Administrator", + "module": "Member Management", + "name": "Associate List", + "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/associate_list/associate_list.py b/member_management/member_management/doctype/associate_list/associate_list.py new file mode 100644 index 0000000..41f42e0 --- /dev/null +++ b/member_management/member_management/doctype/associate_list/associate_list.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 AssociateList(Document): + pass diff --git a/member_management/member_management/doctype/corporate_documents/__init__.py b/member_management/member_management/doctype/corporate_documents/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/member_management/member_management/doctype/corporate_documents/corporate_documents.json b/member_management/member_management/doctype/corporate_documents/corporate_documents.json new file mode 100644 index 0000000..071c8fe --- /dev/null +++ b/member_management/member_management/doctype/corporate_documents/corporate_documents.json @@ -0,0 +1,48 @@ +{ + "actions": [], + "allow_rename": 1, + "autoname": "format:{member_id}_{member_doctype}_{YYYY}_{MM}_{DD}_{#####}", + "creation": "2025-11-09 09:55:54.869737", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "member_doctype", + "file" + ], + "fields": [ + { + "description": "See instructions. Not all applicants require all documents. ", + "fieldname": "member_doctype", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Document Type", + "options": "Business Registration Certificate\nCertificate of Formation\nCertificate of Trade Name\nIRS EIN Letter\nSales Tax Authority", + "reqd": 1, + "search_index": 1 + }, + { + "fieldname": "file", + "fieldtype": "Attach", + "in_list_view": 1, + "label": "File Name", + "reqd": 1 + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2025-11-09 11:14:45.962456", + "modified_by": "Administrator", + "module": "Member Management", + "name": "Corporate Documents", + "naming_rule": "Expression", + "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/corporate_documents/corporate_documents.py b/member_management/member_management/doctype/corporate_documents/corporate_documents.py new file mode 100644 index 0000000..91072c6 --- /dev/null +++ b/member_management/member_management/doctype/corporate_documents/corporate_documents.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 CorporateDocuments(Document): + pass diff --git a/member_management/member_management/doctype/food_protection_manager_record/__init__.py b/member_management/member_management/doctype/food_protection_manager_record/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/member_management/member_management/doctype/food_protection_manager_record/food_protection_manager_record.json b/member_management/member_management/doctype/food_protection_manager_record/food_protection_manager_record.json new file mode 100644 index 0000000..187174a --- /dev/null +++ b/member_management/member_management/doctype/food_protection_manager_record/food_protection_manager_record.json @@ -0,0 +1,69 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2025-11-09 09:57:03.492727", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "section_break_srta", + "manager_issuer", + "certificate", + "column_break_ysbr", + "issue_date", + "expire_date" + ], + "fields": [ + { + "fieldname": "section_break_srta", + "fieldtype": "Section Break" + }, + { + "fieldname": "manager_issuer", + "fieldtype": "Select", + "in_list_view": 1, + "label": "Issuer", + "options": "360 Training\nAAA Food Manager\nAboveTraining/StateFoodSafety\nEnvironmental Health Testing\nMy Food Service License\nNational Restaurant Association\nServSafe Manager\nThe Always Food Safe Company\nTrust20\nWFSO Academy", + "reqd": 1 + }, + { + "fieldname": "certificate", + "fieldtype": "Attach", + "in_list_view": 1, + "label": "Certificate", + "reqd": 1 + }, + { + "fieldname": "column_break_ysbr", + "fieldtype": "Column Break" + }, + { + "fieldname": "issue_date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Issue Date" + }, + { + "fieldname": "expire_date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Expiration Date", + "reqd": 1 + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2025-11-09 11:41:55.956305", + "modified_by": "Administrator", + "module": "Member Management", + "name": "Food Protection Manager Record", + "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/food_protection_manager_record/food_protection_manager_record.py b/member_management/member_management/doctype/food_protection_manager_record/food_protection_manager_record.py new file mode 100644 index 0000000..32ae305 --- /dev/null +++ b/member_management/member_management/doctype/food_protection_manager_record/food_protection_manager_record.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 FoodProtectionManagerRecord(Document): + pass diff --git a/member_management/member_management/doctype/inspection_record/__init__.py b/member_management/member_management/doctype/inspection_record/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/member_management/member_management/doctype/inspection_record/inspection_record.js b/member_management/member_management/doctype/inspection_record/inspection_record.js new file mode 100644 index 0000000..78041b9 --- /dev/null +++ b/member_management/member_management/doctype/inspection_record/inspection_record.js @@ -0,0 +1,8 @@ +// Copyright (c) 2025, Haddon Kitchen Incubator LLC and contributors +// For license information, please see license.txt + +// frappe.ui.form.on("Inspection Record", { +// refresh(frm) { + +// }, +// }); diff --git a/member_management/member_management/doctype/inspection_record/inspection_record.json b/member_management/member_management/doctype/inspection_record/inspection_record.json new file mode 100644 index 0000000..26fb386 --- /dev/null +++ b/member_management/member_management/doctype/inspection_record/inspection_record.json @@ -0,0 +1,76 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2025-11-09 09:56:19.768362", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "jurisdiction", + "inspection_type", + "inspection_file", + "column_break_urym", + "issue_date", + "expire_date" + ], + "fields": [ + { + "description": "Authorizing Jurisdiction (County, State, Federal Agency)", + "fieldname": "jurisdiction", + "fieldtype": "Data", + "in_list_view": 1, + "in_standard_filter": 1, + "label": "Jurisdiction", + "reqd": 1 + }, + { + "description": "See Instructions. Not all applicants will need to supply all docuuments.", + "fieldname": "inspection_type", + "fieldtype": "Select", + "in_list_view": 1, + "in_preview": 1, + "label": "Document Type", + "options": "Mobile Application\nMobile Certificate\nMobile Inspection Report\nFacility Application\nFacility Certificate\nFacility Inspection Report", + "reqd": 1 + }, + { + "fieldname": "inspection_file", + "fieldtype": "Attach", + "in_list_view": 1, + "in_preview": 1, + "label": "File", + "reqd": 1 + }, + { + "fieldname": "column_break_urym", + "fieldtype": "Column Break" + }, + { + "fieldname": "issue_date", + "fieldtype": "Date", + "label": "Issue Date" + }, + { + "description": "County sanitation certificates expire at calendar year end", + "fieldname": "expire_date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Expiration Date", + "reqd": 1 + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2025-11-09 11:40:46.022312", + "modified_by": "Administrator", + "module": "Member Management", + "name": "Inspection Record", + "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/inspection_record/inspection_record.py b/member_management/member_management/doctype/inspection_record/inspection_record.py new file mode 100644 index 0000000..3731d6c --- /dev/null +++ b/member_management/member_management/doctype/inspection_record/inspection_record.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 InspectionRecord(Document): + pass diff --git a/member_management/member_management/doctype/inspection_record/test_inspection_record.py b/member_management/member_management/doctype/inspection_record/test_inspection_record.py new file mode 100644 index 0000000..61ef8b9 --- /dev/null +++ b/member_management/member_management/doctype/inspection_record/test_inspection_record.py @@ -0,0 +1,9 @@ +# Copyright (c) 2025, Haddon Kitchen Incubator LLC and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestInspectionRecord(FrappeTestCase): + pass diff --git a/member_management/member_management/doctype/insurance_record/__init__.py b/member_management/member_management/doctype/insurance_record/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/member_management/member_management/doctype/insurance_record/insurance_record.js b/member_management/member_management/doctype/insurance_record/insurance_record.js new file mode 100644 index 0000000..9838bcb --- /dev/null +++ b/member_management/member_management/doctype/insurance_record/insurance_record.js @@ -0,0 +1,8 @@ +// Copyright (c) 2025, Haddon Kitchen Incubator LLC and contributors +// For license information, please see license.txt + +// frappe.ui.form.on("Insurance Record", { +// refresh(frm) { + +// }, +// }); diff --git a/member_management/member_management/doctype/insurance_record/insurance_record.json b/member_management/member_management/doctype/insurance_record/insurance_record.json new file mode 100644 index 0000000..137e6b7 --- /dev/null +++ b/member_management/member_management/doctype/insurance_record/insurance_record.json @@ -0,0 +1,60 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2025-11-09 09:57:22.638768", + "doctype": "DocType", + "engine": "InnoDB", + "field_order": [ + "insurer", + "declaration", + "column_break_wgkt", + "issue_date", + "expire_date" + ], + "fields": [ + { + "fieldname": "insurer", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Insurer" + }, + { + "fieldname": "declaration", + "fieldtype": "Attach", + "in_list_view": 1, + "label": "File", + "reqd": 1 + }, + { + "fieldname": "column_break_wgkt", + "fieldtype": "Column Break" + }, + { + "fieldname": "issue_date", + "fieldtype": "Date", + "label": "Issue Date" + }, + { + "fieldname": "expire_date", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Expiration Date", + "reqd": 1 + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2025-11-09 11:39:42.856785", + "modified_by": "Administrator", + "module": "Member Management", + "name": "Insurance Record", + "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/insurance_record/insurance_record.py b/member_management/member_management/doctype/insurance_record/insurance_record.py new file mode 100644 index 0000000..52b18d5 --- /dev/null +++ b/member_management/member_management/doctype/insurance_record/insurance_record.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 InsuranceRecord(Document): + pass diff --git a/member_management/member_management/doctype/insurance_record/test_insurance_record.py b/member_management/member_management/doctype/insurance_record/test_insurance_record.py new file mode 100644 index 0000000..14d5f1c --- /dev/null +++ b/member_management/member_management/doctype/insurance_record/test_insurance_record.py @@ -0,0 +1,9 @@ +# Copyright (c) 2025, Haddon Kitchen Incubator LLC and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestInsuranceRecord(FrappeTestCase): + pass diff --git a/member_management/member_management/doctype/member_agreements/__init__.py b/member_management/member_management/doctype/member_agreements/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/member_management/member_management/doctype/member_agreements/member_agreements.json b/member_management/member_management/doctype/member_agreements/member_agreements.json new file mode 100644 index 0000000..e0d5f82 --- /dev/null +++ b/member_management/member_management/doctype/member_agreements/member_agreements.json @@ -0,0 +1,65 @@ +{ + "actions": [], + "allow_rename": 1, + "creation": "2025-11-09 09:59:42.069937", + "doctype": "DocType", + "editable_grid": 1, + "engine": "InnoDB", + "field_order": [ + "contract_type", + "file", + "column_break_bkzm", + "date_effective", + "date_end" + ], + "fields": [ + { + "fieldname": "contract_type", + "fieldtype": "Select", + "in_list_view": 1, + "in_preview": 1, + "label": "Contract Type", + "options": "Facilities Use Agreement\nStorage Addendum\nMobile Base Station Addendum\nEquipment Rental\nEvent Room Rental", + "reqd": 1 + }, + { + "fieldname": "file", + "fieldtype": "Attach", + "in_list_view": 1, + "label": "File", + "reqd": 1 + }, + { + "fieldname": "column_break_bkzm", + "fieldtype": "Column Break" + }, + { + "fieldname": "date_effective", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Effective Date", + "reqd": 1 + }, + { + "fieldname": "date_end", + "fieldtype": "Date", + "in_list_view": 1, + "label": "Date End" + } + ], + "grid_page_length": 50, + "index_web_pages_for_search": 1, + "istable": 1, + "links": [], + "modified": "2025-11-09 11:48:36.156523", + "modified_by": "Administrator", + "module": "Member Management", + "name": "Member Agreements", + "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/member_agreements/member_agreements.py b/member_management/member_management/doctype/member_agreements/member_agreements.py new file mode 100644 index 0000000..a1ad86b --- /dev/null +++ b/member_management/member_management/doctype/member_agreements/member_agreements.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 MemberAgreements(Document): + pass diff --git a/member_management/member_management/doctype/member_profile/__init__.py b/member_management/member_management/doctype/member_profile/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/member_management/member_management/doctype/member_profile/member_file.js b/member_management/member_management/doctype/member_profile/member_file.js new file mode 100644 index 0000000..ada16dc --- /dev/null +++ b/member_management/member_management/doctype/member_profile/member_file.js @@ -0,0 +1,8 @@ +// Copyright (c) 2025, Haddon Kitchen Incubator LLC and contributors +// For license information, please see license.txt + +// frappe.ui.form.on("Member File", { +// refresh(frm) { + +// }, +// }); diff --git a/member_management/member_management/doctype/member_profile/member_file.json b/member_management/member_management/doctype/member_profile/member_file.json new file mode 100644 index 0000000..418f223 --- /dev/null +++ b/member_management/member_management/doctype/member_profile/member_file.json @@ -0,0 +1,235 @@ +{ + "actions": [], + "autoname": "field:member_id", + "creation": "2025-11-09 09:55:16.302059", + "default_view": "List", + "doctype": "DocType", + "document_type": "Document", + "engine": "InnoDB", + "field_order": [ + "member_data_section", + "column_break_vdps", + "member_name", + "member_ein", + "risk_class", + "column_break_jznx", + "member_id", + "join_date", + "onboard_date", + "membership_details_section", + "membership_type", + "column_break_iofm", + "dashboard_tab", + "documents", + "agreements_section", + "table_cabr", + "corporate_documents_section", + "table_rkkt", + "food_manager_records_section", + "table_wsni", + "insurance_records_section", + "table_wmpy", + "inspection_records_section", + "table_yzvn", + "menus_section", + "tempattach", + "associates_tab", + "associates_section", + "table_cdln" + ], + "fields": [ + { + "fieldname": "member_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Name", + "reqd": 1, + "unique": 1 + }, + { + "fieldname": "dashboard_tab", + "fieldtype": "Tab Break", + "label": "Dashboard", + "show_dashboard": 1 + }, + { + "fieldname": "documents", + "fieldtype": "Tab Break", + "label": "Documents" + }, + { + "fieldname": "agreements_section", + "fieldtype": "Section Break", + "label": "Agreements" + }, + { + "fieldname": "table_cabr", + "fieldtype": "Table", + "options": "Member Agreements" + }, + { + "fieldname": "corporate_documents_section", + "fieldtype": "Section Break", + "label": "Corporate Documents" + }, + { + "fieldname": "table_rkkt", + "fieldtype": "Table", + "options": "Corporate Documents" + }, + { + "fieldname": "food_manager_records_section", + "fieldtype": "Section Break", + "label": "Food Manager Records" + }, + { + "fieldname": "table_wsni", + "fieldtype": "Table", + "options": "Food Protection Manager Record" + }, + { + "fieldname": "insurance_records_section", + "fieldtype": "Section Break", + "label": "Insurance Records" + }, + { + "fieldname": "table_wmpy", + "fieldtype": "Table", + "options": "Insurance Record" + }, + { + "fieldname": "inspection_records_section", + "fieldtype": "Section Break", + "label": "Inspection Records" + }, + { + "fieldname": "table_yzvn", + "fieldtype": "Table", + "options": "Inspection Record" + }, + { + "fieldname": "menus_section", + "fieldtype": "Section Break", + "label": "Menus" + }, + { + "fieldname": "tempattach", + "fieldtype": "Attach" + }, + { + "fieldname": "associates_tab", + "fieldtype": "Tab Break", + "label": "Associates" + }, + { + "fieldname": "associates_section", + "fieldtype": "Section Break", + "label": "Associates" + }, + { + "fieldname": "table_cdln", + "fieldtype": "Table", + "options": "Associate List" + }, + { + "fieldname": "join_date", + "fieldtype": "Date", + "label": "Joined" + }, + { + "fieldname": "onboard_date", + "fieldtype": "Date", + "label": "Onboarded" + }, + { + "fieldname": "risk_class", + "fieldtype": "Select", + "label": "Risk Class", + "options": "1\n2\n3" + }, + { + "fieldname": "member_ein", + "fieldtype": "Data", + "label": "EIN" + }, + { + "columns": 1, + "fieldname": "column_break_jznx", + "fieldtype": "Column Break" + }, + { + "description": "For API Integrations", + "fieldname": "member_id", + "fieldtype": "Int", + "label": "Member ID", + "length": 12, + "non_negative": 1, + "reqd": 1, + "unique": 1 + }, + { + "fieldname": "member_data_section", + "fieldtype": "Section Break", + "label": "Member Data" + }, + { + "fieldname": "column_break_vdps", + "fieldtype": "Column Break" + }, + { + "fieldname": "membership_details_section", + "fieldtype": "Section Break", + "label": "Membership Details" + }, + { + "fieldname": "membership_type", + "fieldtype": "Select", + "label": "Membership Type", + "options": "Standard\nCold Pack\nMobile Only\nWarewashing Only" + }, + { + "fieldname": "column_break_iofm", + "fieldtype": "Column Break" + } + ], + "grid_page_length": 50, + "links": [], + "modified": "2025-11-09 13:17:36.571988", + "modified_by": "Administrator", + "module": "Member Management", + "name": "Member File", + "naming_rule": "By fieldname", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + }, + { + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "Member", + "share": 1, + "write": 1 + } + ], + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "show_preview_popup": 1, + "show_title_field_in_link": 1, + "sort_field": "modified", + "sort_order": "DESC", + "states": [], + "title_field": "member_name" +} \ No newline at end of file diff --git a/member_management/member_management/doctype/member_profile/member_file.py b/member_management/member_management/doctype/member_profile/member_file.py new file mode 100644 index 0000000..3c64e19 --- /dev/null +++ b/member_management/member_management/doctype/member_profile/member_file.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 MemberFile(Document): + pass diff --git a/member_management/member_management/doctype/member_profile/member_profile.js b/member_management/member_management/doctype/member_profile/member_profile.js new file mode 100644 index 0000000..9535d87 --- /dev/null +++ b/member_management/member_management/doctype/member_profile/member_profile.js @@ -0,0 +1,8 @@ +// Copyright (c) 2025, Haddon Kitchen Incubator LLC and contributors +// For license information, please see license.txt + +// frappe.ui.form.on("Member Profile", { +// refresh(frm) { + +// }, +// }); diff --git a/member_management/member_management/doctype/member_profile/member_profile.json b/member_management/member_management/doctype/member_profile/member_profile.json new file mode 100644 index 0000000..8a5e8b4 --- /dev/null +++ b/member_management/member_management/doctype/member_profile/member_profile.json @@ -0,0 +1,254 @@ +{ + "actions": [], + "autoname": "format:{member_id}", + "creation": "2025-11-09 09:55:16.302059", + "default_view": "List", + "doctype": "DocType", + "document_type": "Document", + "engine": "InnoDB", + "field_order": [ + "member_data_section", + "column_break_vdps", + "member_name", + "member_ein", + "join_date", + "onboard_date", + "risk_class", + "column_break_jznx", + "member_id", + "api_id", + "membership_details_section", + "membership_type", + "column_break_iofm", + "dashboard_tab", + "documents", + "agreements_section", + "table_cabr", + "corporate_documents_section", + "table_rkkt", + "food_manager_records_section", + "table_wsni", + "insurance_records_section", + "table_wmpy", + "inspection_records_section", + "table_yzvn", + "menus_section", + "tempattach", + "associates_tab", + "associates_section", + "table_cdln" + ], + "fields": [ + { + "fieldname": "member_data_section", + "fieldtype": "Section Break", + "label": "Member Data" + }, + { + "fieldname": "column_break_vdps", + "fieldtype": "Column Break" + }, + { + "bold": 1, + "description": "Legal Business Name", + "fieldname": "member_name", + "fieldtype": "Data", + "in_list_view": 1, + "label": "Name", + "reqd": 1, + "unique": 1 + }, + { + "fieldname": "member_ein", + "fieldtype": "Data", + "label": "IRS Employer Identification Number (EIN)" + }, + { + "description": "Department of Health Classification", + "fieldname": "risk_class", + "fieldtype": "Select", + "label": "Risk Class", + "options": "Undetermined\n1\n2\n3" + }, + { + "columns": 1, + "fieldname": "column_break_jznx", + "fieldtype": "Column Break" + }, + { + "description": "Not editable", + "fieldname": "member_id", + "fieldtype": "Data", + "label": "Member ID", + "reqd": 1, + "set_only_once": 1, + "unique": 1 + }, + { + "fieldname": "join_date", + "fieldtype": "Date", + "label": "Joined", + "permlevel": 2 + }, + { + "fieldname": "onboard_date", + "fieldtype": "Date", + "label": "Onboarded", + "permlevel": 3 + }, + { + "fieldname": "membership_details_section", + "fieldtype": "Section Break", + "label": "Membership Details" + }, + { + "fieldname": "membership_type", + "fieldtype": "Select", + "label": "Membership Type", + "options": "Standard\nCold Pack\nMobile Only\nWarewashing Only", + "permlevel": 2 + }, + { + "fieldname": "column_break_iofm", + "fieldtype": "Column Break" + }, + { + "fieldname": "dashboard_tab", + "fieldtype": "Tab Break", + "label": "Dashboard", + "show_dashboard": 1 + }, + { + "fieldname": "documents", + "fieldtype": "Tab Break", + "label": "Documents" + }, + { + "fieldname": "agreements_section", + "fieldtype": "Section Break", + "label": "Agreements" + }, + { + "fieldname": "table_cabr", + "fieldtype": "Table", + "options": "Member Agreements" + }, + { + "fieldname": "corporate_documents_section", + "fieldtype": "Section Break", + "label": "Corporate Documents" + }, + { + "fieldname": "table_rkkt", + "fieldtype": "Table", + "options": "Corporate Documents" + }, + { + "fieldname": "food_manager_records_section", + "fieldtype": "Section Break", + "label": "Food Manager Records" + }, + { + "fieldname": "table_wsni", + "fieldtype": "Table", + "options": "Food Protection Manager Record" + }, + { + "fieldname": "insurance_records_section", + "fieldtype": "Section Break", + "label": "Insurance Records" + }, + { + "fieldname": "table_wmpy", + "fieldtype": "Table", + "options": "Insurance Record" + }, + { + "fieldname": "inspection_records_section", + "fieldtype": "Section Break", + "label": "Inspection Records" + }, + { + "fieldname": "table_yzvn", + "fieldtype": "Table", + "options": "Inspection Record" + }, + { + "fieldname": "menus_section", + "fieldtype": "Section Break", + "label": "Menus" + }, + { + "fieldname": "tempattach", + "fieldtype": "Attach" + }, + { + "fieldname": "associates_tab", + "fieldtype": "Tab Break", + "label": "Associates" + }, + { + "fieldname": "associates_section", + "fieldtype": "Section Break", + "label": "Associates" + }, + { + "fieldname": "table_cdln", + "fieldtype": "Table", + "options": "Associate List" + }, + { + "description": "For API Integrations", + "fieldname": "api_id", + "fieldtype": "Data", + "label": "API ID", + "length": 32, + "non_negative": 1, + "unique": 1 + } + ], + "grid_page_length": 50, + "links": [ + { + "group": "User", + "link_doctype": "User", + "link_fieldname": "full_name" + }, + { + "group": "User", + "link_doctype": "Customer", + "link_fieldname": "customer_name" + } + ], + "modified": "2025-11-09 17:42:12.364409", + "modified_by": "Administrator", + "module": "Member Management", + "name": "Member Profile", + "naming_rule": "Expression", + "owner": "Administrator", + "permissions": [ + { + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "print": 1, + "read": 1, + "report": 1, + "role": "System Manager", + "share": 1, + "write": 1 + } + ], + "protect_attached_files": 1, + "row_format": "Dynamic", + "rows_threshold_for_grid_search": 20, + "show_name_in_global_search": 1, + "show_preview_popup": 1, + "show_title_field_in_link": 1, + "sort_field": "modified", + "sort_order": "DESC", + "states": [], + "title_field": "member_name", + "track_seen": 1 +} \ No newline at end of file diff --git a/member_management/member_management/doctype/member_profile/member_profile.py b/member_management/member_management/doctype/member_profile/member_profile.py new file mode 100644 index 0000000..2f4a600 --- /dev/null +++ b/member_management/member_management/doctype/member_profile/member_profile.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 MemberProfile(Document): + pass diff --git a/member_management/member_management/doctype/member_profile/test_member_file.py b/member_management/member_management/doctype/member_profile/test_member_file.py new file mode 100644 index 0000000..cfb520e --- /dev/null +++ b/member_management/member_management/doctype/member_profile/test_member_file.py @@ -0,0 +1,9 @@ +# Copyright (c) 2025, Haddon Kitchen Incubator LLC and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestMemberFile(FrappeTestCase): + pass diff --git a/member_management/member_management/doctype/member_profile/test_member_profile.py b/member_management/member_management/doctype/member_profile/test_member_profile.py new file mode 100644 index 0000000..6fd26e5 --- /dev/null +++ b/member_management/member_management/doctype/member_profile/test_member_profile.py @@ -0,0 +1,9 @@ +# Copyright (c) 2025, Haddon Kitchen Incubator LLC and Contributors +# See license.txt + +# import frappe +from frappe.tests.utils import FrappeTestCase + + +class TestMemberProfile(FrappeTestCase): + pass diff --git a/member_management/member_management/web_form/__init__.py b/member_management/member_management/web_form/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/member_management/member_management/web_form/member_profile/__init__.py b/member_management/member_management/web_form/member_profile/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/member_management/member_management/web_form/member_profile/member_profile.js b/member_management/member_management/web_form/member_profile/member_profile.js new file mode 100644 index 0000000..699703c --- /dev/null +++ b/member_management/member_management/web_form/member_profile/member_profile.js @@ -0,0 +1,3 @@ +frappe.ready(function() { + // bind events here +}) \ No newline at end of file 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 new file mode 100644 index 0000000..b6583c6 --- /dev/null +++ b/member_management/member_management/web_form/member_profile/member_profile.json @@ -0,0 +1,336 @@ +{ + "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-09 13:01:42.166805", + "doc_type": "Member Profile", + "docstatus": 0, + "doctype": "Web Form", + "idx": 0, + "introduction_text": "

Please provide required membership information on this form.


Member Details
  1. Confirm your legal business name
  2. Your Member ID is pre-generated and cannot be changed
  3. Risk class is determined by the Authorizing Jurisdiction. You may leave it blank if unsure.
  4. Type 1 is prepackaged commercial food (grocery items)
  5. Type 2 is limited preparation of pre-cooked food, bread, or other low-risk items
  6. 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.
  7. Please provide your EIN if your are organized as an LLC, S or C corp.


Corporate Identity Documents

Upload one per required document type.


Corporation (including LLC):

  1. Certificate of Formation (example)
  2. State Business Registration Certificate (example)
  3. Certificate of Trade Name, if any (example)
  4. IRS EIN Letter (example)


Sole Proprietorship:

  1. Certificate of Trade Name


All Business Types:

  1. State Sales Tax Registration Certificate (example)


Food Protection Manager Certificate

Risk Type 3 members must upload a valid unexpired food protection manager certificate from an acceptable issuer.


Insurance

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.


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.


Menu

A menu is required to be submitted to the authorizing jurisdiction to determine risk type. This will be submitted with any application paperwork.


Associates

All employees or business associates who will be present in the facility must be individually identified.

  1. 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.
  2. Every person must have an associated photo identification document. Acceptable documents include a Driver's License, Passport, or State-issued ID card.
Agreements

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-09 22:28:13.460426", + "modified_by": "Administrator", + "module": "Member Management", + "name": "member-profile", + "owner": "Administrator", + "published": 1, + "route": "profile", + "show_attachments": 1, + "show_list": 0, + "show_sidebar": 1, + "title": "Member Profile", + "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 + }, + { + "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 Documents", + "precision": "", + "read_only": 0, + "reqd": 0, + "show_in_filter": 0 + }, + { + "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 + }, + { + "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 + }, + { + "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 + }, + { + "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": "tempattach", + "fieldtype": "Attach", + "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, + "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 + }, + { + "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 Agreements", + "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/member_profile/member_profile.py b/member_management/member_management/web_form/member_profile/member_profile.py new file mode 100644 index 0000000..e1ada61 --- /dev/null +++ b/member_management/member_management/web_form/member_profile/member_profile.py @@ -0,0 +1,5 @@ +import frappe + +def get_context(context): + # do your magic here + pass