Commit 04f1d040 by Damien Moulard

fix merge conflicts

parents 97762d78 8be42f4b
...@@ -47,6 +47,8 @@ PAYZEN_DEBUG=false ...@@ -47,6 +47,8 @@ PAYZEN_DEBUG=false
### TAV ### ### TAV ###
TAV_ENV=0 TAV_ENV=0
PRESTA_SELF_INIT_AND_EVAL=0 PRESTA_SELF_INIT_AND_EVAL=0
AUTOMATISATION_RECONVERSION=0
PRESTA_EXTRA_DATA=0
EMAIL_ERROR=technique@kohinos.net EMAIL_ERROR=technique@kohinos.net
EMAIL_USER_FROM=noreply@kohinos.fr EMAIL_USER_FROM=noreply@kohinos.fr
......
...@@ -54,6 +54,8 @@ Copier le fichier .env.dist en .env et configurer : ...@@ -54,6 +54,8 @@ Copier le fichier .env.dist en .env et configurer :
- la variable APP_SECRET (variable secrète que vous pouvez générer à partir de cette url : http://nux.net/secret - la variable APP_SECRET (variable secrète que vous pouvez générer à partir de cette url : http://nux.net/secret
- s'il s'agit d'une instance TAV, mettre la variable TAV_ENV à 1 (sinon la laisser à zéro) - s'il s'agit d'une instance TAV, mettre la variable TAV_ENV à 1 (sinon la laisser à zéro)
- 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 PRESTA_EXTRA_DATA permet d'indiquer puis d'afficher publiquement plus de données concernant les prestataires (e.g. familles de produits)
Si vous utilisez Payzen comme moyen de paiement par CB : Si vous utilisez Payzen comme moyen de paiement par CB :
......
...@@ -291,6 +291,10 @@ form[name="formEncaissement"] label { ...@@ -291,6 +291,10 @@ form[name="formEncaissement"] label {
} }
} }
/**
* END Success check animation.
*/
#login-password-container { #login-password-container {
position: relative; position: relative;
} }
...@@ -345,9 +349,52 @@ form[name="formEncaissement"] label { ...@@ -345,9 +349,52 @@ form[name="formEncaissement"] label {
* END Success check animation. * END Success check animation.
*/ */
.prestaquizz_temporary_save_container { .prestaquizz_temporary_save_container {
position: fixed; position: fixed;
bottom: 0; bottom: 0;
right: 1rem; right: 1rem;
z-index: 2; z-index: 2;
} }
\ No newline at end of file
.presta-products-family {
display: flex;
margin-bottom: 1rem;
}
.presta-products-family-fields {
width: 95%;
}
.presta-products-family-delete {
width: 5%;
text-align: end;
}
.presta-products-family-form-group {
display: flex;
gap: 5px;
align-items: center;
margin-bottom: 0.25rem !important;
}
.presta-products-family-form-group label {
width: 40%;
margin-bottom: 0;
}
.delete-icon {
color: #ff4136;
}
.delete-icon:hover {
cursor: pointer;
color: #a02923;
}
.presta-products-family-duplicate-warning {
display: none;
color: #ff4136;
margin-top: -0.25rem;
text-align: right;
font-style: italic;
}
...@@ -70,7 +70,7 @@ $(document).ready(function() { ...@@ -70,7 +70,7 @@ $(document).ready(function() {
}); });
}); });
// Hide or display Cotisation or Profils de Cotisation submenu depending on TAV env // Hide or display Cotisation, Profils de Cotisation and Products Families submenu depending on TAV env
const tav_env = document.getElementsByName('is-tav-env')[0].getAttribute('content'); const tav_env = document.getElementsByName('is-tav-env')[0].getAttribute('content');
let linksToCotisationAdherent = $('a[href="/admin/cotisation_adherent/list"]'); let linksToCotisationAdherent = $('a[href="/admin/cotisation_adherent/list"]');
...@@ -91,6 +91,12 @@ $(document).ready(function() { ...@@ -91,6 +91,12 @@ $(document).ready(function() {
linksToProfilDeCotisation[i].parentNode.style.display = (tav_env === "1") ? "" : "none"; linksToProfilDeCotisation[i].parentNode.style.display = (tav_env === "1") ? "" : "none";
} }
} }
let linksToProductsFamily = $('a[href="/admin/app/productfamily/list"]');
for(let i = 0 ; i < linksToProductsFamily.length ; i++) {
if(linksToProductsFamily[i].innerText === "Familles de produits") {
linksToProductsFamily[i].parentNode.style.display = (tav_env === "1") ? "" : "none";
}
}
var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver; var MutationObserver = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;
......
...@@ -649,4 +649,74 @@ $(function() { ...@@ -649,4 +649,74 @@ $(function() {
$('form[name="formDistributorSelfEvalPrestaQuiz"]').trigger("submit"); $('form[name="formDistributorSelfEvalPrestaQuiz"]').trigger("submit");
}); });
/**
* Delete a PrestataireProductFamily node on icon click
* @param {Event} e
*/
function deletePrestataireProductFamily(e) {
e.preventDefault();
$(this).closest('.presta-products-family')
.fadeOut()
.remove();
}
$(".presta-products-family-delete").on("click", deletePrestataireProductFamily);
/**
* Check if a product family is already selected on select change.
*/
function onPrestataireProductFamilyChange() {
let current_select_id = $(this).attr('id');
let current_select_selected_option = $( `#${current_select_id} option:selected` ).text();
let same_selected_option = false;
$('.prestataire-product-families-select').each(function() {
let select_id = $(this).attr('id');
let select_selected_option = $( `#${select_id} option:selected` ).text();
if (current_select_id !== select_id && current_select_selected_option === select_selected_option) {
same_selected_option = true;
return false;
}
});
$('.presta-products-family-fields .presta-products-family-duplicate-warning').hide();
$('.prestataire-product-families-products').attr('disabled', false);
if (same_selected_option) {
$(this).closest('.presta-products-family-fields').find('.presta-products-family-duplicate-warning').show();
$(this).closest('.presta-products-family-fields').find('.prestataire-product-families-products').attr('disabled', true);
}
}
$('.prestataire-product-families-select').on('change', onPrestataireProductFamilyChange);
/**
* Twig helper, add element to Collection in template based on collection prototype
* @param {*} e
*/
function addFormToCollection(e) {
const collectionHolder = document.querySelector('.' + e.currentTarget.dataset.collectionHolderClass);
const item = document.createElement('div');
item.innerHTML = collectionHolder
.dataset
.prototype
.replace(
/__name__/g,
collectionHolder.dataset.index
);
collectionHolder.appendChild(item);
collectionHolder.dataset.index++;
$(".presta-products-family-delete").off("click", deletePrestataireProductFamily);
$(".presta-products-family-delete").on("click", deletePrestataireProductFamily);
$('.prestataire-product-families-select').off('change', onPrestataireProductFamilyChange);
$('.prestataire-product-families-select').on('change', onPrestataireProductFamilyChange);
};
$("#add-prestataire-products-family").on("click", addFormToCollection);
}); });
...@@ -331,6 +331,14 @@ sonata_admin: ...@@ -331,6 +331,14 @@ sonata_admin:
icon: '<i class="fa fa-upload"></i>' icon: '<i class="fa fa-upload"></i>'
items: items:
- admin.import - admin.import
sonata.admin.productsFamily:
keep_open: false
on_top: true
label: "Familles de produits"
label_catalogue: SonataAdminBundle
icon: '<i class="fa fa-shopping-basket"></i>'
items:
- admin.productsFamily
sonata.admin.group.globalparameter: sonata.admin.group.globalparameter:
keep_open: false keep_open: false
on_top: true on_top: true
......
...@@ -14,6 +14,8 @@ parameters: ...@@ -14,6 +14,8 @@ parameters:
sonata.media.admin.gallery.class: 'App\Admin\GalleryAdmin' sonata.media.admin.gallery.class: 'App\Admin\GalleryAdmin'
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)%'
automatisation_reconversion: '%env(AUTOMATISATION_RECONVERSION)%'
presta_extra_data: '%env(PRESTA_EXTRA_DATA)%'
# 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: ';'
...@@ -658,6 +660,16 @@ services: ...@@ -658,6 +660,16 @@ services:
show_mosaic_button: false show_mosaic_button: false
public: true public: true
admin.productsFamily:
class: App\Admin\ProductFamilyAdmin
arguments: [~, App\Entity\ProductFamily, ~]
tags:
- name: sonata.admin
manager_type: orm
group: "Familles de Produits"
label: "Familles de Produits"
public: true
sonata.media.provider.csv: sonata.media.provider.csv:
class: App\Admin\ImportProvider class: App\Admin\ImportProvider
tags: tags:
......
...@@ -3359,9 +3359,9 @@ ...@@ -3359,9 +3359,9 @@
} }
}, },
"node_modules/caniuse-lite": { "node_modules/caniuse-lite": {
"version": "1.0.30001491", "version": "1.0.30001589",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001491.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz",
"integrity": "sha512-17EYIi4TLnPiTzVKMveIxU5ETlxbSO3B6iPvMbprqnKh4qJsQGk5Nh1Lp4jIMAE0XfrujsJuWZAM3oJdMHaKBA==", "integrity": "sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==",
"dev": true, "dev": true,
"funding": [ "funding": [
{ {
...@@ -12880,9 +12880,9 @@ ...@@ -12880,9 +12880,9 @@
} }
}, },
"caniuse-lite": { "caniuse-lite": {
"version": "1.0.30001491", "version": "1.0.30001589",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001491.tgz", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz",
"integrity": "sha512-17EYIi4TLnPiTzVKMveIxU5ETlxbSO3B6iPvMbprqnKh4qJsQGk5Nh1Lp4jIMAE0XfrujsJuWZAM3oJdMHaKBA==", "integrity": "sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==",
"dev": true "dev": true
}, },
"chalk": { "chalk": {
......
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.
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,16 +3,16 @@ ...@@ -3,16 +3,16 @@
"app": { "app": {
"js": [ "js": [
"/build/runtime.6ad5c9da.js", "/build/runtime.6ad5c9da.js",
"/build/app.9cc97810.js" "/build/app.94b71822.js"
], ],
"css": [ "css": [
"/build/app.20b881c9.css" "/build/app.c40ef51c.css"
] ]
}, },
"admin": { "admin": {
"js": [ "js": [
"/build/runtime.6ad5c9da.js", "/build/runtime.6ad5c9da.js",
"/build/admin.cee4d78d.js" "/build/admin.86a2d986.js"
], ],
"css": [ "css": [
"/build/admin.5dc0eea7.css" "/build/admin.5dc0eea7.css"
......
{ {
"build/app.css": "/build/app.20b881c9.css", "build/app.css": "/build/app.c40ef51c.css",
"build/app.js": "/build/app.9cc97810.js", "build/app.js": "/build/app.94b71822.js",
"build/admin.css": "/build/admin.5dc0eea7.css", "build/admin.css": "/build/admin.5dc0eea7.css",
"build/admin.js": "/build/admin.cee4d78d.js", "build/admin.js": "/build/admin.86a2d986.js",
"build/runtime.js": "/build/runtime.6ad5c9da.js", "build/runtime.js": "/build/runtime.6ad5c9da.js",
"build/images/fa-solid-900.svg": "/build/images/fa-solid-900.a838c42a.svg", "build/images/fa-solid-900.svg": "/build/images/fa-solid-900.a838c42a.svg",
"build/images/fa-brands-400.svg": "/build/images/fa-brands-400.05d20183.svg", "build/images/fa-brands-400.svg": "/build/images/fa-brands-400.05d20183.svg",
......
<?php
namespace App\Admin;
use Sonata\AdminBundle\Admin\AbstractAdmin;
use Sonata\AdminBundle\Datagrid\DatagridMapper;
use Sonata\AdminBundle\Datagrid\ListMapper;
use Sonata\AdminBundle\Form\FormMapper;
use Sonata\AdminBundle\Show\ShowMapper;
use Symfony\Component\Form\Extension\Core\Type\TextType;
/**
* Administration des familles de produits.
*
* KOHINOS : Outil de gestion de Monnaie Locale Complémentaire
*/
class ProductFamilyAdmin extends AbstractAdmin
{
protected function configureFormFields(FormMapper $form): void
{
$form->add('name', TextType::class, [
'label' => 'Nom'
]);
}
protected function configureDatagridFilters(DatagridMapper $datagrid): void
{
$datagrid->add('name', null, [
'label' => 'Nom'
]);
}
protected function configureListFields(ListMapper $list): void
{
$list->addIdentifier('name', null, [
'label' => 'Nom'
]);
}
}
\ No newline at end of file
...@@ -74,6 +74,7 @@ class FluxController extends AbstractController ...@@ -74,6 +74,7 @@ class FluxController extends AbstractController
protected $operationUtils; protected $operationUtils;
protected $tokenGenerator; protected $tokenGenerator;
protected $validator; protected $validator;
protected $userManager;
public function __construct( public function __construct(
Security $security, Security $security,
...@@ -86,7 +87,8 @@ class FluxController extends AbstractController ...@@ -86,7 +87,8 @@ class FluxController extends AbstractController
TAVCotisationUtils $tavCotisationsUtils, TAVCotisationUtils $tavCotisationsUtils,
TokenGeneratorInterface $tokenGenerator, TokenGeneratorInterface $tokenGenerator,
ValidatorInterface $validator, ValidatorInterface $validator,
CsrfTokenManagerInterface $tokenManager CsrfTokenManagerInterface $tokenManager,
UserManagerInterface $userManager
) { ) {
$this->security = $security; $this->security = $security;
$this->em = $em; $this->em = $em;
...@@ -99,6 +101,7 @@ class FluxController extends AbstractController ...@@ -99,6 +101,7 @@ class FluxController extends AbstractController
$this->validator = $validator; $this->validator = $validator;
$this->tokenManager = $tokenManager; $this->tokenManager = $tokenManager;
$this->tavCotisationsUtils = $tavCotisationsUtils; $this->tavCotisationsUtils = $tavCotisationsUtils;
$this->userManager = $userManager;
} }
protected function manageFluxForm(Request $request, Form $form, $template = '@kohinos/flux/transaction.html.twig', $params = []) protected function manageFluxForm(Request $request, Form $form, $template = '@kohinos/flux/transaction.html.twig', $params = [])
......
...@@ -49,6 +49,8 @@ class UserPrestataireController extends FluxController ...@@ -49,6 +49,8 @@ class UserPrestataireController extends FluxController
} }
$this->em->persist($adresse); $this->em->persist($adresse);
} }
// caissiers validations
if (!empty($form->get('newcaissiers')->getData())) { if (!empty($form->get('newcaissiers')->getData())) {
$caissiers = explode(';', $form->get('newcaissiers')->getData()); $caissiers = explode(';', $form->get('newcaissiers')->getData());
$errors = []; $errors = [];
...@@ -102,6 +104,17 @@ class UserPrestataireController extends FluxController ...@@ -102,6 +104,17 @@ class UserPrestataireController extends FluxController
} elseif (!$request->isXmlHttpRequest()) { } elseif (!$request->isXmlHttpRequest()) {
return new Response('', Response::HTTP_BAD_REQUEST); return new Response('', Response::HTTP_BAD_REQUEST);
} }
} else {
foreach ($form->getErrors(true, true) as $error) {
// Add flash error message in case of error with the embedded form
if (str_contains($error->getCause()->getPropertyPath(), 'productFamily')) {
$this->addFlash(
'error',
$error->getMessage()
);
break;
}
}
} }
return $this->redirectToRoute('index'); return $this->redirectToRoute('index');
......
...@@ -9,6 +9,7 @@ use App\Entity\EntityTrait\HasEcompteEntity; ...@@ -9,6 +9,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\Mapping\Annotation as Gedmo; use Gedmo\Mapping\Annotation as Gedmo;
use Gedmo\Timestampable\Traits\TimestampableEntity; use Gedmo\Timestampable\Traits\TimestampableEntity;
...@@ -325,6 +326,15 @@ class Prestataire extends AccountableObject implements AccountableInterface ...@@ -325,6 +326,15 @@ class Prestataire extends AccountableObject implements AccountableInterface
protected $tauxreconversion; protected $tauxreconversion;
/** /**
* Fréquence de reconversion en cas d'automatisation des reconversions.
*
* @var string
* @ORM\Column(name="reconversionFrequency", type="string", length=50, nullable=true)
* @Groups({"read", "write"})
*/
protected $reconversionFrequency;
/**
* @var ArrayCollection|AccountPrestataire[] * @var ArrayCollection|AccountPrestataire[]
* @ORM\OneToMany(targetEntity="AccountPrestataire", mappedBy="prestataire") * @ORM\OneToMany(targetEntity="AccountPrestataire", mappedBy="prestataire")
*/ */
...@@ -343,6 +353,11 @@ class Prestataire extends AccountableObject implements AccountableInterface ...@@ -343,6 +353,11 @@ class Prestataire extends AccountableObject implements AccountableInterface
private $lastTransactionsExportDatetime; private $lastTransactionsExportDatetime;
/** /**
* @ORM\OneToMany(targetEntity=PrestataireProductFamily::class, mappedBy="prestataire", orphanRemoval=true, cascade={"persist"})
*/
private $prestataireProductFamilies;
/**
* @var float * @var float
* *
* @ORM\Column(name="conventionnement", type="decimal", scale=2, nullable=true) * @ORM\Column(name="conventionnement", type="decimal", scale=2, nullable=true)
...@@ -361,6 +376,7 @@ class Prestataire extends AccountableObject implements AccountableInterface ...@@ -361,6 +376,7 @@ class Prestataire extends AccountableObject implements AccountableInterface
$this->rubriques = new ArrayCollection(); $this->rubriques = new ArrayCollection();
$this->contacts = new ArrayCollection(); $this->contacts = new ArrayCollection();
$this->accounts = new ArrayCollection(); $this->accounts = new ArrayCollection();
$this->prestataireProductFamilies = new ArrayCollection();
} }
public function getId() public function getId()
...@@ -1116,6 +1132,28 @@ class Prestataire extends AccountableObject implements AccountableInterface ...@@ -1116,6 +1132,28 @@ class Prestataire extends AccountableObject implements AccountableInterface
} }
/** /**
* Get reconversionFrequency.
*
* @return
*/
public function getReconversionFrequency(): ?string
{
return $this->reconversionFrequency;
}
/**
* Set reconversionFrequency.
*
* @return $this
*/
public function setReconversionFrequency(?string $reconversionFrequency): self
{
$this->reconversionFrequency = $reconversionFrequency;
return $this;
}
/**
* Get comments. * Get comments.
* *
* @return string comments * @return string comments
...@@ -1165,6 +1203,36 @@ class Prestataire extends AccountableObject implements AccountableInterface ...@@ -1165,6 +1203,36 @@ class Prestataire extends AccountableObject implements AccountableInterface
} }
/** /**
* @return Collection<int, PrestataireProductFamily>
*/
public function getPrestataireProductFamilies(): Collection
{
return $this->prestataireProductFamilies;
}
public function addPrestataireProductFamily(PrestataireProductFamily $prestataireProductFamily): self
{
if (!$this->prestataireProductFamilies->contains($prestataireProductFamily)) {
$this->prestataireProductFamilies[] = $prestataireProductFamily;
$prestataireProductFamily->setPrestataire($this);
}
return $this;
}
public function removePrestataireProductFamily(PrestataireProductFamily $prestataireProductFamily): self
{
if ($this->prestataireProductFamilies->removeElement($prestataireProductFamily)) {
// set the owning side to null (unless already changed)
if ($prestataireProductFamily->getPrestataire() === $this) {
$prestataireProductFamily->setPrestataire(null);
}
}
return $this;
}
/**
* @return mixed * @return mixed
*/ */
public function getConventionnement() public function getConventionnement()
......
<?php
namespace App\Entity;
use App\Repository\PrestataireProductFamilyRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity(repositoryClass=PrestataireProductFamilyRepository::class)
* @ORM\Table(name="prestataire_product_family", uniqueConstraints={@ORM\UniqueConstraint(name="prestataireproductfamily", columns={"prestataire_id", "product_family_id"})}) )
* @UniqueEntity(
* fields={"prestataire", "productFamily"},
* errorPath="productFamily",
* message="Famille de produits déjà renseignée, les modifications n'ont pas été enregistrées."
* )
*/
class PrestataireProductFamily
{
/**
* @ORM\Id
* @ORM\GeneratedValue
* @ORM\Column(type="integer")
*/
private $id;
/**
* @ORM\ManyToOne(targetEntity=Prestataire::class, inversedBy="prestataireProductFamilies")
* @ORM\JoinColumn(nullable=false)
*/
private $prestataire;
/**
* @ORM\ManyToOne(targetEntity=ProductFamily::class)
* @ORM\JoinColumn(nullable=false)
*/
private $productFamily;
/**
* Products list as a string. Not related to any kind of product entity.
*
* @ORM\Column(type="text")
*/
private $products;
public function getId(): ?int
{
return $this->id;
}
public function getPrestataire(): ?Prestataire
{
return $this->prestataire;
}
public function setPrestataire(?Prestataire $prestataire): self
{
$this->prestataire = $prestataire;
return $this;
}
public function getProductFamily(): ?ProductFamily
{
return $this->productFamily;
}
public function setProductFamily(?ProductFamily $productFamily): self
{
$this->productFamily = $productFamily;
return $this;
}
public function getProducts(): ?string
{
return $this->products;
}
public function setProducts(string $products): self
{
$this->products = $products;
return $this;
}
}
<?php
namespace App\Entity;
use App\Repository\ProductFamilyRepository;
use Doctrine\ORM\Mapping as ORM;
use Ramsey\Uuid\Doctrine\UuidGenerator;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
/**
* @ORM\Entity(repositoryClass=ProductFamilyRepository::class)
* @UniqueEntity(fields="name", message="Une famille de produits portant ce nom existe déjà.")
*/
class ProductFamily
{
/**
* @var \Ramsey\Uuid\UuidInterface
*
* @ORM\Id
* @ORM\Column(type="uuid", unique=true)
* @ORM\GeneratedValue(strategy="CUSTOM")
* @ORM\CustomIdGenerator(class=UuidGenerator::class)
*/
private $id;
/**
* @ORM\Column(type="string", length=100, unique=true)
*/
private $name;
public function getId()
{
return $this->id;
}
/**
* Get name.
*
* @return string name
*/
public function getName(): ?string
{
return $this->name;
}
/**
* Set name.
*
* @return $this
*/
public function setName(string $name): self
{
$this->name = $name;
return $this;
}
}
<?php
namespace App\Enum;
abstract class ReconversionFrequencyEnum
{
const MOYEN_ONCE_A_MONTH = 'once_a_month';
const MOYEN_TWICE_A_MONTH = 'twice_a_month';
const MOYEN_ONCE_TWO_MONTHS = 'once_every_two_month';
/** @var array user friendly named type */
protected static $typeName = [
self::MOYEN_ONCE_A_MONTH => '1 fois par mois',
self::MOYEN_TWICE_A_MONTH => '2 fois par mois',
self::MOYEN_ONCE_TWO_MONTHS => '1 fois tous les deux mois',
];
/**
* @param string $typeShortName
*
* @return string
*/
public static function getTypeName($typeShortName)
{
if (!isset(static::$typeName[$typeShortName])) {
return "Unknown type ($typeShortName)";
}
return static::$typeName[$typeShortName];
}
/**
* @return array<string>
*/
public static function getAvailableTypes()
{
return [
self::MOYEN_ONCE_A_MONTH,
self::MOYEN_TWICE_A_MONTH,
self::MOYEN_ONCE_TWO_MONTHS,
];
}
}
...@@ -51,7 +51,7 @@ class DistributorSelfEvalPrestaQuizType extends SelfEvalPrestaQuizType ...@@ -51,7 +51,7 @@ class DistributorSelfEvalPrestaQuizType extends SelfEvalPrestaQuizType
$this->opts['label'] = "Transparence et juste rémunération : " . $this->labelEvalGlob; $this->opts['label'] = "Transparence et juste rémunération : " . $this->labelEvalGlob;
$this->opts['choices'] = $this->stdGlobalChoices; $this->opts['choices'] = $this->stdGlobalChoices;
$builder->add('transpar_global', ChoiceType::class, $this->opts); $builder->add('transpar_global', ChoiceType::class, $this->opts);
$builder->add('transpar_global_comment', TextareaType::class, $this->cmtOpts); $builder->add('transpar_global_comment', TextareaType::class, $this->globalCmtOpts);
/* PARTIE 4 : PRATIQUES AGRICOLES DURABLES */ /* PARTIE 4 : PRATIQUES AGRICOLES DURABLES */
$this->opts['label'] = "Détenez-vous des labels ou des certifications (AB, Bio, Nature et Progrès, système de garantie $this->opts['label'] = "Détenez-vous des labels ou des certifications (AB, Bio, Nature et Progrès, système de garantie
...@@ -75,7 +75,7 @@ class DistributorSelfEvalPrestaQuizType extends SelfEvalPrestaQuizType ...@@ -75,7 +75,7 @@ class DistributorSelfEvalPrestaQuizType extends SelfEvalPrestaQuizType
$this->opts['label'] = "Pratiques agricoles durables : " . $this->labelEvalGlob; $this->opts['label'] = "Pratiques agricoles durables : " . $this->labelEvalGlob;
$this->opts['choices'] = $this->stdGlobalChoices; $this->opts['choices'] = $this->stdGlobalChoices;
$builder->add('disagdur_global', ChoiceType::class, $this->opts); $builder->add('disagdur_global', ChoiceType::class, $this->opts);
$builder->add('disagdur_global_comment', TextareaType::class, $this->cmtOpts); $builder->add('disagdur_global_comment', TextareaType::class, $this->globalCmtOpts);
/* PARTIE 5 : LOCALITE DES PRODUITS */ /* PARTIE 5 : LOCALITE DES PRODUITS */
$this->opts['label'] = "Quelle est la provenance de l'offre alimentaire globale en produits bruts ?"; $this->opts['label'] = "Quelle est la provenance de l'offre alimentaire globale en produits bruts ?";
...@@ -97,7 +97,7 @@ class DistributorSelfEvalPrestaQuizType extends SelfEvalPrestaQuizType ...@@ -97,7 +97,7 @@ class DistributorSelfEvalPrestaQuizType extends SelfEvalPrestaQuizType
$this->opts['label'] = "Localité des produits : " . $this->labelEvalGlob; $this->opts['label'] = "Localité des produits : " . $this->labelEvalGlob;
$this->opts['choices'] = $this->stdGlobalChoices; $this->opts['choices'] = $this->stdGlobalChoices;
$builder->add('localite_global', ChoiceType::class, $this->opts); $builder->add('localite_global', ChoiceType::class, $this->opts);
$builder->add('localite_global_comment', TextareaType::class, $this->cmtOpts); $builder->add('localite_global_comment', TextareaType::class, $this->globalCmtOpts);
//Review //Review
if($options['mode'] !== self::PRESTA_EDIT) { if($options['mode'] !== self::PRESTA_EDIT) {
......
...@@ -4,7 +4,10 @@ namespace App\Form\Type; ...@@ -4,7 +4,10 @@ namespace App\Form\Type;
use App\Application\Sonata\MediaBundle\Entity\Media; use App\Application\Sonata\MediaBundle\Entity\Media;
use App\Entity\Prestataire; use App\Entity\Prestataire;
use App\Entity\PrestataireProductFamily;
use App\Form\Type\PrestataireProductFamilyFormType;
use Doctrine\ORM\EntityManagerInterface; use Doctrine\ORM\EntityManagerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use FOS\CKEditorBundle\Form\Type\CKEditorType; use FOS\CKEditorBundle\Form\Type\CKEditorType;
use Sonata\MediaBundle\Form\Type\MediaType; use Sonata\MediaBundle\Form\Type\MediaType;
use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\AbstractType;
...@@ -13,16 +16,20 @@ use Symfony\Component\Form\Extension\Core\Type\CollectionType; ...@@ -13,16 +16,20 @@ use Symfony\Component\Form\Extension\Core\Type\CollectionType;
use Symfony\Component\Form\Extension\Core\Type\SubmitType; use Symfony\Component\Form\Extension\Core\Type\SubmitType;
use Symfony\Component\Form\Extension\Core\Type\TextType; use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Component\Form\Extension\Core\Type\UrlType; use Symfony\Component\Form\Extension\Core\Type\UrlType;
use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
use Symfony\Component\Form\FormBuilderInterface; use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver; use Symfony\Component\OptionsResolver\OptionsResolver;
use App\Enum\ReconversionFrequencyEnum;
class PrestataireInfosFormType extends AbstractType class PrestataireInfosFormType extends AbstractType
{ {
protected $em; protected $em;
protected $container;
public function __construct(EntityManagerInterface $em) public function __construct(EntityManagerInterface $em, ContainerInterface $container)
{ {
$this->em = $em; $this->em = $em;
$this->container = $container;
} }
public function buildForm(FormBuilderInterface $builder, array $options) public function buildForm(FormBuilderInterface $builder, array $options)
...@@ -77,7 +84,40 @@ class PrestataireInfosFormType extends AbstractType ...@@ -77,7 +84,40 @@ class PrestataireInfosFormType extends AbstractType
->add('web', UrlType::class, [ ->add('web', UrlType::class, [
'label' => 'Site web :', 'label' => 'Site web :',
'required' => false, 'required' => false,
]) ]);
if ($this->container->getParameter('tav_env') && $this->container->getParameter('automatisation_reconversion')) {
$builder
->add('reconversionFrequency', ChoiceType::class, [
'choices' => ReconversionFrequencyEnum::getAvailableTypes(),
'choice_label' => function ($choice) {
return ReconversionFrequencyEnum::getTypeName($choice);
},
'expanded' => false,
'multiple' => false,
'label' => 'Fréquence de reconversion :',
'placeholder' => 'Choisir une option',
'required' => false,
]);
}
if ($this->container->getParameter('tav_env') && $this->container->getParameter('presta_extra_data')) {
$builder
->add('prestataireProductFamilies', CollectionType::class, [
'entry_type' => PrestataireProductFamilyFormType::class,
'required' => true,
'allow_add' => true,
'allow_delete' => true,
'by_reference' => false,
'constraints' => new \Symfony\Component\Validator\Constraints\Valid(),
'label' => "Produits vendus, regroupés par famille ",
'error_mapping' => [
'productFamily' => 'prestataireProductFamilies',
],
]);
}
$builder
->add('description', CKEditorType::class, [ ->add('description', CKEditorType::class, [
'label' => 'Description :', 'label' => 'Description :',
'required' => false, 'required' => false,
......
<?php
namespace App\Form\Type;
use App\Entity\PrestataireProductFamily;
use App\Entity\ProductFamily;
use Symfony\Component\Form\AbstractType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;
use Symfony\Component\Form\Extension\Core\Type\TextType;
use Symfony\Bridge\Doctrine\Form\Type\EntityType;
class PrestataireProductFamilyFormType extends AbstractType
{
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('productFamily', EntityType::class, array(
'class' => ProductFamily::class,
'choice_label' => 'name',
'label' => 'Famille de produits ',
'required' => true,
'placeholder' => 'Choisissez une famille',
'attr' => ['class' => 'prestataire-product-families-select']
))
->add('products', TextType::class, [
'label' => 'Produits ',
'required' => true,
'attr' => ['class' => 'prestataire-product-families-products']
])
;
}
public function configureOptions(OptionsResolver $resolver)
{
$resolver->setDefaults([
'data_class' => PrestataireProductFamily::class,
]);
}
public function getBlockPrefix()
{
return 'formPrestataireProductFamily';
}
}
...@@ -56,7 +56,7 @@ class ProducerSelfEvalPrestaQuizType extends SelfEvalPrestaQuizType ...@@ -56,7 +56,7 @@ class ProducerSelfEvalPrestaQuizType extends SelfEvalPrestaQuizType
$this->opts['label'] = "Pratiques agricoles durables : " . $this->labelEvalGlob . " (cochez vert si vous détenez un label ou une certification)"; $this->opts['label'] = "Pratiques agricoles durables : " . $this->labelEvalGlob . " (cochez vert si vous détenez un label ou une certification)";
$this->opts['choices'] = $this->stdGlobalChoices; $this->opts['choices'] = $this->stdGlobalChoices;
$builder->add('proagdur_global', ChoiceType::class, $this->opts); $builder->add('proagdur_global', ChoiceType::class, $this->opts);
$builder->add('proagdur_global_comment', TextareaType::class, $this->cmtOpts); $builder->add('proagdur_global_comment', TextareaType::class, $this->globalCmtOpts);
//Review //Review
if($options['mode'] !== self::PRESTA_EDIT) { if($options['mode'] !== self::PRESTA_EDIT) {
......
...@@ -30,6 +30,7 @@ class SelfEvalPrestaQuizType extends AbstractType ...@@ -30,6 +30,7 @@ class SelfEvalPrestaQuizType extends AbstractType
protected array $opts; protected array $opts;
protected array $reviewOpts; protected array $reviewOpts;
protected array $cmtOpts; protected array $cmtOpts;
protected array $globalCmtOpts;
protected array $reviewCmtOpts; protected array $reviewCmtOpts;
protected string $labelEvalGlob; protected string $labelEvalGlob;
protected string $reviewLabel; protected string $reviewLabel;
...@@ -79,10 +80,15 @@ class SelfEvalPrestaQuizType extends AbstractType ...@@ -79,10 +80,15 @@ class SelfEvalPrestaQuizType extends AbstractType
'required' => false, 'required' => false,
'disabled' => $options['mode'] === self::READONLY 'disabled' => $options['mode'] === self::READONLY
]; ];
$this->cmtOpts = $this->reviewCmtOpts; $this->cmtOpts = $this->reviewCmtOpts;
$this->cmtOpts['disabled'] = $options['mode'] !== self::PRESTA_EDIT; $this->cmtOpts['disabled'] = $options['mode'] !== self::PRESTA_EDIT;
$this->cmtOpts['attr']['placeholder'] = $options['mode'] !== self::PRESTA_EDIT ? '' : 'Commentaires'; $this->cmtOpts['attr']['placeholder'] = $options['mode'] !== self::PRESTA_EDIT ? '' : 'Commentaires';
$this->globalCmtOpts = $this->cmtOpts;
$this->globalCmtOpts['required'] = true;
$this->globalCmtOpts['attr']['placeholder'] = $options['mode'] !== self::PRESTA_EDIT ? '' : 'Commentaires (obligatoire)';
/* PARTIE 1 : ACCESSIBILITE ET INCLUSIVITE */ /* PARTIE 1 : ACCESSIBILITE ET INCLUSIVITE */
$this->opts['label'] = "Géographique et physique : le lieu est-il accessible par différents modes de transport ?"; $this->opts['label'] = "Géographique et physique : le lieu est-il accessible par différents modes de transport ?";
$this->opts['choices'] = [ $this->opts['choices'] = [
...@@ -116,7 +122,7 @@ class SelfEvalPrestaQuizType extends AbstractType ...@@ -116,7 +122,7 @@ class SelfEvalPrestaQuizType extends AbstractType
$this->opts['label'] = "Accessibilité et inclusivité : " . $this->labelEvalGlob; $this->opts['label'] = "Accessibilité et inclusivité : " . $this->labelEvalGlob;
$this->opts['choices'] = $this->stdGlobalChoices; $this->opts['choices'] = $this->stdGlobalChoices;
$builder->add('accessib_global', ChoiceType::class, $this->opts); $builder->add('accessib_global', ChoiceType::class, $this->opts);
$builder->add('accessib_global_comment', TextareaType::class, $this->cmtOpts); $builder->add('accessib_global_comment', TextareaType::class, $this->globalCmtOpts);
/* PARTIE 2 : BIEN-ETRE AU TRAVAIL */ /* PARTIE 2 : BIEN-ETRE AU TRAVAIL */
$this->opts['label'] = "Le lieu met-il en place des actions pour faciliter l'accueil, l'intégration et la formation des personnes qui y travaillent ?"; $this->opts['label'] = "Le lieu met-il en place des actions pour faciliter l'accueil, l'intégration et la formation des personnes qui y travaillent ?";
...@@ -138,7 +144,7 @@ class SelfEvalPrestaQuizType extends AbstractType ...@@ -138,7 +144,7 @@ class SelfEvalPrestaQuizType extends AbstractType
$this->opts['label'] = "Bien-être au travail : " . $this->labelEvalGlob; $this->opts['label'] = "Bien-être au travail : " . $this->labelEvalGlob;
$this->opts['choices'] = $this->stdGlobalChoices; $this->opts['choices'] = $this->stdGlobalChoices;
$builder->add('bienetre_global', ChoiceType::class, $this->opts); $builder->add('bienetre_global', ChoiceType::class, $this->opts);
$builder->add('bienetre_global_comment', TextareaType::class, $this->cmtOpts); $builder->add('bienetre_global_comment', TextareaType::class, $this->globalCmtOpts);
//Review //Review
if($options['mode'] !== self::PRESTA_EDIT) { if($options['mode'] !== self::PRESTA_EDIT) {
......
<?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 Version20240216095500 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 prestataire ADD reconversionFrequency VARCHAR(50) DEFAULT NULL, 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 prestataire DROP reconversionFrequency, CHANGE iban iban LONGTEXT CHARACTER SET utf8mb3 DEFAULT NULL COLLATE `utf8mb3_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 Version20240216140320 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 product_family (id CHAR(36) NOT NULL COMMENT \'(DC2Type:uuid)\', name VARCHAR(100) NOT NULL, PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$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 product_family');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban LONGTEXT CHARACTER SET utf8mb3 DEFAULT NULL COLLATE `utf8mb3_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 Version20240219140409 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 prestataire CHANGE iban iban LONGTEXT DEFAULT NULL COMMENT \'(DC2Type:personal_data)\'');
$this->addSql('CREATE UNIQUE INDEX UNIQ_C79A60FF5E237E06 ON product_family (name)');
}
public function down(Schema $schema) : void
{
// this down() migration is auto-generated, please modify it to your needs
$this->addSql('ALTER TABLE prestataire CHANGE iban iban LONGTEXT CHARACTER SET utf8mb3 DEFAULT NULL COLLATE `utf8mb3_general_ci` COMMENT \'(DC2Type:personal_data)\'');
$this->addSql('DROP INDEX UNIQ_C79A60FF5E237E06 ON product_family');
}
}
<?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 Version20240220101222 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 prestataire_product_family (id INT AUTO_INCREMENT NOT NULL, prestataire_id CHAR(36) NOT NULL COMMENT \'(DC2Type:uuid)\', product_family_id CHAR(36) NOT NULL COMMENT \'(DC2Type:uuid)\', products LONGTEXT NOT NULL, INDEX IDX_9B0F7A58BE3DB2B7 (prestataire_id), INDEX IDX_9B0F7A58ADFEE0E7 (product_family_id), UNIQUE INDEX prestataireproductfamily (prestataire_id, product_family_id), PRIMARY KEY(id)) DEFAULT CHARACTER SET utf8 COLLATE `utf8_general_ci` ENGINE = InnoDB');
$this->addSql('ALTER TABLE prestataire_product_family ADD CONSTRAINT FK_9B0F7A58BE3DB2B7 FOREIGN KEY (prestataire_id) REFERENCES prestataire (id)');
$this->addSql('ALTER TABLE prestataire_product_family ADD CONSTRAINT FK_9B0F7A58ADFEE0E7 FOREIGN KEY (product_family_id) REFERENCES product_family (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 prestataire_product_family');
$this->addSql('ALTER TABLE prestataire CHANGE iban iban LONGTEXT CHARACTER SET utf8mb3 DEFAULT NULL COLLATE `utf8mb3_general_ci` COMMENT \'(DC2Type:personal_data)\'');
}
}
<?php
namespace App\Repository;
use App\Entity\PrestataireProductFamily;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\OptimisticLockException;
use Doctrine\ORM\ORMException;
use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<PrestataireProductFamily>
*
* @method PrestataireProductFamily|null find($id, $lockMode = null, $lockVersion = null)
* @method PrestataireProductFamily|null findOneBy(array $criteria, array $orderBy = null)
* @method PrestataireProductFamily[] findAll()
* @method PrestataireProductFamily[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class PrestataireProductFamilyRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, PrestataireProductFamily::class);
}
/**
* @throws ORMException
* @throws OptimisticLockException
*/
public function add(PrestataireProductFamily $entity, bool $flush = true): void
{
$this->_em->persist($entity);
if ($flush) {
$this->_em->flush();
}
}
/**
* @throws ORMException
* @throws OptimisticLockException
*/
public function remove(PrestataireProductFamily $entity, bool $flush = true): void
{
$this->_em->remove($entity);
if ($flush) {
$this->_em->flush();
}
}
// /**
// * @return PrestataireProductFamily[] Returns an array of PrestataireProductFamily objects
// */
/*
public function findByExampleField($value)
{
return $this->createQueryBuilder('p')
->andWhere('p.exampleField = :val')
->setParameter('val', $value)
->orderBy('p.id', 'ASC')
->setMaxResults(10)
->getQuery()
->getResult()
;
}
*/
/*
public function findOneBySomeField($value): ?PrestataireProductFamily
{
return $this->createQueryBuilder('p')
->andWhere('p.exampleField = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
*/
}
<?php
namespace App\Repository;
use App\Entity\ProductFamily;
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
use Doctrine\ORM\OptimisticLockException;
use Doctrine\ORM\ORMException;
use Doctrine\Persistence\ManagerRegistry;
/**
* @extends ServiceEntityRepository<ProductFamily>
*
* @method ProductFamily|null find($id, $lockMode = null, $lockVersion = null)
* @method ProductFamily|null findOneBy(array $criteria, array $orderBy = null)
* @method ProductFamily[] findAll()
* @method ProductFamily[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
*/
class ProductFamilyRepository extends ServiceEntityRepository
{
public function __construct(ManagerRegistry $registry)
{
parent::__construct($registry, ProductFamily::class);
}
/**
* @throws ORMException
* @throws OptimisticLockException
*/
public function add(ProductFamily $entity, bool $flush = true): void
{
$this->_em->persist($entity);
if ($flush) {
$this->_em->flush();
}
}
/**
* @throws ORMException
* @throws OptimisticLockException
*/
public function remove(ProductFamily $entity, bool $flush = true): void
{
$this->_em->remove($entity);
if ($flush) {
$this->_em->flush();
}
}
// /**
// * @return ProductFamily[] Returns an array of ProductFamily objects
// */
/*
public function findByExampleField($value)
{
return $this->createQueryBuilder('p')
->andWhere('p.exampleField = :val')
->setParameter('val', $value)
->orderBy('p.id', 'ASC')
->setMaxResults(10)
->getQuery()
->getResult()
;
}
*/
/*
public function findOneBySomeField($value): ?ProductFamily
{
return $this->createQueryBuilder('p')
->andWhere('p.exampleField = :val')
->setParameter('val', $value)
->getQuery()
->getOneOrNullResult()
;
}
*/
}
...@@ -5,8 +5,35 @@ ...@@ -5,8 +5,35 @@
{% endblock blocktitle %} {% endblock blocktitle %}
{% block blocksubtitle %} {% block blocksubtitle %}
{% endblock blocksubtitle %} {% endblock blocksubtitle %}
{% block blockcontent %} {% block blockcontent %}
{% set form = getPrestataireInfosForm(app.user) %} {% set form = getPrestataireInfosForm(app.user) %}
{# Create "template" as a macro for a product family entry in the form collection #}
{% import _self as formMacros %}
{% macro printPrestataireProductFamilyForm(prestataireProductFamilyForm, formName = "") %}
<div class="presta-products-family">
<div class="presta-products-family-fields">
<div class="form-group presta-products-family-form-group">
{{ form_label(prestataireProductFamilyForm.productFamily) }}
{{ form_widget(prestataireProductFamilyForm.productFamily) }}
</div>
<div class="form-group presta-products-family-form-group">
{{ form_label(prestataireProductFamilyForm.products) }}
{{ form_widget(prestataireProductFamilyForm.products) }}
</div>
<div class="presta-products-family-duplicate-warning">{{'Cette famille de produits est déjà renseignée.'|trans}}</div>
</div>
<a href="#" class="presta-products-family-delete">
<i
class="fa fa-times delete-icon"
id="formPrestataireInfos_prestataireProductFamilies_{{ formName == '' ? '__name__' : formName }}_delete"
></i>
</a>
</div>
{% endmacro %}
{{form_start(form)}} {{form_start(form)}}
{{ form_row(form.raison) }} {{ form_row(form.raison) }}
{{ form_row(form.statut) }} {{ form_row(form.statut) }}
...@@ -24,6 +51,9 @@ ...@@ -24,6 +51,9 @@
{{ form_row(form.metier) }} {{ form_row(form.metier) }}
{{ form_row(form.horaires) }} {{ form_row(form.horaires) }}
{{ form_row(form.web) }} {{ form_row(form.web) }}
{% if form.reconversionFrequency is defined %}
{{ form_row(form.reconversionFrequency) }}
{% endif %}
<hr/> <hr/>
{{ form_row(form.media) }} {{ form_row(form.media) }}
{{ form_row(form.description) }} {{ form_row(form.description) }}
...@@ -39,6 +69,31 @@ ...@@ -39,6 +69,31 @@
<hr/> <hr/>
{{ form_row(form.newcaissiers) }} {{ form_row(form.newcaissiers) }}
<hr/> <hr/>
{% if form.prestataireProductFamilies is defined %}
<h4>{{ form_label(form.prestataireProductFamilies) }}</h4>
{{ form_errors(form.prestataireProductFamilies) }}
<div
class="presta-products-families-list"
data-index="{{ form.prestataireProductFamilies|length > 0 ? form.prestataireProductFamilies|last.vars.name + 1 : 0 }}"
data-prototype="{{ formMacros.printPrestataireProductFamilyForm(form.prestataireProductFamilies.vars.prototype)|e('html_attr') }}"
>
{% for prestataireProductFamilyForm in form.prestataireProductFamilies %}
{{ formMacros.printPrestataireProductFamilyForm(prestataireProductFamilyForm, prestataireProductFamilyForm.vars.name) }}
{% endfor %}
{% do form.prestataireProductFamilies.setRendered() %}
</div>
<button
type="button"
id="add-prestataire-products-family"
class="btn-primary btn"
data-collection-holder-class="presta-products-families-list"
>
<i class="fa fa-plus"></i>
</button>
<hr/>
{% endif %}
{{ form_row(form.acceptemlc) }} {{ form_row(form.acceptemlc) }}
{{ form_row(form.save) }} {{ form_row(form.save) }}
{{form_end(form)}} {{form_end(form)}}
......
...@@ -1852,9 +1852,9 @@ caniuse-api@^3.0.0: ...@@ -1852,9 +1852,9 @@ caniuse-api@^3.0.0:
lodash.uniq "^4.5.0" lodash.uniq "^4.5.0"
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001489: caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001489:
version "1.0.30001491" version "1.0.30001589"
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001491.tgz" resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001589.tgz"
integrity sha512-17EYIi4TLnPiTzVKMveIxU5ETlxbSO3B6iPvMbprqnKh4qJsQGk5Nh1Lp4jIMAE0XfrujsJuWZAM3oJdMHaKBA== integrity sha512-vNQWS6kI+q6sBlHbh71IIeC+sRwK2N3EDySc/updIGhIee2x5z00J4c1242/5/d6EpEMdOnk/m+6tuk4/tcsqg==
chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.2: chalk@^2.0.0, chalk@^2.3.2, chalk@^2.4.2:
version "2.4.2" version "2.4.2"
......
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