Skip to main content

A Python package for calculating taxes and compensations for Syrian salaries based on Syrian tax laws.

Project description

Syriantaxes

A Python package for calculating taxes and compensations for Syrian salaries based on Syrian tax laws.

Features

  • Calculate fixed taxes and bracket-based taxes
  • Handle social security deductions
  • Support for custom rounding methods
  • Protocol-based design for extensibility
  • 100% test coverage with 162 successful test cases

Installation

Install Syriantaxes using pip:

pip install syriantaxes

Or using uv:

uv add syriantaxes

Quick Start

from decimal import Decimal
from syriantaxes import Bracket, Rounder, RoundingMethod, SocialSecurity, calculate_brackets_tax

# Define tax brackets
brackets = [
    Bracket(0, 837_000, 0),
    Bracket(837_000, 850_000, Decimal('0.11')),
    Bracket(850_000, 1_100_000, Decimal('0.13')),
    Bracket(1_100_000, 25_000_000, Decimal('0.15')),
]

# Create a rounder
rounder = Rounder(RoundingMethod.CEILING, 100)

# Create social security object
ss = SocialSecurity(Decimal(750_000), Decimal('0.07'), rounder)

# Calculate tax
salary = Decimal(1_000_000)
tax = calculate_brackets_tax(salary, brackets, Decimal(837_000), rounder, ss)
print(f"Tax: {tax}")  # Tax: 20930

Classes

Bracket

Represents a tax bracket with minimum, maximum, and rate.

from syriantaxes import Bracket
from decimal import Decimal

bracket = Bracket(0, 837_000, 0)
print(bracket.min)  # 0
print(bracket.max)  # 837000
print(bracket.rate)  # 0

Rounder

Handles rounding of decimal numbers using various methods.

from syriantaxes import Rounder, RoundingMethod

rounder = Rounder(RoundingMethod.CEILING, 100)
result = rounder.round(Decimal('123.45'))
print(result)  # 200

Available rounding methods:

  • ROUND_DOWN
  • ROUND_HALF_UP
  • ROUND_HALF_EVEN
  • ROUND_CEILING
  • ROUND_FLOOR
  • ROUND_UP
  • ROUND_HALF_DOWN
  • ROUND_05UP

SocialSecurity

Calculates social security deductions.

from syriantaxes import SocialSecurity, Rounder, RoundingMethod

rounder = Rounder(RoundingMethod.CEILING, 1)
ss = SocialSecurity(Decimal(750_000), Decimal('0.07'), rounder)
deduction = ss.calculate_deduction(Decimal(1_000_000))
print(deduction)  # 70000

Functions

calculate_fixed_tax

Calculate fixed tax for an amount.

from syriantaxes import calculate_fixed_tax, Rounder, RoundingMethod

rounder = Rounder(RoundingMethod.CEILING, 100)
tax = calculate_fixed_tax(Decimal(1_000_000), Decimal('0.05'), rounder)
print(tax)  # 50000

calculate_brackets_tax

Calculate tax based on progressive brackets.

from syriantaxes import calculate_brackets_tax, Bracket, SocialSecurity, Rounder, RoundingMethod

brackets = [
    Bracket(0, 837_000, 0),
    Bracket(837_000, 850_000, Decimal('0.11')),
    Bracket(850_000, 1_100_000, Decimal('0.13')),
]

rounder = Rounder(RoundingMethod.CEILING, 100)
ss = SocialSecurity(Decimal(750_000), Decimal('0.07'), rounder)

tax = calculate_brackets_tax(
    Decimal(1_000_000), brackets, Decimal(500_000), rounder, ss
)
print(tax)  # 20930

calculate_gross_compensation

Calculate gross compensation from net amount.

from syriantaxes import calculate_gross_compensation

gross = calculate_gross_compensation(Decimal(1_000_000), Decimal('0.05'))
print(gross)  # 1052631.58

calculate_gross_salary

Calculate gross salary from net target.

from syriantaxes import calculate_gross_salary, Bracket

brackets = [
    Bracket(0, 837_000, 0),
    Bracket(837_000, 850_000, Decimal('0.11')),
    Bracket(850_000, 1_100_000, Decimal('0.13')),
]

gross = calculate_gross_salary(Decimal(800_000), brackets, Decimal(500_000))
print(gross)  # 880962

calculate_gross_components

Calculate gross salary and compensations.

from syriantaxes import calculate_gross_components, Bracket

brackets = [
    Bracket(0, 837_000, 0),
    Bracket(837_000, 850_000, Decimal('0.11')),
    Bracket(850_000, 1_100_000, Decimal('0.13')),
]

salary, compensations = calculate_gross_components(
    Decimal(1_000_000), Decimal('0.2'), brackets, Decimal(500_000), Decimal('0.05')
)
print(f"Salary: {salary}, Compensations: {compensations}")

Advanced Examples with External Classes

Syriantaxes uses protocols, allowing you to implement custom classes that conform to the expected interfaces.

Custom SocialSecurity

from decimal import Decimal
from math import ceil
from syriantaxes import calculate_brackets_tax

class CustomSocialSecurity:
    def __init__(self, min_salary: Decimal):
        self._min_salary = min_salary

    def calculate_deduction(self, salary: Decimal) -> Decimal:
        deduction = Decimal(salary) * Decimal("0.07")
        return Decimal(ceil(deduction))

# Custom brackets as dicts
brackets = [
    {"min": 0, "max": 837_000, "rate": 0},
    {"min": 837_000, "max": 850_000, "rate": 0.11},
    {"min": 850_000, "max": 1_100_000, "rate": 0.13},
]

ss = CustomSocialSecurity(Decimal(750_000))

tax = calculate_brackets_tax(
    Decimal(1_000_000), brackets, Decimal(500_000), ss_obj=ss
)
print(tax)  # 20930

Custom Rounder

from decimal import Decimal
from math import ceil
from syriantaxes import calculate_fixed_tax

class CustomRounder:
    def round(self, number: Decimal) -> Decimal:
        return Decimal(ceil(number / 100) * 100)

rounder = CustomRounder()
tax = calculate_fixed_tax(Decimal(1_000_000), Decimal('0.05'), rounder)
print(tax)  # 50000

Custom Brackets

You can use classes with properties, variables, or class variables:

from syriantaxes import calculate_brackets_tax

class CustomBracket:
    def __init__(self, min_val, max_val, rate_val):
        self.min = min_val
        self.max = max_val
        self.rate = rate_val

brackets = [
    CustomBracket(0, 837_000, 0),
    CustomBracket(837_000, 850_000, 0.11),
    CustomBracket(850_000, 1_100_000, 0.13),
]

tax = calculate_brackets_tax(Decimal(1_000_000), brackets, Decimal(500_000))
print(tax)  # 20930

Testing

The package has comprehensive test coverage:

  • Coverage: 100%
  • Test Cases: 162 successful tests

Run tests with:

pytest

Run tests with coverage:

pytest --cov

Contributing

Contributions are welcome! Please feel free to submit a Pull Request.

License

This project is licensed under the MIT License - see the LICENSE file for details.

Author

Abdullah Altatan - a.altatan@gmail.com

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

syriantaxes-0.1.0.tar.gz (62.2 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

syriantaxes-0.1.0-py3-none-any.whl (7.4 kB view details)

Uploaded Python 3

File details

Details for the file syriantaxes-0.1.0.tar.gz.

File metadata

  • Download URL: syriantaxes-0.1.0.tar.gz
  • Upload date:
  • Size: 62.2 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.5.4

File hashes

Hashes for syriantaxes-0.1.0.tar.gz
Algorithm Hash digest
SHA256 000aa759a26a775984035606ef953209e42c32908a7858be3652e5649e56e69b
MD5 1728e56a8007229636dabe75a5bd534c
BLAKE2b-256 ff13ccd798266b2b00e4a647dbde76517cf38b58e6e45298f280268d8a9d67bb

See more details on using hashes here.

File details

Details for the file syriantaxes-0.1.0-py3-none-any.whl.

File metadata

File hashes

Hashes for syriantaxes-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 fbfb1313f637bc7571ac9f9e3b03115d2e5c13dcbb48eda46842202116407fc5
MD5 d51fbdc652fcd9897f06c2a43f8bb122
BLAKE2b-256 1f47126328eaaf86d21018e22a25fdb9bc1d9bb4e6117a387426934f426d354e

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page