SupplementVerreIteHelper.java

package com.sintia.ffl.admin.optique.specifique.isea.helpers;

import com.sintia.ffl.admin.optique.dal.entities.DistributeurIte;
import com.sintia.ffl.admin.optique.dal.entities.FabricantIte;
import com.sintia.ffl.admin.optique.dal.entities.SupplementVerreIte;
import com.sintia.ffl.admin.optique.dal.entities.TypeSupplementIte;
import com.sintia.ffl.admin.optique.dal.entities.catalogue.DistributeurCatalogueIte;
import com.sintia.ffl.admin.optique.dal.entities.catalogue.FabricantCatalogueIte;
import com.sintia.ffl.admin.optique.dal.entities.catalogue.SupplementVerreCatalogueIte;
import com.sintia.ffl.admin.optique.dal.entities.catalogue.TypeSupplementCatalogueIte;
import com.sintia.ffl.admin.optique.dal.repositories.DistributeurIteRepository;
import com.sintia.ffl.admin.optique.dal.repositories.FabricantIteRepository;
import com.sintia.ffl.admin.optique.dal.repositories.TypeSupplementIteRepository;
import com.sintia.ffl.admin.optique.dal.repositories.catalogue.DistributeurCatalogueIteRepository;
import com.sintia.ffl.admin.optique.dal.repositories.catalogue.FabricantCatalogueIteRepository;
import com.sintia.ffl.admin.optique.dal.repositories.catalogue.TypeSupplementCatalogueIteRepository;
import com.sintia.ffl.admin.optique.services.services.SupplementVerreIteService;
import com.sintia.ffl.admin.optique.specifique.isea.models.SupplementCSV;
import com.sintia.ffl.admin.optique.specifique.isea.reporter.ChargementReporter;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.time.ZoneId;
import java.util.Date;
import java.util.List;
import java.util.Optional;

@Service
@RequiredArgsConstructor
@Slf4j
public class SupplementVerreIteHelper {
	
	private final ChargementReporter chargementReporter;
	
	private final SupplementVerreIteService supplementVerreCatalogueIteService;
	
	private final DistributeurCatalogueIteRepository distributeurCatalogueIteRepository;
	
	private final FabricantCatalogueIteRepository fabricantCatalogueIteRepository;
	
	private final TypeSupplementCatalogueIteRepository typeSupplementCatalogueIteRepository;
	
	
	public void process(List<SupplementCSV> supplementCSVList, String codeFabricant, String codeFournisseur, Date date) {
		
		for(SupplementCSV supplementCSV : supplementCSVList){
			
			try {
				if ("C".equals(supplementCSV.getAction()) || "M".equals(supplementCSV.getAction())) {
					createOrModifySupplementVerre(codeFabricant, codeFournisseur, date, supplementCSV);
				}
			} catch(Exception e){
				log.error("Erreur Rencontrée dans le traitement du supplement {} cause {}", supplementCSV.getCodeSupplement(), e.getMessage());
				chargementReporter.addError("Erreur Rencontrée dans le traitement du supplement "+supplementCSV.getCodeSupplement() +" cause "+e.getMessage());
			}
			
		}
	}
	
	/**
	 * Creation ou modification Enregistrement SupplementVerre
	 * @param codeFabricant
	 * @param codeFournisseur
	 * @param date
	 * @param supplementCSV
	 */
	private void createOrModifySupplementVerre(String codeFabricant, String codeFournisseur, Date date, SupplementCSV supplementCSV) {
		SupplementVerreCatalogueIte supplementVerreCatalogueIte = supplementVerreCatalogueIteService.exist(supplementCSV.getCodeSupplement(), codeFabricant,
				codeFournisseur);
		if (supplementVerreCatalogueIte != null) {
			modifySupplementVerreIte(date, supplementCSV, supplementVerreCatalogueIte);
			chargementReporter.addSupplement(supplementCSV);
		} else {
			createSupplementVerreIte(date, supplementCSV);
			chargementReporter.addSupplement(supplementCSV);
		}
	}
	
	/**
	 * Modification Enregistrement Supplement
	 * @param date
	 * @param supplementCSV
	 * @param supplementVerreIte
	 */
	private void modifySupplementVerreIte(Date date, SupplementCSV supplementCSV, SupplementVerreCatalogueIte supplementVerreIte) {
		Optional<DistributeurCatalogueIte> distributeurIte = distributeurCatalogueIteRepository.findById(supplementVerreIte.getIdDistributeurIte());
		Optional<FabricantCatalogueIte> fabricantIte = fabricantCatalogueIteRepository.findById(supplementVerreIte.getIdFabricantIte());
		Optional<TypeSupplementCatalogueIte> typeSupplementIte = typeSupplementCatalogueIteRepository.findBycTypeSupplement(supplementCSV.getTypeSupplement());
		
		// Modification
		String ctypeTraitAntireflet = getCtypeTraitAntiReflet(supplementCSV.getAntiReflet());
		SupplementVerreCatalogueIte supplementVerreIteToUpdate = SupplementVerreCatalogueIte.builder()
				.idSupplementVerreIte(supplementVerreIte.getIdSupplementVerreIte())
				.idTypeSupplementIte(typeSupplementIte.map(TypeSupplementCatalogueIte::getIdTypeSupplementIte).orElse(null))
				.codeSupplementVerre(supplementVerreIte.getCodeSupplementVerre())
				.libelleSupplementVerre(supplementCSV.getNomSupplement())
				.idFabricantIte(fabricantIte.map(FabricantCatalogueIte::getIdFabricantIte).orElse(null))
				.idDistributeurIte(distributeurIte.map(DistributeurCatalogueIte::getIdDistributeurIte).orElse(null))
				.cTypeTraitAntireflet(ctypeTraitAntireflet)
				.cProcedeSpecialFabrication(supplementCSV.getControle()).cTypeTeinte(supplementCSV.getTeinte())
				.bCouchePhotochromique("Y".equals(supplementCSV.getPolymerisation()) ? "1" : "0")
				.bAntirayure("Y".equals(supplementCSV.getDurci()) ? "1" : "0")
				.bAntisalissure("Y".equals(supplementCSV.getAntiSalissure()) ? "1" : "0")
				.bCoucheUv("Y".equals(supplementCSV.getUv()) ? "1" : "0")
				.bSaisie("1")
				.dateMaj(date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime())
				.dateCreation(supplementVerreIte.getDateCreation()).build();
		supplementVerreCatalogueIteService.modifyOrCreate(supplementVerreIteToUpdate);
	}
	
	private String getCtypeTraitAntiReflet(String antiReflet) {
		switch (antiReflet){
		case "2": return "1";
		case "8": return "3";
		case "0": return "0";
		case "5": return "5";
		default: return "";
		}
	}
	
	/**
	 * Creation Enregistrement SupplementVerre
	 * @param date
	 * @param supplementCSV
	 */
	private void createSupplementVerreIte(Date date, SupplementCSV supplementCSV) {
		Optional<DistributeurCatalogueIte> distributeurCatalogueIte = distributeurCatalogueIteRepository.findBycOptoCodeDistributeur(supplementCSV.getCodeFournisseur());
		Optional<FabricantCatalogueIte> fabricantCatalogueIte = fabricantCatalogueIteRepository.findBycOptoCodeFabricant(supplementCSV.getCodeFabricant());
		Optional<TypeSupplementCatalogueIte> typeSupplementCatalogueIte = typeSupplementCatalogueIteRepository.findBycTypeSupplement(supplementCSV.getTypeSupplement());
		
		String ctypeTraitAntireflet = getCtypeTraitAntiReflet(supplementCSV.getAntiReflet());
		SupplementVerreCatalogueIte supplementVerreIteToUpdate = SupplementVerreCatalogueIte.builder()
				.idTypeSupplementIte(typeSupplementCatalogueIte.map(TypeSupplementCatalogueIte::getIdTypeSupplementIte).orElse(null))
				.codeSupplementVerre(supplementCSV.getCodeSupplement())
				.libelleSupplementVerre(supplementCSV.getNomSupplement())
				.idFabricantIte(fabricantCatalogueIte.map(FabricantCatalogueIte::getIdFabricantIte).orElse(null))
				.idDistributeurIte(distributeurCatalogueIte.map(DistributeurCatalogueIte::getIdDistributeurIte).orElse(null))
				.cTypeTraitAntireflet(ctypeTraitAntireflet)
				.cProcedeSpecialFabrication(supplementCSV.getControle()).cTypeTeinte(supplementCSV.getTeinte())
				.bCouchePhotochromique("Y".equals(supplementCSV.getPolymerisation()) ? "1" : "0")
				.bAntirayure("Y".equals(supplementCSV.getDurci()) ? "1" : "0")
				.bAntisalissure("Y".equals(supplementCSV.getAntiSalissure()) ? "1" : "0")
				.bCoucheUv("Y".equals(supplementCSV.getUv()) ? "1" : "0")
				.bSaisie("1")
				.dateMaj(date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()).dateCreation(date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()).build();
		supplementVerreCatalogueIteService.modifyOrCreate(supplementVerreIteToUpdate);
	}
	
}