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 0.3.1 2020-11-18
---------------- ----------------
- Tambah Kota Banjar - 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 ...@@ -3,12 +3,16 @@ from argparse import ArgumentParser
from .common import init from .common import init
help_skpdkb = 'Tampilkan kode bayar SKPDKB'
def get_option(argv): def get_option(argv):
default_count = 10 default_count = 10
help_count = 'default {}'.format(default_count) help_count = 'default {}'.format(default_count)
pars = ArgumentParser() pars = ArgumentParser()
pars.add_argument('conf') pars.add_argument('conf')
pars.add_argument('--tahun', type=int) 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('--belum-jatuh-tempo', action='store_true')
pars.add_argument('--lewat-jatuh-tempo', action='store_true') pars.add_argument('--lewat-jatuh-tempo', action='store_true')
pars.add_argument( pars.add_argument(
......
...@@ -14,6 +14,23 @@ def show_rp(label, value): ...@@ -14,6 +14,23 @@ def show_rp(label, value):
show_val(label, 'Rp {}'.format(thousand(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): def get_option(argv):
pars = ArgumentParser() pars = ArgumentParser()
pars.add_argument('conf', help='File konfigurasi') pars.add_argument('conf', help='File konfigurasi')
...@@ -23,7 +40,17 @@ def get_option(argv): ...@@ -23,7 +40,17 @@ def get_option(argv):
return pars.parse_args(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('Invoice ID', inq.invoice_id)
show_val('Luas Tanah', inq.get_luas_tanah()) show_val('Luas Tanah', inq.get_luas_tanah())
show_val('Luas Bangunan', inq.get_luas_bangunan()) show_val('Luas Bangunan', inq.get_luas_bangunan())
...@@ -51,6 +78,7 @@ def show(inq): ...@@ -51,6 +78,7 @@ def show(inq):
show_val('Kota Wajib Pajak', inq.get_kota_wp()) show_val('Kota Wajib Pajak', inq.get_kota_wp())
show_val('Tahun Pajak', inq.get_tahun()) show_val('Tahun Pajak', inq.get_tahun())
show_val('Is Available', inq.is_available()) show_val('Is Available', inq.is_available())
show_payment(inq)
def show_pkey_values(row): def show_pkey_values(row):
...@@ -75,7 +103,7 @@ def main(argv=sys.argv): ...@@ -75,7 +103,7 @@ def main(argv=sys.argv):
invoice_id, conf.getfloat('main', 'persen_denda')) invoice_id, conf.getfloat('main', 'persen_denda'))
if not inq.invoice: if not inq.invoice:
error(f'Invoice ID {invoice_id} tidak ada.') error(f'Invoice ID {invoice_id} tidak ada.')
show(inq) show_inquiry(inq)
if option.payment: if option.payment:
if not inq.total: if not inq.total:
error('Tidak ada tagihan, tidak ada yang perlu dibayar.') 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: ...@@ -163,6 +163,12 @@ class Inquiry:
def get_tahun(self): def get_tahun(self):
return self.invoice.t_periodespt 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): def get_payment_amount(self):
db_session = get_db_session() db_session = get_db_session()
q = db_session.query( q = db_session.query(
......
...@@ -222,6 +222,11 @@ class Inquiry(Common): ...@@ -222,6 +222,11 @@ class Inquiry(Common):
if self.invoice.tgl_jatuh_tempo: if self.invoice.tgl_jatuh_tempo:
return self.invoice.tgl_jatuh_tempo.date() 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): def get_payment_amount(self):
db_session = get_db_session() db_session = get_db_session()
q = db_session.query( q = db_session.query(
...@@ -231,9 +236,7 @@ class Inquiry(Common): ...@@ -231,9 +236,7 @@ class Inquiry(Common):
return row.total_bayar or 0 return row.total_bayar or 0
def get_pay_seq(self): def get_pay_seq(self):
db_session = get_db_session() pay = self.get_payment()
q = db_session.query(Payment).filter_by(sspd_id=self.invoice.id)
pay = q.first()
return pay and pay.pembayaran_ke + 1 or 1 return pay and pay.pembayaran_ke + 1 or 1
# Override # Override
...@@ -283,7 +286,7 @@ class Reversal(Common): ...@@ -283,7 +286,7 @@ class Reversal(Common):
if not self.invoice: if not self.invoice:
return return
if not self.is_available(): 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): def get_last_payment(self):
db_session = get_db_session() 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!