busroot-sdk 0.0.8-dev.2774837447 → 0.0.8-dev.2778251899

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/build/index.js +1215 -92
  2. package/package.json +1 -1
package/build/index.js CHANGED
@@ -8939,12 +8939,1219 @@ var require_note3 = __commonJS({
8939
8939
  }
8940
8940
  });
8941
8941
 
8942
+ // ../../packages/common/build/configVars.js
8943
+ var require_configVars = __commonJS({
8944
+ "../../packages/common/build/configVars.js"(exports2) {
8945
+ "use strict";
8946
+ Object.defineProperty(exports2, "__esModule", { value: true });
8947
+ exports2.REDSHIFT_USERNAME = exports2.REDSHIFT_PORT = exports2.REDSHIFT_HOST_PUBLIC = exports2.REDSHIFT_HOST = exports2.SES_CONFIG = exports2.RATE_LIMIT_COUNT = exports2.RATE_LIMIT_WINDOW = exports2.MS_LOGIN_CALLBACK = exports2.MS_LOGIN_CLIENT_SECRET = exports2.MS_LOGIN_CLIENT_ID = exports2.ENABLE_DEMO_MODE = exports2.MQTT_PORT = exports2.MQTT_HOST = exports2.DEFAULT_ACCOUNT_ID = exports2.AUTH_BYPASS_DOMAIN = exports2.KNEX_SEEDS_DIR = exports2.QUEUE_LENGTH = exports2.LOGIN_COOKIE_SECRET = exports2.ENABLE_MS_TEAM_ALERT = exports2.ALERT_SLACK_TOKEN = exports2.ALERT_SLACK_CHANNEL = exports2.ENABLE_SLACK_ALERT = exports2.JWT_SECRET = exports2.AWS_BACKUP_S3_BUCKET = exports2.AWS_REGION = exports2.AWS_SECRET_ACCESS_KEY = exports2.AWS_ACCESS_KEY_ID = exports2.LOGIN_CALL_BACK_URL = exports2.TO_EMAIL_OVERRIDE = exports2.BCC_EMAIL = exports2.FROM_EMAIL = exports2.INFLUX_WRITE_PROTECTED = exports2.INFLUX_BUCKET = exports2.INFLUX_ORG = exports2.INFLUX_TOKEN = exports2.INFLUX_HOST_URL = exports2.PG_DB = exports2.PG_PASS = exports2.PG_USER = exports2.PG_HOST = exports2.BUSROOT_MQTT_FORWARDER_TOPIC = exports2.BUSROOT_MQTT_FORWARDER_PASS = exports2.BUSROOT_MQTT_FORWARDER_USER = exports2.BUSROOT_MQTT_FORWARDER_HOST = exports2.ADMIN_API_KEY = exports2.ADMIN_PASSWORD = exports2.ADMIN_USERNAME = exports2.DOMAIN_NAME = exports2.APP_ENV = exports2.NODE_ENV = void 0;
8948
+ exports2.NON_PRODUCTION_SIGNAL_TIMEOUT_MS = exports2.CACHE_BUILDER_ERROR_BACKOFF_MS = exports2.CACHE_BUILDER_ACCOUNT_BUDGET_MS = exports2.CACHE_BUILDER_IDLE_SLEEP_MS = exports2.CACHE_WARMING_LOOKBACK_DAYS = exports2.CACHE_WARMING_THROTTLE_MS = exports2.CACHE_WARMING_STAGGER_MAX_MS = exports2.CACHE_WARMING_CRON = exports2.CACHE_WARMING_ENABLED = exports2.STATION_FANOUT_PAUSE_MS = exports2.STATION_FANOUT_BATCH_SIZE = exports2.DAU_BUFFER_MAX_MESSAGE_BYTES = exports2.DAU_BUFFER_MAX_AGE_MS = exports2.DAU_BUFFER_SIZE = exports2.ENABLE_MQTT_EVENTS = exports2.ANTHROPIC_API_KEY = exports2.REDSHIFT_DB = exports2.REDSHIFT_PASSWORD = void 0;
8949
+ function parsePositiveIntEnv(value, fallback) {
8950
+ const parsed = Number(value);
8951
+ return Number.isFinite(parsed) && parsed >= 1 ? Math.floor(parsed) : fallback;
8952
+ }
8953
+ function parseNonNegativeIntEnv(value, fallback) {
8954
+ const parsed = Number(value);
8955
+ return Number.isFinite(parsed) && parsed >= 0 ? Math.floor(parsed) : fallback;
8956
+ }
8957
+ exports2.NODE_ENV = process.env.NODE_ENV;
8958
+ exports2.APP_ENV = process.env.APP_ENV || exports2.NODE_ENV;
8959
+ exports2.DOMAIN_NAME = process.env.DOMAIN_NAME || "undefined";
8960
+ exports2.ADMIN_USERNAME = process.env.ADMIN_USERNAME || "admin";
8961
+ exports2.ADMIN_PASSWORD = process.env.ADMIN_PASSWORD;
8962
+ exports2.ADMIN_API_KEY = process.env.ADMIN_API_KEY;
8963
+ exports2.BUSROOT_MQTT_FORWARDER_HOST = process.env.BUSROOT_MQTT_FORWARDER_HOST;
8964
+ exports2.BUSROOT_MQTT_FORWARDER_USER = process.env.BUSROOT_MQTT_FORWARDER_USER;
8965
+ exports2.BUSROOT_MQTT_FORWARDER_PASS = process.env.BUSROOT_MQTT_FORWARDER_PASS;
8966
+ exports2.BUSROOT_MQTT_FORWARDER_TOPIC = process.env.BUSROOT_MQTT_FORWARDER_TOPIC || "#";
8967
+ exports2.PG_HOST = process.env.PG_HOST || exports2.DOMAIN_NAME;
8968
+ exports2.PG_USER = process.env.PG_USER || "postgres";
8969
+ exports2.PG_PASS = process.env.PG_PASS || "pHrJvh4ICt2Fh7Qu";
8970
+ exports2.PG_DB = process.env.PG_DB || "postgres";
8971
+ exports2.INFLUX_HOST_URL = process.env.INFLUX_HOST_URL || `http://${exports2.DOMAIN_NAME}:8086`;
8972
+ exports2.INFLUX_TOKEN = process.env.INFLUX_TOKEN;
8973
+ exports2.INFLUX_ORG = process.env.INFLUX_ORG || "";
8974
+ exports2.INFLUX_BUCKET = process.env.INFLUX_BUCKET || "default";
8975
+ exports2.INFLUX_WRITE_PROTECTED = process.env.INFLUX_WRITE_PROTECTED === "true";
8976
+ exports2.FROM_EMAIL = process.env.FROM_EMAIL || "busroot@output.industries";
8977
+ exports2.BCC_EMAIL = process.env.BCC_EMAIL;
8978
+ exports2.TO_EMAIL_OVERRIDE = process.env.TO_EMAIL_OVERRIDE;
8979
+ exports2.LOGIN_CALL_BACK_URL = process.env.LOGIN_CALL_BACK_URL || `https://${exports2.DOMAIN_NAME}`;
8980
+ exports2.AWS_ACCESS_KEY_ID = process.env.AWS_ACCESS_KEY_ID || "";
8981
+ exports2.AWS_SECRET_ACCESS_KEY = process.env.AWS_SECRET_ACCESS_KEY || "";
8982
+ exports2.AWS_REGION = process.env.AWS_REGION || "eu-west-2";
8983
+ exports2.AWS_BACKUP_S3_BUCKET = process.env.AWS_BACKUP_S3_BUCKET;
8984
+ exports2.JWT_SECRET = process.env.JWT_SECRET || "greentyre";
8985
+ exports2.ENABLE_SLACK_ALERT = (process.env.ENABLE_SLACK_ALERT || "").toLowerCase() === "true";
8986
+ exports2.ALERT_SLACK_CHANNEL = process.env.ALERT_SLACK_CHANNEL || "C03164SPJSH";
8987
+ exports2.ALERT_SLACK_TOKEN = process.env.ALERT_SLACK_TOKEN;
8988
+ exports2.ENABLE_MS_TEAM_ALERT = (process.env.ENABLE_MS_TEAM_ALERT || "").toLowerCase() === "true";
8989
+ exports2.LOGIN_COOKIE_SECRET = process.env.LOGIN_COOKIE_SECRET || "greentyre";
8990
+ exports2.QUEUE_LENGTH = parseInt(process.env["BUSROOT_QUEUE_LENGTH"] || "") || 200;
8991
+ exports2.KNEX_SEEDS_DIR = process.env.KNEX_SEEDS_DIR;
8992
+ exports2.AUTH_BYPASS_DOMAIN = process.env.AUTH_BYPASS_DOMAIN;
8993
+ exports2.DEFAULT_ACCOUNT_ID = process.env.DEFAULT_ACCOUNT_ID || "account_0000000000000000000";
8994
+ exports2.MQTT_HOST = process.env.MQTT_HOST || exports2.DOMAIN_NAME;
8995
+ exports2.MQTT_PORT = parseInt(process.env.MQTT_PORT || "") || 1883;
8996
+ exports2.ENABLE_DEMO_MODE = process.env.ENABLE_DEMO_MODE === "true";
8997
+ exports2.MS_LOGIN_CLIENT_ID = process.env.MS_LOGIN_CLIENT_ID;
8998
+ exports2.MS_LOGIN_CLIENT_SECRET = process.env.MS_LOGIN_CLIENT_SECRET;
8999
+ exports2.MS_LOGIN_CALLBACK = exports2.APP_ENV === "development" ? "http://localhost:3000" : `https://${exports2.DOMAIN_NAME}`;
9000
+ exports2.RATE_LIMIT_WINDOW = parseInt(process.env.RATE_LIMIT_WINDOW || "60000");
9001
+ exports2.RATE_LIMIT_COUNT = parseInt(process.env.RATE_LIMIT_COUNT || "10");
9002
+ exports2.SES_CONFIG = {
9003
+ accessKeyId: exports2.AWS_ACCESS_KEY_ID || "",
9004
+ secretAccessKey: exports2.AWS_SECRET_ACCESS_KEY || "",
9005
+ region: exports2.AWS_REGION,
9006
+ apiVersion: "2010-12-01"
9007
+ };
9008
+ exports2.REDSHIFT_HOST = process.env.REDSHIFT_HOST;
9009
+ exports2.REDSHIFT_HOST_PUBLIC = process.env.REDSHIFT_HOST_PUBLIC || "Not Set";
9010
+ exports2.REDSHIFT_PORT = Number(process.env.REDSHIFT_PORT || 5439);
9011
+ exports2.REDSHIFT_USERNAME = process.env.REDSHIFT_USERNAME || "admin";
9012
+ exports2.REDSHIFT_PASSWORD = process.env.REDSHIFT_PASSWORD;
9013
+ exports2.REDSHIFT_DB = process.env.REDSHIFT_DB || "dev";
9014
+ exports2.ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY;
9015
+ exports2.ENABLE_MQTT_EVENTS = process.env.ENABLE_MQTT_EVENTS === "true" || false;
9016
+ exports2.DAU_BUFFER_SIZE = parseInt(process.env.DAU_BUFFER_SIZE || "") || 5;
9017
+ exports2.DAU_BUFFER_MAX_AGE_MS = parseInt(process.env.DAU_BUFFER_MAX_AGE_MS || "") || 30 * 24 * 60 * 60 * 1e3;
9018
+ exports2.DAU_BUFFER_MAX_MESSAGE_BYTES = parseInt(process.env.DAU_BUFFER_MAX_MESSAGE_BYTES || "") || 8192;
9019
+ exports2.STATION_FANOUT_BATCH_SIZE = parsePositiveIntEnv(process.env.STATION_WINDOW_BATCH_SIZE, 3);
9020
+ exports2.STATION_FANOUT_PAUSE_MS = parseNonNegativeIntEnv(process.env.STATION_WINDOW_BATCH_PAUSE_MS, 500);
9021
+ exports2.CACHE_WARMING_ENABLED = process.env.CACHE_WARMING_ENABLED === "true";
9022
+ exports2.CACHE_WARMING_CRON = process.env.CACHE_WARMING_CRON || "0 2 * * *";
9023
+ exports2.CACHE_WARMING_STAGGER_MAX_MS = parseNonNegativeIntEnv(process.env.CACHE_WARMING_STAGGER_MAX_MS, 30 * 60 * 1e3);
9024
+ exports2.CACHE_WARMING_THROTTLE_MS = parseNonNegativeIntEnv(process.env.CACHE_WARMING_THROTTLE_MS, 250);
9025
+ exports2.CACHE_WARMING_LOOKBACK_DAYS = parsePositiveIntEnv(process.env.CACHE_WARMING_LOOKBACK_DAYS, 730);
9026
+ exports2.CACHE_BUILDER_IDLE_SLEEP_MS = parseNonNegativeIntEnv(process.env.CACHE_BUILDER_IDLE_SLEEP_MS, 2e3);
9027
+ exports2.CACHE_BUILDER_ACCOUNT_BUDGET_MS = parsePositiveIntEnv(process.env.CACHE_BUILDER_ACCOUNT_BUDGET_MS, 6e4);
9028
+ exports2.CACHE_BUILDER_ERROR_BACKOFF_MS = parseNonNegativeIntEnv(process.env.CACHE_BUILDER_ERROR_BACKOFF_MS, 5e3);
9029
+ exports2.NON_PRODUCTION_SIGNAL_TIMEOUT_MS = parseNonNegativeIntEnv(process.env.NON_PRODUCTION_SIGNAL_TIMEOUT_MS, 0);
9030
+ }
9031
+ });
9032
+
9033
+ // ../../packages/common/build/utils/oee.js
9034
+ var require_oee2 = __commonJS({
9035
+ "../../packages/common/build/utils/oee.js"(exports2) {
9036
+ "use strict";
9037
+ var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
9038
+ if (k2 === void 0) k2 = k;
9039
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9040
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9041
+ desc = { enumerable: true, get: function() {
9042
+ return m[k];
9043
+ } };
9044
+ }
9045
+ Object.defineProperty(o, k2, desc);
9046
+ }) : (function(o, m, k, k2) {
9047
+ if (k2 === void 0) k2 = k;
9048
+ o[k2] = m[k];
9049
+ }));
9050
+ var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? (function(o, v) {
9051
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
9052
+ }) : function(o, v) {
9053
+ o["default"] = v;
9054
+ });
9055
+ var __importStar = exports2 && exports2.__importStar || /* @__PURE__ */ (function() {
9056
+ var ownKeys = function(o) {
9057
+ ownKeys = Object.getOwnPropertyNames || function(o2) {
9058
+ var ar = [];
9059
+ for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k;
9060
+ return ar;
9061
+ };
9062
+ return ownKeys(o);
9063
+ };
9064
+ return function(mod) {
9065
+ if (mod && mod.__esModule) return mod;
9066
+ var result = {};
9067
+ if (mod != null) {
9068
+ for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
9069
+ }
9070
+ __setModuleDefault(result, mod);
9071
+ return result;
9072
+ };
9073
+ })();
9074
+ Object.defineProperty(exports2, "__esModule", { value: true });
9075
+ exports2.UNKNOWN_DATA = void 0;
9076
+ var utils = __importStar(require_utils());
9077
+ var station_windows_1 = require_station_windows();
9078
+ exports2.UNKNOWN_DATA = {
9079
+ key: "unknown",
9080
+ value: "Unknown"
9081
+ };
9082
+ function calculateOeeForStationWindows(stationWindows, reasonCauseService, nonProductionCauseService) {
9083
+ if (stationWindows.length == 0) {
9084
+ return {
9085
+ availabilityMs: 0,
9086
+ availabilityLossMs: 0,
9087
+ availabilityPerc: 0,
9088
+ goodQualityCount: 0,
9089
+ goodQualityLossCount: 0,
9090
+ goodQualityPerc: 0,
9091
+ oee: 0,
9092
+ performanceMs: 0,
9093
+ performanceLossMs: 0,
9094
+ performancePerc: 0,
9095
+ productionScheduleMs: 0,
9096
+ productionScheduleLossMs: 0,
9097
+ productionSchedulePerc: 0,
9098
+ scheduleMs: 0,
9099
+ scheduleLossMs: 0,
9100
+ schedulePerc: 0,
9101
+ scheduledNonProduction: [],
9102
+ stops: []
9103
+ };
9104
+ }
9105
+ const stationWindow = (0, station_windows_1.combineStationWindows)(stationWindows);
9106
+ const scheduleMs = utils.add(stationWindow.scheduledProductionMs, stationWindow.scheduledNonProductionMs);
9107
+ const scheduleLossMs = utils.subtract(stationWindow.shiftMs, scheduleMs);
9108
+ const scheduleRatio = utils.ratio(scheduleMs, scheduleLossMs);
9109
+ const productionScheduleMs = utils.add(stationWindow.scheduledProductionMs);
9110
+ const productionScheduleLossMs = utils.subtract(scheduleMs, productionScheduleMs);
9111
+ const productionScheduleRatio = utils.ratio(productionScheduleMs, productionScheduleLossMs);
9112
+ const availabilityLossMs = utils.add(stationWindow.downtimeMs);
9113
+ const availabilityMs = utils.subtract(productionScheduleMs - availabilityLossMs);
9114
+ const availabilityRatio = utils.ratio(availabilityMs, availabilityLossMs);
9115
+ const performanceMs = utils.add(stationWindow.productionMs);
9116
+ const performanceLossMs = Math.max(0, utils.subtract(availabilityMs - performanceMs));
9117
+ const performanceRatio = utils.ratio(performanceMs, performanceLossMs);
9118
+ const goodQualityCount = utils.add(stationWindow.productionGoodCount);
9119
+ const goodQualityLossCount = utils.add(stationWindow.productionBadCount);
9120
+ const goodQualityRatio = utils.ratio(goodQualityCount, goodQualityLossCount);
9121
+ const nonProductionReasonCodes = [...stationWindow.nonProductionReasonCodes || [], exports2.UNKNOWN_DATA.key];
9122
+ const scheduledNonProduction = nonProductionReasonCodes.flatMap((s) => {
9123
+ const results = [];
9124
+ for (let i = 0; i < stationWindows.length; i++) {
9125
+ const window2 = stationWindows[i];
9126
+ if (!window2.scheduledNonProductionMs) {
9127
+ continue;
9128
+ }
9129
+ let duration = 0;
9130
+ let j = i;
9131
+ do {
9132
+ const nextWindow = stationWindows[j];
9133
+ if (!nextWindow.scheduledNonProductionMs) {
9134
+ i = j;
9135
+ break;
9136
+ }
9137
+ let nextNonProductionReasonCode = nextWindow.nonProductionReasonCodes?.find((code) => code === s) || Object.keys(nextWindow.nonProductionReasonCodesDetail || {}).find((code) => code === s);
9138
+ if (!nextNonProductionReasonCode && !nextWindow.nonProductionReasonCodes?.length) {
9139
+ nextNonProductionReasonCode = exports2.UNKNOWN_DATA.key;
9140
+ }
9141
+ if (nextNonProductionReasonCode !== s) {
9142
+ i = j;
9143
+ break;
9144
+ }
9145
+ duration += nextWindow.nonProductionReasonCodesDetail ? nextWindow.nonProductionReasonCodesDetail[s]?.scheduledNonProductionMs ?? 0 : nextWindow.scheduledNonProductionMs ?? 0;
9146
+ j++;
9147
+ i = j;
9148
+ } while (j < stationWindows.length);
9149
+ if (duration) {
9150
+ const breadcrumb = nonProductionCauseService != null ? nonProductionCauseService.getCauseBreadcrumb(s) : [];
9151
+ const description = nonProductionCauseService != null ? breadcrumb.map((c) => c.description).join(" | ") || exports2.UNKNOWN_DATA.value : "";
9152
+ results.push({
9153
+ code: s,
9154
+ description,
9155
+ reasonBreadcrumb: breadcrumb.length > 0 ? breadcrumb : [{ code: s, description: description || exports2.UNKNOWN_DATA.value }],
9156
+ duration,
9157
+ cost: 0,
9158
+ percent: 0,
9159
+ energy: 0,
9160
+ energyCost: 0,
9161
+ productionQuantity: 0
9162
+ });
9163
+ }
9164
+ }
9165
+ return results;
9166
+ });
9167
+ const issueReasonCodes = [...stationWindow.downtimeReasonCodes || [], exports2.UNKNOWN_DATA.key];
9168
+ const stops = issueReasonCodes.flatMap((s) => {
9169
+ const results = [];
9170
+ for (let i = 0; i < stationWindows.length; i++) {
9171
+ const window2 = stationWindows[i];
9172
+ if (!window2.downtimeMs) {
9173
+ continue;
9174
+ }
9175
+ let duration = 0;
9176
+ let issueDowntimeCost = 0;
9177
+ let energyDowntimeCost = 0;
9178
+ let energyDowntime = 0;
9179
+ let productionQuantity = 0;
9180
+ let j = i;
9181
+ do {
9182
+ const nextWindow = stationWindows[j];
9183
+ if (!nextWindow.downtimeMs) {
9184
+ i = j;
9185
+ break;
9186
+ }
9187
+ let nextIssueReasonCode = nextWindow.downtimeReasonCodes?.find((code) => code === s) || Object.keys(nextWindow.downtimeReasonCodesDetail || {}).find((code) => code === s);
9188
+ if (!nextIssueReasonCode && !nextWindow.downtimeReasonCodes?.length) {
9189
+ nextIssueReasonCode = exports2.UNKNOWN_DATA.key;
9190
+ }
9191
+ if (nextIssueReasonCode !== s) {
9192
+ i = j;
9193
+ break;
9194
+ }
9195
+ const detail = nextWindow.downtimeReasonCodesDetail;
9196
+ issueDowntimeCost += detail ? detail[s]?.lostProductionCostDowntime ?? 0 : nextWindow.lostProductionCostDowntime ?? 0;
9197
+ energyDowntimeCost += detail ? detail[s]?.electricalCost ?? 0 : nextWindow.electricalCost ?? 0;
9198
+ energyDowntime += detail ? detail[s]?.electricalKwh ?? 0 : nextWindow.electricalKwh ?? 0;
9199
+ duration += detail ? detail[s]?.downtimeMs ?? 0 : nextWindow.downtimeMs ?? 0;
9200
+ productionQuantity += detail ? detail[s]?.productionIdealCount ?? 0 : nextWindow.productionIdealCount ?? 0;
9201
+ j++;
9202
+ i = j;
9203
+ } while (j < stationWindows.length);
9204
+ if (duration) {
9205
+ const breadcrumb = reasonCauseService != null ? reasonCauseService.getCauseBreadcrumb(s) : [];
9206
+ const description = reasonCauseService != null ? breadcrumb.map((c) => c.description).join(" | ") || exports2.UNKNOWN_DATA.value : "";
9207
+ results.push({
9208
+ code: s,
9209
+ description,
9210
+ reasonBreadcrumb: breadcrumb.length > 0 ? breadcrumb : [{ code: s, description: description || exports2.UNKNOWN_DATA.value }],
9211
+ duration,
9212
+ cost: issueDowntimeCost,
9213
+ energy: energyDowntime,
9214
+ energyCost: energyDowntimeCost,
9215
+ percent: 0,
9216
+ productionQuantity
9217
+ });
9218
+ }
9219
+ }
9220
+ return results;
9221
+ }).sort((a, b) => b.duration - a.duration);
9222
+ const oee = utils.roundTo(availabilityRatio * performanceRatio * goodQualityRatio, 3);
9223
+ return {
9224
+ scheduleMs,
9225
+ scheduleLossMs,
9226
+ schedulePerc: scheduleRatio,
9227
+ productionScheduleMs,
9228
+ productionScheduleLossMs,
9229
+ productionSchedulePerc: productionScheduleRatio,
9230
+ availabilityMs,
9231
+ availabilityLossMs,
9232
+ availabilityPerc: availabilityRatio,
9233
+ performanceMs,
9234
+ performanceLossMs,
9235
+ performancePerc: performanceRatio,
9236
+ goodQualityCount,
9237
+ goodQualityLossCount,
9238
+ goodQualityPerc: goodQualityRatio,
9239
+ stops: getOeeStopsPercentages(stops),
9240
+ scheduledNonProduction,
9241
+ oee
9242
+ };
9243
+ }
9244
+ function combineOee(stations) {
9245
+ const combine = {
9246
+ scheduleMs: utils.roundTo(stations.reduce((a, station) => a += station.oee.scheduleMs, 0), 2),
9247
+ scheduleLossMs: utils.roundTo(stations.reduce((a, station) => a += station.oee.scheduleLossMs, 0), 2),
9248
+ productionScheduleMs: utils.roundTo(stations.reduce((a, station) => a += station.oee.productionScheduleMs, 0), 2),
9249
+ productionScheduleLossMs: utils.roundTo(stations.reduce((a, station) => a += station.oee.productionScheduleLossMs, 0), 2),
9250
+ availabilityMs: utils.roundTo(stations.reduce((a, station) => a += station.oee.availabilityMs, 0), 2),
9251
+ availabilityLossMs: utils.roundTo(stations.reduce((a, station) => a += station.oee.availabilityLossMs, 0), 2),
9252
+ performanceMs: utils.roundTo(stations.reduce((a, station) => a += station.oee.performanceMs, 0), 2),
9253
+ performanceLossMs: utils.roundTo(stations.reduce((a, station) => a += station.oee.performanceLossMs, 0), 2),
9254
+ goodQualityCount: utils.roundTo(stations.reduce((a, station) => a += station.oee.goodQualityCount, 0), 2),
9255
+ goodQualityLossCount: utils.roundTo(stations.reduce((a, station) => a += station.oee.goodQualityLossCount, 0), 2),
9256
+ scheduledNonProduction: combineOeeStops(stations.flatMap((station) => station.oee.scheduledNonProduction)),
9257
+ stops: combineOeeStops(stations.flatMap((station) => station.oee.stops))
9258
+ };
9259
+ const withPerc = {
9260
+ ...combine,
9261
+ schedulePerc: combine.scheduleMs / (combine.scheduleMs + combine.scheduleLossMs) || 0,
9262
+ productionSchedulePerc: combine.productionScheduleMs / (combine.productionScheduleMs + combine.productionScheduleLossMs) || 1,
9263
+ availabilityPerc: combine.availabilityMs / (combine.availabilityMs + combine.availabilityLossMs) || 1,
9264
+ performancePerc: combine.performanceMs / (combine.performanceMs + combine.performanceLossMs) || 1,
9265
+ goodQualityPerc: combine.goodQualityCount / (combine.goodQualityCount + combine.goodQualityLossCount) || 1
9266
+ };
9267
+ return { ...withPerc, oee: utils.roundTo(withPerc.availabilityPerc * withPerc.performancePerc * withPerc.goodQualityPerc, 2) };
9268
+ }
9269
+ function combineOeeStops(stops) {
9270
+ const combinedStops = [
9271
+ ...stops.reduce((a, stop) => {
9272
+ if (!stop.code) {
9273
+ return a;
9274
+ }
9275
+ const downtime = a.get(stop.code) || {
9276
+ code: stop.code,
9277
+ description: stop.description,
9278
+ reasonBreadcrumb: stop.reasonBreadcrumb,
9279
+ duration: 0,
9280
+ cost: 0,
9281
+ percent: 0,
9282
+ energy: 0,
9283
+ energyCost: 0,
9284
+ productionQuantity: 0
9285
+ };
9286
+ downtime.duration += stop.duration || 0;
9287
+ downtime.cost += stop.cost || 0;
9288
+ downtime.energy += stop.energy || 0;
9289
+ downtime.energyCost += stop.energyCost || 0;
9290
+ downtime.productionQuantity += stop.productionQuantity || 0;
9291
+ a.set(stop.code, downtime);
9292
+ return a;
9293
+ }, /* @__PURE__ */ new Map()).values()
9294
+ ];
9295
+ const withPercent = getOeeStopsPercentages(combinedStops);
9296
+ return withPercent;
9297
+ }
9298
+ function getOeeStopsPercentages(stops) {
9299
+ const totalDuration = stops.reduce((a, b) => a + b.duration, 0);
9300
+ return stops.map((stop) => {
9301
+ return { ...stop, percent: stop.duration / totalDuration };
9302
+ }).sort((a, b) => b.duration - a.duration);
9303
+ }
9304
+ var OeeHelper = {
9305
+ combineOee,
9306
+ combineOeeStops,
9307
+ calculateOeeForStationWindows
9308
+ };
9309
+ exports2.default = OeeHelper;
9310
+ }
9311
+ });
9312
+
9313
+ // ../../packages/common/build/utils/station-windows.js
9314
+ var require_station_windows = __commonJS({
9315
+ "../../packages/common/build/utils/station-windows.js"(exports2) {
9316
+ "use strict";
9317
+ var __createBinding = exports2 && exports2.__createBinding || (Object.create ? (function(o, m, k, k2) {
9318
+ if (k2 === void 0) k2 = k;
9319
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9320
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
9321
+ desc = { enumerable: true, get: function() {
9322
+ return m[k];
9323
+ } };
9324
+ }
9325
+ Object.defineProperty(o, k2, desc);
9326
+ }) : (function(o, m, k, k2) {
9327
+ if (k2 === void 0) k2 = k;
9328
+ o[k2] = m[k];
9329
+ }));
9330
+ var __setModuleDefault = exports2 && exports2.__setModuleDefault || (Object.create ? (function(o, v) {
9331
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
9332
+ }) : function(o, v) {
9333
+ o["default"] = v;
9334
+ });
9335
+ var __importStar = exports2 && exports2.__importStar || /* @__PURE__ */ (function() {
9336
+ var ownKeys = function(o) {
9337
+ ownKeys = Object.getOwnPropertyNames || function(o2) {
9338
+ var ar = [];
9339
+ for (var k in o2) if (Object.prototype.hasOwnProperty.call(o2, k)) ar[ar.length] = k;
9340
+ return ar;
9341
+ };
9342
+ return ownKeys(o);
9343
+ };
9344
+ return function(mod) {
9345
+ if (mod && mod.__esModule) return mod;
9346
+ var result = {};
9347
+ if (mod != null) {
9348
+ for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
9349
+ }
9350
+ __setModuleDefault(result, mod);
9351
+ return result;
9352
+ };
9353
+ })();
9354
+ var __importDefault = exports2 && exports2.__importDefault || function(mod) {
9355
+ return mod && mod.__esModule ? mod : { "default": mod };
9356
+ };
9357
+ Object.defineProperty(exports2, "__esModule", { value: true });
9358
+ exports2.AggregatedProduction = void 0;
9359
+ exports2.generateMockStationWindows = generateMockStationWindows;
9360
+ exports2.combineStationWindows = combineStationWindows;
9361
+ exports2.combineStationWindowsByTime = combineStationWindowsByTime;
9362
+ exports2.aggregateStationWindows = aggregateStationWindows;
9363
+ exports2.aggregateStationWindowsBySkuCode = aggregateStationWindowsBySkuCode;
9364
+ exports2.extractDowntimesFromStationWindows = extractDowntimesFromStationWindows;
9365
+ exports2.getReliabilityData = getReliabilityData;
9366
+ exports2.calculateReliabilityMetrics = calculateReliabilityMetrics;
9367
+ exports2.downtimesToStationWindows = downtimesToStationWindows;
9368
+ exports2.filterStationWindowsBySkuCode = filterStationWindowsBySkuCode;
9369
+ exports2.filterStationWindowsByShiftNames = filterStationWindowsByShiftNames;
9370
+ exports2.getCycleTimeFromSku = getCycleTimeFromSku;
9371
+ exports2.getPerformanceValueFromSkuCycleTime = getPerformanceValueFromSkuCycleTime;
9372
+ exports2.getPerformanceModeFromSku = getPerformanceModeFromSku;
9373
+ exports2.aggregateProductionFromStationWindows = aggregateProductionFromStationWindows;
9374
+ exports2.aggregateProductionBySkuFromStationWindows = aggregateProductionBySkuFromStationWindows;
9375
+ exports2.isSignalNonProductionWindow = isSignalNonProductionWindow;
9376
+ exports2.signalNonProductionReasonCode = signalNonProductionReasonCode;
9377
+ var moment_timezone_1 = __importDefault(require("moment-timezone"));
9378
+ var enums_1 = require_enums();
9379
+ var time_1 = require_time();
9380
+ var shiftUtils = __importStar(require_shifts());
9381
+ var schedules_1 = require_schedules();
9382
+ var station_window_1 = require_station_window2();
9383
+ var times_1 = require_times();
9384
+ var utils = __importStar(require_utils());
9385
+ var _1 = require_utils();
9386
+ var zod_1 = __importDefault(require("zod"));
9387
+ var configVars_1 = require_configVars();
9388
+ var oee_1 = require_oee2();
9389
+ var WINDOW_DURATION = 6e4;
9390
+ var MAX_WINDOWS_PER_DOWNTIME = 1440;
9391
+ function generateMockStationWindows(offset, extraFields) {
9392
+ const startMoment = (0, moment_timezone_1.default)("2020-01-01T00:00:00.000Z");
9393
+ return {
9394
+ accountId: configVars_1.DEFAULT_ACCOUNT_ID,
9395
+ stationCode: "station1",
9396
+ stationName: "Station 1",
9397
+ totalMs: 6e4,
9398
+ shiftMs: 6e4,
9399
+ isAlive: true,
9400
+ windowStartAt: startMoment.clone().add(offset, "minute").toISOString(),
9401
+ windowStartAtTimestamp: startMoment.clone().add(offset, "minute").valueOf(),
9402
+ windowEndAt: startMoment.clone().add(offset + 1, "minute").toISOString(),
9403
+ windowEndAtTimestamp: startMoment.clone().add(offset + 1, "minute").valueOf(),
9404
+ ...extraFields
9405
+ };
9406
+ }
9407
+ function combineStationWindows(windows, inShiftAverages = false, skipConsecutiveCheck = false) {
9408
+ if (windows.length === 0) {
9409
+ throw new Error("Must be at least 1 window.");
9410
+ }
9411
+ const windowDuration = windows[0].totalMs;
9412
+ const window2 = windows.reduce((a, b, i) => {
9413
+ const isFirstWindow = i === 0;
9414
+ const isConsecutive = a.windowEndAt === b.windowStartAt;
9415
+ const isSameDuration = b.totalMs === windowDuration;
9416
+ if (!isFirstWindow && !skipConsecutiveCheck) {
9417
+ if (!isConsecutive) {
9418
+ throw new Error("Windows are not consecutive.");
9419
+ }
9420
+ if (!isSameDuration) {
9421
+ throw new Error("Windows are not the same duration. " + windowDuration + " " + b.totalMs);
9422
+ }
9423
+ }
9424
+ a.stationCode = b.stationCode;
9425
+ a.stationName = b.stationName;
9426
+ a.windowEndAt = b.windowEndAt;
9427
+ a.windowEndAtTimestamp = b.windowEndAtTimestamp;
9428
+ a.downtimeSince = b.downtimeSince;
9429
+ a.totalMs = add(a.totalMs, b.totalMs) || 0;
9430
+ a.shiftMs = add(a.shiftMs, b.shiftMs);
9431
+ a.scheduledProductionMs = add(a.scheduledProductionMs, b.scheduledProductionMs);
9432
+ a.scheduledNonProductionMs = add(a.scheduledNonProductionMs, b.scheduledNonProductionMs);
9433
+ a.productiveMs = add(a.productiveMs, b.productiveMs);
9434
+ a.downtimeMs = add(a.downtimeMs, b.downtimeMs);
9435
+ a.productionGoodCount = add(a.productionGoodCount, b.productionGoodCount);
9436
+ a.productionBadCount = add(a.productionBadCount, b.productionBadCount);
9437
+ a.productionGoodValue = add(a.productionGoodValue, b.productionGoodValue);
9438
+ a.productionBadValue = add(a.productionBadValue, b.productionBadValue);
9439
+ a.productionTotalCount = add(a.productionTotalCount, b.productionTotalCount);
9440
+ a.productionMs = add(a.productionMs, b.productionMs);
9441
+ a.speed = add(a.speed, b.speed);
9442
+ a.electricalKwh = add(a.electricalKwh, b.electricalKwh);
9443
+ a.electricalCost = add(a.electricalCost, b.electricalCost);
9444
+ a.lostProductionCostNonProduction = add(a.lostProductionCostNonProduction, b.lostProductionCostNonProduction);
9445
+ a.lostProductionCostDowntime = add(a.lostProductionCostDowntime, b.lostProductionCostDowntime);
9446
+ a.lostProductionCostSpeed = add(a.lostProductionCostSpeed, b.lostProductionCostSpeed);
9447
+ a.lostProductionCostQuality = add(a.lostProductionCostQuality, b.lostProductionCostQuality);
9448
+ a.lostProductionCostTotal = add(a.lostProductionCostTotal, b.lostProductionCostTotal);
9449
+ a.productionIdealCount = add(a.productionIdealCount, b.productionIdealCount);
9450
+ a.productionTargetCount = add(a.productionTargetCount, b.productionTargetCount);
9451
+ if (b.shiftNames) {
9452
+ a.shiftNames?.push(...b.shiftNames);
9453
+ }
9454
+ if (b.skuCodes) {
9455
+ a.skuCodes?.push(...b.skuCodes);
9456
+ }
9457
+ if (b.skuNames) {
9458
+ a.skuNames?.push(...b.skuNames);
9459
+ }
9460
+ if (b.scheduleIds) {
9461
+ a.scheduleIds?.push(...b.scheduleIds || []);
9462
+ }
9463
+ if (b.workOrderReferences) {
9464
+ a.workOrderReferences?.push(...b.workOrderReferences || []);
9465
+ }
9466
+ if (b.errorCodes) {
9467
+ a.errorCodes?.push(...b.errorCodes);
9468
+ }
9469
+ if (b.downtimeIds) {
9470
+ a.downtimeIds?.push(...b.downtimeIds);
9471
+ }
9472
+ if (b.downtimeReasonCodes) {
9473
+ a.downtimeReasonCodes?.push(...b.downtimeReasonCodes);
9474
+ }
9475
+ if (b.downtimeMs) {
9476
+ const downtimeReasonCodesDetail = a.downtimeReasonCodesDetail || {};
9477
+ const bDetail = b.downtimeReasonCodesDetail || {
9478
+ [b.downtimeReasonCodes?.[0] || oee_1.UNKNOWN_DATA.key]: {
9479
+ productionIdealCount: b.productionIdealCount || 0,
9480
+ downtimeMs: b.downtimeMs || 0,
9481
+ lostProductionCostDowntime: b.lostProductionCostDowntime || 0,
9482
+ electricalCost: b.electricalCost || 0,
9483
+ electricalKwh: b.electricalKwh || 0
9484
+ }
9485
+ };
9486
+ for (const [reasonCode, detail] of Object.entries(bDetail)) {
9487
+ downtimeReasonCodesDetail[reasonCode] = {
9488
+ productionIdealCount: (downtimeReasonCodesDetail[reasonCode]?.productionIdealCount || 0) + (detail.productionIdealCount || 0),
9489
+ downtimeMs: (downtimeReasonCodesDetail[reasonCode]?.downtimeMs || 0) + (detail.downtimeMs || 0),
9490
+ lostProductionCostDowntime: (downtimeReasonCodesDetail[reasonCode]?.lostProductionCostDowntime || 0) + (detail.lostProductionCostDowntime || 0),
9491
+ electricalCost: (downtimeReasonCodesDetail[reasonCode]?.electricalCost || 0) + (detail.electricalCost || 0),
9492
+ electricalKwh: (downtimeReasonCodesDetail[reasonCode]?.electricalKwh || 0) + (detail.electricalKwh || 0)
9493
+ };
9494
+ }
9495
+ a.downtimeReasonCodesDetail = downtimeReasonCodesDetail;
9496
+ }
9497
+ if (b.nonProductionReasonCodes) {
9498
+ a.nonProductionReasonCodes?.push(...b.nonProductionReasonCodes);
9499
+ }
9500
+ if (b.scheduledNonProductionMs) {
9501
+ const nonProductionReasonCodesDetail = a.nonProductionReasonCodesDetail || {};
9502
+ const bNonProductionDetail = b.nonProductionReasonCodesDetail || {
9503
+ [b.nonProductionReasonCodes?.[0] || oee_1.UNKNOWN_DATA.key]: {
9504
+ scheduledNonProductionMs: b.scheduledNonProductionMs || 0
9505
+ }
9506
+ };
9507
+ for (const [reasonCode, detail] of Object.entries(bNonProductionDetail)) {
9508
+ nonProductionReasonCodesDetail[reasonCode] = {
9509
+ scheduledNonProductionMs: (nonProductionReasonCodesDetail[reasonCode]?.scheduledNonProductionMs || 0) + (detail.scheduledNonProductionMs || 0)
9510
+ };
9511
+ }
9512
+ a.nonProductionReasonCodesDetail = nonProductionReasonCodesDetail;
9513
+ }
9514
+ if (b.operatorInitials) {
9515
+ a.operatorInitials = b.operatorInitials;
9516
+ }
9517
+ a.performanceModeFrom = b.performanceModeFrom;
9518
+ a.performanceModeType = b.performanceModeType;
9519
+ a.isAlive = b.isAlive ? true : a.isAlive;
9520
+ a.isFuture = !b.isFuture ? false : a.isFuture;
9521
+ if (!inShiftAverages || b.shiftMs != void 0 && b.shiftMs > 0) {
9522
+ a.rssiAvg = add(a.rssiAvg, b.rssiAvg);
9523
+ a.electricalVoltsAvg = add(a.electricalVoltsAvg, b.electricalVoltsAvg);
9524
+ a.electricalAmpsAvg = add(a.electricalAmpsAvg, b.electricalAmpsAvg);
9525
+ a.electricalHzAvg = add(a.electricalHzAvg, b.electricalHzAvg);
9526
+ a.electricalPfAvg = add(a.electricalPfAvg, b.electricalPfAvg);
9527
+ a.electricalKwAvg = add(a.electricalKwAvg, b.electricalKwAvg);
9528
+ a.inShiftCount++;
9529
+ }
9530
+ if ((a.scheduledProductionMs || 0) > 0) {
9531
+ a.inProductionCount++;
9532
+ }
9533
+ a.count++;
9534
+ return a;
9535
+ }, {
9536
+ ...windows[0],
9537
+ totalMs: 0,
9538
+ shiftMs: void 0,
9539
+ shiftNames: [],
9540
+ scheduledProductionMs: void 0,
9541
+ scheduledNonProductionMs: void 0,
9542
+ productiveMs: void 0,
9543
+ downtimeMs: void 0,
9544
+ downtimeSince: void 0,
9545
+ rssiAvg: void 0,
9546
+ productionGoodCount: void 0,
9547
+ productionBadCount: void 0,
9548
+ productionGoodValue: void 0,
9549
+ productionBadValue: void 0,
9550
+ productionIdealCount: void 0,
9551
+ productionTargetCount: void 0,
9552
+ productionTotalCount: void 0,
9553
+ productionRatePerHour: void 0,
9554
+ productionRatePerHourIdeal: void 0,
9555
+ productionMs: void 0,
9556
+ speed: void 0,
9557
+ electricalVoltsAvg: void 0,
9558
+ electricalAmpsAvg: void 0,
9559
+ electricalHzAvg: void 0,
9560
+ electricalPfAvg: void 0,
9561
+ electricalKwAvg: void 0,
9562
+ electricalKwh: void 0,
9563
+ electricalCost: 0,
9564
+ skuCodes: [],
9565
+ skuNames: [],
9566
+ scheduleIds: [],
9567
+ workOrderReferences: [],
9568
+ errorCodes: [],
9569
+ downtimeIds: [],
9570
+ downtimeReasonCodes: [],
9571
+ nonProductionReasonCodes: [],
9572
+ operatorInitials: void 0,
9573
+ isAlive: false,
9574
+ lostProductionCostNonProduction: 0,
9575
+ lostProductionCostDowntime: 0,
9576
+ lostProductionCostSpeed: 0,
9577
+ lostProductionCostQuality: 0,
9578
+ lostProductionCostTotal: 0,
9579
+ count: 0,
9580
+ inShiftCount: 0,
9581
+ inProductionCount: 0,
9582
+ performanceModeFrom: "none",
9583
+ performanceModeType: "none",
9584
+ downtimeReasonCodesDetail: void 0,
9585
+ nonProductionReasonCodesDetail: void 0
9586
+ });
9587
+ if (window2.isFuture) {
9588
+ const result = {
9589
+ stationCode: window2.stationCode,
9590
+ stationName: window2.stationName,
9591
+ windowStartAt: window2.windowStartAt,
9592
+ windowStartAtTimestamp: window2.windowStartAtTimestamp,
9593
+ windowEndAt: window2.windowEndAt,
9594
+ windowEndAtTimestamp: window2.windowEndAtTimestamp,
9595
+ totalMs: window2.totalMs,
9596
+ shiftMs: window2.shiftMs,
9597
+ isAlive: window2.isAlive,
9598
+ isFuture: window2.isFuture
9599
+ };
9600
+ return result;
9601
+ } else {
9602
+ const result = {
9603
+ stationCode: window2.stationCode,
9604
+ stationName: window2.stationName,
9605
+ windowStartAt: window2.windowStartAt,
9606
+ windowStartAtTimestamp: window2.windowStartAtTimestamp,
9607
+ windowEndAt: window2.windowEndAt,
9608
+ windowEndAtTimestamp: window2.windowEndAtTimestamp,
9609
+ totalMs: window2.totalMs,
9610
+ shiftMs: window2.shiftMs,
9611
+ shiftNames: Array.from(/* @__PURE__ */ new Set([...window2.shiftNames || []])),
9612
+ scheduledProductionMs: window2.scheduledProductionMs,
9613
+ scheduledNonProductionMs: window2.scheduledNonProductionMs,
9614
+ productiveMs: window2.productiveMs,
9615
+ downtimeMs: window2.downtimeMs,
9616
+ downtimeSince: window2.downtimeSince,
9617
+ productionGoodCount: (0, _1.roundTo)(window2.productionGoodCount, 2),
9618
+ productionBadCount: (0, _1.roundTo)(window2.productionBadCount, 2),
9619
+ productionGoodValue: (0, _1.roundTo)(window2.productionGoodValue, 2),
9620
+ productionBadValue: (0, _1.roundTo)(window2.productionBadValue, 2),
9621
+ productionTotalCount: (0, _1.roundTo)(window2.productionTotalCount, 2),
9622
+ productionRatePerHour: (divide(window2.productionTotalCount, window2.inProductionCount, 2) || 0) * 60,
9623
+ productionRatePerHourIdeal: (divide(window2.productionIdealCount, window2.inProductionCount, 2) || 0) * 60,
9624
+ productionMs: (0, _1.roundTo)(window2.productionMs, 2),
9625
+ isAlive: window2.isAlive,
9626
+ isFuture: false,
9627
+ speed: divide(window2.speed, window2.count, 4),
9628
+ electricalKwh: window2.electricalKwh,
9629
+ electricalCost: (0, _1.roundTo)(window2.electricalCost, 2),
9630
+ skuCodes: Array.from(/* @__PURE__ */ new Set([...window2.skuCodes || []])),
9631
+ skuNames: Array.from(/* @__PURE__ */ new Set([...window2.skuNames || []])),
9632
+ scheduleIds: Array.from(/* @__PURE__ */ new Set([...window2.scheduleIds || []])),
9633
+ workOrderReferences: Array.from(/* @__PURE__ */ new Set([...window2.workOrderReferences || []])),
9634
+ errorCodes: Array.from(/* @__PURE__ */ new Set([...window2.errorCodes || []])),
9635
+ downtimeIds: Array.from(/* @__PURE__ */ new Set([...window2.downtimeIds || []])),
9636
+ downtimeReasonCodes: Array.from(/* @__PURE__ */ new Set([...window2.downtimeReasonCodes || []])),
9637
+ downtimeReasonCodesDetail: window2.downtimeReasonCodesDetail,
9638
+ nonProductionReasonCodes: Array.from(/* @__PURE__ */ new Set([...window2.nonProductionReasonCodes || []])),
9639
+ nonProductionReasonCodesDetail: window2.nonProductionReasonCodesDetail,
9640
+ lostProductionCostNonProduction: window2.lostProductionCostNonProduction,
9641
+ lostProductionCostDowntime: window2.lostProductionCostDowntime,
9642
+ lostProductionCostSpeed: window2.lostProductionCostSpeed,
9643
+ lostProductionCostQuality: window2.lostProductionCostQuality,
9644
+ lostProductionCostTotal: window2.lostProductionCostTotal,
9645
+ productionIdealCount: (0, _1.roundTo)(window2.productionIdealCount, 2),
9646
+ productionTargetCount: (0, _1.roundTo)(window2.productionTargetCount, 2),
9647
+ performanceModeFrom: window2.performanceModeFrom,
9648
+ performanceModeType: window2.performanceModeType,
9649
+ operatorInitials: window2.operatorInitials
9650
+ };
9651
+ if (window2.inShiftCount > 0) {
9652
+ result.rssiAvg = divide(window2.rssiAvg, window2.inShiftCount, 4);
9653
+ result.electricalVoltsAvg = divide(window2.electricalVoltsAvg, window2.inShiftCount, 4);
9654
+ result.electricalAmpsAvg = divide(window2.electricalAmpsAvg, window2.inShiftCount, 4);
9655
+ result.electricalHzAvg = divide(window2.electricalHzAvg, window2.inShiftCount, 4);
9656
+ result.electricalPfAvg = divide(window2.electricalPfAvg, window2.inShiftCount, 4);
9657
+ result.electricalKwAvg = divide(window2.electricalKwAvg, window2.inShiftCount, 4);
9658
+ }
9659
+ return result;
9660
+ }
9661
+ }
9662
+ function combineStationWindowsByTime(windows) {
9663
+ const outputWindows = [];
9664
+ const windowsByTime = {};
9665
+ for (const window2 of windows) {
9666
+ if (windowsByTime[window2.windowStartAtTimestamp] == null) {
9667
+ windowsByTime[window2.windowStartAtTimestamp] = [];
9668
+ }
9669
+ delete window2.stationCode;
9670
+ delete window2.stationName;
9671
+ windowsByTime[window2.windowStartAtTimestamp].push(window2);
9672
+ }
9673
+ const times = Object.keys(windowsByTime).map((k) => Number(k));
9674
+ for (const time of times) {
9675
+ const sameTimeWindows = windowsByTime[time];
9676
+ outputWindows.push(combineStationWindows(sameTimeWindows, false, true));
9677
+ }
9678
+ return outputWindows;
9679
+ }
9680
+ function aggregateStationWindows(manifest, windows, station, aggregateWindowInMinutes, includeFutureWindowsUntil, inShiftAverages = false, schedules) {
9681
+ if (!windows.length) {
9682
+ return [];
9683
+ }
9684
+ let aggregatedWindows = [];
9685
+ const aggregateWindowInMs = aggregateWindowInMinutes * 6e4;
9686
+ let alignedWithAggregateWindowIndex = aggregateWindowInMinutes >= time_1.TimeIntervals["1h"].min ? true : false;
9687
+ const batch = [];
9688
+ for (let i = 0; i < windows.length; i++) {
9689
+ const thisWindow = windows[i];
9690
+ const thisWindowDuration = thisWindow.windowEndAtTimestamp - thisWindow.windowStartAtTimestamp;
9691
+ if (thisWindowDuration > aggregateWindowInMs) {
9692
+ throw new Error("Windows being aggregated must be less than or equal to the aggregate window. " + windows[i].totalMs + " " + aggregateWindowInMinutes);
9693
+ }
9694
+ if (alignedWithAggregateWindowIndex === false) {
9695
+ if (windows[i].windowStartAtTimestamp % aggregateWindowInMs === 0) {
9696
+ alignedWithAggregateWindowIndex = true;
9697
+ } else {
9698
+ continue;
9699
+ }
9700
+ }
9701
+ batch.push(windows[i]);
9702
+ const durationOfBatch = batch.reduce((a, b) => a + b.totalMs, 0);
9703
+ if (durationOfBatch >= aggregateWindowInMs) {
9704
+ aggregatedWindows.push(combineStationWindows(batch, inShiftAverages));
9705
+ batch.length = 0;
9706
+ }
9707
+ }
9708
+ if (includeFutureWindowsUntil && station != null) {
9709
+ const windowDurationMs = aggregateWindowInMinutes * WINDOW_DURATION;
9710
+ const lastAggregatedWindowEndAtTimestamp = aggregatedWindows[aggregatedWindows.length - 1]?.windowEndAtTimestamp;
9711
+ const lastWindowEndAtTimestamp = lastAggregatedWindowEndAtTimestamp ?? windows[windows.length - 1].windowEndAtTimestamp;
9712
+ const futureWindowsStartAt = lastAggregatedWindowEndAtTimestamp == null && aggregateWindowInMinutes < time_1.TimeIntervals["1h"].min ? lastWindowEndAtTimestamp - lastWindowEndAtTimestamp % windowDurationMs : lastWindowEndAtTimestamp;
9713
+ const requiredFutureWindowsCount = Math.floor((includeFutureWindowsUntil - futureWindowsStartAt) / windowDurationMs);
9714
+ const { windows: futureTimeWindows, endAtTimestamp } = (0, times_1.generateTimeWindows)(futureWindowsStartAt, windowDurationMs, requiredFutureWindowsCount, void 0, false);
9715
+ const futureWindows = futureTimeWindows.map((x) => {
9716
+ const isInShift = shiftUtils.isTimeInShifts({
9717
+ time: x.windowStartAtTimestamp,
9718
+ shifts: station.shifts,
9719
+ timezone: station.timezone
9720
+ });
9721
+ const totalMs = x.windowEndAtTimestamp - x.windowStartAtTimestamp;
9722
+ return {
9723
+ accountId: station.accountId,
9724
+ stationCode: station.code,
9725
+ windowStartAt: x.windowStartAt,
9726
+ windowStartAtTimestamp: x.windowStartAtTimestamp,
9727
+ windowEndAt: x.windowEndAt,
9728
+ windowEndAtTimestamp: x.windowEndAtTimestamp,
9729
+ totalMs,
9730
+ shiftMs: isInShift ? totalMs : 0,
9731
+ isAlive: false,
9732
+ isFuture: true
9733
+ };
9734
+ });
9735
+ const futureWindowViewModels = (0, station_window_1.toStationWindowViewModel)((0, schedules_1.enrichStationWindowsWithSchedules)(station, futureWindows, schedules || [], endAtTimestamp), manifest).map((sw) => ({ ...sw, isFuture: true }));
9736
+ aggregatedWindows = aggregatedWindows.concat(futureWindowViewModels);
9737
+ }
9738
+ return aggregatedWindows;
9739
+ }
9740
+ async function aggregateStationWindowsBySkuCode(aggregateWindowInMinutes, stationWindows) {
9741
+ const skus = Array.from(new Set(stationWindows.flatMap((x) => x.skuCodes || []).filter((x) => !!x)));
9742
+ const windows = stationWindows.filter((x) => x.skuCodes && x.skuCodes.length > 0).reduce((prev, currentWindow) => {
9743
+ const skuCode = currentWindow.skuCodes?.join("-");
9744
+ const key = skuCode + currentWindow.windowStartAt;
9745
+ if (!prev[key]) {
9746
+ prev[key] = {
9747
+ skuCode,
9748
+ ...currentWindow
9749
+ };
9750
+ } else {
9751
+ const w = combineStationWindows([prev[key], currentWindow], false, true);
9752
+ w.totalMs = w.windowEndAtTimestamp - w.windowStartAtTimestamp;
9753
+ prev[key] = { ...w, skuCode };
9754
+ }
9755
+ return prev;
9756
+ }, {});
9757
+ const windowsBySku = utils.groupBy(Object.values(windows), "skuCode");
9758
+ if (aggregateWindowInMinutes === 1) {
9759
+ return skus.map((code) => {
9760
+ const skuWindows = windowsBySku.get(code) ?? [];
9761
+ const skuNames = skuWindows.find((s) => s.skuNames?.length)?.skuNames;
9762
+ return {
9763
+ skuCode: code,
9764
+ skuName: skuNames?.[0] || "",
9765
+ windows: windowsBySku.get(code) ?? []
9766
+ };
9767
+ });
9768
+ }
9769
+ const results = [];
9770
+ windowsBySku.forEach((values, skuCode) => {
9771
+ const skuNames = values.find((s) => s.skuNames?.length)?.skuNames;
9772
+ const aggregatedWindows = {
9773
+ skuCode,
9774
+ skuName: skuNames?.[0] || "",
9775
+ windows: []
9776
+ };
9777
+ const batch = [];
9778
+ for (let i = 0; i < values.length; i++) {
9779
+ batch.push(values[i]);
9780
+ if ((i + 1) % aggregateWindowInMinutes === 0 || i + 1 === values.length) {
9781
+ aggregatedWindows.windows.push(combineStationWindows(batch, false, true));
9782
+ batch.length = 0;
9783
+ }
9784
+ }
9785
+ results.push(aggregatedWindows);
9786
+ });
9787
+ return results;
9788
+ }
9789
+ function extractDowntimesFromStationWindows(windows, now) {
9790
+ const isOngoingThreshold = (0, moment_timezone_1.default)(now).startOf("minute").add(-1, "minute").valueOf();
9791
+ const downtimes = {};
9792
+ let currentDowntimeStartTime = 0;
9793
+ let currentDowntimeId = void 0;
9794
+ let currentDowntimeFirstWindow = void 0;
9795
+ let accumulatedEnergyKwh = 0;
9796
+ let accumulatedEnergyCost = 0;
9797
+ let accumulatedLostProductionCost = 0;
9798
+ let accumulatedLostProductionQuantity = 0;
9799
+ for (let i = 0; i < windows.length; i++) {
9800
+ const window2 = windows[i];
9801
+ if (window2.totalMs > 6e4) {
9802
+ throw Error("extractDowntimesFromStationWindows only works on non-aggregated station windows.");
9803
+ }
9804
+ const downtimeId = window2.downtimeIds?.join("") || "";
9805
+ const isLastWindow = i === windows.length - 1;
9806
+ const isDowntime = window2.downtimeMs != null && window2.downtimeMs > 0;
9807
+ const isContinousDowntime = currentDowntimeStartTime > 0 && currentDowntimeId === downtimeId;
9808
+ const isOngoing = window2.windowEndAtTimestamp >= isOngoingThreshold;
9809
+ if (isDowntime && isContinousDowntime && !isLastWindow) {
9810
+ accumulatedEnergyKwh += window2.electricalKwh ?? 0;
9811
+ accumulatedEnergyCost += window2.electricalCost ?? 0;
9812
+ accumulatedLostProductionCost += window2.lostProductionCostDowntime ?? 0;
9813
+ accumulatedLostProductionQuantity += window2.productionIdealCount ?? 0;
9814
+ continue;
9815
+ }
9816
+ if (currentDowntimeStartTime > 0) {
9817
+ const from = currentDowntimeStartTime;
9818
+ const to = window2.windowStartAtTimestamp;
9819
+ if (currentDowntimeId != null) {
9820
+ downtimes[currentDowntimeStartTime] = {
9821
+ id: currentDowntimeId,
9822
+ type: enums_1.DowntimeType.Unknown,
9823
+ stationCode: currentDowntimeFirstWindow?.stationCode || "",
9824
+ stationName: currentDowntimeFirstWindow?.stationName,
9825
+ skuCode: currentDowntimeFirstWindow?.skuCodes?.join(","),
9826
+ skuName: currentDowntimeFirstWindow?.skuNames?.join(","),
9827
+ scheduleId: currentDowntimeFirstWindow?.scheduleIds?.at(0),
9828
+ workOrderReference: currentDowntimeFirstWindow?.workOrderReferences?.join(","),
9829
+ range: (0, times_1.timestampsToTimeRange)({ from, to }),
9830
+ reasonCode: currentDowntimeFirstWindow?.downtimeReasonCodes?.at(0),
9831
+ reasonBreadcrumb: [],
9832
+ isOngoing,
9833
+ energyKwh: accumulatedEnergyKwh || void 0,
9834
+ energyCost: accumulatedEnergyCost || void 0,
9835
+ lostProductionCost: accumulatedLostProductionCost || void 0,
9836
+ lostProductionQuantity: accumulatedLostProductionQuantity || void 0
9837
+ };
9838
+ }
9839
+ currentDowntimeStartTime = 0;
9840
+ currentDowntimeId = void 0;
9841
+ currentDowntimeFirstWindow = void 0;
9842
+ accumulatedEnergyKwh = 0;
9843
+ accumulatedEnergyCost = 0;
9844
+ accumulatedLostProductionCost = 0;
9845
+ accumulatedLostProductionQuantity = 0;
9846
+ }
9847
+ if (isDowntime) {
9848
+ currentDowntimeStartTime = window2.windowStartAtTimestamp;
9849
+ currentDowntimeId = downtimeId;
9850
+ currentDowntimeFirstWindow = window2;
9851
+ accumulatedEnergyKwh = window2.electricalKwh ?? 0;
9852
+ accumulatedEnergyCost = window2.electricalCost ?? 0;
9853
+ accumulatedLostProductionCost = window2.lostProductionCostDowntime ?? 0;
9854
+ accumulatedLostProductionQuantity = window2.productionIdealCount ?? 0;
9855
+ }
9856
+ }
9857
+ return Object.values(downtimes);
9858
+ }
9859
+ function getReliabilityData(windows) {
9860
+ const periods = [];
9861
+ let currentPeriod = { totalTime: 0, type: "start" };
9862
+ for (const window2 of windows) {
9863
+ const issueTime = window2.downtimeMs || 0;
9864
+ const runningTime = window2.scheduledProductionMs || 0;
9865
+ if (issueTime > 0) {
9866
+ if (currentPeriod.type === "running") {
9867
+ periods.push(currentPeriod);
9868
+ currentPeriod = { totalTime: 0, type: "stopped" };
9869
+ }
9870
+ currentPeriod.type = "stopped";
9871
+ currentPeriod.totalTime += issueTime;
9872
+ } else if (runningTime > 0) {
9873
+ if (currentPeriod.type === "stopped") {
9874
+ periods.push(currentPeriod);
9875
+ currentPeriod = { totalTime: 0, type: "running" };
9876
+ }
9877
+ currentPeriod.type = "running";
9878
+ currentPeriod.totalTime += runningTime;
9879
+ }
9880
+ }
9881
+ periods.push(currentPeriod);
9882
+ const runningsCount = periods.filter((period) => period.type === "running").length;
9883
+ const stopsCount = periods.filter((period) => period.type === "stopped").length;
9884
+ const totalRunningTime = periods.filter((period) => period.type === "running").reduce((a, b) => a + b.totalTime, 0);
9885
+ const totalStoppedTime = periods.filter((period) => period.type === "stopped").reduce((a, b) => a + b.totalTime, 0);
9886
+ return {
9887
+ runningsCount,
9888
+ stopsCount,
9889
+ totalRunningTime,
9890
+ totalStoppedTime
9891
+ };
9892
+ }
9893
+ function calculateReliabilityMetrics(reliabilityData) {
9894
+ if (reliabilityData.stopsCount === 0 || reliabilityData.runningsCount === 0) {
9895
+ return;
9896
+ }
9897
+ return {
9898
+ mtbf: reliabilityData.totalRunningTime / reliabilityData.runningsCount,
9899
+ mttr: reliabilityData.totalStoppedTime / reliabilityData.stopsCount
9900
+ };
9901
+ }
9902
+ function downtimesToStationWindows(downtimes, stations, nowOverride) {
9903
+ const now = nowOverride == null ? (0, moment_timezone_1.default)().valueOf() : nowOverride;
9904
+ const stationWindowsMap = downtimes.reduce((a, downtime) => {
9905
+ const stationIdleCostPerMinute = stations.find((s) => s.code === downtime.stationCode)?.idleCostPerMinute || 0;
9906
+ const startAt = (0, moment_timezone_1.default)(downtime.startAt).valueOf();
9907
+ const endAt = downtime.endAt == null ? now : (0, moment_timezone_1.default)(downtime.endAt).valueOf();
9908
+ let windowStartAt = startAt - startAt % WINDOW_DURATION;
9909
+ let windowsForThisDowntime = 0;
9910
+ while (windowStartAt + WINDOW_DURATION <= endAt && windowsForThisDowntime < MAX_WINDOWS_PER_DOWNTIME) {
9911
+ windowsForThisDowntime++;
9912
+ const windowEndAt = windowStartAt + WINDOW_DURATION;
9913
+ const timestamp = windowStartAt + "_" + windowEndAt + "_" + downtime.stationCode;
9914
+ const stationWindow = a.get(timestamp) || {
9915
+ accountId: downtime.accountId,
9916
+ stationCode: downtime.stationCode,
9917
+ windowStartAt: (0, moment_timezone_1.default)(windowStartAt).toISOString(),
9918
+ windowEndAt: (0, moment_timezone_1.default)(windowEndAt).toISOString(),
9919
+ windowStartAtTimestamp: windowStartAt,
9920
+ windowEndAtTimestamp: windowEndAt,
9921
+ totalMs: WINDOW_DURATION,
9922
+ downtimeMs: 0
9923
+ };
9924
+ if (downtime.excludedAt != null) {
9925
+ const newStationWindow = {
9926
+ ...stationWindow,
9927
+ downtimeMs: 0,
9928
+ downtimeId: void 0,
9929
+ downtimeReasonCode: void 0,
9930
+ downtimeSince: void 0,
9931
+ lostProductionCostDowntime: 0
9932
+ };
9933
+ a.set(timestamp, newStationWindow);
9934
+ } else {
9935
+ const issueTime = Math.min(windowEndAt, endAt) - Math.max(startAt, windowStartAt);
9936
+ const idleCost = downtime.skuValue ?? stationIdleCostPerMinute;
9937
+ const lostProductionCostDowntime = idleCost * (issueTime / time_1.TimeIntervals["1m"].ms);
9938
+ const newStationWindow = {
9939
+ ...stationWindow,
9940
+ downtimeMs: Math.max(stationWindow.downtimeMs, issueTime),
9941
+ downtimeId: downtime.id,
9942
+ downtimeReasonCode: downtime.reasonCode,
9943
+ downtimeSince: downtime.startAt,
9944
+ lostProductionCostDowntime
9945
+ };
9946
+ if (newStationWindow.downtimeMs > 0) {
9947
+ newStationWindow.productionTargetCount = 0;
9948
+ }
9949
+ a.set(timestamp, newStationWindow);
9950
+ }
9951
+ windowStartAt = windowEndAt;
9952
+ }
9953
+ return a;
9954
+ }, /* @__PURE__ */ new Map());
9955
+ return [...stationWindowsMap.values()];
9956
+ }
9957
+ function filterStationWindowsBySkuCode(windows, skuCodes) {
9958
+ if (!skuCodes?.length) {
9959
+ return [...windows];
9960
+ }
9961
+ return windows.map((s) => {
9962
+ const hasSkuCode = !!(s.skuCodes?.length && skuCodes.some((code) => s.skuCodes?.includes(code)));
9963
+ return {
9964
+ ...s,
9965
+ productionGoodCount: hasSkuCode ? s.productionGoodCount : 0,
9966
+ productionBadCount: hasSkuCode ? s.productionBadCount : 0,
9967
+ productionIdealCount: hasSkuCode ? s.productionIdealCount : 0,
9968
+ productionTargetCount: hasSkuCode ? s.productionTargetCount : 0
9969
+ };
9970
+ });
9971
+ }
9972
+ function filterStationWindowsByShiftNames(windows, shiftNames) {
9973
+ if (!shiftNames?.length) {
9974
+ return [...windows];
9975
+ }
9976
+ return windows.map((s) => {
9977
+ const hasShiftName = !!(s.shiftNames?.length && shiftNames.some((name) => s.shiftNames?.includes(name)));
9978
+ if (hasShiftName) {
9979
+ return s;
9980
+ }
9981
+ return {
9982
+ ...s,
9983
+ shiftMs: 0,
9984
+ shiftNames: void 0,
9985
+ downtimeMs: void 0,
9986
+ downtimeIds: void 0,
9987
+ downtimeReasonCodes: void 0,
9988
+ downtimeSince: void 0,
9989
+ productionGoodCount: 0,
9990
+ productionBadCount: 0,
9991
+ productionIdealCount: 0,
9992
+ productionTargetCount: 0,
9993
+ productionTotalCount: 0,
9994
+ productionGoodValue: 0,
9995
+ productionBadValue: 0,
9996
+ productionMs: 0,
9997
+ productionRatePerHour: 0,
9998
+ lostProductionCostDowntime: 0,
9999
+ lostProductionCostQuality: 0,
10000
+ lostProductionCostNonProduction: 0,
10001
+ lostProductionCostSpeed: 0,
10002
+ lostProductionCostTotal: 0,
10003
+ speed: 0,
10004
+ electricalKwh: 0,
10005
+ electricalKwAvg: 0,
10006
+ electricalAmpsAvg: 0,
10007
+ electricalCo2: 0,
10008
+ electricalCost: 0,
10009
+ electricalHzAvg: 0,
10010
+ electricalPfAvg: 0,
10011
+ electricalVoltsAvg: 0
10012
+ };
10013
+ });
10014
+ }
10015
+ function getCycleTimeFromSku(sku) {
10016
+ if (sku == null) {
10017
+ return void 0;
10018
+ }
10019
+ if (sku.cycleTime != null) {
10020
+ return sku.cycleTime;
10021
+ }
10022
+ const partsPerCycle = sku.partsPerCycle || 1;
10023
+ if (sku.unitsPerMinute != null) {
10024
+ return time_1.TimeIntervals["1m"].ms / sku.unitsPerMinute * partsPerCycle;
10025
+ }
10026
+ if (sku.unitsPerHour != null) {
10027
+ return time_1.TimeIntervals["1h"].ms / sku.unitsPerHour * partsPerCycle;
10028
+ }
10029
+ return void 0;
10030
+ }
10031
+ function getPerformanceValueFromSkuCycleTime(mode, cycleTime) {
10032
+ if (!cycleTime) {
10033
+ return void 0;
10034
+ }
10035
+ if (mode === enums_1.PERFORMANCE_MODE_TYPE.cycleTime) {
10036
+ return cycleTime;
10037
+ }
10038
+ if (mode === enums_1.PERFORMANCE_MODE_TYPE.unitsPerHour) {
10039
+ return time_1.TimeIntervals["1h"].ms / cycleTime;
10040
+ }
10041
+ if (mode === enums_1.PERFORMANCE_MODE_TYPE.unitsPerMinute) {
10042
+ return time_1.TimeIntervals["1m"].ms / cycleTime;
10043
+ }
10044
+ return void 0;
10045
+ }
10046
+ function getPerformanceModeFromSku(sku) {
10047
+ return sku?.cycleTime ? enums_1.PERFORMANCE_MODE_TYPE.cycleTime : sku?.unitsPerHour ? enums_1.PERFORMANCE_MODE_TYPE.unitsPerHour : sku?.unitsPerMinute ? enums_1.PERFORMANCE_MODE_TYPE.unitsPerMinute : sku?.lineSpeedTarget ? enums_1.PERFORMANCE_MODE_TYPE.lineSpeed : enums_1.PERFORMANCE_MODE_TYPE.none;
10048
+ }
10049
+ function add(a, b) {
10050
+ if (a == void 0 && b == void 0) {
10051
+ return void 0;
10052
+ }
10053
+ return (a || 0) + (b || 0);
10054
+ }
10055
+ function divide(a, b, fractionDigits) {
10056
+ if (a == void 0 || !b) {
10057
+ return void 0;
10058
+ }
10059
+ return Number((a / b).toFixed(fractionDigits));
10060
+ }
10061
+ exports2.AggregatedProduction = zod_1.default.object({
10062
+ id: zod_1.default.string(),
10063
+ accountId: zod_1.default.string(),
10064
+ workOrderReference: zod_1.default.string(),
10065
+ skuCode: zod_1.default.string(),
10066
+ skuName: zod_1.default.string(),
10067
+ quantityGood: zod_1.default.number(),
10068
+ quantityBad: zod_1.default.number(),
10069
+ quantityTotal: zod_1.default.number(),
10070
+ electricalKwh: zod_1.default.number(),
10071
+ electricalCost: zod_1.default.number()
10072
+ });
10073
+ function aggregateProductionFromStationWindows(accountId, stationWindows) {
10074
+ return Object.values(stationWindows.reduce((a, b) => {
10075
+ if (b.workOrderReferences == null || b.workOrderReferences.length === 0) {
10076
+ return a;
10077
+ }
10078
+ const id = b.workOrderReferences?.join(",") + "_" + b.skuCodes?.join(",");
10079
+ if (a[id] == null) {
10080
+ a[id] = {
10081
+ id,
10082
+ accountId,
10083
+ workOrderReference: b.workOrderReferences?.join(",") || "",
10084
+ skuCode: b.skuCodes?.join(",") || "",
10085
+ skuName: b.skuNames?.join(",") || "",
10086
+ quantityGood: 0,
10087
+ quantityBad: 0,
10088
+ quantityTotal: 0,
10089
+ electricalKwh: 0,
10090
+ electricalCost: 0
10091
+ };
10092
+ }
10093
+ a[id].quantityGood += b.productionGoodCount || 0;
10094
+ a[id].quantityBad += b.productionBadCount || 0;
10095
+ a[id].electricalKwh += b.electricalKwh || 0;
10096
+ a[id].electricalCost += b.electricalCost || 0;
10097
+ return a;
10098
+ }, {})).map((p) => {
10099
+ const quantityTotal = utils.roundTo(p.quantityGood + p.quantityBad, 2);
10100
+ const quantityGood = utils.roundTo(p.quantityGood, 2);
10101
+ const quantityBad = utils.roundTo(p.quantityBad, 2);
10102
+ return { ...p, quantityTotal, quantityGood, quantityBad };
10103
+ });
10104
+ }
10105
+ function aggregateProductionBySkuFromStationWindows(accountId, stationWindows) {
10106
+ return Object.values(stationWindows.reduce((a, b) => {
10107
+ const skuCode = b.skuCodes?.join(",") || "SKU NOT KNOWN";
10108
+ const id = skuCode;
10109
+ if (a[id] == null) {
10110
+ a[id] = {
10111
+ id,
10112
+ accountId,
10113
+ workOrderReference: "",
10114
+ skuCode,
10115
+ skuName: b.skuNames?.join(",") || "",
10116
+ quantityGood: 0,
10117
+ quantityBad: 0,
10118
+ quantityTotal: 0,
10119
+ electricalKwh: 0,
10120
+ electricalCost: 0
10121
+ };
10122
+ }
10123
+ a[id].quantityGood += b.productionGoodCount || 0;
10124
+ a[id].quantityBad += b.productionBadCount || 0;
10125
+ a[id].electricalKwh += b.electricalKwh || 0;
10126
+ a[id].electricalCost += b.electricalCost || 0;
10127
+ return a;
10128
+ }, {})).map((p) => {
10129
+ const quantityTotal = utils.roundTo(p.quantityGood + p.quantityBad, 2);
10130
+ const quantityGood = utils.roundTo(p.quantityGood, 2);
10131
+ const quantityBad = utils.roundTo(p.quantityBad, 2);
10132
+ return { ...p, quantityTotal, quantityGood, quantityBad };
10133
+ });
10134
+ }
10135
+ function isSignalNonProductionWindow(window2) {
10136
+ return (window2.scheduledNonProductionMs || 0) > 0 && !!window2.nonProductionReasonCode && window2.scheduleId == null;
10137
+ }
10138
+ function signalNonProductionReasonCode(window2) {
10139
+ const nonProductionReasonCode = window2.nonProductionReasonCodes?.[0];
10140
+ return isSignalNonProductionWindow({
10141
+ scheduledNonProductionMs: window2.scheduledNonProductionMs,
10142
+ nonProductionReasonCode,
10143
+ scheduleId: window2.scheduleIds?.[0]
10144
+ }) ? nonProductionReasonCode : void 0;
10145
+ }
10146
+ }
10147
+ });
10148
+
8942
10149
  // ../../packages/common/build/view-models/station.js
8943
10150
  var require_station4 = __commonJS({
8944
10151
  "../../packages/common/build/view-models/station.js"(exports2) {
8945
10152
  "use strict";
8946
10153
  Object.defineProperty(exports2, "__esModule", { value: true });
8947
- exports2.StationWithSchedulesViewModel = exports2.StationViewModel = exports2.StationStates = exports2.StationState = void 0;
10154
+ exports2.StationWithSchedulesViewModel = exports2.StationViewModel = exports2.StationStates = exports2.SIGNAL_NON_PRODUCTION_LABEL = exports2.StationState = void 0;
8948
10155
  exports2.getStationState = getStationState;
8949
10156
  var zod_1 = require("zod");
8950
10157
  var schemas_1 = require_schemas();
@@ -8954,12 +10161,14 @@ var require_station4 = __commonJS({
8954
10161
  var schedule_1 = require_schedule3();
8955
10162
  var note_1 = require_note3();
8956
10163
  var task_1 = require_task();
10164
+ var station_windows_1 = require_station_windows();
8957
10165
  exports2.StationState = zod_1.z.object({
8958
10166
  code: zod_1.z.string(),
8959
10167
  label: zod_1.z.string(),
8960
10168
  order: zod_1.z.number(),
8961
10169
  color: zod_1.z.string()
8962
10170
  });
10171
+ exports2.SIGNAL_NON_PRODUCTION_LABEL = "Non-Production Signal";
8963
10172
  exports2.StationStates = {
8964
10173
  unknown: { code: "unknown", label: "Unknown", order: 7, color: enums_1.RagStatus.NA },
8965
10174
  out_of_shift: { code: "out_of_shift", label: "Out of Shift", order: 6, color: enums_1.RagStatus.NA },
@@ -9032,6 +10241,11 @@ var require_station4 = __commonJS({
9032
10241
  state = exports2.StationStates.stopped;
9033
10242
  } else if (station.activeSchedule?.nonProductionReasonCode != null) {
9034
10243
  state = exports2.StationStates.non_production;
10244
+ } else if ((0, station_windows_1.signalNonProductionReasonCode)(station.lastStationWindow) != null) {
10245
+ state = {
10246
+ ...exports2.StationStates.non_production,
10247
+ label: exports2.SIGNAL_NON_PRODUCTION_LABEL
10248
+ };
9035
10249
  } else if (station.activeSchedule?.skuCode != null) {
9036
10250
  state = exports2.StationStates.running;
9037
10251
  } else {
@@ -9142,97 +10356,6 @@ var require_plant3 = __commonJS({
9142
10356
  }
9143
10357
  });
9144
10358
 
9145
- // ../../packages/common/build/configVars.js
9146
- var require_configVars = __commonJS({
9147
- "../../packages/common/build/configVars.js"(exports2) {
9148
- "use strict";
9149
- Object.defineProperty(exports2, "__esModule", { value: true });
9150
- exports2.REDSHIFT_USERNAME = exports2.REDSHIFT_PORT = exports2.REDSHIFT_HOST_PUBLIC = exports2.REDSHIFT_HOST = exports2.SES_CONFIG = exports2.RATE_LIMIT_COUNT = exports2.RATE_LIMIT_WINDOW = exports2.MS_LOGIN_CALLBACK = exports2.MS_LOGIN_CLIENT_SECRET = exports2.MS_LOGIN_CLIENT_ID = exports2.ENABLE_DEMO_MODE = exports2.MQTT_PORT = exports2.MQTT_HOST = exports2.DEFAULT_ACCOUNT_ID = exports2.AUTH_BYPASS_DOMAIN = exports2.KNEX_SEEDS_DIR = exports2.QUEUE_LENGTH = exports2.LOGIN_COOKIE_SECRET = exports2.ENABLE_MS_TEAM_ALERT = exports2.ALERT_SLACK_TOKEN = exports2.ALERT_SLACK_CHANNEL = exports2.ENABLE_SLACK_ALERT = exports2.JWT_SECRET = exports2.AWS_BACKUP_S3_BUCKET = exports2.AWS_REGION = exports2.AWS_SECRET_ACCESS_KEY = exports2.AWS_ACCESS_KEY_ID = exports2.LOGIN_CALL_BACK_URL = exports2.TO_EMAIL_OVERRIDE = exports2.BCC_EMAIL = exports2.FROM_EMAIL = exports2.INFLUX_WRITE_PROTECTED = exports2.INFLUX_BUCKET = exports2.INFLUX_ORG = exports2.INFLUX_TOKEN = exports2.INFLUX_HOST_URL = exports2.PG_DB = exports2.PG_PASS = exports2.PG_USER = exports2.PG_HOST = exports2.BUSROOT_MQTT_FORWARDER_TOPIC = exports2.BUSROOT_MQTT_FORWARDER_PASS = exports2.BUSROOT_MQTT_FORWARDER_USER = exports2.BUSROOT_MQTT_FORWARDER_HOST = exports2.ADMIN_API_KEY = exports2.ADMIN_PASSWORD = exports2.ADMIN_USERNAME = exports2.DOMAIN_NAME = exports2.APP_ENV = exports2.NODE_ENV = void 0;
9151
- exports2.NON_PRODUCTION_SIGNAL_TIMEOUT_MS = exports2.CACHE_BUILDER_ERROR_BACKOFF_MS = exports2.CACHE_BUILDER_ACCOUNT_BUDGET_MS = exports2.CACHE_BUILDER_IDLE_SLEEP_MS = exports2.CACHE_WARMING_LOOKBACK_DAYS = exports2.CACHE_WARMING_THROTTLE_MS = exports2.CACHE_WARMING_STAGGER_MAX_MS = exports2.CACHE_WARMING_CRON = exports2.CACHE_WARMING_ENABLED = exports2.STATION_FANOUT_PAUSE_MS = exports2.STATION_FANOUT_BATCH_SIZE = exports2.DAU_BUFFER_MAX_MESSAGE_BYTES = exports2.DAU_BUFFER_MAX_AGE_MS = exports2.DAU_BUFFER_SIZE = exports2.ENABLE_MQTT_EVENTS = exports2.ANTHROPIC_API_KEY = exports2.REDSHIFT_DB = exports2.REDSHIFT_PASSWORD = void 0;
9152
- function parsePositiveIntEnv(value, fallback) {
9153
- const parsed = Number(value);
9154
- return Number.isFinite(parsed) && parsed >= 1 ? Math.floor(parsed) : fallback;
9155
- }
9156
- function parseNonNegativeIntEnv(value, fallback) {
9157
- const parsed = Number(value);
9158
- return Number.isFinite(parsed) && parsed >= 0 ? Math.floor(parsed) : fallback;
9159
- }
9160
- exports2.NODE_ENV = process.env.NODE_ENV;
9161
- exports2.APP_ENV = process.env.APP_ENV || exports2.NODE_ENV;
9162
- exports2.DOMAIN_NAME = process.env.DOMAIN_NAME || "undefined";
9163
- exports2.ADMIN_USERNAME = process.env.ADMIN_USERNAME || "admin";
9164
- exports2.ADMIN_PASSWORD = process.env.ADMIN_PASSWORD;
9165
- exports2.ADMIN_API_KEY = process.env.ADMIN_API_KEY;
9166
- exports2.BUSROOT_MQTT_FORWARDER_HOST = process.env.BUSROOT_MQTT_FORWARDER_HOST;
9167
- exports2.BUSROOT_MQTT_FORWARDER_USER = process.env.BUSROOT_MQTT_FORWARDER_USER;
9168
- exports2.BUSROOT_MQTT_FORWARDER_PASS = process.env.BUSROOT_MQTT_FORWARDER_PASS;
9169
- exports2.BUSROOT_MQTT_FORWARDER_TOPIC = process.env.BUSROOT_MQTT_FORWARDER_TOPIC || "#";
9170
- exports2.PG_HOST = process.env.PG_HOST || exports2.DOMAIN_NAME;
9171
- exports2.PG_USER = process.env.PG_USER || "postgres";
9172
- exports2.PG_PASS = process.env.PG_PASS || "pHrJvh4ICt2Fh7Qu";
9173
- exports2.PG_DB = process.env.PG_DB || "postgres";
9174
- exports2.INFLUX_HOST_URL = process.env.INFLUX_HOST_URL || `http://${exports2.DOMAIN_NAME}:8086`;
9175
- exports2.INFLUX_TOKEN = process.env.INFLUX_TOKEN;
9176
- exports2.INFLUX_ORG = process.env.INFLUX_ORG || "";
9177
- exports2.INFLUX_BUCKET = process.env.INFLUX_BUCKET || "default";
9178
- exports2.INFLUX_WRITE_PROTECTED = process.env.INFLUX_WRITE_PROTECTED === "true";
9179
- exports2.FROM_EMAIL = process.env.FROM_EMAIL || "busroot@output.industries";
9180
- exports2.BCC_EMAIL = process.env.BCC_EMAIL;
9181
- exports2.TO_EMAIL_OVERRIDE = process.env.TO_EMAIL_OVERRIDE;
9182
- exports2.LOGIN_CALL_BACK_URL = process.env.LOGIN_CALL_BACK_URL || `https://${exports2.DOMAIN_NAME}`;
9183
- exports2.AWS_ACCESS_KEY_ID = process.env.AWS_ACCESS_KEY_ID || "";
9184
- exports2.AWS_SECRET_ACCESS_KEY = process.env.AWS_SECRET_ACCESS_KEY || "";
9185
- exports2.AWS_REGION = process.env.AWS_REGION || "eu-west-2";
9186
- exports2.AWS_BACKUP_S3_BUCKET = process.env.AWS_BACKUP_S3_BUCKET;
9187
- exports2.JWT_SECRET = process.env.JWT_SECRET || "greentyre";
9188
- exports2.ENABLE_SLACK_ALERT = (process.env.ENABLE_SLACK_ALERT || "").toLowerCase() === "true";
9189
- exports2.ALERT_SLACK_CHANNEL = process.env.ALERT_SLACK_CHANNEL || "C03164SPJSH";
9190
- exports2.ALERT_SLACK_TOKEN = process.env.ALERT_SLACK_TOKEN;
9191
- exports2.ENABLE_MS_TEAM_ALERT = (process.env.ENABLE_MS_TEAM_ALERT || "").toLowerCase() === "true";
9192
- exports2.LOGIN_COOKIE_SECRET = process.env.LOGIN_COOKIE_SECRET || "greentyre";
9193
- exports2.QUEUE_LENGTH = parseInt(process.env["BUSROOT_QUEUE_LENGTH"] || "") || 200;
9194
- exports2.KNEX_SEEDS_DIR = process.env.KNEX_SEEDS_DIR;
9195
- exports2.AUTH_BYPASS_DOMAIN = process.env.AUTH_BYPASS_DOMAIN;
9196
- exports2.DEFAULT_ACCOUNT_ID = process.env.DEFAULT_ACCOUNT_ID || "account_0000000000000000000";
9197
- exports2.MQTT_HOST = process.env.MQTT_HOST || exports2.DOMAIN_NAME;
9198
- exports2.MQTT_PORT = parseInt(process.env.MQTT_PORT || "") || 1883;
9199
- exports2.ENABLE_DEMO_MODE = process.env.ENABLE_DEMO_MODE === "true";
9200
- exports2.MS_LOGIN_CLIENT_ID = process.env.MS_LOGIN_CLIENT_ID;
9201
- exports2.MS_LOGIN_CLIENT_SECRET = process.env.MS_LOGIN_CLIENT_SECRET;
9202
- exports2.MS_LOGIN_CALLBACK = exports2.APP_ENV === "development" ? "http://localhost:3000" : `https://${exports2.DOMAIN_NAME}`;
9203
- exports2.RATE_LIMIT_WINDOW = parseInt(process.env.RATE_LIMIT_WINDOW || "60000");
9204
- exports2.RATE_LIMIT_COUNT = parseInt(process.env.RATE_LIMIT_COUNT || "10");
9205
- exports2.SES_CONFIG = {
9206
- accessKeyId: exports2.AWS_ACCESS_KEY_ID || "",
9207
- secretAccessKey: exports2.AWS_SECRET_ACCESS_KEY || "",
9208
- region: exports2.AWS_REGION,
9209
- apiVersion: "2010-12-01"
9210
- };
9211
- exports2.REDSHIFT_HOST = process.env.REDSHIFT_HOST;
9212
- exports2.REDSHIFT_HOST_PUBLIC = process.env.REDSHIFT_HOST_PUBLIC || "Not Set";
9213
- exports2.REDSHIFT_PORT = Number(process.env.REDSHIFT_PORT || 5439);
9214
- exports2.REDSHIFT_USERNAME = process.env.REDSHIFT_USERNAME || "admin";
9215
- exports2.REDSHIFT_PASSWORD = process.env.REDSHIFT_PASSWORD;
9216
- exports2.REDSHIFT_DB = process.env.REDSHIFT_DB || "dev";
9217
- exports2.ANTHROPIC_API_KEY = process.env.ANTHROPIC_API_KEY;
9218
- exports2.ENABLE_MQTT_EVENTS = process.env.ENABLE_MQTT_EVENTS === "true" || false;
9219
- exports2.DAU_BUFFER_SIZE = parseInt(process.env.DAU_BUFFER_SIZE || "") || 5;
9220
- exports2.DAU_BUFFER_MAX_AGE_MS = parseInt(process.env.DAU_BUFFER_MAX_AGE_MS || "") || 30 * 24 * 60 * 60 * 1e3;
9221
- exports2.DAU_BUFFER_MAX_MESSAGE_BYTES = parseInt(process.env.DAU_BUFFER_MAX_MESSAGE_BYTES || "") || 8192;
9222
- exports2.STATION_FANOUT_BATCH_SIZE = parsePositiveIntEnv(process.env.STATION_WINDOW_BATCH_SIZE, 3);
9223
- exports2.STATION_FANOUT_PAUSE_MS = parseNonNegativeIntEnv(process.env.STATION_WINDOW_BATCH_PAUSE_MS, 500);
9224
- exports2.CACHE_WARMING_ENABLED = process.env.CACHE_WARMING_ENABLED === "true";
9225
- exports2.CACHE_WARMING_CRON = process.env.CACHE_WARMING_CRON || "0 2 * * *";
9226
- exports2.CACHE_WARMING_STAGGER_MAX_MS = parseNonNegativeIntEnv(process.env.CACHE_WARMING_STAGGER_MAX_MS, 30 * 60 * 1e3);
9227
- exports2.CACHE_WARMING_THROTTLE_MS = parseNonNegativeIntEnv(process.env.CACHE_WARMING_THROTTLE_MS, 250);
9228
- exports2.CACHE_WARMING_LOOKBACK_DAYS = parsePositiveIntEnv(process.env.CACHE_WARMING_LOOKBACK_DAYS, 730);
9229
- exports2.CACHE_BUILDER_IDLE_SLEEP_MS = parseNonNegativeIntEnv(process.env.CACHE_BUILDER_IDLE_SLEEP_MS, 2e3);
9230
- exports2.CACHE_BUILDER_ACCOUNT_BUDGET_MS = parsePositiveIntEnv(process.env.CACHE_BUILDER_ACCOUNT_BUDGET_MS, 6e4);
9231
- exports2.CACHE_BUILDER_ERROR_BACKOFF_MS = parseNonNegativeIntEnv(process.env.CACHE_BUILDER_ERROR_BACKOFF_MS, 5e3);
9232
- exports2.NON_PRODUCTION_SIGNAL_TIMEOUT_MS = parseNonNegativeIntEnv(process.env.NON_PRODUCTION_SIGNAL_TIMEOUT_MS, 0);
9233
- }
9234
- });
9235
-
9236
10359
  // ../../packages/common/build/utils/manifest-helpers.js
9237
10360
  var require_manifest_helpers = __commonJS({
9238
10361
  "../../packages/common/build/utils/manifest-helpers.js"(exports2) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "busroot-sdk",
3
- "version": "0.0.8-dev.2774837447",
3
+ "version": "0.0.8-dev.2778251899",
4
4
  "description": "An SDK for accessing Busroot from output.industries",
5
5
  "homepage": "https://www.output.industries",
6
6
  "main": "./build/index.js",