jcloude/press/patches/v0_0_1/create_balance_transactions.py
2025-12-23 23:04:51 +08:00

66 lines
1.8 KiB
Python

# Copyright (c) 2020, Jingrow Technologies Pvt. Ltd. and Contributors
# For license information, please see license.txt
import jingrow
from jingrow.utils import update_progress_bar
from jcloude.api.billing import get_stripe
def execute():
jingrow.reload_pg("jcloude", "pagetype", "balance_transaction")
partners = jingrow.db.get_all("Team", filters={"jerp_partner": 1}, pluck="name")
for i, name in enumerate(partners):
update_progress_bar("Creating Balance Transactions", i, len(partners))
if jingrow.db.exists(
"Balance Transaction", {"team": name, "description": "Initial Balance"}
):
continue
team = jingrow.get_pg("Team", name)
balance = team.get_stripe_balance()
if balance != 0:
stripe = get_stripe()
# reset customer balance on Stripe
stripe.Customer.create_balance_transaction(
team.stripe_customer_id,
# multiplied by 100 because Stripe wants amount in cents / paise
amount=int(balance * 100),
currency=team.currency.lower(),
description="Reset customer balance",
idempotency_key=team.name,
)
free_credits_left = get_free_credits_left(team)
source = ""
if free_credits_left == balance:
source = "Free Credits"
# set the balance as initial balance here
team.allocate_credit_amount(balance, source=source, remark="Stripe Balance")
def get_free_credits_left(team):
invoices = jingrow.db.get_all("Invoice", {"team": team.name, "status": ("!=", "Draft")})
settings = jingrow.get_pg("Jcloude Settings")
total_free_credits = (
settings.free_credits_inr if team.currency == "INR" else settings.free_credits_usd
)
if not invoices:
return total_free_credits
def sum(list):
total = 0
for d in list:
total += d
return total
invoices_total = sum([invoice.total for invoice in invoices])
if invoices_total < total_free_credits:
return total_free_credits - invoices_total
return 0