public synchronized boolean replaceAllPossibleFailingParts(WorkSheet ws) {
		if (ws.partsToReplace == null) {
			// nothing to replace
			ws.status = WorkSheet.Status.FINISHED;
			return true;
		}
		for (Iterator<Part> it = ws.partsToReplace.iterator(); it.hasNext();) {
			Part partToReplace = it.next();
			PartType type = partToReplace.type;
			Integer inStockQuantity = stock.get(type);
			if (inStockQuantity != null && inStockQuantity > 0) {
				inStockQuantity = inStockQuantity - 1;
				stock.put(type, inStockQuantity);
				if (ws.replacedParts == null) {
					ws.replacedParts = new ArrayList<>();
				}
				ws.replacedParts.add(new ReplacedPart(type, partToReplace.name));
				it.remove();
			} else {
				addOrderForMissingPart(type);
				ws.status = WorkSheet.Status.WAITING_FOR_PARTS;
			}
		}

		if (ws.partsToReplace.isEmpty()) {
			ws.status = WorkSheet.Status.FINISHED;
			return true;
		} else {
			return false;
		}
	}