Commit 265e0af4 by Damien Moulard

Merge branch 'ssa-gironde' into 5735-allowance-based-on-household

parents ee167589 55fe59bb
...@@ -49,6 +49,7 @@ TAV_ENV=0 ...@@ -49,6 +49,7 @@ TAV_ENV=0
PRESTA_SELF_INIT_AND_EVAL=0 PRESTA_SELF_INIT_AND_EVAL=0
AUTOMATISATION_RECONVERSION=0 AUTOMATISATION_RECONVERSION=0
PRESTA_EXTRA_DATA=0 PRESTA_EXTRA_DATA=0
HOUSEHOLD_BASED_ALLOWANCE=0
EMAIL_ERROR=technique@kohinos.net EMAIL_ERROR=technique@kohinos.net
EMAIL_USER_FROM=noreply@kohinos.fr EMAIL_USER_FROM=noreply@kohinos.fr
......
...@@ -56,6 +56,7 @@ Copier le fichier .env.dist en .env et configurer : ...@@ -56,6 +56,7 @@ Copier le fichier .env.dist en .env et configurer :
- en environnement TAV, pour activer le parcours d'inscription autonomisé qui intègre la réponse à une questionnaire d'auto-évaluation pour les points de vente, passer PRESTA_SELF_INIT_AND_EVAL à 1 - en environnement TAV, pour activer le parcours d'inscription autonomisé qui intègre la réponse à une questionnaire d'auto-évaluation pour les points de vente, passer PRESTA_SELF_INIT_AND_EVAL à 1
- en environnement TAV, la variable AUTOMATISATION_RECONVERSION permet d'activer l'automatisation des reconversions - en environnement TAV, la variable AUTOMATISATION_RECONVERSION permet d'activer l'automatisation des reconversions
- en environnement TAV, la variable PRESTA_EXTRA_DATA permet d'indiquer puis d'afficher publiquement plus de données concernant les prestataires (e.g. familles de produits) - en environnement TAV, la variable PRESTA_EXTRA_DATA permet d'indiquer puis d'afficher publiquement plus de données concernant les prestataires (e.g. familles de produits)
- en environnement TAV, la variable HOUSEHOLD_BASED_ALLOWANCE permet d'activer un mode de cotisations libres et d'allocations basées sur la composition du foyer
Si vous utilisez Payzen comme moyen de paiement par CB : Si vous utilisez Payzen comme moyen de paiement par CB :
...@@ -84,13 +85,12 @@ Création des tables et des contraintes : ...@@ -84,13 +85,12 @@ Création des tables et des contraintes :
Charger les fixtures standards : Charger les fixtures standards :
Pour une instance non TAV : Pour une instance non SSA :
**$ php bin/console hautelook:fixtures:load --purge-with-truncate --env=pro** **$ php bin/console hautelook:fixtures:load --purge-with-truncate --env=pro**
Pour une instance TAV, ou bien :
Pour une instance TAV :
**$ php bin/console hautelook:fixtures:load --purge-with-truncate --env=tavpro** **$ php bin/console hautelook:fixtures:load --purge-with-truncate --env=tavpro**
ou bien :
**$ php bin/console hautelook:fixtures:load --purge-with-truncate --env=ssagirondepro**
Vous obtiendrez cette erreur ci dessous, c'est normal ! Vous obtiendrez cette erreur ci dessous, c'est normal !
...@@ -99,13 +99,13 @@ There is no main category related to context: rubrique ...@@ -99,13 +99,13 @@ There is no main category related to context: rubrique
**$ php bin/console sonata:media:fix-media-context** **$ php bin/console sonata:media:fix-media-context**
Pour une instance non TAV : Pour une instance non SSA :
**$ php bin/console hautelook:fixtures:load --append --env=pro** **$ php bin/console hautelook:fixtures:load --append --env=pro**
Pour une instance TAV, ou bien :
Pour une instance TAV :
**$ php bin/console hautelook:fixtures:load --append --env=tavpro** **$ php bin/console hautelook:fixtures:load --append --env=tavpro**
ou bien :
**$ php bin/console hautelook:fixtures:load --append --env=ssagirondepro**
Supprimer le cache (si besoin) Supprimer le cache (si besoin)
......
...@@ -295,6 +295,13 @@ form[name="formEncaissement"] label { ...@@ -295,6 +295,13 @@ form[name="formEncaissement"] label {
* END Success check animation. * END Success check animation.
*/ */
#display-balance-text-container {
display: flex;
justify-content: center;
align-items: center;
gap: 10px;
}
#login-password-container { #login-password-container {
position: relative; position: relative;
} }
......
...@@ -492,7 +492,8 @@ $(function() { ...@@ -492,7 +492,8 @@ $(function() {
$("#formEncaissement_payment_code").val(''); $("#formEncaissement_payment_code").val('');
// Set payment summary on validation page // Set payment summary on validation page
$(".payment-recap").text(`${$("#formEncaissement_adherent option:selected").text()}, montant : ${$("#formEncaissement_montant").val()}`); let recap = `${$("#formEncaissement_adherent option:selected").text()}, montant : ${$("#formEncaissement_montant").val()} ${KOH_MLC_NAME_SMALL}`;
$(".payment-recap").text(recap);
} }
/** /**
...@@ -577,7 +578,7 @@ $(function() { ...@@ -577,7 +578,7 @@ $(function() {
/** /**
* Display loader after validating Encaissement form * Display loader after validating Encaissement form
*/ */
$("form[name='formEncaissement']").on("submit", (event) => { $("form[name='formEncaissement']").on("submit", () => {
// non strict equality check // non strict equality check
if (formEncaissementValidation == true) { if (formEncaissementValidation == true) {
$("#formEncaissement_save").parent().append('<span class="spinner-border" role="status" aria-hidden="true"></span>'); $("#formEncaissement_save").parent().append('<span class="spinner-border" role="status" aria-hidden="true"></span>');
...@@ -585,6 +586,10 @@ $(function() { ...@@ -585,6 +586,10 @@ $(function() {
} }
}) })
$("#display-balance-button-no").on("click", () => {
$("#display-balance-text-container").hide();
})
// $('.js-datepicker').datepicker({ // $('.js-datepicker').datepicker({
// closeText: 'Fermer', // closeText: 'Fermer',
// prevText: '&#x3c;Préc', // prevText: '&#x3c;Préc',
......
...@@ -14,3 +14,4 @@ twig: ...@@ -14,3 +14,4 @@ twig:
tav_env: '%env(TAV_ENV)%' tav_env: '%env(TAV_ENV)%'
presta_self_init_and_eval: '%env(PRESTA_SELF_INIT_AND_EVAL)%' presta_self_init_and_eval: '%env(PRESTA_SELF_INIT_AND_EVAL)%'
presta_extra_data: '%env(PRESTA_EXTRA_DATA)%' presta_extra_data: '%env(PRESTA_EXTRA_DATA)%'
household_based_allowance: '%env(HOUSEHOLD_BASED_ALLOWANCE)%'
\ No newline at end of file
...@@ -16,6 +16,8 @@ parameters: ...@@ -16,6 +16,8 @@ parameters:
presta_self_init_and_eval: '%env(PRESTA_SELF_INIT_AND_EVAL)%' presta_self_init_and_eval: '%env(PRESTA_SELF_INIT_AND_EVAL)%'
automatisation_reconversion: '%env(AUTOMATISATION_RECONVERSION)%' automatisation_reconversion: '%env(AUTOMATISATION_RECONVERSION)%'
presta_extra_data: '%env(PRESTA_EXTRA_DATA)%' presta_extra_data: '%env(PRESTA_EXTRA_DATA)%'
household_based_allowance: '%env(HOUSEHOLD_BASED_ALLOWANCE)%'
# PARAMETRES DES IMPORTS POSSIBLE POUR L'APPLICATION DE GESTION DE MONNAIE LOCALE COMPLEMENTAIRE # PARAMETRES DES IMPORTS POSSIBLE POUR L'APPLICATION DE GESTION DE MONNAIE LOCALE COMPLEMENTAIRE
app.import.separator: ';' app.import.separator: ';'
......
# Configuration des données initiales
App\Entity\EtatPrestataire:
etatSuspendu:
enabled: true
name: 'Suspendu'
content: 'Prestataires suspendus pour diverses raisons'
etatRappel:
enabled: true
name: 'Rappel'
content: 'Prestataires à rappeler'
etatAnnule:
enabled: true
name: 'Annulé'
content: 'Prestataires annulé'
etatProspect:
enabled: true
name: 'Prospects'
content: 'Prospects'
App\Entity\TypePrestataire:
typepresta1:
name: 'Prestataire'
typepresta2:
name: 'Partenaire'
App\Entity\Usergroup:
usergroup_adherent:
__construct: ['Adherent', ['ROLE_ADHERENT']]
usergroup_prestataire:
__construct: ['Prestataire', ['ROLE_PRESTATAIRE']]
usergroup_caissier:
__construct: ['Caissier', ['ROLE_CAISSIER']]
usergroup_adminsiege:
__construct: ['Administrateur du Siege', [
'ROLE_ADMIN_SIEGE',
'ROLE_SONATA_USER_ADMIN_USER_ALL',
'ROLE_SONATA_USER_ADMIN_GROUP_ALL',
'ROLE_ADMIN_COMPTOIR_GERER_LIST',
'ROLE_ADMIN_COMPTOIR_GERER_VIEW',
'ROLE_ADMIN_ADHERENT_GERER_ALL',
'ROLE_ADMIN_ALL_COTISATIONS_ALL',
'ROLE_ADMIN_ALL_ACHATSMONNAIE_ALL',
'ROLE_ADMIN_GROUPE_GERER_ALL',
'ROLE_ADMIN_GLOBALPARAMETER_GERER_ALL',
'ROLE_ADMIN_TRANSFERT_GERER_ALL',
'ROLE_ADMIN_ALL_DEMANDE_ACHATSMONNAIE_ALL',
'ROLE_ADMIN_OPERATION_PRESTATAIRE_GERER_LIST',
'ROLE_ADMIN_OPERATION_ADHERENT_GERER_LIST',
'ROLE_ADMIN_OPERATION_COMPTOIR_GERER_LIST',
'ROLE_ADMIN_OPERATION_GROUPE_GERER_LIST',
'ROLE_ADMIN_OPERATION_SIEGE_GERER_LIST',
'ROLE_ADMIN_ADHERENT_COTISATIONS_ALL',
'ROLE_ADMIN_PRESTATAIRE_COTISATIONS_ALL',
'ROLE_ADMIN_ALL_COTISATIONS_ALL',
'ROLE_ADMIN_HELLOASSO_ALL',
'ROLE_ADMIN_DONS_ALL']]
usergroup_redacteur:
__construct: ['Rédacteur', [
'ROLE_REDACTEUR',
'ROLE_SONATA_MEDIA_ADMIN_MEDIA_ALL',
'ROLE_SONATA_MEDIA_ADMIN_GALLERY_ALL',
'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_NEWS_GERER_ALL',
'ROLE_ADMIN_DOCUMENT_GERER_ALL',
'ROLE_ADMIN_RUBRIQUE_GERER_ALL',
'ROLE_ADMIN_FAQ_GERER_ALL',
'ROLE_ADMIN_PAGE_GERER_ALL',
'ROLE_ADMIN_TRADUCTION_GERER_ALL']]
usergroup_controleur:
__construct: ['Contrôleur', [
'ROLE_CONTROLEUR',
'ROLE_ADMIN_TRANSACTION_GERER_LIST',
'ROLE_ADMIN_TRANSACTION_GERER_VIEW',
'ROLE_ADMIN_OPERATION_PRESTATAIRE_GERER_LIST',
'ROLE_ADMIN_OPERATION_ADHERENT_GERER_LIST']]
usergroup_tresorier:
__construct: ['Trésorier', [
'ROLE_TRESORIER',
'ROLE_ADMIN_COMPTOIR_GERER_LIST',
'ROLE_ADMIN_COMPTOIR_GERER_VIEW',
'ROLE_ADMIN_ALL_COTISATIONS_ALL',
'ROLE_ADMIN_ALL_ACHATSMONNAIE_ALL',
'ROLE_ADMIN_RECONVERSION_GERER_ALL',
'ROLE_ADMIN_TRANSFERT_GERER_ALL',
'ROLE_ADMIN_ALL_DEMANDE_ACHATSMONNAIE_ALL',
'ROLE_ADMIN_OPERATION_PRESTATAIRE_GERER_ALL',
'ROLE_ADMIN_OPERATION_ADHERENT_GERER_ALL',
'ROLE_ADMIN_OPERATION_COMPTOIR_GERER_ALL',
'ROLE_ADMIN_OPERATION_GROUPE_GERER_ALL',
'ROLE_ADMIN_OPERATION_SIEGE_GERER_ALL',
'ROLE_ADMIN_HELLOASSO_ALL',
'ROLE_ADMIN_DONS_ALL']]
usergroup_gestiongroupe:
__construct: ['Gestionnaire de Groupe', [
'ROLE_GESTION_GROUPE',
'ROLE_SONATA_USER_ADMIN_USER_ALL',
'ROLE_ADMIN_ADHERENT_GERER_ALL',
'ROLE_ADMIN_ADHERENT_COTISATIONS_ALL',
'ROLE_ADMIN_PRESTATAIRE_GERER_ALL',
'ROLE_ADMIN_PRESTATAIRE_COTISATIONS_ALL',
'ROLE_ADMIN_GROUPE_GERER_EDIT',
'ROLE_ADMIN_GROUPE_GERER_VIEW',
'ROLE_ADMIN_COMPTOIR_GERER_ALL',
'ROLE_ADMIN_GROUPEPRESTA_GERER_ALL',
'ROLE_ADMIN_DOCUMENT_GERER_ALL',
'ROLE_ADMIN_TRANSFERT_GERER_EDIT',
'ROLE_ADMIN_TRANSFERT_GERER_LIST',
'ROLE_ADMIN_TRANSFERT_GERER_CREATE',
'ROLE_ADMIN_TRANSFERT_GERER_EXPORT',
'ROLE_ADMIN_OPERATION_PRESTATAIRE_GERER_LIST',
'ROLE_ADMIN_OPERATION_ADHERENT_GERER_LIST',
'ROLE_ADMIN_OPERATION_COMPTOIR_GERER_LIST']]
usergroup_comptoir:
__construct: ['Comptoir', [
'ROLE_COMPTOIR',
'ROLE_ADMIN_ADHERENT_GERER_EDIT',
'ROLE_ADMIN_ADHERENT_GERER_LIST',
'ROLE_ADMIN_ADHERENT_GERER_CREATE',
'ROLE_ADMIN_ADHERENT_GERER_VIEW',
'ROLE_ADMIN_ADHERENT_COTISATIONS_ALL',
'ROLE_ADMIN_COMPTOIR_GERER_EDIT',
'ROLE_ADMIN_COMPTOIR_GERER_VIEW',
'ROLE_ADMIN_TRANSFERT_GERER_LIST',
'ROLE_ADMIN_TRANSFERT_GERER_CREATE',
'ROLE_ADMIN_TRANSFERT_GERER_VIEW',
'ROLE_ADMIN_PRESTATAIRE_GERER_VIEW',
'ROLE_ADMIN_PRESTATAIRE_COTISATIONS_VIEW',
'ROLE_ADMIN_PRESTATAIRE_GERER_LIST',
'ROLE_ADMIN_PRESTATAIRE_GERER_EDIT',
'ROLE_ADMIN_PRESTATAIRE_COTISATIONS_EDIT',
'ROLE_ADMIN_PRESTATAIRE_COTISATIONS_LIST',
'ROLE_ADMIN_PRESTATAIRE_COTISATIONS_CREATE']]
usergroup_contact:
__construct: ['Contact', [
'ROLE_CONTACT',
'ROLE_ADMIN_ADHERENT_GERER_ALL',
'ROLE_ADMIN_ADHERENT_COTISATIONS_ALL',
'ROLE_ADMIN_PRESTATAIRE_GERER_ALL',
'ROLE_ADMIN_PRESTATAIRE_COTISATIONS_ALL',
'ROLE_ADMIN_COMPTOIR_GERER_ALL',
'ROLE_ADMIN_GROUPEPRESTA_GERER_ALL',
'ROLE_ADMIN_NEWS_GERER_ALL',
'ROLE_ADMIN_DOCUMENT_GERER_ALL',
'ROLE_ADMIN_RUBRIQUE_GERER_ALL']]
usergroup_superadmin:
__construct: ['Super Admin', ['ROLE_SUPER_ADMIN']]
Prodigious\Sonata\MenuBundle\Entity\Menu:
menu_main:
name: 'Main menu'
alias: 'main'
Prodigious\Sonata\MenuBundle\Entity\MenuItem:
menuitem4:
menu: '@menu_main'
name: 'Points de vente'
url: '#'
position: 1
target: 0
enabled: 1
menuitem5:
menu: '@menu_main'
name: 'Carte des prestataires'
parent: '@menuitem4'
url: '/prestataires/carte'
position: 0
target: 0
enabled: 1
menuitem6:
menu: '@menu_main'
name: 'Liste des prestataires'
parent: '@menuitem4'
url: '/prestataires/liste'
position: 1
target: 0
enabled: 1
menuitem7:
menu: '@menu_main'
name: 'Liste des partenaires'
parent: '@menuitem4'
url: '/partenaires/liste'
position: 2
target: 0
enabled: 1
menuitem8:
menu: '@menu_main'
name: 'Rubriques'
parent: '@menuitem4'
url: '/prestataires/rubriques'
position: 3
target: 0
enabled: 1
menuitem9:
menu: '@menu_main'
name: 'Comptoirs des habitants'
url: '#'
position: 2
target: 0
enabled: 1
menuitem10:
menu: '@menu_main'
name: 'Carte des comptoirs'
parent: '@menuitem9'
url: '/comptoirs/carte'
position: 0
target: 0
enabled: 1
menuitem11:
menu: '@menu_main'
name: 'Liste des comptoirs'
parent: '@menuitem9'
url: '/comptoirs/liste'
position: 1
target: 0
enabled: 1
menuitem12:
menu: '@menu_main'
name: 'Carte des amaps'
parent: '@menuitem9'
url: '/groupe/prestataires/amap/carte'
position: 2
target: 0
enabled: 1
menuitem13:
menu: '@menu_main'
name: 'Carte des marchés'
parent: '@menuitem9'
url: '/groupe/prestataires/marche/carte'
position: 3
target: 0
enabled: 1
menuitem14:
menu: '@menu_main'
name: 'Aide'
url: '#'
position: 3
target: 0
enabled: 1
menuitem15:
menu: '@menu_main'
name: 'Foire aux questions'
parent: '@menuitem14'
url: '/faq'
position: 0
target: 0
enabled: 1
menuitem16:
menu: '@menu_main'
name: 'Nous contacter'
parent: '@menuitem14'
url: '/contact'
position: 1
target: 0
enabled: 1
menuitem17:
menu: '@menu_main'
name: 'Actualités'
url: '/news'
position: 4
target: 0
enabled: 1
App\Entity\Subterritory:
subterritory1:
name: "Bordeaux Nord / Bordeaux La Benauge"
subterritory2:
name: "Pays foyen"
subterritory3:
name: "Bègles"
subterritory4:
name: "Sud Gironde / Bazadais"
App\Application\Sonata\MediaBundle\Entity\Media:
media6:
name: 'wosmpl-marker-icon17-produits-de-lagriculture-et-elevage.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: e5d9701e23fcfa5822d7c93092a522f82cf970ad.png
provider_metadata: {"filename":"wosmpl-marker-icon17-produits-de-lagriculture-et-elevage.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 29446
context: 'rubrique'
media7:
name: 'wosmpl-marker-icon3-metier-darts-creation.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: 3b56c41033edbc04176b2bc943716820b8d5859e.png
provider_metadata: {"filename":"wosmpl-marker-icon3-metier-darts-creation.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 38284
context: 'rubrique'
media8:
name: 'wosmpl-marker-icon-commerce-alimentaire.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: 3f7b75fef4df63756fd425d23fe90fce04757011.png
provider_metadata: {"filename":"wosmpl-marker-icon-commerce-alimentaire.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 33137
context: 'rubrique'
media9:
name: 'wosmpl-marker-icon2-restaurant-bar-traiteur.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: 6eaa4bbdf1225932d30c5ae54fb9996658836d7d.png
provider_metadata: {"filename":"wosmpl-marker-icon2-restaurant-bar-traiteur.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 32622
context: 'rubrique'
media10:
name: 'wosmpl-marker-icon4-habillement-mode-accessoires.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: 91f22423eaf61b22e7365250d902efecdce698fc.png
provider_metadata: {"filename":"wosmpl-marker-icon4-habillement-mode-accessoires.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 24911
context: 'rubrique'
media11:
name: 'wosmpl-marker-icon5-higiene-beaute.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: 749a4285560be42315ac3c4c888557eedc76e81d.png
provider_metadata: {"filename":"wosmpl-marker-icon5-higiene-beaute.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 25898
context: 'rubrique'
media12:
name: 'wosmpl-marker-icon6-Papeterie-librairie-presse-édition.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: aab9d557c3f77b9682ee6726c059badd89eb9ed8.png
provider_metadata: {"filename":"wosmpl-marker-icon6-Papeterie-librairie-presse-e\u0301dition.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 37730
context: 'rubrique'
media13:
name: 'wosmpl-marker-icon9-sortie-culturelle.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: 978c0d269d054f0e4f2e88de31eae8d0f0b44bfa.png
provider_metadata: {"filename":"wosmpl-marker-icon9-sortie-culturelle.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 32317
context: 'rubrique'
media14:
name: 'wosmpl-marker-icon11-santé-bien-etre.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: cf4510e313a050931ffae55a7c72651e765e4145.png
provider_metadata: {"filename":"wosmpl-marker-icon11-sante\u0301-bien-etre.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 36273
context: 'rubrique'
media15:
name: 'wosmpl-marker-icon14-Web-multimédia-communication-imprimerie.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: 6286598dea47116e34b4e9635eccf05a3fb9368f.png
provider_metadata: {"filename":"wosmpl-marker-icon14-Web-multime\u0301dia-communication-imprimerie.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 29416
context: 'rubrique'
media16:
name: 'wosmpl-marker-icon15-sport-et-loisirs.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: 1ecae95f3729865d8f249b17146d7aaef9d9b5c3.png
provider_metadata: {"filename":"wosmpl-marker-icon15-sport-et-loisirs.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 43002
context: 'rubrique'
media17:
name: 'wosmpl-marker-icon16-formation-education.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: 72609fa54f78962259708e4e3ff3da37239b224e.png
provider_metadata: {"filename":"wosmpl-marker-icon16-formation-education.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 31656
context: 'rubrique'
media18:
name: 'wosmpl-marker-icon19-immobillier.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: c1a399604ae2599ffbc5701a1d138830d2ececb7.png
provider_metadata: {"filename":"wosmpl-marker-icon19-immobillier.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 28576
context: 'rubrique'
media19:
name: 'wosmpl-marker-icon21-divers.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: 434524af87d1e989f8fd476a838fb6d0243a34f3.png
provider_metadata: {"filename":"wosmpl-marker-icon21-divers.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 25092
context: 'rubrique'
media20:
name: 'wosmpl-marker-icon22-marche-amap.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: 348b65dcd5ed271c94bf28eb353b12c6bf4d45ac.png
provider_metadata: {"filename":"wosmpl-marker-icon22-marche-amap.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 34804
context: 'rubrique'
media21:
name: 'wosmpl-marker-icon23-Artisanat-constructions-réparations.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: fc1af9dfa9da71e26464879365203a7d9158bc90.png
provider_metadata: {"filename":"wosmpl-marker-icon23-Artisanat-constructions-re\u0301parations.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 25215
context: 'rubrique'
media22:
name: 'wosmpl-marker-icon20-service-a-la-personne.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: b48e9ed9bf500aabfca8cd70445d2b9274587dfe.png
provider_metadata: {"filename":"wosmpl-marker-icon20-service-a-la-personne.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 34234
context: 'rubrique'
media23:
name: 'wosmpl-marker-icon7-decoration-ameublement-bricolage-jardin.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: e1ea5c5d2a395a0d947ed736a3289fea3fdb821b.png
provider_metadata: {"filename":"wosmpl-marker-icon7-decoration-ameublement-bricolage-jardin.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 39650
context: 'rubrique'
media24:
name: 'wosmpl-marker-icon8-Commerces-divers.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: 3433854a2e8d5bf720db32631533afe54600ec87.png
provider_metadata: {"filename":"wosmpl-marker-icon8-Commerces-divers.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 35621
context: 'rubrique'
media25:
name: 'wosmpl-marker-icon10-Informatique-Electronique.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: 7a313aa2622f4db659d526e76b24322f64c4f910.png
provider_metadata: {"filename":"wosmpl-marker-icon10-Informatique-Electronique.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 25964
context: 'rubrique'
media26:
name: 'wosmpl-marker-icon13-transports-livraison.png'
enabled: true
provider_name: 'sonata.media.provider.image'
provider_status: true
provider_reference: ca83dd7189873cf07639668b48e4d6e940745dda.png
provider_metadata: {"filename":"wosmpl-marker-icon13-transports-livraison.png"}
width: 512
height: 512
content_type: 'image/png'
content_size: 31625
context: 'rubrique'
App\Entity\Rubrique:
rubrique1:
name: "Produit de l'agriculture et élevage"
content: ""
enabled: true
media: '@media6'
rubrique2:
name: "Sports et loisirs"
content: ""
enabled: true
media: '@media16'
rubrique3:
name: "Commerce alimentaire"
content: ""
enabled: true
media: '@media8'
rubrique4:
name: "Restaurant, bar, traiteur"
content: ""
enabled: true
media: '@media9'
rubrique5:
name: "Commerces divers"
content: ""
enabled: true
media: '@media24'
rubrique6:
name: "Métiers d'art, créations"
content: ""
enabled: true
media: '@media7'
rubrique7:
name: "Habillement, mode, accessoires"
content: ""
enabled: true
media: '@media10'
rubrique8:
name: "Papeterie, librairie, presse, édition"
content: ""
enabled: true
media: '@media12'
rubrique9:
name: "Marchés, AMAP"
content: ""
enabled: true
media: '@media20'
rubrique10:
name: "Web, multimédia, communication, imprimerie"
content: ""
enabled: true
media: '@media15'
rubrique11:
name: "Sorties culturelles"
content: ""
enabled: true
media: '@media13'
rubrique12:
name: "Informatique, Electronique"
content: ""
enabled: true
media: '@media25'
rubrique13:
name: "Décoration, ameublement, bricolage, jardin"
content: ""
enabled: true
media: '@media23'
rubrique14:
name: "Artisanat, constructions, réparations"
content: ""
enabled: true
media: '@media21'
rubrique15:
name: "Transports, Livraisons"
content: ""
enabled: true
media: '@media26'
rubrique16:
name: "Divers"
content: ""
enabled: true
media: '@media19'
rubrique17:
name: "Hygiène, beauté"
content: ""
enabled: true
media: '@media11'
rubrique18:
name: "Santé, bien-être"
content: ""
enabled: true
media: '@media14'
rubrique19:
name: "Immobilier"
content: ""
enabled: true
media: '@media18'
rubrique20:
name: "Services à la personne"
content: ""
enabled: true
media: '@media22'
rubrique21:
name: "Formation, éducation"
content: ""
enabled: true
media: '@media17'
\ No newline at end of file
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.
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -3,10 +3,10 @@ ...@@ -3,10 +3,10 @@
"app": { "app": {
"js": [ "js": [
"/build/runtime.6ad5c9da.js", "/build/runtime.6ad5c9da.js",
"/build/app.94b71822.js" "/build/app.a926d504.js"
], ],
"css": [ "css": [
"/build/app.c40ef51c.css" "/build/app.6350a995.css"
] ]
}, },
"admin": { "admin": {
......
{ {
"build/app.css": "/build/app.c40ef51c.css", "build/app.css": "/build/app.6350a995.css",
"build/app.js": "/build/app.94b71822.js", "build/app.js": "/build/app.a926d504.js",
"build/admin.css": "/build/admin.4de55830.css", "build/admin.css": "/build/admin.4de55830.css",
"build/admin.js": "/build/admin.86a2d986.js", "build/admin.js": "/build/admin.86a2d986.js",
"build/runtime.js": "/build/runtime.6ad5c9da.js", "build/runtime.js": "/build/runtime.6ad5c9da.js",
......
(()=>{"use strict";var e={913:()=>{try{self["workbox:core:6.5.1"]&&_()}catch(e){}},977:()=>{try{self["workbox:precaching:6.5.1"]&&_()}catch(e){}},80:()=>{try{self["workbox:routing:6.5.1"]&&_()}catch(e){}},873:()=>{try{self["workbox:strategies:6.5.1"]&&_()}catch(e){}}},t={};function s(a){var n=t[a];if(void 0!==n)return n.exports;var r=t[a]={exports:{}};return e[a](r,r.exports,s),r.exports}(()=>{s(913);const e=(e,...t)=>{let s=e;return t.length>0&&(s+=` :: ${JSON.stringify(t)}`),s};class t extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}const a={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},n=e=>[a.prefix,e,a.suffix].filter((e=>e&&e.length>0)).join("-"),r=e=>e||n(a.precache),i=e=>e||n(a.runtime);function c(e,t){const s=t();return e.waitUntil(s),s}s(977);function o(e){if(!e)throw new t("add-to-cache-list-unexpected-type",{entry:e});if("string"==typeof e){const t=new URL(e,location.href);return{cacheKey:t.href,url:t.href}}const{revision:s,url:a}=e;if(!a)throw new t("add-to-cache-list-unexpected-type",{entry:e});if(!s){const e=new URL(a,location.href);return{cacheKey:e.href,url:e.href}}const n=new URL(a,location.href),r=new URL(a,location.href);return n.searchParams.set("__WB_REVISION__",s),{cacheKey:n.href,url:r.href}}class h{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)},this.cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:s})=>{if("install"===e.type&&t&&t.originalRequest&&t.originalRequest instanceof Request){const e=t.originalRequest.url;s?this.notUpdatedURLs.push(e):this.updatedURLs.push(e)}return s}}}class l{constructor({precacheController:e}){this.cacheKeyWillBeUsed=async({request:e,params:t})=>{const s=(null==t?void 0:t.cacheKey)||this._precacheController.getCacheKeyForURL(e.url);return s?new Request(s,{headers:e.headers}):e},this._precacheController=e}}let u;async function f(e,s){let a=null;if(e.url){a=new URL(e.url).origin}if(a!==self.location.origin)throw new t("cross-origin-copy-response",{origin:a});const n=e.clone(),r={headers:new Headers(n.headers),status:n.status,statusText:n.statusText},i=s?s(r):r,c=function(){if(void 0===u){const e=new Response("");if("body"in e)try{new Response(e.body),u=!0}catch(e){u=!1}u=!1}return u}()?n.body:await n.blob();return new Response(c,i)}function d(e,t){const s=new URL(e);for(const e of t)s.searchParams.delete(e);return s.href}class p{constructor(){this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}}const g=new Set;s(873);function y(e){return"string"==typeof e?new Request(e):e}class w{constructor(e,t){this._cacheKeys={},Object.assign(this,t),this.event=t.event,this._strategy=e,this._handlerDeferred=new p,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(const e of this._plugins)this._pluginStateMap.set(e,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){const{event:s}=this;let a=y(e);if("navigate"===a.mode&&s instanceof FetchEvent&&s.preloadResponse){const e=await s.preloadResponse;if(e)return e}const n=this.hasCallback("fetchDidFail")?a.clone():null;try{for(const e of this.iterateCallbacks("requestWillFetch"))a=await e({request:a.clone(),event:s})}catch(e){if(e instanceof Error)throw new t("plugin-error-request-will-fetch",{thrownErrorMessage:e.message})}const r=a.clone();try{let e;e=await fetch(a,"navigate"===a.mode?void 0:this._strategy.fetchOptions);for(const t of this.iterateCallbacks("fetchDidSucceed"))e=await t({event:s,request:r,response:e});return e}catch(e){throw n&&await this.runCallbacks("fetchDidFail",{error:e,event:s,originalRequest:n.clone(),request:r.clone()}),e}}async fetchAndCachePut(e){const t=await this.fetch(e),s=t.clone();return this.waitUntil(this.cachePut(e,s)),t}async cacheMatch(e){const t=y(e);let s;const{cacheName:a,matchOptions:n}=this._strategy,r=await this.getCacheKey(t,"read"),i=Object.assign(Object.assign({},n),{cacheName:a});s=await caches.match(r,i);for(const e of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await e({cacheName:a,matchOptions:n,cachedResponse:s,request:r,event:this.event})||void 0;return s}async cachePut(e,s){const a=y(e);var n;await(n=0,new Promise((e=>setTimeout(e,n))));const r=await this.getCacheKey(a,"write");if(!s)throw new t("cache-put-with-no-response",{url:(i=r.url,new URL(String(i),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var i;const c=await this._ensureResponseSafeToCache(s);if(!c)return!1;const{cacheName:o,matchOptions:h}=this._strategy,l=await self.caches.open(o),u=this.hasCallback("cacheDidUpdate"),f=u?await async function(e,t,s,a){const n=d(t.url,s);if(t.url===n)return e.match(t,a);const r=Object.assign(Object.assign({},a),{ignoreSearch:!0}),i=await e.keys(t,r);for(const t of i)if(n===d(t.url,s))return e.match(t,a)}(l,r.clone(),["__WB_REVISION__"],h):null;try{await l.put(r,u?c.clone():c)}catch(e){if(e instanceof Error)throw"QuotaExceededError"===e.name&&await async function(){for(const e of g)await e()}(),e}for(const e of this.iterateCallbacks("cacheDidUpdate"))await e({cacheName:o,oldResponse:f,newResponse:c.clone(),request:r,event:this.event});return!0}async getCacheKey(e,t){const s=`${e.url} | ${t}`;if(!this._cacheKeys[s]){let a=e;for(const e of this.iterateCallbacks("cacheKeyWillBeUsed"))a=y(await e({mode:t,request:a,event:this.event,params:this.params}));this._cacheKeys[s]=a}return this._cacheKeys[s]}hasCallback(e){for(const t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(const s of this.iterateCallbacks(e))await s(t)}*iterateCallbacks(e){for(const t of this._strategy.plugins)if("function"==typeof t[e]){const s=this._pluginStateMap.get(t),a=a=>{const n=Object.assign(Object.assign({},a),{state:s});return t[e](n)};yield a}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){let e;for(;e=this._extendLifetimePromises.shift();)await e}destroy(){this._handlerDeferred.resolve(null)}async _ensureResponseSafeToCache(e){let t=e,s=!1;for(const e of this.iterateCallbacks("cacheWillUpdate"))if(t=await e({request:this.request,response:t,event:this.event})||void 0,s=!0,!t)break;return s||t&&200!==t.status&&(t=void 0),t}}class m extends class{constructor(e={}){this.cacheName=i(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){const[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});const t=e.event,s="string"==typeof e.request?new Request(e.request):e.request,a="params"in e?e.params:void 0,n=new w(this,{event:t,request:s,params:a}),r=this._getResponse(n,s,t);return[r,this._awaitComplete(r,n,s,t)]}async _getResponse(e,s,a){let n;await e.runCallbacks("handlerWillStart",{event:a,request:s});try{if(n=await this._handle(s,e),!n||"error"===n.type)throw new t("no-response",{url:s.url})}catch(t){if(t instanceof Error)for(const r of e.iterateCallbacks("handlerDidError"))if(n=await r({error:t,event:a,request:s}),n)break;if(!n)throw t}for(const t of e.iterateCallbacks("handlerWillRespond"))n=await t({event:a,request:s,response:n});return n}async _awaitComplete(e,t,s,a){let n,r;try{n=await e}catch(r){}try{await t.runCallbacks("handlerDidRespond",{event:a,request:s,response:n}),await t.doneWaiting()}catch(e){e instanceof Error&&(r=e)}if(await t.runCallbacks("handlerDidComplete",{event:a,request:s,response:n,error:r}),t.destroy(),r)throw r}}{constructor(e={}){e.cacheName=r(e.cacheName),super(e),this._fallbackToNetwork=!1!==e.fallbackToNetwork,this.plugins.push(m.copyRedirectedCacheableResponsesPlugin)}async _handle(e,t){const s=await t.cacheMatch(e);return s||(t.event&&"install"===t.event.type?await this._handleInstall(e,t):await this._handleFetch(e,t))}async _handleFetch(e,s){let a;const n=s.params||{};if(!this._fallbackToNetwork)throw new t("missing-precache-entry",{cacheName:this.cacheName,url:e.url});{0;const t=n.integrity,r=e.integrity,i=!r||r===t;if(a=await s.fetch(new Request(e,{integrity:r||t})),t&&i){this._useDefaultCacheabilityPluginIfNeeded();await s.cachePut(e,a.clone());0}}return a}async _handleInstall(e,s){this._useDefaultCacheabilityPluginIfNeeded();const a=await s.fetch(e);if(!await s.cachePut(e,a.clone()))throw new t("bad-precaching-response",{url:e.url,status:a.status});return a}_useDefaultCacheabilityPluginIfNeeded(){let e=null,t=0;for(const[s,a]of this.plugins.entries())a!==m.copyRedirectedCacheableResponsesPlugin&&(a===m.defaultPrecacheCacheabilityPlugin&&(e=s),a.cacheWillUpdate&&t++);0===t?this.plugins.push(m.defaultPrecacheCacheabilityPlugin):t>1&&null!==e&&this.plugins.splice(e,1)}}m.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:e})=>!e||e.status>=400?null:e},m.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:e})=>e.redirected?await f(e):e};class _{constructor({cacheName:e,plugins:t=[],fallbackToNetwork:s=!0}={}){this._urlsToCacheKeys=new Map,this._urlsToCacheModes=new Map,this._cacheKeysToIntegrities=new Map,this._strategy=new m({cacheName:r(e),plugins:[...t,new l({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this._strategy}precache(e){this.addToCacheList(e),this._installAndActiveListenersAdded||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this._installAndActiveListenersAdded=!0)}addToCacheList(e){const s=[];for(const a of e){"string"==typeof a?s.push(a):a&&void 0===a.revision&&s.push(a.url);const{cacheKey:e,url:n}=o(a),r="string"!=typeof a&&a.revision?"reload":"default";if(this._urlsToCacheKeys.has(n)&&this._urlsToCacheKeys.get(n)!==e)throw new t("add-to-cache-list-conflicting-entries",{firstEntry:this._urlsToCacheKeys.get(n),secondEntry:e});if("string"!=typeof a&&a.integrity){if(this._cacheKeysToIntegrities.has(e)&&this._cacheKeysToIntegrities.get(e)!==a.integrity)throw new t("add-to-cache-list-conflicting-integrities",{url:n});this._cacheKeysToIntegrities.set(e,a.integrity)}if(this._urlsToCacheKeys.set(n,e),this._urlsToCacheModes.set(n,r),s.length>0){const e=`Workbox is precaching URLs without revision info: ${s.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(e)}}}install(e){return c(e,(async()=>{const t=new h;this.strategy.plugins.push(t);for(const[t,s]of this._urlsToCacheKeys){const a=this._cacheKeysToIntegrities.get(s),n=this._urlsToCacheModes.get(t),r=new Request(t,{integrity:a,cache:n,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:r,event:e}))}const{updatedURLs:s,notUpdatedURLs:a}=t;return{updatedURLs:s,notUpdatedURLs:a}}))}activate(e){return c(e,(async()=>{const e=await self.caches.open(this.strategy.cacheName),t=await e.keys(),s=new Set(this._urlsToCacheKeys.values()),a=[];for(const n of t)s.has(n.url)||(await e.delete(n),a.push(n.url));return{deletedURLs:a}}))}getURLsToCacheKeys(){return this._urlsToCacheKeys}getCachedURLs(){return[...this._urlsToCacheKeys.keys()]}getCacheKeyForURL(e){const t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForCacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){const t=e instanceof Request?e.url:e,s=this.getCacheKeyForURL(t);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(e){const s=this.getCacheKeyForURL(e);if(!s)throw new t("non-precached-url",{url:e});return t=>(t.request=new Request(e),t.params=Object.assign({cacheKey:s},t.params),this.strategy.handle(t))}}let R;const v=()=>(R||(R=new _),R);s(80);const C=e=>e&&"object"==typeof e?e:{handle:e};class b{constructor(e,t,s="GET"){this.handler=C(t),this.match=e,this.method=s}setCatchHandler(e){this.catchHandler=C(e)}}class q extends b{constructor(e,t,s){super((({url:t})=>{const s=e.exec(t.href);if(s&&(t.origin===location.origin||0===s.index))return s.slice(1)}),t,s)}}class U{constructor(){this._routes=new Map,this._defaultHandlerMap=new Map}get routes(){return this._routes}addFetchListener(){self.addEventListener("fetch",(e=>{const{request:t}=e,s=this.handleRequest({request:t,event:e});s&&e.respondWith(s)}))}addCacheListener(){self.addEventListener("message",(e=>{if(e.data&&"CACHE_URLS"===e.data.type){const{payload:t}=e.data;0;const s=Promise.all(t.urlsToCache.map((t=>{"string"==typeof t&&(t=[t]);const s=new Request(...t);return this.handleRequest({request:s,event:e})})));e.waitUntil(s),e.ports&&e.ports[0]&&s.then((()=>e.ports[0].postMessage(!0)))}}))}handleRequest({request:e,event:t}){const s=new URL(e.url,location.href);if(!s.protocol.startsWith("http"))return void 0;const a=s.origin===location.origin,{params:n,route:r}=this.findMatchingRoute({event:t,request:e,sameOrigin:a,url:s});let i=r&&r.handler;const c=e.method;if(!i&&this._defaultHandlerMap.has(c)&&(i=this._defaultHandlerMap.get(c)),!i)return void 0;let o;try{o=i.handle({url:s,request:e,event:t,params:n})}catch(e){o=Promise.reject(e)}const h=r&&r.catchHandler;return o instanceof Promise&&(this._catchHandler||h)&&(o=o.catch((async a=>{if(h){0;try{return await h.handle({url:s,request:e,event:t,params:n})}catch(e){e instanceof Error&&(a=e)}}if(this._catchHandler)return this._catchHandler.handle({url:s,request:e,event:t});throw a}))),o}findMatchingRoute({url:e,sameOrigin:t,request:s,event:a}){const n=this._routes.get(s.method)||[];for(const r of n){let n;const i=r.match({url:e,sameOrigin:t,request:s,event:a});if(i)return n=i,(Array.isArray(n)&&0===n.length||i.constructor===Object&&0===Object.keys(i).length||"boolean"==typeof i)&&(n=void 0),{route:r,params:n}}return{}}setDefaultHandler(e,t="GET"){this._defaultHandlerMap.set(t,C(e))}setCatchHandler(e){this._catchHandler=C(e)}registerRoute(e){this._routes.has(e.method)||this._routes.set(e.method,[]),this._routes.get(e.method).push(e)}unregisterRoute(e){if(!this._routes.has(e.method))throw new t("unregister-route-but-not-found-with-method",{method:e.method});const s=this._routes.get(e.method).indexOf(e);if(!(s>-1))throw new t("unregister-route-route-not-registered");this._routes.get(e.method).splice(s,1)}}let L;class k extends b{constructor(e,t){super((({request:s})=>{const a=e.getURLsToCacheKeys();for(const n of function*(e,{ignoreURLParametersMatching:t=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:a=!0,urlManipulation:n}={}){const r=new URL(e,location.href);r.hash="",yield r.href;const i=function(e,t=[]){for(const s of[...e.searchParams.keys()])t.some((e=>e.test(s)))&&e.searchParams.delete(s);return e}(r,t);if(yield i.href,s&&i.pathname.endsWith("/")){const e=new URL(i.href);e.pathname+=s,yield e.href}if(a){const e=new URL(i.href);e.pathname+=".html",yield e.href}if(n){const e=n({url:r});for(const t of e)yield t.href}}(s.url,t)){const t=a.get(n);if(t){return{cacheKey:t,integrity:e.getIntegrityForCacheKey(t)}}}}),e.strategy)}}function K(e){const s=v();!function(e,s,a){let n;if("string"==typeof e){const t=new URL(e,location.href);n=new b((({url:e})=>e.href===t.href),s,a)}else if(e instanceof RegExp)n=new q(e,s,a);else if("function"==typeof e)n=new b(e,s,a);else{if(!(e instanceof b))throw new t("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});n=e}(L||(L=new U,L.addFetchListener(),L.addCacheListener()),L).registerRoute(n)}(new k(s,e))}var T;(function(e){v().precache(e)})([{'revision':null,'url':'/build/admin.4de55830.css'},{'revision':null,'url':'/build/admin.86a2d986.js'},{'revision':'ad79405d542b397996a3079203114b42','url':'/build/admin.86a2d986.js.LICENSE.txt'},{'revision':null,'url':'/build/app.94b71822.js'},{'revision':'4ff7361e3c3e359ae88c5fae5738746d','url':'/build/app.94b71822.js.LICENSE.txt'},{'revision':null,'url':'/build/app.c40ef51c.css'},{'revision':null,'url':'/build/fonts/fa-brands-400.3dc44d22.woff2'},{'revision':null,'url':'/build/fonts/fa-regular-400.3dc6ca01.woff2'},{'revision':null,'url':'/build/fonts/fa-solid-900.496d5fc1.woff2'},{'revision':null,'url':'/build/fonts/source-sans-pro-v14-latin-300.d2c7d5c5.woff2'},{'revision':null,'url':'/build/fonts/source-sans-pro-v14-latin-600.17c0392c.woff2'},{'revision':null,'url':'/build/fonts/source-sans-pro-v14-latin-600italic.cc34c6e7.woff2'},{'revision':null,'url':'/build/fonts/source-sans-pro-v14-latin-700.ed37bc60.woff2'},{'revision':null,'url':'/build/fonts/source-sans-pro-v14-latin-900.476756cd.woff2'},{'revision':null,'url':'/build/fonts/source-sans-pro-v14-latin-italic.a07cb9c5.woff2'},{'revision':null,'url':'/build/fonts/source-sans-pro-v14-latin-regular.f74389bd.woff2'},{'revision':null,'url':'/build/images/fa-brands-400.05d20183.svg'},{'revision':null,'url':'/build/images/fa-regular-400.9a0810d6.svg'},{'revision':null,'url':'/build/images/fa-solid-900.a838c42a.svg'},{'revision':null,'url':'/build/images/source-sans-pro-v14-latin-300.4e7fe004.svg'},{'revision':null,'url':'/build/images/source-sans-pro-v14-latin-600.cf2758ae.svg'},{'revision':null,'url':'/build/images/source-sans-pro-v14-latin-600italic.7249d863.svg'},{'revision':null,'url':'/build/images/source-sans-pro-v14-latin-700.3e4b9e19.svg'},{'revision':null,'url':'/build/images/source-sans-pro-v14-latin-900.060d8c51.svg'},{'revision':null,'url':'/build/images/source-sans-pro-v14-latin-italic.08dc9b1c.svg'},{'revision':null,'url':'/build/images/source-sans-pro-v14-latin-regular.3bb9538c.svg'},{'revision':null,'url':'/build/runtime.6ad5c9da.js'}]),K(T),self.addEventListener("fetch",(function(e){e.respondWith(caches.match(e.request).then((function(t){return t||fetch(e.request)})).catch((function(){return caches.match("/offline.html")})))}))})()})(); (()=>{"use strict";var e={913:()=>{try{self["workbox:core:6.5.1"]&&_()}catch(e){}},977:()=>{try{self["workbox:precaching:6.5.1"]&&_()}catch(e){}},80:()=>{try{self["workbox:routing:6.5.1"]&&_()}catch(e){}},873:()=>{try{self["workbox:strategies:6.5.1"]&&_()}catch(e){}}},t={};function s(a){var n=t[a];if(void 0!==n)return n.exports;var r=t[a]={exports:{}};return e[a](r,r.exports,s),r.exports}(()=>{s(913);const e=(e,...t)=>{let s=e;return t.length>0&&(s+=` :: ${JSON.stringify(t)}`),s};class t extends Error{constructor(t,s){super(e(t,s)),this.name=t,this.details=s}}const a={googleAnalytics:"googleAnalytics",precache:"precache-v2",prefix:"workbox",runtime:"runtime",suffix:"undefined"!=typeof registration?registration.scope:""},n=e=>[a.prefix,e,a.suffix].filter((e=>e&&e.length>0)).join("-"),r=e=>e||n(a.precache),i=e=>e||n(a.runtime);function c(e,t){const s=t();return e.waitUntil(s),s}s(977);function o(e){if(!e)throw new t("add-to-cache-list-unexpected-type",{entry:e});if("string"==typeof e){const t=new URL(e,location.href);return{cacheKey:t.href,url:t.href}}const{revision:s,url:a}=e;if(!a)throw new t("add-to-cache-list-unexpected-type",{entry:e});if(!s){const e=new URL(a,location.href);return{cacheKey:e.href,url:e.href}}const n=new URL(a,location.href),r=new URL(a,location.href);return n.searchParams.set("__WB_REVISION__",s),{cacheKey:n.href,url:r.href}}class h{constructor(){this.updatedURLs=[],this.notUpdatedURLs=[],this.handlerWillStart=async({request:e,state:t})=>{t&&(t.originalRequest=e)},this.cachedResponseWillBeUsed=async({event:e,state:t,cachedResponse:s})=>{if("install"===e.type&&t&&t.originalRequest&&t.originalRequest instanceof Request){const e=t.originalRequest.url;s?this.notUpdatedURLs.push(e):this.updatedURLs.push(e)}return s}}}class l{constructor({precacheController:e}){this.cacheKeyWillBeUsed=async({request:e,params:t})=>{const s=(null==t?void 0:t.cacheKey)||this._precacheController.getCacheKeyForURL(e.url);return s?new Request(s,{headers:e.headers}):e},this._precacheController=e}}let u;async function f(e,s){let a=null;if(e.url){a=new URL(e.url).origin}if(a!==self.location.origin)throw new t("cross-origin-copy-response",{origin:a});const n=e.clone(),r={headers:new Headers(n.headers),status:n.status,statusText:n.statusText},i=s?s(r):r,c=function(){if(void 0===u){const e=new Response("");if("body"in e)try{new Response(e.body),u=!0}catch(e){u=!1}u=!1}return u}()?n.body:await n.blob();return new Response(c,i)}function d(e,t){const s=new URL(e);for(const e of t)s.searchParams.delete(e);return s.href}class p{constructor(){this.promise=new Promise(((e,t)=>{this.resolve=e,this.reject=t}))}}const g=new Set;s(873);function y(e){return"string"==typeof e?new Request(e):e}class w{constructor(e,t){this._cacheKeys={},Object.assign(this,t),this.event=t.event,this._strategy=e,this._handlerDeferred=new p,this._extendLifetimePromises=[],this._plugins=[...e.plugins],this._pluginStateMap=new Map;for(const e of this._plugins)this._pluginStateMap.set(e,{});this.event.waitUntil(this._handlerDeferred.promise)}async fetch(e){const{event:s}=this;let a=y(e);if("navigate"===a.mode&&s instanceof FetchEvent&&s.preloadResponse){const e=await s.preloadResponse;if(e)return e}const n=this.hasCallback("fetchDidFail")?a.clone():null;try{for(const e of this.iterateCallbacks("requestWillFetch"))a=await e({request:a.clone(),event:s})}catch(e){if(e instanceof Error)throw new t("plugin-error-request-will-fetch",{thrownErrorMessage:e.message})}const r=a.clone();try{let e;e=await fetch(a,"navigate"===a.mode?void 0:this._strategy.fetchOptions);for(const t of this.iterateCallbacks("fetchDidSucceed"))e=await t({event:s,request:r,response:e});return e}catch(e){throw n&&await this.runCallbacks("fetchDidFail",{error:e,event:s,originalRequest:n.clone(),request:r.clone()}),e}}async fetchAndCachePut(e){const t=await this.fetch(e),s=t.clone();return this.waitUntil(this.cachePut(e,s)),t}async cacheMatch(e){const t=y(e);let s;const{cacheName:a,matchOptions:n}=this._strategy,r=await this.getCacheKey(t,"read"),i=Object.assign(Object.assign({},n),{cacheName:a});s=await caches.match(r,i);for(const e of this.iterateCallbacks("cachedResponseWillBeUsed"))s=await e({cacheName:a,matchOptions:n,cachedResponse:s,request:r,event:this.event})||void 0;return s}async cachePut(e,s){const a=y(e);var n;await(n=0,new Promise((e=>setTimeout(e,n))));const r=await this.getCacheKey(a,"write");if(!s)throw new t("cache-put-with-no-response",{url:(i=r.url,new URL(String(i),location.href).href.replace(new RegExp(`^${location.origin}`),""))});var i;const c=await this._ensureResponseSafeToCache(s);if(!c)return!1;const{cacheName:o,matchOptions:h}=this._strategy,l=await self.caches.open(o),u=this.hasCallback("cacheDidUpdate"),f=u?await async function(e,t,s,a){const n=d(t.url,s);if(t.url===n)return e.match(t,a);const r=Object.assign(Object.assign({},a),{ignoreSearch:!0}),i=await e.keys(t,r);for(const t of i)if(n===d(t.url,s))return e.match(t,a)}(l,r.clone(),["__WB_REVISION__"],h):null;try{await l.put(r,u?c.clone():c)}catch(e){if(e instanceof Error)throw"QuotaExceededError"===e.name&&await async function(){for(const e of g)await e()}(),e}for(const e of this.iterateCallbacks("cacheDidUpdate"))await e({cacheName:o,oldResponse:f,newResponse:c.clone(),request:r,event:this.event});return!0}async getCacheKey(e,t){const s=`${e.url} | ${t}`;if(!this._cacheKeys[s]){let a=e;for(const e of this.iterateCallbacks("cacheKeyWillBeUsed"))a=y(await e({mode:t,request:a,event:this.event,params:this.params}));this._cacheKeys[s]=a}return this._cacheKeys[s]}hasCallback(e){for(const t of this._strategy.plugins)if(e in t)return!0;return!1}async runCallbacks(e,t){for(const s of this.iterateCallbacks(e))await s(t)}*iterateCallbacks(e){for(const t of this._strategy.plugins)if("function"==typeof t[e]){const s=this._pluginStateMap.get(t),a=a=>{const n=Object.assign(Object.assign({},a),{state:s});return t[e](n)};yield a}}waitUntil(e){return this._extendLifetimePromises.push(e),e}async doneWaiting(){let e;for(;e=this._extendLifetimePromises.shift();)await e}destroy(){this._handlerDeferred.resolve(null)}async _ensureResponseSafeToCache(e){let t=e,s=!1;for(const e of this.iterateCallbacks("cacheWillUpdate"))if(t=await e({request:this.request,response:t,event:this.event})||void 0,s=!0,!t)break;return s||t&&200!==t.status&&(t=void 0),t}}class m extends class{constructor(e={}){this.cacheName=i(e.cacheName),this.plugins=e.plugins||[],this.fetchOptions=e.fetchOptions,this.matchOptions=e.matchOptions}handle(e){const[t]=this.handleAll(e);return t}handleAll(e){e instanceof FetchEvent&&(e={event:e,request:e.request});const t=e.event,s="string"==typeof e.request?new Request(e.request):e.request,a="params"in e?e.params:void 0,n=new w(this,{event:t,request:s,params:a}),r=this._getResponse(n,s,t);return[r,this._awaitComplete(r,n,s,t)]}async _getResponse(e,s,a){let n;await e.runCallbacks("handlerWillStart",{event:a,request:s});try{if(n=await this._handle(s,e),!n||"error"===n.type)throw new t("no-response",{url:s.url})}catch(t){if(t instanceof Error)for(const r of e.iterateCallbacks("handlerDidError"))if(n=await r({error:t,event:a,request:s}),n)break;if(!n)throw t}for(const t of e.iterateCallbacks("handlerWillRespond"))n=await t({event:a,request:s,response:n});return n}async _awaitComplete(e,t,s,a){let n,r;try{n=await e}catch(r){}try{await t.runCallbacks("handlerDidRespond",{event:a,request:s,response:n}),await t.doneWaiting()}catch(e){e instanceof Error&&(r=e)}if(await t.runCallbacks("handlerDidComplete",{event:a,request:s,response:n,error:r}),t.destroy(),r)throw r}}{constructor(e={}){e.cacheName=r(e.cacheName),super(e),this._fallbackToNetwork=!1!==e.fallbackToNetwork,this.plugins.push(m.copyRedirectedCacheableResponsesPlugin)}async _handle(e,t){const s=await t.cacheMatch(e);return s||(t.event&&"install"===t.event.type?await this._handleInstall(e,t):await this._handleFetch(e,t))}async _handleFetch(e,s){let a;const n=s.params||{};if(!this._fallbackToNetwork)throw new t("missing-precache-entry",{cacheName:this.cacheName,url:e.url});{0;const t=n.integrity,r=e.integrity,i=!r||r===t;if(a=await s.fetch(new Request(e,{integrity:r||t})),t&&i){this._useDefaultCacheabilityPluginIfNeeded();await s.cachePut(e,a.clone());0}}return a}async _handleInstall(e,s){this._useDefaultCacheabilityPluginIfNeeded();const a=await s.fetch(e);if(!await s.cachePut(e,a.clone()))throw new t("bad-precaching-response",{url:e.url,status:a.status});return a}_useDefaultCacheabilityPluginIfNeeded(){let e=null,t=0;for(const[s,a]of this.plugins.entries())a!==m.copyRedirectedCacheableResponsesPlugin&&(a===m.defaultPrecacheCacheabilityPlugin&&(e=s),a.cacheWillUpdate&&t++);0===t?this.plugins.push(m.defaultPrecacheCacheabilityPlugin):t>1&&null!==e&&this.plugins.splice(e,1)}}m.defaultPrecacheCacheabilityPlugin={cacheWillUpdate:async({response:e})=>!e||e.status>=400?null:e},m.copyRedirectedCacheableResponsesPlugin={cacheWillUpdate:async({response:e})=>e.redirected?await f(e):e};class _{constructor({cacheName:e,plugins:t=[],fallbackToNetwork:s=!0}={}){this._urlsToCacheKeys=new Map,this._urlsToCacheModes=new Map,this._cacheKeysToIntegrities=new Map,this._strategy=new m({cacheName:r(e),plugins:[...t,new l({precacheController:this})],fallbackToNetwork:s}),this.install=this.install.bind(this),this.activate=this.activate.bind(this)}get strategy(){return this._strategy}precache(e){this.addToCacheList(e),this._installAndActiveListenersAdded||(self.addEventListener("install",this.install),self.addEventListener("activate",this.activate),this._installAndActiveListenersAdded=!0)}addToCacheList(e){const s=[];for(const a of e){"string"==typeof a?s.push(a):a&&void 0===a.revision&&s.push(a.url);const{cacheKey:e,url:n}=o(a),r="string"!=typeof a&&a.revision?"reload":"default";if(this._urlsToCacheKeys.has(n)&&this._urlsToCacheKeys.get(n)!==e)throw new t("add-to-cache-list-conflicting-entries",{firstEntry:this._urlsToCacheKeys.get(n),secondEntry:e});if("string"!=typeof a&&a.integrity){if(this._cacheKeysToIntegrities.has(e)&&this._cacheKeysToIntegrities.get(e)!==a.integrity)throw new t("add-to-cache-list-conflicting-integrities",{url:n});this._cacheKeysToIntegrities.set(e,a.integrity)}if(this._urlsToCacheKeys.set(n,e),this._urlsToCacheModes.set(n,r),s.length>0){const e=`Workbox is precaching URLs without revision info: ${s.join(", ")}\nThis is generally NOT safe. Learn more at https://bit.ly/wb-precache`;console.warn(e)}}}install(e){return c(e,(async()=>{const t=new h;this.strategy.plugins.push(t);for(const[t,s]of this._urlsToCacheKeys){const a=this._cacheKeysToIntegrities.get(s),n=this._urlsToCacheModes.get(t),r=new Request(t,{integrity:a,cache:n,credentials:"same-origin"});await Promise.all(this.strategy.handleAll({params:{cacheKey:s},request:r,event:e}))}const{updatedURLs:s,notUpdatedURLs:a}=t;return{updatedURLs:s,notUpdatedURLs:a}}))}activate(e){return c(e,(async()=>{const e=await self.caches.open(this.strategy.cacheName),t=await e.keys(),s=new Set(this._urlsToCacheKeys.values()),a=[];for(const n of t)s.has(n.url)||(await e.delete(n),a.push(n.url));return{deletedURLs:a}}))}getURLsToCacheKeys(){return this._urlsToCacheKeys}getCachedURLs(){return[...this._urlsToCacheKeys.keys()]}getCacheKeyForURL(e){const t=new URL(e,location.href);return this._urlsToCacheKeys.get(t.href)}getIntegrityForCacheKey(e){return this._cacheKeysToIntegrities.get(e)}async matchPrecache(e){const t=e instanceof Request?e.url:e,s=this.getCacheKeyForURL(t);if(s){return(await self.caches.open(this.strategy.cacheName)).match(s)}}createHandlerBoundToURL(e){const s=this.getCacheKeyForURL(e);if(!s)throw new t("non-precached-url",{url:e});return t=>(t.request=new Request(e),t.params=Object.assign({cacheKey:s},t.params),this.strategy.handle(t))}}let R;const v=()=>(R||(R=new _),R);s(80);const C=e=>e&&"object"==typeof e?e:{handle:e};class b{constructor(e,t,s="GET"){this.handler=C(t),this.match=e,this.method=s}setCatchHandler(e){this.catchHandler=C(e)}}class q extends b{constructor(e,t,s){super((({url:t})=>{const s=e.exec(t.href);if(s&&(t.origin===location.origin||0===s.index))return s.slice(1)}),t,s)}}class U{constructor(){this._routes=new Map,this._defaultHandlerMap=new Map}get routes(){return this._routes}addFetchListener(){self.addEventListener("fetch",(e=>{const{request:t}=e,s=this.handleRequest({request:t,event:e});s&&e.respondWith(s)}))}addCacheListener(){self.addEventListener("message",(e=>{if(e.data&&"CACHE_URLS"===e.data.type){const{payload:t}=e.data;0;const s=Promise.all(t.urlsToCache.map((t=>{"string"==typeof t&&(t=[t]);const s=new Request(...t);return this.handleRequest({request:s,event:e})})));e.waitUntil(s),e.ports&&e.ports[0]&&s.then((()=>e.ports[0].postMessage(!0)))}}))}handleRequest({request:e,event:t}){const s=new URL(e.url,location.href);if(!s.protocol.startsWith("http"))return void 0;const a=s.origin===location.origin,{params:n,route:r}=this.findMatchingRoute({event:t,request:e,sameOrigin:a,url:s});let i=r&&r.handler;const c=e.method;if(!i&&this._defaultHandlerMap.has(c)&&(i=this._defaultHandlerMap.get(c)),!i)return void 0;let o;try{o=i.handle({url:s,request:e,event:t,params:n})}catch(e){o=Promise.reject(e)}const h=r&&r.catchHandler;return o instanceof Promise&&(this._catchHandler||h)&&(o=o.catch((async a=>{if(h){0;try{return await h.handle({url:s,request:e,event:t,params:n})}catch(e){e instanceof Error&&(a=e)}}if(this._catchHandler)return this._catchHandler.handle({url:s,request:e,event:t});throw a}))),o}findMatchingRoute({url:e,sameOrigin:t,request:s,event:a}){const n=this._routes.get(s.method)||[];for(const r of n){let n;const i=r.match({url:e,sameOrigin:t,request:s,event:a});if(i)return n=i,(Array.isArray(n)&&0===n.length||i.constructor===Object&&0===Object.keys(i).length||"boolean"==typeof i)&&(n=void 0),{route:r,params:n}}return{}}setDefaultHandler(e,t="GET"){this._defaultHandlerMap.set(t,C(e))}setCatchHandler(e){this._catchHandler=C(e)}registerRoute(e){this._routes.has(e.method)||this._routes.set(e.method,[]),this._routes.get(e.method).push(e)}unregisterRoute(e){if(!this._routes.has(e.method))throw new t("unregister-route-but-not-found-with-method",{method:e.method});const s=this._routes.get(e.method).indexOf(e);if(!(s>-1))throw new t("unregister-route-route-not-registered");this._routes.get(e.method).splice(s,1)}}let L;class k extends b{constructor(e,t){super((({request:s})=>{const a=e.getURLsToCacheKeys();for(const n of function*(e,{ignoreURLParametersMatching:t=[/^utm_/,/^fbclid$/],directoryIndex:s="index.html",cleanURLs:a=!0,urlManipulation:n}={}){const r=new URL(e,location.href);r.hash="",yield r.href;const i=function(e,t=[]){for(const s of[...e.searchParams.keys()])t.some((e=>e.test(s)))&&e.searchParams.delete(s);return e}(r,t);if(yield i.href,s&&i.pathname.endsWith("/")){const e=new URL(i.href);e.pathname+=s,yield e.href}if(a){const e=new URL(i.href);e.pathname+=".html",yield e.href}if(n){const e=n({url:r});for(const t of e)yield t.href}}(s.url,t)){const t=a.get(n);if(t){return{cacheKey:t,integrity:e.getIntegrityForCacheKey(t)}}}}),e.strategy)}}function K(e){const s=v();!function(e,s,a){let n;if("string"==typeof e){const t=new URL(e,location.href);n=new b((({url:e})=>e.href===t.href),s,a)}else if(e instanceof RegExp)n=new q(e,s,a);else if("function"==typeof e)n=new b(e,s,a);else{if(!(e instanceof b))throw new t("unsupported-route-type",{moduleName:"workbox-routing",funcName:"registerRoute",paramName:"capture"});n=e}(L||(L=new U,L.addFetchListener(),L.addCacheListener()),L).registerRoute(n)}(new k(s,e))}var T;(function(e){v().precache(e)})([{'revision':null,'url':'/build/admin.4de55830.css'},{'revision':null,'url':'/build/admin.86a2d986.js'},{'revision':'ad79405d542b397996a3079203114b42','url':'/build/admin.86a2d986.js.LICENSE.txt'},{'revision':null,'url':'/build/app.6350a995.css'},{'revision':null,'url':'/build/app.a926d504.js'},{'revision':'4ff7361e3c3e359ae88c5fae5738746d','url':'/build/app.a926d504.js.LICENSE.txt'},{'revision':null,'url':'/build/fonts/fa-brands-400.3dc44d22.woff2'},{'revision':null,'url':'/build/fonts/fa-regular-400.3dc6ca01.woff2'},{'revision':null,'url':'/build/fonts/fa-solid-900.496d5fc1.woff2'},{'revision':null,'url':'/build/fonts/source-sans-pro-v14-latin-300.d2c7d5c5.woff2'},{'revision':null,'url':'/build/fonts/source-sans-pro-v14-latin-600.17c0392c.woff2'},{'revision':null,'url':'/build/fonts/source-sans-pro-v14-latin-600italic.cc34c6e7.woff2'},{'revision':null,'url':'/build/fonts/source-sans-pro-v14-latin-700.ed37bc60.woff2'},{'revision':null,'url':'/build/fonts/source-sans-pro-v14-latin-900.476756cd.woff2'},{'revision':null,'url':'/build/fonts/source-sans-pro-v14-latin-italic.a07cb9c5.woff2'},{'revision':null,'url':'/build/fonts/source-sans-pro-v14-latin-regular.f74389bd.woff2'},{'revision':null,'url':'/build/images/fa-brands-400.05d20183.svg'},{'revision':null,'url':'/build/images/fa-regular-400.9a0810d6.svg'},{'revision':null,'url':'/build/images/fa-solid-900.a838c42a.svg'},{'revision':null,'url':'/build/images/source-sans-pro-v14-latin-300.4e7fe004.svg'},{'revision':null,'url':'/build/images/source-sans-pro-v14-latin-600.cf2758ae.svg'},{'revision':null,'url':'/build/images/source-sans-pro-v14-latin-600italic.7249d863.svg'},{'revision':null,'url':'/build/images/source-sans-pro-v14-latin-700.3e4b9e19.svg'},{'revision':null,'url':'/build/images/source-sans-pro-v14-latin-900.060d8c51.svg'},{'revision':null,'url':'/build/images/source-sans-pro-v14-latin-italic.08dc9b1c.svg'},{'revision':null,'url':'/build/images/source-sans-pro-v14-latin-regular.3bb9538c.svg'},{'revision':null,'url':'/build/runtime.6ad5c9da.js'}]),K(T),self.addEventListener("fetch",(function(e){e.respondWith(caches.match(e.request).then((function(t){return t||fetch(e.request)})).catch((function(){return caches.match("/offline.html")})))}))})()})();
\ No newline at end of file \ No newline at end of file
...@@ -5,6 +5,7 @@ namespace App\Admin; ...@@ -5,6 +5,7 @@ namespace App\Admin;
use App\Entity\AccountAdherent; use App\Entity\AccountAdherent;
use App\Entity\Adherent; use App\Entity\Adherent;
use App\Entity\CotisationAdherent; use App\Entity\CotisationAdherent;
use App\Entity\DependentChild;
use App\Entity\Geoloc; use App\Entity\Geoloc;
use App\Entity\GlobalParameter; use App\Entity\GlobalParameter;
use App\Entity\Groupe; use App\Entity\Groupe;
...@@ -14,6 +15,7 @@ use App\Entity\ProfilDeCotisation; ...@@ -14,6 +15,7 @@ use App\Entity\ProfilDeCotisation;
use App\Enum\CurrencyEnum; use App\Enum\CurrencyEnum;
use App\Events\MLCEvents; use App\Events\MLCEvents;
use App\Exporter\CustomDoctrineORMQuerySourceIterator; use App\Exporter\CustomDoctrineORMQuerySourceIterator;
use App\Form\Type\DependentChildFormType;
use App\Form\Type\GeolocFormType; use App\Form\Type\GeolocFormType;
use App\Form\Type\UserFormType; use App\Form\Type\UserFormType;
use Doctrine\ORM\Query; use Doctrine\ORM\Query;
...@@ -35,12 +37,15 @@ use Sonata\UserBundle\Model\UserManagerInterface; ...@@ -35,12 +37,15 @@ use Sonata\UserBundle\Model\UserManagerInterface;
use Symfony\Component\EventDispatcher\EventDispatcherInterface; use Symfony\Component\EventDispatcher\EventDispatcherInterface;
use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\CheckboxType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\IntegerType;
use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\FormError; use Symfony\Component\Form\FormError;
use Symfony\Component\Form\FormEvent; use Symfony\Component\Form\FormEvent;
use Symfony\Component\Form\FormEvents; use Symfony\Component\Form\FormEvents;
use Symfony\Component\Routing\Generator\UrlGeneratorInterface; use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
use Symfony\Component\Security\Core\Security; use Symfony\Component\Security\Core\Security;
use Symfony\Component\Validator\Constraints\GreaterThanOrEqual;
/** /**
* Administration des adhérents. * Administration des adhérents.
...@@ -157,6 +162,12 @@ class AdherentAdmin extends AbstractAdmin ...@@ -157,6 +162,12 @@ class AdherentAdmin extends AbstractAdmin
'required' => true, 'required' => true,
'with_geoloc' => false, 'with_geoloc' => false,
'with_latlon' => false, 'with_latlon' => false,
'with_subterritory' =>
$this->getConfigurationPool()->getContainer()->getParameter('tav_env')
&& $this->getConfigurationPool()->getContainer()->getParameter('household_based_allowance'),
'with_quartier' =>
$this->getConfigurationPool()->getContainer()->getParameter('tav_env')
&& $this->getConfigurationPool()->getContainer()->getParameter('household_based_allowance')
]) ])
->end() ->end()
->with('Groupe', ['class' => 'col-md-5']) ->with('Groupe', ['class' => 'col-md-5'])
...@@ -172,6 +183,47 @@ class AdherentAdmin extends AbstractAdmin ...@@ -172,6 +183,47 @@ class AdherentAdmin extends AbstractAdmin
; ;
if ($this->getConfigurationPool()->getContainer()->getParameter('tav_env')) { if ($this->getConfigurationPool()->getContainer()->getParameter('tav_env')) {
if ($this->getConfigurationPool()->getContainer()->getParameter('household_based_allowance')) {
$formMapper
->tab('General')
->with('Foyer', ['class' => 'col-md-7'])
->add('householdComposition',ChoiceType::class, [
'choices' => [
"Personne seule" => "Personne seule",
"Couple sans enfant à charge" => "Couple sans enfant à charge",
"Famille mono-parentale" => "Famille mono-parentale",
"Couple avec enfant(s) à charge" => "Couple avec enfant(s) à charge",
"Autre" => "Autre"
],
'label' => "Composition du foyer (pour information)",
'required' => true,
'placeholder' => "Choix de la composition du foyer",
])
->add('householdAdultCount',IntegerType::class, [
'label' => "Nombre total d'adultes dans le foyer (pour calculer l'allocation)",
'constraints' => [
new GreaterThanOrEqual(['value' => 0]),
],
'required' => true,
'attr' => [
'autocomplete' => false
]
])
->add('dependentChildren', CollectionType::class, [
'entry_type' => DependentChildFormType::class,
'entry_options' => [
'label' => true,
'data_class' => DependentChild::class,
'attr' => ['class' => 'border pl-3 pr-3 pt-2']
],
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'label' => "Enfant(s) à charge (pour calculer l'allocation)"
])
->end()
->end();
}
// For Comptoir role in edit mode, hide profile choice // For Comptoir role in edit mode, hide profile choice
$displayProfilChoice = true; $displayProfilChoice = true;
$isComptoirOnly = $isComptoirOnly =
...@@ -200,7 +252,10 @@ class AdherentAdmin extends AbstractAdmin ...@@ -200,7 +252,10 @@ class AdherentAdmin extends AbstractAdmin
} }
return $choice->__toString(); return $choice->__toString();
} },
'attr' => [
'autocomplete' => 'off'
]
]) ])
->end() ->end()
->end(); ->end();
...@@ -219,25 +274,37 @@ class AdherentAdmin extends AbstractAdmin ...@@ -219,25 +274,37 @@ class AdherentAdmin extends AbstractAdmin
"prélèvement" => "prélèvement" "prélèvement" => "prélèvement"
], ],
'empty_data' => null, 'empty_data' => null,
'placeholder' => 'Choisir un moyen de paiement' 'placeholder' => 'Choisir un moyen de paiement',
'attr' => [
'autocomplete' => 'off'
]
]) ])
->add('jourPrelevement', ChoiceType::class, [ ->add('jourPrelevement', ChoiceType::class, [
'required' => false, 'required' => false,
'label' => 'Jour de prélèvement :', 'label' => 'Jour de prélèvement :',
'choices' => $this->daysOfMonth(), 'choices' => $this->daysOfMonth(),
'empty_data' => null, 'empty_data' => null,
'placeholder' => 'Choisir un jour de prélèvement' 'placeholder' => 'Choisir un jour de prélèvement',
'attr' => [
'autocomplete' => 'off'
]
]) ])
->add('mailRappelCotisation', CheckboxType::class, [ ->add('mailRappelCotisation', CheckboxType::class, [
'required' => false, 'required' => false,
'label' => 'Recevoir un rappel du paiement de ma cotisation par mail', 'label' => 'Recevoir un rappel du paiement de ma cotisation par mail',
'attr' => [
'autocomplete' => 'off'
]
]) ])
->add('jourMailRappelCotisation', ChoiceType::class, [ ->add('jourMailRappelCotisation', ChoiceType::class, [
'required' => false, 'required' => false,
'label' => 'Jour de l\'envoi du mail de rappel :', 'label' => 'Jour de l\'envoi du mail de rappel :',
'choices' => $this->daysOfMonth(), 'choices' => $this->daysOfMonth(),
'empty_data' => null, 'empty_data' => null,
'placeholder' => 'Choisir un jour pour l\'envoi du mail de rappel' 'placeholder' => 'Choisir un jour pour l\'envoi du mail de rappel',
'attr' => [
'autocomplete' => 'off'
]
]) ])
->end() ->end()
->end(); ->end();
...@@ -253,7 +320,10 @@ class AdherentAdmin extends AbstractAdmin ...@@ -253,7 +320,10 @@ class AdherentAdmin extends AbstractAdmin
'disabled' => true, 'disabled' => true,
'required' => false, 'required' => false,
'label' => 'Solde e-' . $mlc . ' :', 'label' => 'Solde e-' . $mlc . ' :',
'data' => $balance . ' ' . $mlc 'data' => $balance . ' ' . $mlc,
'attr' => [
'autocomplete' => 'off'
]
]) ])
->end() ->end()
->end(); ->end();
......
...@@ -354,17 +354,28 @@ class PrestataireAdmin extends AbstractAdmin ...@@ -354,17 +354,28 @@ class PrestataireAdmin extends AbstractAdmin
->end() ->end()
; ;
/**
* In case of prestataire self init and evaluation use case activated,
* set prestataire disabled by default & add 'conventionnement' field.
*/
if ($this->getConfigurationPool()->getContainer()->getParameter('presta_self_init_and_eval')) { if ($this->getConfigurationPool()->getContainer()->getParameter('presta_self_init_and_eval')) {
$formMapper $formMapper
->tab('Prestataire') ->tab('Prestataire')
->with('Prestataire', ['class' => 'col-md-6']) ->with('Prestataire', ['class' => 'col-md-6'])
->remove('enabled')
->add('enabled', null, [
'label' => 'Activé ?',
'required' => false,
'data' => false
])
->add('conventionnement', ChoiceType::class, [ ->add('conventionnement', ChoiceType::class, [
'choices' => [ 'choices' => [
'50 %' => 0.5, '50 %' => '0.50', //using strings (and not floats) seems required
'75 %' => 0.75, '75 %' => '0.75', //to make display work fine
'100 %' => 1, '100 %' => '1.00',
], ],
'required' => false, 'required' => false,
'attr' => ['autocomplete' => 'off'] //avoid non-saved value to be displayed
]) ])
->end() ->end()
->end(); ->end();
......
...@@ -251,6 +251,7 @@ class UserController extends AbstractController ...@@ -251,6 +251,7 @@ class UserController extends AbstractController
$form = $this->createForm(EncaissementFormType::class, null, []); $form = $this->createForm(EncaissementFormType::class, null, []);
$form->handleRequest($request); $form->handleRequest($request);
$validation = false; $validation = false;
$insufficientBalance = null; // if not null, will indicate for the template an insufficient founds situation
if ($form->isSubmitted()) { if ($form->isSubmitted()) {
$data = $form->getData(); $data = $form->getData();
...@@ -324,6 +325,8 @@ class UserController extends AbstractController ...@@ -324,6 +325,8 @@ class UserController extends AbstractController
$this->translator->trans('Solde de l\'habitant·e insuffisant') $this->translator->trans('Solde de l\'habitant·e insuffisant')
); );
$insufficientBalance = $balance;
goto end; goto end;
} }
...@@ -358,7 +361,8 @@ class UserController extends AbstractController ...@@ -358,7 +361,8 @@ class UserController extends AbstractController
end: end:
return $this->render('@kohinos/tav/encaissement_page.html.twig', [ return $this->render('@kohinos/tav/encaissement_page.html.twig', [
'form' => $form->createView(), 'form' => $form->createView(),
'validation' => $validation 'validation' => $validation,
'insufficientBalance' => $insufficientBalance
]); ]);
} }
......
...@@ -10,6 +10,7 @@ use App\Entity\EntityTrait\HasEcompteEntity; ...@@ -10,6 +10,7 @@ use App\Entity\EntityTrait\HasEcompteEntity;
use App\Flux\AccountableInterface; use App\Flux\AccountableInterface;
use App\Flux\AccountableObject; use App\Flux\AccountableObject;
use Doctrine\Common\Collections\ArrayCollection; use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Gedmo\Timestampable\Traits\TimestampableEntity; use Gedmo\Timestampable\Traits\TimestampableEntity;
use Ramsey\Uuid\Doctrine\UuidGenerator; use Ramsey\Uuid\Doctrine\UuidGenerator;
...@@ -113,9 +114,26 @@ class Adherent extends AccountableObject implements AccountableInterface ...@@ -113,9 +114,26 @@ class Adherent extends AccountableObject implements AccountableInterface
*/ */
private $jourMailRappelCotisation; private $jourMailRappelCotisation;
/**
* @ORM\OneToMany(targetEntity=DependentChild::class, mappedBy="adherent", orphanRemoval=true, cascade={"persist"})
*/
private $dependentChildren;
/**
* @ORM\Column(type="string", length=255, nullable=true)
*/
private $householdComposition;
/**
* @ORM\Column(type="integer", length=255, nullable=true)
*/
private $householdAdultCount;
public function __construct() public function __construct()
{ {
$this->accounts = new ArrayCollection(); $this->accounts = new ArrayCollection();
$this->dependentChildren = new ArrayCollection();
} }
public function getId() public function getId()
...@@ -300,6 +318,18 @@ class Adherent extends AccountableObject implements AccountableInterface ...@@ -300,6 +318,18 @@ class Adherent extends AccountableObject implements AccountableInterface
return $this; return $this;
} }
public function getHouseholdComposition(): ?string
{
return $this->householdComposition;
}
public function setHouseholdComposition(?string $householdComposition): self
{
$this->householdComposition = $householdComposition;
return $this;
}
public function getJourPrelevement(): ?int public function getJourPrelevement(): ?int
{ {
return $this->jourPrelevement; return $this->jourPrelevement;
...@@ -312,6 +342,18 @@ class Adherent extends AccountableObject implements AccountableInterface ...@@ -312,6 +342,18 @@ class Adherent extends AccountableObject implements AccountableInterface
return $this; return $this;
} }
public function getHouseholdAdultCount(): ?int
{
return $this->householdAdultCount;
}
public function setHouseholdAdultCount(?int $householdAdultCount): self
{
$this->householdAdultCount = $householdAdultCount;
return $this;
}
public function getMailRappelCotisation(): ?bool public function getMailRappelCotisation(): ?bool
{ {
return $this->mailRappelCotisation; return $this->mailRappelCotisation;
...@@ -335,4 +377,34 @@ class Adherent extends AccountableObject implements AccountableInterface ...@@ -335,4 +377,34 @@ class Adherent extends AccountableObject implements AccountableInterface
return $this; return $this;
} }
/**
* @return Collection<int, DependentChild>
*/
public function getDependentChildren(): Collection
{
return $this->dependentChildren;
}
public function addDependentChild(DependentChild $dependentChild): self
{
if (!$this->dependentChildren->contains($dependentChild)) {
$this->dependentChildren[] = $dependentChild;
$dependentChild->setAdherent($this);
}
return $this;
}
public function removeDependentChild(DependentChild $dependentChild): self
{
if ($this->dependentChildren->removeElement($dependentChild)) {
// set the owning side to null (unless already changed)
if ($dependentChild->getAdherent() === $this) {
$dependentChild->setAdherent(null);
}
}
return $this;
}
} }
<?php
namespace App\Entity;
use App\Repository\PrestataireProductFamilyRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity(repositoryClass=DependentChildRepository::class)
* @ORM\Table(name="dependent_child")
*/
class DependentChild
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity=Adherent::class, inversedBy="adherentDependentChildren")
* @ORM\JoinColumn(nullable=false)
*/
private $adherent;
/**
* @ORM\Column(type="boolean")
*/
private $olderThanFourteen;
/**
* @var float
*
* @ORM\Column(name="sharedcustodypercentage", type="decimal", scale=2, nullable=true)
* @Assert\Type("numeric")
*/
protected $sharedCustodyPercentage;
public function getId(): ?int
{
return $this->id;
}
public function getAdherent(): ?Adherent
{
return $this->adherent;
}
public function setAdherent(?Adherent $adherent): self
{
$this->adherent = $adherent;
return $this;
}
public function getOlderThanFourteen()
{
return $this->olderThanFourteen;
}
public function setOlderThanFourteen($olderThanFourteen)
{
$this->olderThanFourteen = $olderThanFourteen;
return $this;
}
public function getSharedCustodyPercentage()
{
return $this->sharedCustodyPercentage;
}
public function setSharedCustodyPercentage($sharedCustodyPercentage)
{
$this->sharedCustodyPercentage = $sharedCustodyPercentage;
return $this;
}
}
...@@ -66,6 +66,23 @@ class Geoloc ...@@ -66,6 +66,23 @@ class Geoloc
*/ */
private $lon; private $lon;
/**
* @var Subterritory
*
* @ORM\ManyToOne(targetEntity="Subterritory")
* @ORM\JoinColumn(name="subterritory_id", referencedColumnName="id", nullable=true)
*/
private $subterritory;
/**
* @var string|null
*
* @ORM\Column(name="quartier", type="string", length=255, nullable=true)
* @Groups({"read", "write"})
*/
private $quartier;
public function getId() public function getId()
{ {
return $this->id; return $this->id;
...@@ -171,6 +188,46 @@ class Geoloc ...@@ -171,6 +188,46 @@ class Geoloc
return $this; return $this;
} }
/**
* @return Subterritory|null
*/
public function getSubterritory(): ?Subterritory
{
return $this->subterritory;
}
/**
* @param Subterritory|null $subterritory
*
* @return Geoloc
*/
public function setSubterritory(?Subterritory $subterritory): Geoloc
{
$this->subterritory = $subterritory;
return $this;
}
/**
* @return string|null
*/
public function getQuartier(): ?string
{
return $this->quartier;
}
/**
* @param string|null $quartier
*
* @return Geoloc
*/
public function setQuartier(?string $quartier)
{
$this->quartier = $quartier;
return $this;
}
public function __toString(): string public function __toString(): string
{ {
return (!empty($this->adresse) ? $this->adresse : '') . ' ' . (!empty($this->cpostal) ? $this->cpostal : '') . ' ' . (!empty($this->ville) ? $this->ville : ''); return (!empty($this->adresse) ? $this->adresse : '') . ' ' . (!empty($this->cpostal) ? $this->cpostal : '') . ' ' . (!empty($this->ville) ? $this->ville : '');
......
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use Ramsey\Uuid\Doctrine\UuidGenerator;
use Symfony\Component\Validator\Constraints as Assert;
/**
* @ORM\Entity
* @ORM\Table(name="subterritory")
*/
class Subterritory
{
/**
* @var \Ramsey\Uuid\UuidInterface
*
* @ORM\Id
* @ORM\Column(type="uuid", unique=true)
* @ORM\GeneratedValue(strategy="CUSTOM")
* @ORM\CustomIdGenerator(class=UuidGenerator::class)
*/
protected $id;
/**
* @var string|null
*
* @ORM\Column(type="string", unique=true)
* @Assert\NotBlank
*/
protected $name;
public function getId()
{
return $this->id;
}
public function getName(): ?string
{
return $this->name;
}
public function setName(?string $name)
{
$this->name = $name;
return $this;
}
}
<?php
namespace App\Form\Type;
use App\Entity\DependentChild;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
class DependentChildFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('olderThanFourteen', ChoiceType::class, array(
'choices' => [
'oui' => true,
'non' => false
],
'label' => "A-t-il plus de 14 ans ?",
'required' => true,
'expanded' => true
))
->add('sharedCustodyPercentage', ChoiceType::class, [
'label' => "Est-il en garde partagée ?",
'required' => true,
'choices' => [
'non' => null,
'oui : je le garde 25 % du temps' => '0.25',//using strings as values (and not floats) seems required
'oui : je le garde 50 % du temps' => '0.50',//to make display work fine
'oui : je le garde 75 % du temps' => '0.75',
],
'required' => false,
'attr' => ['autocomplete' => 'off'] //avoid non-saved value to be displayed
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => DependentChild::class,
]);
}
public function getBlockPrefix()
{
return 'formDependentChild';
}
}
...@@ -3,6 +3,8 @@ ...@@ -3,6 +3,8 @@
namespace App\Form\Type; namespace App\Form\Type;
use App\Entity\Geoloc; use App\Entity\Geoloc;
use App\Entity\Subterritory;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\Extension\Core\Type\ButtonType; use Symfony\Component\Form\Extension\Core\Type\ButtonType;
use Symfony\Component\Form\Extension\Core\Type\HiddenType; use Symfony\Component\Form\Extension\Core\Type\HiddenType;
...@@ -71,6 +73,25 @@ class GeolocFormType extends AbstractType ...@@ -71,6 +73,25 @@ class GeolocFormType extends AbstractType
]) ])
; ;
} }
if (true === $options['with_quartier']) {
$builder
->add('quartier', TextType::class, [
'required' => false,
])
;
}
if (true === $options['with_subterritory']) {
$builder
->add('subterritory', EntityType::class, [
'class' => Subterritory::class,
'label' => 'Territoire',
'required' => true,
'choice_label' => 'name',
'placeholder' => "Choix du territoire",
'attr' => ['autocomplete' => 'off']
])
;
}
} }
public function configureOptions(OptionsResolver $resolver) public function configureOptions(OptionsResolver $resolver)
...@@ -80,6 +101,8 @@ class GeolocFormType extends AbstractType ...@@ -80,6 +101,8 @@ class GeolocFormType extends AbstractType
'data_class' => Geoloc::class, 'data_class' => Geoloc::class,
'with_geoloc' => true, 'with_geoloc' => true,
'with_latlon' => true, 'with_latlon' => true,
'with_subterritory' => false,
'with_quartier' => false
]); ]);
} }
......
<?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 Version20240306164256 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->addSql('CREATE TABLE dependent_child (id INT AUTO_INCREMENT NOT NULL, adherent_id CHAR(36) NOT NULL COMMENT \'(DC2Type:uuid)\', older_than_fourteen TINYINT(1) NOT NULL, conventionnement NUMERIC(10, 2) DEFAULT NULL, INDEX IDX_15BF27C725F06C53 (adherent_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('ALTER TABLE dependent_child ADD CONSTRAINT FK_15BF27C725F06C53 FOREIGN KEY (adherent_id) REFERENCES adherent (id)');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:personal_data)\'');
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('DROP TABLE dependent_child');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban LONGTEXT CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_general_ci` COMMENT \'(DC2Type:personal_data)\'');
}
}
<?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 Version20240307162630 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->addSql('ALTER TABLE dependent_child CHANGE conventionnement sharedcustodypercentage NUMERIC(10, 2) DEFAULT NULL');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:personal_data)\'');
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE dependent_child CHANGE sharedcustodypercentage conventionnement NUMERIC(10, 2) DEFAULT NULL');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban LONGTEXT CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_general_ci` COMMENT \'(DC2Type:personal_data)\'');
}
}
<?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 Version20240311154311 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->addSql('CREATE TABLE subterritory (id CHAR(36) NOT NULL COMMENT \'(DC2Type:uuid)\', name VARCHAR(255) NOT NULL, UNIQUE INDEX UNIQ_7D1B925F5E237E06 (name), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql("INSERT INTO subterritory (id, name) VALUES (UUID(), 'Bordeaux Nord / Bordeaux La Benauge')");
$this->addSql("INSERT INTO subterritory (id, name) VALUES (UUID(), 'Pays foyen')");
$this->addSql("INSERT INTO subterritory (id, name) VALUES (UUID(), 'Bègles')");
$this->addSql("INSERT INTO subterritory (id, name) VALUES (UUID(), 'Sud Gironde / Bazadais')");
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('DROP TABLE subterritory');
}
}
<?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 Version20240311155641 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->addSql('ALTER TABLE geoloc ADD subterritory_id CHAR(36) DEFAULT NULL COMMENT \'(DC2Type:uuid)\'');
$this->addSql('ALTER TABLE geoloc ADD CONSTRAINT FK_E1B7F4E7C8B38DB4 FOREIGN KEY (subterritory_id) REFERENCES subterritory (id)');
$this->addSql('CREATE INDEX IDX_E1B7F4E7C8B38DB4 ON geoloc (subterritory_id)');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:personal_data)\'');
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE geoloc DROP FOREIGN KEY FK_E1B7F4E7C8B38DB4');
$this->addSql('DROP INDEX IDX_E1B7F4E7C8B38DB4 ON geoloc');
$this->addSql('ALTER TABLE geoloc DROP subterritory_id');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban LONGTEXT CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_general_ci` COMMENT \'(DC2Type:personal_data)\'');
}
}
<?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 Version20240311161651 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->addSql('ALTER TABLE geoloc ADD quartier VARCHAR(255) DEFAULT NULL');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:personal_data)\'');
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE geoloc DROP quartier');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban LONGTEXT CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_general_ci` COMMENT \'(DC2Type:personal_data)\'');
}
}
<?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 Version20240311163934 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->addSql('ALTER TABLE adherent ADD household_composition VARCHAR(255) DEFAULT NULL');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:personal_data)\'');
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE adherent DROP household_composition');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban LONGTEXT CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_general_ci` COMMENT \'(DC2Type:personal_data)\'');
}
}
<?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 Version20240311170014 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->addSql('ALTER TABLE adherent ADD household_adult_count INT DEFAULT NULL');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:personal_data)\'');
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE adherent DROP household_adult_count');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban LONGTEXT CHARACTER SET utf8 DEFAULT NULL COLLATE `utf8_general_ci` COMMENT \'(DC2Type:personal_data)\'');
}
}
...@@ -22,7 +22,7 @@ ...@@ -22,7 +22,7 @@
<div class="modal-body"> <div class="modal-body">
{{ modal_content }} {{ modal_content }}
</div> </div>
{% if btn_primary is not empty and btn_secondary is not empty %} {% if btn_primary is not empty or btn_secondary is not empty %}
<div class="modal-footer"> <div class="modal-footer">
{% if btn_primary is not empty %} {% if btn_primary is not empty %}
<button type="button" class="btn btn-primary">{{ btn_primary }}</button> <button type="button" class="btn btn-primary">{{ btn_primary }}</button>
......
...@@ -26,6 +26,25 @@ ...@@ -26,6 +26,25 @@
<h2 class='text-center w-100 mt-4 mb-4 payment-recap'></h2> <h2 class='text-center w-100 mt-4 mb-4 payment-recap'></h2>
<div id="payment-validation-subheader">{{ "Veuillez entrer votre code de validation"|trans }}</div> <div id="payment-validation-subheader">{{ "Veuillez entrer votre code de validation"|trans }}</div>
{% endif %} {% endif %}
{# SHOW BALANCE MODALE#}
{% if insufficientBalance is not null %}
{% set modal_id = 'showbalancemodal' %}
{% set modal_title = 'Mon solde'|trans %}
{% set modal_content %}
<div>
{{ "Solde restant :"|trans }} {{ insufficientBalance }} {{ KOH_MLC_NAME_SMALL|default('') }}
</div>
{% endset %}
{% include '@kohinos/block/modal.html.twig' with {'btn_primary' : null, 'btn_secondary' : 'Ok'} %}
<div id="display-balance-text-container">
<div>
Votre solde est insuffisant, voulez-vous consulter votre solde ?
</div>
<a class='btn btn-primary' data-toggle="modal" data-target="#{{ modal_id }}" title='{{ 'Mon solde'|trans }}' href="#">{{ 'Oui'|trans }}</a>
<a class='btn btn-primary' id="display-balance-button-no" href="#">{{ 'Non'|trans }}</a>
</div>
{% endif %}
<br/> <br/>
<div class='text-center mb-5'> <div class='text-center mb-5'>
...@@ -65,6 +84,7 @@ ...@@ -65,6 +84,7 @@
</div> </div>
<script type="text/javascript"> <script type="text/javascript">
var formEncaissementValidation = '{{ validation }}'; var formEncaissementValidation = '{{ validation }}';
var KOH_MLC_NAME_SMALL = "{{ KOH_MLC_NAME_SMALL|default('') }}";
</script> </script>
{% endblock %} {% endblock %}
......
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