예제 #1
0
def test_adds_terminating_regulation_with_end_date(
    measure_data,
    date_ranges: Dates,
    measure_creation_pattern: MeasureCreationPattern,
):
    measure_data["validity_end"] = None
    measure = measure_creation_pattern.create(**measure_data)
    assert not measure.valid_between.upper
    assert not measure.terminating_regulation

    measure_data["validity_end"] = date_ranges.normal.upper
    measure = measure_creation_pattern.create(**measure_data)
    assert measure.valid_between.upper
    assert measure.terminating_regulation
예제 #2
0
def test_sid_is_next_highest(
    measure_data,
    measure_creation_pattern: MeasureCreationPattern,
):
    measure = factories.MeasureFactory()
    models = list(measure_creation_pattern.create(**measure_data))
    assert models[0].sid == measure.sid + 1
예제 #3
0
    def import_row(self, workbasket: WorkBasket) -> Measure:
        creator = MeasureCreationPattern(
            workbasket=workbasket,
            base_date=self.validity_start_date,
        )

        try:
            return creator.create(
                duty_sentence=self.duty_sentence,
                measure_type=self.measure_type,
                goods_nomenclature=self.goods_nomenclature,
                validity_start=self.validity_start_date,
                validity_end=self.validity_end_date,
                geographical_area=self.origin,
                exclusions=self.excluded_origins,
                generating_regulation=self.regulation,
                order_number=self.quota,
                dead_order_number=self.dead_order_number,
                additional_code=self.additional_code,
                dead_additional_code=self.dead_additional_code,
                footnotes=self.footnotes,
                condition_sentence=self.conditions,
            )
        except GoodsNomenclature.DoesNotExist:
            logger.warning(
                f"Commodity {self.item_id}: not imported from EU Taric files yet.",
            )
예제 #4
0
def test_condition_sid_is_next_highest(
    authorised_use_measure_data,
    measure_creation_pattern: MeasureCreationPattern,
):
    condition = factories.MeasureConditionFactory()
    measure = measure_creation_pattern.create(**authorised_use_measure_data)
    assert measure.conditions.first().sid == condition.sid + 1
    assert measure.conditions.last().sid == condition.sid + 2
예제 #5
0
def test_starts_on_nomenclature_start(
    measure_data,
    date_ranges: Dates,
    measure_creation_pattern: MeasureCreationPattern,
):
    measure_data["goods_nomenclature"] = factories.GoodsNomenclatureFactory(
        valid_between=date_ranges.adjacent_later, )
    measure = measure_creation_pattern.create(**measure_data)
    assert measure.valid_between.lower == date_ranges.adjacent_later.lower
예제 #6
0
def test_ends_on_nomenclature_end(
    measure_data,
    date_ranges: Dates,
    measure_creation_pattern: MeasureCreationPattern,
):
    measure_data["goods_nomenclature"] = factories.GoodsNomenclatureFactory(
        valid_between=date_ranges.starts_with_normal, )
    measure = measure_creation_pattern.create(**measure_data)
    assert measure.valid_between.upper == date_ranges.starts_with_normal.upper
예제 #7
0
def test_associates_footnotes(
    measure_data,
    measure_creation_pattern: MeasureCreationPattern,
):
    footnote = factories.FootnoteFactory()
    measure_data["footnotes"] = [footnote]

    measure = measure_creation_pattern.create(**measure_data)
    linked_footnote = measure.footnotes.get()
    assert footnote == linked_footnote
예제 #8
0
def test_excludes_area_groups(
    measure_data,
    measure_creation_pattern: MeasureCreationPattern,
):
    membership = factories.GeographicalMembershipFactory()
    measure_data["geographical_area"] = membership.geo_group
    measure_data["exclusions"] = [membership.geo_group]

    measure = measure_creation_pattern.create(**measure_data)
    exclusion = measure.exclusions.get()
    assert exclusion.excluded_geographical_area == membership.member
예제 #9
0
def test_excludes_countries_and_regions(
    measure_data,
    measure_creation_pattern: MeasureCreationPattern,
):
    membership = factories.GeographicalMembershipFactory()
    measure_data["geographical_area"] = membership.geo_group
    measure_data["exclusions"] = [membership.member]

    models = list(measure_creation_pattern.create(**measure_data))
    exclusion = models[0].exclusions.get()
    assert exclusion.excluded_geographical_area == membership.member
예제 #10
0
def test_starts_on_minimum_date(
    measure_data,
    date_ranges: Dates,
    measure_creation_pattern: MeasureCreationPattern,
):
    measure_data["validity_start"] = date_ranges.no_end_before(
        date_ranges.now).lower
    measure_data["goods_nomenclature"] = factories.GoodsNomenclatureFactory(
        valid_between=TaricDateRange(date_ranges.now, None), )

    measure = measure_creation_pattern.create(**measure_data)
    assert measure.valid_between.lower == date_ranges.now
예제 #11
0
def test_components_are_sequenced_correctly(
    measure_data,
    measure_creation_pattern: MeasureCreationPattern,
):
    measure_data["duty_sentence"] = "0.0% + 1.23 %"

    measure = measure_creation_pattern.create(**measure_data)
    components = measure.components.all()
    assert components[0].duty_amount == Decimal("0.000")
    assert components[0].duty_expression.sid == 1
    assert components[1].duty_amount == Decimal("1.230")
    assert components[1].duty_expression.sid == 4
예제 #12
0
def test_sid_is_next_highest(
    measure_data,
    measure_creation_pattern: MeasureCreationPattern,
):
    measure = factories.MeasureFactory()

    expected_sids = [measure.sid, measure.sid + 1, measure.sid + 2]
    actual_sids = [
        measure.sid,
        measure_creation_pattern.create(**measure_data).sid,
        measure_creation_pattern.create(**measure_data).sid,
    ]

    assert expected_sids == actual_sids
예제 #13
0
def test_attaches_conditions_from_sentence(
    condition_measure_data,
    measure_creation_pattern: MeasureCreationPattern,
):
    measure = measure_creation_pattern.create(**condition_measure_data)
    conditions = measure.conditions.all()
    assert len(conditions) == 2
    assert conditions[0].condition_code.code == "B"
    assert conditions[0].required_certificate.certificate_type.sid == "C"
    assert conditions[0].required_certificate.sid == "001"
    assert conditions[0].action.code == "29"
    assert conditions[0].component_sequence_number == 1
    assert conditions[1].condition_code.code == "B"
    assert conditions[1].required_certificate is None
    assert conditions[1].action.code == "09"
    assert conditions[1].component_sequence_number == 2
예제 #14
0
def test_attaches_origin_quota_conditions(
    required_certificates_data,
    measure_creation_pattern: MeasureCreationPattern,
):
    measure = measure_creation_pattern.create(**required_certificates_data)
    conditions = measure.conditions.all()
    assert len(conditions) == 2
    assert conditions[0].condition_code.code == "Q"
    assert conditions[0].required_certificate.certificate_type.sid == "U"
    assert conditions[0].required_certificate.sid == "123"
    assert conditions[0].action.code == "27"
    assert conditions[0].component_sequence_number == 1
    assert conditions[1].condition_code.code == "Q"
    assert conditions[1].required_certificate is None
    assert conditions[1].action.code == "07"
    assert conditions[1].component_sequence_number == 2
예제 #15
0
def test_attaches_authorised_use_conditions(
    authorised_use_measure_data,
    measure_creation_pattern: MeasureCreationPattern,
):
    measure = measure_creation_pattern.create(**authorised_use_measure_data)
    conditions = measure.conditions.all()
    assert len(conditions) == 2
    assert conditions[0].condition_code.code == "B"
    assert conditions[0].required_certificate.certificate_type.sid == "N"
    assert conditions[0].required_certificate.sid == "990"
    assert conditions[0].action.code == "27"
    assert conditions[0].component_sequence_number == 1
    assert conditions[1].condition_code.code == "B"
    assert conditions[1].required_certificate is None
    assert conditions[1].action.code == "08"
    assert conditions[1].component_sequence_number == 2
예제 #16
0
    def create_measures(self, data):
        """Returns a list of the created measures."""
        measure_start_date = data["valid_between"].lower
        workbasket = WorkBasket.current(self.request)
        measure_creation_pattern = MeasureCreationPattern(
            workbasket=workbasket,
            base_date=measure_start_date,
            defaults={
                "generating_regulation": data["generating_regulation"],
            },
        )

        measures_data = []

        for commodity_data in data.get("formset-commodities", []):
            if not commodity_data.get("DELETE"):
                for geo_area in data["geo_area_list"]:

                    measure_data = {
                        "measure_type":
                        data["measure_type"],
                        "geographical_area":
                        geo_area,
                        "exclusions":
                        data.get("geo_area_exclusions", None) or [],
                        "goods_nomenclature":
                        commodity_data["commodity"],
                        "additional_code":
                        data["additional_code"],
                        "order_number":
                        data["order_number"],
                        "validity_start":
                        measure_start_date,
                        "validity_end":
                        data["valid_between"].upper,
                        "footnotes": [
                            item["footnote"]
                            for item in data.get("formset-footnotes", [])
                            if not item.get("DELETE")
                        ],
                        # condition_sentence here, or handle separately and duty_sentence after?
                        "duty_sentence":
                        commodity_data["duties"],
                    }

                    measures_data.append(measure_data)

        created_measures = []

        for measure_data in measures_data:
            measure = measure_creation_pattern.create(**measure_data)
            parser = DutySentenceParser.get(
                measure.valid_between.lower,
                component_output=MeasureConditionComponent,
            )
            for component_sequence_number, condition_data in enumerate(
                    data.get("formset-conditions", []),
                    start=1,
            ):
                if not condition_data.get("DELETE"):

                    measure_creation_pattern.create_condition_and_components(
                        condition_data,
                        component_sequence_number,
                        measure,
                        parser,
                        workbasket,
                    )

            created_measures.append(measure)

        return created_measures
예제 #17
0
def test_all_records_in_same_transaction(
    measure_data,
    measure_creation_pattern: MeasureCreationPattern,
):
    models = list(measure_creation_pattern.create(**measure_data))
    assert len(set(m.transaction for m in models)) == 1