SellCommand.java

package com.tdmconsult.ete.evaluation.commands;

import com.tdmconsult.ete.evaluation.EvaluableTransaction;
import com.tdmconsult.ete.evaluation.EvaluationPosition;
import com.tdmconsult.ete.evaluation.EvaluationState;
import lombok.Data;
import lombok.RequiredArgsConstructor;
import lombok.experimental.Accessors;

@Data
@Accessors(chain = true)
@RequiredArgsConstructor
public class SellCommand implements Command {
    private final EvaluableTransaction trx;

    @Override
    public void execute(final EvaluationState state) {

        final var sell = new EvaluationPosition(trx);
        while (!sell.isFullyConsumed()) {
            final var buy = state.getPositions().stream()
                    .filter(p -> p.getSource().isBuy())
                    .filter(p -> p.getSecurity().getPublicId().equals(sell.getSecurity().getPublicId()))
                    .filter(p -> !p.isFullyConsumed())
                    .findFirst().orElseThrow(() -> new IllegalStateException("leerverkauf"));
            sell.consumes(buy);
        }
        state.getPositions().add(sell);
    }
}