package com.jasamedika.medifirst2000.service.impl;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.DokumenDao;
import com.jasamedika.medifirst2000.dao.DokumenInternalDao;
import com.jasamedika.medifirst2000.dao.LoginUserDao;
import com.jasamedika.medifirst2000.dao.PegawaiDao;
import com.jasamedika.medifirst2000.dao.RunningNumberDao;
import com.jasamedika.medifirst2000.dao.StrukKirimDao;
import com.jasamedika.medifirst2000.dao.custom.DokumenInternalDaoCustom;
import com.jasamedika.medifirst2000.dto.DetailRupDto;
import com.jasamedika.medifirst2000.dto.DokumenInternalDto;
import com.jasamedika.medifirst2000.entities.AsalProduk;
import com.jasamedika.medifirst2000.entities.DetailAnggaran;
import com.jasamedika.medifirst2000.entities.DetailSpekAnggaran;
import com.jasamedika.medifirst2000.entities.Dokumen;
import com.jasamedika.medifirst2000.entities.DokumenInternal;
import com.jasamedika.medifirst2000.entities.JenisArsip;
import com.jasamedika.medifirst2000.entities.JenisDokumen;
import com.jasamedika.medifirst2000.entities.JenisSurat;
import com.jasamedika.medifirst2000.entities.KegiatanAnggaran;
import com.jasamedika.medifirst2000.entities.KlasifikasiArsip;
import com.jasamedika.medifirst2000.entities.LoginUser;
import com.jasamedika.medifirst2000.entities.Pegawai;
import com.jasamedika.medifirst2000.entities.Produk;
import com.jasamedika.medifirst2000.entities.Ruangan;
import com.jasamedika.medifirst2000.entities.RunningNumber;
import com.jasamedika.medifirst2000.entities.SifatSurat;
import com.jasamedika.medifirst2000.entities.StatusBerkas;
import com.jasamedika.medifirst2000.entities.StatusYaTidak;
import com.jasamedika.medifirst2000.entities.StrukKirim;
import com.jasamedika.medifirst2000.entities.StrukPelayanan;
import com.jasamedika.medifirst2000.entities.SubKlasifikasiArsip;
import com.jasamedika.medifirst2000.entities.TipePengirimSurat;
import com.jasamedika.medifirst2000.service.DokumenInternalService;
import com.jasamedika.medifirst2000.service.LoginUserService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.HibernateInitialize;
import com.jasamedika.medifirst2000.util.StringUtil;
import com.jasamedika.medifirst2000.vo.AsalProdukVO;
import com.jasamedika.medifirst2000.vo.ChartOfAccountVO;
import com.jasamedika.medifirst2000.vo.DetailAnggaranVO;
import com.jasamedika.medifirst2000.vo.DetailSpekAnggaranVO;
import com.jasamedika.medifirst2000.vo.DokumenInternalVO;
import com.jasamedika.medifirst2000.vo.DokumenVO;
import com.jasamedika.medifirst2000.vo.GridDetailAnggaran;
import com.jasamedika.medifirst2000.vo.GridDokumenInternal;
import com.jasamedika.medifirst2000.vo.HeadAnggaranVO;
import com.jasamedika.medifirst2000.vo.JenisArsipVO;
import com.jasamedika.medifirst2000.vo.JenisSuratVO;
import com.jasamedika.medifirst2000.vo.KegiatanAnggaranVO;
import com.jasamedika.medifirst2000.vo.KlasifikasiArsipVO;
import com.jasamedika.medifirst2000.vo.KomponenVO;
import com.jasamedika.medifirst2000.vo.LoginUserVO;
import com.jasamedika.medifirst2000.vo.PegawaiVO;
import com.jasamedika.medifirst2000.vo.ProdukVO;
import com.jasamedika.medifirst2000.vo.RuanganVO;
import com.jasamedika.medifirst2000.vo.SifatSuratVO;
import com.jasamedika.medifirst2000.vo.StatusBerkasVO;
import com.jasamedika.medifirst2000.vo.StatusYaTidakVO;
import com.jasamedika.medifirst2000.vo.StrukKirimVO;
import com.jasamedika.medifirst2000.vo.StrukPelayananVO;
import com.jasamedika.medifirst2000.vo.SubKlasifikasiArsipVO;
import com.jasamedika.medifirst2000.vo.SuratMasukInternalVO;
import com.jasamedika.medifirst2000.vo.TipePengirimSuratVO;

@Service("DokumenInternalService")
public class DokumenInternalServiceImpl extends BaseVoServiceImpl implements DokumenInternalService {

	@Autowired
	private LoginUserService loginUserService;

	@Autowired
	private DokumenDao dokumenDao;

	@Autowired
	private StrukKirimDao strukKirimDao;

	@Autowired
	private DokumenInternalDaoCustom dokumenInternalDaoCustom;

	@Autowired
	private PegawaiDao loginUserDao;

	@Autowired
	private DokumenInternalDao dokumenInternalDao;

	@Autowired
	private BaseConverterImpl<DokumenVO, Dokumen> dokumenConverter;

	@Autowired
	private BaseConverterImpl<DokumenInternalVO, DokumenInternal> dokumenInternalConverter;

	@Autowired
	private BaseConverterImpl<PegawaiVO, Pegawai> loginUserConverter;

	@Autowired
	private BaseConverterImpl<RuanganVO, Ruangan> ruanganConverter;

	@Autowired
	private BaseConverterImpl<TipePengirimSuratVO, TipePengirimSurat> tipePengirimSuratConverter;

	@Autowired
	private BaseConverterImpl<SifatSuratVO, SifatSurat> sifatSuratConverter;

	@Autowired
	private BaseConverterImpl<JenisSuratVO, JenisSurat> jenisSuratConverter;

	@Autowired
	private BaseConverterImpl<StatusBerkasVO, StatusBerkas> statusBerkasConverter;

	@Autowired
	private BaseConverterImpl<StatusYaTidakVO, StatusYaTidak> statusYaTidakConverter;

	@Autowired
	private BaseConverterImpl<KlasifikasiArsipVO, KlasifikasiArsip> klasifikasiArsipConverter;

	@Autowired
	private BaseConverterImpl<SubKlasifikasiArsipVO, SubKlasifikasiArsip> subKlasifikasiArsipConverter;

	@Autowired
	private BaseConverterImpl<StrukKirimVO, StrukKirim> strukKirimConverter;

	@Autowired
	private BaseConverterImpl<JenisArsipVO, JenisArsip> jenisArsipConverter;

	@Autowired
	private BaseConverterImpl<StrukPelayananVO, StrukPelayanan> strukPelayananConverter;

	/*
	 * @Override public Map<String, Object> addDokumenInternal(DokumenInternalVO
	 * vo) { Map<String, Object> result = new HashMap<String, Object>();
	 * DokumenInternal dokumenInternal = new DokumenInternal();
	 * if(CommonUtil.isNotNullOrEmpty(vo)){ dokumenInternal =
	 * dokumenInternalConverter.transferVOToModel(vo, new DokumenInternal()); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getKddokumen())){
	 * dokumenInternal.setKddokumen(dokumenConverter.transferVOToModel(vo.
	 * getKddokumen(), new Dokumen())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getKdpegawaitujuan())){
	 * dokumenInternal.setKdpegawaitujuan(loginUserConverter.transferVOToModel(
	 * vo.getKdpegawaitujuan(), new LoginUser())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getKdruangantujuan())){
	 * dokumenInternal.setKdruangantujuan(ruanganConverter.transferVOToModel(vo.
	 * getKdruangantujuan(), new Ruangan())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getNoKirim())){
	 * dokumenInternal.setNokirim(strukKirimConverter.transferVOToModel(vo.
	 * getNoKirim(), new StrukKirim())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getNoStruk_T())){
	 * dokumenInternal.setNostruk_t(strukPelayananConverter.transferVOToModel(vo
	 * .getNoStruk_T(), new StrukPelayanan())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getLoginUserPenerimaSurat())){
	 * dokumenInternal.setLoginUserPenerimaSurat(loginUserConverter.
	 * transferVOToModel(vo.getLoginUserPenerimaSurat(), new LoginUser())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getRuanganPenerima())){
	 * dokumenInternal.setRuanganPenerima(ruanganConverter.transferVOToModel(vo.
	 * getRuanganPenerima(), new Ruangan())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getRuanganPengirim())){
	 * dokumenInternal.setRuanganPengirim(ruanganConverter.transferVOToModel(vo.
	 * getRuanganPengirim(), new Ruangan())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getTipePengirimSurat())){
	 * dokumenInternal.setTipePengirimSurat(tipePengirimSuratConverter.
	 * transferVOToModel(vo.getTipePengirimSurat(), new TipePengirimSurat())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getUserPengirimSurat())){
	 * dokumenInternal.setUserPengirimSurat(loginUserConverter.transferVOToModel
	 * (vo.getUserPengirimSurat(), new LoginUser())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getSifatSurat())){
	 * dokumenInternal.setSifatSurat(sifatSuratConverter.transferVOToModel(vo.
	 * getSifatSurat(), new SifatSurat())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getStatusBerkas())){
	 * dokumenInternal.setStatusBerkas(statusBerkasConverter.transferVOToModel(
	 * vo.getStatusBerkas(), new StatusBerkas())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getJenisArsip())){
	 * dokumenInternal.setJenisArsip(jenisArsipConverter.transferVOToModel(vo.
	 * getJenisArsip(), new JenisArsip())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getKlasifikasiArsip())){
	 * dokumenInternal.setKlasifikasiArsip(klasifikasiArsipConverter.
	 * transferVOToModel(vo.getKlasifikasiArsip(), new KlasifikasiArsip())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getSubKlasifikasiArsip())){
	 * dokumenInternal.setSubKlasifikasiArsip(subKlasifikasiArsipConverter.
	 * transferVOToModel(vo.getSubKlasifikasiArsip(), new
	 * SubKlasifikasiArsip())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getStatusVerifikasi())){
	 * dokumenInternal.setStatusVerifikasi(statusYaTidakConverter.
	 * transferVOToModel(vo.getStatusVerifikasi(), new StatusYaTidak())); }
	 * if(CommonUtil.isNotNullOrEmpty(vo.getJenisSurat())){
	 * dokumenInternal.setJenisSurat(jenisSuratConverter.transferVOToModel(vo.
	 * getJenisSurat(), new JenisSurat())); }
	 * 
	 * DokumenInternal model = new DokumenInternal();
	 * if(CommonUtil.isNotNullOrEmpty(dokumenInternal)){ model =
	 * dokumenInternalDao.save(dokumenInternal); }
	 * if(CommonUtil.isNotNullOrEmpty(model)){ result.put("data",
	 * model.getNoRec()); }
	 * 
	 * return result; }
	 */
	@Override
	public Map<String, Object> updateDokumenInternal(DokumenInternalVO vo) {
		return null;
	}

	@Override
	public Map<String, Object> findAllDokumenInternal() {
		return null;
	}

	/* Surat Masuk Internal - Aplikasi ketatausahaan - Sarana dan Prasarana */

	@Override
	@Transactional
	public Map<String, Object> addSuratMasukInternal(SuratMasukInternalVO vo) {
		Map<String, Object> result = new HashMap<String, Object>();

		/* Set VO Dokumen */
		DokumenVO voDokumen = new DokumenVO();
		if (CommonUtil.isNotNullOrEmpty(vo.getPerihal())) {
			voDokumen.setNamaJudulDokumen(vo.getPerihal());
			voDokumen.setqDokumen(0);
		}

		voDokumen.setIsDokumenInOutInt((byte) 0);

		if (CommonUtil.isNotNullOrEmpty(vo.getUserPegawaiPengirim())) {
			voDokumen.setPegawaiPembuat(vo.getUserPegawaiPengirim());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getRuanganPengirim())) {
			voDokumen.setRuangan(vo.getRuanganPengirim());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getQtyPerihal())) {
			voDokumen.setQtyLampiran(vo.getQtyPerihal());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getKeterangan())) {
			voDokumen.setDeskripsiDokumen(vo.getKeterangan());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getQtyPerihal())) {
			voDokumen.setQtyLampiran(vo.getQtyPerihal());
		}
		/* End Of Set VO Dokumen */

		/* Converter */
		Dokumen dokumen = new Dokumen();
		if (CommonUtil.isNotNullOrEmpty(voDokumen)) {
			dokumen = dokumenConverter.transferVOToModel(voDokumen, new Dokumen());
		}
		if (CommonUtil.isNotNullOrEmpty(voDokumen.getPegawaiPembuat())) {
			dokumen.setPegawaiPembuat(
					loginUserConverter.transferVOToModel(voDokumen.getPegawaiPembuat().getPegawai(), new Pegawai()));
		}
		if (CommonUtil.isNotNullOrEmpty(voDokumen.getRuangan())) {
			dokumen.setRuangan(ruanganConverter.transferVOToModel(voDokumen.getRuangan(), new Ruangan()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getRuanganPengirim())) {
			dokumen.setRuangan(ruanganConverter.transferVOToModel(vo.getRuanganPengirim(), new Ruangan()));
		}

		dokumen.setNoDokumen(vo.getNomorSuratInternal());
		dokumen.setTglDokumen(vo.getTanggalSurat());
		JenisDokumen jenisDokumen = new JenisDokumen();
		jenisDokumen.setId(7); // Menyatakan bahwa jenis dokumennya adalah surat
								// masuk
		dokumen.setJenisDokumen(jenisDokumen);
		Dokumen resultModelDokumen = new Dokumen();
		if (CommonUtil.isNotNullOrEmpty(dokumen)) {
			resultModelDokumen = dokumenDao.save(dokumen);
		}
		if (CommonUtil.isNotNullOrEmpty(resultModelDokumen)) {
			result.put("dokumen", resultModelDokumen);
		}
		/* End Of Dokumen Converter */

		/* Set Dokumen Internal */
		DokumenInternalVO voDokumenInternal = new DokumenInternalVO();
		if (CommonUtil.isNotNullOrEmpty(voDokumen)) {
			voDokumenInternal.setObjectDokumen(voDokumen);
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getUserPegawaiTujuan())) {
			voDokumenInternal.setObjectPegawaiTujuan(vo.getUserPegawaiTujuan());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getRuanganPenerima())) {
			voDokumenInternal.setObjectRuanganTujuan(vo.getRuanganPenerima());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getKeterangan())) {
			voDokumenInternal.setKeteranganLainnya(vo.getKeterangan());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getNomorSuratInternal())) {
			voDokumenInternal.setNodokumen_intern(vo.getNomorSuratInternal());
		}
		if (CommonUtil.isNotNullOrEmpty(Calendar.getInstance())) {
			Calendar calendar = Calendar.getInstance();
			Integer date = calendar.get(Calendar.DATE);
			String dateString = StringUtil.formatNumber(String.valueOf(date), 2);
			Integer month = calendar.get(Calendar.MONTH);
			String monthString = StringUtil.formatNumber(String.valueOf(month), 2);
			Integer year = calendar.get(Calendar.YEAR);
			String stringKdTerima = StringUtil.formatNumber(String.valueOf(dokumenInternalDao.getCount() + 1), 6);
			String currentDate = year.toString() + monthString + dateString + stringKdTerima;
			voDokumenInternal.setNoTerima(currentDate);
		}
		if (CommonUtil.isNotNullOrEmpty(new Date())) {
			voDokumenInternal.setTglTerima(new Date());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getRuanganPenerima())) {
			voDokumenInternal.setRuanganPenerima(vo.getRuanganPenerima());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getTipePengirimSurat())) {
			voDokumenInternal.setTipePengirimSurat(vo.getTipePengirimSurat());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getTanggalSurat())) {
			voDokumenInternal.setTglSurat(vo.getTanggalSurat());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getPerihal())) {
			voDokumenInternal.setPerihal(vo.getPerihal());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getUserPegawaiPengirim())) {
			voDokumenInternal.setPegawaiPengirimSurat(vo.getUserPegawaiPengirim());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getAlamatPengirim())) {
			voDokumenInternal.setAlamatPengirim(vo.getAlamatPengirim());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getSifatSurat())) {
			voDokumenInternal.setSifatSurat(vo.getSifatSurat());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getStatusBerkas())) {
			voDokumenInternal.setStatusBerkas(vo.getStatusBerkas());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getKlasifikasiArsip())) {
			voDokumenInternal.setKlasifikasiArsip(vo.getKlasifikasiArsip());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getSubKlasifikasiArsip())) {
			voDokumenInternal.setSubKlasifikasiArsip(vo.getSubKlasifikasiArsip());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getStatusKeaktifanJenisArsip())) {
			voDokumenInternal.setStatusKeaktifan(vo.getStatusKeaktifanJenisArsip());
		}
		/* End Of Set Dokumen Internal */

		/* Converter of Dokumen Internal */
		DokumenInternal dokumenInternal = new DokumenInternal();
		if (CommonUtil.isNotNullOrEmpty(voDokumenInternal)) {
			dokumenInternal = dokumenInternalConverter.transferVOToModel(voDokumenInternal, new DokumenInternal());
		}
		if (CommonUtil.isNotNullOrEmpty(voDokumenInternal.getObjectDokumen())) {
			dokumenInternal.setKddokumen(resultModelDokumen);
		}
		if (CommonUtil.isNotNullOrEmpty(voDokumenInternal.getKdruangantujuan())) {
			dokumenInternal.setKdruangantujuan(
					ruanganConverter.transferVOToModel(voDokumenInternal.getKdruangantujuan(), new Ruangan()));
		}
		if (CommonUtil.isNotNullOrEmpty(voDokumenInternal.getRuanganPenerima())) {
			dokumenInternal.setRuanganPenerima(
					ruanganConverter.transferVOToModel(voDokumenInternal.getRuanganPenerima(), new Ruangan()));
		}
		if (CommonUtil.isNotNullOrEmpty(voDokumenInternal.getTipePengirimSurat())) {
			dokumenInternal.setTipePengirimSurat(tipePengirimSuratConverter
					.transferVOToModel(voDokumenInternal.getTipePengirimSurat(), new TipePengirimSurat()));
		}
		if (CommonUtil.isNotNullOrEmpty(voDokumenInternal.getSifatSurat())) {
			dokumenInternal.setSifatSurat(
					sifatSuratConverter.transferVOToModel(voDokumenInternal.getSifatSurat(), new SifatSurat()));
		}
		if (CommonUtil.isNotNullOrEmpty(voDokumenInternal.getStatusBerkas())) {
			dokumenInternal.setStatusBerkas(
					statusBerkasConverter.transferVOToModel(voDokumenInternal.getStatusBerkas(), new StatusBerkas()));
		}
		if (CommonUtil.isNotNullOrEmpty(voDokumenInternal.getKlasifikasiArsip())) {
			dokumenInternal.setKlasifikasiArsip(klasifikasiArsipConverter
					.transferVOToModel(voDokumenInternal.getKlasifikasiArsip(), new KlasifikasiArsip()));
		}
		if (CommonUtil.isNotNullOrEmpty(voDokumenInternal.getSubKlasifikasiArsip())) {
			dokumenInternal.setSubKlasifikasiArsip(subKlasifikasiArsipConverter
					.transferVOToModel(voDokumenInternal.getSubKlasifikasiArsip(), new SubKlasifikasiArsip()));
		}
		if (CommonUtil.isNotNullOrEmpty(voDokumenInternal.getKdpegawaitujuan())) {
			dokumenInternal.setKdpegawaitujuan(
					loginUserConverter.transferVOToModel(voDokumenInternal.getKdpegawaitujuan(), new Pegawai()));
		}
		if (CommonUtil.isNotNullOrEmpty(voDokumenInternal.getPegawaiPengirimSurat())) {
			dokumenInternal.setUserPengirimSurat(
					loginUserConverter.transferVOToModel(voDokumenInternal.getPegawaiPengirimSurat(), new Pegawai()));
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getRuanganPengirim())) {
			dokumenInternal
					.setRuanganPengirim(ruanganConverter.transferVOToModel(vo.getRuanganPengirim(), new Ruangan()));
		}
		if (CommonUtil.isNotNullOrEmpty(voDokumenInternal.getStatusKeaktifan())) {
			dokumenInternal.setStatusKeaktifan(statusYaTidakConverter
					.transferVOToModel(voDokumenInternal.getStatusKeaktifan(), new StatusYaTidak()));
		}
		Pegawai loginUser = loginUserService.getLoginUser().getPegawai();
		dokumenInternal.setPegawaiPenerimaSurat(loginUser);
		dokumenInternal.setKeteranganlainnya(vo.getKeterangan());
		dokumenInternal.setNodokumen_intern(vo.getNomorSuratInternal());
		dokumenInternal.setTglSurat(vo.getTanggalSurat());
		StatusYaTidak statusVerifikasi = new StatusYaTidak();
		statusVerifikasi.setId(1);
		dokumenInternal.setStatusVerifikasi(statusVerifikasi);
		if (CommonUtil.isNotNullOrEmpty(vo.getJenisSurat())) {
			dokumenInternal.setJenisSurat(jenisSuratConverter.transferVOToModel(vo.getJenisSurat(), new JenisSurat()));
		}
		/* End Of Converter Dokumen Internal */

		/* Save Dokumen Internal */
		DokumenInternal resultModelDokumenInternal = new DokumenInternal();
		if (CommonUtil.isNotNullOrEmpty(dokumenInternal)) {
			resultModelDokumenInternal = dokumenInternalDao.save(dokumenInternal);
		}
		if (CommonUtil.isNotNullOrEmpty(resultModelDokumenInternal)) {
			result.put("dokumenInternal", resultModelDokumenInternal);
		}

		return result;
	}

	@Override
	public Map<String, Object> findAllSuratMasukInternal(SuratMasukInternalVO vo) {
		return null;
	}

	@Override
	public Map<String, Object> findAllWithPageAndLimitAndSortByAndDirectionParameter(
			Specification<DokumenInternal> spec, Pageable pageable) {
		return null;
	}

	@Override
	public Map<String, Object> dokumenInternalPaging(Integer page, Integer limit, String sort, String dir,
			String dateStart, String dateEnd, String noKirim) {
		int totalRow = dokumenInternalDaoCustom.findDokumenInternalCount(sort, dateStart, dateEnd, noKirim);
		int totalPages = 0;

		int pageRequested = page;

		if (totalRow > 0) {
			totalPages = (int) Math.ceil((double) totalRow / (double) limit);
		} else {
			totalPages = 0;
		}

		if (pageRequested > totalPages)
			pageRequested = totalPages;
		int rowStart = pageRequested * limit - limit;
		if (rowStart < 0) {
			rowStart = 0;
		}
		int rowEnd = limit;
		List<DokumenInternalDto> dokumenInternalList = dokumenInternalDaoCustom.findDokumenInternal(rowStart, rowEnd,
				sort, dir, dateStart, dateEnd, noKirim);

		List<GridDokumenInternal> gridDokumenInternalList = new ArrayList<GridDokumenInternal>();
		for (DokumenInternalDto model : dokumenInternalList) {

			GridDokumenInternal gridDokumenInternal = new GridDokumenInternal();
			if (CommonUtil.isNotNullOrEmpty(model.getDokumenInternal())) {
				gridDokumenInternal.setNoRec(model.getDokumenInternal().getNoRec());
				gridDokumenInternal.setNoSurat(model.getDokumenInternal().getNodokumen_intern());
				gridDokumenInternal.setTglTerima(model.getDokumenInternal().getTglTerima());
				if (CommonUtil.isNotNullOrEmpty(model.getDokumenInternal().getUserPengirimSurat())) {
					gridDokumenInternal
							.setPenerimaSurat(model.getDokumenInternal().getUserPengirimSurat().getNamaLengkap());
				}
				if (CommonUtil.isNotNullOrEmpty(model.getDokumenInternal().getRuanganPenerima())) {
					gridDokumenInternal
							.setRuanganPenerima(model.getDokumenInternal().getRuanganPenerima().getNamaRuangan());
				}
				if (CommonUtil.isNotNullOrEmpty(model.getNoKirim())) {
					gridDokumenInternal.setNoKirim(model.getNoKirim());
				} else {
					gridDokumenInternal.setNoKirim("");
				}
				gridDokumenInternalList.add(gridDokumenInternal);
			}
		}

		return constructMapReturn(gridDokumenInternalList, totalRow, totalPages);

	}

	@Override
	@Transactional(readOnly = false)
	public Map<String, Object> setDistribusiKirimSuratInternalEksternal(SuratMasukInternalVO vo) {
		Map<String, Object> result = new HashMap<String, Object>();

		DokumenInternal dokumenInternal = dokumenInternalDao.findByNoRec(vo.getNoRec());

		StrukKirim strukKirim = new StrukKirim();
		if (CommonUtil.isNotNullOrEmpty(dokumenInternal.getNokirim())) {
			strukKirim = strukKirimDao.findOne(dokumenInternal.getNokirim().getNoRec());
		}
		if (CommonUtil.isNotNullOrEmpty(vo.getUserPenerimaDistribusiSurat())) {
			strukKirim.setPegawaiPenerima(
					loginUserConverter.transferVOToModel(vo.getUserPenerimaDistribusiSurat(), new Pegawai()));
		}
		if (CommonUtil.isNotNullOrEmpty(loginUserService.getLoginUser())) {
			strukKirim.setPegawaiPengirim(loginUserService.getLoginUser().getPegawai());
		}

		Ruangan ruangan = new Ruangan();
		ruangan.setId(1);
		strukKirim.setKdruangan(ruangan); // Ruangan TU

		if (CommonUtil.isNotNullOrEmpty(dokumenInternal.getKdruangantujuan())) {
			strukKirim.setKdruangantujuan(dokumenInternal.getKdruangantujuan());
		}
		if (CommonUtil.isNotNullOrEmpty(dokumenInternal.getRuanganPengirim())) {
			strukKirim.setKdruanganasal(dokumenInternal.getRuanganPengirim());
		}
		if (CommonUtil.isNotNullOrEmpty(dokumenInternal.getPegawaiPenerimaSurat().getNamaLengkap())) {
			strukKirim.setNamapenerima(dokumenInternal.getPegawaiPenerimaSurat().getNamaLengkap());
		}
		if (CommonUtil.isNotNullOrEmpty(getRunningNumber("KirimProduk"))) {
			strukKirim.setNokirim(getRunningNumber("KirimProduk"));
		}
		if (CommonUtil.isNotNullOrEmpty(new Date())) {
			Date tglKirim = new Date();
			strukKirim.setTglkirim(tglKirim);
		}

		strukKirim.setTotalbiayakirim((double) 0.0);
		strukKirim.setQtydetailjenisproduk((double) 0.0);
		strukKirim.setQtyproduk((double) 0.0);
		strukKirim.setTotalbeamaterai((double) 0.0);
		strukKirim.setTotalbiayakirim((double) 0.0);
		strukKirim.setTotalbiayatambahan((double) 0.0);
		strukKirim.setTotaldiscount((double) 0.0);
		strukKirim.setTotalhargasatuan((double) 0.0);
		strukKirim.setTotalharusdibayar((double) 0.0);
		strukKirim.setTotalpph((double) 0.0);
		strukKirim.setTotalppn((double) 0.0);

		StrukKirim resultStrukKirim = strukKirimDao.save(strukKirim);
		if (CommonUtil.isNotNullOrEmpty(resultStrukKirim)) {
			result.put("StrukKirim", resultStrukKirim.getNoRec());
		}

		dokumenInternal.setNokirim(resultStrukKirim);
		DokumenInternal resultDokumenInternal = dokumenInternalDao.save(dokumenInternal);
		if (CommonUtil.isNotNullOrEmpty(resultDokumenInternal)) {
			result.put("DokumenInternal", dokumenInternal.getNoRec());
		}
		return result;
	}

	@Autowired
	private RunningNumberDao runningNumberDao;

	@Transactional
	private String getRunningNumber(String kegunaan) {
		RunningNumber runningNumber = runningNumberDao.findByResetAndKegunaan("0", kegunaan);
		if (runningNumber == null) {
			runningNumber = new RunningNumber();
			runningNumber.setKegunaan(kegunaan);
			runningNumber.setReset("0");
			runningNumber.setNomerTerbaru((Integer) 0);
		}
		Integer number = (runningNumber.getNomerTerbaru() + (Integer) 1);
		runningNumber.setNomerTerbaru(runningNumber.getNomerTerbaru() + (Integer) 1);
		runningNumberDao.save(runningNumber);
		String noOrderIntern = StringUtil.formatNumber(number.toString(), 10);
		return noOrderIntern;
	}

	@Override
	public DokumenInternalVO findByNoRec(String noRec) {
		DokumenInternal dokumenInternal = dokumenInternalDao.findByNoRec(noRec);
		DokumenInternalVO vo = new DokumenInternalVO();
		if (CommonUtil.isNotNullOrEmpty(dokumenInternal)) {
			vo = dokumenInternalConverter.transferModelToVO(dokumenInternal, new DokumenInternalVO());
		}
		return vo;
	}

}
