package zw.qantra.tm.seeders; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Component; import zw.qantra.tm.domain.enums.CurrencyType; import zw.qantra.tm.domain.models.Provider; import zw.qantra.tm.domain.repositories.ProviderRepository; import zw.qantra.tm.utils.Utils; import java.util.Arrays; import java.util.List; /** * Seeds Provider entities. * Priority: 4th - Must run after CategorySeeder (providers reference categories). * Only seeds entities that don't already exist (checked by clientId). */ @Slf4j @Component @RequiredArgsConstructor public class ProviderSeeder implements Seeder { private final ProviderRepository providerRepository; @Override public void seed() { List providers = Arrays.asList( Provider.builder() .name("Econet Airtime") .description("Econet Airtime") .clientId("econet_airtime") .currency(CurrencyType.USD) .label("ECONET") .category("AIRTIME") .image("econet.png") .externalId("78f1f497-c9eb-401c-b22c-884756e68e40") .integrationProcessorLabel("HOT") .accountFieldName("Phone Number") .percentageCommission(5) .requiresAccount(false) .requiresAmount(true) .requiresPhone(true) .priority(2) .meta("{\"hotProductId\": \"101\"}") .uid(Utils.getUid()) .build(), Provider.builder() .name("NetOne Airtime") .description("NetOne Airtime") .clientId("netone_usd_airtime") .currency(CurrencyType.USD) .label("NETONE") .category("AIRTIME") .image("netone.png") .externalId("95d485a7-39c9-4559-8a27-6521969abe8f") .integrationProcessorLabel("HOT") .accountFieldName("Phone Number") .percentageCommission(5) .requiresAccount(false) .requiresAmount(true) .requiresPhone(true) .uid(Utils.getUid()) .priority(3) .meta("{\"hotProductId\": \"35\"}") .build(), Provider.builder() .name("Zesa Prepaid") .description("Prepaid Zesa") .clientId("zesa_prepaid_zwg") .currency(CurrencyType.ZWG) .label("ZESA") .category("UTILITIES") .image("zesa.png") .externalId("5468b1ed-4e11-4348-9bc1-f422890fc2c2") .integrationProcessorLabel("HOT") .accountFieldName("Meter Number") .percentageCommission(1.5) .requiresAccount(true) .requiresAmount(true) .requiresPhone(true) .priority(1) .meta("{\"hotProductId\": \"24\"}") .uid(Utils.getUid()) .build(), Provider.builder() .name("Zesa Prepaid") .description("Prepaid Zesa") .clientId("zesa_prepaid_usd") .currency(CurrencyType.USD) .label("ZESA") .category("UTILITIES") .image("zesa.png") .externalId("0f67f7cc-b62b-4fb5-915f-6740b2afdba6") .integrationProcessorLabel("HOT") .accountFieldName("Meter Number") .percentageCommission(1.5) .requiresAccount(true) .requiresAmount(true) .requiresPhone(true) .priority(1) .meta("{\"hotProductId\": \"41\"}") .uid(Utils.getUid()) .build(), Provider.builder() .name("Econet Bundles") .description("Econet Bundles") .clientId("econet_bundles_usd") .currency(CurrencyType.USD) .label("ECONET_BUNDLES") .category("AIRTIME") .image("econet.png") .externalId("287863e2-a791-4106-b629-79dadc9a6779") .integrationProcessorLabel("HOT") .accountFieldName("Phone Number") .percentageCommission(5) .requiresAccount(false) .requiresAmount(false) .requiresPhone(true) .priority(4) .meta("{\"hotProductId\": \"111\"}") .uid(Utils.getUid()) .build() ); for (Provider provider : providers) { if (providerRepository.existsByClientId(provider.getClientId())) { log.info("Provider '{}' already exists, skipping.", provider.getClientId()); } else { providerRepository.save(provider); log.info("Provider '{}' seeded.", provider.getClientId()); } } } }