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 (
- {{.Subject}}-{{.Body}} This is an auto-generated email. Please do not reply. +{{.Subject}}+{{.Body}} +This is an auto-generated email. Please do not reply.
|