@@ -85,13 +85,13 @@ export default function AdminOffers() {
8585 return new Date ( validFrom ) < sixMonthsAgo
8686 }
8787
88- // Fetch providers
88+ // Fetch providers (includes providers with scrapers not yet in DB)
8989 const { data : providersData } = useQuery ( {
90- queryKey : [ 'energy-providers' ] ,
90+ queryKey : [ 'energy-providers-with-scrapers ' ] ,
9191 queryFn : async ( ) => {
92- const response = await energyApi . getProviders ( )
93- if ( response . success && Array . isArray ( response . data ) ) {
94- return response . data as EnergyProvider [ ]
92+ const response = await energyApi . getProvidersWithScrapers ( )
93+ if ( response . success && response . data ?. providers ) {
94+ return response . data . providers as EnergyProvider [ ]
9595 }
9696 return [ ]
9797 } ,
@@ -638,13 +638,15 @@ export default function AdminOffers() {
638638 < div className = "grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4" >
639639 { Array . isArray ( providersData ) &&
640640 providersData
641+ // Filtrer pour n'afficher que les fournisseurs avec un scraper
642+ . filter ( ( provider ) => provider . has_scraper )
641643 . sort ( ( a , b ) => a . name . localeCompare ( b . name , 'fr' , { sensitivity : 'base' } ) )
642644 . map ( ( provider ) => {
643645 const allProviderOffers = allOffersByProvider ?. [ provider . id ] || [ ]
644646 const activeCount = allProviderOffers . filter ( o => o . is_active ) . length
645647 const isLoadingPreview = loadingPreview === provider . id
646648 const isRefreshing = refreshingProvider === provider . id
647- const hasProvider = [ 'EDF' , 'Enercoop' , 'TotalEnergies' , 'Priméo Énergie' , 'Engie' , 'ALPIQ' , 'Alterna' , 'Ekwateur' ] . includes ( provider . name )
649+ const isNotInDatabase = provider . not_in_database === true
648650
649651 // Find the most recent tariff date
650652 const mostRecentDate = allProviderOffers
@@ -656,25 +658,38 @@ export default function AdminOffers() {
656658 < div
657659 key = { provider . id }
658660 className = { `bg-white dark:bg-gray-800 border border-gray-300 dark:border-gray-700 rounded-lg p-4 hover:shadow-lg transition-shadow duration-200 ${
659- ! hasProvider ? 'opacity-60 bg-gray-50 dark:bg-gray-900 ' : ''
661+ isNotInDatabase ? 'border-dashed border-2 border-amber-400 dark:border-amber-600 ' : ''
660662 } `}
661663 >
662664 < div className = "flex items-start justify-between mb-3" >
663665 < div className = "flex-1" >
664- < h3 className = "font-semibold text-gray-900 dark:text-white mb-1" >
665- { provider . name }
666- </ h3 >
667- < p className = "text-sm text-gray-600 dark:text-gray-400" >
668- { activeCount } offre{ activeCount > 1 ? 's' : '' } active{ activeCount > 1 ? 's' : '' }
669- </ p >
666+ < div className = "flex items-center gap-2 mb-1" >
667+ < h3 className = "font-semibold text-gray-900 dark:text-white" >
668+ { provider . name }
669+ </ h3 >
670+ { isNotInDatabase && (
671+ < span className = "px-2 py-0.5 text-xs font-medium bg-amber-100 dark:bg-amber-900/30 text-amber-700 dark:text-amber-400 rounded-full" >
672+ Non initialisé
673+ </ span >
674+ ) }
675+ </ div >
676+ { isNotInDatabase ? (
677+ < p className = "text-sm text-amber-600 dark:text-amber-400" >
678+ Scraper disponible - Cliquez sur Prévisualiser pour initialiser
679+ </ p >
680+ ) : (
681+ < p className = "text-sm text-gray-600 dark:text-gray-400" >
682+ { activeCount } offre{ activeCount > 1 ? 's' : '' } active{ activeCount > 1 ? 's' : '' }
683+ </ p >
684+ ) }
670685 { mostRecentDate && (
671686 < p className = "text-xs text-green-600 dark:text-green-400 font-medium mt-1" >
672687 Tarif du { mostRecentDate . toLocaleDateString ( 'fr-FR' , { month : 'short' , year : 'numeric' } ) }
673688 </ p >
674689 ) }
675- { provider . last_update && (
690+ { provider . updated_at && ! isNotInDatabase && (
676691 < p className = "text-xs text-gray-500 dark:text-gray-500 mt-1" >
677- Mise à jour : { new Date ( provider . last_update ) . toLocaleDateString ( 'fr-FR' ) }
692+ Mise à jour : { new Date ( provider . updated_at ) . toLocaleDateString ( 'fr-FR' ) }
678693 </ p >
679694 ) }
680695 </ div >
@@ -699,9 +714,9 @@ export default function AdminOffers() {
699714 </ div >
700715
701716 < div className = "flex flex-col gap-2" >
702- { /* Détection si le fournisseur a un scraper - déjà défini plus haut */ }
717+ { /* Boutons d'action */ }
703718 { ( ( ) => {
704- const isDisabled = ! hasProvider || isLoadingPreview || isRefreshing
719+ const isDisabled = isLoadingPreview || isRefreshing
705720
706721 return (
707722 < >
@@ -710,10 +725,8 @@ export default function AdminOffers() {
710725 < button
711726 onClick = { ( ) => handlePreviewRefresh ( provider . id , provider . name ) }
712727 disabled = { isDisabled }
713- className = { `btn btn-primary flex-1 text-sm flex items-center justify-center gap-2 ${
714- ! hasProvider ? 'opacity-50 cursor-not-allowed' : ''
715- } `}
716- title = { ! hasProvider ? 'Scraper non disponible pour ce fournisseur' : '' }
728+ className = "btn btn-primary flex-1 text-sm flex items-center justify-center gap-2"
729+ title = "Prévisualiser les changements avant application"
717730 >
718731 { isLoadingPreview && loadingPreview === provider . id ? (
719732 < >
@@ -728,8 +741,8 @@ export default function AdminOffers() {
728741 ) }
729742 </ button >
730743
731- { /* Bouton Purger - Uniquement avec permission delete */ }
732- { hasAction ( 'offers' , 'delete' ) && (
744+ { /* Bouton Purger - Uniquement avec permission delete et si le fournisseur existe en base */ }
745+ { hasAction ( 'offers' , 'delete' ) && ! isNotInDatabase && (
733746 < button
734747 onClick = { ( ) => handlePurgeProvider ( provider . id , provider . name ) }
735748 disabled = { isRefreshing }
@@ -741,15 +754,8 @@ export default function AdminOffers() {
741754 ) }
742755 </ div >
743756
744- { /* Message si pas de scraper */ }
745- { ! hasProvider && (
746- < div className = "text-xs text-gray-500 dark:text-gray-400 italic text-center" >
747- Scraper non disponible
748- </ div >
749- ) }
750-
751757 { /* Affichage des sources du scraper */ }
752- { hasProvider && provider . scraper_urls && provider . scraper_urls . length > 0 && ( ( ) => {
758+ { provider . scraper_urls && provider . scraper_urls . length > 0 && ( ( ) => {
753759 // Labels pour les URLs en fonction du fournisseur
754760 const urlLabels : Record < string , string [ ] > = {
755761 'EDF' : [ 'Tarif Bleu (réglementé)' , 'Zen Week-End (marché)' ] ,
0 commit comments