@jd-data-limited/easy-fm 1.1.6-alpha1 → 1.2.2-alpha1
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 +61 -235
- package/TEMP/FILEMAKER.txt +218 -0
- package/TEMP/WEBAPP.txt +92 -0
- package/TEMP/config.yaml +40 -0
- package/TEMP/data.json +19837 -0
- package/index.js +297 -119
- package/index.ts +409 -171
- package/package.json +2 -2
- package/test.js +32 -0
package/README.md
CHANGED
|
@@ -17,19 +17,11 @@ or [FileMaker Cloud](https://store.claris.com/filemaker-cloud). This module inte
|
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
##
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
2. [Token](#token)
|
|
25
|
-
3. [OAuth](#oauth)
|
|
26
|
-
4. [Claris Account (FileMaker Cloud)](#claris-account--filemaker-cloud-)
|
|
27
|
-
2. [Working with records](#working-with-records)
|
|
28
|
-
3. [Performing find requests](#perform-find-requests)
|
|
29
|
-
4. [Scripts](#scripts)
|
|
30
|
-
5. [Index](#index)
|
|
20
|
+
## Before you begin
|
|
21
|
+
|
|
22
|
+
- You need to know what your server's UTC time offset (in minutes) is.
|
|
23
|
+
- Running `0 - (new Date()).getTimezoneOffset()` in javascript will the UTC time offset for your current timezone.
|
|
31
24
|
|
|
32
|
-
---
|
|
33
25
|
|
|
34
26
|
## Connecting to a database
|
|
35
27
|
|
|
@@ -37,12 +29,21 @@ easy-fm currently does not support connecting to external data sources, or authe
|
|
|
37
29
|
FileMaker authentication.
|
|
38
30
|
|
|
39
31
|
```javascript
|
|
40
|
-
import
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
|
|
32
|
+
import FMHost, {FMError} from "easy-fm"; // Import the module
|
|
33
|
+
const host = new FMHost(
|
|
34
|
+
"https://<your-servers-address>",
|
|
35
|
+
700 // Timezone offset
|
|
36
|
+
)
|
|
37
|
+
const database = host.database({
|
|
38
|
+
database: "your_database.fmp12",
|
|
39
|
+
credentials: {
|
|
40
|
+
method: "filemaker",
|
|
41
|
+
username: "<username>",
|
|
42
|
+
password: "<password>"
|
|
43
|
+
}
|
|
44
|
+
})
|
|
44
45
|
|
|
45
|
-
|
|
46
|
+
database.login().then(() => {
|
|
46
47
|
// Record operations can only be performed after a successful login
|
|
47
48
|
})
|
|
48
49
|
```
|
|
@@ -54,255 +55,80 @@ connection.login().then(token => {
|
|
|
54
55
|
>
|
|
55
56
|
> If you need to interact with layouts on multiple databases, you need to open one connection per database.
|
|
56
57
|
|
|
57
|
-
##
|
|
58
|
-
|
|
59
|
-
This method allows you to use a generic FileMaker account to connect to the database.
|
|
60
|
-
|
|
61
|
-
```javascript
|
|
62
|
-
new fm({
|
|
63
|
-
hostname: "localhost",
|
|
64
|
-
database: {
|
|
65
|
-
database: "MyDatabase", // Do not include the .fmp12 file extension
|
|
66
|
-
method: "filemaker",
|
|
67
|
-
username: "node",
|
|
68
|
-
password: "node123"
|
|
69
|
-
},
|
|
70
|
-
externalSources: []
|
|
71
|
-
})
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
**Supports auto relogin?** Yes
|
|
58
|
+
## Getting records
|
|
75
59
|
|
|
76
|
-
|
|
60
|
+
One of (if not the) most common interactions you'll need to use is fetching records.
|
|
77
61
|
|
|
78
|
-
|
|
62
|
+
### Fetch a range of records
|
|
79
63
|
|
|
80
64
|
```javascript
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
database: {
|
|
84
|
-
database: "MyDatabase", // Do not include the .fmp12 file extension
|
|
85
|
-
method: "token",
|
|
86
|
-
token: "API token goes here"
|
|
87
|
-
},
|
|
88
|
-
externalSources: []
|
|
89
|
-
})
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
**Supports auto relogin?** No
|
|
93
|
-
|
|
94
|
-
## OAuth
|
|
95
|
-
|
|
96
|
-
(untested) If your FileMaker server has OAuth configured, you can login using this method.
|
|
97
|
-
|
|
98
|
-
```javascript
|
|
99
|
-
new fm({
|
|
100
|
-
hostname: "localhost",
|
|
101
|
-
database: {
|
|
102
|
-
f
|
|
103
|
-
database: "MyDatabase", // Do not include the .fmp12 file extension
|
|
104
|
-
method: "oauth",
|
|
105
|
-
oauth: {
|
|
106
|
-
requestId: "oauth request ID",
|
|
107
|
-
requestIdentifier: "oatuh identifier"
|
|
108
|
-
}
|
|
109
|
-
},
|
|
110
|
-
externalSources: []
|
|
111
|
-
})
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
**Supports auto relogin?** No
|
|
65
|
+
let layout = database.getLayout("Your layout name")
|
|
66
|
+
let range_request = layout.records.range()
|
|
115
67
|
|
|
116
|
-
|
|
68
|
+
range_request.setOffset(50) // Starting from the 50th record...
|
|
69
|
+
range_request.setLimit(100) // Fetch 100 records
|
|
117
70
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
```javascript
|
|
121
|
-
new fm({
|
|
122
|
-
hostname: "localhost",
|
|
123
|
-
database: {
|
|
124
|
-
database: "MyDatabase", // Do not include the .fmp12 file extension
|
|
125
|
-
method: "claris",
|
|
126
|
-
fmid: "" // The FileMaker token provided by Claris
|
|
127
|
-
},
|
|
128
|
-
externalSources: []
|
|
129
|
-
})
|
|
130
|
-
```
|
|
131
|
-
|
|
132
|
-
Read more [here](https://help.claris.com/en/data-api-guide/content/log-in-database-session-claris-id.html)
|
|
133
|
-
|
|
134
|
-
**Supports auto relogin?** No
|
|
135
|
-
|
|
136
|
-
---
|
|
137
|
-
|
|
138
|
-
## Working with records
|
|
139
|
-
|
|
140
|
-
When running scripts or interacting with records, the first step that you need to do is get the layout that you want to
|
|
141
|
-
use
|
|
142
|
-
|
|
143
|
-
```javascript
|
|
144
|
-
let layout = connection.getLayout("layout1") // Get the layout known as 'layout1'
|
|
145
|
-
```
|
|
146
|
-
|
|
147
|
-
Once you have the layout, you can perform tasks on that layout
|
|
148
|
-
|
|
149
|
-
> **Note:** You will only be able to get and modify fields that are on that layout. If a field is not on the layout, you
|
|
150
|
-
> cannot see or modify it's contents.
|
|
151
|
-
|
|
152
|
-
### Get a single record using its RecordID
|
|
153
|
-
|
|
154
|
-
[What's a RecordID?](#recordid)
|
|
155
|
-
|
|
156
|
-
```javascript
|
|
157
|
-
let record_id = 1
|
|
158
|
-
let record = layout.getRecord(record_id)
|
|
159
|
-
|
|
160
|
-
await record.get() // The 'getRecord' method does not automatically get that record's values, so this step does that instead
|
|
161
|
-
|
|
162
|
-
let field = record.getField("field1")
|
|
163
|
-
console.log(field.value) // Get the value of 'field1'
|
|
71
|
+
let records = await range_request.run()
|
|
72
|
+
console.log(records)
|
|
164
73
|
```
|
|
165
74
|
|
|
166
|
-
###
|
|
167
|
-
|
|
168
|
-
WARNING: The commit step is mandatory. Otherwise the changes will never be uploaded
|
|
75
|
+
### Searching for records
|
|
169
76
|
|
|
170
77
|
```javascript
|
|
171
|
-
let
|
|
172
|
-
let
|
|
173
|
-
|
|
174
|
-
await record.get() // The 'getRecord' method does not automatically get that record's values, so this step does that instead
|
|
175
|
-
record.getField("field1").set("This is a value")
|
|
176
|
-
record.getField("field2").set("This is also a value")
|
|
177
|
-
await record.commit()
|
|
178
|
-
```
|
|
179
|
-
> **NOTE:** A commit will also commit any changes made to portal records.
|
|
78
|
+
let layout = database.getLayout("Your layout name")
|
|
79
|
+
let find_request = layout.records.find()
|
|
180
80
|
|
|
181
|
-
|
|
81
|
+
find_request.addRequests({"GroupID": "abc"}) // Find only the records with field GroupID set to 'abc'
|
|
82
|
+
find_request.setOffset(30) // Starting from the 30th matching record
|
|
83
|
+
find_request.setLimit(10) // Fetch only 10 records
|
|
182
84
|
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
record.getField("field1").set("ABC")
|
|
186
|
-
record.getField("field2").set("DEF")
|
|
187
|
-
await record.commit()
|
|
85
|
+
let records = await range_request.run()
|
|
86
|
+
console.log(records)
|
|
188
87
|
```
|
|
189
88
|
|
|
190
|
-
|
|
89
|
+
### Fetch a record using its record ID
|
|
191
90
|
|
|
192
|
-
|
|
91
|
+
> Please note: When in FileMaker Pro, a record's ID is returned when using Get(RecordID). If you need to fetch a record
|
|
92
|
+
> using a different ID, use the search method above.
|
|
193
93
|
|
|
194
94
|
```javascript
|
|
195
|
-
let
|
|
196
|
-
let record = layout.
|
|
197
|
-
|
|
198
|
-
await record.get() // The 'getRecord' method does not automatically get that record's values, so this step does that instead
|
|
199
|
-
|
|
200
|
-
let container = record.getField("container")
|
|
201
|
-
container.download().then(stream => {
|
|
202
|
-
// Returns an IncomingMessage, which is an extension of ReadableStream
|
|
203
|
-
})
|
|
95
|
+
let layout = database.getLayout("Your layout name")
|
|
96
|
+
let record = await layout.records.get(164)
|
|
97
|
+
console.log(record)
|
|
204
98
|
```
|
|
205
99
|
|
|
206
|
-
|
|
207
|
-
, [ReadableStream](https://nodejs.org/api/stream.html#class-streamreadable)
|
|
208
|
-
|
|
209
|
-
### Uploading container files
|
|
210
|
-
|
|
211
|
-
When uploading files, they should be uploaded as a [Buffer](https://nodejs.org/api/buffer.html) object, along with a
|
|
212
|
-
filename (string) and MIME (also string)
|
|
213
|
-
|
|
100
|
+
### Create a record
|
|
214
101
|
|
|
215
102
|
```javascript
|
|
216
|
-
|
|
217
|
-
let
|
|
218
|
-
let buffer = fs.readdirSync("./" + filename)
|
|
219
|
-
let mime = "image/jpeg"
|
|
220
|
-
|
|
221
|
-
let record_id = 1
|
|
222
|
-
let record = layout.getRecord(record_id)
|
|
223
|
-
await record.get() // The 'getRecord' method does not automatically get that record's values, so this step does that instead
|
|
224
|
-
|
|
225
|
-
let container = record.getField("container")
|
|
226
|
-
container.upload(buffer, filename, mime).then(() => {
|
|
227
|
-
console.log("UPLOAD SUCCESSFUL!")
|
|
228
|
-
})
|
|
229
|
-
```
|
|
230
|
-
|
|
231
|
-
> Mozilla has a list of common MIME types on their website; [(Mozilla) Common MIME types](https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Common_types)
|
|
103
|
+
let layout = database.getLayout("Your layout name")
|
|
104
|
+
let record = await layout.records.create()
|
|
232
105
|
|
|
233
|
-
|
|
106
|
+
record.getField("Field1").set("Value here")
|
|
107
|
+
record.getField("Field2").set("Value here")
|
|
108
|
+
record.getField("Field3").set("Value here")
|
|
234
109
|
|
|
235
|
-
|
|
236
|
-
you also:
|
|
237
|
-
|
|
238
|
-
- Give the portal object a name
|
|
239
|
-
- Include the exact fields you need in the portal. Any fields you leave out will not be accessible by node.js, and
|
|
240
|
-
putting extra fields in is not a good idea.
|
|
241
|
-
|
|
242
|
-
```javascript
|
|
243
|
-
let record = layout.getRecord(1)
|
|
244
|
-
|
|
245
|
-
// Portal data is downloaded when the record is fetched
|
|
246
|
-
await record.get()
|
|
247
|
-
let portal = record.getPortal("Portal1")
|
|
248
|
-
|
|
249
|
-
for (let _record of portal.records) {
|
|
250
|
-
// Runs for all records in the portal
|
|
251
|
-
let field = _record.getField("field2")
|
|
252
|
-
console.log(field.value)
|
|
253
|
-
field.set("GHI")
|
|
254
|
-
}
|
|
110
|
+
await record.commit()
|
|
255
111
|
```
|
|
256
112
|
|
|
257
|
-
|
|
258
|
-
portal records.
|
|
259
|
-
|
|
260
|
-
---
|
|
261
|
-
|
|
262
|
-
## Perform find requests
|
|
263
|
-
|
|
264
|
-
Performing find requests is one of the most common database operations
|
|
265
|
-
|
|
266
|
-

|
|
267
|
-
|
|
268
|
-
The image above is how the find request would look when doing it in a FileMaker script. This should hopefully help you
|
|
269
|
-
understand how the find request process works.
|
|
113
|
+
### Modify a record
|
|
270
114
|
|
|
271
115
|
```javascript
|
|
272
|
-
let
|
|
273
|
-
|
|
274
|
-
find.addRequests( // Specify the find criteria
|
|
275
|
-
{"PrimaryKey": "AAAAA", "ModifiedBy": "BBBB"},
|
|
276
|
-
{"CreatedBy": "BBBB"}
|
|
277
|
-
)
|
|
278
|
-
|
|
279
|
-
find.addSort("CreatedBy", "ascend") // Sort the results in ascending order
|
|
280
|
-
let records = await find.run() // Perform the find
|
|
281
|
-
console.log(records)
|
|
282
|
-
```
|
|
283
|
-
|
|
284
|
-
---
|
|
116
|
+
let layout = database.getLayout("Your layout name")
|
|
117
|
+
let record = await layout.records.get(164)
|
|
285
118
|
|
|
286
|
-
|
|
119
|
+
record.getField("Field1").set("Value here")
|
|
120
|
+
record.getField("Field2").set("Value here")
|
|
121
|
+
record.getField("Field3").set("Value here")
|
|
287
122
|
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
```javascript
|
|
291
|
-
let layout = connection.getLayout("layout1")
|
|
292
|
-
let script = connection.script("MyFileMakerScript", "This is a parameter")
|
|
293
|
-
let result = await layout.runScript(script)
|
|
294
|
-
console.log(result)
|
|
123
|
+
await record.commit()
|
|
295
124
|
```
|
|
296
125
|
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
## Classes and methods
|
|
300
|
-
|
|
301
|
-
---
|
|
126
|
+
# Documentation
|
|
302
127
|
|
|
303
|
-
##
|
|
128
|
+
## FMHost
|
|
304
129
|
|
|
305
|
-
|
|
130
|
+
`hostname`: string
|
|
131
|
+
> The hostname of the server you are connecting to
|
|
306
132
|
|
|
307
|
-
|
|
308
|
-
|
|
133
|
+
`timezoneOffset`: number
|
|
134
|
+
> The server's timezone offset
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
FILEMAKER:
|
|
2
|
+
|
|
3
|
+
__CreationTimestamp
|
|
4
|
+
__CreationUser
|
|
5
|
+
__ModificationTimestamp
|
|
6
|
+
__ModificationTimestamp|JS
|
|
7
|
+
__ModificationUser
|
|
8
|
+
__PrimaryKey
|
|
9
|
+
__RecordID
|
|
10
|
+
__RecordNumber
|
|
11
|
+
__ShortID
|
|
12
|
+
_1
|
|
13
|
+
_IsIncubating
|
|
14
|
+
_PDF|ArchiveID
|
|
15
|
+
_Report|JSON|Shorthand
|
|
16
|
+
_Report|JSON|Shorthand|Default
|
|
17
|
+
_Report|JSON|Shorthand|HASH
|
|
18
|
+
_RI|RI|Date|Sorter
|
|
19
|
+
_RI|RI|Date|Sorter2
|
|
20
|
+
_shouldShow
|
|
21
|
+
_temp_field
|
|
22
|
+
FI|A|Animal
|
|
23
|
+
FI|A|Fertility
|
|
24
|
+
FI|FI|BeddingFloorType
|
|
25
|
+
FI|FI|BeddingFloorType Calc
|
|
26
|
+
FI|FI|CalvingSystem
|
|
27
|
+
FI|FI|FarmingSystem
|
|
28
|
+
FI|FI|FarmingType
|
|
29
|
+
FI|FI|FeedPad
|
|
30
|
+
FI|FI|FeedPadCleaning
|
|
31
|
+
FI|FI|HerdHome
|
|
32
|
+
FI|FI|Lane
|
|
33
|
+
FI|FI|Slatted
|
|
34
|
+
FI|FI|StallType
|
|
35
|
+
FI|FI|WinteringBarn
|
|
36
|
+
FI|FS|Comment
|
|
37
|
+
FI|FS|IncurringPenalties
|
|
38
|
+
FI|FS|KnownCurrentIssues
|
|
39
|
+
FI|FS|KnownCurrentIssues|Other
|
|
40
|
+
FI|FS|Penalties|Bactoscan
|
|
41
|
+
FI|FS|Penalties|Calc
|
|
42
|
+
FI|FS|Penalties|Coliform
|
|
43
|
+
FI|FS|Penalties|SCC
|
|
44
|
+
FI|FS|Penalties|Temperature
|
|
45
|
+
FI|FS|Penalties|Thermoduric
|
|
46
|
+
FI|FS|PenaltyTypes
|
|
47
|
+
FI|MM|Comment
|
|
48
|
+
FI|MM|Comment|Report
|
|
49
|
+
FI|MM|IdentifyProcess
|
|
50
|
+
FI|MM|IdentifyProcess|Other
|
|
51
|
+
FI|MM|TreatmentsPerMonth
|
|
52
|
+
GI|1C|Email
|
|
53
|
+
GI|1C|FName
|
|
54
|
+
GI|1C|Label
|
|
55
|
+
GI|1C|LName
|
|
56
|
+
GI|1C|PhNumber
|
|
57
|
+
GI|1C|PhType
|
|
58
|
+
GI|1C|Role
|
|
59
|
+
GI|2C|Email
|
|
60
|
+
GI|2C|FName
|
|
61
|
+
GI|2C|LName
|
|
62
|
+
GI|2C|PhNumber
|
|
63
|
+
GI|2C|Role
|
|
64
|
+
GI|Customer|Label
|
|
65
|
+
GI|Customer|LabelExtended
|
|
66
|
+
GI|Customer|LabelExtended|Address
|
|
67
|
+
GI|Customer|LabelExtended|Contact
|
|
68
|
+
GI|Partner|Label
|
|
69
|
+
GI|Partner|LabelExtended
|
|
70
|
+
GI|Partner|LabelExtended|Address
|
|
71
|
+
GI|Partner|LabelExtended|Contact
|
|
72
|
+
GI|VET|Address
|
|
73
|
+
GI|VET|Address|City
|
|
74
|
+
GI|VET|Address|Country
|
|
75
|
+
GI|VET|Address|Postcode
|
|
76
|
+
GI|VET|Address|Street
|
|
77
|
+
GI|VET|Address|StreetAddress
|
|
78
|
+
GI|VET|Address|Town
|
|
79
|
+
GI|VET|Email
|
|
80
|
+
GI|VET|FName
|
|
81
|
+
GI|VET|Label
|
|
82
|
+
GI|VET|Label|Extended
|
|
83
|
+
GI|VET|Label|Extended|Address
|
|
84
|
+
GI|VET|Label|Extended|Contact
|
|
85
|
+
GI|VET|LName
|
|
86
|
+
GI|VET|PhNumber
|
|
87
|
+
GI|VET|PracticeName
|
|
88
|
+
GI|VET|ReceiveReport
|
|
89
|
+
GI|VET|WasOnSite
|
|
90
|
+
I|I|MiscComments
|
|
91
|
+
I|ID|IncubationTimestamp
|
|
92
|
+
I|ID|IncubationTimestamp|JS
|
|
93
|
+
In|ArchiveID
|
|
94
|
+
In|FarmID
|
|
95
|
+
In|IncubationHours
|
|
96
|
+
In|PartnerID
|
|
97
|
+
In|UserID
|
|
98
|
+
LinerLifeCalculator|CowsInClusters
|
|
99
|
+
LinerLifeCalculator|Life_InDays
|
|
100
|
+
LinerLifeCalculator|Life_InMonths
|
|
101
|
+
LinerLifeCalculator|LinerLife
|
|
102
|
+
LinerLifeCalculator|LinerUsage
|
|
103
|
+
LinerLifeCalculator|MilkingsPerDay
|
|
104
|
+
OnLoan|Date
|
|
105
|
+
OnLoan|to
|
|
106
|
+
Out|Contractor|Comments
|
|
107
|
+
Out|ImportantNotes
|
|
108
|
+
Out|KnownIssues|Notes
|
|
109
|
+
Out|MilkingSystem|Notes
|
|
110
|
+
Out|Pathogen|1
|
|
111
|
+
Out|Pathogen|1|PriorityLevel
|
|
112
|
+
Out|Pathogen|1|RiskLevel
|
|
113
|
+
Out|Pathogen|2
|
|
114
|
+
Out|Pathogen|2|PriorityLevel
|
|
115
|
+
Out|Pathogen|2|RiskLevel
|
|
116
|
+
Out|Pathogen|3
|
|
117
|
+
Out|Pathogen|3|PriorityLevel
|
|
118
|
+
Out|Pathogen|3|RiskLevel
|
|
119
|
+
Out|Pathogen|4
|
|
120
|
+
Out|Pathogen|4|PriorityLevel
|
|
121
|
+
Out|Pathogen|4|RiskLevel
|
|
122
|
+
Out|Pathogen|5
|
|
123
|
+
Out|Pathogen|5|PriorityLevel5
|
|
124
|
+
Out|Pathogen|5|RiskLevel
|
|
125
|
+
Out|PF|MilkSamplingDate
|
|
126
|
+
Out|PF|ReportDate
|
|
127
|
+
Out|PF|ReportGeneratedBy
|
|
128
|
+
Out|PI|GeneralComments
|
|
129
|
+
Out|PI|GeneralComments Page1
|
|
130
|
+
Out|PI|GeneralComments Page2
|
|
131
|
+
Out|PI|GeneralComments|JSONSplit
|
|
132
|
+
Out|PostMilking|Comment
|
|
133
|
+
Out|PreMilking|Comment
|
|
134
|
+
PDF|GenerateReport
|
|
135
|
+
PlaceHolder
|
|
136
|
+
Report|AddressTo
|
|
137
|
+
Report|FooterText
|
|
138
|
+
Report|HeaderText
|
|
139
|
+
Report|IDNumber
|
|
140
|
+
Report|JSON|Upload
|
|
141
|
+
Report|JSON|Upload|DUMP
|
|
142
|
+
Report|Type
|
|
143
|
+
RI|RI|Date
|
|
144
|
+
RI|RI|Date|JS
|
|
145
|
+
RI|RI|HerdID
|
|
146
|
+
RI|RI|LastSCCRecordingDate
|
|
147
|
+
RI|RI|LastSCCRecordingValue
|
|
148
|
+
RI|RI|MilkAvgYield|Calc
|
|
149
|
+
RI|RI|MilkVolume
|
|
150
|
+
RI|RI|MilkVolume|Calc
|
|
151
|
+
RI|RI|MilkVolumeUnit
|
|
152
|
+
RI|RI|NumAnimals
|
|
153
|
+
RI|RI|NumAnimals|Calc
|
|
154
|
+
RI|RI|NumAnimalsInTank
|
|
155
|
+
RI|RI|SampleSource
|
|
156
|
+
RI|RI|SampleSource|Calc
|
|
157
|
+
RI|RI|SCC|Comments
|
|
158
|
+
RI|RI|SCC|Value
|
|
159
|
+
RI|RI|SubPopulation
|
|
160
|
+
SMPI|MP|MilkPickups
|
|
161
|
+
SMPI|MP|MilkPickups|Num
|
|
162
|
+
SMPI|MP|NumMilkingsPerDay
|
|
163
|
+
SMPI|MS|ACR
|
|
164
|
+
SMPI|MS|InShedFeeding
|
|
165
|
+
SMPI|MS|MilkingSystem|Calc
|
|
166
|
+
SMPI|MS|MilkingSystemMake
|
|
167
|
+
SMPI|MS|MilkingSystemMake|Name
|
|
168
|
+
SMPI|MS|MilkingSystemType
|
|
169
|
+
SMPI|MS|MSAge
|
|
170
|
+
SMPI|MS|NumOfBales
|
|
171
|
+
SMPI|PostI|ExtraEmolientActiveIngredients
|
|
172
|
+
SMPI|PostI|ExtraEmolientActiveIngredients|Calc
|
|
173
|
+
SMPI|PostM|Comments
|
|
174
|
+
SMPI|PostM|DippingOrSpraying
|
|
175
|
+
SMPI|PostM|DippingOrSpraying|Other
|
|
176
|
+
SMPI|PostM|ExtraEmolientProductName
|
|
177
|
+
SMPI|PostM|PostMilkingTeatSpraying
|
|
178
|
+
SMPI|PostM|ProductActiveConcentration
|
|
179
|
+
SMPI|PostM|ProductActiveIngredient
|
|
180
|
+
SMPI|PostM|ProductActiveIngredient|Calc
|
|
181
|
+
SMPI|PostM|ProductActiveIngredient|Other
|
|
182
|
+
SMPI|PostM|ProductEmolientConcentration
|
|
183
|
+
SMPI|PostM|ProductName
|
|
184
|
+
SMPI|PostM|TeatCare|Brand
|
|
185
|
+
SMPI|PostM|TeatSprayingTechnology
|
|
186
|
+
SMPI|PostM|TeatSprayingTechnology|Other
|
|
187
|
+
SMPI|PostM|UseEmolient
|
|
188
|
+
SMPI|PreM|Brushes
|
|
189
|
+
SMPI|PreM|Dilution
|
|
190
|
+
SMPI|PreM|ProductName
|
|
191
|
+
SMPI|PreM|TeatCare|Brand
|
|
192
|
+
SMPI|PreM|TeatCare|Dilution
|
|
193
|
+
SMPI|PreM|TeatCare|Name
|
|
194
|
+
SMPI|PreM|TeatCleanMethod
|
|
195
|
+
SMPI|PreM|TeatCleanMethod|Calc
|
|
196
|
+
SMPI|PreM|TeatCleanMethod|Other
|
|
197
|
+
SMPI|PreM|TeatDisinfectActiveIngredient
|
|
198
|
+
SMPI|PreM|TeatDisinfectActiveIngredient|Calc
|
|
199
|
+
SMPI|PreM|TeatDisinfectActiveIngredient|Other
|
|
200
|
+
SMPI|PreM|TeatDisinfectMethod
|
|
201
|
+
SMPI|PreM|TeatDisinfectMethod|Other
|
|
202
|
+
SMPI|PreM|TeatDisinfectTech
|
|
203
|
+
SMPI|PreM|TeatPrepClean
|
|
204
|
+
SMPI|PreM|TeatPrepDisinfectLiquid
|
|
205
|
+
SMPI|PreM|TeatPrepMethod
|
|
206
|
+
SMPI|PreM|TeatPrepMethod|Other
|
|
207
|
+
SMPI|PreM|TeatPrepTemp
|
|
208
|
+
SMPI|PreM|TeatWipeMethod
|
|
209
|
+
SMPI|PreM|TeatWipeMethod|Other
|
|
210
|
+
SMPI|PreM|WashTemp
|
|
211
|
+
SMPI|PW|Comment
|
|
212
|
+
SMPI|PW|FarmWaterSource
|
|
213
|
+
SMpI|PW|FarmWaterSource|Other
|
|
214
|
+
SMPI|PW|TeatcareDilutionWaterSource
|
|
215
|
+
SMPI|PW|WaterTreatmentTechnology
|
|
216
|
+
SMPI|PW|WaterTreatmentTechnology|Other
|
|
217
|
+
SMPIIPW|TeatcareDilutionWaterSource|Other
|
|
218
|
+
status
|
package/TEMP/WEBAPP.txt
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
WEB-APP:
|
|
2
|
+
|
|
3
|
+
FI|A|Animal
|
|
4
|
+
FI|A|Fertility
|
|
5
|
+
FI|FI|BeddingFloorType
|
|
6
|
+
FI|FI|CalvingSystem
|
|
7
|
+
FI|FI|FarmingSystem
|
|
8
|
+
FI|FI|FarmingType
|
|
9
|
+
FI|FI|FeedPad
|
|
10
|
+
FI|FI|FeedPadCleaning
|
|
11
|
+
FI|FI|HerdHome
|
|
12
|
+
FI|FI|Lane
|
|
13
|
+
FI|FI|Slatted
|
|
14
|
+
FI|FI|StallType
|
|
15
|
+
FI|FI|WinteringBarn
|
|
16
|
+
FI|FS|Comment
|
|
17
|
+
FI|FS|IncurringPenalties
|
|
18
|
+
FI|FS|KnownCurrentIssues
|
|
19
|
+
FI|FS|Penalties|Bactoscan
|
|
20
|
+
FI|FS|Penalties|Coliform
|
|
21
|
+
FI|FS|Penalties|SCC
|
|
22
|
+
FI|FS|Penalties|Temperature
|
|
23
|
+
FI|FS|Penalties|Thermoduric
|
|
24
|
+
FI|FS|PenaltyTypes
|
|
25
|
+
FI|MM|Comment
|
|
26
|
+
FI|MM|IdentifyProcess
|
|
27
|
+
FI|MM|TreatmentsPerMonth
|
|
28
|
+
GI|1C|Email
|
|
29
|
+
GI|1C|FName
|
|
30
|
+
GI|1C|LName
|
|
31
|
+
GI|1C|PhNumber
|
|
32
|
+
GI|1C|Role
|
|
33
|
+
GI|2C|Email
|
|
34
|
+
GI|2C|FName
|
|
35
|
+
GI|2C|LName
|
|
36
|
+
GI|2C|PhNumber
|
|
37
|
+
GI|2C|Role
|
|
38
|
+
GI|VET|Address
|
|
39
|
+
GI|VET|Email
|
|
40
|
+
GI|VET|FName
|
|
41
|
+
GI|VET|LName
|
|
42
|
+
GI|VET|PhNumber
|
|
43
|
+
GI|VET|PracticeName
|
|
44
|
+
GI|VET|ReceiveReport
|
|
45
|
+
I|I|MiscComments
|
|
46
|
+
I|ID|IncubationTimestamp|JS
|
|
47
|
+
I|Images|HeldUpToLight
|
|
48
|
+
I|Images|OnAnAngle
|
|
49
|
+
I|Images|WhBackground
|
|
50
|
+
RI|RI|Date|JS
|
|
51
|
+
RI|RI|HerdID
|
|
52
|
+
RI|RI|MilkVolume
|
|
53
|
+
RI|RI|MilkVolumeUnit
|
|
54
|
+
RI|RI|NumAnimals
|
|
55
|
+
RI|RI|NumAnimalsInTank
|
|
56
|
+
RI|RI|SampleSource
|
|
57
|
+
RI|RI|SCC|Comments
|
|
58
|
+
RI|RI|SCC|Value
|
|
59
|
+
RI|RI|SubPopulation
|
|
60
|
+
SMPI|MP|MilkPickups
|
|
61
|
+
SMPI|MP|MilkPickups|Num
|
|
62
|
+
SMPI|MP|NumMilkingsPerDay
|
|
63
|
+
SMPI|MS|ACR
|
|
64
|
+
SMPI|MS|InShedFeeding
|
|
65
|
+
SMPI|MS|MilkingSystemMake
|
|
66
|
+
SMPI|MS|MilkingSystemMake|Name
|
|
67
|
+
SMPI|MS|MilkingSystemType
|
|
68
|
+
SMPI|MS|MSAge
|
|
69
|
+
SMPI|MS|NumOfBales
|
|
70
|
+
SMPI|PostI|ExtraEmolientActiveIngredients
|
|
71
|
+
SMPI|PostM|Comments
|
|
72
|
+
SMPI|PostM|DippingOrSpraying
|
|
73
|
+
SMPI|PostM|ExtraEmolientProductName
|
|
74
|
+
SMPI|PostM|ProductActiveConcentration
|
|
75
|
+
SMPI|PostM|ProductActiveIngredient
|
|
76
|
+
SMPI|PostM|ProductEmolientConcentration
|
|
77
|
+
SMPI|PostM|ProductName
|
|
78
|
+
SMPI|PostM|TeatCare|Brand
|
|
79
|
+
SMPI|PostM|TeatSprayingTechnology
|
|
80
|
+
SMPI|PostM|UseEmolient
|
|
81
|
+
SMPI|PreM|Dilution
|
|
82
|
+
SMPI|PreM|ProductName
|
|
83
|
+
SMPI|PreM|TeatCleanMethod
|
|
84
|
+
SMPI|PreM|TeatDisinfectActiveIngredient
|
|
85
|
+
SMPI|PreM|TeatDisinfectMethod
|
|
86
|
+
SMPI|PreM|TeatDisinfectTech
|
|
87
|
+
SMPI|PreM|TeatWipeMethod
|
|
88
|
+
SMPI|PreM|WashTemp
|
|
89
|
+
SMPI|PW|Comment
|
|
90
|
+
SMPI|PW|FarmWaterSource
|
|
91
|
+
SMPI|PW|TeatcareDilutionWaterSource
|
|
92
|
+
SMPI|PW|WaterTreatmentTechnology
|
package/TEMP/config.yaml
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
# Copyright 2020 Google LLC
|
|
2
|
+
#
|
|
3
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
# you may not use this file except in compliance with the License.
|
|
5
|
+
# You may obtain a copy of the License at
|
|
6
|
+
#
|
|
7
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
#
|
|
9
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
# See the License for the specific language governing permissions and
|
|
13
|
+
# limitations under the License.
|
|
14
|
+
|
|
15
|
+
# <== Enter custom agent configurations in this file.
|
|
16
|
+
# See https://cloud.google.com/stackdriver/docs/solutions/agents/ops-agent/configuration
|
|
17
|
+
# for more details.
|
|
18
|
+
|
|
19
|
+
logging:
|
|
20
|
+
receivers:
|
|
21
|
+
filemaker-event-log:
|
|
22
|
+
type: files
|
|
23
|
+
include_paths:
|
|
24
|
+
- "/opt/FileMaker/FileMaker Server/Logs/Event.log"
|
|
25
|
+
filemaker-access-log:
|
|
26
|
+
type: files
|
|
27
|
+
include_paths:
|
|
28
|
+
- "/opt/FileMaker/FileMaker Server/Logs/Access.log"
|
|
29
|
+
filemaker-fmdapi-log:
|
|
30
|
+
type: files
|
|
31
|
+
include_paths:
|
|
32
|
+
- "/opt/FileMaker/FileMaker Server/Logs/fmdapi.log"
|
|
33
|
+
service:
|
|
34
|
+
pipelines:
|
|
35
|
+
filemaker-event-pipeline:
|
|
36
|
+
receivers: [filemaker-event-log]
|
|
37
|
+
filemaker-access-pipeline:
|
|
38
|
+
receivers: [filemaker-access-log]
|
|
39
|
+
filemaker-fmdapi-pipeline:
|
|
40
|
+
receivers: [filemaker-fmdapi-log]
|