cartenz_api.py 4.34 KB
from datetime import (
    date,
    datetime,
    timedelta,
    )
from time import time
import requests
from logging import getLogger
from opensipkd.string import FixLength
from sismiop.services.base import NOP
import transaction
from ..models import Pbb
from ..common import BaseApp
from ..tools import (
    plain_values,
    update,
    )


one_day = timedelta(1)


def create_data(d):
    nop = FixLength(NOP)
    nop.set_raw(d['nop'])
    tgl = ' '.join([d['tanggal_tx'], d['jam_tx']])
    tgl = datetime.strptime(tgl, '%Y-%m-%d %H:%M:%S')
    if d['channel_pembayaran'].find('BANK JABAR') > -1:
        bank_id = '110'
    else:
        bank_id = None
    return dict(
        kd_propinsi=nop['Propinsi'], kd_dati2=nop['Kabupaten'],
        kd_kecamatan=nop['Kecamatan'], kd_kelurahan=nop['Kelurahan'],
        kd_blok=nop['Blok'], no_urut=nop['Urut'],
        kd_jns_op=nop['Jenis'], thn_pajak_sppt=d['tahun'],
        pembayaran_sppt_ke=1,
        jml_sppt_yg_dibayar=int(d['total']), denda_sppt=int(d['denda']),
        discount=int(d['potongan']), tgl_pembayaran_sppt=tgl.date(),
        tgl_rekam_byr_sppt=tgl, nm_wp_sppt=d['nama_wp'], channel_kode='0000',
        channel_nama='LAINNYA', bank_id=bank_id,
        pbb_yg_harus_dibayar_sppt=int(d['pokok_pajak']))


class App(BaseApp):
    report_orm = Pbb
    conf_name = 'pbb api last date'

    def get_report(self, d):
        session = self.get_session_for_save()
        q = session.query(self.report_orm).filter_by(
                kd_propinsi=d['kd_propinsi'], kd_dati2=d['kd_dati2'],
                kd_kecamatan=d['kd_kecamatan'], kd_kelurahan=d['kd_kelurahan'],
                kd_blok=d['kd_blok'], no_urut=d['no_urut'],
                kd_jns_op=d['kd_jns_op'], thn_pajak_sppt=d['thn_pajak_sppt'],
                pembayaran_sppt_ke=d['pembayaran_sppt_ke'])
        return q.first()

    def do_sync(self, tgl):
        d = dict(tanggal=tgl.strftime('%Y-%m-%d'))
        r = requests.post(self.conf['url'], json=d)
        if r.status_code != 200:
            print('HTTP Error', r.status_code)
            print(r.text)
            return
        log = getLogger('do_sync()')
        d = r.json()
        no = 0
        self.count = len(d['transaksi'])
        self.last_pay = None
        for trx in d['transaksi']:
            self.invoice_id = ''.join([trx['nop'], trx['tahun']])
            no += 1
            source = create_data(trx)
            d = plain_values(source)
            rpt = self.get_report(source)
            if rpt:
                target = rpt.to_dict()
                target_update, log_msg = update(source, target)
                if target_update:
                    s = ', '.join(log_msg)
                    msg = f'UPDATE {d} change {s}'
                    rpt.from_dict(target_update)
                else:
                    msg = f'ALREADY SAME {d}'
                    rpt = None
                    if self.count == 1 and self.last:  # Hemat log
                        print(msg)
                        print('Log yang sama, abaikan.')
                        return
            else:
                msg = f'INSERT {d}'
                rpt = self.report_orm(**source)
            e = self.get_estimate(no)
            prefix = self.get_prefix_log()
            log.info(f'#{no}/{self.count} {prefix} {msg}, estimate {e}')
            if rpt:
                session = self.get_session_for_save()
                with transaction.manager:
                    session.add(rpt)
            self.last_pay = source
        return self.count

    def get_last_time(self):  # Override
        return self.last_pay['tgl_pembayaran_sppt'].strftime('%d-%m-%Y')

    def prepare_query_filter(self):
        if 'tgl_awal' in self.conf:
            self.last = None
            self.tgl_awal = self.conf['tgl_awal']
        else:
            self.last = self.get_last_id(self.conf_name)
            self.tgl_awal = self.last.as_date()
        if 'tgl_akhir' in self.conf:
            self.tgl_akhir = self.conf['tgl_akhir']
        else:
            self.tgl_akhir = date.today()

    def run(self):  # dipanggil sync.py
        self.prepare_query_filter()
        tgl = self.tgl_awal
        while True:
            tgl += one_day
            self.start_time = time()
            self.do_sync(tgl)
            if self.last_pay and self.last:
                self.update_last()
            if tgl > self.tgl_akhir:
                break