@mxpicture/tesla-superchargers-mate 0.1.6 → 0.1.8

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.
@@ -1,7 +1,7 @@
1
1
  import { type ChargingProcesses, type ChargingProcessesId, type ChargingProcessesInitializer, type ChargingProcessesMutator, type PicChargingProcessStates, type PicChargingProcessStatesId } from "@mxpicture/tesla-superchargers-generated/public";
2
2
  import { IMateStore } from "./IMateStore.js";
3
3
  import { type SqlTx } from "./db.js";
4
- import type { FailedChargingProcessState, UnpricedChargingProcess } from "../types/chargingProcess.types.js";
4
+ import type { FailedChargingProcessState, UnmatchedInvoiceCharge, UnpricedChargingProcess } from "../types/chargingProcess.types.js";
5
5
  /**
6
6
  * Access to TeslaMate's `charging_processes` table. The helpers here
7
7
  * ({@link ChargingProcessesStore.getUnpricedCharges},
@@ -13,6 +13,7 @@ import type { FailedChargingProcessState, UnpricedChargingProcess } from "../typ
13
13
  */
14
14
  export declare class ChargingProcessesStore extends IMateStore<ChargingProcessesId, ChargingProcesses, ChargingProcessesInitializer, ChargingProcessesMutator> {
15
15
  readonly statesTable: string;
16
+ readonly invoiceStatesTable: string;
16
17
  constructor();
17
18
  getUnpricedCharges(tx?: SqlTx): Promise<UnpricedChargingProcess[]>;
18
19
  updatePrice(processId: ChargingProcessesId, cost: number | null, tx?: SqlTx): Promise<ChargingProcesses>;
@@ -33,8 +34,24 @@ export declare class ChargingProcessesStore extends IMateStore<ChargingProcesses
33
34
  * Best-effort match of a CSV row to a TeslaMate charging_processes.id by
34
35
  * VIN + start time (Supercharger session start vs. logged start can differ
35
36
  * by a couple of minutes). Adjust the tolerance to taste.
37
+ *
38
+ * `start_date` is a naive `timestamp` holding UTC wall time (TeslaMate's
39
+ * convention), so the invoice instant is converted to naive UTC before
40
+ * comparing — a bare `timestamp`-vs-`timestamptz` comparison would shift
41
+ * `start_date` by the session timezone and miss the window on any server
42
+ * not running UTC.
36
43
  */
37
44
  lookupChargingProcessId(vin: string, chargeStart: Date, tx?: SqlTx): Promise<number | null>;
45
+ /**
46
+ * Completed Supercharger charges — a charge whose position lies within the
47
+ * covered radius of a charger-typed slug, same geo-match the pricing uses —
48
+ * that no `pic_invoices` row is matched to, oldest first. With
49
+ * `onlyUnnotified` charges already paged (a stamped
50
+ * `pic_invoice_missing_states` row) are excluded.
51
+ */
52
+ getUnmatchedInvoiceCharges(onlyUnnotified?: boolean, tx?: SqlTx): Promise<UnmatchedInvoiceCharge[]>;
53
+ /** Stamp the missing-invoice notified flag for the given charges (upsert; empty is a no-op). */
54
+ markUnmatchedInvoiceNotified(processIds: ChargingProcessesId[], tx?: SqlTx): Promise<void>;
38
55
  }
39
56
  export declare const chargingProcessesStore: () => ChargingProcessesStore;
40
57
  //# sourceMappingURL=ChargingProcessesStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ChargingProcessesStore.d.ts","sourceRoot":"","sources":["../../src/store/ChargingProcessesStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,4BAA4B,EACjC,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAChC,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAO,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EACV,0BAA0B,EAC1B,uBAAuB,EACxB,MAAM,mCAAmC,CAAC;AAG3C;;;;;;;;GAQG;AACH,qBAAa,sBAAuB,SAAQ,UAAU,CACpD,mBAAmB,EACnB,iBAAiB,EACjB,4BAA4B,EAC5B,wBAAwB,CACzB;IACC,SAAgB,WAAW,EAAE,MAAM,CAAiC;;IAUvD,kBAAkB,CAC7B,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAuBxB,WAAW,CACtB,SAAS,EAAE,mBAAmB,EAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,iBAAiB,CAAC;IAQhB,QAAQ,CACnB,SAAS,EAAE,mBAAmB,EAC9B,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IAO9B,UAAU,CACrB,SAAS,EAAE,mBAAmB,EAC9B,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,IAAI,CAAC;IAIhB;;;;OAIG;IACU,eAAe,CAC1B,SAAS,EAAE,MAAM,EACjB,cAAc,UAAQ,EACtB,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,0BAA0B,EAAE,CAAC;IAWxC,iFAAiF;IACpE,kBAAkB,CAC7B,QAAQ,EAAE,0BAA0B,EAAE,EACtC,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,IAAI,CAAC;IAMhB,kGAAkG;IACrF,cAAc,CAAC,EAAE,GAAE,KAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlD,oBAAoB,CAC/B,SAAS,EAAE,mBAAmB,EAC9B,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,MAAM,CAAC;IAYlB;;;;OAIG;IACU,uBAAuB,CAClC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,IAAI,EACjB,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;CAY1B;AAGD,eAAO,MAAM,sBAAsB,8BACQ,CAAC"}
1
+ {"version":3,"file":"ChargingProcessesStore.d.ts","sourceRoot":"","sources":["../../src/store/ChargingProcessesStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,iBAAiB,EACtB,KAAK,mBAAmB,EACxB,KAAK,4BAA4B,EACjC,KAAK,wBAAwB,EAC7B,KAAK,wBAAwB,EAC7B,KAAK,0BAA0B,EAChC,MAAM,iDAAiD,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAO,KAAK,KAAK,EAAE,MAAM,SAAS,CAAC;AAC1C,OAAO,KAAK,EACV,0BAA0B,EAC1B,sBAAsB,EACtB,uBAAuB,EACxB,MAAM,mCAAmC,CAAC;AAS3C;;;;;;;;GAQG;AACH,qBAAa,sBAAuB,SAAQ,UAAU,CACpD,mBAAmB,EACnB,iBAAiB,EACjB,4BAA4B,EAC5B,wBAAwB,CACzB;IACC,SAAgB,WAAW,EAAE,MAAM,CAAiC;IACpE,SAAgB,kBAAkB,EAAE,MAAM,CAAgC;;IAU7D,kBAAkB,CAC7B,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,uBAAuB,EAAE,CAAC;IAuBxB,WAAW,CACtB,SAAS,EAAE,mBAAmB,EAC9B,IAAI,EAAE,MAAM,GAAG,IAAI,EACnB,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,iBAAiB,CAAC;IAQhB,QAAQ,CACnB,SAAS,EAAE,mBAAmB,EAC9B,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IAO9B,UAAU,CACrB,SAAS,EAAE,mBAAmB,EAC9B,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,IAAI,CAAC;IAIhB;;;;OAIG;IACU,eAAe,CAC1B,SAAS,EAAE,MAAM,EACjB,cAAc,UAAQ,EACtB,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,0BAA0B,EAAE,CAAC;IAWxC,iFAAiF;IACpE,kBAAkB,CAC7B,QAAQ,EAAE,0BAA0B,EAAE,EACtC,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,IAAI,CAAC;IAMhB,kGAAkG;IACrF,cAAc,CAAC,EAAE,GAAE,KAAa,GAAG,OAAO,CAAC,MAAM,CAAC;IAKlD,oBAAoB,CAC/B,SAAS,EAAE,mBAAmB,EAC9B,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,MAAM,CAAC;IAYlB;;;;;;;;;;OAUG;IACU,uBAAuB,CAClC,GAAG,EAAE,MAAM,EACX,WAAW,EAAE,IAAI,EACjB,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAazB;;;;;;OAMG;IACU,0BAA0B,CACrC,cAAc,UAAQ,EACtB,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,sBAAsB,EAAE,CAAC;IAoCpC,gGAAgG;IACnF,4BAA4B,CACvC,UAAU,EAAE,mBAAmB,EAAE,EACjC,EAAE,GAAE,KAAa,GAChB,OAAO,CAAC,IAAI,CAAC;CASjB;AAGD,eAAO,MAAM,sBAAsB,8BACQ,CAAC"}
@@ -1,6 +1,8 @@
1
1
  import { chargingProcessesInitializer, chargingProcessesMutator, } from "@mxpicture/tesla-superchargers-generated/public";
2
2
  import { IMateStore } from "./IMateStore.js";
3
3
  import { sql } from "./db.js";
4
+ import { CHARGER_MAP_TYPES } from "../client/common.clients.js";
5
+ import { COVERED_MARGIN, COVERED_RADIUS_KM, KM_PER_DEG_LAT, } from "../common/coordinates.js";
4
6
  /**
5
7
  * Access to TeslaMate's `charging_processes` table. The helpers here
6
8
  * ({@link ChargingProcessesStore.getUnpricedCharges},
@@ -12,6 +14,7 @@ import { sql } from "./db.js";
12
14
  */
13
15
  export class ChargingProcessesStore extends IMateStore {
14
16
  statesTable = "pic_charging_process_states";
17
+ invoiceStatesTable = "pic_invoice_missing_states";
15
18
  constructor() {
16
19
  super("charging_processes", chargingProcessesInitializer, chargingProcessesMutator);
17
20
  }
@@ -88,6 +91,12 @@ export class ChargingProcessesStore extends IMateStore {
88
91
  * Best-effort match of a CSV row to a TeslaMate charging_processes.id by
89
92
  * VIN + start time (Supercharger session start vs. logged start can differ
90
93
  * by a couple of minutes). Adjust the tolerance to taste.
94
+ *
95
+ * `start_date` is a naive `timestamp` holding UTC wall time (TeslaMate's
96
+ * convention), so the invoice instant is converted to naive UTC before
97
+ * comparing — a bare `timestamp`-vs-`timestamptz` comparison would shift
98
+ * `start_date` by the session timezone and miss the window on any server
99
+ * not running UTC.
91
100
  */
92
101
  async lookupChargingProcessId(vin, chargeStart, tx = sql()) {
93
102
  const rows = await tx `
@@ -95,12 +104,63 @@ export class ChargingProcessesStore extends IMateStore {
95
104
  FROM charging_processes cp
96
105
  INNER JOIN cars c ON c.id = cp.car_id
97
106
  WHERE c.vin = ${vin}
98
- AND cp.start_date BETWEEN ${chargeStart}::timestamptz - interval '15 minutes'
99
- AND ${chargeStart}::timestamptz + interval '15 minutes'
100
- ORDER BY abs(extract(epoch FROM cp.start_date - ${chargeStart}::timestamptz))
107
+ AND cp.start_date BETWEEN (${chargeStart}::timestamptz AT TIME ZONE 'UTC') - interval '15 minutes'
108
+ AND (${chargeStart}::timestamptz AT TIME ZONE 'UTC') + interval '15 minutes'
109
+ ORDER BY abs(extract(epoch FROM cp.start_date - (${chargeStart}::timestamptz AT TIME ZONE 'UTC')))
101
110
  LIMIT 1`;
102
111
  return rows[0]?.id ?? null;
103
112
  }
113
+ /**
114
+ * Completed Supercharger charges — a charge whose position lies within the
115
+ * covered radius of a charger-typed slug, same geo-match the pricing uses —
116
+ * that no `pic_invoices` row is matched to, oldest first. With
117
+ * `onlyUnnotified` charges already paged (a stamped
118
+ * `pic_invoice_missing_states` row) are excluded.
119
+ */
120
+ async getUnmatchedInvoiceCharges(onlyUnnotified = false, tx = sql()) {
121
+ const radiusKm = COVERED_RADIUS_KM * COVERED_MARGIN;
122
+ const latDeg = radiusKm / KM_PER_DEG_LAT;
123
+ return await tx `
124
+ SELECT cp.id, cp.start_date, cp.end_date,
125
+ p.latitude, p.longitude,
126
+ slug.title AS slug_title, slug.distance_km
127
+ FROM charging_processes cp
128
+ INNER JOIN positions p ON p.id = cp.position_id
129
+ CROSS JOIN LATERAL (
130
+ SELECT s.title,
131
+ 2 * 6371 * asin(sqrt(
132
+ pow(sin(radians(s.latitude - p.latitude) / 2), 2)
133
+ + cos(radians(p.latitude)) * cos(radians(s.latitude))
134
+ * pow(sin(radians(s.longitude - p.longitude) / 2), 2)
135
+ )) AS distance_km
136
+ FROM pic_slugs s
137
+ WHERE s.location_types && ${[...CHARGER_MAP_TYPES]}::text[]
138
+ AND s.latitude BETWEEN p.latitude - ${latDeg} AND p.latitude + ${latDeg}
139
+ AND s.longitude BETWEEN p.longitude - ${latDeg} / cos(radians(p.latitude))
140
+ AND p.longitude + ${latDeg} / cos(radians(p.latitude))
141
+ ORDER BY distance_km
142
+ LIMIT 1
143
+ ) slug
144
+ WHERE cp.end_date IS NOT NULL
145
+ AND slug.distance_km < ${radiusKm}
146
+ AND NOT EXISTS (SELECT 1 FROM pic_invoices i WHERE i.charging_processes_id = cp.id)
147
+ ${onlyUnnotified
148
+ ? tx `AND NOT EXISTS (SELECT 1 FROM ${tx(this.invoiceStatesTable)} n
149
+ WHERE n.charging_processes_id = cp.id AND n.notified_at IS NOT NULL)`
150
+ : tx ``}
151
+ ORDER BY cp.start_date`;
152
+ }
153
+ /** Stamp the missing-invoice notified flag for the given charges (upsert; empty is a no-op). */
154
+ async markUnmatchedInvoiceNotified(processIds, tx = sql()) {
155
+ if (processIds.length === 0)
156
+ return;
157
+ await tx `
158
+ INSERT INTO ${tx(this.invoiceStatesTable)} (created_at, updated_at, charging_processes_id, notified_at)
159
+ SELECT CURRENT_TIMESTAMP, CURRENT_TIMESTAMP, unnest(${processIds}::int[]), CURRENT_TIMESTAMP
160
+ ON CONFLICT (charging_processes_id)
161
+ DO UPDATE SET notified_at = CURRENT_TIMESTAMP,
162
+ updated_at = CURRENT_TIMESTAMP`;
163
+ }
104
164
  }
105
165
  let _store = null;
106
166
  export const chargingProcessesStore = () => (_store ??= new ChargingProcessesStore());
@@ -1 +1 @@
1
- {"version":3,"file":"ChargingProcessesStore.js","sourceRoot":"","sources":["../../src/store/ChargingProcessesStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ChargingProcessesStore.js","sourceRoot":"","sources":["../../src/store/ChargingProcessesStore.ts"],"names":[],"mappings":"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"}
@@ -3,6 +3,20 @@ import type { ChargingProcesses, ChargingProcessesId, PicChargingProcessStates,
3
3
  export interface FailedChargingProcessState extends PicChargingProcessStates {
4
4
  start_date: Date | null;
5
5
  }
6
+ /**
7
+ * A completed Supercharger charge (geo-matched to a charger-typed slug, same
8
+ * match the pricing uses) that no `pic_invoices` row is matched to.
9
+ */
10
+ export interface UnmatchedInvoiceCharge {
11
+ id: ChargingProcessesId;
12
+ start_date: ChargingProcesses["start_date"];
13
+ end_date: ChargingProcesses["end_date"];
14
+ latitude: Positions["latitude"];
15
+ longitude: Positions["longitude"];
16
+ /** title of the nearest matched slug (site name); null when the feed has none */
17
+ slug_title: string | null;
18
+ distance_km: number;
19
+ }
6
20
  export interface UnpricedChargingProcess {
7
21
  id: ChargingProcessesId;
8
22
  start_date: ChargingProcesses["start_date"];
@@ -1 +1 @@
1
- {"version":3,"file":"chargingProcess.types.d.ts","sourceRoot":"","sources":["../../src/types/chargingProcess.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,SAAS,EACV,MAAM,iDAAiD,CAAC;AAEzD,6EAA6E;AAC7E,MAAM,WAAW,0BAA2B,SAAQ,wBAAwB;IAC1E,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,mBAAmB,CAAC;IACxB,UAAU,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC5C,QAAQ,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACpC,WAAW,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAC9C,UAAU,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC5C,mBAAmB,EAAE,iBAAiB,CAAC,qBAAqB,CAAC,CAAC;IAC9D,kBAAkB,EAAE,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;IAC5D,YAAY,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAChD,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IAChC,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,0BAA0B,CAAC;IACvC,aAAa,CAAC,EAAE,wBAAwB,CAAC,eAAe,CAAC,CAAC;CAC3D"}
1
+ {"version":3,"file":"chargingProcess.types.d.ts","sourceRoot":"","sources":["../../src/types/chargingProcess.types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,mBAAmB,EACnB,wBAAwB,EACxB,0BAA0B,EAC1B,SAAS,EACV,MAAM,iDAAiD,CAAC;AAEzD,6EAA6E;AAC7E,MAAM,WAAW,0BAA2B,SAAQ,wBAAwB;IAC1E,UAAU,EAAE,IAAI,GAAG,IAAI,CAAC;CACzB;AAED;;;GAGG;AACH,MAAM,WAAW,sBAAsB;IACrC,EAAE,EAAE,mBAAmB,CAAC;IACxB,UAAU,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC5C,QAAQ,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACxC,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IAChC,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAClC,iFAAiF;IACjF,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,EAAE,EAAE,mBAAmB,CAAC;IACxB,UAAU,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC5C,QAAQ,EAAE,iBAAiB,CAAC,UAAU,CAAC,CAAC;IACxC,MAAM,EAAE,iBAAiB,CAAC,QAAQ,CAAC,CAAC;IACpC,WAAW,EAAE,iBAAiB,CAAC,aAAa,CAAC,CAAC;IAC9C,UAAU,EAAE,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC5C,mBAAmB,EAAE,iBAAiB,CAAC,qBAAqB,CAAC,CAAC;IAC9D,kBAAkB,EAAE,iBAAiB,CAAC,oBAAoB,CAAC,CAAC;IAC5D,YAAY,EAAE,iBAAiB,CAAC,cAAc,CAAC,CAAC;IAChD,QAAQ,EAAE,SAAS,CAAC,UAAU,CAAC,CAAC;IAChC,SAAS,EAAE,SAAS,CAAC,WAAW,CAAC,CAAC;IAClC,SAAS,CAAC,EAAE,0BAA0B,CAAC;IACvC,aAAa,CAAC,EAAE,wBAAwB,CAAC,eAAe,CAAC,CAAC;CAC3D"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@mxpicture/tesla-superchargers-mate",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "description": "TeslaMate integration",
5
5
  "type": "module",
6
6
  "author": "MXPicture",
@@ -48,7 +48,7 @@
48
48
  "access": "public"
49
49
  },
50
50
  "dependencies": {
51
- "@mxpicture/tesla-superchargers-generated": "^0.1.6",
51
+ "@mxpicture/tesla-superchargers-generated": "^0.1.8",
52
52
  "postgres": "^3.4.9",
53
53
  "short-uuid": "^6.0.3",
54
54
  "zod": "^4.3.6"