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" → 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));