> ## Documentation Index
> Fetch the complete documentation index at: https://docs.aftersell.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Cart-objekt

> Formen på Aftersell Cart SDK-kurven og dens linjer: hvert felt på kurven, kurvlinjer, bundles og selling plans.

Én objektform flyder gennem hele SDK'et. Det er, hvad [`getCart()`](/da/aftersell/cart/sdk-actions#getcart) returnerer, hvad [`cart_loaded` og `cart_updated`](/da/aftersell/cart/sdk-events) giver din handler, og hvad en [Custom code-blok](/da/aftersell/cart/custom-code-blocks) modtager.

<Note>
  **Alle beløb er i valutaens mindste enhed** (cents for USD), aldrig en formateret streng. `5779` er \$57,79. Brug [`formatMoney`](/da/aftersell/cart/sdk-actions#formatmoneycents) til at vise det.
</Note>

<div id="the-cart">
  ## Kurven
</div>

| Felt                   | Type                     | Beskrivelse                                                                                                                         |
| ---------------------- | ------------------------ | ----------------------------------------------------------------------------------------------------------------------------------- |
| `token`                | `string`                 | Shopify-kurvtokenet.                                                                                                                |
| `items`                | `AftersellCartLine[]`    | Varelinjerne. Se [kurvlinjer](#cart-lines).                                                                                         |
| `itemCount`            | `number`                 | Samlet vareantal, som kunden ser det.                                                                                               |
| `hasSubscriptionItems` | `boolean`                | `true` når mindst én linje i `items` har en selling plan, herunder tilkøbslinjer, som `itemCount` udelader. `false` på en tom kurv. |
| `totalPrice`           | `number`                 | Aktuel total, i cents.                                                                                                              |
| `originalTotalPrice`   | `number`                 | Total før rabatter, i cents.                                                                                                        |
| `totalDiscount`        | `number`                 | Rabattotal, i cents.                                                                                                                |
| `compareAtTotalPrice`  | `number \| null`         | Summen af hver linjes førpris (vejledende pris) × antal, i cents. `null` når utilgængelig, så fald tilbage på `originalTotalPrice`. |
| `currency`             | `string`                 | Valutakode.                                                                                                                         |
| `discountCodes`        | `string[]`               | Rabatkoder accepteret på kurven, sorteret. `[]` når ingen.                                                                          |
| `attributes`           | `Record<string, string>` | Kurvattributter. Skrivebeskyttet fra SDK'et.                                                                                        |

<Warning>
  **`itemCount` er ikke altid summen af `items`.** `items` afspejler den rigtige Shopify-kurv, herunder tilkøbslinjer, som draweren skjuler, såsom fragtbeskyttelse. `itemCount` er det kundevendte tal, der matcher kurv-badget. Til "hvor mange ting har kunden valgt" skal du bruge `itemCount`; til at iterere over de linjer, kurven renderer, skal du bruge `items`.

  To ting mangler helt i `items`: linjer skjult med [`setHidden`](/da/aftersell/cart/sdk-hooks#registerlinetransform), og [bundle-børn](#bundles), som flyttes over på deres anker. Begge tæller stadig med i kurvtotalerne, som kommer direkte fra Shopify.
</Warning>

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
window.aftersell.cart.events.on('cart_updated', (state) => {
  console.log(state.itemCount, 'items');
  console.log('Total:', window.aftersell.cart.actions.formatMoney(state.totalPrice));
  console.log('Saved:', window.aftersell.cart.actions.formatMoney(state.totalDiscount));
  console.log('Codes:', state.discountCodes.join(', ') || 'none');
});
```

<div id="cart-lines">
  ## Kurvlinjer
</div>

Hver post i `items` samt `item` på [`item_added`](/da/aftersell/cart/sdk-events#item_added) og [`item_removed`](/da/aftersell/cart/sdk-events#item_removed):

| Felt                  | Type                             | Beskrivelse                                                                                                                                     |
| --------------------- | -------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------- |
| `key`                 | `string`                         | Linjens Shopify-nøgle. Send denne til vare-[actions](/da/aftersell/cart/sdk-actions).                                                           |
| `productId`           | `number`                         | Shopify-produkt-ID.                                                                                                                             |
| `variantId`           | `number`                         | Shopify-variant-ID.                                                                                                                             |
| `handle`              | `string`                         | Produkt-handle.                                                                                                                                 |
| `title`               | `string`                         | Visningstitel.                                                                                                                                  |
| `productTitle`        | `string`                         | Produkttitel uden varianten.                                                                                                                    |
| `variantTitle`        | `string \| null`                 | Variantlabel eller `null`.                                                                                                                      |
| `variantOptions`      | `Array<{ name, value }>`         | Valgte muligheder, f.eks. `[{ name: 'Size', value: 'Medium' }]`. Shopify udsender `Title: Default Title` for et produkt med én variant.         |
| `quantity`            | `number`                         | Antal af denne linje.                                                                                                                           |
| `linePrice`           | `number`                         | Linjepris, i cents.                                                                                                                             |
| `finalLinePrice`      | `number`                         | Linjepris efter rabatter, i cents.                                                                                                              |
| `originalLinePrice`   | `number`                         | Linjepris før rabatter, i cents.                                                                                                                |
| `compareAtPrice`      | `number \| null`                 | Variantens førpris (vejledende pris) **pr. enhed**, i cents. `null` når ingen.                                                                  |
| `properties`          | `Record<string, string> \| null` | Varelinje-properties.                                                                                                                           |
| `internalProperties`  | `Record<string, string>`         | Render-only overlay fra [`registerLineTransform`](/da/aftersell/cart/sdk-hooks#registerlinetransform). Gemmes aldrig i Shopify. `{}` når ingen. |
| `discountAllocations` | `Array<{ title, amount }>`       | Rabatter anvendt på denne linje. `amount` er i cents. `[]` når ingen.                                                                           |
| `isGiftCard`          | `boolean`                        | Om linjen er et gavekort.                                                                                                                       |
| `sellingPlan`         | `{ id, name } \| null`           | Den aktive abonnementsplan, eller `null` for et engangskøb.                                                                                     |
| `bundle`              | `AftersellCartBundle \| null`    | [Bundle](#bundles)-viewmodel på ankerlinjen; `null` på ikke-bundle-linjer og børn.                                                              |
| `metadata`            | `Record<string, unknown>`        | [Enrichment](/da/aftersell/cart/sdk-hooks#registercartenricher)-data indekseret efter enricher-`id`. `{}` indtil en enricher udfylder den.      |

<Warning>
  `properties` kan indeholde input fra kunden, såsom en produktformulars felt til brugerdefineret tekst. Render det som tekst, aldrig som rå HTML.
</Warning>

<div id="identifying-a-line">
  ### Identificering af en linje
</div>

Brug `key` til alt, der handler på en linje, og `variantId` eller `productId` til alt, der identificerer et *produkt*:

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
// ✅ Acting on a line: use key.
window.aftersell.cart.actions.removeItem(line.key);

// ✅ Recognising a product: use variantId.
const hasGift = state.items.some((line) => line.variantId === GIFT_VARIANT_ID);
```

Den samme variant kan optræde på flere linjer, når properties er forskellige. To graverede krus med forskellig graveringstekst er to linjer, der deler ét `variantId`. Derfor tager actions `key`.

<div id="prices-on-a-line">
  ### Priser på en linje
</div>

Tre priser, som er nemme at forveksle:

| Du vil have                                   | Brug                          |
| --------------------------------------------- | ----------------------------- |
| Hvad kunden betaler for denne linje           | `finalLinePrice`              |
| Hvad den kostede før kurvrabatter             | `originalLinePrice`           |
| Den gennemstregede vejledende pris, pr. enhed | `compareAtPrice` × `quantity` |

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
// Is this line discounted?
const isDiscounted = line.finalLinePrice < line.originalLinePrice;

// Is it free? (A common way to detect a gift line.)
const isFree = line.finalLinePrice === 0;
```

<div id="bundles">
  ## Bundles
</div>

Når linjer grupperes i en bundle, bærer **anker**-linjen et `bundle`-objekt. Børnene foldes ind i det og optræder ikke længere selvstændigt i `items`. Se [Gruppér bundle-linjer fra en anden app](/da/aftersell/cart/sdk-use-case-bundles) for, hvordan gruppering sættes op.

| Felt           | Type                     | Beskrivelse                                                   |
| -------------- | ------------------------ | ------------------------------------------------------------- |
| `id`           | `string`                 | Bundle-identifikator.                                         |
| `source`       | `'native' \| 'grouped'`  | En Shopify-native bundle eller linjer grupperet af Aftersell. |
| `memberKeys`   | `string[]`               | `key` for hver linje i bundlen.                               |
| `children`     | `AftersellBundleChild[]` | Bundlens indhold.                                             |
| `displayPrice` | `number`                 | Den pris, der vises for bundlen, i cents.                     |

Hvert barn bærer `key` (`null` for en native komponent), `title`, `variantTitle`, `quantity`, `perAnchorQty`, `imageUrl`, `finalLinePrice`, `originalLinePrice` og `compareAtPrice`.

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
// Skip bundle children when totalling your own line list.
const topLevel = state.items.filter((line) => !isBundleChild(line, state));
```

<div id="subscription-plans">
  ## Abonnementsplaner
</div>

En linjes aktive plan er `sellingPlan`, eller `null` for et engangskøb. For et svar for hele kurven skal du læse `hasSubscriptionItems` frem for selv at scanne linjerne, da den også tæller tilkøbslinjer, som `items` viser, men `itemCount` springer over:

```js theme={"theme":{"light":"snazzy-light","dark":"github-dark"}}
if (state.hasSubscriptionItems) {
  // The cart contains at least one subscription line.
}

const subscriptions = state.items.filter((line) => line.sellingPlan);
console.log(subscriptions.length, 'subscription lines');
```

De *tilgængelige* planer på en linje, dem i vælgeren, er ikke på cart-objektet. Form dem med [`registerSubscriptionOptionsTransform`](/da/aftersell/cart/sdk-hooks#registersubscriptionoptionstransform) og [`registerDefaultSubscriptionOptionSelector`](/da/aftersell/cart/sdk-hooks#registerdefaultsubscriptionoptionselector).

<div id="where-to-go-next">
  ## Hvor skal du hen nu
</div>

* **[Actions](/da/aftersell/cart/sdk-actions)**: læs og ændr kurven.
* **[Events](/da/aftersell/cart/sdk-events)**: hvor dette objekt kommer fra.
* **[Hooks](/da/aftersell/cart/sdk-hooks)**: tilføj dine egne data til en linje med en enricher.
* **[Use cases](/da/aftersell/cart/sdk-use-cases)**: komplette løsninger, der læser disse felter.
