Purchase Orders (POs)

Analyse les purchase orders et leur lien avec les factures via payableId. Explique pourquoi payableId=null ne signifie pas nécessairement l'absence de facture.

↓ Télécharger le skill (.md)
79/100·🔍 Ponctuel·ExpertProcurementAP Manager
Budget & POsRéconciliationget_purchase_orders

🎯 But du skill

Analyse les purchase orders et leur lien avec les factures via payableId. Explique pourquoi payableId=null ne signifie pas nécessairement l'absence de facture.

📊 Ce que ça produit

POs avec statut de liaison facture, montant engagé et explication des cas sans payableId.

Bénéfice

Avant

Interprétation incorrecte de payableId=null causait des faux signalements de factures manquantes.

Après

Compréhension correcte du lien PO-facture, zéro faux manque détecté.



# Instructions — Purchase Orders (POs)

## ⚠️ payableId=null ≠ "pas de facture"

Chaque PO peut avoir un tableau `invoices[]` avec des factures liées.
Chaque invoice a `payableId` qui peut être :
- **UUID** → lien direct vers la payable (utiliser `get_payable_by_id` pour les détails)
- **null** → la facture existe mais ne peut pas être résolue depuis son `requestId`

```json
// Invoice avec payableId null — la facture existe mais n'est pas liée :
{
  "invoiceRequestId": "abc123",
  "invoiceNumber": "INV-001",
  "amount": { "amount": 150000, "currency": "EUR", "precision": 2 },
  "status": "paid",
  "payableId": null   ← NE PAS conclure "pas de facture"
}
```

→ En cas de `payableId=null`, utiliser `invoiceRequestId` ou `invoiceNumber` pour la réconciliation manuelle.

## ⚠️ POs multi-devises : ne pas sommer cross-devises

Les POs peuvent être libellés en EUR, USD, GBP, etc. Les champs `amount`, `billedAmount`, `deliveredAmount` sont dans la devise du PO.
→ Ne jamais additionner des POs en devises différentes sans conversion.
→ Afficher séparément par devise ou convertir explicitement.

Exemple live : PO FullStory en USD ($21,267.89), PO Oracle en EUR (30,000 EUR).

## Étape 1 — POs actifs (status=open)

```json
{ "companyId": "...", "status": ["open"], "pageSize": 100 }
```

→ Retourne les POs en cours qui acceptent encore des factures.
→ `billingStatus: "lateInvoice"` → PO ouvert mais aucune facture reçue récemment.
→ `billingStatus: "partiallyBilled"` → factures reçues mais budget non épuisé.

## Étape 2 — POs expirant bientôt

```json
{
  "companyId": "...",
  "endDateFrom": "YYYY-MM-DD",
  "endDateTo": "YYYY-MM-DD",
  "status": ["open"]
}
```

Exemple : POs expirant dans les 30 prochains jours = endDateFrom=aujourd'hui, endDateTo=aujourd'hui+30j.

## Étape 3 — Calcul du budget consommé

Pour chaque PO :
```
budget_approuvé = amount (en devise du PO)
facturé = billedAmount
livré = deliveredAmount
net = billedAmount - creditNotes (= netAmount field)

taux_consommation = billedAmount / amount × 100
reste_budget = amount - billedAmount
```

⚠️ Un PO avec `billedAmount > amount` est en dépassement de budget.

## Étape 4 — Accéder au détail des factures

Pour chaque PO avec `invoices[]` :
1. Si `payableId != null` → appeler `get_payable_by_id(payableId)` pour les détails complets
2. Si `payableId == null` → noter `invoiceNumber` + `invoiceRequestId` pour réconciliation manuelle

## Exemple live (données réelles)

| PO | Description | Status | Amount | Facturé |
|----|-------------|--------|--------|---------|
| Coworking Lyon | Espace coworking | open | 26 026 EUR | 20 185 EUR (78%) |
| FullStory | Subscription SaaS | open | $21 267 USD | $10 633 USD (50%) |
| Oracle | Abonnement annuel | open | 30 000 EUR | 0 EUR (0%) — lateInvoice |
| Coworking Lyon 2 | Extension | open | 35 424 EUR | 5 904 EUR (17%) |

Note : `payableId=null` non visible dans ce jeu de données démo — le risque est documenté dans la spec MCP mais non testable ici.

## Exemple de prompt

- "Quels POs expirent dans les 30 prochains jours ?" → endDateFrom/endDateTo + status=open
- "Quel est le taux de consommation de nos POs actifs ?" → status=open + calcul billedAmount/amount
- "Trouve les factures liées au PO Oracle" → invoices[].payableId → get_payable_by_id

Comment installer ce skill

/
  1. 1
    Télécharger le fichier s28-purchase-orders-payable-id.md via le bouton ci-dessus.
  2. 2
    Placer le fichier dans le répertoire .claude/ de votre projet (ou ~/.claude/ pour une installation globale).
    cp s28-purchase-orders-payable-id.md .claude/s28-purchase-orders-payable-id.md
  3. 3
    Utiliser dans Claude Codele skill est automatiquement découvert. Décrivez votre besoin en langage naturel et Claude appliquera les instructions du skill.
💡 Assurez-vous que le MCP Spendesk est configuré dans votre .claude/settings.json avec les outils get_purchase_orders.

Skills similaires

★ Top
95/100·🔍 Ponctuel·Expert

Audit de couverture MCP — Gap analysis automatisée

Sonde tous les outils MCP disponibles, re-évalue la couverture des 50 cas d'usages persona, détecte les nouveaux champs ou outils, et régénère le rapport d'analyse des gaps.

CFOControllerAP Manager
★ Top
88/100·🔍 Ponctuel·Débutant

MCP Product Tour

Visite guidée conversationnelle du MCP Spendesk — appels réels sur les données de l'utilisateur, adaptée à sa persona, puis recommandation des prochains skills à installer

CFOControllerAP Manager
87/100· Quotidien·Débutant

Payables filtrés par date d'entrée système (firstCreatedAt)

Filtre les payables par date d'entrée dans le système Spendesk, distinct de la date de facture. Utile pour les clôtures comptables sur une période précise.

Controller