Jump to content

Mise à jour quantité des déclinaisons


Recommended Posts

Bonjour,

 

J'utilise la version 1.6 de prestashop.

 

Je cherche à modifier en masse les quantités des déclinaisons de mon site internet via le système d'import des déclinaisons de Prestashop.

 

Le problème est que je dois sélectionner l'option "supprimer les déclinaisons avant l'import" car sinon les déclinaisons ayant la même valeur sont doublées alors que je souhaiterais simplement mettre à jour la quantité de la déclinaison souhaitée.

 

Si je choisis l'option "supprimer les déclinaisons avant l'import" toutes les déclinaisons qui sont associées à des paniers sont supprimées, donc les clients ne retrouvent pas leur panier complet après cet import en masse.

 

En résumé, comment faire pour mettre à jour en masse les quantités de mes déclinaisons sans les supprimer toutes au préalable ?

 

Merci par avance pour votre aide.

 

jrm

 

 

Link to comment
Share on other sites

Bon, pour ceux que ça pourrait intéresser, voici comment je me suis pris.

C'est moche mais ça marche, les déclinaisons présentes dans mes paniers ne sont plus effacés.

 

J'ai créé le script suivant (sous Zend) qui attaque en direct la base de données après avoir récupéré un export depuis mon ERP.

$chemin_destination =  dirname(APPLICATION_PATH) . DIRECTORY_SEPARATOR . "public" . DIRECTORY_SEPARATOR . "files" . DIRECTORY_SEPARATOR;
            $finalFilename = $chemin_destination . $_FILES['file']['name'];
            move_uploaded_file($_FILES['file']['tmp_name'], $finalFilename);

            // Recupération de tous les produits de l'export ERP
            $i=0;
            $productDatas = array();
            $firstline = array();
            if (($handle = fopen($finalFilename, "r")) !== FALSE) 
            {
                while (($data = fgetcsv($handle, 1000, ";")) !== FALSE)
                {
                    if ($i >0)
                    {
                        $productDatas[] = $data;
                    }
                    else
                    {
                        $firstline = $data;
                    }
                    $i++;
                }
            }
            
            
            foreach ($productDatas as $productData)
            {
                $designation = $productData[0];
                $reference = $productData[1];
                $price = $productData[2];
                $quantite = $productData[3];
                $stockType = $productData[4];
                $size = $productData[5];
                
                
                // Recherche de la ligne produit associé
                $SQL = "SELECT pac.id_product_attribute, ps.id_product FROM  `ps_product` ps "
                        . "INNER JOIN ps_product_attribute pa ON ps.id_product = pa.id_product "
                        . "INNER JOIN ps_product_attribute_combination pac ON pa.id_product_attribute = pac.id_product_attribute "
                        . "INNER JOIN ps_attribute_lang pl ON pl.id_attribute = pac.id_attribute "
                        . "WHERE  ps.reference = '$reference' and pl.name = '$size' ";
                $result = $this->_getDbAdapater()->fetchAll($SQL);
                
                // On a trouvé la déclinaison et toutes ses informations
                // Update du stock
                if ($result && isset($result[0]))
                {
                    $id_product_attribute = $result[0]['id_product_attribute'];
                    $id_product = $result[0]['id_product'];
                    // mise à jour de la quantité
                    $sqlUpdate = "UPDATE ps_stock_available SET quantity = $quantite "
                            . "where id_product_attribute = $id_product_attribute AND id_product = $id_product";
                    $this->_getDbAdapater()->query($sqlUpdate);
                    
                    // log
                     $line = date('Y-m-d h:i:s') . " - MAJ -- id_product : $id_product -- reference : $reference -- taille : $size -- nouveau stock : $quantite   " . "\n";
                     file_put_contents($chemin_destination . "update_bague.txt", $line, FILE_APPEND);
                    
                }
            }
Link to comment
Share on other sites

  • 9 months later...

Bonjour,

 

J'ia besoin de mettre à jour mes quantités (aucun gestion de stock avancée) sur mes produits sans déclinaison.

J'ai mis à jour par conséquent le chiffre du champ `quantity` présent dans la table `stock_available`

Sans déclinaison, aucune ligne dans la table product_attribute

 

Problème dans le back-end,ça affiche toujours aucun chiffre

 
Mise à jour à 2 des quantités dont le nombre est strictement inférieur à2
 
Requete : update stock_available set quantity=2 where quantity < 2;
 
Problème, au niveau du back_end, la quantité reste à 0 ou 1 si elle était à 0
 
Je ne comprends pas pourquoi car en faisant la mise à jour par le back-end il semble n'écrire que dans cette table si aucune déclinaison n'est défini sur le produit.
 
Avez-vous une idée ? Je n'ai pas épluché le code source php de ce que fait l'enregistrement de la fiche produit et donc des mises à jour dans les tables.
 
 
Merci de votre aide.
Link to comment
Share on other sites

salut,

 

Perso, j'ai été confronté à un besoin identique de mise à jour des données de la base de données à partir d'un fichier extérieur.

Je suis plus à l'aise en sql qu'en php.

 

Perso, j'ai créée une table qui me sert de stockage des données à importer. 

 

Tu vides cette table avant d'importer toutes les données de ton fichier.

Ensuite, tu fais une requête sql en faisant les jointures de cette table avec les tables product et product_attribute pour trouver l'id_product en fonction de ta ref.

 

Le résultat de la requête sera un peu long (3 à 4 secondes) car les ref de product et product_attribute ne sont pas indexées.

 

et tu mets à jour ta base de données en parcourant en php les résultats de la requête.

 

En plus avec la requête tu peux même détecter si les quantités doivent être modifiées, ça réduira le parcours qu'aux mises à jour réelles.....

 

 

rv

Edited by rvcat (see edit history)
Link to comment
Share on other sites

@rvcat : merci de ta réponse.

 

Ce que je ne comprends pas;  c'est le fait qu'en passant en base de données et en faisant la mise à jour qui est fonctionnel en base de données (vérifié via un select) toutes mes quantités sont = ou > à 2

 

Pourquoi dans le back-end, ces quantités ne sont pas affichées ? Est-ce une autre table qui gère celà ?

Si je fais la mise à jour à 2 d 'un quantité à 0, la valeur du champ de la table que j'ai modifié par requête se met à jour comme si je le faisais en base.

Je ne comprends pas.

 

j'ai fais un commit au cas ou mais ça ne change rien.

 

Quelqu'un a -t-il une explication ?

 

Merci encore.

Link to comment
Share on other sites

Bonjour,

après analyse, je me suis rendu compte que j'avais oublié de faire un truc dans la base. En fait, à l'enregistrement via le back end , il fait une insertion dans la table. Du coup j'ai fait les insertions en base SQL dans la table 'stock_available' pour que ça fonctionne et c'est OK

 

 

INSERT INTO `stock_available` (`id_stock_available`,`id_product_attribute`,`id_shop`,`id_shop_group`,`quantity`,`depends_on_stock`,`out_of_stock`,`id_product`)
VALUES
('',0,1,0,2,0,2,2),
('',0,1,0,2,0,2,3),
('',0,1,0,2,0,2,10),
('',0,1,0,2,0,2,17),
('',0,1,0,2,0,2,18),
('',0,1,0,2,0,2,19),
('',0,1,0,2,0,2,20),
('',0,1,0,2,0,2,21),
('',0,1,0,2,0,2,22),
('',0,1,0,2,0,2,23),
('',0,1,0,2,0,2,24),
('',0,1,0,2,0,2,25),
('',0,1,0,2,0,2,26),
('',0,1,0,2,0,2,27),
('',0,1,0,2,0,2,28),
('',0,1,0,2,0,2,29),
('',0,1,0,2,0,2,30),
('',0,1,0,2,0,2,31),
('',0,1,0,2,0,2,32),
('',0,1,0,2,0,2,33),
('',0,1,0,2,0,2,34),
('',0,1,0,2,0,2,35),
('',0,1,0,2,0,2,36),
('',0,1,0,2,0,2,37),
('',0,1,0,2,0,2,38),
('',0,1,0,2,0,2,39),
('',0,1,0,2,0,2,40),
('',0,1,0,2,0,2,41),
('',0,1,0,2,0,2,42),
('',0,1,0,2,0,2,43),
('',0,1,0,2,0,2,44),
('',0,1,0,2,0,2,45),
('',0,1,0,2,0,2,46),
('',0,1,0,2,0,2,47),
('',0,1,0,2,0,2,48),
('',0,1,0,2,0,2,49),
('',0,1,0,2,0,2,50),
('',0,1,0,2,0,2,51),
('',0,1,0,2,0,2,52),
('',0,1,0,2,0,2,56),
('',0,1,0,2,0,2,57),
('',0,1,0,2,0,2,58),
('',0,1,0,2,0,2,59),
('',0,1,0,2,0,2,60),
('',0,1,0,2,0,2,61),
('',0,1,0,2,0,2,62),
('',0,1,0,2,0,2,63),
('',0,1,0,2,0,2,64),
('',0,1,0,2,0,2,65),
('',0,1,0,2,0,2,66),
('',0,1,0,2,0,2,67),
('',0,1,0,2,0,2,68),
('',0,1,0,2,0,2,69),
('',0,1,0,2,0,2,70),
('',0,1,0,2,0,2,72),
('',0,1,0,2,0,2,79),
('',0,1,0,2,0,2,86),
('',0,1,0,2,0,2,87),
('',0,1,0,2,0,2,92),
('',0,1,0,2,0,2,93),
('',0,1,0,2,0,2,94),
('',0,1,0,2,0,2,95),
('',0,1,0,2,0,2,96),
('',0,1,0,2,0,2,97),
('',0,1,0,2,0,2,99),
('',0,1,0,2,0,2,100),
('',0,1,0,2,0,2,101),
('',0,1,0,2,0,2,103),
('',0,1,0,2,0,2,104),
('',0,1,0,2,0,2,105),
('',0,1,0,2,0,2,107),
('',0,1,0,2,0,2,109),
('',0,1,0,2,0,2,110),
('',0,1,0,2,0,2,111),
('',0,1,0,2,0,2,112),
('',0,1,0,2,0,2,113),
('',0,1,0,2,0,2,114),
('',0,1,0,2,0,2,115),
('',0,1,0,2,0,2,116),
('',0,1,0,2,0,2,117),
('',0,1,0,2,0,2,118),
('',0,1,0,2,0,2,119),
('',0,1,0,2,0,2,121),
('',0,1,0,2,0,2,125),
('',0,1,0,2,0,2,140),
('',0,1,0,2,0,2,141),
('',0,1,0,2,0,2,142),
('',0,1,0,2,0,2,143),
('',0,1,0,2,0,2,144),
('',0,1,0,2,0,2,145),
('',0,1,0,2,0,2,146),
('',0,1,0,2,0,2,147),
('',0,1,0,2,0,2,148),
('',0,1,0,2,0,2,149),
('',0,1,0,2,0,2,150),
('',0,1,0,2,0,2,151),
('',0,1,0,2,0,2,152),
('',0,1,0,2,0,2,153),
('',0,1,0,2,0,2,154),
('',0,1,0,2,0,2,155),
('',0,1,0,2,0,2,156),
('',0,1,0,2,0,2,157),
('',0,1,0,2,0,2,158),
('',0,1,0,2,0,2,159),
('',0,1,0,2,0,2,160),
('',0,1,0,2,0,2,161),
('',0,1,0,2,0,2,162),
('',0,1,0,2,0,2,163),
('',0,1,0,2,0,2,164),
('',0,1,0,2,0,2,165),
('',0,1,0,2,0,2,166),
('',0,1,0,2,0,2,167),
('',0,1,0,2,0,2,168),
('',0,1,0,2,0,2,169),
('',0,1,0,2,0,2,170),
('',0,1,0,2,0,2,171),
('',0,1,0,2,0,2,172),
('',0,1,0,2,0,2,173),
('',0,1,0,2,0,2,174),
('',0,1,0,2,0,2,180),
('',0,1,0,2,0,2,181),
('',0,1,0,2,0,2,182),
('',0,1,0,2,0,2,183),
('',0,1,0,2,0,2,184),
('',0,1,0,2,0,2,185),
('',0,1,0,2,0,2,186),
('',0,1,0,2,0,2,187),
('',0,1,0,2,0,2,188),
('',0,1,0,2,0,2,189),
('',0,1,0,2,0,2,190),
('',0,1,0,2,0,2,191),
('',0,1,0,2,0,2,192),
('',0,1,0,2,0,2,193),
('',0,1,0,2,0,2,194),
('',0,1,0,2,0,2,195),
('',0,1,0,2,0,2,196),
('',0,1,0,2,0,2,197),
('',0,1,0,2,0,2,199),
('',0,1,0,2,0,2,200),
('',0,1,0,2,0,2,201),
('',0,1,0,2,0,2,202),
('',0,1,0,2,0,2,213),
('',0,1,0,2,0,2,214),
('',0,1,0,2,0,2,215),
('',0,1,0,2,0,2,217),
('',0,1,0,2,0,2,218),
('',0,1,0,2,0,2,219),
('',0,1,0,2,0,2,220),
('',0,1,0,2,0,2,221),
('',0,1,0,2,0,2,222),
('',0,1,0,2,0,2,223),
('',0,1,0,2,0,2,224),
('',0,1,0,2,0,2,225),
('',0,1,0,2,0,2,226),
('',0,1,0,2,0,2,227),
('',0,1,0,2,0,2,228),
('',0,1,0,2,0,2,229),
('',0,1,0,2,0,2,230),
('',0,1,0,2,0,2,231),
('',0,1,0,2,0,2,232),
('',0,1,0,2,0,2,233),
('',0,1,0,2,0,2,234),
('',0,1,0,2,0,2,235),
('',0,1,0,2,0,2,236),
('',0,1,0,2,0,2,237),
('',0,1,0,2,0,2,238),
('',0,1,0,2,0,2,266),
('',0,1,0,2,0,2,267),
('',0,1,0,2,0,2,268),
('',0,1,0,2,0,2,269),
('',0,1,0,2,0,2,270),
('',0,1,0,2,0,2,271),
('',0,1,0,2,0,2,272),
('',0,1,0,2,0,2,273),
('',0,1,0,2,0,2,274),
('',0,1,0,2,0,2,278),
('',0,1,0,2,0,2,279),
('',0,1,0,2,0,2,280),
('',0,1,0,2,0,2,281),
('',0,1,0,2,0,2,282),
('',0,1,0,2,0,2,283),
('',0,1,0,2,0,2,295),
('',0,1,0,2,0,2,296),
('',0,1,0,2,0,2,297),
('',0,1,0,2,0,2,298),
('',0,1,0,2,0,2,299),
('',0,1,0,2,0,2,300),
('',0,1,0,2,0,2,301),
('',0,1,0,2,0,2,302),
('',0,1,0,2,0,2,303),
('',0,1,0,2,0,2,304),
('',0,1,0,2,0,2,305),
('',0,1,0,2,0,2,306),
('',0,1,0,2,0,2,307),
('',0,1,0,2,0,2,308),
('',0,1,0,2,0,2,310),
('',0,1,0,2,0,2,311),
('',0,1,0,2,0,2,312),
('',0,1,0,2,0,2,313),
('',0,1,0,2,0,2,318),
('',0,1,0,2,0,2,320),
('',0,1,0,2,0,2,328),
('',0,1,0,2,0,2,329),
('',0,1,0,2,0,2,330),
('',0,1,0,2,0,2,332),
('',0,1,0,2,0,2,333),
('',0,1,0,2,0,2,334),
('',0,1,0,2,0,2,335),
('',0,1,0,2,0,2,336),
('',0,1,0,2,0,2,337),
('',0,1,0,2,0,2,338),
('',0,1,0,2,0,2,340),
('',0,1,0,2,0,2,341),
('',0,1,0,2,0,2,342),
('',0,1,0,2,0,2,343),
('',0,1,0,2,0,2,344),
('',0,1,0,2,0,2,345),
('',0,1,0,2,0,2,346),
('',0,1,0,2,0,2,347),
('',0,1,0,2,0,2,348),
('',0,1,0,2,0,2,351),
('',0,1,0,2,0,2,359),
('',0,1,0,2,0,2,362),
('',0,1,0,2,0,2,368),
('',0,1,0,2,0,2,369),
('',0,1,0,2,0,2,398),
('',0,1,0,2,0,2,409),
('',0,1,0,2,0,2,410),
('',0,1,0,2,0,2,412),
('',0,1,0,2,0,2,415),
('',0,1,0,2,0,2,417),
('',0,1,0,2,0,2,419),
('',0,1,0,2,0,2,420),
('',0,1,0,2,0,2,424),
('',0,1,0,2,0,2,425),
('',0,1,0,2,0,2,426),
('',0,1,0,2,0,2,427),
('',0,1,0,2,0,2,432),
('',0,1,0,2,0,2,437),
('',0,1,0,2,0,2,444),
('',0,1,0,2,0,2,445),
('',0,1,0,2,0,2,446),
('',0,1,0,2,0,2,447),
('',0,1,0,2,0,2,449),
('',0,1,0,2,0,2,450),
('',0,1,0,2,0,2,451),
('',0,1,0,2,0,2,452),
('',0,1,0,2,0,2,453),
('',0,1,0,2,0,2,454),
('',0,1,0,2,0,2,455),
('',0,1,0,2,0,2,456),
('',0,1,0,2,0,2,458),
('',0,1,0,2,0,2,459),
('',0,1,0,2,0,2,460),
('',0,1,0,2,0,2,461),
('',0,1,0,2,0,2,462),
('',0,1,0,2,0,2,463),
('',0,1,0,2,0,2,465),
('',0,1,0,2,0,2,469),
('',0,1,0,2,0,2,470),
('',0,1,0,2,0,2,472),
('',0,1,0,2,0,2,473),
('',0,1,0,2,0,2,474),
('',0,1,0,2,0,2,475),
('',0,1,0,2,0,2,476),
('',0,1,0,2,0,2,485),
('',0,1,0,2,0,2,486),
('',0,1,0,2,0,2,492),
('',0,1,0,2,0,2,493),
('',0,1,0,2,0,2,494),
('',0,1,0,2,0,2,495),
('',0,1,0,2,0,2,497),
('',0,1,0,2,0,2,498),
('',0,1,0,2,0,2,501),
('',0,1,0,2,0,2,502),
('',0,1,0,2,0,2,503),
('',0,1,0,2,0,2,504),
('',0,1,0,2,0,2,505),
('',0,1,0,2,0,2,506),
('',0,1,0,2,0,2,507),
('',0,1,0,2,0,2,511),
('',0,1,0,2,0,2,512),
('',0,1,0,2,0,2,513),
('',0,1,0,2,0,2,514),
('',0,1,0,2,0,2,515),
('',0,1,0,2,0,2,516),
('',0,1,0,2,0,2,517),
('',0,1,0,2,0,2,518),
('',0,1,0,2,0,2,519),
('',0,1,0,2,0,2,520),
('',0,1,0,2,0,2,521),
('',0,1,0,2,0,2,522),
('',0,1,0,2,0,2,526),
('',0,1,0,2,0,2,527),
('',0,1,0,2,0,2,541),
('',0,1,0,2,0,2,542),
('',0,1,0,2,0,2,547),
('',0,1,0,2,0,2,548),
('',0,1,0,2,0,2,550),
('',0,1,0,2,0,2,552),
('',0,1,0,2,0,2,563),
('',0,1,0,2,0,2,567),
('',0,1,0,2,0,2,574),
('',0,1,0,2,0,2,585),
('',0,1,0,2,0,2,586),
('',0,1,0,2,0,2,588),
('',0,1,0,2,0,2,589),
('',0,1,0,2,0,2,600),
('',0,1,0,2,0,2,640),
('',0,1,0,2,0,2,641),
('',0,1,0,2,0,2,642),
('',0,1,0,2,0,2,643),
('',0,1,0,2,0,2,644),
('',0,1,0,2,0,2,645),
('',0,1,0,2,0,2,650),
('',0,1,0,2,0,2,651),
('',0,1,0,2,0,2,652),
('',0,1,0,2,0,2,653),
('',0,1,0,2,0,2,654),
('',0,1,0,2,0,2,655),
('',0,1,0,2,0,2,656),
('',0,1,0,2,0,2,657),
('',0,1,0,2,0,2,658),
('',0,1,0,2,0,2,659),
('',0,1,0,2,0,2,660),
('',0,1,0,2,0,2,661),
('',0,1,0,2,0,2,662),
('',0,1,0,2,0,2,663),
('',0,1,0,2,0,2,664),
('',0,1,0,2,0,2,665),
('',0,1,0,2,0,2,666),
('',0,1,0,2,0,2,669),
('',0,1,0,2,0,2,670),
('',0,1,0,2,0,2,671),
('',0,1,0,2,0,2,672),
('',0,1,0,2,0,2,673),
('',0,1,0,2,0,2,674),
('',0,1,0,2,0,2,675),
('',0,1,0,2,0,2,676),
('',0,1,0,2,0,2,677),
('',0,1,0,2,0,2,678),
('',0,1,0,2,0,2,679),
('',0,1,0,2,0,2,680);
 

Link to comment
Share on other sites

salut,

 

si tu ne connait pas id_stock_available alors il faut mettre null à la place '' car ce n'est pas pareil.

 

'' = chaine vide or id_stock_available est un entier.

 

Ensuite j'ai peur que la boutique fasse une totalisation des lignes.

Si tu as un accès système à la base de données, le plus simple est de faire des triggers.

after insert sur la table product pour ajouter la ligne dans stock_available pour ajouter la ligne. si tu as des attributs alors aussi dans la table product_attribute

 

before update et before insert dans la table stock_available pour forcer la quantité à 2 si la quantité est <= 2

 

comme ça même si tu ajoutes un nouveau produit ça se fait tout seul.

Edited by rvcat (see edit history)
Link to comment
Share on other sites

Pour que la base de données le fasse automatiquement. Et c'est seulement si tu as un accès root à la base de données, sinon tu ne pourras pas mettre les triggers.

 

Trigger after insert pour la table product 

CREATE DEFINER=`root`@`localhost` TRIGGER `product_after_insert` AFTER INSERT ON `product` FOR EACH ROW BEGIN
INSERT INTO `stock_available` (`id_product_attribute`,`id_shop`,`id_shop_group`,`quantity`,`depends_on_stock`,`out_of_stock`,`id_product`)
VALUES (0,1,0,2,0,2,new.id_product);
   
END;

 

trigger before insert sur  stock_available

CREATE DEFINER=`root`@`localhost` TRIGGER `stock_available_before_insert` BEFORE INSERT ON `stock_available` FOR EACH ROW BEGIN
  if (coalesce(new.quantity, 0) < 2) then

     set new.quantity = 2;

  end if;

  if (coalesce(new.out_of_stock, 0) < 2) then

     set new.out_of_stock = 2;

  end if;

END;

 

trigger before update sur  stock_available

CREATE DEFINER=`root`@`localhost` TRIGGER `stock_available_before_update` BEFORE UPDATE ON `stock_available` FOR EACH ROW BEGIN
  if (coalesce(new.quantity, 0) < 2) then

     set new.quantity = 2;

  end if;

  if (coalesce(new.out_of_stock, 0) < 2) then

     set new.out_of_stock = 2;

  end if;

END;

Edited by rvcat (see edit history)
Link to comment
Share on other sites

Bonjour et merci,

 

Je n'avais pas d'accès root permettant de mettre un trigger pour l'autoincrement, j'ai pris le dernier ID de la base (le plus élevé)

J'ai mis à jour manuellement les IDs via Excel des produits pour la requete.

Je peux ajouter sans problème un nouveau produit.

 

Merci

 

Cordialement,

Link to comment
Share on other sites

voici un requête pour ajouter les produits qui n'existe pas dans la table `stock_available`

 

INSERT INTO `stock_available` (`id_product_attribute`,`id_shop`,`id_shop_group`,`quantity`,`depends_on_stock`,`out_of_stock`,`id_product`)
select
0,1,0,2,0,2,
p.`id_product`
from `product` p
where not exists(select 1 from `stock_available` s where s.`id_product` = p.`id_product`);

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...