Commit 83b3511c by Owo Sugiana

Penambahan Kota Binjai

1 parent 4512f610
0.3.2 2021-02-08
----------------
- Tambah Kota Binjai
- Tambah Kota Bekasi
0.3.1 2020-11-18
----------------
- Tambah Kota Banjar
......
from sqlalchemy import (
Column,
Integer,
DateTime,
String,
Date,
ForeignKey,
)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Payment(Base):
__tablename__ = 'bphtb_payment'
id = Column(Integer, primary_key=True)
tgl = Column(DateTime(timezone=True), nullable=False)
iso_request = Column(String(1024), nullable=False)
transmission = Column(DateTime(timezone=True), nullable=False)
settlement = Column(Date, nullable=False)
stan = Column(Integer, nullable=False)
invoice_no = Column(String(32), nullable=False)
pembayaran_ke = Column(Integer, nullable=False)
ntb = Column(String(32), nullable=False)
ntp = Column(String(32), nullable=False, unique=True)
bank_id = Column(Integer, nullable=False)
channel_id = Column(Integer, nullable=False)
bank_ip = Column(String(15), nullable=False)
class Reversal(Base):
__tablename__ = 'bphtb_reversal'
id = Column(Integer, ForeignKey(Payment.id), primary_key=True)
tgl = Column(DateTime(timezone=True), nullable=False)
iso_request = Column(String(1024), nullable=False)
from sqlalchemy import (
Column,
Integer,
String,
DateTime,
Float,
Date,
ForeignKey,
)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Notaris(Base):
__tablename__ = 'notaris'
kode = Column(String(4), primary_key=True)
alamat = Column(String(200), nullable=False)
kontak_person = Column(String(100), nullable=False)
kota = Column(String(100), nullable=False)
nama = Column(String(100), nullable=False)
password = Column(String(100), nullable=False)
telepon = Column(String(25), nullable=False)
class Perolehan(Base):
__tablename__ = 'perolehan'
kode = Column(String(4), primary_key=True)
keterangan = Column(String(100), nullable=False)
nilai_pajak = Column(Float)
ntkp = Column(Float)
# Surat Setoran Pajak Daerah
class Sspd(Base):
__tablename__ = 'sspd'
id = Column(Integer, primary_key=True)
alamat_op = Column(String(200), nullable=False)
alamat_pemberi = Column(String(200), nullable=False)
alamat_penerima = Column(String(200), nullable=False)
catatan = Column(String(300))
date_update = Column(DateTime, nullable=False)
kecamatan_op = Column(String(100), nullable=False)
kecamatan_pemberi = Column(String(100), nullable=False)
kecamatan_penerima = Column(String(100), nullable=False)
kelurahan_op = Column(String(100), nullable=False)
kelurahan_pemberi = Column(String(100), nullable=False)
kelurahan_penerima = Column(String(100), nullable=False)
kode_bayar = Column(Integer)
kota_pemberi = Column(String(100), nullable=False)
kota_penerima = Column(String(100), nullable=False)
ktp_pemberi = Column(String(30), nullable=False)
ktp_penerima = Column(String(30), nullable=False)
luas_bangunan = Column(Float)
luas_bumi = Column(Float)
nama_pemberi = Column(String(100), nullable=False)
nama_penerima = Column(String(100), nullable=False)
nilai_pajak = Column(Float)
njop_bangunan_m2 = Column(Float)
njop_bumi_m2 = Column(Float)
no_sspd = Column(String(15), nullable=False)
nop = Column(String(20), nullable=False)
npop = Column(Float)
npopkp = Column(Float)
npoptkp = Column(Float)
npwp_pemberi = Column(String(30), nullable=False)
npwp_penerima = Column(String(30), nullable=False)
shm = Column(String(15), nullable=False)
status_bayar = Column(Integer)
tanggal_sspd = Column(Date)
telepon_pemberi = Column(String(30), nullable=False)
telepon_penerima = Column(String(30), nullable=False)
total_bphtb = Column(Float)
user_update = Column(String(15), nullable=False)
notaris = Column(String(4), ForeignKey(Notaris.kode), nullable=False)
perolehan = Column(String(4), ForeignKey(Perolehan.kode), nullable=False)
pengurangan = Column(Float)
peraturan = Column(String(300))
class KodeBayarSspd(Base):
__tablename__ = 'kode_bayar_sspd'
id = Column(Integer, primary_key=True)
date_update = Column(DateTime, nullable=False)
kode = Column(String(21), nullable=False)
tempat_bayar = Column(String(50), nullable=False)
user_update = Column(String(15), nullable=False)
sspd = Column(Integer, ForeignKey(Sspd.id), nullable=False)
class PembayaranSspd(Base):
__tablename__ = 'pembayaran_sspd'
id = Column(Integer, primary_key=True)
jumlah_bayar = Column(Float)
tanggal_bayar = Column(Date, nullable=False)
user_bayar = Column(String(15), nullable=False)
sspd = Column(Integer, ForeignKey(Sspd.id), nullable=False)
kirim_bpn = Column(Integer)
kode_bayar = Column(String(21), nullable=False)
# Surat Ketetapan Pajak Daerah Kurang Bayar
class Skpdkb(Base):
__tablename__ = 'skpdkb'
id = Column(Integer, primary_key=True)
date_update = Column(DateTime, nullable=False)
kode_bayar = Column(Integer)
nilai_pajak = Column(Float)
no_skpdkb = Column(String(15), nullable=False)
npop = Column(Float)
npop_verifikasi = Column(Float)
npopkp = Column(Float)
npopkp_verifikasi = Column(Float)
npoptkp = Column(Float)
status_bayar = Column(Integer)
tanggal_skpdkb = Column(Date)
total_bphtb = Column(Float)
total_bphtb_verifikasi = Column(Float)
total_skpdkb = Column(Float)
user_update = Column(String(15), nullable=False)
sspd = Column(Integer, ForeignKey(Sspd.id), nullable=False)
class KodeBayarSkpdkb(Base):
__tablename__ = 'kode_bayar_skpdkb'
id = Column(Integer, primary_key=True)
date_update = Column(DateTime, nullable=False)
kode = Column(String(21), nullable=False)
tempat_bayar = Column(String(50), nullable=False)
user_update = Column(String(15), nullable=False)
skpdkb = Column(Integer, ForeignKey(Skpdkb.id), nullable=False)
class PembayaranSkpdkb(Base):
__tablename__ = 'pembayaran_skpdkb'
id = Column(Integer, primary_key=True)
jumlah_bayar = Column(Float)
tanggal_bayar = Column(Date, nullable=False)
user_bayar = Column(String(15), nullable=False)
skpdkb = Column(Integer, ForeignKey(Skpdkb.id), nullable=False)
kode_bayar = Column(String(21), nullable=False)
......@@ -3,12 +3,16 @@ from argparse import ArgumentParser
from .common import init
help_skpdkb = 'Tampilkan kode bayar SKPDKB'
def get_option(argv):
default_count = 10
help_count = 'default {}'.format(default_count)
pars = ArgumentParser()
pars.add_argument('conf')
pars.add_argument('--tahun', type=int)
pars.add_argument('--skpdkb', action='store_true', help=help_skpdkb)
pars.add_argument('--belum-jatuh-tempo', action='store_true')
pars.add_argument('--lewat-jatuh-tempo', action='store_true')
pars.add_argument(
......
......@@ -14,6 +14,23 @@ def show_rp(label, value):
show_val(label, 'Rp {}'.format(thousand(value)))
def show_field(t, fieldname):
label = 'Field ' + fieldname
try:
value = getattr(t, fieldname)
except AttributeError:
return
if isinstance(value, float):
show_rp(label, value)
else:
show_val(label, value)
def show_fields(row, fieldnames):
for fieldname in fieldnames:
show_field(row, fieldname)
def get_option(argv):
pars = ArgumentParser()
pars.add_argument('conf', help='File konfigurasi')
......@@ -23,7 +40,17 @@ def get_option(argv):
return pars.parse_args(argv)
def show(inq):
def show_payment(inq):
pay = inq.get_payment()
if not pay:
return
# Binjai
show_fields(
pay, ['id', 'jumlah_bayar', 'tanggal_bayar', 'user_bayar',
'kirim_bpn'])
def show_inquiry(inq):
show_val('Invoice ID', inq.invoice_id)
show_val('Luas Tanah', inq.get_luas_tanah())
show_val('Luas Bangunan', inq.get_luas_bangunan())
......@@ -51,6 +78,7 @@ def show(inq):
show_val('Kota Wajib Pajak', inq.get_kota_wp())
show_val('Tahun Pajak', inq.get_tahun())
show_val('Is Available', inq.is_available())
show_payment(inq)
def show_pkey_values(row):
......@@ -75,7 +103,7 @@ def main(argv=sys.argv):
invoice_id, conf.getfloat('main', 'persen_denda'))
if not inq.invoice:
error(f'Invoice ID {invoice_id} tidak ada.')
show(inq)
show_inquiry(inq)
if option.payment:
if not inq.total:
error('Tidak ada tagihan, tidak ada yang perlu dibayar.')
......
from datetime import date
from sqlalchemy import func
from opensipkd.string import FixLength
from opensipkd.string.money import thousand
from opensipkd.hitung import round_up
from .base import get_db_session
from .default import AvailableInvoice as BaseAvailableInvoice
from .default.structure import INVOICE_ID
from ..models.binjai import (
Notaris,
KodeBayarSspd,
Sspd,
PembayaranSspd,
KodeBayarSkpdkb,
Skpdkb,
PembayaranSkpdkb,
)
class CommonJenis:
def __init__(self, invoice_id):
self.invoice_id = invoice_id
self.invoice = self.profile = self.get_invoice()
class InquirySspd(CommonJenis):
def get_invoice(self):
db_session = get_db_session()
q = db_session.query(KodeBayarSspd).filter_by(kode=self.invoice_id)
kb = q.first()
if kb:
q = db_session.query(Sspd).filter_by(id=kb.sspd)
return q.first()
def get_total(self):
return round_up(self.invoice.total_bphtb)
def get_tahun(self):
return self.invoice.tanggal_sspd.year
def get_payment(self):
db_session = get_db_session()
q = db_session.query(PembayaranSspd).filter_by(sspd=self.invoice.id)
q = q.order_by(PembayaranSspd.id.desc())
return q.first()
def get_payment_amount(self):
db_session = get_db_session()
q = db_session.query(
func.sum(PembayaranSspd.jumlah_bayar).label('jml'))
q = q.filter_by(sspd=self.invoice.id)
row = q.first()
return row.jml or 0
def do_payment(self, tgl_bayar, user):
total = self.get_total()
pay = PembayaranSspd(
jumlah_bayar=total, tanggal_bayar=tgl_bayar,
user_bayar=user, sspd=self.invoice.id,
kode_bayar=self.invoice_id, kirim_bpn=0)
self.invoice.status_bayar = 1
db_session = get_db_session()
db_session.add(pay)
db_session.add(self.invoice)
return pay
class InquirySkpdkb(CommonJenis):
def __init__(self, invoice_id):
super().__init__(invoice_id)
db_session = get_db_session()
q = db_session.query(Sspd).filter_by(id=self.invoice.sspd)
self.profile = q.first()
def get_invoice(self):
db_session = get_db_session()
q = db_session.query(KodeBayarSkpdkb).filter_by(kode=self.invoice_id)
kb = q.first()
if not kb:
return
q = db_session.query(Skpdkb).filter_by(id=kb.skpdkb)
return q.first()
def get_total(self):
return round_up(self.invoice.total_skpdkb)
def get_tahun(self):
return self.invoice.tanggal_skpdkb.year
def get_notaris(self):
db_session = get_db_session()
q = db_session.query(Notaris).filter(
Notaris.kode == Sspd.notaris,
Sspd.id == self.profile.id)
return q.first()
def get_payment(self):
db_session = get_db_session()
q = db_session.query(PembayaranSkpdkb).filter_by(
skpdkb=self.invoice.id)
q = q.order_by(PembayaranSkpdkb.id.desc())
return q.first()
def get_payment_amount(self):
db_session = get_db_session()
q = db_session.query(
func.sum(PembayaranSkpdkb.jumlah_bayar).label('jml'))
q = q.filter_by(skpdkb=self.invoice.id)
row = q.first()
return row.jml or 0
def do_payment(self, tgl_bayar, user):
total = self.get_total()
pay = PembayaranSkpdkb(
jumlah_bayar=total, tanggal_bayar=tgl_bayar,
user_bayar=user, skpdkb=self.invoice.id,
kode_bayar=self.invoice_id)
self.invoice.status_bayar = 1
db_session = get_db_session()
db_session.add(pay)
db_session.add(self.invoice)
return pay
INQUIRY_CLASS = {
'01': InquirySspd,
'02': InquirySkpdkb}
class Common:
def __init__(self, invoice_id):
self.invoice_id = invoice_id
self.invoice_struct = FixLength(INVOICE_ID)
self.invoice_struct.set_raw(invoice_id)
self.jenis = self.invoice_struct['Kode']
cls = INQUIRY_CLASS[self.jenis]
self.inq = cls(invoice_id)
self.invoice = self.inq.invoice
def is_available(self):
return self.invoice.status_bayar == 0
class Inquiry(Common):
def __init__(self, invoice_id, persen_denda=2, tgl_bayar=None):
super().__init__(invoice_id)
if not self.invoice:
return
self.persen_denda = persen_denda
if tgl_bayar:
self.tgl_bayar = tgl_bayar
else:
self.tgl_bayar = date.today()
self.hitung()
self.profile = self.inq.profile
self.notaris = self.get_notaris()
def get_notaris(self):
db_session = get_db_session()
q = db_session.query(Notaris).filter_by(kode=self.profile.notaris)
return q.first()
def get_nop(self):
return self.profile.nop
def get_luas_tanah(self):
return int(self.profile.luas_bumi)
def get_luas_bangunan(self):
return int(self.profile.luas_bangunan)
def get_npop(self):
return int(self.invoice.npop)
def get_jenis_perolehan_hak(self):
return self.profile.perolehan
def get_nama_notaris(self):
if self.notaris:
return self.notaris.nama
def get_nama(self):
return self.profile.nama_penerima
def get_npwp(self):
return self.profile.npwp_penerima
def get_alamat_wp(self):
return self.profile.alamat_penerima
def get_alamat_op(self):
return self.profile.alamat_op
def get_kota_wp(self):
return self.profile.kota_penerima
def get_kota_op(self):
return 'Binjai'
def get_kelurahan_wp(self):
return self.profile.kelurahan_penerima
def get_kecamatan_wp(self):
return self.profile.kecamatan_penerima
def get_rt_wp(self):
pass
def get_rw_wp(self):
pass
def get_kode_pos_wp(self):
pass
def get_kelurahan_op(self):
return self.profile.kelurahan_op
def get_kecamatan_op(self):
return self.profile.kecamatan_op
def get_tahun(self):
return self.inq.get_tahun()
def get_payment(self):
return self.inq.get_payment()
def get_payment_amount(self):
return self.inq.get_payment_amount()
def hitung(self):
self.total_bayar = self.get_payment_amount()
self.denda = self.bln_tunggakan = self.discount = 0
self.tagihan = self.inq.get_total()
self.total = self.tagihan - self.total_bayar
if self.total <= 0:
self.total = 0
def do_payment(self, user):
return self.inq.do_payment(self.tgl_bayar, user)
class Reversal(Common):
def __init__(self, invoice_id):
super().__init__(invoice_id)
self.payment = None
if not self.invoice:
return
if not self.is_available():
self.payment = self.get_payment()
def get_payment(self):
return self.inq.get_payment()
def do_reversal(self):
self.payment.jumlah_bayar = self.invoice.status_bayar = 0
db_session = get_db_session()
db_session.add(self.payment)
db_session.add(self.invoice)
class AvailableInvoice(BaseAvailableInvoice):
def get_query(self): # Override
db_session = get_db_session()
func = self.option.skpdkb and self.get_query_skpdkb or \
self.get_query_sspd
return func()
def get_query_sspd(self):
db_session = get_db_session()
q = db_session.query(KodeBayarSspd).filter(
KodeBayarSspd.sspd == Sspd.id, Sspd.status_bayar == 0)
if self.option.tahun:
awal, akhir = self.get_period()
q = q.filter(Sspd.tanggal_sspd >= awal, Sspd.tanggal_sspd <= akhir)
return q.order_by(Sspd.tanggal_sspd.desc(), Sspd.total_bphtb, Sspd.id)
def get_query_skpdkb(self):
db_session = get_db_session()
q = db_session.query(KodeBayarSkpdkb).filter(
KodeBayarSkpdkb.skpdkb == Skpdkb.id, Skpdkb.status_bayar == 0)
if self.option.tahun:
awal, akhir = self.get_period()
q = q.filter(
Skpdkb.tanggal_skpdkb >= awal,
Skpdkb.tanggal_skpdkb <= akhir)
return q.order_by(
Skpdkb.tanggal_skpdkb.desc(), Skpdkb.total_skpdkb, Skpdkb.id)
def get_period(self):
return date(self.option.tahun, 1, 1), date(self.option.tahun, 12, 31)
def get_message(self, row): # Override
inq = Inquiry(row.kode, self.persen_denda)
if not inq.total:
return
msg = '{} {} {} {}'.format(
inq.invoice_id, inq.get_tahun(), inq.get_nop(),
inq.get_nama())
if inq.total_bayar:
msg = '{} Rp {} - Rp {} = Rp {}'.format(
msg, thousand(inq.tagihan), thousand(inq.total_bayar),
thousand(inq.total))
else:
msg = '{} Rp {}'.format(msg, thousand(inq.total))
return msg
......@@ -163,6 +163,12 @@ class Inquiry:
def get_tahun(self):
return self.invoice.t_periodespt
def get_payment(self):
db_session = get_db_session()
q = db_session.query(Pembayaran).filter_by(
t_idspt=self.invoice.t_idspt)
return q.first()
def get_payment_amount(self):
db_session = get_db_session()
q = db_session.query(
......
......@@ -222,6 +222,11 @@ class Inquiry(Common):
if self.invoice.tgl_jatuh_tempo:
return self.invoice.tgl_jatuh_tempo.date()
def get_payment(self):
db_session = get_db_session()
q = db_session.query(Payment).filter_by(sspd_id=self.invoice.id)
return q.first()
def get_payment_amount(self):
db_session = get_db_session()
q = db_session.query(
......@@ -231,9 +236,7 @@ class Inquiry(Common):
return row.total_bayar or 0
def get_pay_seq(self):
db_session = get_db_session()
q = db_session.query(Payment).filter_by(sspd_id=self.invoice.id)
pay = q.first()
pay = self.get_payment()
return pay and pay.pembayaran_ke + 1 or 1
# Override
......@@ -283,7 +286,7 @@ class Reversal(Common):
if not self.invoice:
return
if not self.is_available():
self.payment = self.invoice and self.get_last_payment()
self.payment = self.get_last_payment()
def get_last_payment(self):
db_session = get_db_session()
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!