Commit d80c0074 by Owo Sugiana

Tambah Opsen untuk laporan ke Pemerintah Provinsi

1 parent 68206f12
0.6 2025-02-06
--------------
- Tambah Opsen untuk laporan ke Pemerintah Provinsi.
0.5.21 2025-01-22
-----------------
- Kabupaten Magelang mengenakan denda 1% mulai masa pajak Oktober 2024 tanggal
......
......@@ -325,6 +325,7 @@ class Invoice(Base):
r_alamat = Column(String(255))
# m_tonase = Column(Float)
# m_njop = Column(Float)
opsen_pokok = Column(Float)
__table_args__ = (
UniqueConstraint('tahun', 'sptno'),
UniqueConstraint('tahun', 'sptno', 'customer_usaha_id', 'masadari'),
......@@ -488,6 +489,8 @@ class Payment(Base):
denda = Column(Integer)
jml_bayar = Column(Integer)
is_valid = Column(Integer)
opsen_pokok = Column(Float)
opsen_denda = Column(Float)
__table_args__ = (
UniqueConstraint('tahun', 'sspdno'),
dict(schema='pad'))
......
......@@ -324,6 +324,7 @@ class Invoice(Base):
r_alamat = Column(String(255))
# m_tonase = Column(Float)
# m_njop = Column(Float)
opsen_pokok = Column(Float)
__table_args__ = (
UniqueConstraint('tahun', 'sptno'),
UniqueConstraint('tahun', 'sptno', 'customer_usaha_id', 'masadari'),
......@@ -378,6 +379,8 @@ class Payment(Base):
jml_bayar = Column(Integer)
is_valid = Column(Integer)
discount_denda = Column(Float)
opsen_pokok = Column(Float)
opsen_denda = Column(Float)
__table_args__ = (
UniqueConstraint('tahun', 'sspdno'),
dict(schema='pad'))
......
......@@ -6,6 +6,7 @@ from .common import init
default_count = 10
help_jenis = 'dari field pad_usaha.usahanm'
help_rekening = 'dari field tblrekening.rekeningkd'
help_opsen = 'dari field pad_spt.opsen_pokok'
help_tipe = 'dari tabel pad_spt_type'
help_tgl = 'dd-mm-yyyy'
help_count = f'default {default_count}'
......@@ -21,6 +22,8 @@ def get_option(argv):
pars.add_argument('--jatuh-tempo-max', help=help_tgl)
pars.add_argument('--nominal-min', type=int)
pars.add_argument('--nominal-max', type=int)
pars.add_argument('--opsen-min', type=int, help=help_opsen)
pars.add_argument('--opsen-max', type=int, help=help_opsen)
pars.add_argument('--tgl-kohir-min')
pars.add_argument('--tgl-kohir-max')
pars.add_argument('--tipe', help=help_tipe)
......
......@@ -69,14 +69,27 @@ def show(inq):
show_val('Kecamatan Objek Pajak', inq.get_kecamatan_op())
show_val('Jatuh Tempo', inq.get_jatuh_tempo())
show_val('Jumlah Bulan Denda', inq.bln_tunggakan)
show_rp('Tagihan', inq.tagihan)
show_rp('Tagihan Pokok', inq.pokok)
show_rp('Opsen Pokok', inq.opsen_pokok)
show_field(inq.invoice, 'pajak_terhutang')
show_field(inq.invoice, 'bunga')
show_field(inq.invoice, 'opsen_pokok')
try:
show_rp('Denda Jatuh Tempo', inq.denda_waktu)
show_rp('Denda Pokok (Jatuh Tempo)', inq.denda_pokok)
except AttributeError:
pass
try:
show_rp('Opsen Denda (Jatuh Tempo)', inq.opsen_denda)
except AttributeError:
pass
try:
show_rp('Discount Denda Pokok', inq.discount_denda_pokok)
except AttributeError:
pass
try:
show_rp('Discount Opsen Denda', inq.discount_opsen_denda)
except AttributeError:
pass
show_rp('Discount Denda', inq.discount_denda)
if inq.notes:
show_val('Note', inq.notes)
show_rp('Total Denda', inq.denda)
......
......@@ -89,58 +89,76 @@ NOTE_TGL_TERIMA = 'field terimatgl {tgl} >= ' + dmy(AKHIR_TERIMA)
class Inquiry(BaseInquiry):
invoice_id_structure = INVOICE_ID
def hitung_denda(self): # Override
def get_persen_denda(self): # Override
tgl_kohir = self.get_tgl_kohir()
if tgl_kohir:
tahun_terbit = tgl_kohir.year
else:
tahun_terbit = self.invoice.masadari.year
if tahun_terbit > 2023:
persen_denda = 1
# 5: SKPDKB, 6: SKPDJ, 7: SKPDKBT, 15: SK Angsuran
if self.invoice.type_id in (5, 6, 7, 15):
persen_denda = 0.6
else:
persen_denda = self.conf['persen_denda']
return 0.6
return 1
return 2
def hitung_denda_waktu(self):
persen_denda = self.get_persen_denda()
d = Denda(
self.pokok, self.invoice.jatuhtempotgl,
persen_denda, self.tgl_bayar.date(), self.invoice)
self.bln_tunggakan, self.denda_pokok = d.hitung()
self.denda_pokok = round_up(self.denda_pokok)
d = Denda(
self.invoice.opsen_pokok, self.invoice.jatuhtempotgl,
persen_denda, self.tgl_bayar.date(), self.invoice)
_, self.opsen_denda = d.hitung()
self.opsen_denda = round_up(self.opsen_denda)
def hitung_denda(self): # Override
bunga = self.invoice.bunga or 0
self.denda = self.bunga = round_up(bunga)
bunga = round_up(bunga)
if self.invoice.jatuhtempotgl:
d = Denda(
self.tagihan, self.invoice.jatuhtempotgl,
persen_denda, self.tgl_bayar.date(), self.invoice)
self.bln_tunggakan, self.denda_waktu = d.hitung()
self.denda_waktu = round_up(self.denda_waktu)
self.denda += self.denda_waktu
if self.invoice.status_pembayaran == 0:
self.hitung_denda_waktu()
self.denda_pokok += bunga
else:
self.bln_tunggakan = self.denda_pokok = self.opsen_denda = 0
else:
self.bln_tunggakan = None
self.denda_pokok = bunga
self.discount_denda = self.get_discount_denda()
self.denda -= self.discount_denda
self.discount_denda_pokok, self.discount_opsen_denda = \
self.get_discount_denda()
self.total_denda_pokok = self.denda_pokok - self.discount_denda_pokok
self.total_opsen_denda = self.opsen_denda - self.discount_opsen_denda
self.denda = self.total_denda_pokok + self.total_opsen_denda
self.denda = round_up(self.denda)
def get_discount_denda(self): # Override
self.notes = []
rek = self.rekening.rekeningkd
if rek in self.conf.get('rekening_tanpa_denda', []):
self.notes.append(NOTE_REK.format(rek=rek))
return self.denda
return self.denda_pokok, self.opsen_denda
tgl_bayar = self.tgl_bayar.date()
if tgl_bayar > AKHIR_TGL_BAYAR:
return 0
return 0, 0
tgl_masa = self.invoice.masadari.date()
if tgl_masa > AKHIR_MASA:
return 0
return 0, 0
notes = [
NOTE_TGL_BAYAR.format(tgl=dmy(tgl_bayar)),
NOTE_AKHIR_MASA.format(tgl=dmy(tgl_masa))]
if tgl_masa <= AKHIR_MASA:
notes.append(NOTE_AKHIR_MASA.format(tgl=dmy(tgl_masa)))
self.notes = notes
return self.denda
return self.denda_pokok, self.opsen_denda
tgl_terima = self.invoice.terimatgl.date()
if tgl_terima <= AKHIR_TERIMA:
notes.append(NOTE_TGL_TERIMA.format(tgl=tgl_terima))
self.notes = notes
return self.denda
return 0
return self.denda_pokok, self.opsen_denda
return 0, 0
def get_invoice_model(self): # Override
return Invoice
......
......@@ -296,42 +296,52 @@ class Inquiry(BaseInquiry):
def get_payment_amount(self):
Payment = self.get_payment_model()
DBSession = get_db_session()
q = DBSession.query(func.sum(Payment.jml_bayar).label('jml'))
q = DBSession.query(func.sum(Payment.jml_bayar + Payment.opsen_pokok))
q = q.filter_by(spt_id=self.invoice.id)
pay = q.first()
return pay.jml or 0
return q.scalar() or 0
def hitung_tagihan(self):
self.tagihan = self.invoice.pajak_terhutang - self.invoice.bunga
self.tagihan = round_up(self.tagihan)
self.pokok = self.invoice.pajak_terhutang - self.invoice.bunga
self.total_pokok = self.pokok + self.invoice.opsen_pokok
self.total_pokok = round_up(self.total_pokok)
self.opsen_pokok = round_up(self.invoice.opsen_pokok)
def hitung_denda(self):
self.bln_tunggakan = None
self.denda = 0
if self.get_type_name().strip() == 'STPD':
self.denda = round_up(self.invoice.bunga)
self.denda_pokok = round_up(self.invoice.bunga)
self.bln_tunggakan = self.opsen_denda = 0
elif self.invoice.jatuhtempotgl:
if self.invoice.status_pembayaran == 0:
self.hitung_denda_waktu()
else:
self.bln_tunggakan = self.denda_waktu = 0
self.denda = self.denda_waktu + self.invoice.bunga
self.denda = round_up(self.denda)
self.discount_denda = self.get_discount_denda()
self.denda -= self.discount_denda
def hitung_denda_waktu(self):
self.bln_tunggakan = self.denda_pokok = self.opsen_denda = 0
self.discount_denda_pokok, self.discount_opsen_denda = \
self.get_discount_denda()
self.total_denda_pokok = self.denda_pokok - self.discount_denda_pokok
self.total_opsen_denda = self.opsen_denda - self.discount_opsen_denda
self.denda = self.total_denda_pokok + self.total_opsen_denda
self.denda = round_up(self.denda)
def get_persen_denda(self):
tahun_terbit = self.get_jatuh_tempo().year
if tahun_terbit > 2023:
persen_denda = 1
else:
persen_denda = self.conf['persen_denda']
self.bln_tunggakan, self.denda_waktu = hitung_denda(
self.tagihan, self.invoice.jatuhtempotgl, persen_denda,
self.tgl_bayar.date())
return 1
return 2
def hitung_denda_waktu(self):
persen_denda = self.get_persen_denda()
tgl_bayar = self.tgl_bayar.date()
self.bln_tunggakan, self.denda_pokok = hitung_denda(
self.pokok, self.invoice.jatuhtempotgl, persen_denda,
tgl_bayar)
_, self.opsen_denda = hitung_denda(
self.invoice.opsen_pokok, self.invoice.jatuhtempotgl, persen_denda,
tgl_bayar)
self.opsen_denda = round_up(self.opsen_denda)
def get_discount_denda(self):
return 0
return 0, 0 # denda_pokok, opsen_denda
def hitung_bayar(self):
bayar = self.get_payment_amount()
......@@ -341,7 +351,7 @@ class Inquiry(BaseInquiry):
self.hitung_tagihan()
self.hitung_denda()
self.hitung_bayar()
self.total = self.tagihan + self.denda - self.total_bayar
self.total = self.total_pokok + self.denda - self.total_bayar
if self.total < 0:
self.total = 0
......@@ -363,9 +373,11 @@ class Inquiry(BaseInquiry):
tahun=self.invoice.tahun,
spt_id=self.invoice.id,
sspdno=sspdno,
denda=self.denda,
bunga=self.denda,
jml_bayar=self.total,
denda=self.total_denda_pokok,
bunga=self.total_denda_pokok,
jml_bayar=self.pokok + self.total_denda_pokok,
opsen_pokok=self.opsen_pokok + self.total_opsen_denda,
opsen_denda=self.opsen_denda,
create_date=kini,
write_date=kini,
sspdtgl=self.tgl_bayar,
......@@ -398,7 +410,8 @@ class Reversal(BaseInquiry):
DBSession = get_db_session()
if self.payment:
self.payment.jml_bayar = self.payment.denda = \
self.payment.bunga = 0
self.payment.bunga = self.payment.opsen_pokok = \
self.payment.opsen_denda = 0
self.payment.enabled = self.payment.is_valid = 0
DBSession.add(self.payment)
self.invoice.status_pembayaran = 0
......@@ -480,6 +493,7 @@ class AvailableInvoice:
q = self.get_filter_rekening(q)
q = self.get_filter_usaha(q)
q = self.get_filter_nominal(q)
q = self.get_filter_opsen(q)
q = self.get_filter_jatuh_tempo(q)
q = self.get_filter_masa(q)
q = self.get_filter_tgl_terima(q)
......@@ -532,6 +546,16 @@ class AvailableInvoice:
self.option.nominal_max)
return q
def get_filter_opsen(self, q):
Invoice = self.get_invoice_model()
if self.option.opsen_min:
q = q.filter(
Invoice.opsen_pokok >= self.option.opsen_min)
if self.option.opsen_max:
q = q.filter(
Invoice.opsen_pokok <= self.option.opsen_max)
return q
def get_filter_jatuh_tempo(self, q):
Invoice = self.get_invoice_model()
if self.option.jatuh_tempo_min:
......@@ -600,7 +624,7 @@ class AvailableInvoice:
if not inq.total:
return
total = thousand(inq.total)
tagihan = thousand(inq.tagihan)
tagihan = thousand(inq.total_pokok)
denda = thousand(inq.denda)
s = f'{invoice_id.get_raw()} {inq.get_kode_rekening()}'\
f' {inq.get_nama_rekening()} Rp {total} ='\
......
......@@ -19,29 +19,23 @@ INVOICE_ID = [('Prefix', 4, 'N')] + INVOICE_ID
class Inquiry(BaseInquiry):
invoice_id_structure = INVOICE_ID
def hitung_denda_waktu(self): # Override
def get_persen_denda(self): # Override
tgl_kohir = self.get_tgl_kohir()
if tgl_kohir:
tahun_terbit = tgl_kohir.year
else:
tahun_terbit = self.invoice.masadari.year
if tahun_terbit > 2023:
persen_denda = 1
if self.get_type_name().strip() in ('SSPD', 'SELF'):
persen_denda = 1
else:
persen_denda = self.conf['persen_denda']
self.bln_tunggakan, self.denda_waktu = hitung_denda(
self.tagihan, self.invoice.jatuhtempotgl, persen_denda,
self.tgl_bayar.date())
return 1
return 2
def get_discount_denda(self): # Override
tgl_bayar = self.tgl_bayar.date()
if AWAL_DISC <= tgl_bayar <= AKHIR_DISC:
tgl = self.invoice.masadari.date()
if tgl.year == 2024:
return self.denda
return 0
return self.denda_pokok, self.opsen_denda
return 0, 0
def get_kohir_model(self):
return Kohir
......
......@@ -60,15 +60,15 @@ class Inquiry(BaseInquiry):
self.tgl_bayar.date())
if self.invoice.bunga < 1 or self.bln_tunggakan < 1:
return
denda_per_bln = self.denda_waktu / self.bln_tunggakan
max_denda = 24 * denda_per_bln
denda = self.denda_waktu + self.invoice.bunga
if max_denda > 0 and denda >= max_denda:
if self.bln_tunggakan > 24:
self.bln_tunggakan = 24
self.denda_waktu = max_denda - self.invoice.bunga
if self.denda_waktu < 0:
self.denda_waktu = 0
denda_pokok_per_bln = self.denda_pokok / self.bln_tunggakan
opsen_denda_per_bln = self.opsen_denda / self.bln_tunggakan
max_denda_pokok = 24 * denda_pokok_per_bln
max_opsen_denda = 24 * opsen_denda_per_bln
max_denda = max_denda_pokok + max_opsen_denda
if max_denda > 0 and self.total_denda >= max_denda:
self.bln_tunggakan = 24
self.denda_pokok = max_denda_pokok - self.invoice.bunga
self.opsen_denda = max_opsen_denda
def get_discount_denda(self): # Override
tgl_bayar = self.tgl_bayar.date()
......
......@@ -86,19 +86,15 @@ class Inquiry(BaseInquiry):
return self.denda
return 0
def hitung_denda_waktu(self): # Override
def get_persen_denda(self): # Override
tgl_kohir = self.get_tgl_kohir()
if tgl_kohir:
tahun_terbit = tgl_kohir.year
else:
tahun_terbit = self.invoice.masadari.year
if tahun_terbit > 2023:
persen_denda = 1
else:
persen_denda = self.conf['persen_denda']
self.bln_tunggakan, self.denda_waktu = hitung_denda(
self.tagihan, self.invoice.jatuhtempotgl, persen_denda,
self.tgl_bayar.date())
return 1
return 2
def before_save(self, pay): # Override
pay.discount_denda = self.discount_denda
......
......@@ -3,7 +3,7 @@ requires = ['setuptools >= 64']
[project]
name = 'opensipkd-pad-models'
version = '0.5.21'
version = '0.6'
dependencies = [
'sqlalchemy',
'zope.sqlalchemy',
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!