Пример #1
0
 def sync_from_stripe_data(cls, data):
     customer = Customer.objects.get(stripe_id=data["customer"])
     obj, _ = customer.charges.get_or_create(
         stripe_id=data["id"]
     )
     invoice_id = data.get("invoice", None)
     if obj.customer.invoices.filter(stripe_id=invoice_id).exists():
         obj.invoice = obj.customer.invoices.get(stripe_id=invoice_id)
     obj.card_last_4 = data["card"]["last4"]
     obj.card_kind = data["card"]["type"]
     obj.amount = (data["amount"] / decimal.Decimal("100"))
     obj.paid = data["paid"]
     obj.refunded = data["refunded"]
     obj.fee = (data["fee"] / decimal.Decimal("100"))
     obj.disputed = data["dispute"] is not None
     obj.charge_created = convert_tstamp(data, "created")
     if data.get("description"):
         obj.description = data["description"]
     if data.get("amount_refunded"):
         # pylint: disable=C0301
         obj.amount_refunded = (data["amount_refunded"] / decimal.Decimal("100"))
     if data["refunded"]:
         obj.amount_refunded = (data["amount"] / decimal.Decimal("100"))
     obj.save()
     return obj
Пример #2
0
 def process_transfer(cls, event, transfer):
     defaults = {
         "amount": transfer["amount"] / decimal.Decimal("100"),
         "status": transfer["status"],
         "date": convert_tstamp(transfer, "date"),
         "description": transfer.get("description", "")
     }
     summary = transfer.get("summary")
     if summary:
         defaults.update({
             "adjustment_count": summary.get("adjustment_count"),
             "adjustment_fees": summary.get("adjustment_fees"),
             "adjustment_gross": summary.get("adjustment_gross"),
             "charge_count": summary.get("charge_count"),
             "charge_fees": summary.get("charge_fees"),
             "charge_gross": summary.get("charge_gross"),
             "collected_fee_count": summary.get("collected_fee_count"),
             "collected_fee_gross": summary.get("collected_fee_gross"),
             "refund_count": summary.get("refund_count"),
             "refund_fees": summary.get("refund_fees"),
             "refund_gross": summary.get("refund_gross"),
             "validation_count": summary.get("validation_count"),
             "validation_fees": summary.get("validation_fees"),
             "net": summary.get("net") / decimal.Decimal("100")
         })
     for field in defaults:
         if field.endswith("fees") or field.endswith("gross"):
             defaults[field] = defaults[field] / decimal.Decimal("100")
     if event.kind == "transfer.paid":
         defaults.update({"event": event})
         obj, created = Transfer.objects.get_or_create(
             stripe_id=transfer["id"],
             defaults=defaults
         )
     else:
         obj, created = Transfer.objects.get_or_create(
             stripe_id=transfer["id"],
             event=event,
             defaults=defaults
         )
     if created and summary:
         for fee in summary.get("charge_fee_details", []):
             obj.charge_fee_details.create(
                 amount=fee["amount"] / decimal.Decimal("100"),
                 application=fee.get("application", ""),
                 description=fee.get("description", ""),
                 kind=fee["type"]
             )
     else:
         obj.status = transfer["status"]
         obj.save()
     if event.kind == "transfer.updated":
         obj.update_status()
Пример #3
0
    def sync_current_subscription(self, cu=None):
        cu = cu or self.stripe_customer
        sub = getattr(cu, "subscription", None)
        if sub is None:
            try:
                self.subscription().delete()
            except CurrentSubscription.DoesNotExist:
                pass
        else:
            if sub.plan.id.startswith('premium-publisher'):
                sub_obj = self.publisher_subscription()
            else:
                sub_obj = self.member_subscription()
            if sub_obj:
                sub_obj.plan = plan_from_stripe_id(sub.plan.id)
                sub_obj.current_period_start = convert_tstamp(
                    sub.current_period_start
                )
                sub_obj.current_period_end = convert_tstamp(
                    sub.current_period_end
                )
                sub_obj.amount = (sub.plan.amount / decimal.Decimal("100"))
                sub_obj.status = sub.status
                sub_obj.cancel_at_period_end = sub.cancel_at_period_end
                sub_obj.start = convert_tstamp(sub.start)
                sub_obj.quantity = sub.quantity
                sub_obj.save()
            else:
                sub_obj = CurrentSubscription.objects.create(
                    customer=self,
                    plan=plan_from_stripe_id(sub.plan.id),
                    current_period_start=convert_tstamp(
                        sub.current_period_start
                    ),
                    current_period_end=convert_tstamp(
                        sub.current_period_end
                    ),
                    amount=(sub.plan.amount / decimal.Decimal("100")),
                    status=sub.status,
                    cancel_at_period_end=sub.cancel_at_period_end,
                    start=convert_tstamp(sub.start),
                    quantity=sub.quantity
                )

            if sub.trial_start and sub.trial_end:
                sub_obj.trial_start = convert_tstamp(sub.trial_start)
                sub_obj.trial_end = convert_tstamp(sub.trial_end)
                sub_obj.save()

            return sub_obj
Пример #4
0
 def publisher_cancel(self, at_period_end=True):
         try:
             current = self.publisher_subscription()
         except CurrentSubscription.DoesNotExist:
             return
         sub = self.stripe_customer.cancel_subscription(
             at_period_end=at_period_end
         )
         current.status = sub.status
         current.cancel_at_period_end = sub.cancel_at_period_end
         current.current_period_end = convert_tstamp(sub, "current_period_end")
         current.save()
         cancelled.send(sender=self, stripe_response=sub)      
Пример #5
0
    def sync_from_stripe_data(cls, stripe_invoice, send_receipt=True):
        c = Customer.objects.get(stripe_id=stripe_invoice["customer"])
        period_end = convert_tstamp(stripe_invoice, "period_end")
        period_start = convert_tstamp(stripe_invoice, "period_start")
        date = convert_tstamp(stripe_invoice, "date")

        invoice, created = cls.objects.get_or_create(
            stripe_id=stripe_invoice["id"],
            defaults=dict(
                customer=c,
                attempted=stripe_invoice["attempted"],
                attempts=stripe_invoice["attempt_count"],
                closed=stripe_invoice["closed"],
                paid=stripe_invoice["paid"],
                period_end=period_end,
                period_start=period_start,
                subtotal=stripe_invoice["subtotal"] / decimal.Decimal("100"),
                total=stripe_invoice["total"] / decimal.Decimal("100"),
                date=date,
                charge=stripe_invoice.get("charge") or ""
            )
        )
        if not created:
            # pylint: disable=C0301
            invoice.attempted = stripe_invoice["attempted"]
            invoice.attempts = stripe_invoice["attempt_count"]
            invoice.closed = stripe_invoice["closed"]
            invoice.paid = stripe_invoice["paid"]
            invoice.period_end = period_end
            invoice.period_start = period_start
            invoice.subtotal = stripe_invoice["subtotal"] / decimal.Decimal("100")
            invoice.total = stripe_invoice["total"] / decimal.Decimal("100")
            invoice.date = date
            invoice.charge = stripe_invoice.get("charge") or ""
            invoice.save()

        for item in stripe_invoice["lines"].get("data", []):
            period_end = convert_tstamp(item["period"], "end")
            period_start = convert_tstamp(item["period"], "start")

            if item.get("plan"):
                plan = plan_from_stripe_id(item["plan"]["id"])
            else:
                plan = ""

            inv_item, inv_item_created = invoice.items.get_or_create(
                stripe_id=item["id"],
                defaults=dict(
                    amount=(item["amount"] / decimal.Decimal("100")),
                    currency=item["currency"],
                    proration=item["proration"],
                    description=item.get("description") or "",
                    line_type=item["type"],
                    plan=plan,
                    period_start=period_start,
                    period_end=period_end,
                    quantity=item.get("quantity")
                )
            )
            if not inv_item_created:
                inv_item.amount = (item["amount"] / decimal.Decimal("100"))
                inv_item.currency = item["currency"]
                inv_item.proration = item["proration"]
                inv_item.description = item.get("description") or ""
                inv_item.line_type = item["type"]
                inv_item.plan = plan
                inv_item.period_start = period_start
                inv_item.period_end = period_end
                inv_item.quantity = item.get("quantity")
                inv_item.save()

        if stripe_invoice.get("charge"):
            obj = c.record_charge(stripe_invoice["charge"])
            obj.invoice = invoice
            obj.save()
            if send_receipt:
                obj.send_receipt()
        return invoice