From 179a5d1e33ce389f0e3ffba4f32da4ec8aaccb82 Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Wed, 29 Jan 2025 21:34:01 +0900 Subject: [PATCH 01/10] =?UTF-8?q?openapi=E4=BF=AE=E6=AD=A3=E3=80=81?= =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC=E3=81=94=E3=81=A8=E3=81=AB?= =?UTF-8?q?=E5=8F=96=E5=BE=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/generated/openapi_gen.go | 35 +++++++++++----- openapi/openapi.yaml | 17 +++++--- view/next-project/src/generated/hooks.ts | 40 ++++++++++++------- .../next-project/src/generated/model/index.ts | 1 + 4 files changed, 64 insertions(+), 29 deletions(-) diff --git a/api/generated/openapi_gen.go b/api/generated/openapi_gen.go index 533be218..fd9653f6 100644 --- a/api/generated/openapi_gen.go +++ b/api/generated/openapi_gen.go @@ -381,6 +381,12 @@ type GetFestivalItemsParams struct { DivisionId *int `form:"division_id,omitempty" json:"division_id,omitempty"` } +// GetFestivalItemsDetailsUserIdParams defines parameters for GetFestivalItemsDetailsUserId. +type GetFestivalItemsDetailsUserIdParams struct { + // YearId year_id + YearId *int `form:"year_id,omitempty" json:"year_id,omitempty"` +} + // GetFinancialRecordsParams defines parameters for GetFinancialRecords. type GetFinancialRecordsParams struct { // Year year @@ -794,8 +800,8 @@ type ServerInterface interface { // (POST /festival_items) PostFestivalItems(ctx echo.Context) error - // (GET /festival_items/details/{division_id}) - GetFestivalItemsDetailsDivisionId(ctx echo.Context, divisionId int) error + // (GET /festival_items/details/{user_id}) + GetFestivalItemsDetailsUserId(ctx echo.Context, userId int, params GetFestivalItemsDetailsUserIdParams) error // (DELETE /festival_items/{id}) DeleteFestivalItemsId(ctx echo.Context, id int) error @@ -1934,19 +1940,28 @@ func (w *ServerInterfaceWrapper) PostFestivalItems(ctx echo.Context) error { return err } -// GetFestivalItemsDetailsDivisionId converts echo context to params. -func (w *ServerInterfaceWrapper) GetFestivalItemsDetailsDivisionId(ctx echo.Context) error { +// GetFestivalItemsDetailsUserId converts echo context to params. +func (w *ServerInterfaceWrapper) GetFestivalItemsDetailsUserId(ctx echo.Context) error { var err error - // ------------- Path parameter "division_id" ------------- - var divisionId int + // ------------- Path parameter "user_id" ------------- + var userId int - err = runtime.BindStyledParameterWithOptions("simple", "division_id", ctx.Param("division_id"), &divisionId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "user_id", ctx.Param("user_id"), &userId, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter division_id: %s", err)) + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter user_id: %s", err)) + } + + // Parameter object where we will unmarshal all parameters from the context + var params GetFestivalItemsDetailsUserIdParams + // ------------- Optional query parameter "year_id" ------------- + + err = runtime.BindQueryParameter("form", true, false, "year_id", ctx.QueryParams(), ¶ms.YearId) + if err != nil { + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter year_id: %s", err)) } // Invoke the callback with all the unmarshaled arguments - err = w.Handler.GetFestivalItemsDetailsDivisionId(ctx, divisionId) + err = w.Handler.GetFestivalItemsDetailsUserId(ctx, userId, params) return err } @@ -3151,7 +3166,7 @@ func RegisterHandlersWithBaseURL(router EchoRouter, si ServerInterface, baseURL router.GET(baseURL+"/expenses/:id/details", wrapper.GetExpensesIdDetails) router.GET(baseURL+"/festival_items", wrapper.GetFestivalItems) router.POST(baseURL+"/festival_items", wrapper.PostFestivalItems) - router.GET(baseURL+"/festival_items/details/:division_id", wrapper.GetFestivalItemsDetailsDivisionId) + router.GET(baseURL+"/festival_items/details/:user_id", wrapper.GetFestivalItemsDetailsUserId) router.DELETE(baseURL+"/festival_items/:id", wrapper.DeleteFestivalItemsId) router.PUT(baseURL+"/festival_items/:id", wrapper.PutFestivalItemsId) router.GET(baseURL+"/financial_records", wrapper.GetFinancialRecords) diff --git a/openapi/openapi.yaml b/openapi/openapi.yaml index 596b35b5..6034c453 100644 --- a/openapi/openapi.yaml +++ b/openapi/openapi.yaml @@ -1230,25 +1230,32 @@ paths: application/json: schema: type: object - /festival_items/details/{division_id}: + /festival_items/details/{user_id}: get: tags: - festival_item - description: divisionの予算一覧の取得 + description: ユーザーのマイページの予算一覧の取得 parameters: - - name: division_id + - name: user_id in: path - description: division_id + description: user_id required: true schema: type: integer + - name: year_id + in: query + description: year_id + schema: + type: integer responses: "200": description: divisionの一覧を取得 content: application/json: schema: - $ref: "#/components/schemas/festivalItemsForMyPage" + type: array + items: + $ref: "#/components/schemas/festivalItemsForMyPage" /financial_records: get: tags: diff --git a/view/next-project/src/generated/hooks.ts b/view/next-project/src/generated/hooks.ts index 13dcbab0..b0b70472 100644 --- a/view/next-project/src/generated/hooks.ts +++ b/view/next-project/src/generated/hooks.ts @@ -84,6 +84,7 @@ import type { GetExpensesFiscalyearYear200, GetExpensesId200, GetExpensesIdDetails200, + GetFestivalItemsDetailsUserIdParams, GetFestivalItemsParams, GetFinancialRecordsParams, GetFundInformations200, @@ -3486,23 +3487,32 @@ export const useDeleteFestivalItemsId = ( } /** - * divisionの予算一覧の取得 + * ユーザーのマイページの予算一覧の取得 */ -export type getFestivalItemsDetailsDivisionIdResponse = { +export type getFestivalItemsDetailsUserIdResponse = { data: FestivalItemsForMyPage; status: number; headers: Headers; } -export const getGetFestivalItemsDetailsDivisionIdUrl = (divisionId: number,) => { +export const getGetFestivalItemsDetailsUserIdUrl = (userId: number, + params?: GetFestivalItemsDetailsUserIdParams,) => { + const normalizedParams = new URLSearchParams(); + Object.entries(params || {}).forEach(([key, value]) => { + + if (value !== undefined) { + normalizedParams.append(key, value === null ? 'null' : value.toString()) + } + }); - return `/festival_items/details/${divisionId}` + return normalizedParams.size ? `/festival_items/details/${userId}?${normalizedParams.toString()}` : `/festival_items/details/${userId}` } -export const getFestivalItemsDetailsDivisionId = async (divisionId: number, options?: RequestInit): Promise => { +export const getFestivalItemsDetailsUserId = async (userId: number, + params?: GetFestivalItemsDetailsUserIdParams, options?: RequestInit): Promise => { - return customFetch>(getGetFestivalItemsDetailsDivisionIdUrl(divisionId), + return customFetch>(getGetFestivalItemsDetailsUserIdUrl(userId,params), { ...options, method: 'GET' @@ -3514,19 +3524,21 @@ export const getFestivalItemsDetailsDivisionId = async (divisionId: number, opti -export const getGetFestivalItemsDetailsDivisionIdKey = (divisionId: number,) => [`/festival_items/details/${divisionId}`] as const; +export const getGetFestivalItemsDetailsUserIdKey = (userId: number, + params?: GetFestivalItemsDetailsUserIdParams,) => [`/festival_items/details/${userId}`, ...(params ? [params]: [])] as const; -export type GetFestivalItemsDetailsDivisionIdQueryResult = NonNullable>> -export type GetFestivalItemsDetailsDivisionIdQueryError = unknown +export type GetFestivalItemsDetailsUserIdQueryResult = NonNullable>> +export type GetFestivalItemsDetailsUserIdQueryError = unknown -export const useGetFestivalItemsDetailsDivisionId = ( - divisionId: number, options?: { swr?:SWRConfiguration>, TError> & { swrKey?: Key, enabled?: boolean }, request?: SecondParameter } +export const useGetFestivalItemsDetailsUserId = ( + userId: number, + params?: GetFestivalItemsDetailsUserIdParams, options?: { swr?:SWRConfiguration>, TError> & { swrKey?: Key, enabled?: boolean }, request?: SecondParameter } ) => { const {swr: swrOptions, request: requestOptions} = options ?? {} - const isEnabled = swrOptions?.enabled !== false && !!(divisionId) - const swrKey = swrOptions?.swrKey ?? (() => isEnabled ? getGetFestivalItemsDetailsDivisionIdKey(divisionId) : null); - const swrFn = () => getFestivalItemsDetailsDivisionId(divisionId, requestOptions) + const isEnabled = swrOptions?.enabled !== false && !!(userId) + const swrKey = swrOptions?.swrKey ?? (() => isEnabled ? getGetFestivalItemsDetailsUserIdKey(userId,params) : null); + const swrFn = () => getFestivalItemsDetailsUserId(userId,params, requestOptions) const query = useSwr>, TError>(swrKey, swrFn, swrOptions) diff --git a/view/next-project/src/generated/model/index.ts b/view/next-project/src/generated/model/index.ts index 5980c86b..99202011 100644 --- a/view/next-project/src/generated/model/index.ts +++ b/view/next-project/src/generated/model/index.ts @@ -81,6 +81,7 @@ export * from './getExpensesDetailsYear200'; export * from './getExpensesFiscalyearYear200'; export * from './getExpensesId200'; export * from './getExpensesIdDetails200'; +export * from './getFestivalItemsDetailsUserIdParams'; export * from './getFestivalItemsParams'; export * from './getFinancialRecordsParams'; export * from './getFundInformations200'; From 22849e90300bee75b31738f4b06f5b4ec80d9d61 Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Fri, 31 Jan 2025 01:39:23 +0900 Subject: [PATCH 02/10] =?UTF-8?q?=E3=83=87=E3=83=BC=E3=82=BF=E5=8F=96?= =?UTF-8?q?=E5=BE=97=E3=81=A8=E6=95=B4=E5=BD=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/festival_item_controller.go | 15 ++ .../repository/festival_item_repository.go | 51 +++++++ api/generated/openapi_gen.go | 2 +- api/internals/domain/festival_item.go | 17 +++ .../usecase/festival_item_usecase.go | 141 ++++++++++++++++++ api/router/router.go | 1 + openapi/openapi.yaml | 2 +- view/next-project/src/generated/hooks.ts | 2 +- 8 files changed, 228 insertions(+), 3 deletions(-) diff --git a/api/externals/controller/festival_item_controller.go b/api/externals/controller/festival_item_controller.go index 5257f2bc..b335427f 100644 --- a/api/externals/controller/festival_item_controller.go +++ b/api/externals/controller/festival_item_controller.go @@ -14,6 +14,7 @@ type festivalItemController struct { type FestivalItemController interface { IndexFestivalItems(echo.Context) error + IndexFestivalItemsForMypage(echo.Context) error CreateFestivalItem(echo.Context) error UpdateFestivalItem(echo.Context) error DestroyFestivalItem(echo.Context) error @@ -36,6 +37,19 @@ func (f *festivalItemController) IndexFestivalItems(c echo.Context) error { return c.JSON(http.StatusOK, festivalItemDetails) } +func (f *festivalItemController) IndexFestivalItemsForMypage(c echo.Context) error { + ctx := c.Request().Context() + userId := c.Param("user_id") + year := c.QueryParam("year") + var festivalItemDetails []FestivalItemsForMyPage + + festivalItemDetails, err := f.u.GetFestvalItemsForMypage(ctx, year, userId) + if err != nil { + return err + } + return c.JSON(http.StatusOK, festivalItemDetails) +} + func (f *festivalItemController) CreateFestivalItem(c echo.Context) error { festivalItem := new(FestivalItem) if err := c.Bind(festivalItem); err != nil { @@ -76,3 +90,4 @@ func (f *festivalItemController) DestroyFestivalItem(c echo.Context) error { type FestivalItemDetails = generated.FestivalItemDetails type FestivalItem = generated.FestivalItem +type FestivalItemsForMyPage = generated.FestivalItemsForMyPage diff --git a/api/externals/repository/festival_item_repository.go b/api/externals/repository/festival_item_repository.go index cd116889..a8ecdb00 100644 --- a/api/externals/repository/festival_item_repository.go +++ b/api/externals/repository/festival_item_repository.go @@ -29,6 +29,7 @@ type FestivalItemRepository interface { StartTransaction(context.Context) (*sql.Tx, error) RollBack(context.Context, *sql.Tx) error Commit(context.Context, *sql.Tx) error + GetDetailByDivisionId(context.Context, string, string) (*sql.Rows, error) } func NewFestivalItemRepository(c db.Client, ac abstract.Crud) FestivalItemRepository { @@ -191,6 +192,30 @@ func (fir *festivalItemRepository) Commit(c context.Context, tx *sql.Tx) error { return fir.crud.Commit(c, tx) } +// 年度別と部門で取得 +func (fir *festivalItemRepository) GetDetailByDivisionId( + c context.Context, + year string, + userId string, +) (*sql.Rows, error) { + ds := selectFestivalItemForMypageQuery + if userId != "" { + ds = ds.Where(goqu.Ex{"users.id": userId}) + } + + if year != "" { + ds = ds.Where(goqu.Ex{"years.year": year}) + } + + query, _, err := ds.ToSQL() + + if err != nil { + return nil, err + } + + return fir.crud.Read(c, query) +} + var selectFestivalItemQuery = dialect.Select( "festival_items.id", "festival_items.name", @@ -208,3 +233,29 @@ var selectFestivalItemQuery = dialect.Select( LeftJoin(goqu.I("buy_reports"), goqu.On(goqu.I("festival_items.id").Eq(goqu.I("buy_reports.festival_item_id")))). GroupBy("festival_items.id", "item_budgets.amount"). Order(goqu.I("festival_items.id").Desc()) + +var selectFestivalItemForMypageQuery = dialect.Select( + goqu.I("users.name").As("userName"), + goqu.I("financial_records.name").As("financialRecordName"), + goqu.I("divisions.id").As("divisionId"), + goqu.I("divisions.name").As("divisionName"), + goqu.I("festival_items.id").As("festivalItemId"), + goqu.I("festival_items.name").As("festivalItemName"), + goqu.I("years.year"), + goqu.COALESCE(goqu.I("item_budgets.amount"), 0).As("budgetAmount"), + goqu.COALESCE(goqu.I("buy_reports.id"), 0).As("buyReportId"), + goqu.COALESCE(goqu.I("buy_reports.paid_by"), "").As("paidBy"), + goqu.COALESCE(goqu.I("buy_reports.amount"), 0).As("reportAmount"), + goqu.COALESCE(goqu.I("buy_reports.created_at"), "2025-01-29 20:53:44").As("reportDate"), + goqu.COALESCE(goqu.I("buy_statuses.is_packed"), 0).As("isPacked"), + goqu.COALESCE(goqu.I("buy_statuses.is_settled"), 0).As("isSettled")). + 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("user_groups"), goqu.On(goqu.I("divisions.id").Eq(goqu.I("user_groups.group_id")))). + InnerJoin(goqu.I("users"), goqu.On(goqu.I("users.id").Eq(goqu.I("user_groups.user_id")))). + InnerJoin(goqu.I("years"), goqu.On(goqu.I("financial_records.year_id").Eq(goqu.I("years.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")))). + LeftJoin(goqu.I("buy_statuses"), goqu.On(goqu.I("buy_reports.id").Eq(goqu.I("buy_statuses.buy_report_id")))). + Order(goqu.I("festival_items.id").Desc()) diff --git a/api/generated/openapi_gen.go b/api/generated/openapi_gen.go index fd9653f6..a3f88197 100644 --- a/api/generated/openapi_gen.go +++ b/api/generated/openapi_gen.go @@ -16,7 +16,7 @@ import ( const ( Empty BuyReportInformationStatus = "確認中" N1 BuyReportInformationStatus = "封詰め" - N2 BuyReportInformationStatus = "生産完了" + N2 BuyReportInformationStatus = "清算完了" ) // Defines values for GetActivitiesFilteredDetailsParamsIsDone. diff --git a/api/internals/domain/festival_item.go b/api/internals/domain/festival_item.go index ea25ea61..7b1452d0 100644 --- a/api/internals/domain/festival_item.go +++ b/api/internals/domain/festival_item.go @@ -12,3 +12,20 @@ type FestivalItem struct { CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` } + +type FestivalItemForMyPageColumn struct { + UserName string + FinancialRecordName string + DivisionId int + DivisionName string + FestivalItemId int + FestivalItemName string + Year int + BudgetAmount int + BuyReportId int + PaidBy string + ReportAmount int + ReportDate string + IsPacked bool + IsSettled bool +} diff --git a/api/internals/usecase/festival_item_usecase.go b/api/internals/usecase/festival_item_usecase.go index 6252c198..e8110cd4 100644 --- a/api/internals/usecase/festival_item_usecase.go +++ b/api/internals/usecase/festival_item_usecase.go @@ -2,9 +2,11 @@ package usecase import ( "context" + "fmt" rep "github.com/NUTFes/FinanSu/api/externals/repository" "github.com/NUTFes/FinanSu/api/generated" + "github.com/NUTFes/FinanSu/api/internals/domain" ) type festivalItemUseCase struct { @@ -13,6 +15,7 @@ type festivalItemUseCase struct { type FestivalItemUseCase interface { GetFestivalItems(context.Context, string, string) (FestivalItemDetails, error) + GetFestvalItemsForMypage(context.Context, string, string) ([]FestivalItemDetailsForMypage, error) CreateFestivalItem( context.Context, FestivalItem, @@ -203,6 +206,144 @@ func (fiu *festivalItemUseCase) DestroyFestivalItem(c context.Context, id string return nil } +func (fiu *festivalItemUseCase) GetFestvalItemsForMypage( + c context.Context, + year string, + userId string, +) ([]FestivalItemDetailsForMypage, error) { + // var festivalItemDetails FestivalItemDetailsForMypage + var festivalItemDetailsList []FestivalItemDetailsForMypage + + var festivalItemForMyPageColumns []domain.FestivalItemForMyPageColumn + + rows, err := fiu.rep.GetDetailByDivisionId(c, year, userId) + if err != nil { + return festivalItemDetailsList, err + } + + defer rows.Close() + for rows.Next() { + var festivalItemForMyPageColumn domain.FestivalItemForMyPageColumn + err := rows.Scan( + &festivalItemForMyPageColumn.UserName, + &festivalItemForMyPageColumn.FinancialRecordName, + &festivalItemForMyPageColumn.DivisionId, + &festivalItemForMyPageColumn.DivisionName, + &festivalItemForMyPageColumn.FestivalItemId, + &festivalItemForMyPageColumn.FestivalItemName, + &festivalItemForMyPageColumn.Year, + &festivalItemForMyPageColumn.BudgetAmount, + &festivalItemForMyPageColumn.BuyReportId, + &festivalItemForMyPageColumn.PaidBy, + &festivalItemForMyPageColumn.ReportAmount, + &festivalItemForMyPageColumn.ReportDate, + &festivalItemForMyPageColumn.IsPacked, + &festivalItemForMyPageColumn.IsSettled, + ) + if err != nil { + fmt.Println(err) + return festivalItemDetailsList, err + } + festivalItemForMyPageColumns = append(festivalItemForMyPageColumns, festivalItemForMyPageColumn) + } + + var festivalItemDetailsForMypageMap = make(map[string]FestivalItemDetailsForMypage) + var festivalItemMaps = make(map[string]map[string]FestivalItemWithReport) + + for _, festivalItemForMyPageColumn := range festivalItemForMyPageColumns { + festivalItemDetailsForMypage := festivalItemDetailsForMypageMap[festivalItemForMyPageColumn.DivisionName] + // 局と部門名前定義 + festivalItemDetailsForMypage.DivisionName = &festivalItemForMyPageColumn.DivisionName + festivalItemDetailsForMypage.FinancialRecordName = &festivalItemForMyPageColumn.FinancialRecordName + + // 予算と支出データ集計 + festivalItemMap := festivalItemMaps[festivalItemForMyPageColumn.DivisionName] + if festivalItemMap == nil { + festivalItemMap = make(map[string]FestivalItemWithReport) + } + festivalItemWithReport := festivalItemMap[festivalItemForMyPageColumn.FestivalItemName] + festivalItemWithReport.FestivalItemName = &festivalItemForMyPageColumn.FestivalItemName + + // totalがなければ定義 + if festivalItemWithReport.FestivalItemTotal == nil { + expense, budget, balance := 0, 0, 0 + var total Total + total.Expense, total.Budget, total.Balance = &expense, &budget, &balance + festivalItemWithReport.FestivalItemTotal = &total + } + + *festivalItemWithReport.FestivalItemTotal.Budget += festivalItemForMyPageColumn.BudgetAmount + *festivalItemWithReport.FestivalItemTotal.Expense += festivalItemForMyPageColumn.ReportAmount + *festivalItemWithReport.FestivalItemTotal.Balance += festivalItemForMyPageColumn.BudgetAmount - festivalItemForMyPageColumn.ReportAmount + + buyReports := festivalItemWithReport.BuyReports + if buyReports == nil { + var buyReportSlice []generated.BuyReportInformation + buyReports = &buyReportSlice + } + + var buyReport BuyReport + buyReport.Id = &festivalItemForMyPageColumn.BuyReportId + buyReport.BuyReportName = &festivalItemForMyPageColumn.PaidBy + buyReport.Amount = &festivalItemForMyPageColumn.ReportAmount + buyReport.ReportDate = &festivalItemForMyPageColumn.ReportDate + + if festivalItemForMyPageColumn.IsSettled { + buyReport.Status = &isSettled + } else if festivalItemForMyPageColumn.IsPacked { + buyReport.Status = &isPacked + } else { + buyReport.Status = &empty + } + + if *buyReport.Amount > 0 { + *buyReports = append(*buyReports, buyReport) + } + + festivalItemWithReport.BuyReports = buyReports + + festivalItemMap[festivalItemForMyPageColumn.FestivalItemName] = festivalItemWithReport + festivalItemMaps[festivalItemForMyPageColumn.DivisionName] = festivalItemMap + + // divisionのtotalがなければ定義 + if festivalItemDetailsForMypage.DivisionTotal == nil { + expense, budget, balance := 0, 0, 0 + var total Total + total.Expense, total.Budget, total.Balance = &expense, &budget, &balance + festivalItemDetailsForMypage.DivisionTotal = &total + } + + festivalItemDetailsForMypageMap[festivalItemForMyPageColumn.DivisionName] = festivalItemDetailsForMypage + } + + for _, festivalItemDetails := range festivalItemDetailsForMypageMap { + newFestivalItemDetails := festivalItemDetails + festivalItems := festivalItemMaps[*festivalItemDetails.DivisionName] + var festivalItemWithReports []FestivalItemWithReport + for _, festivalItem := range festivalItems { + festivalItemWithReports = append(festivalItemWithReports, festivalItem) + *festivalItemDetails.DivisionTotal.Budget += *festivalItem.FestivalItemTotal.Budget + *festivalItemDetails.DivisionTotal.Expense += *festivalItem.FestivalItemTotal.Expense + *festivalItemDetails.DivisionTotal.Balance += *festivalItem.FestivalItemTotal.Balance + } + newFestivalItemDetails.FestivalItems = &festivalItemWithReports + festivalItemDetailsList = append(festivalItemDetailsList, newFestivalItemDetails) + } + + return festivalItemDetailsList, nil +} + type FestivalItemDetails = generated.FestivalItemDetails type FestivalItem = generated.FestivalItem type FestivalItemWithBalance = generated.FestivalItemWithBalance +type FestivalItemDetailsForMypage = generated.FestivalItemsForMyPage +type FestivalItemWithReport = generated.FestivalItemWithReport +type BuyReport = generated.BuyReportInformation + +var empty = generated.Empty +var isPacked = generated.N1 +var isSettled = generated.N2 + +// func convertColumnToGenerated(column domain.FestivalItemForMyPageColumn) []FestivalItemDetailsForMypage { +// r +// } diff --git a/api/router/router.go b/api/router/router.go index d8cf0cf6..3f041515 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -175,6 +175,7 @@ func (r router) ProvideRouter(e *echo.Echo) { // festival items e.GET("/festival_items", r.festivalItemController.IndexFestivalItems) + e.GET("/festival_items/details/:user_id", r.festivalItemController.IndexFestivalItemsForMypage) e.POST("/festival_items", r.festivalItemController.CreateFestivalItem) e.PUT("/festival_items/:id", r.festivalItemController.UpdateFestivalItem) e.DELETE("/festival_items/:id", r.festivalItemController.DestroyFestivalItem) diff --git a/openapi/openapi.yaml b/openapi/openapi.yaml index 6034c453..aba12ff6 100644 --- a/openapi/openapi.yaml +++ b/openapi/openapi.yaml @@ -2662,7 +2662,7 @@ components: enum: - 確認中 - 封詰め - - 生産完了 + - 清算完了 buyReportDetail: description: 購入報告ページで表示する詳細情報 type: object diff --git a/view/next-project/src/generated/hooks.ts b/view/next-project/src/generated/hooks.ts index b0b70472..01c4469c 100644 --- a/view/next-project/src/generated/hooks.ts +++ b/view/next-project/src/generated/hooks.ts @@ -3490,7 +3490,7 @@ export const useDeleteFestivalItemsId = ( * ユーザーのマイページの予算一覧の取得 */ export type getFestivalItemsDetailsUserIdResponse = { - data: FestivalItemsForMyPage; + data: FestivalItemsForMyPage[]; status: number; headers: Headers; } From 367fb632cbcd73dc9540d97fe480d42536f402cb Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Fri, 31 Jan 2025 11:25:17 +0900 Subject: [PATCH 03/10] =?UTF-8?q?=E6=95=B4=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/generated/openapi_gen.go | 10 +++---- .../usecase/festival_item_usecase.go | 30 +++++++++++-------- openapi/openapi.yaml | 4 +-- 3 files changed, 24 insertions(+), 20 deletions(-) diff --git a/api/generated/openapi_gen.go b/api/generated/openapi_gen.go index a3f88197..a480cdc0 100644 --- a/api/generated/openapi_gen.go +++ b/api/generated/openapi_gen.go @@ -383,8 +383,8 @@ type GetFestivalItemsParams struct { // GetFestivalItemsDetailsUserIdParams defines parameters for GetFestivalItemsDetailsUserId. type GetFestivalItemsDetailsUserIdParams struct { - // YearId year_id - YearId *int `form:"year_id,omitempty" json:"year_id,omitempty"` + // Year year + Year *int `form:"year,omitempty" json:"year,omitempty"` } // GetFinancialRecordsParams defines parameters for GetFinancialRecords. @@ -1953,11 +1953,11 @@ func (w *ServerInterfaceWrapper) GetFestivalItemsDetailsUserId(ctx echo.Context) // Parameter object where we will unmarshal all parameters from the context var params GetFestivalItemsDetailsUserIdParams - // ------------- Optional query parameter "year_id" ------------- + // ------------- Optional query parameter "year" ------------- - err = runtime.BindQueryParameter("form", true, false, "year_id", ctx.QueryParams(), ¶ms.YearId) + err = runtime.BindQueryParameter("form", true, false, "year", ctx.QueryParams(), ¶ms.Year) if err != nil { - return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter year_id: %s", err)) + return echo.NewHTTPError(http.StatusBadRequest, fmt.Sprintf("Invalid format for parameter year: %s", err)) } // Invoke the callback with all the unmarshaled arguments diff --git a/api/internals/usecase/festival_item_usecase.go b/api/internals/usecase/festival_item_usecase.go index e8110cd4..812ec691 100644 --- a/api/internals/usecase/festival_item_usecase.go +++ b/api/internals/usecase/festival_item_usecase.go @@ -247,6 +247,22 @@ func (fiu *festivalItemUseCase) GetFestvalItemsForMypage( festivalItemForMyPageColumns = append(festivalItemForMyPageColumns, festivalItemForMyPageColumn) } + festivalItemDetailsList = convertColumnToGenerated(festivalItemForMyPageColumns) + + return festivalItemDetailsList, nil +} + +type FestivalItemDetails = generated.FestivalItemDetails +type FestivalItem = generated.FestivalItem +type FestivalItemWithBalance = generated.FestivalItemWithBalance +type FestivalItemDetailsForMypage = generated.FestivalItemsForMyPage +type FestivalItemWithReport = generated.FestivalItemWithReport +type BuyReport = generated.BuyReportInformation + +func convertColumnToGenerated(festivalItemForMyPageColumns []domain.FestivalItemForMyPageColumn) []FestivalItemDetailsForMypage { + var festivalItemDetailsList []FestivalItemDetailsForMypage + + // 部門ごとにマップを作成 var festivalItemDetailsForMypageMap = make(map[string]FestivalItemDetailsForMypage) var festivalItemMaps = make(map[string]map[string]FestivalItemWithReport) @@ -329,21 +345,9 @@ func (fiu *festivalItemUseCase) GetFestvalItemsForMypage( newFestivalItemDetails.FestivalItems = &festivalItemWithReports festivalItemDetailsList = append(festivalItemDetailsList, newFestivalItemDetails) } - - return festivalItemDetailsList, nil + return festivalItemDetailsList } -type FestivalItemDetails = generated.FestivalItemDetails -type FestivalItem = generated.FestivalItem -type FestivalItemWithBalance = generated.FestivalItemWithBalance -type FestivalItemDetailsForMypage = generated.FestivalItemsForMyPage -type FestivalItemWithReport = generated.FestivalItemWithReport -type BuyReport = generated.BuyReportInformation - var empty = generated.Empty var isPacked = generated.N1 var isSettled = generated.N2 - -// func convertColumnToGenerated(column domain.FestivalItemForMyPageColumn) []FestivalItemDetailsForMypage { -// r -// } diff --git a/openapi/openapi.yaml b/openapi/openapi.yaml index aba12ff6..a01939b1 100644 --- a/openapi/openapi.yaml +++ b/openapi/openapi.yaml @@ -1242,9 +1242,9 @@ paths: required: true schema: type: integer - - name: year_id + - name: year in: query - description: year_id + description: year schema: type: integer responses: From 2682416c74050ddeadd66682a4de2cc061545ae8 Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Sun, 2 Feb 2025 19:20:42 +0900 Subject: [PATCH 04/10] =?UTF-8?q?=E3=82=BF=E3=82=A4=E3=83=9D=E6=B6=88?= =?UTF-8?q?=E3=81=97=E5=BF=98=E3=82=8C=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/externals/controller/festival_item_controller.go | 2 +- api/internals/usecase/festival_item_usecase.go | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/api/externals/controller/festival_item_controller.go b/api/externals/controller/festival_item_controller.go index b335427f..39ebc2ee 100644 --- a/api/externals/controller/festival_item_controller.go +++ b/api/externals/controller/festival_item_controller.go @@ -43,7 +43,7 @@ func (f *festivalItemController) IndexFestivalItemsForMypage(c echo.Context) err year := c.QueryParam("year") var festivalItemDetails []FestivalItemsForMyPage - festivalItemDetails, err := f.u.GetFestvalItemsForMypage(ctx, year, userId) + festivalItemDetails, err := f.u.GetFestivalItemsForMypage(ctx, year, userId) if err != nil { return err } diff --git a/api/internals/usecase/festival_item_usecase.go b/api/internals/usecase/festival_item_usecase.go index 812ec691..b6f509b9 100644 --- a/api/internals/usecase/festival_item_usecase.go +++ b/api/internals/usecase/festival_item_usecase.go @@ -15,7 +15,7 @@ type festivalItemUseCase struct { type FestivalItemUseCase interface { GetFestivalItems(context.Context, string, string) (FestivalItemDetails, error) - GetFestvalItemsForMypage(context.Context, string, string) ([]FestivalItemDetailsForMypage, error) + GetFestivalItemsForMypage(context.Context, string, string) ([]FestivalItemDetailsForMypage, error) CreateFestivalItem( context.Context, FestivalItem, @@ -206,12 +206,11 @@ func (fiu *festivalItemUseCase) DestroyFestivalItem(c context.Context, id string return nil } -func (fiu *festivalItemUseCase) GetFestvalItemsForMypage( +func (fiu *festivalItemUseCase) GetFestivalItemsForMypage( c context.Context, year string, userId string, ) ([]FestivalItemDetailsForMypage, error) { - // var festivalItemDetails FestivalItemDetailsForMypage var festivalItemDetailsList []FestivalItemDetailsForMypage var festivalItemForMyPageColumns []domain.FestivalItemForMyPageColumn From e375f6d32a4df6d6ca476a97e2cadf1e09ac7679 Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Sun, 2 Feb 2025 19:23:13 +0900 Subject: [PATCH 05/10] =?UTF-8?q?=E9=96=A2=E6=95=B0=E5=90=8D=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/externals/repository/festival_item_repository.go | 4 ++-- api/internals/usecase/festival_item_usecase.go | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/api/externals/repository/festival_item_repository.go b/api/externals/repository/festival_item_repository.go index a8ecdb00..a027b1e1 100644 --- a/api/externals/repository/festival_item_repository.go +++ b/api/externals/repository/festival_item_repository.go @@ -29,7 +29,7 @@ type FestivalItemRepository interface { StartTransaction(context.Context) (*sql.Tx, error) RollBack(context.Context, *sql.Tx) error Commit(context.Context, *sql.Tx) error - GetDetailByDivisionId(context.Context, string, string) (*sql.Rows, error) + GetDetailsByDivisionId(context.Context, string, string) (*sql.Rows, error) } func NewFestivalItemRepository(c db.Client, ac abstract.Crud) FestivalItemRepository { @@ -193,7 +193,7 @@ func (fir *festivalItemRepository) Commit(c context.Context, tx *sql.Tx) error { } // 年度別と部門で取得 -func (fir *festivalItemRepository) GetDetailByDivisionId( +func (fir *festivalItemRepository) GetDetailsByDivisionId( c context.Context, year string, userId string, diff --git a/api/internals/usecase/festival_item_usecase.go b/api/internals/usecase/festival_item_usecase.go index b6f509b9..d6a17c74 100644 --- a/api/internals/usecase/festival_item_usecase.go +++ b/api/internals/usecase/festival_item_usecase.go @@ -215,7 +215,7 @@ func (fiu *festivalItemUseCase) GetFestivalItemsForMypage( var festivalItemForMyPageColumns []domain.FestivalItemForMyPageColumn - rows, err := fiu.rep.GetDetailByDivisionId(c, year, userId) + rows, err := fiu.rep.GetDetailsByDivisionId(c, year, userId) if err != nil { return festivalItemDetailsList, err } From 99df7b522e08849bb5da706272c08fddf4561472 Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Sun, 2 Feb 2025 19:30:49 +0900 Subject: [PATCH 06/10] =?UTF-8?q?map=E3=81=AE=E3=82=AD=E3=83=BC=E5=88=A4?= =?UTF-8?q?=E5=AE=9A=E3=82=922=E3=81=A4=E7=9B=AE=E3=81=AE=E5=A4=89?= =?UTF-8?q?=E6=95=B0=E3=81=A7=E8=A1=8C=E3=81=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/internals/usecase/festival_item_usecase.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api/internals/usecase/festival_item_usecase.go b/api/internals/usecase/festival_item_usecase.go index d6a17c74..13ae5ff3 100644 --- a/api/internals/usecase/festival_item_usecase.go +++ b/api/internals/usecase/festival_item_usecase.go @@ -272,8 +272,8 @@ func convertColumnToGenerated(festivalItemForMyPageColumns []domain.FestivalItem festivalItemDetailsForMypage.FinancialRecordName = &festivalItemForMyPageColumn.FinancialRecordName // 予算と支出データ集計 - festivalItemMap := festivalItemMaps[festivalItemForMyPageColumn.DivisionName] - if festivalItemMap == nil { + festivalItemMap, ok := festivalItemMaps[festivalItemForMyPageColumn.DivisionName] + if !ok { festivalItemMap = make(map[string]FestivalItemWithReport) } festivalItemWithReport := festivalItemMap[festivalItemForMyPageColumn.FestivalItemName] From 52fc506609bf6272bc88ab5880a709567938ab18 Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Sun, 2 Feb 2025 19:31:47 +0900 Subject: [PATCH 07/10] =?UTF-8?q?nil=E6=99=82=E3=81=AE=E6=97=A5=E6=99=82?= =?UTF-8?q?=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/externals/repository/festival_item_repository.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/externals/repository/festival_item_repository.go b/api/externals/repository/festival_item_repository.go index a027b1e1..eb84e034 100644 --- a/api/externals/repository/festival_item_repository.go +++ b/api/externals/repository/festival_item_repository.go @@ -246,7 +246,7 @@ var selectFestivalItemForMypageQuery = dialect.Select( goqu.COALESCE(goqu.I("buy_reports.id"), 0).As("buyReportId"), goqu.COALESCE(goqu.I("buy_reports.paid_by"), "").As("paidBy"), goqu.COALESCE(goqu.I("buy_reports.amount"), 0).As("reportAmount"), - goqu.COALESCE(goqu.I("buy_reports.created_at"), "2025-01-29 20:53:44").As("reportDate"), + goqu.COALESCE(goqu.I("buy_reports.created_at"), "2000-01-01 00:00:00").As("reportDate"), goqu.COALESCE(goqu.I("buy_statuses.is_packed"), 0).As("isPacked"), goqu.COALESCE(goqu.I("buy_statuses.is_settled"), 0).As("isSettled")). From("festival_items"). From c118a2f75f5390a4c3491ab0df7f6a7991132912 Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Sun, 2 Feb 2025 19:44:48 +0900 Subject: [PATCH 08/10] =?UTF-8?q?=E6=A7=8B=E9=80=A0=E4=BD=93=E5=AE=9A?= =?UTF-8?q?=E7=BE=A9=E9=83=A8=E5=88=86=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF?= =?UTF-8?q?=E3=82=BF=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../usecase/festival_item_usecase.go | 31 +++++++++++-------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/api/internals/usecase/festival_item_usecase.go b/api/internals/usecase/festival_item_usecase.go index 13ae5ff3..cfd6c572 100644 --- a/api/internals/usecase/festival_item_usecase.go +++ b/api/internals/usecase/festival_item_usecase.go @@ -282,9 +282,11 @@ func convertColumnToGenerated(festivalItemForMyPageColumns []domain.FestivalItem // totalがなければ定義 if festivalItemWithReport.FestivalItemTotal == nil { expense, budget, balance := 0, 0, 0 - var total Total - total.Expense, total.Budget, total.Balance = &expense, &budget, &balance - festivalItemWithReport.FestivalItemTotal = &total + festivalItemWithReport.FestivalItemTotal = &Total{ + Expense: &expense, + Budget: &budget, + Balance: &balance, + } } *festivalItemWithReport.FestivalItemTotal.Budget += festivalItemForMyPageColumn.BudgetAmount @@ -293,15 +295,15 @@ func convertColumnToGenerated(festivalItemForMyPageColumns []domain.FestivalItem buyReports := festivalItemWithReport.BuyReports if buyReports == nil { - var buyReportSlice []generated.BuyReportInformation - buyReports = &buyReportSlice + buyReports = &[]generated.BuyReportInformation{} } - var buyReport BuyReport - buyReport.Id = &festivalItemForMyPageColumn.BuyReportId - buyReport.BuyReportName = &festivalItemForMyPageColumn.PaidBy - buyReport.Amount = &festivalItemForMyPageColumn.ReportAmount - buyReport.ReportDate = &festivalItemForMyPageColumn.ReportDate + buyReport := BuyReport{ + Id: &festivalItemForMyPageColumn.BuyReportId, + BuyReportName: &festivalItemForMyPageColumn.PaidBy, + Amount: &festivalItemForMyPageColumn.ReportAmount, + ReportDate: &festivalItemForMyPageColumn.ReportDate, + } if festivalItemForMyPageColumn.IsSettled { buyReport.Status = &isSettled @@ -311,6 +313,7 @@ func convertColumnToGenerated(festivalItemForMyPageColumns []domain.FestivalItem buyReport.Status = &empty } + // 報告が0以上のみ、buyReportsに追加 if *buyReport.Amount > 0 { *buyReports = append(*buyReports, buyReport) } @@ -323,9 +326,11 @@ func convertColumnToGenerated(festivalItemForMyPageColumns []domain.FestivalItem // divisionのtotalがなければ定義 if festivalItemDetailsForMypage.DivisionTotal == nil { expense, budget, balance := 0, 0, 0 - var total Total - total.Expense, total.Budget, total.Balance = &expense, &budget, &balance - festivalItemDetailsForMypage.DivisionTotal = &total + festivalItemDetailsForMypage.DivisionTotal = &Total{ + Expense: &expense, + Budget: &budget, + Balance: &balance, + } } festivalItemDetailsForMypageMap[festivalItemForMyPageColumn.DivisionName] = festivalItemDetailsForMypage From 9def7bafd8a85be62ed54b4106dd18f0d1a24a4c Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Sun, 2 Feb 2025 19:47:59 +0900 Subject: [PATCH 09/10] =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E5=88=86=E5=B2=90?= =?UTF-8?q?=E3=82=92if=E3=81=AB=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/internals/usecase/festival_item_usecase.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/api/internals/usecase/festival_item_usecase.go b/api/internals/usecase/festival_item_usecase.go index cfd6c572..f0969972 100644 --- a/api/internals/usecase/festival_item_usecase.go +++ b/api/internals/usecase/festival_item_usecase.go @@ -305,11 +305,12 @@ func convertColumnToGenerated(festivalItemForMyPageColumns []domain.FestivalItem ReportDate: &festivalItemForMyPageColumn.ReportDate, } - if festivalItemForMyPageColumn.IsSettled { + switch { + case festivalItemForMyPageColumn.IsSettled: buyReport.Status = &isSettled - } else if festivalItemForMyPageColumn.IsPacked { + case festivalItemForMyPageColumn.IsPacked: buyReport.Status = &isPacked - } else { + default: buyReport.Status = &empty } From e9f3a66337d19e50245bb64bd1017bec876a2b89 Mon Sep 17 00:00:00 2001 From: Kubosaka Date: Sun, 2 Feb 2025 19:58:21 +0900 Subject: [PATCH 10/10] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- api/internals/usecase/festival_item_usecase.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/api/internals/usecase/festival_item_usecase.go b/api/internals/usecase/festival_item_usecase.go index f0969972..6c1e0d0e 100644 --- a/api/internals/usecase/festival_item_usecase.go +++ b/api/internals/usecase/festival_item_usecase.go @@ -261,7 +261,7 @@ type BuyReport = generated.BuyReportInformation func convertColumnToGenerated(festivalItemForMyPageColumns []domain.FestivalItemForMyPageColumn) []FestivalItemDetailsForMypage { var festivalItemDetailsList []FestivalItemDetailsForMypage - // 部門ごとにマップを作成 + // NOTE ColumnsをDetailsListの型に合わせてマッピングする。値が無い場合は初期化する。 var festivalItemDetailsForMypageMap = make(map[string]FestivalItemDetailsForMypage) var festivalItemMaps = make(map[string]map[string]FestivalItemWithReport)