Как рассчитать налог с продаж с помощью этого скрипта?

Я использую сценарий корзины покупок из учебника, который я нашел некоторое время назад, и мне нужно изменить его, чтобы рассчитать налог с продаж для моего штата (Пенсильвания). Я хочу, чтобы он извлек штат, сравнил его либо с Пенсильванией, либо с Пенсильванией, если кто-то напишет стенографию штата, а затем умножит промежуточную сумму (для товаров... до добавления доставки) на налог с продаж для этого штата и добавьте это к промежуточной сумме. . Как мне это сделать? Вот скрипт, который вычисляет общую сумму.

<?php
require_once 'config.php';

/*********************************************************
*                 CHECKOUT FUNCTIONS 
*********************************************************/
function saveOrder()
{
    $orderId       = 0;
    $shippingCost  = 5;
    $requiredField = array('hidShippingFirstName', 'hidShippingLastName', 'hidShippingAddress1', 'hidShippingCity', 'hidShippingPostalCode',
                           'hidPaymentFirstName', 'hidPaymentLastName', 'hidPaymentAddress1', 'hidPaymentCity', 'hidPaymentPostalCode');

    if (checkRequiredPost($requiredField)) {
        extract($_POST);

        // make sure the first character in the 
        // customer and city name are properly upper cased
        $hidShippingFirstName = ucwords($hidShippingFirstName);
        $hidShippingLastName  = ucwords($hidShippingLastName);
        $hidPaymentFirstName  = ucwords($hidPaymentFirstName);
        $hidPaymentLastName   = ucwords($hidPaymentLastName);
        $hidShippingCity      = ucwords($hidShippingCity);
        $hidPaymentCity       = ucwords($hidPaymentCity);

        $cartContent = getCartContent();
        $numItem     = count($cartContent);

        // save order & get order id
        $sql = "INSERT INTO tbl_order(od_date, od_last_update, od_shipping_first_name, od_shipping_last_name, od_shipping_address1, 
                                      od_shipping_address2, od_shipping_phone, od_shipping_state, od_shipping_city, od_shipping_postal_code, od_shipping_cost,
                                      od_payment_first_name, od_payment_last_name, od_payment_address1, od_payment_address2, 
                                      od_payment_phone, od_payment_state, od_payment_city, od_payment_postal_code)
                VALUES (NOW(), NOW(), '$hidShippingFirstName', '$hidShippingLastName', '$hidShippingAddress1', 
                        '$hidShippingAddress2', '$hidShippingPhone', '$hidShippingState', '$hidShippingCity', '$hidShippingPostalCode', '$shippingCost',
                        '$hidPaymentFirstName', '$hidPaymentLastName', '$hidPaymentAddress1', 
                        '$hidPaymentAddress2', '$hidPaymentPhone', '$hidPaymentState', '$hidPaymentCity', '$hidPaymentPostalCode')";
        $result = dbQuery($sql);

        // get the order id
        $orderId = dbInsertId();

        if ($orderId) {
            // save order items
            for ($i = 0; $i < $numItem; $i++) {
                $sql = "INSERT INTO tbl_order_item(od_id, pd_id, od_qty)
                        VALUES ($orderId, {$cartContent[$i]['pd_id']}, {$cartContent[$i]['ct_qty']})";
                $result = dbQuery($sql);                    
            }


            // update product stock
            for ($i = 0; $i < $numItem; $i++) {
                $sql = "UPDATE tbl_product 
                        SET pd_qty = pd_qty - {$cartContent[$i]['ct_qty']}
                        WHERE pd_id = {$cartContent[$i]['pd_id']}";
                $result = dbQuery($sql);                    
            }


            // then remove the ordered items from cart
            for ($i = 0; $i < $numItem; $i++) {
                $sql = "DELETE FROM tbl_cart
                        WHERE ct_id = {$cartContent[$i]['ct_id']}";
                $result = dbQuery($sql);                    
            }                           
        }                   
    }

    return $orderId;
}

/*
    Get order total amount ( total purchase + shipping cost )
*/
function getOrderAmount($orderId)
{
    $orderAmount = 0;

    $sql = "SELECT SUM(pd_price * od_qty)
            FROM tbl_order_item oi, tbl_product p 
            WHERE oi.pd_id = p.pd_id and oi.od_id = $orderId

            UNION

            SELECT od_shipping_cost 
            FROM tbl_order
            WHERE od_id = $orderId";
    $result = dbQuery($sql);

    if (dbNumRows($result) == 2) {
        $row = dbFetchRow($result);
        $totalPurchase = $row[0];

        $row = dbFetchRow($result);
        $shippingCost = $row[0];

        $orderAmount = $totalPurchase + $shippingCost;
    }   

    return $orderAmount;    
}

?>

person Alex C    schedule 18.12.2009    source источник
comment
Отредактируйте свой вопрос и поставьте 4 пробела перед каждой строкой кода, даже если в оригинале он уже имеет отступ. Это отформатирует его как код и сохранит исходный отступ. Вы также можете использовать кнопку 101\n010 на панели инструментов текстового редактора.   -  person outis    schedule 18.12.2009


Ответы (1)


Вам не приходится иметь дело с разными налоговыми ставками в зависимости от муниципалитета? Обычно это можно найти в налоговой таблице по почтовому индексу и, возможно, даже по почтовому адресу + почтовому индексу (в некоторых штатах).

Это будет выглядеть так:

// is it a Pennsylvania zip code?
if ($zipcode < 15000 || $zipcode > 19699)  // needs verification of the actual range
   $taxrate = 0;
else
{
    $rs = mysql_query ("select rate from taxtable where zipcode = '$zipcode'", $db);
    if (!$rs)
    {
        // error looking up rate, maybe apply a default?
    }
    else
    {
        $row = mysql_fetch_assoc($rs);
        $taxrate = $row['rate'];
    }
}

$amount = $amount * (1 + $taxrate / 100.0);
person wallyk    schedule 18.12.2009
comment
Звучит так, как будто это сделало бы это намного сложнее, чем я готов вступить, но согласно Википедии: в Пенсильвании ставка налога с продаж составляет 6%. В округе Аллегейни ставка налога с продаж составляет 7%, а в Филадельфии — 8%. Не проще ли было бы просто использовать 8%, чтобы покрыть весь диапазон? Я не знаю, как я буду сравнивать каждый почтовый индекс в Пенсильвании. - person Alex C; 18.12.2009
comment
Я пытаюсь переписать этот код, который вы предоставили, для работы с моим скриптом, и мне интересно, почему вы выбрали rs для этого конкретного имени переменной. Что он должен обозначать? - person Alex C; 19.12.2009
comment
Я знаю, что это не имеет значения, и я мог бы переименовать его во что угодно, но я хотел бы понять ход ваших мыслей. - person Alex C; 19.12.2009
comment
$rs обозначает результат или набор результатов. Примеры в документах PHP (us.php.net/manual/en /function.mysql-query.php) используйте $result, но всякий раз, когда я его набираю, для краткости я использую $rs. - person wallyk; 19.12.2009
comment
Вы должны остерегаться ловушек вычислений с плавающей запятой на валюте. СМОТРИТЕ stackoverflow.com/questions/1144653/ - person micahwittman; 20.12.2009