pad.py 3.45 KB
import sys
from datetime import timedelta
import transaction
from opensipkd.waktu import dmyhms
from opensipkd.pad.models.default import (
    IsoPayment,
    IsoReversal,
    Payment,
    Invoice,
    Pajak,
    CustomerUsaha,
    Customer,
    )
from opensipkd.pad.services.base import get_db_session
from iso8583_web.models.meta import Base as BaseConf
from opensipkd.iso8583.bjb.pad import Doc
from ..models import (
    Base,
    Pad,
    )
from .common import (
    get_iso,
    get_keys,
    App as BaseApp,
    init_db as base_init_db,
    )


ERR_NOT_FOUND = 'Tgl {tgl_bayar} pad.pad_sspd.spt_id {invoice_id} tidak ada'


class App(BaseApp):
    iso_class = Doc
    report_orm = Pad
    iso_reversal_orm = IsoReversal

    def __init__(self, argv):
        super().__init__(argv)
        if not self.pid:
            return
        self.base_q_pay = self.prod_session.query(Payment)
        self.base_q_inv = self.prod_session.query(Invoice, Pajak, Customer)
        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)

    def get_db_session(self):  # Override
        return get_db_session()

    def get_pay(self, row):
        tgl_bayar = row.tgl.date()
        q_pay = self.base_q_pay.filter_by(spt_id=row.invoice_id).filter(
                Payment.create_date >= tgl_bayar,
                Payment.create_date < tgl_bayar + timedelta(1))
        q_pay = q_pay.order_by(Payment.id.desc())
        return q_pay.first()

    def run_payment(self):
        last = self.get_last_id('pad payment last id')
        q_iso = self.prod_session.query(IsoPayment).filter(
                IsoPayment.id > last.as_int())
        for row in q_iso.order_by(IsoPayment.id):
            iso = get_iso(row.iso_request, Doc, self.option.debug)
            if self.get_report(iso):
                continue
            pay = self.get_pay(row)
            tgl_bayar = row.tgl.date()
            if not pay:
                msg = ERR_NOT_FOUND.format(
                        tgl_bayar=tgl_bayar, invoice_id=row.invoice_id)
                self.log.error(msg)
                continue
            q_inv = self.base_q_inv.filter(Invoice.id == pay.spt_id)
            inv, pajak, cust = q_inv.first()
            d = get_keys(iso)
            s_tgl = dmyhms(row.tgl)
            self.log.info(
                f'Tgl bayar {s_tgl}, Nomor bayar {d["nomor_bayar"]}, '
                f'STAN {d["stan"]}, NTB {d["ntb"]}, Channel {d["channel"]}')
            rpt = Pad(
                    stan=d['stan'], ntb=d['ntb'], tgl=tgl_bayar,
                    jam=row.tgl.time(), sspd_id=pay.id,
                    nomor_bayar=iso.get_invoice_id().strip(),
                    masa_pajak=pajak.masapajak, npwpd=cust.npwpd,
                    nama_wp=cust.customernm, pokok=pay.jml_bayar-pay.denda,
                    denda=pay.denda, jml_bayar=pay.jml_bayar,
                    channel_id=iso.get_channel().strip(),
                    channel_name=d['channel'])
            last.nilai = str(row.id)
            with transaction.manager:
                self.rpt_session.add(rpt)
                self.rpt_session.add(last)

    def run_reversal(self):  # Override
        super().run_reversal('pad reversal last date')


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)