Jump to content
jpweber

Quantity Price Breaks

Recommended Posts

Perhaps not completely but that shouldn't be a reason not to use it. There was a change in the way a price is calculated somewhere along the updates, but I don't remember in which version this change was made. If that is so, you might get an error about a missing function in the class currencies I believe. Only a few lines to add, so no show-stopper (and I'm not even sure you will have that error).

 

Unfortunately I came across a bunch of problems, all in catalog\includes\classes\shopping_cart.php

 

Find (around line 158 [171]):

		$this->contents[$products_id_string] = array('qty' => (int)$quantity);

can't find this with Araxis

 

 

Find (around line 248 [263]):

   global $currencies;

can't find this with Araxis

 

 

After (around line 254-256 [281-283]):

	  reset($this->contents);
  while (list($products_id, ) = each($this->contents)) {
	$qty = $this->contents[$products_id]['qty'];

this is only at around line 27

 

 

Find (around line 319-328 [around line 371-380]):

		$products_query = tep_db_query("select p.products_id, pd.products_name, p.products_model, p.products_image, 

p.products_price, p.products_weight, p.products_tax_class_id from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd 

where p.products_id = '" . (int)$products_id . "' and pd.products_id = p.products_id and pd.language_id = '" . (int)$languages_id 

. "'");
	if ($products = tep_db_fetch_array($products_query)) {
	  $prid = $products['products_id'];
	  $products_price = $products['products_price'];

	  $specials_query = tep_db_query("select specials_new_products_price from " . TABLE_SPECIALS . " where products_id = '" . 

(int)$prid . "' and status = '1'");
	  if (tep_db_num_rows($specials_query)) {
		$specials = tep_db_fetch_array($specials_query);
		$products_price = $specials['specials_new_products_price'];
	  }

found, but overlaps an earlier edit

 

Any suggestions would be much appreciated.

Share this post


Link to post
Share on other sites
Unfortunately I came across a bunch of problems, all in catalog\includes\classes\shopping_cart.php

 

Find (around line 158 [171]):

		$this->contents[$products_id_string] = array('qty' => (int)$quantity);

can't find this with Araxis

The line is there in 2.2ms2-060817 too, but it was just $quantity instead of (int)$quantity (this was changed in RC1).

 

Find (around line 248 [263]):

   global $currencies;

can't find this with Araxis

This line was added in RC1 because of the change in the calculation of a price that was added as a new function in the class currencies.

 

After (around line 254-256 [281-283]):

	  reset($this->contents);
  while (list($products_id, ) = each($this->contents)) {
	$qty = $this->contents[$products_id]['qty'];

this is only at around line 27

No, this is definately there in 2.2ms2-060817 as well.

 

 

Find (around line 319-328 [around line 371-380]):

		$products_query = tep_db_query("select p.products_id, pd.products_name, p.products_model, p.products_image, 

p.products_price, p.products_weight, p.products_tax_class_id from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd 

where p.products_id = '" . (int)$products_id . "' and pd.products_id = p.products_id and pd.language_id = '" . (int)$languages_id 

. "'");
	if ($products = tep_db_fetch_array($products_query)) {
	  $prid = $products['products_id'];
	  $products_price = $products['products_price'];

	  $specials_query = tep_db_query("select specials_new_products_price from " . TABLE_SPECIALS . " where products_id = '" . 

(int)$prid . "' and status = '1'");
	  if (tep_db_num_rows($specials_query)) {
		$specials = tep_db_fetch_array($specials_query);
		$products_price = $specials['specials_new_products_price'];
	  }

found, but overlaps an earlier edit

That might be a tricky one because the whole calculation of the price is now done somewhere else (in the class PriceFormatter). If you have added a contribution there you might need to add that, or some logic of it to PriceFormatter.

 

I suggest you download RC2a, and add the changes to a number of files including the shopping_cart class for the [bUGFIX] Product Price Calculations found in the directory extras, upgrade22rc1.html (halfway down). Then your shopping cart class should be equal to the 2006 version.

Share this post


Link to post
Share on other sites
I suggest you download RC2a, and add the changes to a number of files including the shopping_cart class for the [bUGFIX] Product Price Calculations found in the directory extras, upgrade22rc1.html (halfway down). Then your shopping cart class should be equal to the 2006 version.

 

 

Not sure if that was necessarily the best way but I decided the best thing for me would be to ditch the old store as there were a couple of big contributions that never worked the way we wanted them anyway and I'd like a clean start.

 

Am I right in thinking that with a clean install all I have to do is run the database changes and then the database is compatible and I'll have a virgin store to customize?

Share this post


Link to post
Share on other sites
Not sure if that was necessarily the best way but I decided the best thing for me would be to ditch the old store as there were a couple of big contributions that never worked the way we wanted them anyway and I'd like a clean start.

 

Am I right in thinking that with a clean install all I have to do is run the database changes and then the database is compatible and I'll have a virgin store to customize?

If you mean with running the database changes the ones in RC2a and those for QPBPP then yes. If you upload a fresh osC and use it with your previous database you should run the changes mentioned in the RC2a update.html otherwise you get errors with the new code.

Share this post


Link to post
Share on other sites

Thank you very much, Jan.

 

In the instructions for \catalog\admin\categories.php it says "After (around line 150)" followed by "After (around line 220)" and then a single 'add' instruction, so should the same addition be made after both lines 150 and 220 or am I misreading this?

 

Sorry to be such a pain...

Share this post


Link to post
Share on other sites

Hi

 

I was wondering if anyone ahs come across this problem before. If tried searching and can't find an answer, maybe I'm not using the right search terms though.

 

pricing.jpg

 

It seems that the price is adding up wrong but the sub total is adding up more correctly. I using the latest version of Oscommerce and quantity price break.

 

Thanks

Share this post


Link to post
Share on other sites
In the instructions for \catalog\admin\categories.php it says "After (around line 150)" followed by "After (around line 220)" and then a single 'add' instruction, so should the same addition be made after both lines 150 and 220 or am I misreading this?

I don't know. Sounds like something is missing after the around line 150. Check the source of the HTML, see if there is something that is not showing. Otherwise compare the included file with yours.

The screen of my Mac went black this afternoon, so I can't use the computer where I have all these files... sorry.

Share this post


Link to post
Share on other sites
I was wondering if anyone ahs come across this problem before. If tried searching and can't find an answer, maybe I'm not using the right search terms though.

 

It seems that the price is adding up wrong but the sub total is adding up more correctly. I using the latest version of Oscommerce and quantity price break.

If those prices are including tax I would suspect rounding errors. osC is not calculating (price_without_tax * quantity) * tax but (price_without_tax * tax) * quantity.

 

If I recall correctly you can change that in the places where price is calculated. It is only on a few places, but don't ask me where. Someone posted that once....

Share this post


Link to post
Share on other sites
I don't know. Sounds like something is missing after the around line 150. Check the source of the HTML, see if there is something that is not showing. Otherwise compare the included file with yours.

The screen of my Mac went black this afternoon, so I can't use the computer where I have all these files... sorry.

 

So as my store is completely unmodded all I need do is use the files in the contribution, with no manual updating?

Share this post


Link to post
Share on other sites
So as my store is completely unmodded all I need do is use the files in the contribution, with no manual updating?

Yes, after running the sql of course (adds one field to the table products and two new tables from the top of my head)

Share this post


Link to post
Share on other sites
Yes, after running the sql of course (adds one field to the table products and two new tables from the top of my head)

 

Whew -- that flew right over my head. I just did that and I got an error message for

 

alter table products 
add column products_qty_blocks int not null default 1;

 

That's here already because we hve QPB in the old store and are using the same database. Could I just drop that line and do the other tables?

Share this post


Link to post
Share on other sites
Whew -- that flew right over my head. I just did that and I got an error message for

 

alter table products 
add column products_qty_blocks int not null default 1;

 

That's here already because we hve QPB in the old store and are using the same database. Could I just drop that line and do the other tables?

Yes, it means you already set with that. However, the information you already have in the database should be queried and added to the new table. Otherwise you would have to add it all back by hand... Not something I can take a look at right now...

 

You will need to remove a lot of columns soon in the table products, otherwise you can't edit your products. Make sure you have a backup of that table now, to extract the information about the quantity breaks and prices later.

Share this post


Link to post
Share on other sites
If those prices are including tax I would suspect rounding errors. osC is not calculating (price_without_tax * quantity) * tax but (price_without_tax * tax) * quantity.

 

If I recall correctly you can change that in the places where price is calculated. It is only on a few places, but don't ask me where. Someone posted that once....

 

Does anyone know where this would be?

 

Thanks

Share this post


Link to post
Share on other sites

Hi,

 

Hopefully someone can help me out. Can someone please tell me how to remove this first column from the price table. It's driving me crazy. I'd basically just like to not have the first column. Below is a screen shot. Thanks for the help.

 

qpbppimage.jpg

Share this post


Link to post
Share on other sites
Perhaps this (lofi version) page (two posts, one by curt): http://forums.oscommerce.com/lofiversion/i...53436-1850.html

 

Hi Jan

 

Sorry for all the questions, I just realised the problem was an Intricate Detail Input Output Total (IDIOT) :blush: error, I was putting the information in from a spreadsheet that rounded the numbers up, so when I put in the actual figures the error dissapeared.

 

Thanks for everyones help.

 

Rod

Share this post


Link to post
Share on other sites

Hello,

 

I would like to have this contribution in a vertical table. I try to change it in PriceFormater file but withouth sucess.

 

qpb.png

 

 

This is example of the table that I would like have.

 

If someone know how or already have the table in this form, please help me.

 

Thanks!

Share this post


Link to post
Share on other sites

Hi Robert, did you ever figure out how to do this, I'm trying to figure out the same thing. I need to get rid of that first column

 

Hi,

 

Hopefully someone can help me out. Can someone please tell me how to remove this first column from the price table. It's driving me crazy. I'd basically just like to not have the first column. Below is a screen shot. Thanks for the help.

 

qpbppimage.jpg

Share this post


Link to post
Share on other sites
Hi Robert, did you ever figure out how to do this, I'm trying to figure out the same thing. I need to get rid of that first column

You could try this as a replacement for function getPriceString in includes/classes/PriceFormatter.php.

It depends on the Quantity Blocks set at a value larger than 1. I think it would be more versatile to also add a minimum quantity field to this contribution and use that instead.

In the "old" function the field with 1+ is hard coded and contains below it the products price and the "-" (of no savings).

  function getPriceString($style='productPriceInBox') {
global $currencies;

// If you want to change the format of the price/quantity table
// displayed on the product information page, here is where you do it.

if (true == $this->hasQuantityPrice) {
  $lc_text = '<table border="0" cellspacing="0" cellpadding="0" class="infoBox" align="right">
		  <tr valign="top">
		  <td>
		  <table border="0" cellspacing="1" cellpadding="4" class="infobox">';
  $lc_text .= '<tr valign="top"><td width="120" class="infoBoxHeading">' . TEXT_ENTER_QUANTITY .'</td>';
  if ($this->qtyBlocks == 1) {
	$lc_text .= '<td align="center" class="infoBoxHeading">1+</td>';
  }

  foreach($this->price_breaks as $price_break) {
	  $lc_text .= '<td align="center" width="50" class="infoBoxHeading">'
		. $price_break['products_qty']
		.'+ </td>';
  }

  $lc_text .= '<tr valign="top"><td width="120" class="infoBoxContents">' . TEXT_PRICE_PER_PIECE . '</td>';

  if (true == $this->hasSpecialPrice && $this->qtyBlocks == 1) {
	$lc_text .= '<td align="center" width="50" class="infoBoxContents">';
	$lc_text .= '<s>'
	. $currencies->display_price($this->thePrice, tep_get_tax_rate($this->taxClass))
	. '</s>  <span class="productSpecialPrice">'
	. $currencies->display_price($this->specialPrice, tep_get_tax_rate($this->taxClass))
	. '</span> '
	.'</td>';
  } elseif ($this->qtyBlocks == 1) {
	$lc_text .= '<td align="center" width="50" class="infoBoxContents">'
	. $currencies->display_price($this->thePrice, tep_get_tax_rate($this->taxClass))
	. '</td>';
  }

  foreach($this->price_breaks as $price_break) {
	  $lc_text .= '<td align="center" width="50" class="infoBoxContents">'
		. $currencies->display_price($price_break['products_price'], tep_get_tax_rate($this->taxClass))
		.'</td>';
  }
  $lc_text .= '</tr>';

  // Begin saving calculation
  $base_price = $this->thePrice;
  if ($this->qtyBlocks > 1) {
	$base_price = $this->price_breaks[0]['products_price'];
  }
  $lc_text .= '<tr valign="top"><td width="120" class="infoBoxContents">' . TEXT_SAVINGS . '</td>';
  if (true == $this->hasSpecialPrice && $this->qtyBlocks == 1) {
	$lc_text .= '<td align="center" class="infoBoxContents">'
	. $this->getDiscountSaving($base_price, $this->specialPrice)
	.'</td>';
  } elseif ($this->qtyBlocks == 1) {
	$lc_text .= '<td align="center" class="infoBoxContents">- </td>';
  }

  foreach($this->price_breaks as $price_break) {
	if ($price_break['products_qty'] > $this->qtyBlocks) {
	  $lc_text .= '<td align="center" width="50" class="infoBoxContents">'
	  . $this->getDiscountSaving($base_price, $price_break['products_price'])
	  .'</td>';
	} else {
	  $lc_text .= '<td align="center" class="infoBoxContents">- </td>';
	}
  }
  $lc_text .= '</tr></table></td></tr></table>';
} else {
  if (true == $this->hasSpecialPrice) {
	$lc_text = ' <s>'
	. $currencies->display_price($this->thePrice, tep_get_tax_rate($this->taxClass))
	. '</s>  <span class="productSpecialPrice">'
	. $currencies->display_price($this->specialPrice, tep_get_tax_rate($this->taxClass))
	. '</span> ';
  } else {
	$lc_text = ' '
	. $currencies->display_price($this->thePrice, tep_get_tax_rate($this->taxClass))
	. ' ';
  }
}
return $lc_text;
 }

Edited by Jan Zonjee

Share this post


Link to post
Share on other sites

i tied to install the contribution, but again i need some help.

 

currently i see those messages appear when i select a category:

 

1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',,,,,,) and status = '1' and customers_group_id = '0'' at line 1

 

select products_id, specials_new_products_price from specials where products_id in (29,32,30,31,28,33,34,35,,,,,,,,) and status = '1' and customers_group_id = '0'

 

[TEP STOP]

Share this post


Link to post
Share on other sites
i tied to install the contribution, but again i need some help.

 

currently i see those messages appear when i select a category:

Actually, by searching the files of an SPPC installation for select products_id, specials_new_products_price from I could identify that this query is from the product_listing.php from SPPC.

 

Since it gets the results of the query from index.php and apparently retrieves a number of results that do not contain any products_id (therefore the ,,,,,,) the fault must be in the query in index.php.

Share this post


Link to post
Share on other sites

Hi there, this is a really handy contribution, my installation went well. However, I am having a problem with the interaction with a Maximum Order amount contribution (Max Order with Admin). In this example, Product X has a maximum order amount of 6 units. It is also a member of a discount category which discounts a 12 unit cart. The problem happens when, on the shopping cart page, the customer updates his cart amount of Product X to the discount amount (12 units), despite the fact that it is above the maximum amount. The corrected maximum cart quantity is displayed correctly. The incorrect, discounted Total is displayed. The sub-total is displayed correctly. Here is a screen shot:

 

qpb-problem.jpg

 

I am assuming that the problem is with the order of events in the shopping cart class. The Max Order with Admin contribution only changes the catalog level .php files. Here is an example of my shopping_cart.php page relevant to the Max Order with Admin code changes:

 

<?php
 if ($cart->count_contents() > 0) {
?>
     <tr>
       <td>
<?php
   $info_box_contents = array();
   $info_box_contents[0][] = array('align' => 'center',
                                   'params' => 'class="productListing-heading"',
                                   'text' => TABLE_HEADING_REMOVE);

   $info_box_contents[0][] = array('params' => 'class="productListing-heading"',
                                   'text' => TABLE_HEADING_PRODUCTS);

   $info_box_contents[0][] = array('align' => 'center',
                                   'params' => 'class="productListing-heading"',
                                   'text' => TABLE_HEADING_QUANTITY);

   $info_box_contents[0][] = array('align' => 'right',
                                   'params' => 'class="productListing-heading"',
                                   'text' => TABLE_HEADING_TOTAL);

   $any_out_of_stock = 0;
   $products = $cart->get_products();
   for ($i=0, $n=sizeof($products); $i<$n; $i++) {

//MAXIMUM quantity code
if(MAXIMUM_ORDERS == 'true'){
	$max_order_query = tep_db_query("select p.maxorder as max_quant FROM " . TABLE_PRODUCTS . " p where p.products_id = '".$products[$i]['id']."'");
	while ($max_order = tep_db_fetch_array($max_order_query))  {
		$products[$i]['max_quant']=$max_order['max_quant']; // set the cart item max var
		if (!empty($products[$i]['max_quant'])) {//add check account for if max_quant is null or '', if it is you can skip all this stuff can it's umlimited
		// okay if this product already is in basket irregardless of it's attributes selected... keep the old one
		for ($ic = 0; $ic < $i;$ic++) {
		   if (tep_get_prid($products[$i]['id']) == tep_get_prid($products[$ic]['id'])) {
		   $cart_notice .= sprintf(MAXIMUM_ORDER_DUPLICATE, $products[$i]["name"], $products[$i]["max_quant"]) . '<BR>'; // notify them they can not do that
		   $cart_skip_prod = true;
		   $cart->remove($products[$i]['id']); // remove this new item from the cart session
		   $cart_skip_prod = true; // set a flag so we can bypass output of the item that was already stuck into the products array before we removed it just now
		   }
		   else {
		   //$cart_notice .= ' - okay no match ';
		   }
		   $cart_notice .= '<BR>';
		}

		// okay now for products that have no attributes or have identical attributes
		if ($products[$i]['quantity'] > $max_order['max_quant'] ) { //add check account for if max_quant is null or '', if so let it go through.
			$products[$i]['quantity']=$products[$i]['max_quant'];
			$cart->add_cart($products[$i]['id'],$products[$i]['quantity'],$products[$i]['attributes']); // update the qty
			$cart_notice .= sprintf(MAXIMUM_ORDER_NOTICE, $products[$i]["name"], $products[$i]["max_quant"]); // notify them they can not do that
		}
		}
	}
}

if ($cart_skip_prod) { // still need to skip displaying the item still stuck in $products array even though we removed it from $cart
  break;
  }
//End MAXIMUM quantity code

// Push all attributes information in an array

 

Of course, no obligation to respond, but any help or a nudge in the right direction would be greatly apprecitated. Thanks in advance.

Share this post


Link to post
Share on other sites

Hi Jan:

 

Thanks very much for the reply I'm going to try this tonight, I have another question you might be able to help me with. It seems this contribution was designed to work with the basic install, I however have a template installed that is a narrow page and the product info page kind of pushes over to the right, I have been through the code on the product_info.php page for hours trying to figure out how to adjust this but just can't get there. I'm wondering if it maybe on another page that I have to adjust, I'm just lost. Any help would be great.

 

Here is the page that is having the problem

http://www.kaypromos.com/product_info.php?...;products_id=75

 

If you go to the home page you can see how it is supposed to be centered.

 

Dean

 

 

You could try this as a replacement for function getPriceString in includes/classes/PriceFormatter.php.

It depends on the Quantity Blocks set at a value larger than 1. I think it would be more versatile to also add a minimum quantity field to this contribution and use that instead.

In the "old" function the field with 1+ is hard coded and contains below it the products price and the "-" (of no savings).

  function getPriceString($style='productPriceInBox') {
global $currencies;

// If you want to change the format of the price/quantity table
// displayed on the product information page, here is where you do it.

if (true == $this->hasQuantityPrice) {
  $lc_text = '<table border="0" cellspacing="0" cellpadding="0" class="infoBox" align="right">
		  <tr valign="top">
		  <td>
		  <table border="0" cellspacing="1" cellpadding="4" class="infobox">';
  $lc_text .= '<tr valign="top"><td width="120" class="infoBoxHeading">' . TEXT_ENTER_QUANTITY .'</td>';
  if ($this->qtyBlocks == 1) {
	$lc_text .= '<td align="center" class="infoBoxHeading">1+</td>';
  }

  foreach($this->price_breaks as $price_break) {
	  $lc_text .= '<td align="center" width="50" class="infoBoxHeading">'
		. $price_break['products_qty']
		.'+ </td>';
  }

  $lc_text .= '<tr valign="top"><td width="120" class="infoBoxContents">' . TEXT_PRICE_PER_PIECE . '</td>';

  if (true == $this->hasSpecialPrice && $this->qtyBlocks == 1) {
	$lc_text .= '<td align="center" width="50" class="infoBoxContents">';
	$lc_text .= '<s>'
	. $currencies->display_price($this->thePrice, tep_get_tax_rate($this->taxClass))
	. '</s>  <span class="productSpecialPrice">'
	. $currencies->display_price($this->specialPrice, tep_get_tax_rate($this->taxClass))
	. '</span> '
	.'</td>';
  } elseif ($this->qtyBlocks == 1) {
	$lc_text .= '<td align="center" width="50" class="infoBoxContents">'
	. $currencies->display_price($this->thePrice, tep_get_tax_rate($this->taxClass))
	. '</td>';
  }

  foreach($this->price_breaks as $price_break) {
	  $lc_text .= '<td align="center" width="50" class="infoBoxContents">'
		. $currencies->display_price($price_break['products_price'], tep_get_tax_rate($this->taxClass))
		.'</td>';
  }
  $lc_text .= '</tr>';

  // Begin saving calculation
  $base_price = $this->thePrice;
  if ($this->qtyBlocks > 1) {
	$base_price = $this->price_breaks[0]['products_price'];
  }
  $lc_text .= '<tr valign="top"><td width="120" class="infoBoxContents">' . TEXT_SAVINGS . '</td>';
  if (true == $this->hasSpecialPrice && $this->qtyBlocks == 1) {
	$lc_text .= '<td align="center" class="infoBoxContents">'
	. $this->getDiscountSaving($base_price, $this->specialPrice)
	.'</td>';
  } elseif ($this->qtyBlocks == 1) {
	$lc_text .= '<td align="center" class="infoBoxContents">- </td>';
  }

  foreach($this->price_breaks as $price_break) {
	if ($price_break['products_qty'] > $this->qtyBlocks) {
	  $lc_text .= '<td align="center" width="50" class="infoBoxContents">'
	  . $this->getDiscountSaving($base_price, $price_break['products_price'])
	  .'</td>';
	} else {
	  $lc_text .= '<td align="center" class="infoBoxContents">- </td>';
	}
  }
  $lc_text .= '</tr></table></td></tr></table>';
} else {
  if (true == $this->hasSpecialPrice) {
	$lc_text = ' <s>'
	. $currencies->display_price($this->thePrice, tep_get_tax_rate($this->taxClass))
	. '</s>  <span class="productSpecialPrice">'
	. $currencies->display_price($this->specialPrice, tep_get_tax_rate($this->taxClass))
	. '</span> ';
  } else {
	$lc_text = ' '
	. $currencies->display_price($this->thePrice, tep_get_tax_rate($this->taxClass))
	. ' ';
  }
}
return $lc_text;
 }

Share this post


Link to post
Share on other sites
I am assuming that the problem is with the order of events in the shopping cart class. The Max Order with Admin contribution only changes the catalog level .php files. Here is an example of my shopping_cart.php page relevant to the Max

That is indeed a rather late stage to check for that quantity. QPBPP does that the moment it is added to the cart, with the function adjustQty found in PriceFormatter.php. This is the relevant code in includes/classes/shopping_cart.php:

	function add_cart($products_id, $qty = '1', $attributes = '', $notify = true) {
  global $new_products_id_in_cart, $customer_id;

// BOF qpbpp
  $pf = new PriceFormatter;
  $pf->loadProduct($products_id);
  $qty = $pf->adjustQty($qty);
  $discount_category = $pf->get_discount_category();
// EOF qpbpp

Since the field maxorder is also in the table products I think it would be the best to add the functionality to PriceFormatter and PriceFormatterStore.

Then you can adjust the quantity in adjustQty. You would need to test it though to see what happens if you update the quantity in the shopping cart (although update_quantity might only be called from within the function add_cart so that would be covered).

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×