release version

This commit is contained in:
2025-10-08 08:26:22 +07:00
parent fc2d9292c2
commit 8094de70cc
61 changed files with 3879 additions and 3395 deletions

View File

@@ -1,13 +1,13 @@
package corporate_services
import (
"bytes"
"cpone/db"
"cpone/models"
"cpone/package/config"
"encoding/json"
"io"
"net/http"
"net/url"
)
type AccountService struct {
@@ -25,12 +25,14 @@ func (as *AccountService) ChangePasswordPIC(host string, token string, currPassw
uri := "https://" + config.Data.Get("servername") + "/one-api/mockup/system/menu/change_password_pic"
params := url.Values{}
params.Add("new", newPassword)
params.Add("old", currPassword)
params.Add("token", token)
params, _ := json.Marshal(map[string]string{
"new": newPassword,
"old": currPassword,
"token": token,
})
paramsBody := bytes.NewBuffer(params)
req, err := http.PostForm(uri, params)
req, err := http.Post(uri, "application/json", paramsBody)
if err != nil {
ret = models.ResponseStatus{
Status: "ERR",
@@ -66,12 +68,29 @@ func (as *AccountService) ChangePasswordPAT(token string, currPassword string, n
uri := "https://" + config.Data.Get("servername") + "/one-api/mockup/system/menu/change_password_pat"
params := url.Values{}
params.Add("new", newPassword)
params.Add("old", currPassword)
params.Add("token", token)
// params := url.Values{}
// params.Add("new", newPassword)
// params.Add("old", currPassword)
// params.Add("token", token)
req, err := http.PostForm(uri, params)
// req, err := http.PostForm(uri, params)
// if err != nil {
// ret = models.ResponseStatus{
// Status: "ERR",
// Message: "error request change password",
// }
// return ret, err
// }
// defer req.Body.Close()
params, _ := json.Marshal(map[string]string{
"new": newPassword,
"old": currPassword,
"token": token,
})
paramsBody := bytes.NewBuffer(params)
req, err := http.Post(uri, "application/json", paramsBody)
if err != nil {
ret = models.ResponseStatus{
Status: "ERR",

View File

@@ -107,17 +107,7 @@ func (ea *DashboardPicServices) ListingDashboardPic(email string, search string,
prmLabel := "%" + search + "%"
offset := (currentpage - 1) * rowperpage
// q := `
// SELECT COUNT(*)
// FROM mgm_mcu
// WHERE Mgm_McuIsActive = 'Y'
// AND Mgm_McuLabel LIKE ?
// AND Mgm_McuStartDate >= ?
// AND Mgm_McuEndDate <= ?
// `
// if err := dbx.Handlex.Get(&totalData, q, prmLabel, startdate, enddate); err != nil {
// return nil, 0, fmt.Errorf("error query get total data: %v", err)
// }
logger.Info("Params", zap.Any("email", email))
q := `
SELECT

View File

@@ -6,12 +6,13 @@ import (
"cpone/models"
"cpone/package/config"
dbx "cpone/package/database"
"database/sql"
"encoding/json"
"errors"
"fmt"
"io"
"math"
"net/http"
"net/url"
"strconv"
"go.uber.org/zap"
@@ -60,7 +61,7 @@ func (tdps *TabDaftarPesertaServices) GetListDaftarPesertaMCU(id string, current
WHEN M_PatientGender = 'female' THEN 'Perempuan'
ELSE ' '
END AS jenisKelamin,
M_PatientDOB,
DATE_FORMAT(M_PatientDOB, '%d %M %Y') AS M_PatientDOB,
FLOOR(DATEDIFF(CURDATE(), M_PatientDOB)/ 365.25) AS age,
IFNULL(authPatientEmail, "none") AS authPatientEmail,
IFNULL(authPatientIsActive, "N") AS authPatientIsActive,
@@ -88,6 +89,98 @@ func (tdps *TabDaftarPesertaServices) GetListDaftarPesertaMCU(id string, current
return listDaftarPeserta, totalPage, nil
}
func (tdps *TabDaftarPesertaServices) SearchDaftarPesertaMCU(mcuID string, keyword string, page int, perPage int) ([]models.ModelMcuDaftarPeserta, int, error) {
var listDaftarPeserta []models.ModelMcuDaftarPeserta
var totalData int
prmWord := "%" + keyword + "%"
offset := (page - 1) * perPage
sqlt := `
SELECT COUNT(*) as total
FROM (
SELECT
T_OrderHeaderID,
T_OrderHeaderDate,
IFNULL(T_OrderHeaderLabNumber, 0) AS T_OrderHeaderLabNumber,
T_OrderHeaderM_PatientAge,
M_PatientID,
M_PatientNoReg,
M_PatientName,
M_PatientGender,
CASE
WHEN M_PatientGender = 'male' THEN 'Laki - Laki'
WHEN M_PatientGender = 'female' THEN 'Perempuan'
ELSE ' '
END AS jenisKelamin,
DATE_FORMAT(M_PatientDOB, '%d %M %Y') AS M_PatientDOB,
FLOOR(DATEDIFF(CURDATE(), M_PatientDOB)/ 365.25) AS age,
IFNULL(authPatientEmail, "none") AS authPatientEmail,
IFNULL(authPatientIsActive, "N") AS authPatientIsActive,
CASE
WHEN T_OrderDetailOrderIsPacket = 'Y' THEN T_OrderDetailOrderT_PacketName
ELSE T_OrderDetailOrderT_TestName
END AS test_paket
FROM t_orderheader
JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y'
JOIN t_orderdetailorder ON T_OrderDetailOrderT_OrderHeaderID = T_OrderHeaderID
AND T_OrderDetailOrderIsActive = 'Y'
LEFT JOIN auth_patient ON M_PatientID = authPatientM_PatientID AND authPatientIsActive = 'Y'
WHERE T_OrderHeaderIsActive = 'Y' AND T_OrderHeaderMgm_McuID = ? AND (M_PatientName LIKE ? OR M_PatientNIP LIKE ?)
GROUP BY T_OrderHeaderID
)x
`
if err := dbx.Handlex.Get(&totalData, sqlt, mcuID, prmWord, prmWord); err != nil {
return listDaftarPeserta, 0, fmt.Errorf("error querying database: %v", err)
}
sql := `
SELECT *,
GROUP_CONCAT(test_paket) as list_paket
FROM (
SELECT
T_OrderHeaderID,
T_OrderHeaderDate,
IFNULL(T_OrderHeaderLabNumber, 0) AS T_OrderHeaderLabNumber,
T_OrderHeaderM_PatientAge,
M_PatientID,
M_PatientNoReg,
M_PatientName,
M_PatientGender,
CASE
WHEN M_PatientGender = 'male' THEN 'Laki - Laki'
WHEN M_PatientGender = 'female' THEN 'Perempuan'
ELSE ' '
END AS jenisKelamin,
DATE_FORMAT(M_PatientDOB, '%d %M %Y') AS M_PatientDOB,
FLOOR(DATEDIFF(CURDATE(), M_PatientDOB)/ 365.25) AS age,
IFNULL(authPatientEmail, "none") AS authPatientEmail,
IFNULL(authPatientIsActive, "N") AS authPatientIsActive,
CASE
WHEN T_OrderDetailOrderIsPacket = 'Y' THEN T_OrderDetailOrderT_PacketName
ELSE T_OrderDetailOrderT_TestName
END AS test_paket
FROM t_orderheader
JOIN m_patient ON T_OrderHeaderM_PatientID = M_PatientID AND M_PatientIsActive = 'Y'
JOIN t_orderdetailorder ON T_OrderDetailOrderT_OrderHeaderID = T_OrderHeaderID
AND T_OrderDetailOrderIsActive = 'Y'
LEFT JOIN auth_patient ON M_PatientID = authPatientM_PatientID AND authPatientIsActive = 'Y'
WHERE T_OrderHeaderIsActive = 'Y' AND T_OrderHeaderMgm_McuID = ?
AND (M_PatientName LIKE ? OR M_PatientNIP LIKE ?)
) x
GROUP BY T_OrderHeaderID
ORDER BY T_OrderHeaderLabNumber ASC
LIMIT ? OFFSET ?
`
if err := dbx.Handlex.Select(&listDaftarPeserta, sql, mcuID, prmWord, prmWord, perPage, offset); err != nil {
return listDaftarPeserta, 0, fmt.Errorf("error querying database: %v", err)
}
totalPage := int(math.Ceil(float64(totalData) / float64(perPage)))
return listDaftarPeserta, totalPage, nil
}
func (tdps *TabDaftarPesertaServices) DetailTestdanPaket(orderheaderID string) ([]models.TableTestPaket, error) {
var listPaket []models.DetailPaketMCU
var listTest []models.DetailTestMCU
@@ -109,14 +202,15 @@ func (tdps *TabDaftarPesertaServices) DetailTestdanPaket(orderheaderID string) (
// get detail paket
q := `
SELECT
SELECT DISTINCT
T_OrderDetailOrderT_PacketID,
T_OrderDetailOrderT_PacketName,
T_TestName
FROM t_orderdetailorder
JOIN t_packetdetail ON T_PacketDetailT_PacketID = T_OrderDetailOrderT_PacketID AND T_PacketDetailIsActive = 'Y'
JOIN t_test ON T_TestName = T_PacketDetailT_TestID AND T_TestIsActive = 'Y'
WHERE T_OrderDetailOrderT_OrderHeaderID = ? AND T_OrderDetailOrderIsActive = 'Y'
JOIN t_packet ON T_PacketID = T_OrderDetailOrderT_PacketID
JOIN t_packetdetail ON T_PacketDetailT_PacketID = T_PacketID
JOIN t_test ON T_PacketDetailT_TestID = T_TestID
WHERE T_OrderDetailOrderT_OrderHeaderID = ?
`
if err := dbx.Handlex.Select(&listPaket, q, orderheaderID); err != nil {
return ret, err
@@ -198,13 +292,15 @@ func (tdps *TabDaftarPesertaServices) ResetPasswordPeserta(token string, newPass
uri := "https://" + config.Data.Get("servername") + "/one-api/mockup/system/menu/reset_password_pat"
params := url.Values{}
params.Add("new", newPassword)
params.Add("email", email)
params.Add("authuserid", authuserid)
params.Add("token", token)
params, _ := json.Marshal(map[string]string{
"new": newPassword,
"email": email,
"authuserid": authuserid,
"token": token,
})
paramsBody := bytes.NewBuffer(params)
req, err := http.PostForm(uri, params)
resp, err := http.Post(uri, "application/json", paramsBody)
if err != nil {
ret = models.ResponseStatus{
Status: "ERR",
@@ -212,9 +308,9 @@ func (tdps *TabDaftarPesertaServices) ResetPasswordPeserta(token string, newPass
}
return ret, err
}
defer req.Body.Close()
defer resp.Body.Close()
resp, err := io.ReadAll(req.Body)
body, err := io.ReadAll(resp.Body)
if err != nil {
ret = models.ResponseStatus{
Status: "ERR",
@@ -223,7 +319,7 @@ func (tdps *TabDaftarPesertaServices) ResetPasswordPeserta(token string, newPass
return ret, err
}
err = json.Unmarshal(resp, &ret)
err = json.Unmarshal(body, &ret)
if err != nil {
ret = models.ResponseStatus{
Status: "ERR",
@@ -235,106 +331,6 @@ func (tdps *TabDaftarPesertaServices) ResetPasswordPeserta(token string, newPass
return ret, nil
}
func (tdps *TabDaftarPesertaServices) GetListReportPesertaV2(orderheaderID string, host string) ([]models.TabViewReportMcu, error) {
var returnTabRpt []models.TabViewReportMcu
var SoResultData []models.SoResultEntryReportModel
q := `
SELECT
So_ResultEntryID,
So_ResultEntryT_OrderHeaderID,
So_ResultEntryNonlab_TemplateID,
So_ResultEntryNonlab_TemplateName,
DATE_FORMAT(NOW(), '%y%m%d%H%i%s') AS Datetime
FROM so_resultentry
WHERE So_ResultEntryT_OrderHeaderID = ?
AND So_ResultEntryIsActive = 'Y'
ORDER BY So_ResultEntryNonlab_TemplateID
`
if err := dbx.Handlex.Select(&SoResultData, q, orderheaderID); err != nil {
return returnTabRpt, fmt.Errorf("error get so result data non lab: %v", err)
}
mapSoResult := map[string]int{}
for _, so := range SoResultData {
switch so.So_ResultEntryNonlab_TemplateName {
case "ECG":
mapSoResult["Elektromedik"] = so.So_ResultEntryID
case "Thorax PA":
mapSoResult["Radiologi"] = so.So_ResultEntryID
case "Fisik Umum", "Fisik Umum K3":
mapSoResult["Fisik"] = so.So_ResultEntryID
default:
mapSoResult[so.So_ResultEntryNonlab_TemplateName] = so.So_ResultEntryID
}
}
var GroupResultOrder []models.GroupResultOrderModel
q = `
SELECT
gr.Group_ResultID,
gr.Group_ResultName,
gr.Group_ResultResumeMcu,
gr.Group_ResultUrl,
gr.Group_ResultIsOrderHeader,
gro.Group_ResultOrderOrder,
DATE_FORMAT(NOW(), '%y%m%d%H%i%s') AS Datetime
FROM t_orderdetail todtl
JOIN t_test tt ON todtl.T_OrderDetailT_TestID = tt.T_TestID
AND tt.T_TestIsActive = 'Y'
JOIN group_resultdetail grd ON tt.T_TestID = grd.Group_ResultDetailT_TestID
AND grd.Group_ResultDetailIsActive = 'Y'
JOIN group_result gr ON grd.Group_ResultDetailGroup_ResultID = gr.Group_ResultID
AND gr.Group_ResultIsActive = 'Y'
JOIN group_resultorder gro ON gro.Group_ResultOrderGroup_ResultID = gr.Group_ResultID
AND Group_ResultOrderIsActive = 'Y'
WHERE todtl.T_OrderDetailT_OrderHeaderID = ?
AND todtl.T_OrderDetailIsActive = 'Y'
GROUP BY gr.Group_ResultID
ORDER BY gro.Group_ResultOrderOrder
`
if err := dbx.Handlex.Select(&GroupResultOrder, q, orderheaderID); err != nil {
return returnTabRpt, fmt.Errorf("error get group result order: %v", err)
}
for _, d := range GroupResultOrder {
var urlMap map[string]string
if err := json.Unmarshal([]byte(d.Group_ResultUrl), &urlMap); err != nil {
return returnTabRpt, fmt.Errorf("error parsing json: %v", err)
}
if d.Group_ResultIsOrderHeader == "N" {
if d.Group_ResultResumeMcu == "FISIK" {
soResultID := strconv.Itoa(mapSoResult["Fisik"])
for key, value := range urlMap {
returnTabRpt = append(returnTabRpt, models.TabViewReportMcu{
Name: key,
Link: value + soResultID + "&tm=" + d.Datetime,
})
}
}
if d.Group_ResultResumeMcu == "NONLAB" {
soResultID := strconv.Itoa(mapSoResult[d.Group_ResultName])
for key, value := range urlMap {
returnTabRpt = append(returnTabRpt, models.TabViewReportMcu{
Name: key,
Link: value + soResultID + "&tm=" + d.Datetime,
})
}
}
} else {
for _, value := range urlMap {
returnTabRpt = append(returnTabRpt, models.TabViewReportMcu{
Name: d.Group_ResultName,
Link: value + orderheaderID + "&tm=" + d.Datetime,
})
}
}
}
return returnTabRpt, nil
}
func (tdps *TabDaftarPesertaServices) GetListReportPesertaV3(orderheaderID string, staffname string) ([]models.TabViewReportMcu, error) {
var returnTab []models.TabViewReportMcu
var GroupResultOrder []models.GroupResultOrderModel
@@ -449,11 +445,10 @@ func (tdps *TabDaftarPesertaServices) GetListReportPesertaV3(orderheaderID strin
func (tdps *TabDaftarPesertaServices) GetListReportPesertaV4(orderheaderID string, staffname string) ([]models.TabViewReportMcu, error) {
var returnTab []models.TabViewReportMcu
var profile_patient models.PatientMCU
lab_rpt := ""
sql := `
sql_prof := `
SELECT
toh.T_OrderHeaderID,
toh.T_OrderHeaderLabNumber,
@@ -465,8 +460,12 @@ func (tdps *TabDaftarPesertaServices) GetListReportPesertaV4(orderheaderID strin
AND mp.M_PatientIsActive = 'Y'
WHERE toh.T_OrderHeaderID = ? AND toh.T_OrderHeaderIsActive = 'Y'
`
if err := dbx.Handlex.Get(&profile_patient, sql, orderheaderID); err != nil {
return returnTab, fmt.Errorf("error get group result order: %v", err)
if err := dbx.Handlex.Get(&profile_patient, sql_prof, orderheaderID); err != nil {
if errors.Is(err, sql.ErrNoRows) {
profile_patient = models.PatientMCU{}
} else {
return returnTab, fmt.Errorf("error get group result order: %v", err)
}
}
if profile_patient.T_OrderHeaderLabNumber != "" {
lab_rpt = "/birt/frameset?__report=report/one/lab/rpt_test_portal.rptdesign&__format=pdf&PID=" + profile_patient.T_OrderHeaderID + "&tm=" + profile_patient.Datetime + "&username=" + staffname
@@ -526,13 +525,18 @@ func (tdps *TabDaftarPesertaServices) GetListReportPesertaV4(orderheaderID strin
T_OrderDetailT_OrderHeaderID = ? AND Group_ResultName <> 'Tanpa Hasil'
`
if err := dbx.Handlex.Select(&so_data_rpt, sql_rpt, orderheaderID, orderheaderID, orderheaderID); err != nil {
return returnTab, fmt.Errorf("error get data so_id: %v", err)
if errors.Is(err, sql.ErrNoRows) {
so_data_rpt = []models.SoRptData{}
} else {
return returnTab, fmt.Errorf("error get data so_id: %v", err)
}
}
for _, d := range so_data_rpt {
switch d.Rpt_name {
case "Pemeriksaan Fisik":
fisik = "/birt/frameset?__report=report/one/mcu/mcu_fisik_history_v2_portal.rptdesign&__format=pdf&PType=fisik&PLang=1&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
// fisik = "/birt/run?__report=report/one/mcu/mcu_fisik_history_v2_portal.rptdesign&__format=pdf&PType=fisik&PLang=1&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "Rontgen":
rontgen = "/birt/frameset?__report=report/one/lab/rpt_hasil_so_xray_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "Audiometri":
@@ -561,7 +565,11 @@ func (tdps *TabDaftarPesertaServices) GetListReportPesertaV4(orderheaderID strin
AND Mcu_ResumeIsActive = 'Y' AND Mcu_ResumeStatus = 'VAL'
`
if err := dbx.Handlex.Get(&ResumeData, sql_resume, orderheaderID); err != nil {
return returnTab, fmt.Errorf("error get data resume id: %v", err)
if errors.Is(err, sql.ErrNoRows) {
ResumeData = models.ResumeMCU{}
} else {
return returnTab, fmt.Errorf("error get data resume id: %v", err)
}
}
if ResumeData.Mcu_ResumeID != "" {
@@ -599,3 +607,316 @@ func (tdps *TabDaftarPesertaServices) GetListReportPesertaV4(orderheaderID strin
return returnTab, nil
}
func (tdps *TabDaftarPesertaServices) GetListReportPesertaV5(orderheaderID string, mcuid string, staffname string) ([]models.TabViewReportMcu, error) {
var returnTab []models.TabViewReportMcu
var profile_patient models.PatientMCU
var tahunan_mcu int
sqlmgm := `
SELECT Mgm_McuReportHasil
FROM mgm_mcu
WHERE Mgm_McuID = ?
`
if err := dbx.Handlex.Get(&tahunan_mcu, sqlmgm, mcuid); err != nil {
if errors.Is(err, sql.ErrNoRows) {
tahunan_mcu = 1
} else {
return returnTab, fmt.Errorf("error get type tahunan mcur: %v", err)
}
}
lab_rpt := ""
sql_prof := `
SELECT
toh.T_OrderHeaderID,
toh.T_OrderHeaderLabNumber,
mp.M_PatientID,
mp.M_PatientName,
DATE_FORMAT(NOW(), '%y%m%d%H%i%s') AS Datetime
FROM t_orderheader toh
JOIN m_patient mp ON toh.T_OrderHeaderM_PatientID = mp.M_PatientID
AND mp.M_PatientIsActive = 'Y'
WHERE toh.T_OrderHeaderID = ? AND toh.T_OrderHeaderIsActive = 'Y'
`
if err := dbx.Handlex.Get(&profile_patient, sql_prof, orderheaderID); err != nil {
if errors.Is(err, sql.ErrNoRows) {
profile_patient = models.PatientMCU{}
} else {
return returnTab, fmt.Errorf("error get group result order: %v", err)
}
}
if profile_patient.T_OrderHeaderLabNumber != "" {
if tahunan_mcu != 1 {
lab_rpt = "/birt/frameset?__report=report/one/lab/rpt_test_history_portal.rptdesign&__format=pdf&PID=" + profile_patient.T_OrderHeaderID + "&tm=" + profile_patient.Datetime + "&username=" + staffname
} else {
lab_rpt = "/birt/frameset?__report=report/one/lab/rpt_test_portal.rptdesign&__format=pdf&PID=" + profile_patient.T_OrderHeaderID + "&tm=" + profile_patient.Datetime + "&username=" + staffname
}
}
var so_data_rpt []models.SoRptData
fisik := ""
rontgen := ""
ekg := ""
audiometri := ""
spirometri := ""
treadmill := ""
papsmear := ""
mikro := ""
usg := ""
sds := ""
sql_rpt := `
SELECT DISTINCT group_resultName as rpt_name,
IFNULL(So_ResultEntryID,0) as so_id,
T_OrderDetailT_OrderHeaderID as order_id,
DATE_FORMAT(NOW(), '%y%m%d%H%i%s') AS Datetime
FROM t_orderdetail
JOIN t_test ON T_OrderDetailT_TestID = T_TestID
JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_TestID
JOIN group_result ON Group_ResultID = Group_ResultDetailGroup_ResultID AND
Group_ResultFlagPerTest = 'N' AND Group_ResultName <> 'LAB' AND Group_ResultFlagNonLab = 'N'
LEFT JOIN so_resultentry ON So_ResultEntryT_OrderDetailID = T_OrderDetailID AND So_ResultEntryIsActive = 'Y'
WHERE
T_OrderDetailT_OrderHeaderID = ? AND Group_ResultName <> 'Tanpa Hasil'
UNION
SELECT DISTINCT group_resultName as rpt_name,
IFNULL(So_ResultEntryID,0) as so_id,
T_OrderDetailT_OrderHeaderID as order_id,
DATE_FORMAT(NOW(), '%y%m%d%H%i%s') AS Datetime
FROM t_orderdetail
JOIN t_test ON T_OrderDetailT_TestID = T_TestID
JOIN t_samplingso ON T_SamplingSoT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND
T_SamplingSoT_TestID = T_TestID
JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_TestID
JOIN group_result ON Group_ResultID = Group_ResultDetailGroup_ResultID AND
Group_ResultFlagPerTest = 'N' AND Group_ResultName <> 'LAB' AND Group_ResultFlagNonLab = 'Y'
LEFT JOIN so_resultentry ON So_ResultEntryT_OrderDetailID = T_OrderDetailID AND So_ResultEntryIsActive = 'Y'
WHERE
T_OrderDetailT_OrderHeaderID = ? AND Group_ResultName <> 'Tanpa Hasil'
UNION
SELECT DISTINCT T_TestName as rpt_name,
IFNULL(So_ResultEntryID,0) as so_id,
T_OrderDetailT_OrderHeaderID as order_id,
DATE_FORMAT(NOW(), '%y%m%d%H%i%s') AS Datetime
FROM t_orderdetail
JOIN t_test ON T_OrderDetailT_TestID = T_TestID AND T_TestName NOT IN ('Visus Mata','Buta Warna','Pemeriksaan Lapang Pandang')
JOIN t_samplingso ON T_SamplingSoT_OrderHeaderID = T_OrderDetailT_OrderHeaderID AND
T_SamplingSoT_TestID = T_TestID
JOIN group_resultdetail ON Group_ResultDetailT_TestID = T_TestID
JOIN group_result ON Group_ResultID = Group_ResultDetailGroup_ResultID AND
Group_ResultFlagPerTest = 'Y' AND Group_ResultFlagNonLab = 'Y'
LEFT JOIN so_resultentry ON So_ResultEntryT_OrderDetailID = T_OrderDetailID AND So_ResultEntryIsActive = 'Y'
WHERE
T_OrderDetailT_OrderHeaderID = ? AND Group_ResultName <> 'Tanpa Hasil'
`
if err := dbx.Handlex.Select(&so_data_rpt, sql_rpt, orderheaderID, orderheaderID, orderheaderID); err != nil {
if errors.Is(err, sql.ErrNoRows) {
so_data_rpt = []models.SoRptData{}
} else {
return returnTab, fmt.Errorf("error get data so_id: %v", err)
}
}
for _, d := range so_data_rpt {
if tahunan_mcu != 1 {
switch d.Rpt_name {
case "Pemeriksaan Fisik":
// fisik = "/birt/frameset?__report=report/one/mcu/mcu_fisik_history_portal.rptdesign&__format=pdf&PType=fisik&PLang=1&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
fisik = "/birt/run?__report=report/one/mcu/mcu_fisik_history_portal.rptdesign&__format=pdf&PType=fisik&PLang=1&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "Rontgen":
rontgen = "/birt/frameset?__report=report/one/lab/rpt_hasil_so_radiology_2_annual_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "Audiometri":
audiometri = "/birt/frameset?__report=report/one/lab/rpt_hasil_so_audiometri_2_annual_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "Spirometri":
spirometri = "/birt/frameset?__report=report/one/lab/rpt_hasil_so_spirometri_2_annual_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "ECG":
ekg = "/birt/frameset?__report=report/one/lab/rpt_hasil_so_ecg_2_annual_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "Treadmill":
treadmill = "/birt/frameset?__report=report/one/lab/rpt_hasil_so_treadmill_2_annual_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "Papsmear":
papsmear = "/birt/frameset?__report=report/one/lab/rpt_test_papsmear_history_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.Order_id + "&tm=" + d.Datetime
case "Mikro":
mikro = "/birt/run?__report=report/one/lab/rpt_test_mikro_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.Order_id + "&tm=" + d.Datetime
case "USG", "USG Abdominal Aorta", "USG Upp & Low Abdomen":
usg = "/birt/run?__report=report/one/lab/rpt_hasil_so_usg_2_annual_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "SDS":
if d.So_id != "0" {
tipval := ""
tpe := `SELECT So_ResultEntrySDSTypeValue as tipval
FROM so_resultentrysds_type WHERE So_ResultEntrySDSTypeSo_ResultEntryID = ?
AND So_ResultEntrySDSTypeIsActive = 'Y' LIMIT 1`
if err := dbx.Handlex.Get(&tipval, tpe, d.So_id); err != nil {
if errors.Is(err, sql.ErrNoRows) {
} else {
return returnTab, fmt.Errorf("error get sds type value : %v", err)
}
}
if tipval != "" {
sds = "/birt/run?__report=report/one/lab/rpt_hasil_so_sds.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&PType=" + tipval + "&tm=" + d.Datetime
}
}
}
} else {
switch d.Rpt_name {
case "Pemeriksaan Fisik":
// fisik = "/birt/frameset?__report=report/one/mcu/mcu_fisik_history_v2_portal.rptdesign&__format=pdf&PType=fisik&PLang=1&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
fisik = "/birt/run?__report=report/one/mcu/mcu_fisik_history_v2_portal.rptdesign&__format=pdf&PType=fisik&PLang=1&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "Rontgen":
rontgen = "/birt/frameset?__report=report/one/lab/rpt_hasil_so_xray_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "Audiometri":
audiometri = "/birt/frameset?__report=report/one/lab/rpt_hasil_so_audiometri_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "Spirometri":
spirometri = "/birt/frameset?__report=report/one/lab/rpt_hasil_so_spirometri_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "ECG":
ekg = "/birt/frameset?__report=report/one/lab/rpt_hasil_so_ecg_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "Treadmill":
treadmill = "/birt/frameset?__report=report/one/lab/rpt_hasil_so_treadmill_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "Papsmear":
papsmear = "/birt/frameset?__report=report/one/lab/rpt_test_papsmear_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.Order_id + "&tm=" + d.Datetime
case "Mikro":
mikro = "/birt/run?__report=report/one/lab/rpt_test_mikro_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.Order_id + "&tm=" + d.Datetime
case "USG", "USG Abdominal Aorta", "USG Upp & Low Abdomen":
usg = "/birt/run?__report=report/one/lab/rpt_hasil_so_usg_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "SDS":
if d.So_id != "0" {
tipval := ""
tpe := `SELECT So_ResultEntrySDSTypeValue as tipval
FROM so_resultentrysds_type WHERE So_ResultEntrySDSTypeSo_ResultEntryID = ?
AND So_ResultEntrySDSTypeIsActive = 'Y' LIMIT 1`
if err := dbx.Handlex.Get(&tipval, tpe, d.So_id); err != nil {
if errors.Is(err, sql.ErrNoRows) {
} else {
return returnTab, fmt.Errorf("error get sds type value : %v", err)
}
}
if tipval != "" {
sds = "/birt/run?__report=report/one/lab/rpt_hasil_so_sds_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&PType=" + tipval + "&tm=" + d.Datetime
}
}
}
}
}
var ResumeData models.ResumeMCU
kesimpulan := ""
// cover := ""
sql_resume := `
SELECT
Mcu_ResumeID,
DATE_FORMAT(NOW(), '%y%m%d%H%i%s') AS Datetime
FROM mcu_resume
WHERE Mcu_ResumeT_OrderHeaderID = ?
AND Mcu_ResumeIsActive = 'Y' AND Mcu_ResumeStatus = 'VAL'
`
if err := dbx.Handlex.Get(&ResumeData, sql_resume, orderheaderID); err != nil {
if errors.Is(err, sql.ErrNoRows) {
ResumeData = models.ResumeMCU{}
} else {
return returnTab, fmt.Errorf("error get data resume id: %v", err)
}
}
if ResumeData.Mcu_ResumeID != "" {
if tahunan_mcu != 1 {
kesimpulan = "/birt/frameset?__report=report/one/mcu/rpt_mcu_saran_kesimpulan_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + ResumeData.Mcu_ResumeID + "&tm=" + ResumeData.Datetime
} else {
kesimpulan = "/birt/frameset?__report=report/one/mcu/rpt_mcu_saran_kesimpulan_v2_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + ResumeData.Mcu_ResumeID + "&tm=" + ResumeData.Datetime
}
// cover = "/birt/frameset?__report=report/one/mcu/rpt_mcu_resume_cover_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + ResumeData.Mcu_ResumeID + "&tm=" + ResumeData.Datetime
}
additional := ""
if fisik == "" {
id_add := ""
sql_additional := `SELECT So_ResultEntryID FROM t_orderdetail
JOIN so_resultentry ON So_ResultEntryT_OrderDetailID = T_OrderDetailID AND So_ResultEntryIsActive = 'Y'
WHERE T_OrderDetailT_OrderHeaderID = ? AND T_OrderDetailIsActive = 'Y' AND T_OrderDetailT_TestID IN (2571,2573,3450,2572) LIMIT 1`
if err := dbx.Handlex.Get(&id_add, sql_additional, orderheaderID); err != nil {
if errors.Is(err, sql.ErrNoRows) {
} else {
return returnTab, fmt.Errorf("error get additional rpt: %v", err)
}
}
if id_add != "" {
if tahunan_mcu != 1 {
additional = "/birt/run?__report=report/one/mcu/mcu_fisik_ttbbmata_history_portal.rptdesign&__format=pdf&username=" + staffname + "&PType=fisik&PID=" + id_add + "&PLang=1&tm="
} else {
additional = "/birt/run?__report=report/one/mcu/mcu_fisik_ttbbmata_portal.rptdesign&__format=pdf&username=" + staffname + "&PType=fisik&PID=" + id_add + "&PLang=1&tm="
}
}
}
if fisik != "" {
returnTab = append(returnTab, models.TabViewReportMcu{Name: "Fisik", Link: fisik})
}
if rontgen != "" {
returnTab = append(returnTab, models.TabViewReportMcu{Name: "Rontgen", Link: rontgen})
}
if usg != "" {
returnTab = append(returnTab, models.TabViewReportMcu{Name: "USG", Link: usg})
}
if ekg != "" {
returnTab = append(returnTab, models.TabViewReportMcu{Name: "Elektromedik", Link: ekg})
}
if audiometri != "" {
returnTab = append(returnTab, models.TabViewReportMcu{Name: "Audiometri", Link: audiometri})
}
if spirometri != "" {
returnTab = append(returnTab, models.TabViewReportMcu{Name: "Spirometri", Link: spirometri})
}
if treadmill != "" {
returnTab = append(returnTab, models.TabViewReportMcu{Name: "Treadmill", Link: treadmill})
}
if sds != "" {
returnTab = append(returnTab, models.TabViewReportMcu{Name: "SDS", Link: sds})
}
if kesimpulan != "" {
returnTab = append(returnTab, models.TabViewReportMcu{Name: "Kesimpulan", Link: kesimpulan})
}
if lab_rpt != "" {
returnTab = append(returnTab, models.TabViewReportMcu{Name: "Lab", Link: lab_rpt})
}
if papsmear != "" {
returnTab = append(returnTab, models.TabViewReportMcu{Name: "Papsmear", Link: papsmear})
}
if mikro != "" {
returnTab = append(returnTab, models.TabViewReportMcu{Name: "Mikro", Link: mikro})
}
if additional != "" {
returnTab = append(returnTab, models.TabViewReportMcu{Name: "Tambahan", Link: additional})
}
return returnTab, nil
}
func (tdps *TabDaftarPesertaServices) GetListAttachmentFile(orderheaderID string) ([]models.AttachmentFIle, error) {
list_file := []models.AttachmentFIle{}
sql := `
SELECT
File_AttachmentID,
File_AttachmentFileName
FROM t_orderheader
JOIN file_attachment ON File_AttachmentT_OrderHeaderID = T_OrderHeaderID
AND T_OrderHeaderID = ? AND File_AttachmentIsActive = 'Y'
ORDER BY File_AttachmentID ASC`
if err := dbx.Handlex.Select(&list_file, sql, orderheaderID); err != nil {
return list_file, err
}
url := "/one-media/one-files/"
for i, v := range list_file {
list_file[i].Link = url + v.File_AttachmentFileName
}
return list_file, nil
}

View File

@@ -201,7 +201,7 @@ func (tkf *TabKelainanFisikServices) GetKelainanFisikPresentase(mcuID string) (m
count(distinct T_OrderHeaderID) as total
FROM t_kelainan_fisik
JOIN t_orderheader ON T_KelainanFiskT_OrderHeaderID = T_OrderHeaderID
JOIN mcu_summaryfisik ON T_KelainanFiskMcu_SummaryFisikID = Mcu_SummaryFisikID AND
JOIN mcu_summaryfisik ON T_KelainanFiskMcu_FisikSummaryID = Mcu_SummaryFisikID AND
Mcu_SummaryFisikID NOT IN (63,67,68,69,70,71,72,73)
join mcu_kelainan on Mcu_SummaryFisikMcu_KelainanID = Mcu_KelainanID
join mcu_kelainangroup on Mcu_KelainanMcu_KelainanGroupID = Mcu_KelainanGroupID
@@ -267,7 +267,7 @@ func (tkf *TabKelainanFisikServices) GetKelainanFisikBMI(mcuID string) (models.P
FROM mcu_kelainan
JOIN mcu_summaryfisik ON Mcu_SummaryFisikMcu_KelainanID = Mcu_KelainanID AND
Mcu_SummaryFisikIsActive = 'Y'
LEFT JOIN t_kelainan_fisik ON T_KelainanFiskMcu_SummaryFisikID = Mcu_SummaryFisikID AND
LEFT JOIN t_kelainan_fisik ON T_KelainanFiskMcu_FisikSummaryID = Mcu_SummaryFisikID AND
T_KelainanFiskIsActive= 'Y'
LEFT JOIN t_orderheader orderkel ON T_KelainanFiskT_OrderHeaderID = orderkel.T_OrderHeaderID AND
orderkel.T_OrderHeaderIsActive = 'Y' AND orderkel.T_OrderHeaderMgm_McuID = ?
@@ -325,7 +325,7 @@ func (tkf *TabKelainanFisikServices) GetKelainanFisikHipertensi(mcuID string) (m
FROM mcu_kelainan
JOIN mcu_summaryfisik ON Mcu_SummaryFisikMcu_KelainanID = Mcu_KelainanID AND
Mcu_SummaryFisikIsActive = 'Y'
LEFT JOIN t_kelainan_fisik ON T_KelainanFiskMcu_SummaryFisikID = Mcu_SummaryFisikID AND
LEFT JOIN t_kelainan_fisik ON T_KelainanFiskMcu_FisikSummaryID = Mcu_SummaryFisikID AND
T_KelainanFiskIsActive= 'Y'
LEFT JOIN t_orderheader orderkel ON T_KelainanFiskT_OrderHeaderID = orderkel.T_OrderHeaderID AND
orderkel.T_OrderHeaderIsActive = 'Y' AND orderkel.T_OrderHeaderMgm_McuID = ?
@@ -381,7 +381,7 @@ func (tkf *TabKelainanFisikServices) GetKelainanFisikRefraksi(mcuID string) (mod
FROM mcu_kelainan
JOIN mcu_summaryfisik ON Mcu_SummaryFisikMcu_KelainanID = Mcu_KelainanID AND
Mcu_SummaryFisikIsActive = 'Y'
LEFT JOIN t_kelainan_fisik ON T_KelainanFiskMcu_SummaryFisikID = Mcu_SummaryFisikID AND
LEFT JOIN t_kelainan_fisik ON T_KelainanFiskMcu_FisikSummaryID = Mcu_SummaryFisikID AND
T_KelainanFiskIsActive= 'Y'
LEFT JOIN t_orderheader orderkel ON T_KelainanFiskT_OrderHeaderID = orderkel.T_OrderHeaderID AND
orderkel.T_OrderHeaderIsActive = 'Y' AND orderkel.T_OrderHeaderMgm_McuID = ?
@@ -435,7 +435,7 @@ func (tkf *TabKelainanFisikServices) GetKelFisikAlkohol(mcuID string) (models.Pi
FROM mcu_kelainan
JOIN mcu_summaryfisik ON Mcu_SummaryFisikMcu_KelainanID = Mcu_KelainanID AND
Mcu_KelainanIsActive = 'Y' AND Mcu_KelainanID IN (117,118,119)
LEFT JOIN t_kelainan_fisik ON T_KelainanFiskMcu_SummaryFisikID = Mcu_SummaryFisikID AND
LEFT JOIN t_kelainan_fisik ON T_KelainanFiskMcu_FisikSummaryID = Mcu_SummaryFisikID AND
T_KelainanFiskIsActive = 'Y'
LEFT JOIN so_resultentry ON T_KelainanFiskSo_ResultEntryID = So_ResultEntryID AND
So_ResultEntryIsActive = 'Y'
@@ -482,7 +482,7 @@ func (tkf *TabKelainanFisikServices) GetKelFisikMerokok(mcuID string) (models.Pi
FROM mcu_kelainan
JOIN mcu_summaryfisik ON Mcu_SummaryFisikMcu_KelainanID = Mcu_KelainanID AND
Mcu_KelainanIsActive = 'Y' AND Mcu_KelainanID IN (120,121,122)
LEFT JOIN t_kelainan_fisik ON T_KelainanFiskMcu_SummaryFisikID = Mcu_SummaryFisikID AND
LEFT JOIN t_kelainan_fisik ON T_KelainanFiskMcu_FisikSummaryID = Mcu_SummaryFisikID AND
T_KelainanFiskIsActive = 'Y'
LEFT JOIN so_resultentry ON T_KelainanFiskSo_ResultEntryID = So_ResultEntryID AND
So_ResultEntryIsActive = 'Y'
@@ -528,7 +528,7 @@ func (tkf *TabKelainanFisikServices) GetKelFisikOlahraga(mcuID string) (models.P
FROM mcu_kelainan
JOIN mcu_summaryfisik ON Mcu_SummaryFisikMcu_KelainanID = Mcu_KelainanID AND
Mcu_KelainanIsActive = 'Y' AND Mcu_KelainanID IN (123,124)
LEFT JOIN t_kelainan_fisik ON T_KelainanFiskMcu_SummaryFisikID = Mcu_SummaryFisikID AND
LEFT JOIN t_kelainan_fisik ON T_KelainanFiskMcu_FisikSummaryID = Mcu_SummaryFisikID AND
T_KelainanFiskIsActive = 'Y'
LEFT JOIN so_resultentry ON T_KelainanFiskSo_ResultEntryID = So_ResultEntryID AND
So_ResultEntryIsActive = 'Y'

View File

@@ -267,7 +267,7 @@ func (tkg *TabKelainanGlobalServices) GetKelainanGlobalV2(mcuID string) (models.
count(distinct T_OrderHeaderID) as Total
FROM t_kelainan_fisik
JOIN t_orderheader ON T_KelainanFiskT_OrderHeaderID = T_OrderHeaderID
JOIN mcu_summaryfisik ON T_KelainanFiskMcu_SummaryFisikID = Mcu_SummaryFisikID AND
JOIN mcu_summaryfisik ON T_KelainanFiskMcu_FisikSummaryID = Mcu_SummaryFisikID AND
Mcu_SummaryFisikID NOT IN (63,67,68,69,70,71,72,73)
join mcu_kelainan on Mcu_SummaryFisikMcu_KelainanID = Mcu_KelainanID
join mcu_kelainangroup on Mcu_KelainanMcu_KelainanGroupID = Mcu_KelainanGroupID

View File

@@ -289,7 +289,7 @@ func (tks *TabKesimpulanServices) GetListKesimpulanFisikV2(id string) ([]models.
count(distinct T_OrderHeaderID) as total
FROM t_kelainan_fisik
JOIN t_orderheader ON T_KelainanFiskT_OrderHeaderID = T_OrderHeaderID
JOIN mcu_summaryfisik ON T_KelainanFiskMcu_SummaryFisikID = Mcu_SummaryFisikID AND
JOIN mcu_summaryfisik ON T_KelainanFiskMcu_FisikSummaryID = Mcu_SummaryFisikID AND
Mcu_SummaryFisikID NOT IN (63,67,68,69,70,71,72,73)
join mcu_kelainan on Mcu_SummaryFisikMcu_KelainanID = Mcu_KelainanID
join mcu_kelainangroup on Mcu_KelainanMcu_KelainanGroupID = Mcu_KelainanGroupID

View File

@@ -303,6 +303,7 @@ func (sp *PatientServices) GetListReportPesertaV4(orderheaderID string, staffnam
switch d.Rpt_name {
case "Pemeriksaan Fisik":
fisik = "/birt/frameset?__report=report/one/mcu/mcu_fisik_history_v2_portal.rptdesign&__format=pdf&PType=fisik&PLang=1&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
// fisik = "/birt/run?__report=report/one/mcu/mcu_fisik_history_v2_portal.rptdesign&__format=pdf&PType=fisik&PLang=1&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "Rontgen":
rontgen = "/birt/frameset?__report=report/one/lab/rpt_hasil_so_xray_portal.rptdesign&__format=pdf&username=" + staffname + "&PID=" + d.So_id + "&tm=" + d.Datetime
case "Audiometri":

View File

@@ -1,13 +1,16 @@
package public_services
import (
"bytes"
"cpone/db"
"cpone/models"
"cpone/package/config"
dbx "cpone/package/database"
"database/sql"
"encoding/json"
"errors"
"io"
"net/http"
"net/url"
"go.uber.org/zap"
)
@@ -23,37 +26,76 @@ func NewServicesLogin(uStore db.AppStore) *ServicesLogin {
}
}
func (ls *ServicesLogin) MultiSignIn(username string, password string, host string) (models.Response, error) {
func (ls *ServicesLogin) MultiSignInV2(username string, password string) (models.Response, error) {
logger, _ := zap.NewProduction()
var ret models.Response
uri := "https://" + config.Data.Get("servername") + "/one-api/v1/system/auth/multi_login"
// uri := "https://" + config.Data.Get("servername") + "/one-api/v1/system/auth_v2/multi_login"
uri := "https://" + config.Data.Get("servername") + "/one-api/v1/system/auth_v2/multi_login_v2"
params := url.Values{}
params.Add("username", username)
params.Add("password", password)
params, _ := json.Marshal(map[string]string{
"username": username,
"password": password,
})
paramsBody := bytes.NewBuffer(params)
resp, err := http.PostForm(uri, params)
resp, err := http.Post(uri, "application/json", paramsBody)
if err != nil {
defer logger.Sync()
logger.Error("error request post", zap.Any("error", err))
logger.Error("[ERROR]", zap.Any("error request login ", err))
return ret, err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
defer logger.Sync()
logger.Error("error read body", zap.Any("error", err))
logger.Error("[ERROR]", zap.Any("error read body response ", err))
return ret, err
}
err = json.Unmarshal(body, &ret)
if err != nil {
defer logger.Sync()
logger.Error("error parse body", zap.Any("error", err))
logger.Error("[ERROR]", zap.Any("error unmarshal response ", err))
return ret, err
}
// logger.Info("[INFO]", zap.Any("success sign in ", &ret))
return ret, nil
}
func (ls *ServicesLogin) CheckIsAccountCpone(email string) (string, error) {
var usr_type string
q := `
SELECT M_UserEmail
FROM m_user
WHERE M_UserEmail = ? AND M_UserIsActive = 'Y'
`
if err := dbx.Handlex.Get(&usr_type, q, email); err != nil {
if errors.Is(err, sql.ErrNoRows) {
return "", nil
}
return "", err
}
return usr_type, nil
}
func (ls *ServicesLogin) CheckAccountHasLocation(email string) (bool, error) {
var placeholder string
sqla := `SELECT
M_UserEmail
FROM m_user
JOIN m_userlocation ON M_UserLocationM_UserID = M_UserID
WHERE M_UserEmail = ?
AND M_UserIsActive = 'Y'
`
if err := dbx.Handlex.Get(&placeholder, sqla, email); err != nil {
if errors.Is(err, sql.ErrNoRows) {
return false, nil
}
return false, err
}
return true, nil
}