package com.jasamedika.medifirst2000.service.impl;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import com.jasamedika.medifirst2000.converter.BaseConverterImpl;
import com.jasamedika.medifirst2000.dao.JenisTransaksiDao;
import com.jasamedika.medifirst2000.dao.KelompokProdukDao;
import com.jasamedika.medifirst2000.dao.KirimProdukDao;
import com.jasamedika.medifirst2000.dao.ProdukDao;
import com.jasamedika.medifirst2000.dao.RunningNumberDao;
import com.jasamedika.medifirst2000.dao.SatuanStandarDao;
import com.jasamedika.medifirst2000.dao.StokProdukDetailDao;
import com.jasamedika.medifirst2000.dao.StokProdukGlobalDao;
import com.jasamedika.medifirst2000.dao.StrukHistoriDao;
import com.jasamedika.medifirst2000.dao.StrukKirimDao;
import com.jasamedika.medifirst2000.dao.StrukKonfirmasiDao;
import com.jasamedika.medifirst2000.dao.StrukOrderDao;
import com.jasamedika.medifirst2000.dao.StrukPelayananDao;
import com.jasamedika.medifirst2000.dao.custom.DestroyProdukDetailDaoCustom;
import com.jasamedika.medifirst2000.dao.custom.StokProdukDetailDaoCustom;
import com.jasamedika.medifirst2000.dao.custom.StokProdukGlobalDaoCustom;
import com.jasamedika.medifirst2000.dao.custom.StrukKirimDaoCustom;
import com.jasamedika.medifirst2000.dao.custom.StrukOrderDaoCustom;
import com.jasamedika.medifirst2000.entities.AsalProduk;
import com.jasamedika.medifirst2000.entities.DestroyProduk;
import com.jasamedika.medifirst2000.entities.DestroyProdukDetail;
import com.jasamedika.medifirst2000.entities.DestroyProdukPetugas;
import com.jasamedika.medifirst2000.entities.JenisPermintaan;
import com.jasamedika.medifirst2000.entities.KelompokTransaksi;
import com.jasamedika.medifirst2000.entities.KirimProduk;
import com.jasamedika.medifirst2000.entities.OrderPelayanan;
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.SatuanStandar;
import com.jasamedika.medifirst2000.entities.StrukHistori;
import com.jasamedika.medifirst2000.entities.StrukKirim;
import com.jasamedika.medifirst2000.entities.StrukOrder;
import com.jasamedika.medifirst2000.entities.StrukPelayanan;
import com.jasamedika.medifirst2000.service.KartuStokService;
import com.jasamedika.medifirst2000.service.LoginUserService;
import com.jasamedika.medifirst2000.service.PemusnahanBarangService;
import com.jasamedika.medifirst2000.service.StokProdukGlobalService;
import com.jasamedika.medifirst2000.service.StrukOrderService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.DateUtil;
import com.jasamedika.medifirst2000.util.StringUtil;
import com.jasamedika.medifirst2000.vo.AsalProdukVO;
import com.jasamedika.medifirst2000.vo.DestroyProdukVO;
import com.jasamedika.medifirst2000.vo.JenisPermintaanVO;
import com.jasamedika.medifirst2000.vo.PegawaiVO;
import com.jasamedika.medifirst2000.vo.ProdukVO;
import com.jasamedika.medifirst2000.vo.RequestBarangDariRuanganDetailVO;
import com.jasamedika.medifirst2000.vo.RequestBarangDariRuanganVO;
import com.jasamedika.medifirst2000.vo.RuanganVO;
import com.jasamedika.medifirst2000.vo.SatuanStandarVO;
import com.jasamedika.medifirst2000.vo.StrukHistoriVO;
import com.jasamedika.medifirst2000.vo.StrukPelayananVO;


/**
 * 
 * @author adik
 */
@Service("pemusnahanBarangService")
public class PemusnahanBarangServiceImpl extends BaseAngaranServiceImpl implements PemusnahanBarangService{
	
	@Autowired
	private BaseConverterImpl<JenisPermintaanVO,JenisPermintaan> jenisPermintaanConverter;
	
	@Autowired
	private BaseConverterImpl<StrukPelayananVO,StrukPelayanan> strukPelayananConverter;
	
	@Autowired
	private BaseConverterImpl<StrukHistoriVO,StrukHistori> strukHistoriConverter;
	
	@Autowired
	private BaseConverterImpl<RuanganVO, Ruangan> ruanganConverter;
	
	@Autowired
	private BaseConverterImpl<DestroyProdukVO, DestroyProduk> destroyProdukConverter;
	
	
	@Autowired
	private BaseConverterImpl<ProdukVO, Produk> produkConverter;
	
	@Autowired
	private BaseConverterImpl<PegawaiVO, Pegawai> pegawaiConverter;
	
	@Autowired
	private ProdukDao produkDao;
	
	@Autowired
	private KelompokProdukDao kelompokProdukDao;
	
	@Autowired
	private StrukPelayananDao strukPelayananDao;
	
	@Autowired
	private StrukHistoriDao strukHistoriDao;
	
	@Autowired
	private KartuStokService kartuStokService;
	
	@Autowired
	private StokProdukGlobalDaoCustom stokProdukGlobalDaoCustom;
	
	@Autowired
	private RunningNumberDao runningNumberDao;
	
	@Autowired
	private StrukKirimDao strukKirimDao;
	
	@Autowired
	private StrukOrderService strukOrderService;
	
	@Autowired
	private BaseConverterImpl<SatuanStandarVO, SatuanStandar> satuanStandarConverter;
	
	@Autowired
	private BaseConverterImpl<AsalProdukVO, AsalProduk> asalProdukConverter;
	
	@Autowired
	private StrukOrderDao strukOrderDao;
	
	@Autowired
	private LoginUserService loginUserService;
	
	@Autowired
	private StokProdukGlobalService stokProdukGlobalService;
	
	@Autowired
	private DestroyProdukDetailDaoCustom destroyProdukDetailDaoCustom;
	


	@Override
	@Transactional(readOnly=false)
	public Map<String, Object> saveRequestPermintaanBarang(RequestBarangDariRuanganVO vo) {
		StrukOrder strukOrder=new StrukOrder();
		String noUrut=strukOrderService.formatNoUrut("Struk Order", "STO");
		strukOrder.setNoOrder(noUrut);
		strukOrder.setNoOrderIntern(noUrut);
		strukOrder.setTglOrder(vo.getTglOrder());
		strukOrder.setQtyJenisProduk(0.0);
		strukOrder.setQtyProduk(0.0);
		strukOrder.setTotalBeaMaterai(0.0);
		strukOrder.setTotalHargaSatuan(0.0);
		strukOrder.setTotalBiayaKirim(0.0);
		strukOrder.setTotalBiayaTambahan(0.0);
		strukOrder.setTotalDiscount(0.0);
		strukOrder.setTotalHarusDibayar(0.0);
		strukOrder.setTotalPph(0.0);
		strukOrder.setTotalPpn(0.0);
		strukOrder.setPegawaiOrder(loginUserService.getLoginUser().getPegawai());
		strukOrder.setIsDelivered((byte) 1);
		strukOrder.setKeteranganOrder("Permintaan Barang Dari Ruangan (Pemusnahan)");
		KelompokTransaksi kelompokTransaksi = new KelompokTransaksi();
		kelompokTransaksi.setId(Integer.parseInt(GetSettingDataFixed("KdKelompokTransaksiOrderBarang")));
		strukOrder.setKelompokTransaksi(kelompokTransaksi);
		if(CommonUtil.isNotNullOrEmpty(vo.getJenisPermintaanVO())){
			strukOrder.setJenisPermintaan(jenisPermintaanConverter.transferVOToModel(vo.getJenisPermintaanVO(), new JenisPermintaan()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getRuanganTujuan())){
			strukOrder.setRuanganTujuan(ruanganConverter.transferVOToModel(vo.getRuangan(),new Ruangan()));
		}
		
		if(CommonUtil.isNotNullOrEmpty(vo.getRuangan())){
			strukOrder.setRuangan(ruanganConverter.transferVOToModel(vo.getRuanganTujuan(),new Ruangan()));
		}
		
		if(CommonUtil.isNotNullOrEmpty(vo.getRequestBarangDariRuanganDetail())){
			for(RequestBarangDariRuanganDetailVO modelVo:vo.getRequestBarangDariRuanganDetail()){
				OrderPelayanan orderPelayanan=new OrderPelayanan();
				orderPelayanan.setNoOrder(strukOrder);
				orderPelayanan.setQtyProduk(modelVo.getQtyProduk());				
				orderPelayanan.setQtyStokCurrent(modelVo.getStok());
				orderPelayanan.setStrukOrder(strukOrder);
				orderPelayanan.setQtyProdukRetur(0.0);
				orderPelayanan.setIsCito((byte) 1);
				orderPelayanan.setTglPelayanan(strukOrder.getTglOrder());
				if(CommonUtil.isNotNullOrEmpty(modelVo.getProduk())){
					orderPelayanan.setProduk(produkConverter.transferVOToModel(modelVo.getProduk(), new Produk()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(vo.getRuanganTujuan())){
					orderPelayanan.setRuanganTujuan(ruanganConverter.transferVOToModel(vo.getRuanganTujuan(),new Ruangan()));
				}
				if(CommonUtil.isNotNullOrEmpty(vo.getRuangan())){
					orderPelayanan.setRuangan(ruanganConverter.transferVOToModel(vo.getRuangan(),new Ruangan()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(modelVo.getAsalProduk())){
					orderPelayanan.setAsalproduk(asalProdukConverter.transferVOToModel(modelVo.getAsalProduk(), new AsalProduk()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(modelVo.getSatuanStandar())){
					orderPelayanan.setSatuanStandar(satuanStandarConverter.transferVOToModel(modelVo.getSatuanStandar(), new SatuanStandar()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(modelVo.getProduk()) &&  CommonUtil.isNotNullOrEmpty(modelVo.getSatuanStandar())){
					Map<String,Object> satuan=produkDao.getSatuanProdukByProduk(modelVo.getProduk().getId());
					if(CommonUtil.isNotNullOrEmpty(satuan.get("id")) && CommonUtil.isNotNullOrEmpty(modelVo.getSatuanStandar().getId())){
						orderPelayanan.setHasilKonversi(strukOrderService.konversi((Integer) satuan.get("id"),modelVo.getSatuanStandar().getId(), modelVo.getQtyProduk()));
					}
				}
				strukOrder.getOrderPelayanan().add(orderPelayanan);
			}
		}
		strukOrder=strukOrderDao.save(strukOrder);
		Map<String,Object> result=new HashMap<String,Object>();
		result.put("noRec", strukOrder.getNoRec());
		RequestBarangDariRuanganVO tmp=new RequestBarangDariRuanganVO();
		tmp.setNoOrder(strukOrder.getNoRec());
		tmp.setTglOrder(new Date());
		tmp.setRuangan(vo.getRuangan());
		tmp.setRuanganTujuan(vo.getRuanganTujuan());
		tmp.setJenisPermintaanVO(vo.getJenisPermintaanVO());
		tmp.setStatusBarang(vo.getStatusBarang());
		Set<RequestBarangDariRuanganDetailVO> tmpetail=new HashSet<RequestBarangDariRuanganDetailVO>();
		for(RequestBarangDariRuanganDetailVO dataDetail:vo.getRequestBarangDariRuanganDetail()){
			RequestBarangDariRuanganDetailVO tmpVo=new RequestBarangDariRuanganDetailVO();
			tmpVo.setQtyProdukKonfirmasi(dataDetail.getQtyProduk());
			tmpVo.setQtyOrder(dataDetail.getQtyProduk());
			tmpVo.setAsalProduk(dataDetail.getAsalProduk());
			tmpVo.setProduk(dataDetail.getProduk());
			tmpVo.setSatuanStandar(dataDetail.getSatuanStandar());
			tmpVo.setQtyProduk(0.0);
			tmpetail.add(tmpVo);
		}
		tmp.getRequestBarangDariRuanganDetail().addAll(tmpetail);
		saveKirimBarangDariRuangan(tmp);
		return result;
		
	}
	
	public Map<String, Object> saveKirimBarangDariRuangan(RequestBarangDariRuanganVO vo) {
		StrukKirim strukKirim=new StrukKirim();
		StrukOrder strukOrder = strukOrderDao.findOne(vo.getNoOrder());
		strukKirim.setNoorder(strukOrder);
	
		strukKirim.setNokirim(StringUtil.formatNumber(String.valueOf(strukOrderDao.getCountByMonthAndYear(new Date()) + 1), 10));
		String noUrut=strukOrderService.formatNoUrut("KRIM", "KRM");
		strukKirim.setNokirim_intern(noUrut);
		strukKirim.setNokirim(noUrut);
		strukKirim.setTglkirim(vo.getTglOrder());
		strukKirim.setQtydetailjenisproduk(0.0);
		strukKirim.setQtyproduk(0.0);
		strukKirim.setTotalbeamaterai(0.0);
		strukKirim.setTotalhargasatuan(0.0);
		strukKirim.setTotalbiayakirim(0.0);
		strukKirim.setTotalbiayatambahan(0.0);
		strukKirim.setTotaldiscount(0.0);
		strukKirim.setTotalharusdibayar(0.0);
		strukKirim.setTotalpph(0.0);
		strukKirim.setTotalppn(0.0);
		strukKirim.setPegawaiPengirim(loginUserService.getLoginUser().getPegawai());
		
		strukKirim.setKeteranganlainnyakirim("Pengiriman Barang Ke Ruangan");
		KelompokTransaksi kelompokTransaksi = new KelompokTransaksi();
		kelompokTransaksi.setId(Integer.parseInt(GetSettingDataFixed("KdKelompokTransaksiKirimBarang")));
		strukKirim.setKelompokTransaksi(kelompokTransaksi);
		if(CommonUtil.isNotNullOrEmpty(vo.getJenisPermintaanVO())){
			strukKirim.setJenisPermintaan(jenisPermintaanConverter.transferVOToModel(vo.getJenisPermintaanVO(), new JenisPermintaan()));
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getRuanganTujuan())){
			strukKirim.setKdruangantujuan(ruanganConverter.transferVOToModel(vo.getRuangan(),new Ruangan()));
		}
		
		if(CommonUtil.isNotNullOrEmpty(vo.getRuangan())){
			strukKirim.setKdruanganasal(ruanganConverter.transferVOToModel(vo.getRuanganTujuan(),new Ruangan()));
			strukKirim.setKdruangan(ruanganConverter.transferVOToModel(vo.getRuanganTujuan(),new Ruangan()));
		}
//		if(CommonUtil.isNotNullOrEmpty(vo.getStatusBarang())){
//			strukOrder.setStatusBarang(statusBarangConverter.transferVOToModel(vo.getStatusBarang(), new StatusBarang()));
//		}
		
		if(CommonUtil.isNotNullOrEmpty(vo.getRequestBarangDariRuanganDetail())){
			for(RequestBarangDariRuanganDetailVO modelVo:vo.getRequestBarangDariRuanganDetail()){
				KirimProduk orderPelayanan=new KirimProduk();
				orderPelayanan.setNamaKonfirmasi(modelVo.getNamaKonfirmasi());
				orderPelayanan.setNoKirim(strukKirim);
				orderPelayanan.setHargaDiscount(0.0);
				orderPelayanan.setHargaNetto(0.0);
				orderPelayanan.setHargaPph(0.0);
				orderPelayanan.setHargaPpn(0.0);
				orderPelayanan.setHargaSatuan(0.0);
				orderPelayanan.setHargaTambahan(0.0);
				orderPelayanan.setPersenDiscount(0.0);
				orderPelayanan.setQtyProdukKonfirmasi(0.0);
				orderPelayanan.setQtyProdukOuText(0.0);
				orderPelayanan.setQtyProdukOutInt(0.0);
				orderPelayanan.setQtyProdukRetur(0.0);
				orderPelayanan.setQtyProdukTerima(0.0);
				orderPelayanan.setSatuan("");
				orderPelayanan.setQtyOrder(modelVo.getQtyOrder());
				orderPelayanan.setQtyProduk(modelVo.getQtyProduk());
				orderPelayanan.setRuanganPengirim(getRuanganByUserLogin());
				orderPelayanan.setQtyProdukKonfirmasi(modelVo.getQtyProdukKonfirmasi());
				orderPelayanan.setNamaKonfirmasi(modelVo.getNamaKonfirmasi());
				orderPelayanan.setQtyProdukRetur(0.0);
				orderPelayanan.setTglpelayanan(strukKirim.getTglkirim());

				if(CommonUtil.isNotNullOrEmpty(modelVo.getAsalProduk())){
					orderPelayanan.setAsalProduk(asalProdukConverter.transferVOToModel(modelVo.getAsalProduk(), new AsalProduk()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(modelVo.getProduk())){
					orderPelayanan.setProduk(produkConverter.transferVOToModel(modelVo.getProduk(), new Produk()));
				}
				
				//ruangan Tujuan
				if(CommonUtil.isNotNullOrEmpty(vo.getRuangan())){
					orderPelayanan.setRuangan(ruanganConverter.transferVOToModel(vo.getRuanganTujuan(),new Ruangan()));
				}
				
				if(CommonUtil.isNotNullOrEmpty(modelVo.getSatuanStandar())){
					orderPelayanan.setSatuanStandar(satuanStandarConverter.transferVOToModel(modelVo.getSatuanStandar(), new SatuanStandar()));
				}
				
				strukKirim.getKirimProduk().add(orderPelayanan);
			}
		}
		strukKirim=strukKirimDao.save(strukKirim);
		Map<String,Object> result=new HashMap<String,Object>();
		result.put("noRec", strukKirim.getNoRec());
		
		return result;
	}
	
	

	
	
	@Override
	public Map<String, Object> listStokDetail(Integer page, Integer limit, String sort, String dir,Integer kelompokProdukId, Integer jenisProdukId, Integer produkId) {
		int totalRow=0;
		//modif
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			if(kelompokProdukId==20){
				totalRow = stokProdukGlobalDaoCustom.preAddPemusnahanBarangAset(kelompokProdukId,jenisProdukId,produkId);
			}else{
				if(kelompokProdukId!=0)
				totalRow = stokProdukGlobalDaoCustom.preAddPemusnahanBarangKadaluarsa(kelompokProdukId,jenisProdukId,produkId);
			}
		}
		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;
		Map<String, Object> result = new HashMap<String, Object>();
		
		//modif
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			if(kelompokProdukId==20){
				result.put("data", stokProdukGlobalDaoCustom.preAddPemusnahanBarangAset(rowStart, rowEnd, sort, dir, kelompokProdukId,jenisProdukId,produkId));
			}else{
				if(kelompokProdukId!=0)
					result.put("data", stokProdukGlobalDaoCustom.preAddPemusnahanBarangKadaluarsaList(rowStart, rowEnd, sort, dir, kelompokProdukId,jenisProdukId,produkId));
			}
		}

		result.put("totalPages", totalPages);
		result.put("totalRow", totalRow);
		return result;
	}
	
	

	@Override
	@Transactional(readOnly=false)
	public Map<String, Object> savePemusnahanBarang(StrukHistoriVO vo) {
		Map<String,Object>result=new HashMap<String,Object>();
		StrukHistori strukHistoy=new StrukHistori();
		strukHistoy=strukHistoriConverter.transferVOToModel(vo, new StrukHistori());
		String noUrut=strukOrderService.formatNoUrut("Pemusnahan", "PMA");
		strukHistoy.setNonHistori(noUrut);
		Set<DestroyProduk> destroyProduks=new HashSet<DestroyProduk>();
		Set<DestroyProdukPetugas> destroyProdukPetugas=new HashSet<DestroyProdukPetugas>();
		if(CommonUtil.isNotNullOrEmpty(vo.getPenanggungJawab())){
			DestroyProdukPetugas d=new DestroyProdukPetugas();
			d.setPegawai(pegawaiConverter.transferVOToModel(vo.getPenanggungJawab(), new Pegawai()));
			d.setIsPetugasPepJawab((byte) 1);
			d.setStrukHistory(strukHistoy);
			d.setStatusEnabled(true);
			destroyProdukPetugas.add(d);
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getSaksiSatu())){
			DestroyProdukPetugas d=new DestroyProdukPetugas();
			d.setPegawai(pegawaiConverter.transferVOToModel(vo.getSaksiSatu(), new Pegawai()));
			d.setIsPetugasPepJawab((byte) 0);
			d.setStrukHistory(strukHistoy);
			d.setStatusEnabled(true);
			destroyProdukPetugas.add(d);
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getSaksiDua())){
			DestroyProdukPetugas d=new DestroyProdukPetugas();
			d.setPegawai(pegawaiConverter.transferVOToModel(vo.getSaksiDua(), new Pegawai()));
			d.setIsPetugasPepJawab((byte) 0);
			d.setStrukHistory(strukHistoy);
			d.setStatusEnabled(true);
			destroyProdukPetugas.add(d);
		}
		if(CommonUtil.isNotNullOrEmpty(vo.getRuangan())){
			strukHistoy.setRuangan(ruanganConverter.transferVOToModel(vo.getRuangan(),new Ruangan()));
			strukHistoy.setTglHistori(new Date());
			
			if(CommonUtil.isNotNullOrEmpty(vo.getDestroyProduk())){
				for(DestroyProdukVO modelVo:vo.getDestroyProduk()){
					DestroyProduk model=new DestroyProduk();
					model.setStatusEnabled(true);
					DestroyProdukDetail destroyProdukDetail=new DestroyProdukDetail();
					destroyProdukDetail.setStatusEnabled(true);
					model=destroyProdukConverter.transferVOToModel(modelVo, new DestroyProduk());
					model.setStrukHistory(strukHistoy);
					destroyProdukDetail.setStrukHistory(strukHistoy);
					destroyProdukDetail.setNobatch(modelVo.getNoBatch());
					destroyProdukDetail.setTglKadaluarsa(modelVo.getTglExpired());
					if(CommonUtil.isNotNullOrEmpty(modelVo.getProduk())){
						model.setProduk(produkConverter.transferVOToModel(modelVo.getProduk(), new Produk()));
						destroyProdukDetail.setProduk(produkConverter.transferVOToModel(modelVo.getProduk(), new Produk()));
					}
					
					if(CommonUtil.isNotNullOrEmpty(modelVo.getRuangan())){
						model.setRuangan(ruanganConverter.transferVOToModel(modelVo.getRuangan(), new Ruangan()));
						destroyProdukDetail.setRuangan(ruanganConverter.transferVOToModel(modelVo.getRuangan(), new Ruangan()));
					}
					
					if(CommonUtil.isNotNullOrEmpty(modelVo.getStrukPelayanan())){
						model.setStrukPelayanan(strukPelayananConverter.transferVOToModel(modelVo.getStrukPelayanan(), new StrukPelayanan()));
						destroyProdukDetail.setStrukPelayanan(strukPelayananConverter.transferVOToModel(modelVo.getStrukPelayanan(), new StrukPelayanan()));
					}
					
					if(CommonUtil.isNotNullOrEmpty(modelVo.getAsalProduk())){
						model.setAsalProduk(asalProdukConverter.transferVOToModel(modelVo.getAsalProduk(), new AsalProduk()));
						destroyProdukDetail.setAsalProduk(asalProdukConverter.transferVOToModel(modelVo.getAsalProduk(), new AsalProduk()));
					}
					model.getDestroyProdukDetail().clear();
					destroyProdukDetail.setQtyProduk(modelVo.getQtyProduk());
					destroyProdukDetail.setDestroyProduk(model);
					destroyProdukDetail.setTglKadaluarsa(modelVo.getTglExpired());
					model.getDestroyProdukDetail().add(destroyProdukDetail);
					destroyProduks.add(model);
					if(CommonUtil.isNotNullOrEmpty(modelVo.getStrukPelayanan()) && CommonUtil.isNotNullOrEmpty(modelVo.getRuangan()) && CommonUtil.isNotNullOrEmpty(modelVo.getProduk())){
						StrukPelayanan strukPelayanan=new StrukPelayanan();
						if(CommonUtil.isNotNullOrEmpty(modelVo.getStrukPelayanan())){
							strukPelayananDao.findOne(modelVo.getStrukPelayanan().getNoRec());
						}
						if(CommonUtil.isNotNullOrEmpty(model.getProduk())){
							Produk p=produkDao.findByIdObject(model.getProduk().getId());
							if(CommonUtil.isNotNullOrEmpty(p.getDetailJenisProduk())){
								if(p.getDetailJenisProduk().getIsRegistrasiAset()==1){
									
								}else{
									//update Stok Produk GLobal
									stokProdukGlobalService.updateStokPemusnahanBarang(model.getProduk(), model.getQtyProduk(), model.getRuangan());
									
									//update SOk Produk Detail
									stokProdukGlobalService.updateStokProdukDetailPemusnahanBarang(model.getProduk().getId(), model.getRuangan(), model.getQtyProduk(), strukPelayanan);
									
									//update Kartu Stok
									kartuStokService.saveKartuStok(model.getQtyProduk(), model.getProduk(), model.getRuangan(), "Pemusnahan Barang", false, new Date());
								}
							}
						}
						
					
					}
				}
			}
		}
		strukHistoy.getDestroyProduk().clear();
		strukHistoy.getDestroyProdukPetugas().clear();
		strukHistoy.getDestroyProdukDetail().clear();
		strukHistoy.getDestroyProdukPetugas().addAll(destroyProdukPetugas);
		strukHistoy.getDestroyProduk().addAll(destroyProduks);
		strukHistoy=strukHistoriDao.save(strukHistoy);
		result.put("noRec", strukHistoy.getNoRec());
		return result;
	}
	
	@Override
	public Map<String, Object> listPemusnahanBarang(Integer page, Integer limit, String sort, String dir,String dateStar,String dateEnd,Integer kelompokProdukId, Integer jenisProdukId, Integer produkId) {
		int totalRow = destroyProdukDetailDaoCustom.daftarPemusnahanBarangCount(dateStar,dateEnd,kelompokProdukId,jenisProdukId,produkId);
		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;
		Map<String, Object> result = new HashMap<String, Object>();
		result.put("data", destroyProdukDetailDaoCustom.daftarPemusnahanBarangList(rowStart, rowEnd, sort, dir,dateStar,dateEnd, kelompokProdukId,jenisProdukId,produkId));
		result.put("totalPages", totalPages);
		result.put("totalRow", totalRow);
		return result;
	}

	@Override
	public Map<String, Object> cetakListPemusnahanBarang(String dateStart, String dateEnd, Integer kelompokProdukId,Integer jenisProdukId, Integer produkId) {
		Map<String,Object> result=new HashMap<String,Object>();
		Map<String,Object> header=new HashMap<String,Object>();
		header.put("tanggalAwal", dateStart);
		header.put("tanggalAhir", dateEnd);
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukId)){
			header.put("kelompokProduk",kelompokProdukDao.findByKelompokProdukId(kelompokProdukId).get("kelompokProduk") );
			
		}else{
			header.put("kelompokProduk", "");
		}
		
		if(CommonUtil.isNotNullOrEmpty(kelompokProdukDao.findByJenisProdukId(jenisProdukId))){
			header.put("jenisProduk", kelompokProdukDao.findByJenisProdukId(jenisProdukId).get("jenisProduk"));
		}else{
			header.put("jenisProduk", "");
		}
		
		
		header.put("ruangan", kelompokProdukDao.findByRuanganId(getRuanganByUserLogin().getId()).get("namaRuangan"));
		
		if(CommonUtil.isNotNullOrEmpty(produkId)){
			header.put("produk", kelompokProdukDao.findByProdukId(produkId).get("namaProduk"));
		}else{
			header.put("produk", "");
		}
		result.put("header",header);
		result.put("data", destroyProdukDetailDaoCustom.cetakDaftarPemusnahanBarangList(dateStart,dateEnd, kelompokProdukId,jenisProdukId,produkId));
		return result;
	}
	
	@RequestMapping(value = "/get-no-pemusnahan", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
	public Map<String,Object>  getNoKonfirmasi() {

		Map<String, Object> result = new HashMap<String,Object>();
		result.put("noPemusnahan", strukOrderService.preFormatNoUrut("Pemusnahan", "PMS"));
		return result;
	}
}

