Files
lab-app/pb_hooks/jobs_notifications.pb.js
Emre Emir 8bbc9dbff2 Initial commit: DLS - Dental Lab System
- Flutter + PocketBase dental lab management system
- Clinic & lab dashboards, job tracking, patient management
- Product catalog, finance tracking, multi-language support
- AI assistant integration, realtime notifications
- Windows installer (Inno Setup) included
- Developed by kovakyazilim.com
2026-06-11 15:57:31 +03:00

130 lines
6.1 KiB
JavaScript

/// @ts-check
onRecordAfterCreateSuccess((e) => {
const APP_ID = "524cb6d8-2640-4f85-bb24-c9c762233de7";
const API_KEY = "os_v2_app_kjglnwbgibhylozezhdweiz546iv5ns5h2hujfvrsao64p7qkqk6lwqthgwirm6naxdy37tmd5nivppfqmxrnqreoewpgqkcnawjjpy";
try {
const rec = e.record;
if (rec.getString("status") !== "pending") return;
const labTenantId = rec.getString("lab_tenant_id");
const code = rec.getString("patient_code") || "Is";
const type = rec.getString("prosthetic_type") || "";
const label = type ? code + " - " + type : code;
const jobId = rec.getString("id");
let userIds = [];
try {
const members = $app.findRecordsByFilter("tenant_members", 'tenant_id = "' + labTenantId + '"', "", 100, 0);
userIds = members.map(function(r) { return r.getString("user_id"); }).filter(Boolean);
} catch (_) {}
if (!userIds.length) return;
const res = $http.send({
url: "https://onesignal.com/api/v1/notifications",
method: "POST",
headers: { "Content-Type": "application/json", "Authorization": "Basic " + API_KEY },
body: JSON.stringify({ app_id: APP_ID, include_external_user_ids: userIds, channel_for_external_user_ids: "push",
headings: { en: "Yeni Is Talebi", tr: "Yeni Is Talebi" },
contents: { en: label + " icin yeni bir is talebi geldi.", tr: label + " icin yeni bir is talebi geldi." },
data: { job_id: jobId, tenant_type: "lab" } }),
timeout: 10,
});
console.log("[notif-create] status=" + res.statusCode + " users=" + userIds.length);
} catch (err) {
console.log("[notif-create] error: " + String(err));
}
}, "jobs");
onRecordAfterUpdateSuccess((e) => {
const APP_ID = "524cb6d8-2640-4f85-bb24-c9c762233de7";
const API_KEY = "os_v2_app_kjglnwbgibhylozezhdweiz546iv5ns5h2hujfvrsao64p7qkqk6lwqthgwirm6naxdy37tmd5nivppfqmxrnqreoewpgqkcnawjjpy";
try {
const rec = e.record;
const newStatus = rec.getString("status");
const newLocation = rec.getString("location");
const clinicTenantId = rec.getString("clinic_tenant_id");
const labTenantId = rec.getString("lab_tenant_id");
const code = rec.getString("patient_code") || "Is";
const type = rec.getString("prosthetic_type") || "";
const label = type ? code + " - " + type : code;
const jobId = rec.getString("id");
let oldStatus = "";
let oldLocation = "";
try {
const orig = rec.original();
if (orig) {
oldStatus = orig.getString("status");
oldLocation = orig.getString("location");
}
} catch (_) {}
if (oldStatus && oldStatus === newStatus && oldLocation === newLocation) return;
let targetTenantId = "";
let title = "";
let body = "";
let tenantType = "clinic";
if (oldStatus === "pending" && newStatus === "in_progress" && newLocation === "at_lab") {
targetTenantId = clinicTenantId; title = "Is Kabul Edildi";
body = label + " laboratuvar tarafindan kabul edildi."; tenantType = "clinic";
} else if (newStatus === "in_progress" && newLocation === "at_clinic" && oldLocation !== "at_clinic") {
targetTenantId = clinicTenantId; title = "Prova Onayi Bekleniyor";
body = label + " prova icin klinik onayini bekliyor."; tenantType = "clinic";
} else if (oldLocation === "at_clinic" && newLocation === "at_lab" && newStatus === "in_progress") {
targetTenantId = labTenantId; title = "Klinik Geri Bildirimi";
body = label + " icin klinikten geri bildirim geldi."; tenantType = "lab";
} else if (newStatus === "sent" && oldStatus !== "sent") {
targetTenantId = clinicTenantId; title = "Teslimat Hazir";
body = label + " teslim icin hazir."; tenantType = "clinic";
} else if (newStatus === "delivered" && oldStatus !== "delivered") {
targetTenantId = labTenantId; title = "Is Teslim Alindi";
body = label + " klinik tarafindan teslim alindi."; tenantType = "lab";
} else if (newStatus === "cancelled" && oldStatus !== "cancelled") {
let allIds = [];
try {
const cm = $app.findRecordsByFilter("tenant_members", 'tenant_id = "' + clinicTenantId + '"', "", 100, 0);
const lm = $app.findRecordsByFilter("tenant_members", 'tenant_id = "' + labTenantId + '"', "", 100, 0);
const raw = cm.concat(lm).map(function(r) { return r.getString("user_id"); }).filter(Boolean);
allIds = raw.filter(function(id, idx) { return raw.indexOf(id) === idx; });
} catch (_) {}
if (!allIds.length) return;
const res = $http.send({
url: "https://onesignal.com/api/v1/notifications",
method: "POST",
headers: { "Content-Type": "application/json", "Authorization": "Basic " + API_KEY },
body: JSON.stringify({ app_id: APP_ID, include_external_user_ids: allIds, channel_for_external_user_ids: "push",
headings: { en: "Is Iptal Edildi", tr: "Is Iptal Edildi" },
contents: { en: label + " iptal edildi.", tr: label + " iptal edildi." },
data: { job_id: jobId, tenant_type: "clinic" } }),
timeout: 10,
});
console.log("[notif-update] cancelled status=" + res.statusCode + " users=" + allIds.length);
return;
} else {
return;
}
let userIds = [];
try {
const members = $app.findRecordsByFilter("tenant_members", 'tenant_id = "' + targetTenantId + '"', "", 100, 0);
userIds = members.map(function(r) { return r.getString("user_id"); }).filter(Boolean);
} catch (_) {}
if (!userIds.length) return;
const res = $http.send({
url: "https://onesignal.com/api/v1/notifications",
method: "POST",
headers: { "Content-Type": "application/json", "Authorization": "Basic " + API_KEY },
body: JSON.stringify({ app_id: APP_ID, include_external_user_ids: userIds, channel_for_external_user_ids: "push",
headings: { en: title, tr: title },
contents: { en: body, tr: body },
data: { job_id: jobId, tenant_type: tenantType } }),
timeout: 10,
});
console.log("[notif-update] " + title + " status=" + res.statusCode + " users=" + userIds.length);
} catch (err) {
console.log("[notif-update] error: " + String(err));
}
}, "jobs");