Git Product home page Git Product logo

parking's People

Contributors

marvindurot avatar pierre-armand avatar vivian-perez avatar yannpl avatar

Watchers

 avatar  avatar  avatar  avatar  avatar

parking's Issues

Bug critique : détection d'intersection géométrique

Très bizarre !

La fonction de test d'intersection de deux polygones déconne complètement sur la carte d'admin !
Pourtant, selon l'historique de github, elle n'a PAS CHANGÉE depuis la dernière fois où ça a marché !

ça ressemble carrément à un bug de la librairie polygon.js depuis le dernier npm update...

Bug retour page profil

Uncaught Error: Invariant Violation: findComponentRoot(..., .1.1.0.0.1.0.0.1.$1.$2access_level.0.$IR20.0): Unable to find element. This probably means the DOM was unexpectedly mutated (e.g., by the browser), usually due to forgetting a <tbody> when using tables, nesting tags like <form>, <p>, or <a>, or using non-SVG elements in an <svg> parent. Try inspecting the child nodes of the element with React ID ``.

Quand on click sur le bouton retour
bug_react_root_1
bug_react_root_2
bug_react_root_3
bug_react_root_4
bug_react_root_5

Redimentionnement carte leaflet nécessaire

Les polygones ne ss'affichent pas comme il faut sur la droite de la map quand on est dans un collapse.
Redimentionner la page permet a la carte de se recaler (ouverture de console / resize fenetre)

Procédure pour le déploiement

  • pour mémoire httpd.conf /etc/apache2/sites-enabled
  • Suivre la procédure d'init déploiement git expliquée en #71
  • Installer gulp en global sur le serveur npm install gulp -g
  • Installer Composer : curl -sS https://getcomposer.org/installer | php -- --install-dir=/bin
  • Configuration PHP
    • Ajouter mcrypt:
      • apt-get install php5-mcrypt
      • php5enmod mcrypt
      • ajouter extension=mcrypt.so dans le php.ini (/etc/php5/apache2/php.ini)
      • service apache2 restart
  • Configuration MySQL
    • /etc/mysql/my.ini commenter à l'aide d'un # la ligne STRICT_TRANS_TABLES puis sauvegarder
  • Config des droits d'accès aux dossiers chmod -R 777 app/storage
  • En local dev, Se placer sur la bonne branche Git
  • Modifier toutes les configs (URLs, bases de données, ...)
    • Client : app/assets/js/config/config.js
    • Serveur PHP :
      • app/config
        • app.php
        • database.php, modifier les données contenues dans la key "connections/mysql"
        • mail.php:
          • renseigner "host"
          • driver = smtp
          • Encryption = '' 🔴
          • from = expediteur
        • session.php:
          • 'driver' => 'cookie', 🔴
          • 'cookie' => 'ID unique',
      • bootstrap/start.php
        • $env = $app->detectEnvironment(array( 'production' => array('elipce-leaderpark'),// Server hostname ));
    • Serveur de com : com/config/config.js
  • Se mettre d'accord avec Olav / Bruno pour le certificat SSL à utiliser pour la com. (Voir #67)
  • Définir une variable d'environnement "PRODUCTION" à true sur le serveur: vi /etc/bash.bashrc puis ajouter PRODUCTION=true à la fin du fichier
  • Vider les dossiers de app/storage
  • Créer la BDD via un import de la structure parking_raz.sql (attention au nom de la BDD à changer dans le fichier). Voir PJ
    parking_raz.txt
  • lancer deploy.sh: ./ deploy.sh (git pull + npm update + gulp + php artisan migrate)
  • php artisan db:seed Lancer en fonction du besoin. Attention peut insérer des données déjà existantes
  • Créer dans /com un dossier log avec autorisation 755
  • Installer forever en global npm install -g forever
  • Lancer le serveur de com avec forever

Filtre Laravel pour accéder ou non aux données d'un parking

Principe de filtre sur les droits d'un parking:

  • Toutes les ressources situés sous la table parking dans l'arborescence de la base de données doivent être filtrées pour bloquer des tentatives sur un parking interdit.
  • Pour cela, il faut :
    • déclarer les Routes de ces ressources dans le groupe de route adapté
    • Développer le filtre auth.parking pour remonter jusqu'au parking en fonction de la ressource et des paramètres
    • Autoriser ou non l'aboutissement de la requête

Attention, selon la route (zone, place, calendrier etc...) et le type d'action (get, post, update) les paramètres et moyens de remonter au parking sont différents !!

  • Est-il possible d'automatiser tout ça simplement ?

Solution cartographie parking - Récolte d'infos techniques

Librairie Leaflet (Fortement recommandé)

Si on part sur une solution leaflet, (ce que je préconise par dessus tout...) on a plusieurs choix quand à la manière de gérer les informations affichées.

Affichage des données

Saisie de données géographiques

Interaction map - react - serveur

image

Le point sur SSL

Mise en place globale Authentification SSL

Authorité de certification

  • Générer un dossier d'autorité de certification comme celui du mail d'Olav du 12/08/2015. (Lui demander comment si on doit le faire à terme).
    Cette autorité de certification permet de signer les certificats serveurs et clients et de les vérifier lors du opening handshake pour effectuer l'authentification ou le rejet de la connexion.
  • Bien penser au CAserial qui est un fichier contenant 2 chiffres (Apparemment 06) dans le cas du CA d'Olav. Il est présent dans le dossier en question.

Certificat serveur

  • Générer une clé privée pour le serveur. 1024 bits pour ne pas faire brûler le contrôleur d'Olav
  • Générer une signing request avec la clé privée générée.
    • Très important, pendant la génération de la signing request, il faut remplir l'url du serveur dans la "case" Common Name []
  • Signer cette requête avec l’autorité de certification pour générer le certificat du serveur (Faisable avec l'outil d'Olav).

Certificat client

  • Générer une clé privée pour le client. 1024 bits pour ne pas faire brûler le contrôleur d'Olav
  • Générer une signing request avec la clé privée générée.
    • Cette requête n'a pas besoin des informations Common name etc... elle peut être générée avec l'outil d'Olav et le dossier du CA.
  • Signer cette requête avec l’autorité de certification pour générer le certificat du client (Faisable avec l'outil d'Olav).

En pratique - génération des fichiers

Il semble que tout soit possible avec l'outil d'Olav, mais on peut aussi le faire en ligne de commande.

Authorité de certification

TODO, voir avec Olav comment il génère ses dossiers de CA. On se base sur son dossier K0 pour le moment...

Certificat serveur

  • Dans l'outil d'Olav, cliquer sur "New key pair" puis remplir les informations nécessaires en fonction des besoins. Bien penser au mode "Certificate signing request" :

image
OU sous forme de commande:
openssl req -nodes -days 36525 -subj /CN=85.14.137.12/O=Elipce/OU=Elipce Informatique/L=Valence/C=FR/ST=France -text -utf8 -sha256 -newkey rsa:1024 -keyout D:/Mes Documents/Projets/Parking/tech/ssl/SERVER/server.key -out D:/Mes Documents/Projets/Parking/tech/ssl/SERVER/server.csr

  • Toujours dans l'outil, cliquer sur "Sign". Aller chercher le fichier .csr généré ci-dessus puis le dossier du CA (Pour le moment on utilise le K0 fourni par Olav):

image
OU par ligne de commande:
openssl ca -batch -utf8 -md sha256 -days 36525 -in D:/Mes Documents/Projets/Parking/tech/ssl/SERVER/server.csr -out D:/Mes Documents/Projets/Parking/tech/ssl/SERVER/server.crt
En utilisant le fichier de config du dossier du CA (ici ca/K0/openssl.cnf) et le CAserial fourni dans le dossier aussi.

Normalement le dossier de destination doit contenir 3 fichiers:

  • server.crt
  • server.csr
  • server.key

Certificat Client

Même procédure que pour le certificat serveur mais avec des informations relatives au client dans la fenêtre de génération de la paire de clé:

image

Puis le signer, toujours avec le dossier du CA identique au serveur:
image

Normalement le dossier de destination doit contenir 3 fichiers:

  • client.crt
  • client.csr
  • client.key
  • Avec ces fichiers, on va maintenant générer un fichier au format p12 (identique à pfx). Ce format permet d'installer non seulement le certificat mais aussi la clé privée.
    openssl pkcs12 -export -clcerts -in client.crt -inkey client.key -out client.p12

Mise en fonctionnement

Installations nécessaires

  • Côté serveur, il faut renseigner le ca.crt, le server.crt et le server.key dans le serveur http Node.
  • Côté client de supervision
    • WINDOWS
      • Il faut installer le ca.crt dans le dossier "Autorités de certification racines de confiance"
      • Il faut installer le client.p12 dans le dossier personnel.
      • Il faut vérifier via le navigateur que le certificat soit bien pris en compte. Via chrome il faut aller dans la partie "Gérer les certificats..." et vérifier qu'il apparaisse bien dans l'onglet personnel. Sinon, essayer de l'importer directement depuis cette fenêtre.
      • De même il faut vérifier que le CA apparaissent dans l'onglet Autorités de certification racines de confiance
    • LINUX
      • Dans chrome: Pamètres / HTTPS / SSL / Gérer les certificats
      • Importer le certificat client dans l'onglet "Vos certificats"
      • Importer l'autorité de certification dans l'onglet "Autorités"

Gérer les certificats sous windows

Il peut être utile d'afficher et de pouvoir gérer les certificats installés sur le poste client. Pour cela, on peut passer par le navigateur (voir ci-dessus pour chrome) ou par un utilitaire Windows:

  • taper certmgr.msc dans le menu démarrer.

Compression events multi-chunk

Attention aux clés event non répétées. Ex: sensor - ID:1 - state: online. Dans 10 chunks si le capteur est toujours 'online', la clé state n'est pas renvoyée .... solution: aller chercher le dernier state dans la table event_capteur pour l'ID concerné.

Glitch event AckID

Hi Vivian,

I see you're downloading the events now.

Every now and then there seems to be some glitch.
The controller debug log says this:

[Log] ACK event number mismatch, his=3993, my=3995

Check that you're sending the right ACK numbers.

Full log below. Shows only messageType because of performance.
Let me know if you need more data logged.

Msg TX: eventData Msg RX: eventQuery Msg RX: eventQuery Msg RX: eventQuery Msg RX: eventQuery Msg TX: eventData Msg RX: eventQuery Msg TX: eventData Msg RX: eventQuery [Log] ACK event number mismatch, his=3993, my=3995 Msg TX: eventData Msg RX: eventQuery Msg RX: eventQuery Msg RX: eventQuery Msg RX: eventQuery Msg TX: eventData Msg RX: eventQuery Msg TX: eventData Msg RX: eventQuery [Log] ACK event number mismatch, his=3997, my=3999 Msg TX: eventData Msg RX: eventQuery Msg RX: eventQuery Msg RX: eventQuery Msg RX: eventQuery Msg TX: eventData Msg RX: eventQuery Msg RX: eventQuery Msg TX: eventData Msg RX: eventQuery Msg TX: eventData Msg RX: eventQuery [Log] ACK event number mismatch, his=4003, my=4005 Msg TX: eventData Msg RX: eventQuery Msg RX: eventQuery Msg RX: eventQuery Msg RX: eventQuery Msg TX: eventData Msg RX: eventQuery Msg RX: eventQuery Msg TX: eventData Msg RX: eventQuery Msg TX: eventData Msg RX: eventQuery

Regards,
Olav

Topologie parking

Topologie parking

Description fonctionnelle de l’édition de la topologie d’un parking.

Lexique

  • Chevauche : Au moins un point de l’entité A est contenu dans l’entité B
  • Contenu : Tous les points de l’entité A sont contenus dans l’entité B

Création Zone

  • Tests initiaux :
  • Chevauche une autre zone ?
    - [x] KO avec message
  • Chevauche une allée ?
    - [x] KO avec message
  • Contenue dans une autre zone ?
    - [x] KO avec message
    - [x] Contient une autre zone ?
    - [x] KO avec message
  • Contenue dans une allée ?
    - [x] KO avec message
  • Zone sans allée ?
  • Création zone BDD
  • Création allée par défaut dans la zone (sans géométrie)
  • Association des places dont les centres sont dans la zone à l’allée par défaut
  • Zone avec allée ?
  • Si : Nb places contenues dans la zone = somme des places de toutes les allées
    - [x] COOL : création zone et rattachement des allées
  • Sinon :
    - [x] Créer allée par défaut rattachée à la zone
    - [x] Attacher toutes les places contenues dans la zone MAIS pas dans une de ses allées à l’allée par défaut de la zone

Création allée

  • Tests initiaux :
  • Chevauche une autre zone ? => KO
  • Chevauche une allée ? => KO
  • Contenue dans une autre allée ? => KO
  • Contient une allée ? => KO
  • Contient une zone ? => KO
  • Allée HORS zone :
  • Elle est attachée à la zone par défaut
  • Allée DANS zone :
  • Rattacher l’allée à la zone
  • Dans tous les cas :
  • Rattacher les places dont les centres sont contenus dans l’allée

Création place

  • Centre place dans une des allées géométriques ?
  • Attacher la place à l’allée
  • Centre de la place dans aucune allée
  • Place dans une zone ?
    - [x] Allée par défaut de la zone
  • Place HORS zone
    - [x] Allée par défaut de la zone par défaut

Fonctions de contrôle :

  • Intersection de polygon
  • Polygone contenu dans un autre
  • Liste de points totalement contenus dans un polygon
  • Liste de points partiellement contenus dans un polygon

POUR VIVIAN : Prendre la suite de la configuration

Attention, tout ceci concerne la branche _parking_map_updatable_

La map est un composant à part entière qui ne peut être géré et piloté directement depuis un composant de type page comme c'est le cas pour les états "classiques".
Elle possède son propre store et une palanqué d'actions associés au fonctionnement Leaflet.
Leaflet n'est instancié qu'une fois lors du premier affichage

Création de places multiples

La partie Frontend est opérationelle. Les places sont créées dans le store de la carte, associés à leurs informations et prêtes à être envoyées côté serveur pour l'enregistrement.
Avant de les sauvegarder il faudra:

  • Récupérer les informations du parking via ajax grâce aux parkingId et niveauId transmis à la carte.
  • Récupérer AU MOINS les zones et allées par défaut
  • Assigner l'allée par défaut aux places

Le cycle de vie création places multiples :

  • _MAP_ click sur l'outil places multiples -> Actions.map.mode_place_auto()
  • _STORE_ appel de onMode_place_auto Puis trigger pour changer de mode dans la _MAP_
  • _UTILISATEUR_ dessine un triangle -> passe dans onDraw_created du _STORE_
    • createParallelogramme sur le _STORE_
    • trigger vers le composant _MAP_ avec le parallélogramme en paramètres
  • _MAP_ passe dans _onNewPlaceAuto pour lancer l'ordre d'ouvrir la modale (Fonctionnement ReactBootstrap)
  • _MAP_ Passe dans renderOverlay pour choisir la modale à ouvrir, en l’occurrence, this._modalPlaceMultiple() Cette modale est un composant à part qui fonctionne avec la validation des formulaires traditionnelle.
  • _UTILISATEUR_ remplissage et validation du formulaire
  • _STORE_ le formulaire a été validé donc on passe dans onSubmit_form en fonction de l'id du form on sait qu'il s'agit de places multiples donc on appelle :
  • _STORE_ this.handlePlacesMultiples avec toutes les infos nécessaires. Test si l'espacement des poteaux fourni est cohérent avec le nombre de places
  • _MAP_HELPER_ appel de mapHelper.createPlacesFromParallelogramme pour générer la liste des places puis trigger vers la _MAP_
  • _MAP_ Passe dans onStoreTrigger puis this.onFormesAdded

Partie backend de la config parking

Pour le moment en l'état de squelette. Pour plus de détails, voir mes commits d'aujourd'hui:

  • 00f0fb9 : génération des modèles vierges
  • 7ede00d : Configuration des relations, création de contrôleurs, modification des routes

La récupération des informations du parking devra passer par le groupe de routes identifié avec le commentaire GROUPE UTILISATEUR AUTHENTIFIE + DROITS ACCESS + DROIT PARKING

Droits d'accès à un parking

  • Toutes les routes qui pointent vers une ressources dépendant du droit d'accès ou non au parking concerné DOIVENT être placés dans un groupe ayant le filtre ['before' => 'auth|auth.canaccess|auth.parking']
  • Le filtre est à développer dans le fichier filters.php (ligne 64) en se basant sur l'issue #21

Node EventEmitter subtilité de mise en place

Pas moyen de récupérer les événements lancés par la classe config depuis la procédure d'init...

C'est bizarre, les tests en dur marchent mais quand c'est une requête qui arrive depuis le serveur, on ne reçoit rien...

Tableau de bord supervision

Affichage stats par blocs

  • Bloc 1
    • Global parking
    • Global parking par type
  • Bloc 2
    • Global plan
    • Global plan par type
  • Bloc 3
    • Global zone
    • Global zone par type

Pour tous les blocs

  • Préférences affichage utilisateur en BDD (quelles lignes afficher dans chaque bloc)
  • Libellés cliquables pour choix types de place à afficher

Bonus track

  • Paramètre d'ordre des barres par utilisateur

Gestion parking et concentrateur

  • Supprimer le champ IP
  • Possibilité de créer plusieurs concentrateurs
  • En mode modif, modification d'un v4_id ne marche pas.
    • Si le v4 existe pas, on le crée et l'associe
    • Si le V4 existe, on l'associe simplement au parking

Bug d'envoi avec la nouvelle classe métier messenger

Depuis ce matin, impossible d'envoyer le message capabilities à Olav en utilisant l'utilitaire messenger.

cela marche apparemment quand on utilise le send directement sur le client.

Quelle est la différence ??

Cela ne semble pas venir d'Olav

React JS collapsible sidebar

Développement d'un composant React pour gérer une sidebar right ou left
Le principe est d'avoir une barre de quelques pixels de large pour montrer l'emplacement de la sidebar et pour pouvoir la déplier.

  • Quand on la déplie, le contenu de la page est "poussé" vers la droite ou la gauche
  • L'organisation de la page impose qu'on ne puisse avoir qu'une seule barre pliable par page

Organisation du code :

  • Composant racine "Collapse"
  • Composant intermédiaire "CollapseBody" contenant le contenu de la page
  • Composant intermédiaire "CollapseSideBar" contenant le contenu de la barre dépliable

Appel typique :

<Collapse align="right">
    <CollapseBody>
        *Contenu du body*
    </CollapseBody>
    <CollapseSide col-md>
        *Contenu de la sidebar*
    </CollapseSide>
</Collapse>

Reste à faire pour mise en service

Technique

  • Websocket client navigateur sécurisé (SSL)

Administration du parking

  • Bouton d'initialisation parking depuis le concentrateur OU fichier d'import

Supervision

  • Afficheur: affichage au survol des informations
  • Commandes forcées
    • 1) Forcer l'état d'une place: libre, occupée
    • 2) Faire clignoter un capteur
    • 3) Changer la signalisation d'un afficheur
    • 4) Changer le compteur d'un afficheur
    • 5) Fermeture ouvertue du parking
    • 6) Activer désactiver le mode veille économique

Data

  • Créer la structure pour les compteurs et vues

Com

  • Récupération des données Counters, Views
  • Récupération des données config_equipement, capteur_compteur, afficheur_config, capteur_config
  • Insérer les évènements dans les tables
    • Capteurs (IMPORTANT)
    • Compteurs
    • Vues (IMPORTANT)
    • Afficheurs
    • Bus
  • Notifier la supervision d'un évènement journal (place, afficheur) pour lancer l'update de l'affichage

Modifs pour impression ecran

  • Pas d'espaces entre les blocs tableau bord
  • Blocs tab bord commence aligné avec treeview
  • nombre total de places dans des badges alignés right
  • répétition libelle plan et zone après les types de places
  • Les chiffres dans les barres en gras et le plus gros possible

Capteurs de place

Test sur changement de mode

  • Test init Parking ?
    • Bloquer l'utilisateur si parking non init

Modale de démarrage

  • Ouverture modale
  • Combo avec liste concentrateurs
    • Combo liste bus
      • Combo liste adresses
  • Les combos sont update en cascade sur l'action change
  • Les combos proposent les dernières valeurs pour le parking

Process d'affectation capteurs

  • Click sur une place pour affecter le capteur
    • Enregistrement en AJAX direct
  • Incrément de l'adresse (Parcours de la liste des adresses au cas ou on ait des trous ?)
  • Click sur une autre place et recommencer jusqu’à la fin
    • - Récupère la place cliquée
    • - Récupère le capteur à affecter
    • - Test si place libre en JS
    • - Lance l'update AJAX
    • - Si succès
    •  - changement couleur place affectée
      
    •  - Affectation du capteur id dans la place sur la carte
      
    •  - Suppression du capteur de la liste restante
      
    •  - Modification du message d'info
      
    •  - Avertissement si on a affecté le dernier capteur
      
    • - Si fail
    •  - Notification utilisateur (Place déjà affectée )
      

Description

De manière générale, les champs rescription doivent être des textarea. Props area de InputFileEditable.
ex: popup de création d'une zone

Pour reprendre pieds à la rentrée

Avant de partir

  • La modification géographique des places est OK
  • Les modifs géographiques des allées et zones à été annulée car trop le bordel à contrôler. KO
  • L'outil création d'afficheurs est OK
  • L'outil modification "métier" d'une place (le plus compliqué des 4) est en cours.
    • Il reste à lister les capteurs dans un select (données OK dans le store) et à valider le formulaire.

Pour reprendre le dev

  • _Création de la modale_ édition place: 6683a25
  • _Création du store_ de la modale : 202f202
  • Récupération de _tous les capteurs libres_ + celui de la place sélectionnée: 7091424

Outil capteur de place

  • popup: les adresses ne sont pas triées correctement
  • Lors de l'affectation je choisis 2.3.1, la deuxième place affectée est 2.3.10, or ça devrait être 2.3.2.
  • Je choisis 2.3.1 je clique dans une place OK, la fenêtre d'information ne m'indique pas 2.3.2, elle reste à 2.3.1

Modifs pour la foire

Barre de menu:

  • Logo leader park en haut à droite

Tableau de bord:

  • Logo jeu de paume en md 3 à droite
  • Agrandire les chiffres des totaux (meme taille que dans les barres)
  • Barre stackée le vert de même couleur que les états d'occupation
  • ++ hauteur dynamique

Plan :

  • Markers voitures 20% plus petit

Mise en place déploiement via Git

EN PRATIQUE

Init déploiement step by step

  • Se connecter au serveur en ssh
  • se placer dans l'équivalent du "www"
    • (Facultatif) Créer un dossier pour le projet
  • se placer dans le dossier du projet (ou à la racine du www)
  • Cloner la branche voulue du projet parking :
    • "git clone -b mybranch --single-branch https://github.com/Elipce-Informatique/parking.git ."
  • Sur le PC de développement, modifier le fichier deploy.sh pour effectuer le pull sur la bonne branche
  • Commit la modif de ce fichier et le récupérer sur le serveur via la commande git pull --ff-only origin branch en changeant branch par la bonne branche
  • Ajouter le fichier deploy.sh au gitignore via le PC de dev.
  • Commit cette modif et la récupérer sur le serveur via la commande git pull --ff-only origin branch
  • Passer le fichier deploy.sh en chmod +x sur le serveur

Voilà, normalement tout est prêt pour les mises en prod des updates !

Procédure de développement des mises à jour

  • Toujours développer les dev génériques dans le master
  • Effectuer des pullRequest sur github dans les branches à mettre à jour.
    • base = branche spécifique ex: p023-annecy
    • compare = branche master
  • Se connecter en SSH sur le serveur et lancer le script deploy.sh
  • php artisan migrate
  • php artisan db:seed

Les développements spécifiques à un parking

  • Doivent être développés directement sur la branche du dit parking (Attention à ne pas se tromper dans l'éditeur PHPstorm)
  • Si des conflits apparaissent lors de futures pullRequests du master vers la branche modifiée, suivre les instructions de github et régler le conflit via l'interface PHPstorm
  • La procédure de déploiement reste la même

Les règles d'or du déploiement !

  1. Tous les fichiers de la branche à déployer DOIVENT être copiés sur la cible en production.
  2. Les fichiers qui ont été supprimés dans la branche depuis le dernier déploiement doivent être supprimés sur la cible en production.
  3. Tout changement des fichiers directement sur le serveur de production depuis le dernier déploiement doivent être ignorés en appliquant les règles 1 et 2. Cependant, on peut souhaiter être prévenu de ces changement lors du prochain déploiement pour éviter de les écraser et prendre des mesures.
  4. Les fichiers non suivis par git dans le dossier en production doivent restés inchangés. Encore une fois, on peut souhaiter être prévenu lors du prochain déploiement pour éviter de les écraser ou les supprimer et prendre des mesures.

Les infos en vrac

  • Une branche par parking
  • Il faut vérifier que toutes les configs soient extérieures au code.
  • Tout ce qui touche au spécifique (configs etc...) doivent être dans le gitignore
  • Les configs sont modifiées dans leurs branches respectives (Directement via l'interface Github ? ou sur les serveurs de prod une bonne fois pour toute ?)
  • On développe dans la branche master tout ce qui est générique à TOUS les projets

Liens utiles

Etat : Etat d'occupation

Il reste à faire :

  • Sauvegarde en édition (coté php et retour ajax)
  • Suppression (coté php et retour ajax)
  • Les engrenages des combos avec le système de gestion qui va derrière

Bug filtre données tableau de bord

Quelque chose à changé dans la requête qui va chercher les données du tableau de bord dans la supervision en fonction des préférences de l'utilisateur.

Exemple :
Dans le bloc général, si on ne sélectionne que générique, tout s'affiche !

Compression des evts

Analyser les cas particuliers et en dégager une règle.
Tout est loggé, il faut analyser les logs et réfléchir au moyen de décompresser les evts sans avoir des valeurs résiduelles sur des clés facultatives par exemple.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.