Налоговый калькулятор по продажам


Пожалуйста, ознакомьтесь с налоговой проблемы продаж, которая была разработана, используя шаблон стратегии.

Проблема:

Основной налог с продаж применяется в размере 10% на все товары, за исключением книг, продуктов питания и медицинских изделий, которые освобождаются. Ввозная пошлина является дополнительный налог с продаж, применимых на все импортные товары в размере 5%, без исключений. Также налог с продаж должны быть округлены до ближайший 0.05.

Пункт.ч

/*
 * Item.h
 *
 *  Created on: Jun 7, 2011
 *      Author: som
 */

#ifndef ITEM_H_
#define ITEM_H_

class SalesTax;

//This represents the Items which don't have an Import duty or any sales tax
class Item
{
public:

//Constructors
    Item();
    Item(SalesTax *aSalesTax);

//Interface Functions for Item

//To calculate the price after tax and import duty
    virtual void CalculateTotalPrice();

//To calculate the total tax and import duty
    virtual void CalculateTotalTax();

//To set the price of the Items
    void SetPrice(double aPrice);

//To get the price of the Items before tax
    double getPrice();

//To get the price of the items after tax
    double getTotalPrice();

//To get the total tax and import duty of the items
    double getTax();

//Data
protected:
//Works as the Strategy of the Sales Tax problem.
//If in future the tax calculation becomes more complicated for different Items
//we will just have to change this Strategy. We can also subclass this Strategy class
//for future expansion of the tax calculation strategy
    SalesTax *iSalesTax;
//Data
protected:

//These are the basic properties of any Item.
//Hence these are made protected members so that the subclasses of Item can inherit
//these properties
    double iPrice;
    double iTotalPrice;
    double iTotalTax;
};

//This class represents the Items which have only Import Duty
class ImportedItem : virtual public Item
{
public:
//Constructors
    ImportedItem();

//This constructor helps to create Items having only Import duty
    ImportedItem(SalesTax *aSalesTax, double aImportDuty);

//Override
    virtual void CalculateTotalTax();

protected:
    double iImportDuty;
};

//This class represents the Items which have only Sales Tax but no Import Duty
class NonFoodBookMedicalItem : virtual public Item
{
public:
//Constructors
    NonFoodBookMedicalItem();

//This constructor helps to create Items having only Sales tax
    NonFoodBookMedicalItem(SalesTax *aSalesTax, double aRate);
//Override
    virtual void CalculateTotalTax();

protected:
    double iRate;
};

//This class represents the Items which have got both Import Duty as well as sales Tax
class NormalItem: public ImportedItem, public NonFoodBookMedicalItem
{
public:
    NormalItem();
//This constructor helps to create Items having both Sales tax and Import duty
    NormalItem(SalesTax *aSalesTax, double aRate, double aImportDuty);

//Override
    virtual void CalculateTotalTax();
};

#endif /* ITEM_H_ */

Item.cpp

/*
 * Item.cpp
 *
 *  Created on: Jun 7, 2011
 *      Author: som
 */

#include "SalesTax.h"
#include "Item.h"

Item::Item() {}

Item::Item(SalesTax *aSalesTax): iSalesTax(aSalesTax), iPrice(0), iTotalPrice(0), iTotalTax(0)
{
}

void Item::CalculateTotalPrice()
{
    iTotalPrice = iPrice + iTotalTax;
}

double Item::getTotalPrice()
{
    return iTotalPrice;
}


void Item::CalculateTotalTax()
{
    iTotalTax = iSalesTax->ComputeSalesTax(iPrice, 0, 0);
}

void Item::SetPrice(double aPrice)
{
    iPrice = aPrice;
}

double Item::getPrice()
{
    return iPrice;
}

double Item::getTax()
{
    return iTotalTax;
}
ImportedItem::ImportedItem() {}

ImportedItem::ImportedItem(SalesTax *aSalesTax, double aImportDuty): Item(aSalesTax)
{
    iImportDuty = aImportDuty;
}
void ImportedItem::CalculateTotalTax()
{
    iTotalTax = iSalesTax->ComputeSalesTax(iPrice, 0, iImportDuty);

}
NonFoodBookMedicalItem::NonFoodBookMedicalItem() {}

NonFoodBookMedicalItem::NonFoodBookMedicalItem(SalesTax *aSalesTax, double aRate): Item(aSalesTax)
{
    iRate = aRate;
}

void NonFoodBookMedicalItem::CalculateTotalTax()
{
    iTotalTax = iSalesTax->ComputeSalesTax(iPrice, iRate, 0);

}
NormalItem::NormalItem() {}

NormalItem::NormalItem(SalesTax *aSalesTax, double aRate, double aImportDuty): Item(aSalesTax)
{
    iRate = aRate;
    iImportDuty = aImportDuty;
}
void NormalItem::CalculateTotalTax()
{
    iTotalTax = iSalesTax->ComputeSalesTax(iPrice, iRate, iImportDuty);
}

ItemCreator.ч

/*
 * ItemCreator.h
 *
 *  Created on: Jun 7, 2011
 *      Author: som
 */

#ifndef ITEMCREATOR_H_
#define ITEMCREATOR_H_
#include "Item.h"

const int ITEM_WITH_NOSALESTAX_AND_IMPORTDUTY = 1;
const int ITEM_WITH_NOSALESTAX_ONLY_IMPORTDUTY = 2;
const int ITEM_WITH_ONLY_SALESTAX_AND_NOIMPORTDUTY = 3;
const int ITEM_WITH_BOTH_SALESTAX_AND_IMPORTDUTY = 4;

const double SALES_TAX_RATE = 10;
const double IMPORT_DUTY_RATE = 5;

class Not_A_Standard_Item_Type_Exception
{
public:
    void printerrormsg();
};
class ItemCreator
{
public:
    virtual Item *Create(int aItemId);

};

#endif /* ITEMCREATOR_H_ */

ItemCreator.cpp

/*
 * ItemCreator.cpp
 *
 *  Created on: Jun 7, 2011
 *      Author: som
 */

#include "ItemCreator.h"
#include "Item.h"
#include "SalesTax.h"

#include <iostream>

using namespace std;

void Not_A_Standard_Item_Type_Exception::printerrormsg()
{
    cout << "Not the right Item Type..." << endl;
}

Item *ItemCreator::Create(int aItemId)
{
    SalesTax *st = new SalesTax();

    switch(aItemId)
    {
        case ITEM_WITH_NOSALESTAX_AND_IMPORTDUTY:
            return new Item(st);
            break;

        case ITEM_WITH_NOSALESTAX_ONLY_IMPORTDUTY:
            return new ImportedItem(st, IMPORT_DUTY_RATE);
            break;

        case ITEM_WITH_ONLY_SALESTAX_AND_NOIMPORTDUTY:
            return new NonFoodBookMedicalItem(st, SALES_TAX_RATE);
            break;

        case ITEM_WITH_BOTH_SALESTAX_AND_IMPORTDUTY:
            return new NormalItem(st, SALES_TAX_RATE, IMPORT_DUTY_RATE);
            break;

        default:
            throw Not_A_Standard_Item_Type_Exception();
    }
}

SalesTax.ч

/*
 * SalesTax.h
 *
 *  Created on: Jun 7, 2011
 *      Author: som
 */

#ifndef SALESTAX_H_
#define SALESTAX_H_
//This class works as the Strategy of the Sales tax problem
class SalesTax
{
public:

//Default constructor
    SalesTax();

//This function helps to compute the Sales Tax
    virtual double ComputeSalesTax(double aPrice, double aRate, double aImportduty);

private:
//This is an helper function which will round off the sales tax
    double RoundOff(double aTax);
};

#endif /* SALESTAX_H_ */

SalesTax.cpp

/*
 * SalesTax.cpp
 *
 *  Created on: Jun 7, 2011
 *      Author: som
 */
#include "SalesTax.h"

SalesTax::SalesTax() {}
double SalesTax::ComputeSalesTax(double aPrice, double aRate, double aImportduty)
{
    double tx = (aPrice * aRate / (double(100))) + (aPrice * aImportduty / (double(100)));
    return RoundOff(tx);
}
//private:
double SalesTax::RoundOff(double aTax)
{
    int taxTemp = (int)aTax;
    double decimaltaxTemp = (double)(aTax - (int)taxTemp);
    int tempy = (int)(1000 * decimaltaxTemp) / 100;
    int tempz = (int)(1000 * decimaltaxTemp - tempy * 100);
    int temp = (int)(tempz / 10);
    int t = tempz % 10;

    if(t >= 5)
        temp += 1;

    return (double)(taxTemp + tempy * (0.1) + temp * (0.01));
}

main.cpp

/*
 * main.cpp
 *
 *  Created on: Jun 7, 2011
 *      Author: som
 */

#include "SalesTax.h"
#include "Item.h"
#include "ItemCreator.h"

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    typedef vector<Item *> listOfItem;
    listOfItem::iterator theIterator;

    listOfItem Basket;
    char answer = 'n';

    double totalprice = 0;
    double totaltax = 0;

    do
    {
        int type_of_item;
        cout << "Enter the type of Item...1,2,3,4" << endl;
        cout << "1 for ITEM_WITH_NOSALESTAX_AND_NOIMPORTDUTY" << endl;
        cout << "2 for ITEM_WITH_NOSALESTAX_ONLY_IMPORTDUTY" << endl;
        cout << "3 for ITEM_WITH_ONLY_SALESTAX_AND_NOIMPORTDUTY" << endl;
        cout << "4 for ITEM_WITH_BOTH_SALESTAX_AND_IMPORTDUTY" << endl;
        cin >> type_of_item;
        ItemCreator *itemCreator = new ItemCreator();
        try
        {
            Item *item = itemCreator->Create(type_of_item);
            cout << "Enter the price of the Item" << endl;
            double price;
            cin >> price;
            item->SetPrice(price);
            Basket.push_back(item);
        }

        catch(Not_A_Standard_Item_Type_Exception &e)
        {
            e.printerrormsg();
        }

        cout << "Do you want to continue... Y/N" << endl;
        cin >> answer;
    }
    while(answer == 'y');
    theIterator = Basket.begin();
    int pos = 0;
    while(theIterator != Basket.end())
    {
        Basket.at(pos)->CalculateTotalTax();
        totaltax += Basket.at(pos)->getTax();
        Basket.at(pos)->CalculateTotalPrice();
        double price = Basket.at(pos)->getPrice();
        double price_after_tax = Basket.at(pos)->getTotalPrice();
        totalprice += price_after_tax;
        cout << "Item" << pos + 1 << " price " << price << endl;
        theIterator++;
        pos++;
    }
    cout << "------------" << endl;
    cout << "Toal tax " << totaltax << endl;
    cout << "Total price " << totalprice << endl;

    return 1;
}

При вставке в исходный код, я обнаружил, что стал нечитаемым. Следовательно, Пожалуйста, загрузите исходный код из здесь.



Комментарии
2 ответа

class NonFoodBookMedicalItem : virtual public Item
{

Я не чувствую, что это правильный подход, по нескольким причинам. Для начала, ты печешь совсем немного логики приложения в имя типа, который будет копироваться и повторно использоваться на протяжении всего вашего кода. Сколько будет идти речь, если правительство решит, что налог с продаж должен применяться к книгам? Каждого использования его нужно будет обновить в NonFoodMedicalItem.

Как в сторону: никогда не думайте, что налоговый ситуациях не изменится. Стоимость в Великобритании налог на добавленную стоимость (НДС) составила 17,5%, столько, сколько любой мог помнить, и формулы, все было жестко. Тысяч формы ставки НДС элемент предварительно напечатанные с 17.5%. Этот работал нормально, пока правительство изменило ее на волне мирового финансового кризиса.

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

class NormalItem: public ImportedItem, public NonFoodBookMedicalItem
{

Публичное наследование от ImportedItem здесь сомнительна. Открытое наследование в C++ должны быть использованы для моделирования "есть-" отношения, т. е. если Фу публично наследует от бара , то он должен быть так, что каждый экземпляр Фу - это в бар. Это явно не тот случай, когда каждый элемент импортированным элементом.

Я не уверен, я понимаю, почему вы используете наследование в пути вы находитесь, в то же время, используя шаблон стратегии. Похоже, что ваша цель была использовать стратегию шаблон, так что каждый экземпляр делегировал свои налоговые расчеты с его iSalesTax члена объекта. Тип объекта, что iSalesTax объекта точек может изменяться во время выполнения, независимо от типа самого объекта-это как стратегия шаблон должен работать. Но если вы сделаете это, я не вижу преимущество в том, что другой статический тип для каждой налоговой ситуации. Я должен быть в состоянии заменить iSalesTax в книге элемент, который добавляет налог с продаж? Если это так, то зачем объявлять другого типа? Если нет, то зачем использовать шаблон стратегии?

4
ответ дан 20 июня 2011 в 09:06 Источник Поделиться

Я хотел бы использовать другой подход, вместо того, чтобы все это наследство, я думаю, что это проще в использовании просто класс пункт с подходящим курсом и ImportedDuty, на заводе просто создать и настроить каждый элемент с заданными значениями.

0
ответ дан 16 июня 2011 в 05:06 Источник Поделиться