VerreSupplementAssoService.java

package com.sintia.ffl.admin.optique.services.services;

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.ModeleVerreCatalogue;
import com.sintia.ffl.admin.optique.dal.entities.catalogue.SupplementVerreCatalogue;
import com.sintia.ffl.admin.optique.dal.entities.catalogue.VerreSupplementAssoCatalogue;
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.ModeleVerreCatalogueRepository;
import com.sintia.ffl.admin.optique.dal.repositories.catalogue.SupplementVerreCatalogueRepository;
import com.sintia.ffl.admin.optique.dal.repositories.catalogue.VerreSupplementAssoCatalogueRepository;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.time.LocalDateTime;
import java.util.Optional;

@Service
@RequiredArgsConstructor
public class VerreSupplementAssoService {

	@Getter
	public static class ItemNotFoundException extends Exception{

		private final String itemType;

		public ItemNotFoundException(String itemType){
			this.itemType = itemType;
		}

	}

	private final VerreSupplementAssoCatalogueRepository verreSupplementAssoRepository;
	
	private final DistributeurCatalogueRepository distributeurRepository;
	
	private final FabricantCatalogueRepository fabricantRepository;
	
	private final SupplementVerreCatalogueRepository supplementVerreRepository;
	
	private final ModeleVerreCatalogueRepository modeleVerreRepository;

	public VerreSupplementAssoCatalogue updateOrCreateAssociation(
			Integer idFabricant, String glassOptoCode, Integer idDistributeur,
			String extrasCode, boolean mandatory, boolean included, LocalDateTime date
	) throws ItemNotFoundException {

		if(idFabricant == null || idDistributeur == null){
			return null;
		}

		// Obtenir l'association existante ou en créer une
		VerreSupplementAssoCatalogue verreSupplementAssoCatalogue = verreSupplementAssoRepository
				.findModeleVerre(
						glassOptoCode,
						extrasCode,
						idDistributeur,
						idFabricant
				).orElse(new VerreSupplementAssoCatalogue());

		// Obtenir le supplément verre
		SupplementVerreCatalogue supplementVerre = supplementVerreRepository
				.findSupplementVerreCataloguesByIdFabricantAndIdDistributeurAndCodeSupplementVerre(
						idFabricant, idDistributeur, extrasCode
				)
				.orElseThrow(() -> new ItemNotFoundException("supplément verre"));

		// Obtenir le modèle verre
		ModeleVerreCatalogue modeleVerre = modeleVerreRepository
				.findModeleVerreCatalogueByIdFabricantAndIdDistributeurAndCodeOptoCodeVerre(
						idFabricant, idDistributeur, glassOptoCode
				)
				.orElseThrow(() -> new ItemNotFoundException("modèle verre"));

		// Mettre à jour l'association
		verreSupplementAssoCatalogue.setIdSupplementVerre(supplementVerre.getIdSupplementVerre());
		verreSupplementAssoCatalogue.setIdModeleVerre(modeleVerre.getIdModeleVerre());
		verreSupplementAssoCatalogue.setBObligatoire(mandatory ? "1" : "0");
		verreSupplementAssoCatalogue.setBInclus(included ? "1" : "0");
		verreSupplementAssoCatalogue.setBSaisie("1");
		verreSupplementAssoCatalogue.setDateCreation(date);
		verreSupplementAssoCatalogue.setDateMaj(date);

		return verreSupplementAssoCatalogue;
	}

	public Integer getIdFabricant(String codeOptoCodeFabricant) {
        return fabricantRepository.findBycodeOptoCodeFabricant(codeOptoCodeFabricant)
				.map(FabricantCatalogue::getIdFabricant)
				.orElse(null);
	}

	public Integer getIdDistributeur(String codeOptoCodeDistributeur){
		return distributeurRepository.findBycOptoCodeDistributeur(codeOptoCodeDistributeur)
				.map(DistributeurCatalogue::getIdDistributeur)
				.orElse(null);
	}

}