Commit b657f5f9 by Owo Sugiana

WEBR menggunakan tabel sync_ar_payment

1 parent 2fc9eb34
3.2.1 2024-08-15
----------------
- WEBR menggunakan tabel sync_ar_payment
3.2 2024-05-17
--------------
- Perubahan rumus pada PBB
- Penambahan field kecamatan_nm pada PAD
3.1.4 2024-05-07
----------------
- Tambah PBB H2H Only
3.1.3 2023-08-21
----------------
- Tambah PBB VA & QRIS Only
3.1.2 2023-07-26
----------------
- POSPBB tidak lagi dikenali dari field nip_rekam_byr_sppt melainkan dari field
kd_tp. Ini dikarenakan ada daerah yang menggunakan NIP yang sama untuk POSPBB
maupun QRIS.
3.1.1 2023-07-21
----------------
- Bug fixed PAD QRIS
3.1 2023-06-28
--------------
- Tambah bin/payment_report_by_id
3.0.2 2023-05-17
----------------
- PBB kini memahami tabel log_iso dengan struktur universal (JSON).
3.0.1 2023-04-14
----------------
- Tambah tabel pbb_invoice yang merupakan salinan tabel sppt. Tabel ini diisi
oleh synchronizer sppt.
3.0 2023-03-27
--------------
- Class yang tidak bergantung pada command line argument
2.13 2023-03-18
---------------
- Tambah Fortuna
2.12 2023-03-16
---------------
- Tambah BPHTB Kabupaten Ciamis
- Tambah kolom jenis retribusi (ar_invoice.produk_nama)
2.11 2023-03-13
---------------
- Tambah PBB Kabupaten Tangerang
2.10 2023-03-07
---------------
- Tambah PBB Ciamis
2.9 2023-03-01
--------------
- Tambah BPHTB Kabupaten Serang
- Tambah PAD Cimahi
- Perbaikan data masa_pajak = pad_spt.masadari
- Perbaikan channel EMONEY > DIGICASH
- Penambahan conf untuk memilah channel pembayaran va & qris pada webr berdasarkan ntb
2.8 2022-12-26
--------------
- Konfigurasi service bisa memuat class Handler untuk sumber data yang sangat
berbeda.
2.6 2022-12-16
--------------
- Penambahan channel ALFAMIDI
2.5 2022-12-14
--------------
- Penambahan Field bunga untuk perhitungan pad
2.4 2022-12-06
--------------
- Penambahan BPHTB Kota Sukabumi
2.3 2022-10-17
--------------
- Penambahan field status pada webr_report sebagai filter pembayaran
2.2 2022-10-04
--------------
- Penambahan channel KASDA dan DANA
2.1 2022-09-02
--------------
- Memahami BPHTB JSON (Tangsel - PT POS)
- Memahami WEBR yang hanya punya tabel ISO8583 (Tangsel)
2.0 2022-08-02
--------------
- Perbedaan utama dari versi 0.x adalah kini berangkat dari tabel aslinya dan
bukan dari tabel ISO8583 karena sudah memperhatikan channel MANUAL (input
manual pembayaran)
- Memahami channel VA dan QRIS
- Menyimpan log file dari Cartenz ke tabel log_file
- Menerjemahkan log_file menjadi log_iso
- nip_pospbb optional
CREATE TABLE sync_ar_payment(
id serial primary key,
created timestamptz NOT NULL DEFAULT now(),
invoice_id integer NOT NULL,
payment_id integer NOT NULL)
CREATE OR REPLACE FUNCTION update_ar_payment() RETURNS TRIGGER
LANGUAGE plpgsql
AS
$$
BEGIN
INSERT INTO sync_ar_payment (invoice_id, payment_id) VALUES (NEW.ar_invoice_id, NEW.id);
RETURN NEW;
END
$$;
CREATE OR REPLACE FUNCTION delete_ar_payment() RETURNS TRIGGER
LANGUAGE plpgsql
AS
$$
BEGIN
INSERT INTO sync_ar_payment (invoice_id, payment_id) VALUES (OLD.ar_invoice_id, OLD.id);
RETURN OLD;
END
$$;
CREATE TRIGGER update_ar_payment
AFTER INSERT OR UPDATE
ON webr.ar_payment
FOR EACH ROW EXECUTE PROCEDURE update_ar_payment();
CREATE TRIGGER delete_ar_payment
AFTER DELETE
ON webr.ar_payment
FOR EACH ROW EXECUTE PROCEDURE delete_ar_payment();
......@@ -298,9 +298,9 @@ class BaseApp:
def create_data(self, pay): # Override, please
pass
def get_report(self, pay):
def get_report(self, source):
session = self.get_session_for_save()
q = session.query(self.report_orm).filter_by(id=pay.id)
q = session.query(self.report_orm).filter_by(id=source['id'])
return q.first()
def get_prefix_log(self):
......@@ -326,7 +326,7 @@ class BaseApp:
try:
source = self.create_data(pay)
d = plain_values(source)
rpt = self.get_report(pay)
rpt = self.get_report(source)
if rpt:
target = rpt.to_dict()
target_update, log_msg = update(source, target)
......
......@@ -8,6 +8,7 @@ from sqlalchemy import (
Time,
DateTime,
UniqueConstraint,
func,
)
from sqlalchemy.ext.declarative import declarative_base
......@@ -70,6 +71,17 @@ class Pad(Base, Common):
tgl_batal = Column(DateTime(timezone=True))
class SyncWebr(Base, Common):
__tablename__ = 'sync_ar_payment'
id = Column(Integer, primary_key=True)
created = Column(
DateTime(timezone=True), nullable=False, server_default=func.now())
# webr.ar_payment.id
payment_id = Column(Integer, nullable=False)
# webr.ar_payment.ar_invoice_id
invoice_id = Column(Integer, nullable=False)
class Webr(Base, Common):
__tablename__ = 'webr_report'
# webr.ar_payment.id
......@@ -98,6 +110,10 @@ class Webr(Base, Common):
channel_name = Column(String(32), nullable=False)
# webr.ar_payment.status
status = Column(Integer, nullable=False)
# webr.ar_invoice.departemen_kode
departemen_kode = Column(String(32), nullable=False)
# webr.ar_invoice.departement_nama
departemen_nama = Column(String(225), nullable=False)
# webr.ar_invoice.produk_nama
produk = Column(String(225), nullable=False)
tgl_batal = Column(DateTime(timezone=True))
......
from sqlalchemy import func
from sqlalchemy.exc import ProgrammingError
import transaction
from opensipkd.waktu import dmyhms
from opensipkd.waktu import dmyhms, as_timezone
from opensipkd.webr.models.default import (
Payment,
Invoice,
......@@ -13,6 +13,7 @@ from opensipkd.iso8583.bjb.webr.models import (
)
from ..models import (
Base,
SyncWebr,
Webr,
)
from ..common import (
......@@ -34,6 +35,12 @@ class App(BaseApp):
def __init__(self, argv):
super().__init__(argv)
self.base_q_sync = self.prod_session.query(SyncWebr)
try:
self.base_q_sync.first()
except ProgrammingError:
self.prod_session.rollback()
self.base_q_sync = None
self.base_q_pay = self.prod_session.query(Payment)
try:
self.base_q_pay.first()
......@@ -59,10 +66,19 @@ class App(BaseApp):
return q.first()
def create_data(self, pay): # Override
if self.base_q_sync:
return self.create_data_from_sync(pay)
if self.base_q_pay:
return self.create_data_from_prod(pay)
return self.create_data_from_h2h(pay)
def create_data_from_sync(self, sync):
q = self.base_q_pay.filter_by(id=sync.payment_id)
pay = q.first()
if pay:
return self.create_data_from_prod(pay)
return dict(id=pay.id, pokok=0, denda=0, jml_bayar=0)
def create_data_from_prod(self, pay):
q = self.base_q_inv.filter_by(id=pay.ar_invoice_id)
inv = q.first()
......@@ -75,13 +91,13 @@ class App(BaseApp):
channel_id = str(pay.channel_id)
channel_name = BIT_18_NAMES[channel_id]
else:
channel_kode = '0001'
channel_id = '0001'
if self.ntb_qris and \
pay.ntb == \
self.ntb_qris:
channel_name = 'QRIS'
else:
channel_kode = '0002'
channel_id = '0002'
if self.ntb_va and \
pay.ntb == \
self.ntb_va:
......@@ -98,7 +114,8 @@ class App(BaseApp):
nama_wp=inv.subjek_nama, pokok=inv.jumlah-inv.bunga,
denda=pay.bunga, jml_bayar=pay.bayar, channel_id=channel_id,
channel_name=channel_name, status=pay.status,
produk=inv.produk_nama)
produk=inv.produk_nama, departemen_kode=inv.departemen_kode,
departemen_nama=inv.departemen_nama)
def create_data_from_h2h(self, row):
self.invoice_id = row.bit_061.strip()
......@@ -113,10 +130,13 @@ class App(BaseApp):
channel_id=row.bit_018, channel_name=channel_name)
def get_last_time(self): # Override
return dmyhms(self.last_pay.created)
return dmyhms(as_timezone(self.last_pay.created))
def get_filter_query(self, q):
orm = self.base_q_pay and Payment or self.IsoLog
if self.base_q_sync:
orm = SyncWebr
else:
orm = self.base_q_pay and Payment or self.IsoLog
return q.filter(
orm.created >= self.tgl_awal,
orm.created < self.tgl_akhir + one_day)
......@@ -127,7 +147,10 @@ class App(BaseApp):
return q.scalar()
def get_payment_query(self): # Override
if self.base_q_pay:
if self.base_q_sync:
q = self.base_q_sync
orm = SyncWebr
elif self.base_q_pay:
q = self.base_q_pay
orm = Payment
else:
......
[build-system]
requires = ['setuptools >= 64']
[project]
name = 'payment-report'
version = '3.2.1'
dependencies = [
'opensipkd-iso8583-bjb @ git+https://git.opensipkd.com/sugiana/opensipkd-iso8583-bjb.git',
]
requires-python = '>= 3.9'
authors = [
{'name'='Owo Sugiana', 'email'='sugiana@gmail.com'},
]
description = 'Pembuat tabel laporan'
readme = 'README.rst'
license = {'text'='PostgreSQL License'}
classifiers = [
'Programming Language :: Python :: 3',
'Operating System :: OS Independent',
]
[project.scripts]
payment_report_init_db = 'payment_report.scripts.init_db:main'
payment_report = 'payment_report.scripts.sync:main'
payment_report_by_id = 'payment_report.scripts.sync_id:main'
pbb_log = 'payment_report.scripts.pbb_log:main'
log2iso_init_db = 'payment_report.scripts.log2iso_init:main'
log2iso = 'payment_report.scripts.log2iso:main'
log2iso_fortuna = 'payment_report.scripts.log2iso_fortuna:main'
log2db = 'payment_report.scripts.log2db:main'
log2db_ciamis = 'payment_report.scripts.log2db_ciamis:main'
log2db_fortuna = 'payment_report.scripts.log2db_fortuna:main'
import os
from setuptools import (
setup,
find_packages,
)
here = os.path.abspath(os.path.dirname(__file__))
with open(os.path.join(here, 'README.rst')) as f:
README = f.read()
with open(os.path.join(here, 'CHANGES.txt')) as f:
CHANGES = f.read()
line = CHANGES.splitlines()[0]
version = line.split()[0]
requires = [
'opensipkd-iso8583-bjb @ '
'git+https://git.opensipkd.com/sugiana/opensipkd-iso8583-bjb.git',
]
setup(
name='payment-report',
version=version,
description='Pembuat tabel laporan',
long_description=README + '\n\n' + CHANGES,
author='Owo Sugiana',
author_email='sugiana@gmail.com',
license='PostgreSQL License',
packages=find_packages(),
include_package_data=True,
install_requires=requires,
zip_safe=False,
entry_points={
'console_scripts': [
'payment_report_init_db = payment_report.scripts.init_db:main',
'payment_report = payment_report.scripts.sync:main',
'payment_report_by_id = payment_report.scripts.sync_id:main',
'pbb_log = payment_report.scripts.pbb_log:main',
'log2iso_init_db = payment_report.scripts.log2iso_init:main',
'log2iso = payment_report.scripts.log2iso:main',
'log2iso_fortuna = payment_report.scripts.log2iso_fortuna:main',
'log2db = payment_report.scripts.log2db:main',
'log2db_ciamis = payment_report.scripts.log2db_ciamis:main',
'log2db_fortuna = payment_report.scripts.log2db_fortuna:main',
],
}
)
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!