Skip to content

Commit e5a5782

Browse files
committed
Merge branch 'master' into localstack-s3-latest
2 parents 83d7d6f + f101c24 commit e5a5782

112 files changed

Lines changed: 3640 additions & 299 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

NEWS.md

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,52 @@
1-
## Unreleased v3.5.0
1+
## Unreleased v3.6.0
2+
3+
### Stories
4+
[MODEXPW-630](https://folio-org.atlassian.net/browse/MODEXPW-630) eholdings export: Add additional export fields
5+
6+
## 2026-06-04 v3.5.1
7+
8+
[Full Changelog](https://github.com/folio-org/mod-data-export-worker/compare/v3.5.0...v3.5.1)
9+
10+
### Stories
11+
[MODEXPW-634](https://folio-org.atlassian.net/browse/MODEXPW-634) Use contains lookup to retrieve agreement lines for all titles in a package in a single query
12+
13+
## 2026-04-16 v3.5.0
14+
15+
[Full Changelog](https://github.com/folio-org/mod-data-export-worker/compare/v3.4.14...v3.5.0)
16+
17+
### Bugs
18+
[MODEXPW-607](https://folio-org.atlassian.net/browse/MODEXPW-607) Amount of circulation log records returned by filter and exported do not match for annual export
19+
[MODEXPW-596](https://folio-org.atlassian.net/browse/MODEXPW-596) Remove currency code from EDI Order PRI+AAB line
20+
[MODEXPW-559](https://folio-org.atlassian.net/browse/MODEXPW-559) Colon separating type and code in "Statistical code" column is encoded in the file with Matching records
21+
[MODEXPW-637](https://folio-org.atlassian.net/browse/MODEXPW-637) Fix spring batch configuration to use jdbc repository
22+
23+
### Stories
24+
[MODEXPW-611](https://folio-org.atlassian.net/browse/MODEXPW-611) Remove mod-configuration usage to get tenant addresses
25+
[MODEXPW-603](https://folio-org.atlassian.net/browse/MODEXPW-603) Support EDIFACT export of orders with member tenant locations when Central Ordering is enabled
26+
[MODEXPW-598](https://folio-org.atlassian.net/browse/MODEXPW-598) Remove Bulk edit job references
27+
[MODEXPW-594](https://folio-org.atlassian.net/browse/MODEXPW-594) Upgrade Spring Boot version
28+
[MODEXPW-588](https://folio-org.atlassian.net/browse/MODEXPW-588) Move mod-data-export-spring, mod-data-export-worker and folio_export-manager from app-platform-complete due to their dependency on app-acquisitions interfaces
29+
[MODEXPW-584](https://folio-org.atlassian.net/browse/MODEXPW-584) Update EDI claim file format
30+
[MODEXPW-583](https://folio-org.atlassian.net/browse/MODEXPW-583) Instance schema updating - new field "deleted"
31+
[MODEXPW-574](https://folio-org.atlassian.net/browse/MODEXPW-574) Rendering Instance record Classifications in UI and downloadable files
32+
[MODEXPW-573](https://folio-org.atlassian.net/browse/MODEXPW-573) Rendering Instance record Subjects in UI and downloadable files
33+
[MODORDERS-1269](https://folio-org.atlassian.net/browse/MODORDERS-1269) Remove alerts and reporting codes from order lines, use a single order line schema
34+
[MODORDSTOR-448](https://folio-org.atlassian.net/browse/MODORDSTOR-448) Make user limit as string field & apply migration
35+
36+
### Tech debts
37+
[MODEXPW-600](https://folio-org.atlassian.net/browse/MODEXPW-600) Bump opencsv from 5.7.1 to 5.11.2 fixing commons-beanutils CVE-2025-48734
38+
[MODEXPW-581](https://folio-org.atlassian.net/browse/MODEXPW-581) Duplicate entry errors are not reported when upload file with more than 5000 of identifiers in Bulk edit
39+
[MODEXPW-579](https://folio-org.atlassian.net/browse/MODEXPW-579) Remove unused openssh sshpass (sftp) from Dockerfile
40+
41+
### Technical tasks
42+
[FOLIO-4308](https://folio-org.atlassian.net/browse/FOLIO-4308) Init app-agreements
43+
[MODEXPW-606](https://folio-org.atlassian.net/browse/MODEXPW-606) Move status configuration from data-export-worker to mod-bulk-ops
44+
[MODEXPW-605](https://folio-org.atlassian.net/browse/MODEXPW-605) Make eholdings interface optional
45+
[MODEXPW-604](https://folio-org.atlassian.net/browse/MODEXPW-604) [Bursar] Clarify exception messaging for the case where no accounts are found
46+
[MODEXPW-601](https://folio-org.atlassian.net/browse/MODEXPW-601) Update for Split Search & Browse APIs
47+
[MODEXPW-595](https://folio-org.atlassian.net/browse/MODEXPW-595) Use mod-settings to get Language & locale setting selections
48+
[MODEXPW-593](https://folio-org.atlassian.net/browse/MODEXPW-593) Setup dependabot for your module
49+
250
### Stories
351
* [MODEXPW-576](https://folio-org.atlassian.net/browse/MODEXPW-576) Enhance "MARC authority headings update" Report with Record Type Column Based on Consortium Environment.
452
* [MODEXPW-619](https://folio-org.atlassian.net/browse/MODEXPW-619) Remove the Linked bib fields column for the Authority headings change report

README.md

Lines changed: 160 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ This value should be `true` if AWS S3 is used as storage.
3737
| KAFKA_HOST | localhost | Kafka broker hostname |
3838
| KAFKA_PORT | 9092 | Kafka broker port |
3939
| KAFKA_CONSUMER_POLL_INTERVAL | 3600000 | Max interval before next poll. If long record processing is in place and interval exceeded then consumer will be kicked out of the group and another consumer will start processing the same message. |
40+
| OKAPI_URL | http://okapi:9130 | Okapi url |
4041
| ENV | folio | Environment name |
4142
| S3_URL | http://127.0.0.1:9000/ | AWS url |
4243
| S3_REGION | - | AWS region |
@@ -51,11 +52,169 @@ This value should be `true` if AWS S3 is used as storage.
5152
| KAFKA_CONCURRENCY_LEVEL | 30 | Concurrency level of kafka listener |
5253
| E_HOLDINGS_BATCH_JOB_CHUNK_SIZE | 100 | Specify chunk size for eHoldings export job which will be used to query data from kb-ebsco, write to database, read from database and write to file |
5354
| E_HOLDINGS_BATCH_KB_EBSCO_CHUNK_SIZE | 100 | Amount to retrieve per request to mod-kb-ebsco-java (100 is max acceptable value) |
55+
| E_HOLDINGS_BATCH_ENTITLEMENTS_PER_PAGE | 100 | Page size for bulk entitlements lookup |
5456
| AUTHORITY_CONTROL_BATCH_JOB_CHUNK_SIZE | 100 | Specify chunk size for authority control export job which will be used to query data from entities-links, and write to file |
5557
| AUTHORITY_CONTROL_BATCH_ENTITIES_LINKS_CHUNK_SIZE | 100 | Amount to retrieve per request to mod-entities-links |
5658
| MAX_UPLOADED_FILE_SIZE | 40MB | Specifies multipart upload file size |
5759
| PLATFORM | okapi | Specifies if okapi or eureka platform |
5860
| CHUNKS | 100 | Number of items being passed to write at once |
5961
| CORE_POOL_SIZE | 10 | Maximum number of threads being created for each task before the queue is utilized |
6062
| MAX_POOL_SIZE | 10 | Maximum number of threads that can be created after the queue is full and before rejecting the new tasks |
61-
| BUCKET_SIZE | 50 | Size of the bucket used in partitioning parameters |
63+
| BUCKET_SIZE | 50 | Size of the bucket used in partitioning parameters |
64+
65+
### Order Email — Template Context Payload
66+
67+
This is the `context` payload sent to **mod-template-engine** when an `EDIFACT_ORDERS_EXPORT` job is transmitted by **Email**.
68+
69+
#### Structure overview
70+
71+
```
72+
OrderEmailContext
73+
├── createdAt # context build time, ISO-8601 UTC with millis (e.g. 2026-03-30T16:22:13.284Z)
74+
├── organization
75+
│ ├── name
76+
│ └── primaryAddress # address flagged isPrimary
77+
│ ├── addressLine1
78+
│ ├── city
79+
│ ├── zipCode
80+
│ └── country
81+
└── orders[] # multiple entries
82+
├── order
83+
│ ├── poNumber
84+
│ ├── orderType
85+
│ ├── metadata
86+
│ │ └── createdByUser # resolved from metadata.createdByUserId via mod-users
87+
│ │ ├── id
88+
│ │ ├── firstName
89+
│ │ ├── lastName
90+
│ │ └── fullName
91+
│ ├── shipTo # resolved from shipTo UUID via tenant-addresses
92+
│ │ ├── id
93+
│ │ └── address
94+
│ └── billTo # resolved from billTo UUID via tenant-addresses
95+
│ ├── id
96+
│ └── address
97+
└── orderLines[] # multiple entries
98+
└── orderLine
99+
├── poLineNumber
100+
├── titleOrPackage
101+
├── publisher
102+
├── publicationDate
103+
├── edition
104+
├── rush
105+
├── contributors[] # multiple entries
106+
│ ├── contributor
107+
│ └── contributorNameType # resolved type name (e.g. Personal name, Corporate name)
108+
│ ├── id
109+
│ └── name
110+
├── details
111+
│ └── productIds[] # multiple entries
112+
│ ├── productId
113+
│ ├── qualifier
114+
│ └── productIdType # resolved type name (e.g. ISBN, ASIN)
115+
│ ├── id
116+
│ └── name
117+
├── cost
118+
│ ├── listUnitPrice
119+
│ ├── listUnitPriceElectronic
120+
│ ├── quantityPhysical
121+
│ ├── quantityElectronic
122+
│ ├── poLineEstimatedPrice
123+
│ └── currency
124+
├── fundDistribution[] # multiple entries
125+
│ └── code # code taken as-is from the PO line; fundId is not resolved
126+
└── vendorDetail
127+
└── instructions # vendor instructions
128+
```
129+
> **Null/empty policy:** missing values are rendered as safe defaults rather than
130+
> `null`, so templates can reference any field without null checks.
131+
132+
#### Example payload
133+
134+
```json
135+
{
136+
"createdAt": "2026-03-30T16:22:13.284Z",
137+
"organization": {
138+
"name": "GOBI Library Solutions",
139+
"primaryAddress": {
140+
"addressLine1": "1 Innovation Way",
141+
"city": "Contoocook",
142+
"zipCode": "03229",
143+
"country": "USA"
144+
}
145+
},
146+
"orders": [
147+
{
148+
"order": {
149+
"poNumber": "10000",
150+
"orderType": "One-Time",
151+
"metadata": {
152+
"createdByUser": {
153+
"id": "7a626480-284e-5b55-9cf2-db32f93956cf",
154+
"firstName": "John",
155+
"lastName": "Doe",
156+
"fullName": "John Doe"
157+
}
158+
},
159+
"shipTo": {
160+
"id": "11111111-1111-1111-1111-111111111111",
161+
"address": "SLUB Dresden, Zellescher Weg 18, 01069 Dresden"
162+
},
163+
"billTo": {
164+
"id": "22222222-2222-2222-2222-222222222222",
165+
"address": "Accounts Payable, PO Box 42, Springfield IL"
166+
}
167+
},
168+
"orderLines": [
169+
{
170+
"orderLine": {
171+
"poLineNumber": "10000-1",
172+
"titleOrPackage": "Introduction to FOLIO",
173+
"publisher": "FOLIO Press",
174+
"publicationDate": "2020",
175+
"edition": "2nd",
176+
"rush": false,
177+
"contributors": [
178+
{
179+
"contributor": "Jane Author",
180+
"contributorNameType": {
181+
"id": "2b94c631-fca9-4892-a730-03ee529ffe2a",
182+
"name": "Personal name"
183+
}
184+
}
185+
],
186+
"details": {
187+
"productIds": [
188+
{
189+
"productId": "978-3-16-148410-0",
190+
"qualifier": "",
191+
"productIdType": {
192+
"id": "8261054f-be78-422d-bd51-4ed9f33c3422",
193+
"name": "ISBN"
194+
}
195+
}
196+
]
197+
},
198+
"cost": {
199+
"listUnitPrice": "49.99",
200+
"listUnitPriceElectronic": "0.00",
201+
"quantityPhysical": 2,
202+
"quantityElectronic": 0,
203+
"poLineEstimatedPrice": "99.98",
204+
"currency": "USD"
205+
},
206+
"fundDistribution": [
207+
{
208+
"code": "USHIST"
209+
}
210+
],
211+
"vendorDetail": {
212+
"instructions": "Deliver to loading dock, ring bell on arrival"
213+
}
214+
}
215+
}
216+
]
217+
}
218+
]
219+
}
220+
```

descriptors/ModuleDescriptor-template.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,10 @@
5454
"id": "identifier-types",
5555
"version": "1.2"
5656
},
57+
{
58+
"id": "contributor-name-types",
59+
"version": "1.2"
60+
},
5761
{
5862
"id": "ill-policies",
5963
"version": "1.0"
@@ -160,6 +164,14 @@
160164
"id": "data-export-spring",
161165
"version": "2.0"
162166
},
167+
{
168+
"id": "email",
169+
"version": "1.1"
170+
},
171+
{
172+
"id": "template-engine",
173+
"version": "2.2"
174+
},
163175
{
164176
"id": "users-keycloak",
165177
"version": "1.0"

pom.xml

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
<groupId>org.folio</groupId>
1313
<artifactId>mod-data-export-worker</artifactId>
1414
<description>Data Export Worker module</description>
15-
<version>3.5.0-SNAPSHOT</version>
15+
<version>3.6.0-SNAPSHOT</version>
1616
<packaging>jar</packaging>
1717

1818
<licenses>
@@ -47,8 +47,11 @@
4747
<refresh-presigned-url.yaml.file>
4848
${project.basedir}/src/main/resources/swagger.api/refresh-presigned-url.yaml
4949
</refresh-presigned-url.yaml.file>
50-
<folio-spring-base.version>10.0.0-RC1</folio-spring-base.version>
51-
<folio-service-tools.version>4.1.1</folio-service-tools.version>
50+
<email.yaml.file>
51+
${project.basedir}/src/main/resources/swagger.api/email.yaml
52+
</email.yaml.file>
53+
<folio-spring-base.version>10.0.0</folio-spring-base.version>
54+
<folio-service-tools.version>6.0.0</folio-service-tools.version>
5255
<folio-spring-cql.version>9.0.0</folio-spring-cql.version>
5356
<folio-module-descriptor-validator.version>1.0.0</folio-module-descriptor-validator.version>
5457
<openapi-generator.version>6.2.1</openapi-generator.version>
@@ -58,6 +61,9 @@
5861
<marc4j.version>2.9.2</marc4j.version>
5962
<streamex.version>0.8.3</streamex.version>
6063

64+
<!-- overrides Spring Boot BOM default; can be removed once Spring Boot ships this version -->
65+
<kafka.version>4.2.0</kafka.version>
66+
6167
<!-- Test properties-->
6268
<junit-extensions.version>2.4.0</junit-extensions.version>
6369
<spring-cloud-starter-bootstrap.version>4.2.0</spring-cloud-starter-bootstrap.version>
@@ -67,7 +73,7 @@
6773
<testcontainers.version>2.0.3</testcontainers.version>
6874
<testcontainers.extensions.version>1.21.4</testcontainers.extensions.version>
6975
<aws.sdk.version>2.40.2</aws.sdk.version>
70-
<folio-s3-client.version>3.0.0-SNAPSHOT</folio-s3-client.version>
76+
<folio-s3-client.version>3.0.0</folio-s3-client.version>
7177
<hamcrest-all.version>1.3</hamcrest-all.version>
7278
<mockito-inline.version>5.2.0</mockito-inline.version>
7379

@@ -579,6 +585,32 @@
579585
</configOptions>
580586
</configuration>
581587
</execution>
588+
<execution>
589+
<id>email-worker</id>
590+
<goals>
591+
<goal>generate</goal>
592+
</goals>
593+
<configuration>
594+
<inputSpec>${email.yaml.file}</inputSpec>
595+
<output>${project.build.directory}/generated-sources</output>
596+
<generatorName>spring</generatorName>
597+
<modelPackage>${project.groupId}.dew.domain.dto.email</modelPackage>
598+
<generateApis>false</generateApis>
599+
<generateApiTests>false</generateApiTests>
600+
<generateApiDocumentation>false</generateApiDocumentation>
601+
<generateModels>true</generateModels>
602+
<generateModelTests>false</generateModelTests>
603+
<generateSupportingFiles>true</generateSupportingFiles>
604+
<generateModelDocumentation>true</generateModelDocumentation>
605+
<supportingFilesToGenerate>ApiUtil.java</supportingFilesToGenerate>
606+
<configOptions>
607+
<java8>true</java8>
608+
<dateLibrary>java</dateLibrary>
609+
<interfaceOnly>true</interfaceOnly>
610+
<useSpringBoot3>true</useSpringBoot3>
611+
</configOptions>
612+
</configuration>
613+
</execution>
582614
</executions>
583615
</plugin>
584616

0 commit comments

Comments
 (0)