Jump to content

Edit History

hakeryk2

hakeryk2

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?

 

hakeryk2

hakeryk2

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ł. 

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?

 

hakeryk2

hakeryk2

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ł. 

Wstawiam tutaj część kodu którą napisałem.
 

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

            $product = new Product((int)$id_product);
            $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 ' . $product->name[1] . ' '. $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) {

                    /* 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();
                        unset($product);
                    } else {
                        $combination->price = $combination->price + $price_difference;

                        $combination->save();
                        unset($combination);
                    }
                }
            }
        }
    }

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.

 

    public function synchronizeCombinationsPricesWithProductPrice($id_product)
    {
        if ($id_product) {
            $product = new Product((int)$id_product);
            $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();
                    }
                }
            }
        }
    }


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

 

×
×
  • Create New...