Programmeur
- Installation
- Dev Notes
- Login avec le token de cheneliere
- Implémenter un nouveau jeu
- Informations sur les jeux
- Fix le changement d'email de chenelière
- ByYear vs ByModule
- Loop d'initialisation des données dans Unity
- Unit Testing ACC1
- Code standard
- Client Unity : Structure
- Build & Deploy
- Setup local server
- BrainCloud
- Acc
- Correction Acc1
- Exemple de donnée d'une équipe pour un module (Module_Test)
- Création du corrigé Acc1
- Pointage des differents champs
- Préférences
- StaticData
- Ajouter une nouvelle page
- Ajouter un nouveau module
- Arborescence des controls pour les modules
- Procédure annuel pour updater les taxes (Deprecated)
- Création d'une simulation (acc1)
- Modification de la valeur des stocks, PEPS
- Bénéfices et pertes
- Remise et remboursement de taxes
- Procédure annuel pour updater les taxes (updated version 2026)
- Bugfix Guide
- Outils pour programmeur
- Structure Serveur Acc1
- Site Uniksim
- Note uniksimWeb
- Update/Deploy dans Angular (old)
- Debug en Web frontEnd
- Test de fonctionnalité complète
- Compte test - Création de compte
- Local database (PHPMyAdmin) - Conflict
- Build Unity en local
- Diagrammes
Installation
Unity Hub : https://public-cdn.cloud.unity3d.com/hub/prod/UnityHubSetup.exe
Putty + Pagent + PuttyGen : https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
Git : https://git-scm.com/downloads
GitExtensions : https://github.com/gitextensions
Meld : http://meldmerge.org/
Node.js : https://nodejs.org/en/
"npm install" dans le root de node.js
Multiple Unity instance : https://support.unity3d.com/hc/en-us/articles/115003118426-Running-multiple-instances-of-Unity-referencing-the-same-project
cd (NewSimFolder)
mkdir game
cd game
mklink /D Assets (Simfolder)\game\Assets
mklink /D ProjectSettings (SimFolder)\game\ProjectSettings
mklink /D Packages (SimFolder)\game\Packages
S'il y a un problème de plugins une fois unity ouvert, supprimez le folder qui vient d'être créé et dupliqué l'original, supprimé les folders "Assets" et "ProjectSettings" de ce nouveau folder et executé de nouveau les commande de mklink pour "Assets" et "ProjectSettings"
Update les textes : Éxécuter "exportText.bat" dans "Simulation"\node.js (tabs UI, Dialogs, Scenario)
Update le data : Éxécuter "exportAllData.bat" dans "Simulation"\node.js (toutes les autres tabs)
Setup Local Server : https://wiki.uniksim.com/books/programmeur/page/setup-local-server
Copier une simulation de live vers preview :
node data_importer.js copySim simUid
MongoDB en local : https://www.mongodb.com/try/download/community avec les paramètres d'installation par défaut.
Dev Notes
Login avec le token de cheneliere
Pour se logger avec le token de cheneliere, le lien va d'abbord pointer vers clogin avec le user, le token, l'expiration et le isbn:
cheneliere.uniksim.com/clogin?username=test@iplusinteractif.com&token=59306298493CBB05D3FCE13793A5227E&expiration=1561105287&isbn=SIM2765058038
Dans LoginController::cheneliereAutologin
- Le server (uniksim/master) poke le serveur cheneliere pour savoir les produits de ce user.
- Le serveur node.js est poker sur le port 8085 pour créer le user GameSparks
- si c'est bon, on l'envoie vers le bon jeu avec le ISBN, et on lui donne le token et l'expiration
Dans le jeu, on va poker notre serveur avec
Implémenter un nouveau jeu
Pour faire un nouveau jeu dans la structure il faut:
- Dupliquer la structure de dossier dans Assets\GameSpecific\Ent1
- Intégrer le jeu dans le login control
- Mettre [gameUid]_login_subtitle et [gameUid]_login_title dans sharedText
- Faire le skin pour le jeu
- Faire les Doozy game spec
- Faire les scenes de loading pour le jeu
- Faire le static data du jeu
- Faire les commandes spécifiques sur le serveur
- ajouter le gameUid dans server.js
- Faire la génération de résultats spécifique
- Faire l'évaluation spécifique.
- Scenario
- Segment (if needed)
- SimPerf
- Ajouter les pondérations dans les Google Sheets
Scenario (Client)
- Add ScenarioPages in GameSpecific/{GameUid}/Resources/data_{GameUid}
- Create ScenarioSegGridControlBase if needed
- Fill the Google Sheets
- Do not forget to export the data
Informations sur les jeux
Mk1
- Score du produit
- Éthique ou non (3 pts)
- Couleur (1 pts)
- Type de matériaux (1 pts)
- Score de communication
- Média 1 (1 pts)
- Média 2 (1 pts)
- Score du budget de communication
- Budget / budget moyen dans le segment
- Score de distribution
- Type (1 pts)
- Intensité (1 pts)
- Score du budget de distribution
- Budget / budget moyen dans le segment
- Bonus de l'année de création du produit
- 0 année depuis la création -> Bonus de 0.75
- 1 année depuis la création -> Bonus de 1.1
- 2 année depuis la création -> Bonus de 0.5
- Score du prix
- Prix moyen du segment / prix de vente
- Score d'un produit lancé
- ((Score du produit + Score de communication + Score du budget de communication + Score du budget de distribution + Bonus de l'année de création du produit) / 5) * score du prix * score de distribution
- Calcul du nombre de produit vendu
- Calcul le score de chaque produit lancé dans un même segment
- Calcul le nombre maximal de vente possible
Mk2
Ent1
Hr1
Appartenance -> sur chaque type d'employé
- Score de chaque année et s'ils sont là depuis longtemps
- Moyenne du taux de rétention depuis le début (cap 80%)
- taux appartenance pour année -> renvoyer / employée totaux
- cas (10 employé, 2 employés partent, 2 congédié (taux d'appartenance 60% qui est monté à 80% puisque minimum))
Mgt1
Fix le changement d'email de chenelière
PhpMyAdmin
- Renommmer le "email" dans la table "users"
- Modifier le "code" dans "products_code"
- Dans gamesparks, changer le user aussi relié au compte
- mettre l'acien user dans query: { "userName" : "shirleydgrace@yahoo.com_chen_4191" }
- et le changer pour le nouveau
Modifier le mot de passe du user
- Se connecter en tant que la personne sur test harness
- { "@class": ".ChangeUserDetailsRequest", "newPassword": "{new-email}_chen_{products_code:oid}" }
https://docs.gamesparks.com/tutorials/cloud-code-and-the-test-harness/changing-player-passwords.html
ByYear vs ByModule
Generation Mode
-
ByYear
- Bouton : Générer pour toutes les équipes de la simulation.
- Calendrier : Générer pour toutes les équipes lorsque le champs "nextGenerate" est passé.
-
ByModule
- Bouton : Génère le module selectionné pour toutes équipes qui n'ont pas de temps supplémentaire et set le nextGenerate (situé dans "teamsModules") au temps désiré pour les équipes avec du temps supplémentaires.
- Calendrier : Génère le module selectionné lorsque le "nextGenerate" est atteint. Les équipes avec du temps supplémentaires sont généré plutard (nextGenerate + temps supplémentaire).
Results generations
-
ByYear
- est calculé à partir du yearData (situé dans "teams").
-
ByModule
- est calculé à partir de "teamsModules".
- Le seed permet d'avoir des résultats différents pour chaque équipe
- est calculé à partir de "teamsModules".
Saved results
- Dans les deux types, les résultats sont sauvés partiellement dans "teams" (seulement les résultats d'une équipe) et dans "results" (les résultats de toutes les équipes).
VS
- Le code est séparé par le namespace "SimByModule" et "SimByYear" afin qu'une simulation n'est pas accès aux informations spécifique de l'autre type.
- Classe (SimulationByYear)
- Contient le status de l'année courante (started, generating, finished).
- Des évènements par année.
- Présence par année pour un étudiant.
- Année de pratique et réouvrir une année
- Classe (SimulationByModule)
- Permets d'ajouter module à la simulation ainsi que de le commencer et finir.
- Ajouter du temps supplémentaires à une équipe sur un module.
Unity UI
Création de simulation
- ByYear à un champ supplémentaire (Nombre maximum de générations).
Vu Global
-
ByYear
- Contient le nombre d'année ainsi que l'état de chaque année.
-
ByModule
- Contients une liste des modules actifs ainsi que l'état de chacun.
Loop d'initialisation des données dans Unity
Version 2.0
Unit Testing ACC1
Pour unit tester ACC1, il faut décomposer chaque module et chaque fonction en bout de code testable avec un input et un output attendu.
Chaque module a 4 étapes distinctes:
- Generate module type data
- Answer Key
- Grading
- Re-Assemble (un grading post-process)
Par exemple, on veut tester le module de remises de taxes, il faut commencer par voir ce qui se passe dans ce module.
On commence par généré une commande dans unity qui nous redémarre le module en pratique.
data = {
"commandUid":"restart_student_module",
"commandData": {
"teamUid":"be86465e-a8bf-42e5-bef1-447e94acc461",
"actUid":"91dc1bce-d867-4c27-872d-84bd41d56ae9",
"actModuleUid":"45d718be-2cab-4dcf-9328-737b46ed5ccd",
"moduleType":"practice",
"lastPraticeGrade":"-1"
}
};
Code standard
Server (BrainCloud: JavaScript)
Scripts Naming (Voir BrainCloud:Scripts)
- On organise le nom des scripts de la manière suivantes : {folderName}_{subFolderName}_{ScriptName}
- Dans le cas des scripts appelable par le client on ajoute "Cmd" comme prefix du "ScriptName"
- Exemples:
- acc1_CmdCreateTeam (pour les commandes de create team)
- ent1_Utils (pour les scripts utilaire spécifique à un jeu)
- acc1_Bills
- CmdSaveSegment (Pour une commande générique)
Server (GS: JavaScript)
Collection
-
shortenedCollectionName = collectionName (collectionKey)
- eval = evaluation (studentUid)
- evalTeam = evaluationTeam (teamUid)
- result = results (simUid)
- sim = simulation (simUid)
- team = teams (teamU
- user = userdetails (userUid)
How to name Events (generic code)
- {Action}{Collection}{WhatItDoes} PascalCase
- GetSimGroup
- CreateTeam
- CreateSimCustomEval
- GetEvalScenario
- JoinSim
- JoinTeam
- ReopenSimYear
- EditUserStudent
How to get a Collection
-
var {shortenedCollectionName}Entry = API.getItem("{collectionName}", {collectionKey}).document();var {shortenedCollectionName}Data = {shortenedCollectionName}Entry.getData();
Set a Response
- use
sendMessageTo{Receiver}({specificToTheMethod}, {messageType}, {messageData})when you MODIFY data- messageType
- Actions
- deleted, changed, created
- {dataObject}_{field}_{action}
- ex.: team_cash_changed
- {dataObject}_{fieldOne}_{fieldTwo}_{etc.}_{action}
- ex.: sim_year_yearState_changed
- {dataObject}_{fieldParent}_{fieldChild}_{etc.}_{action}
- ex.: team_yearData_factory_changed
- Actions
-
messageData
- Information you want to send to the Client.
- send
teamUidand/orstudentUidwhen you send message to teacher (so that the teacher can filter the message)
- messageType
- use
Spark.setScriptData('{ObjectName}', {Object})when you GET data
Client (VS: C#)
Standard
-
Cases
- Class PascalCase
- Methods PascalCase
- Private members _camelCase
- Public members camelCase
-
Document
-
Formatting order (each of those section should be surrounded by region with sub-region if necessary)
- Public members
- Public property
- Constructors
- Methods
- Private property
- Private Members
-
Formatting order (each of those section should be surrounded by region with sub-region if necessary)
- Whenever possible surround code with
#region MyRegion {code} #endregionto make the .cs clearer - use Stubs when the interface only need partial information instead of loading all the data.
- exemples : studentStub, EvalStudentStub.
- if you want to do Lazy loading or Lazy Initialization make a Property (the reference is always private)
- public : under public members
- private : over private members
- ex.:
private Dictionary<string, TextMeshProUGUI> TeamEvalTexts
{
get
{
if (_teamEvalTexts == null)
{
_teamEvalTexts = new Dictionary<string, TextMeshProUGUI>();
_teamEvalTexts[Simulation.SIM_PERF_NAME] = simPerfNoteText;
_teamEvalTexts[Simulation.LOGBOOK_NAME] = logbookNoteText;
}
return _teamEvalTexts;
}
}
private Dictionary<string, TextMeshProUGUI> _teamEvalTexts;
- Plugin edition :
//UNIKSIM BEGIN [name] [reason]
//old code in comment
....
//UNIKSIM END
Data
- SetListeners in the data contructors
- the data Update itself and fire a relevent
Action - Filter the Response with
teamUidand/orstudentUidwhen the teacher receive the message
Client (Unity)
Boutons
Prefabs
- Use the basic Prefab when ever you need them. (NormalButton, EditButton, InputText, Dropdown, etc.)
Popup
-
X on the top-right corner VS CancelButton
- When there is no action, only information, put X on the top-right corner and close on click outside.
- When there is an action, inputs, put a CancelButton with a confirmation to close.
Google sheets
Client Unity : Structure
Structure générale
Control (UI)
- Script utilisé directement dans les différents prefabs en tant que component.
- Contrôle les interfaces et
Build & Deploy
Pour builder et déployer un nouveau build:
Cloud Build
- Incérmenter version.txt manuellement
- Pusher le fichier texte
- aller sur https://developer.cloud.unity3d.com/
- Choisir uniksim
- Appuyer sur le bouton Build:Build
- Attendre que le build se termine (environ 30 minutes)
- downloader le zip
- extraire dans game\Build
- ouvrir un shell MINGW64 (Ouvrir Git bash via Git Extensions)
- executer ./deployBuild.sh
-
Si une erreur bloque le déploiement :
- Ouvrir PuTTY, accéder à l'onglet Session, charger les paramètres par défaut et sauvegarder (Même si le port 22 est bel et bien inscrit, il ne semble pas pas être chargé correment.)
- Ouvrir un Command Prompt et inscrire la commande suivante : plink.exe forge@198.199.78.53
-
Si une erreur bloque le déploiement :
- Changer la version du build dans MySql
- http://db.uniksim.com/phpmyadmin/
- dans la table constants
- client_version = live + live gamesparks
- alpha_version = alpha + preview gamesparks
- Builder une version du server dans gamesparks
Setup local server
- Clone the uniksim depot with the old_login branch : https://bitbucket.org/gypso/uniksim.git
- Run npm install in the main directory
- Install and run Xampp v7.3.31 (Installation location (by default) -> C:\xampp )
- Make the <uniksimroot>/public folder the root of a php virtual host
- Add the following lines to C:\xampp\apache\conf\extra\httpd-vhosts.conf
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot <uniksimroot>/public
ServerName uniksimdev
ServerAlias www.uniksimdev
<Directory "<uniksimroot>/public">
Options All
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
-
- Add the following lines to C:\windows\system32\drivers\etc\hosts
127.0.0.1 localhost
127.0.0.1 uniksimdev
- Edit your user variables
- Right-click on your Computer in the File Explorer and go to Properties
- Go to the Advanced system settings and click on Environment Variables
- Find Path in the system variables box, and add the following path to the end of the Path variable string.
;C:\xampp\php
- Run php composer.phar install in the main directory (<uniksimroot>)
- Start the Apache and the MySQL modules in the Xampp Control Panel
- Setup in phpMyAdmin
- Open the Admin panel of the MySQL module in the Xampp Control Panel
- Create a new database named uniksim with the utf8_general_ci collation
- Within the SQL tab in the new database, setup the database structure by running the content of <uniksimroot>/uniksim_example.sql
- Setup the game
- Get the current game version for the client in the constant table within the uniksim database in phpMyAdmin and add the folders builds/<client_version> in <uniksimroot>/public/
- Copy your Unity build to the <client_version> folder
- Duplicate <uniksimroot>/.env.example and rename it .env
- Insure the name of the database is correct
- DB_DATABASE=uniksim
DB_USERNAME=root
DB_PASSWORD=''
- DB_DATABASE=uniksim
- Insure the name of the database is correct
- Install Redis for Windows
- Install Visual Studio Code and open it, drag and drop <uniksimroot>/node.js, and run the
GameSparks Live or preview configuration
BrainCloud
Scripts
- On organise le nom des scripts de la manière suivantes : {folderName}_{subFolderName}_{ScriptName}
- Dans le cas des scripts appelable par le client on ajoute "Cmd" comme prefix du "ScriptName"
- Exemples:
- acc1_CmdCreateTeam (pour les commandes de create team)
- ent1_Utils (pour les scripts utilaire spécifique à un jeu)
- acc1_Bills
- CmdSaveSegment (Pour une commande générique)
Faire qu'un user se log comme un autre user
Si un étudiant se fait changer de date par Cheneiliere en cours de session et qu'il veut continuer sur son ancien user, nous pouvons editer l'attribute userUid du User braincloud.
C'est le même système que pour les user copiés.
Message/Events
- Code clients : Assez simple, On ajoute les binding pour get les events dans le backendBrainCloud qui ajouterai une entrée dans le messageDispatcher.
- Code Serveur : Il faudrait faire un systeme plus centralisé sur le serveur afin de ne pas avoir plusieurs moyen de send des events
- Les events semblent mieux que les messages pour gerer notre systeme de live update
Documents Save/Load
- On peut modifier le système déjà mis en place, documents_utils, et cela devrait être fonctionnel pour tout le monde.
- Create : Dans gamesparks lorsqu'on crée un object, il n'est pas directement créer, il faut le save par la suite sinon il ne sera pas persisté. Cependant, dans braincloud lorsqu'on crée un object il est directement créer avec les informations spécifiuer.
Document Queries
- Possible d'ajouter des single et des compound indexes en json (MongoDB). Il n'y a pas beaucoup de documentation sur BrainCloud sur les indexes, mais il y en a dans celle de MongoDB.
- La boîte Options dans le popup de création d'indexes sert pour ajouter les propriétés aux indexes (comme sparse, TTL, case insensitive).
- Portal: Plus de capacités de recherche que GameSparks, mais sans l'interface user-friendly. Les Where Queries sont faites avec du json. Pour faire une query avec un champ spécifique du document, il faut utiliser le prefix "data." La documentation en lien avec les queries est assez simple et compréhensible.
- Code: Pour un élément spécifique, il est possible d'utiliser getRandomEntitiesMatching. Pour plusieurs éléments (comme pour obtenir toutes les simulations d'un prof), il serait plus favorable d'utiliser getEntityPage.
- Semble avoir la même limite de 100 objets retournés pour une requête particulière. La documentation suggère d'utiliser getEntityPageOffset pour obtenir le reste des objets (ex: si 150 objets sont demandés). ***À tester***
Scheduled Scripts
- En utilisant la Job Queue dans l'onglet Monitoring, puis Global Monitoring, il est très facile d'exécuter une job planifiée et il est possible d'exécuter le même script à nouveau en appelant scheduleRunScriptMillisUTC (ne fonctionne pas pour l'instant) scheduleRunScriptUTC (depricated depuis la version 4.6) du script service.
- En se construisant un script Template pour les Scheduled Jobs, il sera possible compartimenté les scripts appelés dans des jobs individuelles.
- Malgré un script de ScheduledJob qui permettrait d'ignorer les délais d'exécution, certains délais supplémentaires sont ajouter en recréant une nouvelle job.
- param pour schedule la job: /_job/_scheduled_job
{
"timerDelay": 1,
"scriptName": "/_job/generate_results_job",
"scriptData": {},
"lastExecutedTime" : -1
}
REST API / nodeJS Client
- We can use https://www.npmjs.com/package/braincloud?activeTab=readme in combination with the S2S request to call differents scripts
- The nodejs is relatively simple, the hard thing is to find the right objectName or methodName but they can be found here http://getbraincloud.com/apidocs/apiref/?java#capi
ex.:var scriptData = {
"profil1": "ec11299f-ce5c-4485-9725-072205223783"
};
brainCloud.script.runScript("SendMessage", scriptData, OnSendMessageResponse); - Pour la création d'utlisateur on n'a pas accès aux bonne méthodes à partir de nodeJS mais, on peut run un script qui, lui, peut créer un user. Sinon notre autre option serait de s'authentifier directement comme le user que nous voulont créer à partir de nodeJS
Deployment to Live
- Les Global Entities doivent être manuellement exporter/importer lors d'un déploiement. Étant donné qu'il est possible de migrer le data des custom entities avec le déploiement, il serait plus avantageux de les utiliser pour le static data.
Acc
Correction Acc1
Préparation
Avant de commencer la correction, plusieurs informations sont stocker dans differents dictionnaires afin qu'elles soient plus facile d'accès par la suite.
Par la suite, le score des différents modules pages est calculés.
Journal des Achats, Ventes, Encaissements, Décaissements, Salaires
- Regarder chacune des rows de la table
- Certains champs sont requis pour effectuer la correction d'une rangée (dépends du modulePage)
- si manquant, ajoute une erreur ("row_input_value_missing")
- Trouver la facture de reference avec les champs appropriées (dépend du modulePage)
- si la référence n'est pas trouvée, ajoute une erreur ("row_reference_not_found")
- Correction des différents inputs de la row selon les informations de la facture trouvée
- Voir la section, Aide à la correction 1
- Vérifier que les identifiants ne sont pas déjà utilisé
- Voir la section, Aide à la correction 2
- Certains champs sont requis pour effectuer la correction d'une rangée (dépends du modulePage)
- Vérifier que toutes les factures sont présentes
- s'il manque des factures, ajoute l'erreur ("bill_missing")
- Calculer le score total du journal
- s'il n'y a pas de rows dans la table, ajoute l'erreur ("empty_table")
Grand livre auxiliaire des Fournisseurs/Clients
- Vérifier qu'il y a des Fournisseurs/Clients d'ajouter
- s'il y en a pas, ajoute l'erreur ("no_dynamic_dropdown_data")
- Pour chacun des Fournisseurs/Clients, faire les vérification suivantes
- Vérifier les conditions de la compagnie
- Si la condition choisi n'est pas la bonne, ajouter l'erreur ("dynamic_dropdown_data_secondary_wrong_answer")
- Vérifier qu'il y a des décisions prise pour le Fournisseurs/clients
- s'il y en a pas, ajoute l'erreur ("empty_table")
- Pour chacune des rows du Fournisseurs/clients, effectuer les vérification suivantes
- Vérifier l'ordre des lignes selon la date
- s'il ne le sont pas, ajoute l'erreur ("row_wrong_order")
- Trouver la ligne de reference (une ligne des Journaux) avec les champs appropriées (dépend du modulePage)
- si la référence n'est pas trouvée, ajoute une erreur ("row_reference_not_found")
- Correction des différents inputs de la row selon les informations de le ligne de référence trouvée et de la balance qui est modifier selon les autres inputs de la row
- Voir la section, Aide à la correction 1
- Vérifier que les identifiants ne sont pas déjà utilisé
- Voir la section, Aide à la correction 2
- Vérifier l'ordre des lignes selon la date
- Vérifier qu'il y a des lignes de présentes
- s'il y en a pas, ajoute l'erreur ("empty_table")
- Vérifier que toutes les rows sont présentes
- si ce n'est pas le cas, ajoute l'erreur ("referenced_row_missing")
- Calculer le score de la table
- Vérifier les conditions de la compagnie
- Calculer le score total du modulePage
Grand livre
- Calculer la balance de tout les comptes ainsi que les montants finaux du journal general(Cela sera utilisés durant la correction).
- Pour chacune des tables (chaque table est associé à un compte)
- Pour chacune des rows dans la table
- Vérifier l'ordre des rows avec la date
- si l'ordre n'est pas le bon, ajoute l'erreur ("row_wrong_order")
- Trouver la ligne de reference (une ligne des Journaux) avec les champs appropriées (dépend du modulePage)
- si la référence n'est pas trouvée, ajoute une erreur ("row_reference_missing")
- Correction des différents inputs de la row selon les informations du compte de référence trouvée et de la balance qui est modifier selon les autres inputs de la row
- Voir la section, Aide à la correction 1
- Vérifier que les identifiants ne sont pas déjà utilisé
- Voir la section, Aide à la correction 2
- Vérifier l'ordre des rows avec la date
- Vérifier qu'il y a des lignes de présentes
- s'il y en a pas, ajoute l'erreur ("empty_table")
- Vérifier que toutes les comptes sont présents
- si ce n'est pas le cas, ajoute l'erreur ("referenced_page_missing")
- Calculer le score de la table
- Pour chacune des rows dans la table
- Vérifier que tout les comptes soit présents
- si un compte n'est pas présent, ajoute l'erreur ("account_empty")
- Calculer le score total du modulePage
- s'il n'y a pas de comptes, ajoute l'erreur ("no_accounts")
Journal Général
- Trier les differentes sections (écritures) du modulePage en plusieurs differentes catégories (charges, produits, équité).
- Vérifier l'ordre des rows dans les catégories,
- s'il ne sont pas dans le bon ordre, ajoute l'erreur ("row_wrong_order")
- Pour chacune des rows des catégories
- Correction des différents inputs de la row selon les informations du compte de référence et de la catégorie
- Voir la section, Aide à la correction 1
- Vérifier que les identifiants ne sont pas déjà utilisé
- Voir la section, Aide à la correction 2
- Correction des différents inputs de la row selon les informations du compte de référence et de la catégorie
- Vérifier que tout les comptes "produit" ou "charges" sont bien présents
- S'il en manquent, ajoute l'erreur ("table_account_missing")
- Calculuer le score final du journal
- Si une catégorie est vide, ajoute l'erreur ("group_empty")
Balance de vérification
- Regarder chacune des rows de la table
- Certains champs sont requis pour effectuer la correction d'une rangée (Numero de compte, nom de compte)
- si manquant, ajoute une erreur ("row_input_value_missing")
- Vérifier que l'ordre de la row est le bon
- s'il l'ordre n'est pas le bon, ajoute l'erreur ("row_wrong_order")
- Correction des différents inputs de la row selon les informations du compte trouvé
- Voir la section, Aide à la correction 1
- Vérifier que les identifiants ne sont pas déjà utilisé
- Voir la section, Aide à la correction 2
- Certains champs sont requis pour effectuer la correction d'une rangée (Numero de compte, nom de compte)
- Vérifier que tous les comptes sont présents
- si un compte est manquant, ajoute l'erreur ("table_account_missing")
- Vérifier que le module page n'est pas vide
- si c'est le cas, ajoute l'erreur ("empty_table")
- Calculer le score du module page
État des résultats
- Pour chaque section de la table
- Pour chaque rows de la section
- Trouver le compte de référence
- si la référence n'est pas trouvée, ajoute une erreur ("row_reference_missing")
- Vérifier que le compte est dans la bonne section (Chaque section à des comptes spécifiques)
- Si le compte n'est pas dans la bonne section, ajoute l'erreur ("row_wrong_section")
- Correction des différents inputs de la row selon les informations du compte de référence trouvée et de la balance qui est modifier selon les autres inputs de la row
- Voir la section, Aide à la correction 1
- Vérifier que les identifiants ne sont pas déjà utilisé
- Voir la section, Aide à la correction 2
- Trouver le compte de référence
- Pour chaque rows de la section
- Correction des différents inputs de la table (leurs valeurs dépends de la valeur des inputs de la table)
- Voir la section, Aide à la correction 1
- Vérifier que tout les comptes sont présents
- s'il en manque, ajoute l'erreur ("table_account_missing")
- Calculer de score des options de la table
- Voir la section, Aide à la correction 3
- Calculer le score final du journal
- Si une catégorie est vide, ajoute l'erreur ("empty_table")
État des capitaux propres
- Pour chaque rows de la table
- Trouver le compte de référence
- si la référence n'est pas trouvée, ajoute une erreur ("row_reference_missing")
- Correction des différents inputs de la row selon les informations du compte de référence trouvée et de la balance qui est modifier selon les autres inputs de la row
- Voir la section, Aide à la correction 1
- Vérifier que les identifiants ne sont pas déjà utilisé
- Voir la section, Aide à la correction 2
- Trouver le compte de référence
- Correction des différents inputs de la table (leurs valeurs dépends de la valeur des inputs de la table)
- Voir la section, Aide à la correction 1
- Calculer de score des options de la table
- Voir la section, Aide à la correction 3
- Calculer le score final du journal
- Si une catégorie est vide, ajoute l'erreur ("empty_table")
Bilan
- Pour chaque section de la table
- Pour chaque rows de la section
- Trouver le compte de référence
- si la référence n'est pas trouvée, ajoute une erreur ("row_reference_missing")
- Vérifier que le compte est dans la bonne section (Chaque section à des comptes spécifiques)
- Si le compte n'est pas dans la bonne section, ajoute l'erreur ("row_wrong_section")
- Correction des différents inputs de la row selon les informations du compte de référence trouvée et de la balance qui est modifier selon les autres inputs de la row
- Voir la section, Aide à la correction 1
- Vérifier que les identifiants ne sont pas déjà utilisé
- Voir la section, Aide à la correction 2
- Trouver le compte de référence
- Pour chaque rows de la section
- Correction des différents inputs de la table (leurs valeurs dépends de la valeur des inputs de la table)
- Voir la section, Aide à la correction 1
- Vérifier que tout les comptes sont présents
- s'il en manque, ajoute l'erreur ("table_account_missing")
- Calculer de score des options de la table
- Voir la section, Aide à la correction 3
- Calculer le score final du journal
- Si une catégorie est vide, ajoute l'erreur ("empty_table")
Aide à la correction
- Méthodologie pour corriger les bonne réponses d'une série d'input
- Regarder chacun des inputs et les comparé a une liste de bonne réponse
- Si la réponses d'input est mauvaise, ajoute une erreur ("row_input_value_wrong_answer")
- Si l'input n'as pas de valeur, ajoute l'erreur ("row_input_value_missing")
- si l'input à une valeur mais ne devrait pas encore avoir, ajoute l'erreur ("row_input_value_should_be_empty")
- Regarder chacun des inputs et les comparé a une liste de bonne réponse
- Vérifier que la référence d'une row n'est pas utiliser à multiples reprises
- Comparer les identifiants envoyer avec les identifiants des autres rows
- si une autre row à les même identifiants, conserver le meilleur score et ajoute l'erreur ("row_reference_used")
- Comparer les identifiants envoyer avec les identifiants des autres rows
- Méthodologie pour calculer le score des options d'un module page
- Les informations pour les options voulu sont stocker dans le staticData
- Si les critère ne sont pas respecter, 3 erreurs peuvent se produire pour les options d'input dans une row
- Si l'input à une options mais ne devrait pas l'avoir, ("row_input_option_should_be_empty")
- Si l'input à la mauvaise réponse, ("row_input_option_wrong_answer")
- Si l'input n'a pas d'option mais devrait en avoir, ("row_input_option_missing")
- et 3 autres erreurs sont possible pour les options d'input dans une table
- Si l'input à une options mais ne devrait pas l'avoir, ("table_input_option_should_be_empty")
- Si l'input à la mauvaise réponse, ("table_input_option_wrong_answer")
- Si l'input n'a pas d'option mais devrait en avoir, ("table_input_option_missing")
- Si les critère ne sont pas respecter, 3 erreurs peuvent se produire pour les options d'input dans une row
- Les informations pour les options voulu sont stocker dans le staticData
Exemple de donnée d'une équipe pour un module (Module_Test)
{
"uid": "7200188c-a8e6-4904-a92b-b8bbf64086f9-module_TEST",
"simUid": "0a189c03-43db-4585-a1bd-171d2c6ec3ff",
"gameUid": "acc1",
"teamUid": "7200188c-a8e6-4904-a92b-b8bbf64086f9",
"moduleUid": "module_TEST",
"moduleTypesData": {
"practice": {
"seed": 2032993953,
"pagesData": {
"payroll_journal": {
"tables": {
"default": {
"sections": {
"default": {
"rowsIndex": [
"7ca74915-56fe-4452-8290-141d6ed0ac0d"
],
"rows": {
"7ca74915-56fe-4452-8290-141d6ed0ac0d": {
"inputs": {
"employee": {
"value": "employee_1"
},
"date": {
"value": "2020-07-02"
},
"amount_hours": {
"value": "38.00"
},
"hourly_rate": {
"value": "17.07"
},
"salaries": {
"value": "648.66"
},
"rrq_to_pay": {
"value": "38.27"
},
"rqap_to_pay": {
"value": "3.20"
},
"employment_insurance_to_pay": {
"value": "7.65"
},
"provincial_tax_to_pay": {
"value": "97.30"
},
"federal_tax_to_pay": {
"value": "97.30"
},
"salaries_to_pay": {
"value": "404.94"
},
"bill_id": {
"value": "1921"
}
}
}
}
}
}
}
}
},
"withdrawals_journal": {
"tables": {
"default": {
"sections": {
"default": {
"rowsIndex": [
"453f40df-950e-4fe2-bcbf-618811cd7b7e",
"d8d50ce1-d048-48ba-ab06-994aa9561b11"
],
"rows": {
"453f40df-950e-4fe2-bcbf-618811cd7b7e": {
"inputs": {
"date": {
"value": "2020-07-02"
},
"company_uid": {
"value": "employee_1"
},
"bill_id": {
"value": "1918"
},
"cashings": {
"value": "404.94"
},
"salaries_to_pay": {
"value": "404.94"
},
"report_to_account": {
"value": "1"
}
}
},
"d8d50ce1-d048-48ba-ab06-994aa9561b11": {
"inputs": {
"date": {
"value": "2020-08-22"
},
"company_uid": {
"value": "motor_company"
},
"bill_id": {
"value": "1919"
},
"cashings": {
"value": "67596.84"
},
"purchases": {
"value": ""
},
"report_to_account": {
"value": "1"
},
"providers": {
"value": "67596.84"
}
}
}
}
}
}
}
}
},
"purchases_journal": {
"tables": {
"default": {
"sections": {
"default": {
"rowsIndex": [
"4b8da7f3-8cf9-4de6-bda9-d62aef2ce493"
],
"rows": {
"4b8da7f3-8cf9-4de6-bda9-d62aef2ce493": {
"inputs": {
"company_uid": {
"value": "motor_company"
},
"date": {
"value": "2020-08-21"
},
"bill_id": {
"value": "127"
},
"providers": {
"value": "67596.84"
},
"purchases": {
"value": "58792.64"
},
"tps_to_receive": {
"value": "2939.63"
},
"tvq_to_receive": {
"value": "5864.57"
},
"report_to_account": {
"value": "1"
}
}
}
}
}
}
}
}
},
"providers_subledger": {
"tables": {
"motor_company": {
"sections": {
"default": {
"rowsIndex": [
"5a8f6c19-81ff-4e95-9baa-0d1263519ed4",
"da745157-f975-4b8e-85fe-b9d79e6f7e38",
"3600b4df-9958-4f95-9c02-0eca0b790f85"
],
"rows": {
"5a8f6c19-81ff-4e95-9baa-0d1263519ed4": {
"inputs": {
"date": {
"value": "2020-08-21"
},
"reference": {
"value": "purchases_journal_short"
},
"bill_id": {
"value": "127"
},
"balance": {
"value": "67596.84"
},
"credit": {
"value": "67596.84"
},
"debit_credit": {
"value": "credit_short"
}
}
},
"da745157-f975-4b8e-85fe-b9d79e6f7e38": {
"inputs": {
"date": {
"value": "2020-08-22"
},
"other_bill_id": {
"value": "check-1919"
},
"reference": {
"value": "withdrawals_journal_short"
},
"debit": {
"value": "67596.84"
},
"balance": {
"value": ""
},
"debit_credit": {
"value": ""
}
}
},
"3600b4df-9958-4f95-9c02-0eca0b790f85": {
"inputs": {
"date": {
"value": "2020-08-22"
},
"other_bill_id": {
"value": "check-1919"
},
"reference": {
"value": "withdrawals_journal_short"
},
"debit": {
"value": "67596.84"
}
}
}
}
}
}
}
}
},
"clients_subledger": {
"tables": {
"client_15": {
"sections": {
"default": {
"rowsIndex": [
"97792d10-a5ba-4018-baad-81526f2e9e54",
"b82f9546-587c-4eef-876c-d87e3eb96db1"
],
"rows": {
"97792d10-a5ba-4018-baad-81526f2e9e54": {
"inputs": {
"date": {
"value": "2020-05-12"
},
"bill_id": {
"value": "1920"
},
"reference": {
"value": "sales_journal_short"
},
"debit": {
"value": "68847.91"
},
"balance": {
"value": "68847.91"
},
"debit_credit": {
"value": "debit_short"
}
}
},
"b82f9546-587c-4eef-876c-d87e3eb96db1": {
"inputs": {
"other_bill_id": {
"value": "check-1755"
},
"reference": {
"value": "cashings_journal_short"
},
"credit": {
"value": "68847.91"
},
"date": {
"value": "2020-06-11"
}
}
}
}
}
}
}
}
},
"sales_journal": {
"tables": {
"default": {
"sections": {
"default": {
"rowsIndex": [
"72b6098f-49da-4fa1-a937-69b18aca2918"
],
"rows": {
"72b6098f-49da-4fa1-a937-69b18aca2918": {
"inputs": {
"date": {
"value": "2020-05-12"
},
"company_uid": {
"value": "client_15"
},
"report_to_account": {
"value": "1"
},
"bill_id": {
"value": "1920"
},
"clients": {
"value": "68847.91"
},
"sales": {
"value": "59880.76"
},
"tps_to_pay": {
"value": "2994.04"
},
"tvq_to_pay": {
"value": "5973.11"
}
}
}
}
}
}
}
}
},
"cashings_journal": {
"tables": {
"default": {
"sections": {
"default": {
"rowsIndex": [
"5da0cd48-15ef-4770-88b2-4b696ac93557",
"8a3d0e7c-80a6-45f5-8715-1e9fdefdd316"
],
"rows": {
"5da0cd48-15ef-4770-88b2-4b696ac93557": {
"inputs": {
"report_to_account": {
"value": "1"
},
"date": {
"value": "2020-06-11"
},
"company_uid": {
"value": "client_15"
},
"bill_id": {
"value": "1755"
},
"cashings": {
"value": "68847.91"
},
"clients": {
"value": "68847.91"
}
}
},
"8a3d0e7c-80a6-45f5-8715-1e9fdefdd316": {
"inputs": {
"company_uid": {
"value": "our_retail_sales"
},
"date": {
"value": "2020-08-28"
},
"cashings": {
"value": "2701.52"
},
"sales": {
"value": "2349.66"
},
"tps_to_pay": {
"value": "117.48"
},
"tvq_to_pay": {
"value": "234.38"
},
"report_to_account": {
"value": "1"
}
}
}
}
}
}
}
}
},
"ledger": {
"tables": {
"clients": {
"sections": {
"default": {
"rowsIndex": [
"fa840a02-81b5-4881-8add-503c9f6258cf",
"0dac078b-6ecf-4a40-bade-a183f31800d4"
],
"rows": {
"fa840a02-81b5-4881-8add-503c9f6258cf": {
"inputs": {
"date": {
"value": "2020-08-31"
},
"reference": {
"value": "sales_journal_short"
},
"debit": {
"value": "68847.91"
},
"balance": {
"value": "68847.91"
},
"debit_credit": {
"value": "debit_short"
}
}
},
"0dac078b-6ecf-4a40-bade-a183f31800d4": {
"inputs": {
"credit": {
"value": "68847.91"
},
"reference": {
"value": "cashings_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
}
}
}
}
},
"sales": {
"sections": {
"default": {
"rowsIndex": [
"5559f52d-4629-40e4-b51e-84556d81006f",
"0f417b99-9b01-454b-ac47-767d4adbb32c",
"6648f48e-aac6-454b-88d3-e9a868c0e783"
],
"rows": {
"5559f52d-4629-40e4-b51e-84556d81006f": {
"inputs": {
"date": {
"value": "2020-08-31"
},
"reference": {
"value": "sales_journal_short"
},
"credit": {
"value": "59880.76"
},
"balance": {
"value": "59880.76"
},
"debit_credit": {
"value": "credit_short"
}
}
},
"0f417b99-9b01-454b-ac47-767d4adbb32c": {
"inputs": {
"credit": {
"value": "2349.66"
},
"reference": {
"value": "cashings_journal_short"
},
"date": {
"value": "2020-08-31"
},
"balance": {
"value": "62230.42"
},
"debit_credit": {
"value": "credit_short"
}
}
},
"6648f48e-aac6-454b-88d3-e9a868c0e783": {
"inputs": {
"debit": {
"value": "62230.42"
},
"reference": {
"value": "general_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
}
}
}
}
},
"tps_to_pay": {
"sections": {
"default": {
"rowsIndex": [
"90b193c3-4de1-444d-8ea7-6275b5a0bae8",
"5d127cc7-3eb2-49a5-b1a7-9aaaa42e870f"
],
"rows": {
"90b193c3-4de1-444d-8ea7-6275b5a0bae8": {
"inputs": {
"credit": {
"value": "2994.04"
},
"reference": {
"value": "sales_journal_short"
},
"date": {
"value": "2020-08-31"
},
"balance": {
"value": "2994.04"
},
"debit_credit": {
"value": "credit_short"
}
}
},
"5d127cc7-3eb2-49a5-b1a7-9aaaa42e870f": {
"inputs": {
"credit": {
"value": "117.48"
},
"debit_credit": {
"value": "credit_short"
},
"reference": {
"value": "cashings_journal_short"
},
"date": {
"value": "2020-08-31"
},
"balance": {
"value": "3111.52"
}
}
}
}
}
}
},
"tvq_to_pay": {
"sections": {
"default": {
"rowsIndex": [
"a419a7bd-dcfe-4164-b06c-81d03535feca",
"05529076-f6ab-4477-9a8d-9732689af6ac"
],
"rows": {
"a419a7bd-dcfe-4164-b06c-81d03535feca": {
"inputs": {
"credit": {
"value": "5973.11"
},
"balance": {
"value": "5973.11"
},
"debit_credit": {
"value": "credit_short"
},
"reference": {
"value": "sales_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
},
"05529076-f6ab-4477-9a8d-9732689af6ac": {
"inputs": {
"credit": {
"value": "234.38"
},
"reference": {
"value": "cashings_journal_short"
},
"date": {
"value": "2020-08-31"
},
"debit_credit": {
"value": "credit_short"
},
"balance": {
"value": "6207.49"
}
}
}
}
}
}
},
"salaries": {
"sections": {
"default": {
"rowsIndex": [
"605e8613-3ee9-4c17-85a7-8e4e65592eb6",
"27aa78fb-152b-450a-aa0b-308b907e778c"
],
"rows": {
"605e8613-3ee9-4c17-85a7-8e4e65592eb6": {
"inputs": {
"debit": {
"value": "648.66"
},
"balance": {
"value": "648.66"
},
"debit_credit": {
"value": "debit_short"
},
"reference": {
"value": "payroll_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
},
"27aa78fb-152b-450a-aa0b-308b907e778c": {
"inputs": {
"credit": {
"value": "648.66"
},
"reference": {
"value": "general_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
}
}
}
}
},
"rrq_to_pay": {
"sections": {
"default": {
"rowsIndex": [
"631e4938-0213-4699-88cd-efee2eab5c0e"
],
"rows": {
"631e4938-0213-4699-88cd-efee2eab5c0e": {
"inputs": {
"credit": {
"value": "38.27"
},
"balance": {
"value": "38.27"
},
"debit_credit": {
"value": "credit_short"
},
"reference": {
"value": "payroll_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
}
}
}
}
},
"rqap_to_pay": {
"sections": {
"default": {
"rowsIndex": [
"014b8383-ec9f-40d5-a40f-37b09c9a130f"
],
"rows": {
"014b8383-ec9f-40d5-a40f-37b09c9a130f": {
"inputs": {
"credit": {
"value": "3.20"
},
"balance": {
"value": "3.20"
},
"debit_credit": {
"value": "credit_short"
},
"reference": {
"value": "payroll_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
}
}
}
}
},
"employment_insurance_to_pay": {
"sections": {
"default": {
"rowsIndex": [
"e3141192-e259-4239-a8b3-94d0911a6f3f"
],
"rows": {
"e3141192-e259-4239-a8b3-94d0911a6f3f": {
"inputs": {
"date": {
"value": "2020-08-31"
},
"reference": {
"value": "payroll_journal_short"
},
"credit": {
"value": "7.65"
},
"balance": {
"value": "7.65"
},
"debit_credit": {
"value": "credit_short"
}
}
}
}
}
}
},
"provincial_tax_to_pay": {
"sections": {
"default": {
"rowsIndex": [
"c2aaaf47-9d93-479c-8cdf-f05f9c017c7f"
],
"rows": {
"c2aaaf47-9d93-479c-8cdf-f05f9c017c7f": {
"inputs": {
"debit_credit":
},
"balance": {
"value": "97.30"
},
"credit": {
"value": "97.30"
},
"reference": {
"value": "payroll_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
}
}
}
}
},
"federal_tax_to_pay": {
"sections": {
"default": {
"rowsIndex": [
"325166c7-167a-4538-94dd-82a30e1c8c6f"
],
"rows": {
"325166c7-167a-4538-94dd-82a30e1c8c6f": {
"inputs": {
"balance": {
"value": "97.30"
},
"credit": {
"value": "97.30"
},
"debit_credit": {
"value": "credit_short"
},
"reference": {
"value": "payroll_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
}
}
}
}
},
"salaries_to_pay": {
"sections": {
"default": {
"rowsIndex": [
"0d3ea85c-29f9-45d0-a9a3-e369e26fb59d",
"472d65a3-ea4d-4e7a-8682-9a4212b0c7b2"
],
"rows": {
"0d3ea85c-29f9-45d0-a9a3-e369e26fb59d": {
"inputs": {
"credit": {
"value": "404.94"
},
"balance": {
"value": "404.94"
},
"debit_credit": {
"value": "credit_short"
},
"reference": {
"value": "payroll_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
},
"472d65a3-ea4d-4e7a-8682-9a4212b0c7b2": {
"inputs": {
"debit": {
"value": "404.94"
},
"reference": {
"value": "withdrawals_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
}
}
}
}
},
"cashings": {
"sections": {
"default": {
"rowsIndex": [
"a1090fff-c9b1-4ad4-af6c-53ed4635d08d",
"7595b2dc-3256-4c5c-a70c-d5ae9becf2d4"
],
"rows": {
"a1090fff-c9b1-4ad4-af6c-53ed4635d08d": {
"inputs": {
"credit": {
"value": "68001.78"
},
"balance": {
"value": "68001.78"
},
"debit_credit": {
"value": "credit_short"
},
"reference": {
"value": "withdrawals_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
},
"7595b2dc-3256-4c5c-a70c-d5ae9becf2d4": {
"inputs": {
"debit": {
"value": "71549.43"
},
"balance": {
"value": "3547.65"
},
"debit_credit": {
"value": "debit_short"
},
"reference": {
"value": "cashings_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
}
}
}
}
},
"providers": {
"sections": {
"default": {
"rowsIndex": [
"403da98b-72ef-4b15-b0d3-62ecea118478",
"1dc24abc-f2e0-4e90-8fcd-a2ef721adceb"
],
"rows": {
"403da98b-72ef-4b15-b0d3-62ecea118478": {
"inputs": {
"debit": {
"value": "67596.84"
},
"balance": {
"value": "67596.84"
},
"debit_credit": {
"value": "debit_short"
},
"reference": {
"value": "withdrawals_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
},
"1dc24abc-f2e0-4e90-8fcd-a2ef721adceb": {
"inputs": {
"credit": {
"value": "67596.84"
},
"date": {
"value": "2020-08-31"
},
"reference": {
"value": "purchases_journal_short"
}
}
}
}
}
}
},
"purchases": {
"sections": {
"default": {
"rowsIndex": [
"4aafac5f-e169-4277-b4fd-536b2853a049",
"349a39b5-f175-4a83-aa0e-c7776699bbef"
],
"rows": {
"4aafac5f-e169-4277-b4fd-536b2853a049": {
"inputs": {
"debit": {
"value": "58792.64"
},
"balance": {
"value": "58792.64"
},
"debit_credit": {
"value": "debit_short"
},
"reference": {
"value": "purchases_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
},
"349a39b5-f175-4a83-aa0e-c7776699bbef": {
"inputs": {
"reference": {
"value": "general_journal_short"
},
"date": {
"value": "2020-08-31"
},
"credit": {
"value": "58792.64"
}
}
}
}
}
}
},
"tps_to_receive": {
"sections": {
"default": {
"rowsIndex": [
"6c856c2a-52ed-425a-a00c-6b9200cf26a0"
],
"rows": {
"6c856c2a-52ed-425a-a00c-6b9200cf26a0": {
"inputs": {
"debit": {
"value": "2939.63"
},
"reference": {
"value": "purchases_journal_short"
},
"date": {
"value": "2020-08-31"
},
"balance": {
"value": "2939.63"
},
"debit_credit": {
"value": "debit_short"
}
}
}
}
}
}
},
"tvq_to_receive": {
"sections": {
"default": {
"rowsIndex": [
"8e3f5666-6e28-4b52-944e-e77f9bd7b25d"
],
"rows": {
"8e3f5666-6e28-4b52-944e-e77f9bd7b25d": {
"inputs": {
"debit": {
"value": "5864.57"
},
"balance": {
"value": "5864.57"
},
"debit_credit": {
"value": "debit_short"
},
"reference": {
"value": "purchases_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
}
}
}
}
},
"summary_results": {
"sections": {
"default": {
"rowsIndex": [
"8ae25bde-0008-4500-bfc9-d86c0ed7cd83",
"07d0de0f-c060-4e7e-870a-398253f0dcf4",
"b28de293-5fed-44f3-b8b8-63ec1e3c3faa"
],
"rows": {
"8ae25bde-0008-4500-bfc9-d86c0ed7cd83": {
"inputs": {
"reference": {
"value": "general_journal_short"
},
"date": {
"value": "2020-08-31"
},
"credit": {
"value": "62230.42"
},
"balance": {
"value": "62230.42"
},
"debit_credit": {
"value": "credit_short"
}
}
},
"07d0de0f-c060-4e7e-870a-398253f0dcf4": {
"inputs": {
"date": {
"value": "2020-08-31"
},
"reference": {
"value": "general_journal_short"
},
"debit": {
"value": "59441.30"
},
"balance": {
"value": "2789.12"
},
"debit_credit": {
"value": "credit_short"
}
}
},
"b28de293-5fed-44f3-b8b8-63ec1e3c3faa": {
"inputs": {
"reference": {
"value": "general_journal_short"
},
"date": {
"value": "2020-08-31"
},
"debit": {
"value": "2789.12"
}
}
}
}
}
}
},
"our_company_capital": {
"sections": {
"default": {
"rowsIndex": [
"3417681b-e40a-4a31-8da9-546666cab847"
],
"rows": {
"3417681b-e40a-4a31-8da9-546666cab847": {
"inputs": {
"credit": {
"value": "2789.12"
},
"balance": {
"value": "2789.12"
},
"debit_credit": {
"value": "credit_short"
},
"reference": {
"value": "general_journal_short"
},
"date": {
"value": "2020-08-31"
}
}
}
}
}
}
}
}
},
"trial_balance": {
"tables": {
"default": {
"sections": {
"default": {
"rowsIndex": [
"d7137ecd-59b3-4886-ada8-84c3cb87c165",
"282f36e3-8efb-42b9-aa99-04f8a276e04c",
"673b9089-69ae-471d-adf0-6135f221ef4f",
"03d70141-af72-4d8f-8bf6-3a6c3e6992f9",
"afef2bd4-ce4a-40f2-8639-58f55c34e049",
"0fd3733f-1b0d-4bde-9d01-ab0e75fbaed0",
"48c16621-000b-4e8e-b6b5-5a3a1027cb6b",
"902a1eea-186d-4a55-a880-01905a04834a",
"f4c5eaad-9f97-4ace-9172-18d71f1a51f4",
"65b100fc-6c9c-4384-b0b5-b8baafec345b",
"a060b654-77b4-4ce6-854a-29bfc49630ac",
"5933c3e2-7624-49c6-a04e-9bae879433df",
"7107e62a-3d97-46f1-8288-da51a1a620ac",
"9480fb3a-a2d8-494e-8335-e72f2d827667",
"a160ab94-8494-4063-ab71-f245603a6b7e",
"53140098-e7ba-4790-89a4-813ee3b93ace",
"e58c3d8d-924c-4500-93a4-b084c5a13be5",
"7761dcc1-9f17-481e-907a-949d2ef21786",
"e7cdf168-a199-44e3-887f-8f536a31fe12",
"9d3bdce8-eae7-4395-a7ad-79f2b20aa875",
"ebd2fdef-6ea2-42d1-80ba-3f750eb028a5",
"d3eb1e1a-77e6-449a-a5ad-3d20ccc8b35f",
"819eed8e-5c49-4975-b4d8-3cbcca01a5b6",
"4d886dec-6101-4e57-9f1c-5d6d1dadac57",
"afdffb3c-0dbe-4aa3-a8c8-5266c797a357"
],
"rows": {
"d7137ecd-59b3-4886-ada8-84c3cb87c165": {
"inputs": {
"account_nbr": {
"value": "1010"
},
"account_name": {
"value": "cashings"
},
"debit": {
"value": "3547.65"
}
}
},
"282f36e3-8efb-42b9-aa99-04f8a276e04c": {
"inputs": {
"account_nbr": {
"value": "1100"
},
"account_name": {
"value": "clients"
}
}
},
"673b9089-69ae-471d-adf0-6135f221ef4f": {
"inputs": {
"account_nbr": {
"value": "1105"
},
"account_name": {
"value": "tps_to_receive"
},
"credit": {
"value": ""
},
"debit": {
"value": "2939.63"
}
}
},
"03d70141-af72-4d8f-8bf6-3a6c3e6992f9": {
"inputs": {
"account_name": {
"value": "tvq_to_receive"
},
"account_nbr": {
"value": "1110"
},
"credit": {
"value": ""
},
"debit": {
"value": "5864.57"
}
}
},
"afef2bd4-ce4a-40f2-8639-58f55c34e049": {
"inputs": {
"account_nbr": {
"value": "2100"
},
"account_name": {
"value": "providers"
}
}
},
"0fd3733f-1b0d-4bde-9d01-ab0e75fbaed0": {
"inputs": {
"account_nbr": {
"value": "2305"
},
"account_name": {
"value": "tps_to_pay"
},
"credit": {
"value": "3111.52"
}
}
},
"48c16621-000b-4e8e-b6b5-5a3a1027cb6b": {
"inputs": {
"account_name": {
"value": "tvq_to_pay"
},
"account_nbr": {
"value": "2310"
},
"credit": {
"value": "6207.49"
}
}
},
"902a1eea-186d-4a55-a880-01905a04834a": {
"inputs": {
"account_nbr": {
"value": "2350"
},
"account_name": {
"value": "salaries_to_pay"
}
}
},
"f4c5eaad-9f97-4ace-9172-18d71f1a51f4": {
"inputs": {
"account_nbr": {
"value": "2360"
},
"account_name": {
"value": "rrq_to_pay"
},
"credit": {
"value": "38.27"
}
}
},
"65b100fc-6c9c-4384-b0b5-b8baafec345b": {
"inputs": {
"account_name": {
"value": "rqap_to_pay"
},
"account_nbr": {
"value": "2365"
},
"credit": {
"value": "3.20"
}
}
},
"a060b654-77b4-4ce6-854a-29bfc49630ac": {
"inputs": {
"account_name": {
"value": "provincial_tax_to_pay"
},
"account_nbr": {
"value": "2375"
},
"credit": {
"value": "97.30"
}
}
},
"5933c3e2-7624-49c6-a04e-9bae879433df": {
"inputs": {
"account_nbr": {
"value": "2390"
},
"account_name": {
"value": "employment_insurance_to_pay"
},
"credit": {
"value": "7.65"
}
}
},
"7107e62a-3d97-46f1-8288-da51a1a620ac": {
"inputs": {
"account_nbr": {
"value": "2395"
},
"account_name": {
"value": "federal_tax_to_pay"
},
"credit": {
"value": "97.30"
}
}
},
"9480fb3a-a2d8-494e-8335-e72f2d827667": {
"inputs": {
"account_nbr": {
"value": "3100"
},
"account_name": {
"value": "our_company_capital"
}
}
},
"a160ab94-8494-4063-ab71-f245603a6b7e": {
"inputs": {
"account_nbr": {
"value": "3200"
},
"account_name": {
"value": "our_company_deposit"
}
}
},
"53140098-e7ba-4790-89a4-813ee3b93ace": {
"inputs": {
"account_nbr": {
"value": "3300"
},
"account_name": {
"value": "our_company_withdrawals"
}
}
},
"e58c3d8d-924c-4500-93a4-b084c5a13be5": {
"inputs": {
"account_nbr": {
"value": "4120"
},
"account_name": {
"value": "services_given"
}
}
},
"7761dcc1-9f17-481e-907a-949d2ef21786": {
"inputs": {
"account_nbr": {
"value": "4500",
},
"account_name": {
"value": "sales"
},
"credit": {
"value": "62230.42"
}
}
},
"e7cdf168-a199-44e3-887f-8f536a31fe12": {
"inputs": {
"account_nbr": {
"value": "4510"
},
"account_name": {
"value": "sales_returns_and_discounts"
}
}
},
"9d3bdce8-eae7-4395-a7ad-79f2b20aa875": {
"inputs": {
"account_nbr": {
"value": "4520"
},
"account_name": {
"value": "sales_deductions"
}
}
},
"ebd2fdef-6ea2-42d1-80ba-3f750eb028a5": {
"inputs": {
"account_nbr": {
"value": "5100"
},
"account_name": {
"value": "purchases"
},
"debit": {
"value": "58792.64"
}
}
},
"d3eb1e1a-77e6-449a-a5ad-3d20ccc8b35f": {
"inputs": {
"account_nbr": {
"value": "5110"
},
"account_name": {
"value": "purchases_returns_and_discounts"
}
}
},
"819eed8e-5c49-4975-b4d8-3cbcca01a5b6": {
"inputs": {
"account_nbr": {
"value": "5120"
},
"account_name": {
"value": "purchases_deductions"
}
}
},
"4d886dec-6101-4e57-9f1c-5d6d1dadac57": {
"inputs": {
"account_nbr": {
"value": "5300"
},
"account_name": {
"value": "salaries"
},
"debit": {
"value": "648.66"
}
}
},
"afdffb3c-0dbe-4aa3-a8c8-5266c797a357": {
"inputs": {
"account_nbr": {
"value": "5999"
},
"account_name": {
"value": "summary_results"
}
}
}
}
}
}
}
},
"inputs": {
"end_date": {
"value": "2020-08-31"
}
}
},
"general_journal": {
"tables": {
"default": {
"sectionsIndex": [
"one",
"two",
"three"
],
"sections": {
"one": {
"rowsIndex": [
"53197625-1da8-48b0-9e2c-f30b28f25b83",
"c6272574-2b83-4ffa-9858-887c1f055964"
],
"rows": {
"c6272574-2b83-4ffa-9858-887c1f055964": {
"inputs": {
"reference": {
"value": "summary_results",
"options": {
"indent": 1
}
},
"date": {
"value": "2020-08-31"
},
"credit": {
"value": "62230.42"
},
"account_nbr": {
"value": "5999"
},
"debit": {
"value": ""
}
}
},
"53197625-1da8-48b0-9e2c-f30b28f25b83": {
"inputs": {
"reference": {
"value": "sales"
},
"date": {
"value": "2020-08-31"
},
"debit": {
"value": "62230.42"
},
"account_nbr": {
"value": "4500"
},
"credit": {
"value": ""
}
}
}
}
},
"two": {
"rowsIndex": [
"b00afda1-81f2-4ace-ad50-aec862b59f71",
"699ef4b8-84c0-42a0-a9c5-4938b1b2d7c0",
"4f850148-e023-429a-bcc8-0a661aaf54c1"
],
"rows": {
"4f850148-e023-429a-bcc8-0a661aaf54c1": {
"inputs": {
"reference": {
"value": "salaries",
"options": {
"indent": 1
}
},
"date": {
"value": "2020-08-31"
},
"credit": {
"value": "648.66"
},
"account_nbr": {
"value": "5300"
},
"debit": {
"value": ""
}
}
},
"b00afda1-81f2-4ace-ad50-aec862b59f71": {
"inputs": {
"date": {
"value": "2020-08-31"
},
"reference": {
"value": "summary_results"
},
"debit": {
"value": "59441.30"
},
"account_nbr": {
"value": "5999"
},
"credit": {
"value": ""
}
}
},
"699ef4b8-84c0-42a0-a9c5-4938b1b2d7c0": {
"inputs": {
"reference": {
"value": "purchases",
"options": {
"indent": 1
}
},
"date": {
"value": "2020-08-31"
},
"credit": {
"value": "58792.64"
},
"account_nbr": {
"value": "5100"
},
"debit": {
"value": ""
}
}
}
}
},
"three": {
"rowsIndex": [
"24aa16b0-b1c9-4153-985c-c0627c438075",
"c43b3409-9398-4fb1-a793-27d8117f6b9f"
],
"rows": {
"24aa16b0-b1c9-4153-985c-c0627c438075": {
"inputs": {
"debit": {
"value": "2789.12"
},
"date": {
"value": "2020-08-31"
},
"reference": {
"value": "summary_results"
},
"account_nbr": {
"value": "5999"
},
"credit": {
"value": ""
}
}
},
"c43b3409-9398-4fb1-a793-27d8117f6b9f": {
"inputs": {
"credit": {
"value": "2789.12"
},
"date": {
"value": "2020-08-31"
},
"reference": {
"value": "our_company_capital",
"options": {
"indent": 1
}
},
"account_nbr": {
"value": "3100"
},
"debit": {
"value": ""
}
}
}
}
}
}
}
}
},
"statement_income": {
"tables": {
"default": {
"sections": {
"operating_income": {
"rowsIndex": [
"35021938-f789-4741-8b57-69ce9587ef23"
],
"rows": {
"35021938-f789-4741-8b57-69ce9587ef23": {
"inputs": {
"text": {
"value": "sales"
},
"money2": {
"value": "62230.42",
"options": {
"underline": 1
}
},
"money1": {
"value": "62230.42"
}
}
}
}
},
"cost_of_goods_sold": {
"rowsIndex": [
"f7b1ca4f-a67b-4aef-814f-b98d847d82d4"
],
"rows": {
"f7b1ca4f-a67b-4aef-814f-b98d847d82d4": {
"inputs": {
"text": {
"value": "purchases"
},
"money2": {
"value": "58792.64",
"options": {
"underline": 1
}
},
"money1": {
"value": "58792.64",
"options": {
"underline": 1
}
}
}
}
}
},
"operating_expenses": {
"rowsIndex": [
"salaries"
],
"rows": {
"salaries": {
"inputs": {
"money2": {
"value": "648.66",
"options": {
"underline": 1
}
},
"money1": {
"value": "648.66",
"options": {
"underline": 1
}
},
"text": {
"value": "salaries"
}
}
}
}
}
},
"inputs": {
"end_date": {
"value": "2020-08-31"
},
"profit_margin": {
"value": "3437.78"
},
"net_profit": {
"value": "2789.12",
"options": {
"underline": 2
}
}
}
}
}
},
"statement_equity": {
"tables": {
"default": {
"sections": {
"default": {
"rowsIndex": [
"f760cbb2-b2ea-4dba-a802-38ca28cd78f2"
],
"rows": {
"f760cbb2-b2ea-4dba-a802-38ca28cd78f2": {
"inputs": {
"text": {
"value": "net_profit"
},
"money2": {
"value": "2789.12",
"options": {
"underline": 1
}
},
"money1": {
"value": "2789.12",
"options": {
"underline": 1
}
}
}
}
}
}
},
"inputs": {
"start_capital": {
"value": "152737.00"
},
"end_capital": {
"value": "155526.12",
"options": {
"underline": 2
}
}
}
}
}
},
"balance_sheet": {
"tables": {
"default": {
"sections": {
"fixed_assets": {
"rowsIndex": [],
"rows": {}
},
"active_short_term": {
"rowsIndex": [
"a55691ba-98bb-43f8-9d9e-a863e5c47752",
"228f9a4f-cfc9-47d6-a116-aea6e967d542",
"b2fe6bd8-684b-4568-adc0-a699dc6e00cb"
],
"rows": {
"228f9a4f-cfc9-47d6-a116-aea6e967d542": {
"inputs": {
"text": {
"value": "tps_to_receive"
},
"money2": {
"value": "2939.63"
}
}
},
"a55691ba-98bb-43f8-9d9e-a863e5c47752": {
"inputs": {
"text": {
"value": "cashings"
},
"money2": {
"value": "3547.65"
}
}
},
"b2fe6bd8-684b-4568-adc0-a699dc6e00cb": {
"inputs": {
"text": {
"value": "tvq_to_receive"
},
"money2": {
"value": "5864.57",
"options": {
"underline": 1
}
}
}
}
}
},
"passive_short_term": {
"rowsIndex": [
"ac741f08-8a90-4237-aa67-128ddcdbb2d1",
"84e08352-3983-4cd7-8fe8-cb8c82995370",
"e5795cfd-fc65-4c4c-a5a6-761ee88dde56",
"5596bd17-f932-4cff-9e36-15285be9626a",
"b23347f0-c647-4370-b366-5e65cebf5fda",
"b8f14675-28a0-4fbd-81ee-497bfbd8ac65",
"f93070f9-8ee6-45a0-b544-b8363d112a73"
],
"rows": {
"ac741f08-8a90-4237-aa67-128ddcdbb2d1": {
"inputs": {
"text": {
"value": "tps_to_pay"
},
"money2": {
"value": "3111.52"
}
}
},
"84e08352-3983-4cd7-8fe8-cb8c82995370": {
"inputs": {
"text": {
"value": "tvq_to_pay"
},
"money2": {
"value": "6207.49"
}
}
},
"b23347f0-c647-4370-b366-5e65cebf5fda": {
"inputs": {
"text": {
"value": "provincial_tax_to_pay"
},
"money2": {
"value": "97.30"
}
}
},
"e5795cfd-fc65-4c4c-a5a6-761ee88dde56": {
"inputs": {
"text": {
"value": "rrq_to_pay"
},
"money2": {
"value": "38.27"
}
}
},
"f93070f9-8ee6-45a0-b544-b8363d112a73": {
"inputs": {
"money2": {
"value": "97.30",
"options": {
"underline": 1
}
},
"text": {
"value": "federal_tax_to_pay"
}
}
},
"b8f14675-28a0-4fbd-81ee-497bfbd8ac65": {
"inputs": {
"text": {
"value": "employment_insurance_to_pay"
},
"money2": {
"value": "7.65"
}
}
},
"5596bd17-f932-4cff-9e36-15285be9626a": {
"inputs": {
"text": {
"value": "rqap_to_pay"
},
"money2": {
"value": "3.20"
}
}
}
}
}
},
"inputs": {
"fixed_assets_total": {
"value": "0.00",
"options": {
"underline": 1
}
},
"active_total": {
"value": "12351.85",
"options": {
"underline": 2
}
},
"passive_short_term_total": {
"value": "9562.73"
},
"passive_equity_total": {
"value": "165088.85",
"options": {
"underline": 2
}
},
"equity_unique_owner_total": {
"value": "155526.12",
"options": {
"underline": 1
}
},
"active_short_term_total": {
"value": "12351.85"
}
}
}
}
}
},
"bills": {
"billsData": {
"motor_company-send-127": {
"uid": "motor_company-send-127",
"billType": "provider",
"billData": {
"date": 1597979621257,
"paidDate": 1598140584033,
"billEntries": [
{
"seededProductUid": "p_chlore_machine",
"quantity": 29
},
{
"seededProductUid": "p_chlore",
"quantity": 112
},
{
"seededProductUid": "p_robot_cleaner",
"quantity": 8
},
{
"seededProductUid": "p_winter_canvas",
"quantity": 10
},
{
"seededProductUid": "p_inflatables",
"quantity": 5
},
{
"seededProductUid": "p_paper_ribbon",
"quantity": 192
},
{
"seededProductUid": "p_led",
"quantity": 42
},
{
"seededProductUid": "p_treated_wood",
"quantity": 5
},
{
"seededProductUid": "p_water_heater",
"quantity": 15
},
{
"seededProductUid": "p_ladder",
"quantity": 30
}
]
},
"senderCompanyUid": "motor_company",
"receiverCompanyUid": "our_company",
"billNumber": 127
},
"client_15-receive-1920": {
"uid": "client_15-receive-1920",
"billType": "client",
"billData": {
"date": 1589267904270,
"paidDate": 1591899124557,
"billEntries": [
{
"seededProductUid": "c_in_pool_21ft",
"quantity": 1
},
{
"seededProductUid": "c_in_pool_24ft",
"quantity": 1
},
{
"seededProductUid": "c_above_pool_24ft",
"quantity": 1
},
{
"seededProductUid": "c_above_pool_21ft",
"quantity": 1
},
{
"seededProductUid": "c_mid_pool_21ft",
"quantity": 1
},
{
"seededProductUid": "c_mid_pool_24ft",
"quantity": 1
}
]
},
"senderCompanyUid": "our_company",
"receiverCompanyUid": "client_15",
"billNumber": 1920
},
"client_15-send-1755": {
"uid": "client_15-send-1755",
"billType": "client_check",
"billData": {
"billUid": "client_15-receive-1920"
},
"senderCompanyUid": "client_15",
"receiverCompanyUid": "our_company",
"billNumber": 1755
},
"motor_company-receive-1919": {
"uid": "motor_company-receive-1919",
"billType": "provider_check",
"billData": {
"billUid": "motor_company-send-127"
},
"senderCompanyUid": "our_company",
"receiverCompanyUid": "motor_company",
"billNumber": 1919
},
"employee_1-receive-1921": {
"uid": "employee_1-receive-1921",
"billType": "employee",
"billData": {
"date": 1593648000000,
"paidDate": 1593648000000,
"billEntries": [
{
"seededProductUid": "e_salary_service",
"quantity": 38
}
]
},
"senderCompanyUid": "our_company",
"receiverCompanyUid": "employee_1",
"billNumber": 1921
},
"employee_1-receive-1918": {
"uid": "employee_1-receive-1918",
"billType": "employee_check",
"billData": {
"billUid": "employee_1-receive-1921"
},
"senderCompanyUid": "our_company",
"receiverCompanyUid": "employee_1",
"billNumber": 1918
},
"our_retail_sales-send-2020-08-28": {
"uid": "our_retail_sales-send-2020-08-28",
"billType": "retail_sales",
"billData": {
"date": 1598572800000,
"billEntries": [
{
"productDataUid": "rs_outdoor_sofa",
"price": 2349.66
}
]
},
"senderCompanyUid": "our_retail_sales",
"receiverCompanyUid": "our_company",
"billNumber": 13234
}
},
"billsOrder": [
"employee_1-receive-1921",
"employee_1-receive-1918",
"client_15-send-1755",
"motor_company-send-127",
"motor_company-receive-1919",
"client_15-receive-1920",
"our_retail_sales-send-2020-08-28"
],
"products": {
"p_chlore_machine": {
"productDataUid": "p_chlore_machine",
"price": 58.15
},
"p_chlore": {
"productDataUid": "p_chlore",
"price": 39.24
},
"p_robot_cleaner": {
"productDataUid": "p_robot_cleaner",
"price": 840.38
},
"p_winter_canvas": {
"productDataUid": "p_winter_canvas",
"price": 107.41
},
"p_inflatables": {
"productDataUid": "p_inflatables",
"price": 55.91
},
"p_paper_ribbon": {
"productDataUid": "p_paper_ribbon",
"price": 7.9
},
"p_led": {
"productDataUid": "p_led",
"price": 30.06
},
"p_treated_wood": {
"productDataUid": "p_treated_wood",
"price": 1811.31
},
"p_water_heater": {
"productDataUid": "p_water_heater",
"price": 1845.67
},
"p_ladder": {
"productDataUid": "p_ladder",
"price": 170.46
},
"c_in_pool_21ft": {
"productDataUid": "c_in_pool_21ft",
"price": 13310.04
},
"c_in_pool_24ft": {
"productDataUid": "c_in_pool_24ft",
"price": 14616.43
},
"c_above_pool_24ft": {
"productDataUid": "c_above_pool_24ft",
"price": 6061.06
},
"c_above_pool_21ft": {
"productDataUid": "c_above_pool_21ft",
"price": 5104.07
},
"c_mid_pool_21ft": {
"productDataUid": "c_mid_pool_21ft",
"price": 9050.26
},
"c_mid_pool_24ft": {
"productDataUid": "c_mid_pool_24ft",
"price": 11738.9
},
"e_salary_service": {
"productDataUid": "e_salary_service",
"price": 17.07
}
},
"companies": {
"motor_company": {
"companyDataUid": "motor_company",
"discount": 5
},
"our_company": {
"companyDataUid": "our_company",
"discount": 0
},
"client_15": {
"companyDataUid": "client_15",
"discount": 0
},
"employee_1": {
"companyDataUid": "employee_1",
"discount": 0
},
"our_retail_sales": {
"companyDataUid": "our_retail_sales",
"discount": 0
}
}
},
"dynamicDropdownsData": {
"provider": {
"motor_company": {
"condition": "0_0_n_30"
},
"piscina_max": {
"condition": "2_10_n_30"
}
},
"client": {
"client_15": {
"condition": "0_0_n_30"
}
}
}
}
}
}
Création du corrigé Acc1
Étape 1: Trier les factures selon leur type
Les factures triées seront stocker dans un dictionnaire
Étape 2: Remplir les journaux avec les factures
1. Journals des achats (facture de type: "provider")

- Pour chacune des facture de type "provider", ajouter une row.
- (2pts) Date ->Date écrite sur la facture
- (2pts) Client à créditer -> Nom du fournisseur
- (1pts) Report au compte -> si la row a été reporter au Grand Livre aux.
- (Identifiant de la row) Facture -> le numero de la facture
- (4pts) Fournisseurs (crédit) -> le "Total" de la facture
- (4pts) Achats (débit) -> le "Sous-total" de la facture
- (2pts) Rendus et ravais sur achats (crédit) -> le rabais de la facture
- (2pts) TPS à recevoir (débit) -> le "TPS (5%)" de la facture
- (2pts) TVQ à recevoir (débit) -> le "TVQ (9.975%)" de la facture
2. Journals des ventes (facture de type: "client")

- Pour chacune des facture de type "client", ajouter une row.
- (2pts) Date ->Date écrite sur la facture
- (2pts) Client à débiter-> Nom du client
- (1pts) Report au compte -> si la row a été reporter au Grand Livre aux.
- (Identifiant de la row) Facture -> le numero de la facture
- (4pts) Clients (débit) -> le "Total" de la facture
- (4pts) Ventes (crédit) -> le "Sous-total" de la facture
- (2pts) Rendus et rabais sur ventes -> le rabais de la facture
- (2pts) TPS à payer (crédit) -> le "TPS (5%)" de la facture
- (2pts) TVQ à payer (crédit) -> le "TVQ (9.975%)" de la facture
3. Journals des encaissements (facture de type: "client_check" et "retail_sales")

- Pour chacune des facture de type "client_check", ajouter une row.
- (2pts) Date ->Date écrite sur la facture
- (2pts) Nom du client ou explications -> Nom du client inscrit dans la section "Description"
- (2pts) Numéro du chèque -> le numero de chèque inscrit dans la section "Description"
- (2pts) Report au compte -> si la row a été reporter au Grand Livre aux.
- (2pts) Encaisse (débit) -> le montant inscrit dans la section "Total"
- (2pts) Clients (crédit) -> le montant inscrit dans la section "Total"
- Pour chacune des facture de type "retail_sales", ajouter une row.
- Date ->Date écrite sur la facture
- Nom du client ou explications -> "Ventes au comptant"
- Report au compte -> si la row a été reporter au Grand Livre aux.
- Encaisse (débit) -> le montant inscrit dans la section "Total"
- Ventes (crédit) -> le montant doit être calculer en retirant les taxes du "Total" ("Total" / 1.14975)
- TPS à payer (crédit) -> le montant doit être calculer (montant de ventes * 0.05)
- TVQ à payer (crédit) -> le montant doit être calculer (montant de ventes * 0.09975)
4. Journals des Décaissements (facture de type: "provider_check" et "employee_check")

- Pour chacune des facture de type "provider_check", ajouter une row.
- Date ->Date écrite sur la facture
- Nom du fournisseur ou du bénéficiaire -> Nom du Fournisseurs inscrit après "Payer à l'ordre de"
- Numéro du chèque -> le numero de chèque
- Report au compte -> si la row a été reporter au Grand Livre aux.
- Encaisse (crédit) -> le montant inscrit dans l'encadré à droite
- Fournisseurs (débit) -> le montant inscrit dans l'encadré à droite
- Pour chacune des facture de type "employee_check", ajouter une row.
- Date ->Date écrite sur la facture
- Nom du fournisseur ou du bénéficiaire -> Nom du Fournisseurs inscrit après "Payer à l'ordre de"
- Numéro du chèque -> le numero de chèque
- Report au compte -> si la row a été reporter au Grand Livre aux.
- Encaisse (crédit) -> le montant inscrit dans l'encadré à droite
- Salaires à payer (débit) -> le montant inscrit dans l'encadré à droite
5. Journals des salaires(facture de type: "employee")


- Pour chacune des facture de type "employee", ajouter une row.
- Date -> Date écrite sur la facture
- Nom du salarié -> Nom de l'employée écrit sous "Émise à"
- Taux horaire -> montant dans la section "Taux horaire" de la facture
- Nombre d'heures -> montant dans la section "Nombre d'heures" de la facture
- Salaires (débit) -> "Salaire brut" de la facture
- RRQ à payer (crédit) -> "RRQ" dans la secton "Retenus" de la facture
- RQAP à payer (crédit) -> "RQAP" dans la secton "Retenus" de la facture
- Assurance-emploi à payer (crédit) -> "Assurance-emploi" dans la secton "Retenus" de la facture
- Impôt provincial à payer (crédit) -> "Impôt provincial" dans la secton "Retenus" de la facture
- Impôt fédéral à payer (crédit) -> "Impôt fédéral" dans la secton "Retenus" de la facture
- Salaires à payer (crédit) -> "Salaire net" de la facture
- Numéro du relevé de paie -> le numéro de relevé de paie écrit sur la facture en haut à droite
Étape 3: Remplir les grands livres auxiliaires
1. Grand livre auxiliaire des fournisseurs


- Pour chacune des rows qui affecte un fournisseur dans le journal des achats/décaissements, ajouter une row. (les rows doivent être trier par date)
- Date -> Date de la row de référence
- Facture -> Si la row de référence vient du Journal des achats, écrire le numéro de la facture
- Libellé -> Si la row de référence vient du Journals des décaissements, écrire si c'est un chèque ou une note de crédit, et écrire le numéro de la facture
- Référence -> D'où vient la row de référence
- Débit -> Si la colonne de fournisseur de la row de référence est du type "débit", écrire le même montant
- Crédit -> Si la colonne de fournisseur de la row de référence est du type "crédit", écrire le même montant
- Solde -> montant du "solde" de la row précédente +/- le montant de débit/crédit de la row actuel
- Dt / Ct -> si le montant du solde est en Débit ou en Crédit
2. Grand livre auxiliaire des clients
- Pour chacune des rows qui affecte un fournisseur dans le journal des ventes/encaissements, ajouter une row. (les rows doivent être trier par date)
- Date -> Date de la row de référence
- Facture -> Si la row de référence vient du Journal des ventes, écrire le numéro de la facture
- Libellé -> Si la row de référence vient du Journals des encaissements, écrire si c'est un chèque ou une note de crédit, et écrire le numéro de la facture
- Référence -> D'où vient la row de référence
- Débit -> Si la colonne de fournisseur de la row de référence est du type "débit", écrire le même montant
- Crédit -> Si la colonne de fournisseur de la row de référence est du type "crédit", écrire le même montant
- Solde -> montant du "solde" de la row précédente +/- le montant de débit/crédit de la row actuel
- Dt / Ct -> si le montant du solde est en Débit ou en Crédit
- Pour chacune des rows qui affecte un fournisseur dans le journal des ventes/encaissements, ajouter une row. (les rows doivent être trier par date)
Étape 3: Remplir le grand livre et le journal général
1. Grand livre


- Remplir chacun des comptes disponible à l'aide des montants total afficher dans l'avant dernière ligne des journals (Achats, Ventes, Encaissements, Décaissements, Salaires)
- Date -> Date de la fin de l'exercise financier
- Référence -> de quel Journal vient le montant
- Débit ou Crédit -> Selon le type de la colonne du journals en question, écrire le montant du total (Avant dernière ligne)
- Solde -> montant du "solde" de la row précédente +/- le montant de débit/crédit de la row actuel
- Dt / Ct -> si le montant du solde est en Débit ou en Crédit
2. Journal général
- Remplir le journal général à l'aide du solde final des comptes dans le Grand libre.
- 3 Sections qui regroupe des compte differents devront être présent: Produits, Charges et Équité.
- L'ordre de la section de produits ou de charges n'a pas d'importance mais, la section d'équité doit être à la fin.
- Dans le cas de la section de produits, les comptes doivent être en premier dans la section sans indentation et le sommaire des résultats doit être à la fin avec un niveau d'indentation de 1
- Pour le cas de la section de charges, c'est l'inverse, le sommaire des résultats doit être en premier sans indentation tandis que les comptes doivent être à la fin avec un niveau d'indentation de 1
- Pour le cas de la section d'équité, le placement dans la section dépend de si les charges sont plus haute que les produits. Si les Produits sont plus grand, le sommaire des résultats est en premier sans indentation et le compte de capitaux est en deuxième avec un niveau d'indentation de 1. Si les Charges sont plus grande, la section des capitaux est en premier sans indentation et le sommaire des résultats est en deuxième avec un niveau d'indentation de 1
- La valeur à écrire dans la section équité est la valeur absolue des produits moins les charges.
- Dans chaque section, l'entrée sur le sommaire des résultats sert à balancer la somme du reste de la section dans type opposée.
- Remplir une row
- Date -> date de fin de l'exercise financier
- Nom de compte -> Voir les informations en haut
- Numéro de compte -> numéro associé au nom du compte
- Débit -> Si le compte est de produits ou voir les informations en haut
- Crédit -> Si le compte est de charges ou voir les informations en haut
3. Grand livre (Suite)
- Pour chacune des lignes dans le journal général, ajouter une ligne dans le compte approprié du Grand livre
- Date -> Date de la fin de l'exercise financier
- Référence -> Journal général
- Débit ou Crédit -> Selon le type de la colonne du montant, écrire le montant.
- Solde -> montant du "solde" de la row précédente +/- le montant de débit/crédit de la row actuel
- Dt / Ct -> si le montant du solde est en Débit ou en
Étape 4: Remplir la balance de vérification
1. Balance de vérification

- Pour chaque compte du grand livre, ajouter une ligne pour le compte correspondant (Trier par numéro de compte)
- Numéro de compte -> Numéro du compte
- Nom du compte -> Nom du compte
- Débit/Crédit -> Écrire le solde final du compte (Sans compter les lignes dont la référence est le journal général) dans la colonne que Dt/Ct indique et si le compte à un solde ne rien écrire dans aucun des deux champs
Étape 5: Remplir les états financiers
1. État des résultats
- Section Produits d'exploitation
- Ajouter une ligne pour chaque compte de produits et la valeur du compte dans l'input de gauche
- La dernière ligne de la section doit avoir le montant total de la section dans l'input de droite et avoir l'input de gauche avec un underline.
- Section Coût des marchandises vendues
- Ajouter une ligne pour chaque compte de charges (avec sous type Coût des marchandises vendues) et la valeur du compte dans l'input de gauche
- La dernière ligne de la section doit avoir le montant total de la section dans l'input de droite et avoir l'input de gauche et de droite avec un underline.
- Input de Marge bénéficiaire brute
- Le montant de l'input est calculé à l'aide du total de la section Produits d'exploitation moins le total de la section Coût des marchandises vendues
- Section Charges d'exploitation
- Ajouter une ligne pour chaque compte de charges (avec sous type Charges d'exploitation) et la valeur du compte dans l'input de gauche
- La dernière ligne de la section doit avoir le montant total de la section dans l'input de droite et avoir l'input de gauche et de droite avec un underline.
- Input de Bénéfice net
- Le montant de l'input est calculé à l'aide de l'input Marge bénéficiaire brute moins le total de la section Charges d'eploitation
- Avoir deux underline.
2. État des capitaux propres
- Input de capital au début de l'exercise financier
- Capitals au départ de l'états financiers
- Pour les lignes, ajouter une ligne par choses qui impact le capital finaux de l'entreprise.
- Écrire le montant de l'impact dans l'input de gauche
- La dernière ligne de la section doit avoir le montant total de la section dans l'input de droite et avoir l'input de gauche et de droite avec un underline.
- Input du capital à la fin de l'exercise financier
- Le montant de l'input est calculé à l'aide de l'input capital au début de l'exercise financier plus le total de la section Charges d'eploitation
3. Bilan
- Section d'Actif à court terme
- Ajouter une ligne pour chaque compte d'actif à court terme et la valeur du compte dans l'input de gauche
- La dernière ligne doit avoir un underline sur l'input de gauche
- Input de Total d'actif à court terme
- Le montant de l'input est calculé à l'aide du total de la Section d'actif à court terme
- Section d'Immobilisations
- Ajouter une ligne pour chaque compte d'Immobilisations et la valeur du compte dans l'input de gauche
- La dernière ligne doit avoir un underline sur l'input de gauche
- Input de Total d'immobilisations
- Le montant de l'input est calculé à l'aide du total de la Section d'immobilisations
- Doit avoir un underline
- Input de Total des actifs
- Le montant de l'input est calculé à l'aide du total de l'input de Total d'actif à court terme plus Input de Total d'immobilisations
- Doit avoir deux underline
- Section de passif à court terme
- Ajouter une ligne pour chaque compte de passif à court terme et la valeur du compte dans l'input de gauche
- La dernière ligne doit avoir un underline sur l'input de gauche
- Input de Total de passif à court terme
- Le montant de l'input est calculé à l'aide du total de la Section de passif à court terme
- Section Capitaux propres
- Avoir une ligne pour le et écrire le capitals final de l'entreprise dans l'input de droite et avoir un underline
- Input de Total des actifs
- Le montant de l'input est calculé à l'aide du total de l'input de Total de passif à court terme plus le total de la section Capitaux propres
- Doit avoir deux underline.
- Section d'Actif à court terme
- Le montant de l'input est calculé à l'aide de l'input capital au début de l'exercise financier plus le total de la section Charges d'eploitation
Pointage des differents champs
- (2pts) Date
- (Identifiant de la ligne) Fournisseur à créditer
- (1pts) Report au compte
- (Identifiant de la ligne) Facture
- (4pts) Fournisseurs (crédit)
- (4pts) Achats (débit)
- (2pts) Rendus et ravais sur achats (crédit)
- (2pts) TPS à recevoir (débit)
- (2pts) TVQ à recevoir (débit)
- (2pts) Date
- (Identifiant de la ligne) Client à débiter
- (1pts) Report au compte
- (Identifiant de la ligne) Facture
- (4pts) Clients (débit)
- (4pts) Ventes (crédit)
- (2pts) Rendus et rabais sur ventes
- (2pts) TPS à payer (crédit)
- (2pts) TVQ à payer (crédit)
- (2pts) Date ->Date écrite sur la facture
- (identifiant de la ligne) Nom du client ou explications
- (identifiant de la ligne) Numéro du chèque
- (1pts) Report au compte
- (4pts) Encaisse (débit)
- (4pts) Clients (crédit)
- (4pts) Ventes (crédit)
- (2pts) TPS à payer (crédit)
- (2pts) TVQ à payer (crédit)
- (2pts) Date
- (identifiant de la ligne) Nom du fournisseur ou du bénéficiaire
- (identifiant de la ligne) Numéro du chèque
- (1pts) Report au compte
- (4pts) Encaisse (crédit)
- (4pts) Fournisseurs (débit)
- (4pts) Salaires à payer (débit)

- (2pts) Date
- (2pts) Nom du salarié
- (2pts) Taux horaire
- (2pts) Nombre d'heures
- (2pts) Salaires (débit)
- (2pts) RRQ à payer (crédit)
- (2pts) RQAP à payer (crédit)
- (2pts) Assurance-emploi à payer (crédit)
- (2pts) Impôt provincial à payer (crédit)
- (2pts) Impôt fédéral à payer (crédit)
- (2pts) Salaires à payer (crédit)
- (identifiant de la ligne) Numéro du relevé de paie
- (2pts) Date
- (1pts) Numéro de compte
- (2pts) Nom de compte
- (2pts) Débit
- (2pts) Crédit
- (2pts) Date
- (2pts) Référence
- (2pts) Débit
- (2pts) Crédit
- (2pts) Solde
- (2pts) Dt / Ct

- (2pts) Date
- (identifiant de la ligne) Numéro de facture
- (identifiant de la ligne) Libellé
- (2pts) Référence
- (2pts) Débit
- (2pts) Crédit
- (2pts) Solde
- (2pts) Dt / Ct
- (identifiant de la ligne) Numéro de compte
- (identifiant de la ligne) nom de compte
- (2pts) Débit
- (2pts) Crédit
Inputs dans les sections avec des tabulations : 1pts chaque pour un total de 45% du modulePage
Inputs à droite des textes en gras : 1pts chaque pour un total de 25% du modulePage
10% du modulePage pour que les comptes soit dans les bonnes sections
20% du modulePage pour que les options des inputs soit bonnes ($, underline, signe négatif)
Inputs dans les sections avec des tabulations : 1pts chaque pour un total de 50% du modulePage
Inputs à droite des textes en gras : 1pts chaque pour un total de 30% du modulePage
20% du modulePage pour que les options des inputs soit bonnes ($, underline, signe négatif)
Inputs dans les sections avec des tabulations : 1pts chaque pour un total de 45% du modulePage
Inputs à droite des textes en gras : 1pts chaque pour un total de 25% du modulePage
10% du modulePage pour que les comptes soit dans les bonnes sections
20% du modulePage pour que les options des inputs soit bonnes ($, underline, signe négatif)
Préférences
Les dépendances sont présentés sous forme d'une condition.
Pour les préférences de type string, c'est l'une des valeurs possibles qui sera le uid inscrit dans la condition. (e.g. La condition products_company provient de la préférence our_company_type)
Pour les préférences de type int, la valeur attendue est inscrite sous forme de condition. (e.g. num_columns == 3)
Présentation des préférences
Préférences des modules
| Uid |
Wizard |
Type |
Valeur par défaut (constants) + Valeurs possibles |
Description + Dépendances |
|
our_company_type
|
✔ |
string |
products_company
Valeurs possibles
- products_company
- services_company
- products_and
_services_company
|
Choix du type de companie |
|
stock_type
|
✔ | string |
permanent_stock
Valeurs possibles
- permanent_stock
- periodic_stock
|
Choix du type de stock
Dépendances products_company || products_and_services_company
|
|
has_taxes
|
✔ | bool |
true
|
Contient des taxes à la consommation |
|
has_decimals
|
✔ | bool |
true
|
Contient des valeurs décimales (s'il y a lieu, 2 décimales par défaut)
Dépendances has_taxes |
|
has_deductions
|
✔ | bool |
true
|
Contient des escomptes sur ventes et achats (avec les conditions de paiement e.g. 2/10 n/30) |
|
uses_auxiliary_journals
|
✔ | bool |
true
|
Utiliser les journaux auxiliaires (ou le journal général) |
|
has_employees
|
✔ | bool |
true
|
La compagnie possède des employées et traite les paies |
|
has_credit_notes
|
✔ | bool |
true
|
Contient des rendus et rabais sur ventes et achats (notes de crédit) |
|
ignored_accounts
|
array | [ ] | Ignore les comptes du grand livre contenus dans la liste | |
|
hidden_accounts
|
array | [ ] | Cache les comptes du grand livre contenus dans la liste pour les étudiants. Les comptes sont utilisés dans la création du ou des contextes d'un module. Cette préférence est utile pour cacher des comptes qui ne sont vraiment pas utiles dans le contexte du module | |
|
accounts_uses_last_financial_statement
|
bool | false | Crée un contexte pour initialiser des données comme des valeurs | |
|
uses_accounting_closing
|
✔ | bool |
true
|
Procède à la clôture (Fermeture des comptes débiteurs/cérditeurs, etc.) |
|
unique_{client or provider}_preference
|
bool | false | Utilisation de client/fournisseur unique lors de la création des factures | |
|
last_year_partners_with_empty_balance
|
bool |
true
|
??? (Pas utilisé?) | |
|
uses_bill_id_in_general_journal
|
bool | false | Détermine si le journal général utilise la vielle correction (valeur : true) | |
|
uses_new_regularizations
|
bool | false | Utilisation de la nouvelle gestion des régularisations. La vielle version était utilisée pour l'ancien système des amortissements.
Dépendances uses_regularizations |
|
|
has_new_immobilizations
|
bool |
true
|
Détermine s'il y a une création de nouvelles immobilisations
Dépendances has_immobilizations |
|
|
has_new_contracts
|
bool |
true
|
Détermine s'il y a une création de nouveaux contrats
Dépendances uses_regularizations |
|
|
uses_regularizations
|
✔ | bool |
true
|
Procède aux écritures de clôture dans le journal général. (Amortissements, Charges payées d'avance, Produits perçus d'avance, Charges à payer et Produits à recevoir) **Exclut la régularisation des stocks |
|
pages
|
✔ | object | { } | Contient tous les settings de pages à écraser des originaux se trouvant dans pages_settings.json. La plupart du temps, ce sont les préférences de pages qui sont écrasées dans cet objet. |
|
affected_regularizations_reports
|
array? | null | ??? | |
|
has_immobilizations
|
✔ | bool |
true
|
Contient des immobilisations (i.e. Équipement de bureau, Matériel roulant, Ameublement) |
|
practice_num_seeds
|
✔ | int | 0
Valeurs possibles
- 0 (infini)
- 1 à 10
|
Détermine le nombre de versions de modules. Avec une valeur de 0, chaque étudiant aura une version différente. |
|
summative_num_seeds
|
✔ | int | 0
Valeurs possibles
- 0 (infini)
- 1 à 10
|
Détermine le nombre de versions de modules. Avec une valeur de 0, chaque étudiant aura une version différente. |
|
has_helper_in_summative
|
✔ | bool |
true
|
Détermine si le mode sommatif du module contient des modèles et/ou aides-mémoires. (i.e. modèle des états financiers de l'an passé) Le mode formatif contient toujours les modèles et/ou aides-mémoires. |
|
scenario_accounts_view_type
|
✔ | string |
trial_balance Valeurs possibles
- trial_balance
- accounts_list
|
Détermine si les comptes initiaux sont affichés dans la fenêtre du scénario à l'aide d'une balance de vérification ou d'une liste alphabétique de comptes |
|
uses_taxes_payment_form
|
bool |
true
|
Inclut le rapport et la remise de taxe(s)
Dépendances has_taxes |
|
|
uses_stock_regularizations
|
bool |
true
|
Procède à la régularisation de stock
Dépendances products_company || products_and_services_company |
|
|
has_immobilizations_taxes_report
|
bool |
true
|
Procède à la création des pj et de l'écriture avec les taxes municipales et scolaires
Dépendances has_immobilizations && has_land_immobilizations && uses_regularizations
|
|
|
has_banking_transactions
|
bool |
true
|
Contient des transactions bancaires | |
|
has_land_immobilizations
|
bool |
true
|
Contient un ou des terrains (+ taxes municipales et scolaires)
Dépendances has_immobilizations |
Préférences des pages
| Page Uid | Uid |
Wizard |
Type |
Valeur par défaut (constants) + Valeurs possibles |
Description + Dépendances |
| all |
ignored_options
|
array | [ ]
(constants)
|
Les options d'inputs qui sont ignorées lors de la correction du module page (e.g. minus, indent, underline, etc.) | |
|
all
|
ignored_grading_column_uids
|
|
array |
[ ]
(constants)
|
Les colonnes du tableau qui sont ignorées lors de la correction du module page (e.g. Les colonnes des noms de comptes prédeterminés dans le chiffrier) |
| all |
ignored_grading_relation_uids
|
|
array |
[ ]
(constants)
|
Les uids relationnels qui sont ignorées lors de la correction du module page (e.g. start_stock_of_goods) ** Seulement utilisé dans le journal général et le grand livre |
| all |
money_tolerance_range
|
|
int |
1
(sim_settings)
|
Tolérance négative/positive de valeur inscrite par l'étudiant dans un champs de nombre entier d'argent |
|
balance_sheet
|
num_columns
|
✔ |
int |
2
(pages_settings)
Valeurs possibles
- 2 ou 3
|
Nombre de colonnes pour les calculs des valeurs des comptes (money column inputs) |
Dépendances
Comptes du grand livre
Se retrouvent dans accounts.json
| Uid |
Dépendances |
|
cashings
|
✖ |
|
temporary_investments
|
has_banking_transactions
|
|
clients
|
✖ |
|
gst_ca_qc_to_receive
|
has_taxes
|
|
qst_ca_qc_to_receive
|
has_taxes
|
|
hst_ca_on_to_receive
|
has_taxes
|
|
hst_ca_nb_to_receive
|
has_taxes
|
|
hst_ca_pe_to_receive
|
has_taxes
|
|
interest_to_receive
|
has_banking_transactions && uses_regularizations |
|
taxes_to_receive
|
has_taxes
|
|
stock_of_goods
|
products_company || products_and_services_company |
|
office_supplies
|
✖ |
|
insurance_paid_in_advance
|
uses_regularizations
|
|
municipal_taxes_paid_in_advance
|
has_immobilizations && has_land_immobilizations && uses_regularizations |
|
school_taxes_paid_in_advance
|
has_immobilizations && has_land_immobilizations && uses_regularizations |
|
publicity_paid_in_advance
|
uses_regularizations
|
|
rolling_stock
|
has_immobilizations
|
|
rolling_stock_cumulative_depreciation
|
has_immobilizations && uses_regularizations |
|
equipment
|
has_immobilizations
|
|
equipment_cumulative_depreciation
|
has_immobilizations && uses_regularizations |
|
furnishings
|
has_immobilizations
|
|
furnishings_cumulative_depreciation
|
has_immobilizations && uses_regularizations |
|
land
|
has_immobilizations && has_land_immobilizations |
|
bank_loan
|
has_banking_transactions
|
|
providers
|
✖ |
|
hst_ca_on_to_pay
|
has_taxes
|
|
hst_ca_nb_to_pay
|
has_taxes
|
|
hst_ca_pe_to_pay
|
has_taxes
|
|
gst_ca_qc_to_pay
|
has_taxes
|
|
qst_ca_qc_to_pay
|
has_taxes
|
|
taxes_to_pay
|
has_taxes
|
|
salaries_to_pay
|
has_employees
|
|
rrq_ca_qc_to_pay
|
has_employees
|
|
cpp_ca_qc_to_pay
|
has_employees
|
|
rqap_ca_qc_to_pay
|
has_employees
|
|
income_tax_provincial_ca_qc_to_pay
|
has_employees
|
|
employment_insurance_ca_qc_to_pay
|
has_employees
|
|
income_tax_federal_ca_qc_to_pay
|
has_employees
|
|
income_tax_provincial_ca_on_to_pay
|
has_employees
|
|
income_tax_provincial_ca_nb_to_pay
|
has_employees
|
|
income_tax_provincial_ca_pe_to_pay
|
has_employees
|
|
employment_insurance_ca_to_pay
|
has_employees
|
|
income_tax_federal_ca_nb_to_pay
|
has_employees
|
|
income_tax_federal_ca_to_pay
|
has_employees
|
|
interest_to_pay
|
has_banking_transactions && uses_regularizations |
|
sales_received_in_advance
|
uses_regularizations
|
|
services_given_received_in_advance
|
uses_regularizations
|
|
our_company_capital
|
✖ |
|
our_company_deposit
|
✖ |
|
our_company_withdrawals
|
✖ |
|
services_given
|
services_company || products_and_services_company |
|
interest_income
|
uses_regularizations
|
|
sales
|
products_company || products_and_services_company
|
|
sales_returns_and_discounts
|
has_credit_notes && (products_company || products_and_services_company)
|
|
sales_deductions
|
has_deductions && (products_company || products_and_services_company)
|
|
start_stock_of_goods
|
products_company || products_and_services_company |
|
purchases
|
products_company || products_and_services_company |
|
purchases_returns_and_discounts
|
has_credit_notes && (products_company || products_and_services_company) |
|
purchases_deductions
|
has_deductions && (products_company || products_and_services_company)
|
|
end_stock_of_goods
|
products_company || products_and_services_company |
|
salaries
|
has_employees
|
|
rent
|
✖ |
|
publicity
|
✖ |
|
office_charges
|
✖ |
|
maintenance_supplies_charges
|
services_company
|
|
municipal_taxes
|
has_immobilizations && has_land_immobilizations && uses_regularizations |
|
school_taxes
|
has_immobilizations && has_land_immobilizations && uses_regularizations |
|
insurance
|
✖ |
|
interests_charges
|
has_banking_transactions
|
|
bank_charges
|
has_banking_transactions
|
|
rolling_stock_depreciation
|
has_immobilizations && uses_regularizations
|
|
equipment_depreciation
|
has_immobilizations && uses_regularizations |
|
furnishings_depreciation
|
has_immobilizations && uses_regularizations |
|
summary_results
|
✖ |
Pièces justificatives
Se retrouvent dans bills_settings_definition.json et dans la fonction acc1_utils_create_bills.createBillsByType
| Uid |
Dépendances |
|
provider_upfront_payment
|
✖ |
|
provider
|
✖ |
|
provider_credit_note
|
has_credit_notes
|
|
provider_check
|
✖ |
|
client_upfront_payment
|
✖ |
|
client
|
✖ |
|
client_credit_note
|
has_credit_notes
|
|
client_check
|
✖ |
|
employee
|
has_employees
|
|
employee_check
|
has_employees
|
|
retail_sales
|
products_company || products_and_services_company
|
|
building_owner_misc_check
|
✖ |
|
insurance_provider_taxless_misc_check
|
✖ |
|
bank_charges_report
|
has_banking_transactions
|
|
bank_loan_report
|
has_banking_transactions && !uses_auxiliary_journals |
|
deposit_check
|
✖ |
|
withdrawals_check
|
✖ |
|
end_stock_of_goods_report
|
(products_company || products_and_services_company) && periodic_stock
|
|
rolling_stock_report
|
has_immobilizations && uses_regularizations |
|
equipment_report
|
has_immobilizations && uses_regularizations |
|
furnishings_report
|
has_immobilizations && uses_regularizations |
|
long_term_services_client_contracts_report
|
uses_regularizations
|
|
long_term_publicity_provider_contracts_report
|
uses_regularizations
|
|
long_term_insurance_provider_contracts_report
|
uses_regularizations
|
|
used_office_supplies_report
|
uses_regularizations
|
|
municipal_immobilizations_taxes_report
|
has_immobilizations && has_land_immobilizations && uses_regularizations |
|
school_immobilizations_taxes_report
|
has_immobilizations && has_land_immobilizations && uses_regularizations |
|
short_term_investment_contracts_report
|
has_banking_transactions && uses_regularizations
|
|
short_term_loan_contracts_report
|
has_banking_transactions && uses_regularizations |
|
employee_partial_report
|
has_employees && uses_regularizations
|
Pages
Se retrouvent dans pages_settings_definition.json
| Uid |
Dépendances |
|
purchases_journal
|
uses_auxiliary_journals |
|
sales_journal
|
uses_auxiliary_journals |
|
withdrawals_journal
|
uses_auxiliary_journals |
|
cashings_journal
|
uses_auxiliary_journals |
|
payroll_journal
|
uses_auxiliary_journals && has_employees |
|
providers_subledger
|
✖ |
|
clients_subledger
|
✖ |
|
stocks_subledger
|
(products_company || products_and_services_company) && permanent_stock |
|
general_journal
|
✖ |
|
ledger
|
✖ |
|
trial_balance_regularized_after_closure
|
✖ |
|
trial_balance_before_regularizations_and_closure
|
✖ |
|
trial_balance_regularized
|
✖ |
|
trial_balance_after_closure
|
✖ |
|
statement_income
|
✖ |
|
statement_equity
|
✖ |
|
balance_sheet
|
✖ |
|
accounting_journal
|
✖ |
|
taxes_payment_form
|
has_taxes && uses_taxes_payment_form |
|
employee_income_taxes_form
|
has_employees && manual_income_taxes |
|
employer_income_taxes_form
|
has_employees && manual_income_taxes |
Scenario Pages
Les dépendances se retrouvent dans modules.json
Seulement les scenario pages avec des conditions sont listées
| Uid |
Dépendances |
| context_with_helper | has_helper_in_summative |
| context_without_helper | !has_helper_in_summative |
| income_taxes | has_employees |
| trial_balance | trial_balance |
| accounts_list | accounts_list |
| statement_income | has_helper_in_summative |
| statement_equity | has_helper_in_summative |
| balance_sheet | has_helper_in_summative |
Élément de pages
Se retrouvent dans module_pages.json
Seulement les éléments avec des conditions sont listées
| Page Uid | Type | Uid |
Dépendances |
| purchases_journal | column_input |
purchases
|
products_company || products_and_services_company
|
|
purchases_returns_and_discounts
|
products_company || products_and_services_company |
||
|
maintenance_supplies_charges
|
services_company
|
||
| sales_journal | column_input |
sales
|
products_company || products_and_services_company
|
|
sales_returns_and_discounts
|
products_company || products_and_services_company
|
||
|
services_given
|
services_company || products_and_services_company
|
||
|
withdrawals_journal
|
column_input
|
purchases_deductions
|
products_company || products_and_services_company
|
|
purchases
|
products_company || products_and_services_company
|
||
|
maintenance_supplies_charges
|
services_company
|
||
|
cashings_journal
|
column_input |
sales_deductions
|
products_company || products_and_services_company
|
|
sales
|
products_company || products_and_services_company
|
||
|
services_given
|
services_company || products_and_services_company
|
||
|
general_journal
|
column_input
|
bill_id
|
uses_bill_id_in_general_journal
|
|
reference
|
uses_bill_id_in_general_journal
|
||
|
account_uid
|
!uses_bill_id_in_general_journal | ||
|
account_number
|
!uses_bill_id_in_general_journal | ||
|
section_structure
|
!uses_bill_id_in_general_journal | ||
|
ledger
|
column_input
|
wording
|
uses_auxiliary_journals
|
|
bill_id
|
!uses_auxiliary_journals | ||
|
statement_income
|
table_structure.
structure_items
|
gross_sales
|
products_company || products_and_services_company |
|
operating_income
|
products_company || products_and_services_company | ||
|
operating_income_service
|
services_company
|
||
|
operating_income_service_total
|
services_company
|
||
|
cost_of_goods_sold
|
products_company || products_and_services_company | ||
|
profit_margin
|
products_company || products_and_services_company | ||
|
other_operating_income
|
products_and_services_company
|
||
|
operating_expenses
|
products_company || products_and_services_company | ||
|
operating_expenses_service
|
services_company
|
||
|
operating_expenses_service_total
|
services_company | ||
|
column_inputs
|
money4
|
products_company || products_and_services_company | |
|
money3
|
products_company || products_and_services_company | ||
|
balance_sheet
|
table_structure.
structure_items
|
immobilization
|
has_immobilizations
|
|
immobilization_total
|
has_immobilizations
|
||
|
column_inputs
|
money3
|
num_columns == 3
|
StaticData
| Uid |
Google Sheet |
Description |
|
scenario
|
✔ |
Contient tous les scénarios spécifiques à chaque module. Les uids des textes sont composés du préfixe suivant : scenario_{nom du module}_ Pour savoir si certaines pages du scénario sont inclues ou pas, il faut se référer au visibility conditions des pages du scénario dans modules.json |
|
products
|
✔ |
Contient tous les produits achetés ou vendus par la compagnie. On y décrit le type de produits ainsi que l'éventail des prix d'achat ou de vente, des quantité lors de l'achat ou la vente, des quantités en stock, etc. Les salaires des employés sont présents dans ce document. |
| services |
✔ |
Contient tous les services offerts par la compagnie. On y décrit le type de produits ainsi que l'éventail des prix d'achat ou de vente, des quantité lors de l'achat ou la vente, etc. |
|
partners
|
✔ |
Contient tous les partenaires d'affaires de la companie avec leur type, soit les employees.json et les companies.json |
|
employees
|
✔ |
Contient tous les employés que la compagnie peut engager et utiliser dans les paies. |
|
companies
|
✔ |
Contient toutes les compangies, bénéficiaires ou entités avec lesquels la compagnie fait affaire. Ça inclut les fournisseurs, les clients, la compangnie de l'étudiant et son propriétaire, etc. On y décrit entre autres, leur type de pj ou encore les produits et/ou services qu'ils achètent ou vendent. |
|
taxes
|
✔ |
Contient toutes les taxes à la consommation. On y décrit comment les calculer d'année en année. Pour savoir à quelles régions appartiennent une taxe, il faut se référer à regions_settings.json |
|
income_taxes
|
✔ |
Contient toutes les retenues salariales pour l'employée. On y décrit comment les calculer d'année en année. Pour savoir à quelles régions appartiennent une taxe, il faut se référer à regions_settings.json |
|
income_taxes_codes
|
✔ |
Contient toutes les codes possibles pour les retenues salariales calculer à partir de code. |
|
interests
|
✔ |
Contient tous les intérêts pour des emprunts ou des placements. On y décrit comment les calculer d'année en année. |
|
regions
|
✔ |
Contient toutes les régions qu'un professeur peut choisir pour contextualiser sa simulation. |
|
conditions
|
✔ |
Contient toutes les conditions de paiement qu'un client ou un fournisseur peut avoir avec la compagnie. Certaines conditions offrent des escomptes lorsque la facture est payée à court terme. |
|
dynamic_dropdown_data_structure
|
✔ |
Contient tous les identifiants de data pour dropdown avec du contenu dynamique créé par l'étudiant (e.g. client, provider) |
|
dropdown_data
|
✔ |
Contient tout le data pour dropdown avec contenu statique. (e.g. types de journaux, types de régularisation, etc.) Pour le contenu statique selon le contexte du module, il faut se référer à la méthode UtilsAcc1.GetDropdownDataFromString |
|
immobilizations
|
✔ | Contient toutes les immobilisations (matériel roulant, ameublement, équipement de bureau et terrain). On y décrit leur prix d'achat et de revente ainsi que le calcul pour leur amortissement s'il y a lieu. Provient de immobilizations_v2 sur GoogleSheet |
|
contract_regularizations
|
✔ |
Contient tous les contrats pour les régularisations de Charges payées d'avance et de Produits perçus d'avance. On y décrit quel type de produits ou services qu'ils contiennent ainsi que leur durée (un an en général). |
|
account_types
|
✔ |
Contient les grands types de comptes (Actif, Passif, Capitaux propres, Charges et Produits) et leur type de balance (débit ou crédit) |
| accounts |
|
Contient tous les comptes du grand livre avec lesquels l'étudiant va intéragir. On y décrit leur numéro, catégorie et sous-catégorie et leur type de balance (début ou crédit) |
| constants |
|
Contient toutes les constances générales (e.g. annual_num_payslips) et spécifiques aux modules (e.g. our_company_type) ou aux pages (e.g. ignored_options). |
| modules |
|
Contient tous les modules certaines informations de base qui ne sont assurément pas modifiable par un professeur. Les visibility_conditions des scenario_pages y sont aussi définies. |
| module_pages |
|
Contient toutes les pages (ou parties) que peuvent composées les modules. On y liste leur type et le data pour les générer et les corriger (comme column_inputs, table_structure, section_structure, inputs, etc.) Pour comprendre plus facilement le data, il est préférable de consulter les classes C# qui les désérialisent sur le client, enm commencant par ModulePageBase. |
| regions_settings |
|
Contient toutes les informations spécifiques aux régions. Elles peuvent globales ou spécifiques aux pages.
|
| sim_settings |
|
Contient toutes les informations globales potentiellement modifiables par un professeur, comme la region, l'année contextuelle de la simulation, la tolérance de champs de nombre et l'ordre par défaut des modules. L'année est enregistrée automatiquement lors de la création d'une simulation afin qu'elle ne change pas si la valeur dans sim_settings est incrémentée. |
| modules_settings |
|
Contient toutes les informations spécifiques aux modules potentiellement modifiables par un professeur. Les éléments principalement modifiables sont les preferences, les nombre des pj présentes dans le bills_type_data, le pages_order et les pages_ponderation. D'autres objets y sont aussi présents, comme les initial_accounts, la context_list et le current_module. Pour connaître les préférences et les pj modifiables, il faut se référer aux modules_settings_definitions. Pour connaître les pages présentes selon les préférences choisies, il faut se référer aux pages_settings_definitions. |
| pages_settings |
|
Contient toutes les informations spécifiques aux pages (ou parties) d'un module potentiellement modifiables par un professeur. Les éléments principalement modifiables sont les preferences qui sont aussi modifiables dans les modules_settings. D'autres objets y sont aussi présents, soit les scores_ponderation, la scores_details et les inputs_ponderation. |
| modules_contexts |
|
Contient toutes les informations spécifiques aux contextes des modules. Les informations présentées sont semblables à celles dans les modules_settings, plus précisément le bills_type_data et le pages_order. |
| bills_settings_definitions |
|
Contient toutes les informations modifiables pour les pj. Pour l'instant, seulement le nombre de pj est modifiable. Par contre, des visibility_conditions et/ou des dépendances peuvent changer automatique le nombre de pj. (e.g. Si, selon les préférences choisies, un type de pj n'est pas présente dans le module (visibility_conditions ➡ false), le nombre de pj pour ce type sera de 0) Pour consulter les bills_settings_definitions des modules, il faut se référer aux modules_settings_definitions. |
| preferences_settings_definitions |
|
Contient toutes les préférences modifiables des modules ou des pages d'un module. On y décrit leur type de champs avec le data associé et les visibility_conditions. Si les visibility_conditions retourne false, la valeur par défaut est forcée. Pour consulter les preferences_settings_definitions des modules, il faut se référer aux modules_settings_definitions. |
| modules_settings_definitions |
|
Contient toutes les preferences_settings_definitions et les bills_settings_definitions des modules. |
| pages_settings_definitions |
|
Contient toutes les pages ayant des visibility_conditions. On l'utilise lorsque l'on crée un module et que l'on choisie la pondération des pages du module. |
Ajouter une nouvelle page
- Ajouter la nouvelle page dans module_pages.json (S'inspirer des pages existantes pour formuler la nouvelle)
- Ajouter les settings de la nouvelle page dans les pages_settings
- Si c'est nécessaire, comme dans le cas d'une table (column_inputs_order) ou d'un custom prefab (prefab_reference), ajouter les settings de la nouvelle page dans les regions_settings
- Si c'est nécessaire, comme dans le cas d'une table ou d'un custom prefab, ajouter les settings de la nouvelle page dans les regions_settings
- Ajouter la page dans la liste de pages dans modules_settings et modules_contexts concernés
- S'il y a des conditions pour inclure ou pas la page, ajouter les conditions dans pages_settings_definitions
- Si la nouvelle page contient un dropdown, ajouter le data dans dynamic_dropdown_data_structure (dynamic), dropdown_data (static) ou UtilsAcc1.GetDropdownDataFromString (static, mais spécifique au contexte du module)
- Si la nouvelle page est un custom prefab, créer le prefab (variant si un prefab parent est disponible e.g. SubModulePageInputsControlBase)
- Ajouter le corrigé (answerkey) afin que les contextes fonctionnent
- Ajouter la correction (grading)
- S'assurer que tous les nouveaux textes ont été ajoutés
- Tester tous les modules qui possèdent la nouvelle page avec les différentes préférences et pj modifiables
Ajouter un nouveau module
- Ajouter le nouveau module dans modules.json (S'inspirer des modules existants pour formuler le nouveau)
- Ajouter les settings du nouveau module dans les modules_settings
- Ajouter les préférences et pj modifiables du nouveau module dans modules_settings_definitions
- Ajouter le nouveau module dans liste pour l'ordre par défaut des modules dans sim_settings
- Ajouter les textes du scénario du module dans l'onglet Scénario dans le document Google Sheet
- S'assurer que tous les autres nouveaux textes ont été ajoutés
- Tester le module avec les différentes préférences et pj modifiables
Arborescence des controls pour les modules
Modules
Pages
SubModulePageInputsControls
Tables
Sections
Rows
Input Cells
Procédure annuel pour updater les taxes (Deprecated)
Deprecated: Veuillez regarder la nouvelle marche à suivre dans la page "Procédure annuel pour updater les taxes (updated version 2026)"
https://docs.google.com/spreadsheets/d/1PMzc2vGeanmDXVKw8s8-hKepxstYUCIR_W1q4XSa5lE/edit#gid=0
Onglets
-
taxes
- duplicté une colonne d'une année précédente et l'intituler : $"{année}(str)"
-
Modifier les valeurs associés aux Uids sauf pour ["school", "municipal"]
- Les informations peuvent être trouvé sur un site comme celui-ci : https://empirecpa.ca/canadian-sales-tax-rates-for-2023/
-
income_taxes
- duplicté une colonne d'une année précédente et l'intituler : $"{année}(str)"
-
Modifier les valeurs associés aux Uids
- Certains identifiants ont des sources associés afin facilité la recherche d'information
-
Il faudra aussi ajouter un nouveau document googleSheet dans le folder suivant
- https://drive.google.com/drive/u/0/folders/1-7PMGfURsl47mcbA4z_Pb0y8_BUSUma4
-
il faudra alors remplir un onglet pour chaque impot possible (en utilisant le format de 26 période de paie) à l'aide de "sim_accounting_1" et de ses liens
- Note: Les retenues d'impôt est le même pour Ontario (On), Nouveau Brunswick (NB) et L'île-du-Prince-Édouard (PE)
-
Utiliser https://www.adobe.com/ca/acrobat/online/pdf-to-excel.html afin de transformer les chartes d'impot en format Excel
-
Utiliser la macro suivante afin de remplacer la colonne de min_salary
-
Utiliser la macro suivante afin de remplacer la colonne de min_salary
Conflit avec la Macro
-
-
-
-
-
Si la macro n'est pas disponible dans le menu, pour cela il faut:
- Dans le menu Extensions>Macos
- Faire un "Record macro" puis arrêter immédiatement la macro, afin de créer une macro rapidement
- Faire un "Manage macros" dans une année précédente (possèdent la macro "Replace "num1 - num2" with "num1" in colA")
- Cliquer sur les
, puis "Edit Script"
- Copier le code de macros.gs
- Faire un "Manage macros" dans le sheet en vigeur
- Cliquer sur les
, puis "Edit Script"
- Coller le script copié précédamment
- Renommer votre macro avec les mêmes valeurs que celui copié
-
S'il y a un problème de "Authorization required" ou autre durant l'exécution de la macro, voici la version manuel:
-
Faites un clique droite sur la colonne A, puis ajouter une nouvelle colonne à gauche
-
-
Copié le code ci-dessous
- =ArrayFormula(IF(REGEXMATCH(TO_TEXT(B2:B), "[–|-]"), TO_PURE_NUMBER(REGEXREPLACE(B2:B, "(\D+\.*\D+.*)", "")), 0))
- Coller le code sur la case A2 ou avant les rangées à modifier (sur la colonne A)
- À ce point normalement, les cases de la colonne A devrait-être à jour
-
Copié la colonne A à B
- ATTENTION, il se peut que certaines valeurs ne sont pas bien modifiées. Prenez seulement les valeurs adéquates
- Supprimé la colonne A
-
-
Si la macro n'est pas disponible dans le menu, pour cela il faut:
-
Remplacer toutes les instances de "," (virgule) par "." (point)
- À l'aide de (Ctrl + H)
-
-
Il faudra alors updater {AllSimsRepository}/node.js/exports/exportAllData.js afin de pouvoir exporter les nouveaux document créer avec la structure suivante:
- Dans la zone de "games.income_taxes_X.sheet" : Mettre la première partie de l'url (après "d/") du document "income_taxes_X"
- Dans les autres plus specifiques ("games.income_taxes_X.tabs"): Mettre le "gid" de l'url
-
-
-
employer_income_taxes
- duplicté une colonne d'une année précédente et l'intituler : $"{année}(str)"
-
Modifier les valeurs associés aux Uids
- Certains identifiants ont des sources associés afin facilité la recherche d'information
-
interests
- duplicté une colonne d'une année précédente et l'intituler : $"{année}(str)"
-
Modifier les valeurs associés aux Uids
- Certains identifiants ont des sources associés afin facilité la recherche d'information
Modifications liés à l'année par défaut
-
Modifier le champs year pour l'année par défaut voulu
{AllSimsRepository}\game\Assets\GameSpecific\acc1\Resources\data_acc1\act_settings.json
- duplicté une colonne d'une année précédente et l'intituler : $"{année}(str)"
-
Modifier les valeurs associés aux Uids
- Certains identifiants ont des sources associés afin facilité la recherche d'information
-
Modifier l'année par défaut pour la création des sims démo
{uniksimweb}\uniksim-back-end\src\node.js\server\backend_braincloud.js
Document PDF accessible en jeu
-
Ajouter un document liés à l'année dans ce dossier
https://cloud.digitalocean.com/spaces/uniksim-data?path=acc1/
-
Il faudra alors un document PDF intitulé "{thème}_{langue}" pour chacun des thèmes et langue suivantes, le tout dans le format "26 périodes de paie par année" (en public). N'oubliez pas de retirer l'extension .pdf
-
Thème
- cpp_ca
- employment_insurance_ca
- employment_insurance_ca_qc
- income_tax_federal_ca
- income_tax_federal_ca_nb
- income_tax_federal_ca_qc
- income_tax_provincial_ca_nb
- income_tax_provincial_ca_on
- income_tax_provincial_ca_pe
- income_tax_provincial_ca_qc
- rqap_ca_qc
- rrq_ca_qc
-
Langue
- fr
- en
-
Thème
Finitions
-
Executer la commande suivante sur node.js:
-
Une fois avec les paramêtres suivants
-
et une autre avec ceux-ci (remplacer par la bonne année)
-
-
Une fois terminé les files suivants devrait avoir des modifications
-
pour "AllSimsRepository"
-
pour "UniksimWebRepository"
-
-
Il nous reste qu'à exporter la data à la destination voulu (toujours sur node.js).
-
Utiliser cette export pour le StaticData
-
Utiliser cette export pour le StaticDataChunk
(Modifier le "args" de la requête pour chacun des requêtes)
-
Création d'une simulation (acc1)
Étape préliminaire pour la création de la simulation
Mettre à jour les taxes
-
- Avant de commencer, faire une mise à jour manuel des taxes si c'est pertinent pour l'année actuel:
Rendre la simulation général
-
-
- Si nécessaire, rendre la simulation original (copié) plus général afin de simplifier la nouvelle simulation.
- Si c'est le cas, le dossier {allsims}/UI/SimByModule est créé pour la base de acc1
- Pour se faire, les fichiers modifiés doit avoir un namespace namespace UnikSim.SimByModule au lieu de namespace UnikSim.SimByModule.acc1
- Si le fichier n'est pas dans gameSpecific, il n'est nécessaire le déplacer
- Le nom du fichier doit aussi faire référence à "ByModule" (Ex: StaticDataAcc1 => StaticDataByModule) puisqu'il sera généralisé
- Si le fichier n'a pas de acc1 dans son nom, il n'est pas nécessaire de le rename
- Les fichiers doivent aussi se faire déplacer/transfer à SimByModule dans le dossier correspondent
- Si c'est le cas, le dossier {allsims}/UI/SimByModule est créé pour la base de acc1
-
Dupliquer une simulation intérieure
- Si nécessaire, rendre la simulation original (copié) plus général afin de simplifier la nouvelle simulation.
-
-
- Avant de commencer, créer une branche au nom de la nouvelle simulation sur Git Extensions
- N'oublie pas de voir les informations supplémentaires à la fin de ce document pour certaines précisions
-
Sur unity:
- Faire une copie de GameSpecific/acc1 (Ex: acc2)
- Renommer toutes les instances de code lié à l'ancienne simulation (Incluant les noms de fichiers et les codes).
-
ATTENTION: Vérifier si les changement n'affecteront pas l'original, avant et après modifications
Un script nommé "renameFiles" est disponible pour renommer les noms de fichiers. {allsims}/node.js/utils/renameFiles.js
- Pour utiliser renameFiles, il faudra créer une copie temporaire dans le nouveau dossier
- Ajouter un launch.js temporaire avec les mêmes paramètres
- Puis modifier les paramètres suivant:
- Note 1: Le renameFiles est case sensitive pour find et replace, il se pourrait qu'il faudrait le faire plus d'une fois
- Note 2: Une fois les refactor des noms faits, il se peut que Unity ne pourra pas compiler. (Certains fichiers possèdent les mêmes noms)
- Pour régler ce problème, il faudra refactor avec Visual Studio chacun de ces fichiers ou refaire l'étape Rendre la simulation général.
- ATTENTION: Si vous voulez le faire manuellement, assurer vous de ne pas impacter le code originel (copié)
-
ATTENTION: Vérifier si les changement n'affecteront pas l'original, avant et après modifications
- Faire une copie de GameSpecific/acc1 (Ex: acc2)
-
Sur node.js:
- Faire une copie de {allsims}/node.js/backend/braincloud/server_scripts/acc1 (Ex: acc2)
- Comme à l'étape précédente, renommer toutes les instances de code lié à l'ancien script (Incluant les noms de fichiers et les codes).
-
ATTENTION: Vérifier si les changement n'affecteront pas l'original, avant et après modifications
Un script nommé "renameFiles" est disponible pour renommer les noms de fichiers. {allsims}/node.js/utils/renameFiles.js
- Pour utiliser renameFiles, il faudra modifier les paramètres suivant:
- Note 1: Le renameFiles est case sensitive pour find et replace, il se pourrait qu'il faudrait le faire plus d'une fois
-
ATTENTION: Vérifier si les changement n'affecteront pas l'original, avant et après modifications
- Faire une copie de {allsims}/node.js/backend/braincloud/server_scripts/acc1 (Ex: acc2)
Modification et ajout pour la nouvelle simulation
-
Ajouter tous les switch case:
- Faites un Ctrl + Shift + F ensuite "acc1" pour trouver toutes les instances de acc1
- Faites une copie de chaque case avec l'accronyme de votre nouvelle simulation.
- Par exemple :
- Par exemple :
- Note : Il ne sera pas nécessaire de faire de nouvelle fichier de traduction. En acc_X, le même fichier sera utilisé
-
Modifier la class static pour StaticDataByModule:
- Le fichier "StaticDataAccX" (Renommer par l'étape précédent), devra être modifier afin d'identifier le fichier
- Ajouter la class static à CreateStaticData dans Factory
- Le fichier "StaticDataAccX" (Renommer par l'étape précédent), devra être modifier afin d'identifier le fichier
-
Ajouter une nouvelle variante de MainControlStudentByModule et MainControlTeacherByModule:
- Si la copie de votre simulation ne contient pas de MainControlStudentAccX ou MainControlTeacherAccX, veuillez suivre les étapes suivantes, sinon passez cette étape
- Méthode 1: Faire une copie de MainControlStudentAcc1 et MainControlTeacherAcc1 dans la nouvelle simulation et le renommer en conséquent
- Si la copie de votre simulation ne contient pas de MainControlStudentAccX ou MainControlTeacherAccX, veuillez suivre les étapes suivantes, sinon passez cette étape
Situé à {allsims}/GameSpecific/acc1/Resources/Prefabs/UI
-
-
- Méthode 2: Créer une variante avec MainControlStudentByModule et MainControlTeacherByModule
-
Situé à {allsims}/UI/SimByModule/acc1/Resources/Prefabs/UI
-
-
-
- Clique droite, puis Create>Prefab Variant
- Déplacer le fichier au bons endroit et le renommer en conséquent
-
-
- Partie Doozy:
Situé à Resources>MainGraph
-
- Ajouter un nouveau output sur Login avec le nom approprié (Ex: acc2)
- Ajouter un nouveau node (clique droite) avec un nom approprié
- Dans ce node, ajoutez le AccXSubGraph
- Dans ce node, ajoutez le AccXSubGraph
- Connecter le output avec le nouveau node
- Si la duplication c'est bien terminé, il ne sera pas nécessaire de modifier AccXSubGraph
- Ajouter un nouveau output sur Login avec le nom approprié (Ex: acc2)
- Modifier les scènes accXTeacher et accXStudent :
Situé à GameSpecific/accX/Resources/Scenes
-
- Dans la section DecisionsPanel (Hierarchy), modifier le "Decisions Controls" pour votre simulation
- Dans la section DecisionsPanel (Hierarchy), modifier le "Decisions Controls" pour votre simulation
Modification des thèmes de la simulation
-
Remplacer les images de la nouvelle simulation avec le thème choisi :
- Écran titre : accX
- Écran de jeu : bg
- Note : Il serait peut-être intéressant de demander les images à l'équipe pour éviter des problèmes de choix esthétiques ou de design
Situé à GameSpecific/accX/Resources/images
-
- Pour modifier bg, il faudra allé sur la scène de la nouvelle simulation (accXTeacher et accXStudent, vous devriez le faire sur les deux scènes)
Situé à GameSpecific/accX/Resources/Scenes
-
-
- Dans MainView, modifier "Source Image"
- Dans MainView, modifier "Source Image"
-
-
Ajouter le titre dans LoginControl:
- Faire une copie de la simulation originel (copié) et le renommer
- Modifier le script LoginTitle dans le menu de l'inspecteur
- Ajouter dans le google sheet shared_text
- accX_theme_label (la couleur)
- accX_login_title (le titre principal, dans ce cas "Comptabilité X")
-
accX_login_subtitle (le nom de la nouvelle simulation)
- Dans AccXTitle>Title2
- Modifier le Text Uid pour accX_login_title
- Dans AccXTitle>Title3
- Modifier le Text Uid pour accX_login_subtitle
- Faire un importTextShared pour voir les changements
- Faire une copie de la simulation originel (copié) et le renommer
Situé à {allsims}/node.js/exports/importTextShared.bat
-
Modifier le thème de couleur de la simulation :
- Sur la scène de game, dans LoginBackgroundControl, ajouter le "Login Title" dans "Login Titles"
- Sur la scène de game, dans LoginBackgroundControl, ajouter le "Login Title" dans "Login Titles"
Le login title à ajouter devrait se trouver à GameSpecific/accX/Resources/AccXSkin
-
- Dans AccXSkin :
- Modifier le gameUid
- Modifier le thème de couleur
- Dans AccXSkin :
Google Sheet et StaticData
- Faire une copie du googleSheet sim_accounting_1 :
-
- Faire une copie du fichier
- Renommer le fichier (modifier le numéro)
- Modifier le fichier si nécessaire
- Note : Un fichier de base existe pour tous les simulations accounting
- Faire une copie du fichier
sim_byModule
-
Modifier les imports de fichiers :
- Il faudra alors updater {AllSimsRepository}/node.js/exports/exportAllData.js afin de pouvoir exporter les nouveaux document créer avec la structure suivante:
- Si nécessaire, modifier importAllDataGoogleSheet avec "withBaseV = true" pour import aussi la base (sim_byModule).
- Si nécessaire, modifier importAllDataGoogleSheet avec "withBaseV = true" pour import aussi la base (sim_byModule).
- Mettre la première partie de l'url (après "d/") du document sim_accounting_X
- Dans les autres plus specifiques (Ex : partners): Mettre le "gid" de l'url
- games.accX.tabs = obtenir les valeurs sur googleSheet
- games.accX.additionalData = les valeurs sont à l'extérieurs du googleSheet (se trouve directement sur Unity)
- Il faudra alors updater {AllSimsRepository}/node.js/exports/exportAllData.js afin de pouvoir exporter les nouveaux document créer avec la structure suivante:
-
Importer les fichiers sim_accounting_X pour la nouvelle simulation :
- À l'aide de la commande "Google Sheet - Import All" de node.js avec les valeurs appropriés
-
Exporter les fichiers sur Braincloud :
- À l'aide de la commande "Google Sheet - Export All Data" de node.js avec les valeurs appropriés (StaticData)
- À l'aide de la commande "Google Sheet - Export All Data" de node.js avec les valeurs appropriés (StaticDataChunk)
Information supplémentaire
- Note 1 : Les simulations en "accounting" ou "accX" sont tous mis dans une base nommé byModule (ex: braincloud>staticData, node.js>...>byModule_utils, UI>SimByModule, etc.)
- Note 2 : Certains/Plusieurs changements risquent de briser Unity. Il faudra alors faire un "Reimport All"
Modification de la valeur des stocks, PEPS
- Il y avait un problème dans la génération de différents prix pour les stocks. Ce problème se trouvait dans le acc1_utils_answer_key_module et le acc1_utils_create_bills, puisque le prix statique était utilisé et non le prix généré:
(acc1_utils_answer_key_module.js)
(acc1_utils_create_bills)
Bénéfices et pertes
- Le système de bénéfices et pertes dans les modules qui utilise l'état des résultats est basé sur un multiplicateur de prix comme qui suit:
Originalement, ce multiplicateur était basé sur une valeur de 0.6 en cas de perte, ce qui causait des problèmes. Il a été changé pour une valeur de 0.1 pour régler le problème:(dans acc1_utils_create_module_type_data.js)
Remise et remboursement de taxes
- La fonctionnalité de remise et de remboursement de taxes n'était pas fonctionnel. Pour l'implémenter on a commencé par modifier le dropdown existant (qui était basé sur pertes ou bénifices):
(le google sheet)
(les pages qui ont été modifié pour afficher le bon texte)
- Par la suite, nous sommes allé cherché du côté serveur l'option sélectionné dans le dropdown (comme pour bénéfices et pertes):
(acc1_utils.js)
(acc1_utils_create_module_type_data)
Procédure annuel pour updater les taxes (updated version 2026)
Note: La procédure assume que les liens utilisés resteront les mêmes et que la structure des fichiers PDF ne changera pas. Si les liens sont modifiés ou si la structure des PDF change, le script devra être ajusté en conséquence.
S.V.P Veuillez tout lire avant de faire la procédure
La mise à jour annuelle est maintenant automatisée avec le script :
node.js/exports/updateAnnualTaxData.js
Le script utilise les sources suivantes :
- CRA / ARC T4032 pour les tables fédérales et provinciales ON, NB, PE, QC
- Revenu Québec pour les tables provinciales QC, RRQ, RQAP
- CRA / Revenu Québec pour les taux CPP, EI, GST/HST, QST
Les sources et valeurs configurées sont dans :
node.js/exports/annualTaxSources.json
Comment ça fonctionne:
- Copier manuellement le Google Sheet income_taxes_<année précédente>.
- Renommer la copie en changeant l'année précédente par l'année en cours
- Copier l’ID du nouveau Google Sheet. ( L’ID est la partie dans l’URL entre /d/ et /edit.)
Exemple: https://docs.google.com/spreadsheets/d/190fSZq-r3K65Fb_g1D0oTQQZv5ijtIMjXvthD8MlhwM/edit - Lancer le self-test :
node exports/updateAnnualTaxData.js --year 2026 --templateYear 2025 --mode full --selfTest
Ce test vérifie :
- que les PDFs officiels sont accessibles
- que les tables sont parsées correctement
- que chaque table commence avec la ligne min_salary = 0
- que les salaires minimums sont en ordre croissant
- que les tables Québec sont mappées correctement (cas spécial)
- que les zéros sont exportés au bon format pour Google Sheets
- Lancer un dry run :
node exports/updateAnnualTaxData.js --year 2026 --templateYear 2025 --mode full --dryRun --incomeTaxesSpreadsheetId <SPREADSHEET_ID>
Le dry run ne modifie rien. Il affiche :
- les sources utilisées
- les fichiers qui seraient changés
- les onglets Google Sheets qui seraient modifiés
- les PDFs qui seraient uploadés
- les changements de taux entre l’année précédente et la nouvelle année
- Lancer l’export réel :
node exports/updateAnnualTaxData.js --year 2026 --templateYear 2025 --mode full --apply --incomeTaxesSpreadsheetId <SPREADSHEET_ID>
Utilisation Dans VS Code
Les configurations mentionnées ci-dessus existent dans .vscode/launch.json :
Annual Tax Export - Self Test
Annual Tax Export - Dry Run
Annual Tax Export - Run
Lors du lancement, VS Code demande :
-
taxYear: l’année à générer, ex. 2026 -
templateTaxYear: l’année précédente à utiliser comme modèle, ex. 2025 -
incomeTaxesSpreadsheetId: l’ID du Google Sheet copié manuellement -
annualTaxTargets: les destinations à mettre à jour -
setDefaultYear: si on veut changer l'année en cours ou non
Choix Des Destinations
Le script permet de relancer seulement une partie du processus avec --targets.
Options disponibles :
all
incomeTaxes
byModule
do
incomeTaxes,byModule
incomeTaxes,do
byModule,do
Signification :
incomeTaxes
Met à jour le Google Sheet copié income_taxes_<année> :
- écrit les onglets de tables d’impôt
- renomme les tabs de l’année précédente vers la nouvelle année
- met à jour exports/exportAllData.js avec le nouvel ID de sheet et les gids des tabs
byModule
Met à jour les colonnes de la nouvelle année dans le Google Sheet principal :
- taxes
- income_taxes
- employer_income_taxes
- interests
do
Upload les PDFs officiels dans DigitalOcean Spaces :
acc1/<année>/<theme>_<lang>
Fichiers Modifiés Par Le Script
Selon les targets choisis, le script peut modifier :
game/Assets/GameSpecific/byModule/Resources/data_byModule/income_tax_*_<année>.json
game/Assets/GameSpecific/byModule/Resources/data_byModule/taxes.json
game/Assets/GameSpecific/byModule/Resources/data_byModule/income_taxes.json
game/Assets/GameSpecific/byModule/Resources/data_byModule/employer_income_taxes.json
game/Assets/GameSpecific/byModule/Resources/data_byModule/interests.json
node.js/exports/exportAllData.js
Si --setDefaultYear est utilisé, il modifie aussi :
game/Assets/GameSpecific/byModule/Resources/data_byModule/act_settings.json
uniksimweb/uniksim-back-end/src/node.js/server/backend_braincloud.js
--setDefaultYear change l'année en cours utilisé dans la simulation.
Veuillez vous référer aux étapes ci-dessous si vous décider de ne pas changer l'année tout de suite.
- Modifier le champs year pour l'année par défaut voulu (
act_settings.json)
- Modifier l'année par défaut pour la création de sims démo (
backend_braincloud.js)
- Exporter les scripts acc1/acc2 et income_taxes_*
Finalement, il faut incrémenter la version dans version.txt et build pour que la nouvelle année en cours prenne effet.
Assets\Resources\data\version.txt
Diagramme qui montre comment le script fonctionne:
Bugfix Guide
Xavier courtemanche - bug de currection
Journal Général
Description du problème: les identifiants des factures sont données en odres d'apparitions des écritures dans le J.G. Le système detecte que la "bonne" écriture est la facture n. 188 puisque les comptes sont un match parfait avec ce que l'étudiant à écrit. Ce problème origine de l'erreur de l'étudiant (n'a pas écris le bon compte pour une écriture) et du fait que nous ne faisont pas multiples tentatives de trouvé la bonne facture associé à l'écriture.
Solution: Faire multiple tentatives d'associations.
Les montants ne sont pas bon aussi, ce qui peut être une autre cause du problème.
Description detaillé de la solution proposé
L'algo actuel se fait en une seul passe pour l'association des écritures avec factures (si la facture ne match pas parfaitement la facture indiqué par l'étudiant, prend la prochaine meilleur qui à un taux de match supérieur à 65%). Ce qui peut causé une double erreur puisqu'une écriture peut "voler" une bonne facture à une autre écriture

La solution que je propose afin de résoudre ce problème va comme suit (en pseudo code):
currentThreshold = 1
nextThreshold = 0
wantedExplanationBySectionUids = {}
listOfSectionUids = copyOf(tableData.sectionsIndex)
billUidRemainings = copyOf(billUids)
tant que listOfSectionUids est pas vide
for sectionUid of listOfSectionUids
for billUid of billUidRemainings (ce ne sera pas exactement représenté comme cela dans le code)
threshold = getMatchRate(sectionUid, billUid)
if (threshold == currentThreshold)
wantedExplanationBySectionUids[sectionUid] = billUid
listOfSectionUids.remove(sectionUids)
billUidRemainings.remove(billUid)
break billUidRemaining loop
nextThreshold = max(threshold, nextThreshold)
currentThreshold = nextThreshold
Ce pseudo-algorithme devrait réduire les cas d'erreurs.
Afin d'implémenté ce pseudo code une bonne partie du code restera parreil.
Outils pour programmeur
Dans le Google Drive, dans le folder Dev/Tools, il y a un liste d'outils qui peuvent être utile pour le programmeurs, en voici la liste:
- JSON_Toolkit, un petit programme qui permet de convertir du data de Javascript en JSON standard, faire des manipulations de base dans des fichiers JSON, sauvegarder des JSON et un diff tool avec plus de fonctions que ce qu'on peut normalement trouver en ligne.
Structure Serveur Acc1
Structure des Bills
Le système de Bills du serveur pour Acc1 a été refactor. Voici donc une page pour comprendre le nouveau système.
- L'ensemble du système de facturation repose désormais sur une architecture orientée pseudo-classes. On y retrouve plusieurs objets de type
Bill, chacun héritant de différentes sous-classes spécifiques.
ChaqueBillcontient un objetBillData, lui aussi décliné en plusieurs types selon le contexte.
Enfin, chaqueBillDatacontient une liste debillEntries, qui sont de simples objets sans classe propre.
Des diagrammes ci-dessous illustrent la structure détaillée de ces classes et leurs relations.
-
- Diagramme de classes des BillData:
- Diagramme de classes des Bills (Image trop grosse, aller sur lien et ensuite faire Ouvrir l'image dans un nouvel onglet): https://imgur.com/a/pvlDg3G
- Diagramme de séquence pour montrer la nouvelle logique de création des Bills (comme en haut aller sur le lien) : https://imgur.com/a/GRRVCdU
- Diagramme de classes des BillData:
Site Uniksim
Note uniksimWeb
Les versions utilisées sur le site :
- Node.js v.22.5.1
- Angular v.18.2.11 (FrontEnd)
- NestJs v.11.0.11 (BackEnd)
Angular / NodeJs compatibilité : Lien
|
Changer de version avec nvm (Node Version Manager) : Voir la liste sur nvm (Node Version Manager) : Voir les packages outdated : Mettre à jour les packages (classique) : Mettre à jour les packages (avec npm-check-updates) : |
|
Node version : Angular version : NestJs version : *npm-check-updates (backendEnd) :
Note : Le fichier package.json possède toutes les versions Note : Ne pas oublier de faire un |
Les imports importants NestJs :
- TypeOrmModule : Communication et conversion des données avec la mySql (Query)
-
DatabaseProviders : Connection avec mySql
- Guard : Authentification et accès
- MailGun : Système de messagerie
- Generate Password TS : Système de génération de mot de passe (mot de passe oublié)
Pour plus de détails voir : app.module.ts ou package.json
Les roles :
- user:
- Permission de jouer (Games uniquement)
- user_uniksim:
- Permission d'accès au site
- Permission de jouer
- admin_user:
- Permission d'accès au site
- Permission de jouer
- Permission avec accès limité à la page admin
- admin:
- Toute permission
*note: Il existe un role superAdmin, mais cela n'est pas vraiment utilisé...
DigitalOcean (Update branch) :
Si vous avez accès à DigitalOcean, vous pouvez faire des changements sur le site en version live* (Principalement pour des updates en Git)
*Ici "live" peut-être un site de développement avec un domain, pas forcément le vrai site
**n'oublie pas de builder vos channgements avant d'update! (frontend surtout)
- Dans la section, Droplets, puis le dossier du site en question
- Ensuite dans Console
- Vous devriez voir une console en linux pour faire les modifications
- Naviguer à travers les fichiers pour trouver le dossier recherché
- Note 1: Les commandes git se font généralement sur le fichier source (Dans ce cas sim.uniksim.com)
- Note 2: Durant un
npm installsur la console de Droplet, il faudrait ajouter--legacy-peer-depsà la fin. (la version de Droplet est plus récente)- Note 2.1: Un
npm audit fixpourrait être intéressant pour fix les soucis de package conflict. [Autre Solution Non recommandé] Pour être aussinpm audit fix --force, cependant ceci risque de brisser des packages.
- Note 2.1: Un
- Note 3: Il se peut que le dossier source root n'est pas le dossier recherché, puisque votre username de base de donnée (database) n'est pas le même.
- Faire la commande suivante si c'est le cas (forge fait référence au username, changer selon le cas)
-
su - forge
-
- Faire la commande suivante si c'est le cas (forge fait référence au username, changer selon le cas)
- Utiliser les commandes nécessaire à vos changements
- Remettre à l'état d'origine le dossier
-
git reset .
-
git reset --hard
-
git reset --hardrisque de nécessiterorigin/mastercomme paramètre
-
-
- Récupérer la branch commit
-
git pull
-
- Aller vers la branche
-
git checkout
-
- Voir l'état de la branche actuel
-
git status
-
- Similaire à reset, elle permet de retirer les dossiers non nécessaires
-
git clean -fd
-
- Remettre à l'état d'origine le dossier
- Faire
cd uniksim-back-end, puis fairenpm run buildpour appliquer les changements - (optionnel) Faire
npm run startpour lancer le site. *n'oublie de faire de même pour admin_server si nécessaire
Cookieyes :
Url : https://app.cookieyes.com/
Script url : https://cdn-cookieyes.com/client_data/b08568c123e8efb0b38c9ce6/script.js
Build :
- Pour les build, utiliser la commande Build Frontend project
- Si cela n'est pas possible, utiliser la commande ci-dessous dans un terminal (dans le dossier uniksimFrontEnd)
ng build
- Vous devriez avoir créer un build nommer Front dans le dossier uniksim-back-end
- Par la suite ServeStaticModule (Permet de rendre le build static et disponible pour le serveur) va pourvoir recréer ce dossier à l'intérieur de dist, lorsque le serveur sera en marche.
- Note: le fichier nest-cli.json est important pour importer tous les fichiers du dossier front généré. Spécifiquement la ligne :
{ "include": "front/**/*"} - Note: si vous changez unity build (ex: Build.data.unityweb), s'assurer de mettre la même version dans constantsVariable
Notes :
- Dans database.providers.ts, "synchronize" permet de faire en sorte que les entitées de node.js (typeOrm) sont créer ou modifier sur Sql. Il est donc préférable de le laisser false
- Si vous voulez augmenter la taille maximum pour le phpmyadmin suivre ce post:
https://stackoverflow.com/questions/3958615/import-file-size-limit-in-phpmyadmin
- La commande pour envoyer le serveur backend en local (il faut bien sûr "cd" dans le bon dossier) :
npm run start
- Version en live/demo :
npm run start:live
- Cette commande nécessite le build
npm run build
- Cette commande nécessite le build
- Version en live/demo :
-
- Celui du frontend est :
ng serve
- Celui du frontend est :
- Pour debug le code du frontend (Angular), il faudra utiliser l'inspecteur du navigateur (Dans source)
- Accès au SQL : https://db.uniksim.com/phpmyadmin/sql.php?server=1&db=uniksim&table=constants&pos=0
- La commande pour lancer admin_server (après su- forge) :
node sim.dev.uniksim.com/uniksim-back-end/src/node.js/server/admin_server.js
- Il est possible d'ajouter un paramètre :
node admin_server.js dev
- Il est possible d'ajouter un paramètre :
Problèmes :
- Si les modifications appliqués sur le dossier server ne sont pas appliqués, vous avez probablement compilé le script sur "dist/../"
- Si vous avez un problème de ENOENT: no such file or directory, scandir sur le serveur dev (sim.dev.uniksim), il y a probablement un problème de version dans les packages. Une solution serait de refaire les fichiers non tracés par git (supprimer et installer)
- Si vous avez cette erreur sur la console DigitalOcean
- Faite
sudo lsof -i :3000pour trouver le node en cours -
~hFHs>!SLx3)d4Yc_HbQsi nécessaire - Puis
kill -9 <PID>pour le terminer - Refaire votre commande
- Faite
Les références de création :
- Site de NestJs : https://docs.nestjs.com/first-steps
- Site de compatibilité de version Angular/Node : https://v17.angular.io/guide/versions
- Léger tread de discussion sur les version NestJs/Node : https://stackoverflow.com/questions/77160198/how-to-find-supported-node-js-version-for-nest-js
- Configuration de NestJs/MySQL (phpMyAdmin) : https://blog.stackademic.com/connecting-nestjs-to-mysql-a-step-by-step-guide-ab4086baf918
- Configuration de NestJs : https://medium.com/@anteprocess/%EF%B8%8Fnestjs-for-beginners-part-1-overview-and-project-setup-launch-33dc7d8071e9
- Imports of node.js (Javascript files) : https://medium.com/@eladk/moving-from-javascript-to-typescript-lifehacks-e29d7e1aa3e0
- Decoration pour les expressions Sql : https://typeorm.io/decorator-reference#column-decorators
- Typeorm wiki (NestJs/Sql data communication) : https://orkhan.gitbook.io/typeorm/docs/find-options
- Debugger for NestJs : https://dev.to/gentax/nestjs-right-settings-for-debugging-kl0
- bCrypt détailes post : https://stackoverflow.com/questions/15733196/where-2x-prefix-are-used-in-bcrypt/36225192#36225192
- TypeOrm relations (Many-to-one / one-to-many): https://github.com/typeorm/typeorm/blob/master/docs/many-to-one-one-to-many-relations.md
- Simple Unity/Angular intégration : https://medium.com/@6386391ritesh/unity-webgl-in-angular-686397677500
- Build le projet Angular à l'intérieur de Nestjs : https://medium.com/codeshake/deploy-an-angular-nestjs-app-to-heroku-807a2833d88c
- SSE notification : https://medium.com/@andrewkoliaka/implementing-server-sent-events-in-angular-a5e40617cb78
- Erreur commun pour nvm lorsqu'il refuse de changer de version : https://stackoverflow.com/questions/47017812/nvm-use-does-not-switch-node-versions
Update/Deploy dans Angular (old)
Faire un déployement sur Angular pour Admin (old)
Tous les étapes se font sur Visual Studio Code
1) Se déplacer au bon dossier :
-
- Avec la command suivante
cd {uniksim}/frontend/angular
2) Build Angular :
-
- Avec la command suivante
ng build
3) Modifier le angular.blade.php :
Situé à {uniksim}/resources/views/angular.blade.php
-
- Remplacer les balises html, head et base
- Remplacer les balises html, head et base
|
@extends('layouts.app') @section('title') @section('applink') @stop @section('content') |
-
- Remplacer les balises body et html
- Remplacer les balises body et html
|
@endsection |
-
- Retirer la balise ouvrante body et la balise fermante head
Debug en Web frontEnd
Avant de commencer assurer vous d'être en localhost:4200 (à moins qu'il a était changé), car :
- localhost:4200 utilise le dossier frontEnd et backEnd (source)
- localhost:3000 utilise uniquement le backEnd (source) et la version build du frontEnd
De plus, ce tutoriel va modifier la connexion à titre d'exemple
- Activer le site sous Launch Frontend and Backend (dev)
- Vérifier que tout soit en marche :
- Sur le frontEnd vous devriez avoir
- Sur le backend vous devriez avoir (les messages peuvent varier d'ordre)
- Sur le frontEnd vous devriez avoir
-
Ouvrir une session localhost:4200 web - Sous Sources>Page>webpack://>login>login.component.ts
- Mettre des points d'arrêts sur la requête attendu
- Envoyer la requête, vous devriez commencé à débugger
Note: Tous les changements sont sauvegarder automatiquement sur le site local. Si vous avez un doute, faite un changement et sauvegarder. La page devrait se rafraîchir tout seul (s'il n'est pas en debuggeur actuellement). Cependant, le backend est indépendant du frontEnd, donc il faudrait attendre quelque seconde avant d'envoyer la requête (regarder la console pour voir l'état)
Test de fonctionnalité complète
*note: Les tests ci-dessous sont déjà dans un ordre pour simplifier les tests. Cependant, beaucoup de déconnexions seront requises
Fonctionnalité - Cas d'utilisateur normal
Register :Vérifier que le bouton Créer un compte enseignant fonctionne, suite aux étapes de création
Vérifier aussi les cas d'échecs
Ceci devrait créer un token (dans LocalStorage)
*note: Si ceci est fait sur le site Live ou Dev, veuillez l'ajouter sur Compte test - Création de compte (Se trouvant sur le Wiki) et les supprimer par la suite serait pertinent |
|
L'ajout de produit :Vérifier que l'ajout de code d'activation fonctionne bien. Ceci devrait ajouter un ou des produits sur la liste en conséquence
Vérifier aussi les cas d'échecs
*note: Un test de ressources et de simulation démo seront vu ci-dessous. Ajouter un produit enseignant à cet étape serait pratique pour vous |
|
Jouer à la simulation :Vérifier que les produits fonctionnent bien en cliquant dessus. Ceci inclus:
Ceci devrait Créer un token (dans Cookies) lors de l'ouverture, puis il devrait supprimer le token (dans Cookies) lorsqu'il appuie sur Sauvegarder et quitter
*note: Le bouton Sauvegarder et quitter ferme votre connexion
**note: Il n'est pas nécessaire d'approfondir l'utilisation de la simulation. Juste pouvoir l'ouvrir est suffisant. Quelques fonctionnalités seront testées avec le rôle en True Admin plus bas |
|
La liste des produits :Vérifier que tous les produits sont bien présents. Faites particulièrement attention à l'ajout de Démo |
|
L'affichage des ressources :Vérifier que le bouton Ressources fonctionne et que ses liens fonctionnent aussi
Vérifier également les options offertes :
|
|
Les liens externes :Vérifier que tous les liens en bas de page se dirigent bien sur les informations pertinentes |
|
Bouton d'accueil :Vérifier que le bouton Uniksim essaie, joue, apprends se dirige vers l'accueil des produits |
|
Vérifier que tous les options sont présents :Vérifier que les options sont actives pour un utilisateur régulier: Mes Simulations et Se déconnecter |
|
Changement de language :Vérifier que l'option de changement de langue fonctionne bien
Ceci devrait aussi garder la même langue après une déconnexion et un reconnexion |
|
SignOff :Vérifier que le bouton Se déconnecter se dirige bien vers la page d'accueil
Ceci devrait supprimer le token (dans LocalStorage) |
|
Page Mot de passe oublié :Vérifier que le changement de mot de passe fonctionne bien
*note: Un email valide sera requis |
|
SignIn :Vérifier que le bouton pour Se connecter à l'accueil du site se dirige bien à la page produit (Require: Courriel et Mot de pass)
Vérifier aussi les cas d'échecs
Ceci devrait créer un token (dans LocalStorage) |
|
SignIn (chenLogin) :Vérifier que l'ajout du lien chenLogin va directement dans une simulation
ceci requiert un compte i+ et de pouvoir avoir un moyen de copier le lien (Cependant si vous êtes assez rapide, vous pouvez récupérer le lien directement en copiant/collant le lien 🐻)
*uniquement la partie du code d'activation est intéressante
exemple de code d'activation: chenlogin?expiration=1749565644&isbn=N782765065364&userEmail=uniksim@gmail.com&userFirstName=Nicolas&userLastName=Babin&expirationLicence=2043-08-31&token=d29ca9f591d017fe4e9eba7c3de9318430603d7bee7e78022e1f0a77c1404a7f |
|
Les boutons de retour :Vérifier que tous les boutons de retour de la page d'accueil fonctionnent bel et bien |
|
Les cookies :Vérifier que les cookies (provenant de cookieYes) fonctionnent bel et bien |
|
Fonctionnalité - Cas d'utilisateur admin
Compte déjà existant
Courriel: comptetestadmin01@gmail.com
Mot de passe: E4Vx<52
Autre
Web (admin_user) | user : 31957
*note: Ce compte test uniquement le cas de Uqam
Le rôle de l'utilisateur :Vérifier que le rôle est affiché en bleu sur le nom de l'utilisateur |
|
Vérifier que tous les options sont présents :Vérifier que les options sont actives pour un utilisateur admin: Mes Simulations, Admin et Se déconnecter |
|
La page admin :Vérifier que seulement une partie de la page admin est affichée. Ceci inclus:
|
|
La page admin (filtre) :Vérifier que tous les filtres fonctionnes |
|
Changement de language :Vérifier que l'option de changement de langue fonctionne bien
Ceci devrait aussi garder la même langue après une déconnexion et un reconnexion |
|
Fonctionnalité - Cas d'utilisateur true admin
Le rôle de l'utilisateur :Vérifier que le rôle est affiché en orange sur le nom de l'utilisateur |
|
La désactivation de produit :Vérifier que la suppression de produit sous
Ceci devrait uniquement rendre le produit non actif |
|
La page admin :Vérifier que tous les options sont disponible. Cela inlus :
|
|
La page user :Vérifier que tous les informations sont présentés. Cela peut inclure :
Vérifier aussi les cas d'échecs (si possible)
*note: Il est nécessaire de tester ce cas sur plusieurs utilisateurs différents, car ils ont chacun des cas distincts
Requis: Brainlcloud |
|
La page user (Tous les teams étudiants) :Vérifier que l'élément est bien chargé après un clic
Vérifier aussi les cas d'échecs (si possible)
Requis: Brainlcloud |
|
La page user (Options) :Vérifier que le copySim fonctionne bien sur différents cas
Vérifier aussi les cas d'échecs (si possible)
Requis: Brainlcloud |
|
Jouer à la simulation :Vérifier que les simulations sont disponibles pour être lancées sur différentes Braincloud. Ceci inclus :
*note: Il n'est pas nécessaire d'approfondir l'utilisation du jeu. Juste pouvoir l'ouvrir est suffisant. |
|
La page commentaire :Vérifier que le filtre et les informations sont disponibles
Vérifier aussi les cas d'échecs (si possible)
Requis: Brainlcloud |
|
La page actives :Vérifier que le filtre et les informations sont disponibles
Vérifier aussi les cas d'échecs (si possible)
Requis: Brainlcloud |
|
La page paramètre :Vérifier l'ajout d'un nouveau code produit. (Préférablement un code professeur)
*Cela inclut l'activation du produit
*note: Chaque ajout de code de produit se fait immédiatement créer sur le SQL. Veuillez créer des codes avec modération pour ne pas surcharger le SQL de code produit.
|
|
Options de changement de serveur :Vérifier que le changement de serveur Braincloud se fait bien. Pour cela, il sera nécessaire de refaire toutes les étapes qui requièrent Brainlcloud
Ceci devrait créer un currentBraincloud (dans LocalStorage)
*note: Certaines données ne pourront pas être disponibles, puisque l'affichage de la liste est selon la base de données de Live |
|
Fonctionnalité - Cas d'utilisateur true admin (Unity)
Il faudra se connecter en tant qu'un utilisateur Alpha
Téléchargement Excel :Vérifier que le téléchargement d'Excel fonctionne bien
*note: Les données peuvent ne pas s'afficher directement. Activer les modifications |
|
Classement détaillé :Vérifier que l'onglet Classement détaillé fonctionne bien sur toutes les sélections
*note: Il serait nécessaire de vérifier sur plusieurs simulations si certaines données ne sont pas disponibles |
|
Téléchargement PDF :Vérifier que le téléchargement de PDF fonctionne bien
*note: Il serait recommandé de vérifier sur plusieurs pièces justificatives |
|
Compte test - Création de compte
Liste de tous les comptes créé pour tester la création de compte
|
|
Password |
| test1234@gmail.com | `J8,1r6f5z`\ |
| test123@gmail.com | |
| test546.uniksim@gmail.com | 9*H0wi}N5Mh9 |
| test123456@gmail.com | 9*H0wi}N5Mh9 |
| test12345@test.com | |
| ll.uniksim.test987@gmail.com | 8q7Z34sw3[]j |
| test555@test.com | @d*44V$"u:94 |
| fahira8491@2insp.com | vm9fuZvk5GML9aH3bbmT |
| UrsusTempMailToTest123456@account.xn--yaho-sqa.com | @testpasword |
Local database (PHPMyAdmin) - Conflict
Local database (PHPMyAdmin) - Conflict
- Si vous avez une erreur comme ci-dessous avec XAMPP, suivez les fixs de cette vidéo : https://www.youtube.com/watch?v=OEUVth2Av48 (Généralement, le dossier backup fix l'erreur "0:41")
- Si vous avez cette erreur en utilisant XAMPP :
- Faire une suppression de toute Cookies et de LocalStorage
- Si vous ne trouvez pas l'option drop database
- Suivre les méthode de ce lien : https://stackoverflow.com/questions/4410630/phpmyadmin-enable-drop-database-statement
- En bref: Ajouter
$cfg['AllowUserDropDatabase'] = true;dans phpMyAdmin(config.inc.php) sous XAMPP (Ceci se trouve dans Apache>Config)
- En bref: Ajouter
- Suivre les méthode de ce lien : https://stackoverflow.com/questions/4410630/phpmyadmin-enable-drop-database-statement
Build Unity en local
Note:
Avant de commencer, vérifiez que votre Unity est bien mis en place (aucun crash, aucune erreur, stable, etc.) puisque le Build prend du temps (en moyenne 5-7 minutes, dépendamment de l'ordinateur).
Ignorer cette étape si votre ordinateur fait partie des top 1 pour build 🚀
Unity:
- Avec les touches
CTRL + SHIFT + B, vous devez avoir les paramètres suivants sur Unity - Regarder la version de votre Unity dans le fichier
version.txt(situé à "Assets/Ressources/data/version.txt"). -
Changer la version du build dans la version locale du backend en web (Dans le fichier
constantsVariable.js).- Changer :
LOCAL_WEBGL_VERSION: {votre version}
- Changer :
-
Changer la version du build dans la version locale du database (Situé dans constants)
- Une fois le build de Unity terminé, mettre les fichiers du build dans le frontend (Dans le dossier
uniksimFrontEnd\src\assets\unity\Build)- Il est important que les fichiers soit les mêmes (Type et nom)
-
Il est aussi possible de modifier les fichiers du backend directement dans front, mais il n'est pas recommandé de le faire sachant qu'un build du frontend écrasera le build et que les versions seront erronées.
- Faire un build du frontend
- Tester 🥳
Erreurs courantes:
- Si vous avez :
-
Une des versions de votre build (en backend ou en database) ne correspond pas. Veuillez revoir les étapes 3 et 4.
-
Diagrammes
Sommation Excel
Structure d'un input avec le nouveau système de formule.
Flow de l'ajout d'une formule pour un input ciblé

