com um clique
offer
Ajout d'un nouveau fournisseur d'énergie
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Menu
Ajout d'un nouveau fournisseur d'énergie
Instalar com Codex ou Claude Copie este prompt, cole no Codex, Claude ou outro assistente e deixe que ele revise a página da skill e instale para você.
Baseado na classificação ocupacional SOC
| name | offer |
| description | Ajout d'un nouveau fournisseur d'énergie |
| argument-hint | <CODE> [--new|-n] [--delete|-d] [--bug|-b] [--list|-l] [--info|-i] |
| auto_continue | true |
| allowed_tools | ["Read","Edit","Write","Glob","Grep","Bash","Task","AskUserQuestion"] |
| file_patterns | ["apps/api/src/services/offers/**/*","apps/api/src/models/seed.py","docs/server-mode/features/energy-providers-scrapers.md"] |
Skill complet pour gerer les calculateurs d'offres tarifaires. Chaque type d'offre (BASE, HC_HP, TEMPO, etc.) est une classe Python qui herite de BaseOfferCalculator et implemente la logique de calcul specifique.
/offer # Mode interactif : demande l'action
/offer --list # Lister les types existants
/offer <CODE> --info # Afficher les details d'un type
/offer <CODE> --new # Creer un nouveau type d'offre
/offer <CODE> --bug <desc> # Corriger un bug dans un calculateur
/offer <CODE> --delete # Supprimer un type d'offre
| Argument | Alias | Description |
|---|---|---|
<CODE> | Code du type d'offre (ex: TEMPO, HC_HP, TRI_HORAIRE) | |
--list | -l | Lister tous les types d'offres disponibles |
--info | -i | Afficher les details d'un type (tarifs, periodes) |
--new | -n | Creer un nouveau type d'offre |
--bug | -b | Corriger un bug dans un calculateur existant |
--delete | -d | Supprimer un type d'offre et ses references |
--list : Lister les typesAffiche tous les types d'offres decouverts par l'API.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📋 TYPES D'OFFRES DISPONIBLES
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
| Code | Nom | Tarifs | Ordre |
| ---------------- | ---------------------- | ------ | ----- |
| BASE | Base | 1 | 1 |
| HC_HP | Heures Creuses/Pleines | 2-4 | 2 |
| TEMPO | Tempo | 6 | 3 |
| EJP | EJP | 2 | 4 |
| SEASONAL | Saisonnier | 4-5 | 5 |
| HC_NUIT_WEEKEND | Nuit & Week-end | 2 | 6 |
| WEEKEND | Week-end | 4 | 7 |
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
--info : Details d'un typeAffiche les informations detaillees d'un calculateur existant.
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
📊 DETAILS - TEMPO
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
Fichier : apps/api/src/services/offers/tempo.py
Classe : TempoCalculator
Description : 6 tarifs selon le jour (Bleu, Blanc, Rouge)...
Champs obligatoires :
- tempo_blue_hc, tempo_blue_hp
- tempo_white_hc, tempo_white_hp
- tempo_red_hc, tempo_red_hp
Champs optionnels :
- hc_schedules
Periodes tarifaires :
| Nom | Code | Couleur | Condition |
| -------------- | ------------- | ------- | -------------------- |
| Jour Bleu HC | tempo_blue_hc | #3B82F6 | Jour bleu, 22h-6h |
| Jour Bleu HP | tempo_blue_hp | #60A5FA | Jour bleu, 6h-22h |
| ... | ... | ... | ... |
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
--new : Creer un typeWorkflow guide en 6 etapes pour creer un nouveau calculateur.
→ Voir steps/01-explore.md a steps/06-validate.md
--bug : Corriger un bugWorkflow pour analyser et corriger un bug dans un calculateur existant.
→ Voir steps/bug-analyze.md et steps/bug-fix.md
--delete : Supprimer un typeWorkflow pour supprimer proprement un calculateur et ses references.
→ Voir steps/delete.md
| Code | Nom | Tarifs | Fichier |
|---|---|---|---|
BASE | Base | 1 | base_offer.py |
HC_HP | Heures Creuses/Pleines | 2-4 | hc_hp.py |
TEMPO | Tempo | 6 | tempo.py |
EJP | EJP | 2 | ejp.py |
SEASONAL | Saisonnier (2 saisons) | 4-5 | seasonal.py |
HC_NUIT_WEEKEND | Nuit & Week-end | 2 | hc_nuit_weekend.py |
WEEKEND | Week-end | 4 | weekend.py |
apps/api/src/services/offers/
├── __init__.py # Exports et imports
├── base.py # Classes abstraites (BaseOfferCalculator, etc.)
├── registry.py # Auto-discovery des calculateurs
├── base_offer.py # Calculateur BASE
├── hc_hp.py # Calculateur HC_HP (+ utilitaires HC)
├── tempo.py # Calculateur TEMPO
├── ejp.py # Calculateur EJP
├── seasonal.py # Calculateur SEASONAL
├── hc_nuit_weekend.py # Calculateur HC_NUIT_WEEKEND
└── weekend.py # Calculateur WEEKEND
class BaseOfferCalculator(ABC):
# Attributs de classe obligatoires
code: ClassVar[str] # Code unique (ex: "MY_OFFER")
name: ClassVar[str] # Nom affiche
description: ClassVar[str] # Description pour l'utilisateur
icon: ClassVar[str] # Icone Lucide (ex: "zap", "clock")
color: ClassVar[str] # Couleur hex (ex: "#3B82F6")
required_price_fields: ClassVar[list] # Champs prix obligatoires
optional_price_fields: ClassVar[list] # Champs prix optionnels
display_order: ClassVar[int] # Ordre d'affichage
@abstractmethod
def calculate(
self,
consumption: ConsumptionData,
prices: dict[str, Decimal],
subscription_monthly: Decimal,
hc_schedules: dict[str, str] | None = None,
) -> CalculationResult:
pass
Les calculateurs sont decouverts automatiquement via OfferRegistry qui utilise __subclasses__(). Il suffit que la classe :
BaseOfferCalculator__init__.pyGET /api/energy/offer-types
Response:
{
"success": true,
"data": [
{
"code": "BASE",
"name": "Base",
"description": "...",
"icon": "zap",
"color": "#3B82F6",
"required_price_fields": ["base_price"],
"optional_price_fields": ["base_price_weekend"],
"display_order": 1
},
...
]
}
| Champ | Type | Description |
|---|---|---|
base_price | Decimal(10,5) | Prix BASE |
hc_price | Decimal(10,5) | Prix Heures Creuses |
hp_price | Decimal(10,5) | Prix Heures Pleines |
base_price_weekend | Decimal(10,5) | Prix BASE week-end |
hc_price_weekend | Decimal(10,5) | Prix HC week-end |
hp_price_weekend | Decimal(10,5) | Prix HP week-end |
tempo_blue_hc | Decimal(10,5) | Prix Tempo Bleu HC |
tempo_blue_hp | Decimal(10,5) | Prix Tempo Bleu HP |
tempo_white_hc | Decimal(10,5) | Prix Tempo Blanc HC |
tempo_white_hp | Decimal(10,5) | Prix Tempo Blanc HP |
tempo_red_hc | Decimal(10,5) | Prix Tempo Rouge HC |
tempo_red_hp | Decimal(10,5) | Prix Tempo Rouge HP |
ejp_normal | Decimal(10,5) | Prix EJP Normal |
ejp_peak | Decimal(10,5) | Prix EJP Pointe Mobile |
hc_price_winter | Decimal(10,5) | Prix HC Hiver (saisonnier) |
hp_price_winter | Decimal(10,5) | Prix HP Hiver |
hc_price_summer | Decimal(10,5) | Prix HC Ete |
hp_price_summer | Decimal(10,5) | Prix HP Ete |
peak_day_price | Decimal(10,5) | Prix Jour de Pointe |
hc_schedules | JSON | Horaires HC personnalises |
Si un nouveau type necessite des champs non existants :
apps/api/src/models/energy_provider.py# Lister les types existants
/offer --list
# Voir les details du type TEMPO
/offer TEMPO --info
# Creer une offre Tri-Horaire
/offer TRI_HORAIRE --new
# Corriger un bug dans le calculateur SEASONAL
/offer SEASONAL --bug "Les mois d'hiver ne sont pas corrects"
# Supprimer un type d'offre
/offer OLD_TYPE --delete
# Mode interactif
/offer
--new (6 etapes)| Step | Fichier | Description |
|---|---|---|
| 1 | 01-explore.md | Analyser les offres existantes et definir le besoin |
| 2 | 02-plan.md | Specifier la nouvelle offre (tarifs, horaires) |
| 3 | 03-implement.md | Creer la classe calculateur |
| 4 | 04-test.md | Verifier avec des donnees de test |
| 5 | 05-seed.md | Ajouter au seed et aux pricing_types |
| 6 | 06-validate.md | Validation finale et lint |
--bug (2 etapes)| Step | Fichier | Description |
|---|---|---|
| 1 | bug-analyze.md | Analyser le bug et identifier la cause |
| 2 | bug-fix.md | Corriger et valider la correction |
--delete (1 etape)| Step | Fichier | Description |
|---|---|---|
| 1 | delete.md | Supprimer le calculateur et references |
apps/api/src/services/offers/base.pyapps/api/src/services/offers/registry.pyapps/api/src/models/energy_provider.pyapps/api/src/routers/energy_offers.pyapps/api/src/models/seed.py