HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
File: //proc/1233/root/home/arjun/projects/buyercall_forms/buyercall/cli/commands/cmd_stripe.py
import logging

import click
import stripe

from buyercall.blueprints.billing.gateways.stripecom import Plan as PaymentPlan
from config import settings
from buyercall.lib.util_sqlalchemy import ResourceMixin, AwareDateTime
from buyercall.extensions import db
from sqlalchemy import or_, orm
from buyercall.blueprints.billing.models.credit_card import CreditCard
from buyercall.blueprints.billing.models.coupon import Coupon
from buyercall.blueprints.user.models import User
from buyercall.blueprints.billing.models.subscription import Subscription
from buyercall.blueprints.billing.gateways.stripecom import Card as PaymentCard
from buyercall.blueprints.billing.gateways.stripecom import \
    Subscription as PaymentSubscription


STRIPE_SECRET_KEY = None
STRIPE_PLANS = None

try:
    from instance import settings

    STRIPE_SECRET_KEY = settings.STRIPE_SECRET_KEY
    STRIPE_PLANS = settings.STRIPE_PLANS
except ImportError:
    logging.error('Ensure __init__.py and settings.py both exist in instance/')
    exit(1)
except AttributeError:
    from config import settings

    if STRIPE_SECRET_KEY is None:
        STRIPE_SECRET_KEY = settings.STRIPE_SECRET_KEY
    if STRIPE_PLANS is None:
        STRIPE_PLANS = settings.STRIPE_PLANS


@click.group()
def cli():
    """ Perform various tasks with Stripe's API. """
    stripe.api_key = STRIPE_SECRET_KEY


@click.command()
def sync_plans():
    """
    Sync (upsert) STRIPE_PLANS to Stripe.

    :return: None
    """
    if STRIPE_PLANS is None:
        return None

    for _, value in STRIPE_PLANS.items():
        plan = PaymentPlan.retrieve(value.get('id'))
        if plan:
            PaymentPlan.update(id=value.get('id'),
                               name=value.get('name'),
                               metadata=value.get('metadata'),
                               statement_descriptor=value.get(
                                   'statement_descriptor'))
        else:
            PaymentPlan.create(**value)

    return None


@click.command()
@click.argument('plan_ids', nargs=-1)
def delete_plans(plan_ids):
    """
    Delete 1 or more plans from Stripe.

    :return: None
    """
    for plan_id in plan_ids:
        PaymentPlan.delete(plan_id)

    return None


@click.command()
def list_plans():
    """
    List all existing plans on Stripe.

    :return: Stripe plans
    """
    return logging.info(PaymentPlan.list())


@click.command()
def associate_invoice_cc():
    """
    Associate credit card with invoice plan

    :return: Stripe plans
    """

    from buyercall.app import create_app
    from buyercall.extensions import db
    # Create a context for the database connection.
    app = create_app()
    db.app = app

    cc_name = input('Credit Card Name: ')
    cc_number = input('Credit Card Number: ')
    cc_number = int(cc_number)
    cc_exp_month = input('Credit Card Exp Month: ')
    cc_exp_month = int(cc_exp_month)
    cc_exp_year = input('Credit Card Exp Year: ')
    cc_exp_year = int(cc_exp_year)
    cc_cvc = input('Credit Card CVC: ')
    cc_cvc = int(cc_cvc)

    stripe.api_key = STRIPE_SECRET_KEY
    token = stripe.Token.create(
        card={
            "number": '4242424242424242',
            "exp_month": 12,
            "exp_year": 2017,
            "cvc": '123'
        },
    )

    print('token.id:')
    print(token.id)

    user = User.query.filter(User.role == 'sysadmin').first()

    plan = 'invoice'
    customer = PaymentSubscription.create(token=token.id, email=user.email, plan=plan)

    print('customer.id:')
    print(customer.id)

    with app.app_context():
        subscription = Subscription()
        subscription.activate_twilio(user)

        subscription.payment_id = customer.id
        subscription.cancelled_subscription_on = None
        subscription.plan = plan

        # Create the credit card.
        credit_card = CreditCard(cc_name=cc_name, **CreditCard.extract_card_params(customer))

        subscription.credit_card = credit_card
        subscription.status = 'active'

        db.session.add(user)
        db.session.add(credit_card)
        db.session.add(subscription)

        db.session.commit()

    pass


cli.add_command(sync_plans)
cli.add_command(delete_plans)
cli.add_command(list_plans)
cli.add_command(associate_invoice_cc)