#2A937A
19 |#32AB8E
27 |#565EA3
42 |#2E4277
50 |#B18619
58 |#B42828
66 |#A84700
74 |#0065A8
82 |#77FFFF
90 |#0DFF8B
98 |#FDC500
106 |#FFFFFF10
121 |#FFFFF50
129 |#FFFFFF
149 |UIColors.background
150 |#F3F2F8
158 |UIColors.modalBackground
159 |#0B0B0C
172 |UIColors.background
173 |#161618
181 |UIColors.modalBackground
182 |#000000
200 |#F00304
208 |7 | Fixel Text 8 |
9 |10 | Quand jadis, mon vaillant zéphyr explorait les cieux, papillon exquis, s'éveillant aux délices du jardin éternel, le parfum suave annonçait mille bonheurs. 11 |
12 |14 | Interface utilisateur 15 |
16 | 17 | Télécharger 18 | 19 |24 | Onest 25 |
26 |27 | Quand jadis, mon vaillant zéphyr explorait les cieux, papillon exquis, s'éveillant aux délices du jardin éternel, le parfum suave annonçait mille bonheurs. 28 |
29 |31 | Communication visuelle 32 |
33 | 34 | Télécharger 35 | 36 |41 | Open Dyslexic 42 |
43 |44 | Quand jadis, mon vaillant zéphyr explorait les cieux, papillon exquis, s'éveillant aux délices du jardin éternel, le parfum suave annonçait mille bonheurs. 45 |
46 |48 | Accessibilité 49 |
50 | 51 | Télécharger 52 | 53 |`.
798 |
799 | Data dans la réponse :
800 | ```typescript
801 | {
802 | date: "AAAA-MM-JJ", // Même date que celle passée dans l'URL
803 | matieres: Array<{
804 | entityCode: string, // Classe ("1A") / groupe
805 | entityLibelle: string, // Nom d'affichage de la classe ("PREMIERE A")
806 | entityType: "C" | "G" | string, // C = Classe, G = Groupe, ...
807 | matiere: string,
808 | codeMatiere: string, // Pareils que route précédente
809 | nomProf: string,
810 | id: number, // Même id que idDevoir dans la route précédente
811 | interrogation: bool,
812 | blogActif: false, // ?
813 | nbJourMaxRenduDevoir: number, // Date butoir du rendu ?
814 | aFaire: {
815 | idDevoir: number,
816 | contenu: string, // Détail du travail à faire
817 | rendreEnLigne: bool,
818 | donneLe: "AAAA-MM-JJ",
819 | effectue: bool,
820 | ressource: "", // ?, vide jusqu'ici
821 | ressourceDocuments: [], // ?, vide jusqu'ici
822 | documents: Array<{ // Pièces jointes
823 | id: number, // Pour la télécharger via la route de téléchargement
824 | libelle: string, // Nom
825 | date: "AAAA-MM-JJ",
826 | taille: number, // En octets
827 | type: "FICHIER_CDT", // Autres valeurs ?
828 | signatureDemandee: false, // ?
829 | signature: {}, // ?
830 | }>,
831 | commentaires: Array<{
832 | id: number, // identifiant du commentaire
833 | idAuteur: number, // identifiant de l'auteur
834 | profilAuteur: "E", // E = Elève, autres valeurs ?
835 | auteur: string, // Nom de l'auteur
836 | date: "AAAA-MM-JJ",
837 | message: string, // Encodé en base64
838 | supprime: false, // Si le commentaire a été supprimé ? (semble stupide)
839 | }>,
840 | elementsProg: [], // ?
841 | liensManuel: [], // URL des manuels associés à la matière ?
842 | documentsRendus: [], // Fichiers rendus lorsque le formulaire est présent ?
843 | contenuDeSeance: {
844 | contenu: string,
845 | documents: [],
846 | commentaires: [],
847 | },
848 | },
849 | contenuDeSeance: {
850 | idDevoir: number, // Systématiquement le même identifiant que id plus haut
851 | contenu: string,
852 | documents: [], // Pièces jointes ?
853 | commentaires: [], // Même structure que commentaires sur travail à faire ?
854 | elementsProg: [],
855 | liensManuel: [],
856 | },
857 | }>
858 | }
859 | ```
860 |
861 |
35 | Ainsi que les autres plateformes Apple. Un Mac est nécessaire pour le développement Apple.
36 |
44 | Ainsi que les autres plateformes Google. Windows, macOS ou Linux est nécessaire.
45 |
53 | Utiliser Expo Application Services pour développer l'application dans le cloud.
54 |
8 | Documentation technique de Papillon
9 |
11 | et des services associés.
12 |
27 | Créez des maquettes, des prototypes et des designs pour Papillon. Vous pouvez contribuer à la charte graphique.
28 |
36 | Modifier le code source de Papillon pour ajouter des fonctionnalités, en améliorer certaines, ou corriger des bugs.
37 |
45 | Contribuer à la documentation, à la communication et à la recherche de bugs de Papillon.
46 |
59 | Consultez notre politique de confidentialité pour en savoir plus sur la collecte et l'utilisation de vos données.
60 |
68 | Consultez nos conditions d'utilisation pour en savoir plus sur les règles d'utilisation de nos services.
69 |
862 |
863 | __PUT__ `/v3/Eleves/{id}/cahierdetexte.awp`
864 |
865 | Marque des devoirs comme faits ou non faits.
866 |
867 | Data en body :
868 | ```typescript
869 | {
870 | idDevoirsEffectues: number[],
871 | idDevoirsNonEffectues: number[],
872 | }
873 | ```
874 |
875 |
876 |
877 | __POST__ `/v3/eleves/{id}/afaire/commentaires.awp`
878 |
879 | Poste un commentaire sous un travail à faire ou un contenu de séance
880 |
881 | Data en body :
882 | ```typescript
883 | {
884 | message: string, // encodé en base64
885 | idContenu: number, // identifiant du devoir / contenu de séance
886 | }
887 | ```
888 |
889 | Data dans la réponse :
890 | ```typescript
891 | {
892 | id: number, // Identifiant du commentaire posté
893 | }
894 | ```
895 |
896 | ### Vie scolaire
897 |
898 | Endpoint qui sert a afficher les données sur la page vie de classe
899 |
900 | __GET__ `/v3/eleves/{id}/viescolaire.awp`
901 |
902 | Data dans la réponse :
903 | ```js
904 | {
905 | "absencesRetards":[
906 | {
907 | "id":2936, //int | Identifiant interne de l'abscence / retard
908 | "idEleve":0, //int | Normalement égal à l'id de l'eleve mais 0 dans mon cas
909 | "nomEleve":"", //string | Normalement rempli mais vide dans mon cas
910 | "typeElement":"Absence", //string | Sert pour savoir si c'est une "Abscence" ou un "Retard"
911 | "date":"2021-11-19",
912 | "displayDate":"le vendredi 19 novembre 2021 de 08:30 à 16:30",
913 | "libelle":"2 demi-journées",
914 | "motif":"",
915 | "justifie":true, //bool | Si jamais justufié ou non (note : si jamais elle est en attente de justification, elle sera a true)
916 | "par":"",
917 | "commentaire":"Merci de bien vouloir excuser l'absence de X pour la journée, il est souffrant.\nBien cordialement,",
918 | "typeJustification":" en attente de prise en compte par la vie scolaire",
919 | "justifieEd":true, // Si on peut justifier en ligne ?
920 | "aFaire":"",
921 | "dateDeroulement":""
922 | }
923 | ],
924 | "sanctionsEncouragements":[
925 | {
926 | "id":48,
927 | "idEleve":0,
928 | "nomEleve":"",
929 | "typeElement":"Punition",
930 | "date":"2021-11-26",
931 | "displayDate":"",
932 | "libelle":"RETENUE",
933 | "motif":"Trop de mots dans le carnet",
934 | "justifie":false,
935 | "par":"",
936 | "commentaire":"",
937 | "typeJustification":"",
938 | "justifieEd":false,
939 | "aFaire":"1 heure",
940 | "dateDeroulement":"S'est déroulé le mer. 08 décembre
de 13:00 à 14:00"
941 | }
942 | ],
943 | "parametrage": {
944 | "justificationEnLigne":true,
945 | "absenceCommentaire":true,
946 | "retardCommentaire":true,
947 | "sanctionsVisible":true,
948 | "sanctionParQui":false,
949 | "sanctionCommentaire":true,
950 | "encouragementsVisible":false,
951 | "encouragementParQui":false,
952 | "encouragementCommentaire":false
953 | }
954 | }
955 | ```
956 |
957 | ### Carnet de correspondance
958 |
959 | Permet d'obtenir une liste des correspondances.
960 |
961 | __GET__ `/v3/eleves/{id}/eleveCarnetCorrespondance.awp`
962 |
963 | Data dans la réponse :
964 | ```jsonc
965 | {
966 | "correspondances": [
967 | // ?
968 | ],
969 | "suivis": [
970 | // ?
971 | ]
972 | }
973 | ```
974 |
975 | ### Documents administratifs
976 |
977 | Permet d'obtenir la liste des documents administratifs associées à une année scolaire, ou à l'année actuelle.
978 |
979 | __GET__ `/v3/elevesDocuments.awp`
980 |
981 | Paramètres de recherche :
982 | - `archive=` pour l'année actuelle
983 | - `archive=AAAA-AAAA` pour spécifier une année précise
984 |
985 | Data dans la réponse :
986 | ```typescript
987 | {
988 | factures: [], // ?
989 | notes: Array
1182 |
1183 | __GET__ `/v3/E/{id}/espacestravail/{espace.id}.awp`
1184 |
1185 | Data dans la réponse :
1186 | ```typescript
1187 | type Workspace = {
1188 | id: number, // Identifiant de l'espace de travail
1189 | titre: string,
1190 | description: "", // Semble toujours vide, peut-être une version plus courte de "résumé"
1191 | resume: string, // Encodé en base64
1192 | cloud: true, // Probablement si le cloud, les discussions ou l'agenda sont activés ou non
1193 | discussion: bool,
1194 | agenda: bool,
1195 | public: bool, // Si l'espace est visible par tous les élèves
1196 | ouvert: bool, // Si les élèves peuvent rejoindre l'espace librement
1197 | type: "LIBRE",
1198 | estMembre: bool,
1199 | estAdmin: false,
1200 | salleDesProfs: false, // Probablement pour l'équivalent prof des espaces de travail qui peuvent aussi servir de salle des profs numérique
1201 | creePar: string, // Nom du créateur (Prénom NOM ... NOMS)
1202 | droitUtilisateur: 0 | 1 | 2, // ?
1203 | nbMembres: 0,
1204 | couleurEvenementAgenda: "#RRVVBB",
1205 | creeLe?: "JJ/MM/AAAA à HH:MM",
1206 | }
1207 | ```
1208 |
1209 |
1210 |
1211 | __POST__ /v3/E/{id}/espacestravail/{espace.id}/acces.awp
1212 |
1213 | Permet de joindre un espace de travail.
1214 |
1215 | Si la notation typescript ne vous est pas familière, ça veut dire qu'il faut renseigner les mêmes champs que ceux de Workspace à l'exception de `type` et `creeLe`, et aussi renseigner `cloudLibelle` et `fullLoaded`.
1216 |
1217 | TODO: Vérifier si le corps de requête est nécessaire pour joindre l'espace de travail
1218 |
1219 | Data en body :
1220 | ```typescript
1221 | Omit
1228 |
1229 | __DELETE__ /v3/E/{id}/espacestravail/{espace.id}/acces.awp
1230 |
1231 | Permet de quitter un espace de travail.
1232 |
1233 | Pas besoin d'envoyer quoi que ce soit en body; pas de réponse non plus.
1234 |
1235 | ### Manuels numériques
1236 |
1237 | __GET__ `/v3/Eleves/{id}/manuelsNumeriques.awp`
1238 |
1239 | Liste les manuels numériques disponibles pour l'élève.
1240 |
1241 | Data dans la réponse :
1242 | ```typescript
1243 | Array<{
1244 | libelle: string,
1245 | url: string,
1246 | urlCouverture: string,
1247 | urlTelechargement: "",
1248 | editeur: string,
1249 | idRessource: string, // Je sais pas à quoi ça peut bien servir (peut-être dans l'EDT ?)
1250 | affecte: true, // ?
1251 | ogec: string, // Code RNE de l'établissement scolaire
1252 | eleves: [], // ?
1253 | disciplines: Array
Le format de la date est AAAAMMJJ.
1377 |
1378 | Data dans la réponse :
1379 | ```typescript
1380 | {
1381 | creneauMinRetrait: string, // ???
1382 | soldePM: number, // portefeuille de l'élève
1383 | libellePM: string, //
1384 | montantDecouvert: number, //???
1385 | montantSemaineAtteint: boolean,
1386 | montantJournalierAtteint: boolean,
1387 | nbPassageSemaineAtteint: boolean,
1388 | montantSemaine: number,
1389 | montantJournalier: number,
1390 | montantActuelSemaineUser: number,
1391 | nbPassageSemaine: number,
1392 | articlesSansStock: Array<{{string}}>, // exemple : ["DONUTS", "GAUFFRES"]
1393 | articlesAvecStock: Array<{
1394 | id: number,
1395 | code: string
1396 | type: string,
1397 | montant: number,
1398 | idCateg: number
1399 | }>
1400 | }
1401 | ```
1402 |
1403 | __POST__ ``/v3/E/{id}/commandesPassage.awp``
1404 |
1405 | Permet de passer une commande.
1406 | Body:
1407 | ```typescript
1408 | {
1409 | articles: Array<{
1410 | code: string,
1411 | libelle: string,
1412 | description: string,
1413 | estFormule: boolean,
1414 | etat: number,
1415 | img: string, // (URL)
1416 | montant: number,
1417 | quantite: number,
1418 | quantiteMax: number,
1419 | estObligatoire: boolean
1420 | ordre: number,
1421 | possibilites: Array<{
1422 | code: string,
1423 | libelle: string,
1424 | quantite: number,
1425 | etat: number,
1426 | idCateg: number,
1427 | libelleCateg: string,
1428 | ordre: number,
1429 | img: string,
1430 | choix: Array<{
1431 | libelle: string,
1432 | id: number,
1433 | ordre: number
1434 | }>,
1435 | }>,
1436 | }>,
1437 | creneau: string, //exemple: "12:00"
1438 | date: string, // AAAA-MM-JJ
1439 | pointDePassage: number // (idPDP)
1440 | }
1441 | ```
1442 | En réponse, si la commande contient les bonnes informations :
1443 | ```typescript
1444 | {
1445 | idCommande: number,
1446 | numeroCommande: string,
1447 | creneau: string,
1448 | date: string, // AAAA-MM-JJ
1449 | dateCreneau: string,
1450 | etat: string,
1451 | estHorsDelai: boolean,
1452 | idUser: number,
1453 | typeUser: string,
1454 | articles: Array<{
1455 | code: string,
1456 | libelle: string,
1457 | description: string,
1458 | estFormule: boolean,
1459 | etat: number,
1460 | img: string, // (URL)
1461 | montant: number,
1462 | quantite: number,
1463 | quantiteMax: number,
1464 | estObligatoire: boolean
1465 | ordre: number,
1466 | possibilites: Array<{
1467 | code: string,
1468 | libelle: string,
1469 | quantite: number,
1470 | etat: number,
1471 | idCateg: number,
1472 | libelleCateg: string,
1473 | ordre: number,
1474 | img: string,
1475 | choix: Array<{
1476 | libelle: string,
1477 | id: number,
1478 | ordre: number
1479 | }>,
1480 | }>,
1481 | }>,
1482 | pointDePassage: {
1483 | id: number,
1484 | libelle: string
1485 | }
1486 | }
1487 | ```
1488 | Sinon, elle renvoie un code 512.
1489 |
1490 | __DELETE__ ``v3/E/{id}/commandesPassage/{idCommande}.awp``
1491 |
1492 | Permet de supprimer une commande, selon l'idCommande.
1493 | Il ne renvoie rien si l'idCommande est bon. Sinon, il renvoie simplement un code erreur 210.
1494 |
1495 | ## Classe
1496 |
1497 | ### Vie de la classe
1498 |
1499 | Il existe deux routes différentes, mais je n'ai eu que des objets vides comme réponse.
1500 |
1501 | __GET__ `/v3/Classes/{classe.id}/viedelaclasse.awp`
1502 |
1503 | __GET__ `/v3/R/{classe.id}/viedelaclasse.awp`
1504 |
1505 |
1506 | ## Cloud
1507 |
1508 | ### Chemins
1509 |
1510 | Les fichiers dans le cloud sont identifiés par leur chemin. C'est des chemins *windows*, parfois appelés `unc` dans l'API.
1511 |
1512 | On trouve différents types de chemins, avec RNE le code RNE de l'établissement :
1513 | - Les chemins des clouds élèves, du type `\{RNE}\E\{id}\...`
1514 | - Les chemins des clouds des espaces de travail, du type `\{RNE}\W\{ent.id}\...`
1515 | - Les chemins des ressources temporaires, du type `\\STOCK-TMP\tmp\{RNE}_{role}_{id}_{hash}\...`
1516 |
1517 | Parfois les chemins sont préfixés par un autre cloud, du type `\\CLOUD08\cloud\...`. Même si c'est pas pour tous les fichiers. TODO: Élucider la question.
1518 |
1519 | ### Cloud élève
1520 |
1521 | __GET__ `/v3/cloud/E/{id}.awp`
1522 |
1523 | Permet d'obtenir des informations sur un fichier ou un dossier (*nœud*) dans le cloud de l'élève.
1524 |
1525 | Lorsque des informations sur un dossier sont demandées, ses nœuds fils sont aussi transmis, y compris les sous-dossiers et leurs nœuds fils à eux aussi, jusqu'à une certaine profondeur. Après, la propriété `isLoaded` des sous-dossiers est mise sur `false` et il faut refaire une requête pour obtenir le contenu de ces sous-dossiers.
1526 |
1527 | Paramètres de recherche :
1528 | - `idfolder=` chemin de dossier, pour spécifier un dossier dont on veut obtenir le contenu. Ne pas indiquer pour obtenir la racine.
1529 |
1530 | Data dans la réponse :
1531 | ```typescript
1532 | Array
1559 |
1560 | __POST__ `/v3/cloud/E/{id}.awp`
1561 |
1562 | Permet de créer un nouveau fichier ou dossier dans le cloud. Pour ajouter des fichiers existants, utiliser la route de téléversement.
1563 |
1564 | La route prend en body une propriété `parentNode` qui peut être un objet `Nœud` complet mais la propriété `id` est la seule nécessaire, le reste est facultatif.
1565 |
1566 | Data en body :
1567 | ```typescript
1568 | {
1569 | parentNode: Pick
1581 |
1582 | __PUT__ `/v3/cloud/E/{id}.awp`
1583 |
1584 | Permet de renommer un nœud et de changer le lien ou la description d'un lien.
1585 |
1586 | Data en body :
1587 | ```typescript
1588 | {
1589 | node: Nœud,
1590 | newLibelle: string,
1591 | newUrl?: string,
1592 | newDescription?: string,
1593 | }
1594 | ```
1595 |
1596 | Data dans la réponse :
1597 | ```typescript
1598 | {
1599 | newId: string,
1600 | newLibelle: string,
1601 | newUrl?: string, // Présents pour les liens
1602 | newDescription?: string,
1603 | }
1604 | ```
1605 |
1606 |
1607 |
1608 | __COPY__ `/v3/cloud/E/{id}.awp`
1609 |
1610 | Permet de copier des nœuds dans un autre dossier.
1611 |
1612 | Data en body :
1613 | ```typescript
1614 | {
1615 | parentNode: Nœud, // Dossier de destination. TODO: Vérifier spécificité (id)
1616 | clipboard: Array
1626 |
1627 | __DELETE__ `/v3/cloud/E/{id}.awp`
1628 |
1629 | Permet de supprimer un nœud.
1630 |
1631 | Data en body :
1632 | ```typescript
1633 | {
1634 | tabNodes: Array
41 | Permet de se connecter à EcoleDirecte avec des identifiants.
42 |
43 | **Paramètres:**
44 |
45 | ```javascript
46 | login("identifiant", "mot de passe")
47 | ```
48 |
49 | **Exemple:**
50 |
51 | ```javascript
52 | const ED = require("Papillon-ED-Core")
53 | ED.auth.login("identifiant", "mot de passe").then(() => {
54 | let token = ed._token;
55 | let prenom = ed.student.prenom
56 |
57 | // ...
58 | })
59 | .catch(err => { //en cas d'erreur à la connexion
60 | console.log(err)
61 | })
62 | ```
63 |
64 | ##### setToken()
65 | **Description:**
66 |
67 | Permet de se connecter à EcoleDirecte avec un token déjà généré.
68 |
69 | **Paramètres:**
70 | ```javascript
71 | setToken("token", userID)
72 | ```
73 |
74 | **Exemple:**
75 | ```javascript
76 | const ED = require("Papillon-ED-Core")
77 | let ed = new ED()
78 |
79 | ed.auth.setToken("token", userID)
80 |
81 | //...
82 | ```
83 |
--------------------------------------------------------------------------------
/docs/development/api/papillon.md:
--------------------------------------------------------------------------------
1 | # API Papillon
2 |
3 | !!!info
4 | L'api Papillon permet de récupérer la liste des contributeurs, les disclaimers, les messages d'alerte ainsi que les informations de la dernière version de l'application.
5 |
6 | Elle est accessible à tous [ici](https://api.getpapillon.xyz)
7 |
8 | Son [repo GitHub](https://github.com/PapillonApp/PapiAPI) est public
9 |
10 | Elle est disponible sur [Docker Hub](https://hub.docker.com/repository/docker/vilerio/papillon-api/general)
11 |
12 |
13 | ## Endpoints
14 |
15 | - GET /api : Version de l'api
16 | - GET /team : Liste des membres de l'équipe
17 | - GET /messages : Liste de tous les messages de l'app
18 | - GET /latestVersion/plateforme : Dernière version de l'application pour la plateforme en question
--------------------------------------------------------------------------------
/docs/development/api/pawnote.md:
--------------------------------------------------------------------------------
1 | # Pawnote (compatible avec Pronote)
2 |
3 | !!! info
4 | Pronote est une marque déposée de la société [Index Éducation :octicons-link-external-24:](https://www.index-education.com/){target='_blank'}. Papillon et Pawnote ne sont pas affiliés à Index Éducation.
5 |
6 | [Pawnote :octicons-link-external-24:](https://github.com/LiterateInk/Pawnote){target='_blank'} est un paquet Node.js qui permet d'interagir avec l'API de l'application web de gestion de vie scolaire Pronote.
7 |
8 | !!! npm "npm"
9 | Le paquet est disponible sur [npmjs.com :octicons-link-external-24:](https://www.npmjs.com/package/pawnote){target='_blank'} sous le nom `pawnote`.
10 |
11 | Développé et maintenu par [Vexcited :octicons-link-external-24:](https://github.com/Vexcited){target='_blank'}, ce module est utilisé massivement dans Papillon pour interagir avec l'API de Pronote.
12 |
13 | !!! tip "Documentation disponible"
14 | La documentation de Pawnote est disponible à l'adresse [pawnote.js.org :octicons-link-external-24:](https://pawnote.js.org){target='_blank'}.
15 |
--------------------------------------------------------------------------------
/docs/development/api/ts/api.md:
--------------------------------------------------------------------------------
1 | # Turboself API
2 |
3 | !!! info
4 | Turboself est une marque déposée de la société [TurboSelf :octicons-link-external-24:](https://www.turboself.com/){target='_blank'}. Papillon n'est pas affilié à Turboself.
5 | Turboself offre un service de gestion des réservations de repas pour les cantines scolaires.
6 |
7 | Le service est accessible via une API REST.
8 |
9 | L'API a été documentée grâce aux contributions de la communauté et est accessible via Swagger.
10 |
11 |
47 | Permet de se connecter au service MyTurboself
48 |
**Paramètres:**
49 | ```javascript
50 | login(username, password)
51 | ```
52 | **Exemple:**
53 | ```javascript
54 | const TurboSelf = require('papillon-turboself-core')
55 | let ts = new TurboSelf();
56 |
57 | async function main() {
58 | let result = await ts.login('username@mail.com', 'Password1234')
59 | console.log(result)
60 | }
61 |
62 | main()
63 | ```
64 | **Retour:**
65 | ```javascript
66 | {
67 | error: false,
68 | errorMessage: '',
69 | data: {
70 | token: 'XXXXXXXXXXXX...',
71 | userId: XXXXXXX,
72 | etabId: XXXXXX
73 | }
74 | }
75 | ```
76 |
77 | ##### getUserInfo()
78 | **Description:**
79 | Obtient les informations de l'utilisateur connecté
80 |
**Paramètres:**
81 | ```javascript
82 | getUserInfo()
83 | ```
84 | **Exemple:**
85 | ```javascript
86 | const TurboSelf = require('papillon-turboself-core')
87 | let ts = new TurboSelf();
88 |
89 | async function main() {
90 | await ts.login('username@mail.com', 'Password1234')
91 | let result = ts.getUserInfo()
92 | console.log(result)
93 | }
94 |
95 | main()
96 | ```
97 | **Retour:**
98 | ```json
99 | {
100 | error: false,
101 | errorMessage: '',
102 | data: {
103 | id: XXXXXX,
104 | origId: XXXXX,
105 | type: 0,
106 | lastName: 'Doe',
107 | firstName: 'Jonh',
108 | class: 'CE1',
109 | method: 'Argent',
110 | quality: 'TICKET',
111 | authorization: {
112 | pay: true,
113 | book: true,
114 | cafeteria: false
115 | },
116 | lastSync: '20XX-XX-XXTXX:XX:XX.XXXZ',
117 | disabled: false,
118 | isPasswordSecure: true,
119 | cardData: null
120 | }
121 | }
122 | ```
123 |
124 | ##### getHome()
125 | **Description:**
126 | Obtient l'écran d'acceuil de l'utilisateur connecté
127 |
**Paramètres:**
128 | ```javascript
129 | getHome()
130 | ```
131 | **Exemple:**
132 | ```json
133 | const TurboSelf = require('papillon-turboself-core')
134 | let ts = new TurboSelf();
135 |
136 | async function main() {
137 | await ts.login('username@mail.com', 'Password1234')
138 | let result = ts.getHome()
139 | console.log(result)
140 | }
141 |
142 | main()
143 | ```
144 | **Retour:**
145 | ```json
146 | {
147 | error: false,
148 | errorMessage: '',
149 | data: {
150 | userInfo: {
151 | id: 'XXXXXXXXXX',
152 | balance: -10.5,
153 | estimatedBalance: -150.10,
154 | estimatedFor: '20XX-XX-XX'
155 | },
156 | history: [
157 | {
158 | id: XXXXXXXXX,
159 | name: 'Self',
160 | date: '20XX-XX-XXTXX:XX:XX.000Z',
161 | cost: -40.8
162 | },
163 | ...
164 | ]
165 | }
166 | }
167 | ```
168 |
169 | ##### getBooking()
170 | **Description:**
171 | Obtient les réservations d'une semaine de l'utilisateur connecté
172 |
**Paramètres:**
173 | ```javascript
174 | getBooking(date = new Date())
175 | ```
176 | **Exemple:**
177 | ```json
178 | const TurboSelf = require('papillon-turboself-core')
179 | let ts = new TurboSelf();
180 |
181 | async function main() {
182 | await ts.login('username@mail.com', 'Password1234')
183 | let result = ts.getBooking()
184 | console.log(result)
185 | }
186 |
187 | main()
188 | ```
189 | **Retour:**
190 | ```json
191 | {
192 | error: false,
193 | errorMessage: '',
194 | data: {
195 | weekId: 'XXXXXXXXXXX',
196 | days: [
197 | {
198 | id: 'XXXXXXXXXXX',
199 | dayNumber: 1, //(1: Lundi, 5: Vendredi)
200 | booked: true,
201 | lastSyncBooked: 1,
202 | canEdit: false,
203 | label: 'Lundi 11 Déc.',
204 | date: '11-12-2023'
205 | },
206 | ...
207 | ]
208 | }
209 | }
210 | ```
211 |
212 | ##### setBooking()
213 | **Description:**
214 | Défini une réservation de l'utilisateur connecté
215 |
**Paramètres:**
216 | ```javascript
217 | setBooking(weekId : Int, dayNumber : Int, booked : Bool)
218 | ```
219 | **Exemple:**
220 | ```json
221 | const TurboSelf = require('papillon-turboself-core')
222 | let ts = new TurboSelf();
223 |
224 | async function main() {
225 | await ts.login('username@mail.com', 'Password1234')
226 | let result = ts.setBooking(XXXXXXXXXXX, 3 (Mercredi), false)
227 | console.log(result)
228 | }
229 |
230 | main()
231 | ```
232 | **Retour:**
233 | ```json
234 | {
235 | error: false,
236 | errorMessage: '',
237 | data: {
238 | id: 'XXXXXXXXXXX',
239 | dayNumber: 3,
240 | booked: false
241 | }
242 | }
243 | ```
244 |
245 | ##### getHistory()
246 | **Description:**
247 | Obtient l'historique complet de l'utilisateur connecté
248 |
**Paramètres:**
249 | ```javascript
250 | getHistory()
251 | ```
252 | **Exemple:**
253 | ```json
254 | const TurboSelf = require('papillon-turboself-core')
255 | let ts = new TurboSelf();
256 |
257 | async function main() {
258 | await ts.login('username@mail.com', 'Password1234')
259 | let result = ts.getHistory()
260 | console.log(result)
261 | }
262 |
263 | main()
264 | ```
265 | **Retour:**
266 | ```json
267 | {
268 | error: false,
269 | errorMessage: '',
270 | data: [
271 | {
272 | id: XXXXXXXXX,
273 | name: 'Self',
274 | cost: -40.70,
275 | date: '20XX-XX-XXTXX:XX:XX.XXXZ'
276 | },
277 | ...
278 | }
279 | ]
280 | }
281 | ```
282 |
283 | #### getBalance()
284 | **Description:**
285 | Obtient le solde de l'utilisateur connecté
286 |
**Paramètres:**
287 | ```javascript
288 | getBalance()
289 | ```
290 | **Exemple:**
291 | ```javascript
292 | const TurboSelf = require('papillon-turboself-core')
293 | let ts = new TurboSelf();
294 |
295 | async function main() {
296 | await ts.login('username@mail.com', 'Password1234')
297 | let result = ts.getBalance()
298 | console.log(result)
299 | }
300 |
301 | main()
302 | ```
303 | **Retour:**
304 | ```json
305 | {
306 | error: false,
307 | errorMessage: '',
308 | data: {
309 | id: 'XXXXXXXXXX',
310 | balance: 10.0,
311 | estimatedBalance: -45.13,
312 | estimatedFor: '20XX-XX-XX'
313 | }
314 | }
315 | ```
316 |
317 | #### canBookEvening()
318 | **Description:**
319 | Retourne si l'utilisateur connecté peut réserver le soir
320 |
**Paramètres:**
321 | ```javascript
322 | canBookEvening()
323 | ```
324 | **Exemple:**
325 | ```javascript
326 | const TurboSelf = require('papillon-turboself-core')
327 | let ts = new TurboSelf();
328 |
329 | async function main() {
330 | await ts.login('username@mail.com', 'Password1234')
331 | let result = ts.canBookEvening()
332 | console.log(result)
333 | }
334 |
335 | main()
336 | ```
337 | **Retour:**
338 | ```json
339 | {
340 | error: false,
341 | errorMessage: '',
342 | data: false
343 | }
344 | ```
345 |
346 | #### getEtabInfo()
347 | **Description:**
348 | Obtient les informations de l'établissement de l'utilisateur connecté
349 |
**Paramètres:**
350 | ```javascript
351 | getEtabInfo()
352 | ```
353 | **Exemple:**
354 | ```javascript
355 | const TurboSelf = require('papillon-turboself-core')
356 | let ts = new TurboSelf();
357 |
358 | async function main() {
359 | await ts.login('username@mail.com', 'Password1234')
360 | let result = ts. getEtabInfo()
361 | console.log(result)
362 | }
363 |
364 | main()
365 | ```
366 | **Retour:**
367 | ```json
368 | {
369 | error: false,
370 | errorMessage: '',
371 | data: {
372 | id: XXXX,
373 | TSid: 1,
374 | code2p5: XXXX,
375 | name: 'Lycée/Collège XXX',
376 | version: 'XXX',
377 | disabled: false,
378 | symbol: '€',
379 | minCreditAdd: 15.5,
380 | prixDej: 2.87,
381 | address: {
382 | line1: '1 Rue Doe Jonh',
383 | line2: '',
384 | postalCode: '10000',
385 | city: 'Ville connu'
386 | },
387 | contact: {
388 | url: 'http://mon.lycee-ou-college.com/',
389 | email: 'mail@college-lycee.com',
390 | tel: '0606060606'
391 | },
392 | sync: {
393 | first: '20XX-XX-XXTXX:XX:XX.XXXZ',
394 | last: '20XX-XX-XXTXX:XX:XX.XXXZ'
395 | }
396 | }
397 | }
398 | ```
399 |
400 |
401 | #### getLastPayment()
402 | **Description:**
403 | Obtient le dernier paiments de l'utilisateur connecté
404 |
**Paramètres:**
405 | ```javascript
406 | getLastPayment()
407 | ```
408 | **Exemple:**
409 | ```javascript
410 | const TurboSelf = require('papillon-turboself-core')
411 | let ts = new TurboSelf();
412 |
413 | async function main() {
414 | await ts.login('username@mail.com', 'Password1234')
415 | let result = ts.getLastPayment()
416 | console.log(result)
417 | }
418 |
419 | main()
420 | ```
421 | **Retour:**
422 | ```json
423 | {
424 | error: false,
425 | errorMessage:'',
426 | data: {
427 | id: 0000000,
428 | etabId: 0000000,
429 | date: '20XX-XX-XXTXX:XX:XX.XXXZ',
430 | amount: 20,
431 | method: 'CB',
432 | updateDate: '20XX-XX-XXTXX:XX:XX.XXXZ',
433 | status: 'OK',
434 | transactionId: 'XXXXXXXXXXXXXX',
435 | token: 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX',
436 | message: 'Paiement accepté'
437 | }
438 | }
439 | ```
--------------------------------------------------------------------------------
/docs/development/api/ts/turboself.yml:
--------------------------------------------------------------------------------
1 | openapi: 3.0.0
2 | info:
3 | title: Turboself API
4 | servers:
5 | - url: https://api-rest-prod.incb.fr
6 | tags:
7 | - name: Authentification
8 | - name: Acquisition d'informations (Fetch)
9 | - name: Action
10 |
11 | components:
12 | securitySchemes:
13 | bearerAuth: # arbitrary name for the security scheme
14 | type: http
15 | scheme: bearer
16 | bearerFormat: JWT
17 |
18 | paths:
19 | /api/v1/auth/login:
20 | post:
21 | summary: Se connecter à son compte Turbself
22 | tags:
23 | - "Authentification"
24 | requestBody:
25 | required: true
26 | content:
27 | application/json:
28 | schema:
29 | type: object
30 | properties:
31 | username:
32 | type: string
33 | password:
34 | type: string
35 | responses:
36 | '201':
37 | description: Connexion réussi
38 | content:
39 | application/json:
40 | schema:
41 | type: object
42 | properties:
43 | access_token:
44 | type: string
45 | userId:
46 | type: integer
47 | hoteId:
48 | type: integer
49 |
50 | /api/v1/etablissements:
51 | get:
52 | summary: Rechercher des établissements
53 | parameters:
54 | - name: q
55 | in: query
56 | required: true
57 | description: Nom de l'établissement à chercher
58 | schema:
59 | type: string
60 | - name: limit
61 | in: query
62 | required: true
63 | description: Limite d'établissements à afficher
64 | schema:
65 | type: integer
66 | tags:
67 | - "Accisition d'informations (Fetch)"
68 | responses:
69 | '200':
70 | description: Liste des établissements
71 | content:
72 | application/json:
73 | schema:
74 | type: array
75 | items:
76 | type: object
77 | properties:
78 | code2p5:
79 | type: integer
80 | nom:
81 | type: string
82 | versionTS:
83 | type: string
84 |
85 | /api/v1/hotes/{hoteId}:
86 | get:
87 | security:
88 | - bearerAuth: []
89 | summary: Information sur l'établissement
90 | parameters:
91 | - name: hoteId
92 | in: path
93 | required: true
94 | description: Id de l'établissement
95 | schema:
96 | type: integer
97 | tags:
98 | - "Accisition d'informations (Fetch)"
99 | responses:
100 | '200':
101 | description: Information sur l'établissement
102 |
103 | /api/v1/hotes/{hoteId}/resa-soir:
104 | get:
105 | security:
106 | - bearerAuth: []
107 | summary: Autorisation réservation du soir
108 | parameters:
109 | - name: hoteId
110 | in: path
111 | required: true
112 | description: Id de l'établissement
113 | schema:
114 | type: integer
115 | tags:
116 | - "Accisition d'informations (Fetch)"
117 | responses:
118 | '200':
119 | description: État autorisation réservation du soir
120 |
121 | /api/v1/reservations/hotes/{hoteId}/semaines:
122 | get:
123 | security:
124 | - bearerAuth: []
125 | summary: Information sur les réservations
126 | parameters:
127 | - name: hoteId
128 | in: path
129 | required: true
130 | description: Id de l'établissement
131 | schema:
132 | type: integer
133 | - name: date
134 | in: query
135 | required: true
136 | description: Date format DD-MM-YYYY
137 | schema:
138 | type: string
139 | tags:
140 | - "Accisition d'informations (Fetch)"
141 | responses:
142 | '200':
143 | description: Information sur le solde
144 |
145 | /api/v2/hotes/{hoteId}/accueil:
146 | get:
147 | security:
148 | - bearerAuth: []
149 | summary: Information sur le solde
150 | parameters:
151 | - name: hoteId
152 | in: path
153 | required: true
154 | description: Id de l'établissement
155 | schema:
156 | type: integer
157 | tags:
158 | - "Accisition d'informations (Fetch)"
159 | responses:
160 | '200':
161 | description: Information sur le solde
162 |
163 | /api/v2/hotes/{hoteId}/reservations-jours:
164 | post:
165 | security:
166 | - bearerAuth: []
167 | tags:
168 | - "Action"
169 | summary: Réserver un repas
170 | parameters:
171 | - name: hoteId
172 | in: path
173 | required: true
174 | description: Id de l'établissement
175 | schema:
176 | type: integer
177 | requestBody:
178 | required: true
179 | content:
180 | application/json:
181 | schema:
182 | type: object
183 | properties:
184 | dayOfWeek:
185 | type: integer
186 | dayReserv:
187 | type: string
188 | web:
189 | type: object
190 | properties:
191 | id:
192 | type: integer (weekId) #week id
193 | responses:
194 | '200':
195 | description: Information sur le solde
--------------------------------------------------------------------------------
/docs/development/app/android.md:
--------------------------------------------------------------------------------
1 | # Développer Papillon sous Android
2 |
3 | ## **Pré-requis**
4 | - [x] Un ordinateur sous :
5 | - Windows 8 ou ultérieur
6 | - macOS 10.14 Mojave ou ultérieur
7 | - Linux 64 bit qui prend en charge GNU C Library (glibc) en version 2.31
8 | - [x] Des bases en JavaScript
9 | - [x] Des connaissances du terminal de Windows
10 |
11 | ## **Installation des dépendances**
12 |
13 | ### Node.js
14 | [Node.js](https://nodejs.org){target=_blank} est nécessaire pour installer le reste des outils nécessaires.
15 |
16 | Vous pouvez le télécharger sur le site suivant : [https://nodejs.org](https://nodejs.org){target=_blank}
17 |
18 | ### Android Studio
19 |
20 | [Android Studio](https://developer.android.com/studio) est nécessaire pour développer sous Android.
21 |
22 | Vous pouvez le télécharger sur le site suivant : [https://developer.android.com/studio](https://developer.android.com/studio){target=_blank}
23 |
24 | !!! tip "macOS"
25 |
26 | Si vous êtes sous macOS, vous pouvez aussi installer Android Studio via [Homebrew](https://brew.sh/){target=_blank}
27 |
28 | ```sh
29 | brew install --cask android-studio
30 | ```
31 |
32 | ## Environnement
33 | Commencez par cloner le [repo de Papillon](https://github.com/PapillonApp/Papillon){target=_blank} et mettre en place votre environnement de développement.
34 |
35 | Une fois le repo cloné, installez simplement les packages npm liés :
36 |
37 | ```
38 | npm i
39 | ```
40 |
41 | Il sera aussi nécessaire d'avoir [**Expo CLI**](https://docs.expo.dev/more/expo-cli/){target=_blank} :
42 |
43 | ```
44 | npm install -g expo-cli
45 | ```
46 |
47 | ## **Développement**
48 |
49 | Pour lancer l'application en mode développement, vous devez installer l'application de développement (un mini Expo Go qui permet de charger l'application depuis votre PC avec un live reload)
50 |
51 | Pour commencer :
52 |
53 | 1- Modifiez le fichier **`app.json`** afin de modifier le nom de l'application ainsi que son package, pour éviter de remplacer la vraie appli.
54 |
55 | - Ligne 3, variable **`name`**: remplacer par le nom de votre choix (exemple "Papillon Dev").
56 |
57 | - Ligne 71, variable **`package`**: remplacer par exemple par **`xyz.getpapillon.app.dev`**. Ne pas changer cette variable entraînera une erreur à l'installation et un remplacement de l'appli officielle.
58 |
59 | 2- Exécutez la commande suivante dans votre terminal :
60 | ```sh
61 | npx expo prebuild
62 | ```
63 |
64 | 3- Ouvrir Android Studio et ouvrir le dossier Android.
65 |
66 | !!! notes
67 | Si c'est la première fois que vous lancez Android Studio, de nombreux fichiers se téléchargeront automatiquement et cela prendra plus ou moins de temps en fonction de votre connexion internet.
68 |
69 | 4- Attendre que Android Studio ai terminé ses processus (visible en bas à droite).
70 |
71 | 5- Si le Gradle Sync ne s'est pas automatiquement exécuté, le faire manuellement via Files > Sync project with graddle Files ou en pressant les touches `Ctrl + Maj + O`.
72 |
73 | 6- Configurer son téléphone pour le développement : [Comment configurer son téléphone pour le développement](https://developer.android.com/studio/run/device?hl=fr#setting-up){target=_blank}
74 |
75 | Une fois que ceci est fait, vous pouvez soit :
76 |
77 | - Connecter votre téléphone à votre PC via USB : [Comment connecter son téléphone via USB](https://developer.android.com/studio/run/device?hl=fr#connect){target=_blank}
78 | - Connecter votre téléphone via wifi : [Comment connecter son téléphone via wifi](https://developer.android.com/studio/run/device?hl=fr#wireless){target=_blank}
79 | - Créer un émulateur : [Comment créer un émulateur android](https://developer.android.com/studio/run/emulator?hl=fr#avd){target=_blank}
80 |
81 | 7- Appuyer sur l'îcone "Run" en haut à droite à côté du nom de votre appareil pour démarrer le build et l'installer automatiquement sur votre appareil.
82 |
83 | !!! notes
84 | Vous pouvez consulter le statut du build en vous rendant dans l'onglet "Build" en bas du logiciel, ou dans View > Tool Window > Build.
85 |
86 | 8- Sur le PC, exécutez la commande suivante dans votre terminal :
87 | ```sh
88 | npm start
89 | ```
90 |
91 | Si ça ne marche pas, il est possible d'exécuter la commande suivante :
92 | ```sh
93 | npx expo start --dev-client
94 | ```
95 |
96 | 9- Lancer l'application de developpement sur le téléphone/émulateur. Le serveur doit automatiquement s'afficher en haut, cliquez dessus pour commencer le chargement.
97 |
98 | Si ce n'est pas le cas, vérifiez que :
99 |
100 | - Le wifi du PC est en mode privé (visible via les paramètres réseaux).
101 | - Le téléphone et le PC sont connectés au même réseau. Si malgré tout le serveur ne s'affiche pas, un QR Code est généré dans le terminal. Utilisez votre appareil photo pour le scanner.
102 |
103 |
--------------------------------------------------------------------------------
/docs/development/app/eas.md:
--------------------------------------------------------------------------------
1 | # Développer Papillon avec
2 |
3 | !!! warning ""
4 | Ce tutoriel n'est pas complet. Il est en cours de rédaction. Si vous avez des questions, n'hésitez pas à demander sur le [Discord](https://discord.gg/ywkBZx2jFB){target=\_blank}.
5 |
6 | Il ne s'adresse pour l'instant qu'aux développeurs **Android**, mais un tutoriel pour **iOS** est en cours de rédaction.
7 |
8 | ## **Pré-requis**
9 |
10 | - [x] Un ordinateur sous :
11 | - Windows 8 ou ultérieur
12 | - macOS 10.14 Mojave ou ultérieur
13 | - Linux 64 bit qui prend en charge GNU C Library (glibc) en version 2.31
14 | - [x] Des bases en JavaScript
15 | - [x] Des connaissances du terminal de Windows
16 | - [x] Un compte Expo-EAS
17 |
18 | !!! info "Eas, c'est quoi ?"
19 | EAS ou Expo Application Services est un service cloud qui permet de construire, déployer et gérer des applications Expo ou React Native. Créé par la team derrière le framework Expo, EAS permet dans cette usage, de build une application Papillon gratuitement (même si il existe un plan payant pour des fonctionnalités avancées). Il est à utiliser notamment si vous avez peu de mémoire, de performance ou de stockage mais cela offre moins de flexibilité et de contrôle sur le build.
20 |
21 | ## **Installation des dépendances**
22 |
23 | ### Node.js
24 |
25 | [Node.js](https://nodejs.org){target=\_blank} est nécessaire pour installer le reste des outils nécessaires.
26 |
27 | Vous pouvez le télécharger sur le site suivant : [https://nodejs.org](https://nodejs.org){target=\_blank}
28 |
29 | ## Environnement
30 |
31 | Commencez par cloner le [repo de Papillon](https://github.com/PapillonApp/Papillon){target=\_blank} et mettre en place votre environnement de développement.
32 |
33 | Une fois le repo cloné, installez simplement les packages npm liés :
34 |
35 | ```
36 | npm i
37 | ```
38 |
39 | Il sera aussi nécessaire d'avoir [**Expo CLI**](https://docs.expo.dev/more/expo-cli/){target=\_blank} ainsi que [**EAS CLI**](https://docs.expo.dev/build/setup/){target=\_blank} :
40 |
41 | ```
42 | npm install -g expo-cli eas-cli
43 | ```
44 |
45 | ## **Développement**
46 |
47 | Pour lancer l'application en mode développement, vous devez installer l'application de développement (un mini Expo Go qui permet de charger l'application depuis votre PC avec un live reload)
48 |
49 | Pour commencer :
50 |
51 | 1- Se connecter à son compte EAS et à son projet
52 |
53 | Si vous ne possedez pas de compte EAS, vous pouvez en créer un en suivant ce lien : [Créer un compte EAS](https://expo.dev/signup){target=\_blank}. Ensuite reste à créer un projet EAS en vous rendant dans "Projects" puis "New project". Le nom est libre, mais le `slug` doit être **`papillonvex`**.
54 |
55 | Dans votre terminale, vous pouvez ensuite vous connecter via la commande :
56 | ```sh
57 | eas login
58 | ```
59 |
60 | 2- Modifiez le fichier **`app.json`** afin de changer le nom de l'application ainsi que son package, pour éviter de remplacer la vraie appli, et enfin le relier à son projet EAS
61 |
62 | - Ligne 3, variable **`name`**: remplacer par le nom de votre choix (exemple "Papillon Dev").
63 |
64 | - Ligne 71, variable **`package`**: remplacer par exemple par **`xyz.getpapillon.app.dev`**. Ne pas changer cette variable entraînera une erreur à l'installation et un remplacement de l'appli officielle.
65 |
66 | Rendez-vous sur la page de votre projet EAS, vous y trouverez deux informations utiles, l'ID et l'Owner à recopier dans le fichier **`app.json`**:
67 |
68 | - Ligne 83, variable **`projectId`** (dans `extra` puis `eas`): remplacer par l'identifiant de votre projet EAS. (champ "_ID_" sur la page EAS)
69 |
70 | - Ligne 220, variable **`owner`**: remplacer par votre nom de compte EAS. (champ "_Owner_" sur la page EAS)
71 |
72 | !!! warning "Ne pas ajouter dans un commit git ce fichier si vous l'avez modifié de la sorte !"
73 |
74 | 3- Exécutez la commande suivante dans votre terminal :
75 |
76 | ```sh
77 | npx expo prebuild
78 | ```
79 |
80 | 4- Créer un build
81 |
82 | Pour android :
83 |
84 | ```sh
85 | eas build --profile development --platform android
86 | ```
87 |
88 | Et pour iOS :
89 |
90 | ```sh
91 | eas build --profile development --platform ios
92 | ```
93 |
94 | Cette commande sert à créer un build de développement, permettant d'offrir les fonctionnalités d'Expo Go.
95 | Cependant, il est possible de créer un build de "production" en remplaçant `development` par `production`.
96 |
97 | 5- Configurer son téléphone pour le développement avec une application Expo-EAS :
98 |
99 | Une fois le build terminé, vous pouvez le télécharger en se rendant sur le lien du deploiement que vous avez reçu dans votre terminal.
100 |
101 | Nous vous conseillons de vous envoyer de lien à votre téléphone, et d'y télécharger le fichier APK pour Android, ou le fichier IPA pour iOS et de l'installer.
102 | Pour installer un APK, il vous sera demandé d'activer une option dans les paramètres de votre téléphone, "Installer des applications inconnues".
103 |
104 | 6- Sur le PC, exécutez la commande suivante dans votre terminal :
105 |
106 | ```sh
107 | npm start
108 | ```
109 |
110 | Si ça ne marche pas, il est possible d'exécuter la commande suivante :
111 |
112 | ```sh
113 | npx expo start --dev-client
114 | ```
115 |
116 | 7- Lancer l'application de developpement sur le téléphone/émulateur. Le serveur doit automatiquement s'afficher en haut, cliquez dessus pour commencer le chargement.
117 |
118 | Si ce n'est pas le cas, vérifiez que :
119 |
120 | - Le wifi du PC est en mode privé (visible via les paramètres réseaux).
121 | - Le téléphone et le PC sont connectés au même réseau. Si malgré tout le serveur ne s'affiche pas, un QR Code est généré dans le terminal. Utilisez votre appareil photo pour le scanner.
122 |
--------------------------------------------------------------------------------
/docs/development/app/ios.md:
--------------------------------------------------------------------------------
1 | # Développer Papillon sous iOS
2 |
3 | ## Pré-requis
4 | - [x] Un ordinateur sous macOS 14 ou ultérieur
5 | - [x] Des bases en JavaScript
6 | - [x] Une connaissance du terminal de macOS
7 |
8 | === "Documentation"
9 | ## Installation des dépendances
10 | ### Homebrew
11 | [Homebrew](https://brew.sh/) est nécessaire pour installer le reste des outils nécessaires.
12 |
13 | Vous pouvez l'installer simplement en indiquant cette commande dans un terminal macOS :
14 |
15 | ```sh
16 | /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
17 | ```
18 |
19 | ### Node & Watchman
20 | Si ce n'est pas déjà fait, installez Node.js et Watchman
21 |
22 | ```sh
23 | brew install node
24 | brew install watchman
25 | ```
26 | ### Xcode
27 | [Xcode](https://developer.apple.com/xcode/) est nécessaire pour développer sous iOS. Installez le depuis le [Mac App Store](https://apps.apple.com/us/app/xcode/id497799835?mt=12)
28 |
29 | #### Outils de ligne de commande
30 | Vous devez aussi installer les "Command Line Tools".
31 | Ouvrez Xcode, puis dans **Préférences > Locations**, Sélectionnez la version la plus récente de Xcode dans l'onglet "Command Line Tools"
32 | 
33 |
34 | ### CocoaPods
35 | Pour terminer, il est nécessaire d'avoir CocoaPods d'installé pour les dépendances de l'app.
36 |
37 | ```sh
38 | sudo gem install cocoapods
39 | ```
40 |
41 | ## Environnement
42 | Commencez par cloner le [repo de Papillon](https://github.com/PapillonApp/Papillon) et mettre en place votre environnement de développement.
43 |
44 | Une fois le repo cloné, installez simplement les packages npm liés :
45 |
46 | ```
47 | npm i
48 | ```
49 |
50 | Il sera aussi nécessaire d'avoir [**Expo CLI**](https://docs.expo.dev/more/expo-cli/) :
51 |
52 | ```
53 | npm install -g expo-cli
54 | ```
55 |
56 | Vous devrez aussi installer les dépendances de [**Cocoapods**](https://cocoapods.org/) dans le dossier *`/ios`*:
57 |
58 | ```
59 | pod install
60 | ```
61 |
62 | ## Les devbuilds
63 | Pour modifier Papillon et voir vos modifications, un "devbuild" est nécessaire.
64 |
65 | C'est une version spéciale de l'app qui se connecte à votre environnement de développement pour afficher vos changements en temps réel sans avoir à recompiler Papillon.
66 |
67 | Pour commencer, modifiez le fichier **`app.json`** afin de modifier le nom de l'application ainsi que son package, pour éviter de remplacer la vraie appli.
68 |
69 | - Ligne 3, variable **`name`**: remplacer par le nom de votre choix (exemple "Papillon Dev").
70 |
71 | - Ligne 71, variable **`package`**: remplacer par exemple par **`xyz.getpapillon.app.dev`**. Ne pas changer cette variable entraînera une erreur à l'installation et un remplacement de l'appli officielle.
72 |
73 | Pour installer une devbuild, rien de plus simple :
74 |
75 | Commencez par **prébuilder** Papillon. On expliquera en quoi cela consiste plus tard. Cette étape est nécessaire avant chaque compilation de l'app
76 |
77 | ```
78 | npx expo prebuild
79 | ```
80 |
81 | Une fois cela terminé, ouvrez Papillon dans Xcode en ouvrant le fichier *`/iOS/Papillon.xcworkspace`*.
82 |
83 | Vous n'avez plus qu'à démarrer l'app avec votre iPhone branché ou sur un simulateur iOS en sélectionnant un appareil et **en appuyant sur l'icône "Play" en haut de Xcode**.
84 |
85 | ### Démarrer une session de développement
86 | Une fois la prébuild installée, démarrez le serveur de développement via la commande suivante :
87 |
88 | ```
89 | npx expo start
90 | ```
91 |
92 | *(Vous n'êtes pas obligé de développer sur la même machine que celle qui a compilé la prébuild)*
93 | Une fois la commande démarrée, ouvrez l'app de prebuild sur votre iPhone et indiquez l'adresse du serveur ou alors, scannez le QR-Code affiché dans la console depuis l'app Appareil photo
94 |
95 | **(Vous devez avoir votre iPhone et votre ordinateur sur le même réseau local)**
96 |
97 | ## Les prébuilds
98 | La fonction ***`prebuild`*** permet de préparer l'app a être compilée en code natif pour iOS, cela indique :
99 | - Empaqueter les icônes, images, polices, et autres fichiers de l'app
100 | - Installer automatiquement les pods et modules de Papillon
101 | - Mettre a jour certaines parties natives de l'app.
102 |
103 | Tout cela se fait simplement et automatiquement avec une commande :
104 |
105 | ```
106 | npx expo prebuild
107 | ```
108 |
109 | Une fois effectuée, vous pouvez archiver ou démarrer l'app comme d'habitude.
110 |
111 | ## Compiler une version "release"
112 | Normalement, cela n'est pas nécessaire, mais vous pouvez créer une version release (donc indépendante) telle que vous l'obtiendrez sur l'App Store en utilisant l'option **Archive** sur Xcode.
113 |
114 | === "Tutoriel vidéo"
115 |
116 |
117 |
--------------------------------------------------------------------------------
/docs/development/ent.md:
--------------------------------------------------------------------------------
1 | # Environnement de Travail Numérique
2 |
3 | ## Définition
4 |
5 | Un environnement de travail numérique est un ensemble d'outils et de services numériques utilisés pour travailler. Il peut s'agir d'outils de communication, de gestion de projet, de stockage de fichiers, de développement logiciel, etc.
6 |
7 | ## Chez Papillon
8 | ### Compatibilité
9 |
10 | Actuellement, l'application Papillon est **compatible** avec les environnements de travail numérique suivants :
11 |
12 | - Pronote
13 | - Skolengo
14 | - EcoleDirecte (en cours de développement)
15 |
16 | ### Interopérabilité
17 |
18 | Papillon est conçu pour être **interopérable** avec plusieurs environnements de travail numérique. Cela signifie que Papillon a une architecture modulaire qui permet d'ajouter facilement de nouveaux environnements de travail numérique.
19 |
20 | #### Fonctionnement
21 |
22 | iOS
34 | Android
43 | EAS
52 |
5 | Ensuite installer les dépendances avec les commandes suivantes :
6 |
7 | ```sh
8 | pip3 install hug -U
9 | pip3 install pronotepy -U
10 | pip3 install lxml
11 | ```
12 |
13 | ## Installation
14 | ### Bare-metal
15 | Une fois les pré-requis en place vous pouvez exécuter le serveur avec la commande suivante :
16 | Veuillez noter que le serveur est prévu pour fonctionner sur notre infrastructure, il est donc possible que vous deviez modifier le code pour qu'il fonctionne sur votre propre serveur. De plus, il est **nécessaire** de modifier le fichier `server.py` et de supprimer les fonctions `get_client_on_instances()` et `token_get_client()` ainsi que les appels à ces fonctions *(si présent dans la branche téléchargée)*.
17 | ```sh
18 | git clone -b main https://github.com/PapillonApp/papillon-python
19 | cd papillon-python
20 | python -m hug -f server.py
21 | ```
22 | *Cela va lancer le serveur sur le port 8000.*
23 |
24 | ### Docker
25 | Une fois docker installé sur votre machine, vous pouvez pull l'image docker :
26 | ```sh
27 | docker pull justtryon/papillonserver:latest
28 | ```
29 | Une fois cela fait, vous pouvez déployer l'api avec cette commande :
30 | ```sh
31 | docker run -d -p 8000:8000 -e CRON="*/15 * * * *" justtryon/papillonserver:latest
32 | ```
33 | *Vous pouvez changer le temps de redémarrage automatique du serveur en changeant la variable d'environnement CRON*
34 |
35 | *Cela va lancer le serveur sur le port 8000.*
36 |
37 | ### Docker Swarm
38 | Le déploiement de l'api avec docker swarm va vous permettre une redondance de l'api, si un de vos serveurs n'est plus disponible, la node manager de votre cluster swarm va automatiquement prendre le relai pour que l'api soit toujours disponible, et ce sans interruption de service pour les utilisateurs.
39 | Les commandes suivantes sont à exécuter sur la node manager.
40 | ```sh
41 | docker pull justtryon/papillonserver:latest
42 | ```
43 | Une fois cela fait, vous pouvez déployer l'api sur les différentes nodes en adaptant cette commande :
44 |
45 | ```sh
46 | docker service create \
47 | --replicas 2 \
48 | --constraint 'node.role==worker' \
49 | -p 8000:8000 \
50 | -e CRON="*/15 * * * *" \
51 | justtryon/papillonserver:latest
52 |
53 | ```
54 | Le paramètre "replicas" va définir le nombre de nodes sur lesquelles l'api va être déployée, vous pouvez le modifier en fonction de la taille de votre cluster.
55 | *Vous pouvez également changer le temps de redémarrage automatique du serveur en changeant la variable d'environnement CRON*
56 |
57 | *Cela va lancer le serveur sur le port 8000, en tant que service docker.*
58 |
--------------------------------------------------------------------------------
/docs/development/pronote-api/endpoints.md:
--------------------------------------------------------------------------------
1 | ## Requêtes
2 |
3 | Ensuite, chaque appel à une fonction de l'API doit avoir le paramètre `token` défini.
4 | Voici la liste des URLs pour obtenir des données :
5 |
6 | | URL | Utilité | Paramètres |
7 | |--|--|--|
8 | | `/user` | Obtient les informations sur l'utilisateur (nom, classe...) + les périodes de l'année | |
9 | | `/timetable` | Affiche l'emploi du temps sur une date donnée | `dateString: str` : date au format **`année-mois-jour`** |
10 | | `/homework` | Affiche les devoirs entre deux dates données | `dateFrom: str` : date de début au format **`année-mois-jour`**, et `dateTo: str` : date de fin au même format |
11 | | `/grades` | Affiche les notes | |
12 | | `/evaluations` | Affiche les évaluations par compétences | |
13 | | `/absences` | Affiche les absences | |
14 | | `/punishments` | Affiche les punitions | |
15 | | `/news` | Affiche les actualités | |
16 | | `/discussions` | Affiche les messages | |
17 | | `/menu` | Affiche les menus entre deux dates données | `dateFrom: str` : date de début au format **`année-mois-jour`**, et `dateTo: str` : date de fin au même format |
18 | | `/recipients` | Liste toutes les personnes que l'utilisateur peut contacter par message | |
19 |
20 | Voici la liste des URLs qui effectuent une simple fonction :
21 |
22 | | URL | Utilité | Paramètres | Réponse |
23 | |--|--|--|--|
24 | | `/info` | Envoie des informations sur l'API comme les ENTs et la version | | |
25 | | `/export/ical` | Exporte le calendrier en iCal | | *(l'URL du fichier iCal)* |
26 | | `/homework/changeState` | Change l'état d'un devoir (fait/non fait) | `dateFrom: str` : date de début au format **`année-mois-jour`**, et `dateTo: str` date de fin au même format, et `homeworkId: str` l'id du devoir à changer | *(état du devoir changé)* |
27 | | `/discussion/delete` | Supprime la discussion | `discussionId: str` : Id de la discussion | `ok` si aucun problème |
28 | | `/discussion/readState` | Change l'état de lecture d'une discussion | `discussionId: str` : Id de la discussion | `ok` si aucun problème |
29 | | `/discussion/reply` | Répond à une discussion | `discussionId: str` : Id de la discussion, et `content: str` : Contenu du message | `ok` si aucun problème |
30 | | `/discussion/create` | Crée une discussion | `recipientId: str` : Id du destinataire, `content: str` : Contenu du message et `recipients: list` : La liste de destinataire avec leurs ID (obtenus avec `/recipients`) | `ok` si aucun problème |
31 |
--------------------------------------------------------------------------------
/docs/development/pronote-api/index.md:
--------------------------------------------------------------------------------
1 | # Introduction
2 |
3 | Papillon utilise actuellement un serveur intermédiaire, dont l'API facilite l'accès indirect à l'API privée d'un serveur PRONOTE.net.
4 |
5 | Cette section documente cette première API. Pour consulter la documentation de l'API privée PRONOTE.net, veuillez vous référer à [PRONOTE protocol](https://github.com/bain3/pronotepy/blob/master/PRONOTE%20protocol.md) du projet pronotepy.
6 |
--------------------------------------------------------------------------------
/docs/development/pronote-api/login.md:
--------------------------------------------------------------------------------
1 | Un client doit effectuer la requête initiale `POST /generatetoken` avec le corps de la requête suivant :
2 |
3 | | Paramètre | Utilité | Exemple |
4 | |--|--|--|
5 | | `url: str(url)` | URL vers l'instance PRONOTE **(avec le eleve.html)** | `https://0152054e.index-education.net/pronote/eleve.html` |
6 | | `username: str` | Nom d'utilisateur **PRONOTE** | `l.martin` |
7 | | `password: str` | Mot de passe en clair | `azertyuiop12345` |
8 | | `ent: str(ent)` | Nom de l'ENT tel que listé [ici](https://github.com/bain3/pronotepy/blob/master/pronotepy/ent/ent.py) | `ac_rennes` |
9 |
10 | Le client doit ensuite conserver le token généré. S'il y a eu un délai d'au moins 5 minutes entre deux interactions, le client doit regénérer un nouveau token.
11 |
--------------------------------------------------------------------------------
/docs/documents/privacy-policy.md:
--------------------------------------------------------------------------------
1 | # Politique de confidentialité
2 | > Ce service peut être amené à collecter certaines données personnelles de ses utilisateurs.
3 |
4 | ## 1. - Services concernés
5 | - Site web de présentation ([https://getpapillon.xyz](https://getpapillon.xyz))
6 | - Application mobile Papillon ([https://github.com/PapillonApp/Papillon](https://github.com/PapillonApp/Papillon))
7 |
8 | ## 2. - Quelles données sont collectées ?
9 | ### 2.1 - Données collectées
10 | - #### Vos données d’identification à votre service scolaire
11 | > Identifiants de connexion au service scolaire, URL de l'établissement et académie correspondante *(le cas échéant)*
12 |
13 | Ces données d'identification ne sont pas stockées en dehors de votre appareil et sont utilisées uniquement pour vous identifier.
14 |
15 | - #### Vos données scolaires
16 | > Emploi du temps, Travail à faire, Notes, Compétences, Actualités de l'établissement, Conversations et Événements de vie scolaire
17 |
18 | Ces données sont renvoyées par les services de vie scolaire correspondants. Ces données ne quitteront jamais votre appareil et seuls vous y avez accès.
19 |
20 | ### 2.1.1 Logs et crash reports
21 | Les derniers événements précédant un crash peuvent être automatiquement collectés a des fins de développement.
22 | > Ces données contiennent des informations sur votre appareil et sur l'état de l'application.
23 |
24 | Aucune information personnelle ou scolaire n'est transmise pendant cette collecte.
25 |
26 | ### 2.2 - Données liées à l'identité
27 | Aucune donnée liée à votre identité ou à votre activité n'est conservée, hormis les logs récents à des fins de développement pour corriger d'éventuels bugs et problèmes.
28 |
29 | ### 2.3 - Accès extérieur aux données
30 | Aucune personne ou logiciel automatisé n’utilise ou ne collecte vos données personnelles.
31 |
32 | ### 2.4 - Suppression des données
33 | La suppression de l'application ou la déconnexion entraîne immédiatement la suppression de l'intégralité des données stockées sur votre appareil.
34 |
35 | ## 3. - Client mobile Papillon
36 | L'application "Papillon" est un logiciel open source, gratuit et à but non lucratif conçu pour permettre l'accès aux données des services scolaires transmises par des librairies tierces.
37 |
38 | Papillon n'est pas responsable de la manière dont les données sont transmises par ces librairies tierces.
39 |
40 | ## 4. - Modification de la politique de confidentialité
41 |
42 | ### 4.1 - Engagement concernant l'avenir du projet
43 | Nous nous engageons à ne pas collecter de données à l'avenir. Cependant, des services tiers supplémentaires seront peut-être nécessaires au fonctionnement de l'application dans une prochaine mise à jour.
44 |
45 | ### 4.2 - Notification des changements
46 | Lorsque cette politique de confidentialité sera modifiée, les utilisateurs finaux seront notifiés soit via l'application, soit via leurs coordonnées (dans le cas d'une bêta-test, ou sur une communauté en ligne, par exemple).
47 |
48 | ## 5. - En cas de problème
49 | En cas de problème avec l'application ou son traitement des données, merci de nous contacter à l'adresse suivante : [support@getpapillon.xyz](mailto:support@getpapillon.xyz).
50 |
--------------------------------------------------------------------------------
/docs/documents/terms-of-service.md:
--------------------------------------------------------------------------------
1 | # Conditions générales d'utilisation
2 |
3 | ## 1. - Services concernés
4 | - Site web de présentation ([https://getpapillon.xyz](https://getpapillon.xyz))
5 | - Application mobile Papillon ([https://github.com/PapillonApp/Papillon](https://github.com/PapillonApp/Papillon))
6 |
7 | ## 2. - Conditions
8 | En tant qu'utilisateur final, vous acceptez et comprenez que :
9 |
10 | - Papillon est un client alternatif non officiel.
11 | - Papillon n'est affilié à aucune entreprise ou organisation.
12 | - Vos données ne quittent pas votre appareil conformément à la [:material-gavel: politique de confidentialité](privacy-policy.md).
13 | - Papillon peut être modifié ou retiré de la vente à tout moment par le gestionnaire du service.
14 |
15 | ## 3. - En cas de problème
16 | En cas de problème avec l'application ou son traitement des données, merci de nous contacter à l'adresse suivante : [support@getpapillon.xyz](mailto:support@getpapillon.xyz).
17 |
--------------------------------------------------------------------------------
/docs/events/la-meilleure-icone-papillon.md:
--------------------------------------------------------------------------------
1 | # Concours de création d'icônes Papillon
2 |
3 | 
4 |
5 | Pour fêter la rentrée, Papillon organise un concours de la communauté pour mettre en valeur **vos talents d'artiste** !
6 |
7 | À vos crayons pour créer la meilleure icône Papillon et espérer la voir disponible dans l'application !
8 |
9 | Cependant, pour participer, suivez ces instructions et respectez ces règles :
10 |
11 | ## Instructions
12 |
13 | ### Les interdits
14 | - Il est interdit d'utiliser des images ou des vecteurs **non libres de droit ou sous licence**.
15 | - Aucun contenu qui serait interdit de publication sur les stores (dessins ou images choquantes, discriminatoires, ou susceptible de heurter la sensibilité de certaines personnes).
16 |
17 | ### Les obligations
18 | - Faites apparaître le logo de Papillon de manière **assez visible et claire**.
19 |
20 | ### Les recommandations
21 | - Placez le logo de manière similaire, voire identique à l'icône de base.
22 | - Modifiez le fond du logo pour en changer les couleurs, ajouter des éléments, images, et autres.
23 | - Modifiez le papillon afin de changer son aspect.
24 |
25 | ### Le rendu
26 | - L'image doit être au format JPEG ou PNG à une résolution minimale de `1024px * 1024px` et au format `1:1` (carré).
27 | - Aucune image transparente.
28 | - Aucune image animée.
29 | - Utilisez une image carrée pleine (pas de format cercle, triangle, ou autre forme).
30 |
31 | ## Ressources
32 |
33 | Afin de vous simplifier la tâche, vous pouvez télécharger l'icône de base de Papillon ici, elle peut vous être utile comme base :
34 | - Format SVG (pour Figma et Illustrator) : [icon.svg](https://logi12-my.sharepoint.com/:u:/g/personal/contact_vincelinise_com/EQ-1wyA167NKvHiAAQSUdegBT5dix-zp0ePF144hdvyIjA?e=EGct3B)
35 | - Format PNG (tous logiciels) : [icon.png](https://logi12-my.sharepoint.com/:i:/g/personal/contact_vincelinise_com/EXZOKAKDT5ZBu-Fx0WT34LEBssUsIbRBe6mt6VZEy8e-sA?e=rgAyEX)
36 |
37 | **Note :** Le téléchargement des ressources nécessite l'accès à des liens externes.
38 |
39 | Si vous ne pouvez pas manipuler d'images SVG, voici le logo Papillon en blanc uni au format PNG transparent : [Union.png](https://logi12-my.sharepoint.com/:i:/g/personal/contact_vincelinise_com/EVoz8rVfV_ZFiAWQwzn5szUBlZYpxnZnknTjRbxs1VUWGw?e=LtdnRt)
40 |
--------------------------------------------------------------------------------
/docs/help/index.md:
--------------------------------------------------------------------------------
1 | # Aide de Papillon
2 |
3 | ## Documentation en construction
4 | La documentation est en construction, revenez plus tard !
--------------------------------------------------------------------------------
/docs/index.md:
--------------------------------------------------------------------------------
1 |
6 |
Designer
26 | Développer
35 | Contribuer
44 | Politique de confidentialité
58 | Conditions d'utilisation
67 |