@@ -255,81 +255,151 @@ def from_xml_ahb(cls, ahb_table: Anwendungsfall) -> "UnfoldedAhb":
255
255
@staticmethod
256
256
def iterate_through_ahb (
257
257
layer : Anwendungsfall | SegmentGroup , unsorted_unfolded_ahb_lines : Dict [str , list ["UnfoldedAhbLine" ]]
258
- ):
259
- for segment in layer .segments :
260
- if isinstance (layer , Anwendungsfall ):
261
- unsorted_unfolded_ahb_lines [segment .number ] = UnfoldedAhb .unfolded_ahb_lines_from_segment (
262
- segment ,
263
- )
264
- else :
265
- unsorted_unfolded_ahb_lines [segment .number ] = UnfoldedAhb .unfolded_ahb_lines_from_segment (
266
- segment , layer .id , layer .name
258
+ ) -> Dict [str , list ["UnfoldedAhbLine" ]]:
259
+ """
260
+ Recursively iterate through an AHB layer (Anwendungsfall or SegmentGroup) and collect all lines.
261
+
262
+ Args:
263
+ layer: The current layer to process (either Anwendungsfall or SegmentGroup)
264
+ unsorted_unfolded_ahb_lines: Dictionary to collect lines, keyed by segment number
265
+
266
+ Returns:
267
+ The updated dictionary with all lines from this layer and its children
268
+ """
269
+ # Process all elements in this layer
270
+ for element in layer .elements :
271
+ if isinstance (element , Segment ):
272
+ # Handle direct segments
273
+ unsorted_unfolded_ahb_lines [element .number ] = UnfoldedAhb .unfolded_ahb_lines_from_segment (
274
+ segment = element ,
275
+ segment_group = None if isinstance (layer , Anwendungsfall ) else layer .id ,
276
+ section_name = element .name ,
267
277
)
268
- for segment_group in layer .segment_groups :
269
- unsorted_unfolded_ahb_lines = UnfoldedAhb .iterate_through_ahb (segment_group , unsorted_unfolded_ahb_lines )
278
+ elif isinstance (element , SegmentGroup ):
279
+ # Process segments in segment groups
280
+ for segment in element .elements :
281
+ if isinstance (segment , Segment ):
282
+ unsorted_unfolded_ahb_lines [segment .number ] = UnfoldedAhb .unfolded_ahb_lines_from_segment (
283
+ segment = segment ,
284
+ segment_group = element .id ,
285
+ section_name = segment .name ,
286
+ )
287
+ # Recursively process nested segment groups
288
+ unsorted_unfolded_ahb_lines = UnfoldedAhb .iterate_through_ahb (element , unsorted_unfolded_ahb_lines )
289
+
270
290
return unsorted_unfolded_ahb_lines
271
291
272
292
@staticmethod
273
293
def unfolded_ahb_lines_from_segment (
274
- segment : Segment , segment_gruppe : str | None , segment_id : str | None
294
+ segment : Segment , segment_group : str | None , section_name : str | None
275
295
) -> list [UnfoldedAhbLine ]:
276
296
"""
277
- This function creates a list of all UnfoldedAhbLines from a segment.
297
+ Converts a Segment into a list of UnfoldedAhbLines.
298
+
299
+ Args:
300
+ segment: The segment to convert
301
+ segment_group: The segment group key (e.g. "SG4") or None
302
+ section_name: The name of the section this segment belongs to
303
+
304
+ Returns:
305
+ A list of UnfoldedAhbLines representing the segment and all its data elements
278
306
"""
279
- # todo: segment bedingung
280
- # todo: fix index
281
- segment_unfolded_ahb_lines = []
282
- segment_unfolded_ahb_lines .append (
307
+ lines : list [ UnfoldedAhbLine ] = []
308
+
309
+ # Add the segment header line
310
+ lines .append (
283
311
UnfoldedAhbLine (
284
- index = 0 ,
285
- segment_name = segment .name ,
286
- segment_gruppe = segment_gruppe ,
312
+ index = 0 , # indexes will be fixed later
313
+ segment_name = section_name or segment .name ,
314
+ segment_gruppe = segment_group ,
287
315
segment = segment .id ,
288
316
segment_id = segment .number ,
289
317
datenelement = None ,
290
- code = "tba" ,
318
+ code = None ,
291
319
qualifier = None ,
292
320
beschreibung = None ,
293
321
bedingung_ausdruck = segment .ahb_status ,
294
- bedingung = "Some " ,
322
+ bedingung = "" ,
295
323
)
296
324
)
297
- for datenelement in segment .data_elements :
298
- if isinstance (datenelement , DataElementGroup ):
299
- for dataelement in datenelement .data_elements :
300
- for code in dataelement .codes :
301
- segment_unfolded_ahb_lines .append (
325
+
326
+ # Process all data elements
327
+ for data_element in segment .data_elements :
328
+ if isinstance (data_element , DataElementGroup ):
329
+ # Handle nested data elements in groups
330
+ for nested_element in data_element .data_elements :
331
+ if nested_element .codes :
332
+ for code in nested_element .codes :
333
+ lines .append (
334
+ UnfoldedAhbLine (
335
+ index = 0 , # indexes will be fixed later
336
+ segment_name = section_name or segment .name ,
337
+ segment_gruppe = segment_group ,
338
+ segment = segment .id ,
339
+ segment_id = segment .number ,
340
+ datenelement = nested_element .id ,
341
+ code = code .value ,
342
+ qualifier = None ,
343
+ beschreibung = code .name ,
344
+ bedingung_ausdruck = code .ahb_status ,
345
+ bedingung = code .description or "" ,
346
+ )
347
+ )
348
+ else :
349
+ # Data element without codes
350
+ lines .append (
302
351
UnfoldedAhbLine (
303
- index = 0 ,
304
- segment_name = segment .name ,
305
- segment_gruppe = segment_gruppe ,
352
+ index = 0 , # indexes will be fixed later
353
+ segment_name = section_name or segment .name ,
354
+ segment_gruppe = segment_group ,
306
355
segment = segment .id ,
307
356
segment_id = segment .number ,
308
- datenelement = dataelement .id ,
309
- code = "tba" ,
310
- qualifier = code .value ,
357
+ datenelement = nested_element .id ,
358
+ code = None ,
359
+ qualifier = None ,
360
+ beschreibung = nested_element .name ,
361
+ bedingung_ausdruck = None , # No status for elements without codes
362
+ bedingung = "" ,
363
+ )
364
+ )
365
+ else :
366
+ # Handle direct data elements
367
+ if data_element .codes :
368
+ for code in data_element .codes :
369
+ lines .append (
370
+ UnfoldedAhbLine (
371
+ index = 0 , # indexes will be fixed later
372
+ segment_name = section_name or segment .name ,
373
+ segment_gruppe = segment_group ,
374
+ segment = segment .id ,
375
+ segment_id = segment .number ,
376
+ datenelement = data_element .id ,
377
+ code = code .value ,
378
+ qualifier = None ,
311
379
beschreibung = code .name ,
312
380
bedingung_ausdruck = code .ahb_status ,
313
- bedingung = "Some " ,
381
+ bedingung = code . description or " " ,
314
382
)
315
383
)
316
- else :
317
- segment_unfolded_ahb_lines .append (
318
- UnfoldedAhbLine (
319
- index = 0 ,
320
- segment_name = segment .name ,
321
- segment_gruppe = segment_gruppe ,
322
- segment = segment .id ,
323
- segment_id = segment .number ,
324
- datenelement = dataelement .id ,
325
- code = "tba" ,
326
- qualifier = code .value ,
327
- beschreibung = code .name ,
328
- bedingung_ausdruck = code .ahb_status ,
329
- bedingung = "Some" ,
384
+ else :
385
+ # Data element without codes
386
+ lines .append (
387
+ UnfoldedAhbLine (
388
+ index = 0 , # indexes will be fixed later
389
+ segment_name = section_name or segment .name ,
390
+ segment_gruppe = segment_group ,
391
+ segment = segment .id ,
392
+ segment_id = segment .number ,
393
+ datenelement = data_element .id ,
394
+ code = None ,
395
+ qualifier = None ,
396
+ beschreibung = data_element .name ,
397
+ bedingung_ausdruck = None , # No status for elements without codes
398
+ bedingung = "" ,
399
+ )
330
400
)
331
- )
332
- return segment_unfolded_ahb_lines
401
+
402
+ return lines
333
403
334
404
@staticmethod
335
405
def _get_section_name (segment_gruppe_or_section_name : str , last_section_name : str ) -> str :
@@ -582,6 +652,7 @@ def dump_xlsx(self, path_to_output_directory: Path) -> None:
582
652
# pylint: disable=no-member
583
653
workbook = writer .book
584
654
worksheet = writer .sheets [f"{ self .meta_data .pruefidentifikator } " ]
655
+ # type: ignore[attr-defined] # xlsxwriter workbook has add_format
585
656
wrap_format = workbook .add_format ({"text_wrap" : True })
586
657
for column_letter , column_width in _column_letter_width_mapping .items ():
587
658
excel_header = f"{ column_letter } :{ column_letter } "
0 commit comments