Compare commits

...

22 Commits

Author SHA1 Message Date
llaniau 4f185984f9 geoloc 2021-02-08 09:49:10 +01:00
llaniau 26e781c230 Optimisation referencement 2021-02-01 22:38:30 +01:00
llaniau b68e1c6050 Changement de template mailjet pour prod 2021-01-26 10:56:03 +01:00
llaniau ee98a19150 pacth mailjet 2021-01-26 10:19:34 +01:00
llaniau 0e512cb8a2 mailjet patch 2021-01-26 10:08:49 +01:00
llaniau 24a5ac8cbf nom du recruteur 2021-01-26 10:05:31 +01:00
llaniau 6920e8faa0 Patch prod V2.5.4.1 mailjet 2021-01-26 09:55:01 +01:00
llaniau 5aa8079b0a Lien vers annonce Dashboard TT 2021-01-25 18:01:30 +01:00
llaniau cc83f88458 Status sended 2021-01-25 17:57:07 +01:00
llaniau 4edfdfd187 Patch post MEP 2021-01-25 17:27:32 +01:00
llaniau 605834be03 sitemap 2021-01-24 12:40:28 +01:00
llaniau dca7bf9efe tri par statut candaidature dash tt 2021-01-23 21:03:19 +01:00
llaniau 99434105e3 Bug spammer 2021-01-23 20:33:39 +01:00
llaniau d018b73fc8 Stocker adid au moment de inscription 2021-01-22 17:10:32 +01:00
llaniau 10975021c3 Lien vers cv papier Dashboard TT 2021-01-22 10:05:21 +01:00
llaniau 2af32f2835 MEP V2.5.4 2021-01-21 14:46:35 +01:00
llaniau 2c41f2aa02 Video orpheline 2021-01-21 13:44:12 +01:00
llaniau ef50bfddff version V2.5.4 2021-01-20 18:17:29 +01:00
llaniau 029d86649a site map 2021-01-20 18:15:00 +01:00
llaniau 24becf66c3 version 2.5.2 2021-01-20 10:21:32 +01:00
llaniau 43d0852075 stat modif nouveau candidat 2021-01-20 09:00:22 +01:00
llaniau 81c548bd00 Statistiques 2021-01-19 16:10:39 +01:00
21 changed files with 821 additions and 258 deletions
@@ -70,7 +70,12 @@
<th width="11%"><input id='input4' type='text' class='form-control' placeholder='par prénom' style='font-family:Arial, FontAwesome; width:100%'/></th>
<th width="25%"><input id='input5' type='text' class='form-control' placeholder='par entreprise / offre' style='font-family:Arial, FontAwesome; width:100%'/></th>
<th width="15%"><input id='input7' type='text' class='form-control' placeholder='par statut' style='font-family:Arial, FontAwesome; width:100%'/></th>
<th width="15%">
<select id='input7'>
<option value="sended">Envoyé</option>
<option value="draft">Brouillon</option>
</select>
</th>
</tr>
</table>
@@ -22,7 +22,8 @@
<th>ID</th>
<th>Titre</th>
<th>Utilisateur</th>
<th>Status</th>
<th>Annonce?</th>
<th>Date de réponse</th>
<th>action</th>
</tr>
</thead>
@@ -30,11 +31,21 @@
<tbody>
{% for m in medias %}
<tr>
<td>{{ m.id }}</td>
<td>{{ m.title }}</td>
<td>{{ m.creator.firstname }} {{ m.creator.lastname }}</td>
<td>{{ m.mediaid }}</td>
<td><a href="{{ chemin }}{{ m.original_url }}" target="_blank">{{ m.title }}</a></td>
<td>{{ m.firstname }} {{ m.lastname }} - ({{ m.email }}) </td>
<td>
<span class="label pull-right bg-orange">{{ m.status }}</span>
{% if m.answerid %}
{% if m.adtitle %}
({{ m.adtitle }})
{% else %}
({{ m.ctitle }})
{% endif %}
{% else %}
<b>Vidéo orpheline</b>
{% endif %}</td>
<td>
<span class="label pull-right bg-orange">{{ m.sendtime }}</span>
</td>
<td>
<a href="{{ path('admin_video_moderation',{'id':m.id}) }}">
@@ -67,9 +78,11 @@
{"targets": 0, "searchable": true, "orderable": true},
{"targets": 1, "searchable": true, "orderable": true},
{"targets": 2, "searchable": true, "orderable": true},
{"targets": 3, "searchable": true, "orderable": true, "className": "text-center"},
{"targets": 4, "searchable": false, "orderable": false, "className": "text-center"},
]
{"targets": 3, "searchable": true, "orderable": true},
{"targets": 4, "searchable": true, "orderable": true, "className": "text-center"},
{"targets": 5, "searchable": false, "orderable": false, "className": "text-center"},
],
"order": [[ 0, "desc" ]]
});
});
</script>
@@ -21,6 +21,9 @@
<th class="col-md-2">Date de création</th>
<th>Prénom - Nom</th>
<th>Email</th>
<th>Dernière connexion</th>
<th>Validé</th>
<th>Annonce?</th>
<th class="col-md-1">Vidéos</th>
<th class="col-md-1">A la une</th>
<th>Action</th>
@@ -29,12 +32,34 @@
<tbody>
{% for talent in t if talent.MainUser %}
{% set user = talent.users|first %}
{% set adId = talent.description|split(':') %}
<tr>
<td data-order="{{ talent.cTime|date('U') }}">{{ talent.cTime|date('d/m/Y') }}</td>
<td>
{{ user.firstname }} {{ user.lastname }}
{{ user.firstname }} / {{ user.lastname }} - {% if talent.extra["phoneTalent"] is defined %} (Tel : {{ talent.extra["phoneTalent"] }}) {% endif %}
</td>
<td><a href="mailto:{{ user.email }}">{{ user.email }}</a></td>
<td>
{% if user.enabled == 1 %}
{{ user.lastLogin|date('d-m-Y h:m') }}
{% endif %}</td>
<td>
{% if user.enabled == 1 %}
oui
{% else %}
non
{% endif %}
</td>
<td> {% if adId|length > 1 %}
{% if user.medias|length > 0 %}
{% else %}
{% if adId[1] and adId[1] !="" %}
<a href="https://www.talentstube.com/Offre/{{ adId[1]|replace({' ': ''}) }}-{{ adId[1] }}" target="_blank">Lien vers l'annonce avant inscription</a>
{% endif %}
{% endif %}
{% endif %}
</td>
<td>
{% if user.medias|length > 0 %}
{{ user.medias|length }}
@@ -90,9 +115,12 @@
{"targets": 0, "searchable": true, "orderable": true},
{"targets": 1, "searchable": true, "orderable": true},
{"targets": 2, "searchable": true, "orderable": true},
{"targets": 3, "searchable": true, "orderable": true, "className": "text-center"},
{"targets": 4, "searchable": true, "orderable": true, "className": "text-center"},
{"targets": 5, "searchable": false, "orderable": false, "className": "text-center"},
{"targets": 3, "searchable": true, "orderable": true},
{"targets": 4, "searchable": true, "orderable": true},
{"targets": 5, "searchable": true, "orderable": true},
{"targets": 6, "searchable": true, "orderable": true, "className": "text-center"},
{"targets": 7, "searchable": true, "orderable": true, "className": "text-center"},
{"targets": 8, "searchable": false, "orderable": false, "className": "text-center"},
],
"order": [[0, "desc"]]
});
@@ -1,9 +1,12 @@
{% extends 'base.html.twig' %}
{% extends 'basev2.html.twig' %}
{% block metarobot %}<meta name="robots" content="noindex,follow">{% endblock %}
{% block metarobot %}
<meta name="robots" content="noindex,follow">
<link rel="canonical" href="https://www.talentstube.com/Offres" />
{% endblock %}
{% block content %}
{% if typeObject == 'Ad' %}
{# {% if typeObject == 'Ad' %}
{% set subtitle = 'Candidature à l\'offre d\'emploi:' %}
{% set title = object.title %}
{% set route = "answer_create_ad_step2" %}
@@ -11,20 +14,20 @@
{% set subtitle = 'Candidature pour l\'entreprise :' %}
{% set title = object.brandName %}
{% set route = "answer_create_company_step2" %}
{% endif %}
{% endif %} #}
<div class="fluid-container bg-grey-3">
<div class="container contentWrapper contentPage">
<div class="row">
<div class="col s12">
{# <div class="col s12">
<div class="col-content center-align m-t-20">
<strong>{{ subtitle }}</strong>
<h3 class="color-blue1 m-0 m-t-10">{{ title }}</h3>
</div>
</div>
</div> #}
</div>
<div class="row">
<div class="col s12 m6 ">
{# <div class="col s12 m6 ">
<div class="col-content p-15 bg-blue-1 center-align whiteColor z-depth-2 choice-answer-item">
<img src="{{ asset('img/img_popupcv/webcam_cv_video.svg')}}">
<h3>J'enregistre mon CV vidéo !</h3>
@@ -40,13 +43,13 @@
<a href="{{ path(route,{'id': object.id, 'type': 'import'}) }}" class="btn btn btn-default">Importer mon CV vidéo</a><br /><br />
<a id="link-videotheque" href="{{ route_videotheque }}">Choisir une vidéo de ma vidéothèque</a>
</div>
</div>
</div> #}
</div>
</div>
</div>
</div>
{% endblock %}
{% block javascripts %}
{{ parent() }}
{# {{ parent() }}
<script type="text/javascript">
{% if mustLogin == true %}
$('#link-videotheque').on('click',function(event){
@@ -54,5 +57,5 @@
$('#modal_login').modal('open');
});
{% endif %}
</script>
</script> #}
{% endblock %}
@@ -131,7 +131,7 @@
</td>
</tr>
{% endfor %}
{% if answers|length == 0 %}
{% if spontaneous|length == 0 %}
<tr><th colspan="3" class="text-center">Aucune candidature pour le moment</th></tr>
{% endif %}
</tbody>
@@ -50,13 +50,229 @@
</div>
</div>
<script>
document.location.href="/entreprise/me/profil";
document.location.href = "/entreprise/me/profil";
</script>
{# {{ render("/entreprise/me/profil") }} #}
</div>
{% endif %}
{% include 'company/ad_table_listing.html.twig' with {'ads':ads} %}
<!-- START JUMBOTRON -->
<div class="jumbotron" data-pages="parallax">
<div class=" container-fluid container-fixed-lg sm-p-l-0 sm-p-r-0">
<div class="inner">
<!-- START BREADCRUMB -->
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="/entreprise/me/">Accueil</a></li>
</ol>
<!-- END BREADCRUMB -->
<div class="row">
<div class="col-xl-12 col-lg-12 ">
<!-- START card -->
<div class="card card-transparent">
<div class="card-header ">
</div>
<div class="card-body">
<a class="btn-square" target="_self" href="{{ path('company_ad_create') }}">
<button aria-label=""
class="btn btn-primary btn-cons">{{ 'ad.company.add.label'|trans }}</button>
</a>
</div>
</div>
<!-- END card -->
</div>
</div>
</div>
</div>
</div>
<!-- END JUMBOTRON -->
<!-- START CONTAINER FLUID -->
<!-- START CONTAINER FLUID -->
<div class=" container-fluid container-fixed-lg bg-white">
<!-- START card -->
<div class="card card-transparent">
<div class="card-header ">
<div class="card-title">Statistiques</div>
</div>
<div class="row">
<div class="col-lg-12 col-xl-12 col-xlg-12">
<div class="col-md-12 m-b-10" style="display:flex;">
<!-- Nombre de candidatures vidéo - START WIDGET D3 widget_graphTileFlat-->
<div class="widget-8 card m-r-15 widget-loader-bar card-header card-background-1">
<div class="container-xs-height">
<!--full-height-->
<div class="">
<!--row-xs-height -->
<div class="col-xs-height col-top">
<div class="">
<!--card-header top-left top-right -->
<div class="card-title text-card">
<span class="font-montserrat fs-11 all-caps">Nombre total de
candidats</span>
</div>
</div>
</div>
</div>
<div class="row-xs-height">
<div class="col-xs-height col-top relative">
<div class="row full-height">
<div class="col-sm-12 text-card">
<h3 class="bold no-margin p-b-5 text-card"><a class="bold no-margin p-b-5 text-card" href="{{ path('company_answer_list') }}">{{nbAnswersSended}}</a></h3>
</div>
<div class="col-sm-8">
<div
class="p-l-0 full-height d-flex flex-column justify-content-between text-card">
<p class="small m-t-5 m-b-0">
<span class="fs-12 ">Nouveaux candidats</span>
</p>
<h4 class="bold no-margin"><a class="bold no-margin" href="{{ path('company_answer_list') }}">+{{nbAnswersSended}}</a></h4>
</div>
</div>
<!--<div class="col-sm-5">
<div class="p-l-0 full-height d-flex flex-column justify-content-between text-card">
<p class="small m-t-5 m-b-0">
<span class="fs-12 ">30 derniers jours</span>
</p>
<h4 class="bold no-margin" style="opacity:0.75">+48</h4>
</div>
</div>-->
</div>
<!--<div class="widget-8-chart line-chart" data-line-color="white" data-points="true" data-point-color="warning" data-stroke-width="2">
</div>-->
</div>
</div>
</div>
</div>
<!-- END WIDGET -->
<!-- Nombre de visite page entreprise vidéo - START WIDGET D3 widget_graphTileFlat-->
<div class="widget-8 card m-r-15 widget-loader-bar card-header card-background-2">
<div class="container-xs-height">
<div class="">
<!--row-xs-height -->
<div class="col-xs-height col-top">
<div class="">
<!--card-header top-left top-right -->
<div class="card-title text-card">
<span class="font-montserrat fs-11 all-caps">Visites de la page
entreprise</span>
</div>
</div>
</div>
</div>
<div class="row-xs-height">
<div class="col-xs-height col-top relative">
<div class="row full-height">
<div class="col-sm-12 text-card">
<h3 class="bold no-margin p-b-5 text-card">{{ records.totalRecordsCompany }}</h3>
</div>
<div class="col-sm-5 vertical-border">
<div
class="p-l-0 full-height d-flex flex-column justify-content-between text-card">
<p class="small m-t-5 m-b-0">
<span class="fs-12 ">7 derniers jours</span>
</p>
<h4 class="bold no-margin">+{{ records7days.totalRecordsCompany }}</h4>
</div>
</div>
<div class="col-sm-5">
<div
class="p-l-0 full-height d-flex flex-column justify-content-between text-card">
<p class="small m-t-5 m-b-0">
<span class="fs-12 ">30 derniers jours</span>
</p>
<h4 class="bold no-margin" style="opacity:0.75">+{{ records30days.totalRecordsCompany }}</h4>
</div>
</div>
</div>
<!--<div class="widget-8-chart line-chart" data-line-color="white" data-points="true" data-point-color="warning" data-stroke-width="2">
</div>-->
</div>
</div>
</div>
</div>
<!-- END WIDGET -->
<!-- Nombre de visites global offres d'emploi --START WIDGET D3 widget_graphTileFlat-->
<div class="widget-8 card no-margin widget-loader-bar card-header card-background-3">
<div class="container-xs-height">
<div class="">
<!--row-xs-height -->
<div class="col-xs-height col-top">
<div class="">
<!--card-header top-left top-right -->
<div class="card-title text-card">
<span class="font-montserrat fs-11 all-caps">Vues globales des offres
demploi</span>
</div>
</div>
</div>
</div>
<div class="row-xs-height">
<div class="col-xs-height col-top relative">
<div class="row full-height">
<div class="col-sm-12 text-card">
<h3 class="bold no-margin p-b-5 text-card">{{ records.totalRecords-records.totalRecordsCompany }}</h3>
</div>
<div class="col-sm-5 vertical-border">
<div
class="p-l-0 full-height d-flex flex-column justify-content-between text-card">
<p class="small m-t-5 m-b-0">
<span class="fs-12 ">7 derniers jours</span>
</p>
<h4 class="bold no-margin">+{{ records7days.totalRecords-records7days.totalRecordsCompany }}</h4>
</div>
</div>
<div class="col-sm-5">
<div
class="p-l-0 full-height d-flex flex-column justify-content-between text-card">
<p class="small m-t-5 m-b-0">
<span class="fs-12 ">30 derniers jours</span>
</p>
<h4 class="bold no-margin" style="opacity:0.75">+{{ records30days.totalRecords-records30days.totalRecordsCompany }}</h4>
</div>
</div>
</div>
<!--<div class="widget-8-chart line-chart" data-line-color="white" data-points="true" data-point-color="warning" data-stroke-width="2">
</div>-->
</div>
</div>
</div>
</div>
<!-- END WIDGET -->
</div>
</div>
</div>
</div>
<!--class="col-lg-8 sm-p-b-10 md-p-b-10"-->
</div>
<!-- END card -->
{% endblock %}
@@ -65,178 +281,192 @@
{# <script src="{{ asset('/js/vendors/Chart.bundle.min.js') }}"></script> #}
<script type="text/javascript">
var currentMonth = '{{ "now"|date("m") }}';
var arrayRecords;
{# var ctx, myChart, arrayCurrentsLabel, arrayCurrentsAdsValues, arrayCurrentsCompanyValues, donughtRecords; #}
var arrayRecords; {
#
var ctx, myChart, arrayCurrentsLabel, arrayCurrentsAdsValues, arrayCurrentsCompanyValues, donughtRecords;#
}
var sumVisitsAds = 0;
var sumCompanyValues = 0;
{# function loadChartData() {
setArrayValues();
myChart.update();
myDoughnutChart.update();
} #}
{# function getChartData(date1, date2) {
$.ajax({
type: "POST",
url: '{{ path("company_ajax_dashboard") }}',
data: 'date1=' + date1 + '&date2=' + date2,
dataType: "json",
success: function (data) {
arrayRecords = data.lineRecords;
donughtRecords = data.donughtRecords;
myDoughnutChart.data.datasets[0].data = donughtRecords;
loadChartData();
$('.fa-refresh').hide();
},
error: function (data) {
$('.fa-refresh').hide();
}
});
} #}
{# document.addEventListener("DOMContentLoaded", function (event) {
$('.fa-refresh').hide();
getChartData(0, 0);
configDatePicker = {
applyBtnClass: 'btn btn-default',
format: 'DD-MM-YYYY',
separator: ' au ',
endDate: new Date(),
maxDays: 365
}
$('#choiceMonth').dateRangePicker(configDatePicker).bind('datepicker-apply', function (event, obj) {
$('.fa-refresh').show();
var month1 = obj.date1.getMonth();
var day1 = obj.date1.getDate();
var year1 = obj.date1.getFullYear();
var month2 = obj.date2.getMonth();
var day2 = obj.date2.getDate();
var year2 = obj.date2.getFullYear();
var date1 = (month1 + 1) + "/" + day1 + "/" + year1 + " 00:00:01";
var date2 = (month2 + 1) + "/" + day2 + "/" + year2 + " 23:59:59";
getChartData(date1, date2);
});
$('.apply-btn').attr('value', 'Valider');
}); #}
{# function setArrayValues() {
arrayCurrentsLabel = [];
arrayCurrentsAdsValues = [];
arrayCurrentsCompanyValues = [];
arrayRecords['labels'].forEach(function (element, index) {
var date = element.split("-");
var dateAffiche = date[2] + "-" + date[1] + "-" + date[0];
arrayCurrentsLabel.push(dateAffiche);
arrayCurrentsAdsValues.push(arrayRecords['datasetsAd'][index]);
arrayCurrentsCompanyValues.push(arrayRecords['datasetsCompany'][index]);
});
myChart.data.labels = arrayCurrentsLabel;
myChart.data.datasets[0].data = arrayCurrentsAdsValues;
myChart.data.datasets[1].data = arrayCurrentsCompanyValues;
if (arrayCurrentsAdsValues.length > 0) {
sumVisitsAds = arrayCurrentsAdsValues.reduce(function (memo, val) {
let value = val || 0;
if (value != null) {
return memo + value;
}
});
} else {
sumVisitsAds = 0;
}
if (arrayCurrentsCompanyValues.length > 0) {
sumCompanyValues = arrayCurrentsCompanyValues.reduce(function (memo, val) {
let value = val || 0;
if (value != null) {
return memo + value;
}
});
} else {
sumCompanyValues = 0;
}
$('.countVisitsAds').html(sumVisitsAds);
$('.countVisitsCompany').html(sumCompanyValues);
{
#
function loadChartData() {
setArrayValues();
myChart.update();
myDoughnutChart.update();
}#
}
var dataLine = {
datasets: [{
label: "Nombre de visite d'annonce par jour",
fill: false,
fontColor: "rgba(39,139,231,1)",
backgroundColor: "rgba(39,139,231,1)",
borderColor: "rgba(39,139,231,1)"
}, {
label: "Nombre de visite de votre page entreprise",
fill: false,
fontColor: "#F9C339",
backgroundColor: "#F9C339",
borderColor: "#F9C339"
}]
};
{
#
function getChartData(date1, date2) {
$.ajax({
type: "POST",
url: '{{ path("company_ajax_dashboard") }}',
data: 'date1=' + date1 + '&date2=' + date2,
dataType: "json",
success: function (data) {
arrayRecords = data.lineRecords;
donughtRecords = data.donughtRecords;
myDoughnutChart.data.datasets[0].data = donughtRecords;
loadChartData();
$('.fa-refresh').hide();
},
error: function (data) {
$('.fa-refresh').hide();
}
});
}#
}
var ctx = document.getElementById("nb_visits");
var myChart = new Chart(ctx, {
type: 'line',
data: dataLine,
options: {
legend: {
display: false
},
scales: {
xAxes: [{
display: true,
scaleLabel: {
display: true,
labelString: 'Date'
}
}],
yAxes: [{
ticks: {
min: 0
},
scaleLabel: {
display: true,
labelString: 'Valeur'
}
}]
{
#
document.addEventListener("DOMContentLoaded", function (event) {
$('.fa-refresh').hide();
getChartData(0, 0);
configDatePicker = {
applyBtnClass: 'btn btn-default',
format: 'DD-MM-YYYY',
separator: ' au ',
endDate: new Date(),
maxDays: 365
}
}
});
$('#choiceMonth').dateRangePicker(configDatePicker).bind('datepicker-apply', function (event, obj) {
$('.fa-refresh').show();
var month1 = obj.date1.getMonth();
var day1 = obj.date1.getDate();
var year1 = obj.date1.getFullYear();
var month2 = obj.date2.getMonth();
var day2 = obj.date2.getDate();
var year2 = obj.date2.getFullYear();
var date1 = (month1 + 1) + "/" + day1 + "/" + year1 + " 00:00:01";
var date2 = (month2 + 1) + "/" + day2 + "/" + year2 + " 23:59:59";
getChartData(date1, date2);
});
$('.apply-btn').attr('value', 'Valider');
});#
}
var dataDonught = {
labels: [
"Visites de talents",
"Visites d'entreprises",
"Visites d'internautes non inscrit"
],
datasets: [{
data: donughtRecords,
backgroundColor: [
"#FF6384",
"#36A2EB",
"#FFCE56"
{
#
function setArrayValues() {
arrayCurrentsLabel = [];
arrayCurrentsAdsValues = [];
arrayCurrentsCompanyValues = [];
arrayRecords['labels'].forEach(function (element, index) {
var date = element.split("-");
var dateAffiche = date[2] + "-" + date[1] + "-" + date[0];
arrayCurrentsLabel.push(dateAffiche);
arrayCurrentsAdsValues.push(arrayRecords['datasetsAd'][index]);
arrayCurrentsCompanyValues.push(arrayRecords['datasetsCompany'][index]);
});
myChart.data.labels = arrayCurrentsLabel;
myChart.data.datasets[0].data = arrayCurrentsAdsValues;
myChart.data.datasets[1].data = arrayCurrentsCompanyValues;
if (arrayCurrentsAdsValues.length > 0) {
sumVisitsAds = arrayCurrentsAdsValues.reduce(function (memo, val) {
let value = val || 0;
if (value != null) {
return memo + value;
}
});
} else {
sumVisitsAds = 0;
}
if (arrayCurrentsCompanyValues.length > 0) {
sumCompanyValues = arrayCurrentsCompanyValues.reduce(function (memo, val) {
let value = val || 0;
if (value != null) {
return memo + value;
}
});
} else {
sumCompanyValues = 0;
}
$('.countVisitsAds').html(sumVisitsAds);
$('.countVisitsCompany').html(sumCompanyValues);
}
var dataLine = {
datasets: [{
label: "Nombre de visite d'annonce par jour",
fill: false,
fontColor: "rgba(39,139,231,1)",
backgroundColor: "rgba(39,139,231,1)",
borderColor: "rgba(39,139,231,1)"
}, {
label: "Nombre de visite de votre page entreprise",
fill: false,
fontColor: "#F9C339",
backgroundColor: "#F9C339",
borderColor: "#F9C339"
}]
};
var ctx = document.getElementById("nb_visits");
var myChart = new Chart(ctx, {
type: 'line',
data: dataLine,
options: {
legend: {
display: false
},
scales: {
xAxes: [{
display: true,
scaleLabel: {
display: true,
labelString: 'Date'
}
}],
yAxes: [{
ticks: {
min: 0
},
scaleLabel: {
display: true,
labelString: 'Valeur'
}
}]
}
}
});
var dataDonught = {
labels: [
"Visites de talents",
"Visites d'entreprises",
"Visites d'internautes non inscrit"
],
hoverBackgroundColor: [
"#FF6384",
"#36A2EB",
"#FFCE56"
]
}]
};
var ctxDonught = document.getElementById("donught_visits");
var myDoughnutChart = new Chart(ctxDonught, {
type: 'doughnut',
data: dataDonught,
options: {
legend: {
display: false,
},
animation: {
animateScale: true
datasets: [{
data: donughtRecords,
backgroundColor: [
"#FF6384",
"#36A2EB",
"#FFCE56"
],
hoverBackgroundColor: [
"#FF6384",
"#36A2EB",
"#FFCE56"
]
}]
};
var ctxDonught = document.getElementById("donught_visits");
var myDoughnutChart = new Chart(ctxDonught, {
type: 'doughnut',
data: dataDonught,
options: {
legend: {
display: false,
},
animation: {
animateScale: true
}
}
}
}); #}
});#
}
</script>
{% endblock %}
+1 -1
View File
@@ -80,7 +80,7 @@ twig:
globals:
push_public_key: "%push_params.public_key%"
fairlane_cookie_consent: '@fairlane_cookie_consent.twig'
version: '2.5.1'
version: '2.6.1'
@@ -159,6 +159,16 @@ class AnswerController extends AbstractController
// But if that werent't the case, its value should have been tested
// before assigning it to $responseTemp
$responseTemp = $answer->getUser()->getFirstname();
if($answer->getUser()->getCompany()){
if($answer->getUser()->getCompany()->getCv()){
if ($this->container->get( 'kernel' )->getEnvironment() == "dev") {
$cheminCv = "../../../../../uploads/cv/";
}else{
$cheminCv = "../../../../uploads/cv/";
}
$responseTemp .= "<br> <a target='_blank' href='".$cheminCv.$answer->getUser()->getCompany()->getCv()."'>Lien vers le CV papier</a>";
}
}
break;
}
@@ -206,7 +216,12 @@ class AnswerController extends AbstractController
}
case 'status':
{
$responseTemp = "<span id='status_".$answer->getId()."'> ".$answer->getstatus()."</span> ";
if($answer->getstatus()=="SENDED"){
$status= "ENVOYE";
}else{
$status=$answer->getstatus();
}
$responseTemp = "<span id='status_".$answer->getId()."'> ".$status."</span> ";
break;
@@ -24,10 +24,15 @@ class MediaController extends Controller
public function adminVideoModerationListAction()
{
$em = $this->getDoctrine()->getManager();
$medias = $em->getRepository('AppBundle:Media')->findByStatus('TO_MODERATE');
$medias = $em->getRepository('AppBundle:Media')->getMedias();
if ($this->container->get( 'kernel' )->getEnvironment() == "dev") {
$chemin="../../../../uploads/videos/";
}else{
$chemin="../../../uploads/videos/";
}
return $this->render('admin/media_list_moderation.html.twig', array(
'medias' => $medias,
'chemin' => $chemin,
));
}
@@ -271,42 +271,37 @@ class AnswerController extends Controller
*/
public function talentCreateSpontaneaousAction(Request $request, Company $company)
{
$securityContext = $this->container->get('security.authorization_checker');
if (!$securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
$this->createAnonymousUser();
}
$em = $this->getDoctrine()->getManager();
$existAnswer = $em->getRepository('AppBundle:Answer')->findOneBy(array('user' => $this->getUser(), 'company' => $company));
if ($existAnswer) {
if ($existAnswer->getStatus() == "SENDED") {
$answer = new Answer($this->getUser(), null, 'DRAFT', $company);
$em->persist($answer);
$em->flush();
} else {
$answer = $existAnswer;
}
} else {
$answer = new Answer($this->getUser(), null, 'DRAFT', $company);
$em->persist($answer);
$em->flush();
}
$em->persist($answer);
$em->flush();
$user = $this->getUser();
$mustLogin = false;
if (!$user->hasRole('ROLE_TALENT')) {
$mustLogin = true;
}
$route_videotheque = $this->generateUrl("answer_create_company_step2", array('id' => $company->getId(), 'type' => 'videotheque'));
$this->get('twig')->addGlobal('destination_login', $route_videotheque);
// $securityContext = $this->container->get('security.authorization_checker');
// if (!$securityContext->isGranted('IS_AUTHENTICATED_FULLY')) {
// $this->createAnonymousUser();
// }
// $em = $this->getDoctrine()->getManager();
// $existAnswer = $em->getRepository('AppBundle:Answer')->findOneBy(array('user' => $this->getUser(), 'company' => $company));
// if ($existAnswer) {
// if ($existAnswer->getStatus() == "SENDED") {
// $answer = new Answer($this->getUser(), null, 'DRAFT', $company);
// $em->persist($answer);
// $em->flush();
// } else {
// $answer = $existAnswer;
// }
// } else {
// $answer = new Answer($this->getUser(), null, 'DRAFT', $company);
// $em->persist($answer);
// $em->flush();
// }
// $em->persist($answer);
// $em->flush();
// $user = $this->getUser();
// $mustLogin = false;
// if (!$user->hasRole('ROLE_TALENT')) {
// $mustLogin = true;
// }
// $route_videotheque = $this->generateUrl("answer_create_company_step2", array('id' => $company->getId(), 'type' => 'videotheque'));
// $this->get('twig')->addGlobal('destination_login', $route_videotheque);
return $this->render('answer/answer_create_step1.html.twig', array(
'typeObject' => 'Company',
'answer' => $answer,
'object' => $company,
'mustLogin' => $mustLogin,
'route_videotheque' => $route_videotheque,
));
return $this->render('answer/answer_create_step1.html.twig'
);
}
/**
@@ -173,34 +173,44 @@ class AnswerController extends FOSRestController
$mailManager = $this->get('app.mail_manager');
foreach ($usersCompany as $user){
$mj = new Client($this->getParameter('mailjet_public'), $this->getParameter('mailjet_private'));
$mj = new Client("355697fac93fca865660734b4fdffaeb", "ddecf75321ca89c09e561857b13534c8");
$link = $this->generateUrl('company_answer_show', array('id' => $answer->getId()), UrlGeneratorInterface::ABSOLUTE_URL);
$contactMail = $user->getEmail();
if ($this->container->get( 'kernel' )->getEnvironment() == "dev") {
$contactMail = "dev@talentstube.com";
}else{
// $complSubject="";
// if($user->getEmail()){
// $complSubject=$user->getEmail();
// }
if($answer->getUser()){
$body = [
'FromEmail' => "noreply@talentstube.io",
'FromName' => "Talents Tube",
// 'To' => $contactMail,
'Subject' => "Une nouvelle candidature reçue sur Talents Tube ",
'MJ-TemplateID' =>2297838 ,
'MJ-TemplateLanguage' => true,
'Recipients' => [
[
'Email' => $contactMail,
'Name' => $user->getLastname(),
'Vars' => [
'prenomRecruteur' => $user->getFirstname(),
'nomRecruteur' => $user->getLastname(),
'prenom' => $answer->getUser()->getFirstname(),
'nom' => $answer->getUser()->getLastname(),
'urlCandidature' => $link,
]
]
],
];
$response = $mj->post(Resources::$Email, ['body' => $body]);
$response->success() ;
}
}
$body = [
'FromEmail' => "noreply@talentstube.io",
'FromName' => "Talents Tube",
'Subject' => "Une nouvelle candidature reçue sur Talents Tube",
'MJ-TemplateID' =>2164146 ,
'MJ-TemplateLanguage' => true,
'Recipients' => [
[
'Email' => $contactMail,
'Vars' => [
'prenomRecruteur' => $user->getFirstname(),
'nomRecruteur' => $user->getLastname(),
'prenom' => $answer->getUser()->getFirstname(),
'nom' => $answer->getUser()->getLastname(),
'imgCandidature' => $img,
'urlCandidature' => $link,
]
]
]
];
$response = $mj->post(Resources::$Email, ['body' => $body]);
$response->success() && var_dump($response->getData());
// $mailManager->sendMail(
@@ -100,6 +100,7 @@ class SecurityController extends FOSRestController
$alias = $slugService->slugify($user->getId() . "-" . $user->getFirstname() . "-" . $user->getLastname());
$company->setAlias($alias);
$company->setType("TALENT");
$company->setDescription("Annonce consultée : ".$adId);
$user->setCompany($company);
$userManager->updateUser($user);
}
@@ -164,6 +165,21 @@ class SecurityController extends FOSRestController
$countryTalent = "";
}
$titleTalent = htmlspecialchars($request->get('currentJob'));
$geoloc = htmlspecialchars($request->get('geoloc'));
$street_number = htmlspecialchars($request->get('street_number'));
$route = htmlspecialchars($request->get('route'));
$locality = htmlspecialchars($request->get('locality'));
$administrative_area_level_2 = htmlspecialchars($request->get('administrative_area_level_2'));
$administrative_area_level_1 = htmlspecialchars($request->get('administrative_area_level_1'));
$country = htmlspecialchars($request->get('country'));
$postal_code = htmlspecialchars($request->get('postal_code'));
$formatted_address = str_replace('"', '', $request->get('formatted_address'));
$lat = stripslashes($request->get('lat'));
$lng = stripslashes($request->get('lng'));
//
$newLinkedin = htmlspecialchars($request->get('linkedin'));
$newTwitter = htmlspecialchars($request->get('twitter'));
$newWebsite = htmlspecialchars($request->get('website'));
@@ -180,6 +196,26 @@ class SecurityController extends FOSRestController
$talent->setLinkedin($newLinkedin);
$talent->setTwitter($newTwitter);
$talent->setTitleTalent($titleTalent);
$array = Array ();
// \"$formatted_address
if($formatted_address!=""){
$array[] = Array (
"street_number" => $street_number,
"route" => $route,
"administrative_area_level_2" => $administrative_area_level_2,
"administrative_area_level_1" => $administrative_area_level_1,
"country" => $country,
"locality" => $locality,
"postal_code" => $postal_code,
"formatted_address" => $formatted_address,
"lat" => stripslashes($lat),
"lng" => stripslashes($lng)
);
$usr->setGeoloc($array);
}
$talent->setPhoneTalent($phoneTalent);
//$talent->setPhoneTalent($phoneTalent);
$billing = array(
@@ -194,7 +230,7 @@ class SecurityController extends FOSRestController
$companyManager->updateTalent($usr);
$status = array('status' => "success");
$status = array('status' => "success!!!!!!!!!!!!!!!!!!");
}
} else {
$status = array('status' => "failure", 'message' => "Vous n'êtes pas connecté.");
@@ -36,9 +36,27 @@ class CompanyController extends Controller
$stats = $this->get("app.stats_manager");
$em = $this->getDoctrine()->getManager();
$ads = $em->getRepository('AppBundle:Ad')->findBy(array('company' => $this->getUser()->getCompany()));
$arrayDate['dateBegin'] = new \DateTime('now -7 Day');
$arrayDate['dateEnd'] = new \DateTime('now');
$records7days = $stats->getCompanyDashboard($this->getUser()->getCompany()->getId(), $arrayDate);
//dump($records7days);
$arrayDate['dateBegin'] = new \DateTime('now -30 Day');
$records30days = $stats->getCompanyDashboard($this->getUser()->getCompany()->getId(), $arrayDate);
//dump($records30days);
$records = $stats->getCompanyDashboard($this->getUser()->getCompany()->getId(), null);
//dump($records);
$answersSended = $em->getRepository('AppBundle:Answer')->getAnswerByCompanyStatus($this->getUser()->getCompany()->getId(), 'SENDED');
$answersDraft = $em->getRepository('AppBundle:Answer')->getAnswerByCompanyStatus($this->getUser()->getCompany()->getId(), 'DRAFT');
$nbAnswersSended =count($answersSended);
$nbAnswersDraft =count($answersDraft);
return $this->render('company/dashboard.html.twig', [
'ads' => $ads,
'records7days' => $records7days,
'records30days' => $records30days,
'records' => $records,
'nbAnswersSended' => $nbAnswersSended,
'nbAnswersDraft' => $nbAnswersDraft,
'arrayByAds' => $records['arrayByAds'],
]);
}
@@ -111,9 +111,9 @@ class MediaController extends Controller
]);
}
public function convertKekab($string){
$search = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'à', 'á', 'â', 'ã', 'ä', 'å', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ò', 'ó', 'ô', 'õ', 'ö', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ');
$search = array('À', 'Á', 'Â', 'Ã', 'Ä', 'Å', 'Ç', 'È', 'É', 'Ê', 'Ë', 'Ì', 'Í', 'Î', 'Ï', 'Ò', 'Ó', 'Ô', 'Õ', 'Ö', 'Ù', 'Ú', 'Û', 'Ü', 'Ý', 'à', 'á', 'â', 'ã', 'ä', 'å', 'ç', 'è', 'é', 'ê', 'ë', 'ì', 'í', 'î', 'ï', 'ð', 'ò', 'ó', 'ô', 'õ', 'ö', 'ù', 'ú', 'û', 'ü', 'ý', 'ÿ', "/");
//Préférez str_replace à strtr car strtr travaille directement sur les octets, ce qui pose problème en UTF-8
$replace = array('A', 'A', 'A', 'A', 'A', 'A', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y');
$replace = array('A', 'A', 'A', 'A', 'A', 'A', 'C', 'E', 'E', 'E', 'E', 'I', 'I', 'I', 'I', 'O', 'O', 'O', 'O', 'O', 'U', 'U', 'U', 'U', 'Y', 'a', 'a', 'a', 'a', 'a', 'a', 'c', 'e', 'e', 'e', 'e', 'i', 'i', 'i', 'i', 'o', 'o', 'o', 'o', 'o', 'o', 'u', 'u', 'u', 'u', 'y', 'y', "s");
$string = str_replace($search, $replace, $string);
$string = strtolower (str_replace(" ", "-", $string));
@@ -80,6 +80,15 @@ class User extends BaseUser
*/
private $status;
/**
* @var array
*
* @ORM\Column(name="geoloc", type="json_document", nullable=true, options={"jsonb":true})
* @Groups({"ad_detail", "ad_list", "answer_detail", "company_detail"})
*/
private $geoloc;
/**
* @ORM\ManyToOne(targetEntity="AppBundle\Entity\Company", inversedBy="users", cascade={"persist"})
*/
@@ -407,6 +416,8 @@ class User extends BaseUser
$linkedin="";
$twitter="";
if($this->getCompany()->getExtra()){
//19/01 j'ai eneleve le initExtra de ExtraJsonTrait
$this->getCompany()->initExtra();
if(array_key_exists("phoneTalent", $this->getCompany()->getExtra())){
if($this->getCompany()->getExtra()["phoneTalent"]){
$phone= $this->getCompany()->getExtra()["phoneTalent"];
@@ -449,6 +460,7 @@ class User extends BaseUser
"country" => $country,
"type" => $type,
"currentJob" => $this->getCompany()->getExtra()["titleTalent"],
"geoloc" => $this->getGeoloc(),
"website" => $this->getCompany()->getWebsite(),
);
return $card;
@@ -615,6 +627,32 @@ class User extends BaseUser
return $this->status;
}
/**
* Set Geoloc.
*
* @param json_document|null $geoloc
*
* @return User
*/
public function setGeoloc($geoloc = null)
{
$this->geoloc = $geoloc;
return $this;
}
/**
* Get geoloc.
*
* @return json_document|null
*/
public function getGeoloc()
{
//19/01 : modif pour size et siren cote Symfony. Effet sur la web app?
//$this->initExtra();
return $this->geoloc;
}
/**
* Set facebookId.
*
@@ -113,6 +113,26 @@ class AnswerRepository extends AbstractRepository
->getResult();
}
public function getAnswerByCompanyStatus($id, $status)
{
$qb = $this
->createQueryBuilder('a')
->select('a')
->where('a.ad IN (
SELECT p.id
FROM AppBundle:Ad p
WHERE p.company = :id
)')
->setParameter(':id', $id)
->andWhere('a.status = :status')
->setParameter(':status', $status)
->orderBy('a.uTime','DESC');
return $qb
->getQuery()
->getResult();
}
public function getAnswerByAdsShare( $adId)
{
@@ -318,4 +338,26 @@ class AnswerRepository extends AbstractRepository
"countResult" => $countResult
);
}
public function getMedias()
{
$qb = $this
->createQueryBuilder('a')
->select(['a','video'])
->leftJoin('a.video', 'video')
->andWhere('video.status = :status')
->setParameter(':status', "TO_MODERATE")
->orderBy('video.id', 'DESC');
$medias = $qb->getQuery()->getResult();
return $medias;
}
}
@@ -2,12 +2,45 @@
namespace AppBundle\Repository;
use Doctrine\ORM\EntityRepository;
/**
* MediaRepository
*
* This class was generated by the Doctrine ORM. Add your own custom
* repository methods below.
*/
class MediaRepository extends \Doctrine\ORM\EntityRepository
class MediaRepository extends AbstractRepository
{
public function getMedias()
{
$qb = $this
->createQueryBuilder('m')
->andWhere('m.status = :status')
->setParameter(':status', "TO_MODERATE")
->orderBy('m.id', 'DESC');
$medias = $qb->getQuery()->getResult();
$rawSql = "SELECT m.id as mediaid, m.title as title, m.original_url as original_url , u.* , a.id as answerId, a.send_time as sendtime, ad.title as adTitle, c.brand_name as cTitle
FROM media AS m
JOIN fos_user AS u ON (u.id=m.creator_id)
LEFT JOIN answer AS a ON (a.video_id=m.id)
LEFT JOIN ad AS ad ON (ad.id=a.ad_id)
LEFT JOIN company AS c ON (c.id=a.company_id)
WHERE m.status='TO_MODERATE'
ORDER by m.id DESC";
$stmt = $this->getEntityManager()->getConnection()->prepare($rawSql);
$stmt->execute([]);
return $stmt->fetchAll();
//return $medias;
}
}
@@ -77,8 +77,12 @@ class CompanyManager
);
}
$company->setExtra(null);
$this->em->persist($company);
$this->em->flush();
$company->setExtra($extra);
$company->upload();
//$company->uploadCv();
}
$this->em->persist($company);
@@ -66,8 +66,8 @@ trait ExtraJsonTrait
*/
public function getExtra()
{
$this->initExtra();
//19/01 : modif pour size et siren cote Symfony. Effet sur la web app?
//$this->initExtra();
return $this->extra;
}
@@ -96,4 +96,35 @@
text-decoration : underline;
}
.text-card h3, .text-card span, .text-card h4{
color:#fff;
}
.card-background-1{
background-color:#25D89A !important;
border-radius:3px !important;
padding:20px;
min-height:180px;
}
.card-background-2{
background-color:#1689fb !important;
border-radius:3px !important;
padding:20px;
min-height:180px;
}
.card-background-3{
background-color:#FF5A5F !important;
border-radius:3px !important;
padding:20px;
min-height:180px;
}
.vertical-border{
border-right: 1px solid white;
}
+57
View File
@@ -0,0 +1,57 @@
<?xml version="1.0" encoding="UTF-8"?>
<urlset
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<!-- created with Free Online Sitemap Generator www.xml-sitemaps.com -->
<url>
<loc>https://recruteur.talentstube.com/</loc>
<lastmod>2020-11-18T16:05:39+00:00</lastmod>
<priority>1.00</priority>
</url>
<url>
<loc>https://recruteur.talentstube.com/offre-emploi-video</loc>
<lastmod>2020-11-18T16:05:39+00:00</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://recruteur.talentstube.com/marque-employeur-video</loc>
<lastmod>2020-11-18T16:05:39+00:00</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://recruteur.talentstube.com/candidatures-video</loc>
<lastmod>2020-11-18T16:05:39+00:00</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://recruteur.talentstube.com/mentions-legales</loc>
<lastmod>2020-11-18T16:05:39+00:00</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://recruteur.talentstube.com/cgu</loc>
<lastmod>2020-11-18T16:05:39+00:00</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://recruteur.talentstube.com/politique-confidentialite</loc>
<lastmod>2020-11-18T16:05:39+00:00</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://recruteur.talentstube.com/abonnement</loc>
<lastmod>2020-11-18T16:05:39+00:00</lastmod>
<priority>0.80</priority>
</url>
<url>
<loc>https://recruteur.talentstube.com/register/</loc>
<lastmod>2020-11-18T16:05:39+00:00</lastmod>
<priority>0.80</priority>
</url>
</urlset>