botserver/templates/bling.gbai/bling.gbdialog/sync-erp.bas
Rodrigo Rodriguez (Pragmatismo) 48c1ae0b51 , dt.month, dt.hour, dt.is_weekend, etc.)
- Add startup wizard module for first-run configuration
- Add white-label branding system with .product file support
- Add bot manager for lifecycle, MinIO buckets, and templates
- Add version tracking registry for component updates
- Create comparison doc: BASIC vs n8n/Zapier/Make/Copilot
- Add WhatsApp-style sample dialogs to template documentation
- Add data traceability SVG diagram ```
2025-11-30 15:07:29 -03:00

333 lines
8.4 KiB
QBasic

REM Geral
REM SET SCHEDULE "0 30 22 * * *"
daysToSync = -7
ontem = DATEADD today, "days", daysToSync
ontem = FORMAT ontem, "yyyy-MM-dd"
tomorrow = DATEADD today, "days", 1
tomorrow = FORMAT tomorrow, "yyyy-MM-dd"
dateFilter = "&dataAlteracaoInicial=${ontem}&dataAlteracaoFinal=${tomorrow}"
admin = admin1
SEND EMAIL admin, "Sincronismo: ${ontem} e ${tomorrow} (${daysToSync * -1} dia(s)) iniciado..."
REM Produtos
i = 1
SEND EMAIL admin, "Sincronizando Produtos..."
DO WHILE i > 0 AND i < pages
REM ${dateFilter}
res = GET host + "/produtos?pagina=${i}&criterio=5&tipo=P&limite=${limit}${dateFilter}"
WAIT 0.33
list = res.data
res = null
REM Sincroniza itens de Produto
prd1 = ""
j = 0
k = 0
items = NEW ARRAY
DO WHILE j < ubound(list)
produto_id = list[j].id
res = GET host + "/produtos/${produto_id}"
WAIT 0.33
produto = res.data
res = null
IF produto.codigo && produto.codigo.trim().length THEN
prd1 = prd1 + "&idsProdutos%5B%5D=" + list[j].id
items[k] = produto
produto.sku = items[k].codigo
IF produto.variacoes.length > 0 THEN
produto.hierarquia = "p"
ELSE
produto.hierarquia = "s"
END IF
produtoDB = FIND "maria.Produtos", "sku=" + produto.codigo
IF produtoDB THEN
IF produtoDB.preco <> produto.preco THEN
hist = NEW OBJECT
hist.sku = produto.sku
hist.precoAntigo = produtoDB.preco
hist.precoAtual = produto.preco
hist.produto_id = produto.id
hist.dataModificado = FORMAT today, "yyyy-MM-dd"
SAVE "maria.HistoricoPreco", hist
hist = null
END IF
END IF
k = k + 1
END IF
j = j + 1
LOOP
list = null
list = items
MERGE "maria.Produtos" WITH list BY "Id"
list = items
REM Calcula ids de produtos
j = 0
DO WHILE j < ubound(list)
REM Varre todas as variações.
listV = list[j].variacoes
IF listV THEN
k = 0
prd2 = ""
DO WHILE k < ubound(listV)
IF listV[k].codigo && listV[k].codigo.trim().length THEN
listV[k].skuPai = list[j].sku
listV[k].sku = listV[k].codigo
listV[k].hierarquia = "f"
k = k + 1
ELSE
listV.splice(k, 1)
END IF
LOOP
k = 0
DO WHILE k < ubound(listV)
listV[k].hierarquia = 'f'
DELETE "maria.ProdutoImagem", "sku=" + listV[k].sku
REM Sincroniza images da variação.
images = listV[k]?.midia?.imagens?.externas
l = 0
DO WHILE l < ubound(images)
images[l].ordinal = k
images[l].sku = listV[k].sku
images[l].id= random()
l = l + 1
LOOP
SAVE "maria.ProdutoImagem", images
images=null
k = k + 1
LOOP
MERGE "maria.Produtos" WITH listV BY "Id"
END IF
listV=null
REM Sincroniza images do produto raiz.
DELETE "maria.ProdutoImagem", "sku=" + list[j].sku
k = 0
images = list[j].midia?.imagens?.externas
DO WHILE k < ubound(images)
images[k].ordinal = k
images[k].sku = list[j].sku
images[k].id= random()
k = k + 1
LOOP
SAVE "maria.ProdutoImagem", images
j = j + 1
LOOP
i = i + 1
IF list?.length < limit THEN
i = 0
END IF
list=null
res=null
items=null
LOOP
SEND EMAIL admin, "Produtos concluído."
RESET REPORT
REM Pedidos
SEND EMAIL admin, "Sincronizando Pedidos..."
i = 1
DO WHILE i > 0 AND i < pages
res = GET host + "/pedidos/vendas?pagina=${i}&limite=${limit}${dateFilter}"
list = res.data
res = null
REM Sincroniza itens
j = 0
fullList = []
DO WHILE j < ubound(list)
pedido_id = list[j].id
res = GET host + "/pedidos/vendas/${pedido_id}"
items = res.data.itens
REM Insere ref. de pedido no item.
k = 0
DO WHILE k < ubound(items)
items[k].pedido_id = pedido_id
items[k].sku = items[k].codigo
items[k].numero = list[j].numero
REM Obter custo do produto fornecedor do fornecedor marcado como default.
items[k].custo = items[k].valor / 2
k = k + 1
LOOP
MERGE "maria.PedidosItem" WITH items BY "Id"
items = res.data.parcelas
k = 0
DO WHILE k < ubound(items)
items[k].pedido_id = pedido_id
k = k + 1
LOOP
MERGE "maria.Parcela" WITH items BY "Id"
fullList[j] = res.data
res = null
j = j + 1
LOOP
MERGE "maria.Pedidos" WITH fullList BY "Id"
i = i + 1
IF list?.length < limit THEN
i = 0
END IF
list=null
res=null
LOOP
SEND EMAIL admin, "Pedidos concluído."
REM Comuns
pageVariable="pagina"
limitVariable="limite"
syncLimit = 100
REM Sincroniza CategoriaReceita
SEND EMAIL admin, "Sincronizando CategoriaReceita..."
syncPage = 1
totalCategoria = 0
DO WHILE syncPage > 0 AND syncPage <= pages
syncUrl = host + "/categorias/receitas-despesas?" + pageVariable + "=" + syncPage + "&" + limitVariable + "=" + syncLimit
syncRes = GET syncUrl
WAIT 0.33
IF syncRes.data THEN
syncItems = syncRes.data
syncCount = UBOUND(syncItems)
IF syncCount > 0 THEN
MERGE "maria.CategoriaReceita" WITH syncItems BY "Id"
totalCategoria = totalCategoria + syncCount
syncPage = syncPage + 1
IF syncCount < syncLimit THEN
syncPage = 0
END IF
ELSE
syncPage = 0
END IF
ELSE
syncPage = 0
END IF
syncRes = null
syncItems = null
LOOP
SEND EMAIL admin, "CategoriaReceita sincronizada: " + totalCategoria + " registros."
REM Sincroniza Formas de Pagamento
SEND EMAIL admin, "Sincronizando Formas de Pagamento..."
syncPage = 1
totalForma = 0
DO WHILE syncPage > 0 AND syncPage <= pages
syncUrl = host + "/formas-pagamentos?" + pageVariable + "=" + syncPage + "&" + limitVariable + "=" + syncLimit
syncRes = GET syncUrl
WAIT 0.33
IF syncRes.data THEN
syncItems = syncRes.data
syncCount = UBOUND(syncItems)
IF syncCount > 0 THEN
MERGE "maria.FormaDePagamento" WITH syncItems BY "Id"
totalForma = totalForma + syncCount
syncPage = syncPage + 1
IF syncCount < syncLimit THEN
syncPage = 0
END IF
ELSE
syncPage = 0
END IF
ELSE
syncPage = 0
END IF
syncRes = null
syncItems = null
LOOP
SEND EMAIL admin, "Formas de Pagamento sincronizadas: " + totalForma + " registros."
REM Contatos
SEND EMAIL admin, "Sincronizando Contatos..."
i = 1
DO WHILE i > 0 AND i < pages
res = GET host + "/contatos?pagina=${i}&limite=${limit}${dateFilter} "
list = res.data
REM Sincroniza itens
j = 0
items = NEW ARRAY
DO WHILE j < ubound(list)
contato_id = list[j].id
res = GET host + "/contatos/${contato_id}"
items[j] = res.data
WAIT 0.33
j = j + 1
LOOP
MERGE "maria.Contatos" WITH items BY "Id"
i = i + 1
IF list?.length < limit THEN
i = 0
END IF
list=null
res=null
LOOP
SEND EMAIL admin, "Contatos concluído."
REM Vendedores
REM Sincroniza Vendedores.
SEND EMAIL admin, "Sincronizando Vendedores..."
i = 1
DO WHILE i > 0 AND i < pages
res = GET host + "/vendedores?pagina=${i}&situacaoContato=T&limite=${limit}${dateFilter}"
list = res.data
REM Sincroniza itens
j = 0
items = NEW ARRAY
DO WHILE j < ubound(list)
vendedor_id = list[j].id
res = GET host + "/vendedores/${vendedor_id}"
items[j] = res.data
WAIT 0.33
j = j + 1
LOOP
MERGE "maria.Vendedores" WITH items BY "Id"
i = i + 1
IF list?.length < limit THEN
i = 0
END IF
list=null
res=null
LOOP
SEND EMAIL admin, "Vendedores concluído."
SEND EMAIL admin, "Transferência do ERP para BlingBot concluído."