Showing 1 changed files with 126 additions and 116 deletions
+126 -116
analyse-votes-AN
... ...
@@ -171,12 +171,34 @@ function update_database () {
171 171
 }
172 172
 
173 173
 function write_comparaison () {
174
-    result="comparaisons ${groupe[0]} avec ${groupe_ref:-GDR}${dossier:+ - ${dossier}}"
174
+    result="scrutins ($(sum <<< "${groupe[@]}" | cut -b1-5))${dossier:+ - ${dossier}}"
175 175
     content="/dev/shm/$result/content.xml"
176
-    id_cols=(Scrutin Date Scéance Titre Adoption Panurgisme${nom:+ Participation Loyauté} Dossier)
176
+    id_cols=(Scrutin Date Séance Titre Adoption Dossier)
177 177
     eval $(sqlite_request 'select printf("typevotes[%i]=%s;", id, nom) from votes')
178 178
     nb_cols=$(( ${#id_cols[@]} + ${#typevotes[@]} * ${#groupe[@]} ))
179 179
     last_col=$(awk -v n=$nb_cols 'BEGIN{printf("%c%c", n < 27 ? "" : int(n/26) + 64, (n % 26) + (n % 26 == 0 ? 26 : 0) + 64)}' | tr -d '\0')
180
+    colors=($(awk -v n=${#groupe[@]} -v from=${from_color:-2A0636} -v to=${to_color:-D09B8A} '
181
+        function rgbL (p) {
182
+            r = rgb_from[1] + p * (rgb_to[1] - rgb_from[1])
183
+            g = rgb_from[2] + p * (rgb_to[2] - rgb_from[2])
184
+            b = rgb_from[3] + p * (rgb_to[3] - rgb_from[3])
185
+            L = r * 0.299 + g * 0.587 + b * 0.114
186
+            printf("%02x%02x%02x:%s\n", int(r), int(g), int(b), L > 185 ? "000000" : "ffffff")
187
+        }
188
+        BEGIN {
189
+            for (i = split(gensub("(..)(..)(..)", "\\1,\\2,\\3", "1", from), rgb_from, ","); i > 0; i--)
190
+                rgb_from[i] = strtonum(sprintf("%d", strtonum("0x" rgb_from[i])))
191
+            for (i = split(gensub("(..)(..)(..)", "\\1,\\2,\\3", "1", to), rgb_to, ","); i > 0; i--)
192
+                rgb_to[i] = strtonum(sprintf("%d", strtonum("0x" rgb_to[i])))
193
+
194
+            print "pour_bash_array_qui_commence_a_index_0"
195
+            rgbL(0)
196
+            for (i = 1; i < n-1; i++) {
197
+                rgbL(i/n)
198
+            }
199
+            if (n > 1) rgbL(1)
200
+        }
201
+    '))
180 202
     function write_cell () {
181 203
         case $1 in
182 204
             url)
... ...
@@ -241,9 +263,18 @@ EOcontent
241 263
     <style:style style:name="ta1" style:family="table" style:master-page-name="Default">
242 264
     <style:table-properties table:display="true" style:writing-mode="lr-tb"/>
243 265
     </style:style>
244
-    <style:style style:name="ce1" style:family="table-cell" style:parent-style-name="Default">
245
-    <style:table-cell-properties fo:background-color="#cccccc"/>
246
-    </style:style>
266
+EOcontent
267
+
268
+    for i in $(seq ${#groupe[@]}); do
269
+        cat >> "$content" << EOcontent
270
+        <style:style style:name="ce$i" style:family="table-cell" style:parent-style-name="Default">
271
+        <style:table-cell-properties fo:wrap-option="wrap" style:vertical-align="middle" fo:background-color="#${colors[$i]%:*}"/>
272
+        <style:text-properties fo:hyphenate="false" fo:color="#${colors[$i]}"/>
273
+        </style:style>
274
+EOcontent
275
+    done
276
+
277
+    cat >> "$content" << EOcontent
247 278
     </office:automatic-styles>
248 279
     <office:body>
249 280
     <office:spreadsheet>
... ...
@@ -254,12 +285,9 @@ EOcontent
254 285
 EOcontent
255 286
 
256 287
     for i in $(seq ${#typevotes[@]}); do
257
-        cat >> "$content" << EOcontent
258
-        <table:table-column table:style-name="co1" table:default-cell-style-name="ce1"/>
259
-EOcontent
260
-        for (( g = 1; g < ${#groupe[@]}; g++ )); do
288
+        for g in $(seq ${#groupe[@]}); do
261 289
             cat >> "$content" << EOcontent
262
-            <table:table-column table:style-name="co1" table:default-cell-style-name="Default"/>
290
+            <table:table-column table:style-name="co1" table:default-cell-style-name="ce$g"/>
263 291
 EOcontent
264 292
         done
265 293
     done
... ...
@@ -302,34 +330,12 @@ EOcontent
302 330
         write_cell texte "$seance"
303 331
         write_cell texte "$title"
304 332
         write_cell texte "$adoption"
333
+        write_cell url   "${dossier_url/#null/\"\"}" "${dossier_texte/#null}"
305 334
 
335
+        unset votes
306 336
         for typevote in $(seq ${#typevotes[@]}); do
307
-            vote_cible[$typevote]=$(sqlite_request "select
308
-                                        count(député)
309
-                                     from
310
-                                        dépouillements
311
-                                     inner join
312
-                                        députés, groupes
313
-                                     on
314
-                                        députés.groupe = groupes.id and dépouillements.député = députés.id
315
-                                     where
316
-                                        scrutin is $scrutin
317
-                                     and
318
-                                        vote is $typevote
319
-                                     and
320
-                                        groupes.id = ${groupe_id[0]} ${nom:+ and députés.nom is \"${nom}\"}")
321
-        done
322
-        if test \( ${vote_cible[1]} -gt ${vote_cible[2]} -a $adoption = oui \) \
323
-            -o  \( ${vote_cible[2]} -gt ${vote_cible[1]} -a $adoption = non \); then
324
-            panurge=oui
325
-        else
326
-            panurge=non
327
-        fi
328
-        write_cell texte $panurge
329
-
330
-        if test -n "$nom"; then
331
-            for typevote in 1 2; do
332
-                votes_g0[$typevote]=$(sqlite_request "select
337
+            for (( g = 0; g < ${#groupe[@]}; g++ )); do
338
+                votes[${#votes[@]}]=$(sqlite_request "select
333 339
                                             count(député)
334 340
                                          from
335 341
                                             dépouillements
... ...
@@ -342,39 +348,22 @@ EOcontent
342 348
                                          and
343 349
                                             vote is $typevote
344 350
                                          and
345
-                                            groupes.id is ${groupe_id[0]}")
351
+                                            ${id_groupe[$g]%:*}.nom = '${groupe[$g]}'")
346 352
             done
347
-            participation=$(( vote_cible[1] + vote_cible[2] + vote_cible[3] + vote_cible[4] ))
348
-            if test $(( (${votes_g0[1]} - ${votes_g0[2]}) * (${vote_cible[1]} - ${vote_cible[2]}) )) -gt 0; then
349
-                loyaute=oui
350
-            else
351
-                loyaute=non
352
-            fi
353
-            write_cell nombre $participation
354
-            write_cell texte $loyaute
355
-        fi
356
-
357
-        write_cell url "${dossier_url/#null/\"\"}" "${dossier_texte/#null}"
358
-
359
-        for typevote in $(seq ${#typevotes[@]}); do
360
-            write_cell nombre ${vote_cible[$typevote]}
361
-            for (( g = 1; g < ${#groupe_id[@]}; g++ )); do
362
-                votes=$(sqlite_request "select
363
-                                            count(député)
364
-                                         from
365
-                                            dépouillements
366
-                                         inner join
367
-                                            députés, groupes
368
-                                         on
369
-                                            députés.groupe = groupes.id and dépouillements.député = députés.id
370
-                                         where
371
-                                            scrutin is $scrutin
372
-                                         and
373
-                                            vote is $typevote
374
-                                         and
375
-                                            groupes.id is ${groupe_id[$g]}")
376
-                write_cell nombre $votes
353
+        done
354
+        for ((j = 0; j < ${#groupe[@]}; j++)); do
355
+            presence=1 # `let presence+=0` sort en erreur si variable est unset ou égale à 0
356
+            for ((i = $j; i < ${#votes[@]}; i += ${#groupe[@]})); do
357
+                let presence+=${votes[$i]}
377 358
             done
359
+            if test $presence -eq 1; then
360
+                for ((i = $j; i < ${#votes[@]}; i += ${#groupe[@]})); do
361
+                    votes[$i]=-1
362
+                done
363
+            fi
364
+        done
365
+        for ((i = 0; i < ${#votes[@]}; i ++)); do
366
+            write_cell nombre ${votes[$i]}
378 367
         done
379 368
         echo '</table:table-row>' >> "$content"
380 369
 
... ...
@@ -453,44 +442,70 @@ while [[ $# -gt 0 ]]; do
453 442
     case "$1" in
454 443
         "--no-db-update")
455 444
 #|ne met pas à jour la base de données
445
+            if test ${db_update_only:-OK} = $true_flag; then
446
+                echo "option incompatible avec --db-update-only"
447
+                exit 1
448
+            fi
456 449
             no_db_update=$true_flag;;
457 450
         "--db-update-only")
458 451
 #|ne génère pas de fichier de résultat
452
+            if test ${no_db_update:-OK} = $true_flag; then
453
+                echo "option incompatible avec --no-db-update"
454
+                exit 1
455
+            fi
459 456
             db_update_only=$true_flag;;
460
-        "--cible")
461
-#<nom court du groupe>|génère un comparatif pour ce groupe. Par défaut Renaissance
462
-            groupe[0]="${2}"
457
+        "--cible"|"-c")
458
+#<nom court du groupe>|ajoute les scrutins de ce groupe, de ce ou cette députée, les colonnes seront dans l'ordre
459
+            _groupe[${#_groupe[@]}]="${2}"
463 460
             shift;;
464
-        "--ref")
465
-#<nom court du groupe ou des groupes>|compare avec ce ou ces groupes. Si plusieurs groupes, ils sont séparés par une virgule, sans espace. Par défaut GDR
466
-            groupe_ref="${2}"
467
-            shift;;
468
-        "--député")
469
-#<nom>|filtre la cible sur un-e député-e sur le groupe cible (par défaut Renaissance). <nom> est insensible à la casse. Tout ou partie du nom ou du prénom peut être donné, espace compris. Caractère % utilisé comme caractère joker. Si aucune correspondance n'est trouvée avec un-e député-é, sortie en erreur. Si plusieurs député-e-s correspondent la liste est affichée et sortie en erreur.
470
-            depute=$true_flag
471
-            nom="$2"
461
+        "--couleurs")
462
+#<nombre hexadécimal>:<nombre hexadécimal>|colore les colonnes en dégradé entre les deux couleurs comprises
463
+            if grep -iq '[^0-9A-F:]' <<< ${2:-ERROR}; then
464
+                echo "$1 ${2:-ERROR}: format attendu <nombre>:<nombre>"
465
+                exit 1
466
+            elif egrep -iq '[0-9A-F]{6}:[0-9A-F]{6}' <<< ${2:-ERROR}; then
467
+                from_color=${2%:*}
468
+                to_color=${2#*:}
469
+            else
470
+                echo erreur $2: couleur RGB au format hexadécimal demandé
471
+            fi
472 472
             shift;;
473 473
         "--mandature")
474 474
            mandature="$2"
475 475
            ;;
476
+        "--scrutin")
477
+#<nombre>[:<nombre>]|commence la génération du résultat pour le scrutin <nombre>, ou entre les deux nombres donnés
478
+            if grep -q '[^0-9:]' <<< ${2:-ERROR}; then
479
+                echo "$1 ${2:-ERROR}: format attendu <nombre>[:<nombre>]"
480
+                exit 1
481
+            elif egrep -q '[1-9][0-9]*(:[1-9][0-9]*)?' <<< ${2:-ERROR}; then
482
+                first=${2%:*}
483
+                last=${2#*:}
484
+                if test $first -gt $last; then
485
+                    last+=:$first
486
+                    first=${last%:*}
487
+                    last=${last#*:}
488
+                fi
489
+            else
490
+                echo "$1 ${2:-ERROR}: <nombre> ne doit pas commencer par 0"
491
+                exit 1
492
+            fi
493
+            shift;;
476 494
         "--premier-scrutin")
477 495
 #<numéro>|commence la génération du résultat à partir du scrutin <numéro>
478
-            no_db_update=$true_flag
479 496
             first="$2"
480 497
             shift;;
481 498
         "--dernier-scrutin")
482 499
 #<numéro>|termine la génération du résultat au scrutin <numéro>
483
-            no_db_update=$true_flag
484 500
             last="$2"
485 501
             shift;;
486 502
         "--période")
487 503
 #<jj/mm/aaaa:JJ/MM/AAAA>|génère un résultat pour les scrutins allant de jj/mm/aaaa à JJ/MM/AAAA
488 504
             periode=$true_flag
489
-            no_db_update=$true_flag
490 505
             periode_value="$2"
491 506
             shift;;
492 507
         "--liste-députés-du-groupe")
493
-#<nom court du groupe>|liste les député-e-s du groupe <nom court du groupe> sur la mandature
508
+#<groupe>|liste les député·e·s du groupe <groupe>
494 509
             liste_deputes=$true_flag
495 510
             liste_deputes_value="${2}"
496 511
             shift;;
... ...
@@ -557,8 +572,6 @@ done
557 572
 
558 573
 test "$options_error" = $true_flag && exit 1
559 574
 
560
-IFS=',' groupe=(${groupe[0]:-Renaissance} ${groupe_ref:-GDR})
561
-
562 575
 in_ram_database=$(mktemp --dry-run /dev/shm/XXXXXXXXXXXX)
563 576
 if test -r "$database"; then
564 577
     cp "$database" "$in_ram_database"
... ...
@@ -566,18 +579,6 @@ else
566 579
     create_database
567 580
 fi
568 581
 
569
-function check_groupes () {
570
-    nb_groupe=$(sqlite_request "select count(id) from groupes where nom like \"%$1%\" or nom_court is \"$1\"")
571
-    if test $nb_groupe -eq 0; then
572
-        echo "aucun groupe ne correspond au critère $1" >&2
573
-        exit 1
574
-    elif test $nb_groupe -gt 1; then
575
-        echo "plusieurs groupes correspondent au critère $1" >&2
576
-        sqlite_request "select printf('• %s%s', nom, iif(nom_court is not null, ' [' || nom_court || ']', '')) from groupes where nom like \"%$1%\" or nom_court = \"$1\"" | grep --color -i "$1" >&2
577
-        exit 1
578
-    fi
579
-}
580
-
581 582
 if test "$periode" = $true_flag; then
582 583
     function get_date () {
583 584
         sqlite_request "select distinct(date) from scrutins order by num asc" | awk -v d="$1" -v comp=$2 '
... ...
@@ -625,11 +626,6 @@ if test "$db_update_only" = $true_flag; then
625 626
     exit
626 627
 fi
627 628
 
628
-for (( g = 0; g < ${#groupe[@]}; g++ )); do
629
-    check_groupes "${groupe[$g]}"
630
-    groupe_id[$g]=$(sqlite_request "select id from groupes where nom like \"%${groupe[$g]}%\" or nom_court is '${groupe[$g]}'")
631
-done
632
-
633 629
 if test "$liste_deputes" = $true_flag; then
634 630
     if test -n "$liste_deputes_value"; then
635 631
         sqlite_request "select printf('%s - %s%s',
... ...
@@ -654,22 +650,36 @@ if test "$liste_deputes" = $true_flag; then
654 650
     exit
655 651
 fi
656 652
 
657
-if test "$depute" = $true_flag; then
658
-    if test -n "$nom"; then
659
-        match=$(sqlite_request "select count(députés.id) from députés inner join groupes on groupes.id = députés.groupe where députés.nom like '%$nom%' and groupes.nom_court is '$groupe' collate nocase")
660
-        if test $match -eq 0; then
661
-            echo "pas de député correspondant à $nom dans le groupe $groupe"
662
-            exit 1
663
-        elif test $match -gt 1; then
664
-            echo "plusieurs députés correspondent à $nom:"
665
-            sqlite_request "select députés.nom from députés inner join groupes on groupes.id = députés.groupe where députés.nom like '%$nom%' and groupes.nom_court is '$groupe' collate nocase"
666
-            exit 1
667
-        else
668
-            groupe[0]=$(sqlite_request "select printf('%s (%s)', députés.nom, groupes.nom) from députés inner join groupes on groupes.id = députés.groupe where députés.nom like '%$nom%' and groupes.nom_court is '$groupe' collate nocase")
669
-            nom=${groupe[0]%% (*}
670
-        fi
653
+for (( g = 0; g < ${#_groupe[@]}; g++ )); do
654
+    # on vérifie si c'est un ou une député
655
+    depute_count=$(sqlite_request "select count(distinct nom) from députés where nom like '%${_groupe[$g]}%'")
656
+    groupe_count=$(sqlite_request "select count(distinct nom) from groupes where nom like \"%${_groupe[$g]}%\" or nom_court is '${_groupe[$g]}'")
657
+    if test $depute_count -eq 1 -a $groupe_count -ne 1; then
658
+        groupe[$g]=$(sqlite_request "select distinct nom from députés where nom like '%${_groupe[$g]}%'")
659
+        id_groupe[$g]=députés:$(sqlite_request "select group_concat(id) from députés where nom is '${groupe[$g]}'")
660
+        continue
661
+    elif test $groupe_count -eq 1 -a $depute_count -ne 1; then
662
+        groupe[$g]=$(sqlite_request "select distinct nom from groupes where nom like \"%${_groupe[$g]}%\" or nom_court is '${_groupe[$g]}'")
663
+        id_groupe[$g]=groupes:$(sqlite_request "select id from groupes where nom is '${groupe[$g]}'")
664
+        continue
665
+    elif test $groupe_count -eq 1 -a $depute_count -eq 1; then
666
+        echo "dénomination ambigüe pour ${_groupe[$g]}"
667
+        sqlite_request "select printf('député·e: %s', distinct nom) from députés where nom like '%${_groupe[$g]}%'" | grep --color -i "${_groupe[$g]}"
668
+        sqlite_request "select printf('groupe  : %s', distinct nom) from groupes where nom like \"%${_groupe[$g]}%\" or nom_court is '${_groupe[$g]}'" | grep --color -i "${_groupe[$g]}"
669
+        exit 1
670
+    elif test $depute_count -gt 1; then
671
+        echo plusieurs député·e·s correspondant à "${_groupe[$g]}" trouvé·e·s
672
+        sqlite_request "select distinct nom from députés where nom like '%${_groupe[$g]}%'" | grep --color -i "${_groupe[$g]}"
673
+        exit 1
674
+    elif test $groupe_count -gt 1; then
675
+        echo plusieurs groupes correspondant à "${_groupe[$g]}" trouvés
676
+        sqlite_request "select distinct nom from groupes where nom like \"%${_groupe[$g]}%\" or nom_court is '${_groupe[$g]}'" | grep --color -i "${_groupe[$g]}"
677
+        exit 1
678
+    else
679
+        echo aucun·e député·e ou groupe ne correspond au critère "${_groupe[$g]}"
680
+        exit 1
671 681
     fi
672
-fi
682
+done
673 683
 
674 684
 update_database
675 685
 write_comparaison