460 lines
12 KiB
Go
460 lines
12 KiB
Go
package controllers
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"math"
|
|
"net/http"
|
|
"reflect"
|
|
"time"
|
|
|
|
"kemendagri/sipd/services/master-sipd/models"
|
|
"kemendagri/sipd/services/master-sipd/utils"
|
|
|
|
"github.com/jackc/pgx/v5"
|
|
"github.com/jackc/pgx/v5/pgxpool"
|
|
)
|
|
|
|
type ProgramController struct {
|
|
contextTimeout time.Duration
|
|
pgxConn *pgxpool.Pool
|
|
}
|
|
|
|
func NewProgramController(conn *pgxpool.Pool, timeout time.Duration) (controller *ProgramController) {
|
|
controller = &ProgramController{
|
|
pgxConn: conn,
|
|
contextTimeout: timeout,
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func getProgramDetailFields() []string {
|
|
var field []string
|
|
v := reflect.ValueOf(models.MstProgramModel{})
|
|
for i := 0; i < v.Type().NumField(); i++ {
|
|
field = append(field, v.Type().Field(i).Tag.Get("json"))
|
|
}
|
|
|
|
// log.Println("fields: ", field)
|
|
return field
|
|
}
|
|
|
|
// Index lists of Program
|
|
func (c *ProgramController) Index(
|
|
page, limit int,
|
|
filter string,
|
|
) (
|
|
resp []models.MstProgramModel,
|
|
totalCount int,
|
|
pageCount int,
|
|
err error,
|
|
) {
|
|
var q string
|
|
resp = make([]models.MstProgramModel, 0)
|
|
|
|
pageCount = 1
|
|
offset := limit * (page - 1)
|
|
|
|
var filterCond string
|
|
if filter != "" {
|
|
var filterMap map[string]string
|
|
filterMap, err = utils.ValidateAndReturnFilterMap(filter, getProgramDetailFields())
|
|
if err != nil {
|
|
return resp, totalCount, pageCount, err
|
|
}
|
|
// log.Println("filterMap: ", filterMap)
|
|
|
|
var key, val string
|
|
for k, v := range filterMap {
|
|
key = k
|
|
val = v
|
|
}
|
|
|
|
switch key {
|
|
case "nama_urusan":
|
|
filterCond = fmt.Sprintf(" AND mu.%s ILIKE '%s%s%s' ", key, "%", val, "%")
|
|
case "nama_bidang_urusan":
|
|
filterCond = fmt.Sprintf(" AND mbu.%s ILIKE '%s%s%s' ", key, "%", val, "%")
|
|
case "nama_program":
|
|
filterCond = fmt.Sprintf(" AND prg.%s ILIKE '%s%s%s' ", key, "%", val, "%")
|
|
case "kode_urusan":
|
|
filterCond = fmt.Sprintf(" AND mu.%s = '%s' ", key, val)
|
|
case "kode_bidang_urusan":
|
|
filterCond = fmt.Sprintf(" AND mbu.%s = '%s' ", key, val)
|
|
case "kode_program", "tahun":
|
|
filterCond = fmt.Sprintf(" AND prg.%s = '%s' ", key, val)
|
|
case "daerah_khusus", "jenis_pemda":
|
|
filterCond = fmt.Sprintf(" AND '%s' = ANY(prg.%s) ", val, key)
|
|
default:
|
|
filterCond = ""
|
|
}
|
|
}
|
|
|
|
// total data
|
|
q = `SELECT COALESCE(COUNT(prg.id_program), 0)
|
|
FROM "master_data"."mst_program" AS prg
|
|
LEFT JOIN "master_data"."mst_bidang_urusan" AS mbu ON mbu.tahun=prg.tahun AND mbu.id_bidang_urusan=prg.id_bidang_urusan
|
|
LEFT JOIN "master_data"."mst_urusan" AS mu ON mu.tahun=prg.tahun AND mu.id_urusan=prg.id_urusan
|
|
WHERE prg."locked"='f' AND prg."disable"='f' AND prg.deleted_by = 0 AND prg.deleted_at='0001-01-01 00:00:00'` + filterCond
|
|
err = c.pgxConn.QueryRow(context.Background(), q).Scan(&totalCount)
|
|
if err != nil {
|
|
err = utils.RequestError{
|
|
Code: http.StatusInternalServerError,
|
|
Message: "gagal mengambil total data. - " + err.Error(),
|
|
}
|
|
return resp, totalCount, pageCount, err
|
|
}
|
|
|
|
var rows pgx.Rows
|
|
q = `SELECT prg.id_program, prg.id_bidang_urusan, prg.id_urusan, prg.tahun, mu.kode_urusan, mu.nama_urusan
|
|
, mbu.kode_bidang_urusan, mbu.nama_bidang_urusan, prg.kode_program, prg.nama_program
|
|
, prg.locked, prg.disable
|
|
FROM "master_data"."mst_program" AS prg
|
|
LEFT JOIN "master_data"."mst_bidang_urusan" AS mbu ON mbu.tahun=prg.tahun AND mbu.id_bidang_urusan=prg.id_bidang_urusan
|
|
LEFT JOIN "master_data"."mst_urusan" AS mu ON mu.tahun=prg.tahun AND mu.id_urusan=prg.id_urusan
|
|
WHERE prg."locked"='f' AND prg."disable"='f' AND prg.deleted_by = 0 AND prg.deleted_at='0001-01-01 00:00:00' `
|
|
q += filterCond
|
|
q += ` ORDER BY prg.kode_program LIMIT $1 OFFSET $2`
|
|
rows, err = c.pgxConn.Query(context.Background(), q, limit, offset)
|
|
if err != nil {
|
|
err = utils.RequestError{
|
|
Code: http.StatusInternalServerError,
|
|
Message: "gagal mengambil data. - " + err.Error(),
|
|
}
|
|
return resp, totalCount, pageCount, err
|
|
}
|
|
defer rows.Close()
|
|
for rows.Next() {
|
|
var m models.MstProgramModel
|
|
err = rows.Scan(
|
|
&m.IDProgram,
|
|
&m.IDBidangUrusan,
|
|
&m.IDUrusan,
|
|
&m.Tahun,
|
|
&m.KodeUrusan,
|
|
&m.NamaUrusan,
|
|
&m.KodeBidangUrusan,
|
|
&m.NamaBidangUrusan,
|
|
&m.KodeProgram,
|
|
&m.NamaProgram,
|
|
&m.Locked,
|
|
&m.Disable,
|
|
)
|
|
if err != nil {
|
|
err = utils.RequestError{
|
|
Code: http.StatusInternalServerError,
|
|
Message: "gagal iterasi data. - " + rows.Err().Error(),
|
|
}
|
|
return resp, totalCount, pageCount, err
|
|
}
|
|
resp = append(resp, m)
|
|
}
|
|
if rows.Err() != nil {
|
|
err = utils.RequestError{
|
|
Code: http.StatusInternalServerError,
|
|
Message: "gagal mengambil data (rows). - " + rows.Err().Error(),
|
|
}
|
|
return resp, totalCount, pageCount, err
|
|
}
|
|
rows.Close()
|
|
|
|
if totalCount > 0 && totalCount > limit {
|
|
pageCount = int(math.Ceil(float64(totalCount) / float64(limit)))
|
|
}
|
|
|
|
return resp, totalCount, pageCount, err
|
|
}
|
|
|
|
// View detail of Program
|
|
func (c *ProgramController) View(id int, tahun int) (resp models.MstProgramDetilModel, err error) {
|
|
// log.Println("id: ", id)
|
|
q := `SELECT prg.id_program, prg.id_bidang_urusan, prg.id_urusan, prg.tahun, mu.kode_urusan, mu.nama_urusan
|
|
, mbu.kode_bidang_urusan, mbu.nama_bidang_urusan, prg.kode_program, prg.nama_program
|
|
, prg.locked, prg.disable, prg.daerah_khusus, prg.jns_pemda
|
|
, prg.created_at, prg.created_by, prg.updated_at, prg.updated_by, prg.deleted_at, prg.deleted_by
|
|
FROM "master_data"."mst_program" AS prg
|
|
LEFT JOIN "master_data"."mst_bidang_urusan" AS mbu ON mbu.tahun=prg.tahun AND mbu.id_bidang_urusan=prg.id_bidang_urusan
|
|
LEFT JOIN "master_data"."mst_urusan" AS mu ON mu.tahun=prg.tahun AND mu.id_urusan=prg.id_urusan
|
|
WHERE prg."locked"='f' AND prg."disable"='f' AND prg.deleted_by = 0 AND prg.deleted_at='0001-01-01 00:00:00'
|
|
AND prg.id_program=$1 AND prg.tahun=$2`
|
|
|
|
err = c.pgxConn.QueryRow(context.Background(), q, id, tahun).Scan(
|
|
&resp.IDProgram,
|
|
&resp.IDBidangUrusan,
|
|
&resp.IDUrusan,
|
|
&resp.Tahun,
|
|
&resp.KodeUrusan,
|
|
&resp.NamaUrusan,
|
|
&resp.KodeBidangUrusan,
|
|
&resp.NamaBidangUrusan,
|
|
&resp.KodeProgram,
|
|
&resp.NamaProgram,
|
|
&resp.Locked,
|
|
&resp.Disable,
|
|
&resp.DaerahKhusus,
|
|
&resp.JenisPemda,
|
|
&resp.CreatedAt,
|
|
&resp.CreatedBy,
|
|
&resp.UpdatedAt,
|
|
&resp.UpdatedBy,
|
|
&resp.DeletedAt,
|
|
&resp.DeletedBy,
|
|
)
|
|
if err != nil {
|
|
if err.Error() == "no rows in result set" {
|
|
err = utils.RequestError{
|
|
Code: http.StatusNotFound,
|
|
Message: "Data tidak ditemukan",
|
|
}
|
|
} else {
|
|
err = utils.RequestError{
|
|
Code: http.StatusInternalServerError,
|
|
Message: "gagal mengambil data. - " + err.Error(),
|
|
}
|
|
}
|
|
|
|
return resp, err
|
|
}
|
|
|
|
if resp.DeletedBy > 0 && !resp.DeletedAt.IsZero() {
|
|
err = utils.RequestError{
|
|
Code: http.StatusNotFound,
|
|
Message: "Data sudah dihapus.",
|
|
}
|
|
return resp, err
|
|
}
|
|
|
|
return resp, err
|
|
}
|
|
|
|
// Create new daerah
|
|
// func (c *DaerahController) Create(payloadl models.RefDaerahModelPayload) error {
|
|
// var err error
|
|
|
|
// var kodeUnik string
|
|
// kodeUnik = uuid.New().String()
|
|
|
|
// // mulai validasi duplikat unique key
|
|
// var exists bool
|
|
// q := `
|
|
// SELECT EXISTS (
|
|
// SELECT 1
|
|
// FROM "master_data"."mst_daerah"
|
|
// WHERE kode_ddn = $1
|
|
// AND nama_daerah = $2
|
|
// )
|
|
// `
|
|
// err = c.pgxConn.QueryRow(
|
|
// context.Background(),
|
|
// q,
|
|
// payloadl.KodeDdn,
|
|
// payloadl.NamaDaerah,
|
|
// ).Scan(&exists)
|
|
// if err != nil {
|
|
// err = utils.RequestError{
|
|
// Code: http.StatusInternalServerError,
|
|
// Message: "gagal memeriksa duplikasi unique key. - " + err.Error(),
|
|
// }
|
|
// return err
|
|
// }
|
|
// if exists {
|
|
// err = utils.RequestError{
|
|
// Code: http.StatusBadRequest,
|
|
// Message: "Data sudah ada",
|
|
// }
|
|
// return err
|
|
// }
|
|
// // selesai validasi duplikat unique key
|
|
|
|
// q = `
|
|
// INSERT INTO "master_data"."mst_daerah" (
|
|
// id_prov,
|
|
// daerah_khusus,
|
|
// jns_pemda,
|
|
// zona_waktu,
|
|
// zona_wilayah,
|
|
// kode_unik,
|
|
// kode_ddn,
|
|
// nama_daerah,
|
|
// nama_ibu_kota,
|
|
// logo_daerah
|
|
// ) VALUES (
|
|
// $1, -- id
|
|
// $2, -- id_prov
|
|
// $3, -- daerah_khusus
|
|
// $4, -- jns_pemda
|
|
// $5, -- zona_waktu
|
|
// $6, -- zona_wilayah
|
|
// $7, -- kode_unik
|
|
// $8, -- kode_ddn
|
|
// $9, -- nama_daerah
|
|
// $10 -- nama_ibu_kota
|
|
// )
|
|
// `
|
|
// _, err = c.pgxConn.Exec(
|
|
// context.Background(),
|
|
// q,
|
|
// &payloadl.IDProv,
|
|
// &payloadl.DaerahKhusus,
|
|
// &payloadl.JnsPemda,
|
|
// &payloadl.ZonaWaktu,
|
|
// &payloadl.ZonaWilayah,
|
|
// &kodeUnik,
|
|
// &payloadl.KodeDdn,
|
|
// &payloadl.NamaDaerah,
|
|
// &payloadl.NamaIbuKota,
|
|
// &payloadl.LogoDaerah,
|
|
// )
|
|
// if err != nil {
|
|
// err = utils.RequestError{
|
|
// Code: http.StatusInternalServerError,
|
|
// Message: "gagal menyimpan data daerah. - " + err.Error(),
|
|
// }
|
|
// return err
|
|
// }
|
|
|
|
// return err
|
|
// }
|
|
|
|
// // Update daerah
|
|
// func (c *DaerahController) Update(id int, payloadl models.RefDaerahModelPayload) error {
|
|
// var err error
|
|
// var q string
|
|
|
|
// // pastikan data dengan id tersebut ada, dengan cara mengambil datanya.
|
|
// var idDaerah int
|
|
// var kodeDdn, namaDaerah string
|
|
// q = `SELECT id, kode_ddn, nama_daerah FROM "master_data"."mst_daerah" WHERE id_daerah=$1`
|
|
// err = c.pgxConn.QueryRow(context.Background(), q, id).Scan(&idDaerah, &kodeDdn, &namaDaerah)
|
|
// if err != nil {
|
|
// {
|
|
// err = utils.RequestError{
|
|
// Code: http.StatusInternalServerError,
|
|
// Message: "gagal mengambil data daerah. - " + err.Error(),
|
|
// }
|
|
// return err
|
|
// }
|
|
// }
|
|
|
|
// if kodeDdn != payloadl.KodeDdn && namaDaerah != payloadl.NamaDaerah {
|
|
// // mulai validasi duplikat unique key
|
|
// var exists bool
|
|
// q = `
|
|
// SELECT EXISTS (
|
|
// SELECT 1
|
|
// FROM "master_data"."mst_daerah"
|
|
// WHERE kode_ddn = $1
|
|
// AND nama_daerah = $2
|
|
// )
|
|
// `
|
|
// err = c.pgxConn.QueryRow(
|
|
// context.Background(),
|
|
// q,
|
|
// payloadl.KodeDdn,
|
|
// payloadl.NamaDaerah,
|
|
// ).Scan(&exists)
|
|
// if err != nil {
|
|
// err = utils.RequestError{
|
|
// Code: http.StatusInternalServerError,
|
|
// Message: "gagal memeriksa duplikasi unique key. - " + err.Error(),
|
|
// }
|
|
// return err
|
|
// }
|
|
// if exists {
|
|
// err = utils.RequestError{
|
|
// Code: http.StatusBadRequest,
|
|
// Message: "Data sudah ada",
|
|
// }
|
|
// return err
|
|
// }
|
|
// // selesai validasi duplikat unique key
|
|
// }
|
|
|
|
// q = `
|
|
// UPDATE "master_data"."mst_daerah"
|
|
// SET
|
|
// id_prov = $1,
|
|
// daerah_khusus = $2,
|
|
// jns_pemda = $3,
|
|
// zona_waktu = $4,
|
|
// zona_wilayah = $5,
|
|
// nama_daerah = $6,
|
|
// nama_ibu_kota = $7,
|
|
// logo_daerah = $8,
|
|
// updated_at = NOW()
|
|
// WHERE id = $9
|
|
// `
|
|
// _, err = c.pgxConn.Exec(
|
|
// context.Background(),
|
|
// q,
|
|
// payloadl.IDProv,
|
|
// payloadl.DaerahKhusus,
|
|
// payloadl.JnsPemda,
|
|
// payloadl.ZonaWaktu,
|
|
// payloadl.ZonaWilayah,
|
|
// payloadl.NamaDaerah,
|
|
// payloadl.NamaIbuKota,
|
|
// payloadl.LogoDaerah,
|
|
// id, // kondisi WHERE
|
|
// )
|
|
// if err != nil {
|
|
// err = utils.RequestError{
|
|
// Code: http.StatusInternalServerError,
|
|
// Message: "gagal mengupdate data daerah. - " + err.Error(),
|
|
// }
|
|
// return err
|
|
// }
|
|
|
|
// return err
|
|
// }
|
|
|
|
// func (c *DaerahController) Delete(id int) error {
|
|
// var err error
|
|
// var idDaerah, deletedBy int
|
|
// var deletedAt time.Time
|
|
|
|
// q := `SELECT id, deleted_by, deleted_at FROM "master_data"."mst_daerah" WHERE id_daerah=$1`
|
|
// err = c.pgxConn.QueryRow(context.Background(), q, id).Scan(&idDaerah, &deletedBy, &deletedAt)
|
|
// if err != nil {
|
|
// {
|
|
// err = utils.RequestError{
|
|
// Code: http.StatusInternalServerError,
|
|
// Message: "gagal mengambil data daerah. - " + err.Error(),
|
|
// }
|
|
// return err
|
|
// }
|
|
// }
|
|
|
|
// if deletedBy != 0 {
|
|
// err = utils.RequestError{
|
|
// Code: http.StatusBadRequest,
|
|
// Message: "data sudah dihapus",
|
|
// }
|
|
// return err
|
|
// }
|
|
|
|
// q = `
|
|
// UPDATE "master_data"."mst_daerah"
|
|
// SET
|
|
// deleted_by = $1,
|
|
// deleted_at = NOW()
|
|
// WHERE id = $2
|
|
// `
|
|
// _, err = c.pgxConn.Exec(
|
|
// context.Background(),
|
|
// q,
|
|
// id,
|
|
// id,
|
|
// )
|
|
// if err != nil {
|
|
// err = utils.RequestError{
|
|
// Code: http.StatusInternalServerError,
|
|
// Message: "gagal menghapus data daerah. - " + err.Error(),
|
|
// }
|
|
// return err
|
|
// }
|
|
|
|
// return err
|
|
// }
|