Public
Snippet $99 authored by Owo Sugiana

Class AsetPerolehanItem posting() & unposting()

Edited
aset_perolehan_item_posting.py
import logging
from opensipkd.aset.pemda.models import (
    AsetDBSession,
    AsetPerolehanItem,
    AsetKib,
    )
from opensipkd.aset.pemda.models.hitung import hitung


class BaseError(Exception):
    def __init__(self, message):
        self.message = message


def unposting(perolehan, from_posting=False):
    q = AsetKib.query().filter_by(perolehan_item_id=perolehan.id)
    for r in q: 
        q_at = AsetTetap.query().filter_by(kib_id=r.id)
        if q_at.first():
            raise BaseError(f'Data Penetapan ID {r.id} masih ada')
    q.delete()
    if not from_posting:
        perolehan.status = 0
        AsetDBSession.add(perolehan)
        AsetDBSession.flush()


def posting(perolehan):
    unposting(perolehan, True)
    nilai_perolehan = perolehan.biaya_umum + perolehan.harga
    harga = round(nilai_perolehan / perolehan.jumlah, 0)
    selisih = int(nilai_perolehan - harga * perolehan.jumlah)
    log = logging.getLogger('posting.py')
    for x in range(perolehan.jumlah):
        values = perolehan.to_dict()
        del values['id']
        del values['kd_rekening']
        del values['no_bast']
        if 'no_dpa' in values:
            del values['no_dpa']
        values['perolehan_item_id'] = perolehan.id
        values['jumlah'] = 1
        values['status'] = 1
        if selisih > 0:
            values['harga'] = harga + 1
            selisih -= 1
        elif selisih < 0:
            values['harga'] = harga - 1
            selisih += 1
        else:
            values['harga'] = harga
        values['no_register'] = AsetKib.get_no_register(
                perolehan.tahun, perolehan.departemen_id,
                perolehan.kategori_id) + 1
        kib = AsetKib(**values)
        AsetDBSession.add(kib)
        AsetDBSession.flush()
        no = x + 1
        log.debug(f'Perolehan ID {perolehan.id}, KIB #{no}/{perolehan.jumlah}, '
                    f'ID {kib.id} {kib.to_dict()}')
        hitung(kib, kib.th_beli)
    q = AsetPerolehanItem.query_id(perolehan.id)
    p = q.first()
    p.status = 1
    AsetDBSession.add(p)
    AsetDBSession.flush()