osCommerce France : Accueil Forum Portail osCommerce France Réponses aux questions Foire aux contributions

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> problème TVA
caaaaaaalmement
posté 10 Jan 2012, 10:52
Message #1


Ceinture blanche+ OSC
Icône de groupe

Groupe : Membres
Messages : 34
Inscrit : 3-December 04
Membre no 3972



Bonjour,
j'ai un problème avec ma TVA, en effet, la TVA est passée de 5.5% à 7%. Je voudrais changer tous les prix HT de mon catalogue sans bouger les prix TTC.
Si je change le taux dans l'admin, je me retrouve avec tous les prix TTC augmentés, alors que je ne veux pas qu'ils changent.
Y a-t'il une solution ou vais-je devoir changer le taux 1 par 1 sur mes produits ?
Go to the top of the page
 
Gnidhal
posté 10 Jan 2012, 18:05
Message #2


5eme dan OSC
Icône de groupe

Groupe : Administrateur
Messages : 9221
Inscrit : 4-March 03
Lieu : Pau
Membre no 927




Salut, Il va falloir bricoler smile.gif
la solution passe, je pense, par l'ajout d'un champ price_ttc dans la table products
une première opération consiste à écrire dans un script une requête qui va stocker la valeur TTC de chaque produit dans ce champ
ton taux de tva est réglé à 5.5 lors de cette opération.
Après tu changes le taux de tva, tes prix HT ne changent pas dans la bdd seul l'affichage ttc est modifié.
Donc opération inverse avec un script qui recalcule le HT avec la nouvelle TVA à partir du TTC stocké précédemment et là, tous les products_price vont être modifiés.
Tu vérifies que tes prix sont bons et tu peux virer le champ price_ttc, sinon il faudra peut-être ajuster un peu les valeurs en fonction des arrondis.
Certains produits risquent en effet de perdre ou gagner un centime au passage, ça va dépendre de tes prix.

Donc préalable à tout ça, un backup de la table products wink.gif
après, comme je dois aussi effectuer une opération du même ordre, j'essayerai de balancer quelques bouts de code ici ...
Donc patience ou action... tu as le mode opératoire.


--------------------
Tout d'abord : - Ni Hotline ni Service Après Vente, ces forums sont un lieu d'échange. BIEN POSER SA QUESTION (généralités)
Les "Informations Importantes" que vous devez ABSOLUMENT avoir lues :
Règlement, Bien poser sa question dans ces forums et Bien utiliser les Forums.
Les raccourcis pour gagner du temps : la FAQ, les PDF de la Doc (MS2-fr): PDF-V1 et PDF-V2, le moteur de Recherche sur les forums , la Liste des Contributions de Corbin.

----------------------------- Quelques sites de référence ---------------------------
PHP: Le site du Zéro et PHP Débutant avec la DOC en français -- HTML: Self HTML - WebProgrammation -- CSS: OpenWeb - AlsaCréations - CSS/Edge -- Autres ressources: - XajaX - highslide js
Les bons outils : EasyPHP - WAMP-5 - - Notepad++ - Firefox et son extension WebDeveloper
Le gène idéal c'est le gène original. Le génie des halles est un Génie des Alpages qui tente d'être à la page. (Merci f'murrr pour les cours de philosophie de chien)
Go to the top of the page
 
Gnidhal
posté 11 Jan 2012, 09:21
Message #3


5eme dan OSC
Icône de groupe

Groupe : Administrateur
Messages : 9221
Inscrit : 4-March 03
Lieu : Pau
Membre no 927



ok, alors pas forcément nécessaire de stocker le prix ttc dans la bdd mais ça peut aider par la suite dont j'ai laissé cette option
1/ sauvegarde de la table products via phpMyAdmin
2/ création du taux de TVA à 7% via l'administration du site
- Il faut aussi vérifier via phpMyAdmin qu'un seul taux de TVA à 7% est dans la table tax_rates.
- Il se peut en effet qu'une vieille taxe (florida) traine dans cette table avec ce même taux et donc fausse la récupération de l'id de taxe

3/ utiliser le script ci-dessous

Code
  require('includes/application_top.php');
  
  $time_start = date('H:i:s');

      // ajout du champ  products_price_ttc  s'il n'existe pas
      $qry_chk = tep_db_query("SHOW COLUMNS FROM ".TABLE_PRODUCTS." LIKE 'products_price_ttc'");
      if (tep_db_num_rows($qry_chk)<1 )  {
        tep_db_query("ALTER TABLE ".TABLE_PRODUCTS." ADD products_price_ttc DECIMAL(15,4) NOT NULL AFTER products_price ");  
      }
      
      // récupération des index de taxe
      $tax_55_id = $tax_70_id = 0;
      $tax_qry  = tep_db_query("select tax_class_id, tax_rate from ".TABLE_TAX_RATES." ");
      while ($tax_res = tep_db_fetch_array($tax_qry)){
         if ($tax_res['tax_rate'] == '5.500') $tax_55_id = $tax_res['tax_class_id'];
         if ($tax_res['tax_rate'] == '7.000') $tax_70_id = $tax_res['tax_class_id'];      
      }
      
      // mise à jour des prix en bdd et enregistrement du prix ttc souhaité
      $qry = tep_db_query("select products_id, products_price from ".TABLE_PRODUCTS." where products_tax_class_id ='$tax_55_id'");
      $count = 0;
      if ($tax_70_id != 0 && $tax_70_id != $tax_55_id){
        while ($res = tep_db_fetch_array($qry)){
          $ttc =  $res['products_price'] * 1.055;
          $new_ht =  round($ttc / 1.07 , 4);     // arrondi à 4 décimales pour ajuster au mieux
          tep_db_query("update ".TABLE_PRODUCTS." set products_price = '$new_ht', products_price_ttc = '$ttc', products_tax_class_id = '$tax_70_id' where products_id = ".(int)$res['products_id']." ");
          $count++;    
        }
      }
      
  $time_end = date('H:i:s');
  
  echo "Début $time_start <br> Fin $time_end <br> $count prix mis à jour.";

require(DIR_WS_INCLUDES . 'application_bottom.php');


Quelques précautions tout de même :
ce script qui balaye toute la table products n'est pas très rapide.
on peut surement optimiser ce code en ne faisant qu'une requête par exemple mais je n'ai pas pris le temps de me creuser la tête pour ça, car c'est une requête assez complexe faisant une mise à jour en direct dans mysql
Sur ma machine en local et une base de 3000 produits, ce script a mis 3 minutes.
Mais ma machine n'est pas un serveur en ligne sous Linux et sous Win, le serveur local n'est pas des plus véloces. On peut donc espérer un traitement 4 à 5 fois plus rapide en ligne sur un hébergement musclé.
Cependant, si le serveur menace de couper à cause d'un max time exec trop court il vaut mieux ajouter une interruption avant.
Dans la mesure ou ce script effectue une modification de l'index de taxe, il ne prend en compte que les produits dont le taux est à 5.5, il suffit alors d'ajouter dans la boucle while de mise à jour un exit soit tous les 500 enregistrements soit au bout de x secondes.
puis on relance le script autant de fois que nécessaire.

Après on peut faire la même chose avec la TVA à 19.6 si elle est appelée à changer (sur certains produits ça va arriver) suffira d'adapter ce script.


--------------------
Tout d'abord : - Ni Hotline ni Service Après Vente, ces forums sont un lieu d'échange. BIEN POSER SA QUESTION (généralités)
Les "Informations Importantes" que vous devez ABSOLUMENT avoir lues :
Règlement, Bien poser sa question dans ces forums et Bien utiliser les Forums.
Les raccourcis pour gagner du temps : la FAQ, les PDF de la Doc (MS2-fr): PDF-V1 et PDF-V2, le moteur de Recherche sur les forums , la Liste des Contributions de Corbin.

----------------------------- Quelques sites de référence ---------------------------
PHP: Le site du Zéro et PHP Débutant avec la DOC en français -- HTML: Self HTML - WebProgrammation -- CSS: OpenWeb - AlsaCréations - CSS/Edge -- Autres ressources: - XajaX - highslide js
Les bons outils : EasyPHP - WAMP-5 - - Notepad++ - Firefox et son extension WebDeveloper
Le gène idéal c'est le gène original. Le génie des halles est un Génie des Alpages qui tente d'être à la page. (Merci f'murrr pour les cours de philosophie de chien)
Go to the top of the page
 
caaaaaaalmement
posté 14 Jan 2012, 19:48
Message #4


Ceinture blanche+ OSC
Icône de groupe

Groupe : Membres
Messages : 34
Inscrit : 3-December 04
Membre no 3972



merci pour ton aide, je vais essayer happy.gif
Go to the top of the page
 

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



RSS Version bas débit Nous sommes le : 28th March 2024 - 09:02
Ce site est déclaré auprès de la commision Nationale
de l'Informatique et des Libertés (déclaration n°: 1043896)