Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

intial SOAP support for NF-e #121

Open
wants to merge 38 commits into
base: master
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
9a958fe
initial NFe servers scraper/scraped URLs
rvalyi Mar 22, 2025
49fb3df
better scraper
rvalyi Mar 22, 2025
a97def0
test NF-e servers
rvalyi Mar 22, 2025
c33bb1b
add SOAP test deps
rvalyi Mar 22, 2025
9d3bfca
initial generic WSDL downloader
rvalyi Mar 22, 2025
ecd857b
initial NF-e WSDL downloader
rvalyi Mar 22, 2025
7419601
refactor: reusable servers_scrapers
rvalyi Mar 22, 2025
f986ba9
add CT-e scraper/servers
rvalyi Mar 22, 2025
b2d639d
refactor: reusable wsdl_downloader + generate SOAP bindings option
rvalyi Mar 22, 2025
e5dd8cf
add NF-e WSDL files
rvalyi Mar 22, 2025
dda54bd
add NF-e SOAP bindings
rvalyi Mar 22, 2025
a3a0dab
add NF-e initial SOAP client
rvalyi Mar 22, 2025
156862a
scoped files with v4_0; cleanup
rvalyi Mar 23, 2025
786db8e
clean up servers scraper
rvalyi Mar 23, 2025
99af2f7
fixed SOAP bindings generation
rvalyi Mar 23, 2025
aad719e
proper NFe SOAP bindings
rvalyi Mar 23, 2025
376e354
NFe SOAP client clean up
rvalyi Mar 23, 2025
d7fc2c2
add NFe SOAP client test
rvalyi Mar 23, 2025
70d0b7c
clean up CTe client files layout
rvalyi Mar 23, 2025
b4e8481
add brazil-fiscal-client test dep
rvalyi Mar 23, 2025
17d58b1
add decorator test dep
rvalyi Mar 23, 2025
6cc6879
added missing NFe client test fixture
rvalyi Mar 23, 2025
03afde8
mypy checker uses types-requests
rvalyi Mar 24, 2025
ee5ce65
pre-commit fixes
rvalyi Mar 24, 2025
7fdf016
don't format scraped servers list
rvalyi Mar 24, 2025
fdfbaf1
py3.8 compat
rvalyi Mar 24, 2025
5e1d42b
pre-commit fixes
rvalyi Mar 24, 2025
bb0d22c
pre-commit fixes
rvalyi Mar 24, 2025
3cbe2cb
fix typo
rvalyi Mar 24, 2025
b0fd129
pre-commit fix
rvalyi Mar 24, 2025
509aa08
consultar cadastro is not a national service anymore
rvalyi Mar 24, 2025
a8516d6
add CTe WSDL + SOAP bindings
rvalyi Mar 24, 2025
2f03dda
don't try to lint MDF-e scraped servers
rvalyi Mar 24, 2025
b1eeffe
add MDF-e servers and servers_scraper
rvalyi Mar 24, 2025
b584fa8
add MDF-e WSDL downloader and files
rvalyi Mar 24, 2025
f7b7f85
add MDFe SOAP bindings
rvalyi Mar 24, 2025
e0467cb
optional [soap] dependencies
rvalyi Mar 24, 2025
d6803bf
import NFe servers
rvalyi Mar 25, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
add MDFe SOAP bindings
rvalyi committed Mar 24, 2025
commit f7b7f8596f43bd99ba58d94b1b42be8e97444d46
6 changes: 6 additions & 0 deletions nfelib/mdfe/soap/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
"""This file was generated by xsdata, v24.2.1, on 2025-03-24 16:09:49
Generator: DataclassGenerator
See: https://xsdata.readthedocs.io/
"""
# nothing here
21 changes: 21 additions & 0 deletions nfelib/mdfe/soap/v3_0/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
"""This file was generated by xsdata, v24.2.1, on 2025-03-24 16:18:28
Generator: DataclassGenerator
See: https://xsdata.readthedocs.io/
"""

from nfelib.mdfe.soap.v3_0.mdferecepcaosinc import (
MdfeRecepcaoSincSoap12MdfeRecepcao,
MdfeRecepcaoSincSoap12MdfeRecepcaoInput,
MdfeRecepcaoSincSoap12MdfeRecepcaoOutput,
MdfeDadosMsg,
MdfeRecepcaoResult,
)

__all__ = [
"MdfeRecepcaoSincSoap12MdfeRecepcao",
"MdfeRecepcaoSincSoap12MdfeRecepcaoInput",
"MdfeRecepcaoSincSoap12MdfeRecepcaoOutput",
"MdfeDadosMsg",
"MdfeRecepcaoResult",
]
202 changes: 202 additions & 0 deletions nfelib/mdfe/soap/v3_0/mdfeconsnaoenc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
"""This file was generated by xsdata, v24.2.1, on 2025-03-24 16:18:26
Generator: DataclassGenerator
See: https://xsdata.readthedocs.io/
"""

from dataclasses import dataclass, field
from nfelib import CommonMixin
from typing import Dict, List, Optional

__NAMESPACE__ = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsNaoEnc"


@dataclass
class MdfeCabecMsg(CommonMixin):
class Meta:
name = "mdfeCabecMsg"
namespace = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsNaoEnc"

cUF: Optional[str] = field(
default=None,
metadata={
"type": "Element",
},
)
versaoDados: Optional[str] = field(
default=None,
metadata={
"type": "Element",
},
)
any_attributes: Dict[str, str] = field(
default_factory=dict,
metadata={
"type": "Attributes",
"namespace": "##any",
},
)


@dataclass
class MdfeConsNaoEncResult(CommonMixin):
class Meta:
name = "mdfeConsNaoEncResult"
namespace = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsNaoEnc"

content: List[object] = field(
default_factory=list,
metadata={
"type": "Wildcard",
"namespace": "##any",
"mixed": True,
},
)


@dataclass
class MdfeDadosMsg(CommonMixin):
class Meta:
name = "mdfeDadosMsg"
namespace = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsNaoEnc"

content: List[object] = field(
default_factory=list,
metadata={
"type": "Wildcard",
"namespace": "##any",
"mixed": True,
},
)


@dataclass
class MdfeConsNaoEncSoap12MdfeConsNaoEncInput(CommonMixin):
class Meta:
name = "Envelope"
namespace = "http://schemas.xmlsoap.org/soap/envelope/"

Body: Optional["MdfeConsNaoEncSoap12MdfeConsNaoEncInput.Body"] = field(
default=None,
metadata={
"type": "Element",
},
)
Header: Optional["MdfeConsNaoEncSoap12MdfeConsNaoEncInput.Header"] = field(
default=None,
metadata={
"type": "Element",
},
)

@dataclass
class Body(CommonMixin):
mdfeDadosMsg: Optional[MdfeDadosMsg] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsNaoEnc",
},
)

@dataclass
class Header(CommonMixin):
mdfeCabecMsg: Optional[MdfeCabecMsg] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsNaoEnc",
},
)


@dataclass
class MdfeConsNaoEncSoap12MdfeConsNaoEncOutput(CommonMixin):
class Meta:
name = "Envelope"
namespace = "http://schemas.xmlsoap.org/soap/envelope/"

Body: Optional["MdfeConsNaoEncSoap12MdfeConsNaoEncOutput.Body"] = field(
default=None,
metadata={
"type": "Element",
},
)
Header: Optional["MdfeConsNaoEncSoap12MdfeConsNaoEncOutput.Header"] = (
field(
default=None,
metadata={
"type": "Element",
},
)
)

@dataclass
class Body(CommonMixin):
mdfeConsNaoEncResult: Optional[MdfeConsNaoEncResult] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsNaoEnc",
},
)
Fault: Optional[
"MdfeConsNaoEncSoap12MdfeConsNaoEncOutput.Body.Fault"
] = field(
default=None,
metadata={
"type": "Element",
},
)

@dataclass
class Fault(CommonMixin):
faultcode: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)
faultstring: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)
faultactor: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)
detail: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)

@dataclass
class Header(CommonMixin):
mdfeCabecMsg: Optional[MdfeCabecMsg] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsNaoEnc",
},
)


class MdfeConsNaoEncSoap12MdfeConsNaoEnc:
style = "document"
location = (
"https://mdfe.svrs.rs.gov.br/ws/MDFeConsNaoEnc/MDFeConsNaoEnc.asmx"
)
transport = "http://schemas.xmlsoap.org/soap/http"
soapAction = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsNaoEnc/mdfeConsNaoEnc"
input = MdfeConsNaoEncSoap12MdfeConsNaoEncInput
output = MdfeConsNaoEncSoap12MdfeConsNaoEncOutput
200 changes: 200 additions & 0 deletions nfelib/mdfe/soap/v3_0/mdfeconsulta.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,200 @@
"""This file was generated by xsdata, v24.2.1, on 2025-03-24 16:18:25
Generator: DataclassGenerator
See: https://xsdata.readthedocs.io/
"""

from dataclasses import dataclass, field
from nfelib import CommonMixin
from typing import Dict, List, Optional

__NAMESPACE__ = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsulta"


@dataclass
class MdfeCabecMsg(CommonMixin):
class Meta:
name = "mdfeCabecMsg"
namespace = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsulta"

cUF: Optional[str] = field(
default=None,
metadata={
"type": "Element",
},
)
versaoDados: Optional[str] = field(
default=None,
metadata={
"type": "Element",
},
)
any_attributes: Dict[str, str] = field(
default_factory=dict,
metadata={
"type": "Attributes",
"namespace": "##any",
},
)


@dataclass
class MdfeConsultaMdfresult(CommonMixin):
class Meta:
name = "mdfeConsultaMDFResult"
namespace = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsulta"

content: List[object] = field(
default_factory=list,
metadata={
"type": "Wildcard",
"namespace": "##any",
"mixed": True,
},
)


@dataclass
class MdfeDadosMsg(CommonMixin):
class Meta:
name = "mdfeDadosMsg"
namespace = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsulta"

content: List[object] = field(
default_factory=list,
metadata={
"type": "Wildcard",
"namespace": "##any",
"mixed": True,
},
)


@dataclass
class MdfeConsultaSoap12MdfeConsultaMdfInput(CommonMixin):
class Meta:
name = "Envelope"
namespace = "http://schemas.xmlsoap.org/soap/envelope/"

Body: Optional["MdfeConsultaSoap12MdfeConsultaMdfInput.Body"] = field(
default=None,
metadata={
"type": "Element",
},
)
Header: Optional["MdfeConsultaSoap12MdfeConsultaMdfInput.Header"] = field(
default=None,
metadata={
"type": "Element",
},
)

@dataclass
class Body(CommonMixin):
mdfeDadosMsg: Optional[MdfeDadosMsg] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsulta",
},
)

@dataclass
class Header(CommonMixin):
mdfeCabecMsg: Optional[MdfeCabecMsg] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsulta",
},
)


@dataclass
class MdfeConsultaSoap12MdfeConsultaMdfOutput(CommonMixin):
class Meta:
name = "Envelope"
namespace = "http://schemas.xmlsoap.org/soap/envelope/"

Body: Optional["MdfeConsultaSoap12MdfeConsultaMdfOutput.Body"] = field(
default=None,
metadata={
"type": "Element",
},
)
Header: Optional["MdfeConsultaSoap12MdfeConsultaMdfOutput.Header"] = field(
default=None,
metadata={
"type": "Element",
},
)

@dataclass
class Body(CommonMixin):
mdfeConsultaMDFResult: Optional[MdfeConsultaMdfresult] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsulta",
},
)
Fault: Optional[
"MdfeConsultaSoap12MdfeConsultaMdfOutput.Body.Fault"
] = field(
default=None,
metadata={
"type": "Element",
},
)

@dataclass
class Fault(CommonMixin):
faultcode: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)
faultstring: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)
faultactor: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)
detail: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)

@dataclass
class Header(CommonMixin):
mdfeCabecMsg: Optional[MdfeCabecMsg] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsulta",
},
)


class MdfeConsultaSoap12MdfeConsultaMdf:
style = "document"
location = "https://mdfe.svrs.rs.gov.br/ws/MDFeConsulta/MDFeConsulta.asmx"
transport = "http://schemas.xmlsoap.org/soap/http"
soapAction = (
"http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeConsulta/mdfeConsultaMDF"
)
input = MdfeConsultaSoap12MdfeConsultaMdfInput
output = MdfeConsultaSoap12MdfeConsultaMdfOutput
214 changes: 214 additions & 0 deletions nfelib/mdfe/soap/v3_0/mdfedistribuicaodfe.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,214 @@
"""This file was generated by xsdata, v24.2.1, on 2025-03-24 16:18:27
Generator: DataclassGenerator
See: https://xsdata.readthedocs.io/
"""

from dataclasses import dataclass, field
from nfelib import CommonMixin
from typing import Dict, List, Optional

__NAMESPACE__ = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeDistribuicaoDFe"


@dataclass
class MdfeCabecMsg(CommonMixin):
class Meta:
name = "mdfeCabecMsg"
namespace = (
"http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeDistribuicaoDFe"
)

cUF: Optional[str] = field(
default=None,
metadata={
"type": "Element",
},
)
versaoDados: Optional[str] = field(
default=None,
metadata={
"type": "Element",
},
)
any_attributes: Dict[str, str] = field(
default_factory=dict,
metadata={
"type": "Attributes",
"namespace": "##any",
},
)


@dataclass
class MdfeDadosMsg(CommonMixin):
class Meta:
name = "mdfeDadosMsg"
namespace = (
"http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeDistribuicaoDFe"
)

content: List[object] = field(
default_factory=list,
metadata={
"type": "Wildcard",
"namespace": "##any",
"mixed": True,
},
)


@dataclass
class MdfeDistDfeInteresseResult(CommonMixin):
class Meta:
name = "mdfeDistDFeInteresseResult"
namespace = (
"http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeDistribuicaoDFe"
)

content: List[object] = field(
default_factory=list,
metadata={
"type": "Wildcard",
"namespace": "##any",
"mixed": True,
},
)


@dataclass
class MdfeDistribuicaoDfeSoap12MdfeDistDfeInteresseInput(CommonMixin):
class Meta:
name = "Envelope"
namespace = "http://schemas.xmlsoap.org/soap/envelope/"

Body: Optional[
"MdfeDistribuicaoDfeSoap12MdfeDistDfeInteresseInput.Body"
] = field(
default=None,
metadata={
"type": "Element",
},
)
Header: Optional[
"MdfeDistribuicaoDfeSoap12MdfeDistDfeInteresseInput.Header"
] = field(
default=None,
metadata={
"type": "Element",
},
)

@dataclass
class Body(CommonMixin):
mdfeDadosMsg: Optional[MdfeDadosMsg] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeDistribuicaoDFe",
},
)

@dataclass
class Header(CommonMixin):
mdfeCabecMsg: Optional[MdfeCabecMsg] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeDistribuicaoDFe",
},
)


@dataclass
class MdfeDistribuicaoDfeSoap12MdfeDistDfeInteresseOutput(CommonMixin):
class Meta:
name = "Envelope"
namespace = "http://schemas.xmlsoap.org/soap/envelope/"

Body: Optional[
"MdfeDistribuicaoDfeSoap12MdfeDistDfeInteresseOutput.Body"
] = field(
default=None,
metadata={
"type": "Element",
},
)
Header: Optional[
"MdfeDistribuicaoDfeSoap12MdfeDistDfeInteresseOutput.Header"
] = field(
default=None,
metadata={
"type": "Element",
},
)

@dataclass
class Body(CommonMixin):
mdfeDistDFeInteresseResult: Optional[MdfeDistDfeInteresseResult] = (
field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeDistribuicaoDFe",
},
)
)
Fault: Optional[
"MdfeDistribuicaoDfeSoap12MdfeDistDfeInteresseOutput.Body.Fault"
] = field(
default=None,
metadata={
"type": "Element",
},
)

@dataclass
class Fault(CommonMixin):
faultcode: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)
faultstring: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)
faultactor: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)
detail: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)

@dataclass
class Header(CommonMixin):
mdfeCabecMsg: Optional[MdfeCabecMsg] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeDistribuicaoDFe",
},
)


class MdfeDistribuicaoDfeSoap12MdfeDistDfeInteresse:
style = "document"
location = "https://mdfe.svrs.rs.gov.br/ws/MDFeDistribuicaoDFe/MDFeDistribuicaoDFe.asmx"
transport = "http://schemas.xmlsoap.org/soap/http"
soapAction = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeDistribuicaoDFe/mdfeDistDFeInteresse"
input = MdfeDistribuicaoDfeSoap12MdfeDistDfeInteresseInput
output = MdfeDistribuicaoDfeSoap12MdfeDistDfeInteresseOutput
212 changes: 212 additions & 0 deletions nfelib/mdfe/soap/v3_0/mdferecepcaoevento.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
"""This file was generated by xsdata, v24.2.1, on 2025-03-24 16:18:22
Generator: DataclassGenerator
See: https://xsdata.readthedocs.io/
"""

from dataclasses import dataclass, field
from nfelib import CommonMixin
from typing import Dict, List, Optional

__NAMESPACE__ = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoEvento"


@dataclass
class MdfeCabecMsg(CommonMixin):
class Meta:
name = "mdfeCabecMsg"
namespace = (
"http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoEvento"
)

cUF: Optional[str] = field(
default=None,
metadata={
"type": "Element",
},
)
versaoDados: Optional[str] = field(
default=None,
metadata={
"type": "Element",
},
)
any_attributes: Dict[str, str] = field(
default_factory=dict,
metadata={
"type": "Attributes",
"namespace": "##any",
},
)


@dataclass
class MdfeDadosMsg(CommonMixin):
class Meta:
name = "mdfeDadosMsg"
namespace = (
"http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoEvento"
)

content: List[object] = field(
default_factory=list,
metadata={
"type": "Wildcard",
"namespace": "##any",
"mixed": True,
},
)


@dataclass
class MdfeRecepcaoEventoResult(CommonMixin):
class Meta:
name = "mdfeRecepcaoEventoResult"
namespace = (
"http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoEvento"
)

content: List[object] = field(
default_factory=list,
metadata={
"type": "Wildcard",
"namespace": "##any",
"mixed": True,
},
)


@dataclass
class MdfeRecepcaoEventoSoap12MdfeRecepcaoEventoInput(CommonMixin):
class Meta:
name = "Envelope"
namespace = "http://schemas.xmlsoap.org/soap/envelope/"

Body: Optional["MdfeRecepcaoEventoSoap12MdfeRecepcaoEventoInput.Body"] = (
field(
default=None,
metadata={
"type": "Element",
},
)
)
Header: Optional[
"MdfeRecepcaoEventoSoap12MdfeRecepcaoEventoInput.Header"
] = field(
default=None,
metadata={
"type": "Element",
},
)

@dataclass
class Body(CommonMixin):
mdfeDadosMsg: Optional[MdfeDadosMsg] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoEvento",
},
)

@dataclass
class Header(CommonMixin):
mdfeCabecMsg: Optional[MdfeCabecMsg] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoEvento",
},
)


@dataclass
class MdfeRecepcaoEventoSoap12MdfeRecepcaoEventoOutput(CommonMixin):
class Meta:
name = "Envelope"
namespace = "http://schemas.xmlsoap.org/soap/envelope/"

Body: Optional["MdfeRecepcaoEventoSoap12MdfeRecepcaoEventoOutput.Body"] = (
field(
default=None,
metadata={
"type": "Element",
},
)
)
Header: Optional[
"MdfeRecepcaoEventoSoap12MdfeRecepcaoEventoOutput.Header"
] = field(
default=None,
metadata={
"type": "Element",
},
)

@dataclass
class Body(CommonMixin):
mdfeRecepcaoEventoResult: Optional[MdfeRecepcaoEventoResult] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoEvento",
},
)
Fault: Optional[
"MdfeRecepcaoEventoSoap12MdfeRecepcaoEventoOutput.Body.Fault"
] = field(
default=None,
metadata={
"type": "Element",
},
)

@dataclass
class Fault(CommonMixin):
faultcode: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)
faultstring: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)
faultactor: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)
detail: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)

@dataclass
class Header(CommonMixin):
mdfeCabecMsg: Optional[MdfeCabecMsg] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoEvento",
},
)


class MdfeRecepcaoEventoSoap12MdfeRecepcaoEvento:
style = "document"
location = "https://mdfe.svrs.rs.gov.br/ws/MDFeRecepcaoEvento/MDFeRecepcaoEvento.asmx"
transport = "http://schemas.xmlsoap.org/soap/http"
soapAction = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoEvento/mdfeRecepcaoEvento"
input = MdfeRecepcaoEventoSoap12MdfeRecepcaoEventoInput
output = MdfeRecepcaoEventoSoap12MdfeRecepcaoEventoOutput
139 changes: 139 additions & 0 deletions nfelib/mdfe/soap/v3_0/mdferecepcaosinc.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,139 @@
"""This file was generated by xsdata, v24.2.1, on 2025-03-24 16:18:28
Generator: DataclassGenerator
See: https://xsdata.readthedocs.io/
"""

from dataclasses import dataclass, field
from nfelib import CommonMixin
from typing import List, Optional

__NAMESPACE__ = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoSinc"


@dataclass
class MdfeRecepcaoSincSoap12MdfeRecepcaoInput(CommonMixin):
class Meta:
name = "Envelope"
namespace = "http://schemas.xmlsoap.org/soap/envelope/"

Body: Optional["MdfeRecepcaoSincSoap12MdfeRecepcaoInput.Body"] = field(
default=None,
metadata={
"type": "Element",
},
)

@dataclass
class Body(CommonMixin):
mdfeDadosMsg: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoSinc",
},
)


@dataclass
class MdfeDadosMsg(CommonMixin):
class Meta:
name = "mdfeDadosMsg"
namespace = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoSinc"

value: str = field(
default="",
metadata={
"required": True,
},
)


@dataclass
class MdfeRecepcaoResult(CommonMixin):
class Meta:
name = "mdfeRecepcaoResult"
namespace = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoSinc"

content: List[object] = field(
default_factory=list,
metadata={
"type": "Wildcard",
"namespace": "##any",
"mixed": True,
},
)


@dataclass
class MdfeRecepcaoSincSoap12MdfeRecepcaoOutput(CommonMixin):
class Meta:
name = "Envelope"
namespace = "http://schemas.xmlsoap.org/soap/envelope/"

Body: Optional["MdfeRecepcaoSincSoap12MdfeRecepcaoOutput.Body"] = field(
default=None,
metadata={
"type": "Element",
},
)

@dataclass
class Body(CommonMixin):
mdfeRecepcaoResult: Optional[MdfeRecepcaoResult] = field(
default=None,
metadata={
"type": "Element",
"namespace": "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoSinc",
},
)
Fault: Optional[
"MdfeRecepcaoSincSoap12MdfeRecepcaoOutput.Body.Fault"
] = field(
default=None,
metadata={
"type": "Element",
},
)

@dataclass
class Fault(CommonMixin):
faultcode: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)
faultstring: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)
faultactor: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)
detail: Optional[str] = field(
default=None,
metadata={
"type": "Element",
"namespace": "",
},
)


class MdfeRecepcaoSincSoap12MdfeRecepcao:
style = "document"
location = (
"https://mdfe.svrs.rs.gov.br/ws/MDFeRecepcaoSinc/MDFeRecepcaoSinc.asmx"
)
transport = "http://schemas.xmlsoap.org/soap/http"
soapAction = "http://www.portalfiscal.inf.br/mdfe/wsdl/MDFeRecepcaoSinc/mdfeRecepcao"
input = MdfeRecepcaoSincSoap12MdfeRecepcaoInput
output = MdfeRecepcaoSincSoap12MdfeRecepcaoOutput

Unchanged files with check annotations Beta

def _only_if_valid_certificate(method, self):
if self.valid_certificate:
return method(self)

Check warning on line 37 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L37

Added line #L37 was not covered by tests
return lambda: _logger.info(
"Skipping test because you didn't provide a valid A1 certificate"
)
# TODO customize NFe path via ENV var?
parser = XmlParser()
if environ.get("NFE_FILE"):
nfe_path = environ["NFE_FILE"]

Check warning on line 71 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L71

Added line #L71 was not covered by tests
else:
nfe_path = "tests/nfe/fixtures/procNFe.xml"
)
if environ.get("CERT_FILE") and environ.get("CERT_PASSWORD"):
cls.valid_certificate = True
with open(environ["CERT_FILE"], "rb") as pkcs12_file:
cls.cert_data = pkcs12_file.read()
cls.cert_password = environ["CERT_PASSWORD"]
cls.fake_certificate = False

Check warning on line 85 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L81-L85

Added lines #L81 - L85 were not covered by tests
else:
cls.valid_certificate = False
valid = (True,)
@only_if_valid_certificate
def test_0_status(self):
res = self.client.status_servico()
self.assertEqual(res.cStat, "107")

Check warning on line 120 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L119-L120

Added lines #L119 - L120 were not covered by tests
@mock.patch.object(DefaultTransport, "post")
def test_0_status_mocked(self, mock_post):
@only_if_valid_certificate
def test_1_envia_documento(self):
res = self.client.envia_documento([self.signed_nfe_xml])
self.assertEqual(res.cStat, "103")
print(res)

Check warning on line 132 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L130-L132

Added lines #L130 - L132 were not covered by tests
time.sleep(int(res.infRec.tMed))
res = self.client.consulta_recibo(numero=res.infRec.nRec)
print(res)

Check warning on line 136 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L134-L136

Added lines #L134 - L136 were not covered by tests
# res = self.client.consulta_documento(self.nfe.infNFe.Id[3:])
# # we actually test the NFe is not found because it is the test environment
# print(res)
@only_if_valid_certificate
def test_2_consulta_documento(self):
res = self.client.consulta_documento(self.nfe.infNFe.Id[3:])

Check warning on line 151 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L151

Added line #L151 was not covered by tests
# we actually test the NFe is not found because it is the test environment
self.assertIn(res.cStat, ("217", "526"))

Check warning on line 153 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L153

Added line #L153 was not covered by tests
@mock.patch.object(DefaultTransport, "post")
def test_2_consulta_documento_mocked(self, mock_post):
@only_if_valid_certificate
def test_4_consulta_recibo(self):
nrec = "423002202113232"
res = self.client.consulta_recibo(nrec)

Check warning on line 168 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L167-L168

Added lines #L167 - L168 were not covered by tests
# we actually test the NFe is not found because it is the test environment
self.assertEqual(res.cStat, "106") # TODO should be 104 normally

Check warning on line 170 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L170

Added line #L170 was not covered by tests
@mock.patch.object(DefaultTransport, "post")
def test_4_consulta_recibo_mocked(self, mock_post):
@only_if_valid_certificate
def test_envia_e_consulta_e_cancela(self):
"isso mais ou menos test o processa_documento do erpbrasil.edoc"
proc_envio = self.client.envia_documento(self.signed_nfe_xml)
self.client._aguarda_tempo_medio(proc_envio)
res = self.client.consulta_recibo(proc_envio=proc_envio)

Check warning on line 188 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L186-L188

Added lines #L186 - L188 were not covered by tests
# TODO por algum motivo eu pego um erro como:
# <infProt><tpAmb>2</tpAmb><verAplic>SVRS202305261028</verAplic><chNFe>42230675277525000259550010000364481754015406</chNFe><dhRecbto>2023-06-12T22:57:51-03:00</dhRecbto><digVal>IoYUWXt2fIiRXb7UYRgl77c6Zlk=</digVal><cStat>297</cStat><xMotivo>Rejeicao: Assinatura difere do calculado</xMotivo></infProt>
self.assertEqual(res.cStat, "104")

Check warning on line 191 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L191

Added line #L191 was not covered by tests
cancel_event = self.client.cancela_documento(

Check warning on line 193 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L193

Added line #L193 was not covered by tests
self.nfe.infNFe.Id[3:], "423002202113232", "Era apenas um teste."
)
self.client.enviar_lote_evento([cancel_event])

Check warning on line 196 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L196

Added line #L196 was not covered by tests
# self.assertEqual(1, 2)
@only_if_valid_certificate
def test_inutilizacao(self):
inut_event = self.client.inutilizacao(

Check warning on line 202 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L202

Added line #L202 was not covered by tests
"81583054000129", "55", "1", "2", "2", "Era apenas um teste"
)
self.client.envia_inutilizacao(inut_event)

Check warning on line 205 in tests/nfe/test_client.py

Codecov / codecov/patch

tests/nfe/test_client.py#L205

Added line #L205 was not covered by tests