package sikd.sikd5.sikd5ejb.session;
/**
*@oleh    : agus
*@tanggal : Apr 8, 2019
*/

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.Remote;
import javax.ejb.Stateless;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.log4j.Logger;

import sikd.sikd5.sikd5bean.fault.SIKDServiceException;
import sikd.sikd5.sikd5bean.tabel.transaksi.Headerapbdskpd;
import sikd.sikd5.sikd5bean.util.SIKDUtil;
import sikd.sikd5.sikd5bean.ws.ref.VersiAplikasi_WS;
import sikd.sikd5.sikd5bean.ws.transaksi.Belanja_WS;
import sikd.sikd5.sikd5bean.ws.transaksi.Headerapbd_WS;
import sikd.sikd5.sikd5bean.ws.transaksi.Headerdth_WS;
import sikd.sikd5.sikd5bean.ws.transaksi.Headerjurnal_WS;
import sikd.sikd5.sikd5bean.ws.transaksi.Headerlog_WS;
import sikd.sikd5.sikd5ejb.dao.ref.VersiDao;
import sikd.sikd5.sikd5ejb.dao.transaksi.BelanjaDao;
import sikd.sikd5.sikd5ejb.dao.transaksi.HeaderDthDao;
import sikd.sikd5.sikd5ejb.dao.transaksi.HeaderLogDao;
import sikd.sikd5.sikd5ejb.dao.transaksi.HeaderapbdDao;
import sikd.sikd5.sikd5ejb.dao.transaksi.HeaderapbdskpdDao;
import sikd.sikd5.sikd5ejb.dao.transaksi.HeaderjurnalDao;
import sikd.sikd5.sikd5ejb.session.util.MyBatisConnectionFactory;

@Stateless
@Remote(TransaksiSessionBeanRemote.class)
public class TransaksiSessionBean implements TransaksiSessionBeanRemote {
	public TransaksiSessionBean() {
//            try {
//
//			sqlSessionFactory = MyBatisConnectionFactory.getSqlSessionFactory();
//			belanjaDao = new BelanjaDao();
//			headerlogDao = new HeaderLogDao();
//			headerJurnalDao = new HeaderjurnalDao();
//			headerApbdDao = new HeaderapbdDao();
//			headerDthDao = new HeaderDthDao();
//		} catch (Exception ex) {
//			ex.printStackTrace();
//		}
	}

	private SqlSessionFactory sqlSessionFactory;
	private SqlSession session = null;
	BelanjaDao belanjaDao;
	HeaderLogDao headerlogDao;
	HeaderjurnalDao headerJurnalDao;
	HeaderDthDao headerDthDao;
	HeaderapbdDao headerApbdDao;
	VersiDao versiDao;
	HeaderapbdskpdDao headerapbdskpdDao;
	private Logger logger = Logger.getLogger(TransaksiSessionBean.class);

	@PostConstruct
	public void init() {
		try {

			sqlSessionFactory = MyBatisConnectionFactory.getSqlSessionFactory();
			belanjaDao = new BelanjaDao();
			headerlogDao = new HeaderLogDao();
			headerJurnalDao = new HeaderjurnalDao();
			headerApbdDao = new HeaderapbdDao();
			headerDthDao = new HeaderDthDao();
			headerapbdskpdDao = new HeaderapbdskpdDao();
			versiDao = new VersiDao();
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	@Override
	public List<Belanja_WS> getBelanjaDanAnaks(String kodeSatker, short tahun, Date tgawal, Date tgakhir) throws Exception {
		List<Belanja_WS> hasil = new ArrayList<>();
		try {
			session = sqlSessionFactory.openSession();
			hasil = belanjaDao.getBelanjaDanAnaks(kodeSatker, tahun, tgawal, tgakhir, session);
		} catch (Exception e) {
			e.printStackTrace();
			throw new SIKDServiceException(e.getMessage());
		} finally {
			session.close();
		}
		return hasil;
	}

	@Override
	public List<Belanja_WS> getBelanjaDanAnaksByNomorSp2d(String kodeSatker, short tahun, List<String> nomorsp2ds) throws Exception {
		List<Belanja_WS> hasil = new ArrayList<>();
		try {
			session = sqlSessionFactory.openSession();
			hasil = belanjaDao.getBelanjaDanAnaksByNomorSp2d(kodeSatker, tahun, nomorsp2ds, session);
		} catch (Exception e) {
			e.printStackTrace();
			throw new SIKDServiceException(e.getMessage());
		} finally {
			session.close();
		}
		return hasil;
	}

//	@Override
//	public void inserBelanja(List<Belanja_WS> belanjas) throws Exception {
//		logger.debug("==== BEGIN insertBelanja====");
//		long hasil = 0;
//		try {
//			session = sqlSessionFactory.openSession();
//			for (Belanja_WS belanja : belanjas) {
//				hasil = belanjaDao.inserBelanja(belanja, session);
//			}
//			session.commit();
//			logger.debug("=== END =====");
//		} catch (Exception e) {
//			logger.error(e, e);
//			session.rollback(true);
//			e.printStackTrace();
//			throw new SIKDServiceException(e.getMessage());
//		} finally {
//			session.close();
//		}
////		return hasil;
//	}

//	@Override
//	public int hapusBelanja(long belanjaid) throws Exception {
//		logger.debug("==== BEGIN insertBelanja====");
//		int hasil = 0;
//		try {
//			session = sqlSessionFactory.openSession();
//			hasil = belanjaDao.hapusBelanja(belanjaid, session);
//			session.commit();
//			logger.debug("=== END =====");
//		} catch (Exception e) {
//			logger.error(e, e);
//			session.rollback(true);
//			e.printStackTrace();
//			throw new SIKDServiceException(e.getMessage());
//		} finally {
//			session.close();
//		}
//		return hasil;
//	}

//	@Override
//	/**
//	 * Map Belanjas : Belanja_WS belanja, long belanjaid
//	 */
//	public void updateBelanja(List<Map<String, Object>> belanjas) throws Exception {
//		logger.debug("==== BEGIN insertBelanja====");
//		int hasil = 0;
//		try {
//			session = sqlSessionFactory.openSession();
//			for (Map blj : belanjas) {
//				Belanja_WS belanja = (Belanja_WS) blj.get("belanja");
//				long belanjaid = (long) blj.get("belanjaid");
//				hasil = belanjaDao.updateBelanja(belanja, belanjaid, session);
//			}
//			session.commit();
//			logger.debug("=== END =====");
//		} catch (Exception e) {
//			logger.error(e, e);
//			session.rollback(true);
//			e.printStackTrace();
//			throw new SIKDServiceException(e.getMessage());
//		} finally {
//			session.close();
//		}
//	}

//	@Override
//	public Headerlog_WS inputBelanja(Headerlog_WS hlog) throws Exception {
//		logger.debug("==== BEGIN input Belanja====");
//		long headerlogid = 0;
////TODO tambah yang dihapus
////		Headerlog hlog = new Headerlog();
//		try {
//			session = sqlSessionFactory.openSession();
//			hlog.setJenisdata("Belanja");
//			hlog.setTglpengiriman(new Date());
//			if (hlog.getBelanjas() == null || hlog.getBelanjas().size() == 0) {
//				hlog.setIsirow(0);
//				hlog.setKet("Data Kosong");
//				headerlogDao.insertHeaderlog(hlog, session);
//			} else {
//				List<Belanja_WS> belanjas = hlog.getBelanjas();
////	    	short tahun = belanjas.get(0).getTahunanggaran();
////			String kdsatker = belanjas.get(0).getKodesatker();
////			
////			hlog.setTahunanggaran(belanjas.get(0).getTahunanggaran());
////			hlog.setKodesatker(belanjas.get(0).getKodesatker());
////			hlog.setNamapemda(belanjas.get(0).getNamapemda());
//				hlog.setIsirow(belanjas.size());
//
////			hlog.setKodepemda(belanjas.get(0).getKodepemda());
////			hlog.setNamaaplikasi(belanjas.get(0).getnamaA);
//				headerlogid = headerlogDao.insertHeaderlog(hlog, session);
//				// dibikin paging agar tidak terlalu memberatkan server
//				int jumdiinsert = 0;
//				int jumdiupdate = 0;
//				int jumdihapus = 0;
//				List<List<Belanja_WS>> pagesBelanjas = SIKDUtil.getPages(belanjas, 40);
//
//				for (List<Belanja_WS> bljs : pagesBelanjas) {
//					List<String> nomorsp2ds = new ArrayList<>();
//					for (Belanja_WS blj : bljs) {
//						nomorsp2ds.add(blj.getNomorsp2d());
//					}
//					List<Belanja_WS> bljAkanDiinsert = new ArrayList<>();
//					List<Belanja_WS> bljAkanDiupdate = new ArrayList<>();
//					List<Belanja_WS> bljDiServer = belanjaDao.getBelanjaDanAnaksByNomorSp2d(hlog.getKodesatker(), hlog.getTahunanggaran(), nomorsp2ds,
//							session);
//
//					for (Belanja_WS blj : bljs) {
//						boolean ketemu = false;
//						for (Belanja_WS bljSr : bljDiServer) {
//							if (blj.getNomorsp2d().equals(bljSr.getNomorsp2d())) {
//								ketemu = true;
//								if (!blj.getSha256().equals(bljSr.getSha256())) {
//									bljAkanDiupdate.add(blj);
//								}
//							}
//						}
//						if (!ketemu) {
//							bljAkanDiinsert.add(blj);
//						}
//					}
//
//					jumdiinsert = jumdiinsert + bljAkanDiinsert.size();
//					jumdiupdate = jumdiupdate + bljAkanDiupdate.size();
//					for (Belanja_WS belanja : bljAkanDiinsert) {
//						belanjaDao.inserBelanja(belanja, headerlogid, session);
//					}
//					for (Belanja_WS belanja : bljAkanDiupdate) {
//						belanjaDao.updateBelanja(belanja, session);
//					}
//
//				}
////				Headerlog hlogupdate = new Headerlog();
////				hlogupdate.setHeaderlogid(headerlogid);
////				hlogupdate.setDiinsert(jumdiinsert);
////				hlogupdate.setDiubah(jumdiupdate);
////				hlogupdate.setSelesaitglpengiriman(new Date());
////				headerlogDao.updateByPrimaryKeySelective(hlogupdate, session);
//				Date selesai = new Date();
//				headerlogDao.updatePengiriman(headerlogid, jumdiinsert, jumdiupdate,jumdihapus, selesai, session);
//				session.commit();
//				hlog.setDiinsert(jumdiinsert);
//				hlog.setDiubah(jumdiupdate);
//				hlog.setSelesaitglpengiriman(selesai);
//				hlog.setKet("Berhasil");
//			}
//			logger.debug("=== END =====");
//
//		} catch (Exception e) {
//			logger.error(e, e);
//			session.rollback(true);
//			e.printStackTrace();
//			throw new SIKDServiceException(e.getMessage());
//		} finally {
//			session.close();
//		}
//		hlog.setBelanjas(new ArrayList<Belanja_WS>());
//		return hlog;
//	}

	@Override
	public Headerlog_WS inputJurnal(Headerlog_WS hlog) throws Exception {
		logger.debug("==== BEGIN input Jurnal====");
		long headerlogid = 0;
		try {
			session = sqlSessionFactory.openSession();
			hlog.setJenisdata("Jurnal");
			hlog.setTglpengiriman(new Date());
			if (hlog.getHeaderjurnals() == null || hlog.getHeaderjurnals().size() == 0) {
				hlog.setIsirow(0);
				hlog.setKet("Data Kosong");
				headerlogDao.insertHeaderlog(hlog, session);
			} else {
				List<Headerjurnal_WS> headerjurnals = hlog.getHeaderjurnals();
				hlog.setIsirow(headerjurnals.size());
				hlog.setKelompokdataid(1);
				headerlogid = headerlogDao.insertHeaderlog(hlog, session);
				// dibikin paging agar tidak terlalu memberatkan server
				int jumdiinsert = 0;
				int jumdiupdate = 0;
				int jumdihapus = 0;
				List<Headerjurnal_WS> jurnalAkanDihapus = new ArrayList<>();
				List<List<Headerjurnal_WS>> pagesHeaders = SIKDUtil.getPages(headerjurnals, 500);

				for (List<Headerjurnal_WS> jurnals : pagesHeaders) {
//					List<String> nomorbuktis = new ArrayList<>();
					String[] inBuktis = new String[jurnals.size()];
					int i = 0;
					for (Headerjurnal_WS header : jurnals) {
//						nomorbuktis.add(header.getNomorbukti());
						inBuktis[i] = header.getNomorbukti();
						i++;
					}
//					String[] inBuktis = nomorbuktis.stream().toArray(String[]::new);
					List<Headerjurnal_WS> jurnalAkanDiinsert = new ArrayList<>();
					List<Headerjurnal_WS> jurnalAkanDiupdate = new ArrayList<>();

					List<Headerjurnal_WS> jurnalDiServer = headerJurnalDao.selectHeaderjurnalByNomorbuktis(
							hlog.getTahunanggaran(), hlog.getKodesatker(), inBuktis, session);

					for (Headerjurnal_WS jur : jurnals) {
						if (jur.isDihapus()) {
							jurnalAkanDihapus.add(jur);
						} else {
							boolean ketemu = false;
							for (Headerjurnal_WS jurSr : jurnalDiServer) {
								if (jur.getNomorbukti().equals(jurSr.getNomorbukti()) && jur.getTanggalbukti().equals(jurSr.getTanggalbukti())) {
									ketemu = true;
									if (!jur.getSha256().equals(jurSr.getSha256())) {
										jurnalAkanDiupdate.add(jur);
									}
								}
							}
							if (!ketemu) {
								jurnalAkanDiinsert.add(jur);
							}
						}
					}

					jumdiinsert = jumdiinsert + jurnalAkanDiinsert.size();
					jumdiupdate = jumdiupdate + jurnalAkanDiupdate.size();

					for (Headerjurnal_WS headerjurnal : jurnalAkanDiinsert) {
						headerJurnalDao.insertHeaderjurnal(headerjurnal, headerlogid, session);
					}
					for (Headerjurnal_WS headerjurnal : jurnalAkanDiupdate) {
						headerJurnalDao.updateHeaderjurnal(headerjurnal, null, headerlogid, session);
					}

				}
//				if (jumdiinsert > 1) {
				if (jurnalAkanDihapus.size() < 251) {
					for (Headerjurnal_WS headerjurnal : jurnalAkanDihapus) {
						headerJurnalDao.hapusHeaderjurnalByBukti(headerjurnal, session);
					}
					jumdihapus = jurnalAkanDihapus.size();
				} else {
					throw new SIKDServiceException("Record yang dihapus terlalu banyak > 250..Indikasi salah koneksi");
				}
//				}

//				Headerlog hlogupdate = new Headerlog();
//				hlogupdate.setHeaderlogid(headerlogid);
//				hlogupdate.setDiinsert(jumdiinsert);
//				hlogupdate.setDiubah(jumdiupdate);
//				hlogupdate.setSelesaitglpengiriman(new Date());
				// TODO ubah mapper Headerlog dengan mapper manual
//				headerlogDao.updateByPrimaryKeySelective(hlogupdate, session);
				Date selesai = new Date();
				headerlogDao.updatePengiriman(headerlogid, jumdiinsert, jumdiupdate, jumdihapus, selesai, session);

				session.commit();
				hlog.setDiinsert(jumdiinsert);
				hlog.setDiubah(jumdiupdate);
				hlog.setSelesaitglpengiriman(selesai);
				hlog.setKet("Berhasil");
			}
			logger.debug("=== END =====");

		} catch (Exception e) {
			logger.error(e, e);
			session.rollback(true);
			e.printStackTrace();
			throw new SIKDServiceException(e.getMessage());
		} finally {
			session.close();
		}
		hlog.setHeaderjurnals(new ArrayList<Headerjurnal_WS>());
		return hlog;
	}

	@Override
	public Headerlog_WS inputApbd(Headerlog_WS hlog) throws Exception {
		logger.debug("==== BEGIN input Apbd====");
		long headerlogid = 0;
		try {
			session = sqlSessionFactory.openSession();
			hlog.setJenisdata("Apbd");
			hlog.setKelompokdataid(3);
			hlog.setTglpengiriman(new Date());
			if (hlog.getHeaderapbd() == null) {
				hlog.setIsirow(0);
				hlog.setKet("Data Kosong");
				headerlogDao.insertHeaderlog(hlog, session);
			} else {
				Headerapbd_WS headerapbdKiriman = hlog.getHeaderapbd();
				if (headerapbdKiriman.getApbds() == null || headerapbdKiriman.getApbds().size() < 1) {
					hlog.setIsirow(0);
					hlog.setKet("Data Kosong");
					headerlogDao.insertHeaderlog(hlog, session);
				} else {
					hlog.setIsirow(headerapbdKiriman.getApbds().size());
				}

				headerlogid = headerlogDao.insertHeaderlog(hlog, session);
				Headerapbd_WS headerApbdDiServer = headerApbdDao.selectHeaderApbd(headerapbdKiriman.getTahunanggaran(),
						headerapbdKiriman.getKodesatker(),
						headerapbdKiriman.getKodedata(), headerapbdKiriman.getJeniscoa(), session);
				if (headerApbdDiServer == null || headerApbdDiServer.getKodesatker() == null
						|| headerApbdDiServer.getKodesatker().trim().equals("")) {
					// TODO insert
					hlog.setDiinsert(headerapbdKiriman.getApbds().size());
					headerApbdDao.insertHeaderApbd(headerapbdKiriman, session);
				} else {
					if ((headerapbdKiriman.getSha256() != null && headerApbdDiServer.getSha256() != null)
							&& headerapbdKiriman.getSha256().equals(headerApbdDiServer.getSha256())) {
						hlog.setDiinsert(0);
						hlog.setKet("Data Dikirim Tidak ada perubahan");
					} else {
						hlog.setDiinsert(headerapbdKiriman.getApbds().size());
						long headerApbdId = headerApbdDao.selectHeaderApbdId(headerapbdKiriman.getTahunanggaran(), headerapbdKiriman.getKodesatker(),
								headerapbdKiriman.getKodedata(), headerapbdKiriman.getJeniscoa(), session);
						headerApbdDao.updateHeaderApbd(headerapbdKiriman, headerApbdId, session);
						// TODO dao delete yang ada
						// TODO dao insert
					}
				}

				Date selesai = new Date();
				headerlogDao.updatePengiriman(headerlogid, hlog.getIsirow(), 0, 0, selesai, session);
				session.commit();
				hlog.setSelesaitglpengiriman(selesai);
				hlog.setKet("Berhasil");
			}
			logger.debug("=== END =====");

		} catch (Exception e) {
			logger.error(e, e);
			session.rollback(true);
			e.printStackTrace();
			throw new SIKDServiceException(e.getMessage());
		} finally {
			session.close();
		}
		hlog.setHeaderapbd(new Headerapbd_WS());
		return hlog;
	}

	@Override
	public Headerlog_WS inputApbdPerSkpd(Headerlog_WS hlog, int nomorSkpd, String namaskpd, String sha256skpd) throws Exception {
		logger.debug("==== BEGIN input Apbd====");
		long headerlogid = 0;
		try {
			session = sqlSessionFactory.openSession();
			headerapbdskpdDao.setSession(session);
			hlog.setJenisdata("Apbd");
			hlog.setKelompokdataid(3);
			hlog.setTglpengiriman(new Date());
			if (hlog.getHeaderapbd() == null) {
				hlog.setIsirow(0);
				hlog.setKet("Data Kosong");
				headerlogDao.insertHeaderlog(hlog, session);
				throw new SIKDServiceException(hlog.getKet());
			} else {
				Headerapbd_WS headerapbdKiriman = hlog.getHeaderapbd();
				if (headerapbdKiriman.getApbds() == null || headerapbdKiriman.getApbds().size() < 1) {
					hlog.setIsirow(0);
					hlog.setKet("Data Kosong");
					headerlogDao.insertHeaderlog(hlog, session);
					throw new SIKDServiceException(hlog.getKet());
				} else {
					hlog.setIsirow(headerapbdKiriman.getApbds().size());
				}

				headerlogid = headerlogDao.insertHeaderlog(hlog, session);
				Headerapbd_WS headerApbdDiServer = headerApbdDao.selectHeaderApbd(headerapbdKiriman.getTahunanggaran(),
						headerapbdKiriman.getKodesatker(),
						headerapbdKiriman.getKodedata(), headerapbdKiriman.getJeniscoa(), session);
				if (headerApbdDiServer == null || headerApbdDiServer.getKodesatker() == null
						|| headerApbdDiServer.getKodesatker().trim().equals("")) {
					// TODO insert
					hlog.setDiinsert(headerapbdKiriman.getApbds().size());
					long headerApbdId = headerApbdDao.insertHeaderApbd(headerapbdKiriman, session);
					Headerapbdskpd headerapbdskpd1 = new Headerapbdskpd(headerApbdId, namaskpd, sha256skpd);
					headerapbdskpdDao.getMapper().inserHeaderapbdskpd(headerapbdskpd1);
				} else {
					if ((headerapbdKiriman.getSha256() != null && headerApbdDiServer.getSha256() != null)
							&& headerapbdKiriman.getSha256().equals(headerApbdDiServer.getSha256())) {
//                        hlog.setDiinsert(0);
//                        hlog.setKet("Data Dikirim Tidak ada perubahan");
						if (nomorSkpd == 1) { // SKPD pertama yang dikirim
							hlog.setDiinsert(0);
							hlog.setKet("Data Dikirim Tidak ada perubahan");
						} else {// SKPD berikutnya
							Headerapbdskpd headerapbdperskpd = headerapbdskpdDao.getMapper().selectHeaderapbdskpd(
									headerapbdKiriman.getTahunanggaran(),
									headerapbdKiriman.getKodesatker(),
									headerapbdKiriman.getKodedata(), headerapbdKiriman.getJeniscoa(), namaskpd);
							hlog.setDiinsert(headerapbdKiriman.getApbds().size());
							long headerApbdId = headerApbdDao.selectHeaderApbdId(headerapbdKiriman.getTahunanggaran(),
									headerapbdKiriman.getKodesatker(),
									headerapbdKiriman.getKodedata(), headerapbdKiriman.getJeniscoa(), session);
							if (headerapbdperskpd == null || headerapbdperskpd.getSha256skpd() == null
									|| headerapbdperskpd.getSha256skpd().equals("")) {
								// Simpan Headerapbdskpd
								Headerapbdskpd headerapbdskpd1 = new Headerapbdskpd(headerApbdId, namaskpd, sha256skpd);
								headerapbdskpdDao.getMapper().inserHeaderapbdskpd(headerapbdskpd1);
								headerApbdDao.updateHeaderApbdBySkpd(headerapbdKiriman, headerApbdId, session);
							} else {
								if (headerapbdperskpd.getSha256skpd().equals(sha256skpd)) {
									hlog.setDiinsert(0);
									hlog.setKet("Data Dikirim Tidak ada perubahan");
								} else {
									hlog.setDiubah(headerapbdKiriman.getApbds().size());
									headerapbdperskpd.setSha256skpd(sha256skpd);
									headerapbdskpdDao.getMapper().updateHeaderapbdskpd(headerapbdperskpd);
									headerApbdDao.updateHeaderApbdBySkpd(headerapbdKiriman, headerApbdId, session);
								}
							}

						}
					} else {
						if (nomorSkpd == 1) { // SKPD pertama yang dikirim dan sha beda
							hlog.setDiinsert(headerapbdKiriman.getApbds().size());
							long headerApbdId = headerApbdDao.selectHeaderApbdId(headerapbdKiriman.getTahunanggaran(),
									headerapbdKiriman.getKodesatker(),
									headerapbdKiriman.getKodedata(), headerapbdKiriman.getJeniscoa(), session);
							headerApbdDao.updateHeaderApbd(headerapbdKiriman, headerApbdId, session);
							Headerapbdskpd headerapbdperskpd = headerapbdskpdDao.getMapper().selectHeaderapbdskpd(
									headerapbdKiriman.getTahunanggaran(),
									headerapbdKiriman.getKodesatker(),
									headerapbdKiriman.getKodedata(), headerapbdKiriman.getJeniscoa(), namaskpd);
							if (headerapbdperskpd == null || headerapbdperskpd.getSha256skpd() == null
									|| headerapbdperskpd.getSha256skpd().equals("")) {
								// Simpan Headerapbdskpd
								Headerapbdskpd headerapbdskpd1 = new Headerapbdskpd(headerApbdId, namaskpd, sha256skpd);
								headerapbdskpdDao.getMapper().inserHeaderapbdskpd(headerapbdskpd1);
								headerApbdDao.updateHeaderApbdBySkpd(headerapbdKiriman, headerApbdId, session);
							} else {
								if (headerapbdperskpd.getSha256skpd().equals(sha256skpd)) {
									hlog.setDiinsert(0);
									hlog.setKet("Data Dikirim Tidak ada perubahan");
								} else {
									hlog.setDiubah(headerapbdKiriman.getApbds().size());
									headerapbdperskpd.setSha256skpd(sha256skpd);
									headerapbdskpdDao.getMapper().updateHeaderapbdskpd(headerapbdperskpd);
									headerApbdDao.updateHeaderApbdBySkpd(headerapbdKiriman, headerApbdId, session);
								}
							}
						} else {
							hlog.setDiinsert(0);
							hlog.setKet("Data Dikirim Salah Urutan SKPD/ Salah Format");
							throw new SIKDServiceException(hlog.getKet());
						}
//						hlog.setDiinsert(headerapbdKiriman.getApbds().size());
//						long headerApbdId = headerApbdDao.selectHeaderApbdId(headerapbdKiriman.getTahunanggaran(), headerapbdKiriman.getKodesatker(),
//								headerapbdKiriman.getKodedata(), headerapbdKiriman.getJeniscoa(), session);
////                        headerApbdDao.updateHeaderApbdBySkpd(headerapbdKiriman, headerApbdId, session);
//						headerApbdDao.updateHeaderApbd(headerapbdKiriman, headerApbdId, session);

					}
				}

				Date selesai = new Date();
				headerlogDao.updatePengiriman(headerlogid, hlog.getIsirow(), 0, 0, selesai, session);
				session.commit();
				hlog.setSelesaitglpengiriman(selesai);
				hlog.setKet("Berhasil");
			}
			logger.debug("=== END =====");

		} catch (Exception e) {
			logger.error(e, e);
			session.rollback(true);
			e.printStackTrace();
			throw new SIKDServiceException(e.getMessage());
		} finally {
			session.close();
		}
		hlog.setHeaderapbd(new Headerapbd_WS());
		return hlog;
	}

	@Override
	public Headerlog_WS inputDth(Headerlog_WS hlog) throws Exception {
		logger.debug("==== BEGIN input Dth====");
		System.out.println("mulai input DTH .....................");
		long headerlogid = 0;
		try {
			session = sqlSessionFactory.openSession();
			hlog.setJenisdata("Dth");
			hlog.setTglpengiriman(new Date());
			if (hlog.getHeaderdths() == null || hlog.getHeaderdths().isEmpty()) {
				hlog.setIsirow(0);
				hlog.setKet("Data Kosong");
				headerlogDao.insertHeaderlog(hlog, session);
			} else {
				List<Headerdth_WS> headerdths = hlog.getHeaderdths();
				hlog.setIsirow(headerdths.size());
				hlog.setKelompokdataid(2);
				headerlogid = headerlogDao.insertHeaderlog(hlog, session);
				// dibikin paging agar tidak terlalu memberatkan server
				int jumdiinsert = 0;
				int jumdiupdate = 0;
				int jumdihapus = 0;
				List<Headerdth_WS> jurnalAkanDihapus = new ArrayList<>();
				List<List<Headerdth_WS>> pagesHeaders = SIKDUtil.getPages(headerdths, 500);

				for (List<Headerdth_WS> dths : pagesHeaders) {
					String[] inSp2ds = new String[dths.size()];
					int i = 0;
					for (Headerdth_WS header : dths) {
//						nomorbuktis.add(header.getNomorbukti());
						inSp2ds[i] = header.getNomorsp2d();
						i++;
					}
//					String[] inBuktis = nomorbuktis.stream().toArray(String[]::new);
					List<Headerdth_WS> dthAkanDiinsert = new ArrayList<>();
					List<Headerdth_WS> dthAkanDiupdate = new ArrayList<>();

					List<Headerdth_WS> dthDiServer = headerDthDao.selectHeaderDthByNomorSp2ds(
							hlog.getTahunanggaran(), hlog.getKodesatker(), inSp2ds, session);

					for (Headerdth_WS hdth : dths) {
//                        if (jur.isDihapus()) {
//                            jurnalAkanDihapus.add(jur);
//                        } else {
						boolean ketemu = false;
						for (Headerdth_WS dthSr : dthAkanDiinsert) {
							if (hdth.getNomorsp2d().equals(dthSr.getNomorsp2d())) {
								ketemu = true;
								if (!hdth.getSha256().equals(dthSr.getSha256())) {
									dthAkanDiupdate.add(hdth);
								}
							}
						}
						if (!ketemu) {
							dthAkanDiinsert.add(hdth);
						}
//                        }
					}

					jumdiinsert = jumdiinsert + dthAkanDiinsert.size();
					jumdiupdate = jumdiupdate + dthAkanDiupdate.size();

					for (Headerdth_WS headerdth : dthAkanDiinsert) {
						headerDthDao.insertHeaderDth(headerdth, headerlogid, 0, session);
					}
					for (Headerdth_WS headerdth : dthAkanDiupdate) {
						headerDthDao.updateHeaderDth(headerdth, null, headerlogid, session);
					}
				}
//                if (jumdiinsert > 1) {
				if (jurnalAkanDihapus.size() < 251) {
					for (Headerdth_WS headerdth : jurnalAkanDihapus) {
						headerDthDao.hapusHeaderDthBySp2d(headerdth, session);
					}
					jumdihapus = jurnalAkanDihapus.size();
				} else {
					throw new SIKDServiceException("Record yang dihapus terlalu banyak > 250..Indikasi salah koneksi");
				}
//                }

				Date selesai = new Date();
				headerlogDao.updatePengiriman(headerlogid, jumdiinsert, jumdiupdate, jumdihapus, selesai, session);

				session.commit();
				hlog.setDiinsert(jumdiinsert);
				hlog.setDiubah(jumdiupdate);
				hlog.setSelesaitglpengiriman(selesai);
				hlog.setKet("Berhasil");
			}
			logger.debug("=== END =====");

		} catch (Exception e) {
			logger.error(e, e);
			session.rollback(true);
			e.printStackTrace();
			throw new SIKDServiceException(e.getMessage());
		} finally {
			session.close();
		}
		hlog.setHeaderjurnals(new ArrayList<Headerjurnal_WS>());
		return hlog;
	}

	@Override
	public VersiAplikasi_WS cekVersiAplikasi(String kodesatker, String ip, Date tanggalLocal, String namaAplikasi, String versiAplikasi)
			throws Exception {
		logger.debug("==== getVersiAplikasi====");
		VersiAplikasi_WS hasil = new VersiAplikasi_WS();
		try {
			session = sqlSessionFactory.openSession();
			hasil = versiDao.getVersiAplikasi(kodesatker, ip, tanggalLocal, namaAplikasi, versiAplikasi, session);
			logger.debug("=== END =====");
		} catch (Exception e) {
			logger.error(e, e);
			session.rollback(true);
			e.printStackTrace();
			throw new SIKDServiceException(e.getMessage());
		} finally {
			session.close();
		}
		return hasil;
	}

}