Création de 2 écrans professionnels pour le module Devis:
1. devis/nouveau.xhtml:
- 4 sections: Informations générales, Détail du devis, Montants, Conditions
- Numéro auto-généré avec icône
- Statut avec 5 valeurs (BROUILLON, ATTENTE, ACCEPTE, REFUSE, EXPIRE)
- Dates d'émission et validité avec calendriers
- Client et objet du devis requis
- Placeholder pour lignes de devis (future développement)
- Calcul automatique TVA 18% et TTC
- Récapitulatif visuel HT/TVA/TTC avec composant monétaire
- Conditions de paiement et remarques (section collapsible)
- 3 boutons: Annuler, Brouillon, Envoyer
2. devis/details.xhtml:
- En-tête: numéro, statut, client, objet, dates
- Actions: Retour, Convertir en chantier, PDF, Modifier
- 4 KPI cards: Montant HT, TVA, TTC, Statut
- 6 onglets professionnels:
* Vue d'ensemble: infos + récap financier + actions rapides
* Détail des lignes: table lignes (placeholder)
* Conditions: paiement, délais, garanties
* Documents: GED associée (placeholder)
* Suivi: timeline actions
* Historique: modifications (placeholder)
Corrections:
- Fix navigation /factures/nouvelle -> /factures/nouveau (factures.xhtml)
- Fix menu /factures/nouvelle -> /factures/nouveau (menu.xhtml)
Tous les composants réutilisables utilisés (status-badge, monetary-display).
Validation complète côté client et serveur.
UI/UX professionnel adapté au métier BTP.
253 lines
8.0 KiB
PowerShell
253 lines
8.0 KiB
PowerShell
# Script PowerShell pour configurer Keycloak pour l'application JSF BTPXpress
|
|
# Port: 8081 (Quarkus + JSF + PrimeFaces)
|
|
|
|
Write-Host "Configuration Keycloak pour BTPXpress Client JSF" -ForegroundColor Green
|
|
Write-Host "=============================================" -ForegroundColor Cyan
|
|
|
|
$KEYCLOAK_URL = "https://security.lions.dev"
|
|
$REALM = "btpxpress"
|
|
$CLIENT_ID = "btpxpress-frontend"
|
|
$ADMIN_USER = "admin"
|
|
$ADMIN_PASSWORD = "KeycloakAdmin2025!"
|
|
|
|
# Fonction pour obtenir le token d'administration
|
|
function Get-AdminToken {
|
|
Write-Host "Recuperation du token admin..." -ForegroundColor Yellow
|
|
|
|
$body = @{
|
|
grant_type = "password"
|
|
client_id = "admin-cli"
|
|
username = $ADMIN_USER
|
|
password = $ADMIN_PASSWORD
|
|
}
|
|
|
|
try {
|
|
$response = Invoke-RestMethod -Uri "$KEYCLOAK_URL/realms/master/protocol/openid-connect/token" `
|
|
-Method Post `
|
|
-ContentType "application/x-www-form-urlencoded" `
|
|
-Body $body
|
|
|
|
Write-Host "Token admin recupere" -ForegroundColor Green
|
|
return $response.access_token
|
|
}
|
|
catch {
|
|
Write-Host "Erreur lors de la recuperation du token: $_" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
# Fonction pour obtenir la configuration du client
|
|
function Get-ClientConfig {
|
|
param([string]$Token)
|
|
|
|
Write-Host "Recuperation de la configuration du client $CLIENT_ID..." -ForegroundColor Yellow
|
|
|
|
$headers = @{
|
|
Authorization = "Bearer $Token"
|
|
Accept = "application/json"
|
|
}
|
|
|
|
try {
|
|
$clients = Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/clients" `
|
|
-Method Get `
|
|
-Headers $headers
|
|
|
|
$client = $clients | Where-Object { $_.clientId -eq $CLIENT_ID }
|
|
|
|
if ($client) {
|
|
Write-Host "Client trouve: $($client.clientId)" -ForegroundColor Green
|
|
return $client
|
|
}
|
|
else {
|
|
Write-Host "Client $CLIENT_ID non trouve" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
}
|
|
catch {
|
|
Write-Host "Erreur lors de la recuperation du client: $_" -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
# Fonction pour mettre a jour les redirect URIs
|
|
function Update-ClientRedirectUris {
|
|
param(
|
|
[string]$Token,
|
|
[object]$Client
|
|
)
|
|
|
|
Write-Host "Mise a jour des redirect URIs..." -ForegroundColor Yellow
|
|
|
|
# Nouveaux redirect URIs pour l'application JSF
|
|
$newRedirectUris = @(
|
|
"http://localhost:8081/*",
|
|
"http://localhost:8081/",
|
|
"http://localhost:8081/dashboard.xhtml",
|
|
"http://localhost:8081/index.xhtml",
|
|
"http://localhost:3000/*",
|
|
"http://localhost:3000/",
|
|
"http://localhost:3000/dashboard",
|
|
"http://localhost:3001/*",
|
|
"http://localhost:3001/",
|
|
"http://localhost:3001/dashboard",
|
|
"https://btpxpress.lions.dev/*",
|
|
"https://btpxpress.lions.dev/",
|
|
"https://btpxpress.lions.dev/dashboard",
|
|
"https://btpxpress.lions.dev/dashboard.xhtml"
|
|
)
|
|
|
|
$newWebOrigins = @(
|
|
"http://localhost:8081",
|
|
"http://localhost:3000",
|
|
"http://localhost:3001",
|
|
"https://btpxpress.lions.dev"
|
|
)
|
|
|
|
# Mettre a jour la configuration du client
|
|
$Client.redirectUris = $newRedirectUris
|
|
$Client.webOrigins = $newWebOrigins
|
|
$Client.publicClient = $true
|
|
$Client.standardFlowEnabled = $true
|
|
$Client.implicitFlowEnabled = $false
|
|
$Client.directAccessGrantsEnabled = $true
|
|
$Client.serviceAccountsEnabled = $false
|
|
|
|
# Activer PKCE
|
|
if (-not $Client.attributes) {
|
|
$Client.attributes = @{}
|
|
}
|
|
$Client.attributes."pkce.code.challenge.method" = "S256"
|
|
$Client.attributes."post.logout.redirect.uris" = "http://localhost:8081/*##http://localhost:3000/*##https://btpxpress.lions.dev/*"
|
|
|
|
$headers = @{
|
|
Authorization = "Bearer $Token"
|
|
"Content-Type" = "application/json"
|
|
}
|
|
|
|
$body = $Client | ConvertTo-Json -Depth 10
|
|
|
|
try {
|
|
Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/clients/$($Client.id)" `
|
|
-Method Put `
|
|
-Headers $headers `
|
|
-Body $body | Out-Null
|
|
|
|
Write-Host "Redirect URIs mis a jour:" -ForegroundColor Green
|
|
$newRedirectUris | ForEach-Object { Write-Host " - $_" -ForegroundColor Cyan }
|
|
|
|
Write-Host ""
|
|
Write-Host "Web Origins mis a jour:" -ForegroundColor Green
|
|
$newWebOrigins | ForEach-Object { Write-Host " - $_" -ForegroundColor Cyan }
|
|
}
|
|
catch {
|
|
Write-Host "Erreur lors de la mise a jour: $_" -ForegroundColor Red
|
|
Write-Host $_.Exception.Message -ForegroundColor Red
|
|
exit 1
|
|
}
|
|
}
|
|
|
|
# Fonction pour creer un utilisateur de test
|
|
function Create-TestUser {
|
|
param([string]$Token)
|
|
|
|
Write-Host ""
|
|
Write-Host "Creation d'un utilisateur de test..." -ForegroundColor Yellow
|
|
|
|
$headers = @{
|
|
Authorization = "Bearer $Token"
|
|
"Content-Type" = "application/json"
|
|
}
|
|
|
|
# Verifier si l'utilisateur existe deja
|
|
try {
|
|
$users = Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/users?username=test@btpxpress.com" `
|
|
-Method Get `
|
|
-Headers $headers
|
|
|
|
if ($users.Count -gt 0) {
|
|
Write-Host "L'utilisateur test@btpxpress.com existe deja" -ForegroundColor Cyan
|
|
return $users[0]
|
|
}
|
|
}
|
|
catch {
|
|
# Utilisateur n'existe pas, on va le creer
|
|
}
|
|
|
|
# Creer l'utilisateur
|
|
$newUser = @{
|
|
username = "test@btpxpress.com"
|
|
email = "test@btpxpress.com"
|
|
firstName = "Test"
|
|
lastName = "BTPXpress"
|
|
enabled = $true
|
|
emailVerified = $true
|
|
credentials = @(
|
|
@{
|
|
type = "password"
|
|
value = "Test123!"
|
|
temporary = $false
|
|
}
|
|
)
|
|
} | ConvertTo-Json -Depth 10
|
|
|
|
try {
|
|
Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/users" `
|
|
-Method Post `
|
|
-Headers $headers `
|
|
-Body $newUser | Out-Null
|
|
|
|
Write-Host "Utilisateur de test cree:" -ForegroundColor Green
|
|
Write-Host " Email: test@btpxpress.com" -ForegroundColor Cyan
|
|
Write-Host " Mot de passe: Test123!" -ForegroundColor Cyan
|
|
|
|
# Recuperer l'utilisateur cree
|
|
$users = Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/users?username=test@btpxpress.com" `
|
|
-Method Get `
|
|
-Headers $headers
|
|
|
|
# Assigner le role btpxpress_user ou admin
|
|
if ($users.Count -gt 0) {
|
|
$userId = $users[0].id
|
|
|
|
# Recuperer les roles disponibles
|
|
$roles = Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/roles" `
|
|
-Method Get `
|
|
-Headers $headers
|
|
|
|
$userRole = $roles | Where-Object { $_.name -eq "admin" }
|
|
|
|
if ($userRole) {
|
|
$roleAssignment = @($userRole) | ConvertTo-Json -Depth 10 -AsArray
|
|
|
|
Invoke-RestMethod -Uri "$KEYCLOAK_URL/admin/realms/$REALM/users/$userId/role-mappings/realm" `
|
|
-Method Post `
|
|
-Headers $headers `
|
|
-Body $roleAssignment | Out-Null
|
|
|
|
Write-Host "Role admin assigne a l'utilisateur" -ForegroundColor Green
|
|
}
|
|
}
|
|
}
|
|
catch {
|
|
Write-Host "Erreur lors de la creation de l'utilisateur: $_" -ForegroundColor Yellow
|
|
Write-Host $_.Exception.Message -ForegroundColor Yellow
|
|
}
|
|
}
|
|
|
|
# Execution principale
|
|
Write-Host ""
|
|
Write-Host "Debut de la configuration..." -ForegroundColor Green
|
|
|
|
$token = Get-AdminToken
|
|
$client = Get-ClientConfig -Token $token
|
|
Update-ClientRedirectUris -Token $token -Client $client
|
|
Create-TestUser -Token $token
|
|
|
|
Write-Host ""
|
|
Write-Host "Configuration terminee avec succes!" -ForegroundColor Green
|
|
Write-Host ""
|
|
Write-Host "Prochaines etapes:" -ForegroundColor Yellow
|
|
Write-Host "1. Demarrer l'application: mvn quarkus:dev" -ForegroundColor Cyan
|
|
Write-Host "2. Acceder a http://localhost:8081" -ForegroundColor Cyan
|
|
Write-Host "3. Se connecter avec: test@btpxpress.com / Test123!" -ForegroundColor Cyan
|