From b4eab42c442ba7fa6f3d4043c187f73a5603cc21 Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Thu, 9 Jan 2025 00:03:57 +0900 Subject: [PATCH] =?UTF-8?q?get=E3=81=AEapi=E4=BD=9C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/festival_item_repository.go | 41 +++++---- .../usecase/festival_item_usecase.go | 90 +++++++++++++++++++ 2 files changed, 114 insertions(+), 17 deletions(-) diff --git a/api/externals/repository/festival_item_repository.go b/api/externals/repository/festival_item_repository.go index 32489409..230807b6 100644 --- a/api/externals/repository/festival_item_repository.go +++ b/api/externals/repository/festival_item_repository.go @@ -41,20 +41,23 @@ func (fir *festivalItemRepository) All( c context.Context, ) (*sql.Rows, error) { query, _, err := dialect.Select( - "financial_records.id", - "financial_records.name", "years.year", - goqu.COALESCE(goqu.SUM("item_budgets.amount"), 0).As("budget"), + "festival_items.id", + "festival_items.name", + "festival_items.memo", + "financial_records.name", + "divisions.name", + goqu.L("COALESCE(`item_budgets`.`amount`, 0)").As("budget"), goqu.COALESCE(goqu.SUM("buy_reports.amount"), 0).As("expense"), - goqu.COALESCE(goqu.L("SUM(item_budgets.amount) - SUM(buy_reports.amount)"), 0).As("balance")). - From("financial_records"). + goqu.COALESCE(goqu.L("item_budgets.amount - COALESCE(SUM(`buy_reports`.`amount`), 0)"), 0).As("balance")). + From("festival_items"). + InnerJoin(goqu.I("divisions"), goqu.On(goqu.I("festival_items.division_id").Eq(goqu.I("divisions.id")))). + InnerJoin(goqu.I("financial_records"), goqu.On(goqu.I("divisions.financial_record_id").Eq(goqu.I("financial_records.id")))). InnerJoin(goqu.I("years"), goqu.On(goqu.I("financial_records.year_id").Eq(goqu.I("years.id")))). - LeftJoin(goqu.I("divisions"), goqu.On(goqu.I("financial_records.id").Eq(goqu.I("divisions.financial_record_id")))). - LeftJoin(goqu.I("festival_items"), goqu.On(goqu.I("divisions.id").Eq(goqu.I("festival_items.division_id")))). LeftJoin(goqu.I("item_budgets"), goqu.On(goqu.I("festival_items.id").Eq(goqu.I("item_budgets.festival_item_id")))). LeftJoin(goqu.I("buy_reports"), goqu.On(goqu.I("festival_items.id").Eq(goqu.I("buy_reports.festival_item_id")))). - GroupBy("financial_records.id"). + GroupBy("festival_items.id", "item_budgets.amount"). + Order(goqu.I("festival_items.id").Desc()). ToSQL() - if err != nil { return nil, err } @@ -67,18 +70,22 @@ func (fir *festivalItemRepository) AllByPeriod( year string, ) (*sql.Rows, error) { query, _, err := dialect.Select( - "financial_records.id", - "financial_records.name", "years.year", - goqu.COALESCE(goqu.SUM("item_budgets.amount"), 0).As("budget"), + "festival_items.id", + "festival_items.name", + "festival_items.memo", + "financial_records.name", + "divisions.name", + goqu.L("COALESCE(`item_budgets`.`amount`, 0)").As("budget"), goqu.COALESCE(goqu.SUM("buy_reports.amount"), 0).As("expense"), - goqu.COALESCE(goqu.L("SUM(item_budgets.amount) - SUM(buy_reports.amount)"), 0).As("balance")). - From("financial_records"). + goqu.COALESCE(goqu.L("item_budgets.amount - COALESCE(SUM(`buy_reports`.`amount`), 0)"), 0).As("balance")). + From("festival_items"). + InnerJoin(goqu.I("divisions"), goqu.On(goqu.I("festival_items.division_id").Eq(goqu.I("divisions.id")))). + InnerJoin(goqu.I("financial_records"), goqu.On(goqu.I("divisions.financial_record_id").Eq(goqu.I("financial_records.id")))). InnerJoin(goqu.I("years"), goqu.On(goqu.I("financial_records.year_id").Eq(goqu.I("years.id")))). - LeftJoin(goqu.I("divisions"), goqu.On(goqu.I("financial_records.id").Eq(goqu.I("divisions.financial_record_id")))). - LeftJoin(goqu.I("festival_items"), goqu.On(goqu.I("divisions.id").Eq(goqu.I("festival_items.division_id")))). LeftJoin(goqu.I("item_budgets"), goqu.On(goqu.I("festival_items.id").Eq(goqu.I("item_budgets.festival_item_id")))). LeftJoin(goqu.I("buy_reports"), goqu.On(goqu.I("festival_items.id").Eq(goqu.I("buy_reports.festival_item_id")))). - GroupBy("financial_records.id"). + GroupBy("festival_items.id", "item_budgets.amount"). + Order(goqu.I("festival_items.id").Desc()). Where(goqu.Ex{"years.year": year}). ToSQL() if err != nil { diff --git a/api/internals/usecase/festival_item_usecase.go b/api/internals/usecase/festival_item_usecase.go index 762e7d08..8db570f7 100644 --- a/api/internals/usecase/festival_item_usecase.go +++ b/api/internals/usecase/festival_item_usecase.go @@ -34,6 +34,51 @@ func (fiu *festivalItemUseCase) GetFestivalItems( c context.Context, ) (generated.FestivalItemDetails, error) { var festivalItemDetails generated.FestivalItemDetails + var festivalItems []generated.FestivalItemWithBalance + + rows, err := fiu.rep.All(c) + if err != nil { + return festivalItemDetails, err + } + + defer rows.Close() + for rows.Next() { + var festivalItem generated.FestivalItemWithBalance + err := rows.Scan( + &festivalItem.Id, + &festivalItem.Name, + &festivalItem.Memo, + &festivalItem.FinancialRecord, + &festivalItem.Division, + &festivalItem.Budget, + &festivalItem.Expense, + &festivalItem.Balance, + ) + if err != nil { + return festivalItemDetails, err + } + festivalItems = append(festivalItems, festivalItem) + } + festivalItemDetails.FestivalItems = &festivalItems + + var total generated.Total + + // totalを求める + budgetTotal := 0 + expenseTotal := 0 + balanceTotal := 0 + + for _, festivalItem := range festivalItems { + budgetTotal += *festivalItem.Budget + expenseTotal += *festivalItem.Expense + balanceTotal += *festivalItem.Balance + } + + total.Budget = &budgetTotal + total.Expense = &expenseTotal + total.Balance = &balanceTotal + + festivalItemDetails.Total = &total return festivalItemDetails, nil } @@ -42,6 +87,51 @@ func (fiu *festivalItemUseCase) GetFestivalItemsByYears( year string, ) (generated.FestivalItemDetails, error) { var festivalItemDetails generated.FestivalItemDetails + var festivalItems []generated.FestivalItemWithBalance + + rows, err := fiu.rep.AllByPeriod(c, year) + if err != nil { + return festivalItemDetails, err + } + + defer rows.Close() + for rows.Next() { + var festivalItem generated.FestivalItemWithBalance + err := rows.Scan( + &festivalItem.Id, + &festivalItem.Name, + &festivalItem.Memo, + &festivalItem.FinancialRecord, + &festivalItem.Division, + &festivalItem.Budget, + &festivalItem.Expense, + &festivalItem.Balance, + ) + if err != nil { + return festivalItemDetails, err + } + festivalItems = append(festivalItems, festivalItem) + } + festivalItemDetails.FestivalItems = &festivalItems + + var total generated.Total + + // totalを求める + budgetTotal := 0 + expenseTotal := 0 + balanceTotal := 0 + + for _, festivalItem := range festivalItems { + budgetTotal += *festivalItem.Budget + expenseTotal += *festivalItem.Expense + balanceTotal += *festivalItem.Balance + } + + total.Budget = &budgetTotal + total.Expense = &expenseTotal + total.Balance = &balanceTotal + + festivalItemDetails.Total = &total return festivalItemDetails, nil }