Skip to main content

SDK de leitura/transformacao de planilhas de apolices Transdesk para o formato interno 77seg

Project description

transdesk-importer-python-sdk

SDK Python para leitura e transformacao de planilhas de apolices da Transdesk no formato interno consumido pela 77seg-core-api.

O SDK e puro: ele apenas le, transforma e valida a planilha, devolvendo modelos tipados. Ele nao grava no banco, nao cadastra leads/corretoras e nao gera link de assinatura -- essas responsabilidades ficam na core-api (ver Referencia de enrichment).

Instalacao

pip install transdesk-importer-python-sdk

Requer Python >= 3.11.

Uso

A entrada pode ser bytes (upload em memoria), um objeto file-like binario ou um caminho de arquivo. O formato (.xls/.xlsx) e detectado automaticamente por magic bytes -- nao depende da extensao.

from transdesk.importer import TransdeskImporter

# 1) a partir de bytes (ex.: upload de um endpoint)
file_bytes = request.files["file"].file.read()
result = TransdeskImporter().import_policies(file_bytes)

# 2) a partir de um caminho
result = TransdeskImporter().import_policies("apolices.xls")

if not result.is_valid:
    # result.errors -> list[ValidationError]
    for err in result.errors:
        print(err)
else:
    for policy in result.policies:        # list[InternalPolicy]
        print(policy.reference_id, len(policy.data.items))

# serializacao pronta para JSON
payload = result.to_dict()   # dict
as_json = result.to_json()   # str (ensure_ascii=False)

Retorno

import_policies(file) devolve um ImportResult:

Campo Tipo Descricao
policies list[InternalPolicy] Apolices ja no formato interno
errors list[ValidationError] Divergencias encontradas na validacao
is_valid bool True quando errors esta vazio

Helpers: result.to_dict() e result.to_json(**kwargs).

Principais modelos

  • Saida (EN): InternalPolicy, PolicyData, ResellerData, Broker, Lead, CustomerInfo, Telephone, Mobile, Address, InternalItem.
  • Canonico (PT, em InternalPolicy.original_data): CanonicalPolicy, CanonicalItem, Subestipulante, Cliente, Endereco, DadosBancarios, UnidadeVenda, Cobertura, Complemento.

InternalItem tem um schema "achatado" e consistente: todos os campos de cobertura e de risco estao sempre presentes; os que nao se aplicam ao tipo do item (ex.: campos de vida num veiculo) vem como null.

Campos adicionais de veiculo/reboque (colunas apos CHAVE_PIX na planilha):

Coluna planilha Campo InternalItem Observacao
EMPRESA_RASTREAMENTO vehicle_tracker_company Somente quando has_vehicle_tracker
CATEGORIA vehicle_classification Classificacao do veiculo (texto)
MARCA brand_name / brand Veiculo; reboque usa MARCA_REBOQUE
MODELO model_description / model Veiculo; reboque usa MODELO_REBOQUE
RENAVAM renavam
COR color
ANO model_year, manufacture_year Mesmo valor nos dois campos
EIXOS axles
CAMBIO transmission
ALIENADO is_alienated N/A ou vazio = false

Validacao

O ValidationError cobre tres tipos:

  • policy_count -- divergencia na contagem de apolices;
  • item_count -- divergencia na contagem de itens de uma apolice;
  • premium -- divergencia (apos arredondamento) entre o premio somado no canonico e o premio somado no formato interno de um item.

Arquitetura

planilha (bytes/file-like/path)
        |
        v
   ExcelReader            -> DataFrame
        |
        v
   ApoliceBuilder         -> list[CanonicalPolicy]   (camada canonica, PT)
        |
        v
   InternalMapper         -> list[InternalPolicy]    (camada interna, EN)
        |
        v
   InternalPolicyValidator-> list[ValidationError]
        |
        v
   ImportResult (policies + errors)

Desenvolvimento

python -m venv venv && source venv/bin/activate
pip install -e ".[dev]"
pytest

Publicacao: criar uma tag vX.Y.Z dispara o workflow de publish no PyPI (.github/workflows/publish.yml).

Referencia de enrichment (core-api)

Esta secao nao faz parte do SDK. Ela preserva, como referencia, a logica de "enrichment" e persistencia que saiu do importer e deve ser portada para a 77seg-core-api.

Apos obter as InternalPolicy do SDK, a core-api deve:

  1. Completar os dados de cada apolice (cadastrar lead e unidade/corretora, injetar enterprise_id/reseller_id e os defaults da venda);
  2. Persistir os registros das vendas no banco;
  3. Gerar o link de assinatura (Paperless) e atualizar o status para pending_signature.

Codigo original (removido do SDK), que serve de base para a implementacao na core-api:

class InternalImportPipeline:

    def __init__(self, enterprise_id, reseller_id):
        self.enterprise_id = enterprise_id
        self.reseller_id = reseller_id

    def execute(self, policies):
        policies = [self._complete_data(policy) for policy in policies]
        policies = self._create_db_records(policies)
        policies = self._generate_signature_link(policies)
        return policies

    def _complete_data(self, policy):
        lead = policy.get('data').get('lead')
        # TODO: gerar o cadastro do lead no BD

        broker = policy.get('data').get('reseller').get('broker')
        # TODO: gerar o cadastro da unidade (corretora) no BD
        # TODO: gerar o cadastro do vendedor padrao da unidade (corretora) no BD

        # preencher os dados faltantes
        policy.update({
            'enterprise': {'id': self.enterprise_id},
            'reseller': {'id': self.reseller_id, 'person': broker},
            'lead': lead,
            'status': 'quotation_completed',
            'payment_method': 'bank_slip',
            'multi': True,
            'active': True,
            'deleted': False
        })
        return policy

    def _create_db_records(self, policies):
        # TODO: insere os registros no BD
        return policies

    def _generate_signature_link(self, policies):
        # TODO: gera o link de assinatura (via Paperless) para cada venda
        # TODO: atualiza o status da venda p/ pending_signature
        return policies

Ponto de integracao na core-api (esboco):

from transdesk.importer import TransdeskImporter

result = TransdeskImporter().import_policies(file_bytes)
if not result.is_valid:
    ...  # retornar result.errors

policies = [p.to_dict() if hasattr(p, "to_dict") else p for p in result.policies]
# aplicar _complete_data / _create_db_records / _generate_signature_link aqui

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

transdesk_importer_python_sdk-1.2.1.tar.gz (23.4 kB view details)

Uploaded Source

Built Distribution

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

transdesk_importer_python_sdk-1.2.1-py3-none-any.whl (24.0 kB view details)

Uploaded Python 3

File details

Details for the file transdesk_importer_python_sdk-1.2.1.tar.gz.

File metadata

File hashes

Hashes for transdesk_importer_python_sdk-1.2.1.tar.gz
Algorithm Hash digest
SHA256 6bec9743808bed2751a713484996ec2a2de531094e09d877c99cf645a82b3a92
MD5 aa6a009e149289a4ac4bfe122d86f7b4
BLAKE2b-256 e52f7a81c309e27b0d2341633e030e5e0b64bca3c2a137e9fb412d8efbacaf56

See more details on using hashes here.

File details

Details for the file transdesk_importer_python_sdk-1.2.1-py3-none-any.whl.

File metadata

File hashes

Hashes for transdesk_importer_python_sdk-1.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 0d4385a0afabf5b0e6d372ad10b9f9c1833fe29ecd43da2319b97f2de45e10f3
MD5 5c863a866901de4cd82cfe6df5a7346f
BLAKE2b-256 3b24c16f8ef5789c47045b389e57af910bc0b93b3ff225624f5a0e95aee0ee54

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