Exporter les commandes pour une gestion comptable
- Par Magentix le 28/10/2009
- Difficulté : 2/4
Par défaut sous Magento il n'est pas possible d'exporter les informations détaillées relatives aux commandes. Ce module va nous permettre d'exporter un maximum de données au format CSV afin de les exploiter pour une gestion comptable.
Les rapports de ventes disponibles sous Magento permettent de récolter un certain nombre d'informations sur une période donnée, par jour, mois ou année. Ils ne fournissent cependant pas de données détaillées sur les commandes passées. Les tableaux générés restent assez synthétiques (Nombre de commandes, total facturé, total réglé...).
L'idée est donc de développer un module (OrdersExport) capable de générer un fichier CSV et de récolter, ligne par ligne, l'ensemble des informations disponibles pour une commande, afin de les exploiter par la suite sur un ERP par exemple.
Le fichier CSV pourra contenir :
|
|
Le fichier est généré manuellement depuis la page du listing des commandes. Il est ainsi possible de filtrer les commandes que l'on souhaite récupérer (période, statut, numéros de commande...).
Le module de base utilisé pour le développement de cette extension est Manual order export, anciennement disponible sur Magento Connect.
L'extension est compatible avec les versions 1.3.X de Magento.
Architecture du module
- app/code/local/Magentix/OrdersExport/Block/
- SalesOrderGrid.php
- app/code/local/Magentix/OrdersExport/controllers/
- SalesOrderController.php
- app/code/local/Magentix/OrdersExport/etc/
- config.xml
- app/code/local/Magentix/OrdersExport/Helper/
- Data.php
- app/code/local/Magentix/OrdersExport/Model/
- SalesOrder.php
- app/locale/fr_FR/
- Magentix_OrdersExport.csv
- app/etc/modules/
- Magentix_OrdersExport.xml
Détails du module
Pour plus de souplesse, la mise en forme du CSV se configure depuis le fichier de configuration config.xml :
app/code/local/Magentix/OrdersExport/etc/config.xml
<!-- ... -->
<default>
<ordersexport>
<csv>
<delimiter>[[blue]];[[/blue]]</delimiter>
<enclose>[[blue]]"[[/blue]]</enclose>
<mapping>
<order_increment_id>[[blue]]Order number[[/blue]]</order_increment_id>
<order_created_at>[[blue]]Order created at[[/blue]]</order_created_at>
<invoice_increment_id>[[blue]]Invoice number[[/blue]]</invoice_increment_id>
<invoice_created_at>[[blue]]Invoice created at[[/blue]]</invoice_created_at>
<shipment_increment_id>[[blue]]Shipment number[[/blue]]</shipment_increment_id>
<shipment_created_at>[[blue]]Shipment created at[[/blue]]</shipment_created_at>
<creditmemo_increment_id>[[blue]]Credit memo number[[/blue]]</creditmemo_increment_id>
<creditmemo_created_at>[[blue]]Credit memo created at[[/blue]]</creditmemo_created_at>
<customer_name>[[blue]]Customer name[[/blue]]</customer_name>
<customer_increment_id>[[blue]]Customer number[[/blue]]</customer_increment_id>
<products_ordered>[[blue]]Products ordered[[/blue]]</products_ordered>
<products_delivered>[[blue]]Products delivered[[/blue]]</products_delivered>
<order_subtotal>[[blue]]Subtotal[[/blue]]</order_subtotal>
<order_tax_amount>[[blue]]Tax[[/blue]]</order_tax_amount>
<order_shipping_amount>[[blue]]Shipping[[/blue]]</order_shipping_amount>
<order_discount_amount>[[blue]]Discount[[/blue]]</order_discount_amount>
<order_grand_total>[[blue]]Total[[/blue]]</order_grand_total>
<order_total_refunded>[[blue]]Refunded[[/blue]]</order_total_refunded>
<order_payment_method>[[blue]]Payment method[[/blue]]</order_payment_method>
<order_status>[[blue]]Status[[/blue]]</order_status>
</mapping>
</csv>
</ordersexport>
</default>
<!-- ... -->
On définit ici les séparateurs de champs et de texte souhaités, les informations à récupérer et l'ordre des colonnes.
L'intitulé des colonnes peut être modifié depuis le fichier de langue Magentix_OrdersExport.csv :
app/locale/fr_FR/Magentix_OrdersExport.csv
"Order number","Commande" "Order created at","Date commande" "Invoice number","Facture" "Invoice created at","Date facture" "Shipment number","Expedition" "Shipment created at","Date expedition" "Credit memo number","Remboursement" "Credit memo created at","Date remboursement" "Customer name","Client" "Customer number","Numero client" "Products ordered","Produits commandes" "Products delivered","Produits livres" "Subtotal","Sous total HT" "Tax","Taxe" "Shipping","Frais de port" "Discount","Remise" "Refunded","Rembourse" "Total","Total TTC" "Payment method","Reglement" "Status","Statut"
Le module surcharge le bloc Mage_Adminhtml_Block_Sales_Order_Grid. Il peut donc entraîner un conflit avec un autre module installé (ex : Fia-Net).
Les fichiers CSV générés sont stockés dans le dossier /var/export. Un lien de téléchargement est affiché suite à l'export :
Est ce qu'on peut exporter les commandes sous forme de page "html" dont on aura tous les informations et un bouton "imprimer"?
Fichier local/Magentix/OrdersExport/Model/SalesOrder.php, modifier la méthode exportOrders() de cette façon :
public function exportOrders($orders,$content='') {
$delimiter = Mage::getStoreConfig('ordersexport/csv/delimiter');
$enclose = Mage::getStoreConfig('ordersexport/csv/enclose');
$mapping = Mage::getStoreConfig('ordersexport/csv/mapping');
$content .= '<table border="1"><tr>';
foreach($mapping as $k => $v) $content .= '<td>'.Mage::helper('ordersexport')->__($v).'</td>';
$content .= "</tr>";
foreach ($orders as $o) {
$data = $this->getInfos(Mage::getModel("sales/order")->load($o));
$content .= "<tr>";
foreach($mapping as $k => $v) $content .= '<td>'.$data[$k].'</td>';
$content .= "</tr>";
}
$content .= "</table>";
return $content;
}
Puis la méthode ordersExportAction() du fichier local/Magentix/OrdersExport/controllers/SalesOrderController.php :
public function ordersExportAction() {
$orderIds = $this->getRequest()->getPost('order_ids',array());
echo Mage::getModel('sales/order')->exportOrders($orderIds);
}
Il ne reste plus qu'à styler ce tableau comme tu le souhaites, ajouter le bouton "imprimer"...
Si j'obtiens un conflit avec un autre module (je n'utilise pas FIA-NET mais d'autres modules), la désinstallation du module est simple à effectuer ?
D'avance merci pour votre aide
Excellent module, indispensable !
Y a-t'il possibilité d'étendre le module afin d'avoir le détail de chaque commande?
Si oui par ou commencer merci.
Tout se passe dans le fichier "SalesOrder.php" (model). On y récupère l'ensemble des informations d'une commande : paiement, facturation, livraison, remboursement, produits... Sur ces objets on récupère ce qui nous intéresse (j'utilise principalement des getData).
Tuto tout simplement brillant !
Juste une question, je voudrais faire en sorte que l'export se fasse automatiquement grâce a une tâche Cron.
Dois-je modifier le module ou pas du tout?
Une idée de comment je pourrais m'y prendre?
Merci beaucoup par avance!
Merci !
il existe une version compatible 1.4.1 ?
J'aimerai bcp utiliser ce module sur mon site mais j'ai besoin de récupérer un champ supplémentaire le champ cost
aurais tu un début de piste pour m'aider?
Merci d'avance et bonne continuation :)
$items = $order->getAllItems();
$cost = 0;
foreach ($items as $item) {
$p = Mage::getModel('catalog/product')->load($item->getProductId());
$cost += $p->getCost()*$item->getQtyOrdered();
}
Le problème c'est que cette valeur peut varier selon les prix obtenus chez les fournisseurs...
je viens de tester sur un 1.4.1.1 ça fonctionne.
Cela n'est donc pas très utilisable pour une gestion comptable !
Quelqu'un aurait-il une solution d'exportation des factures et idéalement des remboursements ?!?
C'est assez fou que Magento ne le propose pas en standard ! c'est le b-a-ba !
Merci pour ce module, très pratique et simple à utiliser.
Ma question porte sur la possibilité de pouvoir filtrer les infos à l'export.
Je m'explique, je souhaiterais mettre en place un cron journalier sur les commandes et pouvoir sélectionner uniquement les ventes effectuées le même jour. Aussi pourrait on envisager de greffer sur ce module la possibilité de le poser de l'envoyer par mail chaque jour a heure fixe ou le poser sur un ftp comme avec les profils avancés ?
Merci par avance..
Cela est tout à fait possible, l'idée est d'ajouter une tâche cron (ex : http://www.magentix.fr/modules-magento/taches-cron-magento-module-anniversaire-clients.html). La méthode exécutée par le cron charge la collection de commandes (avec les filtres pour la date du jour) que l'on parcourt pour exécuter la méthode "getInfos" de la classe Magentix_OrdersExport_Model_SalesOrder. La méthode retourne un array avec toutes les informations que l'on peut exploiter...
C'est une réelle bonne initiative, sauf qu'elle est malheureusement incomplète pour être utilisée dans un contexte comptable "pur et dur". Idéalement, un journal des ventes contiendra tout le détail de chaque commande, produit par produit, avec quantité, taux de tva associé etc...
A ma connaissance cela n'existe pas encore, et c'est bien dommage car c'est précisément là que réside l'intérêt de générer des exports vers un quelconque logiciel comptable. Se contenter d'exporter des commandes sans en connaitre précisément le détail n'a d'autre intérêt que d'alimenter un simple journal de banque pour des rapprochements bancaires...Mais dans ce cas là, nul besoin d'export, Magento et sa présentation ergonomique suffisent amplement !
Cordialement
Etonnant, depuis ce soir j'ai cette erreur dans mes logs :
2010-12-10T00:32:41+00:00 ERR (3):
exception 'Varien_Exception' with message 'Invalid method Magentix_OrdersExport_Model_SalesOrder::sendNewOrderFile(Array
(
[0] => order_export_10-12-2010.csv
)
)' in /var/www/imatone/domain/prod/lib/Varien/Object.php:569
Stack trace:
#0 [internal function]: Varien_Object->__call('sendNewOrderFil...', Array)
#1 /var/www/imatone/domain/prod/app/code/local/Ecsso/Checkout/Model/Type/Onepage.php(551): Magentix_OrdersExport_Model_SalesOrder->sendNewOrderFile('order_export_10...')
#2 /var/www/imatone/domain/prod/app/code/core/Mage/Checkout/controllers/OnepageController.php(451): Ecsso_Checkout_Model_Type_Onepage->saveOrder()
#3 /var/www/imatone/domain/prod/app/code/core/Mage/Core/Controller/Varien/Action.php(418): Mage_Checkout_OnepageController->saveOrderAction()
#4 /var/www/imatone/domain/prod/app/code/core/Mage/Core/Controller/Varien/Router/Standard.php(254): Mage_Core_Controller_Varien_Action->dispatch('saveOrder')
#5 /var/www/imatone/domain/prod/app/code/core/Mage/Core/Controller/Varien/Front.php(177): Mage_Core_Controller_Varien_Router_Standard->match(Object(Mage_Core_Controller_Request_Http))
#6 /var/www/imatone/domain/prod/app/code/core/Mage/Core/Model/App.php(304): Mage_Core_Controller_Varien_Front->dispatch()
#7 /var/www/imatone/domain/prod/app/Mage.php(596): Mage_Core_Model_App->run(Array)
#8 /var/www/imatone/domain/prod/index.php(88): Mage::run('', 'store')
#9 {main}
J'ai mis la main sur cette erreur après avoir constaté qu'il n'était plus possible de payer en ligne après avoir cliqué sur "Validation" qui renvoie vers le module de paiement bancaire. Une erreur de type "Erreur lors du traitement de votre commande, veuillez réessayer plus tard." apparait systématiquement...
Y'a-t-il un lien de cause à effet ?
Merci de votre réponse
Cordialemnt
super module
je souhaiterais avoir une export de ce type de tableau excel en 3 lignes pour chaque commande:
"compte client - date facture - numero facture - montant ttc - vide"
"compte HT - date facture - numero facture - vide - montant HT"
"compte TVA - date facture - numero facture - vide - montant TVA"
N'etant pas spécialiste de code, je n'arrive pas evidemment a modifier salesorder.php et config.xml afin d'arriver a ce résultat.
une idée?
merci
merci
ensuite dans le fichier d'export reporter comme cela:
foreach ($orders as $o) {
$data = $this->getInfos(Mage::getModel("sales/order")->load($o));
foreach($mapping as $k => $v) $content .= $enclose.$data[$k].$enclose.$delimiter;
$content .= "\r\n";
foreach($mapping2 as $k => $v) $content .= $enclose.$data[$k].$enclose.$delimiter;
$content .= "\r\n";
foreach($mapping3 as $k => $v) $content .= $enclose.$data[$k].$enclose.$delimiter;
$content .= "\r\n";
et ca marche
Par contre, je cherche à faire une petite modification mais je n'y arrive pas. Je développe en ce moment un site qui va exporter les données des commandes vers le logiciel du transporteur. Pour ce faire, j'aurai besoin de pouvoir renseigner le poids du panier contenant tous les articles.
Quelqu'un saurait-il comment il est possible d'ajouter cet attribut?
Merci à vous :)
Je souhaite l'utiliser non pas à partir de la page admin magento/commandes mais admin magento/factures et afficher les mêmes données pour les factures sélectionnées.
J'ai déjà effectué plusieurs modifs mais maintenant je bloque.
(Par m'y repérer j'ai remplacé les mots orders par fact)
Dans le fichier Magentix/Ordersexport/Model/SalesFact.php (copie de SalesOrder.php)
Tout d'abord est-ce toujours correct de faire un extend de la classe Mage_Sales_Model_Order pour les factures ?
class Magentix_FactExport_Model_SalesFact extends Mage_Sales_Model_Order {
public function exportFact($fact,$content='') {
$delimiter = Mage::getStoreConfig('ordersexport/csv/delimiter');
$enclose = Mage::getStoreConfig('ordersexport/csv/enclose');
$mapping = Mage::getStoreConfig('ordersexport/csv/mapping');
foreach($mapping as $k => $v) $content .= $enclose.Mage::helper('ordersexport')->__($v).$enclose.$delimiter;
$content .= "\r\n";
foreach ($fact as $gb) {
// $gb : variable d'identification de la facture
// Comment passer de $gb à $o : variable d'identification de la commande correspondante qui permet d'utiliser la fonction getInfos ?
// Dans la page des factures, $fact donne la valeur entity_id issue de la table mg_sales_order_entity
$data = $this->getInfos(Mage::getModel("sales/order")->load($o));
foreach($mapping as $k => $v) $content .= $enclose.$data[$k].$enclose.$delimiter;
$content .= "\r\n";
}
Donc en gros, comment passer de $gb à $o : variables d'identification des factures à celle des commandes correspondantes, ce qui permet d'utiliser la fonction getInfos ?
Merci de votre aide
Je souhaite tensférer les commandes vers mon ERP. D'après mon développeur, il y a plusieurs contraintes :
1- l'export csv est par défaut encodé au format utf8, est-il possible de générer un fichier csv au format unicode unicode ISO-8859-15 ?
2- les dates peuvent-elles être formatées sous la forme JJ/MM/AAAA au lieu de "2 nov. 2010 09:39:20"
3- Le retour à la ligne à l'intérieur d'une données peut-il ^etre enlevé ?
4- Est-il possible de fournir les montants avec 2 décimales seulement, et sans le symbole € ?
Merci d'avance pour votre aide.
Merci de votre aide
J'ai une question concernant cette extension.
Peux t'on rajouter d'autres fields dans le csv, tels que le giftmessage ?
Comment s'y prendre ?
Ce module est'il compatible avec EnhancedProductGrid extension ?
Merci beaucou.