def financial_data(self, request): profile = request.user.profile earned = models.TaskWorker.objects.prefetch_related('task__project').values( 'task__project__price').filter(worker=request.user, is_paid=True).values_list('task__project__price', flat=True) awaiting_payment = models.TaskWorker.objects.prefetch_related('task__project').values( 'task__project__price').filter(worker=request.user, is_paid=False, status=models.TaskWorker.STATUS_ACCEPTED).values_list( 'task__project__price', flat=True) response_data = { "is_worker": profile.is_worker, "is_requester": profile.is_requester, "awaiting_payment": sum(awaiting_payment) if len(awaiting_payment) else 0, "total_earned": sum(earned) if len(earned) else 0, "is_discount_eligible": is_discount_eligible(request.user) } response_data.update({'tasks_completed': models.TaskWorker.objects.filter(worker=request.user, status__in=[ models.TaskWorker.STATUS_ACCEPTED, models.TaskWorker.STATUS_SUBMITTED]).count()}) if hasattr(request.user, 'stripe_customer') and request.user.stripe_customer is not None: response_data.update({"account_balance": round(request.user.stripe_customer.account_balance, 2) / 100}) response_data.update({"held_for_liability": 0}) response_data.update({"default_card": request.user.stripe_customer.stripe_data.get('default_card')}) if hasattr(request.user, 'stripe_account') and request.user.stripe_account is not None: response_data.update({"default_bank": request.user.stripe_account.stripe_data.get('default_bank')}) return Response(response_data, status.HTTP_200_OK)
def create_charge(self, amount, user): application_fee = self.get_chargeback_fee(amount) discount_applied = is_discount_eligible(user) if discount_applied: f = 0.5 else: f = 1 amount_to_charge = int(math.ceil( (amount * f + 30) / 0.966)) # 2.9% + 30c + 0.5% description = "Daemo crowdsourcing prepaid tasks for {} {}".format( user.first_name, user.last_name) charge = self._create_charge( customer_id=user.stripe_customer.stripe_id, amount=amount_to_charge, application_fee=application_fee, description=description) stripe_data = { "amount": int(amount), "status": charge.status, "description": description } # amount_total = int(amount - 0.029 * amount - 30 - self.get_chargeback_fee(amount)) user.stripe_customer.account_balance += amount user.stripe_customer.save() return StripeCharge.objects.create(stripe_id=charge.stripe_id, customer=user.stripe_customer, stripe_data=stripe_data, balance=int(math.ceil(amount * f)), discount_applied=discount_applied, raw_amount=amount_to_charge, discount=f)
def financial_data(self, request): profile = request.user.profile earned = models.TaskWorker.objects.prefetch_related('task__project').values( 'task__project__price').filter(worker=request.user, is_paid=True).values_list('task__project__price', flat=True) awaiting_payment = models.TaskWorker.objects.prefetch_related('task__project').values( 'task__project__price').filter(worker=request.user, is_paid=False, status=models.TaskWorker.STATUS_ACCEPTED).values_list( 'task__project__price', flat=True) response_data = { "is_worker": profile.is_worker, "is_requester": profile.is_requester, "awaiting_payment": sum(awaiting_payment) if len(awaiting_payment) else 0, "total_earned": sum(earned) if len(earned) else 0, "is_discount_eligible": is_discount_eligible(request.user) } response_data.update({'tasks_completed': models.TaskWorker.objects.filter(worker=request.user, status__in=[ models.TaskWorker.STATUS_ACCEPTED, models.TaskWorker.STATUS_SUBMITTED]).count()}) if hasattr(request.user, 'stripe_customer') and request.user.stripe_customer is not None: response_data.update({"account_balance": round(request.user.stripe_customer.account_balance, 2) / 100}) response_data.update({"held_for_liability": 0}) if hasattr(request.user.stripe_customer, 'stripe_data') and \ request.user.stripe_customer.stripe_data is not None: response_data.update({"default_card": request.user.stripe_customer.stripe_data.get('default_card')}) if hasattr(request.user, 'stripe_account') and request.user.stripe_account is not None \ and hasattr(request.user.stripe_account, 'stripe_data') and \ request.user.stripe_account.stripe_data is not None: response_data.update({"default_bank": request.user.stripe_account.stripe_data.get('default_bank')}) return Response(response_data, status.HTTP_200_OK)
def create_charge(self, amount, user): application_fee = self.get_chargeback_fee(amount) discount_applied = is_discount_eligible(user) if discount_applied: f = 0.5 else: f = 1 amount_to_charge = int(math.ceil((amount * f + 30) / 0.966)) # 2.9% + 30c + 0.5% description = "Daemo crowdsourcing prepaid tasks for {} {}".format(user.first_name, user.last_name) charge = self._create_charge(customer_id=user.stripe_customer.stripe_id, amount=amount_to_charge, application_fee=application_fee, description=description) stripe_data = { "amount": int(amount), "status": charge.status, "description": description } # amount_total = int(amount - 0.029 * amount - 30 - self.get_chargeback_fee(amount)) user.stripe_customer.account_balance += amount user.stripe_customer.save() return StripeCharge.objects.create(stripe_id=charge.stripe_id, customer=user.stripe_customer, stripe_data=stripe_data, balance=int(math.ceil(amount * f)), discount_applied=discount_applied, raw_amount=amount_to_charge, discount=f)