Skip to content

Commit

Permalink
Merge branch 'feature/5-estimates' into 'develop'
Browse files Browse the repository at this point in the history
Ajoute la gestion des devis (#5)
  • Loading branch information
polosson authored Apr 21, 2021
2 parents b1416dc + 6cf08cf commit eff94bd
Show file tree
Hide file tree
Showing 49 changed files with 3,478 additions and 757 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ Tous les changements notables sur le projet sont documentés dans ce fichier.

Ce projet adhère au principe du [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## 0.13.0 (UNRELEASED)

- Ajoute la création / suppression de devis pour les événements (#5).

## 0.12.0 (2021-03-29)

- Améliore le calcul du matériel restant dans les événements.
Expand Down
55 changes: 39 additions & 16 deletions CONTRIBUTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ doivent donc être rédigés en français uniquement.

Le code, lui, à l'exception des commentaires, doit être exclusivement en anglais, pas de variable ou de nom de migration en français.

Attention ⚠️ , cela ne veut pas dire que Robert n'est pas traduit : Robert2 est aussi disponible en anglais et doit continuer à l'être.
Attention ⚠️, cela ne veut pas dire que Robert n'est pas traduit : Robert2 est aussi disponible en anglais et doit continuer à l'être.
Merci donc de bien vouloir prendre en compte le fait que chaque texte affiché dans l'interface de Robert doit pouvoir être traduit et si possible,
veuillez spécifier les traductions anglaises de vos ajouts en français dans vos pull requests.

Expand Down Expand Up @@ -118,35 +118,57 @@ composer rollback # Annule la dernière migration exécutée sur votre b

## Tests unitaires

Nous utilisons __Jest__ pour les tests unitaires côté front et __PHPUnit__ pour les tests unitaires côté back.
Nous utilisons __Jest__ pour les tests unitaires côté front. Il n'y a pas de pre-requis, il suffit
de les lancer comme ceci :

Pour pouvoir lancer les tests de la partie client, il n'y a pas de pre-requis, par contre pour les tests back,
vous aurez besoin d'une base de données dédiée aux tests, nommée de la même manière que votre base de données
Robert2, mais suffixée avec `_test` (exemple : `robert2_test`).
```bash
# - Se placer dans le dossier client/
cd client

# - Lancer tous les tests
yarn test

# - Ou bien, en mode watch
yarn test --watch
```

Une fois les indications ci-dessus suivis, exécutez les tests via :
Pour les tests unitaires côté back, nous utilisons __PHPUnit__. Pour ceux-ci, vous aurez besoin d'une
base de données dédiée aux tests, nommée de la même manière que votre base de données Robert2, mais
suffixée avec `_test` (par ex : `robert2_test`). Ensuite, vous pouvez exécuter les tests via :

```bash
# - Pour la partie client
yarn test [--watch]
# - Se placer dans le dossier server/
cd server

# - Pour la partie serveur
# - Lancer tous les tests
composer test

# - Pour ne lancer qu'une testSuite à la fois :
composer testapi Test # - testSuite des contrôleurs
composer testmodels Test # - testSuite des modèles
composer testlibs Test # - testSuite des libs
composer testother Test # - testSuite des "autres" (fonctions, config, install...)

# - On peut aussi ne lancer qu'un seul fichier de test en particulier, par ex. :
composer testmodels EventTest # - Lance les tests du fichier tests/models/EventTest.php
```

### Qu'est-ce que l'on teste ?

Côté back, des tests unitaires doivent être mis en place au moins pour tous les modèles, les routes d'API
ainsi que pour les fonctions et classes utilitaires.
ainsi que pour les fonctions et classes utilitaires.

Côté front, tous les utilitaires doivent être testés.

N'hésitez pas, bien sûr, à tester aussi des parties du code qui ne sont pas spécifiées ci-dessus, plus il y a de test, mieux c'est !
N'hésitez pas, bien sûr, à tester aussi des parties du code qui ne sont pas spécifiées ci-dessus,
plus il y a de test, mieux c'est !

## Linting

Le projet suit des règles strictes de linting (avec PHPCS pour la partie back et ESLint pour la partie Front).
Un fichier `.editorconfig` existe à la racine du projet pour permettre aux IDE d'automatiser la présentation de base du code.
Le projet suit des règles strictes de linting (avec PHPCS pour le back et ESLint pour le Front).
Un fichier `.editorconfig` existe à la racine du projet pour permettre aux IDE d'automatiser la
présentation de base du code (voir [editorconfig.org](https://editorconfig.org/), ainsi que
[l'extension VSCode](https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig) dédiée).

Vous avez la possibilité de vérifier que votre code respecte bien ces conventions via :

Expand Down Expand Up @@ -209,15 +231,16 @@ composer lint
│   └── views # - Dossier contenant les vues Twig de l'application.
│   │   ├── blocks # - Les blocks communs, comme le loading, etc.
│   │   ├── install # - Toutes les pages de l'assistant d'installation
│   │   ── pdf # - Les vues des sorties PDF (factures, fiches d'événement, etc.)
│   │   ── webclient.twig # - Point d'entrée de l'application Robert2 (front-end)
│   │   ── pdf # - Les vues des sorties PDF (factures, fiches d'événement, etc.)
│   │   ── webclient.twig # - Point d'entrée de l'application Robert2 (front-end)
│   │   └── install.twig # - Point d'entrée de l'assistant d'installation
── tests
── tests
│   ├── endpoints # - Tests unitaires (PHPUnit) des controllers.
│   ├── Fixtures
│   │   ├── files # - Fichiers associés aux données (voir server/data) à utiliser pour les fixtures.
│   │   ├── seed # - Données utilisées pour les tables de la DB de test, au format JSON.
│   │   └── tmp # - Dossier utilisé pour stocker la structure SQL (créée à la volée) de la DB de test, pour reset.
│   ├── libs # - Tests unitaires (PHPUnit) des libs.
│   ├── models # - Tests unitaires (PHPUnit) des modèles.
│   └── other # - Tests unitaires (PHPUnit) des fonctions utilitaires et autres classes.
```
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
.BillEstimateCreationForm {
&__discount-input .FormField__input {
max-width: 90px;
}

&__discount-target-input .FormField__input {
max-width: 110px;
}

&__beneficiary {
display: flex;
flex-direction: column;
margin-top: $content-padding-small-vertical;

&__label {
display: block;
padding: 5px 0;
}
}

&__save {
margin-top: $content-padding-large-vertical;
}

@media(min-width: $screen-tablet) {
&__beneficiary {
flex-direction: row;
align-items: center;
height: 2.5rem;

&__label {
flex: 0 0 $form-label-width;
padding: 0 $input-padding-horizontal;
text-align: right;
}

&__name {
flex: 1;
}
}

&__save {
margin-top: $content-padding-small-vertical;
padding-left: $form-label-width;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
<template>
<form
class="Form BillEstimateCreationForm"
@submit="handleSubmit"
>
<div class="Form__fieldset">
<h4 class="Form__fieldset__title">{{ $t('discount') }}</h4>
<FormField
:value="discountRate"
class="BillEstimateCreationForm__discount-input"
name="discountRate"
type="number"
:step="0.0001"
:min="0.0"
:max="99.9999"
addon="%"
label="wanted-rate"
@change="handleChangeRate"
:disabled="loading"
/>
<FormField
:value="discountTarget"
class="BillEstimateCreationForm__discount-target-input"
name="discountTarget"
type="number"
:step="0.01"
:min="0"
:max="maxAmount"
:addon="currency"
label="wanted-amount"
@change="handleChangeAmount"
:disabled="loading"
/>
<div class="BillEstimateCreationForm__beneficiary">
<div class="BillEstimateCreationForm__beneficiary__label">
{{ $t('beneficiary') }}
</div>
<div class="BillEstimateCreationForm__beneficiary__name">
<router-link
:to="`/beneficiaries/${beneficiary.id}`"
:title="$t('action-edit')"
>
{{ beneficiary.full_name }}
</router-link>
</div>
</div>
</div>
<div class="BillEstimateCreationForm__save">
<button class="success" type="submit" :disabled="loading">
<i v-if="loading" class="fas fa-circle-notch fa-spin" />
<i v-else class="fas fa-plus" />
{{ saveLabel }}
</button>
<button v-if="isRegeneration" @click="$emit('cancel')" type="button" :disabled="loading">
{{ $t('cancel') }}
</button>
</div>
</form>
</template>

<style lang="scss">
@import '../../themes/default/index';
@import './BillEstimateCreationForm';
</style>

<script src="./index.js"></script>
35 changes: 35 additions & 0 deletions client/src/components/BillEstimateCreationForm/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import Config from '@/config/globalConfig';
import FormField from '@/components/FormField/FormField.vue';

export default {
name: 'BillEstimateCreationForm',
components: { FormField },
props: {
discountRate: Number,
discountTarget: Number,
maxAmount: Number,
beneficiary: Object,
saveLabel: String,
isRegeneration: Boolean,
loading: Boolean,
},
data() {
return {
currency: Config.currency.symbol,
};
},
methods: {
handleChangeRate(value) {
this.$emit('change', { field: 'rate', value: Number.parseFloat(value) });
},

handleChangeAmount(value) {
this.$emit('change', { field: 'amount', value: Number.parseFloat(value) });
},

handleSubmit(e) {
e.preventDefault();
this.$emit('submit');
},
},
};
109 changes: 29 additions & 80 deletions client/src/components/EventBilling/EventBilling.scss
Original file line number Diff line number Diff line change
@@ -1,93 +1,42 @@
.EventBilling {
&__last-bill {
margin-bottom: $content-padding-large-vertical;
margin-bottom: $content-padding-large-vertical;

&__no-bill,
&__regenerate__text {
margin: 0 0 .5rem;
color: $text-light-color;
font-style: italic;
margin-bottom: $content-padding-large-vertical;
}

&__not-billable {
color: $text-danger-color;

&__text {
margin: 0;
font-style: italic;
}
}

&__discount-input .FormField__input {
max-width: 90px;
}

&__discount-target-input .FormField__input {
max-width: 110px;
}

&__beneficiary {
display: flex;
flex-direction: column;
margin-top: $content-padding-small-vertical;

&__label {
display: block;
padding: 5px 0;
}
}

&__save {
margin-top: 1.2rem;
}
&__no-bill,
&__regenerate__text {
margin: 0 0 $content-padding-large-horizontal;
color: $text-light-color;
font-style: italic;
}

&__download {
font-size: 1.1rem;
margin-bottom: 1rem;
&__no-estimate {
margin: 0 0 $content-padding-large-horizontal;
color: $text-warning-color;
font-size: 1.1rem;
}

&__text {
margin: 0 0 .5rem;
}
&__not-billable {
color: $text-danger-color;

&__link {
display: inline-block;
margin-top: .5rem;
padding: 1rem 1rem 1rem .5rem;
border: 1px solid;
border-radius: $input-border-radius;
}
}

.fas {
width: 1.5rem;
margin-right: .5rem;
text-align: center;
&__text {
margin: 0;
font-style: italic;
}
}

@media(min-width: $screen-tablet) {
&__last-bill {
&__beneficiary {
flex-direction: row;
align-items: center;
height: 2.5rem;

&__label {
flex: 0 0 $form-label-width;
padding: 0 $input-padding-horizontal;
text-align: right;
}
&__download {
font-size: 1.1rem;
margin-bottom: 1rem;

&__name {
flex: 1;
}
}
&__text {
margin: 0 0 .5rem;
}

&__save {
margin-top: 1rem;
padding-left: $form-label-width;
}
&__link {
display: inline-block;
margin-top: .5rem;
padding: 1rem 1rem 1rem .5rem;
border: 1px solid;
border-radius: $input-border-radius;
}
}
}
Loading

0 comments on commit eff94bd

Please sign in to comment.