@rinse-dental/open-dental 4.0.0 → 4.0.2
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.
- package/README.md +57 -17
- package/dist/api/appointments.js +1 -1
- package/dist/api/claims.js +1 -1
- package/dist/api/patients.d.ts +2 -2
- package/dist/api/patients.d.ts.map +1 -1
- package/dist/api/patients.js +3 -3
- package/dist/api/procedureLog.js +2 -2
- package/dist/types/patientTypes.d.ts +1 -1
- package/dist/types/patientTypes.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -19,14 +19,12 @@ npm install @rinse-dental/open-dental
|
|
|
19
19
|
```ts
|
|
20
20
|
import { OpenDental } from '@rinse-dental/open-dental';
|
|
21
21
|
|
|
22
|
-
// Initialize once at application startup
|
|
22
|
+
// Initialize once at application startup (the SDK appends /api/v1 automatically)
|
|
23
23
|
OpenDental.initialize(
|
|
24
24
|
'https://your-open-dental-server.example.com', // base URL — no trailing slash
|
|
25
|
-
'YOUR_API_TOKEN'
|
|
25
|
+
'YOUR_API_TOKEN', // Base64 "ODFHIR {DeveloperKey}/{CustomerKey}" token
|
|
26
26
|
);
|
|
27
27
|
|
|
28
|
-
// The SDK appends /api/v1 automatically — do not include it in baseURL.
|
|
29
|
-
|
|
30
28
|
// Use any resource
|
|
31
29
|
const patients = OpenDental.Patients();
|
|
32
30
|
const results = await patients.getPatients({ LName: 'Smith' });
|
|
@@ -37,18 +35,31 @@ console.log(results);
|
|
|
37
35
|
|
|
38
36
|
## Initialization
|
|
39
37
|
|
|
40
|
-
`OpenDental.initialize(baseURL, authToken)` must be called **once** before any other method. All subsequent calls reuse the same HTTP client.
|
|
38
|
+
`OpenDental.initialize(baseURL, authToken, options?)` must be called **once** before any other method. All subsequent calls reuse the same HTTP client.
|
|
41
39
|
|
|
42
|
-
| Parameter
|
|
43
|
-
|
|
44
|
-
| `baseURL`
|
|
45
|
-
| `authToken`
|
|
40
|
+
| Parameter | Type | Required | Description |
|
|
41
|
+
|--------------------|---------|----------|----------------------------------------------------------|
|
|
42
|
+
| `baseURL` | string | Yes | Root URL of your Open Dental server (no trailing slash). |
|
|
43
|
+
| `authToken` | string | Yes | Base64-encoded `ODFHIR {DeveloperKey}/{CustomerKey}` API token. |
|
|
44
|
+
| `options.timeout` | number | No | Request timeout in milliseconds. Default: `30000`. |
|
|
45
|
+
| `options.debug` | boolean | No | Log HTTP errors to console (strips PHI). Default: `false`. |
|
|
46
46
|
|
|
47
47
|
```ts
|
|
48
|
+
// Minimal
|
|
48
49
|
OpenDental.initialize(
|
|
49
50
|
process.env.OPEN_DENTAL_BASEURL!,
|
|
50
51
|
process.env.OPEN_DENTAL_API_KEY!
|
|
51
52
|
);
|
|
53
|
+
|
|
54
|
+
// With options
|
|
55
|
+
OpenDental.initialize(
|
|
56
|
+
process.env.OPEN_DENTAL_BASEURL!,
|
|
57
|
+
process.env.OPEN_DENTAL_API_KEY!,
|
|
58
|
+
{
|
|
59
|
+
timeout: 15_000, // 15 seconds
|
|
60
|
+
debug: process.env.NODE_ENV !== 'production',
|
|
61
|
+
}
|
|
62
|
+
);
|
|
52
63
|
```
|
|
53
64
|
|
|
54
65
|
---
|
|
@@ -305,19 +316,19 @@ Docs/
|
|
|
305
316
|
|
|
306
317
|
## Breaking Changes
|
|
307
318
|
|
|
308
|
-
###
|
|
319
|
+
### v4.0.0
|
|
309
320
|
|
|
310
|
-
The following changes are **breaking** relative to v3.
|
|
321
|
+
The following changes are **breaking** relative to v3.x.
|
|
311
322
|
|
|
312
323
|
**`ChartModules.PatientInfo()` → `ChartModules.getPatientInfo()`**
|
|
313
324
|
|
|
314
325
|
The method was renamed to follow the SDK's `getX()` naming convention.
|
|
315
326
|
|
|
316
327
|
```ts
|
|
317
|
-
// Before (v3.
|
|
328
|
+
// Before (v3.x)
|
|
318
329
|
const info = await OpenDental.ChartModules().PatientInfo(patNum);
|
|
319
330
|
|
|
320
|
-
// After (
|
|
331
|
+
// After (v4.0.1)
|
|
321
332
|
const info = await OpenDental.ChartModules().getPatientInfo(patNum);
|
|
322
333
|
```
|
|
323
334
|
|
|
@@ -326,29 +337,58 @@ const info = await OpenDental.ChartModules().getPatientInfo(patNum);
|
|
|
326
337
|
The method was renamed to correctly reflect that it deletes a benefit record, not a patient plan.
|
|
327
338
|
|
|
328
339
|
```ts
|
|
329
|
-
// Before (v3.
|
|
340
|
+
// Before (v3.x)
|
|
330
341
|
await OpenDental.Benefits().deletePatPlan(benefitNum);
|
|
331
342
|
|
|
332
|
-
// After (
|
|
343
|
+
// After (v4.0.0)
|
|
333
344
|
await OpenDental.Benefits().deleteBenefit(benefitNum);
|
|
334
345
|
```
|
|
335
346
|
|
|
347
|
+
**`RefAttaches.deleteInsSub()` → `RefAttaches.deleteRefAttach()`**
|
|
348
|
+
|
|
349
|
+
The method was incorrectly named after a different resource. It has been corrected.
|
|
350
|
+
|
|
351
|
+
```ts
|
|
352
|
+
// Before (v3.x)
|
|
353
|
+
await OpenDental.RefAttaches().deleteInsSub(refAttachNum);
|
|
354
|
+
|
|
355
|
+
// After (v4.0.0)
|
|
356
|
+
await OpenDental.RefAttaches().deleteRefAttach(refAttachNum);
|
|
357
|
+
```
|
|
358
|
+
|
|
359
|
+
**`InsVerifies.createInsVerifies()` now correctly uses POST**
|
|
360
|
+
|
|
361
|
+
Previously this method called `PUT /insverifies` instead of `POST /insverifies`. Any consumers relying on the incorrect behavior should verify their integration.
|
|
362
|
+
|
|
336
363
|
**API errors now throw `Error` instances**
|
|
337
364
|
|
|
338
365
|
Previously, API errors threw the raw Axios response object. They now throw a standard `Error` with a descriptive message string. Update any catch blocks that inspected `err.status` or `err.data` directly:
|
|
339
366
|
|
|
340
367
|
```ts
|
|
341
|
-
// Before (v3.
|
|
368
|
+
// Before (v3.x) — err was an AxiosResponse
|
|
342
369
|
catch (err: any) {
|
|
343
370
|
console.log(err.status);
|
|
344
371
|
}
|
|
345
372
|
|
|
346
|
-
// After (
|
|
373
|
+
// After (v4.0.1) — err is an Error
|
|
347
374
|
catch (err: unknown) {
|
|
348
375
|
if (err instanceof Error) console.log(err.message);
|
|
349
376
|
}
|
|
350
377
|
```
|
|
351
378
|
|
|
379
|
+
**All GET list endpoints now accept `Limit`, `DateFormatString`, and `DateTimeFormatString`**
|
|
380
|
+
|
|
381
|
+
These are additive and non-breaking for existing callers, but consumers relying on receiving all results in a single call should be aware of the 1000-item hard limit per request.
|
|
382
|
+
|
|
383
|
+
```ts
|
|
384
|
+
// Paginate through results
|
|
385
|
+
const page1 = await OpenDental.Appointments().getAppointments({ Offset: 0, Limit: 1000 });
|
|
386
|
+
const page2 = await OpenDental.Appointments().getAppointments({ Offset: 1000, Limit: 1000 });
|
|
387
|
+
|
|
388
|
+
// Custom date format
|
|
389
|
+
const patients = await OpenDental.Patients().getPatients({ DateFormatString: "MM/dd/yyyy" });
|
|
390
|
+
```
|
|
391
|
+
|
|
352
392
|
---
|
|
353
393
|
|
|
354
394
|
## TypeScript Support
|
package/dist/api/appointments.js
CHANGED
|
@@ -65,7 +65,7 @@ class Appointments {
|
|
|
65
65
|
if (!params.ClinicNum) {
|
|
66
66
|
throw new Error("Invalid parameter: ClinicNum is required when Clinics are enabled.");
|
|
67
67
|
}
|
|
68
|
-
return this.httpClient.get("/appointments/
|
|
68
|
+
return this.httpClient.get("/appointments/ASAP", params);
|
|
69
69
|
}
|
|
70
70
|
/**
|
|
71
71
|
* Fetch available appointment slots.
|
package/dist/api/claims.js
CHANGED
|
@@ -157,7 +157,7 @@ class Claims {
|
|
|
157
157
|
if (!Array.isArray(procNums) || procNums.length === 0) {
|
|
158
158
|
throw new Error("Invalid parameter: procNums must be a non-empty array.");
|
|
159
159
|
}
|
|
160
|
-
return this.httpClient.put(`/claims/${ClaimNum}/Split`, { procNums });
|
|
160
|
+
return this.httpClient.put(`/claims/${ClaimNum}/Split`, { ProcNums: procNums });
|
|
161
161
|
}
|
|
162
162
|
/**
|
|
163
163
|
* Delete a Claim record.
|
package/dist/api/patients.d.ts
CHANGED
|
@@ -32,14 +32,14 @@ export default class Patients {
|
|
|
32
32
|
* @param {string} [params.SubscriberId] - Filter by subscriber ID.
|
|
33
33
|
* @param {string} [params.Email] - Filter by email address.
|
|
34
34
|
* @param {string} [params.Country] - Filter by country.
|
|
35
|
-
* @param {
|
|
35
|
+
* @param {string} [params.clinicNums] - Comma-separated clinic numbers.
|
|
36
36
|
* @param {string} [params.clinicAbbr] - Filter by clinic abbreviation.
|
|
37
37
|
* @param {string} [params.invoiceNumber] - Filter by invoice number.
|
|
38
38
|
* @param {number} [params.Offset] - Pagination offset.
|
|
39
39
|
* @returns {Promise<PatientSummary[]>} - A list of summarized patient data.
|
|
40
40
|
* @throws {Error} - If the API returns an error.
|
|
41
41
|
*/
|
|
42
|
-
getPatients({ LName, FName, Phone, Address, hideInactive, City, State, SSN, ChartNumber, guarOnly, showArchived, Birthdate, SiteNum, SubscriberId, Email, Country,
|
|
42
|
+
getPatients({ LName, FName, Phone, Address, hideInactive, City, State, SSN, ChartNumber, guarOnly, showArchived, Birthdate, SiteNum, SubscriberId, Email, Country, clinicNums, clinicAbbr, invoiceNumber, Offset, Limit, DateFormatString, DateTimeFormatString, }?: GetPatientsParams): Promise<PatientSummary[]>;
|
|
43
43
|
/**
|
|
44
44
|
* Fetch multiple patients with optional filtering and pagination.
|
|
45
45
|
* @param {Object} params - Filtering and pagination parameters.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patients.d.ts","sourceRoot":"","sources":["../../src/api/patients.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EACL,OAAO,EACP,cAAc,EACd,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,OAAO,OAAO,QAAQ;IAC3B,OAAO,CAAC,UAAU,CAAa;gBAEnB,UAAU,EAAE,UAAU;IAIlC;;;;;;;;OAQG;IACU,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQzD;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACY,WAAW,CAAC,EACvB,KAAK,EACL,KAAK,EACL,KAAK,EACL,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,KAAK,EACL,GAAG,EACH,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,OAAO,EACP,YAAY,EACZ,KAAK,EACL,OAAO,EACP,
|
|
1
|
+
{"version":3,"file":"patients.d.ts","sourceRoot":"","sources":["../../src/api/patients.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EACL,OAAO,EACP,cAAc,EACd,iBAAiB,EACjB,uBAAuB,EACvB,mBAAmB,EACnB,mBAAmB,EACpB,MAAM,uBAAuB,CAAC;AAE/B,MAAM,CAAC,OAAO,OAAO,QAAQ;IAC3B,OAAO,CAAC,UAAU,CAAa;gBAEnB,UAAU,EAAE,UAAU;IAIlC;;;;;;;;OAQG;IACU,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAQzD;;;;;;;;;;;;;;;;;;;;;;;;;OAyBG;IACY,WAAW,CAAC,EACvB,KAAK,EACL,KAAK,EACL,KAAK,EACL,OAAO,EACP,YAAY,EACZ,IAAI,EACJ,KAAK,EACL,GAAG,EACH,WAAW,EACX,QAAQ,EACR,YAAY,EACZ,SAAS,EACT,OAAO,EACP,YAAY,EACZ,KAAK,EACL,OAAO,EACP,UAAU,EACV,UAAU,EACV,aAAa,EACb,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,oBAAoB,GACzB,GAAE,iBAAsB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA+BnD;;;;;;;;;;;;;;;;;OAiBG;IACU,iBAAiB,CAAC,EAC7B,KAAK,EACL,KAAK,EACL,SAAS,EACT,SAAS,EACT,SAAS,EACT,UAAU,EACV,OAAO,EACP,MAAM,EACN,QAAQ,EACR,SAAS,EACT,WAAW,EACX,MAAM,EACN,KAAK,EACL,gBAAgB,EAChB,oBAAoB,GACvB,GAAE,uBAA4B,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAsBlD;;;;;;;;;;;;;;;;;;;;;;;;;;;;OA4BG;IACU,aAAa,CAAC,EACzB,KAAK,EACL,KAAK,EACL,GAAG,YAAY,EAChB,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;IAW1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;MAwCE;IACY,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,mBAAmB,GAAG,OAAO,CAAC,OAAO,CAAC;CAcxF"}
|
package/dist/api/patients.js
CHANGED
|
@@ -39,14 +39,14 @@ class Patients {
|
|
|
39
39
|
* @param {string} [params.SubscriberId] - Filter by subscriber ID.
|
|
40
40
|
* @param {string} [params.Email] - Filter by email address.
|
|
41
41
|
* @param {string} [params.Country] - Filter by country.
|
|
42
|
-
* @param {
|
|
42
|
+
* @param {string} [params.clinicNums] - Comma-separated clinic numbers.
|
|
43
43
|
* @param {string} [params.clinicAbbr] - Filter by clinic abbreviation.
|
|
44
44
|
* @param {string} [params.invoiceNumber] - Filter by invoice number.
|
|
45
45
|
* @param {number} [params.Offset] - Pagination offset.
|
|
46
46
|
* @returns {Promise<PatientSummary[]>} - A list of summarized patient data.
|
|
47
47
|
* @throws {Error} - If the API returns an error.
|
|
48
48
|
*/
|
|
49
|
-
async getPatients({ LName, FName, Phone, Address, hideInactive, City, State, SSN, ChartNumber, guarOnly, showArchived, Birthdate, SiteNum, SubscriberId, Email, Country,
|
|
49
|
+
async getPatients({ LName, FName, Phone, Address, hideInactive, City, State, SSN, ChartNumber, guarOnly, showArchived, Birthdate, SiteNum, SubscriberId, Email, Country, clinicNums, clinicAbbr, invoiceNumber, Offset, Limit, DateFormatString, DateTimeFormatString, } = {}) {
|
|
50
50
|
return await this.httpClient.get("/patients", {
|
|
51
51
|
LName,
|
|
52
52
|
FName,
|
|
@@ -64,7 +64,7 @@ class Patients {
|
|
|
64
64
|
SubscriberId,
|
|
65
65
|
Email,
|
|
66
66
|
Country,
|
|
67
|
-
|
|
67
|
+
clinicNums,
|
|
68
68
|
clinicAbbr,
|
|
69
69
|
invoiceNumber,
|
|
70
70
|
Offset,
|
package/dist/api/procedureLog.js
CHANGED
|
@@ -250,7 +250,7 @@ class ProcedureLogs {
|
|
|
250
250
|
if (!PatNum || !InsSubNum) {
|
|
251
251
|
throw new Error("Invalid parameters: PatNum and InsSubNum are required.");
|
|
252
252
|
}
|
|
253
|
-
return this.httpClient.get("/procedurelogs/
|
|
253
|
+
return this.httpClient.get("/procedurelogs/InsuranceHistory", {
|
|
254
254
|
PatNum,
|
|
255
255
|
InsSubNum,
|
|
256
256
|
Limit,
|
|
@@ -272,7 +272,7 @@ class ProcedureLogs {
|
|
|
272
272
|
if (!PatNum || !InsSubNum || !insHistPrefName || !ProcDate) {
|
|
273
273
|
throw new Error("Invalid parameter: PatNum, InsSubNum, insHistPrefName, and ProcDate are required.");
|
|
274
274
|
}
|
|
275
|
-
return this.httpClient.post("/procedurelogs/
|
|
275
|
+
return this.httpClient.post("/procedurelogs/InsuranceHistory", {
|
|
276
276
|
PatNum,
|
|
277
277
|
InsSubNum,
|
|
278
278
|
insHistPrefName,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"patientTypes.d.ts","sourceRoot":"","sources":["../../src/types/patientTypes.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,iBAAiB;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAC5B,YAAY,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,
|
|
1
|
+
{"version":3,"file":"patientTypes.d.ts","sourceRoot":"","sources":["../../src/types/patientTypes.ts"],"names":[],"mappings":"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"}
|