Skip to content

Commit aebcf6a

Browse files
committed
WIP attention just cursor changes!
1 parent 46b45c2 commit aebcf6a

File tree

1 file changed

+121
-50
lines changed

1 file changed

+121
-50
lines changed

Diff for: src/kohlrahbi/unfoldedahb/unfoldedahbtable.py

+121-50
Original file line numberDiff line numberDiff line change
@@ -255,81 +255,151 @@ def from_xml_ahb(cls, ahb_table: Anwendungsfall) -> "UnfoldedAhb":
255255
@staticmethod
256256
def iterate_through_ahb(
257257
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,
267277
)
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+
270290
return unsorted_unfolded_ahb_lines
271291

272292
@staticmethod
273293
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
275295
) -> list[UnfoldedAhbLine]:
276296
"""
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
278306
"""
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(
283311
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,
287315
segment=segment.id,
288316
segment_id=segment.number,
289317
datenelement=None,
290-
code="tba",
318+
code=None,
291319
qualifier=None,
292320
beschreibung=None,
293321
bedingung_ausdruck=segment.ahb_status,
294-
bedingung="Some",
322+
bedingung="",
295323
)
296324
)
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(
302351
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,
306355
segment=segment.id,
307356
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,
311379
beschreibung=code.name,
312380
bedingung_ausdruck=code.ahb_status,
313-
bedingung="Some",
381+
bedingung=code.description or "",
314382
)
315383
)
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+
)
330400
)
331-
)
332-
return segment_unfolded_ahb_lines
401+
402+
return lines
333403

334404
@staticmethod
335405
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:
582652
# pylint: disable=no-member
583653
workbook = writer.book
584654
worksheet = writer.sheets[f"{self.meta_data.pruefidentifikator}"]
655+
# type: ignore[attr-defined] # xlsxwriter workbook has add_format
585656
wrap_format = workbook.add_format({"text_wrap": True})
586657
for column_letter, column_width in _column_letter_width_mapping.items():
587658
excel_header = f"{column_letter}:{column_letter}"

0 commit comments

Comments
 (0)