def test_multiple_rules_documents(self):
        rules_document = mixer.blend(RulesDocument)
        rules_document_chapter_rule = mixer.blend(
            Rule,
            hs_from="01",
            hs_to=None,
            is_exclusion=False,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )

        other_rules_document = mixer.blend(RulesDocument)
        other_rules_document_chapter_rule = mixer.blend(
            Rule,
            hs_from="01",
            hs_to=None,
            is_exclusion=False,
            rules_document=other_rules_document,
            rule_text=mixer.RANDOM,
        )

        rules_of_origin = get_rules_of_origin(rules_document, "01")
        self.assertCountEqual(rules_of_origin, [rules_document_chapter_rule])

        rules_of_origin = get_rules_of_origin(other_rules_document, "01")
        self.assertCountEqual(rules_of_origin,
                              [other_rules_document_chapter_rule])
    def test_ex_rules_ranged_overlap(self):
        rules_document = mixer.blend(RulesDocument)

        chapter_rule = mixer.blend(
            Rule,
            code="chapter_rule",
            hs_from="01",
            hs_to="02",
            is_exclusion=True,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )
        heading_rule = mixer.blend(
            Rule,
            code="heading_rule",
            hs_from="0105",
            hs_to="0205",
            is_exclusion=True,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )
        subheading_rule = mixer.blend(
            Rule,
            code="subheading_rule",
            hs_from="010505",
            hs_to="020505",
            is_exclusion=True,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )

        rules_of_origin = get_rules_of_origin(rules_document, "01")
        self.assertCountEqual(rules_of_origin, [chapter_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "02")
        self.assertCountEqual(rules_of_origin,
                              [chapter_rule, heading_rule, subheading_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "0110")
        self.assertCountEqual(rules_of_origin,
                              [chapter_rule, heading_rule, subheading_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "0205")
        self.assertCountEqual(rules_of_origin,
                              [chapter_rule, heading_rule, subheading_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "020505")
        self.assertCountEqual(rules_of_origin,
                              [chapter_rule, heading_rule, subheading_rule])
    def test_non_ex_rules_directly_applied_to_commodity_code(self):
        rules_document = mixer.blend(RulesDocument)
        rule_01 = mixer.blend(
            Rule,
            hs_from="01",
            hs_to=None,
            is_exclusion=False,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )
        rule_02 = mixer.blend(
            Rule,
            hs_from="02",
            hs_to=None,
            is_exclusion=False,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )
        rule_03 = mixer.blend(
            Rule,
            hs_from="03",
            hs_to=None,
            is_exclusion=False,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )
        another_rule_03 = mixer.blend(
            Rule,
            hs_from="03",
            hs_to=None,
            is_exclusion=False,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )

        rules_of_origin = get_rules_of_origin(rules_document, "01")
        self.assertCountEqual(rules_of_origin, [rule_01])

        rules_of_origin = get_rules_of_origin(rules_document, "02")
        self.assertCountEqual(rules_of_origin, [rule_02])

        rules_of_origin = get_rules_of_origin(rules_document, "03")
        self.assertCountEqual(rules_of_origin, [another_rule_03, rule_03])

        rules_of_origin = get_rules_of_origin(rules_document, "04")
        self.assertCountEqual(rules_of_origin, [])
    def test_non_ex_rule_with_leading_rule(self):
        # A leading rule is one without `rule_text`
        rules_document = mixer.blend(RulesDocument)

        chapter_rule = mixer.blend(
            Rule,
            code="chapter_rule",
            hs_from="01",
            hs_to=None,
            is_exclusion=False,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )
        heading_leading_rule = mixer.blend(
            Rule,
            code="heading_leading_rule",
            hs_from="0101",
            hs_to=None,
            is_exclusion=False,
            rules_document=rules_document,
            rule_text=None,
        )
        subheading_rule = mixer.blend(
            Rule,
            code="subheading_rule",
            hs_from="010101",
            hs_to=None,
            is_exclusion=False,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )

        rules_of_origin = get_rules_of_origin(rules_document, "01")
        self.assertCountEqual(rules_of_origin, [chapter_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "0101")
        self.assertCountEqual(rules_of_origin, [heading_leading_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "010101")
        self.assertCountEqual(rules_of_origin,
                              [heading_leading_rule, subheading_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "01010101")
        self.assertCountEqual(rules_of_origin,
                              [heading_leading_rule, subheading_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "0101010101")
        self.assertCountEqual(rules_of_origin,
                              [heading_leading_rule, subheading_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "010101010101")
        self.assertCountEqual(rules_of_origin,
                              [heading_leading_rule, subheading_rule])
Exemple #5
0
    def get_rules_of_origin(self, country_code, commodity_code):
        if country_code == "EU":
            country_code = (
                "FR"  # pick one of the EU countries, the RoO are the same for all
            )

        rules_documents = RulesDocument.objects.filter(
            countries__country_code=country_code,
            start_date__lte=date.today(),
        )

        rules_of_origin = []
        for rules_document in rules_documents:
            rules = get_rules_of_origin(rules_document, commodity_code)
            footnotes, relevant_footnotes = self.get_rules_footnotes(
                rules_document, rules)
            introductory_notes = self.get_rules_introductory_notes(
                rules_document, footnotes)
            rules_of_origin.append((rules_document, rules, relevant_footnotes,
                                    introductory_notes))

        return rules_of_origin
    def test_non_ex_rules_override_parent_rules(self):
        rules_document = mixer.blend(RulesDocument)

        chapter_rule = mixer.blend(
            Rule,
            hs_from="01",
            hs_to=None,
            is_exclusion=False,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )
        heading_rule = mixer.blend(
            Rule,
            hs_from="0101",
            hs_to=None,
            is_exclusion=False,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )
        subheading_rule = mixer.blend(
            Rule,
            hs_from="010101",
            hs_to=None,
            is_exclusion=False,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )

        rules_of_origin = get_rules_of_origin(rules_document, "01")
        self.assertCountEqual(rules_of_origin, [chapter_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "0101")
        self.assertCountEqual(rules_of_origin, [heading_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "010101")
        self.assertCountEqual(rules_of_origin, [subheading_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "01010101")
        self.assertCountEqual(rules_of_origin, [subheading_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "0101010101")
        self.assertCountEqual(rules_of_origin, [subheading_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "010101010101")
        self.assertCountEqual(rules_of_origin, [subheading_rule])
    def test_non_ex_rules_in_hierarchy_for_commodity_code(self):
        rules_document = mixer.blend(RulesDocument)

        rule = mixer.blend(
            Rule,
            hs_from="01",
            hs_to=None,
            is_exlusion=False,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )
        rules_of_origin = get_rules_of_origin(rules_document, "01")
        self.assertCountEqual(rules_of_origin, [rule])
        rules_of_origin = get_rules_of_origin(rules_document, "0102")
        self.assertCountEqual(rules_of_origin, [rule])
        rules_of_origin = get_rules_of_origin(rules_document, "010203")
        self.assertCountEqual(rules_of_origin, [rule])
        rules_of_origin = get_rules_of_origin(rules_document, "01020304")
        self.assertCountEqual(rules_of_origin, [rule])
        rules_of_origin = get_rules_of_origin(rules_document, "0102030405")
        self.assertCountEqual(rules_of_origin, [rule])
        rules_of_origin = get_rules_of_origin(rules_document, "010203040506")
        self.assertCountEqual(rules_of_origin, [rule])

        rule.hs_from = "0102"
        rule.save()
        rules_of_origin = get_rules_of_origin(rules_document, "01")
        self.assertCountEqual(rules_of_origin, [])
        rules_of_origin = get_rules_of_origin(rules_document, "0102")
        self.assertCountEqual(rules_of_origin, [rule])
        rules_of_origin = get_rules_of_origin(rules_document, "010203")
        self.assertCountEqual(rules_of_origin, [rule])
        rules_of_origin = get_rules_of_origin(rules_document, "01020304")
        self.assertCountEqual(rules_of_origin, [rule])
        rules_of_origin = get_rules_of_origin(rules_document, "0102030405")
        self.assertCountEqual(rules_of_origin, [rule])

        rule.hs_from = "010203"
        rule.save()
        rules_of_origin = get_rules_of_origin(rules_document, "01")
        self.assertCountEqual(rules_of_origin, [])
        rules_of_origin = get_rules_of_origin(rules_document, "0102")
        self.assertCountEqual(rules_of_origin, [])
        rules_of_origin = get_rules_of_origin(rules_document, "010203")
        self.assertCountEqual(rules_of_origin, [rule])
        rules_of_origin = get_rules_of_origin(rules_document, "01020304")
        self.assertCountEqual(rules_of_origin, [rule])
        rules_of_origin = get_rules_of_origin(rules_document, "0102030405")
        self.assertCountEqual(rules_of_origin, [rule])
    def test_ex_rules_directly_applied_overlap(self):
        rules_document = mixer.blend(RulesDocument)

        chapter_rule = mixer.blend(
            Rule,
            code="chapter_rule",
            hs_from="01",
            hs_to=None,
            is_exclusion=True,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )
        heading_rule = mixer.blend(
            Rule,
            code="heading_rule",
            hs_from="0101",
            hs_to=None,
            is_exclusion=True,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )
        subheading_rule = mixer.blend(
            Rule,
            code="subheading_rule",
            hs_from="010101",
            hs_to=None,
            is_exclusion=True,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )

        rules_of_origin = get_rules_of_origin(rules_document, "01")
        self.assertCountEqual(rules_of_origin, [chapter_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "0101")
        self.assertCountEqual(rules_of_origin, [chapter_rule, heading_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "010101")
        self.assertCountEqual(rules_of_origin,
                              [chapter_rule, heading_rule, subheading_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "01010101")
        self.assertCountEqual(rules_of_origin,
                              [chapter_rule, heading_rule, subheading_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "0101010101")
        self.assertCountEqual(rules_of_origin,
                              [chapter_rule, heading_rule, subheading_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "010101010101")
        self.assertCountEqual(rules_of_origin,
                              [chapter_rule, heading_rule, subheading_rule])

        other_chapter_rule = mixer.blend(
            Rule,
            code="other_chapter_rule",
            hs_from="01",
            hs_to=None,
            is_exclusion=True,
            rules_document=rules_document,
            rule_text=mixer.RANDOM,
        )

        rules_of_origin = get_rules_of_origin(rules_document, "01")
        self.assertCountEqual(rules_of_origin,
                              [chapter_rule, other_chapter_rule])

        rules_of_origin = get_rules_of_origin(rules_document, "0101")
        self.assertCountEqual(rules_of_origin,
                              [other_chapter_rule, chapter_rule, heading_rule])
    def test_no_rules_in_rules_document(self):
        rules_document = mixer.blend(RulesDocument)

        rules_of_origin = get_rules_of_origin(rules_document, "01")

        self.assertCountEqual(rules_of_origin, [])