import type { InventoryEntry, InventoryEntryChangeQuantityAction, InventoryEntryRemoveQuantityAction, InventoryEntrySetCustomFieldAction, InventoryEntrySetCustomTypeAction, InventoryEntrySetExpectedDeliveryAction, InventoryEntrySetRestockableInDaysAction, InventoryEntryUpdateAction, } from "@commercetools/platform-sdk"; import type { Writable } from "#src/types.ts"; import type { UpdateHandlerInterface } from "../abstract.ts"; import { AbstractUpdateHandler, type RepositoryContext } from "../abstract.ts"; export class InventoryEntryUpdateHandler extends AbstractUpdateHandler implements Partial> { changeQuantity( context: RepositoryContext, resource: Writable, { quantity }: InventoryEntryChangeQuantityAction, ) { resource.quantityOnStock = quantity; // don't know active reservations so just set to same value resource.availableQuantity = quantity; } removeQuantity( context: RepositoryContext, resource: Writable, { quantity }: InventoryEntryRemoveQuantityAction, ) { const newQuantity = Math.max(0, resource.quantityOnStock - quantity); resource.quantityOnStock = newQuantity; // don't know active reservations so just set to same value resource.availableQuantity = newQuantity; } setCustomField( context: RepositoryContext, resource: InventoryEntry, { name, value }: InventoryEntrySetCustomFieldAction, ) { this._setCustomFieldValues(resource, { name, value }); } async setCustomType( context: RepositoryContext, resource: Writable, { type, fields }: InventoryEntrySetCustomTypeAction, ) { await this._setCustomType(context, resource, { type, fields }); } setExpectedDelivery( context: RepositoryContext, resource: Writable, { expectedDelivery }: InventoryEntrySetExpectedDeliveryAction, ) { resource.expectedDelivery = new Date(expectedDelivery!).toISOString(); } setRestockableInDays( context: RepositoryContext, resource: Writable, { restockableInDays }: InventoryEntrySetRestockableInDaysAction, ) { resource.restockableInDays = restockableInDays; } }