sábado, 9 de dezembro de 2017

Error: cannot call methods on autocomplete prior to initialization; attempted to call method 'widget'

Error: cannot call methods on autocomplete prior to initialization; attempted to call method 'widget'

Tinha criado um campo para calcular o total de Lançamentos e este campo estava gerando este erro :

update_price_count = fields.Integer(compute='_compute_update_price', string='Definir Preços', default=0)

Retirei este campo e tudo voltou ao normal

sexta-feira, 17 de fevereiro de 2017

Uncaught Error: QWeb2: Template 'mail.chat.MessagingMenu' not found - Odoo not show menu

http://200.98.136.149:49069/web/content/538-8e2bebe/web.assets_common.js:2908
Traceback:
Error: QWeb2: Template 'mail.chat.MessagingMenu' not found
at Object.QWeb2.tools.exception (http://200.98.136.149:49069/web/content/538-8e2bebe/web.assets_common.js:2908:7)
at Engine.QWeb2.Engine.QWeb2.tools.extend._render (http://200.98.136.149:49069/web/content/538-8e2bebe/web.assets_common.js:2952:103)
at Engine.QWeb2.Engine.QWeb2.tools.extend.render (http://200.98.136.149:49069/web/content/538-8e2bebe/web.assets_common.js:2948:151)
at OdooClass.core.Class.extend.renderElement (http://200.98.136.149:49069/web/content/538-8e2bebe/web.assets_common.js:3112:1073)
at http://200.98.136.149:49069/web/content/538-8e2bebe/web.assets_common.js:3112:917
at http://200.98.136.149:49069/web/content/538-8e2bebe/web.assets_common.js:547:681
at fire (http://200.98.136.149:49069/web/content/538-8e2bebe/web.assets_common.js:541:299)
at Object.self.add [as done] (http://200.98.136.149:49069/web/content/538-8e2bebe/web.assets_common.js:542:467)
at Array. (http://200.98.136.149:49069/web/content/538-8e2bebe/web.assets_common.js:547:649)
at Function.jQuery.extend.each (http://200.98.136.149:49069/web/content/538-8e2bebe/web.assets_common.js:370:767)

Isto acontece porque o User do bd não é o informado no odoo:

psql: \l
databasex | postgres | UTF8 | en_US.UTF-8 | en_US.UTF-8 |

ALTER DATABASE datasex OWNER TO odoo;

quarta-feira, 23 de novembro de 2016

return compile(source, filename, mode, PyCF_ONLY_AST) File "", line 0 SyntaxError: unexpected EOF while parsing

File "/usr/lib/python2.7/ast.py", line 37, in parse

return compile(source, filename, mode, PyCF_ONLY_AST)

File "", line 0


^

SyntaxError: unexpected EOF while parsing



Solução para isto :


Coloquei no arquivo /home/publico/desenv/odoo/odoo10/OCB/odoo/http.py

(../odoo10/OCB/odoo/http.py", line 1321, in load_addons)


#um print na linha 1320

¦ if manifest_path and os.path.isdir(path_static):

¦ ¦ print manifest_path # AQUI


para descobrir onde era meu problema:

br_sale/__manifest__.py # estava vazio este arquivo, e este módulo já estava instalado, eu me atrapalhei com o git




quinta-feira, 10 de março de 2016

Você não pode cancelar uma linha do pedido de vendas que já foi faturado.

Para pedidos que por algum motivo não gerou a fatura, para Cancelar e Excluir, e necessário , limpar o campo invoiced na tabela sale_order_line :

select invoiced from sale_order_line where create_date > '2016-03-09 23:00:00';

update sale_order_line set invoiced = null where  order_id = 7603;

fazendo isso , é só cancelar e excluir o pedido.

terça-feira, 23 de fevereiro de 2016

urllib2: urlopen error _ssl.c:320: Invalid SSL protocol variant specified.


 urllib2.URLError: <urlopen error _ssl.c:320: Invalid SSL protocol variant specified.>

  File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 521, in __call__
    return client.invoke(args, kwargs)
  File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 761, in invoke
    return self.send(_parse(msg))
  File "/usr/local/lib/python2.7/dist-packages/suds/client.py", line 613, in send
    reply = self.options.transport.send(request)
  File "/usr/local/lib/python2.7/dist-packages/suds/transport/http.py", line 82, in send
    fp = self.u2open(u2request)
  File "http_conultaCnpj.py", line 224, in u2open
    return url.open(u2request, timeout=tm)
  File "/usr/lib/python2.7/urllib2.py", line 404, in open
    response = self._open(req, data)
  File "/usr/lib/python2.7/urllib2.py", line 422, in _open
    '_open', req)
  File "/usr/lib/python2.7/urllib2.py", line 382, in _call_chain
    result = func(*args)
  File "http_conultaCnpj.py", line 196, in https_open
    return self.do_open(self.getConnection, req)
  File "/usr/lib/python2.7/urllib2.py", line 1184, in do_open
    raise URLError(err)
urllib2.URLError: <urlopen error _ssl.c:320: Invalid SSL protocol variant specified.>
Exception AttributeError: "'NoneType' object has no attribute 'path'" in <function _remove at 0x7f0020003668> ignored

Este erro acontece, devido a isto:

     self._finalizar_cripto()

    def _finalizar_cripto(self):
        xmlsec.cryptoShutdown()
        xmlsec.cryptoAppShutdown()
        xmlsec.shutdown()

        libxml2.cleanupParser()

quinta-feira, 4 de fevereiro de 2016

Odoo - Inativar o Contato ao Inativar a empresa principal - onchange

@api.onchange('active')                                                     
     def active_partner(self):                                                   
         if not self.active:                                                     
             for child in self.child_ids:                                        
                 child.write({'active': False })                                 
         return {'value' : {}, }

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 &gt; 0 and rownum &lt; 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) &gt; 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 &gt; 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

    quarta-feira, 12 de junho de 2013

    Ler arquivo csv Openerp + python

    Adaptei do modulo ea_import.

        def import_to_db(self, cr, uid, ids, context={}):
            context['result_ids'] = []
            result_pool = self.pool.get('ea_import.chain.result')
            for chain in self.browse(cr, uid, ids, context=context):
                csv_reader=unicode_csv_reader(StringIO(base64.b64decode(chain.input_file)),delimiter=str(";"),quoting=(not
    chain.delimiter and csv.QUOTE_NONE) or csv.QUOTE_MINIMAL,quotechar=chain.delimiter and str("'") or None, charset=chain.charset)

                if chain.header:
                    csv_reader.next()
                result_ids = {}

                #return res
                csv_reader.next()
                for row in csv_reader:
                    if len(row)>0:

                        print row[2], row[-2], row[-1]

    quinta-feira, 9 de maio de 2013

    Cálculo de Horas - Openerp - Python

        def onchange_hours_out(self, cr, uid, ids, hours_out=0.0, hours_in=0.0, datex=None, datex_out=None):
            #pdb.set_trace(),
            dataEnt = date(*time.strptime(datex,'%Y-%m-%d')[:3])
            dataSai = date(*time.strptime(datex_out,'%Y-%m-%d')[:3])
            diferencaDias =((dataSai-dataEnt).days*24),
            return {'value':{'hours': ((hours_out - hours_in)+diferencaDias[0])}}




                         hi = time.strptime('09:30', '%H:%M')
                        hit = float(time.strftime('%H', hi)) + (float(time.strftime('%M',hi))/60)
                        ho = time.strptime('16:15', '%H:%M')
                        hot = float(time.strftime('%H', ho)) + (float(time.strftime('%M',ho))/60)

                        dte = date(*time.strptime(str('20/03/13'),'%d/%m/%y')[:3])
                        dts = date(*time.strptime(str('20/03/13'),'%d/%m/%y')[:3])
                        diferencaDias =((dts-dte).days*24)
                        ht = diferencaDias + (hot - hit)

    terça-feira, 7 de maio de 2013

    Uncaught Error: NameError: name 'project_id' is not defined

    OpenERP Client error
    Uncaught Error: NameError: name 'project_id' is not defined


    • step 1. go to menu(more->setting->Technical->user interface->view
    • step 2. look for "phase.task.search.form" , click Form view
    • step 3. click Edit , em seguida,
        <field name="phase_id"/>
        then add domain="[]" de modo a se tornar 
        <field name="phase_id" domain="[]"/>
      
    • step 4. click save and you error should by now solve.


      copiado de : http://help.openerp.com/question/5762/uncaught-error-in-project-task-page-search-bar/

    sexta-feira, 8 de março de 2013

    Openerp - Regra para que o usuário veja somente seus clientes

    Objeto : Parceiro

    Regra :  ['|',('user_id','=',False),('user_id','=',user.id)]

    Problema : Vera tbém todos os clientes que não tenha um Representante cadastrado.

    quinta-feira, 31 de janeiro de 2013

    Openerp + Report-Designer (Pentaho)

    Baixar :
       https://github.com/WillowIT/Pentaho-reports-for-OpenERP  (pegue a versão compativel com o openerp, tem uma versão para o 6.1 e para o 7.0)
       http://sourceforge.net/projects/jfreereport/files/04.%20Report%20Designer/3.9.0-stable/

    Instalação do report-designer no openerp:

      Building the Java component
         cd /java_server
         ant war

      If the build completed successfully, the WAR file can be found
        in the build/jar directory.
     
        For testing purposes, a standalone server that listens on port
        8090 (by default) can be launched using the "launch" target:
     
          colocando para rodar o servidor do report-designer    
          $ ant launch



    Configurando o Rel. no Openerp :




    segunda-feira, 5 de novembro de 2012

    Formatação decimal e milhar no OpenErp

    Em Configurações -> Traduções -> Idioma :

    Configure:    Formato do separador = [3,2,-1]    (Para exibir 999.999,22)




    Na versão 7 é possível configurar números de casas decimais  separado :

    Configurações -> Estrutura de Dados -> Precisão Decimal

    sábado, 15 de setembro de 2012

    Android com Python

    Instalar o Emulador android;

    Instalar no Emulado as apks:  PythonForAndroid e Sl4A;

    Comunicação da máquina real com o emulador através do adb :

        adb shell -> para ver o que tem no android; (ls para listar);

       adb pull arquivo_ou_pasta_desejada destino ;  remoto -> local

       adb push arquivo_ou_pasta_origem destino ; local -> remoto