diff --git a/api/externals/controller/buy_report_controller.go b/api/externals/controller/buy_report_controller.go index 9e4c5d7f2..20463b662 100644 --- a/api/externals/controller/buy_report_controller.go +++ b/api/externals/controller/buy_report_controller.go @@ -17,6 +17,8 @@ type BuyReportController interface { CreateBuyReport(echo.Context) error UpdateBuyReport(echo.Context) error DeleteBuyReport(echo.Context) error + IndexBuyReport(echo.Context) error + UpdateBuyReportStatus(echo.Context) error } func NewBuyReportController(u usecase.BuyReportUseCase) BuyReportController { @@ -88,4 +90,36 @@ func (s *buyReportController) DeleteBuyReport(c echo.Context) error { return c.String(http.StatusOK, "buy_report delete success") } +// Index +func (s *buyReportController) IndexBuyReport(c echo.Context) error { + ctx := c.Request().Context() + year := c.QueryParam("year") + + buyReportDetails, err := s.u.GetBuyReports(ctx, year) + if err != nil { + return c.String(http.StatusBadRequest, "failed to buy_reports") + } + + return c.JSON(http.StatusOK, buyReportDetails) +} + +// UpdateStatus +func (s *buyReportController) UpdateBuyReportStatus(c echo.Context) error { + ctx := c.Request().Context() + buyReportId := c.Param("buy_report_id") + var requestBody BuyReportStatusRequestBody + if err := c.Bind(&requestBody); err != nil { + return c.String(http.StatusBadRequest, "Bad Request") + } + + buyReportDetail, err := s.u.UpdateBuyReportStatus(ctx, buyReportId, requestBody) + if err != nil { + return c.String(http.StatusBadRequest, "failed update buy_reports") + } + + return c.JSON(http.StatusOK, buyReportDetail) +} + type BuyReport = generated.BuyReport +type BuyReportDetails = []generated.BuyReportDetail +type BuyReportStatusRequestBody = generated.PutBuyReportStatusBuyReportIdJSONRequestBody diff --git a/api/externals/repository/buy_report_repository.go b/api/externals/repository/buy_report_repository.go index f65245297..88658eeda 100644 --- a/api/externals/repository/buy_report_repository.go +++ b/api/externals/repository/buy_report_repository.go @@ -25,6 +25,9 @@ type BuyReportRepository interface { GetPaymentReceipt(context.Context, *sql.Tx, string) (*sql.Row, error) GetBuyReportById(context.Context, string) (*sql.Row, error) GetYearByBuyReportId(context.Context, *sql.Tx, string) (*sql.Row, error) + AllByPeriod(context.Context, string) (*sql.Rows, error) + GetByBuyReportId(context.Context, string) (*sql.Row, error) + UpdateBuyReportStatus(context.Context, string, PutBuyReport) error } func NewBuyReportRepository(c db.Client, ac abstract.Crud) BuyReportRepository { @@ -202,4 +205,78 @@ func (brr *buyReportRepository) GetYearByBuyReportId( return brr.crud.TransactionReadByID(c, tx, query) } +// 年度に紐づいたdetailsの取得 +func (brr *buyReportRepository) AllByPeriod(c context.Context, year string) (*sql.Rows, error) { + + ds := selectBuyReportDetailsQuery + + if year != "" { + ds = ds.Where(goqu.Ex{"years.year": year}) + } + + query, _, err := ds.ToSQL() + + if err != nil { + return nil, err + } + + return brr.crud.Read(c, query) +} + +func (brr *buyReportRepository) GetByBuyReportId(c context.Context, buyReportId string) (*sql.Row, error) { + + ds := selectBuyReportDetailsQuery.Where(goqu.Ex{"buy_statuses.buy_report_id": buyReportId}) + + query, _, err := ds.ToSQL() + + if err != nil { + return nil, err + } + + return brr.crud.ReadByID(c, query) +} + +func (brr *buyReportRepository) UpdateBuyReportStatus(c context.Context, buyReportId string, requestBody PutBuyReport) error { + + updateDs := dialect.Update("buy_statuses"). + Set(goqu.Record{ + "is_packed": requestBody.IsPacked, + "is_settled": requestBody.IsSettled, + "updated_at": goqu.L("NOW()"), + }). + Where(goqu.Ex{"buy_report_id": buyReportId}) + + query, _, err := updateDs.ToSQL() + if err != nil { + return err + } + + err = brr.crud.UpdateDB(c, query) + if err != nil { + return err + } + + return nil + +} + type PostBuyReport = generated.BuyReport +type PutBuyReport = generated.PutBuyReportStatusBuyReportIdJSONRequestBody + +var selectBuyReportDetailsQuery = dialect.From("buy_reports").Select( + "buy_reports.amount", + "divisions.name", + "festival_items.name", + "financial_records.name", + "buy_reports.id", + "buy_statuses.is_packed", + "buy_statuses.is_settled", + "buy_reports.paid_by", + goqu.I("buy_reports.created_at").As("reportDate"), +). + InnerJoin(goqu.I("buy_statuses"), goqu.On(goqu.I("buy_reports.id").Eq(goqu.I("buy_statuses.buy_report_id")))). + InnerJoin(goqu.I("festival_items"), goqu.On(goqu.I("buy_reports.festival_item_id").Eq(goqu.I("festival_items.id")))). + 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")))). + Order(goqu.I("reportDate").Desc()) diff --git a/api/internals/usecase/buy_report_usecase.go b/api/internals/usecase/buy_report_usecase.go index fc6fcc2b2..fa45bc4d6 100644 --- a/api/internals/usecase/buy_report_usecase.go +++ b/api/internals/usecase/buy_report_usecase.go @@ -10,6 +10,7 @@ import ( rep "github.com/NUTFes/FinanSu/api/externals/repository" "github.com/NUTFes/FinanSu/api/generated" "github.com/NUTFes/FinanSu/api/internals/domain" + "github.com/pkg/errors" ) type buyReportUseCase struct { @@ -22,6 +23,8 @@ type BuyReportUseCase interface { CreateBuyReport(context.Context, PostBuyReport, *multipart.FileHeader) (PostBuyReport, error) UpdateBuyReport(context.Context, string, PostBuyReport, *multipart.FileHeader) (PostBuyReport, error) DeleteBuyReport(context.Context, string) error + GetBuyReports(context.Context, string) ([]BuyReportDetail, error) + UpdateBuyReportStatus(context.Context, string, PutBuyReport) (BuyReportDetail, error) } func NewBuyReportUseCase(bRep rep.BuyReportRepository, tRep rep.TransactionRepository, oRep rep.ObjectHandleRepository) BuyReportUseCase { @@ -240,8 +243,76 @@ func (bru *buyReportUseCase) DeleteBuyReport(c context.Context, buyReportId stri return nil } +func (bru *buyReportUseCase) GetBuyReports(c context.Context, year string) ([]BuyReportDetail, error) { + var buyReportDetails []BuyReportDetail + + rows, err := bru.bRep.AllByPeriod(c, year) + if err != nil { + return []BuyReportDetail{}, nil + } + defer rows.Close() + + for rows.Next() { + detail := BuyReportDetail{} + err := rows.Scan( + &detail.Amount, + &detail.DivisionName, + &detail.FestivalItemName, + &detail.FinancialRecordName, + &detail.Id, + &detail.IsPacked, + &detail.IsSettled, + &detail.PaidBy, + &detail.ReportDate, + ) + + if err != nil { + return nil, errors.Wrapf(err, "failed to scan SQL row") + } + + buyReportDetails = append(buyReportDetails, detail) + } + + return buyReportDetails, nil +} + +func (bru *buyReportUseCase) UpdateBuyReportStatus(c context.Context, buyReportId string, requestBody PutBuyReport) (BuyReportDetail, error) { + + detail := BuyReportDetail{} + + err := bru.bRep.UpdateBuyReportStatus(c, buyReportId, requestBody) + if err != nil { + return BuyReportDetail{}, err + } + + row, err := bru.bRep.GetByBuyReportId(c, buyReportId) + if err != nil { + return BuyReportDetail{}, err + } + + err = row.Scan( + &detail.Amount, + &detail.DivisionName, + &detail.FestivalItemName, + &detail.FinancialRecordName, + &detail.Id, + &detail.IsPacked, + &detail.IsSettled, + &detail.PaidBy, + &detail.ReportDate, + ) + + if err != nil { + return detail, errors.Wrapf(err, "failed to scan SQL row for buy report id %s", buyReportId) + } + + return detail, nil +} + type PostBuyReport = generated.BuyReport type PaymentReceiptWithYear = domain.PaymentReceiptWithYear +type BuyReportDetail = generated.BuyReportDetail +type PutBuyReport = generated.PutBuyReportStatusBuyReportIdJSONRequestBody var DIR_NAME = "receipts" diff --git a/api/router/router.go b/api/router/router.go index 5463bc29a..fde4e8aec 100644 --- a/api/router/router.go +++ b/api/router/router.go @@ -152,6 +152,8 @@ func (r router) ProvideRouter(e *echo.Echo) { e.POST("/buy_reports", r.buyReportController.CreateBuyReport) e.PUT("/buy_reports/:id", r.buyReportController.UpdateBuyReport) e.DELETE("/buy_reports/:id", r.buyReportController.DeleteBuyReport) + e.GET("/buy_reports/details", r.buyReportController.IndexBuyReport) + e.PUT("/buy_report/status/:buy_report_id", r.buyReportController.UpdateBuyReportStatus) // current_user e.GET("/current_user", r.userController.GetCurrentUser)