feat: Gebiete mit Zollpflicht vom Versand ausgenommen
Docker Image bauen und veroeffentlichen / build-and-push (push) Successful in 2m7s
Docker Image bauen und veroeffentlichen / build-and-push (push) Successful in 2m7s
Vorgabe war: nur dorthin liefern, wo keine Zollabwicklung noetig ist. Die
EU-Einstellung erfuellt das auf Laenderebene — die Union ist eine
Zollunion, eine Sendung von Deutschland nach Frankreich braucht keine
Zollanmeldung. Der Laendercode allein genuegt aber nicht.
Einige Gebiete gehoeren zu einem EU-Mitgliedstaat, liegen aber ausserhalb
des Zoll- und/oder Steuergebiets der Union. Dorthin ist jede Sendung eine
Ausfuhr mit Zollinhaltserklaerung, Handelsrechnung und moeglichen
Einfuhrabgaben beim Empfaenger. Zwei davon liegen in DEUTSCHLAND:
Helgoland (27498) und Büsingen am Hochrhein (78266)
Sie waren also selbst bei der Einstellung "Nur Deutschland" betroffen.
Dazu kommen Kanarische Inseln, Ceuta, Melilla, die franzoesischen
Ueberseegebiete, Livigno, Campione d'Italia, Åland und der Berg Athos.
Erkennbar sind sie nur an der Postleitzahl. findCustomsExcludedArea
prueft sie je Land, denn dieselbe Ziffernfolge bedeutet anderswo etwas
anderes: "22" ist in Finnland Åland, in Italien die Provinz Como. Die
Checkout-Route weist solche Anschriften mit einer Meldung ab, die das
Gebiet benennt und auf die Abholung verweist.
Azoren und Madeira sind bewusst NICHT ausgenommen: sie gehoeren voll zum
Zoll- und Steuergebiet, dorthin gilt der normale Binnenversand. Ein Test
haelt das fest, damit sie nicht versehentlich mitgesperrt werden.
Die Hinweistexte auf "Versand und Zahlung" nennen die Ausnahmen jetzt
ausdruecklich — in beiden Einstellungen und beiden Sprachen.
8 neue Tests in shipping-region.test.ts, 1 in der Checkout-Route
("weist Helgoland ab, obwohl es in Deutschland liegt").
tsc: 0 Fehler. vitest: 359/359 gruen (zuvor 350). eslint: 0 Warnungen.
Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
1 parent
6d7a77c8dd
commit
1bdf4df04a
6 files changed
+165
-5
No files matched your search
@@ -213,6 +213,19 @@ describe("Checkout-Route", () => {
|
||||
expect(db.order.create).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
test("weist Helgoland ab, obwohl es in Deutschland liegt", async () => {
|
||||
// Helgoland liegt ausserhalb des EU-Zollgebiets: dorthin ist jede
|
||||
// Sendung eine Ausfuhr mit Zollinhaltserklaerung. Der Laendercode allein
|
||||
// wuerde das durchgehen lassen.
|
||||
const response = await post({ ...validPayload, zip: "27498" });
|
||||
|
||||
expect(response.status).toBe(400);
|
||||
await expect(response.json()).resolves.toMatchObject({
|
||||
error: expect.stringContaining("Helgoland"),
|
||||
});
|
||||
expect(db.order.create).not.toHaveBeenCalled();
|
||||
});
|
||||
|
||||
test("bricht ab, wenn der Bestand waehrend des Checkouts nicht mehr reicht", async () => {
|
||||
// Das bedingte updateMany trifft keine Zeile mehr — jemand anders war
|
||||
// schneller.
|
||||
|
||||
@@ -10,7 +10,7 @@ import { rateLimit, getClientIp } from "@/lib/rate-limit";
|
||||
import { isTrustedOrigin } from "@/lib/csrf";
|
||||
import { verifyTurnstileToken } from "@/lib/turnstile";
|
||||
import { getShippingCostCents, getShippingRegion } from "@/lib/shipping";
|
||||
import { isCountryAllowed } from "@/lib/shipping-region";
|
||||
import { findCustomsExcludedArea, isCountryAllowed } from "@/lib/shipping-region";
|
||||
import { isDiscountCodeValid, calculateDiscountCents } from "@/lib/discount-calc";
|
||||
import { ensureBulkDiscountCode } from "@/lib/bulk-discount";
|
||||
import { releaseUnpaidOrder } from "@/lib/order-release";
|
||||
@@ -198,6 +198,22 @@ export async function POST(request: Request) {
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
|
||||
// Der Laendercode allein genuegt nicht: einige Gebiete gehoeren zu einem
|
||||
// EU-Mitgliedstaat, liegen aber ausserhalb des Zoll- und/oder
|
||||
// Steuergebiets der Union. Dorthin ist jede Sendung eine Ausfuhr mit
|
||||
// Zollinhaltserklaerung — zwei davon liegen in Deutschland (Helgoland und
|
||||
// Buesingen am Hochrhein), sind also selbst bei "Nur Deutschland"
|
||||
// betroffen. Erkennbar sind sie nur an der Postleitzahl.
|
||||
const excludedArea = findCustomsExcludedArea(input.country, input.zip);
|
||||
if (excludedArea) {
|
||||
return NextResponse.json(
|
||||
{
|
||||
error: `Nach ${excludedArea} können wir leider nicht versenden: dorthin ist jede Sendung zollpflichtig. Bitte gib eine andere Lieferadresse an oder wähle die Abholung.`,
|
||||
},
|
||||
{ status: 400 }
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
const productIds = input.items.map((item) => item.productId);
|
||||
|
||||
Reference in new issue
Block a user