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