retrodoc-abap-ia/documentation/documentation_zfgpayments.fugr.zfi_out_payment_post_clear.md

181 lines
12 KiB
Markdown

The user wants me to document the ABAP function module `ZFI_OUT_PAYMENT_POST_CLEAR` in markdown format with specific sections.
# Documentation — `ZFI_OUT_PAYMENT_POST_CLEAR`
**Groupe de fonctions :** `ZFGPAYMENTS`
**Fichier :** `zfgpayments.fugr.zfi_out_payment_post_clear.abap`
---
# Algorithmie
Cette fonction module réalise le **paiement et le lettrage simultané d'un poste ouvert fournisseur** dans SAP FI (Financial Accounting). Elle suit une logique en quatre temps :
1. **Sélection de postes ouverts** : elle interroge les postes ouverts fournisseurs (type de compte `K`) pour un numéro de pièce précis (`IM_BELNR`), dans la société et la devise données.
2. **Contrôle du type de pièce** : le traitement ne se poursuit que si la pièce trouvée est de type `KR` (facture fournisseur) ou `RE` (facture entrée marchandises). Cela garantit qu'on ne paie que des factures fournisseurs légitimes.
3. **Construction de la pièce comptable de paiement** : un poste G/L bancaire est construit (en-tête + ligne + devise) avec la clé de comptabilisation `50` (crédit), le compte général de banque (`IM_HKONT`), et la date de valeur (`IM_VALUT`).
4. **Comptabilisation et lettrage** : la pièce de paiement est générée et simultanément lettrée avec le poste ouvert via `FI_DOCUMENT_GENERATE_AND_CLEAR`, puis la transaction est commitée.
---
# Objets
## Paramètres d'entrée (IMPORTING)
| Paramètre | Type SAP | Description |
|---|---|---|
| `IM_BUKRS` | `BUKRS` | Code société |
| `IM_GJAHR` | `GJAHR` | Exercice comptable |
| `IM_BELNR` | `BELNR_D` | Numéro de la pièce à lettrer |
| `IM_KONKO` | `KONKO` | Compte fournisseur (compte collectif) |
| `IM_WAERS` | `WAERS` | Devise de la transaction |
| `IM_CLR_TR` | `AUGLV` | Type de transaction de lettrage (défaut : `AUSGZAHL` = paiement sortant) |
| `IM_HKONT` | `HKONT` | Compte G/L bancaire (contrepartie) |
| `IM_KURSF` | `KURSF` | Taux de change (optionnel) |
| `IM_WRBTR` | `WRBTR` | Montant à payer en devise |
| `IM_VALUT` | `VALUT` | Date de valeur bancaire |
| `IM_HBKID` | `HBKID` | Identifiant banque maison (optionnel) |
| `IM_HKTID` | `HKTID` | Identifiant compte bancaire maison (optionnel) |
## Paramètres de sortie (EXPORTING)
| Paramètre | Type SAP | Description |
|---|---|---|
| `EX_BELNR` | `BELNR_D` | Numéro de la pièce de paiement générée |
| `EX_BUKRS` | `BUKRS` | Société de la pièce générée |
| `EX_GJAHR` | `GJAHR` | Exercice de la pièce générée |
## Variables locales
| Variable | Type | Rôle |
|---|---|---|
| `lt_selection_tab` / `ls_selection_tab` | `selection_tab_t` / `selection_tab` | Critères de sélection des postes ouverts (filtre sur `BELNR`) |
| `lv_date` | `DATUM` | Date système (date du jour) |
| `lt_open_item_tab` / `ls_open_item_tab` | `postab_tab` / `rfops` | Table des postes ouverts retournés |
| `ls_acchd` / `lt_acchd` | `acchd` / `acchd_t` | En-tête de la pièce comptable |
| `ls_accit` / `lt_accit` | `accit` / `accit_tab` | Ligne(s) de la pièce comptable |
| `ls_acccr` / `lt_acccr` | `acccr` / `acccr_tab` | Données devise de la pièce comptable |
## Constantes
| Constante | Valeur | Signification |
|---|---|---|
| `lv_koart` | `'K'` | Type de compte : Fournisseurs |
| `lv_bschl` | `'50'` | Clé de comptabilisation : Crédit G/L |
| `lv_blart` | `'KZ'` | Type de pièce : Paiement fournisseur |
---
# Dépendances
## Fonctions modules SAP standard appelées
| Fonction | Rôle |
|---|---|
| `FI_OPEN_ITEMS_SELECT` | Sélectionne les postes ouverts fournisseurs selon les critères fournis. Filtre par société, compte collectif, devise, type de pièce et table de sélection (numéro de pièce). |
| `FI_POSTING_KEY_DATA` | Résout, à partir de la clé de comptabilisation (`50`), le type de compte (`KOART`) et l'indicateur débit/crédit (`SHKZG`). Permet de déterminer dynamiquement le signe du montant. |
| `FI_LINE_ITEM_CHECK` | Contrôle et enrichit les structures de la ligne comptable (en-tête, poste, devise) avant génération de la pièce. |
| `FI_DOCUMENT_GENERATE_AND_CLEAR` | Génère la pièce de paiement FI et lettrage simultané des postes ouverts sélectionnés. C'est le coeur fonctionnel de la comptabilisation. |
| `BAPI_TRANSACTION_COMMIT` | Valide définitivement la transaction en base de données. Appelé avec `WAIT = ABAP_TRUE` pour s'assurer que le commit est synchrone. |
## Appartenance
- **Groupe de fonctions :** `ZFGPAYMENTS` (développement custom Z, domaine paiements sortants)
---
# Flux de traitement
````
┌─────────────────────────────────────────────────────────┐
│ 1. INITIALISATION │
│ - Date courante = sy-datum │
│ - Construction du critère de sélection sur BELNR │
└────────────────────────┬────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ 2. SÉLECTION DES POSTES OUVERTS │
│ FI_OPEN_ITEMS_SELECT │
│ - Filtre : société, compte K, devise, type KZ │
│ - Filtre additionnel : numéro de pièce = IM_BELNR │
└────────────────────────┬────────────────────────────────┘
┌──────────▼──────────┐
│ Table vide ? │
│ → Fin sans action │
└──────────┬──────────┘
│ Non vide
┌─────────────────────────────────────────────────────────┐
│ 3. CONTRÔLE DU TYPE DE PIÈCE │
│ - Lecture du 1er enregistrement │
│ - BLART = 'KR' (facture fournisseur) │
│ ou = 'RE' (facture entrée marchandises) ? │
└────────────────────────┬────────────────────────────────┘
│ Oui
┌─────────────────────────────────────────────────────────┐
│ 4. CONSTRUCTION DE LA PIÈCE DE PAIEMENT │
│ a) En-tête (ACCHD) : type BKPFF, procédure RFBU │
│ b) Ligne (ACCIT) : position 1, type KZ, date valeur│
│ compte G/L banque, clé 50 │
│ banque maison si renseignée │
│ c) FI_POSTING_KEY_DATA → koart + shkzg │
│ d) Devise (ACCCR) : montant, devise, taux change │
│ inversion signe si crédit (H) │
└────────────────────────┬────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ 5. CONTRÔLE DES LIGNES │
│ FI_LINE_ITEM_CHECK │
│ - Enrichissement et validation des structures │
└────────────────────────┬────────────────────────────────┘
┌─────────────────────────────────────────────────────────┐
│ 6. COMPTABILISATION ET LETTRAGE │
│ FI_DOCUMENT_GENERATE_AND_CLEAR │
│ - Génère la pièce KZ │
│ - Lettrage avec les postes ouverts │
│ - Retourne EX_BELNR / EX_BUKRS / EX_GJAHR │
└────────────────────────┬────────────────────────────────┘
│ EX_BELNR non vide
┌─────────────────────────────────────────────────────────┐
│ 7. COMMIT │
│ BAPI_TRANSACTION_COMMIT (WAIT = X) │
│ - Validation synchrone en base │
└─────────────────────────────────────────────────────────┘
````
---
# Points d'attention
## Risques techniques
- **Absence de gestion d'erreurs sur `FI_OPEN_ITEMS_SELECT`** : les exceptions (`company_code_missing`, `account_missing`, etc.) sont déclarées mais aucun traitement n'est prévu en cas de déclenchement. En cas d'erreur, la fonction se termine silencieusement sans retourner d'information à l'appelant.
- **Exception `ERROR_MESSAGE` non levée** : la signature déclare une exception `ERROR_MESSAGE`, mais elle n'est jamais déclenchée dans le corps de la fonction. L'appelant ne peut donc pas être notifié d'une anomalie via le mécanisme standard.
- **Absence de vérification de `SY-SUBRC`** : après `FI_OPEN_ITEMS_SELECT` et `FI_DOCUMENT_GENERATE_AND_CLEAR`, la valeur de retour `SY-SUBRC` n'est pas vérifiée. Un échec silencieux est possible.
- **Hardcoding de `lv_bschl = '50'` et `lv_blart = 'KZ'`** : ces valeurs sont figées en constantes. Tout besoin de paiement avec un type de pièce ou une clé comptable différente nécessiterait une modification du code.
- **`MOVE-CORRESPONDING` entre structures de types différents** (`acchd` vers `accit`) : peut transférer des champs non désirés ou masquer des oublis d'alimentation explicite.
- **Commit dans la fonction** : l'appel à `BAPI_TRANSACTION_COMMIT` à l'intérieur d'une fonction module couple fortement la logique transactionnelle à cette fonction. Si elle est appelée dans une boucle ou un traitement plus large, chaque appel commitera indépendamment, rendant un rollback global impossible.
## Risques métiers
- **Filtrage post-sélection sur `BELNR`** : le `DELETE lt_open_item_tab WHERE belnr NE im_belnr` suggère que `FI_OPEN_ITEMS_SELECT` peut ramener des pièces autres que celle demandée. Ce filtre est une sécurité, mais si la table est vide après purge, aucun message n'est émis.
- **Traitement limité aux types `KR` et `RE`** : tout autre type de pièce fournisseur (ex. : `DR`, avoir) sera ignoré sans notification. Cela peut donner l'impression d'un traitement réussi alors qu'aucune action n'a eu lieu.
- **Sensibilité à la date de valeur (`IM_VALUT`)** : les dates de comptabilisation (`BLDAT`, `BUDAT`) sont toutes deux alimentées par `IM_VALUT` (date de valeur bancaire), et non par la date système. Une date incorrecte en entrée affectera directement la comptabilisation en période comptable.
- **Pas de contrôle du montant (`IM_WRBTR`)** : aucune validation n'est effectuée pour s'assurer que le montant correspond au montant du poste ouvert. Un écart générera une différence de lettrage.
- **Unicité supposée du poste ouvert** : le commentaire `"Only one record will be in Int tab"` indique une hypothèse forte. Si plusieurs postes ouverts existent pour la même pièce (cas de paiements partiels), seul le premier sera lu mais tous seront envoyés à `FI_DOCUMENT_GENERATE_AND_CLEAR`.