bandung_kab.py 3.62 KB
from datetime import (
    datetime,
    time,
    )
import requests
import transaction
from payment_report.scripts.tools import (
    plain_values,
    update,
    )
from payment_report.scripts.common import InvalidSource


def get_data(base_url, username, password, tgl_awal, tgl_akhir):
    awal = tgl_awal.strftime('%Y-%m-%d')
    akhir = tgl_akhir.strftime('%Y-%m-%d')
    url = base_url + f'?tgl_awal={awal}&tgl_akhir={akhir}'
    print(url)
    session = requests.Session()
    session.auth = (username, password)
    r = session.get(url)
    if r.status_code != 200:
        raise InvalidSource(f'HTTP Response Code = {r.status_code}')
    r = r.json()
    return r['data']


class Handler:
    def __init__(self, parent):
        self.parent = parent

    def get_data(self):
        return get_data(
                self.parent.conf['api_url'], self.parent.conf['api_user'],
                self.parent.conf['api_pass'], self.parent.tgl_awal,
                self.parent.tgl_akhir)

    def get_count(self):  # dipanggil parent
        self.data = self.get_data()
        return len(self.data)

    def get_report(self, pay):
        session = self.parent.get_session_for_save()
        q = session.query(self.parent.report_orm).filter_by(
                nomor_bayar=pay['nomor_bayar'])
        return q.first()

    def create_data(self, pay):
        print(pay)
        tgl = datetime.strptime(pay['tanggal'], '%Y-%m-%d')
        tgl = tgl.date()
        if pay['jam']:
            jam = datetime.strptime(pay['jam'], '%H:%M:%S')
            jam = jam.time()
        else:
            jam = time(0, 0, 0)
        channel_id = pay['kode_channel'] or '0000'
        return dict(
            tgl=tgl, jam=jam, nomor_bayar=pay['nomor_bayar'],
            jenis_pajak=pay['nama_pajak'], masa_pajak=0,
            npwpd=pay['npwpd'], nama_wp=pay['nama_wp'],
            pokok=float(pay['pokok']), denda=float(pay['denda']), bunga=0,
            jml_bayar=float(pay['jumlah']), channel_id=channel_id,
            channel_name=pay['nama_channel'], bank_id=110)

    def update_from_date(self):
        no = 0
        for pay in self.data:
            self.parent.invoice_id = pay['nomor_bayar']
            no += 1
            try:
                source = self.create_data(pay)
                d = plain_values(source)
                rpt = self.get_report(pay)
                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.parent.count == 1 and self.last:  # Hemat log
                            print(msg)
                            print('Log yang sama, abaikan.')
                            return
                else:
                    msg = f'INSERT {d}'
                    rpt = self.parent.report_orm(**source)
                msg = f'{self.parent.get_prefix_log()} {msg}'
                log_method = self.parent.log.info
            except InvalidSource as e:
                msg = str(e)
                log_method = self.parent.log.warning
                rpt = None
            e = self.parent.get_estimate(no)
            log_method(f'#{no}/{self.parent.count} {msg}, estimate {e}')
            if rpt:
                session = self.parent.get_session_for_save()
                with transaction.manager:
                    session.add(rpt)
            self.last_pay = pay