Créer une note de frais kilométriques
Attention, les notes de frais kilométriques sont associées à 2 comptes comptables
- le 6251 "Voyages et déplacements" (voir "Créer un compte comptable")
- celui du salarié/dirigeant (voir "Créer un compte comptable d'employé")
Etape 1 : créer une purchase en précisant que c'est une note de frais avec is_expense_report = true
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer <token>");
myHeaders.append("Content-Type", "application/json");
let myPurchaseExpenseReport= null; // Ma note de frais kilométriques
var raw = JSON.stringify({
is_expense_report: true, // bool | 1
billed_at: varDateOfTravel //string ISO date 2026-07-22T10:00:00.000Z
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://api.sinao.app/v1/apps/:appId/purchases", requestOptions)
.then(response => response.text())
.then(result => myPurchaseExpenseReport = result) // myPurchaseExpenseReport.id != null maintenant
.catch(error => console.log('error', error));Etape 2 : créer une milleage_allowance associée à cette purchase
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer <token>");
myHeaders.append("Content-Type", "application/json");
var raw = JSON.stringify({
{
start_address: start_address, //string Lyon, France
arrived_address: varArrivedAddress, // string Paris, France
kilometers_count: parseInt(varKilometersCount), // int 429
fiscal_power: parseInt(varFiscalPower), // int from 3 to 7
vehicle_type: varVehicleType, // string "car" | "electric_car" | "motorcycle"
round_trip: 1 // int si aller/retour : 1, si aller simple ou retour simple : 0
}
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://api.sinao.app/v1/apps/:appId/purchases/mileage_allowances/create", requestOptions)
.then(response => response.text())
.then(result => myPurchaseExpenseReport.mileage_allowance = result)
.catch(error => console.log('error', error));Etape 3 : Mise à jour des données / enrichissement des données de la nouvelle purchase, il faut lui préciser une purchase_lines afin de lui adjoindre le compte comptable de l'employé.
Vous devez préalablement créer un compte comptable d'employé par salarié ou dirigeant
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer <token>");
myHeaders.append("Content-Type", "application/json");
var _6251Account = null;
var employeesAccounts = [];
// get _6251Account Accounts
fetch("https://api.sinao.app/v1/apps/:appId/accounts?filters[0][name]=technical_name&filters[0][comparator]==&filters[0][value]=EmployeesPurchasing->MileageAllowance&limit=1", {
method: 'GET',
headers: myHeaders
},)
.then(result => _6251Account = result.data[0]);
// get employees accounts
fetch("https://api.sinao.app/v1/apps/:appId/accounts/employees?order[0][name]=fiscal_power&order[0][direction]=desc&expand[0]=account", {
method: 'GET',
headers: myHeaders
},)
.then(result => employeesAccounts = result.data);
// for exemple we select the first employee account
const firstEmployeeAccount = employeesAccounts[0]
// now we can create the mileage allowance
var raw = JSON.stringify({
{
amount: (varAmountWitTaxes)) * 100), // integer 99,99 => 9999
amount_tax: 0,
currency: varCurrency, // string code ISO EUR USD GBP
title: varTitle, // string "rendez vous client"
comment: varDescription, // string additionnal text detail
author_user_id: varConnectedUserId, // int user.id (connected user)
employee_id: firstEmployeeAccount.id, // int
employee_name: firstEmployeeAccount.user_name ?? null, // string | null
tags: varTags, // nullable string of tags comma separated
purchase_lines: [{
amount: (varAmountWitTaxes)) * 100), // integer 99,99 => 9999,
account_id: _6251Account.id.toString(), // string id of the employee account
name: _6251Account.name,
}],
vat_repayment: "payment", // voir ci-dessous
billed_at: date, //string ISO date 2026-07-22T10:00:00.000Z
mileage_allowance_id: myPurchaseExpenseReport.mileage_allowance.id,
}
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://api.sinao.app/v1/apps/:appId/purchases/mileage_allowances/create", requestOptions)
.then(response => response.text())
.then(result => myPurchaseExpenseReport.mileage_allowance = result)
.catch(error => console.log('error', error));Explication de vat_repayment = "payment" vs vat_repayment = "billing"
vat_repayment = "payment" vs vat_repayment = "billing"vat_repayment: "payment" → achat d'un service : la TVA est reversée à la date de paiement de la facture
vat_repayment: "billing" → achat d'un produit : la TVA est reversée à la date de facturation
C'est une règle fiscale française : la TVA sur les prestations de services est exigible à l'encaissement (paiement), tandis que la TVA sur les biens/produits est exigible à la livraison (facturation).
Pour les indemnités kilométriques, il n'y a pas de TVA (amount_tax: 0), mais le champ est quand même positionné sur "payment" car c'est traité comme une prestation/service.
Si besoin, vous pouvez modifier l'indemnité kilométrique
En précisant son id :mileageAllowancesId
var myHeaders = new Headers();
myHeaders.append("Authorization", "Bearer <token>");
myHeaders.append("Content-Type", "application/json");
let myPurchaseExpenseReport= null; // Ma note de frais kilométriques
var raw = JSON.stringify({
{
start_address: start_address, //string Lyon, France
arrived_address: varArrivedAddress, // string Paris, France
kilometers_count: parseInt(varKilometersCount), // int 429
fiscal_power: parseInt(varFiscalPower), // int from 3 to 7
vehicle_type: varVehicleType, // string "car" | "electric_car" | "motorcycle"
round_trip: 1 // int si aller/retour : 1, si aller simple ou retour simple : 0
}
});
var requestOptions = {
method: 'POST',
headers: myHeaders,
body: raw,
redirect: 'follow'
};
fetch("https://api.sinao.app/v1/apps/:appId/purchases/mileage_allowances/:mileageAllowancesId", requestOptions)
.then(response => response.text())
.catch(error => console.log('error', error));Updated about 9 hours ago
