O WooCommerce é uma plataforma de comércio eletrônico que permite a criação de lojas online para vender produtos e serviços. Ele é um plugin para o WordPress, o que significa que é fácil de instalar e configurar, mesmo para usuários sem muita experiência em programação ou design web.
O WooCommerce oferece uma ampla variedade de recursos, incluindo gerenciamento de estoque, processamento de pagamentos, ferramentas de marketing e análise de dados de vendas. Ele também suporta vários gateways de pagamento, integração com serviços de entrega e uma grande variedade de extensões e temas personalizáveis.
Uma das vantagens do WooCommerce é que ele é altamente escalável e pode ser personalizado para atender às necessidades de diferentes tipos de empresas, desde pequenas startups até grandes corporações. Além disso, como é um plugin para o WordPress, os usuários têm acesso a uma grande comunidade de desenvolvedores e designers que podem ajudá-los a resolver problemas e melhorar sua loja online.
Como integrar ERP Protheus com o WooCommerce?
Para integrar o ERP Protheus com o WooCommerce, é necessário usar uma solução de integração de terceiros, pois o Protheus não oferece uma integração direta com o WooCommerce. Existem várias soluções de integração disponíveis no mercado, incluindo:
Plug-in de integração: Alguns plug-ins de integração de terceiros permitem que você conecte diretamente o seu WooCommerce ao seu sistema ERP Protheus. Esses plug-ins podem automatizar o processo de atualização de estoque, preço e informações de produto, bem como o processamento de pedidos.
Integração via API: A outra opção é criar uma integração personalizada usando a API do WooCommerce e do Protheus. Isso exigirá que você tenha conhecimento técnico para desenvolver a solução de integração personalizada, mas pode ser mais flexível em termos de personalização e integração de fluxos de trabalho específicos da sua empresa.
Abaixo seguem alguns pontos principais que você deve observar ao integrar estas duas ferramentas:
– Cadastro de Clientes: Exportação do cadastro de clientes, conforme inclusão, alteração ou bloqueio no sistema ERP
– Cadastro de Produtos: Exportar produtos que estarão marcados através de campo customizado que indica se o item será exportado ou não.
Será possível também realizar uploads das imagens dos produtos
– Estoque de Produtos: Exportação do estoque dos produtos através dos movimentos do ERP.
Movimentos do ERP:
* Emissão de Nota Fiscal (Entrada e Saída)
* Transferência entre armazéns
– Tabela de Preços: Exportação das tabelas de preço do ERP para o sistema e-commerce
– Regra de Negócios: Exportação das regras de negócio do ERP para o sistema e-commerce
– Regra de Descontos: Exportação das regras de desconto do ERP para o sistema e-commerce
– Pedidos de Venda: Integração dos pedidos de vendas via JOB, através de rotina executada por ExecAuto, contemplando todas as configurações do sistema ERP.
Deverá haver separação através de regra pré-definida que direcionará o pedido de venda para a filial correta do sistema ERP.
Atualização dos status dos pedidos deverão ser enviados ao e-commerce, conforme liberações e faturamento.
Aqui segue um exemplo em ADVPL de funções que trazem pedidos do Woocommerce para o ERP:
#INCLUDE "protheus.ch"
#INCLUDE "topconn.ch"
#INCLUDE "RWMAKE.CH"
#INCLUDE "HBUTTON.CH"
#INCLUDE "TBICONN.CH"
#INCLUDE "Colors.ch"
#INCLUDE "Font.ch"
#INCLUDE "AP5MAIL.CH"
#INCLUDE 'FWMVCDef.ch'
#INCLUDE "APWIZARD.CH"
#INCLUDE "FILEIO.CH"
#INCLUDE "RPTDEF.CH"
#INCLUDE "FWPrintSetup.ch"
#INCLUDE "TOTVS.CH"
#INCLUDE "PARMTYPE.CH"
#Include "APWEBSRV.CH"
//Constantes
#Define STR_PULA Chr(13)+Chr(10) //Pula linha
/*/{Protheus.doc} FOFAT001
BAIXAS DE PEDIDOS DE VENDAS DO SITE.
@author FBSolutions
@since 15/10/2019
@version 1.0
@example U_FOFAT001()
@obs
/*/
User function FOFAT001()
Private _cEmp := '01' //'99'
Private _cFil := '010002'//'01'
Private cDirJSON := ''
Private cDirNJSON := ''
Private cAllJSONs := ''
Private cSemaf := ""
RpcClearEnv()
RPCSetType(3) //não consome licença.
ConOut("Antes - PREPARE ENVIRONMENT ")
PREPARE ENVIRONMENT EMPRESA _cEmp FILIAL _cFil
ConOut("Depois - PREPARE ENVIRONMENT ")
cDirJSON := "\system\Site\ped_baixados"
cDirNJSON := "\system\Site\ped_importados"
//Verifico se os diretórios existem
If ! File("\system\Site")
If MakeDir("\system\Site") <> 0
return
EndIf
endif
If ! File(cDirJSON)
If MakeDir(cDirJSON) <> 0
return
EndIf
endif
if !File(cDirNJSON)
If MakeDir(cDirNJSON) <> 0
return
EndIf
endif
cAllJSONs := AllPedSite()
if ! Empty(cAllJSONs)
fPDadosJSON(cAllJSONs)
endif
return
/*---------------------------------------------------------------------*
| Func: fPDadosJSON |
| Autor: FBSolutions |
| Data: 15/10/2019 |
| Desc: Função que pega dados do JSON |
| Obs.: |
*---------------------------------------------------------------------*/
static function fPDadosJSON(cJSON)
Local lRet := .F.
Local oJson := tJsonParser():New()
Local strJson := Nil
Local lenStrJson := 0
Local aJsonfields := {}
Local nRetParser := 0
Local oJHM := .F.
Local cIDSC5 := ""
Local aPedSit := {}
Private aRetorno := {}
Private oJsPedFeed := Nil
lenStrJson := Len(cJSON)
// Faz o Parser da mensagem JSon e extrai para Array (aJsonfields) e cria tambem um HashMap para os dados da mensagem (oJHM)
lRet := oJson:Json_Hash(cJSON, lenStrJson, @aJsonfields, @nRetParser, @oJHM)
//Necessário para remover trecho do Json que dá erro na função FWJsonDeserialize
nLM := At('"locations_map"', cJSON)
nFV := At('"first_version"', cJSON)
cJSON := StrTran(cJSON, SubStr(cJSON,nLM,nFV-nLM), "")
cJSON := StrTran(cJSON, 'breaks":{"0"', 'breaks":{"O"')
FWJsonDeserialize(cJSON, @oJsPedFeed)
If ( lRet == .F. )
ConOut("##### [JSON][ERR] " + "Parser com erro" + " MSG len: " + AllTrim(Str(lenStrJson)) + " bytes lidos: " + AllTrim(Str(nRetParser)))
ConOut("Erro a partir: " + SubStr(cJSON, (nRetParser+1)))
else
if type( "oJsPedFeed" ) <> "U"
aPedSit := oJsPedFeed
else
aPedSit := {}
endif
For iX := 1 to len(aPedSit)
cIDSC5 := Posicione("SC5", 10, xFilial('SC5') + cValtochar(aPedSit[iX]:ID) , 'C5_X_IDSIT')
if Empty(cIDSC5 )
fGravaBody(cDirJSON, IDPedSite(cValtochar(aPedSit[iX]:ID)), cValtochar(aPedSit[iX]:ID) )
endif
cIDSC5 := ""
Next iX
endif
return
/*---------------------------------------------------------------------*
| Func: fGravaBody |
| Autor: FBSolutions |
| Data: 12/03/2019 |
| Desc: Função que grava no diretório |
| Obs.: |
*---------------------------------------------------------------------*/
static function fGravaBody(cDir, cConteudo, cNome)
ConOut("Entrou na função fGravaBody. cDir: " + cDir + " cNome: " + cNome + " cConteudo: " + substr(cConteudo,1,10)+" ...")
MemoWrite(cDir + "\" + cNome + ".txt", cConteudo)
ConOut("gravou no diretorio")
return
/*---------------------------------------------------------------------*
| Func: IDPedSite |
| Autor: FbSolutions |
| Data: 15/10/2019 |
| Desc: Função que pega um unico pedido através do ID |
| Obs.: / |
*---------------------------------------------------------------------*/
Static Function IDPedSite(cIDPed)
Local aArea := GetArea()
Local cJSONSnd := ""
Private oRest := FWRest():New("https://minhaempresa.com.br")
Private aHeader := {}
private cResPed := 'Pedido não localizado'
private cErro := ''
aAdd( aHeader, 'Content-Type: application/json;charset=utf-8' )
aAdd( aHeader, 'User-Agent: Mozilla/4.0 (compatible; Protheus 7.00.100812P-20101227; ADVPL WSDL Client 1.101007)' )
oRest:setPath("/wp-json/wc/v3/orders/"+cIDPed+"/?consumer_key=ck_161e0743956f2e627c5506872b89aff563bdac14&consumer_secret=cs_d7fbf510ae841b8e2f27e8ad32914444a4e596c9")
If oRest:Get(aHeader)
cResPed := oRest:GetResult()
Else
cErro := oRest:GetLastError()
Endif
RestArea(aArea)
Return cResPed
/*---------------------------------------------------------------------*
| Func: AllPedSite |
| Autor: FbSolutions |
| Data: 15/10/2019 |
| Desc: Função que pega os pedidos do site |
| Obs.: / |
*---------------------------------------------------------------------*/
Static Function AllPedSite()
Local aArea := GetArea()
Local cJSONSnd := ""
Local cDtPar := substr(dtos(Date()), 1, 4 ) + "-" + substr(dtos(Date()), 5, 2 ) + "-" + substr(dtos(Date()), 7, 2 )
Local cHrPar := "T00:00:00" //Time()
Private oRest := FWRest():New("https://minhaempresa.com.br")
Private aHeader := {}
private cResult := ''
private cErro := ''
aAdd( aHeader, 'Content-Type: application/json;charset=utf-8' )
aAdd( aHeader, 'User-Agent: Mozilla/4.0 (compatible; Protheus 7.00.100812P-20101227; ADVPL WSDL Client 1.101007)' )
//oRest:setPath("/wp-json/wc/v3/orders/?consumer_key=ck_161e0743956f2e627c5506872b89aff563bdac14&consumer_secret=cs_d7fbf510ae841b8e2f27e8ad32914444a4e596c9&status=processing&after=" + cDtPar + cHrPar )
oRest:setPath("/wp-json/wc/v3/orders/?consumer_key=ck_161e0743956f2e627c5506872b89aff563bdac14&consumer_secret=cs_d7fbf510ae841b8e2f27e8ad32914444a4e596c9&status=processing&after=2018-08-27T10:45:00")
//Verificar status do Pedido
If oRest:Get(aHeader)
cResult := oRest:GetResult()
Else
cErro := oRest:GetLastError()
Endif
RestArea(aArea)
Return cResult
/*---------------------------------------------------------------------*
| Func: SndPed2 |
| Autor: FbSolutions |
| Data: 25/05/2019 |
| Desc: Função que envia a requisição REST |
| Obs.: modelo com a função XMLPostRet |
*---------------------------------------------------------------------*/
User Function SndPed2()
Local nAux := 1
Local cSoapSend
Local XMLHeadRet
Local aHeader := {}
Local XMLPostRet
XMLHeadRet:= ""
aAdd( aHeader, 'Content-Type: application/json;charset=utf-8' )
aAdd( aHeader, 'User-Agent: Mozilla/4.0 (compatible; Protheus 7.00.100812P-20101227; ADVPL WSDL Client 1.101007)' )
For nAux := 1 To Len(aHeader)
ConOut( "HeaderOut: " + aHeader[nAux] )
Next
_URL:= "https://minhaempresa.com.br/wp-json/wc/v3/orders/?consumer_key=ck_161e0743956f2e627c5506872b89aff563bdac14&consumer_secret=cs_d7fbf510ae841b8e2f27e8ad32914444a4e596c9&status=processing&after=2019-08-27T10:45:00"
// HttpPost( < cUrl >, [ cGetParms ], [ cPostParms ], [ nTimeOut ], [ aHeadStr ], [ @cHeaderGet ] )
XMLPostRet := HTTPSGet(_URL, "", "", "", aHeader, @XMLHeadRet)
If ValType(XmlPostRet) <> "U"
cMsgErro := ""
else
cMsgErro := erro
EndIf
Return
Independentemente do método escolhido, a integração do ERP Protheus com o WooCommerce pode fornecer uma série de benefícios, como redução de erros de entrada de dados, maior eficiência no gerenciamento de estoque e processamento mais rápido de pedidos. Em resumo, o WooCommerce é uma excelente plataforma de comércio eletrônico, com muitas vantagens e recursos. Com sua escalabilidade, personalização e SEO amigável, é uma excelente escolha para proprietários de lojas on-line que desejam uma plataforma confiável e flexível para gerenciar seu negócio on-line.