{
  "description": "Prüffälle des Ganzzahl-Rechenkerns (calculateInvoice). Von Hand gerechnet, nicht erzeugt: npm, Server, Dart-Zwilling und Panel müssen jeden Fall genau treffen. Preise in Millionstel Euro, Mengen in Tausendstel, Rabatt und Satz in Hundertstel-Prozent, Beträge in Cent.",
  "rule": {
    "line": "Preis × Menge × (10000 − Rabatt) ÷ 10^11 Cent, exakt als Bruch",
    "net": "Netto = rund(Σ Zeilen); USt = rund(Σ Zeilen × Satz ÷ 10000); Brutto = Netto + USt",
    "gross": "Brutto B = rund(Σ Zeilen); Netto = rund(B × 10000 ÷ (10000 + Satz)); USt = B − Netto",
    "taxExempt": "smallBusiness, reverseCharge, intraCommunitySupply, exportThirdCountry, domesticReverseCharge, outsideScope: jede Zeile zu 0 %",
    "rounding": "kaufmännisch, halbe Einheit vom Nullpunkt weg, auf dem Bruch",
    "lines": "Startwert kaufmännisch gerundet, Rest nach exaktem Abstand, bei Gleichstand an die frühere Zeile; eine Zeile über 0 bekommt nie einen Cent"
  },
  "cases": [
    {
      "name": "Shop: 14,79 € + 15,00 € brutto zu 20 % bleiben 29,79 €",
      "priceMode": "gross",
      "items": [
        { "unitPriceMicros": 14790000, "quantityMilli": 1000, "vatRateBp": 2000 },
        { "unitPriceMicros": 15000000, "quantityMilli": 1000, "vatRateBp": 2000 }
      ],
      "expected": {
        "netCents": 2483,
        "vatCents": 496,
        "grossCents": 2979,
        "byRate": [{ "rateBp": 2000, "netCents": 2483, "vatCents": 496, "grossCents": 2979 }],
        "lines": [
          { "netCents": 1233, "grossCents": 1479, "rateBp": 2000 },
          { "netCents": 1250, "grossCents": 1500, "rateBp": 2000 }
        ]
      }
    },
    {
      "name": "Halber Cent: 21,35 € netto zu 10 % ergibt 2,14 € USt",
      "priceMode": "net",
      "items": [{ "unitPriceMicros": 21350000, "quantityMilli": 1000, "vatRateBp": 1000 }],
      "expected": {
        "netCents": 2135,
        "vatCents": 214,
        "grossCents": 2349,
        "byRate": [{ "rateBp": 1000, "netCents": 2135, "vatCents": 214, "grossCents": 2349 }],
        "lines": [{ "netCents": 2135, "grossCents": 2349, "rateBp": 1000 }]
      }
    },
    {
      "name": "Mikropreis: 0,000004 € × 3.500.000 sind 14,00 €",
      "priceMode": "net",
      "items": [{ "unitPriceMicros": 4, "quantityMilli": 3500000000, "vatRateBp": 2000 }],
      "expected": {
        "netCents": 1400,
        "vatCents": 280,
        "grossCents": 1680,
        "byRate": [{ "rateBp": 2000, "netCents": 1400, "vatCents": 280, "grossCents": 1680 }],
        "lines": [{ "netCents": 1400, "grossCents": 1680, "rateBp": 2000 }]
      }
    },
    {
      "name": "Halber Cent: 550,17 € × 1,5 netto zu 13 % ergibt 825,26 € netto (825,255 € rundet auf)",
      "priceMode": "net",
      "items": [{ "unitPriceMicros": 550170000, "quantityMilli": 1500, "vatRateBp": 1300 }],
      "expected": {
        "netCents": 82526,
        "vatCents": 10728,
        "grossCents": 93254,
        "byRate": [{ "rateBp": 1300, "netCents": 82526, "vatCents": 10728, "grossCents": 93254 }],
        "lines": [{ "netCents": 82526, "grossCents": 93254, "rateBp": 1300 }]
      }
    },
    {
      "name": "Gebrochene Menge: 66,30 € × 35,05 netto zu 20 % ergibt 2.323,82 € netto (2.323,815 € rundet auf)",
      "priceMode": "net",
      "items": [{ "unitPriceMicros": 66300000, "quantityMilli": 35050, "vatRateBp": 2000 }],
      "expected": {
        "netCents": 232382,
        "vatCents": 46476,
        "grossCents": 278858,
        "byRate": [{ "rateBp": 2000, "netCents": 232382, "vatCents": 46476, "grossCents": 278858 }],
        "lines": [{ "netCents": 232382, "grossCents": 278858, "rateBp": 2000 }]
      }
    },
    {
      "name": "Großer Betrag: 42.735,95 € × 73 netto zu 10 % ergibt 31.197.244 Cent USt (311.972,435 € rundet auf)",
      "priceMode": "net",
      "items": [{ "unitPriceMicros": 42735950000, "quantityMilli": 73000, "vatRateBp": 1000 }],
      "expected": {
        "netCents": 311972435,
        "vatCents": 31197244,
        "grossCents": 343169679,
        "byRate": [{ "rateBp": 1000, "netCents": 311972435, "vatCents": 31197244, "grossCents": 343169679 }],
        "lines": [{ "netCents": 311972435, "grossCents": 343169679, "rateBp": 1000 }]
      }
    },
    {
      "name": "Sehr großer Betrag: 3.206,08 € × 188.289,923 − 41,96 % netto zu 0 % bleiben 35.037.155.169 Cent (Rest 0,499994 Cent, knapp unter der halben Einheit, rundet ab)",
      "priceMode": "net",
      "items": [{ "unitPriceMicros": 3206080000, "quantityMilli": 188289923, "discountBp": 4196, "vatRateBp": 0 }],
      "expected": {
        "netCents": 35037155169,
        "vatCents": 0,
        "grossCents": 35037155169,
        "byRate": [{ "rateBp": 0, "netCents": 35037155169, "vatCents": 0, "grossCents": 35037155169 }],
        "lines": [{ "netCents": 35037155169, "grossCents": 35037155169, "rateBp": 0 }]
      }
    },
    {
      "name": "Rabatt: 15,45 € × 5 − 6 % netto zu 0 % ergibt 72,62 €",
      "priceMode": "net",
      "items": [{ "unitPriceMicros": 15450000, "quantityMilli": 5000, "discountBp": 600, "vatRateBp": 0 }],
      "expected": {
        "netCents": 7262,
        "vatCents": 0,
        "grossCents": 7262,
        "byRate": [{ "rateBp": 0, "netCents": 7262, "vatCents": 0, "grossCents": 7262 }],
        "lines": [{ "netCents": 7262, "grossCents": 7262, "rateBp": 0 }]
      }
    },
    {
      "name": "Gleichstand in der Verteilung: 2,81 € × 2,977 + 0,81 € × 2,377 netto zu 20 % — beide Zeilen verlieren beim Runden gleich viel (0,537 Cent), die frühere verliert den Cent",
      "priceMode": "net",
      "items": [
        { "unitPriceMicros": 2810000, "quantityMilli": 2977, "vatRateBp": 2000 },
        { "unitPriceMicros": 810000, "quantityMilli": 2377, "vatRateBp": 2000 }
      ],
      "expected": {
        "netCents": 1029,
        "vatCents": 206,
        "grossCents": 1235,
        "byRate": [{ "rateBp": 2000, "netCents": 1029, "vatCents": 206, "grossCents": 1235 }],
        "lines": [
          { "netCents": 836, "grossCents": 1004, "rateBp": 2000 },
          { "netCents": 193, "grossCents": 231, "rateBp": 2000 }
        ]
      }
    },
    {
      "name": "Verteilung unter einem Cent: 0,006 € + 0,006 € netto zu 0 % ergeben zusammen 0,01 €, verteilt auf 0 und 1",
      "priceMode": "net",
      "items": [
        { "unitPriceMicros": 6000, "quantityMilli": 1000, "vatRateBp": 0 },
        { "unitPriceMicros": 6000, "quantityMilli": 1000, "vatRateBp": 0 }
      ],
      "expected": {
        "netCents": 1,
        "vatCents": 0,
        "grossCents": 1,
        "byRate": [{ "rateBp": 0, "netCents": 1, "vatCents": 0, "grossCents": 1 }],
        "lines": [
          { "netCents": 0, "grossCents": 0, "rateBp": 0 },
          { "netCents": 1, "grossCents": 1, "rateBp": 0 }
        ]
      }
    },
    {
      "name": "Abzugszeile: 100,00 € minus 10,00 € netto zu 20 % ergeben 90,00 € netto und 18,00 € USt",
      "priceMode": "net",
      "items": [
        { "unitPriceMicros": 100000000, "quantityMilli": 1000, "vatRateBp": 2000 },
        { "unitPriceMicros": 10000000, "quantityMilli": -1000, "vatRateBp": 2000 }
      ],
      "expected": {
        "netCents": 9000,
        "vatCents": 1800,
        "grossCents": 10800,
        "byRate": [{ "rateBp": 2000, "netCents": 9000, "vatCents": 1800, "grossCents": 10800 }],
        "lines": [
          { "netCents": 10000, "grossCents": 12000, "rateBp": 2000 },
          { "netCents": -1000, "grossCents": -1200, "rateBp": 2000 }
        ]
      }
    },
    {
      "name": "Textzeile ohne Menge neben 5,00 € netto zu 20 % ändert nichts: netto bleibt 5,00 €, die Textzeile bleibt 0",
      "priceMode": "net",
      "items": [
        { "unitPriceMicros": 0, "quantityMilli": 0, "vatRateBp": 2000 },
        { "unitPriceMicros": 5000000, "quantityMilli": 1000, "vatRateBp": 2000 }
      ],
      "expected": {
        "netCents": 500,
        "vatCents": 100,
        "grossCents": 600,
        "byRate": [{ "rateBp": 2000, "netCents": 500, "vatCents": 100, "grossCents": 600 }],
        "lines": [
          { "netCents": 0, "grossCents": 0, "rateBp": 2000 },
          { "netCents": 500, "grossCents": 600, "rateBp": 2000 }
        ]
      }
    },
    {
      "name": "Nullzeile bekommt nie einen Cent: 99,99 € × 3 mit 100 % Rabatt netto zu 20 % bleibt bei 0,00 €",
      "priceMode": "net",
      "items": [{ "unitPriceMicros": 99990000, "quantityMilli": 3000, "discountBp": 10000, "vatRateBp": 2000 }],
      "expected": {
        "netCents": 0,
        "vatCents": 0,
        "grossCents": 0,
        "byRate": [{ "rateBp": 2000, "netCents": 0, "vatCents": 0, "grossCents": 0 }],
        "lines": [{ "netCents": 0, "grossCents": 0, "rateBp": 2000 }]
      }
    },
    {
      "name": "Reihenfolge von byRate: 10,00 € je zu 20 %, 10 % und 4,9 % netto stehen absteigend, USt 2,00 € + 1,00 € + 0,49 €",
      "priceMode": "net",
      "items": [
        { "unitPriceMicros": 10000000, "quantityMilli": 1000, "vatRateBp": 2000 },
        { "unitPriceMicros": 10000000, "quantityMilli": 1000, "vatRateBp": 1000 },
        { "unitPriceMicros": 10000000, "quantityMilli": 1000, "vatRateBp": 490 }
      ],
      "expected": {
        "netCents": 3000,
        "vatCents": 349,
        "grossCents": 3349,
        "byRate": [
          { "rateBp": 2000, "netCents": 1000, "vatCents": 200, "grossCents": 1200 },
          { "rateBp": 1000, "netCents": 1000, "vatCents": 100, "grossCents": 1100 },
          { "rateBp": 490, "netCents": 1000, "vatCents": 49, "grossCents": 1049 }
        ],
        "lines": [
          { "netCents": 1000, "grossCents": 1200, "rateBp": 2000 },
          { "netCents": 1000, "grossCents": 1100, "rateBp": 1000 },
          { "netCents": 1000, "grossCents": 1049, "rateBp": 490 }
        ]
      }
    },
    {
      "name": "Steuerfrei: 12,00 € brutto mit taxScheme smallBusiness bleiben 12,00 € netto ohne USt, der Preismodus zählt nicht",
      "priceMode": "gross",
      "taxScheme": "smallBusiness",
      "items": [{ "unitPriceMicros": 12000000, "quantityMilli": 1000, "vatRateBp": 2000 }],
      "expected": {
        "netCents": 1200,
        "vatCents": 0,
        "grossCents": 1200,
        "byRate": [{ "rateBp": 0, "netCents": 1200, "vatCents": 0, "grossCents": 1200 }],
        "lines": [{ "netCents": 1200, "grossCents": 1200, "rateBp": 0 }]
      }
    },
    {
      "name": "Shop-Rückmeldung: 0,03 € brutto zu 20 % bleiben 0,03 € brutto und netto (2,5 Cent rundet auf)",
      "priceMode": "gross",
      "items": [{ "unitPriceMicros": 30000, "quantityMilli": 1000, "vatRateBp": 2000 }],
      "expected": {
        "netCents": 3,
        "vatCents": 0,
        "grossCents": 3,
        "byRate": [{ "rateBp": 2000, "netCents": 3, "vatCents": 0, "grossCents": 3 }],
        "lines": [{ "netCents": 3, "grossCents": 3, "rateBp": 2000 }]
      }
    },
    {
      "name": "Höchstwert: 999.999.999,99 € netto zu 0 % gehen gerade noch bis an die Obergrenze",
      "priceMode": "net",
      "items": [{ "unitPriceMicros": 999999999990, "quantityMilli": 1000000, "vatRateBp": 0 }],
      "expected": {
        "netCents": 99999999999,
        "vatCents": 0,
        "grossCents": 99999999999,
        "byRate": [{ "rateBp": 0, "netCents": 99999999999, "vatCents": 0, "grossCents": 99999999999 }],
        "lines": [{ "netCents": 99999999999, "grossCents": 99999999999, "rateBp": 0 }]
      }
    },
    {
      "name": "Brutto mit gebrochener Menge: 1,01 € × 1,5 brutto zu 20 % ergeben 1,52 € brutto (151,5 Cent rundet auf)",
      "priceMode": "gross",
      "items": [{ "unitPriceMicros": 1010000, "quantityMilli": 1500, "vatRateBp": 2000 }],
      "expected": {
        "netCents": 127,
        "vatCents": 25,
        "grossCents": 152,
        "byRate": [{ "rateBp": 2000, "netCents": 127, "vatCents": 25, "grossCents": 152 }],
        "lines": [{ "netCents": 127, "grossCents": 152, "rateBp": 2000 }]
      }
    },
    {
      "name": "Nullzeile bekommt keinen Rundungscent: 0,00 € und 2,5 Cent netto zu 20 %",
      "priceMode": "net",
      "items": [
        { "unitPriceMicros": 0, "quantityMilli": 1000, "vatRateBp": 2000 },
        { "unitPriceMicros": 25000, "quantityMilli": 1000, "vatRateBp": 2000 }
      ],
      "expected": {
        "netCents": 3,
        "vatCents": 1,
        "grossCents": 4,
        "byRate": [{ "rateBp": 2000, "netCents": 3, "vatCents": 1, "grossCents": 4 }],
        "lines": [
          { "netCents": 0, "grossCents": 0, "rateBp": 2000 },
          { "netCents": 3, "grossCents": 4, "rateBp": 2000 }
        ]
      }
    },
    {
      "name": "Rabatt auf Schüttgut: 0,149999 € × 50.000 − 10 % netto zu 20 % ergibt 6.749,96 € netto (der rabattierte Einzelpreis ist kein ganzer Cent mehr — wer vor der Multiplikation ganzzahlig teilt, landet bei 674.995 statt 674.996)",
      "priceMode": "net",
      "items": [
        { "unitPriceMicros": 149999, "quantityMilli": 50000000, "discountBp": 1000, "vatRateBp": 2000 }
      ],
      "expected": {
        "netCents": 674996,
        "vatCents": 134999,
        "grossCents": 809995,
        "byRate": [{ "rateBp": 2000, "netCents": 674996, "vatCents": 134999, "grossCents": 809995 }],
        "lines": [{ "netCents": 674996, "grossCents": 809995, "rateBp": 2000 }]
      }
    }
  ]
}
