diff --git a/propms/property_management_solution/doctype/lease/lease.js b/propms/property_management_solution/doctype/lease/lease.js
index aa89c6a..1e8edbd 100755
--- a/propms/property_management_solution/doctype/lease/lease.js
+++ b/propms/property_management_solution/doctype/lease/lease.js
@@ -11,6 +11,13 @@ frappe.ui.form.on('Lease', {
]
};
});
+ frm.set_query("property_unit", "lease_item", function() {
+ return {
+ "filters": {
+ "company": frm.doc.company,
+ }
+ };
+ });
frm.set_query("property", function() {
return {
"filters": {
diff --git a/propms/property_management_solution/doctype/lease/lease.py b/propms/property_management_solution/doctype/lease/lease.py
index 595ae90..40bc2ba 100755
--- a/propms/property_management_solution/doctype/lease/lease.py
+++ b/propms/property_management_solution/doctype/lease/lease.py
@@ -11,83 +11,101 @@
class Lease(Document):
+ def get_all_properties(self):
+ properties = set()
+ if self.property:
+ properties.add(self.property)
+ for item in self.lease_item:
+ if item.property_unit:
+ properties.add(item.property_unit)
+ return list(properties)
+
def on_submit(self):
try:
- checklist_doc = frappe.get_doc("Checklist Checkup Area", "Handover")
- if checklist_doc:
- check_list = []
- for task in checklist_doc.task:
- check = {}
- check["checklist_task"] = task.task_name
- check_list.append(check)
+ properties = self.get_all_properties()
+ for prop in properties:
+ checklist_doc = frappe.get_doc("Checklist Checkup Area", "Handover")
+ if checklist_doc:
+ check_list = []
+ for task in checklist_doc.task:
+ check = {}
+ check["checklist_task"] = task.task_name
+ check_list.append(check)
- frappe.get_doc(
- dict(
- doctype="Daily Checklist",
- area="Handover",
- checkup_date=self.start_date,
- daily_checklist_detail=check_list,
- property=self.property,
- )
- ).insert()
+ frappe.get_doc(
+ dict(
+ doctype="Daily Checklist",
+ area="Handover",
+ checkup_date=self.start_date,
+ daily_checklist_detail=check_list,
+ property=prop,
+ )
+ ).insert()
except Exception as e:
app_error_log(frappe.session.user, str(e))
def validate(self):
try:
+ properties = self.get_all_properties()
# Lease Status Validation: Prevent multiple active leases per property
if self.lease_status == "Active":
- # Query for other non-draft leases for the same property
- conflicting_leases = frappe.db.get_all(
- "Lease",
- filters={
- "property": self.property,
- "lease_status": ["!=", "Draft"],
- "name": ["!=", self.name],
- "docstatus": ["<", 2], # Exclude cancelled
- },
- fields=["name", "end_date", "lease_status"],
- )
- for lease in conflicting_leases:
- # If end_date is blank or in the future, block activation
- if not lease["end_date"] or getdate(lease["end_date"]) > getdate(
- self.start_date
- ):
- msg = _(
- "Cannot activate lease {0} for property {1}.
Conflicting lease: {2} (Status: {3}, End Date: {4})"
- ).format(
- self.name,
- self.property,
- lease["name"],
- lease["lease_status"],
- lease["end_date"] or "None",
- )
- frappe.throw(msg, frappe.ValidationError)
+ for prop in properties:
+ # Query for other non-draft leases for the same property
+ conflicting_leases = frappe.db.get_all(
+ "Lease",
+ filters={
+ "property": prop,
+ "lease_status": ["!=", "Draft"],
+ "name": ["!=", self.name],
+ "docstatus": ["<", 2], # Exclude cancelled
+ },
+ fields=["name", "end_date", "lease_status"],
+ )
+ for lease in conflicting_leases:
+ # If end_date is blank or in the future, block activation
+ if not lease["end_date"] or getdate(lease["end_date"]) > getdate(
+ self.start_date
+ ):
+ msg = _(
+ "Cannot activate lease {0} for property {1}.
Conflicting lease: {2} (Status: {3}, End Date: {4})"
+ ).format(
+ self.name,
+ prop,
+ lease["name"],
+ lease["lease_status"],
+ lease["end_date"] or "None",
+ )
+ frappe.throw(msg, frappe.ValidationError)
- if (
- get_datetime(self.start_date)
- <= get_datetime(now())
- <= get_datetime(add_months(self.end_date, -3))
- ):
- frappe.db.set_value("Property", self.property, "status", "On Lease")
- frappe.msgprint(_(f'Property "{self.property}" has now been set On Lease from Active for Lease "{self.name}"'))
- if (
- self.skip_end_date == None
- ):
+ for prop in properties:
if (
- get_datetime(add_months(self.end_date, -3))
- <= get_datetime(now())
- <= get_datetime(add_months(self.end_date, 3))
+ self.skip_end_date == None
):
- frappe.db.set_value(
- "Property", self.property, "status", "Off Lease in 3 Months"
- )
- frappe.msgprint(_(f'Property "{self.property}" has now been set Off Lease in 3 Months for Lease "{self.name}"'))
- else:
- frappe.db.set_value(
- "Property", self.property, "status", "On Lease"
- )
- frappe.msgprint(_(f'Property "{self.property}" has now been set On Lease from Active for Lease "{self.name}"'))
+ if (
+ get_datetime(add_months(self.end_date, -3))
+ <= get_datetime(now())
+ <= get_datetime(add_months(self.end_date, 3))
+ ):
+ frappe.db.set_value(
+ "Property", prop, "status", "Off Lease in 3 Months"
+ )
+ frappe.msgprint(_(f'Property "{prop}" has now been set Off Lease in 3 Months for Lease "{self.name}"'))
+ elif (
+ self.lease_status != "Draft"
+ and (
+ get_datetime(self.start_date)
+ <= get_datetime(now())
+ <= get_datetime(add_months(self.end_date, -3))
+ )
+ ):
+ frappe.db.set_value("Property", prop, "status", "On Lease")
+ frappe.msgprint(_(f'Property "{prop}" has now been set On Lease from Active for Lease "{self.name}"'))
+ else:
+ if self.lease_status != "Draft":
+ frappe.db.set_value(
+ "Property", prop, "status", "On Lease"
+ )
+ frappe.msgprint(_(f'Property "{prop}" has now been set On Lease from Active for Lease "{self.name}"'))
except Exception as e:
app_error_log(frappe.session.user, str(e))
diff --git a/propms/property_management_solution/doctype/lease_item/lease_item.json b/propms/property_management_solution/doctype/lease_item/lease_item.json
index 1563ac6..e13fef8 100755
--- a/propms/property_management_solution/doctype/lease_item/lease_item.json
+++ b/propms/property_management_solution/doctype/lease_item/lease_item.json
@@ -30,6 +30,13 @@
"label": "Lease Item",
"options": "Item"
},
+ {
+ "fieldname": "property_unit",
+ "fieldtype": "Link",
+ "in_list_view": 1,
+ "label": "Property Unit",
+ "options": "Property"
+ },
{
"columns": 1,
"fieldname": "frequency",