DR 株式数マイナス防止

package simplex.bn25.datemasa335859.trading.trade;

import simplex.bn25.datemasa335859.trading.a.Position;
import simplex.bn25.datemasa335859.trading.common.DateInputValidator;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Map;
import java.util.Scanner;
import java.util.Set;

public class TradeInputHandler {
    public static Trade registerTrade(Set<String> validTickers, Map<String, String> tickerToNameMap, Map<String, Position> currentPositions) {
        Scanner scanner = new Scanner(System.in);

        // 取引日時を入力
        LocalDateTime tradeDate = DateInputValidator.promptForValidDate(scanner);

        // 銘柄コードと銘柄名を取得
        String ticker = TradeInputPrompter.promptForValidTickerAndName(validTickers, tickerToNameMap, scanner);
        String tickerName = tickerToNameMap.get(ticker);

        // 売買区分を取得
        String side = TradeInputPrompter.promptForSide(scanner);

        // 取引数量を取得
        int quantity = TradeInputPrompter.promptForQuantity(scanner);

        // 取引単価を取得
        BigDecimal tradePrice = TradeInputPrompter.promptForTradePrice(scanner);

        LocalDateTime entryTimestamp = LocalDateTime.now();

        // 保有ポジションのチェック
        Position position = currentPositions.get(ticker);
        if ("SELL".equals(side)) {
            if (position == null || position.quantity() < quantity) {
                System.out.println("エラー: 保有株式数を超える売却は許可されていません。");
                return null; // 入力を拒否
            }
        }

        return new Trade(tradeDate, ticker, tickerName, side, quantity, tradePrice, entryTimestamp);
    }
}
package simplex.bn25.datemasa335859.trading;

import simplex.bn25.datemasa335859.trading.a.PositionCalculator;
import simplex.bn25.datemasa335859.trading.a.TradeDataLoader;
import simplex.bn25.datemasa335859.trading.common.ShowMenu;
import simplex.bn25.datemasa335859.trading.stock.DisplayStockMaster;
import simplex.bn25.datemasa335859.trading.stock.RegisterStock;
import simplex.bn25.datemasa335859.trading.stock.TickerManager;
import simplex.bn25.datemasa335859.trading.trade.Trade;
import simplex.bn25.datemasa335859.trading.trade.TradeDisplay;
import simplex.bn25.datemasa335859.trading.trade.TradeInputHandler;
import simplex.bn25.datemasa335859.trading.trade.TradeWriter;

import java.util.Scanner;

import static simplex.bn25.datemasa335859.trading.a.MarketPriceLoader.loadMarketPrices;

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        boolean isRunning = true;

        // 必要なクラスのインスタンスを初期化
        TradeDataLoader tradeDataLoader = new TradeDataLoader(); // 取引データローダー
        PositionCalculator positionCalculator = new PositionCalculator(tradeDataLoader); // ポジション計算機

        // アプリケーション起動時に時価情報をロード
        loadMarketPrices();
        System.out.println("時価情報をロードしました。");

        System.out.println("株式取引管理システムを開始します。");

        while (isRunning) {
            // メニューを表示
            ShowMenu.showMenu();
            String input = scanner.nextLine();
            switch (input) {
                case "1":
                    System.out.println(" >「銘柄マスタ一覧表示」が選択されました。");
                    DisplayStockMaster.displayStockMaster();
                    break;
                case "2":
                    System.out.println(" >「銘柄マスタ新規登録」が選択されました。");
                    RegisterStock.registerStock();
                    break;
                case "3":
                    System.out.println(" >「取引入力」が選択されました。");
                    try {
                        Trade trade = TradeInputHandler.registerTrade(
                                TickerManager.getExistingTickers(),
                                TickerManager.getTickerToNameMap(),
                                tradeDataLoader.calculatePositions());
                        if (trade != null) {
                            TradeWriter.writeTradeToCSV(trade); // 取引データをCSVに保存
                            System.out.println("取引データが登録されました。");
                        } else {
                            System.out.println("取引が無効であるため、登録されませんでした。");
                        }
                    } catch (Exception e) {
                        System.out.println("エラー: 取引入力中に問題が発生しました。詳細: " + e.getMessage());
                    }
                    break;
                case "4":
                    System.out.println(" >「取引一覧の表示」が選択されました。");
                    TradeDisplay.displayTradeList(); // 取引一覧を表示
                    break;
                case "5":
                    System.out.println(" >「保有ポジション表示」が選択されました。");
                    try {
                        positionCalculator.displayPositions(); // ポジションを表示
                    } catch (Exception e) {
                        System.out.println("エラー: 保有ポジション表示中に問題が発生しました。詳細: " + e.getMessage());
                    }
                    break;
                case "6":
                    System.out.println(" >「時価情報更新」が選択されました。");
                    loadMarketPrices(); // 時価情報を再ロード
                    System.out.println("時価情報を更新しました。");
                    break;
                case "9":
                    System.out.println(" > アプリケーションを終了します。");
                    isRunning = false; // 終了フラグを設定
                    break;
                default:
                    System.out.println(input + "に対応するメニューは存在しません。");
                    break;
            }
        }
        scanner.close(); // スキャナーを閉じる
    }
}

コメント

タイトルとURLをコピーしました