Uma biblioteca PHP para se comunicar com o lucro do AFAS de maneira prática, usando sabão ou descanso.
Este é o código da biblioteca, para uso por seu próprio código/outro projeto. Quem está lendo isso, supostamente já tem uma idéia do que eles querem alcançar e do que é o AFAS, por isso não abordaremos isso aqui. (http://www.afas.nl/ - A documentação atual deles está em https://static-kb.afas.nl/datafiles/help/2_9_7/se/en/index.htm, embora o URL mude sem dúvida.)
Este código formado através de três princípios:
O primeiro (e terceiro) princípio significa que o código compreensível é preferido sobre a extensibilidade à prova de futuro que cria classes separadas para cada coisinha e introduz cargas de código da placa da caldeira. Significa código bem comentado. E isso significa que não há comportamento inesperado / sem documentos. (A validação dos argumentos de entrada e dos resultados recebidos do sistema remoto abrange situações inesperadas para o programador e lança exceções documentadas.)
Dito isto: o segundo / terceiro princípio, além da funcionalidade do AFAS em evolução, além de considerações de compatibilidade com versões anteriores, fizeram os argumentos da conexão :: getData () ilógicos em alguns aspectos. Mas o código ainda é facilmente legível (porque não há muitos métodos diferentes) e é fácil exigir casos de uso 'simples'.
A versão 2 da biblioteca funciona com Php5 (5.4 e acima) e Php7.
Classes de clientes para descanso e sabão usam as extensões Standard Curl + JSON e SOAP + SOAP + Simplexml do PHP; Se estes não funcionarem para você, os PRs com novos / modificados clientes serão bem -vindos.
Os testes automáticos são feitos em Php5.6, 7.1 e 7.2 para as classes UpdateConnector. (Atualmente, não considero as classes de clientes que precisam de testes. Pode haver alguns testes de luz para conexão no futuro, mas não está na minha lista.)
Embora o Php5.6 não seja mais suportado oficialmente, essa biblioteca permanecerá compatível com ela até que haja um motivo real para introduzir construções de idiomas somente para php7.
Existem algumas partes desta biblioteca que não estão todas bem acopladas:
As classes do cliente podem ser usadas independentes para fazer chamadas para os conectores AFAS. Você precisará saber os parâmetros exatos que o AFAS espera por sua API de descanso ou sabão; Existe um cliente para ambos. Se você deseja manter as coisas próximas da própria estrutura da AFAS, o cliente restante parece mais adequado. Use RestcurlClient (veja o exemplo abaixo) e esqueça as outras classes. Tudo o que você precisa saber é que existe um método público, callafas (), que retorna uma string (JSON) com um resultado bem -sucedido de chamada ou lança exceções.
A classe de conexão envolve o cliente Soap ou Rest e abstraça alguns parâmetros que não são tão fáceis de manusear. Use -o se você, por exemplo
UpdateObject (mais classes infantis) pode ser usado para criar cargas úteis XML ou JSON para conectores de atualização e validar seu conteúdo. A saída deles é strings, que podem ser usados da maneira que desejar (por exemplo, envie os dados da string por meio de uma classe cliente ou através do Connection :: sendData () ou use o UpdateObjects com seu próprio código personalizado).
Há também uma classe auxiliar com alguns métodos estáticos extras que podem ser úteis para alguns programadores, mas com os quais eu não queria sobrecarregar os clientes / conexão. (Além disso, o IsocountryTrait / Knbasicaddress / orgPersonContact contém alguns métodos públicos que os programadores podem usar para sua própria validação personalizada de endereços, sem usar a principal funcionalidade dessas classes. Eles não estão mais documentados.)
Primeiro discutiremos os clientes e daremos exemplos de chamada para fins de comparação com a conexão. Você pode pular esses, a menos que esteja curioso sobre as diferenças.
Estes podem ser usados independentes para fazer chamadas de sabão / descanso ao lucro do AFAS, se você conhece a estrutura das chamadas. Uma classe cliente apenas lida com:
As configurações de conexão e autenticação são passadas para o construtor; não para todas as chamadas individuais de AFAs.
Você usará apenas um método público: Callafas (). (Existe um segundo método público: estático getClientType () - mas isso não é necessário para o uso independente.) As classes de clientes fazem (quase) nenhuma suposição sobre as chamadas da API remota; O método remoto exato (tipo de) e os argumentos precisam ser transmitidos a ele e retornará o corpo do resultado como uma string.
As opções necessárias estão no construtor abaixo; Veja o código para outras opções.
use PracticalAfas Client RestCurlClient ;
$ client = new RestCurlClient ( [ ' customerId ' => 12345 , ' appToken ' => ' 64CHARS ' ] );
$ result_as_json_string = $ client -> callAfas (
' GET ' ,
' connectors/MyGetConnectorName ' ,
[ ' take ' => 1000 ,
' filterfieldids ' => ' SomeCategory,Updated ' ,
' filtervalues ' => ' CategName,2017-01-01T16:00:00 ' ,
' operatortypes ' => ' 1,4 ' ,
' orderbyfieldids ' => ' -Updated '
]
);
$ attachment = $ client -> callAfas ( ' GET ' , ' subjectconnector/123 ' );
// This is inserting a new organisation with only its name filled:
$ client ->callAfas( ' POST ' , ' connectors/KnOrganisation ' , [], ' {"KnOrganisation":{"Element":{ "Fields":{"MatchOga":0,"Nm":MyCompany Ltd."}}}} ' O abaixo é (quase) equivalente ao exemplo de repouso acima (exceto que retorna uma sequência XML em vez de uma string json). Observe que esta não é uma classe PHP 'SoapClient'; É um invólucro em torno do SoapClient.
use PracticalAfas Client SoapAppClient ;
$ client = new SoapAppClient ( [ ' customerId ' => 12345 , ' appToken ' => ' 64CHARS ' ] );
$ result_as_xml_string = $ client -> callAfas (
' get ' ,
' GetDataWithOptions ' ,
[ ' connectorId ' => ' MyGetConnectorName ' ,
' take ' => 1000 ,
' filtersXml ' => ' <Filters><Filter><Field FieldId="SomeCategory" OperatorType="1">CategName</Field>
<Field FieldId="Updated" OperatorType="4">2017-01-01T16:00:00</Field></Filter></Filters> ' ,
' options ' => ' <options><Index><Field FieldId="Updated" OperatorType="0"/></Index>
<Outputoptions>3</Outputoptions><Outputmode>1</Outputmode><Metadata>0</Metadata></options> ' ,
]
);
$ attachment = $ client -> callAfas ( ' subject ' , ' GetAttachment ' , [ ' subjectID ' => 123 ] );
$ client ->callAfas( ' update ' , ' Execute ' , [ ' connectorType ' => ' KnOrganisation ' , ' dataXml => ' <KnOrganisation xmlns:xsi="http: //www.w3.org/2001/XMLSchema-instance"><Element><Fields Action="insert"><MatchOga>0</MatchOga><Nm>MyCompany Ltd.</Nm></Fields></Element></KnOrganisation>' ] );A conexão envolve um cliente e abstrava toda a validação de argumentos / processamento de dados que não é específico do cliente. Ele tem sua própria sintaxe para filtros. Possui dois métodos importantes: sendData (), que envolve o conector de atualização do AFAS e getData () que envolve todos os outros conectores. (Todos os outros métodos são getters e setters que você nunca precisa.)
O equivalente ao exemplo acima é:
use PracticalAfas Connection ;
use PracticalAfas Client RestCurlClient ;
$ client = new RestCurlClient ( [ ' customerId ' => 12345 , ' appToken ' => ' 64CHARS ' ] );
$ connection = new Connection ( $ client );
// A (more common) example for a Get connector with simple filter, returning an
// array of rows:
$ result_as_array = $ connection -> getData ( ' MyGetConnectorName ' , [ ' SomeCategory ' => ' CategName ' ] );
// The equivalent of above:
$ result_as_string = $ connection -> getData (
' MyGetConnectorName ' ,
[ ' SomeCategory ' => ' CategName ' ,
[ ' Updated ' => ' 2017-01-01T16:00:00 ' , ' #op ' => Connection:: OP_LARGER_THAN ],
],
Connection:: GET_FILTER_AND ,
[ ' take => 1000,
' orderbyfieldids' => ' -Updated ' ,
' options ' => [ ' Outputmode ' => Connection:: GET_OUTPUTMODE_LITERAL ]
]
);
$ attachment = $ connection -> getData ( 123 , [], Connection:: DATA_TYPE_SUBJECT );
$ connection -> sendData ([ ' name ' => ' MyCompany Ltd. ' ], ' KnOrganisation ' , ' insert ' );... Então, se a opção 'OUTPUTMODE' não for fornecida, o getData () retornará uma matriz de linhas de dados (ou seja, a string xml/json será decodificada para você).
Obtenha conectores
Atualize as classes Connectores / UpdateObject
Dicas para desenvolvedores
Gosto de contribuir com software de código aberto para o mundo e gosto de abrir sistemas subdocumentados semi-fechados. (O que foi o caso da AFAS em 2012, mas ficou melhor.) Me dê um grito se isso for útil ou se você tiver uma contribuição. Entre em contato comigo se precisar de um trabalho de integração realizado. (Tenho experiência com vários outros sistemas.)
Esta biblioteca está licenciada sob a licença do MIT - consulte o arquivo License.md para obter detalhes.
Dica de chapéu para Philip Vergunt e Nathan Vergunt -Kolozsvári @ Your Source - produzindo uma primeira versão do código PHP que pelo menos trocou os dados corretos, não deve ter sido fácil.
Grite para YellowGrape, profissionais da estratégia / marketing / design de comércio eletrônico. Enquanto eu produzia esse software em meu próprio tempo não remunerado, não teria a experiência do AFAS sem eles.