Questions and discussion about developing processes and programming in PHP, JavaScript, web services & REST API.

Moderator: amosbatto

Forum rules: Please search to see if a question has already asked before creating a new topic. Please don't post the same question in multiple forums.
By marcosfpa
#790249
Personally I need some tips regarding integration. I was using an internal ERP here in the company and the integration was quiet because it was direct in the database via SQL. We switched to a new ERP that is in the cloud and the vendor does not release access to the database but via the API. What I need are 2 tips:
1- I have process in the processmaker that looks for information of clients and products in the ERP and shows in dynaform fields of type dropdown and suggest. For this I configured directly in the form a SELECT in the database, and with API how could it do?
2- Another need I have: I have in the processmaker a process that monitors the ERP database for the day's sales orders and creates cases in another process for each new request. This was quiet with SELECT right in the database, and with API how could it do?

Well, the vendor sent me 2 files, one file to communicate with the server (their web service) and the other is how to work with ERP data.
These 2 files I insert the contents of them in the TRIGGERS of my ProcessMaker processes, would that be the solution?

Below I transcribe the contents of the 2 files:

VHSYSAPI.class.php:
Code: Select all
<?php
	class CommunicationVHSYS 
		{
			var $Campos = ""; //CAMPOS ARRAY QUE SERAM TRANSMITIDOS PARA O NFe VHSYS
			var $Retorno = true; //RETORNA O RESULTADO
			
			function PreparaEnvio()
				{
					if(function_exists('curl_exec'))
						{ return "https://www.vhsys.com/Communication/WebService/"; }
					else
						{ return false; }
				}
				
			function Transmitir()
				{
					$URLcom = CommunicationVHSYS::PreparaEnvio();
					if($URLcom)
						{
							$ch = curl_init();
							curl_setopt($ch, CURLOPT_URL, $URLcom);
							curl_setopt($ch, CURLOPT_POST, true);
							curl_setopt($ch, CURLOPT_POSTFIELDS, $this->Campos);
							curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
							curl_setopt($ch, CURLOPT_HEADER, false);
							curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
							curl_setopt($ch, CURLOPT_TIMEOUT, 60);
							$Resposta = curl_exec($ch);
							
							$Erro = curl_error($ch);
							if($Erro)
								{ echo $Erro; }
						  	else 
								{ 
									if($this->Retorno)
										{
											return $Resposta;
										}
								}
							curl_close($ch);
						}
					else
						{
							die("Funcao 'curl_exec' nao existe!");	
						}
				}
		}
?>
pedido.php:
Code: Select all
<?php
	include("VHSYSAPI.Class.php");
	$vhsys = new CommunicationVHSYS();
	$vhsys->Campos 	= array(
							//CABEÇARIO
							"API" => "Pedidos",
							"TOKEN" => "SEU_TOKEN",
							"METODO" => "SELECIONAR",
							
							//CAMPOS
							"id_pedido" => "45", //O NUMERO DO PEDIDO DEVE SER DEFINIDO PELO APLICATIVO
							"id_cliente" => "18584",
							"nome_cliente" => "Teste de integração",
							"vendedor_pedido" => "Luan",
							"valor_total_produtos" => 305.70,
							"desconto_pedido" => 5.70,
							"frete_pedido" => 50.80,
							"valor_total_nota" => 380.80, //VALOR TOTAL DO PEDIDO
							"frete_por_pedido" => 9, //0 = REMETENTE, 1 = DESTINATARIO, 9 = SEM FRETE
							"transportadora_pedido" => "TESTE TRANS",
							"data_pedido" => "2013-06-20", //XXXX-XX-XX
							"obs_pedido" => "teste obs",
							"status_pedido" => "Em Aberto", //Em Aberto, Em Andamento, Atendido, Cancelado
							
							//PRODUTOS
							"numero_produtos" => 2, //QUANTIDADE DE PRODUTOS DO PEDIDO
							
							"id_produto_1" => "47059",
							"desc_produto_1" => "Teste de integração",
							"qtde_produto_1" => 2.00,
							"valor_unit_produto_1" => 76.42,
							"valor_total_produto_1" => 152.85,
							"peso_produto_1" => 2.50,
							
							"id_produto_2" => "47059",
							"desc_produto_2" => "Teste de integraçãoxxxx",
							"qtde_produto_2" => 2.00,
							"valor_unit_produto_2" => 76.42,
							"valor_total_produto_2" => 152.85,
							"peso_produto_2" => 3.50,
							
							//PARCELAS
							"condicao_pagamento" => 2, //NUMERO DE PARCELAS
							
							"data_parcela_1" => "2013-06-20", //FORMATO: XXXX-XX-XX
							"valor_parcela_1" => 152.85,
							"forma_pagamento_1" => "Dinheiro",
							"observacoes_parcela_1" => "teste",
							
							"data_parcela_2" => "2013-07-20", //FORMATO: XXXX-XX-XX
							"valor_parcela_2" => 152.85,
							"forma_pagamento_2" => "Cheque",
							"observacoes_parcela_2" => "testexxx",
							
							"id_ped" => "" //UTILIZADO APENAS PARA ALTERAR E EXCLUIR
							);
	$retorno = $vhsys->Transmitir();
	
	//TRATA O RETORNO DO NFE VHSYS
	if($retorno)
		{
			if(@$xml = simplexml_load_string($retorno))
				{
					//CRIA AS VARIAVEIS
					$Erro = $xml->Erro;
					$Motivo = $xml->xMotivo; //MENSAGEM DE RETORNO
					$Status = $xml->Status; //STATUS DO RETORNO
					$id_pedido = $xml->id_pedido; //ID DO PEDIDO
					
					if($Erro == 1)
						{
							//SE HOUVER ALGUM ERRO
							echo "Erro: ".$Motivo."<br>";
						}
					else
						{
							echo $Motivo;
							print_r($xml);
						}
				}
			else
				{
					echo "Houve uma falha na leitura da resposta!<br>".$retorno;	
				}
		}
	else
		{
			echo "Houve uma falha na comunicação!";	
		}
?>
#790288
Looking at the code again, I see that it already has print_r($xml), so you just need to modify the code a little.

Create a trigger in ProcessMaker with this code:
Code: Select all
class CommunicationVHSYS
      {
         var $Campos = ""; //CAMPOS ARRAY QUE SERAM TRANSMITIDOS PARA O NFe VHSYS
         var $Retorno = true; //RETORNA O RESULTADO
         
         function PreparaEnvio()
            {
               if(function_exists('curl_exec'))
                  { return "https://www.vhsys.com/Communication/WebService/"; }
               else
                  { return false; }
            }
            
         function Transmitir()
            {
               $URLcom = CommunicationVHSYS::PreparaEnvio();
               if($URLcom)
                  {
                     $ch = curl_init();
                     curl_setopt($ch, CURLOPT_URL, $URLcom);
                     curl_setopt($ch, CURLOPT_POST, true);
                     curl_setopt($ch, CURLOPT_POSTFIELDS, $this->Campos);
                     curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
                     curl_setopt($ch, CURLOPT_HEADER, false);
                     curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
                     curl_setopt($ch, CURLOPT_TIMEOUT, 60);
                     $Resposta = curl_exec($ch);
                     
                     $Erro = curl_error($ch);
                     if($Erro)
                        { echo $Erro; }
                       else
                        {
                           if($this->Retorno)
                              {
                                 return $Resposta;
                              }
                        }
                     curl_close($ch);
                  }
               else
                  {
                     die("Funcao 'curl_exec' nao existe!");   
                  }
            }
      }
   
   $vhsys = new CommunicationVHSYS();
   $vhsys->Campos    = array(
                     //CABEÇARIO
                     "API" => "Pedidos",
                     "TOKEN" => "SEU_TOKEN",
                     "METODO" => "SELECIONAR",
                     
                     //CAMPOS
                     "id_pedido" => "45", //O NUMERO DO PEDIDO DEVE SER DEFINIDO PELO APLICATIVO
                     "id_cliente" => "18584",
                     "nome_cliente" => "Teste de integração",
                     "vendedor_pedido" => "Luan",
                     "valor_total_produtos" => 305.70,
                     "desconto_pedido" => 5.70,
                     "frete_pedido" => 50.80,
                     "valor_total_nota" => 380.80, //VALOR TOTAL DO PEDIDO
                     "frete_por_pedido" => 9, //0 = REMETENTE, 1 = DESTINATARIO, 9 = SEM FRETE
                     "transportadora_pedido" => "TESTE TRANS",
                     "data_pedido" => "2013-06-20", //XXXX-XX-XX
                     "obs_pedido" => "teste obs",
                     "status_pedido" => "Em Aberto", //Em Aberto, Em Andamento, Atendido, Cancelado
                     
                     //PRODUTOS
                     "numero_produtos" => 2, //QUANTIDADE DE PRODUTOS DO PEDIDO
                     
                     "id_produto_1" => "47059",
                     "desc_produto_1" => "Teste de integração",
                     "qtde_produto_1" => 2.00,
                     "valor_unit_produto_1" => 76.42,
                     "valor_total_produto_1" => 152.85,
                     "peso_produto_1" => 2.50,
                     
                     "id_produto_2" => "47059",
                     "desc_produto_2" => "Teste de integraçãoxxxx",
                     "qtde_produto_2" => 2.00,
                     "valor_unit_produto_2" => 76.42,
                     "valor_total_produto_2" => 152.85,
                     "peso_produto_2" => 3.50,
                     
                     //PARCELAS
                     "condicao_pagamento" => 2, //NUMERO DE PARCELAS
                     
                     "data_parcela_1" => "2013-06-20", //FORMATO: XXXX-XX-XX
                     "valor_parcela_1" => 152.85,
                     "forma_pagamento_1" => "Dinheiro",
                     "observacoes_parcela_1" => "teste",
                     
                     "data_parcela_2" => "2013-07-20", //FORMATO: XXXX-XX-XX
                     "valor_parcela_2" => 152.85,
                     "forma_pagamento_2" => "Cheque",
                     "observacoes_parcela_2" => "testexxx",
                     
                     "id_ped" => "" //UTILIZADO APENAS PARA ALTERAR E EXCLUIR
                     );
   $retorno = $vhsys->Transmitir();
   
   //TRATA O RETORNO DO NFE VHSYS
   if($retorno)
      {
         if(@$xml = simplexml_load_string($retorno))
            {
               //CRIA AS VARIAVEIS
               $Erro = $xml->Erro;
               $Motivo = $xml->xMotivo; //MENSAGEM DE RETORNO
               $Status = $xml->Status; //STATUS DO RETORNO
               $id_pedido = $xml->id_pedido; //ID DO PEDIDO
               
               if($Erro == 1)
                  {
                     //SE HOUVER ALGUM ERRO
                     echo "Erro: ".$Motivo."<br>";
                  }
               else
                  {
                    //THIS PART CHANGED:
                     print "<pre>";
                     echo $Motivo;
                     print_r($xml);
                     die;
                    //END CHANGES
                  }
            }
         else
            {
               echo "Houve uma falha na leitura da resposta!<br>".$retorno;   
            }
      }
   else
      {
         echo "Houve uma falha na comunicação!";   
      }
Then run a case and the trigger should print out the structure of $xml. By studying that structure, you can figure out how to use a for loop to place the options in an array which is used by the dropdown in a subsequent DynaForm. I can't tell you how to do it without seeing the structure of the XML in $xml.
#790440
Amos,

I could not get the API to fetch all the clients in the DB (I do not know how to pass these parameters) but I was able to manually put a client's name in the trigger API code and return the result below. See if it helps:
Code: Select all
Cliente selecionado com sucesso!SimpleXMLElement Object
(
    [Erro] => 0
    [Status] => Selecionado
    [xMotivo] => Cliente selecionado com sucesso!
    [id_cliente] => 2945159
    [tipo_pessoa] => PJ
    [tipo_cadastro] => Cliente
    [cnpj_cliente] => 12.702.717/0001-64
    [razao_cliente] => VHSYS INFORMACOES E TECNOLOGIA LTDA - ME
    [fantasia_cliente] => VHSYS
    [endereco_cliente] => R TENENTE DJALMA DUTRA
    [numero_cliente] => 683
    [bairro_cliente] => CENTRO
    [complemento_cliente] => SALA 09
    [cep_cliente] => 83.005-360
    [cidade_cliente] => SAO JOSE DOS PINHAIS
    [uf_cliente] => PR
    [fone_cliente] => (41) 3035-7775
    [email_cliente] => [email protected]
    [insc_estadual_cliente] => SimpleXMLElement Object
        (
        )

    [situacao_cliente] => Ativo
    [observacoes_cliente] => SimpleXMLElement Object
        (
        )

    [data_cad_cliente] => 2016-09-30 10:37:54
    [data_mod_cliente] => SimpleXMLElement Object
        (
        )

)
#790442
If that is the information you get, then it looks like you need to set $vhsys->Campos and call $vhsys->Transmitir() for each client, so you will need to use that code multiple times, so place it in a function.

Then, place the information for many clients in a variable which is the source for the options in a dropdown box. See: http://wiki.processmaker.com/3.1/DynaFo ... y_Variable
#790483
The web service in the sample code you posted is to create or update the client. You should have another web service to retrieve the client. I really can't help you if you don't have a sample code for retrieving a client.
I imagine that it would be something like this:
Code: Select all
function getClient($api, $token, $method, $idPetition, $idClient) {
     $vhsys = new CommunicationVHSYS();
     $vhsys->Campos    = array(
                     "API" => $api,
                     "TOKEN" => $token,
                     "METODO" => $method,
                     "id_pedido" => $idPetition,
                     "id_cliente" => $idClient,
     );
    $retorno = $vhsys->Transmitir();
   
     if ($retorno) {
         if (@$xml = simplexml_load_string($retorno)) {
               //CRIA AS VARIAVEIS
               $Erro = $xml->Erro;
               $Motivo = $xml->xMotivo; //MENSAGEM DE RETORNO
               $Status = $xml->Status; //STATUS DO RETORNO
               $id_pedido = $xml->id_pedido; //ID DO PEDIDO
               
               if($Erro == 1) {
                     //SE HOUVER ALGUM ERRO
                     throw new Exception("Erro: $Motivo");
               }
               else  {
                    return $xml;
                }
         }
         else {
               throw new Exception("Houve uma falha na leitura da resposta! ".$retorno);   
         }
   }
   else {
         throw new Exception("Houve uma falha na comunicação!");   
   }
}   

@=optionsList = array();

//first option in the dropdown:
$oInfo = getClient("Pedidos", "SEU_TOKEN","SELECIONAR","45","18584");
@=optionsList[] = array($oInfo->id_cliente, $oInfo->razao_cliente);

//second option in the dropdown:
$oInfo = getClient("Pedidos", "SEU_TOKEN","SELECIONAR","45","18699");
@=optionsList[] = array($oInfo->id_cliente, $oInfo->razao_cliente);

//third option in the dropdown:
$oInfo = getClient("Pedidos", "SEU_TOKEN","SELECIONAR","45","18764");
@=optionsList[] = array($oInfo->id_cliente, $oInfo->razao_cliente);
#790572
Well, then we return to this data search question because I have not yet been able to assign return values from the WebService to a variable in my ProcessMaker. But I'll see the code and warning correctly.
Before I need another tip: I have a sales order form in my ProcessMaker and I need the API of which we are talking here to register this request in the ERP. The code passed by the vendor works, I get the variable values from my dynaform ProcessMaker and via API to register in ERP. But I can not do the same for Dynaform GRIDs. I have 2 GRIDs: PRODUCTS and PLOTS. See in the example code passed by ERP the instructions on how to send the values via API, the arrays are in the PRODUCT and PLOTS section. Any tips on how I treat GRIDs for the API?
Code: Select all
$cliente = @=nomeCliente;
class CommunicationVHSYS 
		{
			var $Campos = ""; //CAMPOS ARRAY QUE SERAM TRANSMITIDOS PARA O NFe VHSYS
			var $Retorno = true; //RETORNA O RESULTADO
			
			function PreparaEnvio()
				{
					if(function_exists('curl_exec'))
						{ return "https://www.vhsys.com/Communication/WebService/"; }
					else
						{ return false; }
				}
				
			function Transmitir()
				{
					$URLcom = CommunicationVHSYS::PreparaEnvio();
					if($URLcom)
						{
							$ch = curl_init();
							curl_setopt($ch, CURLOPT_URL, $URLcom);
							curl_setopt($ch, CURLOPT_POST, true);
							curl_setopt($ch, CURLOPT_POSTFIELDS, $this->Campos);
							curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
							curl_setopt($ch, CURLOPT_HEADER, false);
							curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
							curl_setopt($ch, CURLOPT_TIMEOUT, 60);
							$Resposta = curl_exec($ch);
							
							$Erro = curl_error($ch);
							if($Erro)
								{ echo $Erro; }
						  	else 
								{ 
									if($this->Retorno)
										{
											return $Resposta;
										}
								}
							curl_close($ch);
						}
					else
						{
							die("Funcao 'curl_exec' nao existe!");	
						}
				}
		}


$vhsys = new CommunicationVHSYS();
	$vhsys->Campos 	= array(
							//CABEÇARIO
							"API" => "Pedidos",
							"TOKEN" => "AAEALMyQDt0ITNRDTNXTDMyADc3Bzt2UzM",
							"METODO" => "CADASTRAR",
							
							//CAMPOS
							"id_pedido" => "12345", //O NUMERO DO PEDIDO DEVE SER DEFINIDO PELO APLICATIVO
							
							"nome_cliente" => $cliente,
							"vendedor_pedido" => "Luan",
							"valor_total_produtos" => 305.70,
							"desconto_pedido" => 5.70,
							"frete_pedido" => 50.80,
							"valor_total_nota" => 380.80, //VALOR TOTAL DO PEDIDO
							"frete_por_pedido" => 9, //0 = REMETENTE, 1 = DESTINATARIO, 9 = SEM FRETE
							"transportadora_pedido" => "TESTE TRANS",
							"data_pedido" => "2013-06-20", //XXXX-XX-XX
							"obs_pedido" => "teste obs",
							"status_pedido" => "Em Aberto", //Em Aberto, Em Andamento, Atendido, Cancelado
							
							//PRODUTOS = GRID PROCESSMAKER
							"numero_produtos" => 2, //QUANTIDADE DE PRODUTOS DO PEDIDO
							
							"id_produto_1" => "47059",
							"desc_produto_1" => "Teste de integração",
							"qtde_produto_1" => 2.00,
							"valor_unit_produto_1" => 76.42,
							"valor_total_produto_1" => 152.85,
							"peso_produto_1" => 2.50,
							
							"id_produto_2" => "47059",
							"desc_produto_2" => "Teste de integraçãoxxxx",
							"qtde_produto_2" => 2.00,
							"valor_unit_produto_2" => 76.42,
							"valor_total_produto_2" => 152.85,
							"peso_produto_2" => 3.50,
							
							//PARCELAS = GRID PROCESSMAKER
							"condicao_pagamento" => 2, //NUMERO DE PARCELAS
							
							"data_parcela_1" => "2013-06-20", //FORMATO: XXXX-XX-XX
							"valor_parcela_1" => 152.85,
							"forma_pagamento_1" => "Dinheiro",
							"observacoes_parcela_1" => "teste",
							
							"data_parcela_2" => "2013-07-20", //FORMATO: XXXX-XX-XX
							"valor_parcela_2" => 152.85,
							"forma_pagamento_2" => "Cheque",
							"observacoes_parcela_2" => "testexxx"
							
							);
	$retorno = $vhsys->Transmitir();
	
	//TRATA O RETORNO DO NFE VHSYS
	if($retorno)
		{
			if(@$xml = simplexml_load_string($retorno))
				{
					//CRIA AS VARIAVEIS
					$Erro = $xml->Erro;
					$Motivo = $xml->xMotivo; //MENSAGEM DE RETORNO
					$Status = $xml->Status; //STATUS DO RETORNO
					$id_pedido = $xml->id_ped; //ID DO PEDIDO
					
					if($Erro == 1)
						{
							//SE HOUVER ALGUM ERRO
							echo "Erro: ".$Motivo."<br>";
						}
					else
						{
							echo $Motivo;
							print_r($xml);
						
						}
				}
			else
				{
					echo "Houve uma falha na leitura da resposta!<br>".$retorno;	
				}
		}
	else
		{
			echo "Houve uma falha na comunicação!";	
		}
#790589
If you want to send ProcessMaker grids to the ERP, then you probably have to do 1 of these 3 things:
1. The ERP has some way of showing a table of data, and you need to know the format from your ERP, so your ProcessMaker trigger can put the grid's data in that format.
2. You have field in your ERP that can show your grid as a preformatted string with tabs and line breaks, so the trigger will take the grid's data and place it in that string to send to the ERP.
3. You send each row in the grid as a separate record/case in your ERP.

If you are more specific about what you want to do, maybe I can help you.
#790590
See the guidance that the ERP passed to me, each field of the ERP table has its name the symbol "_" and the registration number. Example: "desc_produto_2" => "Integration testxxxx".
Here's a part of the API code I posted on the previous post:

//PRODUTOS
"numero_produtos" => 2, //QUANTIDADE DE PRODUTOS DO PEDIDO

"id_produto_1" => "47059",
"desc_produto_1" => "Teste de integração",
"qtde_produto_1" => 2.00,
"valor_unit_produto_1" => 76.42,
"valor_total_produto_1" => 152.85,
"peso_produto_1" => 2.50,

"id_produto_2" => "47059",
"desc_produto_2" => "Teste de integraçãoxxxx",
"qtde_produto_2" => 2.00,
"valor_unit_produto_2" => 76.42,
"valor_total_produto_2" => 152.85,
"peso_produto_2" => 3.50,

Att,

Marcos Almeida
#790641
Try something like this:
Code: Select all
if (!isset(@=produtos) or !is_array(@=produtos)) {
   throw new Exception("Produtos is not defined");
}
$vhsys = new CommunicationVHSYS();
$vhsys->Campos = array (
   //CABEÇARIO
   "API" => "Pedidos",
   "TOKEN" => "AAEALMyQDt0ITNRDTNXTDMyADc3Bzt2UzM",
   "METODO" => "CADASTRAR",
                     
   //CAMPOS
   "id_pedido" => "12345", //O NUMERO DO PEDIDO DEVE SER DEFINIDO PELO APLICATIVO
                     
   "nome_cliente" => @@cliente,
   "vendedor_pedido" => "Luan",
   "valor_total_produtos" => 305.70,
   "desconto_pedido" => 5.70,
   "frete_pedido" => 50.80,
   "valor_total_nota" => 380.80, //VALOR TOTAL DO PEDIDO
   "frete_por_pedido" => 9, //0 = REMETENTE, 1 = DESTINATARIO, 9 = SEM FRETE
   "transportadora_pedido" => "TESTE TRANS",
   "data_pedido" => "2013-06-20", //XXXX-XX-XX
   "obs_pedido" => "teste obs",
   "status_pedido" => "Em Aberto", //Em Aberto, Em Andamento, Atendido, Cancelado
                     
   //PRODUTOS = GRID PROCESSMAKER
   "numero_produtos" => count(@=produtos),    //NUMERO DE PRODUTOS

   //PARCELAS = GRID PROCESSMAKER
   "condicao_pagamento" => count(@=parcelas)  //NUMERO DE PARCELAS
);

for ($i = 1; $i <= count(@=produtos); $i++) {
    $vhsys->Campos["id_produto_" . $i] => @=produtos[$i]['id'];
    $vhsys->Campos["desc_produto_" . $i] => @=produtos[$i]['desc'];
    $vhsys->Campos["qtde_produto_" . $i] => @=produtos[$i]['qtde'];
    $vhsys->Campos["valor_unit_produto_" . $i] => @=produtos[$i]['valor_unit'];
    $vhsys->Campos["valor_total_produto_" . $i] => @=produtos[$i]['valor_total'];
    $vhsys->Campos["peso_produto_" . $i] => @=produtos[$i]['peso'];
}

for ($i = 1; $i <= count(@=parcelas); $i++) {
    $vhsys->Campos["data_parcela_" . $i] => @=parcelas[$i]['data'];   //FORMATO: XXXX-XX-XX
    $vhsys->Campos["valor_parcela_" . $i] => @=parcelas[$i]['valor'];
    $vhsys->Campos["forma_pagamento_parcela_" . $i] => @=parcelas[$i]['forma_pagamento'];
    $vhsys->Campos["observacoes_parcela_" . $i] => @=parcelas[$i]['observacoes'];
}

$retorno = $vhsys->Transmitir();
Where the "produtos" grid has fields whose IDs are:
"id", "desc", "qtde", "valor_unit", "valor_total", "valor_total"
#790651
It worked in a different way, I had to replace the "=>" with "=" when passing the data. Here it goes like this:

for ($i = 1; $i <= count(@=produtos); $i++) {
$vhsys->Campos["id_produto_" . $i] = @=produtos[$i]['id'];
$vhsys->Campos["desc_produto_" . $i] = @=produtos[$i]['desc'];
$vhsys->Campos["qtde_produto_" . $i] = @=produtos[$i]['qtde'];
$vhsys->Campos["valor_unit_produto_" . $i] = @=produtos[$i]['valor_unit'];
$vhsys->Campos["valor_total_produto_" . $i] = @=produtos[$i]['valor_total'];
$vhsys->Campos["peso_produto_" . $i] = @=produtos[$i]['peso'];
}

for ($i = 1; $i <= count(@=parcelas); $i++) {
$vhsys->Campos["data_parcela_" . $i] = @=parcelas[$i]['data']; //FORMATO: XXXX-XX-XX
$vhsys->Campos["valor_parcela_" . $i] = @=parcelas[$i]['valor'];
$vhsys->Campos["forma_pagamento_parcela_" . $i] = @=parcelas[$i]['forma_pagamento'];
$vhsys->Campos["observacoes_parcela_" . $i] = @=parcelas[$i]['observacoes'];
}

Thanks.

Hello amosbato, Trying to retake this conversatio[…]

Resta de valores con 2 textobox

Hola! Se replicó lo que estabas haciendo […]

Hello! If you did not find the mcrypt extension […]

Hello! You have a mistake in the url, the correct […]