/** * Post treatment for suppliers */ public function processSuppliers() { if ((int) Tools::getValue('supplier_loaded') === 1 && Validate::isLoadedObject($product = new Product((int) Tools::getValue('id_product')))) { // Get all id_product_attribute $attributes = $product->getAttributesResume($this->context->language->id); if (empty($attributes)) { $attributes[] = array('id_product_attribute' => 0, 'attribute_designation' => ''); } // Get all available suppliers $suppliers = Supplier::getSuppliers(); // Get already associated suppliers $associated_suppliers = ProductSupplier::getSupplierCollection($product->id); $suppliers_to_associate = array(); $new_default_supplier = 0; if (Tools::isSubmit('default_supplier')) { $new_default_supplier = (int) Tools::getValue('default_supplier'); } // Get new associations foreach ($suppliers as $supplier) { if (Tools::isSubmit('check_supplier_' . $supplier['id_supplier'])) { $suppliers_to_associate[] = $supplier['id_supplier']; } } // Delete already associated suppliers if needed foreach ($associated_suppliers as $key => $associated_supplier) { if (!in_array($associated_supplier->id_supplier, $suppliers_to_associate)) { $associated_supplier->delete(); unset($associated_suppliers[$key]); } } // Associate suppliers foreach ($suppliers_to_associate as $id) { $to_add = true; foreach ($associated_suppliers as $as) { if ($id == $as->id_supplier) { $to_add = false; } } if ($to_add) { $product_supplier = new ProductSupplier(); $product_supplier->id_product = $product->id; $product_supplier->id_product_attribute = 0; $product_supplier->id_supplier = $id; if ($this->context->currency->id) { $product_supplier->id_currency = (int) $this->context->currency->id; } else { $product_supplier->id_currency = (int) Configuration::get('PS_CURRENCY_DEFAULT'); } $product_supplier->save(); $associated_suppliers[] = $product_supplier; } } // Manage references and prices foreach ($attributes as $attribute) { foreach ($associated_suppliers as $supplier) { if (Tools::isSubmit('supplier_reference_' . $product->id . '_' . $attribute['id_product_attribute'] . '_' . $supplier->id_supplier) || Tools::isSubmit('product_price_' . $product->id . '_' . $attribute['id_product_attribute'] . '_' . $supplier->id_supplier) && Tools::isSubmit('product_price_currency_' . $product->id . '_' . $attribute['id_product_attribute'] . '_' . $supplier->id_supplier)) { $reference = pSQL(Tools::getValue('supplier_reference_' . $product->id . '_' . $attribute['id_product_attribute'] . '_' . $supplier->id_supplier, '')); $price = (double) str_replace(array(' ', ','), array('', '.'), Tools::getValue('product_price_' . $product->id . '_' . $attribute['id_product_attribute'] . '_' . $supplier->id_supplier, 0)); $price = Tools::ps_round($price, 6); $id_currency = (int) Tools::getValue('product_price_currency_' . $product->id . '_' . $attribute['id_product_attribute'] . '_' . $supplier->id_supplier, 0); if ($id_currency <= 0 || (!($result = Currency::getCurrency($id_currency)) || empty($result))) { $this->errors[] = Tools::displayError('The selected currency is not valid'); } // Save product-supplier data $product_supplier_id = (int) ProductSupplier::getIdByProductAndSupplier($product->id, $attribute['id_product_attribute'], $supplier->id_supplier); if (!$product_supplier_id) { $product->addSupplierReference($supplier->id_supplier, (int) $attribute['id_product_attribute'], $reference, (double) $price, (int) $id_currency); if ($product->id_supplier == $supplier->id_supplier) { if ((int) $attribute['id_product_attribute'] > 0) { $data = array('supplier_reference' => pSQL($reference), 'wholesale_price' => (double) Tools::convertPrice($price, $id_currency)); $where = ' a.id_product = ' . (int) $product->id . ' AND a.id_product_attribute = ' . (int) $attribute['id_product_attribute']; ObjectModel::updateMultishopTable('Combination', $data, $where); } else { $product->wholesale_price = (double) Tools::convertPrice($price, $id_currency); //converted in the default currency $product->supplier_reference = pSQL($reference); $product->update(); } } } else { $product_supplier = new ProductSupplier($product_supplier_id); $product_supplier->id_currency = (int) $id_currency; $product_supplier->product_supplier_price_te = (double) $price; $product_supplier->product_supplier_reference = pSQL($reference); $product_supplier->update(); } } elseif (Tools::isSubmit('supplier_reference_' . $product->id . '_' . $attribute['id_product_attribute'] . '_' . $supplier->id_supplier)) { //int attribute with default values if possible if ((int) $attribute['id_product_attribute'] > 0) { $product_supplier = new ProductSupplier(); $product_supplier->id_product = $product->id; $product_supplier->id_product_attribute = (int) $attribute['id_product_attribute']; $product_supplier->id_supplier = $supplier->id_supplier; $product_supplier->save(); } } } } // Manage defaut supplier for product if ($new_default_supplier != $product->id_supplier) { $this->object->id_supplier = $new_default_supplier; $this->object->update(); } } }
/** * Sets Supplier Reference * * @param int $id_supplier * @param int $id_product_attribute * @param string $supplier_reference * @param float $price * @param int $id_currency */ public function addSupplierReference($id_supplier, $id_product_attribute, $supplier_reference = null, $price = null, $id_currency = null) { //in some case we need to add price without supplier reference if ($supplier_reference === null) { $supplier_reference = ''; } //Try to set the default supplier reference if ($id_supplier > 0) { $id_product_supplier = (int) ProductSupplier::getIdByProductAndSupplier($this->id, $id_product_attribute, $id_supplier); if (!$id_product_supplier) { //create new record $product_supplier_entity = new ProductSupplier(); $product_supplier_entity->id_product = (int) $this->id; $product_supplier_entity->id_product_attribute = (int) $id_product_attribute; $product_supplier_entity->id_supplier = (int) $id_supplier; $product_supplier_entity->product_supplier_reference = pSQL($supplier_reference); $product_supplier_entity->product_supplier_price_te = (int) $price; $product_supplier_entity->id_currency = (int) $id_currency; $product_supplier_entity->save(); } else { $product_supplier = new ProductSupplier((int) $id_product_supplier); $product_supplier->product_supplier_reference = pSQL($supplier_reference); $product_supplier->update(); } } }