Commit e6d936db by Julien Jorry

DEV V1.1

- #145 - Pouvoir gérer plusieurs prestataires, groupes ou comptoirs
- #107 - A l'installation - rajout
- #104 - Modification du centre de la carte des prestataires/comptoirs possible via l'administration
- #113 - Améliorer la géolocalisation - avec le service de géoloc
- #110 - utilisateur avec plusieurs rôles - améliorer l'identification liés aux actions
- #130 - Exports filtrés de mails
- #120 - Prestataires et adhérents : Solde en billet à enlever
+ amélioration administration : filtres + corrections diverses flux
+ droits suivant rôle
+ ajout d'un hash pour vérifier l'intégrité d'un flux
+ ajout du role utilisé par l'utilisateur lors de l'ajout d'un flux
+ différentes corrections de typo
+ manuel d'installation mis à jour
parent c19beb4d
......@@ -11,6 +11,14 @@
border-right: 1px solid #eee;
}
.inputsuccess {
border: 1px solid #28B62C !important;
}
.inputerror {
border: 1px solid #FF4136 !important;
}
.card {
position: relative;
display: -webkit-box;
......@@ -2093,4 +2101,26 @@
}
.main-header .sidebar-toggle:before {
content: '' !important;
}
.flash-messages .alert {
width: 200px;
background-color: black;
background-color: rgba(30, 30, 30, 0.9);
text-shadow: 1px 1px black;
color: #eee;
padding-left: 65px;
box-shadow: 4px 3px 15px rgba(0,0,0,0.9);
border: 0;
background-repeat: no-repeat;
background-position: 15px 50%;
display: none;
z-index: 1000;
}
.flash-messages .alert .close {
color: white;
color: rgba(255, 255, 255, 0.8);
text-shadow: 0 1px 0 #000;
opacity: 1;
}
\ No newline at end of file
/**
* STYLES IMPORTES DE BOOTSTRAP
* STYLES IMPORTES DE BOOTSTRAP ET BOOTSWATCH
*
* @import "~bootswatch/dist/[theme]/variables";
* @import "~bootswatch/dist/[theme]/bootswatch";
*
* Remplacer [theme] par un des thèmes possibles :
* cerulean, cosmo, cyborg, darkly, flatly, journal, litera, lumen, lux, materia, minty, pulse, sandstone, simplex, sketchy, slate, solar, spacelab, superhero, united, yeti
*/
@import "~bootswatch/dist/lumen/variables";
@import "~bootstrap/scss/bootstrap";
......
......@@ -9,5 +9,84 @@
require('../css/admin.css');
require('bootstrap');
require('../js/flash-messages.js');
require('../leaflet/leaflet.js');
// require('../leaflet/leaflet.css');
// Need jQuery? Install it with "yarn add jquery", then uncomment to require it.
$('#flash-messages').flashNotification('init');
\ No newline at end of file
$('#flash-messages').flashNotification('init');
$(document).ready(function() {
var mapMarkers = [];
$('.searchLatLon').on('click', function (e) {
e.preventDefault();
var self = $(this);
$.ajax({
url : self.data('url'),
type: 'post',
data : {'adresse' : $('#'+(self.attr('id').replace('_geoloc_search', ''))+'_geoloc_adresse').val(), 'cpostal' : $('#'+(self.attr('id').replace('_geoloc_search', ''))+'_geoloc_cpostal').val(), 'ville' : $('#'+(self.attr('id').replace('_geoloc_search', ''))+'_geoloc_ville').val()},
success: function(response) {
var divid = self.attr('id').replace('_geoloc_search', '');
$('#'+divid+'_message').remove();
$('#'+divid+'_map').remove();
var marker_1 = null;
if(response.status == 'success' && response.data && response.data.lat != '' && response.data.lon != '') {
$('#'+divid+'_geoloc_lat').val(response.data.lat);
$('#'+divid+'_geoloc_lon').val(response.data.lon);
$('#'+divid+'_geoloc_lat').addClass('inputsuccess');
$('#'+divid+'_geoloc_lon').addClass('inputsuccess');
$('<p id="'+(divid+'_message')+'">Cliquez sur la carte si vous voulez affiner la géolocalisation</p><div id="'+(divid+'_map')+'" style="height: 250px;margin-top: 10px;"></div>').insertAfter('#'+self.attr('id'));
var latlon = L.latLng(parseFloat(response.data.lat), parseFloat(response.data.lon));
var mymap = L.map(divid+'_map').setView(latlon, 13);
L.tileLayer('https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', {maxZoom: 18, attribution: '&copy; Openstreetmap France | &copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'}).addTo(mymap);
var marker_1 = L.marker(latlon).addTo(mymap);
} else {
$(this).addClass('inputerror');
$('<p id="'+(divid+'_message')+'">ADRESSE INCONNUE : Cliquez sur la carte pour définir une adresse</p><div id="'+(divid+'_map')+'" style="height: 250px;margin-top: 10px;"></div>').insertAfter('#'+self.attr('id'));
var mymap = L.map(divid+'_map').setView(JSON.parse($('#koh_map_center').val()), parseInt($('#koh_map_zoom').val()));
L.tileLayer('https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', {maxZoom: 18, attribution: '&copy; Openstreetmap France | &copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'}).addTo(mymap);
}
mymap.on('click', function(e){
if (marker_1 != null) {
mymap.removeLayer(marker_1);
}
for(var i = 0; i < mapMarkers.length; i++){
mymap.removeLayer(mapMarkers[i]);
}
// Add marker to map at click location; add popup window
var newMarker = new L.marker(e.latlng);
newMarker.addTo(mymap);
mapMarkers.push(newMarker);
$('#'+divid+'_geoloc_lat').val(e.latlng.lat);
$('#'+divid+'_geoloc_lon').val(e.latlng.lng);
$('#'+divid+'_geoloc_lat').addClass('inputsuccess');
$('#'+divid+'_geoloc_lon').addClass('inputsuccess');
});
}
});
});
$('.editableboolean').on('click', function (e) {
e.preventDefault();
var self = $(this);
$.ajax({
url : self.data('url'),
type: 'post',
data : {'value' : (self.data('value') == 'true')},
success: function(data) {
if(data.status == 'success' && !data.messages) {
if (data.newvalue == 'false') {
self.text('non');
self.data('value', 'false');
self.addClass(' ');
self.removeClass('label-success');
} else {
self.data('value', 'true');
self.text('oui');
self.removeClass('label-danger');
self.addClass('label-success');
}
} else {
// $(this).addClass('error');
}
}
});
});
});
\ No newline at end of file
......@@ -6,6 +6,7 @@
"ext-ctype": "*",
"ext-iconv": "*",
"api-platform/api-pack": "^1.2",
"doctrine/annotations": "^1.8",
"friendsofsymfony/rest-bundle": "^2.4",
"friendsofsymfony/user-bundle": "^2.1",
"geocoder-php/cache-provider": "^4.1",
......@@ -48,7 +49,7 @@
"symfony/twig-bundle": "4.3.*",
"symfony/validator": "4.3.*",
"symfony/web-link": "4.3.*",
"symfony/webpack-encore-bundle": "^1.0",
"symfony/webpack-encore-bundle": "^1.7",
"symfony/yaml": "4.3.*",
"vich/uploader-bundle": "^1.8",
"willdurand/geocoder-bundle": "^5.0"
......
......@@ -6,6 +6,8 @@ twig:
fos_ck_editor:
default_config: default
base_path: "build/ckeditor"
js_path: "build/ckeditor/ckeditor.js"
configs:
default:
language: fr
......
......@@ -3,6 +3,7 @@ framework:
secret: '%env(APP_SECRET)%'
#default_locale: en
csrf_protection: true
validation: { enabled: true }
#http_method_override: true
# Enables session support. Note that the session will ONLY be started if you read or write from it.
......
......@@ -5,7 +5,7 @@ sonata_user:
user: App\Entity\User
group: App\Entity\Usergroup
profile:
default_avatar: 'images/admin/default_avatar.png' # Default avatar displayed if the user doesn't have one
default_avatar: 'bundles/sonatauser/default_avatar.png' # Default avatar displayed if the user doesn't have one
admin: # Admin Classes
user:
class: App\Application\Sonata\UserBundle\Admin\UserAdmin
......
......@@ -5,6 +5,9 @@ sonata_admin:
role_super_admin: ROLE_SUPER_ADMIN
title: 'MLC Admin'
title_logo: /images/logo.png
# Pour modifier l'image par défaut sur la vue "Mosaique" de l'administration
# options:
# mosaic_background: '/path/to/image.png' # or use base64
templates:
layout: '@SonataAdmin/standard_layout.html.twig'
#outer_list_rows_mosaic: '@SonataAdmin/list_outer_rows_mosaic.html.twig'
......@@ -172,7 +175,7 @@ sonata_admin:
- sonata.media.admin.gallery
sonata.admin.group.adherent:
keep_open: false
label: Adhérents
label: "Adhérents"
label_catalogue: SonataAdminBundle
icon: '<i class="fa fa-address-card"></i>'
items:
......@@ -183,7 +186,7 @@ sonata_admin:
- admin.adherent.cotisations
sonata.admin.group.prestataire:
keep_open: false
label: Prestataires
label: "Prestataires"
label_catalogue: SonataAdminBundle
icon: '<i class="fa fa-user-tie"></i>'
items:
......@@ -195,7 +198,7 @@ sonata_admin:
- admin.groupepresta.gerer
sonata.admin.group.groupe:
on_top: true
label: Groupes locaux
label: "Groupes locaux"
label_catalogue: SonataAdminBundle
icon: '<i class="fa fa-chess-rook"></i>'
items:
......@@ -218,7 +221,7 @@ sonata_admin:
sonata.admin.group.news:
keep_open: false
on_top: true
label: "News"
label: "Actualités"
label_catalogue: SonataAdminBundle
icon: '<i class="fa fa-newspaper"></i>'
items:
......@@ -274,6 +277,14 @@ sonata_admin:
- admin.transfert.gerer
- admin.transaction.gerer
- admin.reconversion.gerer
sonata.admin.group.menu_builder:
keep_open: false
on_top: true
label: config.label_menu
label_catalogue: ProdigiousSonataMenuBundle
icon: '<i class="fa fa-magic"></i>'
items:
- prodigious_sonata_menu.admin.menu
sonata.admin.import:
keep_open: false
on_top: true
......@@ -282,14 +293,14 @@ sonata_admin:
icon: '<i class="fa fa-upload"></i>'
items:
- admin.import
sonata.admin.group.menu_builder:
sonata.admin.group.globalparameter:
keep_open: false
on_top: true
label: config.label_menu
label_catalogue: ProdigiousSonataMenuBundle
icon: '<i class="fa fa-magic"></i>'
label: "Configuration"
label_catalogue: SonataAdminBundle
icon: '<i class="fa fa-cogs"></i>'
items:
- prodigious_sonata_menu.admin.menu
- admin.globalparameter.gerer
# Gérer l'affichage du menu de l'admin en fonction des roles
# groups:
......
......@@ -10,16 +10,7 @@ parameters:
sonata.media.admin.media.class: 'App\Admin\MediaAdmin'
sonata.media.admin.gallery.class: 'App\Admin\GalleryAdmin'
# PARAMETRES DE L'APPLICATION DE GESTION DE MONNAIE LOCALE COMPLEMENTAIRE
app.mlc_title: 'Outil de gestion de monnaie locale complémentaire' # Nom complet (< 100 caractères)
app.mlc_name: 'Monnaie locale complémentaire' # Nom complet (< 100 caractères)
app.mlc_name_small: 'MLC' # Nom court (< 25 caractères)
app.mlc_notif_email: 'contact@mlc.com' # Email d'où sont envoyés les notifications
app.cotisation_montant: 10
app.map_center: '[45.7,3.2]'
app.map_zoom: 9
app.map_token: 'pk.eyJ1IjoianVqb3RlIiwiYSI6ImNqc3V3aGl6cTAwdDk0Y3Ftbzg0d2YwajkifQ.VWy1XWkuU9zfHAS7SkgbPA'
app.favicon_url: '/images/favicon.png'
# PARAMETRES DES IMPORTS POSSIBLE POUR L'APPLICATION DE GESTION DE MONNAIE LOCALE COMPLEMENTAIRE
app.import.separator: ';'
app.import.header:
groupe:
......@@ -93,7 +84,17 @@ services:
app.twig.main.extension:
class: App\Twig\AppExtension
autowire: false
arguments: ["@service_container", "@knp_paginator"]
arguments: ["@service_container", "@doctrine.orm.entity_manager", "@knp_paginator", "@session", "@app.rolecheck"]
app.twig.mlc.globals.extension:
class: App\Twig\MlcGlobalsExtension
autowire: false
arguments: ["@doctrine.orm.entity_manager"]
app.listener.unitofwork:
class: App\Listener\UnitOfWorkListener
tags:
- { name: doctrine.event_subscriber, connection: default }
app.twig.form.extension:
class: App\Twig\FormExtension
......@@ -205,6 +206,7 @@ services:
- [ setUserManager, ['@fos_user.user_manager']]
- [ addChild, ['@sonata.user.admin.user', 'user']]
- [ setSecurity, ['@security.helper']]
- [ setPool, ['@sonata.media.pool']]
admin.prestataire.cotisations:
class: App\Admin\CotisationPrestataireAdmin
......@@ -257,7 +259,17 @@ services:
- name: sonata.admin
manager_type: orm
group: "Contenu"
label: "News"
label: "Actualités"
public: true
admin.globalparameter.gerer:
class: App\Admin\GlobalParameterAdmin
arguments: [~, App\Entity\GlobalParameter, ~]
tags:
- name: sonata.admin
manager_type: orm
group: "Contenu"
label: "Configuration"
public: true
admin.document.gerer:
......@@ -316,6 +328,9 @@ services:
- [ setSubClasses, [{transaction: 'App\Entity\Transaction', transfert: 'App\Entity\Transfert', cotisation: 'App\Entity\Cotisation'}]]
- [ setSecurity, ['@security.helper']]
app.rolecheck:
class: App\Tools\RoleCheck
admin.transfert.gerer:
class: App\Admin\TransfertAdmin
arguments: [~, App\Entity\Transfert, ~]
......@@ -323,11 +338,13 @@ services:
- name: sonata.admin
manager_type: orm
group: "Flux"
label: "Transfert"
label: "Transferts"
pager_type: "simple"
public: true
calls:
- [ setSecurity, ['@security.helper']]
- [ setSession, ['@session']]
- [ setRoleCheck, ['@app.rolecheck']]
admin.transaction.gerer:
class: App\Admin\TransactionAdmin
......@@ -336,7 +353,7 @@ services:
- name: sonata.admin
manager_type: orm
group: "Flux"
label: "Transaction"
label: "Transactions"
pager_type: "simple"
public: true
calls:
......@@ -349,7 +366,7 @@ services:
- name: sonata.admin
manager_type: orm
group: "Flux"
label: "Reconversion"
label: "Reconversions"
pager_type: "simple"
public: true
calls:
......@@ -400,8 +417,8 @@ services:
# label: "Flux"
# public: true
# app.flash_messenger:
# class: App\Listener\Flash
# arguments: ["@session"]
# tags:
# - { name: kernel.event_listener, event: kernel.response }
\ No newline at end of file
app.flash_messenger:
class: App\Listener\Flash
arguments: ["@session"]
tags:
- { name: kernel.event_listener, event: kernel.response }
\ No newline at end of file
......@@ -4,7 +4,7 @@ App\Entity\TypePrestataire:
name: 'Prestataire'
typepresta2:
name: 'Partenaire'
App\Entity\Usergroup:
usergroup_adherent:
__construct: ['Adherent', ['ROLE_ADHERENT']]
......@@ -18,6 +18,7 @@ App\Entity\Usergroup:
'ROLE_ADMIN_ADHERENT_GERER_ALL',
'ROLE_ADMIN_ALL_COTISATIONS_ALL',
'ROLE_ADMIN_GROUPE_GERER_ALL',
'ROLE_ADMIN_GLOBALPARAMETER_GERER_ALL',
'ROLE_ADMIN_TRANSFERT_GERER_ALL']]
usergroup_redacteur:
__construct: ['Rédacteur', [
......@@ -27,7 +28,6 @@ App\Entity\Usergroup:
'ROLE_SONATA_MEDIA_ADMIN_GALLERY_HAS_MEDIA_ALL',
'ROLE_PRODIGIOUS_SONATA_MENU_ADMIN_MENU_ALL',
'ROLE_PRODIGIOUS_SONATA_MENU_ADMIN_MENU_ITEM_ALL',
'ROLE_ADMIN_GROUPEPRESTA_GERER_ALL',
'ROLE_ADMIN_NEWS_GERER_ALL',
'ROLE_ADMIN_DOCUMENT_GERER_ALL',
'ROLE_ADMIN_RUBRIQUE_GERER_ALL',
......@@ -42,10 +42,6 @@ App\Entity\Usergroup:
usergroup_tresorier:
__construct: ['Trésorier', [
'ROLE_TRESORIER',
'ROLE_ADMIN_ADHERENT_GERER_ALL',
'ROLE_ADMIN_ADHERENT_COTISATIONS_ALL',
'ROLE_ADMIN_PRESTATAIRE_GERER_ALL',
'ROLE_ADMIN_PRESTATAIRE_COTISATIONS_ALL',
'ROLE_ADMIN_ALL_COTISATIONS_ALL',
'ROLE_ADMIN_RECONVERSION_GERER_ALL',
'ROLE_ADMIN_TRANSFERT_GERER_ALL']]
......
App\Entity\GlobalParameter:
gp1:
name: "COTISATION_MONTANT"
value: '10'
mandatory: 1
gp2:
name: "MLC_TITLE"
value: 'KOHINOS : Outil de gestion de monnaie locale complémentaire'
mandatory: 1
gp3:
name: "MLC_NAME"
value: 'Monnaie locale complémentaire (Nom de la monnaie version longue)'
mandatory: 1
gp4:
name: "MLC_NAME_SMALL"
value: 'MLC (Nom de la Monnaie Locale court ou abbréviation utilisé pour les unités de compte par exemple)'
mandatory: 1
gp5:
name: "MLC_NOTIF_EMAIL"
value: "emaildenvoidesnotifications@votredomaine.fr"
mandatory: 1
gp6:
name: "MAP_CENTER"
value: '<(strtolower("[45.7,3.2]"))>'
mandatory: 1
gp7:
name: "MAP_ZOOM"
value: '9'
mandatory: 1
gp8:
name: "FAVICON_URL"
value: '/images/favicon.png'
mandatory: 1
gp9:
name: "MLC_DESCRIPTION"
value: 'Kohinos : outil de gestion de monnaie locale'
mandatory: 1
gp10:
name: "MLC_KEYWORDS"
value: 'kohinos, mlc, mlcc, monnaie, locale, complémentaire, monnaie locale'
mandatory: 1
App\Entity\Siege:
siege_1:
name: 'Siege MLC'
content: 'MLC'
compteNantie: '<randomFloat(2, 0, 200)>'
compte: '<randomFloat(2, 10000, 20000)>'
App\Entity\Groupe:
......@@ -61,6 +104,7 @@ App\Entity\Adherent:
App\Entity\Prestataire:
prestataire{1..21}:
compte: '<randomFloat(2, 1000, 2000)>'
ecompte: '<randomFloat(2, 1000, 2000)>'
description: '<text(150)>'
raison: '<text(10)>'
responsable: '<text(10)>'
......@@ -75,6 +119,7 @@ App\Entity\Prestataire:
horaires: "<dayOfWeek()> de <date('H')>h à <date('H')>h"
prestataire{22..32}:
compte: '<randomFloat(2, 1000, 2000)>'
ecompte: '<randomFloat(2, 1000, 2000)>'
description: '<text(150)>'
raison: <text(10)>
responsable: <text(10)>
......@@ -89,13 +134,6 @@ App\Entity\Prestataire:
groupe: '@groupe<numberBetween(1, 4)>'
horaires: "<dayOfWeek()> de <date('H')>h à <date('H')>h"
# App\Entity\Rubrique:
# rubrique{1..20}:
# name: <text(10)>
# content: <text(50)>
# enabled: true
# prestataires: '<numberBetween(1, 8)>x @prestataire<numberBetween(1, 32)>'
App\Entity\Faq:
faq{1..12}:
name: 'FAQ : <text(15)>'
......@@ -320,7 +358,7 @@ App\Entity\User:
enabled: true
groups: ['@usergroup_contact']
roles: ['ROLE_CONTACT']
groupesgere: '@groupe1'
groupesgeres: ['@groupe1']
usercomptoir:
username: 'user_comptoir'
email: 'comptoir@doume.test'
......@@ -328,7 +366,7 @@ App\Entity\User:
enabled: true
groups: ['@usergroup_comptoir']
roles: ['ROLE_COMPTOIR']
comptoirsgere: '@comptoir1'
comptoirsgeres: ['@comptoir1']
usergestiongroupe:
username: 'user_gestiongroupe'
email: 'groupe@doume.test'
......@@ -336,7 +374,7 @@ App\Entity\User:
enabled: true
groups: ['@usergroup_gestiongroupe']
roles: ['ROLE_GESTION_GROUPE']
groupesgere: '@groupe1'
groupesgeres: ['@groupe1']
usertresorier:
username: 'user_tresorier'
email: 'tresorier@doume.test'
......@@ -372,7 +410,7 @@ App\Entity\User:
enabled: true
groups: ['@usergroup_prestataire']
roles: ['ROLE_PRESTATAIRE']
prestataire: '@prestataire1'
prestataires: ['@prestataire1']
useradherent:
firstname: 'firstname adherent'
lastname: 'lastname adherent'
......@@ -399,149 +437,149 @@ App\Entity\User:
enabled: true
groups: ['@usergroup_prestataire']
roles: ['ROLE_PRESTATAIRE']
prestataire: '@prestataire<current()>'
prestataires: ['@prestataire<current()>']
# TEST DE TRANSACTIONS / TRANSFERTS !
App\Entity\TransactionAdherentPrestataire:
tro_adh_pre{2..11}:
operateur: '@usera<current()>'
type: 'adherent_prestataire'
reference: 'test'
moyen: 'cb'
montant: '<randomFloat(2,1,2)>'
expediteur: '@adherent<current()>'
destinataire: '@prestataire<current()>'
createdAt: '<dateTimeBetween("-200 days", "now")>'
parenttype: 'transaction'
App\Entity\TransactionAdherentAdherent:
tro_adh_adh{2..5}:
operateur: '@usera<current()>'
type: 'adherent_adherent'
reference: 'test'
moyen: 'cb'
montant: '<randomFloat(2,1,2)>'
expediteur: '@adherent<current()>'
destinataire: '@adherent<numberBetween(6, 11)>'
createdAt: '<dateTimeBetween("-200 days", "now")>'
parenttype: 'transaction'
App\Entity\TransactionPrestataireAdherent:
tro_pre_adh{2..11}:
operateur: '@userp<current()>'
type: 'prestataire_adherent'
reference: 'test'
moyen: 'cb'
montant: '<randomFloat(2,1,2)>'
expediteur: '@prestataire<current()>'
destinataire: '@adherent<current()>'
createdAt: '<dateTimeBetween("-200 days", "now")>'
parenttype: 'transaction'
App\Entity\TransactionPrestatairePrestataire:
tro_pre_pre{2..11}:
operateur: '@userp<current()>'
type: 'prestataire_prestataire'
reference: 'test'
moyen: 'cb'
montant: '<randomFloat(2,1,2)>'
expediteur: '@prestataire<current()>'
destinataire: '@prestataire<numberBetween(11, 21)>'
createdAt: '<dateTimeBetween("-200 days", "now")>'
parenttype: 'transaction'
App\Entity\TransfertComptoirGroupe:
tre_cpt_grp{2..11}:
operateur: '@usercomptoir'
type: 'comptoir_groupe'
reference: 'test'
moyen: 'cb'
montant: '<randomFloat(2,1,2)>'
expediteur: '@comptoir<numberBetween(1,50)>'
destinataire: '@groupe<numberBetween(1,10)>'
createdAt: '<dateTimeBetween("-200 days", "now")>'
parenttype: 'transfert'
App\Entity\TransfertGroupeComptoir:
tre_grp_cpt{1..10}:
operateur: '@usergestiongroupe'
type: 'groupe_comptoir'
reference: 'test'
moyen: 'cb'
montant: '<randomFloat(2,1,2)>'
expediteur: '@groupe<numberBetween(1,10)>'
destinataire: '@comptoir<numberBetween(1,50)>'
createdAt: '<dateTimeBetween("-200 days", "now")>'
parenttype: 'transfert'
App\Entity\TransfertPrestataireComptoir:
tre_pre_cpt{2..11}:
operateur: '@userp<current()>'
type: 'prestataire_comptoir'
reference: 'test'
moyen: 'cb'
montant: '<randomFloat(2,1,2)>'
expediteur: '@prestataire<current()>'
destinataire: '@comptoir<numberBetween(1,50)>'
createdAt: '<dateTimeBetween("-200 days", "now")>'
parenttype: 'transfert'
App\Entity\TransfertPrestataireSiege:
tre_pre_sie{2..11}:
operateur: '@userp<current()>'
type: 'prestataire_siege'
reference: 'test'
moyen: 'cb'
montant: '<randomFloat(2,1,2)>'
expediteur: '@prestataire<current()>'
destinataire: '@siege_1'
createdAt: '<dateTimeBetween("-200 days", "now")>'
parenttype: 'transfert'
App\Entity\TransfertSiegeGroupe:
tre_sie_grp{1..10}:
operateur: '@useradminsiege'
type: 'siege_groupe'
reference: 'test'
moyen: 'cb'
montant: '<randomFloat(2,1,2)>'
expediteur: '@siege_1'
destinataire: '@groupe<numberBetween(1,10)>'
createdAt: '<dateTimeBetween("-200 days", "now")>'
parenttype: 'transfert'
App\Entity\VenteComptoirAdherent:
vte_cpt_adh{2..11}:
operateur: '@usercomptoir'
type: 'comptoir_adherent'
reference: 'vte_cpt_adh<current()>'
moyen: 'vente'
montant: '<randomFloat(2,1,2)>'
expediteur: '@comptoir<numberBetween(1,50)>'
destinataire: '@adherent<current()>'
createdAt: '<dateTimeBetween("-200 days", "now")>'
parenttype: 'vente'
App\Entity\VenteComptoirPrestataire:
vte_cpt_pre{2..11}:
operateur: '@usercomptoir'
type: 'comptoir_prestataire'
reference: 'vte_cpt_pre<current()>'
moyen: 'vente'
montant: '<randomFloat(2,1,2)>'
expediteur: '@comptoir<numberBetween(1,50)>'
destinataire: '@prestataire<current()>'
createdAt: '<dateTimeBetween("-200 days", "now")>'
parenttype: 'vente'
App\Entity\RetraitComptoirAdherent:
ret_cpt_adh{2..11}:
operateur: '@usercomptoir'
type: 'retrait_adherent'
reference: 'vte_cpt_adh<current()>'
moyen: 'retrait'
montant: '<randomFloat(2,1,2)>'
expediteur: '@comptoir<numberBetween(1,50)>'
destinataire: '@adherent<current()>'
createdAt: '<dateTimeBetween("-200 days", "now")>'
parenttype: 'retrait'
App\Entity\RetraitComptoirPrestataire:
ret_cpt_pre{2..11}:
operateur: '@usercomptoir'
type: 'retrait_prestataire'
reference: 'vte_cpt_pre<current()>'
moyen: 'retrait'
montant: '<randomFloat(2,1,2)>'
expediteur: '@comptoir<numberBetween(1,50)>'
destinataire: '@prestataire<current()>'
createdAt: '<dateTimeBetween("-200 days", "now")>'
parenttype: 'retrait'
# App\Entity\TransactionAdherentPrestataire:
# tro_adh_pre{2..11}:
# operateur: '@usera<current()>'
# type: 'adherent_prestataire'
# reference: 'test'
# moyen: 'cb'
# montant: '<randomFloat(2,1,2)>'
# expediteur: '@adherent<current()>'
# destinataire: '@prestataire<current()>'
# createdAt: '<dateTimeBetween("-200 days", "now")>'
# parenttype: 'transaction'
# App\Entity\TransactionAdherentAdherent:
# tro_adh_adh{2..5}:
# operateur: '@usera<current()>'
# type: 'adherent_adherent'
# reference: 'test'
# moyen: 'cb'
# montant: '<randomFloat(2,1,2)>'
# expediteur: '@adherent<current()>'
# destinataire: '@adherent<numberBetween(6, 11)>'
# createdAt: '<dateTimeBetween("-200 days", "now")>'
# parenttype: 'transaction'
# App\Entity\TransactionPrestataireAdherent:
# tro_pre_adh{2..11}:
# operateur: '@userp<current()>'
# type: 'prestataire_adherent'
# reference: 'test'
# moyen: 'cb'
# montant: '<randomFloat(2,1,2)>'
# expediteur: '@prestataire<current()>'
# destinataire: '@adherent<current()>'
# createdAt: '<dateTimeBetween("-200 days", "now")>'
# parenttype: 'transaction'
# App\Entity\TransactionPrestatairePrestataire:
# tro_pre_pre{2..11}:
# operateur: '@userp<current()>'
# type: 'prestataire_prestataire'
# reference: 'test'
# moyen: 'cb'
# montant: '<randomFloat(2,1,2)>'
# expediteur: '@prestataire<current()>'
# destinataire: '@prestataire<numberBetween(11, 21)>'
# createdAt: '<dateTimeBetween("-200 days", "now")>'
# parenttype: 'transaction'
# App\Entity\TransfertComptoirGroupe:
# tre_cpt_grp{2..11}:
# operateur: '@usercomptoir'
# type: 'comptoir_groupe'
# reference: 'test'
# moyen: 'cb'
# montant: '<randomFloat(2,1,2)>'
# expediteur: '@comptoir<numberBetween(1,50)>'
# destinataire: '@groupe<numberBetween(1,10)>'
# createdAt: '<dateTimeBetween("-200 days", "now")>'
# parenttype: 'transfert'
# App\Entity\TransfertGroupeComptoir:
# tre_grp_cpt{1..10}:
# operateur: '@usergestiongroupe'
# type: 'groupe_comptoir'
# reference: 'test'
# moyen: 'cb'
# montant: '<randomFloat(2,1,2)>'
# expediteur: '@groupe<numberBetween(1,10)>'
# destinataire: '@comptoir<numberBetween(1,50)>'
# createdAt: '<dateTimeBetween("-200 days", "now")>'
# parenttype: 'transfert'
# App\Entity\TransfertPrestataireComptoir:
# tre_pre_cpt{2..11}:
# operateur: '@userp<current()>'
# type: 'prestataire_comptoir'
# reference: 'test'
# moyen: 'cb'
# montant: '<randomFloat(2,1,2)>'
# expediteur: '@prestataire<current()>'
# destinataire: '@comptoir<numberBetween(1,50)>'
# createdAt: '<dateTimeBetween("-200 days", "now")>'
# parenttype: 'transfert'
# App\Entity\TransfertPrestataireSiege:
# tre_pre_sie{2..11}:
# operateur: '@userp<current()>'
# type: 'prestataire_siege'
# reference: 'test'
# moyen: 'cb'
# montant: '<randomFloat(2,1,2)>'
# expediteur: '@prestataire<current()>'
# destinataire: '@siege_1'
# createdAt: '<dateTimeBetween("-200 days", "now")>'
# parenttype: 'transfert'
# App\Entity\TransfertSiegeGroupe:
# tre_sie_grp{1..10}:
# operateur: '@useradminsiege'
# type: 'siege_groupe'
# reference: 'test'
# moyen: 'cb'
# montant: '<randomFloat(2,1,2)>'
# expediteur: '@siege_1'
# destinataire: '@groupe<numberBetween(1,10)>'
# createdAt: '<dateTimeBetween("-200 days", "now")>'
# parenttype: 'transfert'
# App\Entity\VenteComptoirAdherent:
# vte_cpt_adh{2..11}:
# operateur: '@usercomptoir'
# type: 'comptoir_adherent'
# reference: 'vte_cpt_adh<current()>'
# moyen: 'vente'
# montant: '<randomFloat(2,1,2)>'
# expediteur: '@comptoir<numberBetween(1,50)>'
# destinataire: '@adherent<current()>'
# createdAt: '<dateTimeBetween("-200 days", "now")>'
# parenttype: 'vente'
# App\Entity\VenteComptoirPrestataire:
# vte_cpt_pre{2..11}:
# operateur: '@usercomptoir'
# type: 'comptoir_prestataire'
# reference: 'vte_cpt_pre<current()>'
# moyen: 'vente'
# montant: '<randomFloat(2,1,2)>'
# expediteur: '@comptoir<numberBetween(1,50)>'
# destinataire: '@prestataire<current()>'
# createdAt: '<dateTimeBetween("-200 days", "now")>'
# parenttype: 'vente'
# App\Entity\RetraitComptoirAdherent:
# ret_cpt_adh{2..11}:
# operateur: '@usercomptoir'
# type: 'retrait_adherent'
# reference: 'vte_cpt_adh<current()>'
# moyen: 'retrait'
# montant: '<randomFloat(2,1,2)>'
# expediteur: '@comptoir<numberBetween(1,50)>'
# destinataire: '@adherent<current()>'
# createdAt: '<dateTimeBetween("-200 days", "now")>'
# parenttype: 'retrait'
# App\Entity\RetraitComptoirPrestataire:
# ret_cpt_pre{2..11}:
# operateur: '@usercomptoir'
# type: 'retrait_prestataire'
# reference: 'vte_cpt_pre<current()>'
# moyen: 'retrait'
# montant: '<randomFloat(2,1,2)>'
# expediteur: '@comptoir<numberBetween(1,50)>'
# destinataire: '@prestataire<current()>'
# createdAt: '<dateTimeBetween("-200 days", "now")>'
# parenttype: 'retrait'
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"devDependencies": {
"@symfony/webpack-encore": "^0.21.0",
"node-sass": "^4.10.0",
"@symfony/webpack-encore": "^0.28.2",
"node-sass": "^4.13.1",
"sass-loader": "^7.1.0",
"webpack-notifier": "^1.6.0"
},
......@@ -14,9 +14,10 @@
"build": "encore production --progress"
},
"dependencies": {
"bootstrap": "^4.2.1",
"bootstrap": "^4.4.1",
"bootswatch": "^4.3.1",
"ckeditor": "^4.0.0",
"jquery": "^3.3.1",
"popper.js": "^1.14.7"
"popper.js": "@^1.16.0"
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
.traductions .container{width:100%;max-width:100%}.main-header .sidebar-front{float:left;background-color:transparent;background-image:none;padding:15px;color:#3c8dbc;border-right:1px solid #eee}.card{position:relative;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column;min-width:0;word-wrap:break-word;background-color:#fff;background-clip:border-box;border:1px solid rgba(0,0,0,.125);border-radius:.25rem}.card>hr{margin-right:0;margin-left:0}.card>.list-group:first-child .list-group-item:first-child{border-top-left-radius:.25rem;border-top-right-radius:.25rem}.card>.list-group:last-child .list-group-item:last-child{border-bottom-right-radius:.25rem;border-bottom-left-radius:.25rem}.card-body{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto;padding:1.25rem}.card-title{margin-bottom:.75rem}.card-subtitle{margin-top:-.375rem}.card-subtitle,.card-text:last-child{margin-bottom:0}.card-link:hover{text-decoration:none}.card-link+.card-link{margin-left:1.25rem}.card-header{padding:.75rem 1.25rem;margin-bottom:0;background-color:rgba(0,0,0,.03);border-bottom:1px solid rgba(0,0,0,.125)}.card-header:first-child{border-radius:calc(.25rem - 1px) calc(.25rem - 1px) 0 0}.card-header+.list-group .list-group-item:first-child{border-top:0}.card-footer{padding:.75rem 1.25rem;background-color:rgba(0,0,0,.03);border-top:1px solid rgba(0,0,0,.125)}.card-footer:last-child{border-radius:0 0 calc(.25rem - 1px) calc(.25rem - 1px)}.card-header-tabs{margin-bottom:-.75rem;border-bottom:0}.card-header-pills,.card-header-tabs{margin-right:-.625rem;margin-left:-.625rem}.card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1.25rem}.card-img{width:100%;border-radius:calc(.25rem - 1px)}.card-img-top{width:100%;border-top-left-radius:calc(.25rem - 1px);border-top-right-radius:calc(.25rem - 1px)}.card-img-bottom{width:100%;border-bottom-right-radius:calc(.25rem - 1px);border-bottom-left-radius:calc(.25rem - 1px)}.card-deck{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-deck .card{margin-bottom:15px}@media (min-width:576px){.card-deck{-webkit-box-orient:horizontal;-ms-flex-flow:row wrap;flex-flow:row wrap;margin-right:-15px;margin-left:-15px}.card-deck,.card-deck .card{-webkit-box-direction:normal}.card-deck .card{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column;margin-right:15px;margin-bottom:0;margin-left:15px}}.card-group{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.card-group>.card{margin-bottom:15px}@media (min-width:576px){.card-group{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-flow:row wrap;flex-flow:row wrap}.card-group>.card{-webkit-box-flex:1;-ms-flex:1 0 0%;flex:1 0 0%;margin-bottom:0}.card-group>.card+.card{margin-left:0;border-left:0}.card-group>.card:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.card-group>.card:not(:last-child) .card-header,.card-group>.card:not(:last-child) .card-img-top{border-top-right-radius:0}.card-group>.card:not(:last-child) .card-footer,.card-group>.card:not(:last-child) .card-img-bottom{border-bottom-right-radius:0}.card-group>.card:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.card-group>.card:not(:first-child) .card-header,.card-group>.card:not(:first-child) .card-img-top{border-top-left-radius:0}.card-group>.card:not(:first-child) .card-footer,.card-group>.card:not(:first-child) .card-img-bottom{border-bottom-left-radius:0}}.card-columns .card{margin-bottom:.75rem}@media (min-width:576px){.card-columns{-webkit-column-count:3;column-count:3;-webkit-column-gap:1.25rem;column-gap:1.25rem;orphans:1;widows:1}.card-columns .card{display:inline-block;width:100%}}.accordion>.card{overflow:hidden}.accordion>.card:not(:first-of-type) .card-header:first-child{border-radius:0}.accordion>.card:not(:first-of-type):not(:last-of-type){border-bottom:0;border-radius:0}.accordion>.card:first-of-type{border-bottom:0;border-bottom-right-radius:0;border-bottom-left-radius:0}.accordion>.card:last-of-type{border-top-left-radius:0;border-top-right-radius:0}.accordion>.card .card-header{margin-bottom:-1px}.m-0{margin:0!important}.mt-0,.my-0{margin-top:0!important}.mr-0,.mx-0{margin-right:0!important}.mb-0,.my-0{margin-bottom:0!important}.ml-0,.mx-0{margin-left:0!important}.m-1{margin:.25rem!important}.mt-1,.my-1{margin-top:.25rem!important}.mr-1,.mx-1{margin-right:.25rem!important}.mb-1,.my-1{margin-bottom:.25rem!important}.ml-1,.mx-1{margin-left:.25rem!important}.m-2{margin:.5rem!important}.mt-2,.my-2{margin-top:.5rem!important}.mr-2,.mx-2{margin-right:.5rem!important}.mb-2,.my-2{margin-bottom:.5rem!important}.ml-2,.mx-2{margin-left:.5rem!important}.m-3{margin:1rem!important}.mt-3,.my-3{margin-top:1rem!important}.mr-3,.mx-3{margin-right:1rem!important}.mb-3,.my-3{margin-bottom:1rem!important}.ml-3,.mx-3{margin-left:1rem!important}.m-4{margin:1.5rem!important}.mt-4,.my-4{margin-top:1.5rem!important}.mr-4,.mx-4{margin-right:1.5rem!important}.mb-4,.my-4{margin-bottom:1.5rem!important}.ml-4,.mx-4{margin-left:1.5rem!important}.m-5{margin:3rem!important}.mt-5,.my-5{margin-top:3rem!important}.mr-5,.mx-5{margin-right:3rem!important}.mb-5,.my-5{margin-bottom:3rem!important}.ml-5,.mx-5{margin-left:3rem!important}.p-0{padding:0!important}.pt-0,.py-0{padding-top:0!important}.pr-0,.px-0{padding-right:0!important}.pb-0,.py-0{padding-bottom:0!important}.pl-0,.px-0{padding-left:0!important}.p-1{padding:.25rem!important}.pt-1,.py-1{padding-top:.25rem!important}.pr-1,.px-1{padding-right:.25rem!important}.pb-1,.py-1{padding-bottom:.25rem!important}.pl-1,.px-1{padding-left:.25rem!important}.p-2{padding:.5rem!important}.pt-2,.py-2{padding-top:.5rem!important}.pr-2,.px-2{padding-right:.5rem!important}.pb-2,.py-2{padding-bottom:.5rem!important}.pl-2,.px-2{padding-left:.5rem!important}.p-3{padding:1rem!important}.pt-3,.py-3{padding-top:1rem!important}.pr-3,.px-3{padding-right:1rem!important}.pb-3,.py-3{padding-bottom:1rem!important}.pl-3,.px-3{padding-left:1rem!important}.p-4{padding:1.5rem!important}.pt-4,.py-4{padding-top:1.5rem!important}.pr-4,.px-4{padding-right:1.5rem!important}.pb-4,.py-4{padding-bottom:1.5rem!important}.pl-4,.px-4{padding-left:1.5rem!important}.p-5{padding:3rem!important}.pt-5,.py-5{padding-top:3rem!important}.pr-5,.px-5{padding-right:3rem!important}.pb-5,.py-5{padding-bottom:3rem!important}.pl-5,.px-5{padding-left:3rem!important}.m-n1{margin:-.25rem!important}.mt-n1,.my-n1{margin-top:-.25rem!important}.mr-n1,.mx-n1{margin-right:-.25rem!important}.mb-n1,.my-n1{margin-bottom:-.25rem!important}.ml-n1,.mx-n1{margin-left:-.25rem!important}.m-n2{margin:-.5rem!important}.mt-n2,.my-n2{margin-top:-.5rem!important}.mr-n2,.mx-n2{margin-right:-.5rem!important}.mb-n2,.my-n2{margin-bottom:-.5rem!important}.ml-n2,.mx-n2{margin-left:-.5rem!important}.m-n3{margin:-1rem!important}.mt-n3,.my-n3{margin-top:-1rem!important}.mr-n3,.mx-n3{margin-right:-1rem!important}.mb-n3,.my-n3{margin-bottom:-1rem!important}.ml-n3,.mx-n3{margin-left:-1rem!important}.m-n4{margin:-1.5rem!important}.mt-n4,.my-n4{margin-top:-1.5rem!important}.mr-n4,.mx-n4{margin-right:-1.5rem!important}.mb-n4,.my-n4{margin-bottom:-1.5rem!important}.ml-n4,.mx-n4{margin-left:-1.5rem!important}.m-n5{margin:-3rem!important}.mt-n5,.my-n5{margin-top:-3rem!important}.mr-n5,.mx-n5{margin-right:-3rem!important}.mb-n5,.my-n5{margin-bottom:-3rem!important}.ml-n5,.mx-n5{margin-left:-3rem!important}.m-auto{margin:auto!important}.mt-auto,.my-auto{margin-top:auto!important}.mr-auto,.mx-auto{margin-right:auto!important}.mb-auto,.my-auto{margin-bottom:auto!important}.ml-auto,.mx-auto{margin-left:auto!important}@media (min-width:576px){.m-sm-0{margin:0!important}.mt-sm-0,.my-sm-0{margin-top:0!important}.mr-sm-0,.mx-sm-0{margin-right:0!important}.mb-sm-0,.my-sm-0{margin-bottom:0!important}.ml-sm-0,.mx-sm-0{margin-left:0!important}.m-sm-1{margin:.25rem!important}.mt-sm-1,.my-sm-1{margin-top:.25rem!important}.mr-sm-1,.mx-sm-1{margin-right:.25rem!important}.mb-sm-1,.my-sm-1{margin-bottom:.25rem!important}.ml-sm-1,.mx-sm-1{margin-left:.25rem!important}.m-sm-2{margin:.5rem!important}.mt-sm-2,.my-sm-2{margin-top:.5rem!important}.mr-sm-2,.mx-sm-2{margin-right:.5rem!important}.mb-sm-2,.my-sm-2{margin-bottom:.5rem!important}.ml-sm-2,.mx-sm-2{margin-left:.5rem!important}.m-sm-3{margin:1rem!important}.mt-sm-3,.my-sm-3{margin-top:1rem!important}.mr-sm-3,.mx-sm-3{margin-right:1rem!important}.mb-sm-3,.my-sm-3{margin-bottom:1rem!important}.ml-sm-3,.mx-sm-3{margin-left:1rem!important}.m-sm-4{margin:1.5rem!important}.mt-sm-4,.my-sm-4{margin-top:1.5rem!important}.mr-sm-4,.mx-sm-4{margin-right:1.5rem!important}.mb-sm-4,.my-sm-4{margin-bottom:1.5rem!important}.ml-sm-4,.mx-sm-4{margin-left:1.5rem!important}.m-sm-5{margin:3rem!important}.mt-sm-5,.my-sm-5{margin-top:3rem!important}.mr-sm-5,.mx-sm-5{margin-right:3rem!important}.mb-sm-5,.my-sm-5{margin-bottom:3rem!important}.ml-sm-5,.mx-sm-5{margin-left:3rem!important}.p-sm-0{padding:0!important}.pt-sm-0,.py-sm-0{padding-top:0!important}.pr-sm-0,.px-sm-0{padding-right:0!important}.pb-sm-0,.py-sm-0{padding-bottom:0!important}.pl-sm-0,.px-sm-0{padding-left:0!important}.p-sm-1{padding:.25rem!important}.pt-sm-1,.py-sm-1{padding-top:.25rem!important}.pr-sm-1,.px-sm-1{padding-right:.25rem!important}.pb-sm-1,.py-sm-1{padding-bottom:.25rem!important}.pl-sm-1,.px-sm-1{padding-left:.25rem!important}.p-sm-2{padding:.5rem!important}.pt-sm-2,.py-sm-2{padding-top:.5rem!important}.pr-sm-2,.px-sm-2{padding-right:.5rem!important}.pb-sm-2,.py-sm-2{padding-bottom:.5rem!important}.pl-sm-2,.px-sm-2{padding-left:.5rem!important}.p-sm-3{padding:1rem!important}.pt-sm-3,.py-sm-3{padding-top:1rem!important}.pr-sm-3,.px-sm-3{padding-right:1rem!important}.pb-sm-3,.py-sm-3{padding-bottom:1rem!important}.pl-sm-3,.px-sm-3{padding-left:1rem!important}.p-sm-4{padding:1.5rem!important}.pt-sm-4,.py-sm-4{padding-top:1.5rem!important}.pr-sm-4,.px-sm-4{padding-right:1.5rem!important}.pb-sm-4,.py-sm-4{padding-bottom:1.5rem!important}.pl-sm-4,.px-sm-4{padding-left:1.5rem!important}.p-sm-5{padding:3rem!important}.pt-sm-5,.py-sm-5{padding-top:3rem!important}.pr-sm-5,.px-sm-5{padding-right:3rem!important}.pb-sm-5,.py-sm-5{padding-bottom:3rem!important}.pl-sm-5,.px-sm-5{padding-left:3rem!important}.m-sm-n1{margin:-.25rem!important}.mt-sm-n1,.my-sm-n1{margin-top:-.25rem!important}.mr-sm-n1,.mx-sm-n1{margin-right:-.25rem!important}.mb-sm-n1,.my-sm-n1{margin-bottom:-.25rem!important}.ml-sm-n1,.mx-sm-n1{margin-left:-.25rem!important}.m-sm-n2{margin:-.5rem!important}.mt-sm-n2,.my-sm-n2{margin-top:-.5rem!important}.mr-sm-n2,.mx-sm-n2{margin-right:-.5rem!important}.mb-sm-n2,.my-sm-n2{margin-bottom:-.5rem!important}.ml-sm-n2,.mx-sm-n2{margin-left:-.5rem!important}.m-sm-n3{margin:-1rem!important}.mt-sm-n3,.my-sm-n3{margin-top:-1rem!important}.mr-sm-n3,.mx-sm-n3{margin-right:-1rem!important}.mb-sm-n3,.my-sm-n3{margin-bottom:-1rem!important}.ml-sm-n3,.mx-sm-n3{margin-left:-1rem!important}.m-sm-n4{margin:-1.5rem!important}.mt-sm-n4,.my-sm-n4{margin-top:-1.5rem!important}.mr-sm-n4,.mx-sm-n4{margin-right:-1.5rem!important}.mb-sm-n4,.my-sm-n4{margin-bottom:-1.5rem!important}.ml-sm-n4,.mx-sm-n4{margin-left:-1.5rem!important}.m-sm-n5{margin:-3rem!important}.mt-sm-n5,.my-sm-n5{margin-top:-3rem!important}.mr-sm-n5,.mx-sm-n5{margin-right:-3rem!important}.mb-sm-n5,.my-sm-n5{margin-bottom:-3rem!important}.ml-sm-n5,.mx-sm-n5{margin-left:-3rem!important}.m-sm-auto{margin:auto!important}.mt-sm-auto,.my-sm-auto{margin-top:auto!important}.mr-sm-auto,.mx-sm-auto{margin-right:auto!important}.mb-sm-auto,.my-sm-auto{margin-bottom:auto!important}.ml-sm-auto,.mx-sm-auto{margin-left:auto!important}}@media (min-width:768px){.m-md-0{margin:0!important}.mt-md-0,.my-md-0{margin-top:0!important}.mr-md-0,.mx-md-0{margin-right:0!important}.mb-md-0,.my-md-0{margin-bottom:0!important}.ml-md-0,.mx-md-0{margin-left:0!important}.m-md-1{margin:.25rem!important}.mt-md-1,.my-md-1{margin-top:.25rem!important}.mr-md-1,.mx-md-1{margin-right:.25rem!important}.mb-md-1,.my-md-1{margin-bottom:.25rem!important}.ml-md-1,.mx-md-1{margin-left:.25rem!important}.m-md-2{margin:.5rem!important}.mt-md-2,.my-md-2{margin-top:.5rem!important}.mr-md-2,.mx-md-2{margin-right:.5rem!important}.mb-md-2,.my-md-2{margin-bottom:.5rem!important}.ml-md-2,.mx-md-2{margin-left:.5rem!important}.m-md-3{margin:1rem!important}.mt-md-3,.my-md-3{margin-top:1rem!important}.mr-md-3,.mx-md-3{margin-right:1rem!important}.mb-md-3,.my-md-3{margin-bottom:1rem!important}.ml-md-3,.mx-md-3{margin-left:1rem!important}.m-md-4{margin:1.5rem!important}.mt-md-4,.my-md-4{margin-top:1.5rem!important}.mr-md-4,.mx-md-4{margin-right:1.5rem!important}.mb-md-4,.my-md-4{margin-bottom:1.5rem!important}.ml-md-4,.mx-md-4{margin-left:1.5rem!important}.m-md-5{margin:3rem!important}.mt-md-5,.my-md-5{margin-top:3rem!important}.mr-md-5,.mx-md-5{margin-right:3rem!important}.mb-md-5,.my-md-5{margin-bottom:3rem!important}.ml-md-5,.mx-md-5{margin-left:3rem!important}.p-md-0{padding:0!important}.pt-md-0,.py-md-0{padding-top:0!important}.pr-md-0,.px-md-0{padding-right:0!important}.pb-md-0,.py-md-0{padding-bottom:0!important}.pl-md-0,.px-md-0{padding-left:0!important}.p-md-1{padding:.25rem!important}.pt-md-1,.py-md-1{padding-top:.25rem!important}.pr-md-1,.px-md-1{padding-right:.25rem!important}.pb-md-1,.py-md-1{padding-bottom:.25rem!important}.pl-md-1,.px-md-1{padding-left:.25rem!important}.p-md-2{padding:.5rem!important}.pt-md-2,.py-md-2{padding-top:.5rem!important}.pr-md-2,.px-md-2{padding-right:.5rem!important}.pb-md-2,.py-md-2{padding-bottom:.5rem!important}.pl-md-2,.px-md-2{padding-left:.5rem!important}.p-md-3{padding:1rem!important}.pt-md-3,.py-md-3{padding-top:1rem!important}.pr-md-3,.px-md-3{padding-right:1rem!important}.pb-md-3,.py-md-3{padding-bottom:1rem!important}.pl-md-3,.px-md-3{padding-left:1rem!important}.p-md-4{padding:1.5rem!important}.pt-md-4,.py-md-4{padding-top:1.5rem!important}.pr-md-4,.px-md-4{padding-right:1.5rem!important}.pb-md-4,.py-md-4{padding-bottom:1.5rem!important}.pl-md-4,.px-md-4{padding-left:1.5rem!important}.p-md-5{padding:3rem!important}.pt-md-5,.py-md-5{padding-top:3rem!important}.pr-md-5,.px-md-5{padding-right:3rem!important}.pb-md-5,.py-md-5{padding-bottom:3rem!important}.pl-md-5,.px-md-5{padding-left:3rem!important}.m-md-n1{margin:-.25rem!important}.mt-md-n1,.my-md-n1{margin-top:-.25rem!important}.mr-md-n1,.mx-md-n1{margin-right:-.25rem!important}.mb-md-n1,.my-md-n1{margin-bottom:-.25rem!important}.ml-md-n1,.mx-md-n1{margin-left:-.25rem!important}.m-md-n2{margin:-.5rem!important}.mt-md-n2,.my-md-n2{margin-top:-.5rem!important}.mr-md-n2,.mx-md-n2{margin-right:-.5rem!important}.mb-md-n2,.my-md-n2{margin-bottom:-.5rem!important}.ml-md-n2,.mx-md-n2{margin-left:-.5rem!important}.m-md-n3{margin:-1rem!important}.mt-md-n3,.my-md-n3{margin-top:-1rem!important}.mr-md-n3,.mx-md-n3{margin-right:-1rem!important}.mb-md-n3,.my-md-n3{margin-bottom:-1rem!important}.ml-md-n3,.mx-md-n3{margin-left:-1rem!important}.m-md-n4{margin:-1.5rem!important}.mt-md-n4,.my-md-n4{margin-top:-1.5rem!important}.mr-md-n4,.mx-md-n4{margin-right:-1.5rem!important}.mb-md-n4,.my-md-n4{margin-bottom:-1.5rem!important}.ml-md-n4,.mx-md-n4{margin-left:-1.5rem!important}.m-md-n5{margin:-3rem!important}.mt-md-n5,.my-md-n5{margin-top:-3rem!important}.mr-md-n5,.mx-md-n5{margin-right:-3rem!important}.mb-md-n5,.my-md-n5{margin-bottom:-3rem!important}.ml-md-n5,.mx-md-n5{margin-left:-3rem!important}.m-md-auto{margin:auto!important}.mt-md-auto,.my-md-auto{margin-top:auto!important}.mr-md-auto,.mx-md-auto{margin-right:auto!important}.mb-md-auto,.my-md-auto{margin-bottom:auto!important}.ml-md-auto,.mx-md-auto{margin-left:auto!important}}@media (min-width:992px){.m-lg-0{margin:0!important}.mt-lg-0,.my-lg-0{margin-top:0!important}.mr-lg-0,.mx-lg-0{margin-right:0!important}.mb-lg-0,.my-lg-0{margin-bottom:0!important}.ml-lg-0,.mx-lg-0{margin-left:0!important}.m-lg-1{margin:.25rem!important}.mt-lg-1,.my-lg-1{margin-top:.25rem!important}.mr-lg-1,.mx-lg-1{margin-right:.25rem!important}.mb-lg-1,.my-lg-1{margin-bottom:.25rem!important}.ml-lg-1,.mx-lg-1{margin-left:.25rem!important}.m-lg-2{margin:.5rem!important}.mt-lg-2,.my-lg-2{margin-top:.5rem!important}.mr-lg-2,.mx-lg-2{margin-right:.5rem!important}.mb-lg-2,.my-lg-2{margin-bottom:.5rem!important}.ml-lg-2,.mx-lg-2{margin-left:.5rem!important}.m-lg-3{margin:1rem!important}.mt-lg-3,.my-lg-3{margin-top:1rem!important}.mr-lg-3,.mx-lg-3{margin-right:1rem!important}.mb-lg-3,.my-lg-3{margin-bottom:1rem!important}.ml-lg-3,.mx-lg-3{margin-left:1rem!important}.m-lg-4{margin:1.5rem!important}.mt-lg-4,.my-lg-4{margin-top:1.5rem!important}.mr-lg-4,.mx-lg-4{margin-right:1.5rem!important}.mb-lg-4,.my-lg-4{margin-bottom:1.5rem!important}.ml-lg-4,.mx-lg-4{margin-left:1.5rem!important}.m-lg-5{margin:3rem!important}.mt-lg-5,.my-lg-5{margin-top:3rem!important}.mr-lg-5,.mx-lg-5{margin-right:3rem!important}.mb-lg-5,.my-lg-5{margin-bottom:3rem!important}.ml-lg-5,.mx-lg-5{margin-left:3rem!important}.p-lg-0{padding:0!important}.pt-lg-0,.py-lg-0{padding-top:0!important}.pr-lg-0,.px-lg-0{padding-right:0!important}.pb-lg-0,.py-lg-0{padding-bottom:0!important}.pl-lg-0,.px-lg-0{padding-left:0!important}.p-lg-1{padding:.25rem!important}.pt-lg-1,.py-lg-1{padding-top:.25rem!important}.pr-lg-1,.px-lg-1{padding-right:.25rem!important}.pb-lg-1,.py-lg-1{padding-bottom:.25rem!important}.pl-lg-1,.px-lg-1{padding-left:.25rem!important}.p-lg-2{padding:.5rem!important}.pt-lg-2,.py-lg-2{padding-top:.5rem!important}.pr-lg-2,.px-lg-2{padding-right:.5rem!important}.pb-lg-2,.py-lg-2{padding-bottom:.5rem!important}.pl-lg-2,.px-lg-2{padding-left:.5rem!important}.p-lg-3{padding:1rem!important}.pt-lg-3,.py-lg-3{padding-top:1rem!important}.pr-lg-3,.px-lg-3{padding-right:1rem!important}.pb-lg-3,.py-lg-3{padding-bottom:1rem!important}.pl-lg-3,.px-lg-3{padding-left:1rem!important}.p-lg-4{padding:1.5rem!important}.pt-lg-4,.py-lg-4{padding-top:1.5rem!important}.pr-lg-4,.px-lg-4{padding-right:1.5rem!important}.pb-lg-4,.py-lg-4{padding-bottom:1.5rem!important}.pl-lg-4,.px-lg-4{padding-left:1.5rem!important}.p-lg-5{padding:3rem!important}.pt-lg-5,.py-lg-5{padding-top:3rem!important}.pr-lg-5,.px-lg-5{padding-right:3rem!important}.pb-lg-5,.py-lg-5{padding-bottom:3rem!important}.pl-lg-5,.px-lg-5{padding-left:3rem!important}.m-lg-n1{margin:-.25rem!important}.mt-lg-n1,.my-lg-n1{margin-top:-.25rem!important}.mr-lg-n1,.mx-lg-n1{margin-right:-.25rem!important}.mb-lg-n1,.my-lg-n1{margin-bottom:-.25rem!important}.ml-lg-n1,.mx-lg-n1{margin-left:-.25rem!important}.m-lg-n2{margin:-.5rem!important}.mt-lg-n2,.my-lg-n2{margin-top:-.5rem!important}.mr-lg-n2,.mx-lg-n2{margin-right:-.5rem!important}.mb-lg-n2,.my-lg-n2{margin-bottom:-.5rem!important}.ml-lg-n2,.mx-lg-n2{margin-left:-.5rem!important}.m-lg-n3{margin:-1rem!important}.mt-lg-n3,.my-lg-n3{margin-top:-1rem!important}.mr-lg-n3,.mx-lg-n3{margin-right:-1rem!important}.mb-lg-n3,.my-lg-n3{margin-bottom:-1rem!important}.ml-lg-n3,.mx-lg-n3{margin-left:-1rem!important}.m-lg-n4{margin:-1.5rem!important}.mt-lg-n4,.my-lg-n4{margin-top:-1.5rem!important}.mr-lg-n4,.mx-lg-n4{margin-right:-1.5rem!important}.mb-lg-n4,.my-lg-n4{margin-bottom:-1.5rem!important}.ml-lg-n4,.mx-lg-n4{margin-left:-1.5rem!important}.m-lg-n5{margin:-3rem!important}.mt-lg-n5,.my-lg-n5{margin-top:-3rem!important}.mr-lg-n5,.mx-lg-n5{margin-right:-3rem!important}.mb-lg-n5,.my-lg-n5{margin-bottom:-3rem!important}.ml-lg-n5,.mx-lg-n5{margin-left:-3rem!important}.m-lg-auto{margin:auto!important}.mt-lg-auto,.my-lg-auto{margin-top:auto!important}.mr-lg-auto,.mx-lg-auto{margin-right:auto!important}.mb-lg-auto,.my-lg-auto{margin-bottom:auto!important}.ml-lg-auto,.mx-lg-auto{margin-left:auto!important}}@media (min-width:1200px){.m-xl-0{margin:0!important}.mt-xl-0,.my-xl-0{margin-top:0!important}.mr-xl-0,.mx-xl-0{margin-right:0!important}.mb-xl-0,.my-xl-0{margin-bottom:0!important}.ml-xl-0,.mx-xl-0{margin-left:0!important}.m-xl-1{margin:.25rem!important}.mt-xl-1,.my-xl-1{margin-top:.25rem!important}.mr-xl-1,.mx-xl-1{margin-right:.25rem!important}.mb-xl-1,.my-xl-1{margin-bottom:.25rem!important}.ml-xl-1,.mx-xl-1{margin-left:.25rem!important}.m-xl-2{margin:.5rem!important}.mt-xl-2,.my-xl-2{margin-top:.5rem!important}.mr-xl-2,.mx-xl-2{margin-right:.5rem!important}.mb-xl-2,.my-xl-2{margin-bottom:.5rem!important}.ml-xl-2,.mx-xl-2{margin-left:.5rem!important}.m-xl-3{margin:1rem!important}.mt-xl-3,.my-xl-3{margin-top:1rem!important}.mr-xl-3,.mx-xl-3{margin-right:1rem!important}.mb-xl-3,.my-xl-3{margin-bottom:1rem!important}.ml-xl-3,.mx-xl-3{margin-left:1rem!important}.m-xl-4{margin:1.5rem!important}.mt-xl-4,.my-xl-4{margin-top:1.5rem!important}.mr-xl-4,.mx-xl-4{margin-right:1.5rem!important}.mb-xl-4,.my-xl-4{margin-bottom:1.5rem!important}.ml-xl-4,.mx-xl-4{margin-left:1.5rem!important}.m-xl-5{margin:3rem!important}.mt-xl-5,.my-xl-5{margin-top:3rem!important}.mr-xl-5,.mx-xl-5{margin-right:3rem!important}.mb-xl-5,.my-xl-5{margin-bottom:3rem!important}.ml-xl-5,.mx-xl-5{margin-left:3rem!important}.p-xl-0{padding:0!important}.pt-xl-0,.py-xl-0{padding-top:0!important}.pr-xl-0,.px-xl-0{padding-right:0!important}.pb-xl-0,.py-xl-0{padding-bottom:0!important}.pl-xl-0,.px-xl-0{padding-left:0!important}.p-xl-1{padding:.25rem!important}.pt-xl-1,.py-xl-1{padding-top:.25rem!important}.pr-xl-1,.px-xl-1{padding-right:.25rem!important}.pb-xl-1,.py-xl-1{padding-bottom:.25rem!important}.pl-xl-1,.px-xl-1{padding-left:.25rem!important}.p-xl-2{padding:.5rem!important}.pt-xl-2,.py-xl-2{padding-top:.5rem!important}.pr-xl-2,.px-xl-2{padding-right:.5rem!important}.pb-xl-2,.py-xl-2{padding-bottom:.5rem!important}.pl-xl-2,.px-xl-2{padding-left:.5rem!important}.p-xl-3{padding:1rem!important}.pt-xl-3,.py-xl-3{padding-top:1rem!important}.pr-xl-3,.px-xl-3{padding-right:1rem!important}.pb-xl-3,.py-xl-3{padding-bottom:1rem!important}.pl-xl-3,.px-xl-3{padding-left:1rem!important}.p-xl-4{padding:1.5rem!important}.pt-xl-4,.py-xl-4{padding-top:1.5rem!important}.pr-xl-4,.px-xl-4{padding-right:1.5rem!important}.pb-xl-4,.py-xl-4{padding-bottom:1.5rem!important}.pl-xl-4,.px-xl-4{padding-left:1.5rem!important}.p-xl-5{padding:3rem!important}.pt-xl-5,.py-xl-5{padding-top:3rem!important}.pr-xl-5,.px-xl-5{padding-right:3rem!important}.pb-xl-5,.py-xl-5{padding-bottom:3rem!important}.pl-xl-5,.px-xl-5{padding-left:3rem!important}.m-xl-n1{margin:-.25rem!important}.mt-xl-n1,.my-xl-n1{margin-top:-.25rem!important}.mr-xl-n1,.mx-xl-n1{margin-right:-.25rem!important}.mb-xl-n1,.my-xl-n1{margin-bottom:-.25rem!important}.ml-xl-n1,.mx-xl-n1{margin-left:-.25rem!important}.m-xl-n2{margin:-.5rem!important}.mt-xl-n2,.my-xl-n2{margin-top:-.5rem!important}.mr-xl-n2,.mx-xl-n2{margin-right:-.5rem!important}.mb-xl-n2,.my-xl-n2{margin-bottom:-.5rem!important}.ml-xl-n2,.mx-xl-n2{margin-left:-.5rem!important}.m-xl-n3{margin:-1rem!important}.mt-xl-n3,.my-xl-n3{margin-top:-1rem!important}.mr-xl-n3,.mx-xl-n3{margin-right:-1rem!important}.mb-xl-n3,.my-xl-n3{margin-bottom:-1rem!important}.ml-xl-n3,.mx-xl-n3{margin-left:-1rem!important}.m-xl-n4{margin:-1.5rem!important}.mt-xl-n4,.my-xl-n4{margin-top:-1.5rem!important}.mr-xl-n4,.mx-xl-n4{margin-right:-1.5rem!important}.mb-xl-n4,.my-xl-n4{margin-bottom:-1.5rem!important}.ml-xl-n4,.mx-xl-n4{margin-left:-1.5rem!important}.m-xl-n5{margin:-3rem!important}.mt-xl-n5,.my-xl-n5{margin-top:-3rem!important}.mr-xl-n5,.mx-xl-n5{margin-right:-3rem!important}.mb-xl-n5,.my-xl-n5{margin-bottom:-3rem!important}.ml-xl-n5,.mx-xl-n5{margin-left:-3rem!important}.m-xl-auto{margin:auto!important}.mt-xl-auto,.my-xl-auto{margin-top:auto!important}.mr-xl-auto,.mx-xl-auto{margin-right:auto!important}.mb-xl-auto,.my-xl-auto{margin-bottom:auto!important}.ml-xl-auto,.mx-xl-auto{margin-left:auto!important}}.main-header .sidebar-toggle:before{content:""!important}
This source diff could not be displayed because it is too large. You can view the blob instead.
This source diff could not be displayed because it is too large. You can view the blob instead.
{"entrypoints":{"app":{"js":["build/runtime.d41d8cd9.js","build/app.cb3451b9.js"],"css":["build/app.8fae770e.css"]},"admin":{"js":["build/runtime.d41d8cd9.js","build/admin.b715fcc4.js"],"css":["build/admin.df5d17d8.css"]}}}
\ No newline at end of file
{
"entrypoints": {
"app": {
"js": [
"/build/runtime.6cf710cd.js",
"/build/app.43b7b3f6.js"
],
"css": [
"/build/app.0d65a23b.css"
]
},
"admin": {
"js": [
"/build/runtime.6cf710cd.js",
"/build/admin.62757d63.js"
],
"css": [
"/build/admin.48a381da.css"
]
}
}
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
!function(e){function r(r){for(var n,i,l=r[0],f=r[1],a=r[2],c=0,s=[];c<l.length;c++)i=l[c],o[i]&&s.push(o[i][0]),o[i]=0;for(n in f)Object.prototype.hasOwnProperty.call(f,n)&&(e[n]=f[n]);for(p&&p(r);s.length;)s.shift()();return u.push.apply(u,a||[]),t()}function t(){for(var e,r=0;r<u.length;r++){for(var t=u[r],n=!0,l=1;l<t.length;l++){var f=t[l];0!==o[f]&&(n=!1)}n&&(u.splice(r--,1),e=i(i.s=t[0]))}return e}var n={},o={0:0},u=[];function i(r){if(n[r])return n[r].exports;var t=n[r]={i:r,l:!1,exports:{}};return e[r].call(t.exports,t,t.exports,i),t.l=!0,t.exports}i.m=e,i.c=n,i.d=function(e,r,t){i.o(e,r)||Object.defineProperty(e,r,{enumerable:!0,get:t})},i.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},i.t=function(e,r){if(1&r&&(e=i(e)),8&r)return e;if(4&r&&"object"==typeof e&&e&&e.__esModule)return e;var t=Object.create(null);if(i.r(t),Object.defineProperty(t,"default",{enumerable:!0,value:e}),2&r&&"string"!=typeof e)for(var n in e)i.d(t,n,function(r){return e[r]}.bind(null,n));return t},i.n=function(e){var r=e&&e.__esModule?function(){return e.default}:function(){return e};return i.d(r,"a",r),r},i.o=function(e,r){return Object.prototype.hasOwnProperty.call(e,r)},i.p="/build/";var l=window.webpackJsonp=window.webpackJsonp||[],f=l.push.bind(l);l.push=r,l=l.slice();for(var a=0;a<l.length;a++)r(l[a]);var p=f;t()}([]);
\ No newline at end of file
......@@ -9,6 +9,8 @@ use App\Entity\Groupe;
use App\Entity\User;
use App\Entity\Usergroup;
use App\Enum\MoyenEnum;
use App\Form\Type\UserFormType;
use App\Form\Type\GeolocFormType;
use FOS\UserBundle\Event\FilterUserResponseEvent;
use FOS\UserBundle\FOSUserEvents;
use Knp\Menu\ItemInterface as MenuItemInterface;
......@@ -18,6 +20,7 @@ use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Route\RouteCollection;
use Sonata\DoctrineORMAdminBundle\Filter\CallbackFilter;
use Sonata\UserBundle\Model\UserManagerInterface;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
......@@ -34,7 +37,7 @@ use Symfony\Component\EventDispatcher\EventDispatcherInterface;
/**
* Administration des adhérents
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class AdherentAdmin extends AbstractAdmin
......@@ -74,13 +77,14 @@ class AdherentAdmin extends AbstractAdmin
->addSelect('u')
;
if ($user->isGranted('ROLE_GESTION_GROUPE') || $user->isGranted('ROLE_CONTACT')) {
if (empty($user->getGroupesgere())) {
if (empty($user->getGroupesgeres())) {
$query->andWhere('false');
} else {
$groupe = $user->getGroupesgere();
$groupe = $user->getGroupesgeres();
$query
->andWhere($query->getRootAliases()[0] . '.groupe = :group')
->setParameter('group', $groupe)
->andWhere($query->expr()->in($query->getRootAliases()[0].'.groupe', ':group'))
// ->andWhere($query->getRootAliases()[0] . '.groupe = :group')
->setParameter('group', $groupes)
;
}
}
......@@ -143,39 +147,52 @@ class AdherentAdmin extends AbstractAdmin
$formMapper
->tab('General')
->with('Identité', ['class' => 'col-md-7'])
->add('user.firstname', TextType::class, array(
'label' => 'Prénom :',
'required' => true
->add('user', UserFormType::class, array(
'label' => false
))
->add('user.lastname', TextType::class, array(
'label' => 'Nom :',
'required' => true
));
if (!$this->isCurrentRoute('create')) {
$formMapper
->add('user.username', TextType::class, array(
'label' => 'Username :',
'required' => true,
'disabled' => true
));
}
$formMapper
->add('user.phone', TextType::class, array(
'label' => 'Téléphone :',
->end()
->with('Addresse', ['class' => 'col-md-5'])
->add('geoloc', GeolocFormType::class, array(
'label' => false,
'required' => false
))
->add('user.email', TextType::class, array(
'label' => 'Email :',
'required' => true
))
->add('groupe', ChoiceType::class, array(
'required' => true,
'label' => 'Groupe local :',
'choices' => $this->getConfigurationPool()->getContainer()->get('doctrine')->getRepository(Groupe::class)->findAll(),
'choice_label' => 'name',
'placeholder' => 'Choisir un groupe',
))
->end();
->end()
->end()
;
// ->with('Identité', ['class' => 'col-md-7'])
// ->add('user.firstname', TextType::class, array(
// 'label' => 'Prénom :',
// 'required' => true
// ))
// ->add('user.lastname', TextType::class, array(
// 'label' => 'Nom :',
// 'required' => true
// ));
// if (!$this->isCurrentRoute('create')) {
// $formMapper
// ->add('user.username', TextType::class, array(
// 'label' => 'Username :',
// 'required' => true,
// 'disabled' => true
// ));
// }
// $formMapper
// ->add('user.phone', TextType::class, array(
// 'label' => 'Téléphone :',
// 'required' => false
// ))
// ->add('user.email', TextType::class, array(
// 'label' => 'Email :',
// 'required' => true
// ))
// ->add('groupe', ChoiceType::class, array(
// 'required' => true,
// 'label' => 'Groupe local :',
// 'choices' => $this->getConfigurationPool()->getContainer()->get('doctrine')->getRepository(Groupe::class)->findAll(),
// 'choice_label' => 'name',
// 'placeholder' => 'Choisir un groupe',
// ))
// ->end();
// ->with('Cotisation', ['class' => 'col-md-5'])
// //@TODO : géré une ou plusieurs cotisations
// ->add('user.cotisations.first.cotisationInfos.annee', TextType::class, array('label' => 'Année', 'data' => $now->format('Y')))
......@@ -212,23 +229,7 @@ class AdherentAdmin extends AbstractAdmin
// ))
// ->end();
// }
$formMapper
->with('Addresse', ['class' => 'col-md-7'])
->add('geoloc.adresse', TextType::class, array(
'label' => 'Addresse :',
'required' => true
))
->add('geoloc.cpostal', TextType::class, array(
'label' => 'Code postal :',
'required' => true
))
->add('geoloc.ville', TextType::class, array(
'label' => 'Ville :',
'required' => true
))
->end()
->end()
;
$em = $this->getConfigurationPool()->getContainer()->get('doctrine')->getManager();
$formMapper->getFormBuilder()->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use ($em) {
$adherent = $event->getData();
......@@ -281,11 +282,40 @@ class AdherentAdmin extends AbstractAdmin
protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
{
$datagridMapper
->add('user.username', null, array('label' => 'Login'))
->add('user.email', null, array('label' => 'Email'))
->add('full_text', CallbackFilter::class, [
'callback' => [$this, 'getFullTextFilter'],
'field_type' => TextType::class,
'label' => "Recherche par nom",
'show_filter' => true,
'advanced_filter' => false
])
->add('groupe', null, [
'label' => "Groupe",
'show_filter' => true,
'advanced_filter' => false
])
->add('user.email', null, [
'label' => "Email"
])
;
}
public function getFullTextFilter($queryBuilder, $alias, $field, $value)
{
if (!$value['value']) {
return;
}
// Use `andWhere` instead of `where` to prevent overriding existing `where` conditions
$queryBuilder->andWhere($queryBuilder->expr()->orX(
$queryBuilder->expr()->like('u.username', $queryBuilder->expr()->literal('%' . $value['value'] . '%')),
$queryBuilder->expr()->like('u.firstname', $queryBuilder->expr()->literal('%' . $value['value'] . '%')),
$queryBuilder->expr()->like('u.lastname', $queryBuilder->expr()->literal('%' . $value['value'] . '%'))
));
return true;
}
/**
* @param EventDispatcherInterface $userManager
*/
......@@ -349,4 +379,19 @@ class AdherentAdmin extends AbstractAdmin
return $actions;
}
public function getExportFields()
{
return [
'Id' => 'id',
'Nom' => 'user.lastname',
'Prénom' => 'user.firstname',
'username' => 'user.username',
'Email' => 'user.email',
'Groupe' => 'groupe.name',
'Téléphone' => 'user.phone',
'Mobile' => 'user.mobile',
'E-compte' => 'ecompte'
];
}
}
......@@ -3,20 +3,25 @@
namespace App\Admin;
use App\Entity\Geoloc;
use App\Entity\Groupe;
use App\Form\Type\GeolocFormType;
use Doctrine\ORM\EntityRepository;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Route\RouteCollection;
use Sonata\AdminBundle\Show\ShowMapper;
use Sonata\DoctrineORMAdminBundle\Filter\CallbackFilter;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Form\Extension\Core\Type\TextType;
/**
* Administration des comptoirs
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class ComptoirAdmin extends AbstractAdmin
......@@ -40,13 +45,14 @@ class ComptoirAdmin extends AbstractAdmin
$query = parent::createQuery($context);
$user = $this->security->getUser();
if ($user->isGranted('ROLE_GESTION_GROUPE') || $user->isGranted('ROLE_CONTACT')) {
if (empty($user->getGroupesgere())) {
if (empty($user->getGroupesgeres())) {
$query->andWhere('false');
} else {
$groupe = $user->getGroupesgere();
$groupes = $user->getGroupesgeres();
$query
->andWhere($query->getRootAliases()[0] . '.groupe = :group')
->setParameter('group', $groupe)
->andWhere($query->expr()->in($query->getRootAliases()[0].'.groupe', ':group'))
// ->andWhere($query->getRootAliases()[0] . '.groupe = :group')
->setParameter('group', $groupes)
;
}
}
......@@ -59,16 +65,34 @@ class ComptoirAdmin extends AbstractAdmin
protected function configureFormFields(FormMapper $formMapper)
{
$comptoir = $this->getSubject();
$user = $this->security->getUser();
if ($this->isCurrentRoute('create')) {
$geoloc = new Geoloc();
$comptoir->setGeoloc($geoloc);
}
$formMapper
->with('Comptoir', ['class' => 'col-md-8'])
->add('groupe', null, array(
->with('Comptoir', ['class' => 'col-md-8']);
if (($user->isGranted('ROLE_GESTION_GROUPE') || $user->isGranted('ROLE_CONTACT')) && !empty($user->getGroupesgeres())) {
$em = $this->modelManager->getEntityManager(Groupe::class);
$formMapper->add('groupe', null, array(
'label' => 'Groupe local',
'required' => true,
))
'query_builder' => function (EntityRepository $repo) use ($user) {
return $repo->createQueryBuilder('g')
->select('g')
->join('g.gestionnaires', 'c')
->where('c.id = :user')
->setParameter('user', $user->getId());
},
));
} else {
$formMapper->add('groupe', null, array(
'label' => 'Groupe local',
'required' => true,
));
}
$formMapper
->add('name', null, array(
'label' => 'Nom',
'required' => true,
......@@ -97,11 +121,40 @@ class ComptoirAdmin extends AbstractAdmin
*/
protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
{
if ($this->isGranted('ROLE_ADMIN') || $this->isGranted('ROLE_SUPER_ADMIN') || $this->isGranted('ROLE_ADMIN_SIEGE')) {
$datagridMapper
->add('groupe', null, [
'label' => "Groupe",
'show_filter' => true,
'advanced_filter' => false
])
;
}
$datagridMapper
->add('enabled')
->add('full_text', CallbackFilter::class, [
'callback' => [$this, 'getFullTextFilter'],
'field_type' => TextType::class,
'label' => "Recherche par nom",
'show_filter' => true,
'advanced_filter' => false
])
;
}
public function getFullTextFilter($queryBuilder, $alias, $field, $value)
{
if (!$value['value']) {
return;
}
// Use `andWhere` instead of `where` to prevent overriding existing `where` conditions
$queryBuilder->andWhere(
$queryBuilder->expr()->like($alias.'.name', $queryBuilder->expr()->literal('%' . $value['value'] . '%'))
);
return true;
}
protected function configureRoutes(RouteCollection $collection)
{
$collection->remove('delete');
......@@ -117,8 +170,8 @@ class ComptoirAdmin extends AbstractAdmin
->addIdentifier('name')
->addIdentifier('email')
->addIdentifier('compte', null, array('label' => 'Solde'))
->addIdentifier('geoloc.adresse')
->addIdentifier('tel')
->addIdentifier('geoloc.adresse', null, array('label' => 'Adresse'))
->addIdentifier('tel', null, array('label' => 'Téléphone'))
->addIdentifier('enabled', null, array('label' => 'Activé', 'datatype' => 'App.Comptoir', 'template' => '@SonataAdmin/Boolean/editable_boolean.html.twig'))
;
}
......
......@@ -15,7 +15,7 @@ use Symfony\Component\Form\Extension\Core\Type\HiddenType;
/**
* Administration des cotisations des adhérents
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class CotisationAdherentAdmin extends CotisationAdmin
......@@ -40,13 +40,14 @@ class CotisationAdherentAdmin extends CotisationAdmin
// ->andWhere('u.adherent IS NOT NULL')
;
if ($user->isGranted('ROLE_GESTION_GROUPE') || $user->isGranted('ROLE_CONTACT')) {
if (empty($user->getGroupesgere())) {
if (empty($user->getGroupesgeres())) {
$query->andWhere('false');
} else {
$groupe = $user->getGroupesgere();
$groupe = $this->session->get('_groupegere');
$em = $this->getConfigurationPool()->getContainer()->get('doctrine')->getEntityManager();
$adhTable = $em->getMetadataFactory()->getMetadataFor(Adherent::class)->getTableName();
$connection = $em->getConnection();
$statement = $connection->prepare('SELECT f.id FROM flux f INNER JOIN adherent a ON (a.id = f.adherent_id OR a.id = f.adherent_dest_id) WHERE a.groupe_id = '.$groupe->getId());
$statement = $connection->prepare('SELECT f.id FROM flux f INNER JOIN '.$adhTable.' a ON (a.id = f.adherent_id OR a.id = f.adherent_dest_id) WHERE a.groupe_id = '.$groupe->getId());
$statement->execute();
$ids = $statement->fetchAll();
$query
......@@ -98,9 +99,6 @@ class CotisationAdherentAdmin extends CotisationAdmin
->add('reference', HiddenType::class, array(
'data' => 'cotisation_adherent'
))
->add('type', HiddenType::class, array(
'data' => 'cotisation_adherent'
))
->add('expediteur', EntityType::class, $expediteurInfos)
->add('operateur', HiddenType::class, array(
'data' => $this->security->getUser()->getId(),
......
......@@ -3,9 +3,11 @@
namespace App\Admin;
use App\Entity\Adherent;
use App\Entity\GlobalParameter;
use App\Entity\Prestataire;
use App\Entity\Siege;
use App\Enum\MoyenEnum;
use Doctrine\ORM\EntityManagerInterface;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
......@@ -25,13 +27,14 @@ use Symfony\Component\Security\Core\Security;
/**
* Administration des cotisations
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class CotisationAdmin extends AbstractAdmin
{
protected $baseRouteName = 'cotisation';
protected $baseRoutePattern = 'cotisation';
protected $em;
protected $security;
protected $container;
......@@ -41,8 +44,9 @@ class CotisationAdmin extends AbstractAdmin
'_sort_by' => 'createdAt',
];
public function setSecurity(Security $security, ContainerInterface $container)
public function setSecurity(Security $security, ContainerInterface $container, EntityManagerInterface $em)
{
$this->em = $em;
$this->security = $security;
$this->container = $container;
}
......@@ -82,7 +86,7 @@ class CotisationAdmin extends AbstractAdmin
))
->add('montant', MoneyType::class, array(
'label' => 'Montant',
'data' => ($cotisation->getMontant() != null)?$cotisation->getMontant():floatval($this->container->getParameter('app.cotisation_montant'))
'data' => ($cotisation->getMontant() != null)?$cotisation->getMontant():floatval($this->em->getRepository(GlobalParameter::class)->val(GlobalParameter::COTISATION_MONTANT))
))
->add('moyen', ChoiceType::class, array(
'required' => true,
......
......@@ -2,6 +2,7 @@
namespace App\Admin;
use App\Entity\Flux;
use App\Entity\Prestataire;
use App\Entity\User;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
......@@ -16,7 +17,7 @@ use Symfony\Component\Form\Extension\Core\Type\HiddenType;
/**
* Administration des cotisations des prestataires
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class CotisationPrestataireAdmin extends CotisationAdmin
......@@ -41,13 +42,15 @@ class CotisationPrestataireAdmin extends CotisationAdmin
// ->andWhere('u.prestataire IS NOT NULL')
;
if ($user->isGranted('ROLE_GESTION_GROUPE') || $user->isGranted('ROLE_CONTACT')) {
if (empty($user->getGroupesgere())) {
if (empty($user->getGroupesgeres())) {
$query->andWhere('false');
} else {
$groupe = $user->getGroupesgere();
$groupe = $this->session->get('_groupegere');
$em = $this->getConfigurationPool()->getContainer()->get('doctrine')->getEntityManager();
$fluxTable = $em->getMetadataFactory()->getMetadataFor(Flux::class)->getTableName();
$prestaTable = $em->getMetadataFactory()->getMetadataFor(Prestataire::class)->getTableName();
$connection = $em->getConnection();
$statement = $connection->prepare('SELECT f.id FROM flux f INNER JOIN prestataire a ON (a.id = f.prestataire_id OR a.id = f.prestataire_dest_id) WHERE a.groupe_id = '.$groupe->getId());
$statement = $connection->prepare('SELECT f.id FROM '.$fluxTable.' f INNER JOIN '.$prestaTable.' a ON (a.id = f.prestataire_id OR a.id = f.prestataire_dest_id) WHERE a.groupe_id = '.$groupe->getId());
$statement->execute();
$ids = $statement->fetchAll();
$query
......@@ -100,9 +103,6 @@ class CotisationPrestataireAdmin extends CotisationAdmin
->add('reference', HiddenType::class, array(
'data' => 'cotisation_prestataire'
))
->add('type', HiddenType::class, array(
'data' => 'cotisation_prestataire'
))
->add('expediteur', EntityType::class, $expediteurInfos)
->add('operateur', HiddenType::class, array(
'data' => $this->security->getUser()->getId(),
......
......@@ -16,7 +16,7 @@ use Symfony\Component\Form\Extension\Core\Type\TextType;
/**
* Administration des documents
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class DocumentAdmin extends AbstractAdmin
......
......@@ -16,7 +16,7 @@ use Symfony\Component\Form\Extension\Core\Type\TextType;
/**
* Administration des FAQ
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class FaqAdmin extends AbstractAdmin
......
......@@ -3,6 +3,7 @@
namespace App\Admin;
use App\Entity\User;
use App\Entity\Flux;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
......@@ -17,7 +18,7 @@ use Symfony\Component\Translation\TranslatorInterface;
/**
* Administration des Flux
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class FluxAdmin extends AbstractAdmin
......@@ -42,6 +43,18 @@ class FluxAdmin extends AbstractAdmin
/**
* {@inheritdoc}
*/
public function createQuery($context = 'list')
{
$query = $this->getModelManager()->createQuery(Flux::class);
foreach ($this->extensions as $extension) {
$extension->configureQuery($this, $query, $context);
}
return $query;
}
/**
* {@inheritdoc}
*/
protected function configureRoutes(RouteCollection $collection)
{
$collection->clearExcept(array('list', 'export'));
......@@ -124,13 +137,14 @@ class FluxAdmin extends AbstractAdmin
{
unset($this->listModes['mosaic']);
$listMapper
->addIdentifier('createdAt', null, array('label' => 'Date'))
->addIdentifier('createdAt', 'datetime', array('label' => 'Date'))
->addIdentifier('type', null, array('label' => 'Type'))
->addIdentifier('operateur', User::class, array('label' => 'Operateur'))
->addIdentifier('montant', null, array('label' => 'Montant'))
->addIdentifier('expediteur', null, array('label' => 'Expediteur'))
->addIdentifier('destinataire', null, array('label' => 'Destinataire'))
->addIdentifier('montant', null, array('label' => 'Montant'))
->add('operateur', null, array('label' => 'Operateur'))
->addIdentifier('reference', null, array('label' => 'Reference'))
->addIdentifier('verify', null, array('label' => 'Vérifié'))
;
}
}
......@@ -8,7 +8,7 @@ use Sonata\MediaBundle\Provider\MediaProviderInterface;
/**
* Administration des galleries de medias (image, document...)
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class GalleryAdmin extends BaseGalleryAdmin
......
<?php
namespace App\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Route\RouteCollection;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
/**
* Administration des paramètres généraux de l'outil de MLC
*
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class GlobalParameterAdmin extends AbstractAdmin
{
protected $translator;
protected $datagridValues = [
'_sort_order' => 'DESC',
'_sort_by' => 'createdAt',
];
/**
* {@inheritdoc}
*/
protected function configureFormFields(FormMapper $formMapper)
{
$formMapper
->add('name', TextType::class, array(
'label' => 'Nom :',
'attr' => array( 'class' => 'text-uppercase' )
))
->add('value', TextType::class, array(
'label' => 'Valeur :'
))
->add('mandatory', HiddenType::class, array(
'empty_data' => false,
'data' => false
))
;
}
/**
* {@inheritdoc}
*/
protected function configureListFields(ListMapper $listMapper)
{
unset($this->listModes['mosaic']);
$listMapper
->add('name', null, array('label' => 'Nom'))
->add('value', null, array('editable' => true, 'truncate' => array('length' => 80), 'label' => 'Value'))
->add('_action', null, [
'label' => 'Action(s)',
'actions' => [
'edit' => ['template' => '@SonataAdmin/CRUD/list__action_edit_gp.html.twig'],
'delete' => ['template' => '@SonataAdmin/CRUD/list__action_delete_gp.html.twig'],
]
])
;
}
public function getBatchActions()
{
$actions = parent::getBatchActions();
unset($actions['delete']);
unset($actions['edit']);
return $actions;
}
}
......@@ -11,6 +11,7 @@ use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Route\RouteCollection;
use Sonata\AdminBundle\Show\ShowMapper;
use Sonata\DoctrineORMAdminBundle\Filter\CallbackFilter;
use Sonata\FormatterBundle\Form\Type\SimpleFormatterType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
......@@ -21,7 +22,7 @@ use Symfony\Component\Form\Extension\Core\Type\TextType;
/**
* Administration des groupes locaux
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class GroupeAdmin extends AbstractAdmin
......@@ -31,6 +32,12 @@ class GroupeAdmin extends AbstractAdmin
'_sort_by' => 'name',
];
public function configure()
{
parent::configure();
$this->classnameLabel = "Groupes locaux";
}
/**
* {@inheritdoc}
*/
......@@ -89,16 +96,47 @@ class GroupeAdmin extends AbstractAdmin
;
}
public function postPersist($object)
{
$this->addFlash(
'sonata_flash_success',
$this->trans(
"Après avoir créer le groupe %name%, il est conseiller d'ajouter un gestionnaire de groupe",
['%name%' => $this->escapeHtml($this->admin->toString($object))]
)
);
}
/**
* {@inheritdoc}
*/
protected function configureDatagridFilters(DatagridMapper $datagridMapper): void
{
$datagridMapper
->add('enabled')
->add('full_text', CallbackFilter::class, [
'callback' => [$this, 'getFullTextFilter'],
'field_type' => TextType::class,
'label' => "Recherche par nom",
'show_filter' => true,
'advanced_filter' => false
])
;
}
public function getFullTextFilter($queryBuilder, $alias, $field, $value)
{
if (!$value['value']) {
return;
}
// Use `andWhere` instead of `where` to prevent overriding existing `where` conditions
$queryBuilder->andWhere(
$queryBuilder->expr()->like($alias.'.name', $queryBuilder->expr()->literal('%' . $value['value'] . '%'))
);
return true;
}
protected function configureRoutes(RouteCollection $collection)
{
$collection->remove('delete');
......
......@@ -22,7 +22,7 @@ use Symfony\Component\Security\Core\Security;
/**
* Administration des groupe de prestataires (amap, marche)
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class GroupeprestataireAdmin extends AbstractAdmin
......@@ -53,17 +53,32 @@ class GroupeprestataireAdmin extends AbstractAdmin
$user = $this->security->getUser();
$query = parent::createQuery($context);
if ($user->isGranted('ROLE_GESTION_GROUPE') || $user->isGranted('ROLE_CONTACT')) {
if (empty($user->getGroupesgere())) {
if (empty($user->getGroupesgeres())) {
$query->andWhere('false');
} else {
$query
->andWhere($query->getRootAliases()[0].'.groupe = :groupe')
->setParameter('groupe', $user->getGroupesgere())
->andWhere($query->expr()->in($query->getRootAliases()[0].'.groupe', ':groupe'))
// ->andWhere($query->getRootAliases()[0].'.groupe = :groupe')
->setParameter('groupe', $user->getGroupesgeres())
;
}
}
// dump($query->getQuery());
// exit();
// @TODO : NE FONCTIONNE PAS : pour pouvoir classer par nombre de prestataires !
// voir https://github.com/sonata-project/SonataDoctrineORMAdminBundle/issues/297
if ('list' === $context) {
$rootAlias = $query->getRootAliases()[0];
$parameters = $this->getFilterParameters();
if ('getPrestatairesCount' === $parameters['_sort_by']) {
$query->setDistinct(true);
// $query->select('o', 'DISTINCT o');
// $query
// ->leftJoin($rootAlias.'.prestataires', 'gpr')
// // ->leftJoin('groupes_prestataires.prestataires', 'pr')
// ->groupBy($rootAlias.'.id')
// ->orderBy('COUNT(gpr.id)', $parameters['_sort_order'])
// ;
}
}
return $query;
}
......@@ -76,9 +91,7 @@ class GroupeprestataireAdmin extends AbstractAdmin
$user = $this->security->getUser();
$prestataires = $this->getConfigurationPool()->getContainer()->get('doctrine')->getRepository(Prestataire::class)->findBy(array('enabled' => true), array('raison'=> 'ASC'));
$groupepresta = $this->getSubject();
if ($this->isCurrentRoute('create') && $user->getGroupesgere() != null) {
$groupepresta->setGroupe($user->getGroupesgere());
}
$formMapper
->with('Informations', ['class' => 'col-md-7'])
->add('type', ChoiceType::class, array(
......@@ -93,8 +106,9 @@ class GroupeprestataireAdmin extends AbstractAdmin
'required' => true
))
;
if (($user->isGranted('ROLE_GESTION_GROUPE') || $user->isGranted('ROLE_CONTACT')) && $this->security->getUser()->getGroupesgere() != null) {
$prestataires = $this->getConfigurationPool()->getContainer()->get('doctrine')->getRepository(Prestataire::class)->findBy(array('enabled' => true, 'groupe' => $this->security->getUser()->getGroupesgere()), array('raison'=> 'ASC'));
if (($user->isGranted('ROLE_GESTION_GROUPE') || $user->isGranted('ROLE_CONTACT')) && !empty($this->security->getUser()->getGroupesgeres())) {
//TODO : check request !
$prestataires = $this->getConfigurationPool()->getContainer()->get('doctrine')->getRepository(Prestataire::class)->findBy(array('enabled' => true, 'groupe' => $this->security->getUser()->getGroupesgeres()), array('raison'=> 'ASC'));
}
if ($user->isGranted('ROLE_SUPER_ADMIN') || $user->isGranted('ROLE_ADMIN_SIEGE')) {
$formMapper
......@@ -207,25 +221,4 @@ class GroupeprestataireAdmin extends AbstractAdmin
unset($actions['list']);
return $actions;
}
// @TODO : NE FONCTIONNE PAS : pour pouvoir classer par nombre de prestataires !
// voir https://github.com/sonata-project/SonataDoctrineORMAdminBundle/issues/297
// public function createQuery($context = 'list')
// {
// $query = parent::createQuery($context);
// if ('list' === $context) {
// $rootAlias = $query->getRootAliases()[0];
// $parameters = $this->getFilterParameters();
// if ('getPrestatairesCount' === $parameters['_sort_by']) {
// $query->select('o', 'DISTINCT o');
// $query
// ->leftJoin($rootAlias.'.prestataires', 'gpr')
// // ->leftJoin('groupes_prestataires.prestataires', 'pr')
// ->groupBy($rootAlias.'.id')
// ->orderBy('COUNT(gpr.id)', $parameters['_sort_order'])
// ;
// }
// }
// return $query;
// }
}
......@@ -14,7 +14,7 @@ use Symfony\Component\Translation\TranslatorInterface;
/**
* Import de données
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class ImportAdmin extends AbstractAdmin
......
......@@ -9,7 +9,7 @@ use Symfony\Component\HttpFoundation\File\File;
/**
* Import provider
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class ImportProvider extends FileProvider
......@@ -19,7 +19,7 @@ class ImportProvider extends FileProvider
*/
protected function doTransform(MediaInterface $media)
{
// ...
// ...
}
/**
......@@ -43,4 +43,4 @@ class ImportProvider extends FileProvider
public function postUpdate(MediaInterface $media)
{
}
}
\ No newline at end of file
}
......@@ -8,7 +8,7 @@ use Sonata\MediaBundle\Provider\MediaProviderInterface;
/**
* Administration des medias (image, document...)
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class MediaAdmin extends BaseMediaAdmin
......
......@@ -16,7 +16,7 @@ use Symfony\Component\Form\Extension\Core\Type\TextType;
/**
* Administration des news
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class NewsAdmin extends AbstractAdmin
......
......@@ -20,7 +20,7 @@ use Symfony\Component\Security\Core\Security;
/**
* Administration des pages
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class PageAdmin extends AbstractAdmin
......
......@@ -3,6 +3,7 @@
namespace App\Admin;
use App\Admin\UserAdmin;
use App\Entity\Adherent;
use App\Entity\Cotisation;
use App\Entity\CotisationPrestataire;
use App\Entity\Geoloc;
......@@ -12,6 +13,8 @@ use App\Entity\User;
use App\Entity\Usergroup;
use App\Enum\MoyenEnum;
use App\Form\Type\CotisationFormType;
use App\Form\Type\GeolocFormType;
use App\Form\Type\UserFormType;
use Doctrine\ORM\Query;
use FOS\CKEditorBundle\Form\Type\CKEditorType;
use FOS\UserBundle\Model\UserManagerInterface;
......@@ -23,7 +26,11 @@ use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Route\RouteCollection;
use Sonata\AdminBundle\Show\ShowMapper;
use Sonata\DoctrineORMAdminBundle\Filter\CallbackFilter;
use Sonata\MediaBundle\Form\Type\MediaType;
use Sonata\MediaBundle\Provider\Pool;
use Sonata\MediaBundle\Provider\MediaProviderInterface;
use Sonata\AdminBundle\Object\Metadata;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
......@@ -40,7 +47,7 @@ use Symfony\Component\Security\Core\Security;
/**
* Administration des prestataires
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class PrestataireAdmin extends AbstractAdmin
......@@ -48,6 +55,7 @@ class PrestataireAdmin extends AbstractAdmin
protected $baseRouteName = 'prestataire';
protected $baseRoutePattern = 'prestataire';
protected $security;
protected $pool;
protected $datagridValues = [
// reverse order (default = 'ASC')
'_sort_order' => 'DESC',
......@@ -62,6 +70,11 @@ class PrestataireAdmin extends AbstractAdmin
$this->security = $security;
}
public function setPool(Pool $pool)
{
$this->pool = $pool;
}
public function configure()
{
parent::configure();
......@@ -74,18 +87,20 @@ class PrestataireAdmin extends AbstractAdmin
{
$user = $this->security->getUser();
$query = parent::createQuery($context);
$query
->innerJoin($query->getRootAliases()[0] .'.user', 'u')
->addSelect('u')
;
if ($user->isGranted('ROLE_GESTION_GROUPE') || $user->isGranted('ROLE_CONTACT')) {
if (empty($user->getGroupesgere())) {
// $query
// ->innerJoin($query->getRootAliases()[0] .'.users', 'u')
// ->addSelect('u')
// ;
if ($user->hasRole('ROLE_GESTION_GROUPE') || $user->hasRole('ROLE_CONTACT')) {
if (empty($user->getGroupesgeres())) {
$query->andWhere('false');
} else {
$groupe = $user->getGroupesgere();
// TODO : check request !
$groupes = $user->getGroupesgeres();
$query
->andWhere($query->getRootAliases()[0] . '.groupe = :group')
->setParameter('group', $groupe)
->andWhere($query->expr()->in($query->getRootAliases()[0].'.groupe', ':group'))
// ->andWhere($query->getRootAliases()[0] . '.groupe = :group')
->setParameter('group', $groupes)
;
}
}
......@@ -100,19 +115,25 @@ class PrestataireAdmin extends AbstractAdmin
$user = $this->security->getUser();
$admin = $this->isChild() ? $this->getParent() : $this;
$id = $admin->getRequest()->get('id');
$user = $this->getConfigurationPool()->getContainer()->get('doctrine')->getRepository(User::class)->findOneBy(array('prestataire' => $id));
if ($this->isGranted('EDIT') && $user != null) {
$menu->addChild("Modifier l'utilisateur", [
'uri' => $this->getConfigurationPool()->getContainer()->get('router')->generate('admin_app_user_edit', ['id' => $user->getId()], UrlGeneratorInterface::ABSOLUTE_URL)
$presta = $this->getConfigurationPool()->getContainer()->get('doctrine')->getRepository(Prestataire::class)->findOneById($id);
$users = $this->getConfigurationPool()->getContainer()->get('doctrine')->getRepository(User::class)->findByPrestataire($id);
if ($this->isGranted('EDIT') && !empty($users)) {
// TODO : si plusieurs utilisateurs, mettre un lien par user pour modifier celui-ci ?
// $menu->addChild("Modifier l'utilisateur", [
// 'uri' => $this->getConfigurationPool ()->getContainer()->get('router')->generate('admin_app_user_edit', ['id' => $user->getId()], UrlGeneratorInterface::ABSOLUTE_URL)
// ]);
}
// Le prestataire "Monnaie Locale" représentant l'asso recevant les cotisations n'a pas de cotisations lui même !
if (!$presta->isMlc()) {
$menu->addChild("Ajouter une cotisation", [
'uri' => $this->getConfigurationPool()->getContainer()->get('router')->generate('cotisation_prestataire_create', ['expediteur' => $id], UrlGeneratorInterface::ABSOLUTE_URL)
]);
$menu->addChild("Voir les cotisations", [
'uri' => $this->getConfigurationPool()->getContainer()->get('router')->generate('cotisation_prestataire_list', ['filter' => array('expediteur' => array('value' => $id))], UrlGeneratorInterface::ABSOLUTE_URL)
]);
}
$menu->addChild("Ajouter une cotisation", [
'uri' => $this->getConfigurationPool()->getContainer()->get('router')->generate('cotisation_prestataire_create', ['expediteur' => $id], UrlGeneratorInterface::ABSOLUTE_URL)
]);
$menu->addChild("Voir les cotisations", [
'uri' => $this->getConfigurationPool()->getContainer()->get('router')->generate('cotisation_prestataire_list', ['filter' => array('expediteur' => array('value' => $id))], UrlGeneratorInterface::ABSOLUTE_URL)
]);
}
/**
......@@ -131,21 +152,19 @@ class PrestataireAdmin extends AbstractAdmin
} else {
$user->setEnabled(true);
}
// On crée un compte adhérent en même temps que le prestataire
$adh = new Adherent();
$user->setAdherent($adh);
$user = $this->userManager->createUser();
$groupe = $this->getConfigurationPool()->getContainer()->get('doctrine')->getRepository(Usergroup::class)->findOneByName('Prestataire');
$user->addGroup($groupe);
$groupeAdh = $this->getConfigurationPool()->getContainer()->get('doctrine')->getRepository(Usergroup::class)->findOneByName('Adherent');
$groupePresta = $this->getConfigurationPool()->getContainer()->get('doctrine')->getRepository(Usergroup::class)->findOneByName('Prestataire');
$user->addGroup($groupeAdh);
$user->addGroup($groupePresta);
$user->addRole('ROLE_PRESTATAIRE');
$user->setPrestataire($presta);
$presta->setUser($user);
$user->addRole('ROLE_ADHERENT');
$presta->addUser($user);
}
// if (count($presta->getUser()->getCotisations()) <= 0) {
// $cotisation = new Cotisation();
// $cotisation->setOperateur($presta->getUser());
// $cotisation->setExpediteur($presta);
// $cotisation->setDebut($now);
// $cotisation->setFin(new \DateTime('+ 1 year'));
// $presta->getUser()->addCotisation($cotisation);
// }
if ($presta->getGeoloc() == null) {
$presta->setGeoloc(new Geoloc());
}
......@@ -165,37 +184,12 @@ class PrestataireAdmin extends AbstractAdmin
$formMapper
->tab('Prestataire')
->with('Identité', ['class' => 'col-md-7'])
->with('Prestataire', ['class' => 'col-md-7'])
->add('typeprestataire', null, array(
'label' => 'Type :',
'required' => true,
'expanded' => true
))
->add('user.firstname', TextType::class, array(
'label' => 'Prénom :',
'required' => false
))
->add('user.lastname', TextType::class, array(
'label' => 'Nom :',
'required' => false
));
if (!$this->isCurrentRoute('create')) {
$formMapper
->add('user.username', TextType::class, array(
'label' => 'Username :',
'required' => false,
'disabled' => true
));
}
$formMapper
->add('user.phone', TextType::class, array(
'label' => 'Téléphone :',
'required' => false
))
->add('user.email', TextType::class, array(
'label' => 'Email :',
'required' => true
))
->add('groupe', ChoiceType::class, array(
'required' => true,
'label' => 'Groupe local :',
......@@ -203,38 +197,6 @@ class PrestataireAdmin extends AbstractAdmin
'choice_label' => 'name',
'placeholder' => 'Choisir un groupe',
))
->end()
->with('Addresse', ['class' => 'col-md-5'])
->add('geoloc.adresse', TextType::class, array(
'label' => 'Addresse :',
'required' => false
))
->add('geoloc.cpostal', TextType::class, array(
'label' => 'Code postal :',
'required' => false
))
->add('geoloc.ville', TextType::class, array(
'label' => 'Ville :',
'required' => false
))
// ->add('geoloc.lat', TextType::class, array(
// 'label' => 'Latitude :',
// 'required' => false
// ))
// ->add('geoloc.lon', TextType::class, array(
// 'label' => 'Longitude :',
// 'required' => false
// ))
->end()
->with('Image', ['class' => 'col-md-5'])
->add('media', MediaType::class, array(
'provider' => 'sonata.media.provider.image',
'context' => 'prestataire',
'help' => $imageHelp,
'required' => false
))
->end()
->with('Société', ['class' => 'col-md-7'])
->add('raison', TextType::class, array(
'label' => 'Raison :',
'required' => true
......@@ -249,7 +211,7 @@ class PrestataireAdmin extends AbstractAdmin
))
->add('iban', TextType::class, array(
'label' => 'IBAN :',
'required' => true
'required' => false
))
->add('responsable', TextType::class, array(
'label' => 'Responsable :',
......@@ -267,7 +229,29 @@ class PrestataireAdmin extends AbstractAdmin
'label' => 'Description',
'required' => false
))
->end();
->end()
->with('Addresse', ['class' => 'col-md-5'])
->add('geoloc', GeolocFormType::class, array(
'label' => false,
'required' => false
))
->end()
->with('Image', ['class' => 'col-md-5'])
->add('media', MediaType::class, array(
'provider' => 'sonata.media.provider.image',
'context' => 'prestataire',
'help' => $imageHelp,
'required' => false
))
->end()
->with('Gestionnaire', ['class' => 'col-md-7'])
->add('users', null, array(
'label' => false,
'by_reference' => false,
'multiple' => true,
))
->end()
;
// if ($cotisation != null) {
// //@TODO : cotisationS
// $formMapper
......@@ -275,7 +259,6 @@ class PrestataireAdmin extends AbstractAdmin
// ->add('user.cotisations.last.cotisationInfos.annee', TextType::class, array('label' => 'Année', 'data' => intval($now->format('Y'))))
// ->add('user.cotisations.last.montant', MoneyType::class, array(
// 'label' => 'Montant',
// 'empty_data' => floatval($this->getConfigurationPool()->getContainer()->getParameter('app.cotisation_montant'))
// ))
// ->add('user.cotisations.last.moyen', ChoiceType::class, array(
// 'required' => true,
......@@ -336,44 +319,46 @@ class PrestataireAdmin extends AbstractAdmin
// ->end()
// ;
// }
// $formMapper
// ->tab('Cotisation '.$cotisation->getAnnee())
// ->with('Cotisation', ['class' => 'col-md-5'])
// ->add('user.cotisations.get('.$cnt.').cotisationInfos.annee', TextType::class, array('label' => 'Année', 'data' => $now->format('Y')))
// ->add('user.cotisations.get('.$cnt.').montant', TextType::class, array('label' => 'Montant'))
// ->add('user.cotisations.get('.$cnt.').moyen', ChoiceType::class, array(
// 'required' => true,
// 'label' => 'Moyen :',
// 'choices' => MoyenEnum::getAvailableTypes(),
// 'choice_label' => function ($choice) {
// return MoyenEnum::getTypeName($choice);
// },
// ))
// ->add('user.cotisations.get('.$cnt.').cotisationInfos.recu', CheckboxType::class, array('label' => 'Reçu'))
// ->end()
// ->with('Date', ['class' => 'col-md-5'])
// ->add('user.cotisations.get('.$cnt.').cotisationInfos.debut', DateType::class, array(
// 'label' => 'Date de début',
// 'data' => new \DateTime(),
// 'widget' => 'single_text',
// 'html5' => false,
// 'attr' => ['class' => 'js-datepicker'],
// ))
// ->add('user.cotisations.get('.$cnt.').cotisationInfos.fin', DateType::class, array(
// 'label' => 'Date de fin',
// 'data' => new \DateTime('+ 1 year'),
// 'widget' => 'single_text',
// 'html5' => false,
// 'attr' => ['class' => 'js-datepicker'],
// ))
// ->end()
// ;
// $formMapper
// ->tab('Cotisation '.$cotisation->getAnnee())
// ->with('Cotisation', ['class' => 'col-md-5'])
// ->add('user.cotisations.get('.$cnt.').cotisationInfos.annee', TextType::class, array('label' => 'Année', 'data' => $now->format('Y')))
// ->add('user.cotisations.get('.$cnt.').montant', TextType::class, array('label' => 'Montant'))
// ->add('user.cotisations.get('.$cnt.').moyen', ChoiceType::class, array(
// 'required' => true,
// 'label' => 'Moyen :',
// 'choices' => MoyenEnum::getAvailableTypes(),
// 'choice_label' => function ($choice) {
// return MoyenEnum::getTypeName($choice);
// },
// ))
// ->add('user.cotisations.get('.$cnt.').cotisationInfos.recu', CheckboxType::class, array('label' => 'Reçu'))
// ->end()
// ->with('Date', ['class' => 'col-md-5'])
// ->add('user.cotisations.get('.$cnt.').cotisationInfos.debut', DateType::class, array(
// 'label' => 'Date de début',
// 'data' => new \DateTime(),
// 'widget' => 'single_text',
// 'html5' => false,
// 'attr' => ['class' => 'js-datepicker'],
// ))
// ->add('user.cotisations.get('.$cnt.').cotisationInfos.fin', DateType::class, array(
// 'label' => 'Date de fin',
// 'data' => new \DateTime('+ 1 year'),
// 'widget' => 'single_text',
// 'html5' => false,
// 'attr' => ['class' => 'js-datepicker'],
// ))
// ->end()
// ;
$formMapper->end();
$em = $this->getConfigurationPool()->getContainer()->get('doctrine')->getManager();
$formMapper->getFormBuilder()->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use ($em) {
$prestataire = $event->getData();
$user = $prestataire->getUser();
$user = $prestataire->getUsers()[0];
// dump($user);
// exit();
if (!$user || null === $user->getId()) {
$repo = $em->getRepository(User::class);
$emailExist = $repo->findBy(array('email' => $user->getEmail()));
......@@ -395,21 +380,21 @@ class PrestataireAdmin extends AbstractAdmin
public function prePersist($prestataire)
{
$em = $this->getConfigurationPool()->getContainer()->get('doctrine')->getManager();
if (empty($prestataire->getUser()->getUsername())) {
$prestataire->getUser()->setUsername($prestataire->getUser()->getEmail());
$user = $prestataire->getUsers()[0];
if (empty($user->getUsername())) {
$user->setUsername($user->getEmail());
}
if (empty($prestataire->getUser()->getPassword())) {
if (empty($user->getPassword())) {
// $tokenGenerator = $this->getConfigurationPool()->getContainer()->get('fos_user.util.token_generator');
// $password = substr($tokenGenerator->generateToken(), 0, 12);
$bytes = random_bytes(64);
$password = rtrim(strtr(base64_encode($bytes), '+/', '-_'), '=');
$prestataire->getUser()->setPassword($password);
$user->setPassword($password);
// TODO : send email to user
}
$this->userManager->updateUser($prestataire->getUser());
$prestataire->getUser()->createEmailToken();
$em->persist($prestataire->getUser());
$this->userManager->updateUser($user);
$user->createEmailToken();
$em->persist($user);
$em->persist($prestataire);
$em->flush();
// TODO : envoyer un mail au nouvel utilisateur avec l'emailtoken via le dispatch d'un event
......@@ -423,12 +408,39 @@ class PrestataireAdmin extends AbstractAdmin
{
parent::configureDatagridFilters($datagridMapper);
$datagridMapper
->add('typeprestataire')
->add('raison')
->add('statut')
->add('full_text', CallbackFilter::class, [
'callback' => [$this, 'getFullTextFilter'],
'field_type' => TextType::class,
'label' => "Recherche par nom",
'show_filter' => true,
'advanced_filter' => false
])
->add('groupe', null, [
'label' => "Groupe",
'show_filter' => true,
'advanced_filter' => false
])
->add('typeprestataire', null, [
'label' => "Type"
])
;
}
public function getFullTextFilter($queryBuilder, $alias, $field, $value)
{
if (!$value['value']) {
return;
}
// Use `andWhere` instead of `where` to prevent overriding existing `where` conditions
$queryBuilder->andWhere($queryBuilder->expr()->orX(
$queryBuilder->expr()->like($alias.'.raison', $queryBuilder->expr()->literal('%' . $value['value'] . '%')),
$queryBuilder->expr()->like($alias.'.statut', $queryBuilder->expr()->literal('%' . $value['value'] . '%')),
$queryBuilder->expr()->like($alias.'.description', $queryBuilder->expr()->literal('%' . $value['value'] . '%'))
));
return true;
}
public function getTemplate($name)
{
if ($name == 'edit') {
......@@ -456,11 +468,9 @@ class PrestataireAdmin extends AbstractAdmin
protected function configureListFields(ListMapper $listMapper): void
{
unset($this->listModes['mosaic']);
// unset($this->listModes['mosaic']);
$user = $this->security->getUser();
$listMapper
->addIdentifier('user.username')
->addIdentifier('user.email')
->addIdentifier('raison')
->addIdentifier('groupe', null, array(
'label' => 'Groupe',
......@@ -468,15 +478,16 @@ class PrestataireAdmin extends AbstractAdmin
'sort_field_mapping' => array('fieldName' => 'name'),
'sort_parent_association_mappings' => array(array('fieldName' => 'groupe'))
))
->addIdentifier('users', null, array('label' => 'Gestionnaires'))
;
if ($user->isGranted('ROLE_GESTION_GROUPE')) {
$listMapper
->addIdentifier('user.enabled', null, array('label' => 'Activé', 'datatype' => 'App.User', 'template' => '@SonataAdmin/Boolean/editable_boolean.html.twig'))
;
}
$listMapper
->addIdentifier('user.createdAt')
;
// if ($user->isGranted('ROLE_GESTION_GROUPE')) {
// $listMapper
// ->addIdentifier('user.enabled', null, array('label' => 'Activé', 'datatype' => 'App.User', 'template' => '@SonataAdmin/Boolean/editable_boolean.html.twig'))
// ;
// }
// $listMapper
// ->addIdentifier('user.createdAt')
// ;
// if ($this->isGranted('ROLE_ALLOWED_TO_SWITCH')) {
// $listMapper
......@@ -490,6 +501,21 @@ class PrestataireAdmin extends AbstractAdmin
$collection->remove('delete');
}
public function getObjectMetadata($object)
{
if ($object->getMedia() != null) {
$provider = $this->pool->getProvider($object->getMedia()->getProviderName());
$url = $provider->generatePublicUrl(
$object->getMedia(),
$provider->getFormatName($object->getMedia(), MediaProviderInterface::FORMAT_ADMIN)
);
return new Metadata($object->getRaison(), strip_tags($object->getDescription()), $url);
}
return new Metadata($object->getRaison(), strip_tags($object->getDescription()));
}
public function getBatchActions()
{
$actions = parent::getBatchActions();
......@@ -497,4 +523,15 @@ class PrestataireAdmin extends AbstractAdmin
return $actions;
}
/* @TODO : définir champ à exporter */
public function getExportFields()
{
return [
'Id' => 'id',
'Raion' => 'raison',
'Groupe' => 'groupe.name',
'E-compte' => 'ecompte'
];
}
}
......@@ -18,7 +18,7 @@ use Symfony\Component\Translation\TranslatorInterface;
/**
* Administration des reconversions (transfert d'un prestataire au siège)
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class ReconversionAdmin extends FluxAdmin
......
......@@ -21,7 +21,7 @@ use Symfony\Component\Security\Core\Security;
/**
* Administration des rubriques
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class RubriqueAdmin extends AbstractAdmin
......@@ -49,6 +49,7 @@ class RubriqueAdmin extends AbstractAdmin
{
$user = $this->security->getUser();
$prestataires = $this->getConfigurationPool()->getContainer()->get('doctrine')->getRepository(Prestataire::class)->findBy(array('enabled' => true), array('raison'=> 'ASC'));
// TODO : ?
// if (($user->isGranted('ROLE_GESTION_GROUPE') || $user->isGranted('ROLE_CONTACT')) && $this->security->getUser()->getGroupesgere() != null) {
// $prestataires = $this->getConfigurationPool()->getContainer()->get('doctrine')->getRepository(Prestataire::class)->findBy(array('enabled' => true, 'groupe' => $this->security->getUser()->getGroupesgere()), array('raison'=> 'ASC'));
// }
......
......@@ -7,7 +7,7 @@ use Sonata\AdminBundle\Route\RouteCollection;
/**
* Administration des traductions
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class TraductionAdmin extends AbstractAdmin
......
......@@ -9,7 +9,7 @@ use Sonata\AdminBundle\Route\RouteCollection;
/**
* Administration des transactions
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class TransactionAdmin extends FluxAdmin
......
......@@ -4,6 +4,9 @@ namespace App\Admin;
use App\Admin\FluxAdmin;
use App\Entity\User;
use App\Entity\Flux;
use App\Entity\Prestataire;
use App\Tools\RoleCheck;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
......@@ -12,18 +15,21 @@ use Sonata\AdminBundle\Form\Type\Filter\ChoiceType;
use Sonata\AdminBundle\Route\RouteCollection;
use Sonata\AdminBundle\Show\ShowMapper;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType as SChoiceType;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Translation\TranslatorInterface;
/**
* Administration des transferts
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class TransfertAdmin extends FluxAdmin
{
protected $security;
protected $session;
protected $rolecheck;
protected $datagridValues = [
'_sort_order' => 'DESC',
'_sort_by' => 'createdAt',
......@@ -34,6 +40,16 @@ class TransfertAdmin extends FluxAdmin
$this->security = $security;
}
public function setSession(SessionInterface $session)
{
$this->session = $session;
}
public function setRoleCheck(RoleCheck $rolecheck)
{
$this->rolecheck = $rolecheck;
}
protected function configureRoutes(RouteCollection $collection)
{
$collection->clearExcept(array('list', 'export'));
......@@ -46,17 +62,19 @@ class TransfertAdmin extends FluxAdmin
{
$user = $this->security->getUser();
$query = parent::createQuery($context);
$query->andWhere($query->getRootAliases()[0].".parenttype = :type")
->setParameter('type', 'transfert');
;
if ($user->isGranted('ROLE_GESTION_GROUPE') || $user->isGranted('ROLE_CONTACT')) {
if (empty($user->getGroupesgere())) {
// $query->andWhere($query->getRootAliases()[0].".parenttype = :type")
// ->setParameter('type', 'transfert');
$em = $this->getConfigurationPool()->getContainer()->get('doctrine')->getEntityManager();
$fluxtable = $em->getMetadataFactory()->getMetadataFor(Flux::class)->getTableName();
if ($this->rolecheck->isGranted('ROLE_GESTION_GROUPE') || $this->rolecheck->isGranted('ROLE_CONTACT')) {
if (empty($user->getGroupesgeres())) {
$query->andWhere('false');
} else {
$groupe = $user->getGroupesgere();
$em = $this->getConfigurationPool()->getContainer()->get('doctrine')->getEntityManager();
$groupe = $this->session->get('_groupegere');
$connection = $em->getConnection();
$statement = $connection->prepare('SELECT f.id FROM flux f WHERE f.groupe_id = '.$groupe->getId().' OR (f.type = \'prestataire_siege\' AND f.prestataire_id IN (SELECT p.id FROM prestataire p WHERE p.groupe_id = '.$groupe->getId().'))');
$prestatable = $em->getMetadataFactory()->getMetadataFor(Prestataire::class)->getTableName();
$statement = $connection->prepare('SELECT f.id FROM '.$fluxtable.' f WHERE f.groupe_id = '.$groupe->getId().' OR (f.type = \'prestataire_siege\' AND f.prestataire_id IN (SELECT p.id FROM '.$fluxtable.' p WHERE p.groupe_id = '.$groupe->getId().'))');
$statement->execute();
$ids = $statement->fetchAll();
$query
......@@ -64,14 +82,14 @@ class TransfertAdmin extends FluxAdmin
->setParameter('ids', $ids)
;
}
} elseif ($user->isGranted('ROLE_COMPTOIR')) {
if (empty($user->getComptoirsgere())) {
} elseif ($this->rolecheck->isGranted('ROLE_COMPTOIR')) {
if (empty($user->getComptoirsgeres())) {
$query->andWhere('false');
} else {
$comptoir = $user->getComptoirsgere();
$comptoir = $this->session->get('_comptoirgere');
$em = $this->getConfigurationPool()->getContainer()->get('doctrine')->getEntityManager();
$connection = $em->getConnection();
$statement = $connection->prepare('SELECT f.id FROM flux f WHERE f.comptoir_id = '.$comptoir->getId().' OR f.user_id = '.$user->getId());
$statement = $connection->prepare('SELECT f.id FROM '.$fluxtable.' f WHERE f.comptoir_id = '.$comptoir->getId().' OR f.user_id = '.$user->getId());
$statement->execute();
$ids = $statement->fetchAll();
$query
......
......@@ -16,7 +16,7 @@ use Symfony\Component\Form\FormEvents;
/**
* Administration des utilisateurs
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
class UserAdmin extends SonataUserAdmin
......
......@@ -135,8 +135,8 @@ class UserAdmin extends BaseUserAdmin
->with('General', ['class' => 'col-md-6'])->end()
// ->with('Social', ['class' => 'col-md-6'])->end()
->end();
if (!($subject->isGranted('ROLE_SUPER_ADMIN') || $subject->isGranted('ROLE_ADMIN_SIEGE'))) {
$formMapper
// if (!($subject->isGranted('ROLE_SUPER_ADMIN') || $subject->isGranted('ROLE_ADMIN_SIEGE'))) {
$formMapper
->tab('Security')
->with('Groups', ['class' => 'col-md-8'])->end()
->with('Status', ['class' => 'col-md-4'])->end()
......@@ -144,7 +144,7 @@ class UserAdmin extends BaseUserAdmin
// ->with('Roles', ['class' => 'col-md-12'])->end()
->end()
;
}
// }
$now = new \DateTime();
......@@ -198,39 +198,43 @@ class UserAdmin extends BaseUserAdmin
// ->add('gplusName', null, ['required' => false])
// ->end()
->end();
if (!($subject->isGranted('ROLE_SUPER_ADMIN') || $subject->isGranted('ROLE_ADMIN_SIEGE'))) {
$formMapper
// if (!($subject->isGranted('ROLE_SUPER_ADMIN') || $subject->isGranted('ROLE_ADMIN_SIEGE'))) {
$formMapper
->tab('Security')
->with('Status')
->add('enabled', null, ['required' => false])
->end()
;
$hideOrShowGroupe = ['class' => 'hide'];
$hideOrShowComptoir = ['class' => 'hide'];
if (($subject->isGranted('ROLE_GESTION_GROUPE') || $subject->isGranted('ROLE_CONTACT')) && empty($subject->getGroupesgere())) {
$hideOrShowGroupe = [];
}
if ($subject->isGranted('ROLE_COMPTOIR') && empty($subject->getComptoirsgere())) {
$hideOrShowComptoir = [];
}
$formMapper
$hideOrShowGroupe = ['class' => 'hide'];
$hideOrShowComptoir = ['class' => 'hide'];
if (($subject->isGranted('ROLE_GESTION_GROUPE') || $subject->isGranted('ROLE_CONTACT') || $subject->isGranted('ROLE_TRESORIER'))) {
$hideOrShowGroupe = [];
}
if ($subject->isGranted('ROLE_COMPTOIR')) {
$hideOrShowComptoir = [];
}
$formMapper
->with('Groups')
->add('groups', ModelType::class, [
'required' => false,
'expanded' => true,
'multiple' => true,
])
->add('groupesgere', null, [
->add('groupesgeres', null, [
'required' => false,
'label' => 'Groupe local géré (obligatoire)',
'attr' => $hideOrShowGroupe,
'label_attr' => $hideOrShowGroupe,
'multiple' => true,
'by_reference' => false
])
->add('comptoirsgere', null, [
->add('comptoirsgeres', null, [
'required' => false,
'label' => 'Comptoir géré (obligatoire)',
'attr' => $hideOrShowComptoir,
'label_attr' => $hideOrShowComptoir,
'multiple' => true,
'by_reference' => false
])
->end()
->with('Roles')
......@@ -243,7 +247,7 @@ class UserAdmin extends BaseUserAdmin
->end()
->end()
;
}
// }
// ->with('Keys')
// ->add('token', null, ['required' => false])
// ->add('twoStepVerificationCode', null, ['required' => false])
......
......@@ -2,6 +2,7 @@
namespace App\Controller;
use App\Entity\User;
use App\Entity\TransfertPrestataireSiege;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
......@@ -11,6 +12,8 @@ use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\StreamedResponse;
use Symfony\Component\Routing\Annotation\Route;
use Geocoder\Provider\Nominatim\Nominatim;
use Geocoder\Query\GeocodeQuery;
class AdminController extends Controller
{
......@@ -42,17 +45,26 @@ class AdminController extends Controller
$this->em->flush();
} else {
$status = 'error';
$this->get('session')->getFlashBag()->add(
'notice',
'Erreur : veuillez recharger la page et réessayer !'
);
}
} catch (\Exception $e) {
$status = 'error';
$this->get('session')->getFlashBag()->add(
'notice',
'Erreur : veuillez recharger la page et réessayer !'
);
}
return new JsonResponse(array('status' => $status, 'newvalue' => ($object->isEnabled()?'true':'false')));
}
/**
* @Route("/admin/setreconverti/{id}", name="setreconverti")
* @IsGranted({"ROLE_TRESORIER", "ROLE_ADMIN_TRANSFERT_GERER_VIEW"})
*/
public function setReconvertiAction($id, Request $request)
public function setReconvertiAction(TransfertPrestataireSiege $object, Request $request)
{
$referer = $request->headers->get('referer');
if ($referer && !$request->isXmlHttpRequest()) {
......@@ -62,7 +74,6 @@ class AdminController extends Controller
}
$status = 'success';
try {
$object = $this->em->getRepository(TransfertPrestataireSiege::class)->findOneById($id);
if ($object && method_exists($object, 'setReconverti')) {
$object->setReconverti(!$object->getReconverti());
$this->em->persist($object);
......@@ -78,6 +89,7 @@ class AdminController extends Controller
/**
* @Route("/admin/getcsv", name="getcsv")
* @IsGranted({"ROLE_ADMIN_IMPORT_EDIT", "ROLE_ADMIN_IMPORT_LIST", "ROLE_ADMIN_IMPORT_CREATE", "ROLE_ADMIN_IMPORT_VIEW", "ROLE_ADMIN_IMPORT_DELETE", "ROLE_ADMIN_IMPORT_EXPORT", "ROLE_ADMIN_IMPORT_ALL"})
*/
public function getCsvAction(Request $request)
{
......@@ -102,4 +114,45 @@ class AdminController extends Controller
return $response;
}
/**
* @Route("/admin/geoloc", name="geolocAdresse")
* @IsGranted("ROLE_ADMIN")
*/
public function geoLocAction(Request $request)
{
$referer = $request->headers->get('referer');
if ($referer && !$request->isXmlHttpRequest()) {
return $this->redirect($referer);
} elseif (!$request->isXmlHttpRequest()) {
return new Response('', Response::HTTP_BAD_REQUEST);
}
$status = 'success';
$return = null;
if (!empty($request->get('cpostal')) && !empty($request->get('ville'))) {
try {
// GEOCODING ADDRESS :
$httpClient = new \Http\Adapter\Guzzle6\Client();
$provider = Nominatim::withOpenStreetMapServer($httpClient, 'Mozilla/5.0');
$geocoder = new \Geocoder\StatefulGeocoder($provider, 'fr');
// Query geocoding from complete addresse
$result = $geocoder->geocodeQuery(GeocodeQuery::create($request->get('adresse').' '.$request->get('cpostal').' '.$request->get('ville')));
if (count($result) > 0) {
$coords = $result->first()->getCoordinates();
$return = ['lat' => $coords->getLatitude(), 'lon' => $coords->getLongitude()];
} else {
$result = $geocoder->geocodeQuery(GeocodeQuery::create($request->get('cpostal').' '.$request->get('ville')));
if (count($result) > 0) {
$coords = $result->first()->getCoordinates();
$return = ['lat' => $coords->getLatitude(), 'lon' => $coords->getLongitude()];
}
}
} catch (\Exception $e) {
$status = 'error';
}
} else {
$status = 'error';
}
return new JsonResponse(array('status' => $status, 'data' => $return));
}
}
......@@ -11,6 +11,7 @@ use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Form;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Translation\TranslatorInterface;
......@@ -38,12 +39,14 @@ class FluxController extends AbstractController
protected $em;
protected $translator;
protected $eventDispatcher;
protected $session;
public function __construct(EntityManagerInterface $em, TranslatorInterface $translator, EventDispatcherInterface $eventDispatcher)
public function __construct(EntityManagerInterface $em, TranslatorInterface $translator, EventDispatcherInterface $eventDispatcher, SessionInterface $session)
{
$this->em = $em;
$this->translator = $translator;
$this->eventDispatcher = $eventDispatcher;
$this->session = $session;
}
protected function manageFluxForm(Request $request, Form $form, $compte, $success, $title)
......
......@@ -10,7 +10,7 @@ use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Routing\Annotation\Route;
/**
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
*
* @author Julien Jorry <julien.jorry@gmail.com>
*/
......
......@@ -98,24 +98,21 @@ class ImportController extends CRUDController
// Turning off doctrine default logs queries for saving memory
$this->em->getConnection()->getConfiguration()->setSQLLogger(null);
// // Get file provider
// Get file provider
$provider = $this->container->get($media->getProviderName());
$csvRows = $this->parseCSV($provider->getFilesystem()->getAdapter()->getDirectory(), $provider->getReferenceImage($media));
$this->header = implode(';', array_values($csvRows[0]));
// dump($csvRows);
// dump($header);
// exit();
$config = $this->getParameter('app.import.header');
if ($this->header == $config['adherent']['header']) {
$result = $this->importAdherent($csvRows);
} else if ($this->header == $config['prestataire']['header']) {
} elseif ($this->header == $config['prestataire']['header']) {
$result = $this->importPrestataire($csvRows);
} else if ($this->header == $config['groupe']['header']) {
} elseif ($this->header == $config['groupe']['header']) {
$result = $this->importGroupe($csvRows);
} else if ($this->header == $config['comptoir']['header']) {
} elseif ($this->header == $config['comptoir']['header']) {
$result = $this->importComptoir($csvRows);
} else {
$this->errors['error'] = $this->translator->trans('CSV invalide');
......@@ -287,8 +284,7 @@ class ImportController extends CRUDController
$user->addRole('ROLE_PRESTATAIRE');
$usergroupe = $this->em->getRepository(Usergroup::class)->findOneByName('Prestataire');
$user->addGroup($usergroupe);
$user->setPrestataire($prestataire);
$prestataire->setUser($user);
$prestataire->addUser($user);
if (!empty($raison)) {
$prestataire->setRaison($raison);
......@@ -611,10 +607,10 @@ class ImportController extends CRUDController
if ($err == 'empty') {
$errString = $this->translator->trans('Valeur vide !');
$this->warnings[$line][$key][$csvline] ='['.$errString.' ]';
} else if ($err == 'invalid') {
} elseif ($err == 'invalid') {
$errString = $this->translator->trans('Valeur invalide !');
$this->warnings[$line][$key][$csvline] = '"'.(array_key_exists($key, $row)?$row[$key]:'').'" ['.$errString.']';
} else if ($err != '') {
} elseif ($err != '') {
$this->warnings[$line][$key][$csvline] = '"'.(array_key_exists($key, $row)?$row[$key]:'').'" ['.$err.']';
}
}
......
......@@ -4,9 +4,13 @@ namespace App\Controller;
use App\Entity\Adherent;
use App\Entity\Cotisation;
use App\Entity\Comptoir;
use App\Entity\Faq;
use App\Entity\Geoloc;
use App\Entity\Groupe;
use App\Entity\GlobalParameter;
use App\Entity\Page;
use App\Entity\Prestataire;
use App\Entity\Siege;
use App\Entity\User;
use App\Entity\Usergroup;
......@@ -26,12 +30,15 @@ use Geocoder\Provider\Nominatim\Nominatim;
use Geocoder\Query\GeocodeQuery;
use Nelmio\ApiDocBundle\Annotation\Model;
use Nelmio\ApiDocBundle\Annotation\Security;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
use Swagger\Annotations as SWG;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Core\Exception\AccessDeniedException;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
......@@ -46,14 +53,16 @@ class IndexController extends AbstractController
private $userManager;
private $tokenManager;
private $guard;
private $session;
public function __construct(EventDispatcherInterface $eventDispatcher, EntityManagerInterface $em, UserManagerInterface $userManager, CsrfTokenManagerInterface $tokenManager = null, GuardAuthenticatorHandler $guard)
public function __construct(EventDispatcherInterface $eventDispatcher, EntityManagerInterface $em, UserManagerInterface $userManager, CsrfTokenManagerInterface $tokenManager = null, GuardAuthenticatorHandler $guard, SessionInterface $session)
{
$this->eventDispatcher = $eventDispatcher;
$this->em = $em;
$this->userManager = $userManager;
$this->tokenManager = $tokenManager;
$this->guard = $guard;
$this->session = $session;
}
/**
......@@ -98,12 +107,15 @@ class IndexController extends AbstractController
public function installationAction(Request $request)
{
$siege = $this->em->getRepository(Siege::class)->findOneById(1);
if (!empty($siege)) {
return $this->redirectToRoute('index');
}
$user = $this->userManager->createUser();
// if (!empty($siege)) {
// return $this->redirectToRoute('index');
// }
$repogroup = $this->em->getRepository(Usergroup::class);
$group = $repogroup->findOneBy(array('name' => 'Super Admin'));
if (empty($group)) {
return new Response('ERREUR !<br><br>Avant de pouvoir installer le kohinos, il faut charger les fixtures : <br>Soit charger les fixtures standards :<br><em>php bin/console hautelook:fixtures:load --purge-with-truncate</em><br/><br/>Soit charger les fixtures de dev (pour tester le kohinos avec des données/comptes factices):<br/><em>php bin/console hautelook:fixtures:load --purge-with-truncate --env=test</em>', 200);
}
$user = $this->userManager->createUser();
$user->setEnabled(true);
$user->addGroup($group);
$user->addRole('ROLE_SUPER_ADMIN');
......@@ -113,19 +125,43 @@ class IndexController extends AbstractController
if ($form->isSubmitted() && $form->isValid()) {
$siege = $form['siege']->getData();
$user = $form['user']->getData();
$groupe = $form['groupe']->getData();
$comptoir = $form['comptoir']->getData();
$configs = $form['config']->getData();
$groupe->setSiege($siege);
$comptoir->setGroupe($groupe);
//Création du prestataire recevant les cotisations
$presta = new Prestataire();
$presta->setMlc(true);
$presta->setRaison('Monnaie locale');
$presta->setDescription('Association gérant la monnaie locale et recevant les cotisations');
$presta->setEnabled(true);
$presta->setIban(' ');
$presta->setSiret(' ');
$user->addRole('ROLE_PRESTATAIRE');
$presta->addUser($user);
$presta->setGroupe($groupe);
$this->userManager->updateUser($user);
$this->em->persist($siege);
$this->em->persist($groupe);
$this->em->persist($comptoir);
$this->em->persist($user);
// TODO : send mail
$this->em->persist($presta);
foreach ($configs as $config) {
$this->em->persist($config);
}
$this->em->flush();
$this->addFlash(
'success',
'BRAVO ! Vous avez créer le siège et le premier utilisateur'
);
// if (null === $response = $event->getResponse()) {
$url = $this->generateUrl('fos_user_registration_confirmed');
$response = new RedirectResponse($url);
// }
// TODO : send mail with this event catch !
$this->eventDispatcher->dispatch(FOSUserEvents::REGISTRATION_COMPLETED, new FilterUserResponseEvent($user, $request, $response));
$referer = $request->headers->get('referer');
if ($referer && !$request->isXmlHttpRequest()) {
......@@ -157,7 +193,7 @@ class IndexController extends AbstractController
$adherent->setUser($user);
if (count($adherent->getUser()->getCotisations()) <= 0) {
$cotisation = new Cotisation();
$cotisation->setMontant(floatval($this->getParameter('app.cotisation_montant')));
$cotisation->setMontant(floatval($this->em->getRepository(GlobalParameter::class)->val(GlobalParameter::COTISATION_MONTANT)));
$cotisation->setOperateur($adherent->getUser());
$cotisation->setExpediteur($adherent);
$cotisation->setMoyen(MoyenEnum::MOYEN_AUTRE);
......@@ -175,10 +211,7 @@ class IndexController extends AbstractController
if ($form->isValid()) {
$adherentNew = $form->getData();
$cotisationNew = $form['cotisation']->getData();
// dump($adherentNew);
// dump($cotisationNew);
// exit();
// $adherentNew->getUser()->removeCotisation($cotisation);
$this->em->persist($cotisationNew);
$adherentNew->getUser()->addCotisation($cotisationNew);
$this->em->persist($adherentNew);
......@@ -202,14 +235,75 @@ class IndexController extends AbstractController
));
}
private function removeOldSessionParams()
{
$this->session->remove('_choixGroup');
$this->session->remove('_groupId');
$this->session->remove('_groupegere');
$this->session->remove('_comptoirgere');
$this->session->remove('_prestagere');
}
/**
* Choix du groupe local géré
* @Route("/login/groupe/choice/{usergrpid}/{grpid}", name="groupe_choice")
* @ParamConverter("group", class="App:Usergroup", options={"mapping": {"usergrpid": "id"}})
* @ParamConverter("groupe", class="App:Groupe", options={"mapping": {"grpid": "id"}})
*/
public function groupeChoiceAction(Usergroup $group, Groupe $groupe, Request $request)
{
$this->removeOldSessionParams();
// On enregistre le rôle choisit en session
$this->session->set('_groupId', $group);
$this->session->set('_groupegere', $groupe);
// @TODO : On redirige sur l'index (ou en fonction du rôle?)
return $this->redirectToRoute('index');
}
/**
* Choix du comptoir géré
* @Route("/login/comptoir/choice/{usergrpid}/{cptid}", name="comptoir_choice")
* @ParamConverter("group", class="App:Usergroup", options={"mapping": {"usergrpid": "id"}})
* @ParamConverter("comptoir", class="App:Comptoir", options={"mapping": {"cptid": "id"}})
*/
public function comptoirChoiceAction(Usergroup $group, Comptoir $comptoir, Request $request)
{
$this->removeOldSessionParams();
// On enregistre le rôle choisit en session
$this->session->set('_groupId', $group);
$this->session->set('_comptoirgere', $comptoir);
// @TODO : On redirige sur l'index (ou en fonction du rôle?)
return $this->redirectToRoute('index');
}
/**
* Choix du presta géré
* @Route("/login/presta/choice/{usergrpid}/{prestaid}", name="presta_choice")
* @ParamConverter("group", class="App:Usergroup", options={"mapping": {"usergrpid": "id"}})
* @ParamConverter("prestataire", class="App:Prestataire", options={"mapping": {"prestaid": "id"}})
*/
public function prestaChoiceAction(Usergroup $group, Prestataire $prestataire, Request $request)
{
$this->removeOldSessionParams();
// On enregistre le rôle choisit en session
$this->session->set('_groupId', $group);
$this->session->set('_prestagere', $prestataire);
// @TODO : On redirige sur l'index (ou en fonction du rôle?)
return $this->redirectToRoute('index');
}
/**
* @Route("/group/choice/{id}", name="group_choice")
* @Route("/login/group/choice/{id}", name="usergroup_choice")
*/
public function groupChoiceAction(Usergroup $group, Request $request)
{
$request->getSession()->remove('_choixGroup');
$this->removeOldSessionParams();
$this->session->remove('_choixGroup');
// On enregistre le rôle choisit en session
$request->getSession()->set('_groupId', $group);
$this->session->set('_groupId', $group);
// @TODO : On redirige sur l'index (ou en fonction du rôle?)
return $this->redirectToRoute('index');
......
......@@ -38,7 +38,7 @@ class UserComptoirController extends FluxController
*/
public function groupeInfosAction(Request $request)
{
$form = $this->createForm(ComptoirInfosFormType::class, $this->getUser()->getComptoirsgere());
$form = $this->createForm(ComptoirInfosFormType::class, $this->session->get('_comptoirgere'));
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
......@@ -72,7 +72,7 @@ class UserComptoirController extends FluxController
// return $this->manageFluxForm(
// $request,
// $form,
// $this->getUser()->getComptoirsgere()->getCompte(),
// $this->session->get('_comptoirgere')->getCompte(),
// $this->translator->trans('Transfert à un adhérent bien effectuée !'),
// $this->translator->trans('Transfert à un adhérent')
// );
......@@ -90,7 +90,7 @@ class UserComptoirController extends FluxController
// return $this->manageFluxForm(
// $request,
// $form,
// $this->getUser()->getComptoirsgere()->getCompte(),
// $this->session->get('_comptoirgere')->getCompte(),
// $this->translator->trans('Transfert à un prestataire bien effectuée !'),
// $this->translator->trans('Transfert à un prestataire')
// );
......@@ -108,7 +108,7 @@ class UserComptoirController extends FluxController
return $this->manageFluxForm(
$request,
$form,
$this->getUser()->getComptoirsgere()->getCompte(),
$this->session->get('_comptoirgere')->getCompte(),
$this->translator->trans('Vente à un adhérent bien effectuée !'),
$this->translator->trans('Vente à un adhérent')
);
......@@ -126,7 +126,7 @@ class UserComptoirController extends FluxController
return $this->manageFluxForm(
$request,
$form,
$this->getUser()->getComptoirsgere()->getCompte(),
$this->session->get('_comptoirgere')->getCompte(),
$this->translator->trans('Vente à un prestataire bien effectuée !'),
$this->translator->trans('Vente à un prestataire')
);
......@@ -144,7 +144,7 @@ class UserComptoirController extends FluxController
return $this->manageFluxForm(
$request,
$form,
$this->getUser()->getComptoirsgere()->getCompte(),
$this->session->get('_comptoirgere')->getCompte(),
$this->translator->trans("Retrait d'un adhérent bien effectuée !"),
$this->translator->trans("Retrait d'un adhérent")
);
......@@ -162,7 +162,7 @@ class UserComptoirController extends FluxController
return $this->manageFluxForm(
$request,
$form,
$this->getUser()->getComptoirsgere()->getCompte(),
$this->session->get('_comptoirgere')->getCompte(),
$this->translator->trans("Retrait d'un prestataire bien effectuée !"),
$this->translator->trans("Retrait d'un prestataire")
);
......@@ -180,7 +180,7 @@ class UserComptoirController extends FluxController
return $this->manageFluxForm(
$request,
$form,
$this->getUser()->getComptoirsgere()->getCompte(),
$this->session->get('_comptoirgere')->getCompte(),
$this->translator->trans('Reconversion bien effectuée !'),
$this->translator->trans("Reconversion d'un prestataire")
);
......
......@@ -3,6 +3,7 @@
namespace App\Controller;
use App\Entity\User;
use App\Form\Type\CotiserFormType;
use App\Form\Type\UserInfosFormType;
use Doctrine\ORM\EntityManagerInterface;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
......@@ -23,6 +24,32 @@ class UserController extends AbstractController
$this->translator = $translator;
}
/**
* @Route("/cotiser", name="cotiser")
* @IsGranted("ROLE_USER")
*/
public function cotiserAction(Request $request)
{
$form = $this->createForm(CotiserFormType::class, $adherent);
$form->handleRequest($request);
if ($form->isSubmitted()) {
if ($form->isValid()) {
$adherentNew = $form->getData();
} else {
$this->addFlash(
'error',
'Problème avec l\'adhésion !'
);
}
}
return $this->render('cotiser.html.twig', array(
'form' => $form->createView()
));
}
/**
* @Route("/userinfos", name="user_infos")
* @IsGranted("ROLE_USER")
......
......@@ -34,7 +34,8 @@ class UserGestionnaireGroupeController extends FluxController
*/
public function groupeInfosAction(Request $request)
{
$form = $this->createForm(GroupeInfosFormType::class, $this->getUser()->getGroupesgere());
// TODO : récupérer groupe gere en session
$form = $this->createForm(GroupeInfosFormType::class, $this->session->get('_groupegere'));
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
......@@ -68,13 +69,13 @@ class UserGestionnaireGroupeController extends FluxController
return $this->manageFluxForm(
$request,
$form,
$this->getUser()->getGroupesgere()->getCompte(),
$this->session->get('_groupegere')->getCompte(),
$this->translator->trans('Transfert bien effectué !'),
$this->translator->trans('Transfert à un comptoir')
);
}
/**
/**
* @Route("/user/groupe/retour/comptoir/", name="transfertComptoirGroupe")
* @IsGranted("ROLE_GESTION_GROUPE")
*/
......@@ -86,10 +87,9 @@ class UserGestionnaireGroupeController extends FluxController
return $this->manageFluxForm(
$request,
$form,
$this->getUser()->getGroupesgere()->getCompte(),
$this->session->get('_groupegere')->getCompte(),
$this->translator->trans('Retour bien effectuée !'),
$this->translator->trans('Retour au groupe')
);
}
}
......@@ -30,7 +30,7 @@ class UserPrestataireController extends FluxController
*/
public function prestataireInfosAction(Request $request)
{
$form = $this->createForm(PrestataireInfosFormType::class, $this->getUser()->getPrestataire());
$form = $this->createForm(PrestataireInfosFormType::class, $this->session->get('_prestagere'));
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
......@@ -57,7 +57,7 @@ class UserPrestataireController extends FluxController
*/
public function groupePrestataireInscriptionAction(Request $request)
{
$form = $this->createForm(GroupePrestataireInscriptionFormType::class, $this->getUser()->getPrestataire());
$form = $this->createForm(GroupePrestataireInscriptionFormType::class, $this->session->get('_prestagere'));
$form->handleRequest($request);
if ($form->isSubmitted() && $form->isValid()) {
......@@ -93,12 +93,12 @@ class UserPrestataireController extends FluxController
$entityName = 'App\Entity\TransactionPrestataire'.ucwords($type);
$entity = new $entityName();
$entity->setOperateur($this->getUser());
$entity->setExpediteur($this->getUser()->getPrestataire());
$entity->setExpediteur($this->session->get('_prestagere'));
$form = $this->createForm('App\Form\Type\TransactionPrestataire'.ucwords($type).'FormType', $entity);
return $this->manageFluxForm(
$request,
$form,
$this->getUser()->getPrestataire()->getCompte(),
$this->session->get('_prestagere')->getCompte(),
$this->translator->trans('Transaction bien effectuée !'),
$this->translator->trans('Transaction à un ').$type
);
......@@ -113,12 +113,12 @@ class UserPrestataireController extends FluxController
{
$entity = new TransfertPrestataireSiege();
$entity->setOperateur($this->getUser());
$entity->setExpediteur($this->getUser()->getPrestataire());
$entity->setExpediteur($this->session->get('_prestagere'));
$form = $this->createForm(TransfertPrestataireSiegeFormType::class, $entity);
return $this->manageFluxForm(
$request,
$form,
$this->getUser()->getPrestataire()->getCompte(),
$this->session->get('_prestagere')->getCompte(),
$this->translator->trans('Reconversion envoyée, elle sera validée lorsque le virement sera effectué !'),
$this->translator->trans('Reconversion de monnaie au siège')
);
......@@ -135,7 +135,7 @@ class UserPrestataireController extends FluxController
public function exportFluxAction(Request $request, $format = 'csv')
{
// Prepare the data source
$query = $this->em->getRepository(Flux::class)->getQueryByPrestataire($this->getUser()->getPrestataire());
$query = $this->em->getRepository(Flux::class)->getQueryByPrestataire($this->session->get('_prestagere'));
$fields = ['expediteur', 'destinataire', 'type', 'parenttype', 'montant', 'moyen', 'operateur'];
$source = new DoctrineORMQuerySourceIterator($query, $fields);
......
......@@ -7,6 +7,7 @@ use App\Entity\EntityTrait\EnablableEntityTrait;
use App\Entity\EntityTrait\GeolocEntityTrait;
use App\Entity\EntityTrait\HasCompteEntity;
use App\Entity\EntityTrait\NameSlugContentEntityTrait;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Symfony\Component\Validator\Constraints as Assert;
......@@ -52,11 +53,17 @@ class Comptoir
private $groupe;
/**
* @var ArrayCollection|User[]
* @ORM\OneToMany(targetEntity="User", mappedBy="comptoirsgere", fetch="EXTRA_LAZY")
*/
* @var ArrayCollection|User[]
*
* @ORM\ManyToMany(targetEntity="User", inversedBy="comptoirsgeres", fetch="EXTRA_LAZY")
*/
private $gestionnaires;
public function __construct()
{
$this->gestionnaires = new ArrayCollection();
}
/**
* @return int
*/
......@@ -78,7 +85,7 @@ class Comptoir
* Set media
* @return $this
*/
public function setMedia($media)
public function setMedia($media): self
{
$this->media = $media;
return $this;
......@@ -88,7 +95,7 @@ class Comptoir
* @param null|Groupe $groupes
* @return $this
*/
public function setGroupe(?Groupe $groupe)
public function setGroupe(?Groupe $groupe): self
{
$this->groupe = $groupe;
return $this;
......@@ -114,11 +121,10 @@ class Comptoir
* @param User $gestionnaire
* @return $this
*/
public function addGestionnaire(User $gestionnaire)
public function addGestionnaire(User $gestionnaire): self
{
if (!$this->gestionnaires->contains($gestionnaire)) {
$this->gestionnaires[] = $gestionnaire;
$gestionnaire->setGestionnaireComptoir($this);
}
return $this;
}
......@@ -127,11 +133,10 @@ class Comptoir
* @param User $gestionnaire
* @return $this
*/
public function removeGestionnaire(User $gestionnaire)
public function removeGestionnaire(User $gestionnaire): self
{
if ($this->gestionnaires->contains($gestionnaire)) {
$this->gestionnaires->removeElement($gestionnaire);
$gestionnaire->setGestionnaireComptoir(null);
}
return $this;
}
......
......@@ -3,6 +3,7 @@
namespace App\Entity;
use App\Entity\CotisationInfos;
use App\Enum\MoyenEnum;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
......@@ -39,7 +40,7 @@ class Cotisation extends Flux
$compteExp = $this->getExpediteur()->getEcompte() - $this->getMontant();
if ($this->getMoyen() == MoyenEnum::MOYEN_MLC) {
if ($compteExp < 0) {
throw new \Exception("[FLUX] Opération impossible ! Montant supérieur au solde de l'expéditeur !");
throw new \Exception("[FLUX] Opération impossible ! Montant supérieur au solde de monnaie éléctronique !");
} else {
$this->getExpediteur()->removeEcompte($this->getMontant());
$this->getDestinataire()->addEcompte($this->getMontant());
......
......@@ -8,6 +8,7 @@ use Doctrine\ORM\Event\LifecycleEventArgs;
use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Context\ExecutionContextInterface;
/**
* FLUX = TRANSFERT ou TRANSACTION ou COTISATIONS
......@@ -43,6 +44,15 @@ abstract class Flux
protected $operateur;
/**
* Role en cours de l'utilisateur
* @var string
*
* @ORM\Column(name="role", type="string", length=200)
* @Assert\NotBlank
*/
protected $role;
/**
* Type de transfert / transaction : exemple : Prestataire à Adhérent
* @var string
*
......@@ -64,7 +74,8 @@ abstract class Flux
* @var float
*
* @ORM\Column(name="montant", type="decimal", precision=7, scale=2)
* @Assert\Type("float")
* @Assert\NotBlank
* @Assert\Type("numeric")
* @Assert\GreaterThan(
* value = 0
* )
......@@ -87,6 +98,14 @@ abstract class Flux
*/
protected $reference;
/**
* Hash => permet de vérifier l'intégrité des données
* @var text
*
* @ORM\Column(name="hash", type="text")
*/
protected $hash;
protected $expediteur = null;
protected $destinataire = null;
protected $cotisationInfos = null;
......@@ -202,6 +221,24 @@ abstract class Flux
}
/**
* @return string
*/
public function getRole(): ?string
{
return $this->role;
}
/**
* @param string $role
* @return Transaction
*/
public function setRole(?string $role)
{
$this->role = $role;
return $this;
}
/**
* @return float
*/
public function getMontant(): ?float
......@@ -238,6 +275,25 @@ abstract class Flux
}
/**
* Get hash
* @return text
*/
public function getHash()
{
return $this->hash;
}
/**
* Set hash
* @return $this
*/
public function setHash($hash)
{
$this->hash = $hash;
return $this;
}
/**
* @return string
*/
public function getMoyen(): ?string
......@@ -260,6 +316,25 @@ abstract class Flux
return false;
}
public function getVerify()
{
if ($this->getHash() == null) {
return 'Vide';
}
return (password_verify($this->getAllInfosUncrypted(), $this->getHash()) === true)?'Oui':'Non';
}
/**
* @ORM\PrePersist
* @param LifecycleEventArgs $event
*/
public function prePersist(LifecycleEventArgs $event)
{
$flux = $event->getEntity();
$tmphash = password_hash($flux->getAllInfosUncrypted(), PASSWORD_BCRYPT, ['cost' => 12]);
$flux->setHash($tmphash);
}
/**
* @ORM\PostPersist
* @param LifecycleEventArgs $event
......@@ -276,6 +351,22 @@ abstract class Flux
if ($flux->getExpediteur() == $flux->getDestinataire()) {
throw new \Exception("[FLUX] Opération impossible ! Expéditeur et Destinataire ne peuvent pas être les mêmes !");
}
$hash = password_hash($flux->getAllInfosUncrypted(), PASSWORD_BCRYPT, ['cost' => 12]);
$flux->setHash($hash);
$event->getEntityManager()->persist($flux);
$event->getEntityManager()->flush();
}
/**
* @Assert\Callback
* @param ExecutionContextInterface $context [description]
* @return [type] [description]
*/
public function validateConstraint(ExecutionContextInterface $context)
{
if ($this->getMoyen() == MoyenEnum::MOYEN_MLC && $this->getParenttype() == self::TYPE_COTISATION) {
$context->addViolation('Montant supérieur au solde de monnaie éléctronique.');
}
}
public function toHtmlArray(): string
......@@ -293,6 +384,11 @@ abstract class Flux
return $return;
}
public function getAllInfosUncrypted(): string
{
return $_ENV['APP_SECRET'].$this->id.$this->operateur->getId().$this->role.$this->type.$this->montant.$this->moyen.$this->reference.$this->destinataire->getId().$this->expediteur->getId();
}
public function __toString(): string
{
if (empty($this->getDestinataire()) || empty($this->getExpediteur()) || empty($this->getMontant())) {
......
......@@ -34,7 +34,7 @@ class Geoloc
/**
* @var null|int
*
* @ORM\Column(name="cpostal", type="integer", length=5, nullable=true)
* @ORM\Column(name="cpostal", type="string", length=10, nullable=true)
*/
private $cpostal;
......@@ -87,18 +87,18 @@ class Geoloc
}
/**
* @return int|null
* @return string|null
*/
public function getCpostal(): ?int
public function getCpostal(): ?string
{
return $this->cpostal;
}
/**
* @param int|null $cpostal
* @param string|null $cpostal
* @return Geoloc
*/
public function setCpostal(?int $cpostal)
public function setCpostal(?string $cpostal)
{
$this->cpostal = $cpostal;
return $this;
......
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass="App\Repository\GlobalParameterRepository")
*/
class GlobalParameter
{
// Default global parameters for MLC
const MLC_TITLE = 'MLC_TITLE';
const MLC_DESCRIPTION = 'MLC_DESCRIPTION';
const MLC_KEYWORDS = 'MLC_KEYWORDS';
const MLC_NAME = 'MLC_NAME';
const MLC_NAME_SMALL = 'MLC_NAME_SMALL';
const MLC_NOTIF_EMAIL = 'MLC_NOTIF_EMAIL';
const COTISATION_MONTANT= 'COTISATION_MONTANT';
const MAP_CENTER = 'MAP_CENTER';
const MAP_ZOOM = 'MAP_ZOOM';
const FAVICON_URL = 'FAVICON_URL';
/**
* @ORM\Id()
* @ORM\GeneratedValue()
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\Column(type="string", length=255)
*/
private $name;
/**
* @ORM\Column(type="text")
*/
private $value;
/**
* @ORM\Column(type="boolean")
*/
private $mandatory;
public function __toString()
{
return $this->getName(). ' => '.$this->getValue();
}
public function getId(): ?int
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
public function getValue(): ?string
{
return $this->value;
}
public function setValue(string $value): self
{
$this->value = $value;
return $this;
}
/**
* Get mandatory
* @return
*/
public function getMandatory()
{
return $this->mandatory;
}
/**
* Set mandatory
* @return $this
*/
public function setMandatory($mandatory)
{
$this->mandatory = $mandatory;
return $this;
}
}
......@@ -34,7 +34,7 @@ class Groupe
/**
* @var Siege
*
* @ORM\ManyToOne(targetEntity="Siege", inversedBy="groupes")
* @ORM\ManyToOne(targetEntity="Siege", inversedBy="groupes", cascade={"persist"})
* @ORM\JoinColumn(name="siege_id", referencedColumnName="id", nullable=false)
*/
private $siege;
......@@ -69,7 +69,7 @@ class Groupe
/**
* @var ArrayCollection|User[]
* @ORM\OneToMany(targetEntity="User", mappedBy="groupesgere", fetch="EXTRA_LAZY")
* @ORM\ManyToMany(targetEntity="User", inversedBy="groupesgeres", fetch="EXTRA_LAZY")
*/
private $gestionnaires;
......@@ -79,6 +79,7 @@ class Groupe
$this->prestataires = new ArrayCollection();
$this->adherents = new ArrayCollection();
$this->groupeprestataires = new ArrayCollection();
$this->gestionnaires = new ArrayCollection();
}
/**
......@@ -130,7 +131,7 @@ class Groupe
* @param Comptoir $comptoir
* @return $this
*/
public function addComptoir(Comptoir $comptoir)
public function addComptoir(Comptoir $comptoir): self
{
if (!$this->comptoirs->contains($comptoir)) {
$this->comptoirs[] = $comptoir;
......@@ -143,7 +144,7 @@ class Groupe
* @param Comptoir $comptoir
* @return $this
*/
public function removeComptoir(Comptoir $comptoir)
public function removeComptoir(Comptoir $comptoir): self
{
if ($this->comptoirs->contains($comptoir)) {
$this->comptoirs->removeElement($comptoir);
......@@ -164,11 +165,10 @@ class Groupe
* @param Prestataire $prestataire
* @return $this
*/
public function addPrestataire(Prestataire $prestataire)
public function addPrestataire(Prestataire $prestataire): self
{
if (!$this->prestataires->contains($prestataire)) {
$this->prestataires[] = $prestataire;
$prestataire->setGroupe($this);
}
return $this;
}
......@@ -177,11 +177,10 @@ class Groupe
* @param Prestataire $prestataire
* @return $this
*/
public function removePrestataire(Prestataire $prestataire)
public function removePrestataire(Prestataire $prestataire): self
{
if ($this->prestataires->contains($prestataire)) {
$this->prestataires->removeElement($prestataire);
$prestataire->setGroupe(null);
}
return $this;
}
......@@ -198,7 +197,7 @@ class Groupe
* @param Adherent $adherent
* @return $this
*/
public function addAdherent(Adherent $adherent)
public function addAdherent(Adherent $adherent): self
{
if (!$this->adherents->contains($adherent)) {
$this->adherents[] = $adherent;
......@@ -211,7 +210,7 @@ class Groupe
* @param Adherent $adherent
* @return $this
*/
public function removeAdherent(Adherent $adherent)
public function removeAdherent(Adherent $adherent): self
{
if ($this->adherents->contains($adherent)) {
$this->adherents->removeElement($adherent);
......@@ -229,14 +228,23 @@ class Groupe
}
/**
* @param User[]|ArrayCollection
* @return $this
*/
public function setGestionnaires($gestionnaires): self
{
$this->gestionnaires = $gestionnaires;
return $this;
}
/**
* @param User $gestionnaire
* @return $this
*/
public function addGestionnaire(User $gestionnaire)
public function addGestionnaire(User $gestionnaire): self
{
if (!$this->gestionnaires->contains($gestionnaire)) {
$this->gestionnaires[] = $gestionnaire;
$gestionnaire->setGestionnaireGroupe($this);
}
return $this;
}
......@@ -245,11 +253,10 @@ class Groupe
* @param User $gestionnaire
* @return $this
*/
public function removeGestionnaire(User $gestionnaire)
public function removeGestionnaire(User $gestionnaire): self
{
if ($this->gestionnaires->contains($gestionnaire)) {
$this->gestionnaires->removeElement($gestionnaire);
$gestionnaire->setGestionnaireGroupe(null);
}
return $this;
}
......@@ -266,7 +273,7 @@ class Groupe
* @param Amap $amap
* @return $this
*/
public function addGroupeprestataire(Groupeprestataire $groupeprestataire)
public function addGroupeprestataire(Groupeprestataire $groupeprestataire): self
{
if (!$this->groupeprestataires->contains($groupeprestataire)) {
$this->groupeprestataires[] = $groupeprestataire;
......@@ -279,7 +286,7 @@ class Groupe
* @param Amap $amap
* @return $this
*/
public function removeGroupeprestataire(Groupeprestataire $groupeprestataires)
public function removeGroupeprestataire(Groupeprestataire $groupeprestataires): self
{
if ($this->groupeprestataires->contains($groupeprestataire)) {
$this->groupeprestataires->removeElement($groupeprestataire);
......
......@@ -80,9 +80,8 @@ class Prestataire
private $responsable;
/**
* @var string
*
* @ORM\Column(name="iban", type="string", length=100)
* @ORM\Column(name="iban", type="string", length=100, nullable=true)
* @Assert\Iban(message="L'IBAN(International Bank Account Number) est invalide.")
*/
private $iban;
......@@ -97,15 +96,18 @@ class Prestataire
* @var null|string
*
* @ORM\Column(name="web", type="string", length=255, nullable=true)
* @Assert\Url(message = "L'adresse : '{{ value }}' est invalide.")
*/
private $web;
/**
* Le prestataire peut recevoir des cotisations (En règle générale, l'association gérant la monnaie locale)
* Ce prestataire est normalement crée à l'installation du kohinos
* @var bool
*
* @ORM\Column(name="accept", type="boolean", nullable=false)
* @ORM\Column(name="mlc", type="boolean", nullable=false, options={"default" : false})
*/
private $accept = false;
private $mlc = false;
/**
* @var null|string (champ libre)
......@@ -136,16 +138,16 @@ class Prestataire
protected $media;
/**
* @var User
*
* @ORM\OneToOne(targetEntity="User", cascade={"all"}, mappedBy="prestataire", fetch="LAZY")
*/
protected $user;
* @var ArrayCollection|User[]
*
* @ORM\ManyToMany(targetEntity="User", inversedBy="prestataires", cascade={"persist"})
*/
protected $users;
/**
* @var Groupe $groupe
*
* @ORM\ManyToOne(targetEntity="Groupe", inversedBy="prestataires")
* @ORM\ManyToOne(targetEntity="Groupe", inversedBy="prestataires", cascade={"persist"})
* @Assert\NotBlank
*/
private $groupe;
......@@ -279,7 +281,7 @@ class Prestataire
* @param string $iban
* @return Prestataire
*/
public function setIban(string $iban)
public function setIban(?string $iban)
{
$this->iban = $iban;
return $this;
......@@ -297,7 +299,7 @@ class Prestataire
* @param string $siret
* @return Prestataire
*/
public function setSiret(string $siret)
public function setSiret(?string $siret)
{
$this->siret = $siret;
return $this;
......@@ -324,36 +326,62 @@ class Prestataire
/**
* @return bool
*/
public function isAccept(): bool
public function isMlc(): bool
{
return $this->accept;
return $this->mlc;
}
/**
* @param bool $accept
* @param bool $mlc
* @return Prestataire
*/
public function setAccept(bool $accept)
public function setMlc(bool $mlc)
{
$this->accept = $accept;
$this->mlc = $mlc;
return $this;
}
/**
* @return User
* @return ArrayCollection[]|User
*/
public function getUser(): ?User
public function getUsers()
{
return $this->user;
return $this->users;
}
/**
* @param User $user
* @return $this
*/
public function addUser(User $user)
{
if (!$this->users->contains($user)) {
$this->users[] = $user;
$user->addPrestataire($this);
}
return $this;
}
/**
* @param User $user
* @return $this
*/
public function removeUser(User $users)
{
if ($this->users->contains($user)) {
$this->users->removeElement($user);
$user->removePrestataire($this);
}
return $this;
}
/**
* @param ArrayCollection[]|User $users
* @return Prestataire
*/
public function setUser(User $user): self
public function setUsers($users): self
{
$this->user = $user;
$this->users = $users;
return $this;
}
......@@ -512,6 +540,6 @@ class Prestataire
public function __toString(): string
{
return ($this->raison?$this->raison:($this->getUser()?$this->getUser()->getFullname():'Prestataire'));
return ($this->raison?$this->raison:'Prestataire');
}
}
......@@ -44,9 +44,4 @@ abstract class Retrait extends Flux
}
return [];
}
public function getUsersToNotify()
{
return array_merge($this->getExpediteur()->getGestionnaires()->toArray(), [$this->getDestinataire()->getUser()]);
}
}
......@@ -25,4 +25,9 @@ class RetraitComptoirAdherent extends Retrait
{
return 'retrait_adherent';
}
public function getUsersToNotify()
{
return array_merge($this->getExpediteur()->getGestionnaires()->toArray(), [$this->getDestinataire()->getUser()]);
}
}
......@@ -25,4 +25,9 @@ class RetraitComptoirPrestataire extends Retrait
{
return 'retrait_prestataire';
}
public function getUsersToNotify()
{
return array_merge($this->getExpediteur()->getGestionnaires()->toArray(), $this->getDestinataire()->getUsers()->toArray());
}
}
......@@ -43,6 +43,6 @@ class TransfertPrestataireComptoir extends Transfert
public function getUsersToNotify()
{
return array_merge($this->getDestinataire()->getGestionnaires()->toArray(), [$this->getExpediteur()->getUser()]);
return array_merge($this->getDestinataire()->getGestionnaires()->toArray(), $this->getExpediteur()->getUsers()->toArray());
}
}
......@@ -59,8 +59,8 @@ class TransfertPrestataireSiege extends Transfert
public function operate()
{
$flux->getExpediteur()->removeEcompte($this->getMontant());
$flux->getDestinataire()->addCompte($this->getMontant());
$this->getExpediteur()->removeEcompte($this->getMontant());
$this->getDestinataire()->addCompte($this->getMontant());
$this->getDestinataire()->removeCompteNantie($this->getMontant());
return [$this->getExpediteur(), $this->getDestinataire()];
......@@ -69,6 +69,6 @@ class TransfertPrestataireSiege extends Transfert
public function getUsersToNotify()
{
// @TODO : notify siege ?
return [$this->getExpediteur()->getUser()];
return $this->getExpediteur()->getUsers()->toArray();
}
}
......@@ -12,7 +12,7 @@ use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity()
* @ORM\Entity(repositoryClass="App\Repository\UserRepository")
* @ORM\Table(name="user")
* @UniqueEntity(
* fields={"firstname", "lastname", "email"},
......@@ -42,18 +42,6 @@ class User extends BaseUser
protected $mobile;
/**
* @ORM\OneToOne(targetEntity="Adherent", inversedBy="user", cascade={"all"})
* @ORM\JoinColumn(name="adherent_id", referencedColumnName="id", nullable=true)
*/
protected $adherent;
/**
* @ORM\OneToOne(targetEntity="Prestataire", inversedBy="user", cascade={"all"})
* @ORM\JoinColumn(name="prestataire_id", referencedColumnName="id", nullable=true)
*/
protected $prestataire;
/**
* @var ArrayCollection|Document[]
*
* @ORM\OneToMany(targetEntity="Document", mappedBy="user", cascade={"persist"})
......@@ -87,16 +75,37 @@ class User extends BaseUser
private $emailTokens;
/**
* @TODO : changer en manytomany pour qu'un user puisse géré plusieurs groupes ?
* @ORM\ManyToOne(targetEntity="Groupe", inversedBy="gestionnaires", cascade={"all"})
* @ORM\OneToOne(targetEntity="Adherent", inversedBy="user", cascade={"all"}, fetch="EXTRA_LAZY")
* @ORM\JoinColumn(name="adherent_id", referencedColumnName="id", nullable=true)
*/
protected $adherent;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\Prestataire", mappedBy="users", cascade={"persist"})
* @ORM\JoinTable(name="user_prestataire",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="prestataire_id", referencedColumnName="id")}
* )
*/
private $groupesgere;
protected $prestataires;
/**
* @TODO : changer en manytomany pour qu'un user puisse géré plusieurs comptoirs ?
* @ORM\ManyToOne(targetEntity="Comptoir", inversedBy="gestionnaires", cascade={"all"})
* @ORM\ManyToMany(targetEntity="App\Entity\Groupe", mappedBy="gestionnaires", cascade={"persist"}, fetch="LAZY")
* @ORM\JoinTable(name="user_groupe",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="groupe_id", referencedColumnName="id")}
* )
*/
private $comptoirsgere;
private $groupesgeres;
/**
* @ORM\ManyToMany(targetEntity="App\Entity\Comptoir", mappedBy="gestionnaires", cascade={"persist"}, fetch="LAZY")
* @ORM\JoinTable(name="user_comptoir",
* joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")},
* inverseJoinColumns={@ORM\JoinColumn(name="comptoir_id", referencedColumnName="id")}
* )
*/
private $comptoirsgeres;
/**
* @ORM\Column(name="apiKey", type="string", length=255, nullable=true)
......@@ -128,9 +137,9 @@ class User extends BaseUser
* Alerte email à chaque transaction concernant l'utilisateur
* @var bool
*
* @ORM\Column(name="alertemailflux", type="boolean", nullable=false)
* @ORM\Column(name="alertemailflux", type="boolean", options={"default" : true})
*/
protected $alertemailflux;
protected $alertemailflux = true;
public function __construct()
{
......@@ -138,6 +147,9 @@ class User extends BaseUser
$this->cotisations = new ArrayCollection();
$this->flux = new ArrayCollection();
$this->emailTokens = new ArrayCollection();
$this->prestataires = new ArrayCollection();
$this->groupesgeres = new ArrayCollection();
$this->comptoirsgeres = new ArrayCollection();
$this->faqs = new ArrayCollection();
$this->news = new ArrayCollection();
$this->alertemailflux = true;
......@@ -177,7 +189,7 @@ class User extends BaseUser
* @param null|string $etat
* @return Prestataire
*/
public function setEtat(?string $etat)
public function setEtat(?string $etat): self
{
$this->etat = $etat;
return $this;
......@@ -261,21 +273,45 @@ class User extends BaseUser
}
/**
* Get prestataire
* Get prestataires
* @return
*/
public function getPrestataire()
public function getPrestataires()
{
return $this->prestataire;
return $this->prestataires;
}
/**
* @param Prestataire $prestataire
* @return $this
*/
public function addPrestataire(Prestataire $prestataire): self
{
if (!$this->prestataires->contains($prestataire)) {
$this->prestataires[] = $prestataire;
}
return $this;
}
/**
* @param Prestataire $prestataire
* @return $this
*/
public function removePrestataire(Prestataire $prestataires): self
{
if ($this->prestataires->contains($prestataire)) {
$this->prestataires->removeElement($prestataire);
}
return $this;
}
/**
* Set prestataire
* @return $this
*/
public function setPrestataire($prestataire): self
public function setPrestataires($prestataires): self
{
$this->prestataire = $prestataire;
$this->prestataires = $prestataires;
return $this;
}
......@@ -300,7 +336,7 @@ class User extends BaseUser
* @param $cotisation
* @return $this
*/
public function addCotisation($cotisation)
public function addCotisation($cotisation): self
{
if (!$this->flux->contains($cotisation)) {
$cotisation->setOperateur($this);
......@@ -313,7 +349,7 @@ class User extends BaseUser
* @param Cotisation $cotisation
* @return $this
*/
public function removeCotisation(Cotisation $cotisation)
public function removeCotisation(Cotisation $cotisation): self
{
throw new \LogicException('User::removeCotisation : This code should not be reached!');
// if ($this->cotisations->contains($cotisation)) {
......@@ -334,7 +370,7 @@ class User extends BaseUser
* @param Flux $flux
* @return $this
*/
public function addFlux(Flux $flux)
public function addFlux(Flux $flux): self
{
if (!$this->flux->contains($flux)) {
$this->flux[] = $flux;
......@@ -347,7 +383,7 @@ class User extends BaseUser
* @param Flux $flux
* @return $this
*/
public function removeFlux(Flux $flux)
public function removeFlux(Flux $flux): self
{
throw new \LogicException('User::removeFlux : Ce code ne devrait jamais être atteint !');
// if ($this->flux->contains($flux)) {
......@@ -357,39 +393,92 @@ class User extends BaseUser
}
/**
* @param null|Groupe $groupesgere
* @return Groupesgere[]|ArrayCollection
*/
public function getGroupesgeres()
{
return $this->groupesgeres;
}
/**
* @param Groupesgere[]|ArrayCollection
* @return this
*/
public function setGroupesgeres($groupesgeres): self
{
$this->groupesgeres = $groupesgeres;
return $this;
}
/**
* @param Groupesgere $groupesgere
* @return $this
*/
public function addGroupesgere(Groupe $groupesgere): self
{
if (!$this->groupesgeres->contains($groupesgere)) {
$this->groupesgeres[] = $groupesgere;
$groupesgere->addGestionnaire($this);
}
return $this;
}
/**
* @param Groupesgere $groupesgere
* @return $this
*/
public function setGroupesgere(?Groupe $groupesgere)
public function removeGroupesgere(Groupe $groupesgeres): self
{
$this->groupesgere = $groupesgere;
if ($this->groupesgeres->contains($groupesgere)) {
$this->groupesgeres->removeElement($groupesgere);
$groupesgere->removeGestionnaire($this);
}
return $this;
}
/**
* @return null|Groupe
* @return Comptoirsgere[]|ArrayCollection
*/
public function getGroupesgere(): ?Groupe
public function getComptoirsgeres()
{
return $this->groupesgere;
return $this->comptoirsgeres;
}
/**
* @param null|Comptoir $comptoirsgere
* @param Comptoirsgere[]|ArrayCollection
* @return this
*/
public function setComptoirsgeres($comptoirsgeres): self
{
$this->comptoirsgeres = $comptoirsgeres;
return $this;
}
/**
* @param Comptoirsgere $comptoirsgere
* @return $this
*/
public function setComptoirsgere(?Comptoir $comptoirsgere)
public function addComptoirsgere(Comptoir $comptoirsgere): self
{
$this->comptoirsgere = $comptoirsgere;
if (!$this->comptoirsgeres->contains($comptoirsgere)) {
$this->comptoirsgeres[] = $comptoirsgere;
$comptoirsgere->addGestionnaire($this);
}
return $this;
}
/**
* @return null|Comptoir
* @param Comptoirsgere $comptoirsgere
* @return $this
*/
public function getComptoirsgere(): ?Comptoir
public function removeComptoirsgere(Comptoir $comptoirsgeres): self
{
return $this->comptoirsgere;
if ($this->comptoirsgeres->contains($comptoirsgere)) {
$this->comptoirsgeres->removeElement($comptoirsgere);
$comptoirsgere->removeGestionnaire($this);
}
return $this;
}
public function createEmailToken()
......@@ -509,7 +598,7 @@ class User extends BaseUser
* Set alertemailflux
* @return $this
*/
public function setAlertemailflux($alertemailflux)
public function setAlertemailflux($alertemailflux): self
{
$this->alertemailflux = $alertemailflux;
return $this;
......
......@@ -43,9 +43,4 @@ abstract class Vente extends Flux
}
return [];
}
public function getUsersToNotify()
{
return array_merge($this->getExpediteur()->getGestionnaires()->toArray(), [$this->getDestinataire()->getUser()]);
}
}
......@@ -25,4 +25,9 @@ class VenteComptoirAdherent extends Vente
{
return 'comptoir_adherent';
}
public function getUsersToNotify()
{
return array_merge($this->getExpediteur()->getGestionnaires()->toArray(), [$this->getDestinataire()->getUser()]);
}
}
......@@ -25,4 +25,9 @@ class VenteComptoirPrestataire extends Vente
{
return 'comptoir_prestataire';
}
public function getUsersToNotify()
{
return array_merge($this->getExpediteur()->getGestionnaires()->toArray(), $this->getDestinataire()->getUsers()->toArray());
}
}
<?php
namespace App\EventListener;
use App\Entity\Adherent;
use App\Entity\EntityTrait\GeolocEntityTrait;
use App\Entity\Geoloc;
use App\Entity\Prestataire;
use App\Entity\User;
use Doctrine\Common\Persistence\Event\LifecycleEventArgs;
use Doctrine\ORM\Event\PreUpdateEventArgs;
use Geocoder\Provider\Nominatim\Nominatim;
......
......@@ -4,6 +4,7 @@ namespace App\EventListener;
use App\Events\MLCEvents;
use App\Events\FluxEvent;
use App\Entity\Flux;
use App\Entity\GlobalParameter;
use App\Entity\User;
use Doctrine\ORM\EntityManagerInterface;
use FOS\UserBundle\Event\FormEvent;
......@@ -75,9 +76,9 @@ class MLCEventListener implements EventSubscriberInterface
private function sendMail(User $user, Flux $flux)
{
$subject = $this->params->get('app.mlc_name_small').' : '.ucwords($flux->getParenttype()).' '.ucwords($flux->getType());
$subject = $this->em->getRepository(GlobalParameter::class)->val(GlobalParameter::MLC_NAME_SMALL).' : '.ucwords($flux->getParenttype()).' '.ucwords($flux->getType());
$mail = (new \Swift_Message($subject))
->setFrom($this->params->get('app.mlc_notif_email'))
->setFrom($this->em->getRepository(GlobalParameter::class)->val(GlobalParameter::MLC_NOTIF_EMAIL))
->setTo($user->getEmail())
->setBody(
$this->templating->render(
......@@ -103,8 +104,6 @@ class MLCEventListener implements EventSubscriberInterface
public function onTransfert(FluxEvent $event)
{
if ($event->getUsers()) {
}
}
public function onDepot(FluxEvent $event)
......
......@@ -23,24 +23,36 @@ class SwitchUserSubscriber implements EventSubscriberInterface
public function onSwitchUser(SwitchUserEvent $event)
{
// $request = $event->getRequest();
$request = $event->getRequest();
$token = $event->getToken();
$user = $event->getTargetUser();
// if ($request->hasSession() && $request->getSession()->has('_groupId')) {
// $group = $request->getSession()->get('_groupId');
// if ($group->getRoles()->contains('ROLE_SUPER_ADMIN')) {
// return new RedirectResponse($this->router->generate('sonata_admin_dashboard'));
// }
// }
// return new RedirectResponse($this->router->generate('index'));
// if ($request->hasSession() && ($session = $request->getSession)) {
// $session->set(
// '_locale',
// // assuming your User has some getLocale() method
// $event->getTargetUser()->getLocale()
// );
// }
$request->getSession()->remove('_prestagere');
$request->getSession()->remove('_comptoirgere');
$request->getSession()->remove('_groupegere');
if ($request->hasSession() && $request->getSession()->has('_groupId') &&
!$user->getGroups()->contains($request->getSession()->get('_groupId'))) {
$request->getSession()->remove('_groupId');
}
if (!$request->getSession()->has('_groupId')) {
if (count($user->getGroups()) > 1) {
$request->getSession()->set('_choixGroup', 'true');
} else {
$request->getSession()->set('_groupId', $user->getGroups()[0]);
foreach ($user->getGroups() as $groupe) {
if (in_array('ROLE_SUPER_ADMIN', $groupe->getRoles())) {
$request->getSession()->remove('_choixGroup');
}
if (in_array('ROLE_PRESTATAIRE', $groupe->getRoles()) && count($user->getPrestataires()) >= 1) {
$request->getSession()->set('_prestagere', $user->getPrestataires()[0]);
} elseif (in_array('ROLE_COMPTOIR', $groupe->getRoles()) && count($user->getComptoirsGeres()) >= 1) {
$request->getSession()->set('_comptoirgere', $user->getComptoirsGeres()[0]);
} elseif ((in_array('ROLE_TRESORIER', $groupe->getRoles()) || in_array('ROLE_CONTACT', $groupe->getRoles()) || in_array('ROLE_GESTION_GROUPE', $groupe->getRoles())) && count($user->getGroupesGeres()) >= 1) {
$request->getSession()->set('_groupegere', $user->getGroupesGeres()[0]);
}
}
}
}
}
public static function getSubscribedEvents()
......
......@@ -4,7 +4,7 @@ namespace App\Events;
/**
* Tous les évènements
*
* LOCO : Outil de gestion de Monnaie Locale Complémentaire
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
* @author Julien Jorry <julien.jorry@gmail.com>
*/
final class MLCEvents
......
......@@ -44,17 +44,20 @@ use App\Form\Type\VenteComptoirPrestataireFormType;
use App\Form\Type\UserInfosFormType;
use FOS\UserBundle\Form\Type\ChangePasswordFormType;
use Symfony\Component\Form\FormFactoryInterface as FormF;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Routing\RouterInterface;
class FormFactory
{
public $ff;
public $router;
public $session;
public function __construct(FormF $ff, RouterInterface $router)
public function __construct(FormF $ff, RouterInterface $router, SessionInterface $session)
{
$this->ff = $ff;
$this->router = $router;
$this->session = $session;
}
public function getUserInfosForm(User $user)
......@@ -79,30 +82,30 @@ class FormFactory
public function getGroupeInfosForm(User $user)
{
if (empty($user) || empty($user->getGroupesgere())) {
if (empty($user) || empty($this->session->get('_groupegere'))) {
throw new \Exception("[FORM 2] Opération impossible !");
}
$form = $this->ff->create(GroupeInfosFormType::class, $user->getGroupesgere(), array('action' => $this->router->generate('groupe_infos')));
$form = $this->ff->create(GroupeInfosFormType::class, $this->session->get('_groupegere'), array('action' => $this->router->generate('groupe_infos')));
return $form->createView();
}
public function getComptoirInfosForm(User $user)
{
if (empty($user) || empty($user->getComptoirsgere())) {
if (empty($user) || empty($this->session->get('_comptoirgere'))) {
throw new \Exception("[FORM 3] Opération impossible !");
}
$form = $this->ff->create(ComptoirInfosFormType::class, $user->getComptoirsgere(), array('action' => $this->router->generate('comptoir_infos')));
$form = $this->ff->create(ComptoirInfosFormType::class, $this->session->get('_comptoirgere'), array('action' => $this->router->generate('comptoir_infos')));
return $form->createView();
}
public function getPrestataireInfosForm(User $user)
{
if (empty($user) || empty($user->getPrestataire())) {
if (empty($user) || empty($this->session->get('_prestagere'))) {
throw new \Exception("[FORM 4] Opération impossible !");
}
$form = $this->ff->create(PrestataireInfosFormType::class, $user->getPrestataire(), array('action' => $this->router->generate('prestataire_infos')));
$form = $this->ff->create(PrestataireInfosFormType::class, $this->session->get('_prestagere'), array('action' => $this->router->generate('prestataire_infos')));
return $form->createView();
}
......@@ -119,10 +122,10 @@ class FormFactory
public function getGroupePrestataireInscriptionForm(User $user)
{
if (empty($user) || empty($user->getPrestataire())) {
if (empty($user) || empty($this->session->get('_prestagere'))) {
throw new \Exception("[FORM 6] Opération impossible !");
}
$form = $this->ff->create(GroupePrestataireInscriptionFormType::class, $user->getPrestataire(), array('action' => $this->router->generate('groupeprestataire_inscription')));
$form = $this->ff->create(GroupePrestataireInscriptionFormType::class, $this->session->get('_prestagere'), array('action' => $this->router->generate('groupeprestataire_inscription')));
return $form->createView();
}
......@@ -155,12 +158,12 @@ class FormFactory
public function getTransactionPrestataireAdherentForm(User $user)
{
if (empty($user) || empty($user->getPrestataire())) {
if (empty($user) || empty($this->session->get('_prestagere'))) {
throw new \Exception("[FORM] Opération impossible !");
}
$entity = new TransactionPrestataireAdherent();
$entity->setOperateur($user);
$entity->setExpediteur($user->getPrestataire());
$entity->setExpediteur($this->session->get('_prestagere'));
$form = $this->ff->create(TransactionPrestataireAdherentFormType::class, $entity, array('action' => $this->router->generate('transactionPrestataireAdherent')));
return $form->createView();
......@@ -168,12 +171,12 @@ class FormFactory
public function getTransactionPrestatairePrestataireForm(User $user)
{
if (empty($user) || empty($user->getPrestataire())) {
if (empty($user) || empty($this->session->get('_prestagere'))) {
throw new \Exception("[FORM 9] Opération impossible !");
}
$entity = new TransactionPrestatairePrestataire();
$entity->setOperateur($user);
$entity->setExpediteur($user->getPrestataire());
$entity->setExpediteur($this->session->get('_prestagere'));
$form = $this->ff->create(TransactionPrestatairePrestataireFormType::class, $entity, array('action' => $this->router->generate('transactionPrestatairePrestataire')));
return $form->createView();
......@@ -181,11 +184,11 @@ class FormFactory
public function getTransfertPrestataireSiegeForm(User $user)
{
if (empty($user) || empty($user->getPrestataire())) {
if (empty($user) || empty($this->session->get('_prestagere'))) {
throw new \Exception("[FORM 10] Opération impossible !");
}
$entity = new TransfertPrestataireSiege();
$entity->setExpediteur($user->getPrestataire());
$entity->setExpediteur($this->session->get('_prestagere'));
$form = $this->ff->create(TransfertPrestataireSiegeFormType::class, $entity, array('action' => $this->router->generate('transactionPrestataireSiege')));
return $form->createView();
......@@ -193,11 +196,11 @@ class FormFactory
public function getTransfertPrestataireComptoirForm(User $user)
{
if (empty($user) || empty($user->getComptoirsgere())) {
if (empty($user) || empty($this->session->get('_comptoirgere'))) {
throw new \Exception("[FORM 11] Opération impossible !");
}
$entity = new TransfertPrestataireComptoir();
$entity->setDestinataire($user->getComptoirsgere());
$entity->setDestinataire($this->session->get('_comptoirgere'));
$form = $this->ff->create(TransfertPrestataireComptoirFormType::class, $entity, array('action' => $this->router->generate('transfertPrestataireComptoir')));
return $form->createView();
......@@ -206,13 +209,13 @@ class FormFactory
public function getRetraitComptoirToXForm(User $user, $type)
{
$type = strtolower($type);
if (empty($user) || empty($user->getComptoirsgere()) || !($type == 'adherent' || $type == 'groupe' || $type == 'prestataire')) {
if (empty($user) || empty($this->session->get('_comptoirgere')) || !($type == 'adherent' || $type == 'groupe' || $type == 'prestataire')) {
throw new \Exception("[FORM 12] Opération impossible !");
}
$class = "App\Entity\RetraitComptoir".ucwords($type);
$entity = new $class();
$entity->setOperateur($user);
$entity->setExpediteur($user->getComptoirsgere());
$entity->setExpediteur($this->session->get('_comptoirgere'));
$form = $this->ff->create('App\Form\Type\RetraitComptoir'.ucwords($type).'FormType', $entity, array('action' => $this->router->generate('retraitComptoir'.ucwords($type))));
return $form->createView();
......@@ -221,13 +224,13 @@ class FormFactory
public function getVenteComptoirToXForm(User $user, $type)
{
$type = strtolower($type);
if (empty($user) || empty($user->getComptoirsgere()) || !($type == 'adherent' || $type == 'groupe' || $type == 'prestataire')) {
if (empty($user) || empty($this->session->get('_comptoirgere')) || !($type == 'adherent' || $type == 'groupe' || $type == 'prestataire')) {
throw new \Exception("[FORM 12] Opération impossible !");
}
$class = "App\Entity\VenteComptoir".ucwords($type);
$entity = new $class();
$entity->setOperateur($user);
$entity->setExpediteur($user->getComptoirsgere());
$entity->setExpediteur($this->session->get('_comptoirgere'));
$form = $this->ff->create('App\Form\Type\VenteComptoir'.ucwords($type).'FormType', $entity, array('action' => $this->router->generate('venteComptoir'.ucwords($type))));
return $form->createView();
......@@ -235,12 +238,12 @@ class FormFactory
public function getTransfertComptoirGroupeForm(User $user)
{
if (empty($user) || empty($user->getGroupesgere())) {
if (empty($user) || empty($this->session->get('_groupegere'))) {
throw new \Exception("[FORM 12] Opération impossible !");
}
$entity = new TransfertComptoirGroupe();
$entity->setOperateur($user);
$entity->setDestinataire($user->getGroupesgere());
$entity->setDestinataire($this->session->get('_groupegere'));
$form = $this->ff->create(TransfertComptoirGroupeFormType::class, $entity, array('action' => $this->router->generate('transfertComptoirGroupe')));
return $form->createView();
......@@ -248,12 +251,12 @@ class FormFactory
public function getTransfertGroupeComptoirForm(User $user)
{
if (empty($user) || empty($user->getGroupesgere())) {
if (empty($user) || empty($this->session->get('_groupegere'))) {
throw new \Exception("[FORM 13] Opération impossible !");
}
$entity = new TransfertGroupeComptoir();
$entity->setOperateur($user);
$entity->setExpediteur($user->getGroupesgere());
$entity->setExpediteur($this->session->get('_groupegere'));
$form = $this->ff->create(TransfertGroupeComptoirFormType::class, $entity, array('action' => $this->router->generate('transfertGroupeComptoir')));
return $form->createView();
......
......@@ -31,16 +31,10 @@ class AddCotisationFormType extends AbstractType
{
$now = new \DateTime();
$flux = $options['data'];
// dump($flux);
// exit();
if (empty($this->security) && !empty($this->security->getUser())) {
throw new \Exception("Opération impossible ! Utilisateur non connecté !");
}
$builder
->add('type', HiddenType::class, array(
'data' => 'cotisation',
'data_class' => null
))
->add('operateur', HiddenType::class, array(
'entity_class' => User::class,
'em' => $this->em,
......
<?php
namespace App\Form\Type;
use App\Entity\CotisationAdherent;
use App\Entity\Groupe;
use App\Entity\Prestataire;
use App\Entity\User;
use App\Enum\MoyenEnum;
use Doctrine\DBAL\Types\FloatType;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\DependencyInjection\ContainerAwareTrait;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Security\Core\Security;
class AdherentCotiserFormType extends CotiserFormType
{
protected $em;
protected $security;
public function __construct(EntityManagerInterface $em, Security $security)
{
$this->em = $em;
$this->security = $security;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$now = new \DateTime();
if (empty($this->security) && !empty($this->security->getUser())) {
throw new \Exception("Opération impossible ! Utilisateur non connecté !");
}
$builder
->add('operateur', HiddenType::class, array(
'entity_class' => User::class,
'em' => $this->em,
'data_class' => null,
'data' => $this->security->getUser()
))
->add('reference', HiddenType::class, array(
'label' => 'Reference :',
'required' => true,
'data' => 'Cotisation '.$now->format('Y')
))
->add('montant', HiddenType::class, array(
))
->add('moyen', HiddenType::class, array(
'data' => MoyenEnum::MOYEN_AUTRE,
))
;
;
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => CotisationAdherent::class,
'cascade_validation' => true
));
}
public function getBlockPrefix()
{
return 'formCotiser';
}
}
......@@ -3,6 +3,7 @@
namespace App\Form\Type;
use App\Entity\Cotisation;
use App\Entity\GlobalParameter;
use App\Enum\MoyenEnum;
use App\Form\Type\CotisationInfosFormType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
......@@ -19,13 +20,9 @@ class CotisationFormType extends FluxFormType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('type', HiddenType::class, array(
'data' => 'cotisation',
'data_class' => null
))
->add('montant', MoneyType::class, array(
'label' => 'Montant',
'data' => floatval($this->container->getParameter('app.cotisation_montant'))
'data' => floatval($this->em->getRepository(GlobalParameter::class)->val(GlobalParameter::COTISATION_MONTANT))
))
->add('moyen', ChoiceType::class, array(
'required' => true,
......
<?php
namespace App\Form\Type;
use App\Entity\Adherent;
use App\Entity\Groupe;
use App\Entity\Prestataire;
use App\Entity\User;
use App\Entity\GlobalParameter;
use App\Enum\MoyenEnum;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Security\Core\Security;
class CotiserFormType extends AbstractType
{
protected $em;
protected $security;
public function __construct(EntityManagerInterface $em, Security $security)
{
$this->em = $em;
$this->security = $security;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$now = new \DateTime();
if (empty($this->security) && !empty($this->security->getUser())) {
throw new \Exception("Opération impossible ! Utilisateur non connecté !");
}
$builder
->add('operateur', HiddenType::class, array(
'entity_class' => User::class,
'em' => $this->em,
'data_class' => null,
'data' => $this->security->getUser()
))
->add('reference', HiddenType::class, array(
'label' => 'Reference :',
'required' => true,
'data' => 'Cotisation '.$now->format('Y')
))
->add('montant', HiddenType::class, array(
'data' => floatval($this->em->getRepository(GlobalParameter::class)->val(GlobalParameter::COTISATION_MONTANT)),
))
->add('moyen', HiddenType::class, array(
'data' => MoyenEnum::MOYEN_MLC,
))
;
;
}
/**
* {@inheritdoc}
*/
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => Cotisation::class,
'cascade_validation' => true
));
}
public function getBlockPrefix()
{
return 'formCotiser';
}
}
<?php
namespace App\Form\Type;
use App\Entity\Comptoir;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class FirstComptoirFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('enabled', HiddenType::class, array('data' => true))
->add('name', TextType::class, array(
'label' => 'Nom :',
'required' => true
))
->add('geoloc', GeolocFormType::class, array(
'label' => 'Géolocalisation :',
'attr' => ['class' => 'ml-4'],
'required' => true
))
->add('compte', NumberType::class, array(
'label' => 'Solde de monnaie actuellement au comptoir :',
'required' => true
))
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Comptoir::class
]);
}
public function getBlockPrefix()
{
return 'formFirstComptoir';
}
}
<?php
namespace App\Form\Type;
use App\Entity\Groupe;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class FirstGroupeFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('enabled', HiddenType::class, array('data' => true))
->add('name', TextType::class, array(
'label' => 'Nom',
'required' => true
))
->add('compte', NumberType::class, array(
'label' => 'Solde de monnaie actuellement au groupe :',
'required' => true
))
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Groupe::class
]);
}
public function getBlockPrefix()
{
return 'formFirstGroupe';
}
}
......@@ -4,6 +4,7 @@ namespace App\Form\Type;
use App\Entity\Flux;
use App\Entity\User;
use App\Tools\RoleCheck;
use App\Enum\MoyenEnum;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
......@@ -18,6 +19,7 @@ use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Validator\Constraints\LessThanOrEqual;
......@@ -27,12 +29,16 @@ class FluxFormType extends AbstractType
protected $em;
protected $security;
protected $container;
protected $session;
protected $rolecheck;
public function __construct(EntityManagerInterface $em, Security $security, ContainerInterface $container)
public function __construct(EntityManagerInterface $em, Security $security, ContainerInterface $container, SessionInterface $session, RoleCheck $rolecheck)
{
$this->em = $em;
$this->security = $security;
$this->container = $container;
$this->session = $session;
$this->rolecheck = $rolecheck;
}
public function buildForm(FormBuilderInterface $builder, array $options)
......@@ -53,7 +59,11 @@ class FluxFormType extends AbstractType
'data_class' => null,
'entity_class' => User::class,
'em' => $this->em
));
))
->add('role', HiddenType::class, array(
'data' => $this->rolecheck->getCurrentRole()->__toString()
))
;
if (empty($flux->getExpediteur())) {
$builder
->add('montant', MoneyType::class, array(
......@@ -62,38 +72,43 @@ class FluxFormType extends AbstractType
))
;
} else {
// @TODO : finir logique ici : emlc ou billets mlc et check expediteur ou destinataire ?
if ($flux->getParenttype() == Flux::TYPE_TRANSACTION) {
$maxvalue = $flux->getExpediteur()->getEcompte();
} else {
$maxvalue = $flux->getExpediteur()->getCompte();
$constraintsMontant = [];
if ($flux->getParenttype() == Flux::TYPE_TRANSACTION || $flux->getType() == 'prestataire_siege') {
$constraintsMontant = [
new LessThanOrEqual([
'message' => 'Montant supérieur à votre solde.',
'value' => $flux->getExpediteur()->getEcompte(),
]),
];
} elseif ($flux->getParenttype() != Flux::TYPE_COTISATION) {
$constraintsMontant = [
new LessThanOrEqual([
'message' => 'Montant supérieur à votre solde.',
'value' => $flux->getExpediteur()->getCompte(),
]),
];
}
$builder
->add('montant', MoneyType::class, array(
'label' => 'Montant :',
'required' => true,
'constraints' => [
new LessThanOrEqual([
'message' => 'Montant supérieur à votre solde.',
'value' => $maxvalue,
]),
],
'constraints' => $constraintsMontant,
))
;
}
$builder
->add('reference', TextType::class, array(
'label' => 'Reference :',
'required' => true
'required' => false
))
->add('save', SubmitType::class, ['label' => "Valider"])
->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) use ($builder) {
// $flux = $event->getData();
// if ($event->getForm()->isValid() && (!$flux || null === $flux->getId())) {
// if ($flux->getExpediteur()->getCompte() < $flux->getMontant()) {
// $event->getForm()->get('montant')->addError(new FormError("Montant supérieur à votre solde !"));
// }
// }
$flux = $event->getData();
if ($event->getForm()->isValid() && (!$flux || null === $flux->getId()) && $flux->getParenttype() == Flux::TYPE_COTISATION && $flux->getMoyen() == MoyenEnum::MOYEN_MLC) {
if ($flux->getExpediteur()->getEcompte() < $flux->getMontant()) {
$event->getForm()->get('montant')->addError(new FormError("Montant supérieur à votre solde !"));
}
}
})
;
}
......
......@@ -5,13 +5,22 @@ namespace App\Form\Type;
use App\Entity\Geoloc;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\ButtonType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Routing\RouterInterface;
class GeolocFormType extends AbstractType
{
private $router;
public function __construct(RouterInterface $router)
{
$this->router = $router;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$geoloc = null;
......@@ -31,6 +40,10 @@ class GeolocFormType extends AbstractType
'label' => 'Ville :',
'required' => $options['required']
))
->add('search', ButtonType::class, [
'label' => 'Géolocaliser',
'attr' => ['class' => 'searchLatLon btn btn-primary', 'data-url' => $this->router->generate('geolocAdresse')],
]);
;
if ($options['with_latlon'] === true || (!empty($geoloc) && (!empty($geoloc->getLat()) || !empty($geoloc->getLon())))) {
$builder
......@@ -48,11 +61,11 @@ class GeolocFormType extends AbstractType
public function configureOptions(OptionsResolver $resolver)
{
// $resolver->setRequired(['with_latlon']);
$resolver->setDefaults([
'data_class' => Geoloc::class,
'with_latlon' => false
'with_latlon' => true
]);
$resolver->setRequired(['with_latlon']);
}
public function getBlockPrefix()
......
<?php
namespace App\Form\Type;
use App\Entity\Siege;
use App\Entity\Groupe;
use App\Entity\GlobalParameter;
use Doctrine\ORM\EntityManagerInterface;
use FOS\CKEditorBundle\Form\Type\CKEditorType;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Validator\Constraints\Email as EmailConstraint;
use Symfony\Component\Validator\Constraints\Type as TypeConstraint;
use Symfony\Component\Validator\Constraints\Regex as RegexConstraint;
class GlobalConfigurationFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('mlcname', GlobalParameterType::class, array(
'label' => 'Nom de la Monnaie (long) :',
'name_param' => GlobalParameter::MLC_NAME,
'_placeholder' => 'Monnaie Locale Complémentaire',
'required' => true,
))
->add('mlcsmallname', GlobalParameterType::class, array(
'label' => 'Nom court de la Monnaie ou abbréviation :',
'name_param' => GlobalParameter::MLC_NAME_SMALL,
'_placeholder' => 'MLC',
'required' => true,
))
->add('mlcnotifemail', GlobalParameterType::class, array(
'label' => "Email utilisé pour l'envoi des notifications :",
'name_param' => GlobalParameter::MLC_NOTIF_EMAIL,
'required' => true,
'_placeholder' => 'notification@mlc.com',
'constraints_param' => [
new EmailConstraint(['message' => 'Email invalide !'])
],
))
->add('mlccotisation', GlobalParameterType::class, array(
'label' => 'Montant par défaut des cotisations:',
'name_param' => GlobalParameter::COTISATION_MONTANT,
'help' => 'Ne pas utiliser de virgule ",", utiliser le point "."',
'required' => true,
'_placeholder' => '10',
'constraints_param' => [
new TypeConstraint(['type' => 'numeric', 'message' => "Le montant n'est pas valide !"])
],
))
->add('mapcenter', GlobalParameterType::class, array(
'label' => 'Coordonnées du centre de la carte (Format [lat,long], exemple : [45.7,3.2]):',
'name_param' => GlobalParameter::MAP_CENTER,
'required' => true,
'_placeholder' => '[45.7,3.2]',
'constraints_param' => [
new RegexConstraint(['pattern' => '/^\[[0-9]+\.[0-9]+,[0-9]+\.[0-9]+\]/', 'message' => 'Coordonnées invalide, format attendu : [45.7,3.2]'])
],
))
->add('mapzoom', GlobalParameterType::class, array(
'label' => 'Zoom de la carte (nombre entre 1 et 15) :',
'name_param' => GlobalParameter::MAP_ZOOM,
'required' => true,
'_placeholder' => '9',
'constraints_param' => [
new RegexConstraint(['pattern' => '/^[0-9]{1,2}$/', 'message' => 'Le zoom doit être un nombre entre 0 et 15 !'])
],
))
->add('mlcfavicon', GlobalParameterType::class, array(
'label' => 'Chemin du favicon :',
'_data' => '/images/favicon.png',
'name_param' => GlobalParameter::FAVICON_URL,
'required' => true,
))
->add('mlctitle', GlobalParameterType::class, array(
'label' => '[SEO] Titre par défaut des pages du site web :',
'name_param' => GlobalParameter::MLC_TITLE,
'required' => true,
))
->add('mlcdescription', GlobalParameterType::class, array(
'label' => '[SEO] Description par défaut des pages du site web :',
'name_param' => GlobalParameter::MLC_DESCRIPTION,
'required' => true,
))
->add('mlckeywords', GlobalParameterType::class, array(
'label' => '[SEO] Mot clés par défaut des pages du site web :',
'name_param' => GlobalParameter::MLC_KEYWORDS,
'required' => true,
))
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
// 'cascade_validation' => true
]);
}
public function getBlockPrefix()
{
return 'formSiege';
}
}
<?php
namespace App\Form\Type;
use App\Entity\GlobalParameter;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class GlobalParameterType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', HiddenType::class, ['data' => $options['name_param']])
->add('mandatory', HiddenType::class, ['data' => true])
->add('value', TextType::class, array(
'label' => false,
'constraints' => $options['constraints_param'],
'data' => $options['_data'],
'attr' => array(
'placeholder' => $options['_placeholder']
)
))
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => GlobalParameter::class,
'required' => true,
'name_param' => 'MLC',
'_placeholder' => '',
'_data' => null,
'default_value' => 'MLC',
'constraints_param' => [],
'error_bubbling' => false,
// 'cascade_validation' => true
]);
}
public function getBlockPrefix()
{
return 'formSiege';
}
}
......@@ -5,6 +5,7 @@ namespace App\Form\Type;
use App\Entity\Usergroup;
use App\Form\Type\RegistrationFormType;
use App\Form\Type\SiegeFormType;
use App\Form\Type\GlobalConfigurationFormType;
use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Form\AbstractType;
......@@ -29,12 +30,31 @@ class InstallFormType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('config', GlobalConfigurationFormType::class, array(
'label' => 'CONFIGURATIONS GLOBALES :',
'label_attr' => ['class' => 'font-weight-bold'],
'required' => true
))
->add('groupe', FirstGroupeFormType::class, array(
'label' => 'PREMIER GROUPE LOCAL',
'label_attr' => ['class' => 'font-weight-bold'],
'help' => "Au moins un groupe local est requis pour installer le Kohinos !",
'required' => true,
))
->add('comptoir', FirstComptoirFormType::class, array(
'label' => 'PREMIER COMPTOIR',
'label_attr' => ['class' => 'font-weight-bold'],
'help' => "Au moins un comptoir est requis pour installer le Kohinos !",
'required' => true,
))
->add('siege', SiegeFormType::class, array(
'label' => 'Siège :',
'label' => 'CONFIGURATION DU SIÈGE :',
'label_attr' => ['class' => 'font-weight-bold'],
'required' => true
))
->add('user', RegistrationFormType::class, array(
'label' => 'UTILISATEUR SUPER ADMIN :',
'label' => "CRÉATION DE L'UTILISATEUR SUPER ADMIN :",
'label_attr' => ['class' => 'font-weight-bold'],
'required' => true
))
->add('save', SubmitType::class, ['label' => "Installer le système"])
......@@ -44,8 +64,7 @@ class InstallFormType extends AbstractType
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => null,
'cascade_validation' => true
'data_class' => null
]);
}
......
......@@ -8,8 +8,6 @@ use App\Entity\Prestataire;
use App\Entity\Rubrique;
use App\Entity\User;
use App\Enum\MoyenEnum;
use App\Form\Type\GeolocFormType;
use App\Form\Type\RegistrationFormType;
use Doctrine\DBAL\Types\FloatType;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
......
......@@ -16,7 +16,7 @@ class RetraitComptoirAdherentFormType extends RetraitFormType
{
$builder
->add('expediteur', HiddenType::class, array(
'data' => $this->security->getUser()->getComptoirsgere()->getId(),
'data' => $this->session->get('_comptoirgere')->getId(),
'data_class' => null,
'entity_class' => Comptoir::class,
'em' => $this->em
......
......@@ -16,7 +16,7 @@ class RetraitComptoirPrestataireFormType extends RetraitFormType
{
$builder
->add('expediteur', HiddenType::class, array(
'data' => $this->security->getUser()->getComptoirsgere()->getId(),
'data' => $this->session->get('_comptoirgere')->getId(),
'data_class' => null,
'entity_class' => Comptoir::class,
'em' => $this->em
......
......@@ -12,10 +12,6 @@ class RetraitFormType extends FluxFormType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('type', HiddenType::class, array(
'data' => 'retrait',
'data_class' => null
))
->add('moyen', HiddenType::class, array(
'data' => MoyenEnum::MOYEN_RETRAIT
))
......
......@@ -7,6 +7,7 @@ use Doctrine\ORM\EntityManagerInterface;
use FOS\CKEditorBundle\Form\Type\CKEditorType;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType;
use Symfony\Component\Form\Extension\Core\Type\NumberType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
......@@ -19,26 +20,26 @@ class SiegeFormType extends AbstractType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class, array(
'label' => 'Nom :',
->add('name', HiddenType::class, array(
'label' => false,
'data' => 'Siège',
'required' => true
))
->add('compte', NumberType::class, array(
'label' => 'Solde de monnaie actuellement au siège :',
'required' => true
))
// ->add('content', CKEditorType::class, array(
// 'label' => 'Description :',
// 'required' => false
// ))
->add('compteNantie', NumberType::class, array(
'label' => 'Compte de monnaie nantie :',
'required' => true
))
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => Siege::class,
'cascade_validation' => true
'data_class' => Siege::class
]);
}
......
......@@ -28,9 +28,6 @@ class TransactionAdherentAdherentFormType extends TransactionFormType
'required' => true,
'label' => 'Adherent :',
))
->add('moyen', HiddenType::class, array(
'data' => MoyenEnum::MOYEN_VIREMENT
))
;
}
......
......@@ -12,12 +12,8 @@ class TransactionFormType extends FluxFormType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('type', HiddenType::class, array(
'data' => 'transaction',
'data_class' => null
))
->add('moyen', HiddenType::class, array(
'data' => MoyenEnum::MOYEN_TRANSFERT
'data' => MoyenEnum::MOYEN_VIREMENT
))
;
}
......
......@@ -16,7 +16,7 @@ class TransactionPrestataireAdherentFormType extends TransactionFormType
{
$builder
->add('expediteur', HiddenType::class, array(
'data' => $this->security->getUser()->getPrestataire()->getId(),
'data' => $this->session->get('_prestagere')->getId(),
'data_class' => null,
'entity_class' => Prestataire::class,
'em' => $this->em
......
......@@ -16,14 +16,14 @@ class TransactionPrestatairePrestataireFormType extends TransactionFormType
{
$builder
->add('expediteur', HiddenType::class, array(
'data' => $this->security->getUser()->getPrestataire()->getId(),
'data' => $this->session->get('_prestagere')->getId(),
'data_class' => null,
'entity_class' => Prestataire::class,
'em' => $this->em
))
->add('destinataire', EntityType::class, array(
'class' => Prestataire::class,
'choices' => $this->em->getRepository(Prestataire::class)->findbyExclude($this->security->getUser()->getPrestataire()),
'choices' => $this->em->getRepository(Prestataire::class)->findbyExclude($this->session->get('_prestagere')),
'placeholder' => 'Prestataire',
'required' => true,
'label' => 'Prestataire :',
......
......@@ -16,7 +16,7 @@ class TransfertComptoirGroupeFormType extends TransfertFormType
{
$builder
->add('expediteur', EntityType::class, array(
'choices' => $this->em->getRepository(Comptoir::class)->findBy(array('enabled' => true, 'groupe' => $this->security->getUser()->getGroupesgere()), array('name'=> 'ASC')),
'choices' => $this->em->getRepository(Comptoir::class)->findBy(array('enabled' => true, 'groupe' => $this->session->get('_groupegere')), array('name'=> 'ASC')),
'class' => Comptoir::class,
'placeholder' => 'Comptoir',
'required' => true,
......@@ -24,7 +24,7 @@ class TransfertComptoirGroupeFormType extends TransfertFormType
))
->add('destinataire', HiddenType::class, array(
'entity_class' => Groupe::class,
'data' => $this->security->getUser()->getGroupesgere()->getId(),
'data' => $this->session->get('_groupegere')->getId(),
'data_class' => null,
'em' => $this->em
))
......
......@@ -12,10 +12,6 @@ class TransfertFormType extends FluxFormType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('type', HiddenType::class, array(
'data' => 'transfert',
'data_class' => null
))
->add('moyen', HiddenType::class, array(
'data' => MoyenEnum::MOYEN_TRANSFERT
))
......
......@@ -14,19 +14,19 @@ class TransfertGroupeComptoirFormType extends TransfertFormType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
if (empty($this->security->getUser()) || empty($this->security->getUser()->getGroupesgere())) {
if (empty($this->security->getUser()) || empty($this->session->get('_groupegere'))) {
throw new \Exception("[FORM TRANSFERT GROUPE COMPTOIR] Opération impossible !");
}
$builder
->add('expediteur', HiddenType::class, array(
'data' => $this->security->getUser()->getGroupesgere()->getId(),
'data' => $this->session->get('_groupegere')->getId(),
'data_class' => null,
'entity_class' => Groupe::class,
'em' => $this->em
))
->add('destinataire', EntityType::class, array(
'class' => Comptoir::class,
'choices' => $this->em->getRepository(Comptoir::class)->findBy(array('groupe' => $this->security->getUser()->getGroupesgere(), 'enabled' => true), array('name' => 'ASC')),
'choices' => $this->em->getRepository(Comptoir::class)->findBy(array('groupe' => $this->session->get('_groupegere'), 'enabled' => true), array('name' => 'ASC')),
'placeholder' => 'Comptoir',
'required' => true,
'label' => 'Comptoir :',
......
......@@ -17,7 +17,7 @@ class TransfertPrestataireComptoirFormType extends TransfertFormType
{
$builder
->add('destinataire', HiddenType::class, array(
'data' => $this->security->getUser()->getComptoirsgere()->getId(),
'data' => $this->session->get('_comptoirgere')->getId(),
'data_class' => null,
'entity_class' => Comptoir::class,
'em' => $this->em
......
......@@ -19,7 +19,7 @@ class TransfertPrestataireSiegeFormType extends TransfertFormType
{
$builder
->add('expediteur', HiddenType::class, array(
'data' => $this->security->getUser()->getPrestataire()->getId(),
'data' => $this->session->get('_prestagere')->getId(),
'data_class' => null,
'entity_class' => Prestataire::class,
'em' => $this->em
......
<?php
namespace App\Form\Type;
use App\Entity\User;
use Doctrine\ORM\EntityManager;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\EntityRepository;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\Extension\Core\Type\PasswordType;
use Symfony\Component\Form\Extension\Core\Type\RepeatedType;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\OptionsResolver\OptionsResolver;
class UserFormType extends AbstractType
{
protected $em;
public function __construct(EntityManagerInterface $em)
{
$this->em = $em;
}
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('email', EmailType::class, array(
'label' => 'Courriel',
'required' => true,
'translation_domain' => 'FOSUserBundle'
))
->add('firstname', TextType::class, array(
'label' => 'Prénom',
'required' => false,
))
->add('lastname', TextType::class, array(
'label' => 'Nom',
'required' => false,
))
->add('phone', TextType::class, array(
'label' => 'Téléphone fixe :',
'required' => false
))
->add('mobile', TextType::class, array(
'label' => 'Téléphone mobile :',
'required' => false
))
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults(array(
'data_class' => User::class,
'cascade_validation' => true
));
}
public function getBlockPrefix()
{
return 'user_form';
}
}
......@@ -16,7 +16,7 @@ class VenteComptoirAdherentFormType extends VenteFormType
{
$builder
->add('expediteur', HiddenType::class, array(
'data' => $this->security->getUser()->getComptoirsgere()->getId(),
'data' => $this->session->get('_comptoirgere')->getId(),
'data_class' => null,
'entity_class' => Comptoir::class,
'em' => $this->em
......
......@@ -16,7 +16,7 @@ class VenteComptoirPrestataireFormType extends VenteFormType
{
$builder
->add('expediteur', HiddenType::class, array(
'data' => $this->security->getUser()->getComptoirsgere()->getId(),
'data' => $this->session->get('_comptoirgere')->getId(),
'data_class' => null,
'entity_class' => Comptoir::class,
'em' => $this->em
......
......@@ -12,10 +12,6 @@ class VenteFormType extends FluxFormType
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('type', HiddenType::class, array(
'data' => 'transfert',
'data_class' => null
))
->add('moyen', HiddenType::class, array(
'data' => MoyenEnum::MOYEN_VENTE
))
......
......@@ -43,11 +43,27 @@ class AfterLoginRedirection implements AuthenticationSuccessHandlerInterface
return $role->getRole();
}, $roles);
if ($request->getSession()->has('_groupId') && !$token->getUser()->getGroups()->containsKey($request->getSession()->get('_groupId'))) {
$request->getSession()->remove('_prestagere');
$request->getSession()->remove('_comptoirgere');
$request->getSession()->remove('_groupegere');
if ($request->getSession()->has('_groupId') && !$token->getUser()->getGroups()->contains($request->getSession()->get('_groupId'))) {
$request->getSession()->remove('_groupId');
}
if (!$request->getSession()->has('_groupId') && count($token->getUser()->getGroups()) > 1) {
$request->getSession()->set('_choixGroup', 'true');
if (!$request->getSession()->has('_groupId')) {
if (count($token->getUser()->getGroups()) > 1) {
$request->getSession()->set('_choixGroup', 'true');
} else {
$groupe = $token->getUser()->getGroups()[0];
foreach ($rolesTab as $role) {
if ($role == 'ROLE_PRESTATAIRE' && count($token->getUser()->getPrestataires()) >= 1) {
$request->getSession()->set('_prestagere', $token->getUser()->getPrestataires()[0]);
} elseif ($role == 'ROLE_COMPTOIR' && count($token->getUser()->getComptoirsGeres()) >= 1) {
$request->getSession()->set('_comptoirgere', $token->getUser()->getComptoirsGeres()[0]);
} elseif (($role == 'ROLE_TRESORIER' || $role == 'ROLE_CONTACT' || $role == 'ROLE_GESTION_GROUPE') && count($token->getUser()->getGroupesGeres()) >= 1) {
$request->getSession()->set('_groupegere', $token->getUser()->getGroupesGeres()[0]);
}
}
}
}
if (in_array('ROLE_SUPER_ADMIN', $rolesTab, true)) {
......
<?php
namespace App\Listener;
use App\Entity\User;
use Doctrine\Common\EventSubscriber;
use Doctrine\ORM\EntityManagerInterface;
use Doctrine\ORM\Event\OnFlushEventArgs;
use Doctrine\ORM\Events;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Normalizer\PropertyNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Serializer\SerializerInterface;
use Symfony\Component\Serializer\Normalizer\AbstractNormalizer;
class UnitOfWorkListener implements EventSubscriber
{
private $em;
private $serializer;
private $session;
public function __construct(EntityManagerInterface $em, SerializerInterface $serializer, Security $security, SessionInterface $session)
{
$this->em = $em;
$this->serializer = $serializer;
$this->security = $security;
$this->session = $session;
}
public function getSubscribedEvents()
{
return array(Events::onFlush);
}
public function onFlush(OnFlushEventArgs $args)
{
$em = $args->getEntityManager();
$uow = $em->getUnitOfWork();
if ($this->security->getUser() != null) {
// // if (true == true) {
// if ($this->security->getUser()->hasRole('ROLE_ADMIN')
// || $this->security->getUser()->hasRole('ROLE_SUPER_ADMIN')
// || $this->security->getUser()->hasRole('ROLE_MODERATEUR')
// ) {
// // ON EDITE LES ENTITES COMME D'HABITUDE ! => pas de changements du UnitOfWork
// } else {
// DEBUG
$debug = false;
if ($debug) {
dump("-------------------------------------------------- insert");
dump($uow->getScheduledEntityInsertions());
dump("-------------------------------------------------- update");
dump($uow->getScheduledEntityUpdates());
foreach ($uow->getScheduledEntityUpdates() as $entity) {
dump(get_class($entity).' '.$entity->getId());
dump($uow->getEntityChangeSet($entity));
}
dump("-------------------------------------------------- delete");
dump($uow->getScheduledEntityDeletions());
dump("-------------------------------------------------- col update");
dump($uow->getScheduledCollectionUpdates());
dump("-------------------------------------------------- col delete");
dump($uow->getScheduledCollectionDeletions());
// exit();
}
$updated = $uow->getScheduledEntityUpdates();
$deleted = $uow->getScheduledEntityDeletions();
// $colupdated = $uow->getScheduledCollectionUpdates();
// $coldeleted = $uow->getScheduledCollectionDeletions();
foreach ($updated as $entity) {
if ($entity instanceof User) {
$userDB = $this->em->getRepository(User::class)->findOneById($entity->getId());
$changeSets = $this->em->getUnitOfWork()->getEntityChangeSet($entity);
$hasRoleSuperAdmin = false;
$hasRoleAdminSiege = false;
$hasRemovedRoleSuperAdmin = false;
$hasRemovedRoleAdminSiege = false;
foreach ($changeSets as $key => $changeSet) {
if ($key == 'enabled' && $changeSet[0] == true && $changeSet[1] == false) {
if ($entity->hasRole('ROLE_SUPER_ADMIN')) {
$hasRemovedRoleSuperAdmin = true;
}
if ($entity->hasRole('ROLE_ADMIN_SIEGE')) {
$hasRemovedRoleAdminSiege = true;
}
}
if ($key == 'roles') {
foreach ($changeSet[0] as $key => $role) {
if ($role == 'ROLE_SUPER_ADMIN') {
$hasRoleSuperAdmin = true;
}
if ($role == 'ROLE_ADMIN_SIEGE') {
$hasRoleAdminSiege = true;
}
}
if ($hasRoleSuperAdmin) {
$hasRemovedRoleSuperAdmin = true;
}
if ($hasRoleAdminSiege) {
$hasRemovedRoleAdminSiege = true;
}
foreach ($changeSet[1] as $key => $role) {
if ($role == 'ROLE_SUPER_ADMIN') {
$hasRemovedRoleSuperAdmin = false;
}
if ($role == 'ROLE_ADMIN_SIEGE') {
$hasRemovedRoleAdminSiege = false;
}
}
}
}
if ($hasRemovedRoleSuperAdmin) {
$usersSuperAdmin = $this->em->getRepository(User::class)->findByRole('ROLE_SUPER_ADMIN');
if (count($usersSuperAdmin) <= 1) {
$this->session->getFlashBag()->add('error', 'Impossible de désactiver ou supprimer le dernier utilisateur SUPER ADMIN, ajoutez en un autre avant !');
$uow->detach($entity);
}
}
if ($hasRemovedRoleAdminSiege) {
$usersAdminSiege = $this->em->getRepository(User::class)->findByRole('ROLE_SUPER_ADMIN');
if (count($usersAdminSiege) <= 1) {
$this->session->getFlashBag()->add('error', 'Impossible de désactiver ou supprimer le dernier utilisateur ADMIN SIEGE, ajoutez en un autre avant !');
$uow->detach($entity);
}
}
}
}
foreach ($deleted as $entity) {
if ($entity instanceof User) {
if ($entity->hasRole('ROLE_SUPER_ADMIN')) {
$usersSuperAdmin = $this->em->getRepository(User::class)->findByRole('ROLE_SUPER_ADMIN');
if (count($usersSuperAdmin) <= 1) {
$this->session->getFlashBag()->add('error', 'Impossible de désactiver ou supprimer le dernier utilisateur SUPER ADMIN, ajoutez en un autre avant !');
$uow->detach($entity);
}
}
if ($entity->hasRole('ROLE_ADMIN_SIEGE')) {
$usersAdminSiege = $this->em->getRepository(User::class)->findByRole('ROLE_SUPER_ADMIN');
if (count($usersAdminSiege) <= 1) {
$this->session->getFlashBag()->add('error', 'Impossible de désactiver ou supprimer le dernier utilisateur ADMIN SIEGE, ajoutez en un autre avant !');
$uow->detach($entity);
}
}
}
}
}
}
// /**
// * Make a snapshot of insert or update entity link to produit
// * @param Versionable $entity Versionable entity
// * @param string $type 'update' or 'new'
// */
// private function _makeSnapshot($entity, $type = 'update', $productId = null)
// {
// $makeSnapshot = true;
// $entitySerialized = $this->serializer->serialize($entity, 'json', ['groups' => ['default']]);
// if ($entity instanceof Document && $type == 'update') {
// $classes = array('IndustrielVisuel', 'ProduitVisuel', 'ProduitDoc', 'Produit2D', 'Produit3D', 'ProduitTexture', 'ProduitBIM', 'ProduitSavoirFaireDoc', 'ProduitColorieDoc', 'ProduitColorieVignette');
// foreach ($classes as $class) {
// $produitVisuel = $this->em->getRepository('AppBundle:'.$class)->findOneBy(array('img' => $entity));
// if ($produitVisuel) {
// $entity->setProduit($produitVisuel->getProduit());
// $productId = $produitVisuel->getProduit();
// break;
// }
// }
// }
// if ($entity->getId() != null) {
// $currentEntity = $this->em->getRepository(get_class($entity))->find($entity->getId());
// if ($type == 'update' && $productId == null) {
// $change = $this->em->getUnitOfWork()->getEntityChangeSet($entity);
// if (array_key_exists('produit', $change) && count($change['produit']) > 0) {
// $product = $change['produit'][0];
// $this->productid = $product->getId();
// $newProduct = $change['produit'][1];
// if ($newProduct == null or $newProduct->getId() == null) {
// $type = 'delete';
// }
// }
// }
// if (count($this->em->getUnitOfWork()->getEntityChangeSet($entity)) > 0 or $type == 'delete' or $type == 'new') {
// $makeSnapshot = true;
// } else {
// $makeSnapshot = false;
// }
// }
// if ($entity instanceof Document && ($type == 'new' or $type == 'delete')) {
// $makeSnapshot = false;
// }
// if ($makeSnapshot) {
// $changeSets = $this->em->getUnitOfWork()->getEntityChangeSet($entity);
// if ($type == 'new') {
// $resourceVersion = new ResourceVersion($entity, $entitySerialized, $this->security->getUser(), 'new', null, $type, $productId);
// $class = $this->em->getClassMetadata(get_class($resourceVersion));
// $this->em->persist($resourceVersion);
// $this->em->getUnitOfWork()->computeChangeSet($class, $resourceVersion);
// } elseif ($type == 'delete') {
// $resourceVersion = new ResourceVersion($currentEntity, $this->serializer->serialize($currentEntity, 'json', ['groups' => ['default']]), $this->security->getUser(), 'delete', null, $type, $this->productid);
// $class = $this->em->getClassMetadata(get_class($resourceVersion));
// $this->em->persist($resourceVersion);
// $this->em->getUnitOfWork()->computeChangeSet($class, $resourceVersion);
// } else { // update
// foreach ($changeSets as $key => $changeSet) {
// $resourceVersion = new ResourceVersion($entity, $entitySerialized, $this->security->getUser(), (($type == 'delete') ? 'delete' : $key), (($type == 'delete') ? null : $changeSet), $type, $this->productid);
// $class = $this->em->getClassMetadata(get_class($resourceVersion));
// $this->em->persist($resourceVersion);
// $this->em->getUnitOfWork()->computeChangeSet($class, $resourceVersion);
// }
// }
// }
// }
}
<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20200309152747 extends AbstractMigration
{
public function getDescription() : string
{
return '';
}
public function up(Schema $schema) : void
{
// this up() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('CREATE TABLE news (id INT AUTO_INCREMENT NOT NULL, media_id INT DEFAULT NULL, user_id INT NOT NULL, visible_by_all_groups TINYINT(1) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, name VARCHAR(150) NOT NULL, slug VARCHAR(150) NOT NULL, content LONGTEXT DEFAULT NULL, enabled TINYINT(1) NOT NULL, UNIQUE INDEX UNIQ_1DD39950989D9B62 (slug), INDEX IDX_1DD39950EA9FDD75 (media_id), INDEX IDX_1DD39950A76ED395 (user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE flux (id INT AUTO_INCREMENT NOT NULL, user_id INT DEFAULT NULL, siege_id INT DEFAULT NULL, cotisationinfos_id INT DEFAULT NULL, adherent_id INT DEFAULT NULL, prestataire_id INT DEFAULT NULL, adherent_dest_id INT DEFAULT NULL, prestataire_dest_id INT DEFAULT NULL, comptoir_id INT DEFAULT NULL, groupe_id INT DEFAULT NULL, type VARCHAR(200) NOT NULL, parenttype VARCHAR(20) NOT NULL, montant NUMERIC(7, 2) NOT NULL, moyen VARCHAR(100) NOT NULL, reference VARCHAR(255) DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, discr VARCHAR(255) NOT NULL, reconverti TINYINT(1) DEFAULT NULL, INDEX IDX_7252313AA76ED395 (user_id), INDEX IDX_7252313ABF006E8B (siege_id), INDEX IDX_7252313A2CB102AD (cotisationinfos_id), INDEX IDX_7252313A25F06C53 (adherent_id), INDEX IDX_7252313ABE3DB2B7 (prestataire_id), INDEX IDX_7252313AFCF2AA19 (adherent_dest_id), INDEX IDX_7252313AECEF536E (prestataire_dest_id), INDEX IDX_7252313AAEB0C1F5 (comptoir_id), INDEX IDX_7252313A7A45358C (groupe_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE rubrique (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(150) NOT NULL, slug VARCHAR(150) NOT NULL, content LONGTEXT DEFAULT NULL, enabled TINYINT(1) NOT NULL, UNIQUE INDEX UNIQ_8FA4097C989D9B62 (slug), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE rubrique_prestataire (rubrique_id INT NOT NULL, prestataire_id INT NOT NULL, INDEX IDX_7D4D41BB3BD38833 (rubrique_id), INDEX IDX_7D4D41BBBE3DB2B7 (prestataire_id), PRIMARY KEY(rubrique_id, prestataire_id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE document (id INT AUTO_INCREMENT NOT NULL, media_id INT DEFAULT NULL, user_id INT DEFAULT NULL, enabled TINYINT(1) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, name VARCHAR(150) NOT NULL, slug VARCHAR(150) NOT NULL, content LONGTEXT DEFAULT NULL, UNIQUE INDEX UNIQ_D8698A76989D9B62 (slug), INDEX IDX_D8698A76EA9FDD75 (media_id), INDEX IDX_D8698A76A76ED395 (user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE typepresta (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(150) NOT NULL, slug VARCHAR(150) NOT NULL, content LONGTEXT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, enabled TINYINT(1) NOT NULL, UNIQUE INDEX UNIQ_966F48A2989D9B62 (slug), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE siege (id INT AUTO_INCREMENT NOT NULL, compte_nantie NUMERIC(12, 2) NOT NULL, name VARCHAR(150) NOT NULL, slug VARCHAR(150) NOT NULL, content LONGTEXT DEFAULT NULL, compte NUMERIC(12, 2) NOT NULL, UNIQUE INDEX UNIQ_6706B4F7989D9B62 (slug), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE cotisationinfos (id INT AUTO_INCREMENT NOT NULL, annee INT NOT NULL, debut DATE NOT NULL, fin DATE NOT NULL, recu TINYINT(1) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE import (id INT AUTO_INCREMENT NOT NULL, media_id INT DEFAULT NULL, user_id INT DEFAULT NULL, enabled TINYINT(1) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, INDEX IDX_9D4ECE1DEA9FDD75 (media_id), INDEX IDX_9D4ECE1DA76ED395 (user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE adherent (id INT AUTO_INCREMENT NOT NULL, groupe_id INT DEFAULT NULL, geoloc_id INT DEFAULT NULL, enabled TINYINT(1) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, ecompte NUMERIC(12, 2) NOT NULL, INDEX IDX_90D3F0607A45358C (groupe_id), UNIQUE INDEX UNIQ_90D3F060EF390162 (geoloc_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE comptoir (id INT AUTO_INCREMENT NOT NULL, media_id INT DEFAULT NULL, groupe_id INT DEFAULT NULL, geoloc_id INT DEFAULT NULL, name VARCHAR(150) NOT NULL, slug VARCHAR(150) NOT NULL, content LONGTEXT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, enabled TINYINT(1) NOT NULL, tel VARCHAR(20) DEFAULT NULL, email VARCHAR(100) DEFAULT NULL, compte NUMERIC(12, 2) NOT NULL, UNIQUE INDEX UNIQ_A6E2C35E989D9B62 (slug), INDEX IDX_A6E2C35EEA9FDD75 (media_id), INDEX IDX_A6E2C35E7A45358C (groupe_id), UNIQUE INDEX UNIQ_A6E2C35EEF390162 (geoloc_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE comptoir_user (comptoir_id INT NOT NULL, user_id INT NOT NULL, INDEX IDX_615689B1AEB0C1F5 (comptoir_id), INDEX IDX_615689B1A76ED395 (user_id), PRIMARY KEY(comptoir_id, user_id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE user (id INT AUTO_INCREMENT NOT NULL, adherent_id INT DEFAULT NULL, username VARCHAR(180) NOT NULL, username_canonical VARCHAR(180) NOT NULL, email VARCHAR(180) NOT NULL, email_canonical VARCHAR(180) NOT NULL, enabled TINYINT(1) NOT NULL, salt VARCHAR(255) DEFAULT NULL, password VARCHAR(255) NOT NULL, last_login DATETIME DEFAULT NULL, confirmation_token VARCHAR(180) DEFAULT NULL, password_requested_at DATETIME DEFAULT NULL, roles LONGTEXT NOT NULL COMMENT \'(DC2Type:array)\', created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, date_of_birth DATETIME DEFAULT NULL, firstname VARCHAR(64) DEFAULT NULL, lastname VARCHAR(64) DEFAULT NULL, website VARCHAR(64) DEFAULT NULL, biography VARCHAR(1000) DEFAULT NULL, gender VARCHAR(1) DEFAULT NULL, locale VARCHAR(8) DEFAULT NULL, timezone VARCHAR(64) DEFAULT NULL, phone VARCHAR(64) DEFAULT NULL, facebook_uid VARCHAR(255) DEFAULT NULL, facebook_name VARCHAR(255) DEFAULT NULL, facebook_data LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:json)\', twitter_uid VARCHAR(255) DEFAULT NULL, twitter_name VARCHAR(255) DEFAULT NULL, twitter_data LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:json)\', gplus_uid VARCHAR(255) DEFAULT NULL, gplus_name VARCHAR(255) DEFAULT NULL, gplus_data LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:json)\', token VARCHAR(255) DEFAULT NULL, two_step_code VARCHAR(255) DEFAULT NULL, etat VARCHAR(10) DEFAULT NULL, mobile VARCHAR(15) DEFAULT NULL, apiKey VARCHAR(255) DEFAULT NULL, alertemailflux TINYINT(1) DEFAULT \'1\' NOT NULL, UNIQUE INDEX UNIQ_8D93D64992FC23A8 (username_canonical), UNIQUE INDEX UNIQ_8D93D649A0D96FBF (email_canonical), UNIQUE INDEX UNIQ_8D93D649C05FB297 (confirmation_token), UNIQUE INDEX UNIQ_8D93D64925F06C53 (adherent_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE user_usergroup (user_id INT NOT NULL, group_id INT NOT NULL, INDEX IDX_4A84F5F3A76ED395 (user_id), INDEX IDX_4A84F5F3FE54D947 (group_id), PRIMARY KEY(user_id, group_id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE lien (id INT AUTO_INCREMENT NOT NULL, user_id INT DEFAULT NULL, url VARCHAR(255) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, enabled TINYINT(1) NOT NULL, name VARCHAR(150) NOT NULL, slug VARCHAR(150) NOT NULL, content LONGTEXT DEFAULT NULL, UNIQUE INDEX UNIQ_A532B4B5989D9B62 (slug), INDEX IDX_A532B4B5A76ED395 (user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE prestataire (id INT AUTO_INCREMENT NOT NULL, typeprestataire_id INT DEFAULT NULL, media_id INT DEFAULT NULL, groupe_id INT DEFAULT NULL, geoloc_id INT DEFAULT NULL, raison VARCHAR(100) NOT NULL, description LONGTEXT DEFAULT NULL, slug VARCHAR(100) NOT NULL, metier VARCHAR(100) DEFAULT NULL, statut VARCHAR(50) DEFAULT NULL, responsable VARCHAR(200) DEFAULT NULL, iban VARCHAR(100) NOT NULL, siret VARCHAR(50) NOT NULL, web VARCHAR(255) DEFAULT NULL, mlc TINYINT(1) DEFAULT \'0\' NOT NULL, horaires VARCHAR(255) DEFAULT NULL, enabled TINYINT(1) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, compte NUMERIC(12, 2) NOT NULL, ecompte NUMERIC(12, 2) NOT NULL, UNIQUE INDEX UNIQ_60A26480989D9B62 (slug), INDEX IDX_60A26480618045AC (typeprestataire_id), INDEX IDX_60A26480EA9FDD75 (media_id), INDEX IDX_60A264807A45358C (groupe_id), UNIQUE INDEX UNIQ_60A26480EF390162 (geoloc_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE prestataire_user (prestataire_id INT NOT NULL, user_id INT NOT NULL, INDEX IDX_6A15943DBE3DB2B7 (prestataire_id), INDEX IDX_6A15943DA76ED395 (user_id), PRIMARY KEY(prestataire_id, user_id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE geoloc (id INT AUTO_INCREMENT NOT NULL, adresse VARCHAR(255) DEFAULT NULL, cpostal VARCHAR(10) DEFAULT NULL, ville VARCHAR(100) DEFAULT NULL, lat NUMERIC(10, 8) DEFAULT NULL, lon NUMERIC(10, 8) DEFAULT NULL, enabled TINYINT(1) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE faq (id INT AUTO_INCREMENT NOT NULL, fichier_id INT DEFAULT NULL, media_id INT DEFAULT NULL, user_id INT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, enabled TINYINT(1) NOT NULL, name VARCHAR(150) NOT NULL, slug VARCHAR(150) NOT NULL, content LONGTEXT DEFAULT NULL, UNIQUE INDEX UNIQ_E8FF75CC989D9B62 (slug), INDEX IDX_E8FF75CCF915CFE (fichier_id), INDEX IDX_E8FF75CCEA9FDD75 (media_id), INDEX IDX_E8FF75CCA76ED395 (user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE page (id INT AUTO_INCREMENT NOT NULL, user_id INT NOT NULL, js LONGTEXT DEFAULT NULL, css LONGTEXT DEFAULT NULL, description VARCHAR(255) DEFAULT NULL, keywords VARCHAR(255) DEFAULT NULL, template VARCHAR(255) DEFAULT NULL, name VARCHAR(150) NOT NULL, slug VARCHAR(150) NOT NULL, content LONGTEXT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, enabled TINYINT(1) NOT NULL, UNIQUE INDEX UNIQ_140AB620989D9B62 (slug), INDEX IDX_140AB620A76ED395 (user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE global_parameter (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, value LONGTEXT NOT NULL, mandatory TINYINT(1) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE groupe (id INT AUTO_INCREMENT NOT NULL, siege_id INT NOT NULL, name VARCHAR(150) NOT NULL, slug VARCHAR(150) NOT NULL, content LONGTEXT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, enabled TINYINT(1) NOT NULL, compte NUMERIC(12, 2) NOT NULL, UNIQUE INDEX UNIQ_4B98C21989D9B62 (slug), INDEX IDX_4B98C21BF006E8B (siege_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE groupe_user (groupe_id INT NOT NULL, user_id INT NOT NULL, INDEX IDX_257BA9FE7A45358C (groupe_id), INDEX IDX_257BA9FEA76ED395 (user_id), PRIMARY KEY(groupe_id, user_id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE email_token (id INT AUTO_INCREMENT NOT NULL, user_id INT DEFAULT NULL, token VARCHAR(255) NOT NULL, expired_at DATE NOT NULL, INDEX IDX_C27AE0B4A76ED395 (user_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE message (id INT AUTO_INCREMENT NOT NULL, expediteur_id INT DEFAULT NULL, destinataire_id INT DEFAULT NULL, name VARCHAR(150) NOT NULL, slug VARCHAR(150) NOT NULL, content LONGTEXT DEFAULT NULL, enabled TINYINT(1) NOT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, UNIQUE INDEX UNIQ_B6BD307F989D9B62 (slug), INDEX IDX_B6BD307F10335F61 (expediteur_id), INDEX IDX_B6BD307FA4F84F6E (destinataire_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE usergroup (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(180) NOT NULL, roles LONGTEXT NOT NULL COMMENT \'(DC2Type:array)\', UNIQUE INDEX UNIQ_4A6478175E237E06 (name), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE groupeprestaire (id INT AUTO_INCREMENT NOT NULL, groupe_id INT DEFAULT NULL, media_id INT DEFAULT NULL, geoloc_id INT DEFAULT NULL, type VARCHAR(50) NOT NULL, horaires VARCHAR(255) DEFAULT NULL, name VARCHAR(150) NOT NULL, slug VARCHAR(150) NOT NULL, content LONGTEXT DEFAULT NULL, created_at DATETIME NOT NULL, updated_at DATETIME NOT NULL, tel VARCHAR(20) DEFAULT NULL, email VARCHAR(100) DEFAULT NULL, enabled TINYINT(1) NOT NULL, UNIQUE INDEX UNIQ_FB9ABBCE989D9B62 (slug), INDEX IDX_FB9ABBCE7A45358C (groupe_id), INDEX IDX_FB9ABBCEEA9FDD75 (media_id), UNIQUE INDEX UNIQ_FB9ABBCEEF390162 (geoloc_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE groupeprestataire_prestataire (groupeprestataire_id INT NOT NULL, prestataire_id INT NOT NULL, INDEX IDX_66D8DEC98D18A702 (groupeprestataire_id), INDEX IDX_66D8DEC9BE3DB2B7 (prestataire_id), PRIMARY KEY(groupeprestataire_id, prestataire_id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE sonata_menu (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, alias VARCHAR(255) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE sonata_menu_item (id INT AUTO_INCREMENT NOT NULL, parent INT DEFAULT NULL, menu INT NOT NULL, name VARCHAR(255) NOT NULL, url VARCHAR(255) DEFAULT NULL, class_attribute VARCHAR(255) DEFAULT NULL, position SMALLINT UNSIGNED DEFAULT NULL, target TINYINT(1) DEFAULT \'0\', enabled TINYINT(1) DEFAULT \'1\', INDEX IDX_57D4FCFA3D8E604F (parent), INDEX IDX_57D4FCFA7D053A93 (menu), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE media__gallery_media (id INT AUTO_INCREMENT NOT NULL, gallery_id INT DEFAULT NULL, media_id INT DEFAULT NULL, position INT NOT NULL, enabled TINYINT(1) NOT NULL, updated_at DATETIME NOT NULL, created_at DATETIME NOT NULL, INDEX IDX_80D4C5414E7AF8F (gallery_id), INDEX IDX_80D4C541EA9FDD75 (media_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE media__gallery (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, context VARCHAR(64) NOT NULL, default_format VARCHAR(255) NOT NULL, enabled TINYINT(1) NOT NULL, updated_at DATETIME NOT NULL, created_at DATETIME NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE media__media (id INT AUTO_INCREMENT NOT NULL, name VARCHAR(255) NOT NULL, description TEXT DEFAULT NULL, enabled TINYINT(1) NOT NULL, provider_name VARCHAR(255) NOT NULL, provider_status INT NOT NULL, provider_reference VARCHAR(255) NOT NULL, provider_metadata LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:json)\', width INT DEFAULT NULL, height INT DEFAULT NULL, length NUMERIC(10, 0) DEFAULT NULL, content_type VARCHAR(255) DEFAULT NULL, content_size INT DEFAULT NULL, copyright VARCHAR(255) DEFAULT NULL, author_name VARCHAR(255) DEFAULT NULL, context VARCHAR(64) DEFAULT NULL, cdn_is_flushable TINYINT(1) DEFAULT NULL, cdn_flush_identifier VARCHAR(64) DEFAULT NULL, cdn_flush_at DATETIME DEFAULT NULL, cdn_status INT DEFAULT NULL, updated_at DATETIME NOT NULL, created_at DATETIME NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE lexik_trans_unit (id INT AUTO_INCREMENT NOT NULL, key_name VARCHAR(255) NOT NULL, domain VARCHAR(255) NOT NULL, created_at DATETIME DEFAULT NULL, updated_at DATETIME DEFAULT NULL, UNIQUE INDEX key_domain_idx (key_name, domain), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE lexik_translation_file (id INT AUTO_INCREMENT NOT NULL, domain VARCHAR(255) NOT NULL, locale VARCHAR(10) NOT NULL, extention VARCHAR(10) NOT NULL, path VARCHAR(255) NOT NULL, hash VARCHAR(255) NOT NULL, UNIQUE INDEX hash_idx (hash), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('CREATE TABLE lexik_trans_unit_translations (id INT AUTO_INCREMENT NOT NULL, file_id INT DEFAULT NULL, trans_unit_id INT DEFAULT NULL, locale VARCHAR(10) NOT NULL, content LONGTEXT NOT NULL, created_at DATETIME DEFAULT NULL, updated_at DATETIME DEFAULT NULL, modified_manually TINYINT(1) NOT NULL, INDEX IDX_B0AA394493CB796C (file_id), INDEX IDX_B0AA3944C3C583C9 (trans_unit_id), UNIQUE INDEX trans_unit_locale_idx (trans_unit_id, locale), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('ALTER TABLE news ADD CONSTRAINT FK_1DD39950EA9FDD75 FOREIGN KEY (media_id) REFERENCES media__media (id)');
$this->addSql('ALTER TABLE news ADD CONSTRAINT FK_1DD39950A76ED395 FOREIGN KEY (user_id) REFERENCES user (id)');
$this->addSql('ALTER TABLE flux ADD CONSTRAINT FK_7252313AA76ED395 FOREIGN KEY (user_id) REFERENCES user (id)');
$this->addSql('ALTER TABLE flux ADD CONSTRAINT FK_7252313ABF006E8B FOREIGN KEY (siege_id) REFERENCES siege (id)');
$this->addSql('ALTER TABLE flux ADD CONSTRAINT FK_7252313A2CB102AD FOREIGN KEY (cotisationinfos_id) REFERENCES cotisationinfos (id)');
$this->addSql('ALTER TABLE flux ADD CONSTRAINT FK_7252313A25F06C53 FOREIGN KEY (adherent_id) REFERENCES adherent (id)');
$this->addSql('ALTER TABLE flux ADD CONSTRAINT FK_7252313ABE3DB2B7 FOREIGN KEY (prestataire_id) REFERENCES prestataire (id)');
$this->addSql('ALTER TABLE flux ADD CONSTRAINT FK_7252313AFCF2AA19 FOREIGN KEY (adherent_dest_id) REFERENCES adherent (id)');
$this->addSql('ALTER TABLE flux ADD CONSTRAINT FK_7252313AECEF536E FOREIGN KEY (prestataire_dest_id) REFERENCES prestataire (id)');
$this->addSql('ALTER TABLE flux ADD CONSTRAINT FK_7252313AAEB0C1F5 FOREIGN KEY (comptoir_id) REFERENCES comptoir (id)');
$this->addSql('ALTER TABLE flux ADD CONSTRAINT FK_7252313A7A45358C FOREIGN KEY (groupe_id) REFERENCES groupe (id)');
$this->addSql('ALTER TABLE rubrique_prestataire ADD CONSTRAINT FK_7D4D41BB3BD38833 FOREIGN KEY (rubrique_id) REFERENCES rubrique (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE rubrique_prestataire ADD CONSTRAINT FK_7D4D41BBBE3DB2B7 FOREIGN KEY (prestataire_id) REFERENCES prestataire (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE document ADD CONSTRAINT FK_D8698A76EA9FDD75 FOREIGN KEY (media_id) REFERENCES media__media (id)');
$this->addSql('ALTER TABLE document ADD CONSTRAINT FK_D8698A76A76ED395 FOREIGN KEY (user_id) REFERENCES user (id)');
$this->addSql('ALTER TABLE import ADD CONSTRAINT FK_9D4ECE1DEA9FDD75 FOREIGN KEY (media_id) REFERENCES media__media (id)');
$this->addSql('ALTER TABLE import ADD CONSTRAINT FK_9D4ECE1DA76ED395 FOREIGN KEY (user_id) REFERENCES user (id)');
$this->addSql('ALTER TABLE adherent ADD CONSTRAINT FK_90D3F0607A45358C FOREIGN KEY (groupe_id) REFERENCES groupe (id)');
$this->addSql('ALTER TABLE adherent ADD CONSTRAINT FK_90D3F060EF390162 FOREIGN KEY (geoloc_id) REFERENCES geoloc (id)');
$this->addSql('ALTER TABLE comptoir ADD CONSTRAINT FK_A6E2C35EEA9FDD75 FOREIGN KEY (media_id) REFERENCES media__media (id)');
$this->addSql('ALTER TABLE comptoir ADD CONSTRAINT FK_A6E2C35E7A45358C FOREIGN KEY (groupe_id) REFERENCES groupe (id)');
$this->addSql('ALTER TABLE comptoir ADD CONSTRAINT FK_A6E2C35EEF390162 FOREIGN KEY (geoloc_id) REFERENCES geoloc (id)');
$this->addSql('ALTER TABLE comptoir_user ADD CONSTRAINT FK_615689B1AEB0C1F5 FOREIGN KEY (comptoir_id) REFERENCES comptoir (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE comptoir_user ADD CONSTRAINT FK_615689B1A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE user ADD CONSTRAINT FK_8D93D64925F06C53 FOREIGN KEY (adherent_id) REFERENCES adherent (id)');
$this->addSql('ALTER TABLE user_usergroup ADD CONSTRAINT FK_4A84F5F3A76ED395 FOREIGN KEY (user_id) REFERENCES user (id)');
$this->addSql('ALTER TABLE user_usergroup ADD CONSTRAINT FK_4A84F5F3FE54D947 FOREIGN KEY (group_id) REFERENCES usergroup (id)');
$this->addSql('ALTER TABLE lien ADD CONSTRAINT FK_A532B4B5A76ED395 FOREIGN KEY (user_id) REFERENCES user (id)');
$this->addSql('ALTER TABLE prestataire ADD CONSTRAINT FK_60A26480618045AC FOREIGN KEY (typeprestataire_id) REFERENCES typepresta (id)');
$this->addSql('ALTER TABLE prestataire ADD CONSTRAINT FK_60A26480EA9FDD75 FOREIGN KEY (media_id) REFERENCES media__media (id)');
$this->addSql('ALTER TABLE prestataire ADD CONSTRAINT FK_60A264807A45358C FOREIGN KEY (groupe_id) REFERENCES groupe (id)');
$this->addSql('ALTER TABLE prestataire ADD CONSTRAINT FK_60A26480EF390162 FOREIGN KEY (geoloc_id) REFERENCES geoloc (id)');
$this->addSql('ALTER TABLE prestataire_user ADD CONSTRAINT FK_6A15943DBE3DB2B7 FOREIGN KEY (prestataire_id) REFERENCES prestataire (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE prestataire_user ADD CONSTRAINT FK_6A15943DA76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE faq ADD CONSTRAINT FK_E8FF75CCF915CFE FOREIGN KEY (fichier_id) REFERENCES media__media (id)');
$this->addSql('ALTER TABLE faq ADD CONSTRAINT FK_E8FF75CCEA9FDD75 FOREIGN KEY (media_id) REFERENCES media__media (id)');
$this->addSql('ALTER TABLE faq ADD CONSTRAINT FK_E8FF75CCA76ED395 FOREIGN KEY (user_id) REFERENCES user (id)');
$this->addSql('ALTER TABLE page ADD CONSTRAINT FK_140AB620A76ED395 FOREIGN KEY (user_id) REFERENCES user (id)');
$this->addSql('ALTER TABLE groupe ADD CONSTRAINT FK_4B98C21BF006E8B FOREIGN KEY (siege_id) REFERENCES siege (id)');
$this->addSql('ALTER TABLE groupe_user ADD CONSTRAINT FK_257BA9FE7A45358C FOREIGN KEY (groupe_id) REFERENCES groupe (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE groupe_user ADD CONSTRAINT FK_257BA9FEA76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE email_token ADD CONSTRAINT FK_C27AE0B4A76ED395 FOREIGN KEY (user_id) REFERENCES user (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE message ADD CONSTRAINT FK_B6BD307F10335F61 FOREIGN KEY (expediteur_id) REFERENCES user (id)');
$this->addSql('ALTER TABLE message ADD CONSTRAINT FK_B6BD307FA4F84F6E FOREIGN KEY (destinataire_id) REFERENCES user (id)');
$this->addSql('ALTER TABLE groupeprestaire ADD CONSTRAINT FK_FB9ABBCE7A45358C FOREIGN KEY (groupe_id) REFERENCES groupe (id)');
$this->addSql('ALTER TABLE groupeprestaire ADD CONSTRAINT FK_FB9ABBCEEA9FDD75 FOREIGN KEY (media_id) REFERENCES media__media (id)');
$this->addSql('ALTER TABLE groupeprestaire ADD CONSTRAINT FK_FB9ABBCEEF390162 FOREIGN KEY (geoloc_id) REFERENCES geoloc (id)');
$this->addSql('ALTER TABLE groupeprestataire_prestataire ADD CONSTRAINT FK_66D8DEC98D18A702 FOREIGN KEY (groupeprestataire_id) REFERENCES groupeprestaire (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE groupeprestataire_prestataire ADD CONSTRAINT FK_66D8DEC9BE3DB2B7 FOREIGN KEY (prestataire_id) REFERENCES prestataire (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE sonata_menu_item ADD CONSTRAINT FK_57D4FCFA3D8E604F FOREIGN KEY (parent) REFERENCES sonata_menu_item (id) ON DELETE SET NULL');
$this->addSql('ALTER TABLE sonata_menu_item ADD CONSTRAINT FK_57D4FCFA7D053A93 FOREIGN KEY (menu) REFERENCES sonata_menu (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE media__gallery_media ADD CONSTRAINT FK_80D4C5414E7AF8F FOREIGN KEY (gallery_id) REFERENCES media__gallery (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE media__gallery_media ADD CONSTRAINT FK_80D4C541EA9FDD75 FOREIGN KEY (media_id) REFERENCES media__media (id) ON DELETE CASCADE');
$this->addSql('ALTER TABLE lexik_trans_unit_translations ADD CONSTRAINT FK_B0AA394493CB796C FOREIGN KEY (file_id) REFERENCES lexik_translation_file (id)');
$this->addSql('ALTER TABLE lexik_trans_unit_translations ADD CONSTRAINT FK_B0AA3944C3C583C9 FOREIGN KEY (trans_unit_id) REFERENCES lexik_trans_unit (id)');
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('ALTER TABLE rubrique_prestataire DROP FOREIGN KEY FK_7D4D41BB3BD38833');
$this->addSql('ALTER TABLE prestataire DROP FOREIGN KEY FK_60A26480618045AC');
$this->addSql('ALTER TABLE flux DROP FOREIGN KEY FK_7252313ABF006E8B');
$this->addSql('ALTER TABLE groupe DROP FOREIGN KEY FK_4B98C21BF006E8B');
$this->addSql('ALTER TABLE flux DROP FOREIGN KEY FK_7252313A2CB102AD');
$this->addSql('ALTER TABLE flux DROP FOREIGN KEY FK_7252313A25F06C53');
$this->addSql('ALTER TABLE flux DROP FOREIGN KEY FK_7252313AFCF2AA19');
$this->addSql('ALTER TABLE user DROP FOREIGN KEY FK_8D93D64925F06C53');
$this->addSql('ALTER TABLE flux DROP FOREIGN KEY FK_7252313AAEB0C1F5');
$this->addSql('ALTER TABLE comptoir_user DROP FOREIGN KEY FK_615689B1AEB0C1F5');
$this->addSql('ALTER TABLE news DROP FOREIGN KEY FK_1DD39950A76ED395');
$this->addSql('ALTER TABLE flux DROP FOREIGN KEY FK_7252313AA76ED395');
$this->addSql('ALTER TABLE document DROP FOREIGN KEY FK_D8698A76A76ED395');
$this->addSql('ALTER TABLE import DROP FOREIGN KEY FK_9D4ECE1DA76ED395');
$this->addSql('ALTER TABLE comptoir_user DROP FOREIGN KEY FK_615689B1A76ED395');
$this->addSql('ALTER TABLE user_usergroup DROP FOREIGN KEY FK_4A84F5F3A76ED395');
$this->addSql('ALTER TABLE lien DROP FOREIGN KEY FK_A532B4B5A76ED395');
$this->addSql('ALTER TABLE prestataire_user DROP FOREIGN KEY FK_6A15943DA76ED395');
$this->addSql('ALTER TABLE faq DROP FOREIGN KEY FK_E8FF75CCA76ED395');
$this->addSql('ALTER TABLE page DROP FOREIGN KEY FK_140AB620A76ED395');
$this->addSql('ALTER TABLE groupe_user DROP FOREIGN KEY FK_257BA9FEA76ED395');
$this->addSql('ALTER TABLE email_token DROP FOREIGN KEY FK_C27AE0B4A76ED395');
$this->addSql('ALTER TABLE message DROP FOREIGN KEY FK_B6BD307F10335F61');
$this->addSql('ALTER TABLE message DROP FOREIGN KEY FK_B6BD307FA4F84F6E');
$this->addSql('ALTER TABLE flux DROP FOREIGN KEY FK_7252313ABE3DB2B7');
$this->addSql('ALTER TABLE flux DROP FOREIGN KEY FK_7252313AECEF536E');
$this->addSql('ALTER TABLE rubrique_prestataire DROP FOREIGN KEY FK_7D4D41BBBE3DB2B7');
$this->addSql('ALTER TABLE prestataire_user DROP FOREIGN KEY FK_6A15943DBE3DB2B7');
$this->addSql('ALTER TABLE groupeprestataire_prestataire DROP FOREIGN KEY FK_66D8DEC9BE3DB2B7');
$this->addSql('ALTER TABLE adherent DROP FOREIGN KEY FK_90D3F060EF390162');
$this->addSql('ALTER TABLE comptoir DROP FOREIGN KEY FK_A6E2C35EEF390162');
$this->addSql('ALTER TABLE prestataire DROP FOREIGN KEY FK_60A26480EF390162');
$this->addSql('ALTER TABLE groupeprestaire DROP FOREIGN KEY FK_FB9ABBCEEF390162');
$this->addSql('ALTER TABLE flux DROP FOREIGN KEY FK_7252313A7A45358C');
$this->addSql('ALTER TABLE adherent DROP FOREIGN KEY FK_90D3F0607A45358C');
$this->addSql('ALTER TABLE comptoir DROP FOREIGN KEY FK_A6E2C35E7A45358C');
$this->addSql('ALTER TABLE prestataire DROP FOREIGN KEY FK_60A264807A45358C');
$this->addSql('ALTER TABLE groupe_user DROP FOREIGN KEY FK_257BA9FE7A45358C');
$this->addSql('ALTER TABLE groupeprestaire DROP FOREIGN KEY FK_FB9ABBCE7A45358C');
$this->addSql('ALTER TABLE user_usergroup DROP FOREIGN KEY FK_4A84F5F3FE54D947');
$this->addSql('ALTER TABLE groupeprestataire_prestataire DROP FOREIGN KEY FK_66D8DEC98D18A702');
$this->addSql('ALTER TABLE sonata_menu_item DROP FOREIGN KEY FK_57D4FCFA7D053A93');
$this->addSql('ALTER TABLE sonata_menu_item DROP FOREIGN KEY FK_57D4FCFA3D8E604F');
$this->addSql('ALTER TABLE media__gallery_media DROP FOREIGN KEY FK_80D4C5414E7AF8F');
$this->addSql('ALTER TABLE news DROP FOREIGN KEY FK_1DD39950EA9FDD75');
$this->addSql('ALTER TABLE document DROP FOREIGN KEY FK_D8698A76EA9FDD75');
$this->addSql('ALTER TABLE import DROP FOREIGN KEY FK_9D4ECE1DEA9FDD75');
$this->addSql('ALTER TABLE comptoir DROP FOREIGN KEY FK_A6E2C35EEA9FDD75');
$this->addSql('ALTER TABLE prestataire DROP FOREIGN KEY FK_60A26480EA9FDD75');
$this->addSql('ALTER TABLE faq DROP FOREIGN KEY FK_E8FF75CCF915CFE');
$this->addSql('ALTER TABLE faq DROP FOREIGN KEY FK_E8FF75CCEA9FDD75');
$this->addSql('ALTER TABLE groupeprestaire DROP FOREIGN KEY FK_FB9ABBCEEA9FDD75');
$this->addSql('ALTER TABLE media__gallery_media DROP FOREIGN KEY FK_80D4C541EA9FDD75');
$this->addSql('ALTER TABLE lexik_trans_unit_translations DROP FOREIGN KEY FK_B0AA3944C3C583C9');
$this->addSql('ALTER TABLE lexik_trans_unit_translations DROP FOREIGN KEY FK_B0AA394493CB796C');
$this->addSql('DROP TABLE news');
$this->addSql('DROP TABLE flux');
$this->addSql('DROP TABLE rubrique');
$this->addSql('DROP TABLE rubrique_prestataire');
$this->addSql('DROP TABLE document');
$this->addSql('DROP TABLE typepresta');
$this->addSql('DROP TABLE siege');
$this->addSql('DROP TABLE cotisationinfos');
$this->addSql('DROP TABLE import');
$this->addSql('DROP TABLE adherent');
$this->addSql('DROP TABLE comptoir');
$this->addSql('DROP TABLE comptoir_user');
$this->addSql('DROP TABLE user');
$this->addSql('DROP TABLE user_usergroup');
$this->addSql('DROP TABLE lien');
$this->addSql('DROP TABLE prestataire');
$this->addSql('DROP TABLE prestataire_user');
$this->addSql('DROP TABLE geoloc');
$this->addSql('DROP TABLE faq');
$this->addSql('DROP TABLE page');
$this->addSql('DROP TABLE global_parameter');
$this->addSql('DROP TABLE groupe');
$this->addSql('DROP TABLE groupe_user');
$this->addSql('DROP TABLE email_token');
$this->addSql('DROP TABLE message');
$this->addSql('DROP TABLE usergroup');
$this->addSql('DROP TABLE groupeprestaire');
$this->addSql('DROP TABLE groupeprestataire_prestataire');
$this->addSql('DROP TABLE sonata_menu');
$this->addSql('DROP TABLE sonata_menu_item');
$this->addSql('DROP TABLE media__gallery_media');
$this->addSql('DROP TABLE media__gallery');
$this->addSql('DROP TABLE media__media');
$this->addSql('DROP TABLE lexik_trans_unit');
$this->addSql('DROP TABLE lexik_translation_file');
$this->addSql('DROP TABLE lexik_trans_unit_translations');
}
}
......@@ -10,7 +10,7 @@ use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20200212164434 extends AbstractMigration
final class Version20200325154619 extends AbstractMigration
{
public function getDescription() : string
{
......@@ -22,8 +22,7 @@ final class Version20200212164434 extends AbstractMigration
// this up() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('ALTER TABLE '.$_ENV['DATABASE_PREFIX'].'adherent CHANGE ecompte ecompte NUMERIC(12, 2) NOT NULL');
$this->addSql('ALTER TABLE '.$_ENV['DATABASE_PREFIX'].'prestataire ADD ecompte NUMERIC(12, 2) NOT NULL');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban VARCHAR(100) DEFAULT NULL');
}
public function down(Schema $schema) : void
......@@ -31,7 +30,6 @@ final class Version20200212164434 extends AbstractMigration
// this down() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('ALTER TABLE '.$_ENV['DATABASE_PREFIX'].'adherent CHANGE ecompte ecompte NUMERIC(7, 2) NOT NULL');
$this->addSql('ALTER TABLE '.$_ENV['DATABASE_PREFIX'].'prestataire DROP ecompte');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban VARCHAR(100) CHARACTER SET utf8 NOT NULL COLLATE `utf8_general_ci`');
}
}
......@@ -8,9 +8,9 @@ use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20200212172915 extends AbstractMigration
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20200402130346 extends AbstractMigration
{
public function getDescription() : string
{
......@@ -22,7 +22,7 @@ final class Version20200212172915 extends AbstractMigration
// this up() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('ALTER TABLE '.$_ENV['DATABASE_PREFIX'].'siege ADD compte_nantie NUMERIC(12, 2) NOT NULL');
$this->addSql('ALTER TABLE flux ADD role VARCHAR(200) NOT NULL');
}
public function down(Schema $schema) : void
......@@ -30,6 +30,6 @@ final class Version20200212172915 extends AbstractMigration
// this down() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('ALTER TABLE '.$_ENV['DATABASE_PREFIX'].'siege DROP compte_nantie');
$this->addSql('ALTER TABLE flux DROP role');
}
}
......@@ -10,7 +10,7 @@ use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20200213232207 extends AbstractMigration
final class Version20200402132651 extends AbstractMigration
{
public function getDescription() : string
{
......@@ -22,8 +22,7 @@ final class Version20200213232207 extends AbstractMigration
// this up() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('ALTER TABLE '.$_ENV['DATABASE_PREFIX'].'user ADD alertemailflux TINYINT(1) NOT NULL');
$this->addSql('UPDATE '.$_ENV['DATABASE_PREFIX'].'user SET alertemailflux = true');
$this->addSql('ALTER TABLE flux ADD hash LONGTEXT NOT NULL');
}
public function down(Schema $schema) : void
......@@ -31,6 +30,6 @@ final class Version20200213232207 extends AbstractMigration
// this down() migration is auto-generated, please modify it to your needs
$this->abortIf($this->connection->getDatabasePlatform()->getName() !== 'mysql', 'Migration can only be executed safely on \'mysql\'.');
$this->addSql('ALTER TABLE '.$_ENV['DATABASE_PREFIX'].'user DROP alertemailflux');
$this->addSql('ALTER TABLE flux DROP hash');
}
}
......@@ -26,14 +26,22 @@ class FluxRepository extends ServiceEntityRepository
$this->tableName = $em->getMetadataFactory()->getMetadataFor(Flux::class)->getTableName();
}
/**
* @param Prestataire $presta [description]
* @return Query Returns a query fo finding an array of Flux
*/
public function getQueryByPrestataire(Prestataire $presta)
/**
* @param Prestataire $presta [description]
* @param string $parenttype Parent type of flux (cotisation, transfert, transaction, vente...)
* @return Query Returns a query fo finding an array of Flux
*/
public function getQueryByPrestataire(Prestataire $presta, $parenttype = null)
{
$statement = $this->connection->prepare("SELECT f.id FROM {$this->tableName} f WHERE f.prestataire_id = :id OR f.prestataire_dest_id = :id");
$statement->bindValue('id', $presta->getId());
$sqlQuery = "SELECT f.id FROM {$this->tableName} f WHERE (f.prestataire_id = :id OR f.prestataire_dest_id = :id)";
if ($parenttype != null) {
$sqlQuery .= ' AND f.parenttype = :type';
}
$statement = $this->connection->prepare($sqlQuery);
if ($parenttype != null) {
$statement->bindValue(':type', $parenttype);
}
$statement->bindValue(':id', $presta->getId());
$statement->execute();
$results = $statement->fetchAll();
$qb = $this->createQueryBuilder('f');
......@@ -45,14 +53,22 @@ class FluxRepository extends ServiceEntityRepository
;
}
/**
* @param Adherent $adherent [description]
* @return Query Returns a query fo finding an array of Flux
*/
public function getQueryByAdherent(Adherent $adherent)
/**
* @param Adherent $adherent [description]
* @param string $parenttype Parent type of flux (cotisation, transfert, transaction, vente...)
* @return Query Returns a query fo finding an array of Flux
*/
public function getQueryByAdherent(Adherent $adherent, $parenttype = null)
{
$statement = $this->connection->prepare("SELECT f.id FROM {$this->tableName} f WHERE f.adherent_id = :id OR f.adherent_dest_id = :id");
$statement->bindValue('id', $adherent->getId());
$sqlQuery = "SELECT f.id FROM {$this->tableName} f WHERE (f.adherent_id = :id OR f.adherent_dest_id = :id)";
if ($parenttype != null) {
$sqlQuery .= ' AND f.parenttype = :type';
}
$statement = $this->connection->prepare($sqlQuery);
if ($parenttype != null) {
$statement->bindValue(':type', $parenttype);
}
$statement->bindValue(':id', $adherent->getId());
$statement->execute();
$results = $statement->fetchAll();
$qb = $this->createQueryBuilder('f');
......@@ -64,13 +80,12 @@ class FluxRepository extends ServiceEntityRepository
;
}
/**
* @param Comptoir $comptoir [description]
* @return Query Returns a query fo finding an array of Flux
*/
/**
* @param Comptoir $comptoir [description]
* @return Query Returns a query fo finding an array of Flux
*/
public function getQueryByComptoir(Comptoir $comptoir)
{
$statement = $this->connection->prepare("SELECT f.id FROM {$this->tableName} f WHERE f.comptoir_id = :id");
$statement->bindValue('id', $comptoir->getId());
$statement->execute();
......@@ -84,10 +99,10 @@ class FluxRepository extends ServiceEntityRepository
;
}
/**
* @param Groupe $groupe [description]
* @return Query Returns a query fo finding an array of Flux
*/
/**
* @param Groupe $groupe [description]
* @return Query Returns a query fo finding an array of Flux
*/
public function getQueryByGroupe(Groupe $groupe)
{
$statement = $this->connection->prepare("SELECT f.id FROM {$this->tableName} f WHERE f.groupe_id = :id");
......
<?php
namespace App\Repository;
use App\Entity\GlobalParameter;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\Common\Persistence\ManagerRegistry;
/**
* @method GlobalParameter|null find($id, $lockMode = null, $lockVersion = null)
* @method GlobalParameter|null findOneBy(array $criteria, array $orderBy = null)
* @method GlobalParameter[] findAll()
* @method GlobalParameter[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class GlobalParameterRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, GlobalParameter::class);
}
public function findAllByName()
{
$results = $this->createQueryBuilder('g')
->getQuery()
->getArrayResult()
;
$assocArray = array_reduce($results, function ($result, $item) {
$item = (array) $item;
$key = $item['name'];
$value = $item['value'];
$result['KOH_'.$key] = $value;
return $result;
}, array());
return $assocArray;
}
public function val($name)
{
$global = $this->createQueryBuilder('g')
->andWhere('g.name = :name')
->setParameter('name', $name)
->getQuery()
->getOneOrNullResult()
;
return ($global ? $global->getValue() : '');
}
}
<?php
namespace App\Repository;
use App\Entity\User;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Symfony\Bridge\Doctrine\RegistryInterface;
/**
* @method User|null find($id, $lockMode = null, $lockVersion = null)
* @method User|null findOneBy(array $criteria, array $orderBy = null)
* @method User[] findAll()
* @method User[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class UserRepository extends ServiceEntityRepository
{
public function __construct(RegistryInterface $registry)
{
parent::__construct($registry, User::class);
}
/**
* @return User[] Returns an array of User objects
*/
public function findOrderByName()
{
$qb = $this->createQueryBuilder('p');
return $qb
->leftjoin('p.user', 'u')
->where('p.enabled = :enabled')
->setParameter('enabled', true)
->orderBy('u.lastname', 'ASC')
->getQuery()
->getResult()
;
}
/**
* @param string $role
*
* @return User[] Returns an array of User objects
*/
public function findByRole($role)
{
$qb = $this->_em->createQueryBuilder();
$qb->select('u')
->from($this->_entityName, 'u')
->where('u.roles LIKE :roles')
->setParameter('roles', '%"'.$role.'"%');
return $qb->getQuery()->getResult();
}
/**
* @param string $prestataire
*
* @return User[] Returns an array of User objects
*/
public function findByPrestataire($prestataire)
{
$qb = $this->_em->createQueryBuilder();
$qb->select('u')
->from($this->_entityName, 'u')
->where($qb->expr()->isMemberOf(':presta', 'u.prestataires'))
->setParameter('presta', $prestataire);
return $qb->getQuery()->getResult();
}
}
<?php
namespace App\Tools;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Security;
class RoleCheck
{
private $security;
private $session;
public function __construct(Security $security, SessionInterface $session)
{
$this->security = $security;
$this->session = $session;
}
/**
* Fonction permettant de vérifier que l'utilisateur a choisi ce rôle si il en a plusieurs ou sinon qu'il a bien ce rôle
*
* @param string $role Role
* @return boolean Boolean
*/
public function isGranted($role)
{
if ($this->session->has('_groupId')) {
$group = $this->session->get('_groupId');
return in_array($role, $group->getRoles());
} else {
return ($this->security->getUser() && $this->security->getUser()->isGranted($role));
}
}
public function getCurrentRole()
{
if ($this->session->has('_groupId')) {
return $this->session->get('_groupId');
} else {
if (count($this->security->getUser()->getRoles()) == 1) {
return $this->security->getUser()->getRoles()[0];
} elseif (count($this->security->getUser()->getRoles()) <= 0) {
throw new \Exception('Utilisateur sans rôle => Impossible de faire une transaction ! ');
} else {
throw new \Exception('Utilisateur avec plusieurs rôles devant choisir le rôle avant de faire une transaction ! ');
}
}
}
}
......@@ -11,7 +11,13 @@ use App\Entity\Prestataire;
use App\Entity\Rubrique;
use App\Entity\Siege;
use App\Entity\User;
use App\Tools\RoleCheck;
use Doctrine\ORM\EntityManagerInterface;
use Knp\Component\Pager\PaginatorInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\Security\Core\Security;
use Symfony\Component\Security\Core\User\UserInterface;
use Twig\Extension\AbstractExtension;
use Twig\TwigFilter;
......@@ -20,19 +26,27 @@ use Twig\TwigTest;
class AppExtension extends AbstractExtension
{
public $em;
public $container;
public $paginator;
public $session;
public $rolecheck;
public function __construct($container, $paginator)
public function __construct(ContainerInterface $container, EntityManagerInterface $em, PaginatorInterface $paginator, SessionInterface $session, RoleCheck $rolecheck)
{
$this->em = $em;
$this->container = $container;
$this->paginator = $paginator;
$this->session = $session;
$this->rolecheck = $rolecheck;
}
public function getFunctions()
{
return [
new \Twig_SimpleFunction('isCurrentRoleGranted', array($this, 'isCurrentRoleGranted')),
new \Twig_SimpleFunction('getSiege', array($this, 'getSiege')),
new \Twig_SimpleFunction('isDevFixture', array($this, 'isDevFixture')),
new \Twig_SimpleFunction('getLastNews', array($this, 'getLastNews')),
new \Twig_SimpleFunction('getAllPrestataires', array($this, 'getAllPrestataires')),
new \Twig_SimpleFunction('getAllGroupePrestataires', array($this, 'getAllGroupePrestataires')),
......@@ -47,34 +61,50 @@ class AppExtension extends AbstractExtension
];
}
public function isCurrentRoleGranted($role)
{
return $this->rolecheck->isGranted($role);
}
public function isDevFixture(?string $username = null)
{
if ($username == null) {
$user = $this->em->getRepository(User::class)->findBy(array('username' => ['user_redacteur', 'user_tresorier', 'user_prestataire', 'user_contact']));
return (count($user) === 4);
}
return ($this->em->getRepository(User::class)->findOneByUsername($username) != null);
}
public function getSiege()
{
return $this->container->get('doctrine')->getRepository(Siege::class)->findOneById(1);
return $this->em->getRepository(Siege::class)->findOneById(1);
}
public function getLastNews($limit = 5)
{
return $this->container->get('doctrine')->getRepository(News::class)->findBy(array('enabled' => true), array('createdAt' => 'DESC'), $limit);
return $this->em->getRepository(News::class)->findBy(array('enabled' => true), array('createdAt' => 'DESC'), $limit);
}
public function getAllPrestataires()
{
return $this->container->get('doctrine')->getRepository(Prestataire::class)->findBy(array('enabled' => true), array('raison'=> 'ASC'));
return $this->em->getRepository(Prestataire::class)->findBy(array('mlc' => false, 'enabled' => true), array('raison'=> 'ASC'));
}
public function getAllGroupePrestataires($type = '')
{
return $this->container->get('doctrine')->getRepository(Groupeprestataire::class)->findBy(array('type' => $type, 'enabled' => true));
return $this->em->getRepository(Groupeprestataire::class)->findBy(array('type' => $type, 'enabled' => true));
}
public function getAllComptoirs()
{
return $this->container->get('doctrine')->getRepository(Comptoir::class)->findBy(array('enabled' => true), array('name'=> 'ASC'));
return $this->em->getRepository(Comptoir::class)->findBy(array('enabled' => true), array('name'=> 'ASC'));
}
public function getAllRubriques()
{
return $this->container->get('doctrine')->getRepository(Rubrique::class)->findBy(array('enabled' => true), array('name'=> 'ASC'));
return $this->em->getRepository(Rubrique::class)->findBy(array('enabled' => true), array('name'=> 'ASC'));
}
/**
......@@ -89,17 +119,17 @@ class AppExtension extends AbstractExtension
];
}
public function getAllFlux(User $user, Request $request)
public function getAllFlux(User $user, Request $request, $parenttype = null)
{
$query = null;
if ($user->getPrestataire() != null) {
$query = $this->container->get('doctrine')->getRepository(Flux::class)->getQueryByPrestataire($user->getPrestataire());
} else if ($user->getAdherent() != null) {
$query = $this->container->get('doctrine')->getRepository(Flux::class)->getQueryByAdherent($user->getAdherent());
} else if ($user->getComptoirsgere() != null) {
$query = $this->container->get('doctrine')->getRepository(Flux::class)->getQueryByComptoir($user->getComptoirsgere());
} else if ($user->getGroupesgere() != null) {
$query = $this->container->get('doctrine')->getRepository(Flux::class)->getQueryByGroupe($user->getGroupesgere());
if ($this->session->get('_prestagere') != null) {
$query = $this->em->getRepository(Flux::class)->getQueryByPrestataire($this->session->get('_prestagere'), $parenttype);
} elseif ($user->getAdherent() != null) {
$query = $this->em->getRepository(Flux::class)->getQueryByAdherent($user->getAdherent(), $parenttype);
} elseif ($this->session->get('_comptoirgere') != null) {
$query = $this->em->getRepository(Flux::class)->getQueryByComptoir($this->session->get('_comptoirgere'));
} elseif ($this->session->get('_groupegere') != null) {
$query = $this->em->getRepository(Flux::class)->getQueryByGroupe($this->session->get('_groupegere'));
}
if ($query != null) {
$pagination = $this->paginator->paginate(
......@@ -115,12 +145,13 @@ class AppExtension extends AbstractExtension
public function getAllGroupes()
{
return $this->container->get('doctrine')->getRepository(Groupe::class)->findBy(array('enabled' => true), array('name'=> 'ASC'));
return $this->em->getRepository(Groupe::class)->findBy(array('enabled' => true), array('name'=> 'ASC'));
}
public function mediaurl($media, $format)
{
$provider = $this->container->get($media->getProviderName());
return $provider->generatePublicUrl($media, $format);
}
......@@ -134,6 +165,8 @@ class AppExtension extends AbstractExtension
public function instanceof($var, $instance)
{
$reflexionClass = new \ReflectionClass($instance);
;
return $reflexionClass->isInstance($var);
}
......@@ -152,7 +185,7 @@ class AppExtension extends AbstractExtension
$j = mt_rand(0, 1);
if ($j === 0) {
$email .= '&#'.ord($str[$i]).';';
} else if ($j === 1) {
} elseif ($j === 1) {
$email .= $str[$i];
}
}
......
<?php
namespace App\Twig;
use App\Entity\GlobalParameter;
use Doctrine\ORM\EntityManager;
use Twig\Extension\AbstractExtension;
use Twig\Extension\GlobalsInterface;
class MlcGlobalsExtension extends AbstractExtension implements GlobalsInterface
{
protected $em;
public function __construct(EntityManager $em)
{
$this->em = $em;
}
public function getGlobals()
{
return $this->em->getRepository(GlobalParameter::class)->findAllByName();
}
}
......@@ -116,9 +116,6 @@
"exsyst/swagger": {
"version": "v0.4.1"
},
"facebook/webdriver": {
"version": "1.6.0"
},
"fig/link-util": {
"version": "1.0.0"
},
......@@ -176,6 +173,45 @@
"ref": "71822522faf7ed2792d86b7f94ce73443358ccb9"
}
},
"hoa/compiler": {
"version": "3.17.08.08"
},
"hoa/consistency": {
"version": "1.17.05.02"
},
"hoa/event": {
"version": "1.17.01.13"
},
"hoa/exception": {
"version": "1.17.01.16"
},
"hoa/file": {
"version": "1.17.07.11"
},
"hoa/iterator": {
"version": "2.17.01.10"
},
"hoa/math": {
"version": "1.17.05.16"
},
"hoa/protocol": {
"version": "1.17.01.14"
},
"hoa/regex": {
"version": "1.17.01.13"
},
"hoa/stream": {
"version": "1.17.02.21"
},
"hoa/ustring": {
"version": "4.17.01.16"
},
"hoa/visitor": {
"version": "2.17.01.16"
},
"hoa/zformat": {
"version": "1.17.01.10"
},
"imagine/imagine": {
"version": "v0.7.1"
},
......@@ -185,9 +221,6 @@
"jms/metadata": {
"version": "1.7.0"
},
"jms/parser-lib": {
"version": "1.0.0"
},
"jms/serializer": {
"version": "1.13.0"
},
......@@ -278,6 +311,9 @@
"ocramius/proxy-manager": {
"version": "2.1.1"
},
"php": {
"version": "7.3"
},
"php-http/discovery": {
"version": "1.5.2"
},
......@@ -296,9 +332,6 @@
"php-http/promise": {
"version": "v1.0.0"
},
"phpcollection/phpcollection": {
"version": "0.5.0"
},
"phpdocumentor/reflection-common": {
"version": "1.0.1"
},
......@@ -308,9 +341,6 @@
"phpdocumentor/type-resolver": {
"version": "0.4.0"
},
"phpoption/phpoption": {
"version": "1.5.0"
},
"pixassociates/sortable-behavior-bundle": {
"version": "v1.5"
},
......@@ -467,6 +497,9 @@
"symfony/cache": {
"version": "v4.1.7"
},
"symfony/cache-contracts": {
"version": "v1.1.7"
},
"symfony/config": {
"version": "v4.1.7"
},
......@@ -479,9 +512,6 @@
"ref": "b5026d7ffdb43b4d66f4cc091b1e6f94e6023986"
}
},
"symfony/contracts": {
"version": "v1.0.1"
},
"symfony/css-selector": {
"version": "v4.1.7"
},
......@@ -515,6 +545,9 @@
"symfony/event-dispatcher": {
"version": "v4.1.7"
},
"symfony/event-dispatcher-contracts": {
"version": "v1.1.7"
},
"symfony/expression-language": {
"version": "v4.1.7"
},
......@@ -566,6 +599,9 @@
"ref": "fadbfe33303a76e25cb63401050439aa9b1a9c7f"
}
},
"symfony/mime": {
"version": "v4.3.10"
},
"symfony/monolog-bridge": {
"version": "v4.1.7"
},
......@@ -584,9 +620,6 @@
"symfony/orm-pack": {
"version": "v1.0.5"
},
"symfony/panther": {
"version": "v0.2.0"
},
"symfony/phpunit-bridge": {
"version": "4.1",
"recipe": {
......@@ -599,12 +632,18 @@
"symfony/polyfill-intl-icu": {
"version": "v1.10.0"
},
"symfony/polyfill-intl-idn": {
"version": "v1.13.1"
},
"symfony/polyfill-mbstring": {
"version": "v1.10.0"
},
"symfony/polyfill-php72": {
"version": "v1.10.0"
},
"symfony/polyfill-php73": {
"version": "v1.13.1"
},
"symfony/process": {
"version": "v4.1.7"
},
......@@ -656,6 +695,9 @@
"symfony/serializer-pack": {
"version": "v1.0.1"
},
"symfony/service-contracts": {
"version": "v1.1.8"
},
"symfony/stopwatch": {
"version": "v4.1.7"
},
......@@ -683,6 +725,9 @@
"ref": "1fb02a6e1c8f3d4232cce485c9afa868d63b115a"
}
},
"symfony/translation-contracts": {
"version": "v1.1.7"
},
"symfony/twig-bridge": {
"version": "v4.1.7"
},
......
<div class="card mb-3 {% if app.user.adherent.ecompte > 0 %}border-success{% else %}border-error{% endif %}">
<div class="card-header"><i class="fa fa-coins mr-4"></i> {{ 'Solde de mon e-compte'|trans }} : <b>{{app.user.adherent.ecompte}}</b></div>
</div>
\ No newline at end of file
......@@ -9,9 +9,16 @@
{% endblock blocksubtitle %}
{% block blockcontent %}
<ul class='list-group'>
{% for cotisation in app.user.cotisations %}
<li class="list-group-item">{{cotisation.annee|upper}} : {{cotisation.montant}}&euro; ({{ 'payée le'|trans }} {{cotisation.createdAt|date('d-m-Y')}})</li>
{% set cotisations = getAllFlux(app.user, app.request, 'cotisation') %}
{% for cotisation in cotisations %}
<li class="list-group-item"><span class='btn btn-xs btn-primary disabled'>{{cotisation.annee|upper}}</span> <b>{{cotisation.montant}}&euro;</b> <em> {{ 'payée le'|trans }} {{cotisation.createdAt|date('d/m/Y')}} en {{cotisation.moyen}}</em></li>
{% endfor %}
</ul>
{% if (isCurrentRoleGranted('ROLE_ADHERENT') and app.user.adherent or (isCurrentRoleGranted('ROLE_PRESTATAIRE') and app.session.has('_prestagere'))) %}
<a class='btn btn-xs btn-primary' href='{{ path('cotiser') }}'>
Cotiser en MLC
</a>
{% endif %}
{% endblock blockcontent %}
{% endif %}
\ No newline at end of file
......@@ -9,22 +9,24 @@
{% block blocksubtitle %}
{% endblock blocksubtitle %}
{% block blockcontent %}
<table class="table">
<thead>
<tr>
<th scope="col">Date</th>
<th scope="col">Type</th>
<th scope="col">Expediteur</th>
<th scope="col">Destinataire</th>
<th scope="col">Montant</th>
</tr>
</thead>
<tbody>
{% for flux in fluxs %}
{{flux.toHtmlArray()|raw}}
{% endfor %}
</tbody>
</table>
<div class="table-responsive">
<table class="table">
<thead>
<tr>
<th scope="col">Date</th>
<th scope="col">Type</th>
<th scope="col">Expediteur</th>
<th scope="col">Destinataire</th>
<th scope="col">Montant</th>
</tr>
</thead>
<tbody>
{% for flux in fluxs %}
{{flux.toHtmlArray()|raw}}
{% endfor %}
</tbody>
</table>
</div>
<br/>
<div class="btn-group">
<button type="button" class="btn btn-default dropdown-toggle" data-toggle="dropdown">
......
{# UNIQUEMENT POUR LES TESTS #}
{#% if app.environment == 'dev' and is_granted('ROLE_USER') %}
{# UNIQUEMENT POUR LES TESTS => fixture de dev #}
{% if app.environment == 'dev' and is_granted('ROLE_ADMIN') and isDevFixture() %}
{% set routeName = routeName|default('index')%}
{% if is_granted('ROLE_PREVIOUS_ADMIN') %}
<div class='w-100 text-center mb-2'>
......@@ -9,153 +9,165 @@
</div>
{% elseif is_granted('ROLE_SUPER_ADMIN') %}
<div class='mb-2 group text-center'>
<a class='btn btn-xs m-1 btn-primary' href='{{path('index', [], true)}}?_switch_user=user_prestataire'>
{{ 'PRESTATAIRE'|trans }}
</a>
<a class='btn btn-xs m-1 btn-primary' href='{{path('index', [], true)}}?_switch_user=user_adherent'>
{{ 'ADHERENT'|trans }}
</a>
<a class='btn btn-xs m-1 btn-primary' href='{{path(routeName, [], true)}}?_switch_user=user_adminsiege'>
{{ 'ADMIN SIEGE'|trans }}
</a>
<a class='btn btn-xs m-1 btn-primary' href='{{path(routeName, [], true)}}?_switch_user=user_comptoir'>
{{ 'COMPTOIR'|trans }}
</a>
<a class='btn btn-xs m-1 btn-primary' href='{{path(routeName, [], true)}}?_switch_user=user_gestiongroupe'>
{{ 'GESTION GROUPE'|trans }}
</a>
<a class='btn btn-xs m-1 btn-primary' href='{{path(routeName, [], true)}}?_switch_user=user_contact'>
{{ 'CONTACT'|trans }}
</a>
<a class='btn btn-xs m-1 btn-primary' href='{{path(routeName, [], true)}}?_switch_user=user_tresorier'>
{{ 'TRESORIER'|trans }}
</a>
<a class='btn btn-xs m-1 btn-primary' href='{{path(routeName, [], true)}}?_switch_user=user_controleur'>
{{ 'CONTROLEUR'|trans }}
</a>
<a class='btn btn-xs m-1 btn-primary' href='{{path(routeName, [], true)}}?_switch_user=user_redacteur'>
{{ 'REDACTEUR'|trans }}
</a>
{% if isDevFixture('user_prestataire') %}
<a class='btn btn-xs m-1 btn-primary' href='{{path('index', [], true)}}?_switch_user=user_prestataire'>
{{ 'PRESTATAIRE'|trans }}
</a>
{% endif %}
{% if isDevFixture('user_adherent') %}
<a class='btn btn-xs m-1 btn-primary' href='{{path('index', [], true)}}?_switch_user=user_adherent'>
{{ 'ADHERENT'|trans }}
</a>
{% endif %}
{% if isDevFixture('user_adminsiege') %}
<a class='btn btn-xs m-1 btn-primary' href='{{path(routeName, [], true)}}?_switch_user=user_adminsiege'>
{{ 'ADMIN SIEGE'|trans }}
</a>
{% endif %}
{% if isDevFixture('user_comptoir') %}
<a class='btn btn-xs m-1 btn-primary' href='{{path(routeName, [], true)}}?_switch_user=user_comptoir'>
{{ 'COMPTOIR'|trans }}
</a>
{% endif %}
{% if isDevFixture('user_gestiongroupe') %}
<a class='btn btn-xs m-1 btn-primary' href='{{path(routeName, [], true)}}?_switch_user=user_gestiongroupe'>
{{ 'GESTION GROUPE'|trans }}
</a>
{% endif %}
{% if isDevFixture('user_contact') %}
<a class='btn btn-xs m-1 btn-primary' href='{{path(routeName, [], true)}}?_switch_user=user_contact'>
{{ 'CONTACT'|trans }}
</a>
{% endif %}
{% if isDevFixture('user_tresorier') %}
<a class='btn btn-xs m-1 btn-primary' href='{{path(routeName, [], true)}}?_switch_user=user_tresorier'>
{{ 'TRESORIER'|trans }}
</a>
{% endif %}
{% if isDevFixture('user_controleur') %}
<a class='btn btn-xs m-1 btn-primary' href='{{path(routeName, [], true)}}?_switch_user=user_controleur'>
{{ 'CONTROLEUR'|trans }}
</a>
{% endif %}
{% if isDevFixture('user_redacteur') %}
<a class='btn btn-xs m-1 btn-primary' href='{{path(routeName, [], true)}}?_switch_user=user_redacteur'>
{{ 'REDACTEUR'|trans }}
</a>
{% endif %}
</div>
{% endif %}
{% endif %#}
{% endif %}
{# ACTIONS PRINCIPALES POUR CHAQUE UTILISATEUR CONNECTE #}
<div id="accordion">
{% if is_granted('ROLE_ADMIN_SIEGE') %}
{% set siege = getSiege() %}
{% set compte = siege.getCompte() %}
{% set soldelabel = 'Solde du siège'|trans %}
{% include 'block/solde.html.twig' with {'compte': compte, 'soldelabel': soldelabel} %}
{% include 'block/solde.html.twig' with {'compte': siege.getCompteNantie(), 'soldelabel': 'Monnaie nantie'} %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% include 'siege/block/transfert_siegegroupe.html.twig' %}
{% include 'siege/block/transfert_groupesiege.html.twig' %}
{% elseif is_granted('ROLE_REDACTEUR') %}
{% if not app.request.session.has('_choixGroup') %}
{% if isCurrentRoleGranted('ROLE_ADMIN_SIEGE') %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% elseif is_granted('ROLE_TRESORIER') %}
{% set siege = getSiege() %}
{% set compte = siege.getCompte() %}
{% set soldelabel = 'Solde du siège'|trans %}
{% include 'block/solde.html.twig' with {'compte': compte, 'soldelabel': soldelabel} %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{# {% include 'block/soldegroupes.html.twig' %} #}
{% set siege = getSiege() %}
{% set compte = siege.getCompte() %}
{% set soldelabel = 'Solde du siège'|trans %}
{% include 'block/solde.html.twig' with {'compte': compte, 'soldelabel': soldelabel} %}
{% include 'block/solde.html.twig' with {'compte': siege.getCompteNantie(), 'soldelabel': 'Monnaie nantie'} %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% include 'siege/block/transfert_siegegroupe.html.twig' %}
{% include 'siege/block/transfert_groupesiege.html.twig' %}
{% elseif is_granted('ROLE_CONTROLEUR') %}
{% elseif isCurrentRoleGranted('ROLE_REDACTEUR') %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% elseif is_granted('ROLE_GESTION_GROUPE') %}
{% elseif isCurrentRoleGranted('ROLE_TRESORIER') %}
{% if app.user.groupesgere != null %}
{% set compte = app.user.groupesgere.compte %}
{% set soldelabel = 'Solde du groupe'|trans %}
{% set siege = getSiege() %}
{% set compte = siege.getCompte() %}
{% set soldelabel = 'Solde du siège'|trans %}
{% include 'block/solde.html.twig' with {'compte': compte, 'soldelabel': soldelabel} %}
{% endif %}
{% include 'groupe/block/infos.html.twig' %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% include 'block/transactions.html.twig' %}
{% include 'groupe/block/transaction_comptoir.html.twig' %}
{% include 'groupe/block/retourgroupe.html.twig' %}
{% elseif is_granted('ROLE_COMPTOIR') %}
{% if app.user.comptoirsgere != null %}
{% set compte = app.user.comptoirsgere.compte %}
{% set soldelabel = 'Solde du comptoir "'|trans ~ app.user.comptoirsgere ~ '"' %}
{% include 'block/solde.html.twig' with {'compte': compte, 'soldelabel': soldelabel} %}
{% endif %}
{% include 'comptoir/block/infos.html.twig' %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% include 'block/transactions.html.twig' %}
{% include 'comptoir/block/vente_adherent.html.twig' %}
{% include 'comptoir/block/vente_prestataire.html.twig' %}
{% include 'comptoir/block/retrait_prestataire.html.twig' %}
{% include 'comptoir/block/retrait_adherent.html.twig' %}
{% include 'comptoir/block/reconversion.html.twig' %}
{% elseif is_granted('ROLE_CONTACT') %}
{% if app.user.groupesgere != null %}
{% set compte = app.user.groupesgere.compte %}
{% set soldelabel = 'Solde du groupe'|trans %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{# {% include 'block/soldegroupes.html.twig' %} #}
{% elseif isCurrentRoleGranted('ROLE_CONTROLEUR') %}
{% include 'block/userinfos.html.twig' %}
{% elseif isCurrentRoleGranted('ROLE_GESTION_GROUPE') %}
{% if app.session.get('_groupegere') != null %}
{% set compte = app.session.get('_groupegere').compte %}
{% set soldelabel = 'Solde du groupe'|trans %}
{% include 'block/solde.html.twig' with {'compte': compte, 'soldelabel': soldelabel} %}
{% endif %}
{% include 'groupe/block/infos.html.twig' %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% include 'block/transactions.html.twig' %}
{% include 'groupe/block/transaction_comptoir.html.twig' %}
{% include 'groupe/block/retourgroupe.html.twig' %}
{% elseif isCurrentRoleGranted('ROLE_COMPTOIR') %}
{% if app.session.get('_comptoirgere') != null %}
{% set compte = app.session.get('_comptoirgere').compte %}
{% set soldelabel = 'Solde du comptoir "'|trans ~ app.session.get('_comptoirgere') ~ '"' %}
{% include 'block/solde.html.twig' with {'compte': compte, 'soldelabel': soldelabel} %}
{% endif %}
{% include 'comptoir/block/infos.html.twig' %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% include 'block/transactions.html.twig' %}
{% include 'comptoir/block/vente_adherent.html.twig' %}
{% include 'comptoir/block/vente_prestataire.html.twig' %}
{% include 'comptoir/block/retrait_prestataire.html.twig' %}
{% include 'comptoir/block/retrait_adherent.html.twig' %}
{% include 'comptoir/block/reconversion.html.twig' %}
{% elseif isCurrentRoleGranted('ROLE_CONTACT') %}
{% include 'groupe/block/infos.html.twig' %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% elseif isCurrentRoleGranted('ROLE_SUPER_ADMIN') %}
{% set siege = getSiege() %}
{% set compte = siege.getCompte() %}
{% set soldelabel = 'Solde du siège'|trans %}
{% include 'block/solde.html.twig' with {'compte': compte, 'soldelabel': soldelabel} %}
{% include 'block/solde.html.twig' with {'compte': siege.getCompteNantie(), 'soldelabel': 'Monnaie nantie'} %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% elseif isCurrentRoleGranted('ROLE_PRESTATAIRE') and app.user and app.session.has('_prestagere') %}
{% set esoldelabel = 'Solde e-mlc'|trans %}
{% include 'block/solde.html.twig' with {'compte': app.session.get('_prestagere').ecompte, 'soldelabel': esoldelabel} %}
{% include 'presta/block/infos.html.twig' %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% include 'block/cotisations.html.twig' %}
{% include 'block/transactions.html.twig' %}
{% include 'groupepresta/block/inscription.html.twig' %}
{% include 'presta/block/transaction_presta.html.twig' %}
{% include 'presta/block/transaction_adherent.html.twig' %}
{% if app.session.get('_prestagere').ecompte > 0 %}
{% include 'presta/block/reconversion.html.twig' %}
{% endif %}
{% elseif isCurrentRoleGranted('ROLE_ADHERENT') and app.user and app.user.adherent %}
{% set esoldelabel = 'Solde e-mlc'|trans %}
{% include 'block/solde.html.twig' with {'compte': app.user.adherent.ecompte, 'soldelabel': esoldelabel} %}
{% include 'adherent/block/infos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% include 'block/cotisations.html.twig' %}
{% include 'block/transactions.html.twig' %}
{% include 'adherent/block/transaction_presta.html.twig' %}
{% include 'adherent/block/transaction_adherent.html.twig' %}
{% else %}
{% include 'presta/block/carte.html.twig' with {'title': 'Situer les Prestataires'|trans}%}
{% endif %}
{% include 'groupe/block/infos.html.twig' %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% include 'block/transactions.html.twig' %}
{% elseif is_granted('ROLE_SUPER_ADMIN') %}
{% set siege = getSiege() %}
{% set compte = siege.getCompte() %}
{% set soldelabel = 'Solde du siège'|trans %}
{% include 'block/solde.html.twig' with {'compte': compte, 'soldelabel': soldelabel} %}
{% include 'block/solde.html.twig' with {'compte': siege.getCompteNantie(), 'soldelabel': 'Monnaie nantie'} %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% elseif is_granted('ROLE_PRESTATAIRE') and app.user and app.user.prestataire %}
{% include 'presta/block/solde.html.twig' %}
{% set esoldelabel = 'Solde e-mlc'|trans %}
{% include 'block/solde.html.twig' with {'compte': app.user.prestataire.ecompte, 'soldelabel': esoldelabel} %}
{% include 'presta/block/infos.html.twig' %}
{% include 'block/userinfos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% include 'block/cotisations.html.twig' %}
{% include 'block/transactions.html.twig' %}
{% include 'groupepresta/block/inscription.html.twig' %}
{% include 'presta/block/transaction_presta.html.twig' %}
{% include 'presta/block/transaction_adherent.html.twig' %}
{% if app.user.prestataire.ecompte > 0 %}
{% include 'presta/block/reconversion.html.twig' %}
{% endif %}
{% elseif is_granted('ROLE_ADHERENT') and app.user and app.user.adherent %}
{% include 'adherent/block/solde.html.twig' %}
{% set esoldelabel = 'Solde e-mlc'|trans %}
{% include 'block/solde.html.twig' with {'compte': app.user.adherent.ecompte, 'soldelabel': esoldelabel} %}
{% include 'adherent/block/infos.html.twig' %}
{% include 'block/userpassword.html.twig' %}
{% include 'block/cotisations.html.twig' %}
{% include 'block/transactions.html.twig' %}
{% include 'adherent/block/transaction_presta.html.twig' %}
{% include 'adherent/block/transaction_adherent.html.twig' %}
{% else %}
{% include 'presta/block/carte.html.twig' with {'title': 'Situer les Prestataires'|trans}%}
{% endif %}
</div>
\ No newline at end of file
......@@ -14,9 +14,9 @@
{% set class = 'label-danger' %}
{% endif %}
{# ON EMPECHE ICI DE DESACTIVER LES ROLES SUPER ADMIN OU ADMIN SIEGE #}
{% if object is instanceof("App\\Entity\\User") and (object.isGranted('ROLE_SUPER_ADMIN') or object.isGranted('ROLE_ADMIN_SIEGE')) %}
{# {% if object is instanceof("App\\Entity\\User") and (object.isGranted('ROLE_SUPER_ADMIN') or object.isGranted('ROLE_ADMIN_SIEGE')) %}
{% set class = class~' hide' %}
{% endif %}
{% endif %} #}
<span class="label {{ class }} editableboolean" data-value="{{value ? 'true' : 'false'}}" data-url="{{path('setenable', {'id': object.id, 'type': field_description.options.datatype})}}" style='cursor:pointer;'>{{ text }}</span>
{% endspaceless -%}
{% endblock %}
\ No newline at end of file
{% if admin.hasAccess('delete', object) and admin.hasRoute('delete') and not object.mandatory %}
<a href="{{ admin.generateObjectUrl('delete', object) }}" class="btn btn-sm btn-default delete_link" title="{{ 'action_delete'|trans({}, 'SonataAdminBundle') }}">
<i class="fa fa-times" aria-hidden="true"></i>
{{ 'action_delete'|trans({}, 'SonataAdminBundle') }}
</a>
{% endif %}
{% if admin.hasAccess('edit', object) and admin.hasRoute('edit') and not object.mandatory %}
<a href="{{ admin.generateObjectUrl('edit', object) }}" class="btn btn-sm btn-default edit_link" title="{{ 'action_edit'|trans({}, 'SonataAdminBundle') }}">
<i class="fa fa-pencil" aria-hidden="true"></i>
{{ 'action_edit'|trans({}, 'SonataAdminBundle') }}
</a>
{% endif %}
\ No newline at end of file
......@@ -7,24 +7,24 @@
$(function () {
$("input[name='{{ admin.uniqid }}[groups][]']").each(function () {
$(this).on('ifChecked', function(event){
if ($.trim($(this).closest('label').text()) == 'Gestionnaire de Groupe' || $.trim($(this).closest('label').text()) == 'Contact') {
$('#sonata-ba-field-container-{{ admin.uniqid }}_groupesgere label.hide').removeClass('hide');
$('#sonata-ba-field-container-{{ admin.uniqid }}_groupesgere div.select2-container').removeClass('hide');
if ($.trim($(this).closest('label').text()) == 'Gestionnaire de Groupe' || $.trim($(this).closest('label').text()) == 'Contact' || $.trim($(this).closest('label').text()) == 'Trésorier') {
$('#sonata-ba-field-container-{{ admin.uniqid }}_groupesgeres label.hide').removeClass('hide');
$('#sonata-ba-field-container-{{ admin.uniqid }}_groupesgeres div.select2-container').removeClass('hide');
} else if ($.trim($(this).closest('label').text()) == 'Comptoir') {
console.log('Comptoir');
$('#sonata-ba-field-container-{{ admin.uniqid }}_comptoirsgere label.hide').removeClass('hide');
$('#sonata-ba-field-container-{{ admin.uniqid }}_comptoirsgere div.select2-container').removeClass('hide');
$('#sonata-ba-field-container-{{ admin.uniqid }}_comptoirsgeres label.hide').removeClass('hide');
$('#sonata-ba-field-container-{{ admin.uniqid }}_comptoirsgeres div.select2-container').removeClass('hide');
}
});
$(this).on('ifUnchecked', function(event){
if ($.trim($(this).closest('label').text()) == 'Gestionnaire de Groupe' || $.trim($(this).closest('label').text()) == 'Contact') {
if ($.trim($(this).closest('label').text()) == 'Gestionnaire de Groupe' || $.trim($(this).closest('label').text()) == 'Contact' || $.trim($(this).closest('label').text()) == 'Trésorier') {
$('#{{ admin.uniqid }}_groupesgere').select2('val',[]);
$('#sonata-ba-field-container-{{ admin.uniqid }}_groupesgere label.control-label').addClass('hide');
$('#sonata-ba-field-container-{{ admin.uniqid }}_groupesgere div.select2-container').addClass('hide');
$('#sonata-ba-field-container-{{ admin.uniqid }}_groupesgeres label.control-label').addClass('hide');
$('#sonata-ba-field-container-{{ admin.uniqid }}_groupesgeres div.select2-container').addClass('hide');
} else if ($.trim($(this).closest('label').text()) == 'Comptoir') {
$('#{{ admin.uniqid }}_comptoirsgere').select2('val',[]);
$('#sonata-ba-field-container-{{ admin.uniqid }}_comptoirsgere label.control-label').addClass('hide');
$('#sonata-ba-field-container-{{ admin.uniqid }}_comptoirsgere div.select2-container').addClass('hide');
$('#sonata-ba-field-container-{{ admin.uniqid }}_comptoirsgeres label.control-label').addClass('hide');
$('#sonata-ba-field-container-{{ admin.uniqid }}_comptoirsgeres div.select2-container').addClass('hide');
}
});
});
......
......@@ -25,10 +25,27 @@ Modified for MLC from Sonata package.
{% block meta_tags %}
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta charset="UTF-8">
<link rel="shortcut icon" href="{{parameter('app.favicon_url')}}" type="image/x-icon" />
{% if KOH_FAVICON_URL is defined %}
<link rel="shortcut icon" href="{{KOH_FAVICON_URL}}" type="image/x-icon" />
{% endif %}
<meta content='width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no' name='viewport'>
{% endblock %}
<link rel="stylesheet" href="/leaflet/leaflet.css">
<meta data-sonata-admin='{{ {
config: {
CONFIRM_EXIT: sonata_admin.adminPool.getOption('confirm_exit'),
USE_SELECT2: sonata_admin.adminPool.getOption('use_select2'),
USE_ICHECK: sonata_admin.adminPool.getOption('use_icheck'),
USE_STICKYFORMS: sonata_admin.adminPool.getOption('use_stickyforms'),
DEBUG: sonata_admin.adminPool.getOption('js_debug'),
},
translations: {
CONFIRM_EXIT: 'confirm_exit'|trans({}, 'SonataAdminBundle'),
},
}|json_encode()|raw }}'
>
{% block stylesheets %}
{% for stylesheet in sonata_admin.adminPool.getOption('stylesheets', []) %}
<link rel="stylesheet" href="{{ asset(stylesheet) }}">
......@@ -115,6 +132,10 @@ Modified for MLC from Sonata package.
<div class="wrapper">
{# AJOUT POUR LES MLC #}
<input type="hidden" name="koh_map_center" id="koh_map_center" value='{{KOH_MAP_CENTER|default('')}}' />
<input type="hidden" name="koh_map_zoom" id="koh_map_zoom" value='{{KOH_MAP_ZOOM|default('')}}' />
{% block sonata_header %}
<header class="main-header">
{% block sonata_header_noscript_warning %}
......@@ -145,9 +166,9 @@ Modified for MLC from Sonata package.
{% block front %}
<a href="{{path('index')}}" class="sidebar-front"
data-toggle="tooltip" data-placement="bottom" title="{{ "Page d'accueil"|trans }}"
role="button" title="{{ "Page d'accueil"|trans({}, 'app') }}">
role="button" title="{{ "Page d'accueil"|trans({}, 'messages') }}">
<i class="fa fa-lg fa-home"></i>
<span class="sr-only">{{ "Page d'accueil"|trans({}, 'app') }}</span>
<span class="sr-only">{{ "Page d'accueil"|trans({}, 'messages') }}</span>
</a>
{% endblock front %}
......@@ -178,15 +199,15 @@ Modified for MLC from Sonata package.
{% if menu.extra('safe_label', true) %}
{{- label|raw -}}
{% else %}
{{- label -}}
{{- label|truncate(100) -}}
{% endif %}
</a>
{% else %}
<span>{{ label }}</span>
<span>{{ label|truncate(100) }}</span>
{% endif %}
</li>
{% else %}
<li class="active"><span>{{ label }}</span></li>
<li class="active"><span>{{ label|truncate(100) }}</span></li>
{% endif %}
{% endfor %}
{% endif %}
......@@ -297,6 +318,7 @@ Modified for MLC from Sonata package.
{% endblock sonata_left_side %}
<div class="content-wrapper">
{% include 'common/flash-messages.html.twig' %}
{% block sonata_page_content %}
<section class="content-header">
......@@ -444,32 +466,6 @@ Modified for MLC from Sonata package.
format: 'dd-mm-yyyy',
language: 'fr'
});
$('.editableboolean').on('click', function (e) {
e.preventDefault();
var self = $(this);
$.ajax({
url : self.data('url'),
type: 'post',
data : {'value' : (self.data('value') == 'true')},
success: function(data) {
if(data.status == 'success') {
if (data.newvalue == 'false') {
self.text('non');
self.data('value', 'false');
self.addClass('label-danger');
self.removeClass('label-success');
} else {
self.data('value', 'true');
self.text('oui');
self.removeClass('label-danger');
self.addClass('label-success');
}
} else {
// $(this).addClass('error');
}
}
});
});
});
</script>
{% endblock js %}
......
<footer class="container clearfix footer">
{# TODO : ajouter crédit et lien vers la solution de gestion de la monnaie locale complémentaire libre de droits #}
<a href='http://www.kohinos.com' target='_blank'>© Kohinos 2020</a>
</footer>
\ No newline at end of file
{% trans_default_domain 'app' %}
{% trans_default_domain 'messages' %}
<!DOCTYPE html>
<!--[if IE 8]> <html class="no-js lt-ie9" lang="fr"> <![endif]-->
<!--[if IE 8]> <html class="no-js lt-ie9" lang="fr-FR"> <![endif]-->
<!--[if gt IE 8]><!-->
<html class="no-js" lang="fr">
<html class="no-js" lang="fr-FR">
<!--<![endif]-->
<head>
<meta charset="UTF-8">
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<title>{{title|default(parameter('app.mlc_title')) }}</title>
<meta name="description" content="{{ description|default('mlc_description'|trans) }}" />
<meta name="keywords" content="{{ keywords|default('mlc_keywords'|trans) }}" />
<meta name="author" content="{{ 'mlc_author'|trans }}">
<title>{{title|default(KOH_MLC_TITLE is defined ? KOH_MLC_TITLE : '') }}</title>
<meta name="description" content="{{ description|default(KOH_MLC_DESCRIPTION is defined ? KOH_MLC_DESCRIPTION : '') }}" />
<meta name="keywords" content="{{ keywords|default(KOH_MLC_KEYWORDS is defined ? KOH_MLC_KEYWORDS : '') }}" />
{# FAVICON #}
<link rel="shortcut icon" href="{{parameter('app.favicon_url')}}" type="image/x-icon" />
{% if KOH_FAVICON_URL is defined %}
<link rel="shortcut icon" href="{{KOH_FAVICON_URL}}" type="image/x-icon" />
{% endif %}
{# UTILISER LES FONT AWESOME POUR L'ICONOGRAPHIE #}
<link rel="stylesheet" href="/fontawesome/css/all.min.css">
{# UTILISER LEAFLET POUR LA CARTE #}
<link rel="stylesheet" href="/leaflet/leaflet.css">
{# POUR AJOUTER DES META ( like og: ) #}
{% block meta %}
{% endblock meta %}
{% block meta %} {% endblock meta %}
{% block stylesheets %}
{{ encore_entry_link_tags('app') }}
......
......@@ -6,7 +6,7 @@
<nav class="menu navbar navbar-expand-md navbar-light bg-light">
<a class="navbar-brand" href="{{ url('index') }}">
<img src="/images/logo.png" height="45" class="d-inline-block align-top" alt="{{ parameter('app.mlc_name') }}">
<img src="/images/logo.png" height="45" class="d-inline-block align-top" alt="{{KOH_MLC_NAME is defined ? KOH_MLC_NAME : ''}}">
</a>
<button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
......@@ -27,18 +27,18 @@
{% endif %}
{{ tree.menu(menuItems, currentPath) }}
{# MENU UTILISATEUR AYANT ACCES A L'ADMIN CONNECTE #}
{% if app.user and (is_granted('ROLE_ADMIN_SIEGE') or
is_granted('ROLE_SUPER_ADMIN') or
is_granted('ROLE_TRESORIER') or
is_granted('ROLE_CONTACT') or
is_granted('ROLE_GESTION_GROUPE') or
is_granted('ROLE_COMPTOIR') or
is_granted('ROLE_CONTROLEUR')
{% if app.user and (isCurrentRoleGranted('ROLE_ADMIN_SIEGE') or
isCurrentRoleGranted('ROLE_SUPER_ADMIN') or
isCurrentRoleGranted('ROLE_TRESORIER') or
isCurrentRoleGranted('ROLE_REDACTEUR') or
isCurrentRoleGranted('ROLE_CONTACT') or
isCurrentRoleGranted('ROLE_GESTION_GROUPE') or
isCurrentRoleGranted('ROLE_COMPTOIR') or
isCurrentRoleGranted('ROLE_CONTROLEUR')
) %}
<li class="nav-item ml-auto" role="menu-item">
<li class="nav-item" role="menu-item">
<a href="{{ path('sonata_admin_dashboard') }}" class="nav-link" data-toggle="tooltip" data-placement="bottom" title="{{ 'Administration'|trans }}">
{# {{ 'Administration'|trans }} #}
<i class="fas fa-cog"></i>
<i class="fas fa-cog text-primary"></i>
</a>
</li>
{% endif %}
......@@ -48,33 +48,31 @@
<a href="#" id="navbarDropdownUC" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" class="nav-link parent dropdown-toggle" alt='{{ app.user.name }}'>
<span style="{# font-size: 1em; color: grey; #}">
<i class="fas fa-user"></i>
<span class='ml-1'>
{% if app.session.has('_groupId') %}
{% set groupeUser = app.session.get('_groupId') %}
{{groupeUser.name}}
{% else %}
{{app.user.groups[0].name}}
{% endif %}
{% if app.session.has('_groupegere') %}
- {{app.session.get('_groupegere')}}
{% endif %}
{% if app.session.has('_comptoirgere') %}
- {{app.session.get('_comptoirgere')}}
{% endif %}
{% if app.session.has('_prestagere') %}
- {{app.session.get('_prestagere')}}
{% endif %}
</span>
</span>
</a>
<div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdownUC">
{# MENU ADHERENT CONNECTE #}
{% if is_granted('ROLE_ADHERENT') %}
{# <a href="{{ path('adherent_infos') }}" class="dropdown-item">{{ 'Mes infos'|trans }}</a>
<a href="{{ path('transactionAdherentPrestataire') }}" class="dropdown-item">{{ 'Transaction vers presta'|trans }}</a>
<a href="{{ path('transactionAdherentAdherent') }}" class="dropdown-item">{{ 'Transaction vers adherent'|trans }}</a> #}
{% endif %}
{# MENU PRESTATAIRE CONNECTE #}
{% if is_granted('ROLE_PRESTATAIRE') %}
{# <a href="{{ path('prestataire_infos') }}" class="dropdown-item">{{ 'Mes infos'|trans }}</a>
<a href="{{ path('transactionPrestataireAdherent') }}" class="dropdown-item">{{ 'Transaction vers adherent'|trans }}</a>
<a href="{{ path('transactionPrestatairePrestataire') }}" class="dropdown-item">{{ 'Transaction vers presta'|trans }}</a> #}
{% endif %}
{# MENU TRESORIER CONNECTE #}
{% if is_granted('ROLE_TRESORIER') %}
{% endif %}
{% if app.user.groups|length > 1 %}
<a href="#" class="viewChoiceGroup dropdown-item">{{ 'Choix du rôle'|trans }}</a>
{% endif %}
{% if is_granted('ROLE_PREVIOUS_ADMIN') %}
<a href="{{path('index')}}?_switch_user=_exit" class="dropdown-item">{{ 'Exit impersonate'|trans }}</a>
<a href="{{path('index')}}?_switch_user=_exit" class="dropdown-item">{{ 'Retour SUPER ADMIN'|trans }}</a>
{% endif %}
<a href="{{ path('fos_user_security_logout') }}" class="dropdown-item">{{ 'Déconnexion'|trans }}</a>
</div>
......
......@@ -11,10 +11,41 @@
<div class="modal-body">
<div class='row'>
{% if app.user %}
{#
TODO : choisir le rôle ainsi que le groupe/comptoir/presta si l'utilisateur en gère plusieurs
PRESTA => choisir le presta
GESTIONNAIRE GROUPE => choisir le groupe
CONTACT => choisir le groupe
TRESORIER => choisir le groupe
GESTIONNAIRE COMPTOIR => choisir le comptoir
#}
{% for group in app.user.groups %}
<div class='col'>
<a role="button" class="btn btn-secondary text-nowrap" href='{{path('group_choice', {'id': group.id})}}'>{{ group.name|trans }}</a>
</div>
{% for role in group.roles %}
{% if role == 'ROLE_PRESTATAIRE' %}
{% for presta in app.user.prestataires %}
<div class='col-6 text-center p-2'>
<a role="button" class="btn btn-secondary" href='{{path('presta_choice', {'prestaid' : presta.id, 'usergrpid': group.id})}}'>{{ group.name|trans }} - azaiuhzaiuh aziuzah iuzah iazhazihiuhazuihazi za za{{presta}} </a>
</div>
{% endfor %}
{% elseif role == 'ROLE_COMPTOIR' %}
{% for comptoir in app.user.comptoirsgeres %}
<div class='col-6 text-center p-2'>
<a role="button" class="btn btn-secondary" href='{{path('comptoir_choice', {'cptid' : comptoir.id, 'usergrpid': group.id})}}'>{{ group.name|trans }} - {{comptoir}} </a>
</div>
{% endfor %}
{% elseif role == 'ROLE_TRESORIER' or role == 'ROLE_CONTACT' or role == 'ROLE_GESTION_GROUPE' %}
{% for groupe in app.user.groupesgeres %}
<div class='col-6 text-center p-2'>
<a role="button" class="btn btn-secondary" href='{{path('groupe_choice', {'grpid' : groupe.id, 'usergrpid': group.id})}}'>{{ group.name|trans }} - {{groupe}} </a>
</div>
{% endfor %}
{% elseif role == 'ROLE_ADHERENT' or role == 'ROLE_ADMIN_SIEGE' or role == 'ROLE_REDACTEUR' or role == 'ROLE_CONTROLEUR' or role == 'ROLE_SUPER_ADMIN' %}
<div class='col-6 text-center p-2'>
<a role="button" class="btn btn-secondary" href='{{path('usergroup_choice', {'id': group.id})}}'>{{ group.name|trans }}</a>
</div>
{% endif %}
{% endfor %}
{% endfor %}
{% endif %}
</div>
......
......@@ -3,14 +3,9 @@
$(function () {
$('[data-toggle="tooltip"]').tooltip()
if ($('#{{idmap}}').length) {
var mymap = L.map('{{idmap}}').setView({{parameter('app.map_center')}}, {{parameter('app.map_zoom')}});
var mymap = L.map('{{idmap}}').setView({{KOH_MAP_CENTER}}, {{KOH_MAP_ZOOM}});
L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}', {
attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
maxZoom: 18,
id: 'mapbox.streets',
accessToken: '{{parameter('app.map_token')}}'
}).addTo(mymap);
L.tileLayer('https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', {maxZoom: 18, attribution: '&copy; Openstreetmap France | &copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'}).addTo(mymap);
{# AJOUTER LES MARQUEURS SUR LA CARTE #}
{% set comptoirs = getAllComptoirs() %}
......
......@@ -21,7 +21,7 @@
{% endblock content %}
{% block footer%}
<p>{{ parameter('app.mlc_name') }}</p>
<p>{{ KOH_MLC_NAME }}</p>
{% endblock footer%}
{% endblock main %}
</td>
......
......@@ -3,14 +3,9 @@
$(function () {
$('[data-toggle="tooltip"]').tooltip()
if ($('#{{idmap}}').length) {
var mymap = L.map('{{idmap}}').setView({{parameter('app.map_center')}}, {{parameter('app.map_zoom')}});
var mymap = L.map('{{idmap}}').setView({{KOH_MAP_CENTER}}, {{KOH_MAP_ZOOM}});
L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}', {
attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
maxZoom: 18,
id: 'mapbox.streets',
accessToken: '{{parameter('app.map_token')}}'
}).addTo(mymap);
L.tileLayer('https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', {maxZoom: 18, attribution: '&copy; Openstreetmap France | &copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'}).addTo(mymap);
{# AJOUTER LES MARQUEURS SUR LA CARTE #}
{% set groupegroupeprestataires = getAllGroupePrestataires(groupetype) %}
......
......@@ -6,7 +6,7 @@
<div class="card-header"><h3>{{ 'Carte des'|trans }} {{groupetype|upper}} :</h3></div>
<div class="card-body">
<div class="card-text">
{% include 'presta/block/carte.html.twig' with {title: 'Situer les '~groupetype|upper, id: 'groupeid', style:"height: 400px;"} %}
{% include 'presta/block/carte.html.twig' with {title: 'Situer les '~groupetype|capitalize, id: 'groupeid', style:"height: 400px;"} %}
</div>
</div>
</div>
......
......@@ -3,19 +3,19 @@
{% block content %}
<div class='container homepage'>
<div class='row mt-3'>
<div class='col-12 order-2 order-md-1 col-md-3'>
<div class='col-12 order-2 order-md-1 col-md-3 order-sm-2 col-sm-12 col-lg-3'>
{% block colonne_gauche %}
{% include 'common/stats.html.twig' %}
{% include 'common/groupes.html.twig' %}
{% include 'common/rubriques.html.twig' %}
{% endblock colonne_gauche %}
</div>
<div class='col-12 order-1 order-md-2 col-md-6 text-center'>
<div class='col-12 order-1 order-md-2 col-md-9 order-sm-1 col-sm-12 col-lg-6 text-center'>
{% block colonne_centre %}
{% include 'block/useradmin.html.twig' %}
{% endblock colonne_centre %}
</div>
<div class='col-12 order-3 order-md-3 col-md-3'>
<div class='col-12 order-3 order-md-3 col-md-12 order-sm-3 col-sm-12 col-lg-3'>
{% block colonne_droite %}
{% if app.user is null %}
{% set modal_id = 'mlcloginmodal' %}
......
......@@ -7,12 +7,18 @@
<div class="card-body">
<div class="card-text">
{{form_start(form)}}
{{ form_row(form.config) }}
{{ form_row(form.groupe) }}
{{ form_row(form.comptoir) }}
{{ form_row(form.siege) }}
{{ form_row(form.user) }}
{{ form_row(form.save) }}
<p><em>
{{ "A la suite de l'installation du système, un prestataire est crée (Monnaie locale) permettant de recevoir les adhésions."|trans }}
</em></p>
<div class='text-center'>{{ form_row(form.save) }}</div>
{{form_end(form)}}
</div>
</div>
</div>
</div>
{% endblock %}
{% endblock %}
\ No newline at end of file
......@@ -3,20 +3,15 @@
$(function () {
$('[data-toggle="tooltip"]').tooltip()
if ($('#{{idmap}}').length) {
var mymap = L.map('{{idmap}}').setView({{parameter('app.map_center')}}, {{parameter('app.map_zoom')}});
var mymap = L.map('{{idmap}}').setView({{KOH_MAP_CENTER}}, {{KOH_MAP_ZOOM}});
L.tileLayer('https://api.tiles.mapbox.com/v4/{id}/{z}/{x}/{y}.png?access_token={accessToken}', {
attribution: 'Map data &copy; <a href="https://www.openstreetmap.org/">OpenStreetMap</a> contributors, <a href="https://creativecommons.org/licenses/by-sa/2.0/">CC-BY-SA</a>, Imagery © <a href="https://www.mapbox.com/">Mapbox</a>',
maxZoom: 18,
id: 'mapbox.streets',
accessToken: '{{parameter('app.map_token')}}'
}).addTo(mymap);
L.tileLayer('https://{s}.tile.openstreetmap.fr/osmfr/{z}/{x}/{y}.png', {maxZoom: 18, attribution: '&copy; Openstreetmap France | &copy; <a href="https://www.openstreetmap.org/copyright">OpenStreetMap</a> contributors'}).addTo(mymap);
{# AJOUTER LES MARQUEURS SUR LA CARTE #}
{% set prestataires = getAllPrestataires() %}
{% set count = 1 %}
{% for presta in prestataires %}
{% if presta.geoloc != null and presta.geoloc.lat != null and presta.geoloc.lon != null%}
{% if presta.geoloc != null and presta.geoloc.lat != null and presta.geoloc.lon != null %}
var marker_{{count}} = L.marker([{{presta.geoloc.lat}}, {{presta.geoloc.lon}}]).addTo(mymap);
marker_{{count}}.bindPopup("{% spaceless %}{% if presta.media != null %}{% thumbnail presta.media, 'small' %}<br/><br/>{% endif %}
<a href='{{ path('show_prestataire', {'slug': presta.slug}) }}'>
......
<div class="card mb-3 {% if app.user and app.user.prestataire and app.user.prestataire.compte > 0 %}border-success{% else %}border-error{% endif %}">
<div class="card-header"><i class="fa fa-coins mr-4"></i> Solde de mon compte : <b>{{app.user.prestataire.compte}}</b></div>
</div>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="en" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="TUD.2.O" resname="resetting.flash.success">
<source>resetting.flash.success</source>
<target>resetting.flash.success</target>
</trans-unit>
<trans-unit id="cMU.0rQ" resname="security.login.username">
<source>security.login.username</source>
<target>security.login.username</target>
</trans-unit>
<trans-unit id="N_kLMwm" resname="security.login.password">
<source>security.login.password</source>
<target>security.login.password</target>
</trans-unit>
<trans-unit id=".sIpuLh" resname="Mot de passe oublié ?">
<source>Mot de passe oublié ?</source>
<target>Mot de passe oublié ?</target>
</trans-unit>
<trans-unit id="8DSptbg" resname="security.login.remember_me">
<source>security.login.remember_me</source>
<target>security.login.remember_me</target>
</trans-unit>
<trans-unit id="tuAV77Z" resname="security.login.submit">
<source>security.login.submit</source>
<target>security.login.submit</target>
</trans-unit>
<trans-unit id="B.ZozIs" resname="registration.confirmed">
<source>registration.confirmed</source>
<target>registration.confirmed</target>
</trans-unit>
<trans-unit id="_wd.d62" resname="registration.back">
<source>registration.back</source>
<target>registration.back</target>
</trans-unit>
<trans-unit id=".ndupSK" resname="registration.check_email">
<source>registration.check_email</source>
<target>registration.check_email</target>
</trans-unit>
<trans-unit id="N.aTMve" resname="registration.email.subject">
<source>registration.email.subject</source>
<target>registration.email.subject</target>
</trans-unit>
<trans-unit id="hN23SFM" resname="registration.email.message">
<source>registration.email.message</source>
<target>registration.email.message</target>
</trans-unit>
<trans-unit id="hmX3IJA" resname="registration.submit">
<source>registration.submit</source>
<target>registration.submit</target>
</trans-unit>
<trans-unit id="_cY.wHP" resname="resetting.check_email">
<source>resetting.check_email</source>
<target>resetting.check_email</target>
</trans-unit>
<trans-unit id="f5J.GZt" resname="resetting.request.username">
<source>resetting.request.username</source>
<target>resetting.request.username</target>
</trans-unit>
<trans-unit id="55aST1i" resname="resetting.request.submit">
<source>resetting.request.submit</source>
<target>resetting.request.submit</target>
</trans-unit>
<trans-unit id="KsNOzZz" resname="resetting.reset.submit">
<source>resetting.reset.submit</source>
<target>resetting.reset.submit</target>
</trans-unit>
<trans-unit id="Redv4tu" resname="resetting.email.subject">
<source>resetting.email.subject</source>
<target>resetting.email.subject</target>
</trans-unit>
<trans-unit id="Lm8o8Qg" resname="resetting.email.message">
<source>resetting.email.message</source>
<target>resetting.email.message</target>
</trans-unit>
<trans-unit id="agwdlwc" resname="change_password.submit">
<source>change_password.submit</source>
<target>change_password.submit</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="fr" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="BW_lWYD" resname="layout.logged_in_as">
<source>layout.logged_in_as</source>
<target>Se connecter en tant que</target>
</trans-unit>
<trans-unit id="7oF7jXj" resname="layout.logout">
<source>layout.logout</source>
<target>Se déconnecter</target>
</trans-unit>
<trans-unit id="J.8npBV" resname="layout.login">
<source>layout.login</source>
<target>Se connecter</target>
</trans-unit>
<trans-unit id="cMU.0rQ" resname="security.login.username">
<source>security.login.username</source>
<target>Email</target>
</trans-unit>
<trans-unit id="N_kLMwm" resname="security.login.password">
<source>security.login.password</source>
<target>Mot de passe</target>
</trans-unit>
<trans-unit id="8DSptbg" resname="security.login.remember_me">
<source>security.login.remember_me</source>
<target>Se souvenir de moi</target>
</trans-unit>
<trans-unit id="tuAV77Z" resname="security.login.submit">
<source>security.login.submit</source>
<target>Se connecter</target>
</trans-unit>
<trans-unit id="IY9XZs0" resname="form.current_password">
<source>form.current_password</source>
<target>Mot de passe actuel</target>
</trans-unit>
<trans-unit id="JTbuLK0" resname="form.new_password">
<source>form.new_password</source>
<target>Nouveau mot de passe</target>
</trans-unit>
<trans-unit id="hdTL88S" resname="form.new_password_confirmation">
<source>form.new_password_confirmation</source>
<target>Confirmer le mot de passe</target>
</trans-unit>
<trans-unit id="agwdlwc" resname="change_password.submit">
<source>change_password.submit</source>
<target>Confirmer</target>
</trans-unit>
<trans-unit id="TUD.2.O" resname="resetting.flash.success">
<source>resetting.flash.success</source>
<target>resetting.flash.success</target>
</trans-unit>
<trans-unit id=".sIpuLh" resname="Mot de passe oublié ?">
<source>Mot de passe oublié ?</source>
<target>Mot de passe oublié ?</target>
</trans-unit>
<trans-unit id="B.ZozIs" resname="registration.confirmed">
<source>registration.confirmed</source>
<target>registration.confirmed</target>
</trans-unit>
<trans-unit id="_wd.d62" resname="registration.back">
<source>registration.back</source>
<target>registration.back</target>
</trans-unit>
<trans-unit id=".ndupSK" resname="registration.check_email">
<source>registration.check_email</source>
<target>registration.check_email</target>
</trans-unit>
<trans-unit id="N.aTMve" resname="registration.email.subject">
<source>registration.email.subject</source>
<target>registration.email.subject</target>
</trans-unit>
<trans-unit id="hN23SFM" resname="registration.email.message">
<source>registration.email.message</source>
<target>registration.email.message</target>
</trans-unit>
<trans-unit id="hmX3IJA" resname="registration.submit">
<source>registration.submit</source>
<target>registration.submit</target>
</trans-unit>
<trans-unit id="_cY.wHP" resname="resetting.check_email">
<source>resetting.check_email</source>
<target>resetting.check_email</target>
</trans-unit>
<trans-unit id="f5J.GZt" resname="resetting.request.username">
<source>resetting.request.username</source>
<target>resetting.request.username</target>
</trans-unit>
<trans-unit id="55aST1i" resname="resetting.request.submit">
<source>resetting.request.submit</source>
<target>resetting.request.submit</target>
</trans-unit>
<trans-unit id="KsNOzZz" resname="resetting.reset.submit">
<source>resetting.reset.submit</source>
<target>resetting.reset.submit</target>
</trans-unit>
<trans-unit id="Redv4tu" resname="resetting.email.subject">
<source>resetting.email.subject</source>
<target>resetting.email.subject</target>
</trans-unit>
<trans-unit id="Lm8o8Qg" resname="resetting.email.message">
<source>resetting.email.message</source>
<target>resetting.email.message</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="en" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="gSLRsNB" resname="translations.page_title">
<source>translations.page_title</source>
<target>translations.page_title</target>
</trans-unit>
<trans-unit id="KvWRGp0" resname="translations.show_hide_columns">
<source>translations.show_hide_columns</source>
<target>translations.show_hide_columns</target>
</trans-unit>
<trans-unit id="k1dPZAD" resname="translations.toggle_all_columns">
<source>translations.toggle_all_columns</source>
<target>translations.toggle_all_columns</target>
</trans-unit>
<trans-unit id="clO06N9" resname="translations.invalidate_cache">
<source>translations.invalidate_cache</source>
<target>translations.invalidate_cache</target>
</trans-unit>
<trans-unit id="T8n0cEL" resname="translations.all_translations">
<source>translations.all_translations</source>
<target>translations.all_translations</target>
</trans-unit>
<trans-unit id="zhbJ.yx" resname="translations.profiler">
<source>translations.profiler</source>
<target>translations.profiler</target>
</trans-unit>
<trans-unit id="TXybuk5" resname="translations.data_source">
<source>translations.data_source</source>
<target>translations.data_source</target>
</trans-unit>
<trans-unit id="SOXmOCN" resname="translations.latest_profiles">
<source>translations.latest_profiles</source>
<target>translations.latest_profiles</target>
</trans-unit>
<trans-unit id="Bmpkmgf" resname="translations.profile">
<source>translations.profile</source>
<target>translations.profile</target>
</trans-unit>
<trans-unit id="NEo9rdR" resname="translations.save_row">
<source>translations.save_row</source>
<target>translations.save_row</target>
</trans-unit>
<trans-unit id="dbkPRlm" resname="translations.domain">
<source>translations.domain</source>
<target>translations.domain</target>
</trans-unit>
<trans-unit id="PtpHg4W" resname="translations.key">
<source>translations.key</source>
<target>translations.key</target>
</trans-unit>
<trans-unit id="2AgtAoE" resname="translations.save">
<source>translations.save</source>
<target>translations.save</target>
</trans-unit>
<trans-unit id="0VdZg0W" resname="translations.successfully_updated">
<source>translations.successfully_updated</source>
<target>translations.successfully_updated</target>
</trans-unit>
<trans-unit id="8MBELUr" resname="translations.update_failed">
<source>translations.update_failed</source>
<target>translations.update_failed</target>
</trans-unit>
<trans-unit id="b2EAS0A" resname="translations.successfully_deleted">
<source>translations.successfully_deleted</source>
<target>translations.successfully_deleted</target>
</trans-unit>
<trans-unit id="5_vcSWW" resname="translations.delete_failed">
<source>translations.delete_failed</source>
<target>translations.delete_failed</target>
</trans-unit>
<trans-unit id="7EPY53m" resname="translations.no_translations">
<source>translations.no_translations</source>
<target>translations.no_translations</target>
</trans-unit>
<trans-unit id="4HtHKLZ" resname="overview.page_title">
<source>overview.page_title</source>
<target>overview.page_title</target>
</trans-unit>
<trans-unit id="Mqbgm4z" resname="overview.msg_latest_translation">
<source>overview.msg_latest_translation</source>
<target>overview.msg_latest_translation</target>
</trans-unit>
<trans-unit id="zF4DlY1" resname="overview.no_stats">
<source>overview.no_stats</source>
<target>overview.no_stats</target>
</trans-unit>
<trans-unit id=".kg0gMK" resname="overview.domain">
<source>overview.domain</source>
<target>overview.domain</target>
</trans-unit>
<trans-unit id="zxMYKV5" resname="overview.show_grid">
<source>overview.show_grid</source>
<target>overview.show_grid</target>
</trans-unit>
<trans-unit id="TGdHAP8" resname="translations.add_translation">
<source>translations.add_translation</source>
<target>translations.add_translation</target>
</trans-unit>
<trans-unit id="f3boxpe" resname="translations.back_to_list">
<source>translations.back_to_list</source>
<target>translations.back_to_list</target>
</trans-unit>
<trans-unit id="1auRPr7" resname="translations.new_translation">
<source>translations.new_translation</source>
<target>translations.new_translation</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="fr" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="gSLRsNB" resname="translations.page_title">
<source>translations.page_title</source>
<target>translations.page_title</target>
</trans-unit>
<trans-unit id="KvWRGp0" resname="translations.show_hide_columns">
<source>translations.show_hide_columns</source>
<target>translations.show_hide_columns</target>
</trans-unit>
<trans-unit id="k1dPZAD" resname="translations.toggle_all_columns">
<source>translations.toggle_all_columns</source>
<target>translations.toggle_all_columns</target>
</trans-unit>
<trans-unit id="clO06N9" resname="translations.invalidate_cache">
<source>translations.invalidate_cache</source>
<target>translations.invalidate_cache</target>
</trans-unit>
<trans-unit id="T8n0cEL" resname="translations.all_translations">
<source>translations.all_translations</source>
<target>translations.all_translations</target>
</trans-unit>
<trans-unit id="zhbJ.yx" resname="translations.profiler">
<source>translations.profiler</source>
<target>translations.profiler</target>
</trans-unit>
<trans-unit id="TXybuk5" resname="translations.data_source">
<source>translations.data_source</source>
<target>translations.data_source</target>
</trans-unit>
<trans-unit id="SOXmOCN" resname="translations.latest_profiles">
<source>translations.latest_profiles</source>
<target>translations.latest_profiles</target>
</trans-unit>
<trans-unit id="Bmpkmgf" resname="translations.profile">
<source>translations.profile</source>
<target>translations.profile</target>
</trans-unit>
<trans-unit id="NEo9rdR" resname="translations.save_row">
<source>translations.save_row</source>
<target>translations.save_row</target>
</trans-unit>
<trans-unit id="dbkPRlm" resname="translations.domain">
<source>translations.domain</source>
<target>translations.domain</target>
</trans-unit>
<trans-unit id="PtpHg4W" resname="translations.key">
<source>translations.key</source>
<target>translations.key</target>
</trans-unit>
<trans-unit id="2AgtAoE" resname="translations.save">
<source>translations.save</source>
<target>translations.save</target>
</trans-unit>
<trans-unit id="0VdZg0W" resname="translations.successfully_updated">
<source>translations.successfully_updated</source>
<target>translations.successfully_updated</target>
</trans-unit>
<trans-unit id="8MBELUr" resname="translations.update_failed">
<source>translations.update_failed</source>
<target>translations.update_failed</target>
</trans-unit>
<trans-unit id="b2EAS0A" resname="translations.successfully_deleted">
<source>translations.successfully_deleted</source>
<target>translations.successfully_deleted</target>
</trans-unit>
<trans-unit id="5_vcSWW" resname="translations.delete_failed">
<source>translations.delete_failed</source>
<target>translations.delete_failed</target>
</trans-unit>
<trans-unit id="7EPY53m" resname="translations.no_translations">
<source>translations.no_translations</source>
<target>translations.no_translations</target>
</trans-unit>
<trans-unit id="4HtHKLZ" resname="overview.page_title">
<source>overview.page_title</source>
<target>overview.page_title</target>
</trans-unit>
<trans-unit id="Mqbgm4z" resname="overview.msg_latest_translation">
<source>overview.msg_latest_translation</source>
<target>overview.msg_latest_translation</target>
</trans-unit>
<trans-unit id="zF4DlY1" resname="overview.no_stats">
<source>overview.no_stats</source>
<target>overview.no_stats</target>
</trans-unit>
<trans-unit id=".kg0gMK" resname="overview.domain">
<source>overview.domain</source>
<target>overview.domain</target>
</trans-unit>
<trans-unit id="zxMYKV5" resname="overview.show_grid">
<source>overview.show_grid</source>
<target>overview.show_grid</target>
</trans-unit>
<trans-unit id="TGdHAP8" resname="translations.add_translation">
<source>translations.add_translation</source>
<target>translations.add_translation</target>
</trans-unit>
<trans-unit id="f3boxpe" resname="translations.back_to_list">
<source>translations.back_to_list</source>
<target>translations.back_to_list</target>
</trans-unit>
<trans-unit id="1auRPr7" resname="translations.new_translation">
<source>translations.new_translation</source>
<target>translations.new_translation</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="en" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="x0BUsEz" resname="config.label_menu_item">
<source>config.label_menu_item</source>
<target>config.label_menu_item</target>
</trans-unit>
<trans-unit id="L2wJ1uI" resname="config.label_menu">
<source>config.label_menu</source>
<target>config.label_menu</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="fr" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="x0BUsEz" resname="config.label_menu_item">
<source>config.label_menu_item</source>
<target>config.label_menu_item</target>
</trans-unit>
<trans-unit id="L2wJ1uI" resname="config.label_menu">
<source>config.label_menu</source>
<target>config.label_menu</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="en" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="ftQG7bv" resname="confirm_exit">
<source>confirm_exit</source>
<target>confirm_exit</target>
</trans-unit>
<trans-unit id="wcIksDz" resname="Admin">
<source>Admin</source>
<target>Admin</target>
</trans-unit>
<trans-unit id="mR3GCZj" resname="noscript_warning">
<source>noscript_warning</source>
<target>noscript_warning</target>
</trans-unit>
<trans-unit id="WPzArF9" resname="toggle_navigation">
<source>toggle_navigation</source>
<target>toggle_navigation</target>
</trans-unit>
<trans-unit id="y.N3O53" resname="search_placeholder">
<source>search_placeholder</source>
<target>search_placeholder</target>
</trans-unit>
<trans-unit id=".NYuTG5" resname="link_actions">
<source>link_actions</source>
<target>link_actions</target>
</trans-unit>
<trans-unit id="vf3cxXi" resname="label_type_yes">
<source>label_type_yes</source>
<target>label_type_yes</target>
</trans-unit>
<trans-unit id="_KcfkqG" resname="label_type_no">
<source>label_type_no</source>
<target>label_type_no</target>
</trans-unit>
<trans-unit id="uu3dQ3z" resname="action_edit">
<source>action_edit</source>
<target>action_edit</target>
</trans-unit>
<trans-unit id="DTHe6IT" resname="action_delete">
<source>action_delete</source>
<target>action_delete</target>
</trans-unit>
<trans-unit id="W2_Nn4." resname="title_dashboard">
<source>title_dashboard</source>
<target>title_dashboard</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="fr" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="deju2bq" resname="app.admin.group.adherent">
<source>app.admin.group.adherent</source>
<target>Adherent</target>
</trans-unit>
<trans-unit id="q4Tuejc" resname="app.admin.group.prestataire">
<source>app.admin.group.prestataire</source>
<target>Prestataire</target>
</trans-unit>
<trans-unit id="PtZ3au0" resname="app.admin.group.groupe">
<source>app.admin.group.groupe</source>
<target>Groupe</target>
</trans-unit>
<trans-unit id="ftQG7bv" resname="confirm_exit">
<source>confirm_exit</source>
<target>confirm_exit</target>
</trans-unit>
<trans-unit id="wcIksDz" resname="Admin">
<source>Admin</source>
<target>Admin</target>
</trans-unit>
<trans-unit id="mR3GCZj" resname="noscript_warning">
<source>noscript_warning</source>
<target>noscript_warning</target>
</trans-unit>
<trans-unit id="WPzArF9" resname="toggle_navigation">
<source>toggle_navigation</source>
<target>toggle_navigation</target>
</trans-unit>
<trans-unit id="y.N3O53" resname="search_placeholder">
<source>search_placeholder</source>
<target>search_placeholder</target>
</trans-unit>
<trans-unit id=".NYuTG5" resname="link_actions">
<source>link_actions</source>
<target>link_actions</target>
</trans-unit>
<trans-unit id="vf3cxXi" resname="label_type_yes">
<source>label_type_yes</source>
<target>label_type_yes</target>
</trans-unit>
<trans-unit id="_KcfkqG" resname="label_type_no">
<source>label_type_no</source>
<target>label_type_no</target>
</trans-unit>
<trans-unit id="uu3dQ3z" resname="action_edit">
<source>action_edit</source>
<target>action_edit</target>
</trans-unit>
<trans-unit id="DTHe6IT" resname="action_delete">
<source>action_delete</source>
<target>action_delete</target>
</trans-unit>
<trans-unit id="W2_Nn4." resname="title_dashboard">
<source>title_dashboard</source>
<target>title_dashboard</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="en" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="leS2.uC" resname="description.roles_download_strategy">
<source>description.roles_download_strategy</source>
<target>description.roles_download_strategy</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="fr" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="leS2.uC" resname="description.roles_download_strategy">
<source>description.roles_download_strategy</source>
<target>description.roles_download_strategy</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="en" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="bLV0_hC" resname="languages">
<source>languages</source>
<target>languages</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="fr" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="bLV0_hC" resname="languages">
<source>languages</source>
<target>languages</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="en" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="deju2bq" resname="app.admin.group.adherent">
<source>app.admin.group.adherent</source>
<target>Member</target>
</trans-unit>
<trans-unit id="q4Tuejc" resname="app.admin.group.prestataire">
<source>app.admin.group.prestataire</source>
<target>Recipient</target>
</trans-unit>
<trans-unit id="PtZ3au0" resname="app.admin.group.groupe">
<source>app.admin.group.groupe</source>
<target>Group</target>
</trans-unit>
<trans-unit id="NeWyhvb" resname="user_block_logout">
<source>user_block_logout</source>
<target>user_block_logout</target>
</trans-unit>
<trans-unit id="j9_596D" resname="user_block_profile">
<source>user_block_profile</source>
<target>user_block_profile</target>
</trans-unit>
<trans-unit id="AMnqGG7" resname="switch_user_exit">
<source>switch_user_exit</source>
<target>switch_user_exit</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="fr" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="deju2bq" resname="app.admin.group.adherent">
<source>app.admin.group.adherent</source>
<target>Adherent</target>
</trans-unit>
<trans-unit id="q4Tuejc" resname="app.admin.group.prestataire">
<source>app.admin.group.prestataire</source>
<target>Prestataire</target>
</trans-unit>
<trans-unit id="PtZ3au0" resname="app.admin.group.groupe">
<source>app.admin.group.groupe</source>
<target>Groupe</target>
</trans-unit>
<trans-unit id="TtN51Bi" resname="groups">
<source>groups</source>
<target>Roles</target>
</trans-unit>
<trans-unit id="NeWyhvb" resname="user_block_logout">
<source>user_block_logout</source>
<target>user_block_logout</target>
</trans-unit>
<trans-unit id="j9_596D" resname="user_block_profile">
<source>user_block_profile</source>
<target>user_block_profile</target>
</trans-unit>
<trans-unit id="AMnqGG7" resname="switch_user_exit">
<source>switch_user_exit</source>
<target>switch_user_exit</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="en" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="9516ize" resname="Commentaires">
<source>Commentaires</source>
<target>Comments</target>
</trans-unit>
<trans-unit id="deju2bq" resname="app.admin.group.adherent">
<source>app.admin.group.adherent</source>
<target>Member</target>
</trans-unit>
<trans-unit id="q4Tuejc" resname="app.admin.group.prestataire">
<source>app.admin.group.prestataire</source>
<target>Recipient</target>
</trans-unit>
<trans-unit id="PtZ3au0" resname="app.admin.group.groupe">
<source>app.admin.group.groupe</source>
<target>Group</target>
</trans-unit>
<trans-unit id="teH.m2s" resname="CSV invalide">
<source>CSV invalide</source>
<target>CSV invalide</target>
</trans-unit>
<trans-unit id="IrOtQVI" resname="Le nom et le groupe sont obligatoires !">
<source>Le nom et le groupe sont obligatoires !</source>
<target>Le nom et le groupe sont obligatoires !</target>
</trans-unit>
<trans-unit id="5GNPULN" resname="Groupe ajouté : ">
<source>Groupe ajouté : </source>
<target>Groupe ajouté : </target>
</trans-unit>
<trans-unit id="zBiunc0" resname="Comptoir ajouté : ">
<source>Comptoir ajouté : </source>
<target>Comptoir ajouté : </target>
</trans-unit>
<trans-unit id="y6gO29w" resname="Le comptoir avec ce nom '">
<source>Le comptoir avec ce nom '</source>
<target>Le comptoir avec ce nom '</target>
</trans-unit>
<trans-unit id="lhfmrLV" resname="Le groupe avec ce nom '">
<source>Le groupe avec ce nom '</source>
<target>Le groupe avec ce nom '</target>
</trans-unit>
<trans-unit id="N1lzeEz" resname="L'email est déjà utilisé !">
<source>L'email est déjà utilisé !</source>
<target>L'email est déjà utilisé !</target>
</trans-unit>
<trans-unit id="sYcl0_1" resname="Rubrique ajoutée : ">
<source>Rubrique ajoutée : </source>
<target>Rubrique ajoutée : </target>
</trans-unit>
<trans-unit id="qIQWEZf" resname="Prestataire bien ajouté : ">
<source>Prestataire bien ajouté : </source>
<target>Prestataire bien ajouté : </target>
</trans-unit>
<trans-unit id="NVHyDzS" resname="Utilisateur bien ajouté : ">
<source>Utilisateur bien ajouté : </source>
<target>Utilisateur bien ajouté : </target>
</trans-unit>
<trans-unit id="9yi8qjj" resname="La ligne ne contient pas le bon nombre d'éléments requis !">
<source>La ligne ne contient pas le bon nombre d'éléments requis !</source>
<target>La ligne ne contient pas le bon nombre d'éléments requis !</target>
</trans-unit>
<trans-unit id="NM4nBd7" resname="Valeur vide !">
<source>Valeur vide !</source>
<target>Valeur vide !</target>
</trans-unit>
<trans-unit id="k6MbtxY" resname="Valeur invalide !">
<source>Valeur invalide !</source>
<target>Valeur invalide !</target>
</trans-unit>
<trans-unit id="iG12TSC" resname="Infos du prestataire modifiée !">
<source>Infos du prestataire modifiée !</source>
<target>Infos du prestataire modifiée !</target>
</trans-unit>
<trans-unit id="4klf4v_" resname="Transaction à un prestataire bien effectuée !">
<source>Transaction à un prestataire bien effectuée !</source>
<target>Transaction à un prestataire bien effectuée !</target>
</trans-unit>
<trans-unit id="KyicX1t" resname="Transaction à un prestataire">
<source>Transaction à un prestataire</source>
<target>Transaction à un prestataire</target>
</trans-unit>
<trans-unit id="vl.U2p9" resname="Transaction à un adhérent bien effectuée !">
<source>Transaction à un adhérent bien effectuée !</source>
<target>Transaction à un adhérent bien effectuée !</target>
</trans-unit>
<trans-unit id="5cjN38f" resname="Transaction à un adhérent">
<source>Transaction à un adhérent</source>
<target>Transaction à un adhérent</target>
</trans-unit>
<trans-unit id="iEyzR7f" resname="Comptoir bien modifié !">
<source>Comptoir bien modifié !</source>
<target>Comptoir bien modifié !</target>
</trans-unit>
<trans-unit id="dC0LVIh" resname="Vente à un adhérent bien effectuée !">
<source>Vente à un adhérent bien effectuée !</source>
<target>Vente à un adhérent bien effectuée !</target>
</trans-unit>
<trans-unit id=".dP73uY" resname="Vente à un adhérent">
<source>Vente à un adhérent</source>
<target>Vente à un adhérent</target>
</trans-unit>
<trans-unit id="UNDAn04" resname="Vente à un prestataire bien effectuée !">
<source>Vente à un prestataire bien effectuée !</source>
<target>Vente à un prestataire bien effectuée !</target>
</trans-unit>
<trans-unit id="9JyUE64" resname="Vente à un prestataire">
<source>Vente à un prestataire</source>
<target>Vente à un prestataire</target>
</trans-unit>
<trans-unit id="TwL85dc" resname="Retrait d'un adhérent bien effectuée !">
<source>Retrait d'un adhérent bien effectuée !</source>
<target>Retrait d'un adhérent bien effectuée !</target>
</trans-unit>
<trans-unit id="4ET79q4" resname="Retrait d'un adhérent">
<source>Retrait d'un adhérent</source>
<target>Retrait d'un adhérent</target>
</trans-unit>
<trans-unit id="G9X0Tpl" resname="Retrait d'un prestataire bien effectuée !">
<source>Retrait d'un prestataire bien effectuée !</source>
<target>Retrait d'un prestataire bien effectuée !</target>
</trans-unit>
<trans-unit id="1qhoCDA" resname="Retrait d'un prestataire">
<source>Retrait d'un prestataire</source>
<target>Retrait d'un prestataire</target>
</trans-unit>
<trans-unit id="5_Ql1RS" resname="Reconversion bien effectuée !">
<source>Reconversion bien effectuée !</source>
<target>Reconversion bien effectuée !</target>
</trans-unit>
<trans-unit id=".qwp3qj" resname="Reconversion d'un prestataire">
<source>Reconversion d'un prestataire</source>
<target>Reconversion d'un prestataire</target>
</trans-unit>
<trans-unit id="Oov1_fe" resname="Infos de l'utilisateur modifiée !">
<source>Infos de l'utilisateur modifiée !</source>
<target>Infos de l'utilisateur modifiée !</target>
</trans-unit>
<trans-unit id="JW0wAvd" resname="Groupe local bien modifié !">
<source>Groupe local bien modifié !</source>
<target>Groupe local bien modifié !</target>
</trans-unit>
<trans-unit id="HnpAbC0" resname="Transfert bien effectué !">
<source>Transfert bien effectué !</source>
<target>Transfert bien effectué !</target>
</trans-unit>
<trans-unit id="CtguI1j" resname="Transfert à un comptoir">
<source>Transfert à un comptoir</source>
<target>Transfert à un comptoir</target>
</trans-unit>
<trans-unit id="0gWDStX" resname="Retour bien effectuée !">
<source>Retour bien effectuée !</source>
<target>Retour bien effectuée !</target>
</trans-unit>
<trans-unit id="EViXOLC" resname="Retour au groupe">
<source>Retour au groupe</source>
<target>Retour au groupe</target>
</trans-unit>
<trans-unit id="hMIurSL" resname="Information bien prise en compte !">
<source>Information bien prise en compte !</source>
<target>Information bien prise en compte !</target>
</trans-unit>
<trans-unit id=".GIsU_P" resname="Transaction bien effectuée !">
<source>Transaction bien effectuée !</source>
<target>Transaction bien effectuée !</target>
</trans-unit>
<trans-unit id="md2GWyJ" resname="Transaction à un ">
<source>Transaction à un </source>
<target>Transaction à un </target>
</trans-unit>
<trans-unit id="4UQV8fg" resname="Reconversion envoyée, elle sera validée lorsque le virement sera effectué !">
<source>Reconversion envoyée, elle sera validée lorsque le virement sera effectué !</source>
<target>Reconversion envoyée, elle sera validée lorsque le virement sera effectué !</target>
</trans-unit>
<trans-unit id="aNJ6B39" resname="Reconversion de monnaie au siège">
<source>Reconversion de monnaie au siège</source>
<target>Reconversion de monnaie au siège</target>
</trans-unit>
<trans-unit id="YRTonmx" resname="Transaction à un groupe">
<source>Transaction à un groupe</source>
<target>Transaction à un groupe</target>
</trans-unit>
<trans-unit id="RONBemk" resname="Transaction du groupe au siège">
<source>Transaction du groupe au siège</source>
<target>Transaction du groupe au siège</target>
</trans-unit>
<trans-unit id="z4tepm9" resname="Après avoir créer le groupe %name%, il est conseiller d'ajouter un gestionnaire de groupe">
<source>Après avoir créer le groupe %name%, il est conseiller d'ajouter un gestionnaire de groupe</source>
<target>Après avoir créer le groupe %name%, il est conseiller d'ajouter un gestionnaire de groupe</target>
</trans-unit>
<trans-unit id="6AUsrkK" resname="Total des flux :">
<source>Total des flux :</source>
<target>Total des flux :</target>
</trans-unit>
<trans-unit id="OQbMdVE" resname="Total des transferts :">
<source>Total des transferts :</source>
<target>Total des transferts :</target>
</trans-unit>
<trans-unit id="ARjligd" resname="Total des transactions :">
<source>Total des transactions :</source>
<target>Total des transactions :</target>
</trans-unit>
<trans-unit id="UJ.xi3j" resname="PREMIERE INSTALLATION">
<source>PREMIERE INSTALLATION</source>
<target>PREMIERE INSTALLATION</target>
</trans-unit>
<trans-unit id="5.NJRGv" resname="A la suite de l'installation du système, un prestataire est crée (Monnaie locale) permettant de recevoir les adhésions.">
<source>A la suite de l'installation du système, un prestataire est crée (Monnaie locale) permettant de recevoir les adhésions.</source>
<target>A la suite de l'installation du système, un prestataire est crée (Monnaie locale) permettant de recevoir les adhésions.</target>
</trans-unit>
<trans-unit id="StAujnh" resname="Carte des comptoirs :">
<source>Carte des comptoirs :</source>
<target>Carte des comptoirs :</target>
</trans-unit>
<trans-unit id="wfL6_S_" resname="Situer les comptoirs">
<source>Situer les comptoirs</source>
<target>Situer les comptoirs</target>
</trans-unit>
<trans-unit id="PD3uNu." resname="Liste des comptoirs">
<source>Liste des comptoirs</source>
<target>Liste des comptoirs</target>
</trans-unit>
<trans-unit id="YjthfGH" resname="Groupe local">
<source>Groupe local</source>
<target>Groupe local</target>
</trans-unit>
<trans-unit id="zExCS1c" resname="Téléphone">
<source>Téléphone</source>
<target>Téléphone</target>
</trans-unit>
<trans-unit id="lpzL089" resname="Email">
<source>Email</source>
<target>Email</target>
</trans-unit>
<trans-unit id="mQHDebg" resname="prestataires">
<source>prestataires</source>
<target>prestataires</target>
</trans-unit>
<trans-unit id="XMFfDUL" resname="Décharger prestataire">
<source>Décharger prestataire</source>
<target>Décharger prestataire</target>
</trans-unit>
<trans-unit id="fKibr8E" resname="Configuration du Comptoir">
<source>Configuration du Comptoir</source>
<target>Configuration du Comptoir</target>
</trans-unit>
<trans-unit id="rkW.AT1" resname="Rubriques">
<source>Rubriques</source>
<target>Rubriques</target>
</trans-unit>
<trans-unit id="7N8eItg" resname="Carte des prestataires :">
<source>Carte des prestataires :</source>
<target>Carte des prestataires :</target>
</trans-unit>
<trans-unit id="qRtfHNl" resname="SIRET">
<source>SIRET</source>
<target>SIRET</target>
</trans-unit>
<trans-unit id="1M7dgUA" resname="Horaires">
<source>Horaires</source>
<target>Horaires</target>
</trans-unit>
<trans-unit id="7KhYJ6j" resname="Site web">
<source>Site web</source>
<target>Site web</target>
</trans-unit>
<trans-unit id="YsGuxP." resname="Responsable">
<source>Responsable</source>
<target>Responsable</target>
</trans-unit>
<trans-unit id="zaqrRC0" resname="Télécharger">
<source>Télécharger</source>
<target>Télécharger</target>
</trans-unit>
<trans-unit id="XrgCevJ" resname="Prestataires">
<source>Prestataires</source>
<target>Prestataires</target>
</trans-unit>
<trans-unit id="4ArByfp" resname="Reconversion">
<source>Reconversion</source>
<target>Reconversion</target>
</trans-unit>
<trans-unit id="G7k0ZFu" resname="Professionnel">
<source>Professionnel</source>
<target>Professionnel</target>
</trans-unit>
<trans-unit id="J9EkMuf" resname="Foire Aux Questions">
<source>Foire Aux Questions</source>
<target>Foire Aux Questions</target>
</trans-unit>
<trans-unit id="KRs2RXo" resname="Voir le fichier">
<source>Voir le fichier</source>
<target>Voir le fichier</target>
</trans-unit>
<trans-unit id="UpCRQob" resname="Carte des">
<source>Carte des</source>
<target>Carte des</target>
</trans-unit>
<trans-unit id="qz_2RzT" resname="Inscription AMAP/Marchés">
<source>Inscription AMAP/Marchés</source>
<target>Inscription AMAP/Marchés</target>
</trans-unit>
<trans-unit id="B1qSv8A" resname="Import de données">
<source>Import de données</source>
<target>Import de données</target>
</trans-unit>
<trans-unit id="7sDdaxx" resname="Exemples d'importations possible (Fichiers .csv uniquement):">
<source>Exemples d'importations possible (Fichiers .csv uniquement):</source>
<target>Exemples d'importations possible (Fichiers .csv uniquement):</target>
</trans-unit>
<trans-unit id="cygx3ud" resname="Exemple">
<source>Exemple</source>
<target>Exemple</target>
</trans-unit>
<trans-unit id="faACm59" resname="Télécharger CSV avec lignes en erreurs">
<source>Télécharger CSV avec lignes en erreurs</source>
<target>Télécharger CSV avec lignes en erreurs</target>
</trans-unit>
<trans-unit id="CsPSyzA" resname="Se connecter">
<source>Se connecter</source>
<target>Se connecter</target>
</trans-unit>
<trans-unit id="7lM3Hu7" resname="Transfert du groupe au siège">
<source>Transfert du groupe au siège</source>
<target>Transfert du groupe au siège</target>
</trans-unit>
<trans-unit id="6JfP4Zx" resname="Transfert à un groupe">
<source>Transfert à un groupe</source>
<target>Transfert à un groupe</target>
</trans-unit>
<trans-unit id="VdLA1tD" resname="Adhérer">
<source>Adhérer</source>
<target>Adhérer</target>
</trans-unit>
<trans-unit id="S.MOphn" resname="Adhérer à la MLC">
<source>Adhérer à la MLC</source>
<target>Adhérer à la MLC</target>
</trans-unit>
<trans-unit id="S0LGaQ6" resname="Administration">
<source>Administration</source>
<target>Administration</target>
</trans-unit>
<trans-unit id="ljyHRsQ" resname="Choix du rôle">
<source>Choix du rôle</source>
<target>Choix du rôle</target>
</trans-unit>
<trans-unit id="VIJUpYG" resname="Retour SUPER ADMIN">
<source>Retour SUPER ADMIN</source>
<target>Retour SUPER ADMIN</target>
</trans-unit>
<trans-unit id="_1_eksG" resname="Déconnexion">
<source>Déconnexion</source>
<target>Déconnexion</target>
</trans-unit>
<trans-unit id="ucJTm1n" resname="À ce jour">
<source>À ce jour</source>
<target>À ce jour</target>
</trans-unit>
<trans-unit id="bZ1SUuG" resname="utilisateurs">
<source>utilisateurs</source>
<target>utilisateurs</target>
</trans-unit>
<trans-unit id="iA2V5p." resname="Les prestataires de la doume">
<source>Les prestataires de la doume</source>
<target>Les prestataires de la doume</target>
</trans-unit>
<trans-unit id="8Fa4yuN" resname="et">
<source>et</source>
<target>et</target>
</trans-unit>
<trans-unit id="9F97Xym" resname="Les partenaires de la doume">
<source>Les partenaires de la doume</source>
<target>Les partenaires de la doume</target>
</trans-unit>
<trans-unit id="3IMiZVc" resname="partenaires">
<source>partenaires</source>
<target>partenaires</target>
</trans-unit>
<trans-unit id="TMRM85Y" resname="Les groupes locaux de la doume">
<source>Les groupes locaux de la doume</source>
<target>Les groupes locaux de la doume</target>
</trans-unit>
<trans-unit id="1U3egkM" resname="groupes locaux">
<source>groupes locaux</source>
<target>groupes locaux</target>
</trans-unit>
<trans-unit id="6DifF5P" resname="Les comptoirs de la doume">
<source>Les comptoirs de la doume</source>
<target>Les comptoirs de la doume</target>
</trans-unit>
<trans-unit id="dlG4uaP" resname="comptoirs">
<source>comptoirs</source>
<target>comptoirs</target>
</trans-unit>
<trans-unit id="pCEqqhf" resname="Groupes Locaux">
<source>Groupes Locaux</source>
<target>Groupes Locaux</target>
</trans-unit>
<trans-unit id="hEPgS3O" resname="Mes transactions :">
<source>Mes transactions :</source>
<target>Mes transactions :</target>
</trans-unit>
<trans-unit id="a3kb2rR" resname="payée le">
<source>payée le</source>
<target>payée le</target>
</trans-unit>
<trans-unit id="2iiN0qP" resname="Actualités">
<source>Actualités</source>
<target>Actualités</target>
</trans-unit>
<trans-unit id="VDBT9l_" resname="Crée le">
<source>Crée le</source>
<target>Crée le</target>
</trans-unit>
<trans-unit id="nziugJj" resname="Nous contacter">
<source>Nous contacter</source>
<target>Nous contacter</target>
</trans-unit>
<trans-unit id="cpCzYDb" resname="Virement vers un prestataire">
<source>Virement vers un prestataire</source>
<target>Virement vers un prestataire</target>
</trans-unit>
<trans-unit id="6Mfnzji" resname="Virement vers un adhérent">
<source>Virement vers un adhérent</source>
<target>Virement vers un adhérent</target>
</trans-unit>
<trans-unit id="8e9fjVV" resname="Modifier vos informations">
<source>Modifier vos informations</source>
<target>Modifier vos informations</target>
</trans-unit>
<trans-unit id="lSg0K24" resname="Modifier mes informations">
<source>Modifier mes informations</source>
<target>Modifier mes informations</target>
</trans-unit>
<trans-unit id="HM16Oyf" resname="Mon ecompte">
<source>Mon ecompte</source>
<target>Mon ecompte</target>
</trans-unit>
<trans-unit id="Uh8jZlt" resname="Mes cotisations">
<source>Mes cotisations</source>
<target>Mes cotisations</target>
</trans-unit>
<trans-unit id="rc2XEYT" resname="Mes transactions">
<source>Mes transactions</source>
<target>Mes transactions</target>
</trans-unit>
<trans-unit id="veR6.U9" resname="Groupes locaux">
<source>Groupes locaux</source>
<target>Groupes locaux</target>
</trans-unit>
<trans-unit id="fIUCvoG" resname="Transfert au comptoir">
<source>Transfert au comptoir</source>
<target>Transfert au comptoir</target>
</trans-unit>
<trans-unit id="Et03WFB" resname="Configuration du Groupe local">
<source>Configuration du Groupe local</source>
<target>Configuration du Groupe local</target>
</trans-unit>
<trans-unit id="RN.r_5M" resname="Page d'accueil">
<source>Page d'accueil</source>
<target>Page d'accueil</target>
</trans-unit>
<trans-unit id="u9vL9zR" resname="ADMINISTRATION">
<source>ADMINISTRATION</source>
<target>ADMINISTRATION</target>
</trans-unit>
<trans-unit id="KrGI8dm" resname="Inscriptioj confirmée !">
<source>Inscriptioj confirmée !</source>
<target>Inscriptioj confirmée !</target>
</trans-unit>
<trans-unit id="i0lTg3x" resname="INSCRIPTION">
<source>INSCRIPTION</source>
<target>INSCRIPTION</target>
</trans-unit>
<trans-unit id="LkqbmJC" resname="Vérifiez vos courriels !">
<source>Vérifiez vos courriels !</source>
<target>Vérifiez vos courriels !</target>
</trans-unit>
<trans-unit id="LpkJGx4" resname="Réinitialiser le mot de passe">
<source>Réinitialiser le mot de passe</source>
<target>Réinitialiser le mot de passe</target>
</trans-unit>
<trans-unit id="bKWrdHk" resname="Mot de passe réinitialisé !">
<source>Mot de passe réinitialisé !</source>
<target>Mot de passe réinitialisé !</target>
</trans-unit>
<trans-unit id="U22DLw8" resname="CONNEXION">
<source>CONNEXION</source>
<target>CONNEXION</target>
</trans-unit>
<trans-unit id="2E8oBeP" resname="Modifier votre mot de passe !">
<source>Modifier votre mot de passe !</source>
<target>Modifier votre mot de passe !</target>
</trans-unit>
<trans-unit id="yqNZZCS" resname="Solde">
<source>Solde</source>
<target>Solde</target>
</trans-unit>
<trans-unit id="48q18GU" resname="fa-coins">
<source>fa-coins</source>
<target>fa-coins</target>
</trans-unit>
<trans-unit id="_k8.Udi" resname="Opérations">
<source>Opérations</source>
<target>Opérations</target>
</trans-unit>
<trans-unit id="NdCgDbP" resname="Changer votre mot de passe">
<source>Changer votre mot de passe</source>
<target>Changer votre mot de passe</target>
</trans-unit>
<trans-unit id="YmunqJ." resname="Valider">
<source>Valider</source>
<target>Valider</target>
</trans-unit>
<trans-unit id="zJA_ya9" resname="Compte utilisateur">
<source>Compte utilisateur</source>
<target>Compte utilisateur</target>
</trans-unit>
<trans-unit id="3kzerPc" resname="RETOUR SUPER ADMIN">
<source>RETOUR SUPER ADMIN</source>
<target>RETOUR SUPER ADMIN</target>
</trans-unit>
<trans-unit id="mzQJREu" resname="PRESTATAIRE">
<source>PRESTATAIRE</source>
<target>PRESTATAIRE</target>
</trans-unit>
<trans-unit id="37vPUE1" resname="ADHERENT">
<source>ADHERENT</source>
<target>ADHERENT</target>
</trans-unit>
<trans-unit id="s66JKM." resname="ADMIN SIEGE">
<source>ADMIN SIEGE</source>
<target>ADMIN SIEGE</target>
</trans-unit>
<trans-unit id="ONtEZ6T" resname="COMPTOIR">
<source>COMPTOIR</source>
<target>COMPTOIR</target>
</trans-unit>
<trans-unit id="7F.o2_2" resname="GESTION GROUPE">
<source>GESTION GROUPE</source>
<target>GESTION GROUPE</target>
</trans-unit>
<trans-unit id="_C7LteU" resname="CONTACT">
<source>CONTACT</source>
<target>CONTACT</target>
</trans-unit>
<trans-unit id="kpAYr6z" resname="TRESORIER">
<source>TRESORIER</source>
<target>TRESORIER</target>
</trans-unit>
<trans-unit id="WSi_r9i" resname="CONTROLEUR">
<source>CONTROLEUR</source>
<target>CONTROLEUR</target>
</trans-unit>
<trans-unit id="EINTPyl" resname="REDACTEUR">
<source>REDACTEUR</source>
<target>REDACTEUR</target>
</trans-unit>
<trans-unit id="C4VrlWw" resname="Solde du siège">
<source>Solde du siège</source>
<target>Solde du siège</target>
</trans-unit>
<trans-unit id="qU1CjkW" resname="Solde du groupe">
<source>Solde du groupe</source>
<target>Solde du groupe</target>
</trans-unit>
<trans-unit id="9DxJIlT" resname="Solde du comptoir &quot;">
<source>Solde du comptoir "</source>
<target>Solde du comptoir "</target>
</trans-unit>
<trans-unit id="gQXH2c9" resname="Solde e-mlc">
<source>Solde e-mlc</source>
<target>Solde e-mlc</target>
</trans-unit>
<trans-unit id="vVSVybP" resname="Situer les Prestataires">
<source>Situer les Prestataires</source>
<target>Situer les Prestataires</target>
</trans-unit>
<trans-unit id="ybPDgkf" resname="Total">
<source>Total</source>
<target>Total</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="fr" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="mfRtPwQ" resname="move_to_bottom">
<source>move_to_bottom</source>
<target>Tout en bas</target>
</trans-unit>
<trans-unit id="XC3qQR6" resname="move_down">
<source>move_down</source>
<target>+ bas</target>
</trans-unit>
<trans-unit id="UmbQLGe" resname="move_up">
<source>move_up</source>
<target>+ haut</target>
</trans-unit>
<trans-unit id="pg2OUzb" resname="move_to_top">
<source>move_to_top</source>
<target>Tout en haut</target>
</trans-unit>
<trans-unit id="9516ize" resname="Commentaires">
<source>Commentaires</source>
<target>Commentaires</target>
</trans-unit>
<trans-unit id="deju2bq" resname="app.admin.group.adherent">
<source>app.admin.group.adherent</source>
<target>Adherent</target>
</trans-unit>
<trans-unit id="q4Tuejc" resname="app.admin.group.prestataire">
<source>app.admin.group.prestataire</source>
<target>Prestataire</target>
</trans-unit>
<trans-unit id="PtZ3au0" resname="app.admin.group.groupe">
<source>app.admin.group.groupe</source>
<target>Groupe</target>
</trans-unit>
<trans-unit id="teH.m2s" resname="CSV invalide">
<source>CSV invalide</source>
<target>CSV invalide</target>
</trans-unit>
<trans-unit id="IrOtQVI" resname="Le nom et le groupe sont obligatoires !">
<source>Le nom et le groupe sont obligatoires !</source>
<target>Le nom et le groupe sont obligatoires !</target>
</trans-unit>
<trans-unit id="5GNPULN" resname="Groupe ajouté : ">
<source>Groupe ajouté : </source>
<target>Groupe ajouté : </target>
</trans-unit>
<trans-unit id="zBiunc0" resname="Comptoir ajouté : ">
<source>Comptoir ajouté : </source>
<target>Comptoir ajouté : </target>
</trans-unit>
<trans-unit id="y6gO29w" resname="Le comptoir avec ce nom '">
<source>Le comptoir avec ce nom '</source>
<target>Le comptoir avec ce nom '</target>
</trans-unit>
<trans-unit id="lhfmrLV" resname="Le groupe avec ce nom '">
<source>Le groupe avec ce nom '</source>
<target>Le groupe avec ce nom '</target>
</trans-unit>
<trans-unit id="N1lzeEz" resname="L'email est déjà utilisé !">
<source>L'email est déjà utilisé !</source>
<target>L'email est déjà utilisé !</target>
</trans-unit>
<trans-unit id="sYcl0_1" resname="Rubrique ajoutée : ">
<source>Rubrique ajoutée : </source>
<target>Rubrique ajoutée : </target>
</trans-unit>
<trans-unit id="qIQWEZf" resname="Prestataire bien ajouté : ">
<source>Prestataire bien ajouté : </source>
<target>Prestataire bien ajouté : </target>
</trans-unit>
<trans-unit id="NVHyDzS" resname="Utilisateur bien ajouté : ">
<source>Utilisateur bien ajouté : </source>
<target>Utilisateur bien ajouté : </target>
</trans-unit>
<trans-unit id="9yi8qjj" resname="La ligne ne contient pas le bon nombre d'éléments requis !">
<source>La ligne ne contient pas le bon nombre d'éléments requis !</source>
<target>La ligne ne contient pas le bon nombre d'éléments requis !</target>
</trans-unit>
<trans-unit id="NM4nBd7" resname="Valeur vide !">
<source>Valeur vide !</source>
<target>Valeur vide !</target>
</trans-unit>
<trans-unit id="k6MbtxY" resname="Valeur invalide !">
<source>Valeur invalide !</source>
<target>Valeur invalide !</target>
</trans-unit>
<trans-unit id="iG12TSC" resname="Infos du prestataire modifiée !">
<source>Infos du prestataire modifiée !</source>
<target>Infos du prestataire modifiée !</target>
</trans-unit>
<trans-unit id="4klf4v_" resname="Transaction à un prestataire bien effectuée !">
<source>Transaction à un prestataire bien effectuée !</source>
<target>Transaction à un prestataire bien effectuée !</target>
</trans-unit>
<trans-unit id="KyicX1t" resname="Transaction à un prestataire">
<source>Transaction à un prestataire</source>
<target>Transaction à un prestataire</target>
</trans-unit>
<trans-unit id="vl.U2p9" resname="Transaction à un adhérent bien effectuée !">
<source>Transaction à un adhérent bien effectuée !</source>
<target>Transaction à un adhérent bien effectuée !</target>
</trans-unit>
<trans-unit id="5cjN38f" resname="Transaction à un adhérent">
<source>Transaction à un adhérent</source>
<target>Transaction à un adhérent</target>
</trans-unit>
<trans-unit id="iEyzR7f" resname="Comptoir bien modifié !">
<source>Comptoir bien modifié !</source>
<target>Comptoir bien modifié !</target>
</trans-unit>
<trans-unit id="dC0LVIh" resname="Vente à un adhérent bien effectuée !">
<source>Vente à un adhérent bien effectuée !</source>
<target>Vente à un adhérent bien effectuée !</target>
</trans-unit>
<trans-unit id=".dP73uY" resname="Vente à un adhérent">
<source>Vente à un adhérent</source>
<target>Vente à un adhérent</target>
</trans-unit>
<trans-unit id="UNDAn04" resname="Vente à un prestataire bien effectuée !">
<source>Vente à un prestataire bien effectuée !</source>
<target>Vente à un prestataire bien effectuée !</target>
</trans-unit>
<trans-unit id="9JyUE64" resname="Vente à un prestataire">
<source>Vente à un prestataire</source>
<target>Vente à un prestataire</target>
</trans-unit>
<trans-unit id="TwL85dc" resname="Retrait d'un adhérent bien effectuée !">
<source>Retrait d'un adhérent bien effectuée !</source>
<target>Retrait d'un adhérent bien effectuée !</target>
</trans-unit>
<trans-unit id="4ET79q4" resname="Retrait d'un adhérent">
<source>Retrait d'un adhérent</source>
<target>Retrait d'un adhérent</target>
</trans-unit>
<trans-unit id="G9X0Tpl" resname="Retrait d'un prestataire bien effectuée !">
<source>Retrait d'un prestataire bien effectuée !</source>
<target>Retrait d'un prestataire bien effectuée !</target>
</trans-unit>
<trans-unit id="1qhoCDA" resname="Retrait d'un prestataire">
<source>Retrait d'un prestataire</source>
<target>Retrait d'un prestataire</target>
</trans-unit>
<trans-unit id="5_Ql1RS" resname="Reconversion bien effectuée !">
<source>Reconversion bien effectuée !</source>
<target>Reconversion bien effectuée !</target>
</trans-unit>
<trans-unit id=".qwp3qj" resname="Reconversion d'un prestataire">
<source>Reconversion d'un prestataire</source>
<target>Reconversion d'un prestataire</target>
</trans-unit>
<trans-unit id="Oov1_fe" resname="Infos de l'utilisateur modifiée !">
<source>Infos de l'utilisateur modifiée !</source>
<target>Infos de l'utilisateur modifiée !</target>
</trans-unit>
<trans-unit id="JW0wAvd" resname="Groupe local bien modifié !">
<source>Groupe local bien modifié !</source>
<target>Groupe local bien modifié !</target>
</trans-unit>
<trans-unit id="HnpAbC0" resname="Transfert bien effectué !">
<source>Transfert bien effectué !</source>
<target>Transfert bien effectué !</target>
</trans-unit>
<trans-unit id="CtguI1j" resname="Transfert à un comptoir">
<source>Transfert à un comptoir</source>
<target>Transfert à un comptoir</target>
</trans-unit>
<trans-unit id="0gWDStX" resname="Retour bien effectuée !">
<source>Retour bien effectuée !</source>
<target>Retour bien effectuée !</target>
</trans-unit>
<trans-unit id="EViXOLC" resname="Retour au groupe">
<source>Retour au groupe</source>
<target>Retour au groupe</target>
</trans-unit>
<trans-unit id="hMIurSL" resname="Information bien prise en compte !">
<source>Information bien prise en compte !</source>
<target>Information bien prise en compte !</target>
</trans-unit>
<trans-unit id=".GIsU_P" resname="Transaction bien effectuée !">
<source>Transaction bien effectuée !</source>
<target>Transaction bien effectuée !</target>
</trans-unit>
<trans-unit id="md2GWyJ" resname="Transaction à un ">
<source>Transaction à un </source>
<target>Transaction à un </target>
</trans-unit>
<trans-unit id="4UQV8fg" resname="Reconversion envoyée, elle sera validée lorsque le virement sera effectué !">
<source>Reconversion envoyée, elle sera validée lorsque le virement sera effectué !</source>
<target>Reconversion envoyée, elle sera validée lorsque le virement sera effectué !</target>
</trans-unit>
<trans-unit id="aNJ6B39" resname="Reconversion de monnaie au siège">
<source>Reconversion de monnaie au siège</source>
<target>Reconversion de monnaie au siège</target>
</trans-unit>
<trans-unit id="YRTonmx" resname="Transaction à un groupe">
<source>Transaction à un groupe</source>
<target>Transaction à un groupe</target>
</trans-unit>
<trans-unit id="RONBemk" resname="Transaction du groupe au siège">
<source>Transaction du groupe au siège</source>
<target>Transaction du groupe au siège</target>
</trans-unit>
<trans-unit id="z4tepm9" resname="Après avoir créer le groupe %name%, il est conseiller d'ajouter un gestionnaire de groupe">
<source>Après avoir créer le groupe %name%, il est conseiller d'ajouter un gestionnaire de groupe</source>
<target>Après avoir créer le groupe %name%, il est conseiller d'ajouter un gestionnaire de groupe</target>
</trans-unit>
<trans-unit id="6AUsrkK" resname="Total des flux :">
<source>Total des flux :</source>
<target>Total des flux :</target>
</trans-unit>
<trans-unit id="OQbMdVE" resname="Total des transferts :">
<source>Total des transferts :</source>
<target>Total des transferts :</target>
</trans-unit>
<trans-unit id="ARjligd" resname="Total des transactions :">
<source>Total des transactions :</source>
<target>Total des transactions :</target>
</trans-unit>
<trans-unit id="UJ.xi3j" resname="PREMIERE INSTALLATION">
<source>PREMIERE INSTALLATION</source>
<target>PREMIERE INSTALLATION</target>
</trans-unit>
<trans-unit id="5.NJRGv" resname="A la suite de l'installation du système, un prestataire est crée (Monnaie locale) permettant de recevoir les adhésions.">
<source>A la suite de l'installation du système, un prestataire est crée (Monnaie locale) permettant de recevoir les adhésions.</source>
<target>A la suite de l'installation du système, un prestataire est crée (Monnaie locale) permettant de recevoir les adhésions.</target>
</trans-unit>
<trans-unit id="StAujnh" resname="Carte des comptoirs :">
<source>Carte des comptoirs :</source>
<target>Carte des comptoirs :</target>
</trans-unit>
<trans-unit id="wfL6_S_" resname="Situer les comptoirs">
<source>Situer les comptoirs</source>
<target>Situer les comptoirs</target>
</trans-unit>
<trans-unit id="PD3uNu." resname="Liste des comptoirs">
<source>Liste des comptoirs</source>
<target>Liste des comptoirs</target>
</trans-unit>
<trans-unit id="YjthfGH" resname="Groupe local">
<source>Groupe local</source>
<target>Groupe local</target>
</trans-unit>
<trans-unit id="zExCS1c" resname="Téléphone">
<source>Téléphone</source>
<target>Téléphone</target>
</trans-unit>
<trans-unit id="lpzL089" resname="Email">
<source>Email</source>
<target>Email</target>
</trans-unit>
<trans-unit id="mQHDebg" resname="prestataires">
<source>prestataires</source>
<target>prestataires</target>
</trans-unit>
<trans-unit id="XMFfDUL" resname="Décharger prestataire">
<source>Décharger prestataire</source>
<target>Décharger prestataire</target>
</trans-unit>
<trans-unit id="fKibr8E" resname="Configuration du Comptoir">
<source>Configuration du Comptoir</source>
<target>Configuration du Comptoir</target>
</trans-unit>
<trans-unit id="rkW.AT1" resname="Rubriques">
<source>Rubriques</source>
<target>Rubriques</target>
</trans-unit>
<trans-unit id="7N8eItg" resname="Carte des prestataires :">
<source>Carte des prestataires :</source>
<target>Carte des prestataires :</target>
</trans-unit>
<trans-unit id="qRtfHNl" resname="SIRET">
<source>SIRET</source>
<target>SIRET</target>
</trans-unit>
<trans-unit id="1M7dgUA" resname="Horaires">
<source>Horaires</source>
<target>Horaires</target>
</trans-unit>
<trans-unit id="7KhYJ6j" resname="Site web">
<source>Site web</source>
<target>Site web</target>
</trans-unit>
<trans-unit id="YsGuxP." resname="Responsable">
<source>Responsable</source>
<target>Responsable</target>
</trans-unit>
<trans-unit id="zaqrRC0" resname="Télécharger">
<source>Télécharger</source>
<target>Télécharger</target>
</trans-unit>
<trans-unit id="XrgCevJ" resname="Prestataires">
<source>Prestataires</source>
<target>Prestataires</target>
</trans-unit>
<trans-unit id="4ArByfp" resname="Reconversion">
<source>Reconversion</source>
<target>Reconversion</target>
</trans-unit>
<trans-unit id="G7k0ZFu" resname="Professionnel">
<source>Professionnel</source>
<target>Professionnel</target>
</trans-unit>
<trans-unit id="J9EkMuf" resname="Foire Aux Questions">
<source>Foire Aux Questions</source>
<target>Foire Aux Questions</target>
</trans-unit>
<trans-unit id="KRs2RXo" resname="Voir le fichier">
<source>Voir le fichier</source>
<target>Voir le fichier</target>
</trans-unit>
<trans-unit id="UpCRQob" resname="Carte des">
<source>Carte des</source>
<target>Carte des</target>
</trans-unit>
<trans-unit id="qz_2RzT" resname="Inscription AMAP/Marchés">
<source>Inscription AMAP/Marchés</source>
<target>Inscription AMAP/Marchés</target>
</trans-unit>
<trans-unit id="B1qSv8A" resname="Import de données">
<source>Import de données</source>
<target>Import de données</target>
</trans-unit>
<trans-unit id="7sDdaxx" resname="Exemples d'importations possible (Fichiers .csv uniquement):">
<source>Exemples d'importations possible (Fichiers .csv uniquement):</source>
<target>Exemples d'importations possible (Fichiers .csv uniquement):</target>
</trans-unit>
<trans-unit id="cygx3ud" resname="Exemple">
<source>Exemple</source>
<target>Exemple</target>
</trans-unit>
<trans-unit id="faACm59" resname="Télécharger CSV avec lignes en erreurs">
<source>Télécharger CSV avec lignes en erreurs</source>
<target>Télécharger CSV avec lignes en erreurs</target>
</trans-unit>
<trans-unit id="CsPSyzA" resname="Se connecter">
<source>Se connecter</source>
<target>Se connecter</target>
</trans-unit>
<trans-unit id="7lM3Hu7" resname="Transfert du groupe au siège">
<source>Transfert du groupe au siège</source>
<target>Transfert du groupe au siège</target>
</trans-unit>
<trans-unit id="6JfP4Zx" resname="Transfert à un groupe">
<source>Transfert à un groupe</source>
<target>Transfert à un groupe</target>
</trans-unit>
<trans-unit id="VdLA1tD" resname="Adhérer">
<source>Adhérer</source>
<target>Adhérer</target>
</trans-unit>
<trans-unit id="S.MOphn" resname="Adhérer à la MLC">
<source>Adhérer à la MLC</source>
<target>Adhérer à la MLC</target>
</trans-unit>
<trans-unit id="S0LGaQ6" resname="Administration">
<source>Administration</source>
<target>Administration</target>
</trans-unit>
<trans-unit id="ljyHRsQ" resname="Choix du rôle">
<source>Choix du rôle</source>
<target>Choix du rôle</target>
</trans-unit>
<trans-unit id="VIJUpYG" resname="Retour SUPER ADMIN">
<source>Retour SUPER ADMIN</source>
<target>Retour SUPER ADMIN</target>
</trans-unit>
<trans-unit id="_1_eksG" resname="Déconnexion">
<source>Déconnexion</source>
<target>Déconnexion</target>
</trans-unit>
<trans-unit id="ucJTm1n" resname="À ce jour">
<source>À ce jour</source>
<target>À ce jour</target>
</trans-unit>
<trans-unit id="bZ1SUuG" resname="utilisateurs">
<source>utilisateurs</source>
<target>utilisateurs</target>
</trans-unit>
<trans-unit id="iA2V5p." resname="Les prestataires de la doume">
<source>Les prestataires de la doume</source>
<target>Les prestataires de la doume</target>
</trans-unit>
<trans-unit id="8Fa4yuN" resname="et">
<source>et</source>
<target>et</target>
</trans-unit>
<trans-unit id="9F97Xym" resname="Les partenaires de la doume">
<source>Les partenaires de la doume</source>
<target>Les partenaires de la doume</target>
</trans-unit>
<trans-unit id="3IMiZVc" resname="partenaires">
<source>partenaires</source>
<target>partenaires</target>
</trans-unit>
<trans-unit id="TMRM85Y" resname="Les groupes locaux de la doume">
<source>Les groupes locaux de la doume</source>
<target>Les groupes locaux de la doume</target>
</trans-unit>
<trans-unit id="1U3egkM" resname="groupes locaux">
<source>groupes locaux</source>
<target>groupes locaux</target>
</trans-unit>
<trans-unit id="6DifF5P" resname="Les comptoirs de la doume">
<source>Les comptoirs de la doume</source>
<target>Les comptoirs de la doume</target>
</trans-unit>
<trans-unit id="dlG4uaP" resname="comptoirs">
<source>comptoirs</source>
<target>comptoirs</target>
</trans-unit>
<trans-unit id="pCEqqhf" resname="Groupes Locaux">
<source>Groupes Locaux</source>
<target>Groupes Locaux</target>
</trans-unit>
<trans-unit id="hEPgS3O" resname="Mes transactions :">
<source>Mes transactions :</source>
<target>Mes transactions :</target>
</trans-unit>
<trans-unit id="a3kb2rR" resname="payée le">
<source>payée le</source>
<target>payée le</target>
</trans-unit>
<trans-unit id="2iiN0qP" resname="Actualités">
<source>Actualités</source>
<target>Actualités</target>
</trans-unit>
<trans-unit id="VDBT9l_" resname="Crée le">
<source>Crée le</source>
<target>Crée le</target>
</trans-unit>
<trans-unit id="nziugJj" resname="Nous contacter">
<source>Nous contacter</source>
<target>Nous contacter</target>
</trans-unit>
<trans-unit id="cpCzYDb" resname="Virement vers un prestataire">
<source>Virement vers un prestataire</source>
<target>Virement vers un prestataire</target>
</trans-unit>
<trans-unit id="6Mfnzji" resname="Virement vers un adhérent">
<source>Virement vers un adhérent</source>
<target>Virement vers un adhérent</target>
</trans-unit>
<trans-unit id="8e9fjVV" resname="Modifier vos informations">
<source>Modifier vos informations</source>
<target>Modifier vos informations</target>
</trans-unit>
<trans-unit id="lSg0K24" resname="Modifier mes informations">
<source>Modifier mes informations</source>
<target>Modifier mes informations</target>
</trans-unit>
<trans-unit id="HM16Oyf" resname="Mon ecompte">
<source>Mon ecompte</source>
<target>Mon ecompte</target>
</trans-unit>
<trans-unit id="Uh8jZlt" resname="Mes cotisations">
<source>Mes cotisations</source>
<target>Mes cotisations</target>
</trans-unit>
<trans-unit id="rc2XEYT" resname="Mes transactions">
<source>Mes transactions</source>
<target>Mes transactions</target>
</trans-unit>
<trans-unit id="veR6.U9" resname="Groupes locaux">
<source>Groupes locaux</source>
<target>Groupes locaux</target>
</trans-unit>
<trans-unit id="fIUCvoG" resname="Transfert au comptoir">
<source>Transfert au comptoir</source>
<target>Transfert au comptoir</target>
</trans-unit>
<trans-unit id="Et03WFB" resname="Configuration du Groupe local">
<source>Configuration du Groupe local</source>
<target>Configuration du Groupe local</target>
</trans-unit>
<trans-unit id="RN.r_5M" resname="Page d'accueil">
<source>Page d'accueil</source>
<target>Page d'accueil</target>
</trans-unit>
<trans-unit id="u9vL9zR" resname="ADMINISTRATION">
<source>ADMINISTRATION</source>
<target>ADMINISTRATION</target>
</trans-unit>
<trans-unit id="KrGI8dm" resname="Inscriptioj confirmée !">
<source>Inscriptioj confirmée !</source>
<target>Inscriptioj confirmée !</target>
</trans-unit>
<trans-unit id="i0lTg3x" resname="INSCRIPTION">
<source>INSCRIPTION</source>
<target>INSCRIPTION</target>
</trans-unit>
<trans-unit id="LkqbmJC" resname="Vérifiez vos courriels !">
<source>Vérifiez vos courriels !</source>
<target>Vérifiez vos courriels !</target>
</trans-unit>
<trans-unit id="LpkJGx4" resname="Réinitialiser le mot de passe">
<source>Réinitialiser le mot de passe</source>
<target>Réinitialiser le mot de passe</target>
</trans-unit>
<trans-unit id="bKWrdHk" resname="Mot de passe réinitialisé !">
<source>Mot de passe réinitialisé !</source>
<target>Mot de passe réinitialisé !</target>
</trans-unit>
<trans-unit id="U22DLw8" resname="CONNEXION">
<source>CONNEXION</source>
<target>CONNEXION</target>
</trans-unit>
<trans-unit id="2E8oBeP" resname="Modifier votre mot de passe !">
<source>Modifier votre mot de passe !</source>
<target>Modifier votre mot de passe !</target>
</trans-unit>
<trans-unit id="yqNZZCS" resname="Solde">
<source>Solde</source>
<target>Solde</target>
</trans-unit>
<trans-unit id="48q18GU" resname="fa-coins">
<source>fa-coins</source>
<target>fa-coins</target>
</trans-unit>
<trans-unit id="_k8.Udi" resname="Opérations">
<source>Opérations</source>
<target>Opérations</target>
</trans-unit>
<trans-unit id="NdCgDbP" resname="Changer votre mot de passe">
<source>Changer votre mot de passe</source>
<target>Changer votre mot de passe</target>
</trans-unit>
<trans-unit id="YmunqJ." resname="Valider">
<source>Valider</source>
<target>Valider</target>
</trans-unit>
<trans-unit id="zJA_ya9" resname="Compte utilisateur">
<source>Compte utilisateur</source>
<target>Compte utilisateur</target>
</trans-unit>
<trans-unit id="3kzerPc" resname="RETOUR SUPER ADMIN">
<source>RETOUR SUPER ADMIN</source>
<target>RETOUR SUPER ADMIN</target>
</trans-unit>
<trans-unit id="mzQJREu" resname="PRESTATAIRE">
<source>PRESTATAIRE</source>
<target>PRESTATAIRE</target>
</trans-unit>
<trans-unit id="37vPUE1" resname="ADHERENT">
<source>ADHERENT</source>
<target>ADHERENT</target>
</trans-unit>
<trans-unit id="s66JKM." resname="ADMIN SIEGE">
<source>ADMIN SIEGE</source>
<target>ADMIN SIEGE</target>
</trans-unit>
<trans-unit id="ONtEZ6T" resname="COMPTOIR">
<source>COMPTOIR</source>
<target>COMPTOIR</target>
</trans-unit>
<trans-unit id="7F.o2_2" resname="GESTION GROUPE">
<source>GESTION GROUPE</source>
<target>GESTION GROUPE</target>
</trans-unit>
<trans-unit id="_C7LteU" resname="CONTACT">
<source>CONTACT</source>
<target>CONTACT</target>
</trans-unit>
<trans-unit id="kpAYr6z" resname="TRESORIER">
<source>TRESORIER</source>
<target>TRESORIER</target>
</trans-unit>
<trans-unit id="WSi_r9i" resname="CONTROLEUR">
<source>CONTROLEUR</source>
<target>CONTROLEUR</target>
</trans-unit>
<trans-unit id="EINTPyl" resname="REDACTEUR">
<source>REDACTEUR</source>
<target>REDACTEUR</target>
</trans-unit>
<trans-unit id="C4VrlWw" resname="Solde du siège">
<source>Solde du siège</source>
<target>Solde du siège</target>
</trans-unit>
<trans-unit id="qU1CjkW" resname="Solde du groupe">
<source>Solde du groupe</source>
<target>Solde du groupe</target>
</trans-unit>
<trans-unit id="9DxJIlT" resname="Solde du comptoir &quot;">
<source>Solde du comptoir "</source>
<target>Solde du comptoir "</target>
</trans-unit>
<trans-unit id="gQXH2c9" resname="Solde e-mlc">
<source>Solde e-mlc</source>
<target>Solde e-mlc</target>
</trans-unit>
<trans-unit id="vVSVybP" resname="Situer les Prestataires">
<source>Situer les Prestataires</source>
<target>Situer les Prestataires</target>
</trans-unit>
<trans-unit id="ybPDgkf" resname="Total">
<source>Total</source>
<target>Total</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="en" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="baI_ZxO" resname="An authentication exception occurred.">
<source>An authentication exception occurred.</source>
<target>An authentication exception occurred.</target>
</trans-unit>
<trans-unit id="OETylMq" resname="Authentication credentials could not be found.">
<source>Authentication credentials could not be found.</source>
<target>Authentication credentials could not be found.</target>
</trans-unit>
<trans-unit id="3RJINQ0" resname="Authentication request could not be processed due to a system problem.">
<source>Authentication request could not be processed due to a system problem.</source>
<target>Authentication request could not be processed due to a system problem.</target>
</trans-unit>
<trans-unit id="qr0aiUo" resname="Invalid credentials.">
<source>Invalid credentials.</source>
<target>Invalid credentials.</target>
</trans-unit>
<trans-unit id="zrJWK0F" resname="Cookie has already been used by someone else.">
<source>Cookie has already been used by someone else.</source>
<target>Cookie has already been used by someone else.</target>
</trans-unit>
<trans-unit id="blC0fXX" resname="Not privileged to request the resource.">
<source>Not privileged to request the resource.</source>
<target>Not privileged to request the resource.</target>
</trans-unit>
<trans-unit id="dLzMRPR" resname="Invalid CSRF token.">
<source>Invalid CSRF token.</source>
<target>Invalid CSRF token.</target>
</trans-unit>
<trans-unit id="PhhlLem" resname="No authentication provider found to support the authentication token.">
<source>No authentication provider found to support the authentication token.</source>
<target>No authentication provider found to support the authentication token.</target>
</trans-unit>
<trans-unit id="v_RS21A" resname="No session available, it either timed out or cookies are not enabled.">
<source>No session available, it either timed out or cookies are not enabled.</source>
<target>No session available, it either timed out or cookies are not enabled.</target>
</trans-unit>
<trans-unit id="EYCKpDH" resname="No token could be found.">
<source>No token could be found.</source>
<target>No token could be found.</target>
</trans-unit>
<trans-unit id="z3cOUZo" resname="Username could not be found.">
<source>Username could not be found.</source>
<target>Username could not be found.</target>
</trans-unit>
<trans-unit id="By5eLYM" resname="Account has expired.">
<source>Account has expired.</source>
<target>Account has expired.</target>
</trans-unit>
<trans-unit id="YfZhiuA" resname="Credentials have expired.">
<source>Credentials have expired.</source>
<target>Credentials have expired.</target>
</trans-unit>
<trans-unit id="NrSSfLs" resname="Account is disabled.">
<source>Account is disabled.</source>
<target>Account is disabled.</target>
</trans-unit>
<trans-unit id="O5ZyxHr" resname="Account is locked.">
<source>Account is locked.</source>
<target>Account is locked.</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="fr" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="baI_ZxO" resname="An authentication exception occurred.">
<source>An authentication exception occurred.</source>
<target>Une exception d'authentification s'est produite.</target>
</trans-unit>
<trans-unit id="OETylMq" resname="Authentication credentials could not be found.">
<source>Authentication credentials could not be found.</source>
<target>Les identifiants d'authentification n'ont pas pu être trouvés.</target>
</trans-unit>
<trans-unit id="3RJINQ0" resname="Authentication request could not be processed due to a system problem.">
<source>Authentication request could not be processed due to a system problem.</source>
<target>La requête d'authentification n'a pas pu être executée à cause d'un problème système.</target>
</trans-unit>
<trans-unit id="qr0aiUo" resname="Invalid credentials.">
<source>Invalid credentials.</source>
<target>Identifiants invalides.</target>
</trans-unit>
<trans-unit id="zrJWK0F" resname="Cookie has already been used by someone else.">
<source>Cookie has already been used by someone else.</source>
<target>Le cookie a déjà été utilisé par quelqu'un d'autre.</target>
</trans-unit>
<trans-unit id="blC0fXX" resname="Not privileged to request the resource.">
<source>Not privileged to request the resource.</source>
<target>Privilèges insuffisants pour accéder à la ressource.</target>
</trans-unit>
<trans-unit id="dLzMRPR" resname="Invalid CSRF token.">
<source>Invalid CSRF token.</source>
<target>Jeton CSRF invalide.</target>
</trans-unit>
<trans-unit id="PhhlLem" resname="No authentication provider found to support the authentication token.">
<source>No authentication provider found to support the authentication token.</source>
<target>Aucun fournisseur d'authentification n'a été trouvé pour supporter le jeton d'authentification.</target>
</trans-unit>
<trans-unit id="v_RS21A" resname="No session available, it either timed out or cookies are not enabled.">
<source>No session available, it either timed out or cookies are not enabled.</source>
<target>Aucune session disponible, celle-ci a expiré ou les cookies ne sont pas activés.</target>
</trans-unit>
<trans-unit id="EYCKpDH" resname="No token could be found.">
<source>No token could be found.</source>
<target>Aucun jeton n'a pu être trouvé.</target>
</trans-unit>
<trans-unit id="z3cOUZo" resname="Username could not be found.">
<source>Username could not be found.</source>
<target>Le nom d'utilisateur n'a pas pu être trouvé.</target>
</trans-unit>
<trans-unit id="By5eLYM" resname="Account has expired.">
<source>Account has expired.</source>
<target>Le compte a expiré.</target>
</trans-unit>
<trans-unit id="YfZhiuA" resname="Credentials have expired.">
<source>Credentials have expired.</source>
<target>Les identifiants ont expiré.</target>
</trans-unit>
<trans-unit id="NrSSfLs" resname="Account is disabled.">
<source>Account is disabled.</source>
<target>Le compte est désactivé.</target>
</trans-unit>
<trans-unit id="O5ZyxHr" resname="Account is locked.">
<source>Account is locked.</source>
<target>Le compte est bloqué.</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="en" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="zh5oKD9" resname="This value should be false.">
<source>This value should be false.</source>
<target>This value should be false.</target>
</trans-unit>
<trans-unit id="NN2_iru" resname="This value should be true.">
<source>This value should be true.</source>
<target>This value should be true.</target>
</trans-unit>
<trans-unit id="OjM_kpf" resname="This value should be of type {{ type }}.">
<source>This value should be of type {{ type }}.</source>
<target>This value should be of type {{ type }}.</target>
</trans-unit>
<trans-unit id="f0P5pBD" resname="This value should be blank.">
<source>This value should be blank.</source>
<target>This value should be blank.</target>
</trans-unit>
<trans-unit id="ih.4TRN" resname="The value you selected is not a valid choice.">
<source>The value you selected is not a valid choice.</source>
<target>The value you selected is not a valid choice.</target>
</trans-unit>
<trans-unit id="u81CkP8" resname="You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.">
<source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
<target>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</target>
</trans-unit>
<trans-unit id="nIvOQ_o" resname="You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.">
<source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
<target>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</target>
</trans-unit>
<trans-unit id="87zjiHi" resname="One or more of the given values is invalid.">
<source>One or more of the given values is invalid.</source>
<target>One or more of the given values is invalid.</target>
</trans-unit>
<trans-unit id="3NeQftv" resname="This field was not expected.">
<source>This field was not expected.</source>
<target>This field was not expected.</target>
</trans-unit>
<trans-unit id="SwMV4zp" resname="This field is missing.">
<source>This field is missing.</source>
<target>This field is missing.</target>
</trans-unit>
<trans-unit id="LO2vFKN" resname="This value is not a valid date.">
<source>This value is not a valid date.</source>
<target>This value is not a valid date.</target>
</trans-unit>
<trans-unit id="86dU_nv" resname="This value is not a valid datetime.">
<source>This value is not a valid datetime.</source>
<target>This value is not a valid datetime.</target>
</trans-unit>
<trans-unit id="PSvNXdi" resname="This value is not a valid email address.">
<source>This value is not a valid email address.</source>
<target>This value is not a valid email address.</target>
</trans-unit>
<trans-unit id="3KeHbZy" resname="The file could not be found.">
<source>The file could not be found.</source>
<target>The file could not be found.</target>
</trans-unit>
<trans-unit id="KtJhQZo" resname="The file is not readable.">
<source>The file is not readable.</source>
<target>The file is not readable.</target>
</trans-unit>
<trans-unit id="JocOVM2" resname="The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.">
<source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
<target>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</target>
</trans-unit>
<trans-unit id="YW21SPH" resname="The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.">
<source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
<target>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</target>
</trans-unit>
<trans-unit id="NubOmrs" resname="This value should be {{ limit }} or less.">
<source>This value should be {{ limit }} or less.</source>
<target>This value should be {{ limit }} or less.</target>
</trans-unit>
<trans-unit id="HX7TOFm" resname="This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.">
<source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
<target>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</target>
</trans-unit>
<trans-unit id="qgR8M_U" resname="This value should be {{ limit }} or more.">
<source>This value should be {{ limit }} or more.</source>
<target>This value should be {{ limit }} or more.</target>
</trans-unit>
<trans-unit id="ekfrU.c" resname="This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.">
<source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
<target>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</target>
</trans-unit>
<trans-unit id="1KV4L.t" resname="This value should not be blank.">
<source>This value should not be blank.</source>
<target>This value should not be blank.</target>
</trans-unit>
<trans-unit id="2G4Vepm" resname="This value should not be null.">
<source>This value should not be null.</source>
<target>This value should not be null.</target>
</trans-unit>
<trans-unit id="yDc3m6E" resname="This value should be null.">
<source>This value should be null.</source>
<target>This value should be null.</target>
</trans-unit>
<trans-unit id="zKzWejA" resname="This value is not valid.">
<source>This value is not valid.</source>
<target>This value is not valid.</target>
</trans-unit>
<trans-unit id="HSuBZpQ" resname="This value is not a valid time.">
<source>This value is not a valid time.</source>
<target>This value is not a valid time.</target>
</trans-unit>
<trans-unit id="snWc_QT" resname="This value is not a valid URL.">
<source>This value is not a valid URL.</source>
<target>This value is not a valid URL.</target>
</trans-unit>
<trans-unit id="jpaLsb2" resname="The two values should be equal.">
<source>The two values should be equal.</source>
<target>The two values should be equal.</target>
</trans-unit>
<trans-unit id="fIlB1B_" resname="The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.">
<source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
<target>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</target>
</trans-unit>
<trans-unit id="tW7o0t9" resname="The file is too large.">
<source>The file is too large.</source>
<target>The file is too large.</target>
</trans-unit>
<trans-unit id=".exF5Ww" resname="The file could not be uploaded.">
<source>The file could not be uploaded.</source>
<target>The file could not be uploaded.</target>
</trans-unit>
<trans-unit id="d7sS5yw" resname="This value should be a valid number.">
<source>This value should be a valid number.</source>
<target>This value should be a valid number.</target>
</trans-unit>
<trans-unit id="BS2Ez6i" resname="This file is not a valid image.">
<source>This file is not a valid image.</source>
<target>This file is not a valid image.</target>
</trans-unit>
<trans-unit id="ydcT9kU" resname="This is not a valid IP address.">
<source>This is not a valid IP address.</source>
<target>This is not a valid IP address.</target>
</trans-unit>
<trans-unit id="lDOGNFX" resname="This value is not a valid language.">
<source>This value is not a valid language.</source>
<target>This value is not a valid language.</target>
</trans-unit>
<trans-unit id="y9IdYkA" resname="This value is not a valid locale.">
<source>This value is not a valid locale.</source>
<target>This value is not a valid locale.</target>
</trans-unit>
<trans-unit id="1YC0pOd" resname="This value is not a valid country.">
<source>This value is not a valid country.</source>
<target>This value is not a valid country.</target>
</trans-unit>
<trans-unit id="B5ebaMp" resname="This value is already used.">
<source>This value is already used.</source>
<target>This value is already used.</target>
</trans-unit>
<trans-unit id="L6097a6" resname="The size of the image could not be detected.">
<source>The size of the image could not be detected.</source>
<target>The size of the image could not be detected.</target>
</trans-unit>
<trans-unit id="zVtJJEa" resname="The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.">
<source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
<target>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</target>
</trans-unit>
<trans-unit id="s8LFQGC" resname="The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.">
<source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
<target>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</target>
</trans-unit>
<trans-unit id="Z.NgqFj" resname="The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.">
<source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
<target>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</target>
</trans-unit>
<trans-unit id="AW1lWVM" resname="The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.">
<source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
<target>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</target>
</trans-unit>
<trans-unit id="PSdMNab" resname="This value should be the user's current password.">
<source>This value should be the user's current password.</source>
<target>This value should be the user's current password.</target>
</trans-unit>
<trans-unit id="gYImVyV" resname="This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.">
<source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
<target>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</target>
</trans-unit>
<trans-unit id="xJ2Bcr_" resname="The file was only partially uploaded.">
<source>The file was only partially uploaded.</source>
<target>The file was only partially uploaded.</target>
</trans-unit>
<trans-unit id="HzkJDtF" resname="No file was uploaded.">
<source>No file was uploaded.</source>
<target>No file was uploaded.</target>
</trans-unit>
<trans-unit id="mHfEaB3" resname="No temporary folder was configured in php.ini.">
<source>No temporary folder was configured in php.ini.</source>
<target>No temporary folder was configured in php.ini, or the configured folder does not exist.</target>
</trans-unit>
<trans-unit id="y9K3BGb" resname="Cannot write temporary file to disk.">
<source>Cannot write temporary file to disk.</source>
<target>Cannot write temporary file to disk.</target>
</trans-unit>
<trans-unit id="kx3yHIM" resname="A PHP extension caused the upload to fail.">
<source>A PHP extension caused the upload to fail.</source>
<target>A PHP extension caused the upload to fail.</target>
</trans-unit>
<trans-unit id="gTJYRl6" resname="This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.">
<source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
<target>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</target>
</trans-unit>
<trans-unit id="FFn3lVn" resname="This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.">
<source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
<target>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</target>
</trans-unit>
<trans-unit id="bSdilZv" resname="This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.">
<source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
<target>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</target>
</trans-unit>
<trans-unit id="MAzmID7" resname="Invalid card number.">
<source>Invalid card number.</source>
<target>Invalid card number.</target>
</trans-unit>
<trans-unit id="c3REGK3" resname="Unsupported card type or invalid card number.">
<source>Unsupported card type or invalid card number.</source>
<target>Unsupported card type or invalid card number.</target>
</trans-unit>
<trans-unit id="XSVzcbV" resname="This is not a valid International Bank Account Number (IBAN).">
<source>This is not a valid International Bank Account Number (IBAN).</source>
<target>This is not a valid International Bank Account Number (IBAN).</target>
</trans-unit>
<trans-unit id="yHirwNr" resname="This value is not a valid ISBN-10.">
<source>This value is not a valid ISBN-10.</source>
<target>This value is not a valid ISBN-10.</target>
</trans-unit>
<trans-unit id="c_q0_ua" resname="This value is not a valid ISBN-13.">
<source>This value is not a valid ISBN-13.</source>
<target>This value is not a valid ISBN-13.</target>
</trans-unit>
<trans-unit id="M4FlD6n" resname="This value is neither a valid ISBN-10 nor a valid ISBN-13.">
<source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
<target>This value is neither a valid ISBN-10 nor a valid ISBN-13.</target>
</trans-unit>
<trans-unit id="cuct0Ow" resname="This value is not a valid ISSN.">
<source>This value is not a valid ISSN.</source>
<target>This value is not a valid ISSN.</target>
</trans-unit>
<trans-unit id="JBLs1a1" resname="This value is not a valid currency.">
<source>This value is not a valid currency.</source>
<target>This value is not a valid currency.</target>
</trans-unit>
<trans-unit id="c.WxzFW" resname="This value should be equal to {{ compared_value }}.">
<source>This value should be equal to {{ compared_value }}.</source>
<target>This value should be equal to {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="_jdjkwq" resname="This value should be greater than {{ compared_value }}.">
<source>This value should be greater than {{ compared_value }}.</source>
<target>This value should be greater than {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="o8A8a0H" resname="This value should be greater than or equal to {{ compared_value }}.">
<source>This value should be greater than or equal to {{ compared_value }}.</source>
<target>This value should be greater than or equal to {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="bOF1fpm" resname="This value should be identical to {{ compared_value_type }} {{ compared_value }}.">
<source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
<target>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="jG0QFKw" resname="This value should be less than {{ compared_value }}.">
<source>This value should be less than {{ compared_value }}.</source>
<target>This value should be less than {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="9lWrKmm" resname="This value should be less than or equal to {{ compared_value }}.">
<source>This value should be less than or equal to {{ compared_value }}.</source>
<target>This value should be less than or equal to {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="ftTwGs." resname="This value should not be equal to {{ compared_value }}.">
<source>This value should not be equal to {{ compared_value }}.</source>
<target>This value should not be equal to {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="Bi22JLt" resname="This value should not be identical to {{ compared_value_type }} {{ compared_value }}.">
<source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
<target>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="VczCWzQ" resname="The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.">
<source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
<target>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</target>
</trans-unit>
<trans-unit id="v57PXhq" resname="The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.">
<source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
<target>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</target>
</trans-unit>
<trans-unit id="rpajj.a" resname="The image is square ({{ width }}x{{ height }}px). Square images are not allowed.">
<source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
<target>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</target>
</trans-unit>
<trans-unit id="G_lu2qW" resname="The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.">
<source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
<target>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</target>
</trans-unit>
<trans-unit id="sFyGx4B" resname="The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.">
<source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
<target>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</target>
</trans-unit>
<trans-unit id="jZgqcpL" resname="An empty file is not allowed.">
<source>An empty file is not allowed.</source>
<target>An empty file is not allowed.</target>
</trans-unit>
<trans-unit id="bcfVezI" resname="The host could not be resolved.">
<source>The host could not be resolved.</source>
<target>The host could not be resolved.</target>
</trans-unit>
<trans-unit id="NtzKvgt" resname="This value does not match the expected {{ charset }} charset.">
<source>This value does not match the expected {{ charset }} charset.</source>
<target>This value does not match the expected {{ charset }} charset.</target>
</trans-unit>
<trans-unit id="Wi2y9.N" resname="This is not a valid Business Identifier Code (BIC).">
<source>This is not a valid Business Identifier Code (BIC).</source>
<target>This is not a valid Business Identifier Code (BIC).</target>
</trans-unit>
<trans-unit id="VKDowX6" resname="Error">
<source>Error</source>
<target>Error</target>
</trans-unit>
<trans-unit id="8zqt0Ik" resname="This is not a valid UUID.">
<source>This is not a valid UUID.</source>
<target>This is not a valid UUID.</target>
</trans-unit>
<trans-unit id="ru.4wkH" resname="This value should be a multiple of {{ compared_value }}.">
<source>This value should be a multiple of {{ compared_value }}.</source>
<target>This value should be a multiple of {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="M3vyK6s" resname="This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.">
<source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
<target>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</target>
</trans-unit>
<trans-unit id="2v2xpAh" resname="This value should be valid JSON.">
<source>This value should be valid JSON.</source>
<target>This value should be valid JSON.</target>
</trans-unit>
<trans-unit id="9CWVEGq" resname="This collection should contain only unique elements.">
<source>This collection should contain only unique elements.</source>
<target>This collection should contain only unique elements.</target>
</trans-unit>
<trans-unit id="WdvZfq." resname="This value should be positive.">
<source>This value should be positive.</source>
<target>This value should be positive.</target>
</trans-unit>
<trans-unit id="ubHMK2q" resname="This value should be either positive or zero.">
<source>This value should be either positive or zero.</source>
<target>This value should be either positive or zero.</target>
</trans-unit>
<trans-unit id="IwNTzo_" resname="This value should be negative.">
<source>This value should be negative.</source>
<target>This value should be negative.</target>
</trans-unit>
<trans-unit id="0GfwMfP" resname="This value should be either negative or zero.">
<source>This value should be either negative or zero.</source>
<target>This value should be either negative or zero.</target>
</trans-unit>
<trans-unit id="fs3qQZR" resname="This value is not a valid timezone.">
<source>This value is not a valid timezone.</source>
<target>This value is not a valid timezone.</target>
</trans-unit>
<trans-unit id="40dnsod" resname="This password has been leaked in a data breach, it must not be used. Please use another password.">
<source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
<target>This password has been leaked in a data breach, it must not be used. Please use another password.</target>
</trans-unit>
<trans-unit id="VvxxWas" resname="This value should be between {{ min }} and {{ max }}.">
<source>This value should be between {{ min }} and {{ max }}.</source>
<target>This value should be between {{ min }} and {{ max }}.</target>
</trans-unit>
<trans-unit id=".SEaaBa" resname="This form should not contain extra fields.">
<source>This form should not contain extra fields.</source>
<target>This form should not contain extra fields.</target>
</trans-unit>
<trans-unit id="WPnLAh9" resname="The uploaded file was too large. Please try to upload a smaller file.">
<source>The uploaded file was too large. Please try to upload a smaller file.</source>
<target>The uploaded file was too large. Please try to upload a smaller file.</target>
</trans-unit>
<trans-unit id="fvxWW3V" resname="The CSRF token is invalid. Please try to resubmit the form.">
<source>The CSRF token is invalid. Please try to resubmit the form.</source>
<target>The CSRF token is invalid. Please try to resubmit the form.</target>
</trans-unit>
</body>
</file>
</xliff>
<?xml version="1.0" encoding="utf-8"?>
<xliff xmlns="urn:oasis:names:tc:xliff:document:1.2" version="1.2">
<file source-language="fr" target-language="fr" datatype="plaintext" original="file.ext">
<header>
<tool tool-id="symfony" tool-name="Symfony"/>
</header>
<body>
<trans-unit id="zh5oKD9" resname="This value should be false.">
<source>This value should be false.</source>
<target>Cette valeur doit être fausse.</target>
</trans-unit>
<trans-unit id="NN2_iru" resname="This value should be true.">
<source>This value should be true.</source>
<target>Cette valeur doit être vraie.</target>
</trans-unit>
<trans-unit id="OjM_kpf" resname="This value should be of type {{ type }}.">
<source>This value should be of type {{ type }}.</source>
<target>Cette valeur doit être de type {{ type }}.</target>
</trans-unit>
<trans-unit id="f0P5pBD" resname="This value should be blank.">
<source>This value should be blank.</source>
<target>Cette valeur doit être vide.</target>
</trans-unit>
<trans-unit id="ih.4TRN" resname="The value you selected is not a valid choice.">
<source>The value you selected is not a valid choice.</source>
<target>Cette valeur doit être l'un des choix proposés.</target>
</trans-unit>
<trans-unit id="u81CkP8" resname="You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.">
<source>You must select at least {{ limit }} choice.|You must select at least {{ limit }} choices.</source>
<target>Vous devez sélectionner au moins {{ limit }} choix.|Vous devez sélectionner au moins {{ limit }} choix.</target>
</trans-unit>
<trans-unit id="nIvOQ_o" resname="You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.">
<source>You must select at most {{ limit }} choice.|You must select at most {{ limit }} choices.</source>
<target>Vous devez sélectionner au maximum {{ limit }} choix.|Vous devez sélectionner au maximum {{ limit }} choix.</target>
</trans-unit>
<trans-unit id="87zjiHi" resname="One or more of the given values is invalid.">
<source>One or more of the given values is invalid.</source>
<target>Une ou plusieurs des valeurs soumises sont invalides.</target>
</trans-unit>
<trans-unit id="3NeQftv" resname="This field was not expected.">
<source>This field was not expected.</source>
<target>Ce champ n'a pas été prévu.</target>
</trans-unit>
<trans-unit id="SwMV4zp" resname="This field is missing.">
<source>This field is missing.</source>
<target>Ce champ est manquant.</target>
</trans-unit>
<trans-unit id="LO2vFKN" resname="This value is not a valid date.">
<source>This value is not a valid date.</source>
<target>Cette valeur n'est pas une date valide.</target>
</trans-unit>
<trans-unit id="86dU_nv" resname="This value is not a valid datetime.">
<source>This value is not a valid datetime.</source>
<target>Cette valeur n'est pas une date valide.</target>
</trans-unit>
<trans-unit id="PSvNXdi" resname="This value is not a valid email address.">
<source>This value is not a valid email address.</source>
<target>Cette valeur n'est pas une adresse email valide.</target>
</trans-unit>
<trans-unit id="3KeHbZy" resname="The file could not be found.">
<source>The file could not be found.</source>
<target>Le fichier n'a pas été trouvé.</target>
</trans-unit>
<trans-unit id="KtJhQZo" resname="The file is not readable.">
<source>The file is not readable.</source>
<target>Le fichier n'est pas lisible.</target>
</trans-unit>
<trans-unit id="JocOVM2" resname="The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.">
<source>The file is too large ({{ size }} {{ suffix }}). Allowed maximum size is {{ limit }} {{ suffix }}.</source>
<target>Le fichier est trop volumineux ({{ size }} {{ suffix }}). Sa taille ne doit pas dépasser {{ limit }} {{ suffix }}.</target>
</trans-unit>
<trans-unit id="YW21SPH" resname="The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.">
<source>The mime type of the file is invalid ({{ type }}). Allowed mime types are {{ types }}.</source>
<target>Le type du fichier est invalide ({{ type }}). Les types autorisés sont {{ types }}.</target>
</trans-unit>
<trans-unit id="NubOmrs" resname="This value should be {{ limit }} or less.">
<source>This value should be {{ limit }} or less.</source>
<target>Cette valeur doit être inférieure ou égale à {{ limit }}.</target>
</trans-unit>
<trans-unit id="HX7TOFm" resname="This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.">
<source>This value is too long. It should have {{ limit }} character or less.|This value is too long. It should have {{ limit }} characters or less.</source>
<target>Cette chaîne est trop longue. Elle doit avoir au maximum {{ limit }} caractère.|Cette chaîne est trop longue. Elle doit avoir au maximum {{ limit }} caractères.</target>
</trans-unit>
<trans-unit id="qgR8M_U" resname="This value should be {{ limit }} or more.">
<source>This value should be {{ limit }} or more.</source>
<target>Cette valeur doit être supérieure ou égale à {{ limit }}.</target>
</trans-unit>
<trans-unit id="ekfrU.c" resname="This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.">
<source>This value is too short. It should have {{ limit }} character or more.|This value is too short. It should have {{ limit }} characters or more.</source>
<target>Cette chaîne est trop courte. Elle doit avoir au minimum {{ limit }} caractère.|Cette chaîne est trop courte. Elle doit avoir au minimum {{ limit }} caractères.</target>
</trans-unit>
<trans-unit id="1KV4L.t" resname="This value should not be blank.">
<source>This value should not be blank.</source>
<target>Cette valeur ne doit pas être vide.</target>
</trans-unit>
<trans-unit id="2G4Vepm" resname="This value should not be null.">
<source>This value should not be null.</source>
<target>Cette valeur ne doit pas être nulle.</target>
</trans-unit>
<trans-unit id="yDc3m6E" resname="This value should be null.">
<source>This value should be null.</source>
<target>Cette valeur doit être nulle.</target>
</trans-unit>
<trans-unit id="zKzWejA" resname="This value is not valid.">
<source>This value is not valid.</source>
<target>Cette valeur n'est pas valide.</target>
</trans-unit>
<trans-unit id="HSuBZpQ" resname="This value is not a valid time.">
<source>This value is not a valid time.</source>
<target>Cette valeur n'est pas une heure valide.</target>
</trans-unit>
<trans-unit id="snWc_QT" resname="This value is not a valid URL.">
<source>This value is not a valid URL.</source>
<target>Cette valeur n'est pas une URL valide.</target>
</trans-unit>
<trans-unit id="jpaLsb2" resname="The two values should be equal.">
<source>The two values should be equal.</source>
<target>Les deux valeurs doivent être identiques.</target>
</trans-unit>
<trans-unit id="fIlB1B_" resname="The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.">
<source>The file is too large. Allowed maximum size is {{ limit }} {{ suffix }}.</source>
<target>Le fichier est trop volumineux. Sa taille ne doit pas dépasser {{ limit }} {{ suffix }}.</target>
</trans-unit>
<trans-unit id="tW7o0t9" resname="The file is too large.">
<source>The file is too large.</source>
<target>Le fichier est trop volumineux.</target>
</trans-unit>
<trans-unit id=".exF5Ww" resname="The file could not be uploaded.">
<source>The file could not be uploaded.</source>
<target>Le téléchargement de ce fichier est impossible.</target>
</trans-unit>
<trans-unit id="d7sS5yw" resname="This value should be a valid number.">
<source>This value should be a valid number.</source>
<target>Cette valeur doit être un nombre.</target>
</trans-unit>
<trans-unit id="BS2Ez6i" resname="This file is not a valid image.">
<source>This file is not a valid image.</source>
<target>Ce fichier n'est pas une image valide.</target>
</trans-unit>
<trans-unit id="ydcT9kU" resname="This is not a valid IP address.">
<source>This is not a valid IP address.</source>
<target>Cette adresse IP n'est pas valide.</target>
</trans-unit>
<trans-unit id="lDOGNFX" resname="This value is not a valid language.">
<source>This value is not a valid language.</source>
<target>Cette langue n'est pas valide.</target>
</trans-unit>
<trans-unit id="y9IdYkA" resname="This value is not a valid locale.">
<source>This value is not a valid locale.</source>
<target>Ce paramètre régional n'est pas valide.</target>
</trans-unit>
<trans-unit id="1YC0pOd" resname="This value is not a valid country.">
<source>This value is not a valid country.</source>
<target>Ce pays n'est pas valide.</target>
</trans-unit>
<trans-unit id="B5ebaMp" resname="This value is already used.">
<source>This value is already used.</source>
<target>Cette valeur est déjà utilisée.</target>
</trans-unit>
<trans-unit id="L6097a6" resname="The size of the image could not be detected.">
<source>The size of the image could not be detected.</source>
<target>La taille de l'image n'a pas pu être détectée.</target>
</trans-unit>
<trans-unit id="zVtJJEa" resname="The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.">
<source>The image width is too big ({{ width }}px). Allowed maximum width is {{ max_width }}px.</source>
<target>La largeur de l'image est trop grande ({{ width }}px). La largeur maximale autorisée est de {{ max_width }}px.</target>
</trans-unit>
<trans-unit id="s8LFQGC" resname="The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.">
<source>The image width is too small ({{ width }}px). Minimum width expected is {{ min_width }}px.</source>
<target>La largeur de l'image est trop petite ({{ width }}px). La largeur minimale attendue est de {{ min_width }}px.</target>
</trans-unit>
<trans-unit id="Z.NgqFj" resname="The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.">
<source>The image height is too big ({{ height }}px). Allowed maximum height is {{ max_height }}px.</source>
<target>La hauteur de l'image est trop grande ({{ height }}px). La hauteur maximale autorisée est de {{ max_height }}px.</target>
</trans-unit>
<trans-unit id="AW1lWVM" resname="The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.">
<source>The image height is too small ({{ height }}px). Minimum height expected is {{ min_height }}px.</source>
<target>La hauteur de l'image est trop petite ({{ height }}px). La hauteur minimale attendue est de {{ min_height }}px.</target>
</trans-unit>
<trans-unit id="PSdMNab" resname="This value should be the user's current password.">
<source>This value should be the user's current password.</source>
<target>Cette valeur doit être le mot de passe actuel de l'utilisateur.</target>
</trans-unit>
<trans-unit id="gYImVyV" resname="This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.">
<source>This value should have exactly {{ limit }} character.|This value should have exactly {{ limit }} characters.</source>
<target>Cette chaîne doit avoir exactement {{ limit }} caractère.|Cette chaîne doit avoir exactement {{ limit }} caractères.</target>
</trans-unit>
<trans-unit id="xJ2Bcr_" resname="The file was only partially uploaded.">
<source>The file was only partially uploaded.</source>
<target>Le fichier a été partiellement transféré.</target>
</trans-unit>
<trans-unit id="HzkJDtF" resname="No file was uploaded.">
<source>No file was uploaded.</source>
<target>Aucun fichier n'a été transféré.</target>
</trans-unit>
<trans-unit id="mHfEaB3" resname="No temporary folder was configured in php.ini.">
<source>No temporary folder was configured in php.ini.</source>
<target>Aucun répertoire temporaire n'a été configuré dans le php.ini.</target>
</trans-unit>
<trans-unit id="y9K3BGb" resname="Cannot write temporary file to disk.">
<source>Cannot write temporary file to disk.</source>
<target>Impossible d'écrire le fichier temporaire sur le disque.</target>
</trans-unit>
<trans-unit id="kx3yHIM" resname="A PHP extension caused the upload to fail.">
<source>A PHP extension caused the upload to fail.</source>
<target>Une extension PHP a empêché le transfert du fichier.</target>
</trans-unit>
<trans-unit id="gTJYRl6" resname="This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.">
<source>This collection should contain {{ limit }} element or more.|This collection should contain {{ limit }} elements or more.</source>
<target>Cette collection doit contenir {{ limit }} élément ou plus.|Cette collection doit contenir {{ limit }} éléments ou plus.</target>
</trans-unit>
<trans-unit id="FFn3lVn" resname="This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.">
<source>This collection should contain {{ limit }} element or less.|This collection should contain {{ limit }} elements or less.</source>
<target>Cette collection doit contenir {{ limit }} élément ou moins.|Cette collection doit contenir {{ limit }} éléments ou moins.</target>
</trans-unit>
<trans-unit id="bSdilZv" resname="This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.">
<source>This collection should contain exactly {{ limit }} element.|This collection should contain exactly {{ limit }} elements.</source>
<target>Cette collection doit contenir exactement {{ limit }} élément.|Cette collection doit contenir exactement {{ limit }} éléments.</target>
</trans-unit>
<trans-unit id="MAzmID7" resname="Invalid card number.">
<source>Invalid card number.</source>
<target>Numéro de carte invalide.</target>
</trans-unit>
<trans-unit id="c3REGK3" resname="Unsupported card type or invalid card number.">
<source>Unsupported card type or invalid card number.</source>
<target>Type de carte non supporté ou numéro invalide.</target>
</trans-unit>
<trans-unit id="XSVzcbV" resname="This is not a valid International Bank Account Number (IBAN).">
<source>This is not a valid International Bank Account Number (IBAN).</source>
<target>Le numéro IBAN (International Bank Account Number) saisi n'est pas valide.</target>
</trans-unit>
<trans-unit id="yHirwNr" resname="This value is not a valid ISBN-10.">
<source>This value is not a valid ISBN-10.</source>
<target>Cette valeur n'est pas un code ISBN-10 valide.</target>
</trans-unit>
<trans-unit id="c_q0_ua" resname="This value is not a valid ISBN-13.">
<source>This value is not a valid ISBN-13.</source>
<target>Cette valeur n'est pas un code ISBN-13 valide.</target>
</trans-unit>
<trans-unit id="M4FlD6n" resname="This value is neither a valid ISBN-10 nor a valid ISBN-13.">
<source>This value is neither a valid ISBN-10 nor a valid ISBN-13.</source>
<target>Cette valeur n'est ni un code ISBN-10, ni un code ISBN-13 valide.</target>
</trans-unit>
<trans-unit id="cuct0Ow" resname="This value is not a valid ISSN.">
<source>This value is not a valid ISSN.</source>
<target>Cette valeur n'est pas un code ISSN valide.</target>
</trans-unit>
<trans-unit id="JBLs1a1" resname="This value is not a valid currency.">
<source>This value is not a valid currency.</source>
<target>Cette valeur n'est pas une devise valide.</target>
</trans-unit>
<trans-unit id="c.WxzFW" resname="This value should be equal to {{ compared_value }}.">
<source>This value should be equal to {{ compared_value }}.</source>
<target>Cette valeur doit être égale à {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="_jdjkwq" resname="This value should be greater than {{ compared_value }}.">
<source>This value should be greater than {{ compared_value }}.</source>
<target>Cette valeur doit être supérieure à {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="o8A8a0H" resname="This value should be greater than or equal to {{ compared_value }}.">
<source>This value should be greater than or equal to {{ compared_value }}.</source>
<target>Cette valeur doit être supérieure ou égale à {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="bOF1fpm" resname="This value should be identical to {{ compared_value_type }} {{ compared_value }}.">
<source>This value should be identical to {{ compared_value_type }} {{ compared_value }}.</source>
<target>Cette valeur doit être identique à {{ compared_value_type }} {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="jG0QFKw" resname="This value should be less than {{ compared_value }}.">
<source>This value should be less than {{ compared_value }}.</source>
<target>Cette valeur doit être inférieure à {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="9lWrKmm" resname="This value should be less than or equal to {{ compared_value }}.">
<source>This value should be less than or equal to {{ compared_value }}.</source>
<target>Cette valeur doit être inférieure ou égale à {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="ftTwGs." resname="This value should not be equal to {{ compared_value }}.">
<source>This value should not be equal to {{ compared_value }}.</source>
<target>Cette valeur ne doit pas être égale à {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="Bi22JLt" resname="This value should not be identical to {{ compared_value_type }} {{ compared_value }}.">
<source>This value should not be identical to {{ compared_value_type }} {{ compared_value }}.</source>
<target>Cette valeur ne doit pas être identique à {{ compared_value_type }} {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="VczCWzQ" resname="The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.">
<source>The image ratio is too big ({{ ratio }}). Allowed maximum ratio is {{ max_ratio }}.</source>
<target>Le rapport largeur/hauteur de l'image est trop grand ({{ ratio }}). Le rapport maximal autorisé est {{ max_ratio }}.</target>
</trans-unit>
<trans-unit id="v57PXhq" resname="The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.">
<source>The image ratio is too small ({{ ratio }}). Minimum ratio expected is {{ min_ratio }}.</source>
<target>Le rapport largeur/hauteur de l'image est trop petit ({{ ratio }}). Le rapport minimal attendu est {{ min_ratio }}.</target>
</trans-unit>
<trans-unit id="rpajj.a" resname="The image is square ({{ width }}x{{ height }}px). Square images are not allowed.">
<source>The image is square ({{ width }}x{{ height }}px). Square images are not allowed.</source>
<target>L'image est carrée ({{ width }}x{{ height }}px). Les images carrées ne sont pas autorisées.</target>
</trans-unit>
<trans-unit id="G_lu2qW" resname="The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.">
<source>The image is landscape oriented ({{ width }}x{{ height }}px). Landscape oriented images are not allowed.</source>
<target>L'image est au format paysage ({{ width }}x{{ height }}px). Les images au format paysage ne sont pas autorisées.</target>
</trans-unit>
<trans-unit id="sFyGx4B" resname="The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.">
<source>The image is portrait oriented ({{ width }}x{{ height }}px). Portrait oriented images are not allowed.</source>
<target>L'image est au format portrait ({{ width }}x{{ height }}px). Les images au format portrait ne sont pas autorisées.</target>
</trans-unit>
<trans-unit id="jZgqcpL" resname="An empty file is not allowed.">
<source>An empty file is not allowed.</source>
<target>Un fichier vide n'est pas autorisé.</target>
</trans-unit>
<trans-unit id="bcfVezI" resname="The host could not be resolved.">
<source>The host could not be resolved.</source>
<target>Le nom de domaine n'a pas pu être résolu.</target>
</trans-unit>
<trans-unit id="NtzKvgt" resname="This value does not match the expected {{ charset }} charset.">
<source>This value does not match the expected {{ charset }} charset.</source>
<target>Cette valeur ne correspond pas au jeu de caractères {{ charset }} attendu.</target>
</trans-unit>
<trans-unit id="Wi2y9.N" resname="This is not a valid Business Identifier Code (BIC).">
<source>This is not a valid Business Identifier Code (BIC).</source>
<target>Ce n'est pas un code universel d'identification des banques (BIC) valide.</target>
</trans-unit>
<trans-unit id="VKDowX6" resname="Error">
<source>Error</source>
<target>Erreur</target>
</trans-unit>
<trans-unit id="8zqt0Ik" resname="This is not a valid UUID.">
<source>This is not a valid UUID.</source>
<target>Ceci n'est pas un UUID valide.</target>
</trans-unit>
<trans-unit id="ru.4wkH" resname="This value should be a multiple of {{ compared_value }}.">
<source>This value should be a multiple of {{ compared_value }}.</source>
<target>Cette valeur doit être un multiple de {{ compared_value }}.</target>
</trans-unit>
<trans-unit id="M3vyK6s" resname="This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.">
<source>This Business Identifier Code (BIC) is not associated with IBAN {{ iban }}.</source>
<target>Ce code d'identification d'entreprise (BIC) n'est pas associé à l'IBAN {{ iban }}.</target>
</trans-unit>
<trans-unit id="2v2xpAh" resname="This value should be valid JSON.">
<source>This value should be valid JSON.</source>
<target>Cette valeur doit être un JSON valide.</target>
</trans-unit>
<trans-unit id="9CWVEGq" resname="This collection should contain only unique elements.">
<source>This collection should contain only unique elements.</source>
<target>Cette collection ne doit pas comporter de doublons.</target>
</trans-unit>
<trans-unit id="WdvZfq." resname="This value should be positive.">
<source>This value should be positive.</source>
<target>Cette valeur doit être strictement positive.</target>
</trans-unit>
<trans-unit id="ubHMK2q" resname="This value should be either positive or zero.">
<source>This value should be either positive or zero.</source>
<target>Cette valeur doit être supérieure ou égale à zéro.</target>
</trans-unit>
<trans-unit id="IwNTzo_" resname="This value should be negative.">
<source>This value should be negative.</source>
<target>Cette valeur doit être strictement négative.</target>
</trans-unit>
<trans-unit id="0GfwMfP" resname="This value should be either negative or zero.">
<source>This value should be either negative or zero.</source>
<target>Cette valeur doit être inférieure ou égale à zéro.</target>
</trans-unit>
<trans-unit id="fs3qQZR" resname="This value is not a valid timezone.">
<source>This value is not a valid timezone.</source>
<target>Cette valeur n'est pas un fuseau horaire valide.</target>
</trans-unit>
<trans-unit id="40dnsod" resname="This password has been leaked in a data breach, it must not be used. Please use another password.">
<source>This password has been leaked in a data breach, it must not be used. Please use another password.</source>
<target>Ce mot de passe a été divulgué lors d'une fuite de données, il ne doit plus être utilisé. Veuillez utiliser un autre mot de passe.</target>
</trans-unit>
<trans-unit id="VvxxWas" resname="This value should be between {{ min }} and {{ max }}.">
<source>This value should be between {{ min }} and {{ max }}.</source>
<target>Cette valeur doit être comprise entre {{ min }} et {{ max }}.</target>
</trans-unit>
<trans-unit id=".SEaaBa" resname="This form should not contain extra fields.">
<source>This form should not contain extra fields.</source>
<target>Ce formulaire ne doit pas contenir des champs supplémentaires.</target>
</trans-unit>
<trans-unit id="WPnLAh9" resname="The uploaded file was too large. Please try to upload a smaller file.">
<source>The uploaded file was too large. Please try to upload a smaller file.</source>
<target>Le fichier téléchargé est trop volumineux. Merci d'essayer d'envoyer un fichier plus petit.</target>
</trans-unit>
<trans-unit id="fvxWW3V" resname="The CSRF token is invalid. Please try to resubmit the form.">
<source>The CSRF token is invalid. Please try to resubmit the form.</source>
<target>Le jeton CSRF est invalide. Veuillez renvoyer le formulaire.</target>
</trans-unit>
</body>
</file>
</xliff>
......@@ -2,6 +2,13 @@ var Encore = require('@symfony/webpack-encore');
var webpack = require('webpack');
Encore
.copyFiles([
{from: './node_modules/ckeditor/', to: 'ckeditor/[path][name].[ext]', pattern: /\.(js|css)$/, includeSubdirectories: false},
{from: './node_modules/ckeditor/adapters', to: 'ckeditor/adapters/[path][name].[ext]'},
{from: './node_modules/ckeditor/lang', to: 'ckeditor/lang/[path][name].[ext]'},
{from: './node_modules/ckeditor/plugins', to: 'ckeditor/plugins/[path][name].[ext]'},
{from: './node_modules/ckeditor/skins', to: 'ckeditor/skins/[path][name].[ext]'}
])
// directory where compiled assets will be stored
.setOutputPath('public/build/')
// public path used by the web server to access the output path
......
This source diff could not be displayed because it is too large. You can view the blob instead.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment