Commit 62037058 by Owo Sugiana

bin/pbb_inquiry bisa rekonsiliasi menggunakan CSV

1 parent 4ea19295
0.2.2 2023-05-08
----------------
- Tambah Kota Banjar bila diarahkan ke Oracle. Kalau ke Postgres cukup pakai
modul default.
- bin/pbb_inquiry ada pilihan --payment-file untuk rekonsiliasi menggunakan CSV
0.2.1 2023-04-14 0.2.1 2023-04-14
---------------- ----------------
- Bug fixed total bayar negatif - Bug fixed total bayar negatif
......
from sqlalchemy import (
Column,
Float,
)
from sqlalchemy.ext.declarative import declarative_base
from .propinsi import PropinsiMixin
from .kelurahan import KelurahanMixin
from .kecamatan import KecamatanMixin
from .objek_pajak import ObjekPajakMixin
from .sppt import SpptMixin
from .pembayaran_sppt import BasePembayaranSpptMixin
Base = declarative_base()
class Propinsi(PropinsiMixin, Base):
__table_args__ = dict(schema='pbb')
class Kelurahan(KelurahanMixin, Base):
__table_args__ = dict(schema='pbb')
class Kecamatan(KecamatanMixin, Base):
__table_args__ = dict(schema='pbb')
class ObjekPajak(ObjekPajakMixin, Base):
__table_args__ = dict(schema='pbb')
class Sppt(SpptMixin, Base):
__table_args__ = dict(schema='pbb')
class PembayaranSppt(BasePembayaranSpptMixin, Base):
__table_args__ = dict(schema='pbb')
jml_sppt_yg_dibayar = Column(Float, nullable=False)
denda_sppt = Column(Float, nullable=False)
import sys import sys
import csv
from datetime import datetime from datetime import datetime
from configparser import ConfigParser from configparser import ConfigParser
from argparse import ArgumentParser from argparse import ArgumentParser
...@@ -40,15 +41,19 @@ def date_from_str(s): ...@@ -40,15 +41,19 @@ def date_from_str(s):
return datetime(int(y), int(m), int(d)) return datetime(int(y), int(m), int(d))
help_tgl = 'butuh --payment'
help_status_bayar = 'Field status_pembayaran_sppt = 1 jika lunas'
help_payment_file = 'File CSV rekonsiliasi'
def get_option(argv): def get_option(argv):
help_tgl = 'butuh --payment'
help_status_bayar = 'Field status_pembayaran_sppt = 1 jika lunas'
pars = ArgumentParser() pars = ArgumentParser()
pars.add_argument('conf') pars.add_argument('conf')
pars.add_argument('--invoice-id') pars.add_argument('--invoice-id')
pars.add_argument('--payment', action='store_true') pars.add_argument('--payment', action='store_true')
pars.add_argument('--tgl-bayar', help=help_tgl) pars.add_argument('--tgl-bayar', help=help_tgl)
pars.add_argument('--reversal', action='store_true') pars.add_argument('--reversal', action='store_true')
pars.add_argument('--payment-file', help=help_payment_file)
pars.add_argument( pars.add_argument(
'--update-status-bayar', action='store_true', help=help_status_bayar) '--update-status-bayar', action='store_true', help=help_status_bayar)
pars.add_argument('--sql-debug', action='store_true') pars.add_argument('--sql-debug', action='store_true')
...@@ -167,6 +172,37 @@ def show_reversal(inq, pay): ...@@ -167,6 +172,37 @@ def show_reversal(inq, pay):
show_fields(row, fields) show_fields(row, fields)
def get_tp(d):
cf = dict()
for key in d:
key_lower = key.lower()
if key_lower.find('kd_') < 0:
continue
cf[key_lower] = d[key]
if registry['module_name'] == 'sukabumi_kota':
tp = dict(
KD_KANWIL_BANK=cf['kd_kanwil_bank'],
KD_KPPBB_BANK=cf['kd_kppbb_bank'],
KD_BANK_TUNGGAL=cf['kd_bank_tunggal'],
KD_BANK_PERSEPSI=cf['kd_bank_persepsi'],
KD_TP=cf['kd_tp'])
else:
tp = dict(kd_tp=cf['kd_tp'])
if cf.get('kd_kantor'):
tp.update(dict(
kd_kanwil=cf['kd_kanwil'],
kd_kantor=cf['kd_kantor']))
if cf.get('kd_kanwil_bank'):
tp.update(dict(
kd_kanwil_bank=cf['kd_kanwil_bank'],
kd_kppbb_bank=cf['kd_kppbb_bank']))
if cf.get('kd_bank_tunggal'):
tp.update(dict(
kd_bank_tunggal=cf['kd_bank_tunggal'],
kd_bank_persepsi=cf['kd_bank_persepsi']))
return tp
ERR_PAYMENT_NOT_FOUND = 'Pembayaran tidak ditemukan, '\ ERR_PAYMENT_NOT_FOUND = 'Pembayaran tidak ditemukan, '\
'tidak ada yang perlu dibatalkan.' 'tidak ada yang perlu dibatalkan.'
...@@ -194,11 +230,30 @@ def main(argv=sys.argv): ...@@ -194,11 +230,30 @@ def main(argv=sys.argv):
sismiop.services.base.DBSession = DBSession = session_factory() sismiop.services.base.DBSession = DBSession = session_factory()
register(sismiop.services.base.DBSession) register(sismiop.services.base.DBSession)
persen_denda = float(cf['persen_denda']) persen_denda = float(cf['persen_denda'])
if option.payment_file:
with open(option.payment_file) as f:
c = csv.DictReader(f)
for r in c:
invoice_id = r['NOP'] + r['TAHUN']
tgl_bayar = datetime.strptime(r['TANGGAL'], '%Y%m%d')
inq = Inquiry(invoice_id, persen_denda, tgl_bayar=tgl_bayar)
ket = None
if inq.invoice:
if inq.is_paid():
ket = 'memang sudah dibayar'
else:
ket = 'tidak ditemukan'
if not ket:
tp = get_tp(r)
pay = inq.do_payment(tp, cf['nip_pencatat'])
ket = 'berhasil dibayar'
print(f'{invoice_id} {ket}')
return
with transaction.manager: with transaction.manager:
inq = Inquiry( inq = Inquiry(
invoice_id, persen_denda, tgl_bayar=tgl_bayar, debug=True) invoice_id, persen_denda, tgl_bayar=tgl_bayar, debug=True)
if not inq.invoice: if not inq.invoice:
print('Invoice ID {} tidak ada.'.format(invoice_id)) print(f'Invoice ID {invoice_id} tidak ada.')
if inq.debug_invoice and tgl_bayar: if inq.debug_invoice and tgl_bayar:
if tgl_bayar.year < int(inq.debug_invoice.thn_pajak_sppt): if tgl_bayar.year < int(inq.debug_invoice.thn_pajak_sppt):
print('Ada tapi tahun pajak lebih besar dari tahun ' print('Ada tapi tahun pajak lebih besar dari tahun '
...@@ -215,27 +270,7 @@ def main(argv=sys.argv): ...@@ -215,27 +270,7 @@ def main(argv=sys.argv):
if not inq.is_available(): if not inq.is_available():
print('Tagihan tidak diperkenankan dibayar melalui jalur ini.') print('Tagihan tidak diperkenankan dibayar melalui jalur ini.')
return return
if cf['module'] == 'sukabumi_kota': tp = get_tp(cf)
tp = dict(
KD_KANWIL_BANK=cf['kd_kanwil_bank'],
KD_KPPBB_BANK=cf['kd_kppbb_bank'],
KD_BANK_TUNGGAL=cf['kd_bank_tunggal'],
KD_BANK_PERSEPSI=cf['kd_bank_persepsi'],
KD_TP=cf['kd_tp'])
else:
tp = dict(kd_tp=cf['kd_tp'])
if cf.get('kd_kantor'):
tp.update(dict(
kd_kanwil=cf['kd_kanwil'],
kd_kantor=cf['kd_kantor']))
if cf.get('kd_kanwil_bank'):
tp.update(dict(
kd_kanwil_bank=cf['kd_kanwil_bank'],
kd_kppbb_bank=cf['kd_kppbb_bank']))
if cf.get('kd_bank_tunggal'):
tp.update(dict(
kd_bank_tunggal=cf['kd_bank_tunggal'],
kd_bank_persepsi=cf['kd_bank_persepsi']))
pay = inq.do_payment(tp, cf['nip_pencatat']) pay = inq.do_payment(tp, cf['nip_pencatat'])
show_payment(inq, pay) show_payment(inq, pay)
if option.reversal: if option.reversal:
......
from datetime import date
from sqlalchemy import func
from ..models.banjar import (
Propinsi,
Kelurahan,
Kecamatan,
ObjekPajak,
Sppt,
PembayaranSppt,
)
from .default import (
Inquiry as BaseInquiry,
Reversal,
AvailableInvoice as BaseAvailableInvoice,
)
from .base import get_db_session
class Inquiry(BaseInquiry):
def get_propinsi_model(self): # Override
return Propinsi
def get_kelurahan_model(self): # Override
return Kelurahan
def get_kecamatan_model(self): # Override
return Kecamatan
def get_op_model(self): # Override
return ObjekPajak
def get_invoice_model(self): # Override
return Sppt
def get_payment_model(self): # Override
return PembayaranSppt
def get_payment_sum(self): # Override
Payment = self.get_payment_model()
DBSession = get_db_session()
return DBSession.query(
func.sum(Payment.jml_sppt_yg_dibayar).
label('jml_sppt_yg_dibayar'),
func.sum(Payment.denda_sppt).
label('denda_sppt'),
func.sum(0).
label('discount'))
def before_save(self, payment): # Override
payment.denda_sppt = 0 # self.denda - self.discount
class AvailableInvoice(BaseAvailableInvoice):
def get_invoice_model(self): # Override
return Sppt
def get_inquiry_class(self): # Override
return Inquiry
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!