Ejemplo n.º 1
0
 def export_sepa(self, request, queryset):
     """
     Dowload a sepa file with selected ProjectPayments
     """
     objs = queryset.all()
     if not request.user.is_staff:
         raise PermissionDenied
     response = HttpResponse(mimetype='text/xml')
     date = timezone.datetime.strftime(timezone.now(), '%Y%m%d%H%I%S')
     response['Content-Disposition'] = 'attachment; ' \
                                       'filename=payments_sepa%s.xml' % date
     response.write(OrganizationPayout.create_sepa_xml(objs))
     return response
    def _initialize_unmatched_transactions(self):
        # required for project save
        start = timezone.now() - timedelta(days=10)
        status_campaign = ProjectPhase.objects.get(slug='campaign')
        status_done = ProjectPhase.objects.get(slug='done-complete')

        # projects to match with
        self.project1 = ProjectFactory.create(status=status_campaign)
        self.project2 = ProjectFactory.create(status=status_campaign,
                                              amount_asked=200)
        self.project3 = ProjectFactory.create(status=status_campaign,
                                              amount_asked=200)
        self.project4 = ProjectFactory.create(status=status_campaign,
                                              amount_asked=200)

        # Close some of the projects
        self.project2.status = status_done
        self.project2.save()
        self.project3.status = status_done
        self.project3.save()
        self.project4.status = status_done
        self.project4.save()

        # update payout for project 2 & 3, no donations exist yet so just make it zero/empty
        # adding a new donation (for a closed payout) should create a new payout
        payout2 = self.project2.projectpayout_set.first()
        payout2.payout_rule = BaseProjectPayout.PayoutRules.not_fully_funded
        payout2.in_progress()
        payout2.save()
        payout2.settled()
        payout2.save()

        payout3 = self.project3.projectpayout_set.first()
        payout3.payout_rule = BaseProjectPayout.PayoutRules.not_fully_funded
        payout3.in_progress()
        payout3.save()
        payout3.settled()
        payout3.save()

        # should be updated with new donation
        payout4 = self.project4.projectpayout_set.first()
        payout4.payout_rule = BaseProjectPayout.PayoutRules.not_fully_funded
        payout4.save()
        self.assertEqual(payout4.status, StatusDefinition.NEW)

        # create a bank transaction to resolve. It's unmatched with anything.
        self.transactions = BankTransactionFactory.create_batch(
            4,
            payout=None,
            remote_payout=None,
            remote_payment=None,
            credit_debit='C',
            amount=Decimal(75),  # must create a donation of 75 euro
            book_date=date.today() - timedelta(days=3),
            description1='Unmatched donation'
        )

        # create an organization payout
        now = date.today()
        self.org_payout = OrganizationPayout(
            start_date=now - timedelta(days=7),
            end_date=now + timedelta(days=7),
            planned=now + timedelta(days=8)
        )
        self.org_payout.save()
class BankTransactionActionTests(WebTestMixin, BluebottleTestCase):

    def setUp(self):
        super(BankTransactionActionTests, self).setUp()
        self.init_projects()
        self.app.extra_environ['HTTP_HOST'] = str(self.tenant.domain_url)
        self.superuser = BlueBottleUserFactory.create(is_staff=True, is_superuser=True)

    def _add_completed_donation(self, project, amount):
        donation = DonationFactory.create(project=project, amount=amount)
        donation.order.locked()
        donation.order.save()
        donation.order.success()
        donation.order.save()

    def _initialize_unmatched_transactions(self):
        # required for project save
        start = timezone.now() - timedelta(days=10)
        status_campaign = ProjectPhase.objects.get(slug='campaign')
        status_done = ProjectPhase.objects.get(slug='done-complete')

        # projects to match with
        self.project1 = ProjectFactory.create(status=status_campaign)
        self.project2 = ProjectFactory.create(status=status_campaign,
                                              amount_asked=200)
        self.project3 = ProjectFactory.create(status=status_campaign,
                                              amount_asked=200)
        self.project4 = ProjectFactory.create(status=status_campaign,
                                              amount_asked=200)

        # Close some of the projects
        self.project2.status = status_done
        self.project2.save()
        self.project3.status = status_done
        self.project3.save()
        self.project4.status = status_done
        self.project4.save()

        # update payout for project 2 & 3, no donations exist yet so just make it zero/empty
        # adding a new donation (for a closed payout) should create a new payout
        payout2 = self.project2.projectpayout_set.first()
        payout2.payout_rule = BaseProjectPayout.PayoutRules.not_fully_funded
        payout2.in_progress()
        payout2.save()
        payout2.settled()
        payout2.save()

        payout3 = self.project3.projectpayout_set.first()
        payout3.payout_rule = BaseProjectPayout.PayoutRules.not_fully_funded
        payout3.in_progress()
        payout3.save()
        payout3.settled()
        payout3.save()

        # should be updated with new donation
        payout4 = self.project4.projectpayout_set.first()
        payout4.payout_rule = BaseProjectPayout.PayoutRules.not_fully_funded
        payout4.save()
        self.assertEqual(payout4.status, StatusDefinition.NEW)

        # create a bank transaction to resolve. It's unmatched with anything.
        self.transactions = BankTransactionFactory.create_batch(
            4,
            payout=None,
            remote_payout=None,
            remote_payment=None,
            credit_debit='C',
            amount=Decimal(75),  # must create a donation of 75 euro
            book_date=date.today() - timedelta(days=3),
            description1='Unmatched donation'
        )

        # create an organization payout
        now = date.today()
        self.org_payout = OrganizationPayout(
            start_date=now - timedelta(days=7),
            end_date=now + timedelta(days=7),
            planned=now + timedelta(days=8)
        )
        self.org_payout.save()

    def _match_banktransactions(self, expected_action, n_transactions):
        """
        Fetches the list and executes the list action to match the bank transactions.

        :param expected_action: string as expected to be visible.
        """
        admin_url = reverse('admin:accounting_banktransaction_changelist')

        # verify that the transactions are visible
        transaction_list = self.app.get(admin_url, user=self.superuser)
        self.assertEqual(transaction_list.status_code, 200)
        # one for each transaction
        self.assertEqual(transaction_list.pyquery('.action-checkbox').length, n_transactions)

        # 'try' to match them and check that they have the appropriate statuses and actions in the admin

        # check the checkboxes and submit the action
        form = transaction_list.forms['changelist-form']
        form['action'].select('find_matches')
        for i in range(0, len(self.transactions)):
            form.get('_selected_action', index=i).checked = True
        transaction_list = form.submit().follow()

        # all transactions must be marked as 'unknown'
        transactions = BankTransaction.objects.filter(status=BankTransaction.IntegrityStatus.UnknownTransaction)
        self.assertEqual(transactions.count(), n_transactions)

        # verify that the action 'create donation' is visible
        self.assertContains(transaction_list, expected_action, count=4)