customer.py 5.21 KB
from datetime import datetime
from sqlalchemy import (
    Column, Integer, DateTime, ForeignKey, UniqueConstraint, String,
    SmallInteger, Index, BigInteger, func, case
)
from sqlalchemy.orm import (relationship)

from . import PAD_TABLE_ARGS, DefaultModel, Base
from . import PjdlKecamatan, PjdlKelurahan, PjdlPejabat, DBSession


class WpMaster(DefaultModel):
    id = Column(BigInteger, primary_key=True)
    npwpd = Column(String(17))
    rp = Column(String(1))
    pb = Column(SmallInteger)
    formno = Column(Integer, nullable=False)
    reg_date = Column(DateTime)
    customernm = Column(String(50))
    kecamatan_id = Column(ForeignKey(PjdlKecamatan.id, onupdate='CASCADE'))
    kelurahan_id = Column(ForeignKey(PjdlKelurahan.id, onupdate='CASCADE'))
    kabupaten = Column(String(25))
    alamat = Column(String(255))
    kodepos = Column(String(5))
    telphone = Column(String(20))
    wpnama = Column(String(50))
    wpalamat = Column(String(255))
    wpkelurahan = Column(String(25))
    wpkecamatan = Column(String(25))
    wpkabupaten = Column(String(25))
    wptelp = Column(String(20))
    wpkodepos = Column(String(5))
    pnama = Column(String(50))
    palamat = Column(String(255))
    pkelurahan = Column(String(25))
    pkecamatan = Column(String(25))
    pkabupaten = Column(String(25))
    ptelp = Column(String(20))
    pkodepos = Column(String(5))
    enabled = Column(SmallInteger)
    create_date = Column(DateTime)
    create_uid = Column(Integer)
    write_date = Column(DateTime)
    write_uid = Column(Integer)

    nik = Column(String(20))
    wpnik = Column(String(20))
    pnik = Column(String(20))
    email = Column(String(50))


class PjdlWp(Base, WpMaster):
    __tablename__ = 'pad_customer'
    __table_args__ = (
        UniqueConstraint('rp', 'pb', 'formno', 'kecamatan_id', 'kelurahan_id'),
        Index('pad_customer_id_formno_customernm_idx',
              'id', 'formno', 'customernm'),
        PAD_TABLE_ARGS
    )
    parent = Column(BigInteger)
    kukuhno = Column(String(30))
    kukuhnip = Column(BigInteger)
    kukuhtgl = Column(DateTime)
    kukuh_jabat_id = Column(ForeignKey(PjdlPejabat.id, onupdate='CASCADE'))
    kukuhprinted = Column(SmallInteger)
    tmt = Column(DateTime)
    customer_status_id = Column(Integer)
    kembalitgl = Column(DateTime)
    kembalioleh = Column(String(30))
    kembalinip = Column(BigInteger)
    kartuprinted = Column(SmallInteger)
    penerimanm = Column(String(50))
    penerimaalamat = Column(String(50))
    penerimatgl = Column(DateTime)

    catatnip = Column(BigInteger)
    kirimtgl = Column(DateTime)
    batastgl = Column(DateTime)
    petugas_jabat_id = Column(Integer)
    pencatat_jabat_id = Column(Integer)
    user_id = Column(Integer)

    # tambahan atas permintaan Pak Bambang
    # wajib_pajak
    # no_identitas_wp = Column(String)
    # rt_wp = Column(String(3))
    # rw_wp = Column(String(3))

    # penanggung jawab
    # p_no_identitas = Column(String)
    # p_rt = Column(String(3))
    # p_rw = Column(String(3))

    kecamatan = relationship('PjdlKecamatan',
                             primaryjoin='PjdlWp.kecamatan_id == PjdlKecamatan.id',
                             backref='pad_customers')
    kelurahan = relationship('PjdlKelurahan',
                             primaryjoin='PjdlWp.kelurahan_id == PjdlKelurahan.id',
                             backref='pad_customers')
    pejabat = relationship('PjdlPejabat', primaryjoin='PjdlWp.kukuh_jabat_id == PjdlPejabat.id',
                           backref='pad_customers')

    @classmethod
    def query_form(cls, no):
        return cls.query().filter_by(formno=no)

    @classmethod
    def query_register(cls, order_field="customernm"):
        return cls.query_from(
            columns=[case([(cls.pb == 1, "P")], else_="B").label('P/B'),
                     cls.formno.label('form'),
                     func.concat(PjdlKecamatan.kecamatankd, '.',
                                 PjdlKelurahan.kelurahankd).label('wilayah'),
                     cls.customernm.label('Usaha'),
                     cls.wpnama.label('Pemilik'), cls.reg_date.label(
                'Registrasi'),
                PjdlKecamatan.kecamatannm.label('Kecamatan'),
                PjdlKelurahan.kelurahannm.label('Kelurahan'),
                cls.enabled.label('Status')]). \
            outerjoin(PjdlKecamatan, PjdlKecamatan.id == cls.kecamatan_id). \
            outerjoin(PjdlKelurahan, PjdlKelurahan.id == cls.kelurahan_id). \
            order_by(getattr(cls, order_field))

    @classmethod
    def get_draft_no(cls):
        result = DBSession.query(func.min(cls.formno)).scalar()
        result = result and result < 0 and result - 1 or -1
        return result

    @classmethod
    def get_form_no(cls):
        result = DBSession.query(func.max(cls.formno)).scalar()
        result = result and result > 0 and result + 1 or 1
        return result

    @classmethod
    def get_kukuh_no(cls):
        now = datetime.now()
        result = DBSession.query(func.max(cls.kukuhno)).scalar()
        if result:
            if result[len(result)-1] == str(now.year):
                return f"{result[0]+1}/{now.year}"
        return f"1/{now.year}"

    @classmethod
    def get_npwpd(self):
        npwpd = func.get_npwpd(self.id, True)
        return npwpd