Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions check_run/check_run/doctype/check_run/check_run.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ frappe.ui.form.on('Check Run', {
},
validate: frm => {
validate_mode_of_payment_mandatory(frm)
if (check_run.filters.party.length > 0) {
check_run.filters.party = ''
if (check_run.filters.party_filter.length > 0) {
check_run.filters.party_filter = ''
check_run.filters.show_party_filter = false
return new Promise(function (resolve, reject) {
reject(
Expand Down
38 changes: 29 additions & 9 deletions check_run/check_run/doctype/check_run/check_run.py
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ def validate(self) -> None:
self.set_default_dates()
else:
if self.status in ("Draft", "Pending Approval", "Approved"): # type: ignore # str or None
self.filter_transactions()
self.validate_transactions()

def on_cancel(self) -> None:
settings = get_check_run_settings(self)
Expand Down Expand Up @@ -125,8 +125,25 @@ def set_default_dates(self) -> None:
if not self.end_date: # type: ignore # datetime or None
self.end_date = getdate()

@frappe.read_only()
def validate_transactions(self) -> None:
"""Validate transactions without modifying them to avoid deadlocks"""
if not self.get("transactions"):
return
_t = json.loads(self.get("transactions"))
transactions = [value for k, value in _t.items()] if isinstance(_t, dict) else _t

# Only validate selected transactions, don't modify self.transactions
selected = [t for t in transactions if t.get("pay")]
for t in selected:
if not t.get("mode_of_payment"):
frappe.throw(
frappe._(f"Mode of Payment Required: {t.get('party_name')} {t.get('ref_number')}")
)

@frappe.read_only()
def filter_transactions(self) -> None:
"""Filter out non-outstanding or cancelled transactions"""
if not self.get("transactions"):
return
_t = json.loads(self.get("transactions"))
Expand Down Expand Up @@ -645,15 +662,18 @@ def get_entries(doc: CheckRun | str) -> dict:
db_doc = frappe.get_doc("Check Run", doc.name)
if not doc.modified or get_datetime(doc.modified) < db_doc.modified:
doc = db_doc
# Only use cached transactions if they exist and are non-empty
if doc.end_date == db_doc.end_date and db_doc.transactions: # type: ignore
if db_doc.docstatus == 0:
outstanding_transaction = []
for row in json.loads(db_doc.transactions):
if not db_doc.not_outstanding_or_cancelled(row):
outstanding_transaction.append(row)
else:
outstanding_transaction = json.loads(db_doc.transactions)
return {"transactions": outstanding_transaction, "modes_of_payment": modes_of_payment}
cached_transactions = json.loads(db_doc.transactions)
if cached_transactions:
if db_doc.docstatus == 0:
outstanding_transaction = []
for row in cached_transactions:
if not db_doc.not_outstanding_or_cancelled(row):
outstanding_transaction.append(row)
else:
outstanding_transaction = cached_transactions
return {"transactions": outstanding_transaction, "modes_of_payment": modes_of_payment}

company = doc.company # type: ignore
pay_to_account = doc.pay_to_account # type: ignore
Expand Down
6 changes: 3 additions & 3 deletions check_run/public/js/check_run/CheckRun.vue
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@
<tr>
<th style="text-align: left" class="col col-sm-2" id="check-run-party-filter">
<div class="d-flex align-items-center justify-between gap-2">
<span class="party-onclick party-display"> Party </span>
<span @click="update_sort('party')" class="party-onclick party-display check-run-sort-indicator"> Party &#11021;</span>
<span class="filter-icon" style="cursor: pointer" @click="show_party_filter = !show_party_filter">
<svg class="icon icon-sm">
<use class="" href="#icon-filter"></use>
</svg>
</span>
</div>
<div class="mt-2">
<input v-if="show_party_filter" type="text" class="form-control" v-model="filters.party" />
<input v-if="show_party_filter" type="text" class="form-control" v-model="filters.party_filter" />
</div>
</th>
<th class="col col-sm-2">Document</th>
Expand Down Expand Up @@ -262,7 +262,7 @@ function partyIsInFilter(party) {
if (!party) {
return
}
return filters.party.length < 1 || party.toLowerCase().includes(filters.party.toLowerCase())
return filters.party_filter.length < 1 || party.toLowerCase().includes(filters.party_filter.toLowerCase())
}

function transactionUrl(transaction) {
Expand Down
6 changes: 4 additions & 2 deletions check_run/public/js/check_run/check_run.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,8 @@ check_run.filters = reactive({
mode_of_payment: 1,
amount: 1,
due_date: 1,
party: '',
party: 1,
party_filter: '',
})

check_run.get_entries = frm => {
Expand Down Expand Up @@ -45,7 +46,8 @@ check_run.mount = frm => {
mode_of_payment: 1,
amount: 1,
due_date: 1,
party: '',
party: 1,
party_filter: '',
})

if (frm.$check_run != undefined && frm.$check_run._isVue) {
Expand Down
Loading