Update SlipGajiService

Pembuatan service generate dan download template slip gaji rekap seluruh pegawai
This commit is contained in:
salmanoe 2023-02-01 08:32:48 +07:00
parent ddc0bbb9eb
commit f1ea106955
6 changed files with 186 additions and 29 deletions

View File

@ -1,6 +1,10 @@
package com.jasamedika.medifirst2000.dao; package com.jasamedika.medifirst2000.dao;
import java.util.List;
import java.util.Map;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import com.jasamedika.medifirst2000.entities.KomponenGaji; import com.jasamedika.medifirst2000.entities.KomponenGaji;
@ -10,5 +14,7 @@ import com.jasamedika.medifirst2000.entities.KomponenGaji;
* *
*/ */
public interface KomponenGajiDao extends JpaRepository<KomponenGaji, Integer> { public interface KomponenGajiDao extends JpaRepository<KomponenGaji, Integer> {
@Query("select new Map(kg.id as id,kg.namaKomponen as namaKomponen) " + "from KomponenGaji kg "
+ "order by kg.jenisKomponen,kg.id")
List<Map<String, Object>> getAll();
} }

View File

@ -353,8 +353,8 @@ public interface MapPegawaiJabatanToUnitKerjaDao extends CrudRepository<MapPegaw
List<MapPegawaiJabatanToUnitKerja> findByPegawaiId(@Param("pegawaiId") Integer pegawaiId); List<MapPegawaiJabatanToUnitKerja> findByPegawaiId(@Param("pegawaiId") Integer pegawaiId);
@Query("select model from MapPegawaiJabatanToUnitKerja model " + "inner join model.pegawai pg " @Query("select model from MapPegawaiJabatanToUnitKerja model " + "inner join model.pegawai pg "
+ "where model.statusEnabled is true " + "and pg.statusEnabled is true") + "where model.statusEnabled is true " + "and pg.statusEnabled is true " + "and pg.namaLengkap <> '-'")
List<MapPegawaiJabatanToUnitKerja> findAll(); List<MapPegawaiJabatanToUnitKerja> getAll();
@Query("select new Map(mapp.id as idMapping, mapp.pegawaiId as idPegawai, mapp.atasanLangsungId as idAtasan, mapp.pejabatPenilaiId as idPenilai) " @Query("select new Map(mapp.id as idMapping, mapp.pegawaiId as idPegawai, mapp.atasanLangsungId as idAtasan, mapp.pejabatPenilaiId as idPenilai) "
+ "from MapPegawaiJabatanToUnitKerja mapp " + "from MapPegawaiJabatanToUnitKerja mapp "

View File

@ -1,5 +1,7 @@
package com.jasamedika.medifirst2000.service; package com.jasamedika.medifirst2000.service;
import java.io.IOException;
import com.jasamedika.medifirst2000.dto.SlipGajiDto; import com.jasamedika.medifirst2000.dto.SlipGajiDto;
/** /**
@ -14,6 +16,6 @@ public interface SlipGajiService {
void updateDetail(SlipGajiDto dto); void updateDetail(SlipGajiDto dto);
SlipGajiDto get(Integer pegawaiId, Long bulan); SlipGajiDto get(Integer pegawaiId, Long bulan);
String writeExcel(Long bulan); String writeExcel(Long bulan) throws IOException;
} }

View File

@ -1,24 +1,33 @@
package com.jasamedika.medifirst2000.service.impl; package com.jasamedika.medifirst2000.service.impl;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Comparator; import java.util.Comparator;
import java.util.Date; import java.util.Date;
import java.util.HashMap;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Locale; import java.util.Locale;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
import java.util.Set; import java.util.Set;
import java.util.TreeMap;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
import com.jasamedika.medifirst2000.dao.KomponenGajiDao;
import com.jasamedika.medifirst2000.dao.MapPegawaiJabatanToUnitKerjaDao; import com.jasamedika.medifirst2000.dao.MapPegawaiJabatanToUnitKerjaDao;
import com.jasamedika.medifirst2000.dao.PegawaiDao; import com.jasamedika.medifirst2000.dao.PegawaiDao;
import com.jasamedika.medifirst2000.dao.SlipGajiDao; import com.jasamedika.medifirst2000.dao.SlipGajiDao;
@ -56,6 +65,9 @@ public class SlipGajiServiceImpl implements SlipGajiService {
@Autowired @Autowired
private SlipGajiKomponenDao slipGajiKomponenDao; private SlipGajiKomponenDao slipGajiKomponenDao;
@Autowired
private KomponenGajiDao komponenGajiDao;
@Autowired @Autowired
private PegawaiDao pegawaiDao; private PegawaiDao pegawaiDao;
@ -68,7 +80,7 @@ public class SlipGajiServiceImpl implements SlipGajiService {
Date startMonth = DateUtil.startMonth(now); Date startMonth = DateUtil.startMonth(now);
Date endMonth = DateUtil.endMonth(now); Date endMonth = DateUtil.endMonth(now);
List<Integer> listIdPegawaiSlip = slipGajiDao.findPegawaiByBulan(startMonth, endMonth); List<Integer> listIdPegawaiSlip = slipGajiDao.findPegawaiByBulan(startMonth, endMonth);
List<MapPegawaiJabatanToUnitKerja> listJabatan = mappingJabatanDao.findAll(); List<MapPegawaiJabatanToUnitKerja> listJabatan = mappingJabatanDao.getAll();
listJabatan = listJabatan.stream().filter(j -> !listIdPegawaiSlip.contains(j.getPegawaiId())) listJabatan = listJabatan.stream().filter(j -> !listIdPegawaiSlip.contains(j.getPegawaiId()))
.sorted(Comparator.comparingInt(MapPegawaiJabatanToUnitKerja::getPegawaiId)) .sorted(Comparator.comparingInt(MapPegawaiJabatanToUnitKerja::getPegawaiId))
.collect(Collectors.toList()); .collect(Collectors.toList());
@ -247,35 +259,86 @@ public class SlipGajiServiceImpl implements SlipGajiService {
return dto.build(); return dto.build();
} }
@SuppressWarnings("resource")
@Override @Override
public String writeExcel(Long bulan) { public String writeExcel(Long bulan) throws IOException {
Date month = new Date(bulan); Date month = new Date(bulan);
Date start = DateUtil.startMonth(month); Date start = DateUtil.startMonth(month);
Date end = DateUtil.endMonth(month); Date end = DateUtil.endMonth(month);
List<Map<String, Object>> listPegawai = slipGajiDao.findAllByBulan(start, end); List<Map<String, Object>> listPegawai = slipGajiDao.findAllByBulan(start, end);
List<Map<String, Object>> allKomponen = komponenGajiDao.getAll();
HSSFWorkbook workbook = new HSSFWorkbook(); HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet(new SimpleDateFormat("MMMM yyyy", new Locale("in", "ID")).format(month)); HSSFSheet sheet = workbook.createSheet(new SimpleDateFormat("MMMM yyyy", new Locale("in", "ID")).format(month));
List<Object> listHeader = new ArrayList<>(); List<Object> listIdKomponen = new ArrayList<>();
listHeader.add("ID"); List<Object> listKdKomponen = new ArrayList<>();
listHeader.add("NAMA PEGAWAI"); listIdKomponen.add("ID");
listHeader.add("GAJI"); listIdKomponen.add("");
listHeader.add("REMUN KINERJA"); listKdKomponen.add("");
listHeader.add("REMUN TAMBAHAN"); listKdKomponen.add("NAMA PEGAWAI / KOMPONEN");
listHeader.add("FEE FOR SERVICE"); allKomponen.forEach(k -> {
listHeader.add("FEE FOR ON SITE"); listIdKomponen.add(k.get("id"));
listHeader.add("UANG MAKAN"); listKdKomponen.add(k.get("namaKomponen"));
listHeader.add("UANG LEMBUR"); });
listHeader.add("PPH GAJI"); Object[] arrId = new Object[listIdKomponen.size()];
listHeader.add("PPH REMUN"); Object[] arrkd = new Object[listKdKomponen.size()];
listHeader.add("PPH FEE FOR SERVICE"); listIdKomponen.toArray(arrId);
listHeader.add("PPH FEE FOR ON SITE"); listKdKomponen.toArray(arrkd);
listHeader.add("PPH UANG MAKAN"); Integer i = 1;
listHeader.add("PPH UANG LEMBUR"); Map<Integer, Object[]> data = new HashMap<>();
listHeader.add("IURAN WAJIB KOPERASI"); data.put(i++, arrId);
listHeader.add("POTONGAN PINJAMAN KOPERASI"); data.put(i++, arrkd);
listHeader.add("POTONGAN OBAT"); for (Map<String, Object> pegawai : listPegawai) {
listHeader.add("BIAYA RAWAT INAP"); data.put(i++, new Object[] { pegawai.get("id"), pegawai.get("namaLengkap") });
listHeader.add("BIAYA RAWAT JALAN"); }
return null; TreeMap<Integer, Object[]> sorted = new TreeMap<>();
sorted.putAll(data);
Set<Integer> keyset = sorted.keySet();
int rownum = 0;
for (Integer key : keyset) {
Row row = sheet.createRow(rownum++);
Object[] objArr = data.get(key);
int cellnum = 0;
for (Object obj : objArr) {
Cell cell = row.createCell(cellnum++);
if (obj instanceof String)
cell.setCellValue((String) obj);
else if (obj instanceof Integer)
cell.setCellValue((Integer) obj);
}
}
sheet.getRow(0).setZeroHeight(true);
sheet.setColumnHidden(0, true);
int colnums = sheet.getRow(0).getLastCellNum();
for (int j = 0; j < colnums; j++) {
sheet.autoSizeColumn(j);
}
sheet.createFreezePane(2, 2);
DateFormat df = new SimpleDateFormat("yyyyMMdd_HHmmss");
String timestampToString = df.format(new Date());
String filename = "Template_Slip_Gaji_" + timestampToString + ".xls";
String workingDir = System.getProperty("user.dir");
String your_os = System.getProperty("os.name").toLowerCase();
String absoluteFilePath = "";
if (your_os.indexOf("win") >= 0) {
// if_windows
absoluteFilePath = workingDir + "\\" + filename;
} else if (your_os.indexOf("nix") >= 0 || your_os.indexOf("nux") >= 0 || your_os.indexOf("mac") >= 0) {
// if_unix_or_mac
absoluteFilePath = workingDir + "//tmp//" + filename;
// absoluteFilePath = workingDir + "/" + filename;
} else {
// unknown_os?
absoluteFilePath = workingDir + "/" + filename;
}
FileOutputStream out = new FileOutputStream(new File(absoluteFilePath));
try {
workbook.write(out);
} catch (Exception e) {
e.printStackTrace();
return absoluteFilePath;
} finally {
out.close();
}
return absoluteFilePath;
} }
} }

View File

@ -0,0 +1,31 @@
package com.jasamedika.medifirst2000.util;
import java.io.FileNotFoundException;
import java.net.MalformedURLException;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.springframework.core.io.Resource;
import org.springframework.core.io.UrlResource;
import org.springframework.stereotype.Component;
/**
* @author salmanoe
* @since Jan 31, 2023
*/
@Component
public class ResourceUtils {
public static Resource loadFile(String fileName) throws Exception {
try {
Path filePath = Paths.get(fileName).toAbsolutePath().normalize();
Resource resource = new UrlResource(filePath.toUri());
if (resource.exists()) {
return resource;
} else {
throw new FileNotFoundException("File not found " + fileName);
}
} catch (MalformedURLException e) {
throw new FileNotFoundException("File not found " + fileName);
}
}
}

View File

@ -1,8 +1,15 @@
package com.jasamedika.medifirst2000.controller; package com.jasamedika.medifirst2000.controller;
import java.util.HashMap;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.Valid; import javax.validation.Valid;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.io.Resource;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus; import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType; import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity; import org.springframework.http.ResponseEntity;
@ -10,10 +17,15 @@ import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
import com.jasamedika.medifirst2000.constants.Constants;
import com.jasamedika.medifirst2000.dto.SlipGajiDto; import com.jasamedika.medifirst2000.dto.SlipGajiDto;
import com.jasamedika.medifirst2000.service.SlipGajiService; import com.jasamedika.medifirst2000.service.SlipGajiService;
import com.jasamedika.medifirst2000.util.CommonUtil;
import com.jasamedika.medifirst2000.util.ResourceUtils;
import com.jasamedika.medifirst2000.util.rest.RestUtil;
@RestController @RestController
@RequestMapping("/slip-gaji") @RequestMapping("/slip-gaji")
@ -59,4 +71,47 @@ public class SlipGajiController {
SlipGajiDto entity = slipGajiService.get(pegawaiId, bulan); SlipGajiDto entity = slipGajiService.get(pegawaiId, bulan);
return new ResponseEntity<>(entity, HttpStatus.OK); return new ResponseEntity<>(entity, HttpStatus.OK);
} }
@RequestMapping(value = "/template/generate/{bulan}", method = RequestMethod.GET)
public ResponseEntity<Object> generateTemplate(@PathVariable Long bulan, HttpServletRequest request,
HttpServletResponse response) {
try {
String fileNamePath = slipGajiService.writeExcel(bulan);
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-Disposition", "attachment; filename=" + fileNamePath);
return new ResponseEntity<>(true, HttpStatus.OK);
} catch (Exception e) {
e.printStackTrace();
return new ResponseEntity<>(e.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@RequestMapping(value = "/template/download", method = RequestMethod.GET)
public ResponseEntity<Resource> downloadTemplate(@RequestParam(value = "filename", required = true) String fileName,
HttpServletRequest request) {
Resource resource = null;
Map<String, String> mapHeaderMessage = new HashMap<String, String>();
if (CommonUtil.isNotNullOrEmpty(fileName)) {
try {
resource = ResourceUtils.loadFile(fileName);
} catch (Exception e) {
mapHeaderMessage.put(Constants.MessageInfo.ERROR_MESSAGE, e.getMessage());
return RestUtil.getJsonHttptatus(HttpStatus.INTERNAL_SERVER_ERROR, mapHeaderMessage);
}
String contentType = null;
try {
contentType = request.getServletContext().getMimeType(resource.getFile().getAbsolutePath());
} catch (Exception e) {
mapHeaderMessage.put(Constants.MessageInfo.ERROR_MESSAGE, e.getMessage());
return RestUtil.getJsonHttptatus(HttpStatus.INTERNAL_SERVER_ERROR, mapHeaderMessage);
}
if (CommonUtil.isNullOrEmpty(contentType))
contentType = "application/octet-stream";
return ResponseEntity.ok().contentType(MediaType.parseMediaType(contentType))
.header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + resource.getFilename())
.body(resource);
} else {
return RestUtil.getJsonHttptatus(HttpStatus.INTERNAL_SERVER_ERROR, mapHeaderMessage);
}
}
} }