pad.py 5.4 KB
import sys
from datetime import (
    date,
    datetime,
    )
from sqlalchemy import func
from sqlalchemy.exc import ProgrammingError
from opensipkd.string import FixLength
from opensipkd.waktu import dmyhms
from iso8583_web.models.meta import Base as BaseConf
from opensipkd.iso8583.bjb.pad.structure import PAYMENT_CODE
from opensipkd.iso8583.bjb.pad.doc import Doc as BjbDoc
from opensipkd.iso8583.bjb.pad.models import Log
from opensipkd.iso8583.multi.doc import Doc as MultiDoc
from ..models import (
    Base,
    Pad,
    )
from .common import (
    get_iso,
    get_channel_info_by_iso,
    get_channel_name_by_row,
    BaseApp,
    init_db as base_init_db,
    one_day,
    BANK_NAMES,
    )


BankHandlers = {
    8: MultiDoc,
    14: MultiDoc,
    110: BjbDoc,
    700: MultiDoc}


class App(BaseApp):
    conf_name = 'pad payment last date'
    report_orm = Pad
    va_product_code = '10'

    def __init__(self, argv):
        super().__init__(argv)
        if not self.pid:
            return
        if self.handler:
            return
        Usaha = self.models.Usaha
        Pajak = self.models.Pajak
        Customer = self.models.Customer
        CustomerUsaha = self.models.CustomerUsaha
        Invoice = self.models.Invoice
        Payment = self.models.Payment
        self.base_q_pay = self.prod_session.query(Payment)
        self.base_q_inv = self.prod_session.query(
                Invoice, Pajak, Customer, Usaha)
        self.base_q_inv = self.base_q_inv.filter(
                Invoice.pajak_id == Pajak.id,
                Invoice.customer_usaha_id == CustomerUsaha.id,
                CustomerUsaha.customer_id == Customer.id,
                Usaha.id == Pajak.usaha_id,)
        self.base_q_log = self.prod_session.query(Log).filter_by(
                mti='0210', bit_003=PAYMENT_CODE, bit_039='00')
        try:
            self.base_q_log.first()
        except ProgrammingError:
            self.prod_session.rollback()
            self.base_q_log = None

    def get_pay_date(self):  # Override
        return self.last_pay.sspdtgl.date()

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

    def get_filter_query(self, q):
        Payment = self.models.Payment
        return q.filter(
            Payment.sspdtgl >= self.tgl_awal,
            Payment.sspdtgl < 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
        Payment = self.models.Payment
        q = self.prod_session.query(Payment)
        q = self.get_filter_query(q)
        return q.order_by(Payment.sspdtgl)

    def get_iso_v1(self, pay):
        IsoPayment = self.models.IsoPayment
        q = self.prod_session.query(IsoPayment).filter_by(id=pay.id)
        row = q.first()
        if not row:
            return
        if row.iso_request[0] == '{':
            channel = BANK_NAMES[str(row.bank_id)]
            return '0000', channel, None, None, row.bank_id
        Doc = BankHandlers[row.bank_id]
        iso = get_iso(row.iso_request, Doc, self.option.debug)
        info = get_channel_info_by_iso(iso)
        return info.get('bit_018', '0000'), info['channel'], iso.get_stan(), \
            iso.get_ntb(), row.bank_id

    def get_iso_v2(self):
        if not self.base_q_log:
            return
        q = self.base_q_log.filter(func.trim(Log.bit_061) == self.invoice_id)
        q = q.order_by(Log.id.desc())
        row = q.first()
        if not row:
            return
        channel_id = row.bit_018.strip()
        channel_nama = get_channel_name_by_row(row)
        bank_id = row.bit_032
        if bank_id:
            bank_id = int(bank_id)
        return channel_id, channel_nama, row.bit_011, row.bit_048.strip(), \
            bank_id

    def create_data(self, pay):  # Override
        Invoice = self.models.Invoice
        q_inv = self.base_q_inv.filter(Invoice.id == pay.spt_id)
        inv, pajak, cust, usaha = q_inv.first()
        invoice_id = FixLength(self.service.INVOICE_ID)
        invoice_id['Tahun'] = inv.tahun
        invoice_id['SptNo'] = inv.sptno
        try:
            invoice_id['Prefix'] = getattr(self.service, 'PREFIX')
        except AttributeError:
            pass
        self.invoice_id = invoice_id.get_raw()
        source = self.get_iso_v2()
        if source:
            channel_id, channel_name, stan, ntb, bank_id = source
        else:
            source = self.get_iso_v1(pay)
            if source:
                channel_id, channel_name, stan, ntb, bank_id = source
            else:
                stan = ntb = bank_id = None
                channel_id = '0000'
                tgl = pay.sspdtgl.date()
                channel_name = self.get_va_channel(tgl) or 'MANUAL'
        return dict(
            id=pay.id, stan=stan, ntb=ntb, tgl=pay.sspdtgl.date(),
            jam=pay.sspdtgl.time(), nomor_bayar=invoice_id.get_raw(),
            jenis_pajak=usaha.usahanm.strip(), masa_pajak=inv.masadari,
            npwpd=cust.npwpd, nama_wp=cust.customernm.strip(),
            pokok=pay.jml_bayar-pay.denda, denda=pay.denda, bunga=pay.bunga,
            jml_bayar=pay.jml_bayar, channel_id=channel_id,
            channel_name=channel_name, bank_id=bank_id)


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)