Bonjour,

Je rencontre un petit problème avec mon code, je suis novice en symfony et je viens juste de commence à l'utiliser, je veux gérer le stock de mes articles, alors j'ai entity Articles, et Vendu, je veux quand je valide ma vente diminuer la quantité vendu de ma quantité en stock.

table article
<?php

namespace App\Entity;

use App\Repository\ArticlesRepository;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\Common\Collections\Collection;
use Doctrine\ORM\Mapping as ORM;

/**

  • @ORM\Entity(repositoryClass=ArticlesRepository::class)
    */
    class Articles
    {
    /**

    • @ORM\Id
    • @ORM\GeneratedValue
    • @ORM\Column(type="integer")
      */
      private $id;

    /**

    • @ORM\Column(type="string", length=255)
      */
      private $designation;

    /**

    • @ORM\Column(type="integer")
      */
      private $quantite;

    /**

    • @ORM\Column(type="float")
      */
      private $prix;

    /**

    • @ORM\ManyToOne(targetEntity=Categorie::class, inversedBy="articles")
    • @ORM\JoinColumn(nullable=false)
      */
      private $categorie;

    /**

    • @ORM\OneToMany(targetEntity=Vendu::class, mappedBy="article", orphanRemoval=true)
      */

    private $article;

    public function __construct()
    {
    $this->article = new ArrayCollection();
    }

    public function getId(): ?int
    {
    return $this->id;
    }

    public function getDesignation(): ?string
    {
    return $this->designation;
    }

    public function setDesignation(string $designation): self
    {
    $this->designation = $designation;

    return $this;

    }

    public function getQuantite(): ?int
    {
    return $this->quantite;
    }

    public function setQuantite(int $quantite): self
    {
    $this->quantite = $quantite;

    return $this;

    }

    public function getPrix(): ?float
    {
    return $this->prix;
    }

    public function setPrix(float $prix): self
    {
    $this->prix = $prix;

    return $this;

    }

    public function getCategorie(): ?Categorie
    {
    return $this->categorie;
    }

    public function setCategorie(?Categorie $categorie): self
    {
    $this->categorie = $categorie;

    return $this;

    }

    /**

    • @return Collection|Vendu[]
      */
      public function getArticle(): Collection
      {
      return $this->article;
      }

    public function addArticle(Vendu $article): self
    {
    if (!$this->article->contains($article)) {
    $this->article[] = $article;
    $article->setArticle($this);
    }

    return $this;

    }

    public function removeArticle(Vendu $article): self
    {
    if ($this->article->removeElement($article)) {
    // set the owning side to null (unless already changed)
    if ($article->getArticle() === $this) {
    $article->setArticle(null);
    }
    }

    return $this;

    }
    public function __toString()
    {
    return $this->designation;
    }
    }
    table vendu
    <?php

namespace App\Entity;

use App\Repository\VenduRepository;
use Doctrine\ORM\Mapping as ORM;

/**

  • @ORM\Entity(repositoryClass=VenduRepository::class)
    */
    class Vendu
    {
    /**

    • @ORM\Id
    • @ORM\GeneratedValue
    • @ORM\Column(type="integer")
      */
      private $id;

    /**

    • @ORM\Column(type="integer")
      */
      private $quantite;

    /**

    • @ORM\Column(type="float")
      */
      private $prix_vente;

    /**

    • @ORM\Column(type="date")
      */
      private $date;

    /**

    • @ORM\ManyToOne(targetEntity=Articles::class, inversedBy="article")
    • @ORM\JoinColumn(nullable=false)
      */
      private $article;

    /**

    • @ORM\ManyToOne(targetEntity=Client::class, inversedBy="client")
    • @ORM\JoinColumn(nullable=false)
      */
      private $client;

    public function getId(): ?int
    {
    return $this->id;
    }

    public function getQuantite(): ?int
    {
    return $this->quantite;
    }

    public function setQuantite(int $quantite): self
    {
    $this->quantite = $quantite;

    return $this;

    }

    public function getPrixVente(): ?float
    {
    return $this->prix_vente;
    }

    public function setPrixVente(float $prix_vente): self
    {
    $this->prix_vente = $prix_vente;

    return $this;

    }

    public function getDate(): ?\DateTimeInterface
    {
    return $this->date;
    }

    public function setDate(\DateTimeInterface $date): self
    {
    $this->date = $date;

    return $this;

    }

    public function getArticle(): ?Articles
    {
    return $this->article;
    }

    public function setArticle(?Articles $article): self
    {
    $this->article = $article;

    return $this;

    }

    public function getClient(): ?Client
    {
    return $this->client;
    }

    public function setClient(?Client $client): self
    {
    $this->client = $client;

    return $this;

    }
    }

Ce que je veux

insérer ma formule aprés ce submit dans ma classe venducontroller.php

/**

  • @Route("/new", name="vendu_new", methods={"GET","POST"})
    */
    public function new(Request $request): Response
    {
    $vendu = new Vendu();
    $form = $this->createForm(VenduType::class, $vendu);
    $form->handleRequest($request);

    if ($form->isSubmitted() && $form->isValid()) {
        $entityManager = $this->getDoctrine()->getManager();
        $entityManager->persist($vendu);
        $entityManager->flush();
    
        return $this->redirectToRoute('vendu_index');
    }
    
    return $this->render('vendu/new.html.twig', [
        'vendu' => $vendu,
        'form' => $form->createView(),
    ]);

    }

13 réponses


kious
Auteur
Réponse acceptée

cybercraft

$article = $data->getArticle(); Je récupére l'article depuis la vente soumise. (Data contient la vente que je récupére depuis le formulaire)

$qtLeft = $article->getQuantite(); Je récupère le quantité restante depuis l'article.

est ce que ces deux variables sont les memes.

Hello,

Afin que nous puissions t'aider peux-tu avant tout reformater le code afin de le rendre lisible stp ;)

Merci de formater un peu le sujet car là le code n'est pas lisible. Le forum utilise Markdown

kious
Auteur

bonjour,

désolée pour le retard, ce que je veux faire c'est de modifier la quantité de la table article selon la quantité vendu de la table vendu et cela aprés un submit dans création d'une nouvelle vente

merci

Pourrais-tu reformater le code... C'est un peu illisible (j'ai la flemme de décrypter)...

De ce que je comprend, tu as 2 solutions :

  • il te faudrait un EventListener/EventSubscriber pour "écouter" lorsque tu soumet un "vendu" pour modifier de facto l'entité "article" concerné.
  • Tu récupére l'article pour ensuite modifier la quantité.

La première solution permet de dispatcher la mécanique de gestion des stock de ton article de la mécanique de ventes. La 2è et plus... direct.

PS : Evite d'appeller "article" un relation de Article->Vendu en OneToMany... Pour moi, ca devrait s'appeler : private $ventes
Je pense que tu confond l'action et l'entité. Vendu devrait s'appeler "Vente". Lorsque tu vends un article, tu créer une vente qui est la représentation de ta vente. L'action de vendre est dédié au controlleur car c'est la méthode qui va créer ton record donc ta vente.

Voici une ébauche de la 2e solution avec mes remarques :

class VenteController extends AbstractController
{

   // ...

    public function create($request)
    {
        $vente = new Vente();
        $form = $this->createForm(VenteType::class, $vente);
        $form->handleRequest($request);

        if ($form->isSubmitted() && $form->isValid()) {
            $em = $this->getDoctrine()->getManager();

            // Get "vente" from form data and create
            /** var Vente data **/
            $data = $form->getData();           
            $em->persist($data)

            // Update Article quantity
            $article = $data->getArticle();
            $qtLeft = $article->getQuantite();
            $newQt = $qtLeft - $data->getQuantite();
            $article->setQuantite($newQt);

            $em->persist($article)
            $em->flush();

            return $this->redirectToRoute('vendu_index');
        }

        return $this->render('vente/new.html.twig', [
            'vente' => $vente,
            'form' => $form->createView(),
        ]);
    }

    // ...
kious
Auteur

merci beaucoup cybercraft ça fonctionne

kious
Auteur

cybercraft pourriez-vous m'expliquer ces lignes?

$article = $data->getArticle();
$qtLeft = $article->getQuantite();
$newQt = $qtLeft - $data->getQuantite();
$article->setQuantite($newQt);

malgré que ça marche je ne comprend pas bien le principe puisque $qtLeft c'est la quantité vendu

$article = $data->getArticle(); Je récupére l'article depuis la vente soumise. (Data contient la vente que je récupére depuis le formulaire)

$qtLeft = $article->getQuantite(); Je récupère le quantité restante depuis l'article.

$newQt = $qtLeft - $data->getQuantite(); Je récupére la quantité vendu depuis la vente que je soustrais à la quantité restante de l'article.

$article->setQuantite($newQt); J'enregistre la nouvelle quantité restante dans l'article.

PS : Si c'est réglé, pourrais-tu passer le post en résolu.

Oui, ce sont les-mêmes. Je passe par la vente pour récupérer l'article vendu.

kious
Auteur

bonjour, mais dans $article vous récupérez les informations de la vente, donc $sqtleft va recevoir la quantité vendu

$article = $data->getArtcile(), je récupère l'article depuis la vente. $data = La vente.

kious
Auteur

merci beaucoup cybercraft, j'ai compris le principe, je galère un petit peux avec symfony.

Pas de soucis. Dans ton entité "vendu", tu as une relation vers l'article et un "accesseur" vers l'entité (getArticle()). Je me sert juste de ce que tu as codé.