Exemplo n.º 1
0
    def test_merge_allowed_when_source_company_has_export_countries(self):
        """Test that merging is allowed if the source company has export countries."""
        source_company = CompanyFactory()
        CompanyExportCountryFactory(company=source_company)
        CompanyExportCountryHistoryFactory(company=source_company)

        target_company = CompanyFactory()
        user = AdviserFactory()

        merge_time = datetime(2011, 2, 1, 14, 0, 10, tzinfo=utc)

        with freeze_time(merge_time):
            merge_companies(source_company, target_company, user)

        source_company.refresh_from_db()

        assert source_company.archived
        assert source_company.archived_by == user
        assert source_company.archived_on == merge_time
        assert source_company.archived_reason == (
            f'This record is no longer in use and its data has been transferred '
            f'to {target_company} for the following reason: Duplicate record.'
        )
        assert source_company.modified_by == user
        assert source_company.modified_on == merge_time
        assert source_company.transfer_reason == Company.TransferReason.DUPLICATE
        assert source_company.transferred_by == user
        assert source_company.transferred_on == merge_time
        assert source_company.transferred_to == target_company
Exemplo n.º 2
0
    def test_merge_when_both_companies_are_on_pipeline_for_same_adviser(
        self,
        source_status,
        target_status,
    ):
        """
        Test that both source and target company are on pipeline for the same adviser
        and same status. And the merge is successful.
        """
        adviser = AdviserFactory()
        source_company = CompanyFactory()
        target_company = CompanyFactory()

        PipelineItemFactory(
            adviser=adviser,
            company=source_company,
            status=source_status,
        )
        PipelineItemFactory(
            adviser=adviser,
            company=target_company,
            status=target_status,
        )

        user = AdviserFactory()
        merge_companies(source_company, target_company, user)

        assert not PipelineItem.objects.filter(
            adviser=adviser,
            company=source_company,
        ).exists()
        assert PipelineItem.objects.filter(
            adviser=adviser,
            company=target_company,
        ).exists()
    def test_get_export_wins_one_merged_company_success(
        self,
        requests_mock,
    ):
        """Test get wins for both source and target, when a company was merged."""
        source_company = CompanyFactory()
        target_company = CompanyFactory()
        user = create_test_user(
            permission_codenames=(
                CompanyPermission.view_export_win,
            ),
        )
        merge_companies(source_company, target_company, user)

        requests_mock.register_uri(
            'POST',
            '/api/v1/company/match/',
            [
                {'text': self._get_matching_service_response([1, 2]), 'status_code': 200},
            ],
        )

        export_wins_response = {
            'count': 2,
            'next': None,
            'previous': None,
            'results': [
                {
                    'id': 'e3013078-7b3e-4359-83d9-cd003a515521',
                    'date': '2016-05-25',
                    'created': '2020-02-18T15:36:02.782000Z',
                    'country': 'CA',
                },
                {
                    'id': 'e3013078-7b3e-4359-83d9-cd003a515234',
                    'date': '2016-07-25',
                    'created': '2020-04-18T15:36:02.782000Z',
                    'country': 'US',
                },
            ],
        }
        export_wins_dynamic_response = HawkMockJSONResponse(
            api_id=settings.EXPORT_WINS_HAWK_ID,
            api_key=settings.EXPORT_WINS_HAWK_KEY,
            response=export_wins_response,
        )
        requests_mock.get(
            '/wins/match?match_id=1,2',
            status_code=200,
            text=export_wins_dynamic_response,
        )

        api_client = self.create_api_client(user=user)
        url = reverse('api-v4:company:export-win', kwargs={'pk': target_company.id})
        response = api_client.get(url)
        assert response.status_code == 200
        assert response.json() == export_wins_response
Exemplo n.º 4
0
    def test_merge_fails_when_not_allowed(
        self,
        is_company_a_valid_merge_source_mock,
        is_company_a_valid_merge_target_mock,
        valid_source,
        valid_target,
    ):
        """
        Test that perform_merge() raises MergeNotAllowedError when the merge is not
        allowed.
        """
        is_company_a_valid_merge_source_mock.return_value = valid_source
        is_company_a_valid_merge_target_mock.return_value = valid_target

        source_company = CompanyFactory()
        target_company = CompanyFactory()
        user = AdviserFactory()
        with pytest.raises(MergeNotAllowedError):
            merge_companies(source_company, target_company, user)
Exemplo n.º 5
0
    def test_merge_when_both_companies_on_same_company_list(self):
        """
        Test that if both the source and target company are on the same company list,
        the merge is successful and the two list items are also merged.
        """
        source_company = CompanyFactory()
        target_company = CompanyFactory()
        company_list = CompanyListFactory()

        CompanyListItemFactory(list=company_list, company=source_company)
        CompanyListItemFactory(list=company_list, company=target_company)

        user = AdviserFactory()

        merge_companies(source_company, target_company, user)

        assert not CompanyListItem.objects.filter(
            list=company_list,
            company=source_company,
        ).exists()
        assert CompanyListItem.objects.filter(list=company_list, company=target_company).exists()
Exemplo n.º 6
0
    def test_merge_when_both_companies_are_on_pipeline_diff_adviser(self):
        """
        Test that both source and target company are on pipeline with different advisers.
        Merge is successful and both items are migrated to the target company.
        """
        adviser_1 = AdviserFactory()
        adviser_2 = AdviserFactory()
        source_company = CompanyFactory()
        target_company = CompanyFactory()

        PipelineItemFactory(
            adviser=adviser_1,
            company=source_company,
            status=PipelineItem.Status.LEADS,
        )
        PipelineItemFactory(
            adviser=adviser_2,
            company=target_company,
            status=PipelineItem.Status.IN_PROGRESS,
        )

        user = AdviserFactory()
        merge_companies(source_company, target_company, user)

        assert not PipelineItem.objects.filter(
            adviser=adviser_1,
            company=source_company,
        ).exists()
        assert PipelineItem.objects.filter(
            adviser=adviser_1,
            company=target_company,
        ).exists()
        assert PipelineItem.objects.filter(
            adviser=adviser_2,
            company=target_company,
        ).exists()
Exemplo n.º 7
0
def _perform_merge(request, source_company, target_company, model_admin):
    try:
        merge_results = merge_companies(source_company, target_company,
                                        request.user)
    except MergeNotAllowedError:
        failure_msg = MERGE_FAILURE_MSG.format(
            source_company=source_company,
            target_company=target_company,
        )
        model_admin.message_user(request, failure_msg, django_messages.ERROR)
        return False

    reversion.set_comment(REVERSION_REVISION_COMMENT)
    success_msg = _build_success_msg(source_company, target_company,
                                     merge_results)
    model_admin.message_user(request, success_msg, django_messages.SUCCESS)
    return True
Exemplo n.º 8
0
    def test_merge_investment_projects_succeeds(self, fields):
        """
        Tests that perform_merge() moves investment projects to the target company and marks the
        source company as archived and transferred.
        """
        creation_time = datetime(2010, 12, 1, 15, 0, 10, tzinfo=utc)
        with freeze_time(creation_time):
            source_company = CompanyFactory()
            investment_project = InvestmentProjectFactory(
                **{field: source_company
                   for field in fields}, )

        target_company = CompanyFactory()
        user = AdviserFactory()

        merge_time = datetime(2011, 2, 1, 14, 0, 10, tzinfo=utc)

        with freeze_time(merge_time):
            result = merge_companies(source_company, target_company, user)

        other_fields = set(INVESTMENT_PROJECT_COMPANY_FIELDS) - set(fields)

        assert result == {
            # each interaction has a contact, that's why 4 contacts should be moved
            CompanyListItem: {
                'company': 0
            },
            Contact: {
                'company': 0
            },
            Interaction: {
                'company': 0
            },
            InvestmentProject: {
                **{field: 1
                   for field in fields},
                **{field: 0
                   for field in other_fields},
            },
            Order: {
                'company': 0
            },
        }

        investment_project.refresh_from_db()

        assert all(
            getattr(investment_project, field) == target_company
            for field in fields)
        assert all(
            getattr(investment_project, field) != target_company
            for field in other_fields)
        assert all(
            getattr(investment_project, field) != source_company
            for field in other_fields)

        assert investment_project.modified_on == creation_time

        source_company.refresh_from_db()

        assert source_company.archived
        assert source_company.archived_by == user
        assert source_company.archived_on == merge_time
        assert source_company.archived_reason == (
            f'This record is no longer in use and its data has been transferred '
            f'to {target_company} for the following reason: Duplicate record.')
        assert source_company.modified_by == user
        assert source_company.modified_on == merge_time
        assert source_company.transfer_reason == Company.TRANSFER_REASONS.duplicate
        assert source_company.transferred_by == user
        assert source_company.transferred_on == merge_time
        assert source_company.transferred_to == target_company
Exemplo n.º 9
0
    def test_merge_interactions_contacts_succeeds(
        self,
        factory_relation_kwarg,
        creates_contacts,
        num_related_objects,
    ):
        """
        Tests that perform_merge() moves contacts and interactions to the target company,
        and marks the source company as archived and transferred.
        """
        creation_time = datetime(2010, 12, 1, 15, 0, 10, tzinfo=utc)
        with freeze_time(creation_time):
            source_company = _company_factory(
                **{factory_relation_kwarg: num_related_objects}, )
        target_company = CompanyFactory()
        user = AdviserFactory()

        source_interactions = list(source_company.interactions.all())
        source_contacts = list(source_company.contacts.all())
        source_orders = list(source_company.orders.all())
        source_company_list_items = list(
            source_company.company_list_items.all())

        # Each interaction and order has a contact, so actual number of contacts is
        # source_num_interactions + source_num_contacts + source_num_orders
        assert len(source_contacts) == (num_related_objects
                                        if creates_contacts else 0)

        merge_time = datetime(2011, 2, 1, 14, 0, 10, tzinfo=utc)

        with freeze_time(merge_time):
            result = merge_companies(source_company, target_company, user)

        assert result == {
            CompanyListItem: {
                'company': len(source_company_list_items)
            },
            Contact: {
                'company': len(source_contacts)
            },
            Interaction: {
                'company': len(source_interactions)
            },
            InvestmentProject:
            {field: 0
             for field in INVESTMENT_PROJECT_COMPANY_FIELDS},
            Order: {
                'company': len(source_orders)
            },
        }

        for obj in chain(source_interactions, source_contacts, source_orders):
            obj.refresh_from_db()

        assert all(obj.company == target_company
                   for obj in source_interactions)
        assert all(obj.modified_on == creation_time
                   for obj in source_interactions)
        assert all(obj.company == target_company for obj in source_contacts)
        assert all(obj.modified_on == creation_time for obj in source_contacts)
        assert all(obj.company == target_company for obj in source_orders)
        assert all(obj.modified_on == creation_time for obj in source_orders)

        source_company.refresh_from_db()

        assert source_company.archived
        assert source_company.archived_by == user
        assert source_company.archived_on == merge_time
        assert source_company.archived_reason == (
            f'This record is no longer in use and its data has been transferred '
            f'to {target_company} for the following reason: Duplicate record.')
        assert source_company.modified_by == user
        assert source_company.modified_on == merge_time
        assert source_company.transfer_reason == Company.TRANSFER_REASONS.duplicate
        assert source_company.transferred_by == user
        assert source_company.transferred_on == merge_time
        assert source_company.transferred_to == target_company