Skip to main content

Connect to Moadian API

Project description

moadian-full

کتابخانه جامع پایتون برای اتصال به سامانه مودیان (سازمان امور مالیاتی ایران) - نسخه دوم با گواهی امضا.

این پکیج یک نسخه بهبود یافته (Fork) از کتابخانه moadian2 است که قابلیت‌های زیر به آن افزوده شده است:

  • ساخت خودکار و استاندارد فاکتور (Invoice Builder)
  • تولید خودکار شماره مالیاتی (Tax ID Generator) با الگوریتم صحیح
  • مدیریت سریال‌های یکتا برای جلوگیری از خطای تکراری بودن (Serial Manager)
  • محاسبه خودکار مبالغ (مالیات، جمع کل و ...)
  • اصلاح الگوریتم Verhoeff برای محاسبه رقم کنترلی

نصب

نصب با pip:

pip install moadian-full

نصب با uv:

uv add moadian-full

شروع سریع

from moadian_full import Moadian, InvoiceItem

# بارگذاری گواهی ها
with open("certs/private_key.pem", "rb") as f:
    private_key = f.read()
with open("certs/certificate.pem", "rb") as f:
    certificate = f.read()

# ایجاد کلاینت
# شناسه حافظه مالیاتی (6 کاراکتر) را وارد کنید
moadi = Moadian("ABCDEF", private_key, certificate)

# ساخت فاکتور با استفاده از بیلدر
# شناسه ملی فروشنده را وارد کنید
builder = moadi.create_invoice_builder("10101234567")

invoice = (builder
    .set_buyer("00123456789", buyer_type=2)  # خریدار حقیقی
    .add_item(InvoiceItem(
        sstid="2330001234567",   # شناسه کالا (13 رقم)
        sstt="عنوان کالا",       # شرح کالا
        fee=10000,               # قیمت واحد
        am=1,                    # تعداد
        vra=10                   # نرخ مالیات بر ارزش افزوده
    ))
    .build())

# ارسال فاکتور
result = moadi.send_invoice(invoice)
uid = result['result'][0]['uid']
print(f"UID: {uid}")

# بررسی وضعیت
status = moadi.check_status(uid)
print(f"Status: {status.get('status')}")

راهنمای استفاده

مقداردهی اولیه

برای شروع، نیاز به کلید خصوصی، گواهی امضا و شناسه حافظه مالیاتی دارید.

from moadian_full import Moadian

moadi = Moadian(
    fiscal_id="ABCDEF",
    private_key=private_key_bytes,
    certificate=certificate_bytes,
    storage_path="./data"  # مسیر ذخیره فایل سریال ها (اختیاری)
)

ساخت فاکتور با Invoice Builder

کلاس InvoiceBuilder پیچیدگی ساخت JSON استاندارد را از بین می‌برد و محاسبات ریاضی را به صورت خودکار انجام می‌دهد.

from moadian_full import InvoiceItem
from datetime import datetime, timedelta

builder = moadi.create_invoice_builder("10101234567")

invoice = (builder
    # تنظیم اطلاعات خریدار
    .set_buyer(
        tin="00123456789",
        buyer_type=2  # 1: حقوقی, 2: حقیقی, 3: اتباع خارجی, 4: گذرنامه
    )
    
    # تنظیم نوع فاکتور (پیش فرض: فروش)
    .set_invoice_type(
        invoice_type=1,  # 1: فروش, 2: فروش نقدی
        pattern=1        # 1: فروش, 2: برگشت از فروش
    )
    
    # تنظیم نحوه پرداخت (پیش فرض: نقدی)
    .set_payment_method(1)  # 1: نقدی, 2: نسیه
    
    # افزودن اقلام فاکتور
    .add_item(InvoiceItem(
        sstid="2330001234567",
        sstt="نام کالا",
        fee=100000,
        am=2,
        vra=9,
        dis=0
    ))
    
    .build()
)

کلاس InvoiceItem

این کلاس مسئولیت محاسبات هر ردیف کالا را بر عهده دارد. ورودی‌ها:

  • sstid: شناسه کالا/خدمت (13 رقم)
  • sstt: شرح کالا/خدمت
  • fee: مبلغ واحد (ریال)
  • am: تعداد/مقدار
  • mu: واحد اندازه گیری (پیش‌فرض: 164 معادل عدد)
  • dis: مبلغ تخفیف
  • vra: نرخ مالیات بر ارزش افزوده (درصد)

روش ارسال ساده (بدون Builder)

اگر نیاز به کنترل دقیق روی فرآیند ساخت ندارید، می‌توانید از متد ساده استفاده کنید:

result = moadi.send_invoice_simple(
    seller_tin="10101234567",
    buyer_tin="00123456789",
    items=[
        {"sstid": "2330001234567", "sstt": "کالا 1", "fee": 10000, "am": 1, "vra": 10},
        {"sstid": "2330007654321", "sstt": "کالا 2", "fee": 20000, "am": 2, "vra": 10},
    ],
    buyer_type=2,
    payment_method=1
)

استعلام وضعیت

استعلام وضعیت فاکتور با استفاده از UID:

# استعلام تکی
status = moadi.check_status(uid, wait_seconds=5)

if status.get('status') == 'SUCCESS':
    print("فاکتور با موفقیت ثبت شد")
elif status.get('status') == 'FAILED':
    errors = status.get('data', {}).get('error', [])
    for err in errors:
        print(f"Error {err['code']}: {err['message']}")

سایر روش‌های استعلام:

# استعلام با لیست UID
moadi.inquiry_by_uid(["uid1", "uid2"])

# استعلام با شماره مرجع
moadi.inquiry_by_reference_id(["ref1"])

# دریافت لیست فاکتورهای موفق
moadi.inquiry(status="SUCCESS", page_num=1, page_size=10)

دریافت اطلاعات مودی و حافظه

# دریافت اطلاعات حافظه مالیاتی
info = moadi.get_fiscal_information()

# دریافت اطلاعات مودی با کد ملی/اقتصادی
taxpayer = moadi.get_tax_payer("10101234567")

مدیریت شماره مالیاتی و سریال

یکی از مشکلات رایج در سامانه مودیان، خطای تکراری بودن شماره مالیاتی یا سریال است. این کتابخانه به صورت خودکار این موضوع را مدیریت می‌کند.

نحوه عملکرد مدیریت سریال

کلاس SerialManager آخرین سریال استفاده شده را در یک فایل JSON ذخیره می‌کند. هر بار که فاکتور جدیدی ساخته می‌شود، سریال به صورت خودکار افزایش می‌یابد.

اگر نیاز به تولید دستی شماره مالیاتی دارید:

from moadian_full import TaxIdGenerator, SerialManager

# مدیریت سریال
manager = SerialManager("ABCDEF")
serial = manager.get_next()

# تولید شماره مالیاتی
generator = TaxIdGenerator("ABCDEF")
taxid = generator.generate(timestamp_ms, serial)
invoice_number = generator.get_invoice_number(serial)

رفع خطاهای رایج

خطای 0300101: مقدار فیلد شماره مالیاتی با اطلاعات سامانه منطبق نیست

این خطا معمولا به سه دلیل رخ می‌دهد:

  1. سریال فاکتور تکراری است.
  2. الگوریتم محاسبه رقم کنترلی (Verhoeff) اشتباه است.
  3. تاریخ فاکتور در آینده است.

راه حل: از InvoiceBuilder استفاده کنید. این کلاس از SerialManager برای تضمین یکتایی سریال و از الگوریتم صحیح Verhoeff برای تولید Tax ID استفاده می‌کند.

خطای 02041: خطای محاسباتی در مبلغ قبل از تخفیف

راه حل: از کلاس InvoiceItem استفاده کنید تا محاسبات ریاضی (ضرب تعداد در مبلغ واحد) به صورت خودکار و دقیق انجام شود.

خطای 0100504: الگوی سریال رعایت نشده است

راه حل: شماره فاکتور (inno) باید دقیقا معادل هگزادسیمالِ سریالِ استفاده شده در taxid باشد و طول آن 10 کاراکتر باشد. کتابخانه این تبدیل را به صورت خودکار انجام می‌دهد.

مقادیر ثابت (Constants)

نوع فاکتور (inty)

  • 1: فروش
  • 2: فروش نقدی
  • 3: صادرات
  • 4: قرارداد

الگوی فاکتور (inp)

  • 1: فروش
  • 2: برگشت از فروش
  • 3: ابطال

نوع خریدار (tob)

  • 1: حقوقی
  • 2: حقیقی
  • 3: اتباع غیر ایرانی
  • 4: گذرنامه

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

moadian_full-0.0.2.tar.gz (53.5 kB view details)

Uploaded Source

Built Distribution

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

moadian_full-0.0.2-py3-none-any.whl (41.7 kB view details)

Uploaded Python 3

File details

Details for the file moadian_full-0.0.2.tar.gz.

File metadata

  • Download URL: moadian_full-0.0.2.tar.gz
  • Upload date:
  • Size: 53.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for moadian_full-0.0.2.tar.gz
Algorithm Hash digest
SHA256 38662119503116cf1bbf9b7d26bfa09f9bee31a007ab5fb5c2a6bc092414ded3
MD5 a6749b8b8f43d9d678ed07ec19a15e6f
BLAKE2b-256 9708155f2de08e353779c4dca2bc8c90be09a0e4941a98b49586fa8911235c0c

See more details on using hashes here.

File details

Details for the file moadian_full-0.0.2-py3-none-any.whl.

File metadata

  • Download URL: moadian_full-0.0.2-py3-none-any.whl
  • Upload date:
  • Size: 41.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for moadian_full-0.0.2-py3-none-any.whl
Algorithm Hash digest
SHA256 5ac2d61d9c5ece069ed8984c584b973e4e31db265c565788b203c4815d5a848f
MD5 fd603e2a085bffca255484d889aa52b5
BLAKE2b-256 b413eb2a4a0eafdf8ca2bc8621e565bae28304d823b1f7e8bd18d454e4a057e7

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