/** * Set the weight of this package * * @param Float|Weight $weight * * @return Package */ public function setWeight($weight) { if (is_numeric($weight)) { $weightObject = new Weight(); $weightObject->setWeight($weight); $weight = $weightObject; } else { if (!$weight instanceof Weight) { throw new \Exception('Weight must either be numeric or an instance of \\SimpleUPS\\Weight'); } } $this->weight = $weight; return $this; }
public function getWeight() { $weight = 0; foreach ($this->getProducts() as $product) { if ($product['shipping']) { $weight += $this->weight->convert($product['weight'], $product['weight_class_id'], $this->config->get('config_weight_class_id')); } } return $weight; }
/** * Calculate the shipment price for the given Shipper ID, order price and * total weight. * * Returns the shipment price in default currency, or -1 if there is any kind * of problem with the shipment conditions. * The weight is converted from string using {@link Weight::getWeight()} * to make sure that grams are used. * Note: You have to convert the returned value to the customers' currency * using {@link Currency::getCurrencyPrice()}! * @param integer $shipperId The Shipper ID * @param double $price The total order price * @param integer $weight The total order weight in grams. * @return double The cost for shipping in the default * currency, or -1. * @static */ static function calculateShipmentPrice($shipperId, $price, $weight) { if (empty(self::$arrShippers)) { self::init(); } // Are there conditions available from this shipper? // Otherwise, don't even try to find one. return if (!isset(self::$arrShipments[$shipperId])) { return -1; } // check shipments available by this shipper $arrShipment = self::$arrShipments[$shipperId]; // Find the best match for the current order weight and shipment cost. // Arbitrary upper limit - we *SHOULD* be able to find one that's lower! // We'll just try to find the cheapest way to handle the delivery. $lowest_cost = 1.0E+100; // Temporary shipment cost $fee = 0; // Found flag is set to the index of a suitable shipment, if encountered below. // If the flag stays at -1, there is no way to deliver it! $found = -1; // Try all the available shipments // (see Shipment.class.php::getJSArrays()) foreach ($arrShipment as $shipment_id => $conditions) { $free_from = $conditions['free_from']; $max_weight = Weight::getWeight($conditions['max_weight']); // Get the shipment conditions that are closest to our order: // We have to make sure the maximum weight is big enough for the order, // or that it's unspecified (don't care) if ($max_weight > 0 && $weight <= $max_weight || $max_weight == 0) { // If free_from is set, the order amount has to be higher than that // in order to get the shipping for free. if ($free_from > 0 && $price >= $free_from) { // We're well within the weight limit, and the order is also expensive // enough to get a free shipping. $fee = '0.00'; } else { // Either the order amount is too low, or free_from is unset, or zero, // so the shipping has to be paid for in any case. $fee = $conditions['fee']; } // We found a kind of shipment that can handle the order, but maybe // it's too expensive. - keep the cheapest way to deliver it if ($fee < $lowest_cost) { // Found a cheaper one. keep the index. $found = $shipment_id; $lowest_cost = $fee; } } } if ($found > 0) { // After checking all the shipments, we found the lowest cost for the // given weight and order price. - update the shipping cost return $lowest_cost; } // Cannot find suitable shipment conditions for the selected shipper. return -1; }
/** * @internal * * @param \SimpleXMLElement $xml * * @return Weight */ public static function fromXml(\SimpleXMLElement $xml) { $shipmentWeight = new Weight(); $shipmentWeight->setIsResponse(); $shipmentWeight->setCode($xml->UnitOfMeasurement->Code)->setDescription($xml->UnitOfMeasurement->Description)->setWeight($xml->Weight); return $shipmentWeight; }
/** * Generates an overview of the Order for the Customer to confirm * * Forward her to the processing of the Order after the button has been * clicked. * @return boolean True on success, false otherwise */ static function confirm() { global $_ARRAYLANG; // If the cart or address is missing, return to the shop if (!self::verifySessionAddress()) { \Cx\Core\Csrf\Controller\Csrf::redirect(\Cx\Core\Routing\Url::fromModuleAndCmd('Shop', '')); } self::$show_currency_navbar = false; // The Customer clicked the confirm button; this must not be the case // the first time this method is called. if (isset($_POST['process'])) { return self::process(); } // Show confirmation page. self::$objTemplate->hideBlock('shopProcess'); self::$objTemplate->setGlobalVariable($_ARRAYLANG); // It may be necessary to refresh the cart here, as the customer // may return to the cart, then press "Back". self::_initPaymentDetails(); foreach (Cart::get_products_array() as $arrProduct) { $objProduct = Product::getById($arrProduct['id']); if (!$objProduct) { // TODO: Implement a proper method // unset(Cart::get_product_id($cart_id]); continue; } $price_options = 0; $attributes = Attributes::getAsStrings($arrProduct['options'], $price_options); $attributes = $attributes[0]; // Note: The Attribute options' price is added // to the price here! $price = $objProduct->get_custom_price(self::$objCustomer, $price_options, $arrProduct['quantity']); // Test the distribution method for delivery $productDistribution = $objProduct->distribution(); $weight = $productDistribution == 'delivery' ? Weight::getWeightString($objProduct->weight()) : '-'; $vatId = $objProduct->vat_id(); $vatRate = Vat::getRate($vatId); $vatPercent = Vat::getShort($vatId); $vatAmount = Vat::amount($vatRate, $price * $arrProduct['quantity']); self::$objTemplate->setVariable(array('SHOP_PRODUCT_ID' => $arrProduct['id'], 'SHOP_PRODUCT_CUSTOM_ID' => $objProduct->code(), 'SHOP_PRODUCT_TITLE' => contrexx_raw2xhtml($objProduct->name()), 'SHOP_PRODUCT_PRICE' => Currency::formatPrice($price * $arrProduct['quantity']), 'SHOP_PRODUCT_QUANTITY' => $arrProduct['quantity'], 'SHOP_PRODUCT_ITEMPRICE' => Currency::formatPrice($price), 'SHOP_UNIT' => Currency::getActiveCurrencySymbol())); if ($attributes && self::$objTemplate->blockExists('attributes')) { self::$objTemplate->setVariable('SHOP_PRODUCT_OPTIONS', $attributes); } if (\Cx\Core\Setting\Controller\Setting::getValue('weight_enable', 'Shop')) { self::$objTemplate->setVariable(array('SHOP_PRODUCT_WEIGHT' => $weight, 'TXT_WEIGHT' => $_ARRAYLANG['TXT_WEIGHT'])); } if (Vat::isEnabled()) { self::$objTemplate->setVariable(array('SHOP_PRODUCT_TAX_RATE' => $vatPercent, 'SHOP_PRODUCT_TAX_AMOUNT' => Currency::formatPrice($vatAmount) . ' ' . Currency::getActiveCurrencySymbol())); } self::$objTemplate->parse("shopCartRow"); } $total_discount_amount = 0; if (Cart::get_discount_amount()) { $total_discount_amount = Cart::get_discount_amount(); self::$objTemplate->setVariable(array('SHOP_DISCOUNT_COUPON_TOTAL' => $_ARRAYLANG['TXT_SHOP_DISCOUNT_COUPON_AMOUNT_TOTAL'], 'SHOP_DISCOUNT_COUPON_TOTAL_AMOUNT' => Currency::formatPrice(-$total_discount_amount))); } self::$objTemplate->setVariable(array('SHOP_UNIT' => Currency::getActiveCurrencySymbol(), 'SHOP_TOTALITEM' => Cart::get_item_count(), 'SHOP_PAYMENT_PRICE' => Currency::formatPrice($_SESSION['shop']['payment_price']), 'SHOP_TOTALPRICE' => Currency::formatPrice(Cart::get_price()), 'SHOP_PAYMENT' => Payment::getProperty($_SESSION['shop']['paymentId'], 'name'), 'SHOP_GRAND_TOTAL' => Currency::formatPrice($_SESSION['shop']['grand_total_price']), 'SHOP_COMPANY' => stripslashes($_SESSION['shop']['company']), 'SHOP_TITLE' => stripslashes($_SESSION['shop']['gender']), 'SHOP_GENDER' => stripslashes($_SESSION['shop']['gender']), 'SHOP_LASTNAME' => stripslashes($_SESSION['shop']['lastname']), 'SHOP_FIRSTNAME' => stripslashes($_SESSION['shop']['firstname']), 'SHOP_ADDRESS' => stripslashes($_SESSION['shop']['address']), 'SHOP_ZIP' => stripslashes($_SESSION['shop']['zip']), 'SHOP_CITY' => stripslashes($_SESSION['shop']['city']), 'SHOP_COUNTRY' => \Cx\Core\Country\Controller\Country::getNameById($_SESSION['shop']['countryId']), 'SHOP_EMAIL' => stripslashes($_SESSION['shop']['email']), 'SHOP_PHONE' => stripslashes($_SESSION['shop']['phone']), 'SHOP_FAX' => stripslashes($_SESSION['shop']['fax']))); if (!empty($_SESSION['shop']['lastname2'])) { self::$objTemplate->setVariable(array('SHOP_COMPANY2' => stripslashes($_SESSION['shop']['company2']), 'SHOP_TITLE2' => stripslashes($_SESSION['shop']['gender2']), 'SHOP_LASTNAME2' => stripslashes($_SESSION['shop']['lastname2']), 'SHOP_FIRSTNAME2' => stripslashes($_SESSION['shop']['firstname2']), 'SHOP_ADDRESS2' => stripslashes($_SESSION['shop']['address2']), 'SHOP_ZIP2' => stripslashes($_SESSION['shop']['zip2']), 'SHOP_CITY2' => stripslashes($_SESSION['shop']['city2']), 'SHOP_COUNTRY2' => \Cx\Core\Country\Controller\Country::getNameById($_SESSION['shop']['countryId2']), 'SHOP_PHONE2' => stripslashes($_SESSION['shop']['phone2']))); } if (!empty($_SESSION['shop']['note'])) { self::$objTemplate->setVariable(array('SHOP_CUSTOMERNOTE' => $_SESSION['shop']['note'])); } if (Vat::isEnabled()) { self::$objTemplate->setVariable(array('TXT_TAX_RATE' => $_ARRAYLANG['TXT_SHOP_VAT_RATE'], 'SHOP_TAX_PRICE' => Currency::formatPrice($_SESSION['shop']['vat_price']), 'SHOP_TAX_PRODUCTS_TXT' => $_SESSION['shop']['vat_products_txt'], 'SHOP_TAX_GRAND_TXT' => $_SESSION['shop']['vat_grand_txt'], 'TXT_TAX_PREFIX' => Vat::isIncluded() ? $_ARRAYLANG['TXT_SHOP_VAT_PREFIX_INCL'] : $_ARRAYLANG['TXT_SHOP_VAT_PREFIX_EXCL'])); if (Vat::isIncluded()) { self::$objTemplate->setVariable(array('SHOP_GRAND_TOTAL_EXCL_TAX' => Currency::formatPrice($_SESSION['shop']['grand_total_price'] - $_SESSION['shop']['vat_price']))); } } // TODO: Make sure in payment() that those two are either both empty or // both non-empty! if (!Cart::needs_shipment() && empty($_SESSION['shop']['shipperId'])) { if (self::$objTemplate->blockExists('shipping_address')) { self::$objTemplate->hideBlock('shipping_address'); } } else { // Shipment is required, so if (empty($_SESSION['shop']['shipperId'])) { \Cx\Core\Csrf\Controller\Csrf::redirect(\Cx\Core\Routing\Url::fromModuleAndCmd('Shop', 'payment')); } self::$objTemplate->setVariable(array('SHOP_SHIPMENT_PRICE' => Currency::formatPrice($_SESSION['shop']['shipment_price']), 'SHOP_SHIPMENT' => Shipment::getShipperName($_SESSION['shop']['shipperId']))); } // Custom. // Enable if Discount class is customized and in use. //self::showCustomerDiscount(Cart::get_price()); return true; }
public function meat_productions(Request $request) { $meat_productions = new MilkProduction(); $meat_productions->idUser = Auth::id(); $meat_productions->idAnimal = Animal::where('id', $request->name)->pluck('id'); $meat_productions->idAnimal = Weight::where('id', $request->id)->pluck('id'); //ultimo peso $meat_productions->dateWeight = Input::get('dateWeight'); $meat_productions->save(); }
static function getJavascriptArray($groupCustomerId = 0, $isReseller = false) { global $objDatabase; // create javascript array containing all products; // used to update the display when changing the product ID. // we need the VAT rate in there as well in order to be able to correctly change the products, // and the flag indicating whether the VAT is included in the prices already. $strJsArrProduct = 'var vat_included = ' . intval(Vat::isIncluded()) . ";\nvar arrProducts = new Array();\n"; $arrSql = \Text::getSqlSnippets('`product`.`id`', FRONTEND_LANG_ID, 'Shop', array('name' => Product::TEXT_NAME, 'code' => Product::TEXT_CODE)); $query = "\n SELECT `product`.`id`,\n `product`.`resellerprice`, `product`.`normalprice`,\n `product`.`discountprice`, `product`.`discount_active`,\n `product`.`weight`, `product`.`vat_id`,\n `product`.`distribution`,\n `product`.`group_id`, `product`.`article_id`, " . $arrSql['field'] . "\n FROM `" . DBPREFIX . "module_shop" . MODULE_INDEX . "_products` AS `product`" . $arrSql['join'] . "\n WHERE `product`.`active`=1"; $objResult = $objDatabase->Execute($query); if (!$objResult) { return Product::errorHandler(); } while (!$objResult->EOF) { $id = $objResult->fields['id']; $distribution = $objResult->fields['distribution']; $strCode = $objResult->fields['code']; if ($strCode === null) { $strCode = \Text::getById($id, 'Shop', Product::TEXT_CODE)->content(); } $strName = $objResult->fields['name']; if ($strName === null) { $strName = \Text::getById($id, 'Shop', Product::TEXT_NAME)->content(); } $price = $objResult->fields['normalprice']; if ($objResult->fields['discount_active']) { $price = $objResult->fields['discountprice']; } elseif ($isReseller) { $price = $objResult->fields['resellerprice']; } // Determine discounted price from customer and article group matrix $discountCustomerRate = Discount::getDiscountRateCustomer($groupCustomerId, $objResult->fields['article_id']); $price -= $price * $discountCustomerRate * 0.01; // Determine prices for various count discounts, if any $arrDiscountCountRate = Discount::getDiscountCountRateArray($objResult->fields['group_id']); //\DBG::log("Products::getJavascriptArray($groupCustomerId, $isReseller): Discount rate array: ".var_export($arrDiscountCountRate, true)); // Order the counts in reverse, from highest to lowest $strJsArrPrice = ''; if (is_array($arrDiscountCountRate)) { foreach ($arrDiscountCountRate as $count => $rate) { // Deduct the customer type discount right away //\DBG::log("Products::getJavascriptArray(): price $price, rate $rate"); $discountPrice = $price - $price * $rate * 0.01; $strJsArrPrice .= ($strJsArrPrice ? ',' : '') . $count . ',' . Currency::getCurrencyPrice($discountPrice); } } $strJsArrPrice .= ($strJsArrPrice ? ',' : '') . '0,' . Currency::getCurrencyPrice($price); $strJsArrProduct .= 'arrProducts[' . $id . '] = {' . 'id:' . $id . ',' . 'code:"' . $strCode . '",' . 'title:"' . htmlspecialchars($strName, ENT_QUOTES, CONTREXX_CHARSET) . '",' . 'percent:' . Vat::getRate($objResult->fields['vat_id']) . ',' . 'weight:' . ($distribution == 'delivery' ? '"' . Weight::getWeightString($objResult->fields['weight']) . '"' : '0') . ',' . 'price:[' . $strJsArrPrice . "]};\n"; $objResult->MoveNext(); } return $strJsArrProduct; }
/** * The Cart view * * Mind that the Cart needs to be {@see update()}d before calling this * method. * @global array $_ARRAYLANG Language array * @param \Cx\Core\Html\Sigma $objTemplate The optional Template */ static function view($objTemplate = null) { global $_ARRAYLANG; if (!$objTemplate) { // TODO: Handle missing or empty Template, load one die("Cart::view(): ERROR: No template"); // return false; } $objTemplate->setGlobalVariable($_ARRAYLANG); $i = 0; if (count(self::$products)) { foreach (self::$products as $arrProduct) { $groupCountId = $arrProduct['group_id']; $groupArticleId = $arrProduct['article_id']; $groupCustomerId = 0; if (Shop::customer()) { $groupCustomerId = Shop::customer()->group_id(); } Shop::showDiscountInfo($groupCustomerId, $groupArticleId, $groupCountId, $arrProduct['quantity']); // product image $arrProductImg = Products::get_image_array_from_base64($arrProduct['product_images']); $shopImagesWebPath = \Cx\Core\Core\Controller\Cx::instanciate()->getWebsiteImagesWebPath() . '/Shop/'; $thumbnailPath = $shopImagesWebPath . ShopLibrary::noPictureName; foreach ($arrProductImg as $productImg) { if (!empty($productImg['img']) && $productImg['img'] != ShopLibrary::noPictureName) { $thumbnailPath = $shopImagesWebPath . \ImageManager::getThumbnailFilename($productImg['img']); break; } } /* UNUSED (and possibly obsolete, too) if (isset($arrProduct['discount_string'])) { //DBG::log("Shop::view_cart(): Product ID ".$arrProduct['id'].": ".$arrProduct['discount_string']); $objTemplate->setVariable( 'SHOP_DISCOUNT_COUPON_STRING', $arrProduct['coupon_string'] ); }*/ // The fields that don't apply have been set to '' // (empty string) already -- see update(). $objTemplate->setVariable(array('SHOP_PRODUCT_ROW' => 'row' . (++$i % 2 + 1), 'SHOP_PRODUCT_ID' => $arrProduct['id'], 'SHOP_PRODUCT_CODE' => $arrProduct['product_id'], 'SHOP_PRODUCT_THUMBNAIL' => $thumbnailPath, 'SHOP_PRODUCT_CART_ID' => $arrProduct['cart_id'], 'SHOP_PRODUCT_TITLE' => str_replace('"', '"', contrexx_raw2xhtml($arrProduct['title'])), 'SHOP_PRODUCT_PRICE' => $arrProduct['price'], 'SHOP_PRODUCT_PRICE_UNIT' => Currency::getActiveCurrencySymbol(), 'SHOP_PRODUCT_QUANTITY' => $arrProduct['quantity'], 'SHOP_PRODUCT_ITEMPRICE' => $arrProduct['itemprice'], 'SHOP_PRODUCT_ITEMPRICE_UNIT' => Currency::getActiveCurrencySymbol(), 'SHOP_REMOVE_PRODUCT' => $_ARRAYLANG['TXT_SHOP_REMOVE_ITEM'])); //DBG::log("Attributes String: {$arrProduct['options_long']}"); if ($arrProduct['options_long']) { $objTemplate->setVariable('SHOP_PRODUCT_OPTIONS', $arrProduct['options_long']); } if (\Cx\Core\Setting\Controller\Setting::getValue('weight_enable', 'Shop')) { $objTemplate->setVariable(array('SHOP_PRODUCT_WEIGHT' => Weight::getWeightString($arrProduct['weight']), 'TXT_WEIGHT' => $_ARRAYLANG['TXT_TOTAL_WEIGHT'])); } if (Vat::isEnabled()) { $objTemplate->setVariable(array('SHOP_PRODUCT_TAX_RATE' => $arrProduct['vat_rate'] ? Vat::format($arrProduct['vat_rate']) : '', 'SHOP_PRODUCT_TAX_AMOUNT' => $arrProduct['vat_amount'] . ' ' . Currency::getActiveCurrencySymbol())); } if (intval($arrProduct['minimum_order_quantity']) > 0) { $objTemplate->setVariable(array('SHOP_PRODUCT_MINIMUM_ORDER_QUANTITY' => $arrProduct['minimum_order_quantity'])); } else { if ($objTemplate->blockExists('orderQuantity')) { $objTemplate->hideBlock('orderQuantity'); } if ($objTemplate->blockExists('minimumOrderQuantity')) { $objTemplate->hideBlock('minimumOrderQuantity'); } } $objTemplate->parse('shopCartRow'); } } else { $objTemplate->hideBlock('shopCart'); if ($objTemplate->blockExists('shopCartEmpty')) { $objTemplate->touchBlock('shopCartEmpty'); $objTemplate->parse('shopCartEmpty'); } if ($_SESSION['shop']['previous_product_ids']) { $ids = $_SESSION['shop']['previous_product_ids']->toArray(); Shop::view_product_overview($ids); } } $objTemplate->setGlobalVariable(array('TXT_PRODUCT_ID' => $_ARRAYLANG['TXT_ID'], 'SHOP_PRODUCT_TOTALITEM' => self::get_item_count(), 'SHOP_PRODUCT_TOTALPRICE' => Currency::formatPrice(self::get_price()), 'SHOP_PRODUCT_TOTALPRICE_PLUS_VAT' => Currency::formatPrice(self::get_price() + (Vat::isEnabled() && !Vat::isIncluded() ? self::get_vat_amount() : 0)), 'SHOP_PRODUCT_TOTALPRICE_UNIT' => Currency::getActiveCurrencySymbol(), 'SHOP_TOTAL_WEIGHT' => Weight::getWeightString(self::get_weight()), 'SHOP_PRICE_UNIT' => Currency::getActiveCurrencySymbol())); // Show the Coupon code field only if there is at least one defined if (Coupon::count_available()) { //DBG::log("Coupons available"); $objTemplate->setVariable(array('SHOP_DISCOUNT_COUPON_CODE' => isset($_SESSION['shop']['coupon_code']) ? $_SESSION['shop']['coupon_code'] : '')); if ($objTemplate->blockExists('shopCoupon')) { $objTemplate->parse('shopCoupon'); } if (self::get_discount_amount()) { $total_discount_amount = self::get_discount_amount(); //DBG::log("Shop::view_cart(): Total: Amount $total_discount_amount"); $objTemplate->setVariable(array('SHOP_DISCOUNT_COUPON_TOTAL' => $_ARRAYLANG['TXT_SHOP_DISCOUNT_COUPON_AMOUNT_TOTAL'], 'SHOP_DISCOUNT_COUPON_TOTAL_AMOUNT' => Currency::formatPrice(-$total_discount_amount))); } } if (Vat::isEnabled()) { $objTemplate->setVariable(array('TXT_TAX_PREFIX' => Vat::isIncluded() ? $_ARRAYLANG['TXT_SHOP_VAT_PREFIX_INCL'] : $_ARRAYLANG['TXT_SHOP_VAT_PREFIX_EXCL'], 'SHOP_TOTAL_TAX_AMOUNT' => self::get_vat_amount() . ' ' . Currency::getActiveCurrencySymbol())); if (Vat::isIncluded()) { $objTemplate->setVariable(array('SHOP_GRAND_TOTAL_EXCL_TAX' => Currency::formatPrice(self::get_price() - self::get_vat_amount()) . ' ' . Currency::getActiveCurrencySymbol())); } } if (self::needs_shipment()) { $objTemplate->setVariable(array('TXT_SHIP_COUNTRY' => $_ARRAYLANG['TXT_SHIP_COUNTRY'], 'SHOP_COUNTRIES_MENU' => \Cx\Core\Country\Controller\Country::getMenu('countryId2', $_SESSION['shop']['countryId2'], true, "document.forms['shopForm'].submit()"), 'SHOP_COUNTRIES_MENUOPTIONS' => \Cx\Core\Country\Controller\Country::getMenuoptions($_SESSION['shop']['countryId2']))); } if (\Cx\Core\Setting\Controller\Setting::getValue('orderitems_amount_min', 'Shop') > 0 && \Cx\Core\Setting\Controller\Setting::getValue('orderitems_amount_min', 'Shop') > self::get_price()) { $objTemplate->setVariable('MESSAGE_TEXT', sprintf($_ARRAYLANG['TXT_SHOP_ORDERITEMS_AMOUNT_MIN'], Currency::formatPrice(\Cx\Core\Setting\Controller\Setting::getValue('orderitems_amount_min', 'Shop')), Currency::getActiveCurrencySymbol())); } elseif (\Cx\Core\Setting\Controller\Setting::getValue('orderitems_amount_max', 'Shop') > 0 && \Cx\Core\Setting\Controller\Setting::getValue('orderitems_amount_max', 'Shop') < self::get_price()) { $objTemplate->setVariable('MESSAGE_TEXT', sprintf($_ARRAYLANG['TXT_SHOP_ORDERITEMS_AMOUNT_MAX'], Currency::formatPrice(\Cx\Core\Setting\Controller\Setting::getValue('orderitems_amount_max', 'Shop')), Currency::getActiveCurrencySymbol())); } else { $objTemplate->setVariable('TXT_NEXT', $_ARRAYLANG['TXT_NEXT']); } }
/** * View of this Orders' items * @global ADONewConnection $objDatabase * @global array $_ARRAYLANG * @param HTML_Template_Sigma $objTemplate The template * @param type $edit If true, items are editable * @param type $total_weight Initial value for the * total item weight, by * reference. * Usually empty or zero * @param type $i Initial value for the row * count, by reference. * Usually empty or zero. * @return float The net item sum on success, * false otherwise */ function view_items($objTemplate, $edit, &$total_weight = 0, $i = 0) { global $objDatabase, $_ARRAYLANG; // Order items // c_sp // Mind the custom price calculation $objCustomer = Customer::getById($this->customer_id); if (!$objCustomer) { \Message::error(sprintf($_ARRAYLANG['TXT_SHOP_ORDER_ERROR_MISSING_CUSTOMER'], $this->customer_id)); $objCustomer = new Customer(); } $query = "\n SELECT `id`, `product_id`, `product_name`,\n `price`, `quantity`, `vat_rate`, `weight`\n FROM `" . DBPREFIX . "module_shop" . MODULE_INDEX . "_order_items`\n WHERE `order_id`=?"; $objResult = $objDatabase->Execute($query, array($this->id)); if (!$objResult) { return self::errorHandler(); } $arrProductOptions = $this->getOptionArray(); $total_vat_amount = 0; $total_net_price = 0; // Orders with Attributes cannot currently be edited // (this would spoil all the options!) // $have_option = false; while (!$objResult->EOF) { $item_id = $objResult->fields['id']; $name = $objResult->fields['product_name']; $price = $objResult->fields['price']; $quantity = $objResult->fields['quantity']; $vat_rate = $objResult->fields['vat_rate']; $product_id = $objResult->fields['product_id']; // Get missing product details $objProduct = Product::getById($product_id); if (!$objProduct) { \Message::warning(sprintf($_ARRAYLANG['TXT_SHOP_PRODUCT_NOT_FOUND'], $product_id)); $objProduct = new Product('', 0, $name, '', $price, 0, 0, 0, $product_id); } $code = $objProduct->code(); $distribution = $objProduct->distribution(); if (isset($arrProductOptions[$item_id])) { if ($edit) { // Edit options } else { //DBG::log("Order::view_items(): Item ID $item_id, Attributes: ".var_export($arrProductOptions[$item_id], true)); // Verify that options are properly shown foreach ($arrProductOptions[$item_id] as $attribute_id => $attribute) { //DBG::log("Order::view_items(): Added option, price: $options_price"); foreach ($attribute as $a) { $name .= '<i><br />- ' . $attribute_id . ': ' . $a['name'] . ' (' . $a['price'] . ')</i>'; $price += $a['price']; } } } } // c_sp $row_net_price = $price * $quantity; $row_price = $row_net_price; // VAT added later, if applicable $total_net_price += $row_net_price; // Here, the VAT has to be recalculated before setting up the // fields. If the VAT is excluded, it must be added here. // Note: the old Order.vat_amount field is no longer valid, // individual shop_order_items *MUST* have been UPDATEd by the // time PHP parses this line. // Also note that this implies that the vat_id and // country_id can be ignored, as they are considered when the // order is placed and the VAT is applied to the order // accordingly. // Calculate the VAT amount per row, included or excluded $row_vat_amount = Vat::amount($vat_rate, $row_net_price); //\DBG::log("$row_vat_amount = Vat::amount($vat_rate, $row_net_price)"); // and add it to the total VAT amount $total_vat_amount += $row_vat_amount; if (!Vat::isIncluded()) { // Add tax to price $row_price += $row_vat_amount; } //else { // VAT is disabled. // There shouldn't be any non-zero percentages in the order_items! // but if there are, there probably has been a change and we *SHOULD* // still treat them as if VAT had been enabled at the time the order // was placed! // That's why the else {} block is commented out. //} $weight = '-'; if ($distribution != 'download') { $weight = $objResult->fields['weight']; if (intval($weight) > 0) { $total_weight += $weight * $quantity; } } $itemHasOptions = !empty($arrProductOptions[$item_id]); $objTemplate->setVariable(array('SHOP_PRODUCT_ID' => $product_id, 'SHOP_ROWCLASS' => 'row' . (++$i % 2 + 1), 'SHOP_QUANTITY' => $quantity, 'SHOP_PRODUCT_NAME' => $name, 'SHOP_PRODUCT_PRICE' => Currency::formatPrice($price), 'SHOP_PRODUCT_SUM' => Currency::formatPrice($row_net_price), 'SHOP_P_ID' => $edit ? $item_id : $objResult->fields['product_id'], 'SHOP_PRODUCT_CODE' => $code, 'SHOP_PRODUCT_TAX_RATE' => $edit ? $vat_rate : Vat::format($vat_rate), 'SHOP_PRODUCT_TAX_AMOUNT' => Currency::formatPrice($row_vat_amount), 'SHOP_PRODUCT_WEIGHT' => Weight::getWeightString($weight), 'SHOP_ACCOUNT_VALIDITY' => \FWUser::getValidityString($weight))); // Get a product menu for each Product if $edit-ing. // Preselect the current Product ID. if ($edit) { if ($itemHasOptions && $objTemplate->blockExists('order_item_product_options_tooltip')) { $objTemplate->touchBlock('order_item_product_options_tooltip'); } $objTemplate->setVariable('SHOP_PRODUCT_IDS_MENU', Products::getMenuoptions($product_id, null, +$_ARRAYLANG['TXT_SHOP_PRODUCT_MENU_FORMAT'], false)); } $objTemplate->parse('order_item'); $objResult->MoveNext(); } return $total_net_price; }
/** * Stores the posted Product, if any * @return boolean True on success, null on noop, false otherwise */ static function store_product() { global $_ARRAYLANG; if (!isset($_POST['bstore'])) { return null; } $product_name = contrexx_input2raw($_POST['product_name']); $product_code = contrexx_input2raw($_POST['product_code']); // Multiple Categories $category_id = isset($_POST['shopCategoriesAssigned']) ? contrexx_input2raw(join(',', $_POST['shopCategoriesAssigned'])) : ''; $customer_price = $_POST['customer_price']; $reseller_price = $_POST['reseller_price']; $discount_active = !empty($_POST['discount_active']); $discount_price = $_POST['discount_price']; //DBG::log("ShopManager::store_product(): customer_price $customer_price, reseller_price $reseller_price, discount_price $discount_price"); $vat_id = $_POST['vat_id']; $short = contrexx_input2raw($_POST['short']); $long = contrexx_input2raw($_POST['long']); $stock = $_POST['stock']; $stock_visible = !empty($_POST['stock_visible']); $uri = contrexx_input2raw($_POST['uri']); $active = !empty($_POST['articleActive']); $b2b = !empty($_POST['B2B']); $b2c = !empty($_POST['B2C']); $date_start = contrexx_input2raw($_POST['date_start']); $date_end = contrexx_input2raw($_POST['date_end']); $manufacturer_id = isset($_POST['manufacturer_id']) ? contrexx_input2int($_POST['manufacturer_id']) : 0; $minimum_order_quantity = $_POST['minimum_order_quantity']; // Currently not used on the detail page // $flags = (isset($_POST['Flags']) // ? join(' ', $_POST['Flags']) : ''); $distribution = $_POST['distribution']; // Different meaning of the "weight" field for downloads! // The getWeight() method will treat purely numeric values // like the validity period (in days) the same as a weight // without its unit and simply return its integer value. $weight = $distribution == 'delivery' ? Weight::getWeight($_POST['weight']) : $_POST['accountValidity']; // Assigned frontend groups for protected downloads $usergroup_ids = isset($_POST['groupsAssigned']) ? implode(',', $_POST['groupsAssigned']) : ''; $discount_group_count_id = $_POST['discount_group_count_id']; $discount_group_article_id = $_POST['discount_group_article_id']; //DBG::log("ShopManager::store_product(): Set \$discount_group_article_id to $discount_group_article_id"); $keywords = contrexx_input2raw($_POST['keywords']); for ($i = 1; $i <= 3; ++$i) { // Images outside the above directory are copied to the shop image folder. // Note that the image paths below do not include the document root, but // are relative to it. $picture = contrexx_input2raw($_POST['productImage' . $i]); // Ignore the picture if it's the default image! // Storing it would be pointless. // Images outside the above directory are copied to the shop image folder. // Note that the image paths below do not include the document root, but // are relative to it. if ($picture == self::$defaultImage || !self::moveImage($picture)) { $picture = ''; } // Update the posted path (used below) $_POST['productImage' . $i] = $picture; } // add all to pictures DBstring $imageName = base64_encode($_POST['productImage1']) . '?' . base64_encode($_POST['productImage1_width']) . '?' . base64_encode($_POST['productImage1_height']) . ':' . base64_encode($_POST['productImage2']) . '?' . base64_encode($_POST['productImage2_width']) . '?' . base64_encode($_POST['productImage2_height']) . ':' . base64_encode($_POST['productImage3']) . '?' . base64_encode($_POST['productImage3_width']) . '?' . base64_encode($_POST['productImage3_height']); // Note that the flags of the Product *MUST NOT* be changed // when inserting or updating the Product data, as the original // flags are needed for their own update later. $objProduct = null; $product_id = intval($_POST['id']); if ($product_id) { $objProduct = Product::getById($product_id); } $new = false; if (!$objProduct) { $new = true; $objProduct = new Product($product_code, $category_id, $product_name, $distribution, $customer_price, $active, 0, $weight); if (!$objProduct->store()) { return \Message::error($_ARRAYLANG['TXT_SHOP_PRODUCT_ERROR_STORING']); } // $product_id = $objProduct->id(); } // Apply the changes to all Products with the same Product code. // Note: This is disabled for the time being, as virtual categories are, too. // if ($product_code != '') { // $arrProduct = Products::getByCustomId($product_code); // } else { // $arrProduct = array($objProduct); // } // if (!is_array($arrProduct)) return false; // foreach ($arrProduct as $objProduct) { // Update each product $objProduct->code($product_code); // NOTE: Only change the parent ShopCategory for a Product // that is in a real ShopCategory. $objProduct->category_id($category_id); $objProduct->name($product_name); $objProduct->distribution($distribution); $objProduct->price($customer_price); $objProduct->active($active); // On the overview only: $objProduct->ord(); $objProduct->weight($weight); $objProduct->resellerprice($reseller_price); $objProduct->discount_active($discount_active); $objProduct->discountprice($discount_price); $objProduct->vat_id($vat_id); $objProduct->short($short); $objProduct->long($long); $objProduct->stock($stock); $objProduct->minimum_order_quantity($minimum_order_quantity); $objProduct->stock_visible($stock_visible); $objProduct->uri($uri); $objProduct->b2b($b2b); $objProduct->b2c($b2c); $objProduct->date_start($date_start); $objProduct->date_end($date_end); $objProduct->manufacturer_id($manufacturer_id); $objProduct->pictures($imageName); // Currently not used on the detail page // $objProduct->flags($flags); $objProduct->usergroup_ids($usergroup_ids); $objProduct->group_id($discount_group_count_id); $objProduct->article_id($discount_group_article_id); $objProduct->keywords($keywords); //DBG::log("ShopManager::store_product(): Product: reseller_price ".$objProduct->resellerprice()); // Remove old Product Attributes. // They are re-added below. $objProduct->clearAttributes(); // Add current product attributes if (isset($_POST['options']) && is_array($_POST['options'])) { foreach ($_POST['options'] as $valueId => $nameId) { $order = intval($_POST['productOptionsSortId'][$nameId]); $objProduct->addAttribute(intval($valueId), $order); } } // Mind that this will always be an *update*, see the call to // store() above. if (!$objProduct->store()) { return \Message::error($_ARRAYLANG['TXT_SHOP_PRODUCT_ERROR_STORING']); } // } // Add/remove Categories and Products to/from // virtual ShopCategories. // Note that this *MUST* be called *AFTER* the Product is updated // or inserted. // Virtual categories are disabled for the time being // Products::changeFlagsByProductCode( // $product_code, $flags // ); $objImage = new \ImageManager(); $arrImages = Products::get_image_array_from_base64($imageName); // Create thumbnails if not available, or update them foreach ($arrImages as $arrImage) { if (!empty($arrImage['img']) && $arrImage['img'] != ShopLibrary::noPictureName) { if (!$objImage->_createThumbWhq(\Cx\Core\Core\Controller\Cx::instanciate()->getWebsiteImagesShopPath() . '/', \Cx\Core\Core\Controller\Cx::instanciate()->getWebsiteImagesShopWebPath() . '/', $arrImage['img'], \Cx\Core\Setting\Controller\Setting::getValue('thumbnail_max_width', 'Shop'), \Cx\Core\Setting\Controller\Setting::getValue('thumbnail_max_height', 'Shop'), \Cx\Core\Setting\Controller\Setting::getValue('thumbnail_quality', 'Shop'))) { \Message::error(sprintf($_ARRAYLANG['TXT_SHOP_COULD_NOT_CREATE_THUMBNAIL'], $arrImage['img'])); } } } \Message::ok($new ? $_ARRAYLANG['TXT_DATA_RECORD_ADDED_SUCCESSFUL'] : $_ARRAYLANG['TXT_DATA_RECORD_UPDATED_SUCCESSFUL']); switch ($_POST['afterStoreAction']) { case 'newEmpty': \Cx\Core\Csrf\Controller\Csrf::redirect('index.php?cmd=Shop' . MODULE_INDEX . '&act=products&tpl=manage'); case 'newTemplate': \Cx\Core\Csrf\Controller\Csrf::redirect('index.php?cmd=Shop' . MODULE_INDEX . '&act=products&tpl=manage&id=' . $objProduct->id() . '&new=1'); } \Cx\Core\Csrf\Controller\Csrf::redirect('index.php?cmd=Shop' . MODULE_INDEX . '&act=products'); // Never reached return true; }
/** * Add a weight to the current weight. * * @param Weight $weight */ public function add(Weight $weight) { $this->value += $weight->in($this->unit)->value(); return $this; }
public function subtract(Weight $weight) { return $this->createWeight($this->value - $weight->getValue()); }
/** * Remove the specified resource from storage. * DELETE /weights/{id} * * @param int $id * @return Response */ public function destroy($id) { $entry = Weight::find($id); $entry->delete(); return Redirect::route('weights.index'); }