only_va.py 3.58 KB
from datetime import datetime
from sqlalchemy import func
from opensipkd.string import FixLength
from opensipkd.waktu import dmyhms
from sismiop.services.base import INVOICE_ID
from ..models import Pbb
from ..common import (
    BaseApp,
    one_day,
    VaInvoice,
    VaPayment,
    )


class App(BaseApp):
    conf_name = 'pbb va payment last date'
    report_orm = Pbb
    va_product_code = '02'

    def filter_query(self, q):
        tgl_awal = self.tgl_awal.strftime('%Y-%m-%d %H:%M:%S')
        tgl_akhir = self.tgl_akhir + one_day
        tgl_akhir = tgl_akhir.strftime('%Y-%m-%d %H:%M:%S')
        return q.filter(
                VaPayment.va_invoice_id == VaInvoice.id,
                VaInvoice.product_code == self.va_product_code,
                VaPayment.transaction_date >= tgl_awal,
                VaPayment.transaction_date < tgl_akhir)

    def get_payment_query(self):  # Override
        q = self.va_session.query(
                VaInvoice.invoice_no,
                VaInvoice.va_type,
                VaPayment.id,
                VaPayment.rrn,
                VaInvoice.customer_name,
                VaPayment.transaction_date,
                VaPayment.transaction_amount,
                VaInvoice.fine,
                VaInvoice.discount)
        q = self.filter_query(q)
        return q.order_by(VaPayment.id)

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

    def create_data(self, pay):  # Override
        self.invoice_id = pay.invoice_no
        if pay.va_type == 'a':
            channel_nama = 'VA'
        elif pay.va_type == 'q':
            channel_nama = 'QRIS'
        else:
            raise Exception(
                    f'Invoice ID {self.invoice_id} va_type {pay.va_type} '
                    'belum dipahami, perbaiki script')
        inv_id = FixLength(INVOICE_ID)
        inv_id.set_raw(pay.invoice_no)
        tgl = datetime.strptime(pay.transaction_date, '%Y-%m-%d %H:%M:%S')
        rpt_id = - pay.id
        denda = pay.fine or 0
        diskon = pay.discount or 0
        diskon_denda = denda-diskon
        bayar = pay.transaction_amount or 0
        pokok = bayar-diskon_denda
        return dict(
            id=rpt_id,
            kd_propinsi=inv_id['Propinsi'], kd_dati2=inv_id['Kabupaten'],
            kd_kecamatan=inv_id['Kecamatan'], kd_kelurahan=inv_id['Kelurahan'],
            kd_blok=inv_id['Blok'], no_urut=inv_id['Urut'],
            kd_jns_op=inv_id['Jenis'], thn_pajak_sppt=inv_id['Tahun'],
            pembayaran_sppt_ke=1, ntb=pay.rrn,
            jml_sppt_yg_dibayar=bayar, denda_sppt=diskon_denda,
            discount=diskon, tgl_pembayaran_sppt=tgl.date(),
            tgl_rekam_byr_sppt=tgl,
            nm_wp_sppt=pay.customer_name, channel_kode='0000',
            channel_nama=channel_nama, bank_id='110',
            pbb_yg_harus_dibayar_sppt=pokok)

    def get_report(self, pay):  # Override
        inv_id = FixLength(INVOICE_ID)
        inv_id.set_raw(pay.invoice_no)
        q = self.rpt_session.query(Pbb).filter_by(
                kd_propinsi=inv_id['Propinsi'], kd_dati2=inv_id['Kabupaten'],
                kd_kecamatan=inv_id['Kecamatan'],
                kd_kelurahan=inv_id['Kelurahan'],
                kd_blok=inv_id['Blok'], no_urut=inv_id['Urut'],
                kd_jns_op=inv_id['Jenis'], thn_pajak_sppt=inv_id['Tahun'],
                pembayaran_sppt_ke=1)
        return q.first()

    def get_last_time(self):  # Override
        tgl = datetime.strptime(
                self.last_pay.transaction_date, '%Y-%m-%d %H:%M:%S')
        return dmyhms(tgl)