Magento 1 i dublujące się numery dostawy

Dziś chciałabym opowiedzieć o integracji magento z zewnętrznym systemem do zarządzania zamówieniami. Jeśli nasz sklep korzysta z takiego rozwiązania, to zazwyczaj całe „życie zamówienia” odbywa się właśnie w nim. Zobowiązuje to developerów do tego by pobierać z takiego systemu wszelkie informacje na temat zamówień (statusy, numery przesyłek, etc). Zdarza się również, że po stronie samego sklepu są jakieś mechanizmy, które umożliwiają ręczne uruchomienie procesów, które normalnie uruchamiają się w tle.

Co jeśli, jednak mamy guzik pobierz numer przesyłki i ktoś w niego „naklika” kilka razy? A no zapewne doda nam się  numer przesyłki kilka razy do gridu zamówień a tego byśmy nie chcieli! Rozwiązaniem tego problemu będzie nadpisanie klasy Mage_Sales_Model_Order_Shipment.


/**
 * Class Namespace_Sales_Model_Sales_Order_Shipment
 */
class Namespace_Sales_Model_Sales_Order_Shipment extends Mage_Sales_Model_Order_Shipment
{

    /**
     * @param Mage_Sales_Model_Order_Shipment_Track $track
     * @return $this
     */
    public function addTrack(Mage_Sales_Model_Order_Shipment_Track $track)
    {
        $codes = array();
        /** @var Mage_Sales_Model_Order $order */
        $order = $this->getOrder();
        foreach ($order->getShipmentsCollection() as $shipment) {
            foreach ($shipment->getAllTracks() as $item) {
                $codes[]= $item->getNumber();
            }
        }

        if (array_search($track->getNumber(), $codes) !== false) {
            return $this;
        }

        return parent::addTrack($track);
    }

    /**
     * @inheritdoc
     */
    public function save()
    {
        if ($this->getTracksCollection()->count()) {
            parent::save();
        }
    }
}

Jak to działa? Najpierw sprawdzamy jakie mamy już numery przesyłek i czy ten nowy, który chcemy dodać już istnieje. Jeśli tak – wychodzimy z metody. W momencie zapisywania przesyłki, sprawdzamy czy posiada jakieś numery i jeśli nie posiada żadnego to nic nie robimy, w przeciwnym racie wykonujemy standardowy corowy save().