diff --git a/.DS_Store b/.DS_Store new file mode 100644 index 00000000..1cd4ddeb Binary files /dev/null and b/.DS_Store differ diff --git a/Pipfile b/Pipfile new file mode 100644 index 00000000..1c3b5776 --- /dev/null +++ b/Pipfile @@ -0,0 +1,12 @@ +[[source]] +url = "https://pypi.org/simple" +verify_ssl = true +name = "pypi" + +[packages] + +[dev-packages] +pytest = "*" + +[requires] +python_version = "3.9" \ No newline at end of file diff --git a/__pycache__/conftest.cpython-39-pytest-6.2.5.pyc b/__pycache__/conftest.cpython-39-pytest-6.2.5.pyc new file mode 100644 index 00000000..65d4a4a6 Binary files /dev/null and b/__pycache__/conftest.cpython-39-pytest-6.2.5.pyc differ diff --git a/before_review.txt b/before_review.txt new file mode 100644 index 00000000..49740554 --- /dev/null +++ b/before_review.txt @@ -0,0 +1,3 @@ +Thank you for taking the time to review my work! I apologize if it took too much time to complete, +but I would just like to note that in order for the data to be read in correctly the code must be ran +from the main CashRegister directory, not one level deeper in the register directory. Thank you again! \ No newline at end of file diff --git a/conftest.py b/conftest.py new file mode 100644 index 00000000..e69de29b diff --git a/input/data.csv b/input/data.csv new file mode 100644 index 00000000..05e7ab00 --- /dev/null +++ b/input/data.csv @@ -0,0 +1,5 @@ +3.33, 5.01 +1.23, 4.00 +0.78, 5.00 +2.76, 3.00 +0.01, 1.00 \ No newline at end of file diff --git a/register/__init__.py b/register/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/register/__pycache__/__init__.cpython-39.pyc b/register/__pycache__/__init__.cpython-39.pyc new file mode 100644 index 00000000..1991701f Binary files /dev/null and b/register/__pycache__/__init__.cpython-39.pyc differ diff --git a/register/__pycache__/cash_register.cpython-39.pyc b/register/__pycache__/cash_register.cpython-39.pyc new file mode 100644 index 00000000..af855e06 Binary files /dev/null and b/register/__pycache__/cash_register.cpython-39.pyc differ diff --git a/register/cash_register.py b/register/cash_register.py new file mode 100644 index 00000000..95d1fe3a --- /dev/null +++ b/register/cash_register.py @@ -0,0 +1,170 @@ +import csv +from decimal import Decimal +import random + + +DENOMINATIONS_VALUE = {'dollar': Decimal('1.00'), + 'quarter': Decimal('0.25'), + 'dime': Decimal('0.10'), + 'nickel': Decimal('0.05'), + 'penny': Decimal('0.01')} + + +def calculate_minimum_denominations(change): + dynamic_change = change + final_change = [] + while dynamic_change >= DENOMINATIONS_VALUE['dollar']: + final_change.append('dollar') + dynamic_change = (dynamic_change - DENOMINATIONS_VALUE['dollar']) + while dynamic_change <= DENOMINATIONS_VALUE['dollar'] and dynamic_change > DENOMINATIONS_VALUE['quarter']: + final_change.append('quarter') + dynamic_change = (dynamic_change - DENOMINATIONS_VALUE['quarter']) + while dynamic_change <= DENOMINATIONS_VALUE['quarter'] and dynamic_change > DENOMINATIONS_VALUE['dime']: + final_change.append('dime') + dynamic_change = (dynamic_change - DENOMINATIONS_VALUE['dime']) + while dynamic_change <= DENOMINATIONS_VALUE['dime'] and dynamic_change > DENOMINATIONS_VALUE['nickel']: + final_change.append('nickel') + dynamic_change = (dynamic_change - DENOMINATIONS_VALUE['nickel']) + while dynamic_change <= DENOMINATIONS_VALUE['nickel'] and dynamic_change >= DENOMINATIONS_VALUE['penny']: + final_change.append('penny') + dynamic_change = dynamic_change - DENOMINATIONS_VALUE['penny'] + return final_change + + +def calculate_random_denominations(change): + denoms = ['dollar', 'quarter', 'dime', 'nickel', 'penny'] + #print(type(change)) + dynamic_change = change + final_change = [] + while dynamic_change > Decimal('0.00'): + if dynamic_change >= DENOMINATIONS_VALUE['dollar']: + random_denom = random.choice(denoms) + final_change.append(random_denom) + dynamic_change = (dynamic_change - DENOMINATIONS_VALUE[random_denom]) + elif dynamic_change >= DENOMINATIONS_VALUE['quarter'] and dynamic_change < DENOMINATIONS_VALUE['dollar']: + exception = ['dollar'] + random_denom = random.choice([denom for denom in denoms if denom not in exception]) + final_change.append(random_denom) + dynamic_change = (dynamic_change - DENOMINATIONS_VALUE[random_denom]) + elif dynamic_change >= DENOMINATIONS_VALUE['dime'] and dynamic_change < DENOMINATIONS_VALUE['quarter']: + exception = ['dollar', 'quarter'] + random_denom = random.choice([denom for denom in denoms if denom not in exception]) + final_change.append(random_denom) + dynamic_change = (dynamic_change - DENOMINATIONS_VALUE[random_denom]) + elif dynamic_change >= DENOMINATIONS_VALUE['nickel'] and dynamic_change < DENOMINATIONS_VALUE['dime']: + exception = ['dollar', 'quarter', 'dime'] + random_denom = random.choice([denom for denom in denoms if denom not in exception]) + final_change.append(random_denom) + dynamic_change = (dynamic_change - DENOMINATIONS_VALUE[random_denom]) + elif dynamic_change >= DENOMINATIONS_VALUE['penny'] and dynamic_change < DENOMINATIONS_VALUE['nickel']: + final_change.append(DENOMINATIONS_VALUE['penny']) + dynamic_change = (dynamic_change - DENOMINATIONS_VALUE['penny']) + else: + pass + return final_change + + +def sum_final_change(final_change, DENOMINATIONS_): + for denomination in final_change: + if denomination == 'dollar': + DENOMINATIONS_['dollar'] += 1 + elif denomination == 'quarter': + DENOMINATIONS_['quarter'] += 1 + elif denomination == 'dime': + DENOMINATIONS_['dime'] += 1 + elif denomination == 'nickel': + DENOMINATIONS_['nickel'] += 1 + else: + DENOMINATIONS_['penny'] += 1 + return DENOMINATIONS_ + + +def final_change_output(change_dict): + final_change_str = "" + change_copy = {**change_dict} + for denom in change_copy: + if change_copy['dollar'] > 0: + if change_copy[denom] == 1: + final_change_str = final_change_str + "1 dollar, " + change_copy[denom] = 0 + elif change_copy[denom] > 1: + final_change_str = final_change_str + f"{change_copy['dollar']} dollars, " + change_copy[denom] = 0 + if change_copy['quarter'] > 0: + if change_copy[denom] == 1: + final_change_str = final_change_str + "1 quarter, " + change_copy[denom] = 0 + elif change_copy[denom] > 1: + final_change_str = final_change_str + f"{change_copy['quarter']} quarters, " + change_copy[denom] = 0 + if change_copy['dime'] > 0: + if change_copy[denom] == 1: + final_change_str = final_change_str + "1 dime, " + change_copy[denom] = 0 + elif change_copy[denom] > 1: + final_change_str = final_change_str + f"{change_copy['dime']} dimes, " + change_copy[denom] = 0 + if change_copy['nickel'] > 0: + if change_copy[denom] == 1: + final_change_str = final_change_str + "1 nickel, " + change_copy[denom] = 0 + elif change_copy[denom] > 1: + final_change_str = final_change_str + f"{change_copy['nickel']} nickels, " + change_copy[denom] = 0 + if change_copy['penny'] > 0: + if change_copy[denom] == 1: + final_change_str = final_change_str + "1 penny, " + change_copy[denom] = 0 + elif change_copy[denom] > 1: + final_change_str = final_change_str + f"{change_copy['penny']} pennies, " + change_copy[denom] = 0 + return final_change_str + + +def main(): + print() + print() + print("Thank you for using Creative Cash Draw Solutions Cash Register System!") + print() + print("In the data.csv file, please enter the price of the item being purchased") + print() + print("followed by the amount of money paid, separated by a comma. You may use the") + print() + print("data already in the file as a guide to input your own data, or leave it as it is.") + print() + print("After adding data, please rerun this file in order to get up to date results.") + print() + print("The data being displayed currently is the data that was in the data.csv file before runtime.") + print() + print() + print() + file = csv.reader(open('input/data.csv'), delimiter = ',') + for line in file: + (total, paid) = line + total = Decimal(total) + paid = Decimal(paid) + change = paid - total + rem = change % Decimal('.03') + DENOMINATIONS_ = {'dollar': 0, + 'quarter': 0, + 'dime': 0, + 'nickel': 0, + 'penny': 0} + + if rem != Decimal('0.00'): + change = calculate_minimum_denominations(change) + change = sum_final_change(change, DENOMINATIONS_) + change = final_change_output(change) + print(change) + print() + else: + change = calculate_random_denominations(change) + change = sum_final_change(change, DENOMINATIONS_) + change = final_change_output(change) + print(change) + print() + DENOMINATIONS_ = DENOMINATIONS_.fromkeys(DENOMINATIONS_, 0) + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/tests/__innit__.py b/tests/__innit__.py new file mode 100644 index 00000000..e69de29b diff --git a/tests/__pycache__/conftest.cpython-39-pytest-6.2.5.pyc b/tests/__pycache__/conftest.cpython-39-pytest-6.2.5.pyc new file mode 100644 index 00000000..6ef06a60 Binary files /dev/null and b/tests/__pycache__/conftest.cpython-39-pytest-6.2.5.pyc differ diff --git a/tests/__pycache__/test_cash_register.cpython-39-pytest-6.2.5.pyc b/tests/__pycache__/test_cash_register.cpython-39-pytest-6.2.5.pyc new file mode 100644 index 00000000..6ce0be6d Binary files /dev/null and b/tests/__pycache__/test_cash_register.cpython-39-pytest-6.2.5.pyc differ diff --git a/tests/test_cash_register.py b/tests/test_cash_register.py new file mode 100644 index 00000000..d470aff1 --- /dev/null +++ b/tests/test_cash_register.py @@ -0,0 +1,71 @@ +import os, pytest, sys +from decimal import Decimal + +myPath = os.path.dirname(os.path.abspath(__file__)) +sys.path.insert(0, myPath + '/../') + +from register import cash_register + +#two complete, add more +def test_sum_final_change_return_type(): + DENOMINATIONS_ = {'dollar': 0, + 'quarter': 0, + 'dime': 0, + 'nickel': 0, + 'penny': 0} + change = ['quarter', 'dime', 'penny'] + final_change = cash_register.sum_final_change(change, DENOMINATIONS_) + assert type(final_change) is dict + + +def test_sum_final_change_empty_input(): + DENOMINATIONS_ = {'dollar': 0, + 'quarter': 0, + 'dime': 0, + 'nickel': 0, + 'penny': 0} + change = ['quarter', 'dime', 'penny'] + final_change = cash_register.sum_final_change(change, DENOMINATIONS_) + assert DENOMINATIONS_['quarter'] == 1 + + +def test_calculate_minimum_denominations_change_is_decimal(): + change = 0.01 + with pytest.raises(TypeError): + cash_register.calculate_minimum_denominations(change) + + +def test_calculate_minimum_denominations_return_not_empty(): + change = Decimal('1.11') + change = cash_register.calculate_minimum_denominations(change) + assert print(len(change)) != 0 + + +def test_calculate_random_denominations_change_is_decimal(): + change = 0.01 + with pytest.raises(TypeError): + cash_register.calculate_random_denominations(change) + + +def test_calculate_random_denominations_return_not_empty(): + change = Decimal('1.11') + change = cash_register.calculate_minimum_denominations(change) + assert print(len(change)) != 0 + + +def test_final_change_output_return_str(): + change = {'dollar': 0, 'quarter': 4, 'dime': 4, 'nickel': 4, 'penny': 8} + output = cash_register.final_change_output(change) + assert type(output) is str + + +def test_final_change_input_dict(): + change = ['sting1', 'string2', 'string3'] + with pytest.raises(TypeError): + cash_register.final_change_output(change) + + +def test_final_change_output_not_empty(): + change = {'dollar': 0, 'quarter': 4, 'dime': 4, 'nickel': 4, 'penny': 8} + output = cash_register.final_change_output(change) + assert len(output) > 0 \ No newline at end of file diff --git a/tests/test_data.csv b/tests/test_data.csv new file mode 100644 index 00000000..0d59de62 --- /dev/null +++ b/tests/test_data.csv @@ -0,0 +1,5 @@ +4.89,10.00 +3.33,10.00 +2.66,5.00 +2.64,5.00 +abcd,efgh \ No newline at end of file