hnt-sap-nf-caixas 0.0.6__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
hnt_sap_nf/__init__.py ADDED
@@ -0,0 +1 @@
1
+ from .hnt_sap_gui import *
@@ -0,0 +1,13 @@
1
+ import logging
2
+ import re
3
+
4
+ logger = logging.getLogger(__name__)
5
+
6
+ def sbar_extracted_text(patter, full_text):
7
+ regex = re.compile(patter , re.IGNORECASE)
8
+ text_list = regex.search(full_text)
9
+ if text_list is None:
10
+ return None
11
+ text = text_list[1]
12
+ logger.info(f"Extracted text: '{text}', from full_text: '{full_text}'")
13
+ return text
@@ -0,0 +1,60 @@
1
+ from functools import wraps
2
+ import os
3
+ import logging
4
+
5
+ from hnt_sap_nf.hnt_sap_exception import HntSapException
6
+
7
+ logger = logging.getLogger(__name__)
8
+
9
+ def sessionable(original_function):
10
+ @wraps(original_function)
11
+ def wrapped(*args, **kwargs):
12
+ this = args[0]
13
+ try:
14
+ _open(this)
15
+ response = original_function(*args, **kwargs)
16
+ _close(this)
17
+ return response
18
+ except HntSapException as hntEx:
19
+ _close(this)
20
+ raise hntEx
21
+ except Exception as ex:
22
+ logger.error(msg=str(ex))
23
+ if this.session.findById("wnd[0]/sbar", False) != None:
24
+ msg = this.session.findById("wnd[0]/sbar").Text
25
+ logger.error(f"SAP Status bar: '{msg}'")
26
+ raise HntSapException(msg, ex.args)
27
+
28
+ if isinstance(ex.args[0], str) and ex.args[0].endswith("object has no attribute 'sapapp'"):
29
+ raise ex
30
+ _close(this)
31
+ return wrapped
32
+
33
+ def _open(sap_gui):
34
+ logger.info("enter _open")
35
+ sap_gui.connect_to_session()
36
+
37
+ sap_gui.open_connection(os.getenv("SAP_NFE_OPEN_CONNECTION"))
38
+
39
+ sap_gui.session.findById("wnd[0]/usr/txtRSYST-MANDT").text = os.getenv("SAP_NFE_MANDANTE")
40
+ sap_gui.session.findById("wnd[0]/usr/txtRSYST-BNAME").text = os.getenv("SAP_NFE_USERNAME")
41
+ sap_gui.session.findById("wnd[0]/usr/pwdRSYST-BCODE").text = os.getenv("SAP_NFE_PASSWORD")
42
+ sap_gui.session.findById("wnd[0]/usr/txtRSYST-LANGU").text = os.getenv("SAP_NFE_LANGUAGE")
43
+ sap_gui.send_vkey(0)
44
+ if sap_gui.session.findById("wnd[1]/usr/radMULTI_LOGON_OPT2", False) != None:
45
+ sap_gui.session.findById("wnd[1]/usr/radMULTI_LOGON_OPT2").select()
46
+ sap_gui.session.findById("wnd[1]/tbar[0]/btn[0]").press()
47
+ if sap_gui.session.findById("wnd[1]/tbar[0]/btn[0]", False) != None:
48
+ sap_gui.session.findById("wnd[1]/tbar[0]/btn[0]").press()
49
+ elif sap_gui.session.findById("wnd[1]/tbar[0]/btn[0]", False) != None:
50
+ sap_gui.session.findById("wnd[1]/tbar[0]/btn[0]").press()
51
+ logger.info("leave _open")
52
+
53
+ def _close(sap_gui):
54
+ logger.info("enter _close")
55
+ sap_gui.session.findById("wnd[0]").close()
56
+ if sap_gui.session.findById("wnd[1]/usr/btnSPOP-OPTION1", False) != None:
57
+ sap_gui.session.findById("wnd[1]/usr/btnSPOP-OPTION1").press()
58
+ elif sap_gui.session.findById("wnd[2]/usr/btnSPOP-OPTION1", False) != None:
59
+ sap_gui.session.findById("wnd[2]/usr/btnSPOP-OPTION1").press()
60
+ logger.info("leave _close")
@@ -0,0 +1,18 @@
1
+ from datetime import datetime
2
+
3
+
4
+ class TxResult:
5
+ def __init__(self, sap_docnum, sbar=None) -> None:
6
+ self.sap_docnum = sap_docnum
7
+ self.sbar = sbar
8
+ self.created_at = datetime.now().strftime("%Y%m%d%H%M%S")
9
+
10
+ def to_dict(self):
11
+ return {
12
+ 'sap_docnum': self.sap_docnum,
13
+ 'sbar': self.sbar,
14
+ 'created_at': self.created_at,
15
+ }
16
+
17
+ def __str__(self):
18
+ return f"TxResult instance with sap_docnum: '{self.sap_docnum}', sbar: '{self.sbar}', created_at:'{self.created_at}'"
@@ -0,0 +1,13 @@
1
+ class HntSapException(Exception):
2
+ def __init__(self, message, cause=None):
3
+ self.message = message
4
+ self.cause = cause
5
+
6
+ def __str__(self):
7
+ if self.cause:
8
+ return f'HFNTException: {self.message} caused by {self.cause}'
9
+ else:
10
+ return f'HFNTException: {self.message}'
11
+
12
+ def __cause__(self):
13
+ return self.cause
@@ -0,0 +1,49 @@
1
+ import logging
2
+ import locale
3
+ import time
4
+ from SapGuiLibrary import SapGuiLibrary
5
+
6
+ from hnt_sap_nf.common.tx_result import TxResult
7
+ from hnt_sap_nf.j1b1n_transaction import J1b1nTransaction
8
+ from .common.session import sessionable
9
+ from dotenv import load_dotenv
10
+ logger = logging.getLogger(__name__)
11
+
12
+ class SapGui(SapGuiLibrary):
13
+ def __init__(self) -> None:
14
+ SapGuiLibrary.__init__(self, screenshots_on_error=True)
15
+ locale.setlocale(locale.LC_ALL, ('pt_BR.UTF-8'))
16
+ load_dotenv()
17
+ pass
18
+ def format_float(self, value):
19
+ return locale.format_string("%.2f", value)
20
+
21
+ @sessionable
22
+ def run_j1b1n(self, nf):
23
+ logger.info(f"Enter execute run_j1b1n nf:{nf}")
24
+ result = {
25
+ "j1b1n": None,
26
+ "error": None
27
+ }
28
+ try:
29
+ j1b1n = J1b1nTransaction().execute(self, nf)
30
+ result['j1b1n'] = j1b1n.to_dict()
31
+ except Exception as ex:
32
+ logger.error(str(ex))
33
+ result["error"] = str(ex)
34
+ logger.info(f"Leave execute run_j1b1n result:{', '.join([str(result[obj]) for obj in result])}")
35
+ return result
36
+
37
+ @sessionable
38
+ def run_j1b1n_mock(self, nf):
39
+ logger.info(f"Enter execute run_j1b1n_mock nf:{nf}")
40
+ epoch_now = int(time.time())
41
+ result = {
42
+ "j1b1n": {
43
+ "sap_docnum": f"MOCK_{epoch_now}",
44
+ "sbar": "MOCKsbar1234567"
45
+ },
46
+ "error": None
47
+ }
48
+ logger.info(f"Leave run_j1b1n_mock:{result}")
49
+ return result
@@ -0,0 +1,84 @@
1
+ import logging
2
+ from datetime import datetime
3
+ from hnt_sap_nf.common.tx_result import TxResult
4
+ logger = logging.getLogger(__name__)
5
+ from hnt_sap_nf.common.sap_status_bar import sbar_extracted_text
6
+ MSG_SAP_NOTA_FISCAL_CRIADA = "^Nota fiscal ([0-9]+) criada$"
7
+ IMPOSTOS = [
8
+ 'ICM0',
9
+ 'ICON',
10
+ 'IPSN',
11
+ 'IPI0'
12
+ ]
13
+ class J1b1nTransaction:
14
+ def __init__(self) -> None:
15
+ pass
16
+
17
+ def execute(self, sapGuiLib, nf):
18
+ logger.info(f"Enter lançar nf:{nf}")
19
+ sapGuiLib.run_transaction('/nJ1B1N')
20
+
21
+ sapGuiLib.session.findById("wnd[0]/usr/ctxtJ_1BDYDOC-NFTYPE").Text = nf['categoria_nf'] #Planilha: Cat NF | SAP: Ctg.nota fiscal
22
+ sapGuiLib.session.findById("wnd[0]/usr/ctxtJ_1BDYDOC-BUKRS").Text = nf['empresa'] #Planilha: Empresa | SAP: Empresa
23
+ sapGuiLib.session.findById("wnd[0]/usr/ctxtJ_1BDYDOC-BRANCH").Text = nf['local_negocio'] #Planilha: Unidade | SAP: Local de negócios
24
+ sapGuiLib.session.findById("wnd[0]/usr/cmbJ_1BDYDOC-PARVW").Key = nf['funcao_parceiro'] #SAP: NF função parceiro*
25
+ sapGuiLib.session.findById("wnd[0]/usr/ctxtJ_1BDYDOC-PARID").Text = nf['sap_cod_fornecedor'] #Planilha: Código Fornecedor | SAP: ID parceiro
26
+
27
+ sapGuiLib.send_vkey(0)
28
+ if nf['categoria_nf'] == 'YS':
29
+ sapGuiLib.session.findById("wnd[0]/usr/subNF_NUMBER:SAPLJ1BB2:2002/txtJ_1BDYDOC-NFENUM").Text = nf['nro_nf'] #Planilha: Nº NF | SAP: Nº da NF-e
30
+ sapGuiLib.session.findById("wnd[0]/usr/txtJ_1BDYDOC-SERIES").Text = nf['serie_nf'] # Série NF Planilha: Nº Série | SAP: Nº da NF-e (campo 2)
31
+ sapGuiLib.session.findById("wnd[0]/usr/ctxtJ_1BDYDOC-DOCDAT").Text = nf['data_emissao'] #Planilha: Data emissão | SAP: Data documento
32
+ elif nf['categoria_nf'] == 'YZ':
33
+ data_atual = datetime.now()
34
+ sapGuiLib.session.findById("wnd[0]/usr/ctxtJ_1BDYDOC-DOCDAT").Text = data_atual.strftime("%d.%m.%Y") #Data corrente, ex. 10.12.2025
35
+
36
+ #------------------------------------------------------------------------------------------------
37
+ #INCLUSÃO DE MATERIAIS
38
+ for i, item in enumerate(nf['itens']):
39
+ sapGuiLib.session.findById(f"wnd[0]/usr/tabsTABSTRIP1/tabpTAB1/ssubHEADER_TAB:SAPLJ1BB2:2100/tblSAPLJ1BB2ITEM_CONTROL/ctxtJ_1BDYLIN-ITMTYP[1,{i}]").Text = item['tipo'] #Planilha: Tipo item NF | SAP: Tipo de item NF
40
+ sapGuiLib.session.findById(f"wnd[0]/usr/tabsTABSTRIP1/tabpTAB1/ssubHEADER_TAB:SAPLJ1BB2:2100/tblSAPLJ1BB2ITEM_CONTROL/ctxtJ_1BDYLIN-MATNR[3,{i}]").Text = item['cod_material_sap'] #Planilha: Código Material | SAP: Material
41
+ sapGuiLib.session.findById(f"wnd[0]/usr/tabsTABSTRIP1/tabpTAB1/ssubHEADER_TAB:SAPLJ1BB2:2100/tblSAPLJ1BB2ITEM_CONTROL/ctxtJ_1BDYLIN-WERKS[2,{i}]").Text = item['centro'] #Planilha: CD | SAP: Centro
42
+ sapGuiLib.session.findById(f"wnd[0]/usr/tabsTABSTRIP1/tabpTAB1/ssubHEADER_TAB:SAPLJ1BB2:2100/tblSAPLJ1BB2ITEM_CONTROL/txtJ_1BDYLIN-MENGE[4,{i}]").Text = item['quantidade'] #Planilha: Quantidade | SAP: Quantidade
43
+ sapGuiLib.session.findById(f"wnd[0]/usr/tabsTABSTRIP1/tabpTAB1/ssubHEADER_TAB:SAPLJ1BB2:2100/tblSAPLJ1BB2ITEM_CONTROL/ctxtJ_1BDYLIN-MEINS[5,{i}]").Text = item['unidade_medida'] #Planilha: Un Med | SAP: Unidade de medida
44
+ sapGuiLib.session.findById(f"wnd[0]/usr/tabsTABSTRIP1/tabpTAB1/ssubHEADER_TAB:SAPLJ1BB2:2100/tblSAPLJ1BB2ITEM_CONTROL/txtJ_1BDYLIN-NETPR[6,{i}]").Text = sapGuiLib.format_float(float(item['preco'])) #Planilha: Valor UN | SAP: Preço
45
+ sapGuiLib.session.findById(f"wnd[0]/usr/tabsTABSTRIP1/tabpTAB1/ssubHEADER_TAB:SAPLJ1BB2:2100/tblSAPLJ1BB2ITEM_CONTROL/ctxtJ_1BDYLIN-CFOP[9,{i}]").Text = item['cfop'] #Planilha: CFOP Entrada | SAP: CFOP
46
+ sapGuiLib.session.findById(f"wnd[0]/usr/tabsTABSTRIP1/tabpTAB1/ssubHEADER_TAB:SAPLJ1BB2:2100/tblSAPLJ1BB2ITEM_CONTROL/ctxtJ_1BDYLIN-TAXLW1[10,{i}]").Text = item['dir_fiscal'] #Planilha: Dir Fiscal | SAP: Dir.fisc.: ICMS
47
+ sapGuiLib.send_vkey(0)
48
+ sapGuiLib.send_vkey(0)
49
+
50
+ sapGuiLib.session.findById("wnd[0]/usr/tabsTABSTRIP1/tabpTAB1/ssubHEADER_TAB:SAPLJ1BB2:2100/btn%#AUTOTEXT004").press() #Botão "Selecionar tudo"
51
+ sapGuiLib.session.findById("wnd[0]/usr/tabsTABSTRIP1/tabpTAB1/ssubHEADER_TAB:SAPLJ1BB2:2100/btn%#AUTOTEXT001").press() #Botão "DetalhItem"
52
+ sapGuiLib.session.findById("wnd[0]/usr/tabsITEM_TAB/tabpTAX").Select() #Seleciona aba Impsotos
53
+ for i, item in enumerate(nf['itens']):
54
+ for i, imposto in enumerate(IMPOSTOS):
55
+ sapGuiLib.session.findById(f"wnd[0]/usr/tabsITEM_TAB/tabpTAX/ssubITEM_TABS:SAPLJ1BB2:3200/tblSAPLJ1BB2TAX_CONTROL/ctxtJ_1BDYSTX-TAXTYP[0,{i}]").Text = imposto
56
+ sapGuiLib.session.findById(f"wnd[0]/usr/tabsITEM_TAB/tabpTAX/ssubITEM_TABS:SAPLJ1BB2:3200/tblSAPLJ1BB2TAX_CONTROL/txtJ_1BDYSTX-OTHBAS[7,{i}]").Text = sapGuiLib.format_float(float(item['valor_produto']))
57
+
58
+ sapGuiLib.session.findById("wnd[0]/usr/tabsITEM_TAB/tabpTAX/ssubITEM_TABS:SAPLJ1BB2:3200/btnPB_NEXT").press()
59
+
60
+ sapGuiLib.send_vkey(0)
61
+ sapGuiLib.session.findById("wnd[0]/tbar[0]/btn[3]").press()
62
+
63
+ if nf['categoria_nf'] == 'YS':
64
+ sapGuiLib.session.findById("wnd[0]/usr/tabsTABSTRIP1/tabpTAB8").Select() #Seleciona aba DadosNF-e
65
+ sapGuiLib.session.findById("wnd[0]/usr/tabsTABSTRIP1/tabpTAB8/ssubHEADER_TAB:SAPLJ1BB2:2800/subRANDOM_NUMBER:SAPLJ1BB2:2801/ctxtJ_1BNFE_DOCNUM9_DIVIDED-TPEMIS").Text = nf['dados_nfe']['tipo_emissao'] #Planilha: Tipo de emissão | SAP: Tp.emissão
66
+ sapGuiLib.session.findById("wnd[0]/usr/tabsTABSTRIP1/tabpTAB8/ssubHEADER_TAB:SAPLJ1BB2:2800/subRANDOM_NUMBER:SAPLJ1BB2:2801/txtJ_1BNFE_DOCNUM9_DIVIDED-DOCNUM8").Text = nf['dados_nfe']['nro_aleatorio'] #Planilha: Nº aleatorio | SAP: Nº aleatório
67
+ sapGuiLib.session.findById("wnd[0]/usr/tabsTABSTRIP1/tabpTAB8/ssubHEADER_TAB:SAPLJ1BB2:2800/subRANDOM_NUMBER:SAPLJ1BB2:2801/txtJ_1BNFE_ACTIVE-CDV").Text = nf['dados_nfe']['digito_verificador'] #Planilha: Dig verificador | SAP: Díg.verif.
68
+ sapGuiLib.session.findById("wnd[0]/usr/tabsTABSTRIP1/tabpTAB8/ssubHEADER_TAB:SAPLJ1BB2:2800/subTIMESTAMP:SAPLJ1BB2:2803/subAUTHCODE_AREA:SAPLJ1BB2:2805/txtJ_1BDYDOC-AUTHCOD").Text = nf['dados_nfe']['nro_log'] #Planilha: Numero Doc | SAP: Nº do log
69
+ sapGuiLib.session.findById("wnd[0]/usr/tabsTABSTRIP1/tabpTAB8/ssubHEADER_TAB:SAPLJ1BB2:2800/subTIMESTAMP:SAPLJ1BB2:2803/ctxtJ_1BDYDOC-AUTHDATE").Text = nf['dados_nfe']['data_emissao'] #Planilha: Data emissão | SAP: Hora procmto.
70
+ sapGuiLib.session.findById("wnd[0]/usr/tabsTABSTRIP1/tabpTAB8/ssubHEADER_TAB:SAPLJ1BB2:2800/subTIMESTAMP:SAPLJ1BB2:2803/ctxtJ_1BDYDOC-AUTHTIME").Text = nf['dados_nfe']['hora_emissao'] # Planilha: Hora de emissão | SAP: Hora procmto.
71
+ elif nf['categoria_nf'] == 'YZ':
72
+ sapGuiLib.session.findById("wnd[0]/usr/tabsTABSTRIP1/tabpTAB4").Select() #Seleciona aba Mensagens
73
+ sapGuiLib.session.findById("wnd[0]/usr/tabsTABSTRIP1/tabpTAB4/ssubHEADER_TAB:SAPLJ1BB2:2400/tblSAPLJ1BB2MESSAGE_CONTROL/txtJ_1BDYFTX-MESSAGE[0,2]").Text = f"NOTA DE PRODUTOR {nf['nro_nf']}-{nf['serie_nf']}"
74
+ sapGuiLib.send_vkey(0)
75
+ sapGuiLib.session.findById("wnd[0]/usr/tabsTABSTRIP1/tabpTAB5").Select() #Seleciona aba Transporte
76
+ sapGuiLib.session.findById("wnd[0]/usr/tabsTABSTRIP1/tabpTAB5/ssubHEADER_TAB:SAPLJ1BB2:2500/ctxtJ_1BDYDOC-MODFRETE").Text = nf['dados_nfe']['modalid_fret'] #SAP: Modalid.fret
77
+
78
+ sapGuiLib.send_vkey(0)
79
+ sapGuiLib.session.findById("wnd[0]/tbar[0]/btn[11]").press() #Salvar
80
+ sbar = sapGuiLib.session.findById("wnd[0]/sbar").Text
81
+ sap_docnum = sbar_extracted_text(MSG_SAP_NOTA_FISCAL_CRIADA, sbar)
82
+ result = TxResult(sap_docnum, sbar)
83
+ logger.info(f"Leave lançar nf:{result}")
84
+ return result
@@ -0,0 +1,14 @@
1
+ Metadata-Version: 2.4
2
+ Name: hnt_sap_nf_caixas
3
+ Version: 0.0.6
4
+ Summary: Lib to access sap gui to run transactions
5
+ Author: Pepe
6
+ License: MIT License
7
+ Keywords: nota_fiscal
8
+ Requires-Dist: python-dotenv
9
+ Requires-Dist: robotframework-sapguilibrary
10
+ Dynamic: author
11
+ Dynamic: keywords
12
+ Dynamic: license
13
+ Dynamic: requires-dist
14
+ Dynamic: summary
@@ -0,0 +1,11 @@
1
+ hnt_sap_nf/__init__.py,sha256=iRIRFTwSzwswJBUiRfoftg0JLT7s4DJSddu4FYYZ1f0,26
2
+ hnt_sap_nf/hnt_sap_exception.py,sha256=g1eyHDmWW2BSZ9NhvDE6SRKKScURrQRFyhAd8SYCxMM,388
3
+ hnt_sap_nf/hnt_sap_gui.py,sha256=2J4uTjV1wXc3_NdNsF-9yCIJmMYMxgaEwOsn8Nc4UJU,1592
4
+ hnt_sap_nf/j1b1n_transaction.py,sha256=OskXjI3CVfcC26-lbFVYvGJyNAa_QvTRTgo8QjsMDd4,8069
5
+ hnt_sap_nf/common/sap_status_bar.py,sha256=hgY4YZgCwMOEJPypC8jqg4T39ECyttcSIiLv5_XcrGY,368
6
+ hnt_sap_nf/common/session.py,sha256=lmHVFxqYrBmX9PWAzqH2VT9dUzehbkm7kr-Iblo0HV0,2604
7
+ hnt_sap_nf/common/tx_result.py,sha256=4NmSeowvG933MSqdwxNmxOGNk-odmxy1IFCBoaG3H7k,565
8
+ hnt_sap_nf_caixas-0.0.6.dist-info/METADATA,sha256=0YusTtFjmwOWOKsPOjVG9d3-LlgFfJhSkXdreXzaA6s,346
9
+ hnt_sap_nf_caixas-0.0.6.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
10
+ hnt_sap_nf_caixas-0.0.6.dist-info/top_level.txt,sha256=XhHtox9cuPFwp-ii-cZEd0O7W2rndE5C3WwMO1PuSWM,11
11
+ hnt_sap_nf_caixas-0.0.6.dist-info/RECORD,,
@@ -0,0 +1,5 @@
1
+ Wheel-Version: 1.0
2
+ Generator: setuptools (80.9.0)
3
+ Root-Is-Purelib: true
4
+ Tag: py3-none-any
5
+
@@ -0,0 +1 @@
1
+ hnt_sap_nf