From e2746b83bb32e055c022d30f90d320b9ad5aa769 Mon Sep 17 00:00:00 2001 From: Casey Date: Sun, 15 Feb 2026 08:00:18 -0600 Subject: [PATCH] update --- custom_ui/install.py | 156 +---- .../calendar/jobs/SNWProjectCalendar.vue | 639 +++++++++++------- 2 files changed, 412 insertions(+), 383 deletions(-) diff --git a/custom_ui/install.py b/custom_ui/install.py index ca929a7..241ccb8 100644 --- a/custom_ui/install.py +++ b/custom_ui/install.py @@ -6,10 +6,12 @@ import frappe from .utils import create_module import holidays from datetime import date, timedelta +from erpnext.accounts.doctype.account.chart_of_accounts.chart_of_accounts import create_charts + def after_install(): create_module() - add_custom_fields() + # add_custom_fields() frappe.db.commit() # Proper way to refresh metadata @@ -31,7 +33,7 @@ def after_install(): def after_migrate(): add_custom_fields() - update_onsite_meeting_fields() + # update_onsite_meeting_fields() frappe.db.commit() # Proper way to refresh metadata for all doctypes with custom fields @@ -40,13 +42,13 @@ def after_migrate(): frappe.clear_cache(doctype=doctype) frappe.reload_doctype(doctype) - check_and_create_holiday_list() + # check_and_create_holiday_list() # create_project_templates() # create_task_types() # create_tasks() - create_bid_meeting_note_form_templates() + # create_bid_meeting_note_form_templates() create_accounts() - create_companies() + # create_companies() # init_stripe_accounts() # update_address_fields() @@ -1592,126 +1594,24 @@ def create_bid_meeting_note_form_templates(): doc.insert(ignore_permissions=True) -def create_companies(): +def create_accounts(): """Create necessary companies if they do not exist.""" print("\nšŸ”§ Checking for necessary companies...") - companies = [ - { - 'company_name': 'Veritas Stone', - 'abbr': 'VS', - 'default_currency': 'USD', - 'country': 'United States', - 'is_group': 0, - 'parent_company': None, - 'create_chart_of_accounts_based_on': 'Standard Template', - 'chart_of_accounts': 'Standard', - 'default_cash_account': 'Cash - VS', - 'default_receivable_account': 'Debtors - VS', - 'default_payable_account': 'Creditors - VS', - 'default_income_account': 'Sales - VS', - 'default_expense_account': 'Cost of Goods Sold - VS', - 'cost_center': 'Main - VS', - 'enable_perpetual_inventory': 1 - }, - { - 'company_name': 'Daniels Landscape Supplies', - 'abbr': 'DL', - 'default_currency': 'USD', - 'country': 'United States', - 'is_group': 0, - 'parent_company': None, - 'create_chart_of_accounts_based_on': 'Standard Template', - 'chart_of_accounts': 'Standard', - 'default_cash_account': 'Cash - DL', - 'default_receivable_account': 'Debtors - DL', - 'default_payable_account': 'Creditors - DL', - 'default_income_account': 'Sales - DL', - 'default_expense_account': 'Cost of Goods Sold - DL', - 'cost_center': 'Main - DL', - 'enable_perpetual_inventory': 1 - }, - { - 'company_name': 'sprinklersnorthwest (Demo)', - 'abbr': 'SD', - 'default_currency': 'USD', - 'country': 'United States', - 'is_group': 0, - 'parent_company': None, - 'create_chart_of_accounts_based_on': 'Standard Template', - 'chart_of_accounts': 'Standard', - 'default_cash_account': 'Cash - SD', - 'default_receivable_account': 'Debtors - SD', - 'default_payable_account': 'Creditors - SD', - 'default_income_account': 'Sales - SD', - 'default_expense_account': 'Cost of Goods Sold - SD', - 'cost_center': 'Main - SD', - 'enable_perpetual_inventory': 1 - }, - { - 'company_name': 'Lowe Fencing', - 'abbr': 'LF', - 'default_currency': 'USD', - 'country': 'United States', - 'is_group': 0, - 'parent_company': None, - 'create_chart_of_accounts_based_on': 'Standard Template', - 'chart_of_accounts': 'Standard', - 'default_cash_account': 'Cash - LF', - 'default_receivable_account': 'Debtors - LF', - 'default_payable_account': 'Creditors - LF', - 'default_income_account': 'Fencing Sales - LF', - 'default_expense_account': 'Cost of Goods Sold - LF', - 'cost_center': 'Main - LF', - 'enable_perpetual_inventory': 1 - }, - { - 'company_name': 'Nuco Yard Care', - 'abbr': 'NYC', - 'default_currency': 'USD', - 'country': 'United States', - 'is_group': 0, - 'parent_company': None, - 'create_chart_of_accounts_based_on': 'Standard Template', - 'chart_of_accounts': 'Standard', - 'default_cash_account': 'Cash - NYC', - 'default_receivable_account': 'Debtors - NYC', - 'default_payable_account': 'Creditors - NYC', - 'default_income_account': 'Sales - NYC', - 'default_expense_account': 'Cost of Goods Sold - NYC', - 'cost_center': 'Main - NYC', - 'enable_perpetual_inventory': 1 - }, - { - 'company_name': 'Sprinklers Northwest', - 'abbr': 'S', - 'default_currency': 'USD', - 'country': 'United States', - 'is_group': 0, - 'parent_company': None, - 'create_chart_of_accounts_based_on': 'Standard Template', - 'chart_of_accounts': 'Standard', - 'default_cash_account': 'Undeposited Funds - S', - 'default_receivable_account': 'Debtors - S', - 'default_payable_account': 'Creditors - S', - 'default_income_account': 'Sales - S', - 'default_expense_account': 'Cost of Goods Sold - S', - 'cost_center': 'Main - S', - 'enable_perpetual_inventory': 1 - } - ] + companies = frappe.get_all("Company", pluck="name") for company in companies: - if frappe.db.exists("Company", company["company_name"]): + if frappe.db.exists("Account", {"company": company}): + print(f"āœ… Accounts already exist for company '{company}'. Skipping account creation.") continue - data = { - "doctype": "Company" - } - data.update(company) - doc = frappe.get_doc(data) - doc.insert(ignore_permissions=True) + company_doc = frappe.get_doc("Company", company) + create_charts( + company=company.name, + chart_template=company_doc.chart_template + ) + -def create_accounts(): +def create_stripe_accounts(): """Create necessary accounts if they do not exist.""" print("\nšŸ”§ Checking for necessary accounts...") @@ -1745,23 +1645,3 @@ def create_accounts(): doc.insert(ignore_permissions=True, ignore_if_duplicate=True) frappe.db.commit() - -def init_stripe_accounts(): - """Initializes the bare configurations for each Stripe Settings doctypes.""" - print("\nšŸ”§ Initializing Stripe Settings for companies...") - - companies = ["Sprinklers Northwest"] - - for company in companies: - if not frappe.db.exists("Stripe Settings", {"company": company}): - doc = frappe.get_doc({ - "doctype": "Stripe Settings", - "company": company, - "api_key": "", - "publishable_key": "", - "webhook_secret": "", - "account": f"Stripe Clearing - {company}" - }) - doc.insert(ignore_permissions=True) - - frappe.db.commit() diff --git a/frontend/src/components/calendar/jobs/SNWProjectCalendar.vue b/frontend/src/components/calendar/jobs/SNWProjectCalendar.vue index 4c50514..ec5dbbb 100644 --- a/frontend/src/components/calendar/jobs/SNWProjectCalendar.vue +++ b/frontend/src/components/calendar/jobs/SNWProjectCalendar.vue @@ -168,17 +168,32 @@ - - + + - Holiday Scheduling + Skip Day Confirmation - The event has been scheduled on or over a holiday/Sunday. Should this day be skipped? +

Are you sure you want to skip {{ skipConfirmationData ? formatDate(skipConfirmationData.date) : '' }} for job {{ skipConfirmationData ? skipConfirmationData.job.projectTemplate : '' }}?

- Include Holiday - Skip Holiday + Cancel + Skip Day + +
+
+ + + + + Remove Skip Confirmation + +

Are you sure you want to remove the skip for {{ removeSkipConfirmationData ? formatDate(removeSkipConfirmationData.date) : '' }} on job {{ removeSkipConfirmationData ? removeSkipConfirmationData.job.projectTemplate : '' }}?

+
+ + + Cancel + Remove Skip
@@ -220,6 +235,7 @@ 'holiday': isHoliday(day.date), 'sunday': isSunday(day.date), 'drag-over': isDragOver && dragOverCell?.foremanId === foreman.name && dragOverCell?.date === day.date, + 'has-skipped-jobs': getSkippedJobsForCell(foreman.name, day.date).length > 0, }" @dragover="handleDragOver($event, foreman.name, day.date)" @dragleave="handleDragLeave" @@ -233,7 +249,7 @@ class="calendar-job" :style="getJobStyle(job, day.date)" :draggable="job.status === 'Scheduled'" - @click.stop="showEventDetails({ event: job })" + @click.stop="skipMode ? handleSkipDayClick(foreman.name, day.date, job) : showEventDetails({ event: job })" @dragstart="job.status === 'Scheduled' ? handleDragStart(job, $event) : null" @dragend="handleDragEnd" @mousedown="(job.status === 'Scheduled' || job.status === 'Started') ? startResize($event, job, day.date) : null" @@ -256,6 +272,7 @@ class="skipped-day" :class="getPriorityClass(job.priority)" > + Skipped + +