bir oran yapısı için veritabanı / algoritması

5 Cevap php

Ben bu satırlar boyunca bir oran yapısına dayalı bir fiyat hesaplamak zorunda:

$303.00 fixed price up to 500 units
$0.023 additional per unit from 501-10,000 units
$0.022 additional per unit from 10,001-25,000 units
$0.021 additional per unit from 25,001-50,000 units

Ben bu hesaplama için bir veritabanı yapısı ve algoritması (büyük anlaşmazlık noktası) ayarlama konusunda yeniyim. Herkes bu yapılır mı? Bu tür bir şey hesaplama güzel, zarif bir yolu var mı?

edit: Bir örnek olarak, bir 25.100 birim Miktarı toplam, ilk 500 birimleri için 303,00 $, bir sonraki 9,500 birimleri için 218,50 $, bir sonraki 15000 birimleri için 330,00 $ ve bir sonraki 100 birim için 2,10 $ mal olacak 853,60 $.

Ben seçmek ve hesaplamak için nasıl iyi farkında değilim - wouldn't basit 25,100 * 0,021 $ hesaplama olacak.

Bir marjinal bazda - yolu gelir vergisine benzer değerlendirilir.

5 Cevap

Ben yapıyorsa yara Ne:

size  units     fixed     per
1       500   303.000   0.000
1     10000     0.000   0.023
1     25000     0.000   0.022
1     50000     0.000   0.021



function calculate_price($size, $quantity) {
  global $db;

  $price = 0;
  $count = 0;

  // fetch rates from the database
  // note: $size is already sanitised by the calling function
  $query = "SELECT units, flat, per FROM rates WHERE size={$size} ORDER BY units ASC";
  $result = $db->query($query);

  // step through the rates
  while($rate = $result->fetch_object()) {
    // figure out how many of our units fall within this tier
    $tier_count = max(0, min($quantity - $count, $rate->units - $count));

    // calculate the price for this tier, including any flat rate
    $tier_price = $rate->flat + ($rate->per * $tier_count);

    // add tier price and count to the totals
    $price += $tier_price;
    $count += $tier_count;

    // store the last, largest number of units rate for any leftovers outside our tiers
    $last_rate = $rate;
  }

  // if some of our units fall outside our defined tiers, use the last tier's values for them
  if($count < $quantity) {
    $tier_count = $quantity - $count;
    $tier_price = $last_rate->flat + ($last_rate->per * $tier_count);
    $price += $tier_price;
    $count += $tier_count;
  }

  return $price;
}

Ben aksi takdirde onu kodlamalısınız önemsiz olacağını, esnek şey istiyorum varsayalım.

Bir fiyatlandırma tablo kullanabilirsiniz:

ID MAX    FIX    UNIT
1  500    303    0
2  9500   0      .23
3  15000  0      .22
4  25000  0      .21

Sonra aşağıdaki gibi hesaplamak olabilir:

$items = ?;
$cost = 0;
$rows = get_rows("select max, fix, unit from pricing order by id asc");
foreach ($rows as $r)
{
    if ($items <= 0)
        break;
    $cost += $r['fix'] + min($r['max'], $items) * $r['unit'];
    $items -= $r['max'];
}

Ben PHP algoritma istediğinizi farz var.

Piton

from collections import namedtuple

RateRule= namedtuple( 'RateRule', ['qty_band','fixed','per_unit'] )    

rate_table = [
    RateRule(500, 303, None),
    RateRule(9500, None, 0.023),
    RateRule(15000, None, 0.022),
    RateRule(25000, None, 0.021)
]

def total_price( units, rate_table ):
    # Base
    total = rate_table[0].fixed
    units_purchased_so_far = rate_table[0].qty_band
    # Whole Price Bands
    rule = 1
    while units > units_purchased_so_far + rate_table[rule].qty_band:
        total += rate_table[rule].qty_band * rate_table[rule].per_unit
        units_purchased_so_far += rate_table[rule].qty_band
        rule += 1
    # Units within the top Price Band
    if units > units_purchased_so_far:
        total += (units - units_purchased_so_far) * rate_table[rule].per_unit
    return total

Böyle bir şey:

Product
-------
[PK] ProductID


Price
-----
[PK] PriceID
[FK] ProductID
Price
QtyMin
QtyMax

Ürün ve fiyat arasında çok etkili bir 1-çok ilişkisi. Eğer ne olursa olsun miktarı sabit bir oran gerektirir eğer maksimum bir sentinel değer kullanabilirsiniz.

SELECT 
 CASE is_fixed_price
  WHEN 1
   THEN unit_price / ?  
  ELSE
   unit_price
  END
FROM rate_structure
WHERE ? BETWEEN min_qty AND max_qty

Nerede? Müşteri sipariş etmek istiyor miktarıdır. Mysql 5.x için, kafamın üst kapalı sözdizimi Bu yan etki potansiyeli yuvarlama hatası birikimidir.