webr.py 4.37 KB
import sys
from datetime import (
    date,
    datetime,
    )
from sqlalchemy import func
from sqlalchemy.exc import ProgrammingError
import transaction
from opensipkd.waktu import dmyhms
from opensipkd.webr.models.default import (
    Payment,
    Invoice,
    )
from iso8583_web.models.meta import Base as BaseConf
from opensipkd.iso8583.bjb.webr.structure import PAYMENT_CODE
from opensipkd.iso8583.bjb.webr.models import (
    LogMixin,
    Log,
    )
from ..models import (
    Base,
    Webr,
    )
from .common import (
    BaseApp,
    init_db as base_init_db,
    BIT_18_NAMES,
    get_channel_name_by_row,
    one_day,
    )


class AlternativeLog(Base, LogMixin):
    __table_args__ = dict(schema='webr')


class App(BaseApp):
    conf_name = 'webr payment last date'
    report_orm = Webr
    product_code = '30'

    def __init__(self, argv):
        super().__init__(argv)
        if not self.pid:
            return
        self.base_q_pay = self.prod_session.query(Payment)
        try:
            self.base_q_pay.first()
            self.base_q_inv = self.prod_session.query(Invoice)
        except ProgrammingError:
            self.prod_session.rollback()
            self.base_q_pay = None
        self.base_q_iso = self.prod_session.query(Log)
        try:
            self.base_q_iso.first()
            self.IsoLog = Log
        except ProgrammingError:
            self.prod_session.rollback()
            self.base_q_iso = self.prod_session.query(AlternativeLog)
            self.IsoLog = AlternativeLog
        self.base_q_iso = self.base_q_iso.filter_by(
                mti='0210', bit_003=PAYMENT_CODE, bit_039='00')

    def get_iso(self, inv):
        q = self.base_q_iso.filter(func.trim(self.IsoLog.bit_061) == inv.kode)
        return q.first()

    def create_data(self, pay):  # Override
        if self.base_q_pay:
            return self.create_data_from_prod(pay)
        return self.create_data_from_h2h(pay)

    def create_data_from_prod(self, pay):
        q = self.base_q_inv.filter_by(id=pay.ar_invoice_id)
        inv = q.first()
        self.invoice_id = inv.kode
        iso = self.get_iso(pay)
        if iso:
            channel_id = iso.bit_018.strip()
            channel_name = get_channel_name_by_row(iso)
        elif pay.bank_id:
            channel_id = str(pay.channel_id)
            channel_name = BIT_18_NAMES[channel_id]
        else:
            channel_id = '0000'
            channel_name = self.get_va_channel(pay.created.date()) or 'MANUAL'
        stan = iso and iso.bit_011 or None
        ntb = pay.ntb and pay.ntb.strip() or None
        return dict(
                id=pay.id, stan=stan, ntb=ntb, tgl=pay.created.date(),
                jam=pay.created.time(), nomor_bayar=self.invoice_id,
                nama_wp=inv.subjek_nama, pokok=inv.jumlah-inv.bunga,
                denda=pay.bunga, jml_bayar=pay.bayar, channel_id=channel_id,
                channel_name=channel_name, status=pay.status)

    def create_data_from_h2h(self, row):
        self.invoice_id = row.bit_061.strip()
        channel_name = get_channel_name_by_row(row)
        return dict(
                id=row.id, stan=row.bit_011, ntb=row.bit_048,
                tgl=row.created.date(), jam=row.created.time(),
                nomor_bayar=self.invoice_id,
                nama_wp=row.bit_062_data['Nama Penyetor'],
                pokok=row.bit_062_data['Tagihan'],
                denda=row.bit_062_data['Denda'], jml_bayar=int(row.bit_004),
                channel_id=row.bit_018, channel_name=channel_name)

    def get_last_time(self):  # Override
        return dmyhms(self.last_pay.created)

    def get_filter_query(self, q):
        orm = self.base_q_pay and Payment or self.IsoLog
        return q.filter(
                orm.created >= self.tgl_awal,
                orm.created < self.tgl_akhir + one_day)

    def get_count(self):  # Override
        q = self.prod_session.query(func.count())
        q = self.get_filter_query(q)
        return q.scalar()

    def get_payment_query(self):  # Override
        if self.base_q_pay:
            q = self.base_q_pay
            orm = Payment
        else:
            q = self.base_q_iso
            orm = self.IsoLog
        q = self.get_filter_query(q)
        return q.order_by(orm.created)


def main(argv=sys.argv[1:]):
    app = App(argv)
    if app.pid:
        app.run()


def init_db(argv=sys.argv[1:]):
    base_init_db(Base.metadata, BaseConf.metadata, argv)