Ejemplo n.º 1
0
    def create(self, validated_data):
        email = validated_data.get('email')

        user = User.objects.create_user(
            username=email,
            email=email,
            password=validated_data.get('password'),
            first_name=validated_data.get('first_name'),
            last_name=validated_data.get('last_name'),
        )

        customer = Customer.objects.create(
            identity_number=validated_data.get('identity_number'),
            address=validated_data.get('address'),
            sex=validated_data.get('sex'),
            user=user,
        )

        BankInformation.objects.create(
            account_number=BankInformation.generate_account_number(),
            holder=customer,
        )

        msg = 'Success to register customer'
        attrs = dict(self.context.get('request').data)
        task_event_logging.delay(email, msg, attrs)
        return customer
Ejemplo n.º 2
0
    def list(self, request, *args, **kwargs):
        customer = request.user.customer
        serializer = self.get_serializer(instance=customer)

        msg = 'Retrieve account information.'
        task_event_logging.delay(customer.user.email, msg, {})
        return Response(serializer.data)
Ejemplo n.º 3
0
    def create(self, validated_data):
        sender = validated_data.get('sender')
        amount = validated_data.get('amount')

        # Bank statement for sender.
        statement_sender = BankStatement()
        statement_sender.bank_info = sender.bankinformation
        statement_sender.sender = sender
        statement_sender.receiver = self.receiver_bank.holder
        statement_sender.amount = amount
        statement_sender.is_debit = True
        statement_sender.description = 'Amount transferred'
        statement_sender.save()

        # Bank statement for receiver.
        statement_receiver = BankStatement()
        statement_receiver.bank_info = self.receiver_bank
        statement_receiver.sender = sender
        statement_receiver.receiver = self.receiver_bank.holder
        statement_receiver.amount = amount
        statement_receiver.is_debit = False
        statement_receiver.description = 'Amount received'
        statement_receiver.save()

        msg = 'Transfer succeed.'
        attrs = dict(self.context.get('request').data)
        task_event_logging.delay(sender.user.email, msg, attrs)

        serializer = TransactionSerializer(instance=statement_sender)
        return serializer.data
Ejemplo n.º 4
0
    def deactivate(self, request, **kwargs):
        bank_info = self.get_object()
        bank_info.is_active = False
        bank_info.save()

        msg = 'Deactivation bank account.'
        task_event_logging.delay(bank_info.holder.user.email, msg, {})
        return Response(status=status.HTTP_200_OK)
Ejemplo n.º 5
0
    def list(self, request, *args, **kwargs):
        customer = request.user.customer
        bank_info = customer.bankinformation
        data = self.get_serializer(instance=bank_info).data

        msg = 'Retrieving bank information.'
        task_event_logging.delay(customer.user.email, msg, {})
        return Response(data)
Ejemplo n.º 6
0
    def validate(self, attrs):
        email = attrs.get('email')
        if User.objects.filter(username=email).exists():
            msg = 'Failed to register customer'
            task_event_logging.delay(email, msg, attrs)

            raise serializers.ValidationError(
                {'username': '******'})
        return attrs
Ejemplo n.º 7
0
    def mutations(self, request, **kwargs):
        bank_info = self.get_object()
        mutations = bank_info.mutations.filter(is_deleted=False).order_by('-created')
        mutations = self.paginate_queryset(mutations)
        serializer = self.get_serializer(instance=mutations, many=True)

        msg = 'See transaction history.'
        task_event_logging.delay(bank_info.holder.user.email, msg, {})
        return self.get_paginated_response(serializer.data)
Ejemplo n.º 8
0
    def validate(self, attrs):
        sender = attrs.get('sender')
        if not sender.bankinformation.is_active:
            meta = dict(self.context.get('request').data)
            msg = 'Failed to deposit funds.'
            task_event_logging.delay(sender.user.email, msg, meta)

            raise serializers.ValidationError(
                {'sender': 'Bank account is blocked or inactive.'})
        return attrs
Ejemplo n.º 9
0
    def validate(self, attrs):
        sender = attrs.get('sender')
        amount = attrs.get('amount')

        sender_bank = BankInformation.objects.select_for_update().get(
            pk=sender.bankinformation.pk, )

        if sender_bank.total_balance < amount:
            meta = dict(self.context.get('request').data)
            msg = 'Amount to transfer is exceeded to be withdraw.'
            task_event_logging.delay(sender.user.email, msg, meta)

            raise serializers.ValidationError(
                {'amount': 'Insufficient funds.'})

        return super(WithdrawSerializer, self).validate(attrs)
Ejemplo n.º 10
0
    def create(self, validated_data):
        sender = validated_data.get('sender')
        deposit_amount = validated_data.get('amount')

        deposit = BankStatement()
        deposit.bank_info = sender.bankinformation
        deposit.sender = sender
        deposit.receiver = sender
        deposit.amount = deposit_amount
        deposit.is_debit = True
        deposit.description = 'Amount withdrawn'
        deposit.save()

        msg = 'Succeed to withdraw funds.'
        attrs = dict(self.context.get('request').data)
        task_event_logging.delay(sender.user.email, msg, attrs)

        serializer = TransactionSerializer(instance=deposit)
        return serializer.data
Ejemplo n.º 11
0
    def validate(self, attrs):
        sender = attrs.get('sender')

        try:
            account_number = attrs.get('destination_account_number')
            self.receiver_bank = BankInformation.objects.select_for_update(
            ).get(account_number=account_number, )
        except BankInformation.DoesNotExist:
            meta = dict(self.context.get('request').data)
            msg = 'Failed to transfer, invalid destination account number.'
            task_event_logging.delay(sender.user.email, msg, meta)

            raise serializers.ValidationError(
                {'destination_account_number': 'Invalid account number.'})

        # Ensure receiver bank is active.
        if not self.receiver_bank.is_active:
            meta = dict(self.context.get('request').data)
            msg = 'Failed to transfer, receiver bank is inactive.'
            task_event_logging.delay(sender.user.email, msg, meta)

            raise serializers.ValidationError(
                {'receiver': 'Bank account is blocked or inactive.'})

        # Ensure sender bank is active.
        if not sender.bankinformation.is_active:
            meta = dict(self.context.get('request').data)
            msg = 'Failed to transfer, sender bank is inactive.'
            task_event_logging.delay(sender.user.email, msg, meta)

            raise serializers.ValidationError(
                {'sender': 'Bank account is blocked or inactive.'})

        # Ensure sender bank has sufficient balance.
        sender_bank = BankInformation.objects.select_for_update().get(
            pk=sender.bankinformation.pk, )
        if sender_bank.total_balance < attrs.get('amount'):
            meta = dict(self.context.get('request').data)
            msg = 'Failed to transfer, amount to be transfer is exceeded.'
            task_event_logging.delay(sender.user.email, msg, meta)

            raise serializers.ValidationError(
                {'amount': 'Insufficient funds.'})

        return attrs