Metadata-Version: 2.4
Name: swiftcloud-ce
Version: 1.0.0
Summary: Core library for SRI electronic invoicing in Ecuador
Project-URL: Homepage, https://github.com/DIOR27/swiftcloud-ce
Project-URL: Repository, https://github.com/DIOR27/swiftcloud-ce
Project-URL: Documentation, https://github.com/DIOR27/swiftcloud-ce#readme
Project-URL: Issues, https://github.com/DIOR27/swiftcloud-ce/issues
Author-email: Diego Orellana <dior27@duck.com>
License-Expression: MIT
Keywords: ecuador,electronica,facturacion,invoice,sri,xml
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Office/Business :: Financial :: Accounting
Requires-Python: >=3.11
Requires-Dist: cryptography>=41.0.0
Requires-Dist: fastapi>=0.109.0
Requires-Dist: httpx>=0.26.0
Requires-Dist: pydantic>=2.5.0
Requires-Dist: python-dotenv>=1.0.0
Requires-Dist: reportlab>=4.0.0
Requires-Dist: uvicorn>=0.27.0
Requires-Dist: xades>=1.0.0
Requires-Dist: xmlsig>=1.0.1
Provides-Extra: dev
Requires-Dist: pytest-cov>=4.1.0; extra == 'dev'
Requires-Dist: pytest>=8.0.0; extra == 'dev'
Description-Content-Type: text/markdown

# SwiftCloud Core

Core library for SRI electronic invoicing in Ecuador.

## What is SwiftCloud Core?

SwiftCloud Core provides the essential functionality for issuing electronic invoices (facturas) through the SRI (Servicio de Rentas Internas) in Ecuador.

## Features

- **Electronic Invoice Generation**: Create and sign XML invoices compliant with SRI specifications
- **SRI Communication**: Send invoices to SRI and manage authorization status
- **Pending Document Management**: Automatic retry and status tracking for pending invoices
- **PDF Generation**: Generate RIDE (PDF) documents for invoices
- **Tax Calculation**: Automatic calculation of IVA and other taxes

## What's NOT included (Enterprise features)

For additional document types, use swiftcloud-ee:

- Retención (Withhold certificates)
- Liquidación de compra (Purchase settlements)
- Nota de crédito (Credit notes)
- Nota de débito (Debit notes)
- ATS (Anexo Transaccional Simplificado)
- Formularios 103 y 104

## Installation

```powershell
pip install swiftcloud-ce
```

## Usage

### Option 1: Run as API Server

Use this if you want a REST API to emit invoices via HTTP requests.

```powershell
pip install swiftcloud-core
uvicorn swiftcloud.api.main:app --reload
```

API will be available at `http://localhost:8000` with docs at `http://localhost:8000/docs`

#### Configuration

Copy `.env.example` to `.env` and configure:

```env
SWIFTCLOUD_SRI_ENVIRONMENT=testing
SWIFTCLOUD_SRI_CERT_PATH=./certificates/firma.p12
SWIFTCLOUD_SRI_CERT_PASSWORD=your_password
SWIFTCLOUD_COMPANY_RUC=1790012345001
SWIFTCLOUD_COMPANY_LEGAL_NAME=Your Company
SWIFTCLOUD_COMPANY_ADDRESS=Your address
```

### Option 2: Use as Python Library

Use this if you want to integrate invoicing directly into your Python application.

```python
from datetime import date
from decimal import Decimal

from swiftcloud.domain.models import Company, Partner, Journal, DocumentLine, AccountingDocument
from swiftcloud.domain.enums import DocumentType, PartnerIdType
from swiftcloud.localization.ec.catalogs import DEFAULT_EC_TAXES
from swiftcloud.localization.ec.tax_engine import EcuadorTaxEngine
from swiftcloud.localization.ec.sri_xml import SriXmlBuilder

# 1. Create document
company = Company(
    legal_name="My Company S.A.",
    ruc="1790012345001",
    address="Av. Principal 123, Quito",
    establishment_code="001",
    emission_point="001",
    environment="testing",
)

partner = Partner(
    name="Customer Name",
    identification_type=PartnerIdType.CEDULA,
    identification="17123456789",
)

journal = Journal(code="FAC", name="Facturas", document_type=DocumentType.INVOICE)

document = AccountingDocument(
    issue_date=date.today(),
    company=company,
    partner=partner,
    journal=journal,
    sequence="1",
    document_type=DocumentType.INVOICE,
    lines=[
        DocumentLine(
            description="Consulting service",
            quantity=1,
            unit_price=Decimal("100.00"),
            taxes=[DEFAULT_EC_TAXES["iva_15"]],
        ),
        DocumentLine(
            description="Software development",
            quantity=10,
            unit_price=Decimal("50.00"),
            taxes=[DEFAULT_EC_TAXES["iva_15"]],
        ),
    ],
)

# 2. Calculate taxes
engine = EcuadorTaxEngine()
computed = engine.compute(document)

print(f"Subtotal: ${computed.totals.untaxed}")
print(f"IVA: ${computed.totals.taxes}")
print(f"Total: ${computed.totals.total}")

# 3. Generate XML
builder = SriXmlBuilder()
xml = builder.render(computed)

# 4. Sign and send (requires certificate)
from swiftcloud.services.accounting import AccountingService

service = AccountingService()
access_key, signed_xml, xml_path, pdf_path = service.sign_save_and_render(
    document=computed,
    certificate_path="C:\\certs\\firma.p12",
    certificate_password="your_password",
)
```

#### Available Modules

| Module | Description |
|--------|-------------|
| `swiftcloud.domain.models` | Company, Partner, DocumentLine, AccountingDocument, etc. |
| `swiftcloud.domain.enums` | DocumentType, PartnerIdType, TaxKind |
| `swiftcloud.localization.ec.catalogs` | DEFAULT_EC_TAXES, SRI_PAYMENT_METHODS |
| `swiftcloud.localization.ec.tax_engine` | EcuadorTaxEngine (calculate taxes) |
| `swiftcloud.localization.ec.sri_xml` | SriXmlBuilder (generate XML) |
| `swiftcloud.services.accounting` | AccountingService (sign, render PDF) |

## API Endpoints

| Method | Endpoint | Description |
|--------|----------|-------------|
| GET | `/health` | Health check |
| GET | `/about` | API information |
| GET | `/catalogs/payment-methods` | Payment methods catalog |
| POST | `/context/default` | Set default company/certificate |
| GET | `/context/default` | Get effective configuration |
| DELETE | `/context/default` | Clear default context |
| POST | `/sri/sign` | Sign invoice XML |
| POST | `/sri/sign/simple` | Sign invoice (simplified) |
| POST | `/sri/testing/send` | Send to SRI testing |
| POST | `/sri/testing/send/simple` | Send to SRI testing (simplified) |
| POST | `/sri/send` | Send to SRI (production) |
| GET | `/sri/pending` | List pending documents |
| POST | `/sri/pending/process` | Process pending documents |

## Example: Send Invoice

```bash
POST /sri/testing/send/simple
```

```json
{
  "partner": {
    "name": "Customer Name",
    "identification_type": "05",
    "identification": "17123456789"
  },
  "sequence": "1",
  "lines": [
    {
      "description": "Service description",
      "unit_price": 100.00,
      "tax_codes": ["iva_15"]
    }
  ]
}
```

## Architecture

```
swiftcloud/
├── api/           # FastAPI endpoints
├── core/          # Configuration
├── domain/        # Models and enums
├── infrastructure/# SRI client, database
├── services/      # Business logic
└── localization/  # Ecuador-specific (XML, taxes)
```

## License

MIT
