PurgeGlassesItemReader.java

package com.sintia.ffl.admin.optique.catalogue.batch.reader.purgeglasses;

import com.sintia.ffl.admin.optique.dal.repositories.catalogue.DistributeurCatalogueRepository;
import com.sintia.ffl.admin.optique.dal.repositories.catalogue.FabricantCatalogueRepository;
import com.sintia.ffl.admin.optique.dal.repositories.TypeMateriauRepository;
import com.sintia.ffl.admin.optique.dal.repositories.TypeVerreRepository;
import com.sintia.ffl.admin.optique.services.dto.Glasses;
import org.springframework.batch.core.configuration.annotation.StepScope;
import org.springframework.batch.item.database.JdbcCursorItemReader;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.sql.ResultSet;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

@Component
@StepScope
public class PurgeGlassesItemReader extends JdbcCursorItemReader<Glasses> {
	
	@Autowired
	private TypeVerreRepository typeVerreRepository;
	
	@Autowired
	private TypeMateriauRepository typeMateriauRepository;
	
	@Autowired
	private FabricantCatalogueRepository fabricantRepository;
	
	@Autowired
	private DistributeurCatalogueRepository distributeurRepository;

	@Autowired
	public PurgeGlassesItemReader(
		DataSource dataSource, @Value("#{jobParameters[scriptDate]}") Date scriptDate, @Value("${purgeverre.delaisuppression}") int deleteDelay) {
		this.setDataSource(dataSource);

		SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
		Calendar cal = Calendar.getInstance();
		cal.setTime(scriptDate);
		cal.add(Calendar.MONTH, -deleteDelay);
		Date limit = cal.getTime();
		this.setSql(
			"select " +
					"mv.c_modele, " +
					"mv.l_modele, " +
					"mv.n_indice, " +
					"mv.b_saisie, " +
					"mv.d_maj_catalogue, " +
					"mv.d_creation, " +
					"mv.d_maj, " +
					"mv.c_opto_code_verre, " +
					"mv.d_demande_supp, " +
					"mv.d_debut_validite, " +
					"mv.id_classe, " +
					"mv.id_modele_verre, " +
					"d.id_distributeur, " +
					"f.id_fabricant, " +
					"mv.id_type_verre, " +
					"tm.c_type_materiau, " +
					"tv.c_type_verre " +
					"from " +
					"modele_verre mv " +
					"inner join fabricant f on f.id_fabricant = mv.id_fabricant " +
					"inner join distributeur d on d.id_distributeur = mv.id_distributeur " +
					"left join type_materiau tm on tm.id_type_materiau = mv.id_type_materiau " +
					"left join type_verre tv on tv.id_type_verre = mv.id_type_verre " +
					"where " +
					"mv.b_saisie = '0' " +
					"and mv.d_maj <= '" + simpleDateFormat.format(limit) + "'");
		this.setRowMapper(
			(ResultSet resultSet, int rowNum) -> {
				if (!(resultSet.isAfterLast()) && !(resultSet.isBeforeFirst())) {
					Glasses glass = new Glasses();
					glass.setIdModeleVerre(resultSet.getInt("id_modele_verre"));
					glass.setGlassCode(resultSet.getString("c_modele"));
					glass.setGlassName(resultSet.getString("l_modele"));
					glass.setRefractiveIndex(resultSet.getInt("n_indice"));
					glass.setSeizable(resultSet.getString("b_saisie"));
					glass.setGlassOptoCode(resultSet.getString("c_opto_code_verre"));
					glass.setMaterial(resultSet.getString("c_type_materiau"));
					glass.setGlassType(resultSet.getString("c_type_verre"));
					glass.setMaker(String.valueOf(resultSet.getInt("id_fabricant")));
					glass.setProvider(String.valueOf(resultSet.getInt("id_distributeur")));
					glass.setCreationDate(resultSet.getTimestamp("d_creation").toLocalDateTime());
					glass.setUpdateDate(resultSet.getTimestamp("d_maj").toLocalDateTime());
					if (resultSet.getDate("d_demande_supp") != null) {
						glass.setExpiryDate(resultSet.getDate("d_demande_supp").toLocalDate());
					}
					return glass;
				} else {
					return null;
				}
			});
	}
}