One remaining quantity per batch, kept in ApiCore and always derived: initial quantity (jarCount / produced quantity) plus the signed movements in the new BatchMovement ledger, which is never deleted. - Production batches for MANUFACTURED articles (candles, propolis products, ...); articles get a kind and a shop category. - Withdrawals (farm shop, own use, breakage, sample) and inventory corrections on bottlings and production batches, never more than the remaining stock; every write locks the bottling or the article row. - Shop bookings via POST /shop-sync/movements (new scope shop-sync:write): idempotent per externalId, articles allocated oldest best-before first, returns mirrored onto the batches of the sale, invalid entries rejected one by one. - GET /shop-sync/stock and remainingCount in the shop feed; webhook stock.changed after every change (ids only, receivers fetch numbers). - Bottlings and production batches with movements cannot be deleted. Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
28 lines
575 B
TypeScript
28 lines
575 B
TypeScript
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
|
|
import {
|
|
IsEnum,
|
|
IsInt,
|
|
IsOptional,
|
|
IsPositive,
|
|
IsString,
|
|
MaxLength,
|
|
} from 'class-validator';
|
|
import { WithdrawalReason } from '../../../generated/prisma';
|
|
|
|
export class WithdrawStockDto {
|
|
@ApiProperty({ description: 'Anzahl Gläser bzw. Stück' })
|
|
@IsInt()
|
|
@IsPositive()
|
|
quantity!: number;
|
|
|
|
@ApiProperty({ enum: WithdrawalReason })
|
|
@IsEnum(WithdrawalReason)
|
|
reason!: WithdrawalReason;
|
|
|
|
@ApiPropertyOptional()
|
|
@IsOptional()
|
|
@IsString()
|
|
@MaxLength(500)
|
|
notes?: string;
|
|
}
|