/** * Copyright (C) 2011 ArtiVisi Intermedia <info@artivisi.com> * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.artivisi.biller.simulator.service.impl; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.hibernate.SessionFactory; import org.joda.time.DateTime; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.StringUtils; import com.artivisi.biller.simulator.dto.GeneratorTagihanPascabayar; import com.artivisi.biller.simulator.entity.Bank; import com.artivisi.biller.simulator.entity.Pelanggan; import com.artivisi.biller.simulator.entity.PembayaranPascabayar; import com.artivisi.biller.simulator.entity.TagihanNontaglis; import com.artivisi.biller.simulator.entity.TagihanNontaglisDetail; import com.artivisi.biller.simulator.entity.TagihanPascabayar; import com.artivisi.biller.simulator.service.PlnSimulatorService; @Service("plnSimulatorService") @Transactional public class PlnSimulatorServiceImpl implements PlnSimulatorService { @Autowired private SessionFactory sessionFactory; @Override public void save(Pelanggan pelanggan) { sessionFactory.getCurrentSession().saveOrUpdate(pelanggan); } @Override public void delete(Pelanggan pelanggan) { if(pelanggan == null || !StringUtils.hasText(pelanggan.getId())) { return; } sessionFactory.getCurrentSession().createQuery("delete from PembayaranPascabayar p where p.tagihanPascabayar.id in (select t.id from TagihanPascabayar t where t.pelanggan.id = :pelanggan)") .setString("pelanggan", pelanggan.getId()) .executeUpdate(); sessionFactory.getCurrentSession().createQuery("delete from TagihanPascabayar t where t.pelanggan.id = :pelanggan") .setString("pelanggan", pelanggan.getId()) .executeUpdate(); sessionFactory.getCurrentSession().delete(pelanggan); } @Override public Pelanggan findPelangganById(String id) { if(!StringUtils.hasText(id)) return null; return (Pelanggan) sessionFactory.getCurrentSession().get(Pelanggan.class, id); } @SuppressWarnings("unchecked") @Override public List<Pelanggan> findAllPelanggan() { return sessionFactory.getCurrentSession().createQuery("from Pelanggan order by idpel, nama").list(); } @Override public Pelanggan findPelangganByIdpel(String idpel) { if(!StringUtils.hasText(idpel)) return null; return (Pelanggan) sessionFactory.getCurrentSession().createQuery("from Pelanggan where idpel = :idpel") .setString("idpel", idpel.trim()) .uniqueResult(); } @Override public Pelanggan findPelangganByMeterNumber(String meternum) { if(!StringUtils.hasText(meternum)) return null; return (Pelanggan) sessionFactory.getCurrentSession().createQuery("from Pelanggan where meterNumber = :meternum") .setString("meternum", meternum.trim()) .uniqueResult(); } @Override public void save(TagihanPascabayar tagihanPascabayar) { sessionFactory.getCurrentSession().saveOrUpdate(tagihanPascabayar); } @Override public void delete(TagihanPascabayar tagihanPascabayar) { if(tagihanPascabayar == null || !StringUtils.hasText(tagihanPascabayar.getId())) return; sessionFactory.getCurrentSession().createQuery("delete from PembayaranPascabayar p where p.tagihanPascabayar.id = :tagihan") .setString("tagihan", tagihanPascabayar.getId()) .executeUpdate(); sessionFactory.getCurrentSession().delete(tagihanPascabayar); } @Override public List<TagihanPascabayar> findTagihan(Pelanggan pelanggan) { if(pelanggan == null || !StringUtils.hasText(pelanggan.getId())) { return new ArrayList<TagihanPascabayar>(); } return findTagihan(pelanggan, false); } @SuppressWarnings("unchecked") private List<TagihanPascabayar> findTagihan(Pelanggan pelanggan, Boolean lunas) { return sessionFactory.getCurrentSession() .createQuery("from TagihanPascabayar t where t.pelanggan.id = :pelanggan and t.lunas = :lunas order by t.billPeriod") .setString("pelanggan", pelanggan.getId()) .setBoolean("lunas", lunas) .list(); } @SuppressWarnings("unchecked") private List<TagihanNontaglis> findTagihanNontaglis(Pelanggan pelanggan, Boolean lunas) { return sessionFactory.getCurrentSession() .createQuery("from TagihanPascabayar t where t.pelanggan.id = :pelanggan and t.lunas = :lunas order by t.billPeriod") .setString("pelanggan", pelanggan.getId()) .setBoolean("lunas", lunas) .list(); } @Override public void generatePascabayar(GeneratorTagihanPascabayar generator) { // hapus dulu data existing sessionFactory.getCurrentSession().createQuery("delete from PembayaranPascabayar").executeUpdate(); sessionFactory.getCurrentSession().createQuery("delete from TagihanPascabayar").executeUpdate(); sessionFactory.getCurrentSession().createQuery("delete from Pelanggan").executeUpdate(); // insert pelanggan normal Integer current = 0; for (int i=0; i<generator.getNormal(); i++){ generateTagihanNormal(current, i); current++; } } private void generateTagihanNormal(Integer current, int i) { Pelanggan p = new Pelanggan(); p.setNama("Pelang'gan Dumm\"y "+current); TagihanPascabayar t = new TagihanPascabayar(); t.setPelanggan(p); t.setBillPeriod(new Date()); t.setDueDate(new DateTime().dayOfMonth().setCopy(20).toDate()); t.setMeterReadDate(new DateTime().minusDays(10).toDate()); t.setBill(new BigDecimal(Math.random() * 100000).setScale(2, RoundingMode.HALF_EVEN)); t.setVat(t.getBill().divide(new BigDecimal(10))); Integer prev = Double.valueOf(Math.random() * 100).intValue(); Integer curr = prev + Double.valueOf(Math.random() * 10).intValue(); t.setPreviousMeterRead1(String.valueOf(prev)); t.setPreviousMeterRead2(String.valueOf(prev)); t.setPreviousMeterRead3(String.valueOf(prev)); t.setCurrentMeterRead1(String.valueOf(curr)); t.setCurrentMeterRead2(String.valueOf(curr)); t.setCurrentMeterRead3(String.valueOf(curr)); if(i%4==0){ p.setIdpel("51"+org.apache.commons.lang.StringUtils.leftPad(current.toString(), 10, "0")); p.setMeterNumber("51"+org.apache.commons.lang.StringUtils.leftPad(current.toString(), 9, "0")); p.setServiceUnit("51"); p.setServiceUnitPhone("51-1234567890"); p.setPowerConsumingCategory("900"); p.setSubscriberSegmentation("R1"); t.setInsentif(t.getBill().multiply(new BigDecimal(0.8))); }else if(i%3==0){ p.setIdpel("52"+org.apache.commons.lang.StringUtils.leftPad(current.toString(), 10, "0")); p.setMeterNumber("52"+org.apache.commons.lang.StringUtils.leftPad(current.toString(), 9, "0")); p.setServiceUnit("52"); p.setServiceUnitPhone("52-1234567890"); p.setPowerConsumingCategory("1300"); p.setSubscriberSegmentation("R2"); t.setInsentif(t.getBill().multiply(new BigDecimal(-0.8))); } else if(i%2==0){ p.setIdpel("53"+org.apache.commons.lang.StringUtils.leftPad(current.toString(), 10, "0")); p.setMeterNumber("53"+org.apache.commons.lang.StringUtils.leftPad(current.toString(), 9, "0")); p.setServiceUnit("53"); p.setServiceUnitPhone("53-1234567890"); p.setPowerConsumingCategory("2000"); p.setSubscriberSegmentation("S1"); } else { p.setIdpel("54"+org.apache.commons.lang.StringUtils.leftPad(current.toString(), 10, "0")); p.setMeterNumber("54"+org.apache.commons.lang.StringUtils.leftPad(current.toString(), 9, "0")); p.setServiceUnit("54"); p.setServiceUnitPhone("54-1234567890"); p.setPowerConsumingCategory("2500"); p.setSubscriberSegmentation("S2"); } sessionFactory.getCurrentSession().saveOrUpdate(p); sessionFactory.getCurrentSession().saveOrUpdate(t); } @Override public void save(PembayaranPascabayar pembayaranPascabayar) { if(pembayaranPascabayar.getTagihanPascabayar().getLunas()) { throw new IllegalStateException("Sudah Lunas"); } pembayaranPascabayar.getTagihanPascabayar().setLunas(true); sessionFactory.getCurrentSession().saveOrUpdate(pembayaranPascabayar.getTagihanPascabayar()); sessionFactory.getCurrentSession().saveOrUpdate(pembayaranPascabayar); } @Override public void delete(PembayaranPascabayar pembayaranPascabayar) { if(pembayaranPascabayar == null || !StringUtils.hasText(pembayaranPascabayar.getId())) return; sessionFactory.getCurrentSession().delete(pembayaranPascabayar); } @SuppressWarnings("unchecked") @Override public List<PembayaranPascabayar> findPembayaranPascabayar(Date tanggal,String switcher) { if(tanggal == null || !StringUtils.hasText(switcher)) return new ArrayList<PembayaranPascabayar>(); return sessionFactory.getCurrentSession() .createQuery("from PembayaranPascabayar p where p.tanggalTransaksi = :tanggal and p.switcher = :switcher order by p.waktuTransaksi") .setDate("tanggal", tanggal) .setString("switcher", switcher.trim()) .list(); } @Override public void save(TagihanNontaglis tagihanNontaglis) { sessionFactory.getCurrentSession().saveOrUpdate(tagihanNontaglis) ; } @Override public void delete(TagihanNontaglis tagihanNontaglis) { if(tagihanNontaglis == null || !StringUtils.hasText(tagihanNontaglis.getId())) return; sessionFactory.getCurrentSession().delete(tagihanNontaglis); } @Override public TagihanNontaglis findTagihanNontaglis(String regnum) { if(!StringUtils.hasText(regnum)) return null ; return (TagihanNontaglis) sessionFactory.getCurrentSession().createQuery("from TagihanNontaglis where registrationNumber = :regnum") .setString("regnum", regnum.trim()) .uniqueResult(); } @Override public void save(TagihanNontaglisDetail tagihanNontaglisDetail) { sessionFactory.getCurrentSession().saveOrUpdate(tagihanNontaglisDetail) ; } @Override public void delete(TagihanNontaglisDetail tagihanNontaglisDetail) { // TODO Auto-generated method stub } @Override public List<TagihanNontaglisDetail> findAllTagihanNontaglisDetail() { return sessionFactory .getCurrentSession() .createQuery("from TagihanNontaglisDetail") .list(); } }