SupplementVerreHelper.java

package com.sintia.ffl.admin.optique.catalogue.helpers;

import com.sintia.ffl.admin.optique.catalogue.batch.reporter.Reporter;
import com.sintia.ffl.admin.optique.catalogue.models.EnrichedExtrasCSV;
import com.sintia.ffl.admin.optique.dal.entities.TypeSupplement;
import com.sintia.ffl.admin.optique.dal.entities.catalogue.DistributeurCatalogue;
import com.sintia.ffl.admin.optique.dal.entities.catalogue.FabricantCatalogue;
import com.sintia.ffl.admin.optique.dal.entities.catalogue.SupplementVerreCatalogue;
import com.sintia.ffl.admin.optique.dal.repositories.TypeSupplementRepository;
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.catalogue.SupplementVerreCatalogueRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;

@Service
@RequiredArgsConstructor
public class SupplementVerreHelper {

	private final TypeSupplementRepository typeSupplementRepository;

	private final SupplementVerreCatalogueRepository supplementVerreRepository;

	private final FabricantCatalogueRepository fabricantRepository;

	private final DistributeurCatalogueRepository distributeurRepository;

	/**
	 * Insert a new extra (supplementVerre) in the database.<br> The table impacted will be :
	 * <ul>
	 * <li>supplementVerre => mandatory</li>
	 * </ul>
	 *  @param enrichedExtra Données du supplément lues depuis le fichier CSV
	 *
	 * @param saisissable Indique si le supplément doit être saisissable ou non
	 * @param reporter Reporter permettant de tracer les erreurs dans le CR du traitement de chargement de catalogue
	 */
	public SupplementVerreCatalogue getSupplementVerreToCreate(
			EnrichedExtrasCSV enrichedExtra,
			boolean saisissable,
			LocalDateTime creationDate,
			Reporter reporter
	) {

		if (enrichedExtra == null) {
			throw new IllegalArgumentException(
					"Can't generate a new 'SupplementVerre' from a 'null' EnrichedExtrasCSV");
		}

		TypeSupplement extraType = typeSupplementRepository.findBycTypeSupplement(enrichedExtra.getExtrasType());
		if(extraType == null){
			reporter.addError(String.format("Le type %s de supplement %s est inexistant en BDD.",
					enrichedExtra.getExtrasType(), enrichedExtra.getExtrasCode()));
			return null;
		}

		FabricantCatalogue fabricant = this.fabricantRepository
				.findBycodeOptoCodeFabricant(enrichedExtra.getMaker())
				.orElseThrow(() -> new IllegalStateException("Le fabricant " + enrichedExtra.getMaker() + "n'existe pas en BDD."));

		DistributeurCatalogue distributeur = this.distributeurRepository
				.findBycOptoCodeDistributeur(enrichedExtra.getProvider())
				.orElseThrow(() -> new IllegalStateException("Le distributeur " + enrichedExtra.getProvider() + "n'existe pas en BDD."));

		// change with the date of the script
		
		SupplementVerreCatalogue supplementVerre = new SupplementVerreCatalogue();
		supplementVerre.setIdFabricant(fabricant.getIdFabricant());
		supplementVerre.setIdDistributeur(distributeur.getIdDistributeur());
		supplementVerre.setLibelleSupplementVerre(enrichedExtra.getExtrasName());
		supplementVerre.setCodeSupplementVerre(enrichedExtra.getExtrasCode());
		supplementVerre.setCTypeTraitAntireflet(null);
		supplementVerre.setCProcedeSpecialFabrication(null);
		supplementVerre.setCTypeTeinte("");
		supplementVerre.setBCouchePhotochromique("");
		supplementVerre.setBAntirayure("0");
		supplementVerre.setBAntisalissure("0");
		supplementVerre.setBCoucheUv("0");
		supplementVerre.setBSaisie(saisissable ? "1" : "0");
		supplementVerre.setDateCreation(creationDate);
		supplementVerre.setDateMaj(creationDate);
		supplementVerre.setIdTypeSupplement(extraType.getIdTypeSupplement());

		return supplementVerre;

	}

	/**
	 * Update an existing extra (corresponding to the given enrichedExtra), by updating its type. The column "dMaj" is
	 * always updated with the given date
	 *
	 * @param enrichedExtra       - Correspond to the data read from an enriched catalog file and must correspond to an
	 *                            existing extra in the database
	 * @param reporter Reporter permettant de tracer les erreurs dans le CR du traitement de chargement de catalogue
	 */
	public SupplementVerreCatalogue getSupplementVerreToUpdate(EnrichedExtrasCSV enrichedExtra,
															   Reporter reporter) {
		return supplementVerreRepository
				.findByCodeSupplementVerreAndCodeOptoDistributeurAndCodeOptoFabricant(
						enrichedExtra.getExtrasCode(),
						enrichedExtra.getMaker(),
						enrichedExtra.getProvider()
				).map(extra -> {
						TypeSupplement extraType = typeSupplementRepository.findBycTypeSupplement(enrichedExtra.getExtrasType());
						if(extraType != null)
							extra.setIdTypeSupplement(extraType.getIdTypeSupplement());
						else {
							reporter.addError(String.format("Le type %s de supplement %s est inexistant en BDD.",
									enrichedExtra.getExtrasType(), enrichedExtra.getExtrasCode()));
						}
						return extra;
				})
				.orElse(null);
	}

}