Commit e0a9a6c9 by Owo Sugiana

Kali pertama

0 parents
build
dist
*egg-info
test-*.ini
0.1 2019-10-10
--------------
- Kali pertama
include *.txt *.rst *.py
recursive-include opensipkd *.py
Struktur Tabel Web Register
===========================
Web Register adalah istilah untuk pajak yang ditarik oleh pemerintah daerah. Ia
merupakan kelanjutan sistem Pendapatan Daerah Lainnya (PDL). Kecenderungannya
di retribusi.
Paket ini selain berisi struktur tabel juga memuat query yang kerap digunakan
untuk proses:
1. inquiry (cek tagihan)
2. payment (pembayaran)
3. reversal (pembatalan pembayaran)
Uji Coba
--------
Buat file ``test.ini`` seperti contoh berikut ini::
[main]
db_url = postgresql://sugiana:a@localhost/webr
persen_denda = 2
Sesuaikanlah pada ``db_url``. Kemudian dapatkan daftar tagihan::
$ env/bin/webr_available_invoice test.ini
Nanti akan tampil seperti ini #FIXME::
#1 10241 2019 36.72... ER*** Rp 1.465.200
#2 10356 2019 36.72... JU*** Rp 1.500.000
#3 10361 2019 36.72... MU*** Rp 1.500.000
Kolom kedua adalah Invoice ID atau sering disebut sebagai nomor bayar. Nomor
ini bekal untuk inquiry atau cek tagihan::
$ env/bin/webr_inquiry test.ini --invoice-id=10241
Untuk melanjutkan pembayaran tambahkan opsi ``--payment``::
$ env/bin/webr_inquiry test.ini --invoice-id=10241 --payment
Sedangkan untuk membatalkannya tambahkan opsi ``--reversal``::
$ env/bin/webr_inquiry test.ini --invoice-id=10241 --reversal
Selamat mencoba, semoga berhasil.
[main]
db_url = postgresql://username:password@localhost/database
persen_denda = 2
File mode changed
from sqlalchemy import (
Column,
DateTime,
Integer,
String,
Float,
Date,
Text,
ForeignKey,
UniqueConstraint,
)
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.sql.expression import text
Base = declarative_base()
class Departemen(Base):
__tablename__ = 'departemen'
id = Column(Integer, primary_key=True)
status = Column(Integer, nullable=False)
created = Column(DateTime)
updated = Column(DateTime)
create_uid = Column(Integer)
update_uid = Column(Integer)
kode = Column(String(32))
nama = Column(String(128))
parent_id = Column(Integer, ForeignKey('departemen.id'))
kategori = Column(String(32))
alamat = Column(String(255))
singkat = Column(String(32))
level_id = Column(Integer)
class Rekening(Base):
__tablename__ = 'rekening'
id = Column(Integer, primary_key=True)
created = Column(DateTime)
updated = Column(DateTime)
create_uid = Column(Integer)
update_uid = Column(Integer)
kode = Column(String(32))
nama = Column(String(128))
tahun = Column(Integer)
level_id = Column(Integer)
parent_id = Column(Integer, ForeignKey('rekening.id'))
status = Column(Integer)
defsign = Column(Integer)
__table_args__ = (
UniqueConstraint('kode', 'tahun'),)
class Produk(Base):
__tablename__ = 'produk'
id = Column(Integer, primary_key=True)
created = Column(DateTime)
updated = Column(DateTime)
create_uid = Column(Integer)
update_uid = Column(Integer)
kode = Column(String(32), unique=True)
nama = Column(String(128))
status = Column(Integer)
harga = Column(Float, nullable=False)
tarif = Column(Float, nullable=False)
no_urut = Column(Integer)
denda_id = Column(Integer)
produk_denda_id = Column(Integer)
rekening_id = Column(Integer, ForeignKey(Rekening.id))
__table_args__ = (
UniqueConstraint('rekening_id', 'no_urut'),
dict(schema='webr'))
class Subjek(Base):
__tablename__ = 'subjek'
id = Column(Integer, primary_key=True)
created = Column(DateTime)
updated = Column(DateTime)
create_uid = Column(Integer)
update_uid = Column(Integer)
kode = Column(String(32), unique=True)
nama = Column(String(128))
status = Column(Integer)
no_urut = Column(Integer)
alamat_1 = Column(String(128))
alamat_2 = Column(String(128))
kelurahan = Column(String(128))
kecamatan = Column(String(128))
kota = Column(String(128))
provinsi = Column(String(128))
email = Column(String(40))
phone = Column(String(16))
fax = Column(String(16))
mobile = Column(String(16))
website = Column(String(64))
is_vendor = Column(Integer)
is_customer = Column(Integer)
bank = Column(String(16))
bank_accnt = Column(String(16))
pic = Column(String(16))
pic_mobile = Column(String(16))
pic_email = Column(String(16))
pic_jabatan = Column(String(16))
user_id = Column(Integer, ForeignKey('users.id'))
departemen_id = Column(Integer, ForeignKey(Departemen.id))
jenis_id = Column(Integer)
__table_args__ = (
dict(schema='webr'),)
class Kecamatan(Base):
__tablename__ = 'kecamatan'
id = Column(Integer, primary_key=True)
created = Column(DateTime)
updated = Column(DateTime)
create_uid = Column(Integer)
update_uid = Column(Integer)
kode = Column(String(32), unique=True)
nama = Column(String(128))
status = Column(Integer)
__table_args__ = (
dict(schema='webr'),)
class Kelurahan(Base):
__tablename__ = 'kelurahan'
id = Column(Integer, primary_key=True)
created = Column(DateTime)
updated = Column(DateTime)
create_uid = Column(Integer)
update_uid = Column(Integer)
kode = Column(String(32))
nama = Column(String(128))
status = Column(Integer)
kecamatan_id = Column(Integer, ForeignKey(Kecamatan.id))
__table_args__ = (
UniqueConstraint('kode', 'kecamatan_id'),
dict(schema='webr'))
class Tarif(Base):
__tablename__ = 'produk_tarif'
status = Column(Integer, nullable=False)
created = Column(DateTime)
updated = Column(DateTime)
create_uid = Column(Integer)
update_uid = Column(Integer)
kode = Column(String(32))
id = Column(Integer, primary_key=True)
produk_id = Column(Integer, ForeignKey(Produk.id))
rekening_id = Column(Integer, ForeignKey(Rekening.id))
posisi = Column(Integer)
tarif = Column(Float)
satuan_tarif = Column(String(128))
tarif2 = Column(Float)
satuan_tarif2 = Column(String(128))
dasar_hukum = Column(String(128))
nama_lokasi_tarif = Column(String(128))
__table_args__ = (
dict(schema='webr'),)
class Pegawai(Base):
__tablename__ = 'pegawai'
id = Column(Integer, primary_key=True)
kode = Column(String(32))
status = Column(Integer, nullable=False)
created = Column(DateTime)
updated = Column(DateTime)
create_uid = Column(Integer)
update_uid = Column(Integer)
nama = Column(String(128))
alamat = Column(String(255))
nik = Column(String(18))
email = Column(String(64))
phone = Column(String(16))
fax = Column(String(16))
mobile = Column(String(16))
website = Column(String(64))
class Objek(Base):
__tablename__ = 'objek'
id = Column(Integer, primary_key=True)
created = Column(DateTime)
updated = Column(DateTime)
create_uid = Column(Integer)
update_uid = Column(Integer)
kode = Column(String(32), unique=True)
nama = Column(String(128))
departemen_id = Column(Integer, ForeignKey(Departemen.id))
produk_id = Column(Integer, ForeignKey(Produk.id))
no_urut = Column(Integer)
status = Column(Integer)
jenis = Column(Integer)
alamat_1 = Column(String(128))
alamat_2 = Column(String(128))
tarif = Column(Float)
luas_tanah = Column(Float)
subjek_id = Column(Integer, ForeignKey(Subjek.id))
produk_tarif_id = Column(Integer, ForeignKey(Tarif.id))
produk_item_id = Column(Integer, ForeignKey('webr.produk_item.id'))
kecamatan_id = Column(Integer, ForeignKey(Kecamatan.id))
kelurahan_id = Column(Integer, ForeignKey(Kelurahan.id))
jns_objek = Column(Integer)
jenis_pemakaian_id = Column(Integer, ForeignKey('webr.jenis_pemakaian.id'))
luas_tanah_pemakaian = Column(Float)
njop_tanah = Column(Float)
luas_bangunan = Column(Float)
harga_satuan = Column(Float)
nilai_satuan = Column(Float)
panjang = Column(Float)
lebar = Column(Float)
tinggi = Column(Float)
lama_pengenaan = Column(Integer)
satuan_pengenaan = Column(String(128))
rekening_id = Column(Integer, ForeignKey(Rekening.id))
nama_kegiatan = Column(String(128))
kode_kegiatan = Column(String(128))
__table_args__ = (
UniqueConstraint('departemen_id', 'produk_id', 'no_urut'),
dict(schema='webr'))
class Invoice(Base):
__tablename__ = 'ar_invoice'
id = Column(Integer, primary_key=True)
created = Column(DateTime)
updated = Column(DateTime)
create_uid = Column(Integer)
update_uid = Column(Integer)
kode = Column(String(32), unique=True)
no_urut = Column(Integer)
tahun = Column(Integer)
departemen_id = Column(Integer, ForeignKey(Departemen.id))
departemen_kode = Column(String(32))
departemen_nama = Column(String(128))
objek_id = Column(Integer, ForeignKey(Objek.id))
objek_kode = Column(String(32))
objek_nama = Column(String(128))
objek_alamat_1 = Column(String(128))
objek_alamat_2 = Column(String(128))
produk_id = Column(Integer, ForeignKey(Produk.id))
produk_kode = Column(String(32))
produk_nama = Column(String(128))
rekening_id = Column(Integer, ForeignKey(Rekening.id))
rekening_kode = Column(String(32))
rekening_nama = Column(String(128))
pejabat_id = Column(Integer, ForeignKey(Pegawai.id))
pejabat_nm = Column(String(128))
subjek_id = Column(Integer, ForeignKey(Subjek.id))
subjek_kode = Column(String(32))
subjek_nama = Column(String(64))
subjek_alamat_1 = Column(String(128))
subjek_alamat_2 = Column(String(128))
dasar = Column(Integer, nullable=False)
tarif = Column(Float)
pokok = Column(Integer, nullable=False)
pengurang = Column(Integer, nullable=False)
penambah = Column(Integer, nullable=False)
setoran = Column(Integer, nullable=False)
terutang = Column(Integer, nullable=False)
denda = Column(Integer, nullable=False)
bunga = Column(Integer, nullable=False)
jumlah = Column(Integer, nullable=False)
jml_angsuran = Column(Integer, nullable=False)
catatan = Column(String(500))
nama_lain = Column(String(30))
jenis_penerimaan = Column(Integer, nullable=False)
jenis = Column(Integer)
no_skrd = Column(String(64))
tgl_skrd = Column(Date)
no_strd = Column(String(64))
tgl_strd = Column(Date)
pejabat_strd_id = Column(Integer)
pejabat_strd_nm = Column(Text)
bank_strd_id = Column(Integer)
posted_strd = Column(Integer, nullable=False)
periode_strd = Column(String(128))
no_urut_strd = Column(Integer)
periode_1 = Column(Date)
periode_2 = Column(Date)
periode = Column(String(128))
tgl_terima = Column(Date)
jatuh_tempo = Column(Date)
penyetor_id = Column(Integer)
bank_id = Column(Integer)
penyetor_kode = Column(String(32))
penyetor_nama = Column(String(128))
status = Column(Integer, nullable=False)
__table_args__ = (
UniqueConstraint('tahun', 'departemen_id', 'no_urut'),
dict(schema='webr'))
class Payment(Base):
__tablename__ = 'ar_payment'
id = Column(Integer, primary_key=True)
status = Column(Integer, nullable=False)
created = Column(DateTime)
updated = Column(DateTime)
kode = Column(String(32), unique=True)
tahun = Column(Integer)
departemen_id = Column(Integer, ForeignKey(Departemen.id))
no_urut = Column(Integer)
ar_invoice_id = Column(Integer, ForeignKey(Invoice.id))
pembayaran_ke = Column(Integer)
bunga = Column(Integer, nullable=False)
bayar = Column(Integer, nullable=False)
tgl_bayar = Column(DateTime(timezone=True))
jatuh_tempo = Column(DateTime)
create_uid = Column(Integer)
update_uid = Column(Integer)
create_date = Column(DateTime(timezone=True))
update_date = Column(DateTime(timezone=True))
posted = Column(Integer, nullable=False, server_default=text('0'))
ntb = Column(String(20))
bank_id = Column(Integer)
channel_id = Column(Integer)
__table_args__ = (
UniqueConstraint('tahun', 'departemen_id', 'no_urut'),
dict(schema='webr'))
import sys
from configparser import ConfigParser
from argparse import ArgumentParser
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
default_count = 10
help_count = f'default {default_count}'
def get_option(argv):
pars = ArgumentParser()
pars.add_argument('conf')
pars.add_argument('--tahun', type=int)
pars.add_argument('--jatuh-tempo-min')
pars.add_argument('--jatuh-tempo-max')
pars.add_argument('--nominal-min', type=int)
pars.add_argument('--nominal-max', type=int)
pars.add_argument(
'--count', type=int, default=default_count, help=help_count)
return pars.parse_args(argv)
def main(argv=sys.argv):
option = get_option(argv[1:])
conf = ConfigParser()
conf.read(option.conf)
module_name = 'services'
module = __import__('opensipkd.webr.' + module_name)
services = getattr(module.webr, module_name)
AvailableInvoice = services.AvailableInvoice
db_url = conf.get('main', 'db_url')
persen_denda = conf.getfloat('main', 'persen_denda')
engine = create_engine(db_url)
session_factory = sessionmaker(bind=engine)
module.webr.services.DBSession = session_factory()
a = AvailableInvoice(persen_denda, option)
a.show()
import sys
from datetime import (
datetime,
date,
)
from configparser import ConfigParser
from argparse import ArgumentParser
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
import transaction
from zope.sqlalchemy import register
from opensipkd.string.money import thousand
ERR_PAYMENT_NOT_FOUND = 'Pembayaran tidak ditemukan, '\
'tidak ada yang perlu dibatalkan.'
def show_val(label, value):
if value is None:
value = ''
print('{}: {}'.format(label, value))
def show_rp(label, value):
show_val(label, 'Rp {}'.format(thousand(value)))
def show_field(t, fieldname):
label = f'Field {t.__tablename__}.{fieldname}'
try:
value = getattr(t, fieldname)
except AttributeError:
return
if isinstance(value, float):
show_rp(label, value)
else:
show_val(label, value)
def get_option(argv):
kini = date.today()
kini = kini.strftime('%d-%m-%Y')
help_tgl_bayar = f'default {kini}'
pars = ArgumentParser()
pars.add_argument('conf')
pars.add_argument('--invoice-id')
pars.add_argument('--payment', action='store_true')
pars.add_argument('--reversal', action='store_true')
pars.add_argument('--tgl-bayar', help=help_tgl_bayar, default=kini)
return pars.parse_args(argv)
def show(inq):
show_val('Nama Penyetor', inq.get_nama())
show_val('Alamat 1', inq.get_alamat_1())
show_val('Alamat 2', inq.get_alamat_2())
show_val('Kode Rekening', inq.get_kode_rekening())
show_val('Nama Rekening', inq.get_nama_rekening())
show_val('Kode SKPD', inq.get_kode_departemen())
show_val('Nama SKPD', inq.get_nama_departemen())
show_rp('Tagihan Pokok', inq.tagihan)
show_rp('Denda', inq.denda)
show_rp('Total Tagihan', inq.total)
show_field(inq.invoice, 'status')
if inq.total_bayar:
pay = inq.get_payment()
show_field(pay, 'tgl_bayar')
show_field(pay, 'id')
def show_pkey_values(row):
print('Primary key tabel {}:'.format(row.__table__.name))
for c in row.__table__.columns:
if c.primary_key:
val = getattr(row, c.name)
show_val(' '+c.name, val)
def read_list_conf(conf, name):
return conf.has_option('main', name) and \
conf.get('main', name).split() or []
def error(s):
print(s)
sys.exit()
def date_from_str(s):
d, m, y = s.split('-')
return date(int(y), int(m), int(d))
def get_conf(conf_file):
conf = ConfigParser()
conf.read(conf_file)
return conf
def main(argv=sys.argv[1:]):
option = get_option(argv)
invoice_id = option.invoice_id
tgl_bayar = date_from_str(option.tgl_bayar)
conf = get_conf(option.conf)
module_name = 'services'
db_url = conf.get('main', 'db_url')
engine = create_engine(db_url)
module = __import__('opensipkd.webr.' + module_name)
services = getattr(module.webr, module_name)
session_factory = sessionmaker(bind=engine)
module.webr.services.DBSession = db_session = session_factory()
register(module.webr.services.DBSession)
inq = services.Inquiry(
invoice_id, conf.getfloat('main', 'persen_denda'), tgl_bayar)
if not inq.invoice:
error(f'Invoice ID {invoice_id} tidak ada.')
show(inq)
if option.payment:
if not inq.total:
error('Tidak ada tagihan, tidak ada yang perlu dibayar.')
ntb = datetime.now().strftime('%y%m%d%H%M%S')
with transaction.manager:
pay = inq.do_payment(ntb)
show_pkey_values(pay)
show_field(pay, 'status')
show_field(pay, 'posted')
print('Berhasil dibayar')
if option.reversal:
rev = services.Reversal(invoice_id)
if rev.is_available():
error('Memang belum dibayar')
pay = rev.payment
if not pay:
error(ERR_PAYMENT_NOT_FOUND)
with transaction.manager:
rev.do_reversal()
show_pkey_values(pay)
show_field(pay, 'is_valid')
print('Berhasil dibatalkan')
from time import time
from datetime import (
date,
datetime,
)
from sqlalchemy.sql import func
from opensipkd.hitung import (
hitung_denda,
round_up,
)
from opensipkd.string.money import thousand
from opensipkd.string.transaction_id import TransactionID
from .models import (
Invoice,
Payment,
)
DBSession = None
def get_db_session():
return DBSession
def date_from_str(s):
d, m, y = [int(x) for x in s.split('-')]
return date(y, m, d)
# Nomor Transaksi Pemda
class NTP(TransactionID):
def is_found(self, tid):
DBSession = get_db_session()
q = DBSession.query(Payment).filter_by(kode=tid)
return q.first()
class Inquiry:
def __init__(self, invoice_id, persen_denda=2, tgl_bayar=None):
self.invoice_id = invoice_id
self.persen_denda = persen_denda
self.tgl_bayar = tgl_bayar or date.today()
DBSession = get_db_session()
q = DBSession.query(Invoice).filter_by(kode=invoice_id)
self.invoice = q.first()
if self.invoice:
self.hitung()
def get_payment(self):
DBSession = get_db_session()
q = DBSession.query(Payment).filter_by(ar_invoice_id=self.invoice.id)
q = q.filter(Payment.bayar > 0)
q = q.order_by(Payment.pembayaran_ke.desc())
return q.first()
def get_total_payment(self):
DBSession = get_db_session()
q = DBSession.query(
func.sum(Payment.bayar).label('jml'))
q = q.filter_by(ar_invoice_id=self.invoice.id)
pay = q.first()
return pay and pay.jml or 0
def hitung(self):
bunga = self.invoice.bunga or 0
bunga = round_up(bunga)
self.tagihan = self.invoice.jumlah - bunga
self.tagihan = round_up(self.tagihan)
bln, denda_waktu = hitung_denda(
self.tagihan, self.invoice.jatuh_tempo, self.persen_denda,
self.tgl_bayar)
self.denda = denda_waktu + bunga
self.denda = round_up(self.denda)
self.total = self.tagihan + self.denda
self.total_bayar = self.get_total_payment()
if self.total_bayar > 0:
self.total -= self.total_bayar
if self.total < 0:
self.total = 0
def is_available(self):
return self.invoice.status == 0
def get_nama(self):
return self.invoice.subjek_nama
def get_alamat_1(self):
return self.invoice.objek_alamat_1
def get_alamat_2(self):
return self.invoice.objek_alamat_2
def get_kode_rekening(self):
return self.invoice.rekening_kode
def get_nama_rekening(self):
return self.invoice.rekening_nama
def get_kode_departemen(self):
return self.invoice.departemen_kode
def get_nama_departemen(self):
return self.invoice.departemen_nama
def get_no_urut(self):
DBSession = get_db_session()
q = DBSession.query(Payment).filter_by(
tahun=self.invoice.tahun,
departemen_id=self.invoice.departemen_id)
q = q.order_by(Payment.no_urut.desc())
row = q.first()
if row:
return row.no_urut + 1
return 1
def get_pembayaran_ke(self):
DBSession = get_db_session()
q = DBSession.query(Payment).filter_by(ar_invoice_id=self.invoice.id)
q = q.order_by(Payment.pembayaran_ke.desc())
row = q.first()
if row:
return row.pembayaran_ke + 1
return 1
def do_payment(self, ntb, bank_id=None, channel_id=None):
DBSession = get_db_session()
ntp_generator = NTP()
ntp = ntp_generator.create()
no_urut = self.get_no_urut()
pembayaran_ke = self.get_pembayaran_ke()
created = datetime.now()
pay = Payment(
kode=ntp,
status=1,
created=created,
updated=created,
create_date=created,
update_date=created,
tgl_bayar=self.tgl_bayar,
tahun=self.invoice.tahun,
departemen_id=self.invoice.departemen_id,
no_urut=no_urut,
ar_invoice_id=self.invoice.id,
pembayaran_ke=pembayaran_ke,
bayar=self.total,
bunga=self.denda,
jatuh_tempo=self.invoice.jatuh_tempo,
ntb=ntb,
bank_id=bank_id,
channel_id=channel_id)
DBSession.add(pay)
self.invoice.status = 1
DBSession.add(self.invoice)
DBSession.flush()
return pay
class Reversal(Inquiry):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
if self.invoice:
self.payment = self.get_payment()
def do_reversal(self):
DBSession = get_db_session()
self.invoice.status = 0
DBSession.add(self.invoice)
if self.payment:
self.payment.bayar = 0
DBSession.add(self.payment)
class AvailableInvoice:
def __init__(self, persen_denda=2, option=None):
self.option = option
self.persen_denda = persen_denda
def show(self):
offset = -1
count = 0
max_count_length = len(str(self.option.count))
q = self.get_query()
awal = time()
while True:
if time() - awal > 10:
break
offset += 1
row = q.offset(offset).first()
if not row:
break
msg = self.get_message(row)
if not msg:
continue
count += 1
no = str(count).zfill(max_count_length)
msg = f'#{no}/{self.option.count} {msg}'
print(msg)
if count == self.option.count:
break
def get_query(self):
DBSession = get_db_session()
q = DBSession.query(Invoice).filter_by(status=0)
q = self.get_filter_tahun(q)
q = self.get_filter_nominal(q)
q = self.get_filter_jatuh_tempo(q)
return q
def get_filter_tahun(self, q):
if self.option.tahun:
q = q.filter_by(tahun=self.option.tahun)
return q
def get_filter_nominal(self, q):
if self.option.nominal_min:
q = q.filter(
Invoice.jumlah - Invoice.bunga >=
self.option.nominal_min)
if self.option.nominal_max:
q = q.filter(
Invoice.jumlah - Invoice.bunga <=
self.option.nominal_max)
return q
def get_filter_jatuh_tempo(self, q):
if self.option.jatuh_tempo_min:
tgl = date_from_str(self.option.jatuh_tempo_min)
q = q.filter(Invoice.jatuh_tempo >= tgl)
if self.option.jatuh_tempo_max:
tgl = date_from_str(self.option.jatuh_tempo_max)
q = q.filter(Invoice.jatuh_tempo <= tgl)
return q
def get_message(self, row):
inq = Inquiry(row.kode, persen_denda=self.persen_denda)
if not inq.total:
return
total = thousand(inq.total)
tagihan = thousand(inq.tagihan)
denda = thousand(inq.denda)
s = f'{row.kode} Tagihan Rp {tagihan} + Denda Rp {denda} = Rp {total}'
jatuh_tempo = inq.invoice.jatuh_tempo
if jatuh_tempo:
jatuh_tempo = jatuh_tempo.strftime('%d-%m-%Y')
s = f'{s} jatuh tempo {jatuh_tempo}'
return s
import os
import setuptools
with open('README.rst') as f:
long_description = f.read()
with open('CHANGES.txt') as f:
CHANGES = f.read()
line = CHANGES.splitlines()[0]
version = line.split()[0]
requires = [
'sqlalchemy',
'opensipkd-base @ git+https://git.opensipkd.com/sugiana/opensipkd-base',
]
setuptools.setup(
name='opensipkd-webr-models',
version=version,
author='Owo Sugiana',
author_email='sugiana@gmail.com',
description='Struktur tabel Web Register',
long_description=long_description,
long_description_content_type='text/markdown',
license='PostgreSQL License',
install_requires=requires,
packages=setuptools.find_packages(),
classifiers=[
'Programming Language :: Python :: 3',
'Operating System :: OS Independent',
],
entry_points={
'console_scripts': [
'webr_available_invoice = '
'opensipkd.webr.scripts.available_invoice:main',
'webr_inquiry = opensipkd.webr.scripts.inquiry:main',
]
},
)
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!