extends /templates/base block content //- NOTE: do not localize / i18n if me.isAdmin() .container-fluid .row .col-md-5.big-stat.active-classes if activeClasses.length > 0 div.description Monthly Active Classes div.count= activeClasses[0].groups[activeClasses[0].groups.length - 1] .col-md-5.big-stat.recurring-revenue if revenue.length > 0 div.description Monthly Recurring Revenue div.count $#{Math.round((revenue[0].groups[revenue[0].groups.length - 1]) / 100)} .col-md-5.big-stat.classroom-active-users if activeUsers.length > 0 - var classroomBigMAU = 0; each count, event in activeUsers[0].events if event.indexOf('MAU classroom') >= 0 - classroomBigMAU += count; div.description Classroom Monthly Active Users div.count= classroomBigMAU .col-md-5.big-stat.campaign-active-users if activeUsers.length > 0 - var campaignBigMAU = 0; each count, event in activeUsers[0].events if event.indexOf('MAU campaign') >= 0 - campaignBigMAU += count; div.description Campaign Monthly Active Users div.count= campaignBigMAU h3 KPI 60 days .kpi-recent-chart.line-chart-container h3 KPI 365 days .kpi-chart.line-chart-container h1 Table of Contents b Graphs div a(href='#active-classes-graph') Active Classes div a(href='#recurring-revenue-graph') Recurring Revenue div a(href='#classroom-daus-graph') Classroom Daily Active Users div a(href='#classroom-maus-graph') Classroom Monthly Active Users div a(href='#campaign-daus-graph') Campaign Daily Active Users div a(href='#campaign-maus-graph') Campaign Monthly Active Users div a(href='#furthest-courses-table') Campaign vs Classroom Paid Monthly Active Users div a(href='#furthest-courses-table') Enrollments Issued and Redeemed b Tables div a(href='#furthest-courses-table') Furthest Course div a(href='#school-counts-table') School Counts div a(href='#active-classes-table') Active Classes div a(href='#recurring-revenue-table') Recurring Revenue div a(href='#active-users-table') Active Users div a(href='#enrollments-table') Enrollments h3#active-classes-graph Active Classes 90 days .small Active class: 12+ students in a classroom, with 6+ who played in last 30 days. .small Paid student: user.coursePrepaidID set and prepaid.properties.trialRequestID NOT set .small Trial student: user.coursePrepaidID set and prepaid.properties.trialRequestID set .small Paid class: at least one paid student in the classroom .small Trial class: not paid, at least one trial student in classroom .small Free class: not paid, not trial .active-classes-chart.line-chart-container h3#recurring-revenue-graph Recurring Revenue 90 days .recurring-revenue-chart.line-chart-container h3#classroom-daus-graph Classroom Daily Active Users 90 days .small Paid student: user.coursePrepaidID set and prepaid.properties.trialRequestID NOT set .small Trial student: user.coursePrepaidID set and prepaid.properties.trialRequestID set .small Free student: not paid, not trial .classroom-daily-active-users-chart.line-chart-container h3#classroom-maus-graph Classroom Monthly Active Users 90 days .classroom-monthly-active-users-chart.line-chart-container h3#campaign-daus-graph Campaign Daily Active Users 90 days .small Paid user: had monthly or yearly sub on given day .small Free user: not paid .campaign-daily-active-users-chart.line-chart-container h3#campaign-maus-graph Campaign Monthly Active Users 90 days .campaign-monthly-active-users-chart.line-chart-container h3 Campaign vs Classroom Paid Monthly Active Users 90 days .campaign-vs-classroom-monthly-active-users-chart.line-chart-container h3 Enrollments Issued and Redeemed 90 days .paid-courses-chart.line-chart-container h3#furthest-courses-table Furthest Course .small Teacher: owner of a course instance .small Student: member of a course instance (assigned to course) .small For course instances created in last #{view.furthestCourseDayRange} days, not Single Player, hourOfCode != true .small Counts are not summed. I.e. a student or teacher only contributes to the count of one course. if view.teacherCourseDistribution table.table.table-striped.table-condensed tr th Course th Teachers th Students th Avg students per teacher each count, courseIndex in view.teacherCourseDistribution tr td= view.courses.models[courseIndex].get('name') td= count td= view.studentCourseDistribution[courseIndex] || 0 td= Math.round((view.studentCourseDistribution[courseIndex] || 0) / count) else div Loading ... h3#school-counts-table School Counts .small Only including schools with #{view.minSchoolCount}+ counts if view.schoolCounts table.table.table-striped.table-condensed tr th th School Name th User Count each val, i in view.schoolCounts tr td= i + 1 td= val.schoolName td= val.count else div Loading ... h1#active-classes-table Active Classes table.table.table-striped.table-condensed tr th Day for group in activeClassGroups th= group.replace('Active classes', '') each activeClass in activeClasses tr td= activeClass.day each val in activeClass.groups td= val h1#recurring-revenue-table Recurring Revenue table.table.table-striped.table-condensed tr th Day for group in revenueGroups th= group.replace('DRR ', '') each entry in revenue tr td= entry.day each val in entry.groups td $#{(val / 100).toFixed(2)} h1#active-users-table Active Users if activeUsers.length > 0 - var eventNames = []; each count, event in activeUsers[0].events - eventNames.push(event) table.table.table-striped.table-condensed tr th(style='min-width:85px;') Day each eventName in eventNames th= eventName th DAU Campaign Total th DAU Classroom Total each activeUser in activeUsers tr td= activeUser.day - var dauCampaignTotal = 0 - var dauClassroomTotal = 0 each eventName in eventNames td= activeUser.events[eventName] || 0 if eventName.indexOf('DAU campaign') >= 0 - dauCampaignTotal += (activeUser.events[eventName] || 0); else if eventName.indexOf('DAU classroom') >= 0 - dauClassroomTotal += (activeUser.events[eventName] || 0); td= dauCampaignTotal td= dauClassroomTotal h1#enrollments-table Enrollments table.table.table-striped.table-condensed tr th Day th Paid Enrollments Issued th Paid Enrollments Redeemed th Trial Enrollments Issued th Trial Enrollments Redeemed each day in enrollmentDays tr td= day if dayEnrollmentsMap[day] td= dayEnrollmentsMap[day].paidIssued || 0 td= dayEnrollmentsMap[day].paidRedeemed || 0 td= dayEnrollmentsMap[day].trialIssued || 0 td= dayEnrollmentsMap[day].trialRedeemed || 0 else td 0 td 0 td 0 td 0