diff --git a/westech_r2/page/eim_portal/__init__.py b/westech_r2/page/eim_portal/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/westech_r2/page/eim_portal/eim-portal.css b/westech_r2/page/eim_portal/eim-portal.css
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/westech_r2/page/eim_portal/eim-portal.css
@@ -0,0 +1 @@
+
diff --git a/westech_r2/page/eim_portal/eim-portal.js b/westech_r2/page/eim_portal/eim-portal.js
new file mode 100644
index 0000000..9d84ac1
--- /dev/null
+++ b/westech_r2/page/eim_portal/eim-portal.js
@@ -0,0 +1,4 @@
+frappe.pages["eim-portal"].on_page_load = function(wrapper) {
+ wrapper.innerHTML = '
Redirecting to EIM Device Portal...
';
+ setTimeout(function() { window.location.href = "https://eim.diagalon.com"; }, 500);
+};
diff --git a/westech_r2/page/eim_portal/eim-portal.json b/westech_r2/page/eim_portal/eim-portal.json
new file mode 100644
index 0000000..c06f7bd
--- /dev/null
+++ b/westech_r2/page/eim_portal/eim-portal.json
@@ -0,0 +1,13 @@
+{
+ "creation": "2026-05-09 14:00:00",
+ "docstatus": 0,
+ "doctype": "Page",
+ "idx": 0,
+ "modified": "2026-05-09 14:00:00",
+ "modified_by": "Administrator",
+ "module": "Westech R2",
+ "name": "eim-portal",
+ "owner": "Administrator",
+ "standard": "Yes",
+ "title": "EIM Device Portal"
+}
diff --git a/westech_r2/page/eim_portal/eim-portal.py b/westech_r2/page/eim_portal/eim-portal.py
new file mode 100644
index 0000000..9d9e209
--- /dev/null
+++ b/westech_r2/page/eim_portal/eim-portal.py
@@ -0,0 +1,5 @@
+import frappe
+
+def get_context(context):
+ frappe.local.flags.redirect_location = "https://eim.diagalon.com"
+ raise frappe.Redirect
diff --git a/westech_r2/page/eim_portal/eim_portal.js b/westech_r2/page/eim_portal/eim_portal.js
new file mode 100644
index 0000000..e5cbdea
--- /dev/null
+++ b/westech_r2/page/eim_portal/eim_portal.js
@@ -0,0 +1,7 @@
+frappe.pages['eim-portal'].on_page_load = function(wrapper) {
+ var page = frappe.ui.make_app_page({
+ parent: wrapper,
+ title: 'EIM Device Portal',
+ single_column: true
+ });
+}
\ No newline at end of file
diff --git a/westech_r2/page/eim_portal/eim_portal.json b/westech_r2/page/eim_portal/eim_portal.json
new file mode 100644
index 0000000..1330152
--- /dev/null
+++ b/westech_r2/page/eim_portal/eim_portal.json
@@ -0,0 +1,23 @@
+{
+ "content": null,
+ "creation": "2026-05-09 14:00:00",
+ "docstatus": 0,
+ "doctype": "Page",
+ "idx": 0,
+ "modified": "2026-05-09 15:09:48.653878",
+ "modified_by": "Administrator",
+ "module": "Westech R2",
+ "name": "eim-portal",
+ "owner": "Administrator",
+ "page_name": "eim-portal",
+ "roles": [
+ {
+ "role": "All"
+ }
+ ],
+ "script": null,
+ "standard": "Yes",
+ "style": null,
+ "system_page": 0,
+ "title": "EIM Device Portal"
+}
\ No newline at end of file
diff --git a/westech_r2/page/r2_tracking/__init__.py b/westech_r2/page/r2_tracking/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/westech_r2/page/r2_tracking/r2-tracking.css b/westech_r2/page/r2_tracking/r2-tracking.css
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/westech_r2/page/r2_tracking/r2-tracking.css
@@ -0,0 +1 @@
+
diff --git a/westech_r2/page/r2_tracking/r2-tracking.js b/westech_r2/page/r2_tracking/r2-tracking.js
new file mode 100644
index 0000000..952121b
--- /dev/null
+++ b/westech_r2/page/r2_tracking/r2-tracking.js
@@ -0,0 +1,4 @@
+frappe.pages["r2-tracking"].on_page_load = function(wrapper) {
+ wrapper.innerHTML = 'Redirecting to R2 Data Tracking...
';
+ setTimeout(function() { window.location.href = "https://eim.diagalon.com/report/data-tracking-form"; }, 500);
+};
diff --git a/westech_r2/page/r2_tracking/r2-tracking.json b/westech_r2/page/r2_tracking/r2-tracking.json
new file mode 100644
index 0000000..1d5f981
--- /dev/null
+++ b/westech_r2/page/r2_tracking/r2-tracking.json
@@ -0,0 +1,13 @@
+{
+ "creation": "2026-05-09 14:00:00",
+ "docstatus": 0,
+ "doctype": "Page",
+ "idx": 0,
+ "modified": "2026-05-09 14:00:00",
+ "modified_by": "Administrator",
+ "module": "Westech R2",
+ "name": "r2-tracking",
+ "owner": "Administrator",
+ "standard": "Yes",
+ "title": "R2 Data Tracking"
+}
diff --git a/westech_r2/page/r2_tracking/r2-tracking.py b/westech_r2/page/r2_tracking/r2-tracking.py
new file mode 100644
index 0000000..abee617
--- /dev/null
+++ b/westech_r2/page/r2_tracking/r2-tracking.py
@@ -0,0 +1,5 @@
+import frappe
+
+def get_context(context):
+ frappe.local.flags.redirect_location = "https://eim.diagalon.com/report/data-tracking-form"
+ raise frappe.Redirect
diff --git a/westech_r2/page/r2_tracking/r2_tracking.js b/westech_r2/page/r2_tracking/r2_tracking.js
new file mode 100644
index 0000000..71c263a
--- /dev/null
+++ b/westech_r2/page/r2_tracking/r2_tracking.js
@@ -0,0 +1,7 @@
+frappe.pages['r2-tracking'].on_page_load = function(wrapper) {
+ var page = frappe.ui.make_app_page({
+ parent: wrapper,
+ title: 'R2 Data Tracking',
+ single_column: true
+ });
+}
\ No newline at end of file
diff --git a/westech_r2/page/r2_tracking/r2_tracking.json b/westech_r2/page/r2_tracking/r2_tracking.json
new file mode 100644
index 0000000..cbedb3f
--- /dev/null
+++ b/westech_r2/page/r2_tracking/r2_tracking.json
@@ -0,0 +1,23 @@
+{
+ "content": null,
+ "creation": "2026-05-09 14:00:00",
+ "docstatus": 0,
+ "doctype": "Page",
+ "idx": 0,
+ "modified": "2026-05-09 15:09:48.707863",
+ "modified_by": "Administrator",
+ "module": "Westech R2",
+ "name": "r2-tracking",
+ "owner": "Administrator",
+ "page_name": "r2-tracking",
+ "roles": [
+ {
+ "role": "All"
+ }
+ ],
+ "script": null,
+ "standard": "Yes",
+ "style": null,
+ "system_page": 0,
+ "title": "R2 Data Tracking"
+}
\ No newline at end of file
diff --git a/westech_r2/page/wes-ai/__init__.py b/westech_r2/page/wes-ai/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/westech_r2/page/wes-ai/wes-ai.css b/westech_r2/page/wes-ai/wes-ai.css
new file mode 100644
index 0000000..8b13789
--- /dev/null
+++ b/westech_r2/page/wes-ai/wes-ai.css
@@ -0,0 +1 @@
+
diff --git a/westech_r2/page/wes-ai/wes-ai.js b/westech_r2/page/wes-ai/wes-ai.js
new file mode 100644
index 0000000..34af4e2
--- /dev/null
+++ b/westech_r2/page/wes-ai/wes-ai.js
@@ -0,0 +1,4 @@
+frappe.pages["wes-ai"].on_page_load = function(wrapper) {
+ wrapper.innerHTML = 'Redirecting to Wes AI Assistant...
';
+ setTimeout(function() { window.location.href = "https://wes.advante.ch"; }, 500);
+};
diff --git a/westech_r2/page/wes-ai/wes-ai.json b/westech_r2/page/wes-ai/wes-ai.json
new file mode 100644
index 0000000..677ff5b
--- /dev/null
+++ b/westech_r2/page/wes-ai/wes-ai.json
@@ -0,0 +1,13 @@
+{
+ "creation": "2026-05-09 14:00:00",
+ "docstatus": 0,
+ "doctype": "Page",
+ "idx": 0,
+ "modified": "2026-05-09 14:00:00",
+ "modified_by": "Administrator",
+ "module": "Westech R2",
+ "name": "wes-ai",
+ "owner": "Administrator",
+ "standard": "Yes",
+ "title": "Wes AI Assistant"
+}
diff --git a/westech_r2/page/wes-ai/wes-ai.py b/westech_r2/page/wes-ai/wes-ai.py
new file mode 100644
index 0000000..be45c07
--- /dev/null
+++ b/westech_r2/page/wes-ai/wes-ai.py
@@ -0,0 +1,5 @@
+import frappe
+
+def get_context(context):
+ frappe.local.flags.redirect_location = "https://wes.advante.ch"
+ raise frappe.Redirect
diff --git a/westech_r2/page/wes-ai/wes_ai.js b/westech_r2/page/wes-ai/wes_ai.js
new file mode 100644
index 0000000..6d145d9
--- /dev/null
+++ b/westech_r2/page/wes-ai/wes_ai.js
@@ -0,0 +1,30 @@
+frappe.pages["wes-ai"].on_page_load = function(wrapper) {
+ var page = frappe.ui.make_app_page({
+ parent: wrapper,
+ title: "Wes AI Assistant",
+ single_column: true
+ });
+
+ // Create iframe that embeds Wes AI
+ var $container = $(wrapper).find(".layout-main-section");
+ $container.css({
+ "position": "relative",
+ "overflow": "hidden"
+ });
+
+ // Determine Wes URL based on environment
+ var wes_url = "https://wes.advante.ch";
+
+ // On production VM, Wes runs locally
+ if (window.location.hostname === "erpnext.local" || window.location.hostname === "localhost") {
+ wes_url = "http://localhost:8082";
+ }
+
+ var $iframe = $('