Code Monkey home page Code Monkey logo

odoo-brazil-eletronic-documents's People

Contributors

bertozo avatar crsilveira avatar danimaribeiro avatar leorochael avatar lepri avatar lfdivino avatar mackilem avatar mbcosta avatar mileo avatar mstuttgart avatar renatonlima avatar rvalyi avatar sadamo avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

odoo-brazil-eletronic-documents's Issues

Exportação TXT

Atualização da rotina de exportação do TXT e/ou
substituição da rotina pela do PySPED;

Faturamento recorrente de serviços

Me parece que o fluxo atual não está permitindo a configuração de um faturamento recorrente de serviço. Um contrato com faturamento mensal cria um documento de Nota Fiscal eletrônica automáticamente.

Impressão do danfe na tela de MD-e

Melhorar aquele metodo que imprime o danfe, la no MD-e eh legal poder imprimir o xml que veio, só que o metodo aceita só uma invoice, teria que abstrair e receber o xml.

Erro no cancelamento de NFe

Teste realizado em ambiente de homologação.
Versão do Odoo: 8.0
Localização Brasil - > Cancelar documento fiscal ->Selecionado fatura e preenchido justificativa.
O seguinte erro é apresentado:

Traceback (most recent call last):
File "/opt/odoo/openerp/http.py", line 543, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/opt/odoo/openerp/http.py", line 580, in dispatch
result = self._call_function(*_self.params)
File "/opt/odoo/openerp/http.py", line 316, in _call_function
return checked_call(self.db, *args, *_kwargs)
File "/opt/odoo/openerp/service/model.py", line 118, in wrapper
return f(dbname, _args, *_kwargs)
File "/opt/odoo/openerp/http.py", line 313, in checked_call
return self.endpoint(_a, *_kw)
File "/opt/odoo/openerp/http.py", line 809, in call
return self.method(_args, *_kw)
File "/opt/odoo/openerp/http.py", line 409, in response_wrap
response = f(_args, *_kw)
File "/opt/odoo/addons/web/controllers/main.py", line 948, in call_button
action = self._call_kw(model, method, args, {})
File "/opt/odoo/addons/web/controllers/main.py", line 936, in _call_kw
return getattr(request.registry.get(model), method)(request.cr, request.uid, _args, *_kwargs)
File "/opt/odoo/openerp/api.py", line 268, in wrapper
return old_api(self, _args, *_kwargs)
File "/opt/odoo/openerp/api.py", line 399, in old_api
result = method(recs, _args, *_kwargs)
File "/opt/odoo/br/odoo-brazil-eletronic-documents/nfe/models/l10n_br_account.py", line 142, in action_draft_done
record.invoice_id.id, 'invoice_cancel')
TypeError: trg_validate() takes exactly 5 arguments (3 given)

CONSULTA SEFAZ

ESTOU TENDO O SEGUINTE ERRO TODO PROCESSO DE IMPORTAÇÃO EXPORTAÇÃO TUDO OK
MAIS QUANDO FAÇO A CONSULTA ME GERA O ERRO ARQUIVO CERTIFICADO INEXISTENTE DA FIQUEI NA DUVIDA ESSE ARQUIVO TIPO CERTIFICADO A1 EXTENÇÃO P12 DEVE ESTA EM ALGUMA PASTA OU E SALVO NA DB? E MAIS UMA DUVIDA CASO ESSE CERTIFICADO FICA EM ALGUMA PASTA COM A LEITURA DO USUARIO SERIA SEGURO ???
SO PARA DEIXAR CLARO SOU DO ESTADO GO CONFIGUREI DIRETAMENTE NO XML.PY GO PORQUE ESTAVA PEGANDO SP POR PADRÃO!! ME AJUDA AI GALERA A ENTENDER MELHOR!!

File "/usr/local/lib/python2.7/dist-packages/PySPED-0.1.2-py2.7.egg/pysped/nfe/processador_nfe.py", line 1330, in consultar_cadastro
self._conectar_servico(WS_NFE_CONSULTA_CADASTRO, envio, resposta, 1)
File "/usr/local/lib/python2.7/dist-packages/PySPED-0.1.2-py2.7.egg/pysped/nfe/processador_nfe.py", line 300, in _conectar_servico
self.certificado.prepara_certificado_arquivo_pfx()
File "/usr/local/lib/python2.7/dist-packages/PySPED-0.1.2-py2.7.egg/pysped/xml_sped/certificado.py", line 81, in prepara_certificado_arquivo_pfx
pkcs12 = crypto.load_pkcs12(open(self.arquivo, 'rb').read(), self.senha)
IOError: [Errno 2] No such file or directory: u''

Erro UnicodeDecode ao executar Manifesto destinatário

Recentemente percebi que uma de nossas instâncias não estava executando adequadamente o manifesto destinatário. Observando o log vejo o seguinte erro repetido a cada hora ou na execução manual do MDE.

2015-07-31 20:01:11,976 8740 ERROR VM_TECH openerp.addons.nfe_mde.nfe_schedule: 'ascii' codec can't decode byte 0xc3 in position 2687: ordinal not in range(128)
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/openerp/addons/nfe_mde/nfe_schedule.py", line 40, in schedule_download
nfe_result = distribuicao_nfe(company, company.last_nsu_nfe)
File "/usr/lib/python2.7/dist-packages/openerp/addons/nfe_mde/service/mde.py", line 77, in distribuicao_nfe
arq.write(orig_file_cont.encode('utf-8'))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 2687: ordinal not in range(128)

Nome dos arquivos da NFe anexados

Ao enviar os arquivos da NFe, xml e pdf, para o cliente, o nome dos arquivos estão vindo sendo enviado apenas com as extensões no nome.

Por exemplo: o PDF está sendo enviado como .pdf e o XML está sendo enviado como .xml e não com o nome da chave da NFe + a extensão

Vencimentos (Duplicatas) na NF-e

As parcelas são geradas baseadas nas Condições de Pagamentos na hora de confirmar a Fatura, correto?

Ao confirmar a Fatura também é gerado o xml a ser exportado...

Após uma fatura confirmada que necessite alterar vencimentos conforme ordem de compra do cliente ou datas específicas as alterações não são válidas no envio da NF-e, pois o XML foi gerado já na confirmação da Fatura.

Tudo bem..
Podemos criar a condição de pagamento correta, mas imagina o faturamento ter que criar as condições de pagamentos para cada situação e a infinidade de condições de pagamentos criadas.
Ex.:
Emissão do pedido (Ordem de Compra e Cond. Pagamento 28-56-84 DD)
Pedido Gerado com as datas de vencimentos corretas
A Nota será emitida na entrega daqui 7 Dias, porém as datas de vencimento devem corresponder as Datas da OC do Cliente .

memory leak?

Ola pessoal

Temos um cliente que esta lancando centenas de notas hoje ele usa so a parte de criar NFe's e transmitir elas nesse tempo. A cada duas horas ou algo assim, o servidor cai, parece que ele esta aumentando o consumo da memoria RAM sempre. Provavelemte o processo ultrapassa o que ele pode alcancar.

Tou perguntando aqui se alguem ja viu algo assim porque e o unico projeto que temos onde acontece isso e acontece que o ERP so esta usando o pysped massivamente hoje.

A gente vai resolver o problema la com supervisao, mas seria interessante saber:
alguem ja observou algum memory leak nessa parte da transmissao das notas com o pysped?

Como esta usando algumas bibliotecas com extencoes em C por tras esse tipo de problema nao seria impossivel...

AttributeError: 'NFe200' object has no attribute 'import_edoc'

Erro quando clico em Importar :
openerp.addons.nfe_import.wizard.l10n_br_account_invoice_import: 'NFe200' object has no attribute 'import_edoc'
Traceback (most recent call last):
File "/opt/OCB/addons/nfe_import/wizard/l10n_br_account_invoice_import.py", line 80, in import_edoc
eDoc = edoc_obj.import_edoc(
AttributeError: 'NFe200' object has no attribute 'import_edoc'

create 9.0 branch

this can wait the 9.0 branch creation in upstream l10n-brazil however

Cancelar pedido

Após cancelar uma NF na receita não é possível cancelar o pedido. Necessito realizar este cancelamento, porém o estado da invoice cancelada é sefaz_cancelled e não há nenhuma atividade com este nome e nenhuma transição para este estado.

No momento em que a NF é cancelada existe uma função que insere automaticamente o estado da invoice para sefaz_cancelled. O correto seria por meio do workflow.

Implementar um model para Processo?

@danimaribeiro @renatonlima

Será que seria interessante implementar um model para o Processo de transmissão da NF-E, determinar um estado para os mesmos e associar os eventos a eles?

a) Trabalhar os aquivos do PYSPED manualmente seja no filestore ou no database?
b) Classificar os arquivos por secundários e importantes para questões fiscais ( armazenar por 5 anos..);
c) etc?

Corrigir build

-- Passar no lint_check
-- Ajeitar .travis.yml para instalar dependencias da nf-e

Erro ao Consultar o Sefaz

nfe/nfe/res_partner.py", line 45, in sefaz_check
validate_nfe_configuration(company)
File "/opt/odoo/nfe/nfe/sped/nfe/validator/config_check.py", line 56, in validate_nfe_configuration
if not company.nfe_version:
AttributeError: 'int' object has no attribute 'nfe_version'

Problemas no envio gerados pelo Logo

Ao tentar realizar o envio da NFE as exceções de manipulação da imagem do logo geram o estado "Erro de autorização da Receita" sem explicações. No log é possível perceber a origem.

Encontrado no envio sem logotipo configurado e com imagem de logotipo que possui canal alpha.

Cadastro de terceiros / Consultar cadastro SEFAZ

Boa Tarde,

Após o cadastro do cliente (testei um do RS e outro de SC) tentei usar o botão (Consultar cadastro SEFAZ) e apresentou o seguinte erro, abaixo:

Server Traceback (most recent call last):
File "/opt/openerp/web/addons/web/session.py", line 89, in send
return openerp.netsvc.dispatch_rpc(service_name, method, args)
File "/opt/openerp/server/openerp/netsvc.py", line 296, in dispatch_rpc
result = ExportService.getService(service_name).dispatch(method, params)
File "/opt/openerp/server/openerp/service/web_services.py", line 626, in dispatch
res = fn(db, uid, _params)
File "/opt/openerp/server/openerp/osv/osv.py", line 190, in execute_kw
return self.execute(db, uid, obj, method, *args, *_kw or {})
File "/opt/openerp/server/openerp/osv/osv.py", line 132, in wrapper
return f(self, dbname, _args, *_kwargs)
File "/opt/openerp/server/openerp/osv/osv.py", line 199, in execute
res = self.execute_cr(cr, uid, obj, method, _args, *_kw)
File "/opt/openerp/server/openerp/osv/osv.py", line 187, in execute_cr
return getattr(object, method)(cr, uid, _args, *_kw)
File "/opt/openerp/nfe/nfe/res_partner.py", line 50, in sefaz_check
processo = check_partner(company, cnpj_cpf, estato, ie)
File "/opt/openerp/nfe/nfe/sped/nfe/processing/xml.py", line 66, in check_partner
return p.consultar_cadastro(estado, ie, cnpj_cpf)
File "/usr/local/lib/python2.7/dist-packages/pysped/nfe/processador_nfe.py", line 1317, in consultar_cadastro
self._conectar_servico(WS_NFE_CONSULTA_CADASTRO, envio, resposta, 1)
File "/usr/local/lib/python2.7/dist-packages/pysped/nfe/processador_nfe.py", line 212, in _conectar_servico
if type(webservices_2.ESTADO_WS[self.estado][ambiente][servico]) == dict:
KeyError: 6

Erro ao Enviar email NFe

File "/opt/odoo8.1/nfe/nfe_attach/account_invoice.py", line 204, in generate_email_batch
fields,
File "/opt/odoo8.1/odoo/openerp/api.py", line 268, in wrapper
return old_api(self, _args, *_kwargs)
File "/opt/odoo8.1/odoo/openerp/api.py", line 371, in old_api
recs = self.browse(cr, uid, [], context)
File "/opt/odoo8.1/odoo/openerp/api.py", line 268, in wrapper
return old_api(self, _args, *_kwargs)
File "/opt/odoo8.1/odoo/openerp/models.py", line 5266, in browse
return self._browse(Environment(cr, uid, context or {}), ids)
File "/opt/odoo8.1/odoo/openerp/api.py", line 769, in new
self.cr, self.uid, self.context = self.args = (cr, uid, frozendict(context))
ValueError: dictionary update sequence element #0 has length 7; 2 is required

Testes unitários

Criação de testes unitários pelo menos no método de envio que é o mais critico e cancelamento.
Qualquer teste unitário é bem vindo.

Variantes de Produto na NF-e

Boa noite amigos, primeiramente quero parabenizar a todos os colaboradores do OpenERP/Odoo pelo excelente trabalho realizado nos módulos brasileiros.
Minha dificuldade hoje, é em relação ao campo descrição do produto da NF-e:
Só é obtido a informação do modelo de produto, sem as variantes. Ex.: Se tenho o produto "Camisa Exemplo" de tamanhos "P, M e G" e cores "Vermelho e Amarelo", na NF só sai a informação "Camisa Exemplo", quando o recomendado seria "Camisa Exemplo,M, Amarelo".
Não sei estou certo, mas acredito que deva alterar o valor da "xProd.valor". Onde poderia realizar essa alteração?
Desde já agradeço a todos.

Problemas ao Cancelar uma NFe no status sefaz_exception

Ao tentar cancelar uma nota que tenha dado erro na transmissão é chamada a função de cancelamento da Sefaz eu dei uma olhada https://github.com/odoo-brazil/odoo-brazil-eletronic-documents/blob/8.0/nfe/account_invoice.py#L223 ele compara se o campo nfe_status esta em branco, só que este campo esta com a string ' - ', por isso que a função chama o cancelamento da sefaz.

@mileo @danimaribeiro

Se ainda não foi corrido isso eu posso subir a correção do campo nfe_status, mas uma sugestão, não seria melhor ao invés de conferir o campo do protocolo ao invés do nfe_status?

Versão 9

Prezados boa noite.
Existe já o desenvolvimento deste módulos para versão 9 do Odoo ?
Posso ajudar?
Atenciosamente,
Higor

Tela "Cancelar Documento Eletrônico" sem opção de criar novos registros diretamente

Olá pessoal. Gostaria de sugerir a seguinte modificação:

  • Deixar a tela Localização Brazil->Fiscal->Cancelar Documento Eletrônico sem a possibilidade de criar novos registros, de maneira semelhante a tela Localização Brazil->Fiscal->Carta de Correção deixando ambos apenas para gerenciamento dos eventos relacionados a NFe.

Deste modo, assim como ocorre com a carta, o cancelamento seria realizado apenas na view da fatura. Isso diminuiria o custo de manter o cancelamento por duas vias diferentes (view da NFe e view Cancelar Documento Fiscal) e que funcionam da mesma maneira (uma nota por vez). Cancelar uma nota através da view de "Cancelar Documento Fiscal" não apresenta muitas vantagens, uma vez que você tem de selecionar a fatura pelo nome (abrindo possibilidades para erro) e permite apenas o cancelamento de uma fatura por vez (igual ao que seria realizando pela view da NFe). O cancelamento pela NFe se torna mais prático já que você tem todos os dados da fatura na tela para conferir antes de cancelá-la.

O que vocês acham? Por gentileza, me avisem caso tenha deixado escapar algum dado importante de uso do Cancelar Documento Fiscal.

@alexsandrohaag

Corrige problemas como o relatado em: #101

Erro ao criar nota fiscal

O traceback é:

Odoo Server Error
Traceback (most recent call last):
File "/opt/odoo/openerp/http.py", line 537, in _handle_exception
return super(JsonRequest, self)._handle_exception(exception)
File "/opt/odoo/openerp/http.py", line 574, in dispatch
result = self._call_function(*_self.params)
File "/opt/odoo/openerp/http.py", line 310, in _call_function
return checked_call(self.db, *args, *_kwargs)
File "/opt/odoo/openerp/service/model.py", line 118, in wrapper
return f(dbname, _args, *_kwargs)
File "/opt/odoo/openerp/http.py", line 307, in checked_call
return self.endpoint(_a, *_kw)
File "/opt/odoo/openerp/http.py", line 803, in call
return self.method(_args, *_kw)
File "/opt/odoo/openerp/http.py", line 403, in response_wrap
response = f(_args, *_kw)
File "/opt/odoo/addons/web/controllers/main.py", line 948, in call_button
action = self._call_kw(model, method, args, {})
File "/opt/odoo/addons/web/controllers/main.py", line 936, in _call_kw
return getattr(request.registry.get(model), method)(request.cr, request.uid, _args, *_kwargs)
File "/opt/odoo/openerp/api.py", line 268, in wrapper
return old_api(self, _args, *_kwargs)
File "/opt/odoo/addons/sale/wizard/sale_make_invoice_advance.py", line 176, in create_invoices
res = sale_obj.manual_invoice(cr, uid, sale_ids, context)
File "/opt/odoo/openerp/api.py", line 268, in wrapper
return old_api(self, _args, *_kwargs)
File "/opt/odoo/addons/sale/sale.py", line 463, in manual_invoice
self.signal_workflow(cr, uid, ids, 'manual_invoice')
File "/opt/odoo/openerp/api.py", line 268, in wrapper
return old_api(self, _args, *_kwargs)
File "/opt/odoo/openerp/models.py", line 3571, in signal_workflow
result[res_id] = workflow.trg_validate(uid, self._name, res_id, signal, cr)
File "/opt/odoo/openerp/workflow/init.py", line 85, in trg_validate
return WorkflowService.new(cr, uid, res_type, res_id).validate(signal)
File "/opt/odoo/openerp/workflow/service.py", line 91, in validate
res2 = wi.validate(signal)
File "/opt/odoo/openerp/workflow/instance.py", line 80, in validate
wi.process(signal=signal, force_running=force_running, stack=stack)
File "/opt/odoo/openerp/workflow/workitem.py", line 120, in process
ok = self._split_test(activity['split_mode'], signal, stack)
File "/opt/odoo/openerp/workflow/workitem.py", line 248, in _split_test
self._join_test(t[0], t[1], stack)
File "/opt/odoo/openerp/workflow/workitem.py", line 257, in _join_test
WorkflowItem.create(self.session, self.record, activity, inst_id, stack=stack)
File "/opt/odoo/openerp/workflow/workitem.py", line 95, in create
workflow_item.process(stack=stack)
File "/opt/odoo/openerp/workflow/workitem.py", line 116, in process
if not self._execute(activity, stack):
File "/opt/odoo/openerp/workflow/workitem.py", line 187, in _execute
id_new = self.wkf_expr_execute(activity)
File "/opt/odoo/openerp/workflow/workitem.py", line 313, in wkf_expr_execute
return self.wkf_expr_eval_expr(activity['action'])
File "/opt/odoo/openerp/workflow/workitem.py", line 291, in wkf_expr_eval_expr
result = eval(line, env, nocopy=True)
File "/opt/odoo/openerp/tools/safe_eval.py", line 314, in safe_eval
return eval(c, globals_dict, locals_dict)
File "", line 1, in
File "/opt/odoo/openerp/api.py", line 266, in wrapper
return new_api(self, _args, *_kwargs)
File "/opt/odoo/openerp/api.py", line 592, in new_api
result = method(self._model, cr, uid, self.ids, _args, *_old_kwargs)
File "/opt/odoo/addons/sale_stock/sale_stock.py", line 143, in action_invoice_create
res = super(sale_order,self).action_invoice_create(cr, uid, ids, grouped=grouped, states=states, date_invoice = date_invoice, context=context)
File "/opt/odoo/openerp/api.py", line 268, in wrapper
return old_api(self, _args, *_kwargs)
File "/opt/odoo/addons/sale/sale.py", line 542, in action_invoice_create
created_lines = obj_sale_order_line.invoice_line_create(cr, uid, lines)
File "/opt/odoo/openerp/api.py", line 268, in wrapper
return old_api(self, _args, *_kwargs)
File "/opt/odoo/addons/sale/sale.py", line 1033, in invoice_line_create
vals = self._prepare_order_line_invoice_line(cr, uid, line, False, context)
File "/opt/odoo/openerp/api.py", line 268, in wrapper
return old_api(self, _args, *_kwargs)
File "/opt/odoo/localizacao/l10n-brazil/l10n_br_sale_product/sale.py", line 361, in _prepare_order_line_invoice_line
cr, uid, line, result, account_id, context)
File "/opt/odoo/openerp/api.py", line 268, in wrapper
return old_api(self, _args, *_kwargs)
File "/opt/odoo/localizacao/l10n-brazil/l10n_br_sale_product/sale.py", line 371, in l10n_br_sale_product_prepare_order_line_invoice_line
result['cfop_id'] = fp_id.cfop_id.id
ValueError: "'int' object has no attribute 'cfop_id'" while evaluating
u'action_invoice_create()'

Para reproduzi-lo:

Criar um Pedido de Venda -> Confirmar -> Criar Nota Fiscal -> Criar Nota Fiscal

Alguém sabe como resolver ?

Criação do branch 10.0

Estaremos migrando os módulos nfe e nfe_attach pelo que gostariamos de fazer os PRs para o branch 10.0.

Também gostaria de saber se têm intenções de passar este repositório para a OCA.

Obrigado!

Adequação a Nota Técnica 2015/003

Esta Nota Técnica altera o leiaute da NF-e para receber a informação do ICMS devido para a UF
do destinatário, nas operações interestaduais de venda para consumidor final, atendendo as
definições da Emenda Constitucional 87/15.
Também visa atender à necessidade de identificar o Código Especificador da Substituição Tributária
– CEST, para permitir o controle da Substituição Tributária conforme condições previstas na Lei
Complementar 147 de 2014.
O prazo previsto para a implementação das mudanças, em atendimento à Emenda Constitucional
nº 87 de 2015, é:

  • Ambiente de Homologação (ambiente de teste das empresas): 01/10/15;
  • Ambiente de Produção: 03/11/15.

Melhoria no salvar dos xml

Como no Odoo 8 tem a possibilidade de salvar os anexos tanto no banco de dados, quanto na filestore, e estes podem ser facilmente restaurados apartir de um backup, seria legal que o módulo de nf-e utilizasse apenas esta forma para salvar os xml enviados e recebidos.

Como sugestão poderia se remover as propriedades de pasta exportação, importação, e utlizar apenas anexos nos documentos correspondentes.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.