# Collecter la taxe sur les paiements hors Stripe Utilisez l’API Stripe Tax pour calculer et déclarer la taxe sur les paiements traités en dehors de Stripe. Utilisez l’API Stripe Tax pour calculer et déclarer la taxe sur les paiements que vous traitez en dehors de Stripe. Cette solution est compatible avec tout prestataire de paiement tiers ou vos systèmes de paiement et de facturation internes. > #### Fait appel à Stripe pour traiter les paiements. > > Si vous traitez des paiements avec Stripe, envisagez plutôt ces intégrations : > > - [Stripe Tax avec PaymentIntents](https://docs.stripe.com/tax/payment-intent.md) pour la gestion automatique des transactions fiscales - [Stripe Tax avec Checkout](https://docs.stripe.com/tax/checkout.md), [Invoicing](https://docs.stripe.com/tax/invoicing.md) ou [Subscriptions](https://docs.stripe.com/tax/subscriptions.md) pour une prise en charge native de la taxe ## Ajouter des immatriculations Stripe Tax calcule les taxes uniquement dans les juridictions où vous êtes immatriculé pour collecter la TVA. Vous devez [ajouter vos immatriculations fiscales](https://docs.stripe.com/tax/registering.md#add-a-registration) dans le Dashboard. ## Optional: Collecter l’adresse du client [Côté serveur] La taxe que vous collectez dépend généralement de l’emplacement de votre client. Pour un calcul de taxe plus précis, veuillez collecter l’adresse complète de votre client. Avant de la collecter, vous pouvez afficher une estimation à votre client en fonction de son [adresse IP](https://docs.stripe.com/tax/standalone-tax-api.md#ip-address). Les informations d’adresse requises pour le calcul de la taxe [varient selon le pays du client](https://docs.stripe.com/tax/customer-locations.md#supported-formats) : - **États-Unis** : nous exigeons au moins le code postal de votre client. Pour un calcul plus précis des taxes, nous vous recommandons de fournir une adresse complète. - **Canada** : nous avons besoin du code postal ou de la province de votre client. - **Autres pays** : nous exigeons uniquement le code pays de votre client. ## Calculer la taxe [Côté serveur] Vous choisissez quand et à quelle fréquence [calculer la taxe](https://docs.stripe.com/api/tax/calculations/create.md). Par exemple, vous pouvez : - Montrez une estimation des taxes [basée sur l’adresse IP de votre client](https://docs.stripe.com/tax/standalone-tax-api.md#ip-address) lorsqu’il accède à votre tunnel de paiement - Recalculer les taxes lorsque le client saisit son adresse de facturation ou de livraison - Calculer le montant final de la taxe à percevoir lorsque votre client a saisi son adresse Stripe [ facture des frais](https://stripe.com/tax/pricing) par appel API de calcul de taxe. Vous pouvez limiter les appels API de calcul de taxe afin de gérer vos coûts. Les exemples ci-dessous montrent comment calculer la taxe dans différents scénarios. Stripe Tax ne calcule la taxe que dans les juridictions où vous avez effectué votre enregistrement pour la percevoir. Vous devez [ajouter vos immatriculations fiscales](https://docs.stripe.com/tax/registering.md#add-a-registration) dans le Dashboard. #### Exemple - États-Unis : article hors taxes Cet exemple calcule la taxe pour une adresse de livraison aux États-Unis. Le poste a un prix de 10 USD et utilise le [code fiscal prédéfini de votre compte](https://docs.stripe.com/tax/set-up.md#preset-tax-code). ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "customer_details[address][line1]=920 5th Ave" \ -d "customer_details[address][city]=Seattle" \ -d "customer_details[address][state]=WA" \ -d "customer_details[address][postal_code]=98104" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=shipping" ``` #### Exemple - États-Unis : plusieurs articles avec livraison Dans cet exemple, il y a plusieurs postes hors taxe et des frais de livraison de 5 USD. ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "line_items[0][tax_code]=txcd_99999999" \ -d "line_items[1][amount]=5000" \ -d "line_items[1][reference]=L2" \ -d "line_items[1][tax_code]=txcd_99999999" \ -d "line_items[2][amount]=9999" \ -d "line_items[2][reference]=L3" \ -d "line_items[2][tax_code]=txcd_99999999" \ -d "shipping_cost[amount]=500" \ -d "customer_details[address][line1]=920 5th Ave" \ -d "customer_details[address][city]=Seattle" \ -d "customer_details[address][state]=WA" \ -d "customer_details[address][postal_code]=98104" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=shipping" ``` #### Exemple - États-Unis : article et quantité À New York, les vêtements ne sont pas soumis à la taxe sur les ventes si chaque article coûte moins de 110 USD. Cet exemple présente un poste de vêtements avec un prix total de 150 USD et une quantité de 3. Cela signifie que chaque article de vêtements coûte 50 USD et est donc exonéré de la taxe sur les ventes. ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=15000" \ -d "line_items[0][quantity]=3" \ -d "line_items[0][reference]=Clothing" \ -d "line_items[0][tax_code]=txcd_30011000" \ -d "shipping_cost[amount]=500" \ -d "customer_details[address][state]=NY" \ -d "customer_details[address][postal_code]=10001" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=shipping" ``` #### Exemple - Europe : article TTC Dans cet exemple, la taxe est calculée pour une adresse de facturation en Irlande, où les taxes sont généralement incluses dans les tarifs pratiqués pour les clients non professionnels. L’article est proposé à un tarif de 29,99 EUR et utilise le code fiscal `txcd_10302000` (ebook). ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=eur \ -d "line_items[0][amount]=2999" \ -d "line_items[0][reference]=L1" \ -d "line_items[0][tax_behavior]=inclusive" \ -d "line_items[0][tax_code]=txcd_10302000" \ -d "customer_details[address][country]=IE" \ -d "customer_details[address_source]=billing" ``` #### Exemple - Europe : plusieurs articles avec livraison Dans cet exemple, la taxe est calculée pour une adresse de livraison en Irlande, où les taxes sont généralement incluses dans les tarifs pratiqués pour les clients non professionnels. L’article est proposé à un tarif de 59,99 EUR, auquel s’ajoutent des frais de livraison de 5 EUR. Comme les deux montants sont TTC, le client paie toujours 64,99 EUR. ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=eur \ -d "line_items[0][amount]=5999" \ -d "line_items[0][reference]=L1" \ -d "line_items[0][tax_behavior]=inclusive" \ -d "line_items[0][tax_code]=txcd_99999999" \ -d "shipping_cost[amount]=500" \ -d "shipping_cost[tax_behavior]=inclusive" \ -d "customer_details[address][line1]=123 Some House" \ -d "customer_details[address][city]=Dublin" \ -d "customer_details[address][country]=IE" \ -d "customer_details[address_source]=shipping" ``` #### Exemple - Adresse de l’expéditeur Avec cette fonctionnalité préliminaire (bêta), les taxes sont prélevées en fonction de l’adresse d’expédition, si vous fournissez une adresse d’expédition dans certains États (comme l’Illinois) et que l’envoi contient des biens physiques. Si l’envoi contient à la fois des biens physiques et des services, les taxes sont appliquées aux deux en fonction de l’adresse d’expédition. Cet exemple calcule la taxe en fonction du lieu d’expédition de la commande à Naperville, dans l’Illinois, au lieu de l’adresse de l’entreprise (située en dehors de l’Illinois) et de l’adresse de livraison à Springfield, dans l’Illinois. ```curl curl https://api.stripe.com/v1/tax/calculations \ -u "<>:" \ -d currency=usd \ -d "line_items[0][amount]=1000" \ -d "line_items[0][reference]=L1" \ -d "line_items[0][tax_behavior]=exclusive" \ -d "line_items[0][tax_code]=txcd_99999999" \ -d "shipping_cost[amount]=500" \ -d "shipping_cost[tax_behavior]=exclusive" \ -d "customer_details[address][city]=Springfield" \ -d "customer_details[address][state]=IL" \ -d "customer_details[address][postal_code]=62704" \ -d "customer_details[address][country]=US" \ -d "customer_details[address_source]=billing" \ -d "ship_from_details[address][city]=Naperville" \ -d "ship_from_details[address][state]=IL" \ -d "ship_from_details[address][postal_code]=60540" \ -d "ship_from_details[address][country]=US" ``` La [réponse de calcul](https://docs.stripe.com/api/tax/calculations/object.md) contient des montants que vous pouvez afficher à votre client, et utiliser pour accepter les paiements : | Attribut | Description | | -------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | [amount_total](https://docs.stripe.com/api/tax/calculations/object.md#tax_calculation_object-amount_total) | Le montant total après calcul de la taxe. Utilisez ce montant pour facturer votre client. | | [tax_amount_exclusive](https://docs.stripe.com/api/tax/calculations/object.md#tax_calculation_object-tax_amount_exclusive) | Le montant des taxes qui vient s’ajouter aux postes de facture et aux frais de livraison, faisant s’accroître la valeur `amount_total`. Utilisez-le pour indiquer à votre client le montant de taxes ajouté au sous-total de la transaction. | | [tax_amount_inclusive](https://docs.stripe.com/api/tax/calculations/object.md#tax_calculation_object-tax_amount_inclusive) | Le montant des taxes inclus dans vos postes de facture et vos frais de livraison (si vous avez opté pour les tarification TTC). Ce montant n’augmente pas la valeur `amount_total`. Utilisez-le pour communiquer à votre client quelle est la part des taxes dans le montant total payé. | | [tax_breakdown](https://docs.stripe.com/api/tax/calculations/object.md#tax_calculation_object-tax_breakdown) | Liste de montants de taxe répartis par taux d’imposition du pays ou de l’État. Vous pouvez vous en servir pour indiquer à vos clients quelles taxes vous collectez. | ### Gérer les erreurs d’emplacement du client Le calcul renvoie le code d’erreur `customer_tax_location_invalid` si l’adresse de votre client est invalide ou n’est pas suffisamment précise pour calculer la taxe : ```json { "error": { "doc_url": "https://docs.stripe.com/error-codes#customer-tax-location-invalid","code": "customer_tax_location_invalid", "message": "We could not determine the customer's tax location based on the provided customer address.", "param": "customer_details[address]", "type": "invalid_request_error" } } ``` Si vous recevez cette erreur, demandez à votre client de vérifier l’adresse saisie et de corriger toute éventuelle faute de frappe. ## Créer une transaction fiscale [Côté serveur] La création d’une transaction fiscale enregistre les taxes que vous avez collectées auprès de votre client, afin que vous puissiez ultérieurement [télécharger des exports et générer des rapports ](https://docs.stripe.com/tax/reports.md)pour faciliter votre déclaration fiscale. Vous pouvez [créer une transaction](https://docs.stripe.com/api/tax/transactions/create_from_calculation.md) à partir d’un calcul jusqu’à la date d’expiration [(expires_at)](https://docs.stripe.com/api/tax/calculations/object.md#tax_calculation_object-expires_at), soit 90 jours après sa création. Toute tentative d’utilisation après cette période renverra une erreur. > La transaction est considérée comme effective à la date d’appel de `create_from_calculation`, et les montants de taxe ne seront pas recalculés. Lorsque vous créez une transaction fiscale, vous devez fournir une `reference` unique pour la transaction et pour chaque poste de facture. Ces références apparaissent dans les exports des taxes et permettent de rapprocher les taxes perçues et les commandes de votre système. Par exemple, une transaction fiscale avec la référence `order_123456789`, les références de poste `L1` et `L2`, ainsi que des frais de livraison, se présente ainsi dans les exports de taxes détaillés : | ID | line_item_id | type | devise | transaction_date | | --------------- | ------------ | ------- | ------ | ------------------- | | order_123456789 | L1 | externe | usd | 23/02/2023 17:01:16 | | order_123456789 | L2 | externe | usd | 23/02/2023 17:01:16 | | order_123456789 | livraison | externe | usd | 23/02/2023 17:01:16 | Lorsque votre client effectue un paiement, utilisez l’identifiant de calcul pour enregistrer la taxe collectée. Vous pouvez créer la transaction fiscale une fois le paiement traité dans votre système, par exemple dans votre endpoint de soumission de commande ou en réponse à un rappel de succès de paiement de votre sous-traitant. L’exemple ci-dessous crée une transaction et utilise une référence de commande ou de paiement unique : ```curl curl https://api.stripe.com/v1/tax/transactions/create_from_calculation \ -u "<>:" \ -d calculation={{TAX_CALCULATION}} \ -d reference=order_12345 \ -d "expand[]=line_items" ``` Enregistrez l’[identifiant de transaction fiscale](https://docs.stripe.com/api/tax/transactions/object.md#tax_transaction_object-id) pour consigner les remboursements ultérieurement. Vous pouvez stocker l’identifiant de transaction dans votre base de données avec la commande à laquelle il appartient. ## Enregistrer des remboursements [Côté serveur] Après avoir créé une transaction fiscale correspondant à une vente à un client, vous devrez peut-être enregistrer des remboursements. Ces opérations sont représentées par des transactions fiscales dans lesquelles `type=reversal`. Les transactions d’annulation compensent des transactions antérieures en présentant des montants de signes opposés. Par exemple, le remboursement intégral d’une vente de 50 USD sera représenté par une opération de -50 USD. Lorsque vous émettez un remboursement, vous devez créer une transaction fiscale d’annulation avec une `référence` unique. Les stratégies courantes incluent : - Ajoutez un suffixe à la référence d’origine. Par exemple, si la transaction d’origine a pour référence `order_123456789`, créez la transaction d’annulation avec la référence `order_123456789-refund`. - Utilisez un identifiant de remboursement de votre système. Par exemple, `myRefund_456`. Choisissez l’approche qui fonctionne le mieux pour rapprocher les commandes de vos clients avec vos [exportations fiscales](https://docs.stripe.com/tax/reports.md). ### Remboursement intégral d’une vente Une fois que vous avez effectué le remboursement intégral d’une vente dans votre système, créez une transaction d’annulation avec le paramètre `mode=full`. Dans l’exemple ci-dessous, `tax_1MEFAAI6rIcR421eB1YOzACZ` est la transaction fiscale qui enregistre la vente à votre client : ```curl curl https://api.stripe.com/v1/tax/transactions/create_reversal \ -u "<>:" \ -d mode=full \ -d original_transaction=tax_1MEFAAI6rIcR421eB1YOzACZ \ -d reference=order_123456789-cancel \ -d "expand[]=line_items" ``` La transaction d’annulation intégrale ainsi créée est alors renvoyée : ```json { "id": "tax_1MEFtXI6rIcR421e0KTGXvCK", "object": "tax.transaction", "created": 1670866467, "currency": "eur", "customer": null, "customer_details": { "address": { "city": null, "country": "IE", "line1": null, "line2": null, "postal_code": null, "state": null }, "address_source": "billing", "ip_address": null, "tax_ids": [], "taxability_override": "none" }, "line_items": { "object": "list", "data": [ { "id": "tax_li_MyCIgTuP9F9mEU", "object": "tax.transaction_line_item", "amount": -4999, "amount_tax": -1150, "livemode": false, "metadata": { }, "quantity": 1, "reference": "L1", "reversal": { "original_line_item": "tax_li_MyBXPByrSUwm6r" }, "tax_behavior": "exclusive", "tax_code": "txcd_10000000", "type": "reversal" }, { "id": "tax_li_MyCIUNXExXmJKU", "object": "tax.transaction_line_item", "amount": -1090, "amount_tax": -90, "livemode": false, "metadata": { }, "quantity": 1, "reference": "L2", "reversal": { "original_line_item": "tax_li_MyBX3Wu3qd2mXj" }, "tax_behavior": "exclusive", "tax_code": "txcd_10000000", "type": "reversal" } ], "has_more": false, "total_count": 2, "url": "/v1/tax/transactions/tax_1MEFtXI6rIcR421e0KTGXvCK/line_items" }, "livemode": false, "metadata": { }, "reference": "order_123456789-cancel", "reversal": { "original_transaction": "tax_1MEFAAI6rIcR421eB1YOzACZ" }, "shipping_cost": null, "tax_date": 1670863654, "type": "reversal" } ``` L’annulation totale d’une transaction n’affecte pas les annulations partielles précédentes. Lorsque vous enregistrez une annulation totale, vous devez [annuler intégralement](https://docs.stripe.com/tax/off-stripe.md#reversals-void-refund) toutes les annulations partielles précédentes pour la même transaction afin d’éviter les remboursements en double. ### Remboursement partiel d’une vente Après avoir émis un remboursement à votre client, créez une transaction fiscale d’annulation avec `mode=partial`. Cela vous permet d’enregistrer un remboursement partiel en indiquant les montants de taxe remboursés par poste. Vous pouvez créer jusqu’à 30 annulations partielles par vente. Annuler un montant supérieur à la taxe collectée renvoie une erreur. Dans l’exemple ci-dessous, seul le premier poste de la transaction d’origine est remboursé : ```curl curl https://api.stripe.com/v1/tax/transactions/create_reversal \ -u "<>:" \ -d mode=partial \ -d original_transaction=tax_1MEFAAI6rIcR421eB1YOzACZ \ -d reference=order_123456789-refund_1 \ -d "line_items[0][original_line_item]=tax_li_MyBXPByrSUwm6r" \ -d "line_items[0][reference]=L1" \ -d "line_items[0][amount]=-4999" \ -d "line_items[0][amount_tax]=-1150" \ -d "metadata[refund]={{REFUND_ID}}" \ --data-urlencode "metadata[refund_reason]=Refunded line 1 of order_123456789 (customer was unhappy)" \ -d "expand[0]=line_items" ``` La transaction d’annulation partielle ainsi créée est alors renvoyée : ```json { "id": "tax_1MEFACI6rIcR421eHrjXCSmD", "object": "tax.transaction", "created": 1670863656, "currency": "eur", ... "line_items": { "object": "list", "data": [ { "id": "tax_li_MyBXC98AhtaR37", "object": "tax.transaction_line_item", "amount": -4999, "amount_tax": -1150, "livemode": false, "metadata": { }, "quantity": 1, "reference": "L1", "reversal": { "original_line_item": "tax_li_MyBXPByrSUwm6r" }, "tax_behavior": "exclusive", "tax_code": "txcd_10000000", "type": "reversal" } ], "has_more": false, "total_count": 1, "url": "/v1/tax/transactions/tax_1MEFACI6rIcR421eHrjXCSmD/line_items" }, "livemode": false, "metadata": { "refund": "{{REFUND_ID}}", "description": "Refunding order_123456789 (customer was unhappy)" }, "reference": "order_123456789-refund_1", "reversal": { "original_transaction": "tax_1MEFAAI6rIcR421eB1YOzACZ" }, "shipping_cost": null, "tax_date": 1670863654, "type": "reversal" } ``` Pour chaque poste annulé, vous devez fournir l’`amount` et `amount_tax` annulés. L’`amount` inclut la taxe si le poste initial du calcul incluait la taxe. La façon dont les attributs `amount` et `amount_tax` sont déterminés dépend de votre situation : - Si vos transactions comportent toujours un seul poste, utilisez les [annulations complètes](https://docs.stripe.com/tax/off-stripe.md#reversals-full) à la place. - Si vous remboursez toujours les postes dans leur intégralité, utilisez les valeurs `amount` et `amount_tax` du poste d’origine, mais avec des signes négatifs. - Si vous remboursez une partie de la valeur des postes, vous devez calculer les montants remboursés. Par exemple, pour une transaction de vente avec `amount=5000` et `amount_tax=500`, après avoir remboursé la moitié de la valeur du poste, vous créez une annulation partielle avec la valeur de poste `amount=-2500` et `amount_tax=-250`. #### Rapports fiscaux avec remboursements partiels Un remboursement de la taxe effectué partiellement peut rompre la cohérence entre le sous-total et le montant de taxe appliqué.Dans ce cas, vos rapports fiscaux risquent de ne plus être fiables. Le système n’ajustera pas automatiquement les montants taxables et non taxables et ne reflétera pas le motif de l’annulation de la taxe (par exemple : produit ou client exonéré ou autoliquidation). Évitez les remboursements partiels de taxe par poste. Annulez plutôt la transaction, puis créez-en une nouvelle avec les paramètres appropriés afin de garantir un calcul fiscal exact. ### Remboursement partiel d’une vente par montant fixe Vous pouvez également créer une annulation avec le paramètre `mode=partial` en spécifiant le montant fixe après impôt que vous souhaitez rembourser. Ce montant est alors réparti entre les différents postes et frais de livraison de manière proportionnelle, en fonction du montant restant à rembourser pour chacun d’entre eux. Dans l’exemple ci-dessous, la transaction comporte deux postes de facture : un poste de 10 USD et un poste de 20 USD, tous deux taxés à 10 %. Le montant total de la transaction est de 33,00 USD. On reçoit un remboursement d’un montant fixe de 16,50 USD : ```curl curl https://api.stripe.com/v1/tax/transactions/create_reversal \ -u "<>:" \ -d mode=partial \ -d original_transaction=tax_1NVcKqBUZ691iUZ4xMZtcGYt \ -d reference=order_234567890-refund_1 \ -d flat_amount=-1650 \ -d "metadata[refund]={{REFUND_ID}}" \ --data-urlencode "metadata[refund_reason]=Refunded 16.50 USD of order_234567890 (customer was unhappy)" \ -d "expand[]=line_items" ``` La transaction d’annulation partielle ainsi créée est alors renvoyée : ```json { "id": "tax_1NVcQYBUZ691iUZ4SBPukGa6", "object": "tax.transaction", "created": 1689780994, "currency": "usd", ... "line_items": { "object": "list", "data": [ { "id": "tax_li_OICqymcWjlbevq", "object": "tax.transaction_line_item", "amount": -500, "amount_tax": -50, "livemode": false, "metadata": {}, "product": null, "quantity": 1, "reference": "refund_li_1", "reversal": { "original_line_item": "tax_li_OICmRXkFuWr8Df" }, "tax_behavior": "exclusive", "tax_code": "txcd_10103000", "type": "reversal" }, { "id": "tax_li_OICq2H1qHjwyzX", "object": "tax.transaction_line_item", "amount": -1000, "amount_tax": -100, "livemode": false, "metadata": {}, "product": null, "quantity": 1, "reference": "refund_li_2", "reversal": { "original_line_item": "tax_li_OICmxhnSJxF7rY" }, "tax_behavior": "exclusive", "tax_code": "txcd_10103000", "type": "reversal" } ], "has_more": false, "total_count": 2, "url": "/v1/tax/transactions/tax_1NVcQYBUZ691iUZ4SBPukGa6/line_items" }, "livemode": false, "metadata": { "refund": "{{REFUND_ID}}", "description": "Refunding order_234567890 (customer was unhappy)" }, "reference": "order_234567890-refund_1", "reversal": { "original_transaction": "tax_1NVcKqBUZ691iUZ4xMZtcGYt" }, "shipping_cost": null, "tax_date": 1670863654, "type": "reversal" } ``` Les montants remboursés et taxes correspondant à chaque poste de facture et frais de livraison de la transaction initiale sont calculés comme suit : 1. Tout d’abord, nous calculons le montant total remboursable sur la transaction. Puisque celle-ci n’avait fait l’objet d’aucun remboursement précédent, le montant total pouvant être remboursé est de 33,00 USD. 1. Ensuite, nous calculons le montant à rembourser pour chaque poste de facture, en fonction de la proportion que représente le montant remboursable de ce poste par rapport au montant total remboursable sur la transaction. Par exemple, le poste de 10 USD présente un montant remboursable de 11 USD, ce qui représente 33,33 % du montant total remboursable sur la transaction. Le montant à rembourser pour ce poste est donc de `-16.50 USD * 33.33% = -5.50 USD`. 1. Enfin, pour chaque poste, le montant total à rembourser est réparti entre les attributs `amount` et `amount_tax`. Cette opération s’effectue également au prorata du montant de taxe remboursable sur un poste par rapport au montant total remboursable. Si on reprend l’exemple du poste de 10 USD, la taxe (1,00 USD) représentant 9,09 % du total remboursable (11 USD), la valeur associée à l’attribut `amount_tax` est donc de `-5.50 USD * 9.09% = -0.50 USD`. Le montant forfaitaire est réparti en fonction du montant *left* to refund dans la transaction, et non du montant initialement enregistré. Par exemple, au lieu d’enregistrer un remboursement d’un montant forfaitaire de 16,50 USD, vous enregistrez d’abord une annulation partielle du montant total du poste de 10 USD : ```curl curl https://api.stripe.com/v1/tax/transactions/create_reversal \ -u "<>:" \ -d mode=partial \ -d original_transaction=tax_1NVcKqBUZ691iUZ4xMZtcGYt \ -d reference=order_234567890-refund_1 \ -d "line_items[0][original_line_item]=tax_li_OICmRXkFuWr8Df" \ -d "line_items[0][reference]=partial_refund_l1" \ -d "line_items[0][amount]=-1000" \ -d "line_items[0][amount_tax]=-100" \ -d "metadata[refund]={{REFUND_ID}}" \ --data-urlencode "metadata[refund_reason]=Refunded line 1 of order_234567890 (customer was unhappy)" \ -d "expand[0]=line_items" ``` Ensuite, vous enregistrez une annulation d’un montant fixe de 16,50 USD : ```curl curl https://api.stripe.com/v1/tax/transactions/create_reversal \ -u "<>:" \ -d mode=partial \ -d original_transaction=tax_1NVcKqBUZ691iUZ4xMZtcGYt \ -d reference=order_234567890-refund_2 \ -d flat_amount=-1650 \ -d "metadata[refund]={{REFUND_ID}}" \ --data-urlencode "metadata[refund_reason]=Refunded 16.50 USD of order_234567890 (customer was still unhappy)" \ -d "expand[]=line_items" ``` La transaction d’annulation partielle suivante est alors renvoyée : ```json { "id": "tax_1NVxFIBUZ691iUZ4saOIloxB", "object": "tax.transaction", "created": 1689861020, "currency": "usd", ... "line_items": { "object": "list", "data": [ { "id": "tax_li_OIYM8xd8BzrATd", "object": "tax.transaction_line_item", "amount": 0, "amount_tax": 0, "livemode": false, "metadata": {}, "product": null, "quantity": 1, "reference": "refund_li_1", "reversal": { "original_line_item": "tax_li_OICmRXkFuWr8Df" }, "tax_behavior": "exclusive", "tax_code": "txcd_10103000", "type": "reversal" }, { "id": "tax_li_OIYMNBH6s8oQj9", "object": "tax.transaction_line_item", "amount": -1500, "amount_tax": -150, "livemode": false, "metadata": {}, "product": null, "quantity": 1, "reference": "refund_li_2", "reversal": { "original_line_item": "tax_li_OICmxhnSJxF7rY" }, "tax_behavior": "exclusive", "tax_code": "txcd_10103000", "type": "reversal" } ], "has_more": false, "total_count": 2, "url": "/v1/tax/transactions/tax_1NVxFIBUZ691iUZ4saOIloxB/line_items" }, "livemode": false, "metadata": {}, "reference": "order_234567890-refund_2", "reversal": { "original_transaction": "tax_1NVcKqBUZ691iUZ4xMZtcGYt" }, "shipping_cost": null, "tax_date": 1670863654, "type": "reversal" } ``` Étant donné que le montant total restant à rembourser sur la transaction est désormais de 22,00 USD et que le poste de 10 USD est intégralement remboursé, les 16,50 USD sont entièrement imputés au poste de 20 USD, puis répartis, selon la logique de l’étape 3, entre attribut `amount = -15,00 USD` et attribut `amount_tax = -1,50 USD`. Pendant ce temps, le poste de 10 USD de la transaction enregistre un remboursement de 0 USD. ### Annuler un remboursement partiel Les transactions fiscales sont immuables, mais vous pouvez annuler un remboursement partiel en créant une [annulation intégrale](https://docs.stripe.com/api/tax/transactions/create_reversal.md#tax_transaction_create_reversal-mode). Vous pouvez être amené à le faire dans les cas suivants : - Le remboursement du paiement échoue et vous n’avez pas fourni le bien ou le service à votre client - La mauvaise commande ou les mauvais montants sont remboursés - La vente initiale est intégralement remboursée et les remboursements partiels ne sont plus valides Dans l’exemple ci-dessous, `tax_1MEFACI6rIcR421eHrjXCSmD` est la transaction qui représente le remboursement partiel : ```curl curl https://api.stripe.com/v1/tax/transactions/create_reversal \ -u "<>:" \ -d mode=full \ -d original_transaction=tax_1MEFACI6rIcR421eHrjXCSmD \ -d reference=order_123456789-refund_1-cancel \ -d "metadata[refund_reason]=User called to cancel because they selected the wrong item" \ -d "expand[]=line_items" ``` La transaction d’annulation intégrale ainsi créée est alors renvoyée : ```json { "id": "tax_1MEFADI6rIcR421e94fNTOCK", "object": "tax.transaction", "created": 1670863657, "currency": "eur", ... "line_items": { "object": "list", "data": [ { "id": "tax_li_MyBXMOlwenCyFB", "object": "tax.transaction_line_item", "amount": 4999, "amount_tax": 1150, "livemode": false, "metadata": { }, "quantity": 1, "reference": "L1", "reversal": { "original_line_item": "tax_li_MyBXC98AhtaR37" }, "tax_behavior": "exclusive", "tax_code": "txcd_10000000", "type": "reversal" } ], "has_more": false, "total_count": 1, "url": "/v1/tax/transactions/tax_1MEFADI6rIcR421e94fNTOCK/line_items" }, "livemode": false, "metadata": { "refund_reason": "User called to cancel because they picked the wrong item" }, "reference": "order_123456789-refund_1-cancel", "reversal": { "original_transaction": "tax_1MEFACI6rIcR421eHrjXCSmD" }, "shipping_cost": null, "tax_date": 1670863654, "type": "reversal" } ``` ## Tests Utilisez les *environnements de test* (A sandbox is an isolated test environment that allows you to test Stripe functionality in your account without affecting your live integration. Use sandboxes to safely experiment with new features and changes) dont la structure de réponse est identique à celle du mode production, pour vérifier que votre intégration fonctionne correctement avant de la mise en production. > Dans les environnements de test, les calculs ne garantissent pas des résultats de taxation à jour. Vous êtes limité à 1 000 calculs de taxes par jour. Si vous avez besoin d’une limite plus élevée, contactez le [service d’assistance Stripe](https://support.stripe.com/contact). Pour obtenir des conseils sur les tests automatisés et les stratégies permettant d’éviter les limites d’appels dans les environnements de test, consultez la section [Tests automatisés](https://docs.stripe.com/automated-testing.md). ## Afficher les transactions fiscales Vous pouvez afficher toutes les transactions comportant des taxes de votre compte sur la page [Transactions avec taxe](https://dashboard.stripe.com/test/tax/transactions) du Dashboard. Cliquez sur une transaction donnée pour afficher le détail des taxes calculées par territoire fiscal et par produit inclus dans la transaction. > La page Transactions fiscales n’inclut que les *transactions* et non les *calculations*. Si vous vous attendez à voir un calcul et que vous ne le trouvez pas sur cette page, vérifiez que vous avez bien [créé une transaction fiscale](https://docs.stripe.com/tax/off-stripe.md#tax-transaction) à partir du calcul. Pour les options avancées telles que les frais de livraison, la tarification TTC, l’estimation de l’adresse IP et bien plus encore, consultez la [documentation de l’API Tax autonome](https://docs.stripe.com/tax/standalone-tax-api.md). ## See also - [API Tax Standalone](https://docs.stripe.com/tax/standalone-tax-api.md) - [API Stripe Tax, simplifiée](https://docs.stripe.com/tax/payment-intent/simplified.md) - [API Stripe Tax, personnalisée](https://docs.stripe.com/tax/payment-intent/custom.md) - [Tester votre intégration fiscale](https://docs.stripe.com/tax/testing.md) - [Rapports et déclarations](https://docs.stripe.com/tax/reports.md)