quinta-feira, 4 de fevereiro de 2016

Como usar Certificado digital A1 com autenticação via suds python

Origem: http://preaks.weebly.com/bloggy/how-to-use-client-certificate-authentication-with-suds

Extraindo a chave do certificado:

openssl pkcs12 -nocerts -in ClientCert.p12 -out key.pem

Extraindo o certificado:

openssl pkcs12 -clcerts -nokeys -in ClientCert.p12 -out cert.pem

Removendo passphrase da chave:


openssl.exe rsa -in key.pem -out key_nopass.pem

 

TestaConexao.py

  import requests                                                      
  from suds.client import Client                                                 
  from suds.transport.http import HttpAuthenticated                              
  from suds.transport import Reply, TransportError                               
                                                                                   
                                                                                   
  class RequestsTransport(HttpAuthenticated):                                    
                                                                                   
      def __init__(self, **kwargs):                                              
          self.cert = kwargs.pop('cert', None)                                   
          HttpAuthenticated.__init__(self, **kwargs)                             
                                                                                  
      def send(self, request):                                                   
          self.addcredentials(request)                                           
          resp = requests.post(                                                  
              request.url,                                                       
              data=request.message,                                              
              headers=request.headers,                                           
              cert=self.cert,                                                    
              verify=True                                                        
          )                                                                      
          result = Reply(resp.status_code, resp.headers, resp.content)           
          return result                                                          
                                                                                  
 t = RequestsTransport(cert=('/opt/certificado/cert.pem',
                                '/opt/certificado/key.pem'))
 headers = {"Content-Type": "text/xml;charset=UTF-8", "SOAPAction": ""}         
 #import pudb;pu.db                                                              
 wsdl_url = 'https://nfe.prefeitura.sp.gov.br/ws/lotenfe.asmx?WSDL'             
 client = Client(wsdl_url, transport=t)


domingo, 15 de novembro de 2015

Inserindo dados de uma planilha no odoo

ea_import_client.py

from openerp import models, fields, api, _
from openerp.osv import osv
import base64
from openerp.tools.translate import _
from openerp.addons.l10n_br_base.tools import fiscal
import csv
from datetime import datetime, date
from cStringIO import StringIO
import tempfile
import time
import xlrd
import re

class ea_import_client(models.Model):

    _name = 'ea_import.client'
 
    name = fields.Char('Descrição', size=256, required=True)
    input_file = fields.Binary('Arquivo', required=False)
    user_id = fields.Many2one('res.users', 'Inserido por', track_visibility='onchange')
    header =  fields.Boolean('Header')
    state = fields.Selection(_TASK_STATE, 'Situacao', required=True,)

    _defaults = {
        'state': 'open',
        'user_id': lambda obj, cr, uid, context: uid,
        'name':'/',
    }

    def set_done(self, cr, uid, ids, context=None):
        return self.write(cr, uid, ids, {'state':'done'}, context=context)

    def set_open(self, cr, uid, ids, context=None):
        return self.write(cr, uid, ids, {'state':'open'}, context=context)

    def set_cancelled(self, cr, uid, ids, context=None):
        return self.write(cr, uid, ids, {'state':'cancelled'}, context=context)


    def import_to_xls(self, cr, uid, ids, context={}):
        client_id = 0
        client_obj = self.pool.get('res.partner')
        context['result_ids'] = []
        for chain in self.browse(cr, uid, ids, context=context):
            file_path = tempfile.gettempdir()+'/file.xls'
            data = chain.input_file
            f = open(file_path,'wb')
            f.write(data.decode('base64'))
            f.close()
            book = xlrd.open_workbook(file_path)
            first_sheet = book.sheet_by_index(0)
            parent_id = 0
            for rownum in range(first_sheet.nrows):              
                rowValues = first_sheet.row_values(rownum)
                if rownum > 0 and rownum < 1500:
                    anotacoes = ''
                    cobranca = {}
                    cnpj_cpf = rowValues[3]  
                    parent_id = 0

                    # TRATANDO DATA
                     if rowValues[122]:
                          data_1 = rowValues[122]
                          data_reajuste = datetime(*xlrd.xldate_as_tuple(data_1, book.datemode))

                    if cnpj_cpf == '000.000.000-00':
                        cnpj_cpf = ''

                    empresa = False
                    if len(cnpj_cpf) > 14:
                        empresa = True
        
                    if empresa:
                        if not fiscal.validate_cnpj(cnpj_cpf):
                            anotacoes = ' CNPJ Invalido : %s \n' %(cnpj_cpf)
                            cnpj_cpf = ''
                    else:
                        if not fiscal.validate_cpf(cnpj_cpf):
                            anotacoes = ' CPF Invalido : %s \n' %(cnpj_cpf)
                            cnpj_cpf = ''

                    if cnpj_cpf == '000.000.000.00':
                        cnpj_cpf = ''

                    codigo = int(rowValues[0])
                    nome = u'%s' %(rowValues[2])
                    legalname = u'%s' %(rowValues[1])
                    #+ '-' + str(rowValues[14]) + '-' + str(rowValues[15])
                    ie = str(rowValues[4])  
                    endereco = rowValues[8]  
                    numero = rowValues[9]  
                    bairro = rowValues[15]  
                    cidade = rowValues[16]
                    if rowValues[18]:
                        uf = rowValues[18]
                    else:
                        uf = 'SP'
                    anotacoes = anotacoes + rowValues[12]
                    complemento = rowValues[18]
                    cep = rowValues[20]
                    fone = rowValues[21]
                    fone1 = rowValues[22]
                    fone2 = rowValues[10]
                    recado = rowValues[30]
                    profissao = rowValues[21]
                    email = rowValues[47]

                    endereco_cob = rowValues[31]  
                    numero_cob = rowValues[57]  
                    bairro_cob = rowValues[32]  
                    cidade_cob = rowValues[35]
                    # buscar o codigo da cidade
                    uf_cob = rowValues[34]
                    # buscar o estado
                    cep_cob = rowValues[33]
                    emp_cob = rowValues[72]
                    dia_vencimento = rowValues[74]
                    
                    #import pudb;pudb.set_trace()
                    if endereco_cob != '' and  endereco_cob != endereco and numero_cob != numero:
                        # buscando a cidade
                        sql_req= """
                            SELECT p.id, p.name
                            FROM l10n_br_base_city p
                            WHERE
                            (UPPER(p.name) like '%s')
                            """ % (cidade_cob)
                        cr.execute(sql_req)
                        sql_res = cr.dictfetchone()
                        if sql_res:
                            cobranca['l10n_br_city_id'] = sql_res['id']
                        cobranca['street'] = endereco_cob
                        cobranca['number'] = numero_cob
                        cobranca['district'] = bairro_cob
                    
                        if uf_cob == 'SP':
                            state = 79
                        elif uf_cob == 'MG':
                            state = 76
                        elif uf_cob == 'RJ':
                            state = 78
                        elif uf_cob == 'PR':
                            state = 80
                        elif uf_cob == 'RS':
                            state = 82
                        cobranca['state_id'] = state
                        cobranca['name'] = 'End. Faturamento'
                        cobranca['use_parent_address'] = False
                        cobranca['type'] = 'invoice'

                    # verificando se o cnpj ja esta cadastrado
                    nome = nome.replace('\'',' ')
                    if nome == '':
                        nome = legalname
                    if nome == ',':
                        nome = legalname
                    sql_req= """
                        SELECT p.id, p.ref
                        FROM res_partner p
                        WHERE
                        ((p.cnpj_cpf = '%s')
                        or (p.name = '%s'))
                        and (p.ref = '%s')
                        """ % (cnpj_cpf, nome, str(int(codigo)))
                    cr.execute(sql_req)
                    sql_cnpj = cr.dictfetchone()
                    if sql_cnpj:
                        parent_id = sql_cnpj['id']
                        cod_ref = float(str(sql_cnpj['ref']))

                    if parent_id != 0 and sql_cnpj:
                        # limpo o cnpj pois, ja tem na empresa principal
                        cnpj_cpf = '' 
                        if int(codigo) == int(cod_ref):
                            continue # estou inserindo o contato

                    if sql_cnpj:
                       # já inserido
                        if parent_id != 0 and int(codigo) == int(cod_ref):
                            continue

                    print " codigo: %s , nome : %s " %(codigo, rowValues[0])
                    # buscando a cidade
                    n_cidade = ''
                    sql_req= """
                        SELECT p.id, p.name
                        FROM l10n_br_base_city p
                        WHERE
                        (UPPER(p.name) like '%s')
                        """ % (cidade)
                    cr.execute(sql_req)
                    sql_res = cr.dictfetchone()
                    if sql_res:
                        cidade = sql_res['id']
                        n_cidade = sql_res['name']
                    else:
                        #raise osv.except_osv(u'Erro importação',u'CIDADA NÃO ENCONTRADA : %s' %(cidade))
                        cidade = 0

                    if cidade:
                        if uf == 'SP':
                            state = 79
                        elif uf == 'MG':
                            state = 76
                        elif uf == 'RJ':
                            state = 78
                        elif uf == 'PR':
                            state = 80
                        elif uf == 'RS':
                            state = 82

                        vals = {'name': nome,
                              'is_company': empresa,
                              'legal_name': legalname,
                              'street': endereco,
                              'number': numero,
                              'district': bairro,
                              'country_id': 32,
                              'state_id': state,
                              'city': sql_res['name'],
                              'phone': fone,
                              'mobile': fone1,
                              'email': email,
                              'zip': cep,
                              'ref': str(codigo),
                              'comment': anotacoes,
                              'property_payment_term': vencimento,
                            }
                        #      'child_ids': cobranca,
                        if cidade != 0:
                            vals['l10n_br_ciy_id'] = cidade
                        if parent_id > 0:
                            vals['parent_id'] = parent_id
                            
                        if cnpj_cpf != '':
                            val = re.sub('[^0-9]', '', cnpj_cpf)
                            if len(val) == 14:
                                cnpj_cpf = "%s.%s.%s/%s-%s"\
                                    % (val[0:2], val[2:5], val[5:8], val[8:12], val[12:14])
                            elif len(val) == 11:
                                cnpj_cpf = "%s.%s.%s-%s"\
                                    % (val[0:3], val[3:6], val[6:9], val[9:11])
                            else:
                                raise Warning(_(u'Verifique o CNPJ/CPF'))
                            vals['cnpj_cpf'] = cnpj_cpf

                        if cep:
                            val = re.sub('[^0-9]', '', cep)
                            if len(val) == 8:
                                cep = "%s-%s" % (val[0:5], val[5:8])
                                vals['zip'] = cep

                        if ie:
                            if ie == 'ISENTA':
                                ie = 'ISENTO'
                            if uf == 'SP':
                                if not fiscal.validate_ie_sp(ie):
                                    anotacoes = anotacoes + '\n' + ' IE Invalido : %s \n' %(ie)
                                    ie = ''
                            if uf == 'MG':
                                if ie != 'ISENTO':
                                    # não descobri a causa mas quando passo o IE de MG com máscara
                                    # valida, mas quando vai incluir dá erro de IE inválido
                                    ie = re.sub('[^0-9]', '', ie)
                                if not fiscal.validate_ie_mg(ie):
                                    anotacoes = anotacoes + '\n' + ' IE Invalido : %s \n' %(ie)
                                    ie = ''
                            if uf == 'RS':
                            #    if not fiscal.validate_ie_rs(ie):
                                anotacoes = anotacoes + '\n' + ' IE RS: %s \n' %(ie)
                                ie = ''
                            if ie != '':
                                vals['inscr_est'] = ie
                        
                        print vals
                        #import pudb;pudb.set_trace()

                        client_id =  client_obj.create(cr, uid, vals, context=None)
                        cat = {'category_id': [(4,empresa_cob)]
                            }

                        client_obj.write(cr, uid, client_id, cat, context=context)

                        if cobranca:
                            cobranca_cad = {'child_ids':[(0,0,cobranca)]}
                            client_obj.write(cr, uid, client_id, cobranca_cad, context=context)
                            #vals['child_ids'] = cobranca

                        c_ids = client_obj.browse(cr, uid, [client_id], context=None)

                        if not c_ids.l10n_br_city_id and n_cidade:
                            city_obj = self.pool.get('l10n_br_base.city')
                            city_id = city_obj.search(cr, uid, [('name','=', n_cidade)], context=None)
                            if city_id:
                                client_obj.write(cr, uid, client_id, {'l10n_br_city_id': city_id[0]}, context=context)


        return client_id


ea_import_client_view.xml


<?xml version="1.0"?>
<openerp>
    <data>

        <record model="ir.ui.view" id="ea_import_client_tree">
            <field name="name">ea_import.client.tree</field>
            <field name="model">ea_import.client</field>
            <field name="type">tree</field>
            <field name="arch" type="xml">
                <tree string="Importar Clientes">
                    <field name="name"/>
                    <field name="input_file"/>
                    <field name="state"/>
                    <field name="user_id" colspan="2"/>
                </tree>
            </field>
        </record>

        <record model="ir.ui.view" id="ea_import_client_form">
            <field name="name">ea_import.client.form</field>
            <field name="model">ea_import.client</field>
            <field name="arch" type="xml">
                <form string="Importar Clientes" col="8">
                <group>
                    <label for="name" string="Planilha"/>
                    <field name="name" colspan="2"/>
                    <field name="input_file" colspan="2"/>
                    <field name="header" colspan="2" invisible="1"/>
                    <field name="user_id" colspan="2" invisible="1"/>
                    <button string="Import Data" type="object" name="import_to_db" icon="terp-stock_effects-object-colorize" colspan="2"/>
                    <field name="state" widget="statusbar" statusbar_visible="open,close" statusbar_colors='{"pending":"blue"}' readonly="1" />
                </group>
                <group>
                    <button name="set_done" string="Importado" type="object" states="open" groups="base.group_user"/>
                    <button name="set_open" string="Re-enviar" type="object" states="close,cancelled" groups="base.group_user"/>
                    <button name="set_cancelled" string="Cancelar" type="object" states="open" groups="base.group_user"/>
                </group>
                </form>
            </field>
        </record>

        <record model="ir.ui.view" id="ea_view_client_form">
            <field name="name">Import Client</field>
            <field name="model">ea_import.client</field>
            <field name="arch" type="xml">
                <form string="Importar Clientes" version="7.0">
                    <header>
                        <button name="set_done" string="Importado" type="object" states="open" groups="base.group_user" colspan="10"/>
                        <button name="set_open" string="Re-ativar" type="object" states="done,cancelled" groups="base.group_user" colspan="10"/>
                        <button name="set_cancelled" string="Suspender" type="object" states="open" groups="base.group_user"/>
                        <field name="state" widget="statusbar" statusbar_visible="open,done" statusbar_colors='{"pending":"blue"}' readonly="1" />
                    </header>
                    <sheet>
                        <field name="name" colspan="2"/>
                        <field name="input_file" colspan="2"/>
                        <field name="header" colspan="2" invisible="1"/>
                        <field name="user_id" colspan="2" invisible="1"/>
                        <button string="Importar Planilha" type="object" name="import_to_xls" icon="terp-stock_effects-object-colorize" colspan="2"/>
                        <button string="Criar Contratos" type="object" name="criar_contratos" icon="terp-stock_effects-object-colorize" colspan="2"/>
                    </sheet>
                </form>
            </field>
        </record>

        <record model="ir.actions.act_window" id="ea_import_client_action">
            <field name="name">Importar Clientes</field>
            <field name="res_model">ea_import.client</field>
            <field name="view_mode">tree,form</field>
            <field name="view_type">form</field>
            <field name="view_id" ref="ea_view_client_form"/>
     <field name="target">current</field>
        </record>      


  <menuitem name="Importar Clientes" id="ea_import_client_menu" parent="purchase.menu_purchase_config_purchase" action="ea_import_client_action"/>
    </data>
</openerp>

Inserindo registro Filho no odoo (res_partner : child_ids , category_id)


Inserindo o Cliente :

client_obj = self.pool.get('res.partner')

vals = {'name': 'Nome do Clisente',
             ...
           }

client_id =  client_obj.create(cr, uid, vals, context=None)

Inserindo Endereçõ de Cobrança :

cobranca = {}

cobranca['street'] = 'Rua X'
cobranca['number'] = '101'
cobranca['district'] = 'Centro'
cobranca['state_id'] = 32                                                                                                
cobranca['name'] = 'End. Faturamento'                                                                                          
cobranca['use_parent_address'] = False                                                                                          
cobranca['type'] = 'invoice'

cobranca_cad = {'child_ids':[(0,0,cobranca)]}                                                                              

client_obj.write(cr, uid, client_id, cobranca_cad, context=context)


Inserindo a Categoria :

empresa_cob = 1 --> Categoria cadastrada
cat = {'category_id': [(4,empresa_cob)]                                                                                        
}

client_obj.write(cr, uid, client_id, cat, context=context)

sábado, 27 de setembro de 2014

openerp.netsvc: 'NoneType' object has no attribute '_table'

Tentei atualizar um modulo e deu este erro, não consigo mais abrir o sistema, solução :

Volta todos os modulos para Status = installed :

update ir_module_module set state = 'installed' where state = 'to upgrade'


Dai é possível abrir o sistema, e ver o problema no modulo especificado.

No meu caso especifico, estava tentando atualizar um modulo : relatorio, que tinha um campo :
   'qualidade_id': fields.many2one('qualidade.doc', 'Documento',track_visibility='onchange',),

e o modulo qualidade não estava no addons;

quinta-feira, 11 de setembro de 2014

delphi acces violation


17/07/13 Delphi: Localizando erros de Access Violation

Seu aplicativo está gerando uma exceção não capturada e está exibindo uma mensagem de Access Violation e você quer identificar o local (arquivo, linha e código) onde o erro está ocorrendo? Eis o caminho:
  • Execute a aplicação [Run], entre no modo de depuração [Pause], vá em [Search] e em seguida em [Goto Address]
  • Entre com o endereço mostrado na mensagem [Ex: $00407E50 - note que você deve adicionar o sinal de $] e faça a busca – se encontrado, o endereço será selecionado automaticamente na aba CPU.
  • Adicione um Breakpoint no endereço recém encontrado [CTRL + B]
  • Execute a aplicação novamente.
  • Quando o Breakpoint for encontrado a aplicação será pausada, nesse momento você então poderá verificar o Caller [CTRL + L]  – onde poderá visualizar a origem da chamada [arquivo, linha e código executado].
Fica aí a dica!

Fonte:  http://www.uebbi.com/delphi-localizando-erros-de-access-violation/

quarta-feira, 2 de julho de 2014

Odoo - View



  • from openerp.osv import fields,osv
    from openerp import tools
           
     class x_pttstl_report_parent(osv.osv):
        _name = "x_pttstl_report_parent"
        _description = "tree map"
        _auto = False
        _columns = {
            'tuyennr_parent': fields.char('parent', size=128, readonly=True),
            'tendd': fields.char('child', size=128, readonly=True),
           }
        _order = 'tuyennr_parent,tendd'
        def init(self, cr):
            tools.drop_view_if_exists(cr, 'x_pttstl_report_parent')
            cr.execute(""" create or replace view x_pttstl_report_parent AS (
                   select 
                       nrprt.id as id,
                       nrprt.x_tendd_tuyennr_parent as tuyennr_parent,
                       nr.x_tendd as tendd
                    from 
                        x_pttstl_tuyennr nr
                    join 
                        x_pttstl_tuyennr_parent nrprt on (nrprt.id = nr.x_tuyennr_tuyennr_parent_id)
                    group by 
                        nrprt.id,tendd_tuyennr_parent,tendd
                        )
            """)
     
    x_pttstl_report_parent()
     
      model="ir.ui.view" id="x_pttstl_report_parent_tree_view">
         name="name">x_pttstl_report_parent.tree
  • > name="model">x_pttstl_report_parent> name="arch" type="xml"> string="Tree map" version="7.0"> name="tuyennr_parent"/> name="tendd"/> > > >   model="ir.ui.view" id="x_pttstl_report_parent_form_view"> name="name">x_pttstl_report_parent.form> name="model">x_pttstl_report_parent> name="arch" type="xml"> string="So do cay" version="7.0"> name="tuyennr_parent"/> name="tendd"/> > > >
     
      model="ir.actions.act_window" id="action_pttstl_report_parent">
      name="name">Tree map
    > name="res_model">x_pttstl_report_parent> >
     
      name="Map" parent="pttstl_menu" id="vanhanh_menu"/>   
     name="Tree" parent="vanhanh_menu" id="tree_menu" action="action_pttstl_report_parent"/>
     
     
    Fonte:   http://sajjadhossain.com/2013/06/30/openerp-7-creating-report-using-sql-query/

    quarta-feira, 18 de dezembro de 2013

    Odoo - Mensagens :

    - Não existe estabelecimento padrão para a empresa do usuário atual
      Configurações -> Usuarios -> "User" -> Permissão de Acesso  :
            Listas de Preço de Venda = Sim
            Gerenciar Múltiplos Locais e Armazéns = Sim
      Vendas -> Configurações -> Estabelecimento

    - Error Validating - Emitente/Endereço - Código do BC
                                    Emitente/Endereço - Código do BC 
       Vendas -> Configurações -> Agenda de Endereços -> Localização -> Países  
      

    - ValidateError - Conta e Período devem pertencer a mesma empresa
         Vendas -> Clientes -> Editar -> Contabilidade -> Conta de Recebimento (informar uma conta da Empresa)

    - There is no journal : Configurações -> Tecnicos -> Sequencias e Identi.. -> Sequencia