folio-migration-tools 1.2.1__py3-none-any.whl → 1.9.10__py3-none-any.whl

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.
Files changed (73) hide show
  1. folio_migration_tools/__init__.py +11 -0
  2. folio_migration_tools/__main__.py +169 -85
  3. folio_migration_tools/circulation_helper.py +96 -59
  4. folio_migration_tools/config_file_load.py +66 -0
  5. folio_migration_tools/custom_dict.py +6 -4
  6. folio_migration_tools/custom_exceptions.py +21 -19
  7. folio_migration_tools/extradata_writer.py +46 -0
  8. folio_migration_tools/folder_structure.py +63 -66
  9. folio_migration_tools/helper.py +29 -21
  10. folio_migration_tools/holdings_helper.py +57 -34
  11. folio_migration_tools/i18n_config.py +9 -0
  12. folio_migration_tools/library_configuration.py +173 -13
  13. folio_migration_tools/mapper_base.py +317 -106
  14. folio_migration_tools/mapping_file_transformation/courses_mapper.py +203 -0
  15. folio_migration_tools/mapping_file_transformation/holdings_mapper.py +83 -69
  16. folio_migration_tools/mapping_file_transformation/item_mapper.py +98 -94
  17. folio_migration_tools/mapping_file_transformation/manual_fee_fines_mapper.py +352 -0
  18. folio_migration_tools/mapping_file_transformation/mapping_file_mapper_base.py +702 -223
  19. folio_migration_tools/mapping_file_transformation/notes_mapper.py +90 -0
  20. folio_migration_tools/mapping_file_transformation/order_mapper.py +492 -0
  21. folio_migration_tools/mapping_file_transformation/organization_mapper.py +389 -0
  22. folio_migration_tools/mapping_file_transformation/ref_data_mapping.py +38 -27
  23. folio_migration_tools/mapping_file_transformation/user_mapper.py +149 -361
  24. folio_migration_tools/marc_rules_transformation/conditions.py +650 -246
  25. folio_migration_tools/marc_rules_transformation/holdings_statementsparser.py +292 -130
  26. folio_migration_tools/marc_rules_transformation/hrid_handler.py +244 -0
  27. folio_migration_tools/marc_rules_transformation/loc_language_codes.xml +20846 -0
  28. folio_migration_tools/marc_rules_transformation/marc_file_processor.py +300 -0
  29. folio_migration_tools/marc_rules_transformation/marc_reader_wrapper.py +136 -0
  30. folio_migration_tools/marc_rules_transformation/rules_mapper_authorities.py +241 -0
  31. folio_migration_tools/marc_rules_transformation/rules_mapper_base.py +681 -201
  32. folio_migration_tools/marc_rules_transformation/rules_mapper_bibs.py +395 -429
  33. folio_migration_tools/marc_rules_transformation/rules_mapper_holdings.py +531 -100
  34. folio_migration_tools/migration_report.py +85 -38
  35. folio_migration_tools/migration_tasks/__init__.py +1 -3
  36. folio_migration_tools/migration_tasks/authority_transformer.py +119 -0
  37. folio_migration_tools/migration_tasks/batch_poster.py +911 -198
  38. folio_migration_tools/migration_tasks/bibs_transformer.py +121 -116
  39. folio_migration_tools/migration_tasks/courses_migrator.py +192 -0
  40. folio_migration_tools/migration_tasks/holdings_csv_transformer.py +252 -247
  41. folio_migration_tools/migration_tasks/holdings_marc_transformer.py +321 -115
  42. folio_migration_tools/migration_tasks/items_transformer.py +264 -84
  43. folio_migration_tools/migration_tasks/loans_migrator.py +506 -195
  44. folio_migration_tools/migration_tasks/manual_fee_fines_transformer.py +187 -0
  45. folio_migration_tools/migration_tasks/migration_task_base.py +364 -74
  46. folio_migration_tools/migration_tasks/orders_transformer.py +373 -0
  47. folio_migration_tools/migration_tasks/organization_transformer.py +451 -0
  48. folio_migration_tools/migration_tasks/requests_migrator.py +130 -62
  49. folio_migration_tools/migration_tasks/reserves_migrator.py +253 -0
  50. folio_migration_tools/migration_tasks/user_transformer.py +180 -139
  51. folio_migration_tools/task_configuration.py +46 -0
  52. folio_migration_tools/test_infrastructure/__init__.py +0 -0
  53. folio_migration_tools/test_infrastructure/mocked_classes.py +406 -0
  54. folio_migration_tools/transaction_migration/legacy_loan.py +148 -34
  55. folio_migration_tools/transaction_migration/legacy_request.py +65 -25
  56. folio_migration_tools/transaction_migration/legacy_reserve.py +47 -0
  57. folio_migration_tools/transaction_migration/transaction_result.py +12 -1
  58. folio_migration_tools/translations/en.json +476 -0
  59. folio_migration_tools-1.9.10.dist-info/METADATA +169 -0
  60. folio_migration_tools-1.9.10.dist-info/RECORD +67 -0
  61. {folio_migration_tools-1.2.1.dist-info → folio_migration_tools-1.9.10.dist-info}/WHEEL +1 -2
  62. folio_migration_tools-1.9.10.dist-info/entry_points.txt +3 -0
  63. folio_migration_tools/generate_schemas.py +0 -46
  64. folio_migration_tools/mapping_file_transformation/mapping_file_mapping_base_impl.py +0 -44
  65. folio_migration_tools/mapping_file_transformation/user_mapper_base.py +0 -212
  66. folio_migration_tools/marc_rules_transformation/bibs_processor.py +0 -163
  67. folio_migration_tools/marc_rules_transformation/holdings_processor.py +0 -284
  68. folio_migration_tools/report_blurbs.py +0 -219
  69. folio_migration_tools/transaction_migration/legacy_fee_fine.py +0 -36
  70. folio_migration_tools-1.2.1.dist-info/METADATA +0 -134
  71. folio_migration_tools-1.2.1.dist-info/RECORD +0 -50
  72. folio_migration_tools-1.2.1.dist-info/top_level.txt +0 -1
  73. {folio_migration_tools-1.2.1.dist-info → folio_migration_tools-1.9.10.dist-info/licenses}/LICENSE +0 -0
@@ -1,163 +0,0 @@
1
- """ Class that processes each MARC record """
2
- import json
3
- import logging
4
-
5
- from folio_uuid.folio_uuid import FOLIONamespaces
6
- from folioclient import FolioClient
7
- from folio_migration_tools.custom_exceptions import TransformationRecordFailedError
8
- from folio_migration_tools.folder_structure import FolderStructure
9
- from folio_migration_tools.helper import Helper
10
- from folio_migration_tools.marc_rules_transformation.rules_mapper_bibs import (
11
- BibsRulesMapper,
12
- )
13
- from folio_migration_tools.migration_report import MigrationReport
14
- from folio_migration_tools.report_blurbs import Blurbs
15
- from pymarc.record import Record
16
-
17
-
18
- class BibsProcessor:
19
- """the processor"""
20
-
21
- def __init__(
22
- self,
23
- mapper: BibsRulesMapper,
24
- folio_client: FolioClient,
25
- results_file,
26
- folder_structure: FolderStructure,
27
- ):
28
- self.results_file = results_file
29
- self.folio_client = folio_client
30
- self.instance_schema = folio_client.get_instance_json_schema()
31
- self.mapper: BibsRulesMapper = mapper
32
- self.folders = folder_structure
33
- self.srs_records_file = open(self.folders.srs_records_path, "w+")
34
- self.instance_id_map_file = open(self.folders.instance_id_map_path, "w+")
35
- self.instance_identifiers = set()
36
-
37
- def process_record(self, idx, marc_record: Record, suppressed: bool):
38
- """processes a marc record and saves it"""
39
- folio_rec = None
40
- legacy_ids = []
41
- try:
42
- legacy_ids = self.mapper.get_legacy_ids(
43
- marc_record, self.mapper.task_configuration.ils_flavour, idx
44
- )
45
- if not legacy_ids:
46
- raise TransformationRecordFailedError(
47
- f"Index in file: {idx}", "No legacy id found", idx
48
- )
49
- # Transform the MARC21 to a FOLIO record
50
- folio_rec = self.mapper.parse_bib(legacy_ids, marc_record, suppressed)
51
- if prec_titles := folio_rec.get("precedingTitles", []):
52
- self.mapper.migration_report.add(
53
- Blurbs.PrecedingSuccedingTitles, f"{len(prec_titles)}"
54
- )
55
- del folio_rec["precedingTitles"]
56
- if succ_titles := folio_rec.get("succeedingTitles", []):
57
- del folio_rec["succeedingTitles"]
58
- self.mapper.migration_report.add(
59
- Blurbs.PrecedingSuccedingTitles, f"{len(succ_titles)}"
60
- )
61
- filtered_legacy_ids = self.get_valid_instance_ids(
62
- folio_rec,
63
- legacy_ids,
64
- self.instance_identifiers,
65
- self.mapper.migration_report,
66
- )
67
- self.save_instance_ids_to_file(suppressed, folio_rec, filtered_legacy_ids)
68
- Helper.write_to_file(self.results_file, folio_rec)
69
- self.mapper.save_source_record(
70
- self.srs_records_file,
71
- FOLIONamespaces.instances,
72
- self.folio_client,
73
- marc_record,
74
- folio_rec,
75
- legacy_ids[0],
76
- suppressed,
77
- )
78
- self.mapper.migration_report.add_general_statistics(
79
- "Records successfully transformed into FOLIO objects"
80
- )
81
- except ValueError as value_error:
82
- self.mapper.migration_report.add(
83
- Blurbs.FieldMappingErrors,
84
- f"{value_error} for {legacy_ids} ",
85
- )
86
- self.mapper.migration_report.add_general_statistics(
87
- "Records that failed transformation. Check log for details",
88
- )
89
- except TransformationRecordFailedError as error:
90
- self.mapper.migration_report.add_general_statistics(
91
- "Records that failed transformation. Check log for details",
92
- )
93
- error.id = legacy_ids
94
- error.log_it()
95
-
96
- except Exception as inst:
97
- self.mapper.migration_report.add_general_statistics(
98
- "Records that failed Due to a unhandled exception",
99
- )
100
- self.mapper.migration_report.add_general_statistics(
101
- f"Transformation exceptions: {inst.__class__.__name__}",
102
- )
103
- logging.error(type(inst))
104
- logging.error(inst.args)
105
- logging.error(inst)
106
- logging.error(marc_record)
107
- if folio_rec:
108
- logging.error(folio_rec)
109
- raise inst from inst
110
-
111
- def save_instance_ids_to_file(self, suppressed, folio_rec, filtered_legacy_ids):
112
- for legacy_id in filtered_legacy_ids:
113
- self.instance_identifiers.add(legacy_id)
114
- s = json.dumps(
115
- {
116
- "legacy_id": legacy_id,
117
- "folio_id": folio_rec["id"],
118
- "instance_hrid": folio_rec["hrid"],
119
- "suppressed": suppressed,
120
- }
121
- )
122
- self.instance_id_map_file.write(f"{s}\n")
123
- self.mapper.migration_report.add_general_statistics(
124
- "Lines written to identifier map"
125
- )
126
-
127
- @staticmethod
128
- def get_valid_instance_ids(
129
- folio_rec, legacy_ids, instance_identifiers, migration_report: MigrationReport
130
- ):
131
- new_ids = set()
132
- for legacy_id in legacy_ids:
133
- if legacy_id not in instance_identifiers:
134
- new_ids.add(legacy_id)
135
- else:
136
- s = "Duplicate Instance identifiers "
137
- migration_report.add_general_statistics(s)
138
- Helper.log_data_issue(legacy_id, s, "-".join(legacy_ids))
139
- logging.error(s)
140
- if not any(new_ids):
141
- s = "Failed records. No unique bib identifiers in legacy record"
142
- migration_report.add_general_statistics(s)
143
- raise TransformationRecordFailedError(
144
- "-".join(legacy_ids),
145
- "Duplicate recod identifier(s). See logs. Record Failed",
146
- "-".join(legacy_ids),
147
- )
148
- return list(new_ids)
149
-
150
- def wrap_up(self): # sourcery skip: remove-redundant-fstring
151
- """Finalizes the mapping by writing things out."""
152
- try:
153
- self.mapper.wrap_up()
154
- except Exception:
155
- logging.exception("error during wrap up")
156
- if any(self.mapper.holdings_map):
157
- logging.info("Saving holdings created from bibs")
158
- holdings_path = self.folders.data_folder / "folio_holdings_from_bibs.json"
159
- with open(holdings_path, "w+") as holdings_file:
160
- for key, holding in self.mapper.holdings_map.items():
161
- Helper.write_to_file(holdings_file, holding)
162
- self.srs_records_file.close()
163
- self.instance_id_map_file.close()
@@ -1,284 +0,0 @@
1
- """ Class that processes each MARC record """
2
- import logging
3
- import sys
4
- import time
5
- import traceback
6
- from datetime import datetime as dt
7
- from folio_uuid.folio_namespaces import FOLIONamespaces
8
- from pymarc import Record
9
- from folio_migration_tools import library_configuration
10
- from pymarc import Field
11
- from folio_migration_tools.custom_exceptions import (
12
- TransformationProcessError,
13
- TransformationRecordFailedError,
14
- )
15
- from folio_migration_tools.folder_structure import FolderStructure
16
- from folio_migration_tools.helper import Helper
17
- from folio_migration_tools.holdings_helper import HoldingsHelper
18
- from folio_migration_tools.library_configuration import (
19
- FileDefinition,
20
- FolioRelease,
21
- HridHandling,
22
- )
23
- from folio_migration_tools.marc_rules_transformation.rules_mapper_holdings import (
24
- RulesMapperHoldings,
25
- )
26
- from folio_migration_tools.report_blurbs import Blurbs
27
-
28
-
29
- class HoldingsProcessor:
30
- """the processor"""
31
-
32
- def __init__(self, mapper, folder_structure: FolderStructure):
33
- self.folder_structure: FolderStructure = folder_structure
34
- self.records_count = 0
35
- self.unique_001s = set()
36
- self.failed_records_count = 0
37
- self.mapper: RulesMapperHoldings = mapper
38
- self.start = time.time()
39
- self.created_objects_file = open(
40
- self.folder_structure.created_objects_path, "w+"
41
- )
42
- self.srs_records_file = open(self.folder_structure.srs_records_path, "w+")
43
- self.setup_holdings_sources()
44
-
45
- def setup_holdings_sources(self):
46
- if library_configuration.FolioRelease != FolioRelease.juniper:
47
- holdings_sources = list(
48
- self.mapper.folio_client.folio_get_all(
49
- "/holdings-sources", "holdingsRecordsSources"
50
- )
51
- )
52
- logging.info(
53
- "Fetched %s holdingsRecordsSources from tenant", len(holdings_sources)
54
- )
55
- self.holdingssources = {
56
- n["name"].upper(): n["id"] for n in holdings_sources
57
- }
58
- if "FOLIO" not in self.holdingssources:
59
- raise TransformationProcessError(
60
- "", "No holdings source with name FOLIO in tenant"
61
- )
62
- if "MARC" not in self.holdingssources:
63
- raise TransformationProcessError(
64
- "", "No holdings source with name MARC in tenant"
65
- )
66
- else:
67
- self.holdingssources = {}
68
-
69
- def exit_on_too_many_exceptions(self):
70
- if (
71
- self.failed_records_count / (self.records_count + 1)
72
- > (self.mapper.library_configuration.failed_percentage_threshold / 100)
73
- and self.failed_records_count
74
- > self.mapper.library_configuration.failed_records_threshold
75
- ):
76
- logging.critical("More than 20 percent of the records have failed. Halting")
77
- sys.exit(1)
78
-
79
- def process_record(self, marc_record: Record, file_def: FileDefinition):
80
- """processes a marc holdings record and saves it"""
81
- success = True
82
- folio_rec = {}
83
- try:
84
- self.records_count += 1
85
- # Transform the MARC21 to a FOLIO record
86
- legacy_id = self.get_legacy_id(
87
- self.mapper.task_configuration.legacy_id_marc_path, marc_record
88
- )
89
- if not legacy_id:
90
- raise TransformationRecordFailedError(
91
- self.records_count,
92
- "legacy_id was empty",
93
- self.mapper.task_configuration.legacy_id_marc_path,
94
- )
95
- folio_rec = self.mapper.parse_hold(marc_record, legacy_id)
96
- HoldingsHelper.handle_notes(folio_rec)
97
- if not folio_rec.get("instanceId", ""):
98
- raise TransformationRecordFailedError(
99
- "".join(folio_rec.get("formerIds", [])),
100
- "Missing instance ids. Something is wrong.",
101
- "",
102
- )
103
- folio_rec["discoverySuppress"] = file_def.suppressed
104
- self.set_source_id(
105
- self.mapper.task_configuration, folio_rec, self.holdingssources
106
- )
107
- self.set_hrid(marc_record, folio_rec)
108
- self.save_srs_record(marc_record, file_def, folio_rec, legacy_id)
109
- Helper.write_to_file(self.created_objects_file, folio_rec)
110
- self.mapper.migration_report.add_general_statistics(
111
- "Holdings records written to disk"
112
- )
113
-
114
- self.exit_on_too_many_exceptions()
115
- except TransformationRecordFailedError as error:
116
- success = False
117
- error.log_it()
118
- self.mapper.migration_report.add_general_statistics(
119
- "Records that failed transformation. Check log for details",
120
- )
121
- except TransformationProcessError as tpe:
122
- raise tpe from tpe
123
- except Exception as inst:
124
- success = False
125
- traceback.print_exc()
126
- logging.error(type(inst))
127
- logging.error(inst.args)
128
- logging.error(inst)
129
- logging.error(marc_record)
130
- logging.error(folio_rec)
131
- raise inst from inst
132
- finally:
133
- if not success:
134
- self.failed_records_count += 1
135
- remove_from_id_map = getattr(self.mapper, "remove_from_id_map", None)
136
- if (
137
- callable(remove_from_id_map)
138
- and "folio_rec" in locals()
139
- and folio_rec.get("formerIds", "")
140
- ):
141
- self.mapper.remove_from_id_map(folio_rec["formerIds"])
142
-
143
- @staticmethod
144
- def get_legacy_id(marc_path: str, marc_record: Record):
145
- split = marc_path.split("$", maxsplit=1)
146
- if not (split[0].isnumeric() and len(split[0]) == 3):
147
- raise TransformationProcessError(
148
- "",
149
- (
150
- "the marc field used for determining the legacy id is not numeric "
151
- "or does not have the stipulated lenght of 3."
152
- "Make sure the task configuration setting for 'legacyIdMarcPath' "
153
- "is correct or make this piece of code more allowing"
154
- ),
155
- marc_path,
156
- )
157
- elif len(split) == 1:
158
- return marc_record[split[0]].value()
159
- elif len(split) == 2 and len(split[1]) == 1:
160
- for field in marc_record.get_fields(split[0]):
161
- if sf := field.get_subfields(split[1]):
162
- return sf[0]
163
- raise TransformationRecordFailedError(
164
- "", "Subfield not found in record", split[1]
165
- )
166
-
167
- else:
168
- raise TransformationProcessError(
169
- "",
170
- ("Something is wrong with 'legacyIdMarcPath' property in the settings"),
171
- marc_path,
172
- )
173
-
174
- def save_srs_record(self, marc_record, file_def, folio_rec, legacy_id: str):
175
- if self.mapper.task_configuration.create_source_records:
176
- self.add_hrid_to_records(folio_rec, marc_record)
177
- if "008" in marc_record and len(marc_record["008"].data) > 32:
178
- remain, rest = (
179
- marc_record["008"].data[:32],
180
- marc_record["008"].data[32:],
181
- )
182
- marc_record["008"].data = remain
183
- self.mapper.migration_report.add(
184
- Blurbs.MarcValidation,
185
- f"008 lenght invalid. '{rest}' was stripped out",
186
- )
187
- for former_id in folio_rec["formerIds"]:
188
- if map_entity := self.mapper.instance_id_map.get(former_id, ""):
189
- new_004 = Field(tag="004", data=map_entity["instance_hrid"])
190
- marc_record.remove_fields("004")
191
- marc_record.add_ordered_field(new_004)
192
- if self.mapper.task_configuration.hrid_handling == HridHandling.default:
193
- new_035 = Field(
194
- tag="035",
195
- indicators=[" ", " "],
196
- subfields=["a", former_id],
197
- )
198
- marc_record.add_ordered_field(new_035)
199
- self.mapper.save_source_record(
200
- self.srs_records_file,
201
- FOLIONamespaces.holdings,
202
- self.mapper.folio_client,
203
- marc_record,
204
- folio_rec,
205
- legacy_id,
206
- file_def.suppressed,
207
- )
208
- self.mapper.migration_report.add_general_statistics(
209
- "SRS records written to disk"
210
- )
211
-
212
- def set_hrid(self, marc_record, folio_rec):
213
- if self.mapper.task_configuration.hrid_handling == HridHandling.preserve001:
214
- value = marc_record["001"].value()
215
- if value in self.unique_001s:
216
- self.mapper.migration_report.add(
217
- Blurbs.HridHandling, "Duplicate 001. Creating HRID instead"
218
- )
219
- Helper.log_data_issue(
220
- folio_rec["formerIds"],
221
- "Duplicate 001 for record. HRID created for record",
222
- value,
223
- )
224
- num_part = str(self.mapper.instance_hrid_counter).zfill(11)
225
- folio_rec["hrid"] = f"{self.mapper.instance_hrid_prefix}{num_part}"
226
- new_001 = Field(tag="001", data=folio_rec["hrid"])
227
- marc_record.add_ordered_field(new_001)
228
- self.mapper.instance_hrid_counter += 1
229
- else:
230
- self.unique_001s.add(value)
231
- folio_rec["hrid"] = value
232
- self.mapper.migration_report.add(
233
- Blurbs.HridHandling, "Took HRID from 001"
234
- )
235
-
236
- def add_hrid_to_records(self, folio_record: dict, marc_record: Record):
237
- if (
238
- "hrid" in folio_record
239
- and "001" in marc_record
240
- and marc_record["001"].value() == folio_record["hrid"]
241
- ):
242
- return
243
- num_part = str(self.mapper.holdings_hrid_counter).zfill(11)
244
- folio_record["hrid"] = f"{self.mapper.holdings_hrid_prefix}{num_part}"
245
- new_001 = Field(tag="001", data=folio_record["hrid"])
246
- marc_record.remove_fields("001")
247
- marc_record.add_ordered_field(new_001)
248
- self.mapper.holdings_hrid_counter += 1
249
-
250
- @staticmethod
251
- def set_source_id(task_configuration, folio_rec, holdingssources):
252
- if library_configuration.FolioRelease != FolioRelease.juniper:
253
- if task_configuration.create_source_records:
254
- folio_rec["sourceId"] = holdingssources.get("MARC")
255
- else:
256
- folio_rec["sourceId"] = holdingssources.get("FOLIO")
257
-
258
- def wrap_up(self):
259
- """Finalizes the mapping by writing things out."""
260
- self.created_objects_file.close()
261
- logging.info(
262
- "Saving map of %s old and new IDs to %s",
263
- len(self.mapper.holdings_id_map),
264
- self.folder_structure.holdings_id_map_path,
265
- )
266
- self.mapper.save_id_map_file(
267
- self.folder_structure.holdings_id_map_path, self.mapper.holdings_id_map
268
- )
269
- logging.info("%s records processed", self.records_count)
270
- with open(self.folder_structure.migration_reports_file, "w+") as report_file:
271
- report_file.write("# MFHD records transformation results \n")
272
- report_file.write(f"Time Finished: {dt.isoformat(dt.utcnow())} \n")
273
- self.mapper.migration_report.write_migration_report(report_file)
274
- Helper.print_mapping_report(
275
- report_file,
276
- self.mapper.parsed_records,
277
- self.mapper.mapped_folio_fields,
278
- self.mapper.mapped_legacy_fields,
279
- )
280
- self.srs_records_file.close()
281
- self.mapper.wrap_up()
282
-
283
- logging.info("Done. Transformation report written to %s", report_file.name)
284
- logging.info("Done.")
@@ -1,219 +0,0 @@
1
- from enum import Enum
2
- from typing import NamedTuple
3
-
4
-
5
- class ReportSection(Enum):
6
- GENERAL = "General statistics"
7
- LIBRARY_ACTION = "Library action needed"
8
- ADDITIONAL_INFORMATION = "Additional information"
9
- TECHNICAL = "Technical information"
10
-
11
-
12
- class Blurbs(NamedTuple):
13
- DateTimeConversions = (
14
- "DateTime conversions",
15
- "Some date and date time strings are converted to UTC DateTime objects and then printed accoding to ISO standard.",
16
- )
17
- Details = ("Details", "")
18
- MarcValidation = ("MARC21 validation issues found in records", "")
19
- Details = ("Details", "")
20
- Introduction = (
21
- "Introduction",
22
- "<br/>Data errors preventing records from being migrated are marked **FIX BEFORE MIGRATION**. The library is advised to clean up these errors in the source data.<br/><br/> The sections related to field counts and mapping results are marked **REVIEW**. These do not indicate errors preventing records from being migrated, but may point to data anomalies or in the mappings. The library should review these to make sure that the numbers are what one would expect, knowing the source data. Is this the expected number of serials? Is this the expected number of cartographic materials?",
23
- )
24
- DiscardedLoans = ("Discarded loans", "List of loans discarded for various resons")
25
- DiscardedRequests = (
26
- "Discarded Requests",
27
- "List of requests discarded for various resons",
28
- )
29
- HoldingsMerging = ("Holdings Merging", "")
30
- DepartmentsMapping = ("Departments mappings", "")
31
- MissingRequiredProperties = ("Missing or empty required properties", "")
32
- MappedLegacyFields = (
33
- "Mapped Legacy Fields",
34
- "Library action: **REVIEW** <br/>This table lists all the MARC fields in the source data, and whether it has been mapped to a FOLIO instance record field. The library should examine the MARC tags with a high 'Unmapped' figure and determine if these MARC tags contain data that you would like mapped to the FOLIO instance record.",
35
- )
36
- MappedFolioFields = (
37
- "Mapped FOLIO fields",
38
- "Library action: **REVIEW** <br/>This table shows how many of the FOLIO instance records created contain data in the different FOLIO fields. The library should review the mapped totals against what they would expect to see mapped.",
39
- )
40
- Section1 = (
41
- "__Section 1: instances",
42
- "This entries below seem to be related to instances",
43
- )
44
- RecordStatus = (
45
- "Record status (leader pos 5)",
46
- "Library action: **Consider fixing d-values before migration**<br/>An overview of the Record statuses (Leader position 5) present in your source data. Pay attention to the number of occurrences of the value 'd'. These d's are expressing that they are deleted, and the records might not work as expected in FOLIO. Consider marking them as suppressed in your current system and export them as a separate batch in order to have them suppressed in FOLIO. Allowed values according to the MARC standard are a,c,d,n,p",
47
- )
48
- ValueErrors = (
49
- "Records failed to migrate due to Value errors found in Transformation",
50
- "**FIX BEFORE MIGRATION** This section identifies records that have unexpected or missing values that prevent the transformation. The type of error will be specified. The library must resolve the issue for the record to be migrated.",
51
- )
52
- MissingTitles = (
53
- "Records without titles",
54
- "**FIX IN SOURCE DATA** These records are missing a 245 field. FOLIO requires an instance title. The library must enter this information for the record to be migrated.",
55
- )
56
- MissingInstanceTypeIds = (
57
- "Records without Instance Type Ids",
58
- "**IC ACTION REQUIRED** These reords should get an instance type ID mapped from 336, or a default of Undefined, or they will not be transformed.",
59
- )
60
- MappedInstanceFormats = (
61
- "Mapped instance formats",
62
- "Library action: **REVIEW** <br/>The created FOLIO instances contain the following Instance format values. The library should review the total number for each value against what they would expect to see mapped.",
63
- )
64
- MappedIdentifierTypes = (
65
- "Mapped identifier types",
66
- "Library action: **REVIEW** <br/>The created FOLIO instances contain the following Identifier type values. The library should review the total number for each value against what they would expect to see mapped.",
67
- )
68
- MappedNoteTypes = (
69
- "Mapped note types",
70
- "Library action: **REVIEW** <br/>The created FOLIO instances contain the following Note type values. <br/>The library should review the total number for each value against what they would expect to see mapped.",
71
- )
72
- MappedContributorNameTypes = (
73
- "Mapped contributor name types",
74
- "Library action: **REVIEW** <br/>The created FOLIO instances contain the following Name type values. The library should review the total number for each value against what they would expect to see mapped.",
75
- )
76
- UnmappedContributorNameTypes = (
77
- "Unmapped contributor name types",
78
- "**REVIEW/IC ACTION REQUIRED** <br/>Contributor name types present in the source data, but not mapped to a FOLIO value. The library and IC should review values and mapping.",
79
- )
80
- ContributorTypeMapping = (
81
- "Contributor type mapping",
82
- "Library action: **REVIEW** <br/>The created FOLIO instances contain the following Contributor type values. The library should review the total number for each value against what they would expect to see mapped.",
83
- )
84
- MappedElectronicRelationshipTypes = (
85
- "Mapped electronic access relationships types",
86
- "Library action: **REVIEW** <br/>The created FOLIO instances contain the following Electronic access relationship type values. The library should review the total number for each value against what they would expect to see mapped.",
87
- )
88
- IncompleteEntityMapping = (
89
- "Incomplete entity mapping adding entity",
90
- "**NO ACTION REQUIRED** <br/>This is a coding anomaly that FSE will look into. <br/>Usually, the library does not have to do anything about it.<br/> One thing to look at is if there are many repeated subfields or unexpected patterns of subfields in the table.",
91
- )
92
- RecourceTypeMapping = (
93
- "Resource Type Mapping (336)",
94
- "Library action: **REVIEW** <br/>The created FOLIO instances contain the following Instance type values. The library should review the total number for each value against what they would expect to see mapped.",
95
- )
96
- MappedAlternativeTitleTypes = (
97
- "Mapped Alternative title types",
98
- "Library action: **REVIEW** <br/>The created FOLIO instances contain the following Alternative title type values. The library should review the total number for each value against what they would expect to see mapped. The FOLIO community recommends a coarse-grained mapping.",
99
- )
100
- Field880Mappings = (
101
- "880 mappings",
102
- "This table shows how the 880 (Alternate Graphic Representation) has been mapped.",
103
- )
104
- Field880MappingsMissingFromRules = (
105
- "880 mappings: mapped field not in mapping-rules",
106
- "Library action: **REVIEW** <br/>Fields that are referenced in the 880 mapping, but not configured in the mapping-rules.",
107
- )
108
- InstanceLevelCallnumber = (
109
- "Instance level callNumber",
110
- "Library action: **REVIEW** <br/>True if the source data contains bib level call numbers in MARC field 099.",
111
- )
112
- NonNumericTagsInRecord = (
113
- "Non-numeric tags in records",
114
- "Library action: **REVIEW** <br/>Non-numeric tags may indicate locally defined fields.",
115
- )
116
- MatchedModesOfIssuanceCode = (
117
- "Matched Modes of issuance code",
118
- "Library action: **REVIEW** <br/>The created FOLIO instances contain the following Mode of issuace values. The library should review the total number for each value against what they would expect to see mapped.",
119
- )
120
- UnrecognizedLanguageCodes = (
121
- "Unrecognized language codes in records",
122
- "Library action: **REVIEW** <br/>Language code values in the source data that do not match standard language codes. If not fixed before migration, these will display as Undetermined in the instance record and Filtering by language in Inventory will not be conclusive.",
123
- )
124
- Section2 = (
125
- "__Section 2: holdings",
126
- "The entries below seem to be related to holdings",
127
- )
128
- HoldingsTypeMapping = ("Holdings type mapping", "")
129
- LegacyLocationCodes = ("Legacy location codes", "")
130
- Locations = (
131
- "Locations - Unmapped legacy codes",
132
- "",
133
- )
134
- UserGroupMapping = ("User group mapping", "")
135
- DefaultValuesAdded = (
136
- "Default values added",
137
- "The values below was added to all records from the value field in the mapping file instead of coming from the source records",
138
- )
139
- UsersPerPatronType = ("Users per patron type", "")
140
- MappedLocations = ("Mapped Locations", "")
141
- Leader06 = ("Leader 06 (Holdings type)", "")
142
- Section3 = ("__Section 3: items", "The entries below seem to be related to items")
143
- Exceptions = ("Exceptions", "")
144
- HridHandling = (
145
- "HRID Handling",
146
- "There are two ways of handling HRIDs. The default behaviour is to take the current 001 and move that to a new 035. This will also emerge as an Identifier on the Inventory Instances. The 001 and Instance HRID will be generated from the HRID settings in FOLIO. The second option is to maintain the 001s in the records, and also add this as the Instance HRID",
147
- )
148
- PrecedingSuccedingTitles = (
149
- "Preceding and Succeeding titles",
150
- "",
151
- )
152
- HoldingsGenerationFromBibs = (
153
- "Holdings generation from bibs",
154
- "Some libraries have Holdings/MFHD information baked into their bib records. The following breakdown gives an idea on the occurrence of 852/866 combinations",
155
- )
156
- InstanceFormat = (
157
- "Instance format ids handling (337 + 338))",
158
- "",
159
- )
160
- MappedClassificationTypes = (
161
- "Mapped classification types",
162
- "",
163
- )
164
- LocationMapping = (
165
- "Location mapping",
166
- "These are the results for the mapping between legacy locations and your new FOLIO location structure",
167
- )
168
- ValueSetInMappingFile = (
169
- "Value set in mapping file",
170
- "The value for these fields are set in the mapping file instead of coming from the legacy system data.",
171
- )
172
- ValuesMappedFromLegacyFields = (
173
- "Values mapped from legacy fields",
174
- "A list fo the values and what they were mapped to",
175
- )
176
- GeneralStatistics = (
177
- "General statistics",
178
- "A list of general counterts to outline the transformation as a whole.",
179
- )
180
- MappedPublisherRoleFromIndicator2 = (
181
- "Mapped publisher role from Indicator2",
182
- "Publication Role, taken from the code in Ind2",
183
- )
184
- CallNumberTypeMapping = (
185
- "Callnumber type mapping",
186
- "Call number types in MFHDs are mapped from 852, Indicator 1 according to a certain scheme. (LOC documentation)[https://www.loc.gov/marc/holdings/hd852.html]",
187
- )
188
- LanguagesInRecords = (
189
- "Language codes in records",
190
- "A breakdown of language codes occuring in the records. Purely informational.",
191
- )
192
- ReceiptStatusMapping = (
193
- "Reciept status mapping",
194
- "Mapped reciept status from 008[06]. (LoC documentation)[https://www.loc.gov/marc/holdings/hd008.html]",
195
- )
196
- LanguageCodeSources = (
197
- "Language code sources in 041",
198
- 'Most language codes in MARC records come from this list: https://www.loc.gov/marc/languages/, But other codes are allowed. The controlled vocabulary needs to be stated in $2 and this is where the information in this list comes from. The mapping tools can not currently handle other language codes, and so cannot FOLIO. <br/>One solution is to migrate the codes into a string or/and replace the language code with the parent language (these languages are usually subgroups of other languages). Many times, these records already have the "super-language" recorded as well. The data will remain in the MARC records.',
199
- )
200
- FailedFiles = ("Failed files", "")
201
- BoundWithMappings = ("Bound-with mapping", "")
202
- TemporaryLocationMapping = ("Temporary location mapping", "")
203
- TemporaryLoanTypeMapping = ("Temporary Loan type mapping", "")
204
- PermanentLoanTypeMapping = ("Permanent Loan type mapping", "")
205
- StatisticalCodeMapping = ("Statistical code mapping", "")
206
- HoldingsRecordIdMapping = ("Holdings IDs mapped", "")
207
- UnmappedProperties = ("Unmapped properties", "")
208
- StatusMapping = ("Status mapping", "")
209
- ReferenceDataMapping = ("Reference Data Mapping", "")
210
- FieldMappingErrors = ("Field mapping errors", "")
211
- AddedValueFromParameter = ("Added value from parameter since value is empty", "")
212
- InstanceTypeMapping = ("Instance Type Mapping", "")
213
- StaffOnlyViaIndicator = ("Set note to staff only via indicator", "")
214
- PossibleCleaningTasks = ("Possible cleaning tasks", "")
215
- HoldingsStatementsParsing = (
216
- "Parsed Holdings statements from 85X/86X combinations",
217
- "",
218
- )
219
- MaterialTypeMapping = ("Mapped Material Types", "")