Jump to content
hakeryk2

Funkcja zmiany cen dla produktów z kombinacjami

Recommended Posts

Posted (edited)

Mam takie pytanie dla deweloperów, ostatnio musiałem napisać skrypt do zmiany cen produktów na podstawie kodu referencyjnego bądź też id_product i id_product_attribute i chciałbym zapytać czy może ktoś takiego już coś pisał i zwróci uwagę na co w sumie zwracać uwagę? Presta ma tyle zależności, że czasami można się walnąć a przy cenach bym tego nie chciał. 

Uwaga: skrypt był pisany dla produktów które mają kombinacje.

Wstawiam tutaj część kodu którą napisałem, dodałem warunki echo "" byście wiedzieli co i jak
 

public function updatePrices($id_product, $id_product_attribute = 0, $xml_brutto, $update = false, $decimal_places = 6)
    {
        if ($id_product && $id_product_attribute) {
            if ($xml_brutto <= 0)
                return false;

            $product = new Product((int)$id_product); // Using $id_product, true for full product is broken when without context
            if (!Validate::isLoadedObject($product))
                return false;

            $product_name = Product::getProductName($product->id, $id_product_attribute);
            $product->tax_rate = Tax::getProductTaxRate($product->id); // product

            $tax_rate = $product->tax_rate / 100 + 1; //return tax in ex. 1.23 format which is easier to use in math
            $xml_netto = round($xml_brutto / $tax_rate, $decimal_places);

            if (!$xml_netto){
                echo 'Something is wrong with netto price '.$product_name;
                return false;
            }

            if ($product->isDiscounted($product->id, 1, null, $id_product_attribute)){
                echo 'Product '.$product_name.' discounted, price wont be checked<br>';
                return false;
            }

            $combination = new Combination((int)$id_product_attribute);
            $combinations_quantity = Product::getProductCombinationsQuantity($product->id);

            $shop_brutto = round(($product->price + $combination->price) * $tax_rate); // needs to be rounded because values wont be equal
            $shop_netto = round($product->price + $combination->price, $decimal_places);

            if ($xml_brutto != $shop_brutto) {
                $price_difference = round($xml_netto - $shop_netto, $decimal_places);
                $compare = ($price_difference > 0) ? 'more expensive' : 'cheaper';
                
                echo 'Price for  '. $combination->reference .' is NOT the same.
                 In shop it is <strong>' . round($shop_netto * $tax_rate, 2) . '</strong> ('.$shop_netto.')
                 but in XML it is <strong>' . round($xml_netto * $tax_rate, 2) . '</strong> ('.$xml_netto.').
                 Product suppose to be '.$compare.' about <strong>'.round($price_difference*$tax_rate, 2).'</strong> PLN.<br>';
                if ($update && ($product->price + $combination->price) > 0) {
                    /* We need to check if product has price based on main price of product
                      or is combinations affecting price ny checking how many combinations it have */
                    if ($combinations_quantity <= 1) {
                        // just to prevent case when there was influence on price
                        // It is reset to 0 and set main price of product
                        if ($combination->price != 0) {
                            $combination->price = 0;
                            $combination->save();
                            echo 'Combination price returned to 0 due to only 1 or 0 combinations.<br>';
                        }

                        $product->price = $xml_netto;
                        $product->save();
                        echo 'Product '.$product_name.' saved with new price '.number_format($product->price*$tax_rate, 2).' <br>';
                        unset($product);
                    } else {
                        $combination->price = (float)($combination->price + $price_difference);
                        $combination->save();
                        echo 'Combination for '.$combination->reference.' was changed to '.number_format($combination->price*$tax_rate).'<br>';
                        unset($combination);
                    }
                }
            } else {
                echo 'Price for '.$combination->reference.' is OK<br>';
            }
        }
    }

I następnie wywoływana jest funkcja która synchronizuje ceny jeśli nagle wszystkie impact price są takie wiec ustawia główną cenę produktu na domyślną, a kombinacje spadają na zero. Przydatne gdy powyższa funkcja dla wszystkich np 6 kombinacji ustawiła impact na 6 zł, więc synchronizacja wyrówna główną cenę na +6 zł a impact poleci na 0.

 

    public function synchronizeCombinationsPricesWithProductPrice($id_product)
    {
        if ($id_product) {
            $product = new Product((int)$id_product);
            if ($product->isDiscounted($product->id))
                return false; // dont synchronize products with discounts

            $product_combinations = $product->getAttributeCombinations(0);
            if (count($product_combinations) > 1) {

                // holy shit that is lame but it works
                $combination_impact = $product_combinations[0]['price'];
                $same_impacts = false;

                if ($combination_impact != 0) {
                    foreach ($product_combinations as $attribute) {
                        if ($attribute['price'] == $combination_impact) {
                            $same_impacts = true;
                        } else {
                            $same_impacts = false;
                            break;
                        }
                    }
                }

                if ($same_impacts === true) {
                	if ($product->price + $combination_impact <= 0)
                		return false;

                    $product->price = ($product->price + $combination_impact);
                    $product->save();
                    foreach ($product_combinations as $attribute){
                        $combination = new Combination((int)$attribute['id_product_attribute']);
                        $combination->price = 0;
                        $combination->save();
                        unset($combination);
                    }
                    echo 'Synchronized prices for  '.$product->getProductName($product->id).'<br>';
                }
            }
        }
    }


Możecie się podzielić może Waszymi kodami?

 

Edited by hakeryk2 (see edit history)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.


×
×
  • Create New...

Important Information

Cookies ensure the smooth running of our services. Using these, you accept the use of cookies. Learn More