LICENSE
README.md
pyproject.toml
src/baobab_mtg_products/__init__.py
src/baobab_mtg_products/py.typed
src/baobab_mtg_products.egg-info/PKG-INFO
src/baobab_mtg_products.egg-info/SOURCES.txt
src/baobab_mtg_products.egg-info/dependency_links.txt
src/baobab_mtg_products.egg-info/requires.txt
src/baobab_mtg_products.egg-info/top_level.txt
src/baobab_mtg_products/domain/__init__.py
src/baobab_mtg_products/domain/entity.py
src/baobab_mtg_products/domain/deconditioning/__init__.py
src/baobab_mtg_products/domain/deconditioning/decondition_child_specification.py
src/baobab_mtg_products/domain/deconditioning/decondition_container_command.py
src/baobab_mtg_products/domain/deconditioning/decondition_container_result.py
src/baobab_mtg_products/domain/deconditioning/deconditionable_container_policy.py
src/baobab_mtg_products/domain/history/__init__.py
src/baobab_mtg_products/domain/history/in_memory_product_business_event_ledger.py
src/baobab_mtg_products/domain/history/product_business_event_kind.py
src/baobab_mtg_products/domain/history/product_business_event_payload.py
src/baobab_mtg_products/domain/history/product_business_event_record.py
src/baobab_mtg_products/domain/integration/__init__.py
src/baobab_mtg_products/domain/integration/card_revealed_statistics_event.py
src/baobab_mtg_products/domain/integration/opening_card_scan_statistics_event.py
src/baobab_mtg_products/domain/integration/product_parent_link_for_collection_event.py
src/baobab_mtg_products/domain/integration/product_provenance_for_collection.py
src/baobab_mtg_products/domain/integration/sealed_product_opened_statistics_event.py
src/baobab_mtg_products/domain/opening/__init__.py
src/baobab_mtg_products/domain/opening/external_card_id.py
src/baobab_mtg_products/domain/opening/open_sealed_product_outcome.py
src/baobab_mtg_products/domain/opening/opened_product_card_trace_rules.py
src/baobab_mtg_products/domain/opening/opening_card_scan_payload.py
src/baobab_mtg_products/domain/opening/product_opening_event.py
src/baobab_mtg_products/domain/opening/revealed_card_trace.py
src/baobab_mtg_products/domain/opening/sealed_product_opening_rules.py
src/baobab_mtg_products/domain/products/__init__.py
src/baobab_mtg_products/domain/products/commercial_barcode.py
src/baobab_mtg_products/domain/products/internal_barcode.py
src/baobab_mtg_products/domain/products/internal_product_id.py
src/baobab_mtg_products/domain/products/mtg_set_code.py
src/baobab_mtg_products/domain/products/product_instance.py
src/baobab_mtg_products/domain/products/product_reference.py
src/baobab_mtg_products/domain/products/product_reference_id.py
src/baobab_mtg_products/domain/products/product_status.py
src/baobab_mtg_products/domain/products/product_type.py
src/baobab_mtg_products/domain/products/production_code.py
src/baobab_mtg_products/domain/products/serial_number.py
src/baobab_mtg_products/domain/products/relationships/__init__.py
src/baobab_mtg_products/domain/products/relationships/parent_child_relationship_rules.py
src/baobab_mtg_products/domain/products/relationships/product_ancestor_chain.py
src/baobab_mtg_products/domain/products/relationships/product_relationship.py
src/baobab_mtg_products/domain/products/relationships/product_relationship_kind.py
src/baobab_mtg_products/domain/query/__init__.py
src/baobab_mtg_products/domain/query/product_structural_view.py
src/baobab_mtg_products/domain/query/sealed_product_snapshot.py
src/baobab_mtg_products/domain/registration/__init__.py
src/baobab_mtg_products/domain/registration/commercial_reference_resolution_result.py
src/baobab_mtg_products/domain/registration/registration_defaults.py
src/baobab_mtg_products/domain/registration/registration_scan_outcome.py
src/baobab_mtg_products/domain/registration/registration_scan_result.py
src/baobab_mtg_products/domain/registration/resolved_from_scan.py
src/baobab_mtg_products/exceptions/__init__.py
src/baobab_mtg_products/exceptions/baobab_mtg_products_exception.py
src/baobab_mtg_products/exceptions/deconditioning/__init__.py
src/baobab_mtg_products/exceptions/deconditioning/container_already_deconditioned_error.py
src/baobab_mtg_products/exceptions/deconditioning/decondition_container_empty_children_error.py
src/baobab_mtg_products/exceptions/deconditioning/invalid_decondition_child_specification_error.py
src/baobab_mtg_products/exceptions/deconditioning/product_not_deconditionable_container_error.py
src/baobab_mtg_products/exceptions/history/__init__.py
src/baobab_mtg_products/exceptions/history/product_history_coherence_error.py
src/baobab_mtg_products/exceptions/integration/__init__.py
src/baobab_mtg_products/exceptions/integration/invalid_integration_payload_error.py
src/baobab_mtg_products/exceptions/opening/__init__.py
src/baobab_mtg_products/exceptions/opening/duplicate_revealed_card_trace_error.py
src/baobab_mtg_products/exceptions/opening/invalid_external_card_id_error.py
src/baobab_mtg_products/exceptions/opening/invalid_opening_card_scan_payload_error.py
src/baobab_mtg_products/exceptions/opening/invalid_revealed_card_sequence_error.py
src/baobab_mtg_products/exceptions/opening/product_already_opened_error.py
src/baobab_mtg_products/exceptions/opening/product_not_openable_error.py
src/baobab_mtg_products/exceptions/opening/product_not_opened_for_card_trace_error.py
src/baobab_mtg_products/exceptions/opening/product_not_ready_for_opening_error.py
src/baobab_mtg_products/exceptions/product/__init__.py
src/baobab_mtg_products/exceptions/product/duplicate_internal_barcode_error.py
src/baobab_mtg_products/exceptions/product/invalid_commercial_barcode_error.py
src/baobab_mtg_products/exceptions/product/invalid_internal_barcode_error.py
src/baobab_mtg_products/exceptions/product/invalid_product_identifier_error.py
src/baobab_mtg_products/exceptions/product/invalid_product_instance_error.py
src/baobab_mtg_products/exceptions/product/invalid_product_reference_error.py
src/baobab_mtg_products/exceptions/product/invalid_product_reference_id_error.py
src/baobab_mtg_products/exceptions/product/invalid_production_code_error.py
src/baobab_mtg_products/exceptions/product/invalid_serial_number_error.py
src/baobab_mtg_products/exceptions/product/invalid_set_code_error.py
src/baobab_mtg_products/exceptions/query/__init__.py
src/baobab_mtg_products/exceptions/query/missing_referenced_parent_product_error.py
src/baobab_mtg_products/exceptions/query/product_not_found_for_query_error.py
src/baobab_mtg_products/exceptions/query/product_reference_not_found_for_query_error.py
src/baobab_mtg_products/exceptions/registration/__init__.py
src/baobab_mtg_products/exceptions/registration/ambiguous_barcode_resolution_error.py
src/baobab_mtg_products/exceptions/registration/invalid_qualification_state_error.py
src/baobab_mtg_products/exceptions/registration/missing_product_ref_workflow_error.py
src/baobab_mtg_products/exceptions/registration/product_not_found_for_workflow_error.py
src/baobab_mtg_products/exceptions/relationship/__init__.py
src/baobab_mtg_products/exceptions/relationship/child_product_not_attached_error.py
src/baobab_mtg_products/exceptions/relationship/circular_product_parentage_error.py
src/baobab_mtg_products/exceptions/relationship/detach_parent_mismatch_error.py
src/baobab_mtg_products/exceptions/relationship/incompatible_parent_child_types_error.py
src/baobab_mtg_products/exceptions/relationship/incomplete_product_hierarchy_error.py
src/baobab_mtg_products/exceptions/relationship/invalid_product_relationship_link_error.py
src/baobab_mtg_products/exceptions/relationship/product_already_has_parent_error.py
src/baobab_mtg_products/ports/__init__.py
src/baobab_mtg_products/ports/barcode_resolution_port.py
src/baobab_mtg_products/ports/collection_port.py
src/baobab_mtg_products/ports/internal_product_id_factory_port.py
src/baobab_mtg_products/ports/product_business_history_query_port.py
src/baobab_mtg_products/ports/product_reference_id_factory_port.py
src/baobab_mtg_products/ports/product_reference_repository_port.py
src/baobab_mtg_products/ports/product_repository_port.py
src/baobab_mtg_products/ports/product_workflow_event_recorder_port.py
src/baobab_mtg_products/ports/revealed_card_trace_repository_port.py
src/baobab_mtg_products/ports/statistics_port.py
src/baobab_mtg_products/services/__init__.py
src/baobab_mtg_products/services/query/__init__.py
src/baobab_mtg_products/services/query/get_product_business_timeline_service.py
src/baobab_mtg_products/services/query/get_product_structural_view_service.py
src/baobab_mtg_products/services/query/get_sealed_product_snapshot_service.py
src/baobab_mtg_products/use_cases/__init__.py
src/baobab_mtg_products/use_cases/use_case.py
src/baobab_mtg_products/use_cases/deconditioning/__init__.py
src/baobab_mtg_products/use_cases/deconditioning/decondition_container_use_case.py
src/baobab_mtg_products/use_cases/history/__init__.py
src/baobab_mtg_products/use_cases/history/list_product_business_history_use_case.py
src/baobab_mtg_products/use_cases/instance/__init__.py
src/baobab_mtg_products/use_cases/instance/assign_production_code_to_product_instance_use_case.py
src/baobab_mtg_products/use_cases/instance/create_product_instance_use_case.py
src/baobab_mtg_products/use_cases/opening/__init__.py
src/baobab_mtg_products/use_cases/opening/open_sealed_product_use_case.py
src/baobab_mtg_products/use_cases/opening/record_opening_card_scan_use_case.py
src/baobab_mtg_products/use_cases/opening/register_revealed_card_from_opening_use_case.py
src/baobab_mtg_products/use_cases/parent_child/__init__.py
src/baobab_mtg_products/use_cases/parent_child/attach_child_product_to_parent_use_case.py
src/baobab_mtg_products/use_cases/parent_child/detach_child_product_from_parent_use_case.py
src/baobab_mtg_products/use_cases/registration/__init__.py
src/baobab_mtg_products/use_cases/registration/qualify_scanned_product_use_case.py
src/baobab_mtg_products/use_cases/registration/register_product_by_commercial_scan_use_case.py
src/baobab_mtg_products/use_cases/registration/register_product_by_internal_scan_use_case.py
src/baobab_mtg_products/use_cases/registration/registration_from_scan_runner.py
src/baobab_mtg_products/use_cases/registration/resolve_product_reference_from_commercial_barcode_use_case.py