default.py 5.39 KB
from sqlalchemy import func
from sqlalchemy.exc import ProgrammingError
import transaction
from opensipkd.waktu import dmyhms, as_timezone
from opensipkd.webr.models.default import (
    Payment,
    Invoice,
    )
from opensipkd.iso8583.bjb.webr.structure import PAYMENT_CODE
from opensipkd.iso8583.bjb.webr.models import (
    LogMixin,
    Log,
    )
from ..models import (
    Base,
    SyncWebr,
    Webr,
    )
from ..common import (
    BaseApp,
    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)
        self.base_q_sync = self.prod_session.query(SyncWebr)
        try:
            self.base_q_sync.first()
        except ProgrammingError:
            self.prod_session.rollback()
            self.base_q_sync = None
        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')
        self.ntb_qris = self.conf.get('ntb_qris')
        self.ntb_va = self.conf.get('ntb_va')

    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_sync:
            return self.create_data_from_sync(pay)
        if self.base_q_pay:
            return self.create_data_from_prod(pay)
        return self.create_data_from_h2h(pay)

    def create_data_from_sync(self, sync):
        q = self.base_q_pay.filter_by(id=sync.payment_id)
        pay = q.first()
        if pay:
            return self.create_data_from_prod(pay)
        return dict(id=pay.id, pokok=0, denda=0, jml_bayar=0)

    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 = '0001'
            if self.ntb_qris and \
                    pay.ntb == \
                    self.ntb_qris:
                channel_name = 'QRIS'
            else:
                channel_id = '0002'
                if self.ntb_va and \
                        pay.ntb == \
                        self.ntb_va:
                    channel_name = 'VA'
                else:
                    channel_id = '0000'
                    tgl = pay.tgl_bayar.date()
                    channel_name = self.get_va_channel(tgl) 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.tgl_bayar.date(),
                jam=pay.tgl_bayar.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,
                produk=inv.produk_nama, departemen_kode=inv.departemen_kode,
                departemen_nama=inv.departemen_nama)

    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(as_timezone(self.last_pay.created))

    def get_filter_query(self, q):
        if self.base_q_sync:
            orm = SyncWebr
            f = orm.tgl_bayar
        else:
            orm = self.IsoLog
            f = orm.created
        return q.filter(
                f >= self.tgl_awal,
                f < 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_sync:
            q = self.base_q_sync
            orm = SyncWebr
            f = orm.tgl_bayar
        else:
            q = self.base_q_iso
            orm = self.IsoLog
            f = orm.created
        q = self.get_filter_query(q)
        return q.order_by(f)