Business Cases
The API is a generic interface that can be used for all countries. If there are additional country-specific requirements, these are described in the country-specific guides. The generic interface is available from EFR version 2.5.0. The changes to the interface are backwards compatible.
This collection of business cases, comprises of all transactional business cases that need to be implemented and tested with the EFR to comply with fiscalization requirements throughout Europe. Some business cases may not apply to your business. The current applicable countries to the business case is visible via the country flag beneath the business case title. If no flags are beneath the business case title, then this applies to all countries. By implementing all of these business cases and their variants, your system will be fiscalization ready in all of the current and future country solutions from efsta. efsta recommends that all business cases, if applicable, be implemented and sent to the EFR for every country, so that your system is future-proof when some countries expand their fiscalization requirements. This will prevent your development team from having to expand or re-develop to the EFR in the future.
If your business has any additional business cases that are not included on this list or if you have any comments or questions, please contact us at: ticket@efsta.eu
Sale of Items
The EFR service calculates the tax amounts automatically, if they are not sent. However, we recommend that the POS sends the tax groups with every fiscal receipt. For a detailed explanation of tax assignment, see Tax Group Assignment. For simplicity, the taxes are only given in one example and omitted from all other business cases.
With TaxA
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="1" T="8.38" Opr="101" OprN="Mario Rossi" OprTIN="xxx" TP="Table 1">
<PosA>
<Pos PN="1" IN="1001" SKU="456487" Dsc="Example Item" TaxG="A" Amt="3.98" Qty="2" QtyU="Pc." Pri="1.99" Cat="10" CatN="Example Category 10" />
<Pos PN="2" IN="1020" SKU="654854" Dsc="Example Item" TaxG="B" Amt="1.50" Cat="11" CatN="Example Category 11" />
<Lin Dsc="Subtotal" LAmt="5.48" />
<Pos PN="3" IN="1030" SKU="845868" Dsc="Example Item" TaxG="A" Amt="2.90" Cat="12" CatN="Example Category 12" />
</PosA>
<PayA>
<Pay Dsc="Example Payment" PayG="cash" Amt="10.00" />
<Pay Dsc="Example Change" PayG="change" Amt="-1.62" />
</PayA>
<TaxA>
<Tax TaxG="A" Prc="19" Net="5.78" TAmt="1.10" Amt="6.88"/>
<Tax TaxG="B" Prc="7" Net="1.40" TAmt="0.10" Amt="1.50"/>
</TaxA>
</ESR>
</Tra>
{
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "1",
"T": "8.38",
"Opr": "101",
"OprN": "Mario Rossi",
"OprTIN": "xxx",
"TP": "Table 1",
"PosA": [
{
"_": "Pos",
"PN": "1",
"IN": "1001",
"SKU": "456487",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "3.98",
"Qty": "2",
"QtyU": "Pc.",
"Pri": "1.99",
"Cat": "10",
"CatN": "Example Category 10"
},
{
"_": "Pos",
"PN": "2",
"IN": "1020",
"SKU": "654854",
"Dsc": "Example Item",
"TaxG": "B",
"Amt": "1.50",
"Cat": "11",
"CatN": "Example Category 11"
},
{
"_": "Lin",
"Dsc": "Subtotal",
"LAmt": "5.48"
},
{
"_": "Pos",
"PN": "3",
"IN": "1030",
"SKU": "845868",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "2.90",
"Cat": "12",
"CatN": "Example Category 12"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Example Payment",
"PayG": "cash",
"Amt": "10.00"
},
{
"_": "Pay",
"Dsc": "Example Change",
"PayG": "change",
"Amt": "-1.62"
}
],
"TaxA": [
{
"_": "Tax",
"TaxG": "A",
"Prc": "19",
"Net": "5.78",
"TAmt": "1.10",
"Amt": "6.88"
},
{
"_": "Tax",
"TaxG": "B",
"Prc": "7",
"Net": "1.40",
"TAmt": "0.10",
"Amt": "1.50"
}
]
}
}
Without TaxA
If the tax array is omitted, the EFR service calculates the tax amounts automatically.
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="1" T="8.38" Opr="101" OprN="Mario Rossi" OprTIN="xxx" TP="Table 1">
<PosA>
<Pos PN="1" IN="1001" Dsc="Example Item" TaxG="A" Amt="3.98" Qty="2" QtyU="Pc." Pri="1.99" Cat="10" CatN="Example Category 10" />
<Pos PN="2" IN="1020" Dsc="Example Item" TaxG="B" Amt="1.50" Cat="11" CatN="Example Category 11" />
<Lin Dsc="Subtotal" LAmt="5.48" />
<Pos PN="3" IN="1030" Dsc="Example Item" TaxG="A" Amt="2.90" Cat="12" CatN="Example Category 12" />
</PosA>
<PayA>
<Pay Dsc="Example Payment" PayG="cash" Amt="10.00" />
<Pay Dsc="Example Change" PayG="change" Amt="-1.62" />
</PayA>
</ESR>
</Tra>
{
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "1",
"T": "8.38",
"Opr": "101",
"OprN": "Mario Rossi",
"OprTIN": "xxx",
"TP": "Table 1",
"PosA": [
{
"_": "Pos",
"PN": "1",
"IN": "1001",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "3.98",
"Qty": "2",
"QtyU": "Pc.",
"Pri": "1.99",
"Cat": "10",
"CatN": "Example Category 10"
},
{
"_": "Pos",
"PN": "2",
"IN": "1020",
"Dsc": "Example Item",
"TaxG": "B",
"Amt": "1.50",
"Cat": "11",
"CatN": "Example Category 11"
},
{
"_": "Lin",
"Dsc": "Subtotal",
"LAmt": "5.48"
},
{
"_": "Pos",
"PN": "3",
"IN": "1030",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "2.90",
"Cat": "12",
"CatN": "Example Category 12"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Example Payment",
"PayG": "cash",
"Amt": "10.00"
},
{
"_": "Pay",
"Dsc": "Example Change",
"PayG": "change",
"Amt": "-1.62"
}
]
}
}
Country Specific Properties
Properties | Description | Countries | Mandatory |
---|---|---|---|
Pos.SKU | Stock Keeping Unit/article number | [DE] | If available in POS data |
Pos.Cat, Pos.CatN | Category, Category name | [BE] [DE] [DK] [NO] [SE] | If available in POS data |
ESR.OprN | Operator Name | [BE] [DE] [DK] [NO] [PL] [PT] [SE] | If available in POS data |
ESR.TP | Transaction point | [DE] | If the transactions can be assigned to different areas (e.g. table number) |
ESR.OprTIN | Operator Tax Number | [HR] [SI] | Yes |
ESR.OprSSN | Operator Social Security Number | [BE] | Yes |
ESR.TID | TSE Transaction ID | [DE] | See Start Transaction |
Sale of Services
A sale of a service is sent as a position and is marked with an attribute PTY="Svc
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="2" T="34.90" Opr="101" OprN="Mario Rossi" OprTIN="xxx" TP="Table 1">
<PosA>
<Pos PTY="Svc" PN="1" IN="1030" Dsc="Example Service" TaxG="A" Amt="34.90" />
</PosA>
<PayA>
<Pay Dsc="Example Payment" PayG="cash" Amt="40.00" />
<Pay Dsc="Example Change" PayG="change" Amt="-5.10" />
</PayA>
</ESR>
</Tra>
{
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "2",
"T": "34.90",
"Opr": "101",
"OprN": "Mario Rossi",
"OprTIN": "xxx",
"TP": "Table 1",
"PosA": [
{
"_": "Pos",
"PTY": "Svc",
"PN": "1",
"IN": "1030",
"Dsc": "Example Service",
"TaxG": "A",
"Amt": "34.90"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Example Payment",
"PayG": "cash",
"Amt": "40.00"
},
{
"_": "Pay",
"Dsc": "Example Change",
"PayG": "change",
"Amt": "-5.10"
}
]
}
}
Discount
- Discounts are sent as a modifier element
Mod
with a negative amountMod.Amt
. - Discounts must indicate which position numbers
Mod.PN
they refer to. Position number*
means that the discount refers to all previous positions.
Example
- XML
- JSON
<Tra>
<ESR D="2024-06-01T08:30:15" TL="001" TT="1" TN="3" T="6.88" Opr="101" OprN="Mario Rossi" OprTIN="xxx" TP="Table 1">
<PosA>
<Pos PN="1" IN="1001" Dsc="Example Item" TaxG="A" Amt="3.98" Qty="2" QtyU="Pc." Pri="1.99" Cat="10" CatN="Example Category 10" />
<Mod PN="1" Dsc="Example line discount" Amt="-0.50" />
<Pos PN="2" IN="1020" Dsc="Example Item" TaxG="B" Amt="1.50" Cat="11" CatN="Example Category 11" />
<Pos PN="3" IN="1030" Dsc="Example Item" TaxG="A" Amt="2.90" Cat="12" CatN="Example Category 12" />
<Mod PN="*" Dsc="Example receipt discount" Amt="-1.00" />
</PosA>
<PayA>
<Pay Dsc="Example Payment" PayG="cash" Amt="10.00" />
<Pay Dsc="Example Change" PayG="change" Amt="-3.12" />
</PayA>
</ESR>
</Tra>
{
"ESR": {
"D": "2024-06-01T08:30:15",
"TL": "001",
"TT": "1",
"TN": "3",
"T": "6.88",
"Opr": "101",
"OprN": "Mario Rossi",
"OprTIN": "xxx",
"TP": "Table 1",
"PosA": [
{
"_": "Pos",
"PN": "1",
"IN": "1001",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "3.98",
"Qty": "2",
"QtyU": "Pc.",
"Pri": "1.99",
"Cat": "10",
"CatN": "Example Category 10"
},
{
"_": "Mod",
"PN": "1",
"Dsc": "Example line discount",
"Amt": "-0.50"
},
{
"_": "Pos",
"PN": "2",
"IN": "1020",
"Dsc": "Example Item",
"TaxG": "B",
"Amt": "1.50",
"Cat": "11",
"CatN": "Example Category 11"
},
{
"_": "Pos",
"PN": "3",
"IN": "1030",
"Dsc": "Example Item",
"TaxG": "A",
"Amt": "2.90",
"Cat": "12",
"CatN": "Example Category 12"
},
{
"_": "Mod",
"PN": "*",
"Dsc": "Example receipt discount",
"Amt": "-1.00"
}
],
"PayA": [
{
"_": "Pay",
"Dsc": "Example Payment",
"PayG": "cash",
"Amt": "10.00"
},
{
"_": "Pay",
"Dsc": "Example Change",
"PayG": "change",
"Amt": "-3.12"
}
]
}
}