available_invoice.py 2 KB
from sqlalchemy.orm import sessionmaker
from .db_tools import sppt2nop
from .query import (
    CalculateInvoice,
)


class AvailableInvoice:
    def __init__(self, models, query, **kwargs):
        self.models = models
        self.query = query
        self.persen_denda = 'persen_denda' in kwargs and \
            kwargs['persen_denda'] or 0

    def add_option(self, pars):
        pars.add_option('', '--min', type='int', help='Tagihan minimum')
        pars.add_option('', '--max', type='int', help='Tagihan maksimum')
        pars.add_option('-t', '--tahun', help='Tahun pajak')

    def show(self, option):
        engine = self.models.Base.metadata.bind
        session_factory = sessionmaker(bind=engine)
        DBSession = session_factory()
        Invoice = self.models.Invoice
        q = DBSession.query(Invoice).filter_by(status_pembayaran_sppt='0')
        if option.min:
            q = q.filter(Invoice.pbb_yg_harus_dibayar_sppt >= option.min)
        if option.max:
            q = q.filter(Invoice.pbb_yg_harus_dibayar_sppt <= option.max)
        if option.tahun:
            q = q.filter(Invoice.thn_pajak_sppt == option.tahun)
        offset = -1
        count = 0
        while True:
            if count >= option.sample_count:
                break
            offset += 1
            row = q.offset(offset).first()
            if not row:
                break
            calc = CalculateInvoice(
                    self.models, DBSession, self.persen_denda, row.kd_propinsi,
                    row.kd_dati2, row.kd_kecamatan, row.kd_kelurahan,
                    row.kd_blok, row.no_urut, row.kd_jns_op,
                    row.thn_pajak_sppt)
            if calc.total < 1:
                continue
            count += 1
            invoice_id_raw = sppt2nop(calc.invoice) + \
                calc.invoice.thn_pajak_sppt
            msg = '#{no}/{count} {id} Rp {total}'.format(
                    no=count, id=invoice_id_raw, total=calc.total,
                    count=option.sample_count)
            print(msg)