Sistema e manual para Calcular Frete SEDEX, e-SEDEX e PAC dos Correios (versão 1.1)

Ferramentas, JQuery, Javascript, PHP, XML View Comments Marcelo Korjenioski

Desde semana pas­sada o antigo web­ser­vice dos cor­reios parou de fun­ci­o­nar com PAC.
Foi feita a cor­re­ção do código e agora o PAC esta fun­ci­o­nando novamente.

Sis­tema para Cal­cu­lar Frete 1.1

Docu­men­ta­ção para uti­li­zar o web­ser­vice dos Cor­reios para efe­tuar o cal­culo de forma personalizada.

SCPP_Manual_Implementacao_Calculo_Remoto_de_Precos_e_Prazos

Abaixo segue o código para mani­pu­lar os dados do web­ser­vice usando o PHP.

Segue o exem­plo do código abaixo funcionando.

<?php
/**
* Faz consulta no webservice dos correios e gera array dos valores.
* @copyright  Phaneronsoft
* @author Marcelo Korjenioski - faleconosco@phaneronsoft.com
* @see http://www.phaneronsoft.com
* @filesource correios.php
* @version 1.0
*/

// PESO: Peso total do pacote em Quilos, caso seja menos de 1Kg, ex.: 300g, coloque 0.300
define('PESO',0.300);
// COMPRIMENTO: comprimento do volume em centímetros - somente número de 16 a 60
define('COMPRIMENTO',30);
// ALTURA: altura do volume em centímetros - somente número de 2 a 60
define('ALTURA',15);
// LARGURA: largura do volume em centimetros - somente número de 5 a 60
define('LARGURA',20);
// CODIGO_SERVICO: É possivel fazer mais de uma consulta ao mesmo tempo, basta separar os códigos por virgula.
// Neste caso PAC 41106 e SEDEX 40010
define('CODIGO_SERVICO','41106,40010');
// CEP_ORIGEM: seu CEP com 8 dígitos - somente números
define('CEP_ORIGEM','81010210');
// CEP_DESTINO: CEP do seu cliente com 8 dígitos - somente números
define('CEP_DESTINO','60245965');

// Crio um objeto para manipular o XML.
$doc = new DomDocument;
// Carrega o arquivo XML com um arquivo DOMDocument
$doc->Load("http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?StrRetorno=xml&amp;nCdServico=" . CODIGO_SERVICO . "&amp;nVlPeso=" . PESO . "&amp;sCepOrigem=" . CEP_ORIGEM . "&amp;sCepDestino=" . CEP_DESTINO . "&amp;nCdFormato=1&amp;nVlComprimento=" . COMPRIMENTO . "&amp;nVlAltura=" . ALTURA . "&amp;nVlLargura=" . LARGURA);
// Defino o nome do elemento pai (root).
$root = $doc->getElementsByTagName('cServico');

// Carrega o arquivo XML com um arquivo DOMDocument
$correios = "http://shopping.correios.com.br/wbm/shopping/script/CalcPrecoPrazo.aspx?StrRetorno=xml&amp;nCdServico=" . CODIGO_SERVICO . "&amp;nVlPeso=" . PESO . "&amp;sCepOrigem=" . CEP_ORIGEM . "&amp;sCepDestino=" . CEP_DESTINO . "&amp;nCdFormato=1&amp;nVlComprimento=" . COMPRIMENTO . "&amp;nVlAltura=" . ALTURA . "&amp;nVlLargura=" . LARGURA;
// Defino o nome do elemento pai (root).
$root = $doc->getElementsByTagName('cServico');

// Defino o nome dos elementos filhos no arquivo XML que eu desejo.
$children = array('Valor','PrazoEntrega');

// Faço um loop para pegar todos os elementos pai (root) encontrados.
$valor = array();
for ($i=0; $i < $root->length; $i++) {
// Pega o valor do atributo do elemento pai  (root).
    $id =  $root->item($i)->getElementsByTagName('Codigo')->item(0)->nodeValue;

// Busca por elementos filhos (child) definidos no array
    foreach ($children as $child) {
        $valor[$id][$child] = $root->item($i)->getElementsByTagName($child)->item(0)->nodeValue;
    }
}
echo '<pre>';
var_dump($valor);

Caso tenha alguma duvida deixe um comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­ri­ais aqui apresentados.

Tags: , , , , , ,

Converter XML para arquivo CSV — XML2CSV

CSV, PHP, XML View Comments Marcelo Korjenioski

Aten­dendo a soli­ci­ta­ção de um visi­tante do blog criei este tuto­rial com os prin­cí­pios bási­cos para con­ver­ter um arquivo XML em CSV.

Crie um arquivo com o nome produtos.xml e insira o código abaixo.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<catalogo>
<produto id='p1'>
<nome>Caderno</nome>
<preco>2,00</preco>
<quantidade>100</quantidade>
</produto>
<produto id='p2'>
<nome>Caneta</nome>
<preco>1,00</preco>
<quantidade>200</quantidade>
</produto>
<produto id='p3'>
<nome>Lapis</nome>
<preco>0,50</preco>
<quantidade>50</quantidade>
</produto>
<produto id='p4'>
<nome>Livro Matematica</nome>
<preco>11,00</preco>
<quantidade>10</quantidade>
</produto>
<produto id='p5'>
<nome>Apontador</nome>
<preco>1,00</preco>
<quantidade>20</quantidade>
</produto>
</catalogo>

É neces­sá­rio criar um dire­tó­rio com o nome csv e dar per­mis­são de lei­tura e escrita antes de exe­cu­tar o código.

Crie um arquivo com nome xml2csv.php e colo­que o código abaixo.

<?php

$doc = new DomDocument;
// Carrega o arquivo XML com um arquivo DOMDocument
$doc->Load('produtos.xml');
// Defino o nome do elemento pai (root).
$root = $doc->getElementsByTagName('produto');
// Defino o nome dos elementos filhos no arquivo XML que eu desejo.
$children = array('nome','preco','quantidade');
$cvs = NULL;
// Crio o cabeçalho do arquivo CSV com o nome de todos os campos.
$cvs .= "codigo,nome,preco,quantidade";
// Quebra de linha do arquivo CSV.
$cvs .= "\n";

// Faço um loop para pegar todos os elementos pai (root) encontrados.
for ($i=0; $i < $root->length; $i++) {

// Pega o valor do atributo do elemento pai  (root).
$id =  $root->item($i)->getAttribute('id');
// Irei dar um escape em todos os valores usando aspas duplas.
$cvs .= '"' . $id . '",';
// Busca por elementos filhos (child) definidos no array
$valor = array();
foreach ($children as $child) {
$valor[] = '"' . $root->item($i)->getElementsByTagName($child)->item(0)->nodeValue . '"';
}
// Uso o implode para criar uma string com os valores separados por vírgula.
$cvs .= implode(',', $valor);
// Quebra de linha do arquivo CSV.
$cvs .="\n";
}

// getcwd() retorna o diretório atual.
$caminho = getcwd(). '/csv/';
$data = date('d_m_y_H_i_s');
$file_path = $caminho.$data.'_lista.csv';

// Verifique se vc tem permissão de leitura e escrita neste diretorio
if(fwrite($file=fopen($file_path,'w+'),$cvs)) {
fclose($file);
echo "Arquivo gravado com sucesso!";
} else {
echo "Erro ao abrir arquivo!";
}

?>

Caso tenha alguma duvida deixe um comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­ri­ais aqui apresentados.

Estrutura básica de um arquivo XML.

XML View Comments Marcelo Korjenioski

Estru­tura básica de um arquivo XML.

A pri­meira linha é o cabe­ça­lho do arquivo XML.
Neste caso estou usando o enco­ding UTF-8.
Os docu­men­tos XML tem um estru­tura em árvore.

Todos os arqui­vos XML sem­pre terão um ele­mento raiz (root ele­ment).
Este ele­mento é o pai dos outros ele­men­tos.
Os ele­men­tos a seguir são os filhos (child element).

Exem­plo da estru­tura básica de um arquivo XML.

<?xml version="1.0" encoding="UTF-8"?>
<root>
<child>
</child>
</root>

Den­tro da tag dos ele­men­tos é pos­sí­vel defi­nir atri­bu­tos.
Neste exem­plo o nome do atri­buto cri­ado é o id do produto.

<?xml version="1.0" encoding="UTF-8"?>
<catalogo>
<produto id='p1'>
<nome>Caderno</nome>
<preco>2,00</preco>
<quantidade>100</quantidade>
</produto>
<produto id='p2'>
<nome>Caneta</nome>
<preco>1,00</preco>
<quantidade>200</quantidade>
</produto>
<produto id='p3'>
<nome>Lapis</nome>
<preco>0,50</preco>
<quantidade>50</quantidade>
</produto>
</catalogo>

Caso tenha alguma duvida deixe um comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­ri­ais aqui apresentados.

Gravar arquivos de log ao executar comandos SQL no PHP.

MySQL, PHP, SQL, XML View Comments Marcelo Korjenioski

No código a seguir segue um exem­plo de como ler um arquivo XML e gra­var os dados no banco de dados MySQLe gerar um log da query exe­cu­tada.
Neste exem­plo costa ape­nas as fun­ções de INSERT, DELETE, UPDATE e SELECT.
Para faci­li­tar a vida eu já dei­xei no código as query para criar o banco e as tabe­las uti­li­za­das para exe­cu­tar o código. Eu dei­xei os valo­res default de cone­xão com o MySQL altere os dados da cone­xão caso esteja usando outra con­fi­gu­ra­ção.
A idéia de criar um log das querys exe­cu­ta­das no sis­tema ser­vem para detec­tar erros e tam­bém como um regis­tro caso alguem valor tenha sito movi­men­tado de forma errada.

<?php
// Fazendo a conexão com o servidor MySQL

//Caso queira apenas criar o arquivo XML mude valor para false.
$ativar_conexao = true;

if ($ativar_conexao == true) {
// mysql_pconnect("server", "login", "senha")
$conexao = mysql_pconnect("192.168.1.210","root","dj@jdl#.") or die('falha ao conectar');
// Verifica se o banco de dados existe antes de criar.
$query = 'CREATE DATABASE IF NOT EXISTS test';

if(!mysql_query($query,$conexao)) {
echo 'falha ao criar banco<br />';
}

mysql_select_db("test",$conexao) or die('falha ao selecionar db');

// Verifica se a tabela existe antes de criar.
$query = "CREATE TABLE  IF NOT EXISTS tb_produtos (
pk_produtos int not null auto_increment primary key,
codigo     varchar(255),
nome       varchar(255),
preco      decimal(12,2),
quantidade int(11))";

if(!mysql_query($query,$conexao)) {
echo 'falha ao criar tabela<br />';
}
}
// Fim comentario

$doc = new DomDocument;
// Carrega o arquivo XML com um arquivo DOMDocument
$doc->Load('produtos.xml');
$items = $doc->getElementsByTagName('produto');
// Defino o nome tags no arquivo XML que eu desejo.
$campos = array('nome','preco','quantidade');
$query = NULL;
$query .= "insert into tb_produtos (codigo,nome,preco,quantidade) values ";
for ($i=0; $i < $items->length; $i++) {
$value = NULL;
$value .= " (";
$codigo = $items->item($i)->getAttribute('id');
$value .= "'$codigo',";
echo $items->item($i)->getAttribute('id') , '<br />';
// Busca por elementos definidos no array
$valor = array();
foreach ($campos as $campo) {
$dado = "'" . $items->item($i)->getElementsByTagName($campo)->item(0)->nodeValue . "'";
// Verifico se o campo é preco pq no arquivo xml o preço esta com virgula e para inserir no banco é necessario ponto
if($campo == 'preco') {
// Faz a troca de virgula por ponto.
$dado = str_replace(',','.',$dado);
}
// pego o valor de cada tag e adiciono em um array para fazer o insert no banco.
$valor[] = $dado;
echo $items->item($i)->getElementsByTagName($campo)->item(0)->tagName , ': ';
echo $items->item($i)->getElementsByTagName($campo)->item(0)->nodeValue , '<br />';

}
// uso o implode para criar uma string com os valores separados por vírgula.
$value .= implode(',', $valor);
$value .= ') ';
// Adiciono os dados do valores do insert em array.
$values[] = $value;

echo '<hr>';
}
// uso o implode para criar uma string com os valores separados por vírgula.
$query .= implode(',', $values);

// mostra a query criada na tela.
echo $query;

if ($ativar_conexao == true) {

// GRAVA LOG do arquivo executado mesmo se query estiver errada.
if((stristr($query, 'DELETE') || stristr($query, 'UPDATE') || stristr($query, 'INSERT')  || stristr($query, 'SELECT'))) {

// Verifica se a tabela existe antes de criar.
$query_log = "CREATE TABLE IF NOT EXISTS tb_log (
pk_log int not null auto_increment primary key,
tx_sql text,
acao ENUM('DELETE', 'UPDATE', 'INSERT','SELECT')
);";

if(!mysql_query($query_log,$conexao)) {
echo 'falha ao criar tabela<br />';
}

if(stristr($query, 'DELETE')) {
$acao = 1;
} elseif(stristr($query, 'UPDATE')) {
$acao = 2;
} elseif(stristr($query, 'INSERT')) {
$acao = 3;
} elseif(stristr($query, 'SELECT')) {
$acao = 4;
}

$query_log = "INSERT INTO tb_log (tx_sql,acao) VALUES
(\"$query\",$acao)";

if(!mysql_query($query_log,$conexao)) {
echo 'falha ao inserir dados de log<br />';
}

}

if(!mysql_query($query,$conexao)) {
echo 'falha ao inserir dados<br />';
}
}

Crie um arquivo produtos.xml em um edi­tor de texto e colo­que o código abaixo.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<catalogo>
<produto id='p1'>
<nome>Caderno</nome>
<preco>2,00</preco>
<quantidade>100</quantidade>
</produto>
<produto id='p2'>
<nome>Caneta</nome>
<preco>1,00</preco>
<quantidade>200</quantidade>
</produto>
<produto id='p3'>
<nome>Lapis</nome>
<preco>0,50</preco>
<quantidade>50</quantidade>
</produto>
<produto id='p4'>
<nome>Livro Matematica</nome>
<preco>11,00</preco>
<quantidade>10</quantidade>
</produto>
<produto id='p5'>
<nome>Apontador</nome>
<preco>1,00</preco>
<quantidade>20</quantidade>
</produto>
</catalogo>

Caso tenha alguma duvida deixe um comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­ri­ais aqui apresentados.

Importar arquivo XML usando PHP e inserindo em BD MySQL.

MySQL, PHP, SQL, XML View Comments Marcelo Korjenioski

Crie um arquivo cha­mado produtos.xml e insira o código abaixo.

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<catalogo>
<produto id='p1'>
<nome>Caderno</nome>
<preco>2,00</preco>
<quantidade>100</quantidade>
</produto>
<produto id='p2'>
<nome>Caneta</nome>
<preco>1,00</preco>
<quantidade>200</quantidade>
</produto>
<produto id='p3'>
<nome>Lapis</nome>
<preco>0,50</preco>
<quantidade>50</quantidade>
</produto>
<produto id='p4'>
<nome>Livro Matematica</nome>
<preco>11,00</preco>
<quantidade>10</quantidade>
</produto>
<produto id='p5'>
<nome>Apontador</nome>
<preco>1,00</preco>
<quantidade>20</quantidade>
</produto>
</catalogo>

Crie um arquivo cha­mado inporta.php e insira o código abaixo.

<?php
// Fazendo a conexão com o servidor MySQL

//Caso queira apenas criar o arquivo XML e gerar uma query sem inserir no banco
// mude valor de $ativar_conexao para false.
$ativar_conexao = true;

if ($ativar_conexao == true) {
$conexao = mysql_pconnect("localhost","root","") or die('falha ao conectar');
$query = 'CREATE DATABASE loja';

if(!mysql_query($query,$conexao)) {
echo 'falha ao criar banco<br />';
}

mysql_select_db("test",$conexao) or die($msg[1]);

$query = "CREATE TABLE produtos (
codigo     varchar(10),
nome       varchar(255),
preco      varchar(50),
quantidade varchar(50)";

if(!mysql_query($query,$conexao)) {
echo 'falha ao criar tabela<br />';
}
}
// Fim comentario

$doc = new DomDocument;
// Carrega o arquivo XML com um arquivo DOMDocument
$doc->Load('produtos.xml');
$items = $doc->getElementsByTagName('produto');
$campos = array('nome','preco','quantidade');
$query = NULL;
$query .= "insert into produtos (codigo,nome,preco,quantidade) values ";
for ($i=0; $i < $items->length; $i++) {
$value = NULL;
$value .= " (";
$codigo = $items->item($i)->getAttribute('id');
$value .= "'$codigo',";
echo $items->item($i)->getAttribute('id') , '<br />';
// Busca por elementos definidos no array
$valor = array();
foreach ($campos as $campo) {
$valor[] = "'" . $items->item($i)->getElementsByTagName($campo)->item(0)->nodeValue . "'";
echo $items->item($i)->getElementsByTagName($campo)->item(0)->tagName , ': ';
echo $items->item($i)->getElementsByTagName($campo)->item(0)->nodeValue , '<br />';

}
$value .= implode(',', $valor);
$value .= ') ';
$values[] = $value;

echo '<hr>';
}
$query .= implode(',', $values);

echo $query;

// Comente caso apenas queira gerar o codigo xml
if ($ativar_conexao == true) {
if(!mysql_query($query,$conexao)) {
echo 'falha ao inserir dados<br />';
}
}

Caso tenha alguma duvida deixe um comen­tá­rio que terei pra­zer em aju­dar.
Comen­tá­rios são bem vin­dos assim posso melho­rar a qua­li­dade dos tuto­ri­ais aqui apresentados.

Designed by NattyWP Wordpress Themes.
Images by desEXign.