big updates
This commit is contained in:
parent
34f2c110d6
commit
03a230b8f7
14 changed files with 2417 additions and 242 deletions
28
custom_ui/api/db/addresses.py
Normal file
28
custom_ui/api/db/addresses.py
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
import frappe
|
||||
from custom_ui.db_utils import build_error_response, build_success_response
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_addresses(fields=["*"], filters={}):
|
||||
"""Get addresses with optional filtering."""
|
||||
if isinstance(fields, str):
|
||||
import json
|
||||
fields = json.loads(fields)
|
||||
if isinstance(filters, str):
|
||||
import json
|
||||
filters = json.loads(filters)
|
||||
if fields[0] != "*" and len(fields) == 1:
|
||||
pluck = fields[0]
|
||||
fields = None
|
||||
print(f"Getting addresses with fields: {fields} and filters: {filters} and pluck: {pluck}")
|
||||
try:
|
||||
addresses = frappe.get_all(
|
||||
"Address",
|
||||
fields=fields,
|
||||
filters=filters,
|
||||
order_by="address_line1 desc",
|
||||
pluck=pluck
|
||||
)
|
||||
return build_success_response(addresses)
|
||||
except Exception as e:
|
||||
frappe.log_error(message=str(e), title="Get Addresses Failed")
|
||||
return build_error_response(str(e), 500)
|
||||
|
|
@ -269,7 +269,9 @@ def upsert_client(data):
|
|||
|
||||
# Check for existing address
|
||||
filters = {
|
||||
"address_title": data.get("address_title"),
|
||||
"address_line1": data.get("address_line1"),
|
||||
"city": data.get("city"),
|
||||
"state": data.get("state"),
|
||||
}
|
||||
existing_address = frappe.db.exists("Address", filters)
|
||||
print("Existing address check:", existing_address)
|
||||
|
|
@ -280,10 +282,10 @@ def upsert_client(data):
|
|||
address_doc = frappe.get_doc({
|
||||
"doctype": "Address",
|
||||
"address_line1": data.get("address_line1"),
|
||||
"address_line2": data.get("address_line2"),
|
||||
"city": data.get("city"),
|
||||
"state": data.get("state"),
|
||||
"country": "United States",
|
||||
"address_title": data.get("address_title"),
|
||||
"pincode": data.get("pincode"),
|
||||
"custom_customer_to_bill": customer_doc.name
|
||||
}).insert(ignore_permissions=True)
|
||||
|
|
|
|||
130
custom_ui/api/db/onsite_meetings.py
Normal file
130
custom_ui/api/db/onsite_meetings.py
Normal file
|
|
@ -0,0 +1,130 @@
|
|||
import frappe
|
||||
import json
|
||||
from custom_ui.db_utils import build_error_response, build_success_response, process_filters, process_sorting
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_week_onsite_meetings(week_start, week_end):
|
||||
"""Get On-Site Meetings scheduled within a specific week."""
|
||||
try:
|
||||
meetings = frappe.db.get_all(
|
||||
"On-Site Meeting",
|
||||
fields=["*"],
|
||||
filters=[
|
||||
["start_time", ">=", week_start],
|
||||
["start_time", "<=", week_end]
|
||||
],
|
||||
order_by="start_time asc"
|
||||
)
|
||||
return build_success_response(meetings)
|
||||
except Exception as e:
|
||||
frappe.log_error(message=str(e), title="Get Week On-Site Meetings Failed")
|
||||
return build_error_response(str(e), 500)
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_onsite_meetings(fields=["*"], filters={}):
|
||||
"""Get paginated On-Site Meetings with filtering and sorting support."""
|
||||
try:
|
||||
print("DEBUG: Raw onsite meeting options received:", filters)
|
||||
|
||||
processed_filters = process_filters(filters)
|
||||
|
||||
meetings = frappe.db.get_all(
|
||||
"On-Site Meeting",
|
||||
fields=fields,
|
||||
filters=processed_filters,
|
||||
order_by="creation desc"
|
||||
)
|
||||
|
||||
return build_success_response(
|
||||
meetings
|
||||
)
|
||||
except Exception as e:
|
||||
frappe.log_error(message=str(e), title="Get On-Site Meetings Failed")
|
||||
return build_error_response(str(e), 500)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def get_unscheduled_onsite_meetings():
|
||||
"""Get On-Site Meetings that are unscheduled."""
|
||||
try:
|
||||
meetings = frappe.db.get_all(
|
||||
"On-Site Meeting",
|
||||
fields=["*"],
|
||||
filters={"status": "Unscheduled"},
|
||||
order_by="creation desc"
|
||||
)
|
||||
return build_success_response(meetings)
|
||||
except Exception as e:
|
||||
frappe.log_error(message=str(e), title="Get Unscheduled On-Site Meetings Failed")
|
||||
return build_error_response(str(e), 500)
|
||||
|
||||
|
||||
@frappe.whitelist()
|
||||
def create_onsite_meeting(address, notes=""):
|
||||
"""Create a new On-Site Meeting with Unscheduled status."""
|
||||
try:
|
||||
print(f"DEBUG: Creating meeting with address='{address}', notes='{notes}'")
|
||||
|
||||
# Validate address parameter
|
||||
if not address or address == "None" or not address.strip():
|
||||
return build_error_response("Address is required and cannot be empty.", 400)
|
||||
|
||||
# Get the address document name from the full address string
|
||||
address_name = frappe.db.get_value("Address", filters={"full_address": address}, fieldname="name")
|
||||
|
||||
print(f"DEBUG: Address lookup result: address_name='{address_name}'")
|
||||
|
||||
if not address_name:
|
||||
return build_error_response(f"Address '{address}' not found in the system.", 404)
|
||||
|
||||
# Create the meeting with Unscheduled status
|
||||
meeting = frappe.get_doc({
|
||||
"doctype": "On-Site Meeting",
|
||||
"address": address_name,
|
||||
"notes": notes or "",
|
||||
"status": "Unscheduled"
|
||||
})
|
||||
meeting.flags.ignore_permissions = True
|
||||
meeting.insert(ignore_permissions=True)
|
||||
frappe.db.commit()
|
||||
|
||||
# Clear any auto-generated messages from Frappe
|
||||
frappe.local.message_log = []
|
||||
|
||||
print(f"DEBUG: Meeting created successfully: {meeting.name}")
|
||||
|
||||
return build_success_response(meeting.as_dict())
|
||||
except Exception as e:
|
||||
frappe.log_error(message=str(e), title="Create On-Site Meeting Failed")
|
||||
return build_error_response(str(e), 500)
|
||||
|
||||
@frappe.whitelist()
|
||||
def update_onsite_meeting(name, data):
|
||||
"""Update an existing On-Site Meeting."""
|
||||
defualts = {
|
||||
"address": None,
|
||||
"start_time": None,
|
||||
"end_time": None,
|
||||
"notes": None,
|
||||
"assigned_employee": None,
|
||||
"completed_by": None
|
||||
}
|
||||
try:
|
||||
if isinstance(data, str):
|
||||
data = json.loads(data)
|
||||
data = {**defualts, **data}
|
||||
meeting = frappe.get_doc("On-Site Meeting", name)
|
||||
for key, value in data.items():
|
||||
if value is not None:
|
||||
if key == "address":
|
||||
value = frappe.db.get_value("Address", {"full_address": value}, "name")
|
||||
elif key in ["assigned_employee", "completed_by"]:
|
||||
value = frappe.db.get_value("Employee", {"employee_name": value}, "name")
|
||||
meeting.set(key, value)
|
||||
meeting.save()
|
||||
return build_success_response(meeting.as_dict())
|
||||
except frappe.DoesNotExistError:
|
||||
return build_error_response(f"On-Site Meeting '{name}' does not exist.", 404)
|
||||
except Exception as e:
|
||||
return build_error_response(str(e), 500)
|
||||
|
||||
|
|
@ -2,8 +2,11 @@ import frappe
|
|||
|
||||
def after_insert(doc, method):
|
||||
print(doc.address)
|
||||
if doc.address:
|
||||
address_name = frappe.db.get_value("Address", fieldname="name", filters={"address_line1": doc.address})
|
||||
address_doc = frappe.get_doc("Address", address_name)
|
||||
if doc.address and not doc.end_time and not doc.start_time:
|
||||
address_doc = frappe.get_doc("Address", doc.address)
|
||||
address_doc.custom_onsite_meeting_scheduled = "In Progress"
|
||||
address_doc.save()
|
||||
if doc.status == "Completed":
|
||||
address_doc = frappe.get_doc("Address", doc.address)
|
||||
address_doc.custom_onsite_meeting_scheduled = "Completed"
|
||||
address_doc.save()
|
||||
|
|
@ -10,11 +10,14 @@ def after_install():
|
|||
|
||||
def after_migrate():
|
||||
add_custom_fields()
|
||||
update_onsite_meeting_fields()
|
||||
frappe.db.commit()
|
||||
|
||||
# Proper way to refresh metadata
|
||||
frappe.clear_cache(doctype="Address")
|
||||
frappe.reload_doctype("Address")
|
||||
frappe.clear_cache(doctype="On-Site Meeting")
|
||||
frappe.reload_doctype("On-Site Meeting")
|
||||
|
||||
update_address_fields()
|
||||
build_frontend()
|
||||
|
|
@ -111,6 +114,36 @@ def add_custom_fields():
|
|||
default="Not Started",
|
||||
insert_after="job_status"
|
||||
)
|
||||
],
|
||||
"On-Site Meeting": [
|
||||
dict(
|
||||
fieldname="notes",
|
||||
label="Notes",
|
||||
fieldtype="Small Text",
|
||||
insert_after="address"
|
||||
),
|
||||
dict(
|
||||
fieldname="assigned_employee",
|
||||
label="Assigned Employee",
|
||||
fieldtype="Link",
|
||||
options="Employee",
|
||||
insert_after="notes"
|
||||
),
|
||||
dict(
|
||||
fieldname="status",
|
||||
label="Status",
|
||||
fieldtype="Select",
|
||||
options="Unscheduled\nScheduled\nCompleted\nCancelled",
|
||||
default="Unscheduled",
|
||||
insert_after="start_time"
|
||||
),
|
||||
dict(
|
||||
fieldname="completed_by",
|
||||
label="Completed By",
|
||||
fieldtype="Link",
|
||||
options="Employee",
|
||||
insert_after="status"
|
||||
)
|
||||
]
|
||||
}
|
||||
|
||||
|
|
@ -132,6 +165,35 @@ def add_custom_fields():
|
|||
print(f"❌ Error creating custom fields: {str(e)}")
|
||||
frappe.log_error(message=str(e), title="Custom Fields Creation Failed")
|
||||
raise
|
||||
|
||||
def update_onsite_meeting_fields():
|
||||
"""Update On-Site Meeting doctype fields to make start_time and end_time optional."""
|
||||
print("\n🔧 Updating On-Site Meeting doctype fields...")
|
||||
|
||||
try:
|
||||
# Get the doctype
|
||||
doctype = frappe.get_doc("DocType", "On-Site Meeting")
|
||||
|
||||
# Find and update start_time and end_time fields
|
||||
updated_fields = []
|
||||
for field in doctype.fields:
|
||||
if field.fieldname in ['start_time', 'end_time']:
|
||||
if field.reqd == 1:
|
||||
field.reqd = 0
|
||||
updated_fields.append(field.fieldname)
|
||||
|
||||
if updated_fields:
|
||||
# Save the doctype
|
||||
doctype.save(ignore_permissions=True)
|
||||
print(f"✅ Updated fields: {', '.join(updated_fields)} (set to not required)")
|
||||
else:
|
||||
print("✅ Fields already configured correctly")
|
||||
|
||||
print("🔧 On-Site Meeting field update complete.\n")
|
||||
except Exception as e:
|
||||
print(f"❌ Error updating On-Site Meeting fields: {str(e)}")
|
||||
frappe.log_error(message=str(e), title="On-Site Meeting Field Update Failed")
|
||||
# Don't raise - this is not critical enough to stop migration
|
||||
|
||||
def update_address_fields():
|
||||
addresses = frappe.get_all("Address", pluck="name")
|
||||
|
|
@ -214,14 +276,14 @@ def update_address_fields():
|
|||
job_status = "Not Started"
|
||||
payment_received = "Not Started"
|
||||
|
||||
onsite_meetings = frappe.get_all("On-Site Meeting", filters={"address": address.address_title})
|
||||
onsite_meetings = frappe.get_all("On-Site Meeting", fields=["docstatus"],filters={"address": address.address_title})
|
||||
if onsite_meetings and onsite_meetings[0]:
|
||||
onsite_meeting = "Completed"
|
||||
onsite_meeting = "Completed" if onsite_meetings[0]["docstatus"] == 1 else "In Progress"
|
||||
|
||||
estimates = frappe.get_all("Quotation", fields=["custom_sent"], filters={"custom_installation_address": address.address_title})
|
||||
if estimates and estimates[0] and estimates[0]["custom_sent"] == 1:
|
||||
estimates = frappe.get_all("Quotation", fields=["custom_sent", "docstatus"], filters={"custom_installation_address": address.address_title})
|
||||
if estimates and estimates[0] and estimates[0]["custom_sent"] == 1 and estimates[0]["docstatus"] == 1:
|
||||
estimate_sent = "Completed"
|
||||
elif estimates and estimates[0]:
|
||||
elif estimates and estimates[0] and estimates[0]["docstatus"] != 1:
|
||||
estimate_sent = "In Progress"
|
||||
|
||||
jobs = frappe.get_all("Project", fields=["status"], filters={"custom_installation_address": address.address_title, "project_template": "SNW Install"})
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue