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: 11900
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_DOWNROUND_HALF_UPROUND_HALF_EVENROUND_CEILINGROUND_FLOORROUND_UPROUND_HALF_DOWNROUND_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(837_000), rounder, ss
)
print(tax) # 11900
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(1_000_000), brackets, Decimal(837_000))
print(gross) # 1024058
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(837_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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file syriantaxes-0.1.1.tar.gz.
File metadata
- Download URL: syriantaxes-0.1.1.tar.gz
- Upload date:
- Size: 40.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
38756b53d2477affb42f642ab3ce5de136dc9225ccd5a787b9287b8b75abde49
|
|
| MD5 |
551d08db46d3574d34a5148a12b7f0c5
|
|
| BLAKE2b-256 |
4667afbe54f8b1af4dbab88617a576cea36b02ba1209724b5faa77730bc389b8
|
File details
Details for the file syriantaxes-0.1.1-py3-none-any.whl.
File metadata
- Download URL: syriantaxes-0.1.1-py3-none-any.whl
- Upload date:
- Size: 19.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.10.10 {"installer":{"name":"uv","version":"0.10.10","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64fda0d2ee1211b23476a5f9d8c28741d1f7a013e122680021ce331ba076a258
|
|
| MD5 |
3d5714622ec392941f53fbb21b4a9fe6
|
|
| BLAKE2b-256 |
f1d872dbcc0fb8ab950e7cb72e464609dd96c900147d53738c98f626c072b85d
|