numéro de commande journalier + séquentiel

Réduire
X
  • Filtrer
  • Heure
  • Afficher
Tout effacer
nouveaux messages

  • [Astuce] numéro de commande journalier + séquentiel

    Bien sûr des hacks existent déjà là dessus mais rien qui ne m'allait. Souvent ils se contentent de modifier l'affichage là où je propose un changement en natif dans la BDD, et la plupart change une dizaine de fichiers là où j'en change un seul.
    Sans compter que ça marche sur un VM d'origine sans hack supplémentaire.

    Bon pour autant soyez prudents si vous l'utilisez sur un serveur en production, sauvegardez avant votre base, je peux avoir zappé un inconvénient ou un fonctionnement de VM vu l'usine à gaz qu'est la bête


    Donc je vous propose un script pour transformer les n° de BC du type 00000001, 00000002, 00000003, 00000004,... en AAMMJJnn genre 10011701, 10011702, 10011703,...

    Ca s'adresse avant tout aux "petits sites" qui n'ont pas installés 50 hacks, pour ceux qui débutent donc.


    Principe : par défaut les numéros de bon de commande dans VM se suivent indéfiniment, ce qui peut par exemple permettre à vos concurrents de connaitre vos ventes mensuelles très précisément.
    L'idéal serait un codage des numéros avec des lettres+chiffres en fonction du nom de l'acheteur mais ça demanderait une refonte complète et ça poserait souci à ceux qui ont besoin de numéros qui se suivent, c'est à dire ceux qui utilisent leurs bon de commande pour éditer les factures.

    L'astuce ici consiste donc à ajouter un préfixe aux numéros en utilisant la date avec des numéros du type AAMMJJnn ainsi on garde les numéros qui se suivent (hors préfixe) et on limite beaucoup la divulgation public de son nombre de ventes.

    Pour utiliser cette astuce, il suffit de modifier 1 seul fichier de VM. Le fonctionnement ensuite est simple :
    à chaque commande VM vérifie si une commande existe déjà pour la journée en cours, si non c'est donc la première commande de la journée et on force la création du numéro avec préfixe date : AAMMJJ01, si une commande existe déjà on ne touche à rien, l'order_id AAMMJJnn s'incrémente tout seul dans la base (auto_increment).
    Sur des sites hyper actifs où la 1ere commande de la journée est susceptible d'avoir lieu dans la même seconde que la 2ème, il faudra ajouter un Lock Table.

    Vous pouvez éventuellement, pour une cohérence d'ensemble, mettre à jour vos anciennes commandes dans votre base en executant ce présent fichier (à la racine du site par exemple, effacez-le après !) qui changera donc tous les anciens numéros. Ce qui veut dire aussi que vous devrez éventuellement rééditer tous vos anciens BC pour les avoir avec la nouvelle numérotation (cas des BC utilisés comme Facture pour les impôts).

    Durant l'utilisation de ce script et la modification de ps_checkout.php il est préférable de mettre le site en maintenance.
    Comptez 2 secondes de traitement pour 100 commandes dans la base.

    Il est fortement conseillé de faire une sauvegarde de votre base, au minimum des tables suivantes, afin de pouvoir restaurer à l'original en cas de souci !!
    Les tables contenant order_id qui vont être modifiées :
    * jos_vm_affiliate_sale
    * jos_vm_bills
    * jos_vm_deliveries
    * jos_vm_delivery_item
    * jos_vm_orders
    * jos_vm_order_history
    * jos_vm_order_item
    * jos_vm_order_payment
    * jos_vm_order_user_info
    * jos_vm_product_download
    * jos_vm_shipping_label

    Modification à faire dans le fichier \administrator\components\com_virtuemart\classes\p s_checkout.php :
    * Chercher vers la ligne 993 :
    Code PHP:
            // Insert the main order information
            
    $db->buildQuery'INSERT''#__{vm}_orders'$fields );
            
    $result $db->query(); 
    * Remplacer par :
    Code PHP:
            $bcday=date("ymd",$timestamp);
            
    $bcday_id $bcday.'01'// si vous avez plus de 99 commandes par jour passez le paramètre à '001' (pas obligatoire)
            
    $r "SELECT order_id FROM #__{vm}_orders WHERE order_id LIKE '".$bcday."%' LIMIT 1";
            
    $db->query($r);
            if (!
    $db->next_record()) $fields["order_id"] = $bcday_id;

            
    // Insert the main order information
            
    $db->buildQuery'INSERT''#__{vm}_orders'$fields );
            
    $result $db->query(); 
    Tout cela est inclus dans le fichier joint qui permet aussi de mettre à jour les anciens numéros vers le nouveau format si vous le voulez. N'étant pas très doué pour la programmation objet de VM, c'est un script indépendant pensez donc à remplir les paramètres d'accès à votre bdd.


    Voilà à priori c'est enfantin. Tellement que je me dis que j'ai dû rater un truc quelque part. J'attends vos avis.
    Fichiers joints
    Dernière édition par Pax24 à 25/01/2010, 18h47
    http://www.couleurpoker.com / http://www.cigarpax.com

  • #2
    Voilà à priori c'est enfantin. Tellement que je me dis que j'ai dû rater un truc quelque part. J'attends vos avis.
    moi aussi...

    en tous cas, super !
    sommaire thématique des astuces du forum e-commerce ici http://www.webtimarket.com/fr/telechargements
    http://virtuemart.fr

    Commentaire


    • #3
      Bon en tout cas, le numéro a bien changé avec la première commande de la journée, et les autres d'hier soir se sont bien incrémentées aussi.
      Vi je suis un peu foufou je l'ai mis direct sur mon site en prod j'en avais marre que les concurrents viennent faire des commandes bidons toutes les semaines juste pour voir où j'en étais dans mes numéros
      http://www.couleurpoker.com / http://www.cigarpax.com

      Commentaire


      • #4
        SUPER !!!
        Merci Pax24

        C'est exactement ce qu'il me fallait !!!
        Je te dirai si je trouve des inconvénients ou soucis
        Mon site n'est pas encore en prod mais je ferai des essais

        Commentaire


        • #5
          Bon alors je complète l'astuce par une deuxième qui peut être utilisée couplée à la première ou pas.

          Le but est de ne pas avoir de trous dans la suite des numéros de BC pour pouvoir les utiliser en facturation.

          La 1ère astuce permet d'avoir des numéros journaliers qui évitent de divulguer trop aisément son volume d'affaires. Mais il reste un problème : Si vous supprimez une commande, il y a un trou dans le séquentiel et ça le fisc n'aime pas.

          Et bien nous allons vérifier tout cela et forcer l'order_id.

          Avant tout nous avons besoin d'une table personnelle dans la base pour y stocker des petites infos, je vous conseille de la créer ainsi via une requète SQL dans phpmyadmin :
          Code:
          CREATE TABLE IF NOT EXISTS `jos_perso` (
            `id` int(11) NOT NULL auto_increment,
            `orig` varchar(20) default NULL,
            `clea` varchar(20) default NULL,
            `cleb` varchar(20) default NULL,
            `clec` varchar(20) default NULL,
            `mdate` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP,
            PRIMARY KEY  (`id`)
          ) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Pour les personnalisations' AUTO_INCREMENT=1 ;
          Maintenant on va enregistrer dans notre table perso le numéro de BC qu'on supprime.

          Modification à faire dans le fichier \administrator\components\com_virtuemart\classes\p s_order.php :
          * Chercher vers la ligne 797:
          Code PHP:
                      $q "DELETE FROM #__{vm}_shipping_label where order_id=$record_id";
                      
          $db->query($q);

                      return 
          True
          * Remplacer par :
          Code PHP:
                      $q "DELETE FROM #__{vm}_shipping_label where order_id=$record_id";
                      
          $db->query($q);

                      
          $q "INSERT INTO #__perso (orig,clea,cleb) VALUES ('vm', 'factsup', '$record_id')";
                      
          $db->query($q);

                      return 
          True
          Ensuite au moment de créer la commande on va vérifier si on a un numéro supprimé à ré-affecter
          Modification à faire dans le fichier \administrator\components\com_virtuemart\classes\p s_checkout.php :
          * Chercher vers la ligne 993 (un poil plus bas si vous avez déjà appliquée l'astuce n°1):
          Code PHP:
                  // Insert the main order information
                  
          $db->buildQuery'INSERT''#__{vm}_orders'$fields );
                  
          $result $db->query(); 
          * Remplacer par :
          Code PHP:
                  $r "SELECT id,cleb FROM #__perso WHERE clea LIKE 'factsup' LIMIT 1";
                  
          $db->query($r);
                  if (
          $db->next_record()) {
                      
          $fields["order_id"] = $db->f('cleb');
                      
          $q="DELETE FROM #__perso WHERE id=".$db->f('id');
                      
          $db->query($q);
                  }

                  
          // Insert the main order information
                  
          $db->buildQuery'INSERT''#__{vm}_orders'$fields );
                  
          $result $db->query(); 
          Et voilà ! Au moment de créer un nouveau BC, le script vérifie dans la table perso si un ancien numéro supprimé existe auquel cas il l'utilise, sinon il continue son incrémentation habituelle.

          Bien entendu, il y'a une contrainte : si vous avez peu de commandes, ca va "se voir" au niveau de la date exemple :
          BC n°32 du 20/01/10
          (BC n°33 du 22/01/10 < on le supprime)
          BC n°34 du 23/01/10
          BC n°33 du 25/01/10 < réattribué
          BC n°35 du 26/01/10
          du coup le BC 33 a une date plus récente que le 34, je ne sais pas si le fisc interdit ça, après tout une facture peut-être issue d'un BC bien antérieur qui aurait été payé plus tard... cela dit avec aussi peu de commandes, pas besoin de script on peut aussi supprimer le 33 et modifier à la main dans les tables le 34 en 33, au pire...

          Pour ceux qui ont plus de commandes et qui ont adopté ma première astuce (variable $bcday), il est possible de limiter la recherche de numéros supprimés à ré-attribuer au jour concerné, certes les heures ne se suivront pas mais sur une facture on ne met que le jour, pas l'heure, normalement.
          Pour cela il suffit de modifier dans ma modif de ps_checkout :
          Code PHP:
                  $r "SELECT id,cleb FROM #__perso WHERE clea LIKE 'factsup' LIMIT 1"
          par:
          Code PHP:
                  $r "SELECT id,cleb FROM #__perso WHERE clea LIKE 'factsup' AND cleb LIKE '$bcday%' LIMIT 1"
          Bon du coup un BC supprimé la veille ne sera pas réaffecté mais avec autant de commandes vous ne devriez pas surveiller en permanence votre backoffice ?
          (Dans cette variante, pensez à vider de temps en temps la table perso des vieux numéros.)

          Voilà, disons qu'hormis ce petit détail de chronologie, au moins on a une liste de numéros de BC/Facture sans aucun trou.
          Dernière édition par Pax24 à 25/01/2010, 18h51
          http://www.couleurpoker.com / http://www.cigarpax.com

          Commentaire


          • #6
            Mille Merci Pax24

            C'est exactement ce que je cherchais
            SoS PC à Domicile - Assistance - Installation - Dépannage - Entretien - Formation - Conseils informatique à Thionville et sa région

            Commentaire


            • #7
              Oki nice j'ai installé tout fonctionne bien par contre le fisc regarde les numéro de facture pas les numéros de commande

              Le seul intérêt est à mon avis la concurrence qui n'est plus en mesure de connaitre le volume de vente
              http://www.crysis-france.com/ Le site pour la communauté Fr de Crysis
              http://www.ruse-online.fr/ Le site pour la communauté Fr de R.U.S.E.
              http://www.pure-gaming.fr/ e-commerce de périphériques de joueurs

              Commentaire


              • #8
                Il suffit de remplacer "commande" par "facture" si statut=payée

                Ou "plus compliqué" de créer une base vm_facture dans laquelle on transfère les commandes après le changement du statut en paiement (voire en expédié) et de dupliquer tous les fichiers nécessaires aux commandes de type *order* vers des *facture*.
                Dernière édition par Pax24 à 16/04/2010, 12h38
                http://www.couleurpoker.com / http://www.cigarpax.com

                Commentaire


                • #9
                  Envoyé par Pax24 Voir le message
                  Il suffit de remplacer "commande" par "facture" si statut=payée
                  merci beaucoup pour votre partage j'y suis arrivé a le faire marcher

                  si je peut encore solliciter votre aide, pouvez vous indiquer ou faut il faire cette modification, afin d'avoir "Facture" a la place de commande une fois le statut payé.
                  Dernière édition par Five_Phil à 03/08/2010, 17h16

                  Commentaire


                  • #10
                    Bon alors... En fait c'est plus prudent de le faire quand le statut est expédié, il me semble.

                    Dans les fichiers de langues, ajouter 3 valeurs.
                    Pour le français c'est dans /administrator/components/com_virtuemart/languages/common/french.php vers la ligne 95 :
                    Code PHP:
                        'PHPSHOP_ORDER_PRINT_PO_LBL' => 'Bon de Commande'
                    on ajoute avant :
                    Code PHP:
                        'PHPSHOP_BILL_PRINT_PO_LBL' => 'Facture',
                        
                    'PHPSHOP_BILL_PRINT_PO_NUMBER' => 'Numéro de facture',
                        
                    'PHPSHOP_BILL_PRINT_PO_DATE' => 'Date de facturation',
                        
                    'PHPSHOP_ORDER_PRINT_PO_LBL' => 'Bon de Commande'
                    Ensuite on va dans /components/com_virtuemart/themes/votre_theme_ou_default/templates/pages/account.order_details.tpl.php
                    On enlève la ligne "votre commande" en la commentant, c'est vers la ligne 70 il faut mettre en commentaire ainsi :
                    Code PHP:
                          <!-- tr class="sectiontableheader">
                            <th align="left" colspan="2"><?php echo $VM_LANG->_('PHPSHOP_ACC_ORDER_INFO'?></th>
                          </tr -->
                    Ensuite on fait un test dès le début pour savoir si la commande est expédiée (= facture) ou pas (=commande), ligne 20 :
                    Code PHP:
                    if( $db->f('order_number')) { 
                    ajouter après ainsi (vérifiez que votre statut expédié porte bien la lettre S):
                    Code PHP:
                    if( $db->f('order_number')) {
                        if ( 
                    $db->f("order_status") == "S" $fact='BILL'; else $fact='ORDER'
                    Ensuite on modifie les 3 variables, vers la ligne 35 :
                    Code PHP:
                             <h2><?php echo $VM_LANG->_('PHPSHOP_ORDER_PRINT_PO_LBL'?></h2>
                    remplacer par :
                    Code PHP:
                             <h2><?php echo $VM_LANG->_('PHPSHOP_'.$fact.'_PRINT_PO_LBL'?></h2>
                    vers la ligne 75:
                    Code PHP:
                             <td><?php echo $VM_LANG->_('PHPSHOP_ORDER_PRINT_PO_NUMBER')?>:</td>
                            <td><?php printf("%08d"$db->f("order_id")); ?></td>
                          </tr>

                          <tr>
                            <td><?php echo $VM_LANG->_('PHPSHOP_ORDER_PRINT_PO_DATE'?>:</td>
                    remplacer par :
                    Code PHP:
                            <td><?php echo $VM_LANG->_('PHPSHOP_'.$fact.'_PRINT_PO_NUMBER')?>:</td>
                            <td><?php printf("%08d"$db->f("order_id")); ?></td>
                          </tr>

                          <tr>
                            <td><?php echo $VM_LANG->_('PHPSHOP_'.$fact.'_PRINT_PO_DATE'?>:</td>
                    et voilà.
                    http://www.couleurpoker.com / http://www.cigarpax.com

                    Commentaire


                    • #11
                      Merci Pax24 pour cette nouvelle avancée !
                      J'ai bien fait de surveiller ce sujet.

                      ça fonctionne parfaitement bien, mais avec cette solution c'est le client qui peut imprimer sa Facture.
                      J'aimerai maintenant pouvoir moi aussi imprimer cette Facture depuis mes commandes dans mon admin pour pouvoir leur joindre leur Facture dans leur colis.
                      ...et je ne trouve pas quel fichier il faudrait modifier.
                      Peux tu m'aider ?

                      Commentaire


                      • #12
                        Hmm, il serait pas mal de regarder un peu l'architecture de VM, ça peut dépanner, c'est aussi marqué dans l'URL de ta fenêtre d'impression pour connaitre le fichier :
                        http://www.tonsite.com/administrator...der_id=xxx.etc...
                        C'est donc dans /administrator/components/com_virtuemart/html/order.order_printdetails.php
                        mêmes modif que l'autre fichier.
                        Hormis la condition du début qu'il faut changer en :
                        Code PHP:
                        if ( $db->f("order_status") != "P" && $db->f("order_status") != "X" && $db->f("order_status") != "R"$fact='BILL'; else $fact='ORDER'
                        Pour ne pas mettre "facture" dans ces cas de statuts (attente, annulée, remboursée)
                        Dernière édition par Pax24 à 11/05/2010, 03h25
                        http://www.couleurpoker.com / http://www.cigarpax.com

                        Commentaire


                        • #13
                          Bonjour,
                          Après mise en place de la procédure ci-dessus, mes commandes s'incrémentaient bien en fonction de la date du jour, mais ce matin, après avoir installé la MAJ VM 1.1.5, j'ai passé une commande et le N° ressort ainsi: 10073004 autrement dit il ne tient pas compte du passage en août. Est-ce du à l'application de la mise à jour ou bien quelqu'un à t-il déjà rencontré ce problème ?
                          Merci de votre aide

                          Commentaire


                          • #14
                            Comme suite à mon post précédent, je viens aussi de constater un problème dans le mail de confirmation de ma commande : dans date de commande il y a des caractères spéciaux dans AOUT. comment rectifier cela ?
                            Copie d'écran jointe en lien:
                            http://sd-4.archive-host.com/membres...489313/BDC.png

                            Commentaire


                            • #15
                              Bonjour

                              Après une migration, il te faut remettre le hack en place je pense non?

                              @+
                              SVP pas de MP pour de l'aide, le forum est l’outil idéal

                              Commentaire

                              Annonce

                              Réduire
                              1 sur 2 < >

                              C'est [Réglé] et on n'en parle plus ?

                              A quoi ça sert ?
                              La mention [Réglé] permet aux visiteurs d'identifier rapidement les messages qui ont trouvé une solution.

                              Merci donc d'utiliser cette fonctionnalité afin de faciliter la navigation et la recherche d'informations de tous sur le forum.

                              Si vous deviez oublier de porter cette mention, nous nous permettrons de le faire à votre place... mais seulement une fois
                              Comment ajouter la mention [Réglé] à votre discussion ?
                              1 - Aller sur votre discussion et éditer votre premier message :


                              2 - Cliquer sur la liste déroulante Préfixe.

                              3 - Choisir le préfixe [Réglé].


                              4 - Et voilà… votre discussion est désormais identifiée comme réglée.

                              2 sur 2 < >

                              Assistance au forum - Outil de publication d'infos de votre site

                              Compatibilité: PHP 4.1,PHP4, 5, 6DEV MySQL 3.2 - 5.5 MySQLi from 4.1 ( @ >=PHP 4.4.9)

                              Support Version de Joomla! : | J!3.0 | J!2.5.xx | J!1.7.xx | J!1.6.xx | J1.5.xx | J!1.0.xx |

                              Version française (FR) D'autres versions sont disponibles depuis la version originale de FPA

                              UTILISER À VOS PROPRES RISQUES :
                              L'exactitude et l'exhaustivité de ce script ainsi que la documentation ne sont pas garanties et aucune responsabilité ne sera acceptée pour tout dommage, questions ou confusion provoquée par l'utilisation de ce script.

                              Problèmes connus :
                              FPA n'est actuellement pas compatible avec des sites Joomla qui ont eu leur fichier configuration.php déplacé en dehors du répertoire public_html.

                              Installation :

                              1. Téléchargez l'archive souhaitée : http://afuj.github.io/FPA/

                              Archive zip : https://github.com/AFUJ/FPA/zipball/master

                              2. Décompressez le fichier de package téléchargé sur votre propre ordinateur (à l'aide de WinZip ou d'un outil de décompression natif).

                              3. Lisez le fichier LISEZMOI inclus pour toutes les notes de versions spécifiques.

                              4. LIRE le fichier de documentation inclus pour obtenir des instructions d'utilisation détaillées.

                              5. Téléchargez le script fpa-fr.php à la racine de votre site Joomla!. C'est l'endroit que vous avez installé Joomla et ce n'est pas la racine principale de votre serveur. Voir les exemples ci-dessous.

                              6. Exécutez le script via votre navigateur en tapant: http:// www. votresite .com/ fpa-fr.php
                              et remplacer www. votresite .com par votre nom de domaine


                              Exemples:
                              Joomla! est installé dans votre répertoire web et vous avez installé la version française du fichier FPA:
                              Télécharger le script fpa-fr.php dans: /public_html/
                              Pour executer le script: http://www..com/fpa-fr.php

                              Joomla! est installé dans un sous-répertoire nommé "cms" et vous avez installé la version française du fichier FPA:
                              Télécharger le script fpa-fr.php dans: /public_html/cms/
                              Pour executer le script: http://www..com/cms/fpa-fr.php

                              En raison de la nature très sensible de l'information affichée par le script FPA, il doit être retiré immédiatement du serveur après son utilisation.

                              Pour supprimer le script de votre site, utilisez le lien de script de suppression fourni en haut de la page du script. Si le lien de suppression échoue pour supprimer le script, utilisez votre programme FTP pour le supprimer manuellement ou changer le nom une fois que le script a généré les données du site et le message publié sur le forum. Si le script est toujours présent sur le site, il peut être utilisé pour recueillir suffisamment d'informations pour pirater votre site. Le retrait du script empêche des étrangers de l'utiliser pour jeter un oeil à la façon dont votre site est structuré et de détecter les défauts qui peuvent être utilisé à vos dépends.
                              Voir plus
                              Voir moins
                              Travaille ...
                              X