diff --git a/application/db.student.go b/application/db.student.go index 714f102..a4fd01a 100644 --- a/application/db.student.go +++ b/application/db.student.go @@ -7,6 +7,64 @@ func createEventStudents(ctx *gin.Context, eventStudents *[]EventStudent) error return tx.Error } +func getCompanyRecruitmentStats(ctx *gin.Context, cid uint, stats *[]statsResponse) error { + tx := db.WithContext(ctx).Model(&EventStudent{}). + Joins("JOIN proforma_events ON proforma_events.name IN ? AND proforma_events.id = event_students.proforma_event_id", []EventType{Recruited, PIOPPOACCEPTED}). + Joins("JOIN proformas ON proformas.id = proforma_events.proforma_id AND proformas.company_recruitment_cycle_id = ?", cid). + Select("event_students.student_recruitment_cycle_id, proformas.company_name, proformas.profile ,proforma_events.name as type"). + Order("event_students.student_recruitment_cycle_id"). + Find(stats) + return tx.Error +} +func fetchCompanyRecruitCount(ctx *gin.Context, cids []uint) (map[uint]int, error) { + resultCounts := make(map[uint]int) + + var stats []companyRecruitResponce + tx := db.WithContext(ctx).Model(&EventStudent{}). + Joins("JOIN proforma_events ON proforma_events.name IN ? AND proforma_events.id = event_students.proforma_event_id", []EventType{Recruited, PIOPPOACCEPTED}). + Joins("JOIN proformas ON proformas.id = proforma_events.proforma_id"). + Where("proformas.company_recruitment_cycle_id IN ?", cids). + Select("proformas.company_recruitment_cycle_id, COUNT(*) as count"). + Group("proformas.company_recruitment_cycle_id"). + Order("proformas.company_recruitment_cycle_id"). + Find(&stats) + + if tx.Error != nil { + return nil, tx.Error + } + + // Populate resultCounts map + for _, stat := range stats { + resultCounts[stat.CompanyRecruitmentCycleID] = stat.Count + } + + return resultCounts, nil +} + +func fetchCompanyPPOCount(ctx *gin.Context, cids []uint) (map[uint]int, error) { + resultCounts := make(map[uint]int) + + var stats []companyRecruitResponce + tx := db.WithContext(ctx).Model(&EventStudent{}). + Joins("JOIN proforma_events ON proforma_events.name IN ? AND proforma_events.id = event_students.proforma_event_id", []EventType{PIOPPOACCEPTED}). + Joins("JOIN proformas ON proformas.id = proforma_events.proforma_id"). + Where("proformas.company_recruitment_cycle_id IN ?", cids). + Select("proformas.company_recruitment_cycle_id, COUNT(*) as count"). + Group("proformas.company_recruitment_cycle_id"). + Order("proformas.company_recruitment_cycle_id"). + Find(&stats) + + if tx.Error != nil { + return nil, tx.Error + } + + for _, stat := range stats { + resultCounts[stat.CompanyRecruitmentCycleID] = stat.Count + } + + return resultCounts, nil +} + func getRecruitmentStats(ctx *gin.Context, rid uint, stats *[]statsResponse) error { tx := db.WithContext(ctx).Model(&EventStudent{}). Joins("JOIN proforma_events ON proforma_events.name IN ? AND proforma_events.id = event_students.proforma_event_id", []EventType{Recruited, PIOPPOACCEPTED}). diff --git a/application/router.go b/application/router.go index 1824690..adeb272 100644 --- a/application/router.go +++ b/application/router.go @@ -19,6 +19,8 @@ func AdminRouter(mail_channel chan mail.Mail, r *gin.Engine) { admin.DELETE("event/:eid/student/:sid", deleteStudentFromEventHandler) admin.GET("/company/:cid/proforma", getProformaByCompanyHandler) + admin.GET("/company/:cid/stats", getCompanyRecruitStatsHandler) + admin.POST("/company/count", fetchCompanyRecruitCountHandler) admin.GET("/proforma", getAllProformasHandler) admin.POST("/proforma", postProformaHandler) diff --git a/application/stats.recruitment.go b/application/stats.recruitment.go index b4a394a..28a3455 100644 --- a/application/stats.recruitment.go +++ b/application/stats.recruitment.go @@ -27,6 +27,85 @@ type statsRecruitmentResponse struct { Type string `json:"type"` } +type companyRecruitResponce struct { + CompanyRecruitmentCycleID uint `json:"company_recruitment_cycle_id"` + Count int `json:"count"` +} + +func fetchCompanyRecruitCountHandler(c *gin.Context) { + var cids []uint + + if err := c.ShouldBindJSON(&cids); err != nil { + c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request format"}) + return + } + + recruitCounts, err := fetchCompanyRecruitCount(c, cids) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Internal Server Error"}) + return + } + ppoCounts, err := fetchCompanyPPOCount(c, cids) + if err != nil { + c.JSON(http.StatusInternalServerError, gin.H{"error": "Internal Server Error"}) + return + } + + c.JSON(http.StatusOK, gin.H{"recruitCounts": recruitCounts, "ppoCount": ppoCounts}) +} + +func getCompanyRecruitStatsHandler(ctx *gin.Context) { + cid, err := util.ParseUint(ctx.Param("cid")) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + var stats []statsResponse + err = getCompanyRecruitmentStats(ctx, cid, &stats) + + if err != nil { + ctx.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + var srids []uint + for _, stat := range stats { + srids = append(srids, stat.StudentRecruitmentCycleID) + } + + var students []rc.StudentRecruitmentCycle + err = rc.FetchStudentBySRID(ctx, srids, &students) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + + var studentsMap = make(map[uint]*rc.StudentRecruitmentCycle) + for i := range students { + studentsMap[students[i].ID] = &students[i] + } + + var studentResponse []statsRecruitmentResponse + for _, stat := range stats { + student := studentsMap[stat.StudentRecruitmentCycleID] + res := statsRecruitmentResponse{ + ID: student.ID, + Name: student.Name, + Email: student.Email, + RollNo: student.RollNo, + ProgramDepartmentID: student.ProgramDepartmentID, + SecondaryProgramDepartmentID: student.SecondaryProgramDepartmentID, + CompanyName: stat.CompanyName, + Profile: stat.Profile, + Type: stat.Type, + } + studentResponse = append(studentResponse, res) + } + + ctx.JSON(http.StatusOK, gin.H{"student": studentResponse}) + +} + func getStatsHandler(ctx *gin.Context) { rid, err := util.ParseUint(ctx.Param("rid")) if err != nil { diff --git a/mail/service.go b/mail/service.go index 7cc444b..9985fc4 100644 --- a/mail/service.go +++ b/mail/service.go @@ -38,10 +38,12 @@ func (mail *Mail) BuildMessage() []byte { message.WriteString(msg) + bodyWithLineBreaks := strings.ReplaceAll(mail.Body, "\n", "
") + tmpl := template.Must(template.New("Template").Parse(DefaultTemplate)) err := tmpl.Execute(&message, TemplateData{ Subject: mail.Subject, - Body: mail.Body, + Body: bodyWithLineBreaks, }) if err != nil { logrus.Errorf("Error executing email template: %v", err) diff --git a/mail/templates.go b/mail/templates.go index f282a70..3800b4f 100644 --- a/mail/templates.go +++ b/mail/templates.go @@ -6,20 +6,20 @@ const ( - +
- +
Recruitment Automation System <br /> Indian Institute of Technology, Kanpur
-

{{.Subject}}

-

{{.Body}}

-

This is an auto-generated email. Please do not reply.

+

{{.Subject}}

+

{{.Body}}

+

This is an auto-generated email. Please do not reply.

@@ -36,9 +36,9 @@ const (
- - - + + +
TwitterFacebookLinkedInTwitterFacebookLinkedIn
@@ -57,7 +57,7 @@ const ( - diff --git a/ras/hello.go b/ras/hello.go index a371ae2..2f6c82b 100644 --- a/ras/hello.go +++ b/ras/hello.go @@ -21,8 +21,8 @@ func PlaceHolderController(c *gin.Context) { func MailController(mail_channel chan mail.Mail) gin.HandlerFunc { return func(c *gin.Context) { - mail_channel <- mail.GenerateMail("harshitr20@iitk.ac.in", "Test Mail", "Hello World!") - mail_channel <- mail.GenerateMails([]string{"shreea20@iitk.ac.in", "ias@iitk.ac.in"}, "Test Mail to multiple ppl", "Hello Worlds!") + mail_channel <- mail.GenerateMail("yashc22@iitk.ac.in", "Test Mail", "Hello World!") + mail_channel <- mail.GenerateMails([]string{"yashlm1017@gmail.com", "bmerchant22@iitk.ac.in"}, "Test Mail to multiple ppl", "Hello Worlds!") c.JSON(http.StatusOK, gin.H{"message": "Mail sent"}) } } diff --git a/rc/admin.company.go b/rc/admin.company.go index 00522f3..5e5b2b4 100644 --- a/rc/admin.company.go +++ b/rc/admin.company.go @@ -31,6 +31,46 @@ type addNewCompanyRequest struct { Comments string `json:"comments"` } +type StatResponse struct { + ID uint `json:"id"` + RecruitmentCycleID uint `json:"recruitment_cycle_id"` + Type string `json:"type"` + Phase string `json:"phase"` +} +type CompanyAllRecruitmentCycle struct { + ID uint `json:"id"` + RecruitmentCycleID uint `json:"recruitment_cycle_id"` + Type string `json:"type"` + Phase string `json:"phase"` +} + +func getCompanyAllRCID(ctx *gin.Context) { + cid, err := util.ParseUint(ctx.Param("cid")) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + var stats []CompanyAllRecruitmentCycle + err = fetchCompanyAllRecruitmentCycles(ctx, cid, &stats) + if err != nil { + ctx.AbortWithStatusJSON(http.StatusBadRequest, gin.H{"error": err.Error()}) + return + } + var countResponse []CompanyAllRecruitmentCycle + + for _, stat := range stats { + countResponse = append(countResponse, CompanyAllRecruitmentCycle{ + ID: stat.ID, + RecruitmentCycleID: stat.RecruitmentCycleID, + Type: stat.Type, + Phase: stat.Phase, + }) + } + + ctx.JSON(http.StatusOK, countResponse) + +} + func postNewCompanyHandler(ctx *gin.Context) { var addNewCompany addNewCompanyRequest diff --git a/rc/db.company.go b/rc/db.company.go index d23a97d..ea9ee16 100644 --- a/rc/db.company.go +++ b/rc/db.company.go @@ -56,6 +56,17 @@ func deleteRCCompany(ctx *gin.Context, cid uint) error { return tx.Error } +func fetchCompanyAllRecruitmentCycles(ctx *gin.Context, companyID uint, stats *[]CompanyAllRecruitmentCycle) error { + tx := db.WithContext(ctx). + Table("company_recruitment_cycles"). + Select("company_recruitment_cycles.id, company_recruitment_cycles.recruitment_cycle_id, recruitment_cycles.type, recruitment_cycles.phase"). + Joins("JOIN recruitment_cycles ON company_recruitment_cycles.recruitment_cycle_id = recruitment_cycles.id"). + Where("company_recruitment_cycles.company_id = ?", companyID). + Find(stats) + + return tx.Error +} + func FetchCompanyHistory(ctx *gin.Context, companyID uint, companyHistory *[]CompanyHistory) error { tx := db.WithContext(ctx). Table("company_recruitment_cycles"). diff --git a/rc/router.go b/rc/router.go index f99deef..3ae4c93 100644 --- a/rc/router.go +++ b/rc/router.go @@ -28,6 +28,7 @@ func AdminRouter(mail_channel chan mail.Mail, r *gin.Engine) { admin.GET("/company/:cid", getCompanyHandler) admin.DELETE("/company/:cid", deleteCompanyHandler) admin.GET("/company/:cid/history", getCompanyHistoryHandler) + admin.GET("/company/:cid/ids", getCompanyAllRCID) admin.GET("/student", getAllStudentsHandler)
Website | RAS Portal | PhD Portal + Website | RAS Portal | PhD Portal

©2024 Recruitment Automation System.
Students' Placement Office, IIT Kanpur

All rights reserved.