@jd-data-limited/easy-fm 1.1.6-alpha1 → 1.2.0-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 CHANGED
@@ -17,19 +17,11 @@ or [FileMaker Cloud](https://store.claris.com/filemaker-cloud). This module inte
17
17
 
18
18
  ---
19
19
 
20
- ## Table of contents
21
-
22
- 1. [Connecting to a database](#connecting-to-a-database)
23
- 1. [Username and password](#username-and-password)
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 fm, {FMError} from "easy-fm"; // Import the module
41
- const connection = new fm(
42
- // Connection options (see below)
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
- connection.login().then(token => {
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
- ## Username and password
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
- ## Token
60
+ One of (if not the) most common interactions you'll need to use is fetching records.
77
61
 
78
- If you have already created a session with the FileMaker Data API, you can use this to import your session.
62
+ ### Fetch a range of records
79
63
 
80
64
  ```javascript
81
- new fm({
82
- hostname: "localhost",
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
- ## Claris Account (FileMaker Cloud)
68
+ range_request.setOffset(50) // Starting from the 50th record...
69
+ range_request.setLimit(100) // Fetch 100 records
117
70
 
118
- (untested) If you'd prefer to use a claris account to login, you can
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
- ### Modify a record
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 record_id = 1
172
- let record = layout.getRecord(record_id)
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
- ### Create a new record
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
- ```javascript
184
- let record = await layout.createRecord()
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
- > **WARNING:** The record is *not* created on the database server until a `commit()` step is done.x
89
+ ### Fetch a record using its record ID
191
90
 
192
- ### Downloading container field files
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 record_id = 1
196
- let record = layout.getRecord(record_id)
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
- [IncomingMessage](https://nodejs.org/api/http.html#class-httpincomingmessage)
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
- const fs = require("fs")
217
- let filename = "image.jpg"
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
- ### Read and modify portal information
106
+ record.getField("Field1").set("Value here")
107
+ record.getField("Field2").set("Value here")
108
+ record.getField("Field3").set("Value here")
234
109
 
235
- To be able to read portal information for a record, you'll need to put a portal on the layout you are using. Make sure
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
- > **WARNING**: Commiting a related portal record will also commit any changes to the parent record as well as any other
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
- ![img.png](img.png)
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 find = layout.newFind() // Create a new find operation
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
- ### Scripts
119
+ record.getField("Field1").set("Value here")
120
+ record.getField("Field2").set("Value here")
121
+ record.getField("Field3").set("Value here")
287
122
 
288
- Running scripts is another operation you may need to do regularly. This one is fairly straight-forward in how it works
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
- ## Index
128
+ ## FMHost
304
129
 
305
- ### RecordID
130
+ `hostname`: string
131
+ > The hostname of the server you are connecting to
306
132
 
307
- This is not a custom field that can be set and/or changed. You can get a record's ID from within FileMaker by
308
- using `Get(RecordID)`
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
@@ -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
@@ -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]