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
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()
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
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)
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