Skip to content

Commit cf84346

Browse files
authored
Version 15.4.6
2 parents 7081135 + d8e26b0 commit cf84346

4 files changed

Lines changed: 496 additions & 1 deletion

File tree

erpnext_tse/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
__version__ = "15.4.5"
1+
__version__ = "15.4.6"

erpnext_tse/erpnext_tse/doctype/dsfinv_k_cash_register/dsfinv_k_cash_register_list.js

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,95 @@
33

44
(() => {
55
const DOCTYPE = "DSFinV-K Cash Register";
6+
const SETTINGS_DOCTYPE = "TSE Settings";
7+
const SETTINGS_FLAG_FIELD = "recovery_sync_enabled";
8+
const SETTINGS_ENABLED_FIELD = "enabled";
9+
10+
const RECOVERY_BTN_LABEL = __("Recovery Sync");
11+
const RECOVERY_SUCCESS_MSG = __("Recovery sync queued.");
12+
const RECOVERY_FAILED_MSG = __("Could not start recovery sync.");
13+
const RECOVERY_FREEZE_MSG = __("Starting recovery sync...");
14+
const RECOVERY_EVENT = "dsfinv_k_cash_register_recovery_done";
15+
const RECOVERY_METHOD =
16+
"erpnext_tse.erpnext_tse.doctype.dsfinv_k_cash_register.recovery.enqueue_recovery_sync";
17+
18+
function toInt(val) {
19+
if (val === true) return 1;
20+
if (val === false) return 0;
21+
const n = parseInt(val, 10);
22+
return Number.isFinite(n) ? n : 0;
23+
}
24+
25+
async function getRecoveryEnabled() {
26+
try {
27+
const [recovery, enabled] = await Promise.all([
28+
frappe.db.get_single_value(SETTINGS_DOCTYPE, SETTINGS_FLAG_FIELD),
29+
frappe.db.get_single_value(SETTINGS_DOCTYPE, SETTINGS_ENABLED_FIELD),
30+
]);
31+
return toInt(recovery) === 1 && toInt(enabled) === 1;
32+
} catch (e) {
33+
return false;
34+
}
35+
}
36+
37+
function ensurePage(listview) {
38+
return listview && listview.page;
39+
}
40+
41+
let subscribed = false;
42+
43+
function ensureRealtimeSubscription() {
44+
if (subscribed || !frappe.realtime) return;
45+
frappe.realtime.on(RECOVERY_EVENT, (data) => {
46+
const message = (data && data.message) || __("Recovery sync finished.");
47+
frappe.show_alert({ message, indicator: "green" }, 7);
48+
});
49+
subscribed = true;
50+
}
51+
52+
async function updateRecoveryButton(listview) {
53+
if (!ensurePage(listview)) return;
54+
ensureRealtimeSubscription();
55+
56+
if (listview.page.remove_inner_button) {
57+
listview.page.remove_inner_button(RECOVERY_BTN_LABEL);
58+
}
59+
60+
const enabled = await getRecoveryEnabled();
61+
if (!enabled) return;
62+
63+
listview.page.add_inner_button(RECOVERY_BTN_LABEL, () => {
64+
triggerRecoverySync();
65+
});
66+
}
67+
68+
async function triggerRecoverySync() {
69+
try {
70+
const r = await frappe.call({
71+
method: RECOVERY_METHOD,
72+
freeze: true,
73+
freeze_message: RECOVERY_FREEZE_MSG,
74+
});
75+
76+
const payload = r.message || {};
77+
const jobId = payload.job_id || payload.name || payload.id;
78+
const message = jobId
79+
? __("Recovery sync queued (Job ID: {0})", [jobId])
80+
: RECOVERY_SUCCESS_MSG;
81+
82+
frappe.msgprint({
83+
message,
84+
indicator: "green",
85+
});
86+
} catch (err) {
87+
const msg = err?.message || err || RECOVERY_FAILED_MSG;
88+
frappe.msgprint({
89+
title: __("Recovery Sync"),
90+
message: msg,
91+
indicator: "red",
92+
});
93+
}
94+
}
695

796
const INDICATORS = {
897
ACTIVE: { color: "green" },
@@ -20,5 +109,13 @@
20109
frappe.listview_settings[DOCTYPE] = {
21110
add_fields: ["status"],
22111
get_indicator: indicatorFor,
112+
113+
onload(listview) {
114+
setTimeout(() => updateRecoveryButton(listview), 0);
115+
},
116+
117+
refresh(listview) {
118+
setTimeout(() => updateRecoveryButton(listview), 0);
119+
},
23120
};
24121
})();

0 commit comments

Comments
 (0)