Commit eda60a06 by Owo Sugiana

Tambah Kota Cimahi

1 parent cb379110
0.4.11 2026-06-13
-----------------
- Tambah Kota Cimahi
0.4.10 2026-06-02 0.4.10 2026-06-02
----------------- -----------------
- Di Kabupaten Tasik mulai 1 Juni dikenakan denda 1% per bulan. - Di Kabupaten Tasik mulai 1 Juni dikenakan denda 1% per bulan.
......
from sqlalchemy import (
Column,
Integer,
String,
DateTime,
Float,
Text,
UniqueConstraint,
)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Notaris(Base):
__tablename__ = 'r_ppat'
kd_ppat = Column(String(5), primary_key=True)
nama_ppat = Column(Text, nullable=False)
class Invoice(Base):
__tablename__ = 'bookppat'
doc_id = Column(Integer, primary_key=True)
kd_ppat = Column(String(5), nullable=False)
th_booking = Column(String(4), nullable=False)
no_booking = Column(String(6))
no_booking2 = Column(String(6))
no_kunci = Column(String(8))
tgl_booking = Column(DateTime())
nop_dt1 = Column(String(2))
nop_dt2 = Column(String(2))
nop_camat = Column(String(3))
nop_lurah = Column(String(3))
nop_blok = Column(String(3))
nop_urut = Column(String(4))
nop_kode = Column(String(1))
nama_wp = Column(String(50))
alamat_wp = Column(String(50))
rtrw_wp = Column(String(7))
lurah_wp = Column(String(25))
camat_wp = Column(String(25))
kota_wp = Column(String(25))
kodepos = Column(String(5))
npwp_wp = Column(String(15))
nama_ow = Column(String(50))
alamat_ow = Column(String(50))
rtrw_ow = Column(String(7))
lurah_ow = Column(String(30))
camat_ow = Column(String(30))
kota_ow = Column(String(25))
kodepos_ow = Column(String(5))
npwp_ow = Column(String(15))
alamat_op = Column(String(50))
rtrw_op = Column(String(7))
lurah_op = Column(String(30))
camat_op = Column(String(30))
kota_op = Column(String(25))
no_serti = Column(String(100))
kd_strata = Column(Integer)
luas_tanah = Column(Float)
njop_tanah = Column(Integer)
nil_tanah = Column(Integer)
luas_bang = Column(Float)
njop_bang = Column(Integer)
nilai_bang = Column(Integer)
njop_pbb = Column(Integer)
harga_tran = Column(Integer)
kd_jphtb = Column(String(2))
pecah_bag = Column(Integer)
dari_bag = Column(Integer)
npop = Column(Integer)
npoptkp = Column(Integer)
npopkp = Column(Integer)
bphtb_utg = Column(Integer)
kd_prosen = Column(Float)
prosen_rp = Column(Integer)
denda_bln = Column(Integer)
denda_rp = Column(Integer)
pengenaan = Column(Integer)
kd_setor = Column(String(1))
sbb_kdset = Column(String(2))
nomor = Column(String(20))
tanggal = Column(DateTime)
kd_bayar = Column(String(1))
nil_setor = Column(Integer)
kd_tmpbyr = Column(String(2))
kd_terima = Column(Integer)
tgl_terima = Column(DateTime)
nm_terima = Column(String(30))
tgl_setor = Column(DateTime)
nm_setor = Column(String(30))
kd_pejabat = Column(String(1))
nm_pejabat = Column(String(30))
lt_kotor = Column(Float)
lb_kotor = Column(Float)
lb_efektif = Column(Float)
lb_unit = Column(Float)
lt_kotor_njop = Column(Integer)
lb_kotor_njop = Column(Integer)
lt_kotor_r = Column(Float)
lb_efektif_r = Column(Float)
lb_kotor_r = Column(Float)
lt_kotor_njop_r = Column(Integer)
lb_efektif_njop_r = Column(Integer)
lb_kotor_njop_r = Column(Integer)
lt_kotor_nil = Column(Integer)
lb_efektif_nil = Column(Integer)
lb_kotor_nil = Column(Integer)
njop_pbb_nil = Column(Integer)
fl_npopkp = Column(String(1))
Status = Column(String(1))
tgl_terima_berkas = Column(DateTime)
tgl_retrieve = Column(DateTime)
tgl_validasi = Column(DateTime)
tgl_diserahkan = Column(DateTime)
tgl_approve_bpn = Column(DateTime)
tgl_selesai_bpn = Column(DateTime)
NoBlanko = Column(String(10))
keterangan = Column(String(100))
tahun_ajb = Column(String(4))
petugas = Column(String(10))
th_skb = Column(String(4))
kd_skbkb = Column(String(6))
__table_args__ = (
UniqueConstraint(
kd_ppat, th_booking, no_booking, no_booking2, no_kunci),
)
class Payment(Base):
__tablename__ = 't_bank'
doc_id = Column(Integer, primary_key=True)
no_transaksi = Column(String(20))
nop_dt1 = Column(String(2))
nop_dt2 = Column(String(2))
nop_camat = Column(String(3))
nop_lurah = Column(String(3))
nop_blok = Column(String(3))
nop_urut = Column(String(4))
nop_kode = Column(String(1))
nama_wp = Column(String(50))
npwp = Column(String(15))
alamat_wp = Column(String(50))
lurah_wp = Column(String(25))
rtrw_wp = Column(String(7))
camat_wp = Column(String(25))
kota_wp = Column(String(25))
kodepos = Column(String(5))
alamat_op = Column(String(50))
nil_setor = Column(Integer)
kode_bank = Column(String(2))
tgl_transaksi = Column(DateTime)
nm_ptgs = Column(String(30))
no_seri = Column(String(10))
kd_ppat = Column(String(5))
th_booking = Column(String(4))
no_book = Column(String(6))
th_kb = Column(String(4))
no_kb = Column(String(6))
no_booking = Column(String(15))
ct = Column(Integer)
USERID = Column(String(12))
UPDATETIME = Column(DateTime)
# Tidak perlu mendapatkan nilai doc_id yang dipicu oleh trigger agar tidak
# error
__table_args__ = dict(implicit_returning=False)
...@@ -51,8 +51,15 @@ def get_option(argv): ...@@ -51,8 +51,15 @@ def get_option(argv):
def show_payment_from_inquiry(inq): def show_payment_from_inquiry(inq):
pay = inq.get_payment() try:
if pay: query_payments = getattr(inq, 'query_payments')
except AttributeError:
pay = inq.get_payment()
if pay:
show_payment(pay)
return
for no, pay in enumerate(query_payments()):
print(f'Pembayaran ke-{no+1}')
show_payment(pay) show_payment(pay)
...@@ -70,6 +77,10 @@ def show_payment(pay): ...@@ -70,6 +77,10 @@ def show_payment(pay):
# Kota Sukabumi # Kota Sukabumi
show_fields( show_fields(
pay, ['jumlah_yg_dibayar', 'tgl_pembayaran', 'tgl_rekam']) pay, ['jumlah_yg_dibayar', 'tgl_pembayaran', 'tgl_rekam'])
# Kota Cimahi
show_fields(
pay, ['doc_id', 'tgl_transaksi', 'nil_setor', 'no_transaksi',
'kode_bank', 'UPDATETIME'])
def show_inquiry(inq): def show_inquiry(inq):
...@@ -102,7 +113,9 @@ def show_inquiry(inq): ...@@ -102,7 +113,9 @@ def show_inquiry(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())
print('Tabel {}:'.format(inq.invoice.__table__.name)) print('Tabel {}:'.format(inq.invoice.__table__.name))
show_fields(inq.invoice, ['status_pembayaran']) show_fields(
inq.invoice, ['doc_id', 'pengenaan', 'denda_rp',
'status_pembayaran', 'nil_setor', 'nomor', 'tanggal'])
show_payment_from_inquiry(inq) show_payment_from_inquiry(inq)
......
from datetime import (
datetime,
date,
)
from sqlalchemy.sql import func
from opensipkd.hitung import round_up
from opensipkd.string import FixLength
from opensipkd.string.money import thousand
from ..models.cimahi import (
Notaris,
Invoice,
Payment,
)
from .base import (
get_db_session,
AvailableInvoice as BaseAvailableInvoice,
)
INVOICE_ID = [
['kd_ppat', 5, 'N'],
['th_booking', 4, 'N'],
['no_booking', 6, 'N'],
]
class Common:
def __init__(self, invoice_id):
self.invoice_id = invoice_id
self.invoice_id_struct = FixLength(INVOICE_ID)
self.invoice_id_struct.set_raw(invoice_id)
self.kd_ppat = self.invoice_id_struct['kd_ppat']
self.th_booking = self.invoice_id_struct['th_booking']
self.no_booking = self.invoice_id_struct['no_booking']
db_session = get_db_session()
q = db_session.query(Invoice).filter_by(
kd_ppat=self.kd_ppat, th_booking=self.th_booking,
no_booking=self.no_booking)
q = q.order_by(Invoice.doc_id.desc())
self.invoice = q.first()
if self.invoice and not self.is_available():
self.invoice = None
def is_available(self):
return self.invoice.Status == 'A' and self.invoice.bphtb_utg > 0
def get_payment(self):
db_session = get_db_session()
q = db_session.query(Payment).filter_by(no_booking=self.invoice_id)
q = q.order_by(Payment.doc_id.desc())
return q.first()
def query_payments(self):
db_session = get_db_session()
q = db_session.query(Payment).filter_by(no_booking=self.invoice_id)
return q.order_by(Payment.doc_id)
class Inquiry(Common):
def __init__(self, invoice_id, conf=dict(), tgl_bayar=None):
super().__init__(invoice_id)
if not self.invoice:
return
self.conf = conf
self.tgl_bayar = tgl_bayar or date.today()
self.notaris = self.get_notaris()
self.rt_wp, self.rw_wp = self.invoice.rtrw_wp.split('/')
self.hitung()
def hitung(self):
self.discount = 0
self.tagihan = round_up(self.invoice.pengenaan)
self.denda = round_up(self.invoice.denda_rp)
self.total = self.tagihan + self.denda
db_session = get_db_session()
q = db_session.query(
func.sum(Payment.nil_setor)).filter(
Payment.no_booking == self.invoice_id)
self.total_bayar = q.scalar() or 0
if self.total_bayar:
self.total -= self.total_bayar
self.bln_tunggakan = self.invoice.denda_bln
def do_payment(
self, ntb=None, kode_bank='17', kode_cabang=None, kode_user=None,
seq=None):
"""
kode_bank dari tabel r_tempat_bayar. 17 = BJB.
"""
if kode_cabang:
petugas = f'Cabang {kode_cabang}, User {kode_user}'
else:
petugas = None
db_session = get_db_session()
inv = self.invoice
pay = Payment(
no_transaksi=ntb,
nop_dt1=inv.nop_dt1,
nop_dt2=inv.nop_dt2,
nop_camat=inv.nop_camat,
nop_lurah=inv.nop_lurah,
nop_blok=inv.nop_blok,
nop_urut=inv.nop_urut,
nop_kode=inv.nop_kode,
nama_wp=inv.nama_wp,
npwp=inv.npwp_wp,
alamat_wp=inv.alamat_wp,
lurah_wp=inv.lurah_wp,
rtrw_wp=inv.rtrw_wp,
camat_wp=inv.camat_wp,
kota_wp=inv.kota_wp,
kodepos=inv.kodepos,
alamat_op=inv.alamat_op,
nil_setor=self.total,
kode_bank=kode_bank,
tgl_transaksi=self.tgl_bayar,
nm_ptgs=petugas,
no_seri=None,
kd_ppat=inv.kd_ppat,
th_booking=inv.th_booking,
no_book=inv.no_booking, # di aplikasi lama = None
th_kb=None,
no_kb=None,
no_booking=self.invoice_id,
ct=1,
USERID='h2h',
UPDATETIME=datetime.now())
db_session.add(pay)
self.invoice.nil_setor = self.total
self.invoice.nomor = ntb
self.invoice.tanggal = self.tgl_bayar
self.invoice.kd_tmpbyr = kode_bank
self.invoice.kd_terima = 1
db_session.add(self.invoice)
return pay
def get_notaris(self):
db_session = get_db_session()
q = db_session.query(Notaris).filter_by(kd_ppat=self.kd_ppat)
return q.first()
def get_nop(self):
return self.invoice.nop_dt1 + self.invoice.nop_dt2 + \
self.invoice.nop_camat + self.invoice.nop_lurah + \
self.invoice.nop_blok + self.invoice.nop_urut + \
self.invoice.nop_kode
def get_luas_tanah(self):
return int(self.invoice.luas_tanah)
def get_luas_bangunan(self):
return int(self.invoice.luas_bang)
def get_npop(self):
return int(self.invoice.npop)
def get_jenis_perolehan_hak(self):
return self.invoice.kd_jphtb
def get_nama_notaris(self):
return self.notaris.nama_ppat
def get_nama(self):
return self.invoice.nama_wp
def get_npwp(self):
return self.invoice.npwp_wp
def get_alamat_wp(self):
return self.invoice.alamat_wp
def get_alamat_op(self):
return self.invoice.alamat_op
def get_kota_wp(self):
return self.invoice.kota_wp
def get_kota_op(self):
return self.invoice.kota_wp
def get_kelurahan_wp(self):
return self.invoice.lurah_wp
def get_kecamatan_wp(self):
return self.invoice.camat_wp
def get_rt_wp(self):
return self.rt_wp
def get_rw_wp(self):
return self.rw_wp
def get_kode_pos_wp(self):
return self.invoice.kodepos
def get_kelurahan_op(self):
return self.invoice.lurah_op
def get_kecamatan_op(self):
return self.invoice.camat_op
def get_tahun(self):
return self.invoice.th_booking
def get_jatuh_tempo(self):
pass
class Reversal(Common):
def __init__(self, invoice_id):
super().__init__(invoice_id)
self.payment = None
if not self.invoice:
return
self.payment = self.get_payment()
def do_reversal(self):
db_session = get_db_session()
if self.payment:
self.payment.nil_setor = 0
db_session.add(self.payment)
self.invoice.nil_setor = 0
db_session.add(self.invoice)
class AvailableInvoice(BaseAvailableInvoice):
def get_query(self):
db_session = get_db_session()
q = db_session.query(Invoice).filter_by(Status='A', nil_setor=0)
q = q.filter(Invoice.bphtb_utg > 0)
if self.option.tahun:
q = q.filter_by(th_booking=self.option.tahun)
if self.option.min_nominal:
q = q.filter(Invoice.bphtb_utg >= self.option.min_nominal)
if self.option.max_nominal:
q = q.filter(Invoice.bphtb_utg <= self.option.max_nominal)
return q.order_by(Invoice.doc_id.desc())
def get_message(self, row):
invoice_id = ''.join([row.kd_ppat, row.th_booking, row.no_booking])
inq = Inquiry(invoice_id)
if inq.total < 1:
return
total = thousand(inq.total).rjust(11)
return f'{invoice_id} Rp {total}'
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!