Skip to main content

Python SDK for DGMax API - Electronic fiscal document processing for Dominican Republic

Project description

DGMaxClient

Python SDK for the DGMax API - Electronic fiscal document processing for the Dominican Republic.

Installation

pip install dgmaxclient

Quick Start

from dgmaxclient import DGMaxClient

# Initialize the client
client = DGMaxClient(api_key="dgmax_xxx")

# List companies
companies = client.companies.list()
for company in companies.results:
    print(f"{company.name} ({company.rnc})")

# Create an invoice (E32)
invoice = client.invoices.create({
    "encabezado": {
        "id_doc": {
            "e_ncf": "E320000000001",
            "tipo_e_ncf": 32,
            # ... other fields
        },
        "emisor": {
            "rnc_emisor": "123456789",
            # ... other fields
        },
        "totales": {
            "monto_total": 1000.00,
            # ... other fields
        }
    },
    "detalles": {
        "item": [
            # ... line items
        ]
    }
})

print(f"Invoice created: {invoice.encf}")
print(f"Status: {invoice.status}")

Architecture

DGMaxClient uses the Facade Pattern with Composition to provide a clean, namespaced API. The main client acts as a single entry point that composes multiple resource objects, each responsible for a specific API domain.

┌─────────────────┐
│   DGMaxClient   │ ◄── Facade (single entry point)
├─────────────────┤
│ .companies      │───► CompaniesResource
│ .invoices       │───► InvoicesResource
│ .purchases      │───► PurchasesResource
│ .credit_notes   │───► CreditNotesResource
│ ...             │───► (other resources)
└─────────────────┘
         │
         ▼
   HTTP/Auth layer (shared)

This pattern enables:

  • Clean API: client.companies.list(), client.invoices.create({...})
  • Shared configuration: All resources use the same authentication and settings
  • Separation of concerns: Each resource handles its own domain logic
  • Discoverability: IDE autocomplete works seamlessly

Features

Document Types (E31-E47)

The SDK supports all Dominican Republic electronic fiscal document types:

Type Resource Description
E31 client.fiscal_invoices Factura de Crédito Fiscal Electrónica
E32 client.invoices Factura de Consumo Electrónica
E33 client.debit_notes Nota de Débito Electrónica
E34 client.credit_notes Nota de Crédito Electrónica
E41 client.purchases Comprobante Electrónico de Compras
E43 client.minor_expenses Comprobante Electrónico para Gastos Menores
E44 client.special_regimes Comprobante Electrónico para Regímenes Especiales
E45 client.governmental Comprobante Electrónico Gubernamental
E46 client.exports Comprobante Electrónico para Exportaciones
E47 client.payments_abroad Comprobante Electrónico para Pagos al Exterior

Company Management

from dgmaxclient import CompanyCreate, CertificateCreate

# List companies
companies = client.companies.list()

# Get a specific company
company = client.companies.get("company-uuid")

# Create a company with certificate
company = client.companies.create(CompanyCreate(
    name="Mi Empresa SRL",
    trade_name="Mi Empresa",
    rnc="123456789",
    address="Calle Principal #123",
    certificate=CertificateCreate(
        name="certificate",
        extension="p12",
        content="base64-encoded-certificate",
        password="certificate-password"
    )
))

# Update a company
company = client.companies.update("company-uuid", {
    "phone": "809-555-1234",
    "email": "info@miempresa.com"
})

Document Operations

from dgmaxclient import DocumentFilters, DocumentStatus, PaginationParams

# List documents with pagination
invoices = client.invoices.list(
    params=PaginationParams(limit=50, offset=0)
)

# List documents with filters
invoices = client.invoices.list(
    filters=DocumentFilters(
        status=DocumentStatus.COMPLETED,
        date_from="2024-01-01",
        date_to="2024-12-31",
        search="123456789"  # Search by RNC or eNCF
    )
)

# Get a specific document
invoice = client.invoices.get("document-uuid")

# Create a document
invoice = client.invoices.create({...})

Received Documents (Receptor Module)

# List received documents
received = client.received_documents.list()

# List with filters
received = client.received_documents.list(
    status_filter="PENDING",
    date_from="2024-01-01"
)

# Approve a received document
response = client.received_documents.approve("document-uuid")
if response.success:
    print(f"Document approved: {response.approval_id}")

# Reject a received document
response = client.received_documents.reject(
    "document-uuid",
    rejection_reason="Invoice amount does not match purchase order"
)

# List commercial approvals received
approvals = client.received_documents.list_commercial_approvals()

Error Handling

The SDK provides a comprehensive exception hierarchy:

from dgmaxclient import (
    DGMaxError,
    DGMaxAuthenticationError,
    DGMaxValidationError,
    DGMaxRequestError,
    DGMaxServerError,
    DGMaxTimeoutError,
    DGMaxConnectionError,
    DGMaxRateLimitError,
)

try:
    invoice = client.invoices.create({...})
except DGMaxAuthenticationError as e:
    print(f"Authentication failed: {e.message}")
    print(f"Status code: {e.status_code}")
except DGMaxValidationError as e:
    print(f"Validation error: {e.message}")
    if e.response:
        print(f"Details: {e.response}")
except DGMaxServerError as e:
    print(f"Server error (will retry): {e.message}")
except DGMaxTimeoutError:
    print("Request timed out")
except DGMaxConnectionError:
    print("Connection error - check your network")
except DGMaxRateLimitError as e:
    print(f"Rate limited. Retry after: {e.retry_after}s")
except DGMaxError as e:
    print(f"General error: {e.message}")

Configuration

# Custom base URL (for staging/testing)
client = DGMaxClient(
    api_key="dgmax_xxx",
    base_url="https://staging.dgmax.do"
)

# Custom timeout (default: 30 seconds)
client = DGMaxClient(
    api_key="dgmax_xxx",
    timeout=60
)

Automatic Retries

The SDK automatically retries requests on:

  • Server errors (5xx)
  • Connection errors
  • Timeout errors

Retries use exponential backoff with jitter (max 3 attempts).

Type Safety

All responses are validated with Pydantic models:

from dgmaxclient import ElectronicDocumentPublic, DocumentStatus

invoice: ElectronicDocumentPublic = client.invoices.get("uuid")

# Type-safe access
print(invoice.id)
print(invoice.encf)
print(invoice.status)  # DocumentStatus enum

if invoice.status == DocumentStatus.COMPLETED:
    print("Document processed successfully")

Requirements

  • Python 3.8+
  • api-client >= 1.3.1
  • pydantic >= 2.0
  • tenacity >= 8.0
  • requests >= 2.28.0

Development

# Install dev dependencies
pip install -e ".[dev]"

# Run tests
pytest

# Run tests with coverage
pytest --cov=dgmaxclient

# Type checking
mypy src/dgmaxclient

# Linting
ruff check src/dgmaxclient

Load Testing

The integration tests include parallel invoice creation for load testing. You can run multiple instances with different configurations using environment variables:

  • DGMAX_COMPANY_ID: Target company UUID
  • START_SEQ: Starting sequence number for e-NCF generation

Option 1: Two separate terminals

# Terminal 1
DGMAX_COMPANY_ID=company-a-uuid START_SEQ=911000 pytest tests/integration/test_dgmaxclient.py::test_create_fiscal_invoices_parallel -s -m manual

# Terminal 2
DGMAX_COMPANY_ID=company-b-uuid START_SEQ=912000 pytest tests/integration/test_dgmaxclient.py::test_create_fiscal_invoices_parallel -s -m manual

Option 2: Background processes (single command)

DGMAX_COMPANY_ID=company-a-uuid START_SEQ=911000 pytest tests/integration/test_dgmaxclient.py::test_create_fiscal_invoices_parallel -s -m manual &
DGMAX_COMPANY_ID=company-b-uuid START_SEQ=912000 pytest tests/integration/test_dgmaxclient.py::test_create_fiscal_invoices_parallel -s -m manual &
wait

License

MIT License - see LICENSE file for details.

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

dgmaxclient-1.0.1.tar.gz (30.6 kB view details)

Uploaded Source

Built Distribution

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

dgmaxclient-1.0.1-py3-none-any.whl (37.2 kB view details)

Uploaded Python 3

File details

Details for the file dgmaxclient-1.0.1.tar.gz.

File metadata

  • Download URL: dgmaxclient-1.0.1.tar.gz
  • Upload date:
  • Size: 30.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.9.0

File hashes

Hashes for dgmaxclient-1.0.1.tar.gz
Algorithm Hash digest
SHA256 922730bc56d5418f280d7b4fb62a055370e00b281949216df1bc5f8ee8e61128
MD5 9facdfa5e8c961f0c0b85a63720251e6
BLAKE2b-256 0517d2c4a137aceb8ac3978c85abed8ae26523238db379457f9d24ae95a6eaf9

See more details on using hashes here.

File details

Details for the file dgmaxclient-1.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for dgmaxclient-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 b2df5f8077b780e3054bbe98eb1e21f78b27303a8eb6a0b430a62809cdcf50d6
MD5 b4f3761de57e7399a875bc6b596b98bf
BLAKE2b-256 8f14f401ba6fc48e4c34516903cd01953855c647a86d71cf1c5be31bb7f1d5d9

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