inquiry.py 3.54 KB
import sys
from datetime import datetime
from argparse import ArgumentParser
from configparser import ConfigParser
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import transaction
from zope.sqlalchemy import register
from ..services import Query


IP = '127.0.0.1'
CONF_NAME = 'test'

default_merchant = 'ldmjakarta1'
default_terminal = 'Terminal Name'
default_msisdn = '628111234567'

help_amount = 'wajib saat --payment dan --reversal'
help_bill_ref = 'wajib saat payment dan reversal, '\
    'diperoleh dari inquiry response'
help_trx_id = 'Nomor Transaksi Bank, '\
    'opsional saat --payment, wajib saat --reversal'
help_merchant = 'default ' + default_merchant


def error(s):
    print(s)
    sys.exit()


def get_option(argv):
    parser = ArgumentParser()
    parser.add_argument('conf')
    parser.add_argument('--invoice-id', required=True)
    parser.add_argument('--payment', action='store_true')
    parser.add_argument('--reversal', action='store_true')
    parser.add_argument('--amount', type=int, help=help_amount)
    parser.add_argument('--bill-ref', help=help_bill_ref)
    parser.add_argument('--trx-id', help=help_trx_id)
    parser.add_argument(
        '--merchant', default=default_merchant, help=help_merchant)
    parser.add_argument('--terminal', default=default_terminal)
    parser.add_argument('--msisdn', default=default_msisdn)
    parser.add_argument('--msg', default='')
    parser.add_argument('--debug', action='store_true')
    return parser.parse_args(argv)


class App:
    def __init__(self, argv):
        self.option = get_option(argv)
        conf = ConfigParser()
        conf.read(self.option.conf)
        db_url = conf.get('main', 'db_url')
        engine = create_engine(db_url)
        engine.echo = self.option.debug
        session_factory = sessionmaker(bind=engine)
        self.db_session = session_factory()
        register(self.db_session)

    def get_method(self):
        if self.option.payment:
            return '022'
        if self.option.reversal:
            return '023'
        return '021'

    def get_transaction(self):
        def required(name, default=None):
            value = getattr(self.option, name)
            if not value and not default:
                error('--{} harus diisi'.format(name.replace('_', '-')))
            p[name] = value or default

        p = dict(
                merchant=self.option.merchant,
                terminal=self.option.terminal,
                msisdn=self.option.msisdn,
                acc_no=self.option.invoice_id,
                trx_date=datetime.now().strftime('%Y%m%d%H%M%S'),
                msg=self.option.msg)
        p['trx_type'] = self.get_method()
        if self.option.payment or self.option.reversal:
            required('amount')
            required('bill_ref')
            if self.option.payment:
                required('trx_id', datetime.now().strftime('%m%d%H%M%S'))
            else:
                required('trx_id')
        return p

    def run(self):
        data = self.get_transaction()
        if self.option.debug:
            print(f'Input: {data}')
        q = Query(data, self.db_session)
        if self.option.payment:
            inq = q.get_inquiry()
            row = q.save(IP, CONF_NAME, inq=inq)
        elif self.option.reversal:
            pay = q.get_payment()
            row = q.save(IP, CONF_NAME, pay=pay)
        else:
            row = q.save(IP, CONF_NAME)
        print(f'Sudah disimpan dengan ID {row.id}')


def main(argv=sys.argv[1:]):
    app = App(argv)
    with transaction.manager:
        app.run()