def __call_transaction(sap_session, transaction, window_id=sapgui.GUI_MAIN_WINDOW, check_error=True): tcode = TRANSACTION_PREFIX + transaction SAPGuiElements.set_text( sap_session, TRANSACTION_TEXT_FIELD.format(window=window_id), tcode) SAPGuiElements.press_keyboard_keys(sap_session, "Enter") if not check_error: return gui_msg = SAPGuiElements.get_status_message(sap_session) if gui_msg: if gui_msg[1] == "343": msg = "Wrong transaction name '{0}'. GUI Message: {1}".format( transaction, gui_msg[2]) raise ValueError(msg) elif gui_msg[1] == "077": msg = "Not authorized to execute '{0}' transaction. GUI Message: {1}".format( transaction, gui_msg[2]) raise PermissionError(msg) elif gui_msg[1] == "410": msg = "Blocked action in '{0}' transaction. GUI Message: {1}".format( transaction, gui_msg[2]) raise PermissionError(msg)
def __inserir_remessas(sap_session, remessas): try: SAPGuiElements.press_button(sap_session, ELEMENTO_BOTAO_ADICIONAR_REMESSAS) remover_a = remessas[0].itens[0].produto.remover_a == 1 if remover_a: VT01.__remover_a(sap_session) SAPGuiElements.press_button( sap_session, ELEMENTO_BOTAO_ADICIONAR_MAIS_REMESSAS) cont = 0 for remessa in remessas: field = ELEMENT_SHIPPING_FIELDS.format(cont) sap_session.findById(field).text = remessa.numero_remessa cont = cont + 1 SAPGuiElements.press_button(sap_session, ELEMENT_EXECUTE_BUTTON_1) SAPGuiElements.press_button(sap_session, ELEMENT_EXECUTE_BUTTON_2) mensagem = SAPGuiElements.verificar_mensagem_barra_inferior( sap_session) total_remessas_adicionadas = "".join(re.findall("\\d*", mensagem)) total_remessas_adicionadas = int(total_remessas_adicionadas) total_remessas = len(remessas) if total_remessas_adicionadas != total_remessas: raise RuntimeError('Erro ao adicionar remessas!') except Exception as e: raise e
def __inserir_s(sap_session): continuar = True contador = 0 while continuar: try: SAPGuiElements.set_text(sap_session, ELEMENTO_COLUNA_S.format(contador), "S") contador = contador + 1 except AttributeError: return
def __inserir_dados_aba_transporte(sap_session, produto): SAPGuiElements.select_element(sap_session, ELEMENTO_ABA_TRANSPORTE) SAPGuiElements.set_text(sap_session, ELEMENTO_ICOTERMS_1, produto.icoterms1) SAPGuiElements.set_text(sap_session, ELEMENTO_ICOTERMS_2, produto.icoterms2) SAPGuiElements.set_text(sap_session, ELEMENTO_TIPO_VEICULO, '1000')
def get_message(sap_session, element): message = "" try: message = SAPGuiElements.get_text(sap_session, element) print(message) finally: return message
def insert_item_text(sap_session, field, valor): SAPGuiElements.select_item(sap_session, ELEMENT_TXT_FIELDS, field, "column1") SAPGuiElements.ensure_visible_horizontal_item(sap_session, ELEMENT_TXT_FIELDS, field, "column1") SAPGuiElements.double_click_element(sap_session, ELEMENT_TXT_FIELDS, field, "column1") SAPGuiElements.set_item_text(sap_session, ELEMENT_TXT_SELECTED_FIELD, valor)
def __inserir_dados_aba_parceiros(sap_session): SAPGuiElements.select_element(sap_session, ELEMENTO_ABA_PARCEIROS) indisponivel = True linha = 0 # sap_session.findById(ELEMENTO_COLUNA_TIPO_PARCEIRO.format(str(8))).key = 'SP' # TODO continuar aqui.... achar o retorno corereto while indisponivel: texto = sap_session.findById( ELEMENTO_COLUNA_TIPO_PARCEIRO.format(str(linha))).key print(texto) if texto is None: print('texto é none') indisponivel = False sap_session.findById( ELEMENTO_COLUNA_TIPO_PARCEIRO.format( str(linha))).key = 'SP' linha += 1
def __abrir_item_para_edicao(sap_session, linha): try: SAPGuiElements.selecionar_linha(sap_session, ELEMENTO_LINHA, linha) sap_session.findById("wnd[0]").sendVKey(2) SAPGuiElements.ignorar_alerta(sap_session) if SAPGuiElements.verificar_mensagem_barra_inferior(sap_session): SAPGuiElements.enter(sap_session) except Exception: raise RuntimeError('Erro ao inserir direitos fiscais!')
def pesquisar_transportador(sap_session, criterio): try: SAPTransaction.call(sap_session, 'xk03') if len(criterio) != 7: criterio = XK03.__pesquisar_codigo_transportador_por_cnpj_ou_cpf( sap_session, criterio) XK03.__abrir_transacao(sap_session, criterio) nome = SAPGuiElements.get_text(sap_session, ELEMENTO_NOME) SAPGuiElements.press_button(sap_session, ELEMENTO_PROXIMA_PAGINA) identificador = SAPGuiElements.get_text(sap_session, ELEMENTO_CNPJ) if not identificador: identificador = SAPGuiElements.get_text( sap_session, ELEMENTO_CPF) codigo_municipio = SAPGuiElements.get_text( sap_session, ELEMENTO_CODIGO_MUNICIPIO) codigo_municipio = "".join(re.findall("\\d*", codigo_municipio)) municipio = MunicipioService.pesquisar_municipio_pelo_codigo( codigo_municipio) if municipio is None: raise RuntimeError( 'Não possivel definir o municipio do transportador!') transportador = Transportador() transportador.nome = nome transportador.codigo_sap = criterio transportador.cnpj_cpf = identificador transportador.municipio = municipio transportador.save() return transportador except Exception as e: traceback.print_exc(file=sys.stdout) raise e
def pesquisar_transportador_por_codigo(sap_session, codigo_transportador): SAPGuiElements.set_text( sap_session, "wnd[0]/usr/tabsHEADER_TABSTRIP1/tabpTABS_OV_PR/ssubG_HEADER_SUBSCREEN1:" "SAPMV56A:1021/ctxtVTTK-TDLNR", codigo_transportador) SAPGuiElements.enter(sap_session) SAPGuiElements.verificar_mensagem_barra_inferior(sap_session) endereco_transportador = SAPGuiElements.get_text( sap_session, "wnd[0]/usr/tabsHEADER_TABSTRIP1/tabpTABS_OV" "_PR/ssubG_HEADER_SUBSCREEN1:SAPMV56A:1021/" "txtVTTKD-TXTSP") SAPTransaction.exit_transaction(sap_session) return True, codigo_transportador, endereco_transportador
def __procurar_item_pelo_codigo_produto(sap_session, codigo_produto, ordem): item = 0 while True: try: codigo_produto_sap = SAPGuiElements.get_text( sap_session, ELEMENTO_CODIGOS_PRODUTO.format(str(item))) if codigo_produto_sap.strip() == codigo_produto: return str(item) item += 1 except AttributeError: raise RuntimeError( 'Ordem {} nao possui um ítem com o produto {}.\n' 'Verifique se o produto selecionado está correto!'.format( ordem, codigo_produto))
def __inserir_picking(sap_session, picking, linha_item): if picking: try: SAPGuiElements.select_element( sap_session, ELEMENTO_PICKINGS.split(SPLIT_STR)[0]) SAPGuiElements.set_text(sap_session, ELEMENTO_PICKINGS.format(linha_item), picking) except Exception: if SAPGuiElements.verificar_mensagem_barra_inferior( sap_session): SAPGuiElements.enter(sap_session) raise RuntimeError('Erro ao inserir o picking!')
def __inserir_quantidade(sap_session, quantidade, linha_item): if quantidade: try: SAPGuiElements.select_element( sap_session, ELEMENTO_QUANTIDADES.split(SPLIT_STR)[0]) SAPGuiElements.set_text( sap_session, ELEMENTO_QUANTIDADES.format(linha_item), quantidade) except Exception: if SAPGuiElements.verificar_mensagem_barra_inferior( sap_session): SAPGuiElements.enter(sap_session) raise RuntimeError('Erro ao inserir a quantidade!')
def __inserir_lote(sap_session, lote, linha_item): if lote: try: SAPGuiElements.select_element( sap_session, ELEMENTO_LOTES.split(SPLIT_STR)[0]) SAPGuiElements.set_text(sap_session, ELEMENTO_LOTES.format(linha_item), lote) except Exception: if SAPGuiElements.verificar_mensagem_barra_inferior( sap_session): SAPGuiElements.enter(sap_session) raise RuntimeError('Erro ao inserir o lote!')
def __inserir_deposito(sap_session, deposito, linha_item): if deposito: try: SAPGuiElements.select_element( sap_session, ELEMENTO_DEPOSITOS.split(SPLIT_STR)[0]) SAPGuiElements.set_text(sap_session, ELEMENTO_DEPOSITOS.format(linha_item), deposito) except Exception: if SAPGuiElements.verificar_mensagem_barra_inferior( sap_session): SAPGuiElements.enter(sap_session) raise RuntimeError('Erro ao inserir o depósito!')
def __pesquisar_codigo_transportador_por_cnpj_ou_cpf( sap_session, criterio): try: XK03.__abrir_campo_pesquisa_por_cnpj_cpf(sap_session) cnpj = len(criterio) == 14 SAPGuiElements.set_text( sap_session, ELEMENTO_PESQUISA_CNPJ if cnpj else ELEMENTO_PESQUISA_CPF, criterio) SAPGuiElements.enter(sap_session) msg_nenhum_resultado = SAPGuiElements.verificar_mensagem_barra_inferior( sap_session) if msg_nenhum_resultado: raise RuntimeError(msg_nenhum_resultado) SAPGuiElements.enter(sap_session) return SAPGuiElements.get_text(sap_session, ELEMENTO_CODIGO_FORNECEDOR) except Exception as e: traceback.print_exc(file=sys.stdout) raise e
def __abrir_transacao(sap_session): SAPTransaction.call(sap_session, 'vt01n') SAPGuiElements.set_text(sap_session, ELEMENTO_ORGANIZACAO, "1000") sap_session.findById(ELEMENTO_TIPO_TRANSPORTE).key = "ZDIR" SAPGuiElements.press_keyboard_keys(sap_session, "Enter")
def __abrir_detalhes_cabecalho(sap_session): SAPGuiElements.press_button(sap_session, ELEMENTO_BOTAO_DETALHE_CABECALHJO) SAPGuiElements.ignorar_alerta(sap_session)
def __inserir_dados_veiculo(sap_session, veiculo): tipo_veiculo = veiculo.tipo_veiculo.codigo peso_balanca = veiculo.peso_balanca.codigo SAPGuiElements.set_text(sap_session, CAR_TYPE_ELEMENT, tipo_veiculo) SAPGuiElements.set_text(sap_session, ELEMENTO_PLACA_CAVALO, veiculo.placa1) SAPGuiElements.set_text(sap_session, ELEMENTO_LACRES, peso_balanca) SAPGuiElements.select_element(sap_session, ELEMENT_ADC_DATAS) print(str(veiculo.municipio_placa1)) SAPGuiElements.set_text( sap_session, ELEMENTO_MUNICIPIO_PLACA_01, '{} {}'.format(veiculo.municipio_placa1.uf, veiculo.municipio_placa1.codigo)) if veiculo.placa2: SAPGuiElements.set_text( sap_session, ELEMENTO_MUNICIPIO_PLACA_02, '{} {}'.format(veiculo.municipio_placa2.uf, veiculo.municipio_placa2.codigo)) SAPGuiElements.set_text(sap_session, ELEMENTO_PLACA_02, veiculo.placa2) if veiculo.placa3: SAPGuiElements.set_text( sap_session, ELEMENTO_MUNICIPIO_PLACA_03, '{} {}'.format(veiculo.municipio_placa3.uf, veiculo.municipio_placa3.codigo)) SAPGuiElements.set_text(sap_session, ELEMENTO_PLACA_03, veiculo.placa3) if veiculo.placa4: SAPGuiElements.set_text( sap_session, ELEMENTO_MUNICIPIO_PLACA_04, '{} {}'.format(veiculo.municipio_placa4.uf, veiculo.municipio_placa4.codigo)) SAPGuiElements.set_text(sap_session, ELEMENTO_PLACA_04, veiculo.placa4)
def __inserir_pedido(sap_session, pedido): SAPGuiElements.set_text(sap_session, ELEMENTO_NUMERO_PEDIDO, pedido)
def __abrir_transacao(sap_session, numero_inspecao_veicular): SAPTransaction.call(sap_session, 'qe01') SAPGuiElements.set_text(sap_session, ELEMENTO_LOTE_CONTROLE, numero_inspecao_veicular) SAPGuiElements.set_text(sap_session, ELEMENTO_OPERACAO, "0010") SAPGuiElements.set_text(sap_session, ELEMENTO_CENTRO, "1014") sap_session.findById(ELEMENTO_FILTRO_CARACTERISTICAS).key = 1 SAPGuiElements.press_keyboard_keys(sap_session, "Enter") existe_proxima_operacao = True while existe_proxima_operacao: ''' row = 0 while row < sap_session.findById(ELEMENTO_TABELA_RESULTADOS).RowCount: # print(row) # print(SAPGuiElements.get_text(sap_session, ELEMENTO_COLUNA_S.format(row))) # session.findById(ELEMENTO_TABELA_RESULTADOS).selectedRows = row row += 1 ''' QE01.__inserir_s(sap_session) SAPGuiElements.press_button(sap_session, ELEMENTO_BOTAO_SELECIONAR_TODOS) SAPGuiElements.press_button(sap_session, ELEMENTO_BOTAO_AVALIAR) # TODO verificar essa lógica SAPGuiElements.press_button(sap_session, ELEMENTO_BOTAO_PROXIMA_OPERACAO) existe_proxima_operacao = SAPGuiElements.is_enable( sap_session, ELEMENTO_BOTAO_PROXIMA_OPERACAO) try: SAPGuiElements.press_button(sap_session, ELEMENTO_BOTAO_GRAVAR_PRIMEIRO) except AttributeError: pass SAPGuiElements.press_button(sap_session, SAVE_BUTTON) tipo_mensagem = SAPGuiElements.get_sbar_message_type(sap_session) message = SAPGuiElements.get_text(sap_session, MESSAGE_ELEMENT) if tipo_mensagem and tipo_mensagem == 'S': return True, message else: return False, message
def __inserir_codigo_transportador(sap_session, codigo_transportador): SAPGuiElements.set_text(sap_session, ELEMENTO_CODIGO_TRANSPORTADOR, codigo_transportador) SAPGuiElements.enter(sap_session) SAPGuiElements.verificar_mensagem_barra_inferior(sap_session)
def gerar_produto_remessa_pronta(sap_session, numero_remessa): try: SAPTransaction.call(sap_session, 'vl03n') SAPGuiElements.set_text(sap_session, ELEMENTO_CAMPO_REMESSA, numero_remessa) SAPGuiElements.press_keyboard_keys(sap_session, "Enter") SAPGuiElements.verificar_mensagem_barra_inferior(sap_session) remessa = Remessa(None, None) proximo_item = True c = 0 while proximo_item: numero_item = SAPGuiElements.get_text( sap_session, ELEMENTO_NUMERO_ITEM.format(str(c))) proximo_item = str(numero_item).isdigit() if proximo_item: codigo_produto = SAPGuiElements.get_text( sap_session, ELEMENTO_CODIGOS_PRODUTO.format(str(c))) deposito = SAPGuiElements.get_text( sap_session, ELEMENTO_DEPOSITOS.format(str(c))) quantidade = SAPGuiElements.get_text( sap_session, ELEMENTO_QUANTIDADES.format(str(c))) lote = SAPGuiElements.get_text( sap_session, ELEMENTO_LOTES.format(str(c))) produto = ProdutoService.pesquisar_produto_pelo_id( codigo_produto) ''' # TODO informar ao usuario se ele deseja continuar caso lote ou deposito esteja diferente if produto.lote != lote: raise RuntimeError('Lote da remessa diferente do lote cadastrado para o produto {}!' .format(produto.nome)) if produto.deposito != deposito: raise RuntimeError('Deposito da remessa diferente do deposito cadastrado para o produto {}!' .format(produto.nome)) ''' item = ItemRemessa(quantidade=quantidade, produto=produto, numero_item=numero_item) remessa.itens.append(item) c += 1 return remessa except Exception as e: print(e)
def pesquisar_transportador(sap_session, numero_documento): VT01.__abrir_transacao(sap_session) if re.findall("^\\d{7}$", numero_documento): return VT01.pesquisar_transportador_por_codigo( sap_session, numero_documento) sap_session.findById("wnd[0]").sendVKey(4) SAPGuiElements.press_button(sap_session, FILTER_BUTTOn_ELEMENT) # campo para o selecionar o primeiro elemento da tabela caso encontre um transportador primeiro_elemento = "wnd[1]/usr/lbl[1,5]" # verificando se é um cnpj if re.findall("^\\d{14}$", numero_documento): SAPGuiElements.set_text(sap_session, ELEMENTO_CNPJ, numero_documento) elif re.findall("^\\d{11}$", numero_documento): SAPGuiElements.set_text(sap_session, ELEMENTO_CPF, numero_documento) primeiro_elemento = "wnd[1]/usr/lbl[1,3]" else: return "CNPJ ou CPF Inválido!" SAPGuiElements.press_keyboard_keys(sap_session, "Enter") error_message = SAPGuiElements.get_text(sap_session, "wnd[0]/sbar") if error_message: SAPTransaction.exit_transaction(sap_session) return False, error_message else: # selecionando o primeiro elemento da tabela SAPGuiElements.press_keyboard_keys(sap_session, "Enter") SAPGuiElements.press_keyboard_keys(sap_session, "Enter") codigo_transportador = SAPGuiElements.get_text( sap_session, "wnd[0]/usr/tabsHEADER_TABSTRIP1/tabpTABS_OV_" "PR/ssubG_HEADER_SUBSCREEN1:SAPMV56A:1021" "/ctxtVTTK-TDLNR") endereco_transportador = SAPGuiElements.get_text( sap_session, "wnd[0]/usr/tabsHEADER_TABSTRIP1/tabpTABS_OV" "_PR/ssubG_HEADER_SUBSCREEN1:SAPMV56A:1021/" "txtVTTKD-TXTSP") print('codigo :' + codigo_transportador) SAPTransaction.exit_transaction(sap_session) return True, codigo_transportador, endereco_transportador
def __remover_a(sap_session): SAPGuiElements.set_text(sap_session, "wnd[1]/usr/ctxtS_WBSTK-LOW", "") SAPGuiElements.set_text(sap_session, "wnd[1]/usr/ctxtS_TRSTA-LOW", "") SAPGuiElements.set_text(sap_session, "wnd[1]/usr/ctxtS_TRSTA-HIGH", "")
def __inserir_lote_controle_produto(sap_session, lote_qualidade_produto): SAPGuiElements.set_text(sap_session, ELEMENTO_LOTE_PRODUTO, lote_qualidade_produto.numero_lote)
def __inserir_direitos_fiscais(sap_session, produto): SAPGuiElements.select_element(sap_session, ELEMENTO_ABA_PROCESSAMENTO_FINANCEIRO) SAPGuiElements.set_text(sap_session, ELEMENTO_CFOP, produto.cfop) SAPGuiElements.set_text(sap_session, ELEMENTO_CODIGO_IMPOSTO, produto.codigo_imposto) SAPGuiElements.set_text(sap_session, ELEMENTO_ICMS, produto.df_icms) SAPGuiElements.set_text(sap_session, ELEMENTO_IPI, produto.df_ipi) SAPGuiElements.set_text(sap_session, ELEMENTO_PIS, produto.df_pis) SAPGuiElements.set_text(sap_session, ELEMENTO_COFINS, produto.df_cofins)
def inserir_inspecao_veicular(sap_session, numero_transporte, numero_inspecao_veicular): SAPTransaction.call(sap_session, 'vt02n') SAPGuiElements.set_text(sap_session, ELEMENTO_NUMERO_TRANSPORTE, numero_transporte) SAPGuiElements.press_keyboard_keys(sap_session, "Enter") SAPGuiElements.select_element(sap_session, ELEMENTO_ABA_IDENTIFICACAO) SAPGuiElements.set_text(sap_session, ELEMENTO_NUMERO_INSPECAO_VEICULAR, numero_inspecao_veicular) SAPGuiElements.press_button(sap_session, SAVE_BUTTON) tipo_mensagem = SAPGuiElements.get_sbar_message_type(sap_session) if tipo_mensagem and tipo_mensagem == 'S': return True, "" return False, "Erro ao inserir inspecao {} no transporte {}".format( numero_inspecao_veicular, numero_transporte)
def criar_remessa(sap_session, remessa, remessa_sem_transporte=False): try: ordem = remessa.itens[0].numero_ordem SAPTransaction.call(sap_session, 'vl01n') SAPGuiElements.set_text(sap_session, SHIPPING_PLACE_FIELD, SHIPPING_PLACE_VALUE) SAPGuiElements.set_text(sap_session, SHIPPING_ORDER_FIELD, ordem) SAPGuiElements.press_keyboard_keys(sap_session, "Enter") # verificando se houve alguma mensagem de erro. # Uma exceçao será lançada no caso de erro. SAPGuiElements.verificar_mensagem_barra_inferior(sap_session) SAPGuiElements.select_element(sap_session, ELEMENTO_ABA_PICKING) linha = 0 for item in remessa.itens: item_str = VL01.__procurar_item_pelo_codigo_produto( sap_session, item.produto.codigo_sap, ordem) VL01.__inserir_deposito(sap_session, item.produto.deposito, item_str) VL01.__inserir_lote(sap_session, item.produto.lote, item_str) VL01.__inserir_quantidade(sap_session, item.quantidade, item_str) VL01.__inserir_picking(sap_session, item.quantidade, item_str) VL01.__alterar_direitos_fiscais_se_necessario( sap_session, item.produto, linha) VL01.__inserir_dados_cabecalho(sap_session, remessa.itens[0].produto) SAPGuiElements.enter(sap_session) # ignorando alerta de remessas parciais SAPGuiElements.ignorar_alerta(sap_session) if SAPGuiElements.verificar_mensagem_barra_inferior(sap_session): SAPGuiElements.enter(sap_session) SAPGuiElements.salvar(sap_session) # ignorando alerta de remessas parciais SAPGuiElements.ignorar_alerta(sap_session) # verificando se houve alguma mensagem de erro. mensagem = SAPGuiElements.verificar_mensagem_barra_inferior( sap_session) # retornando o número da remessa return VL01.extrair_numero_remessa(mensagem) except Exception as e: raise e
def create(sap_session, carregamento): try: VT01.__abrir_transacao(sap_session) VT01.__inserir_codigo_transportador( sap_session, carregamento.transportador.codigo_sap) VT01.__inserir_dados_veiculo(sap_session, carregamento.veiculo) if carregamento.remessas[0].itens[0].produto.inspecao_produto == 1: VT01.__inserir_lote_controle_produto( sap_session, carregamento.lotes_qualidade[-1]) SAPGuiElements.enter(sap_session) SAPGuiElements.verificar_mensagem_barra_inferior(sap_session) VT01.__inserir_dados_motorista(sap_session, carregamento.motorista) # verificando se é necessário lacres para esse produto tipo_lacres = carregamento.remessas[0].itens[0].produto.tipo_lacres if tipo_lacres != 0: VT01.__inserir_lacres(sap_session, tipo_lacres, carregamento.lacres) # verificando se há número de pedido if carregamento.numero_pedido: VT01.__inserir_pedido(sap_session, carregamento.numero_pedido) SAPGuiElements.enter(sap_session) VT01.__inserir_remessas(sap_session, carregamento.remessas) SAPGuiElements.press_button(sap_session, ELEMENTO_SINTESE) sap_session.findById(ELEMENTO_ABA_DADOS).select() SAPGuiElements.press_button(sap_session, ELEMENTO_ORGANIZAR_TRANSPORTE) SAPGuiElements.salvar(sap_session) message = SAPGuiElements.verificar_mensagem_barra_inferior( sap_session) transport_number = VT01.extrair_numero_transport(message) return transport_number except Exception as e: traceback.print_exc(file=sys.stdout) raise e