1. Database

Talentree gebruikt een MYSQL database. De inhoudelijke data (de trees) zijn opgeslagen in de Nested set Setup. De library gebruikt om data te behandelen/opslaan/verwerken: Baum. Momenteel worden er voor iedere branche een aparte tabellen aangemaakt:

  • Talentree_sector
  • Talentree_sector_ocr
  • Translation_sector

De huidige branches die worden ondersteund:

  • ICT
  • Techniek
  • Uitstroom

Naast bovenstaande branches is er één losse structuur voor alle globale zaken. Dit is:

  • Talentree_global
    • Competence
    • Functional
    • Educational
  • Talentree_global_ocr
  • Translation_global

2. API

The API ontsluit alle data die in bovenstaande tabellen is opgenomen. Eigenschappen van de api:

  • Rest API
  • Accepteert POST/GET/OPTION
  • Alle communicatie is in JSON

API documentatie en test interface is te vinden op Api documentatie

3. Client

Er is een client library gebouwd ter ondersteuning van gebruikers van talentree. Deze library is een wrapper om Guzzle HTTP library om snel en makkelijk requests te doen naar de API. Naast deze wrapper maakt deze library het leven iets makkelijker door:

  • Standaard configraties opslaan zoals API-key
  • Instellen van een lokale interpertatie van de Talentree
  • Verwerken van CV / Vacature en verwerking mappen naar lokale instellingen
  • Ophalen van lijsten (plat of nested) gemapt naar lokale instellingen (voor bijvoorbeeld filters)

Download de laatste versie via: Github of via Packagist


3.1 Installeren package

composer require "viancen/talentree-client"


3.2 Configureren package

Eerst heb je een API-Key nodig, vraag deze aan via info@talentree.io. In de package zit een voorbeeld configuratie bestand (documentation/talentree-config.php). Deze dien je toe te voegen aan je applicatie. Onderstaande configuratie is een voorbeeld. Het is altijd de bedoeling dat Inforvision een basis setup doet / deze configuratie naar gelang de behoefte van de klant deze data levert, tenzij de klant zelf een interpertatie doet of de standaard library niet gebruikt.

1    <?php
2    /**
3     * You should set the parts of Talentree you want to use. An example of how this configuration works
4     */
5    $config = [
6        'apiKey' => 'YOUR_API_KEY',
7        'apiRoot' => 'https://talentree.io/v1/ict', //only for internal use
8        'apiOptions' => [
9            'settings' => [
10               25 => [
11                   'id' => 25,
12                   'icon' => 'fa fa-bookmark',
13                   'name' => 'Functierol',
14                   'items' => [
15                       [
16                           'id' => 25,
17                           'name' => 'Functierol'
18                       ]
19                   ]
20               ],
21               17 => [
22                   'id' => 17,
23                   'icon' => 'fa fa-bolt',
24                   'name' => 'Functiegebied',
25                   'items' => [
26                       [
27                           'id' => 17,
28                           'name' => 'Functiegebied'
29                       ]
30                   ]
31               ],
32               1738 => [
33                   'id' => 1738,
34                   'icon' => 'fa fa-briefcase',
35                   'name' => 'Kennisgebieden',
36                   'items' => [
37                       [
38                           'id' => 1738,
39                           'name' => 'Kennisgebieden'
40                       ]
41                   ]
42               ],
43               11 => [
44                   'id' => 11,
45                   'icon' => 'fa fa-cog',
46                   'name' => 'Vaardigheden',
47                   'items' => 'all-children'
48               ],
49               37 => [
50                   'id' => 37,
51                   'icon' => 'fa fa-flask',
52                   'name' => 'Methoden',
53                   'items' => [
54                       [
55                           'id' => 37,
56                           'name' => 'Methoden'
57                       ]
58                   ]
59               ],
60               604 => [
61                   'id' => 604,
62                   'icon' => 'fa fa-male',
63                   'name' => 'Persoonlijke eigenschappen',
64                   'items' => [
65                       [
66                           'id' => 604,
67                           'name' => 'Persoonlijke eigenschappen'
68                       ]
69                   ]
70               ]
71           ],
72           'filter_settings' => [
73               25 => 'Functierol',
74               17 => 'Functiegebied',
75               1738 => 'Kennisgebieden',
76               11 => 'Vaardigheden',
77               37 => 'Methoden',
78           ]
79       ]
80   ];
81   

Voorbeeld

Connectie

Eerste stap is connectie maken met de api en een instantie starten van \TalentreeClient en een de lijsten met subitems uit de configuratie op te halen.

1    <?php 
2    include __DIR__.'/vendor/autoload.php'; 
3    include __DIR__.'/talentree-config.php'; 
4     
5    $talentree = new TalentreeClient($config['apiKey'],$config['apiRoot'],$config['apiOptions']); 
6     
7    /** 
8     * haalt de 'settings' node uit de configuratie op en haalt voor ieder hoofditem  
9     * alle children op.   
10    */ 
11   $array = ($talentree->getSettingLists()); 
12   var_export($array);

Bovenstaande zal resulteren in een array van alle items onder de gedefinieerde hoofdgroepen in de configuratie zoals Functierol

Parsing

Het parsen van een CV is redelijk eenvoudig met de volgende stappen:

1    <?php 
2    include __DIR__ . '/vendor/autoload.php'; 
3    include __DIR__ . '/talentree-config.php'; 
4     
5    $talentree = new TalentreeClient($config['apiKey'], $config['apiRoot'], $config['apiOptions']); 
6     
7    /** 
8     * Talentree verwacht een bestandsnaam en de base64 gecodeerde inhoud van het bestand. 
9     * 
10    */ 
11   $resumeData = [ 
12       'filename' => 'Resume_2016_JanJanssen.pdf', //PDF,DOCX,DOC,XLSX,RTF,TXT 
13       'base64source' => base64_encode(file_get_contents(__DIR__ . '/uploads/Resume_2016_JanJanssen.pdf')), 
14   ]; 
15    
16   $array = ($talentree->parseResume($resumeData)); 
17    
18   var_export($array);

Bovenstaande zal resulteren in de volgende response:

1    <?php 
2    array( 
3        'talentree' => 
4            array( 
5                'idList' => 
6                    array( 
7                        0 => 9, 
8                        1 => 10, 
9                        2 => 11, 
10                       3 => 287, 
11                       4 => 281, 
12                       5 => 288, 
13                       6 => 1893, 
14                       7 => 2484, 
15                       8 => 502, 
16                       9 => 1551, 
17                       10 => 514, 
18                       11 => 604, 
19                       12 => 1454, 
20                       13 => 1500, 
21                       14 => 1455, 
22                       15 => 1519, 
23                       16 => 1520, 
24                       17 => 1569, 
25                       18 => 1570, 
26                       19 => 1571, 
27                       20 => 2238, 
28                       21 => 2239, 
29                       22 => 2464, 
30                       23 => 2781, 
31                   ), 
32               'results' => 
33                   array( 
34                       1520 => 
35                           array( 
36                               'id' => 1520, 
37                               'name' => 'Verantwoordelijk', 
38                               'long_name' => NULL, 
39                               'count' => 3, 
40                           ), 
41                       9 => 
42                           array( 
43                               'id' => 9, 
44                               'name' => 'Functie', 
45                               'long_name' => NULL, 
46                               'count' => 3, 
47                           ), 
48                       1570 => 
49                           array( 
50                               'id' => 1570, 
51                               'name' => 'Nederlands', 
52                               'long_name' => '', 
53                               'count' => 3, 
54                           ), 
55                       2239 => 
56                           array( 
57                               'id' => 2239, 
58                               'name' => 'Frans', 
59                               'long_name' => NULL, 
60                               'count' => 3, 
61                           ), 
62                       2238 => 
63                           array( 
64                               'id' => 2238, 
65                               'name' => 'Duits', 
66                               'long_name' => NULL, 
67                               'count' => 3, 
68                           ), 
69                       1571 => 
70                           array( 
71                               'id' => 1571, 
72                               'name' => 'Engels', 
73                               'long_name' => '', 
74                               'count' => 3, 
75                           ), 
76                       10 => 
77                           array( 
78                               'id' => 10, 
79                               'name' => 'Branche', 
80                               'long_name' => NULL, 
81                               'count' => 2, 
82                           ), 
83                       2781 => 
84                           array( 
85                               'id' => 2781, 
86                               'name' => 'Zakelijke dienstverlening', 
87                               'long_name' => NULL, 
88                               'count' => 2, 
89                           ), 
90                       1893 => 
91                           array( 
92                               'id' => 1893, 
93                               'name' => 'Software', 
94                               'long_name' => '', 
95                               'count' => 1, 
96                           ), 
97                       1500 => 
98                           array( 
99                               'id' => 1500, 
100                              'name' => 'Concluderend', 
101                              'long_name' => NULL, 
102                              'count' => 1, 
103                          ), 
104                      514 => 
105                          array( 
106                              'id' => 514, 
107                              'name' => 'Ms Word', 
108                              'long_name' => NULL, 
109                              'count' => 1, 
110                          ), 
111                      288 => 
112                          array( 
113                              'id' => 288, 
114                              'name' => 'Assistent', 
115                              'long_name' => '', 
116                              'count' => 1, 
117                          ), 
118                      281 => 
119                          array( 
120                              'id' => 281, 
121                              'name' => 'Medewerker (algemeen)', 
122                              'long_name' => '', 
123                              'count' => 1, 
124                          ), 
125                      2464 => 
126                          array( 
127                              'id' => 2464, 
128                              'name' => 'Spaans', 
129                              'long_name' => NULL, 
130                              'count' => 1, 
131                          ), 
132                      11 => 
133                          array( 
134                              'id' => 11, 
135                              'name' => 'Vaardigheden', 
136                              'long_name' => '', 
137                              'count' => 1, 
138                          ), 
139                  ), 
140          ),
    

Dit resultaat dient vervolgens te worden ge-interpeteerd via de frontends configuratie. Hiervoor is een functie aanwezig in de library die de resultaten van TT omzet naar een tussenformaat wat we later weer gebruiken. Een voorbeeld hiervan:

  • Aanname: het aantal herkenningen (score) is evenredig aan de score berekenig. Dus maximaal aantal herkende items is 100%. In bovenstaand geval zou dit zijn: 3
1    <?php 
2    include __DIR__ . '/vendor/autoload.php'; 
3    include __DIR__ . '/talentree-config.php'; 
4     
5    $talentree = new TalentreeClient($config['apiKey'], $config['apiRoot'], $config['apiOptions']); 
6     
7    /** 
8     * Talentree verwacht een bestandsnaam en de base64 gecodeerde inhoud van het bestand. 
9     * 
10    */ 
11   $resumeData = [ 
12       'filename' => 'Resume_2016_JanJanssen.pdf', //PDF,DOCX,DOC,XLSX,RTF,TXT 
13       'base64source' => base64_encode(file_get_contents(__DIR__ . '/uploads/Resume_2016_JanJanssen.pdf')), 
14   ]; 
15    
16   /** 
17    * get default tt data 
18    */ 
19   $array = $talentree->parseResume($resumeData); 
20    
21   /** 
22    * Zie sortResults in library. 
23    * @description  
24    * 
25    * 1. Loopt door alle settings (uit config heen) 
26    * 2. Haalt van iedere setting (op 1e niveau) alle childs op OF 
27    *    wanneer er childs zijn gedefineerd: alleen die childs met /flat-tree/ dus platte array 
28    * 3. Loopt door iedere subboom / child hierboven heen 
29    * 4. Als recognizable = false, wordt deze verwijderd 
30    *    Als het id van de Child niet voorkomt in de idList van het resultaat wordt deze vewijderd 
31    *    Wat er overblijft zijn ALLE nodes die onder de instelling vallen EN herkend zijn 
32    *    Van deze nodes wordt de beschrijving toegevoegd (wat niet in de parser zit) 
33    *    De resultaten worden gesorteerd op basis van de herkende scores (dus count) 
34    * 5. De scores worden omgezet naar procentuele weergave (de maximale score = 100% en relatief daarvan de rest) 
35    *    Deze resultaten worden verrijkt met bv label uit instellingen en icon. 
36    * 
37    */ 
38   $hrResult = $talentree->sortResults($array); 
39    
40   var_export($hrResult);

Bovenstaande actie resulteert in het volgende:

1    <?php 
2    array( 
3        'Vaardigheden' => 
4            array( 
5                'Software' => 
6                    array( 
7                        0 => 
8                            array( 
9                                'item' => 
10                                   array( 
11                                       'id' => 514, 
12                                       'name' => 'Ms Word', 
13                                       'long_name' => NULL, 
14                                       'count' => 1, 
15                                   ), 
16                               'score' => 50, 
17                               'icon' => 'fa fa-cog', 
18                           ), 
19                       1 => 
20                           array( 
21                               'item' => 
22                                   array( 
23                                       'id' => 1893, 
24                                       'name' => 'Software', 
25                                       'long_name' => '', 
26                                       'count' => 1, 
27                                   ), 
28                               'score' => 50, 
29                               'icon' => 'fa fa-cog', 
30                           ), 
31                   ), 
32           ), 
33       'Persoonlijke eigenschappen' => 
34           array( 
35               'Persoonlijke eigenschappen' => 
36                   array( 
37                       0 => 
38                           array( 
39                               'item' => 
40                                   array( 
41                                       'id' => 1520, 
42                                       'name' => 'Verantwoordelijk', 
43                                       'long_name' => NULL, 
44                                       'count' => 3, 
45                                   ), 
46                               'score' => 100.0, 
47                               'icon' => 'fa fa-male', 
48                           ), 
49                       1 => 
50                           array( 
51                               'item' => 
52                                   array( 
53                                       'id' => 1500, 
54                                       'name' => 'Concluderend', 
55                                       'long_name' => NULL, 
56                                       'count' => 1, 
57                                   ), 
58                               'score' => 33.0, 
59                               'icon' => 'fa fa-male', 
60                           ), 
61                   ), 
62           ), 
63   );

In bovenstaand resultaat zijn alle herkende zaken die niet terugkomen in de instellingen verwijderd. En is er een resultaatset gemaakt met - en gesorteerd op - procentuele score. Hiermee zou dan een presentatie gedaan kunnen worden van bijvoorbeeld een CV op een vacaturebank:

1    <?php 
2    include __DIR__ . '/vendor/autoload.php'; 
3    include __DIR__ . '/talentree-config.php'; 
4     
5    ini_set('xdebug.var_display_max_depth', -1); 
6    ini_set('xdebug.var_display_max_children', -1); 
7    ini_set('xdebug.var_display_max_data', -1); 
8     
9    $talentree = new TalentreeClient($config['apiKey'], $config['apiRoot'], $config['apiOptions']); 
10    
11   /** 
12    * Talentree verwacht een bestandsnaam en de base64 gecodeerde inhoud van het bestand. 
13    * 
14    */ 
15   $resumeData = [ 
16       'filename' => 'Resume_2016_JanJanssen.pdf', //PDF,DOCX,DOC,XLSX,RTF,TXT 
17       'base64source' => base64_encode(file_get_contents(__DIR__ . '/uploads/Resume_2016_JanJanssen.pdf')), 
18   ]; 
19    
20   /** 
21    * get default tt data 
22    */ 
23   $array = $talentree->parseResume($resumeData); 
24   //var_dump($array); 
25   /** 
26    * Zie sortResults in library. 
27    * @description  
28    * 
29    * 1. Loopt door alle settings (uit config heen) 
30    * 2. Haalt van iedere setting (op 1e niveau) alle childs op OF 
31    *    wanneer er childs zijn gedefineerd: alleen die childs met /flat-tree/ dus platte array 
32    * 3. Loopt door iedere subboom / child hierboven heen 
33    * 4. Als recognizable = false, wordt deze verwijderd 
34    *    Als het id van de Child niet voorkomt in de idList van het resultaat wordt deze vewijderd 
35    *    Wat er overblijft zijn ALLE nodes die onder de instelling vallen EN herkend zijn 
36    *    Van deze nodes wordt de beschrijving toegevoegd (wat niet in de parser zit) 
37    *    De resultaten worden gesorteerd op basis van de herkende scores (dus count) 
38    * 5. De scores worden omgezet naar procentuele weergave (de maximale score = 100% en relatief daarvan de rest) 
39    *    Deze resultaten worden verrijkt met bv label uit instellingen en icon. 
40    * 
41    */ 
42   $hrResult = $talentree->sortResults($array); 
43    
44   /** 
45    * Geeef de data weer in een tabel 
46    */ 
47    
48   foreach ($hrResult as $hoofdGroep => $items) { 
49    
50       //get icon... 
51       $icon = ''; 
52       foreach ($items as $subGroep => $subItems) { 
53           if (empty($subItems)) continue 2; 
54           foreach ($subItems as $talent) { 
55               $icon = $talent['icon']; 
56               break 2; 
57           } 
58       } 
59       ?> 
60       <h3><i class="<?php echo $icon ?>"></i> <?php echo $hoofdGroep ?></h3> 
61       <?php foreach ($items as $subGroep => $subItems) { ?> 
62           <table class="table table-default table-bordered table-conensed table-hover "> 
63               <thead> 
64               <tr> 
65                   <td><strong><?php echo $subGroep ?></strong></td> 
66                   <td><strong>Ervaring/kunde</strong></td> 
67               </tr> 
68               <tr> 
69                   <td></td> 
70                   <td> 
71                       <i class="fa fa-minus-circle"></i> 
72                       <i class="fa fa-plus-circle pull-right"></i> 
73                   </td> 
74               </tr> 
75               </thead> 
76               <tbody> 
77               <?php 
78               foreach ($subItems as $talent) { 
79                   ?> 
80                   <tr id="talentree-row-<?php echo $talent['item']['id'] ?>"> 
81                       <td width="300"><?php echo $talent['item']['name'] ?></td> 
82                       <td class="text-center" width="50"><?php echo $talent['score'] ?></td> 
83                   </tr> 
84               <?php } 
85               ?> 
86               </tbody> 
87           </table> 
88       <?php } 
89   } 
90   ?>