PHPackages                             picqer/twinfield-php-client - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [API Development](/categories/api)
4. /
5. picqer/twinfield-php-client

ActiveLibrary[API Development](/categories/api)

picqer/twinfield-php-client
===========================

PHP Client Library for using the Twinfield Soap Service.

v2.0(5y ago)520.8k—0%3[1 issues](https://github.com/picqer/twinfield-php-client/issues)[1 PRs](https://github.com/picqer/twinfield-php-client/pulls)GPL-3.0-or-laterPHPPHP &gt;=5.6

Since Mar 27Pushed 4y ago2 watchersCompare

[ Source](https://github.com/picqer/twinfield-php-client)[ Packagist](https://packagist.org/packages/picqer/twinfield-php-client)[ Docs](http://pronamic.nl)[ RSS](/packages/picqer-twinfield-php-client/feed)WikiDiscussions master Synced 2d ago

READMEChangelog (5)Dependencies (1)Versions (7)Used By (0)

Twinfield
=========

[](#twinfield)

A PHP library for Twinfield Integration. Developed by [Remco Tolsma](http://remcotolsma.nl/) and [Leon Rowland](http://leon.rowland.nl/) from [Pronamic](http://pronamic.nl/).

Use the Twinfield SOAP Service to have your PHP application communicate directly with your Twinfield account.

Why this fork?
--------------

[](#why-this-fork)

**This package** provides a proper semver-versioned fork of the package, for safe usage with composer in your projects.

---

Usage
-----

[](#usage)

Install this package with composer:

```
composer require picqer/twinfield-php-client

```

### General Usage

[](#general-usage)

Components have Factories to simplify the request and send process of Twinfield. Each factory will require just the \\Pronamic\\Twinfield\\Secure\\Config() class with the filled in details.

An example of the usage of the Configuration class.

```
$config = new \Pronamic\Twinfield\Secure\Config();
$config->setCredentials('Username', 'Password', 'Organization', 'Office');
```

- or, when using OAuth:

```
$config = new \Pronamic\Twinfield\Secure\Config();
$config->setOAuthParameters('clientID', 'clientSecret', 'returnURL', 'Organization', 'Office', true);
//the true parameter at the end tells the system to automatically redirect to twinfield to login
```

### The current modules

[](#the-current-modules)

In the following example, we will use the Customer component as showcase. Although this will be the method for all components ( including Invoice currently )

Typically it is as follows, if using the Factories

- Add/Edit: Make Object, Make Factory, Give object in Submit method of related factory.
- Retrieve: Make Factory, Supply all required params to respective listAll() and get() methods

#### Add/Edit

[](#addedit)

Make your Customer object

```
$customer = new \Pronamic\Twinfield\Customer\Customer();
$customer
	->setID(10666)
	->setName('Leon Rowland')
	->setType('DEB')
	->setWebsite('http://leon.rowland.nl')
	->setEBilling(true)
	->setEBillMail('leon@rowland.nl')
	->setVatCode('VL')
	->setDueDays(10)
	->setCocNumber('12341234');
```

Customers can have addresses associated with them

```
$customerAddress = new \Pronamic\Twinfield\Customer\CustomerAddress();
$customerAddress
	->setDefault(false)
	->setType('invoice')
	->setField1('Testing field 1')
	->setField2('Testing field 2')
	->setField3('Testing field 3')
	->setPostcode('1212 AB')
	->setCity('TestCity')
	->setCountry('NL')
	->setTelephone('010-12345')
	->setFax('010-1234')
	->setEmail('test@email.com');
```

Assign that address to the customer

```
$customer->addAddress($customerAddress);
```

Now lets submit it!

```
use \Pronamic\Twinfield\Customer as TwinfieldCustomer;

// Config object prepared and passed to the CustomerFactory
$customerFactory = new TwinfieldCustomer\CustomerFactory($config);

//$customer = new TwinfieldCustomer\Customer();

// Attempt to send the Customer document
if($customerFactory->send($customer)){
	// Use the Mapper to turn the response back into a TwinfieldCustomer\Customer
	$successfulCustomer = TwinfieldCustomer\Mapper\CustomerMapper::map($customerFactory->getResponse());
}
```

#### Retrieve/Request

[](#retrieverequest)

You can get all customers or get a single one currently.

```
use \Pronamic\Twinfield\Customer as TwinfieldCustomer;

// Config object prepared and passed into the CustomerFactory
$customerFactory = new TwinfieldCustomer\CustomerFactory($config);

$customers = $customerFactory->listAll();
```

At the moment, listAll will return an array of just name and short name.

```
$customer = $customerFactory->get('customerCode', 'office[optional]');
```

The response from get() will be a \\Pronamic\\Twinfield\\Customer\\Customer object.

Contribute
----------

[](#contribute)

You can contribute to the development of this project. Try and keep to the way of doing things as the other 2 components have implemented.

A large requirement is to maintain backwards compatibility so if you have any plans for large restructure or alteration please bring up in an issue first.

Componentget()listAll()send()MapperNamespace[Customer](https://c1.twinfield.com/webservices/documentation/#/ApiReference/Masters/Customers)✅✅✅✅[Pronamic/Twinfield/Customer](https://github.com/pronamic/twinfield/tree/develop/src/Pronamic/Twinfield/Customer)[Sales Invoices](https://c1.twinfield.com/webservices/documentation/#/ApiReference/SalesInvoices)✅✅✅✅[Pronamic/Twinfield/Invoice](https://github.com/pronamic/twinfield/tree/develop/src/Pronamic/Twinfield/Invoice)Transactions: [Purchase](https://c1.twinfield.com/webservices/documentation/#/ApiReference/PurchaseTransactions) [Sale](https://c1.twinfield.com/webservices/documentation/#/ApiReference/SalesTransactions)✅[Pronamic/Twinfield/Transaction](https://github.com/pronamic/twinfield/tree/develop/src/Pronamic/Twinfield/Transaction)[Articles](https://c1.twinfield.com/webservices/documentation/#/ApiReference/Masters/Articles)Pronamic/Twinfield/Article[Balance Sheets](https://c1.twinfield.com/webservices/documentation/#/ApiReference/Masters/BalanceSheets)Pronamic/Twinfield/BalanceSheet[Suppliers](https://c1.twinfield.com/webservices/documentation/#/ApiReference/Masters/Suppliers)Pronamic/Twinfield/Supplier[Dimension Groups](https://c1.twinfield.com/webservices/documentation/#/ApiReference/Masters/DimensionGroups)Pronamic/Twinfield/Dimension/Group[Dimension Types](https://c1.twinfield.com/webservices/documentation/#/ApiReference/Masters/DimensionTypes)Pronamic/Twinfield/Dimension/Type[Offices](https://c1.twinfield.com/webservices/documentation/#/ApiReference/Masters/Offices)✅Pronamic/Twinfield/Office[Vat types](https://c3.twinfield.com/webservices/documentation/#/ApiReference/Miscellaneous/Finder)✅Pronamic/Twinfield/VatCodeLinks
-----

[](#links)

- [Twinfield API Documentation site](https://c1.twinfield.com/webservices/documentation/)
- [Twinfield Library for Python](https://bitbucket.org/vanschelven/twinfield)

Authors
-------

[](#authors)

- [Pronamic](http://pronamic.nl/)
- [Remco Tolsma](http://remcotolsma.nl/)
- [Emile Bons](http://www.emilebons.nl)
- [Stephan Groen](https://github.com/stephangroen)

License
-------

[](#license)

Copyright 2009-2017 Pronamic.

This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA

###  Health Score

35

—

LowBetter than 77% of packages

Maintenance16

Infrequent updates — may be unmaintained

Popularity31

Limited adoption so far

Community19

Small or concentrated contributor base

Maturity62

Established project with proven stability

 Bus Factor1

Top contributor holds 53.5% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~596 days

Recently: every ~368 days

Total

6

Last Release

1865d ago

Major Versions

0.0.1 → v1.0.02017-05-12

v1.0.3 → v2.02021-05-25

PHP version history (2 changes)0.0.1PHP &gt;=5.4

v1.0.0PHP &gt;=5.6

### Community

Maintainers

![](https://www.gravatar.com/avatar/7e81564faf640cc39dc0a13fd619ee761e6e99e7bae96ca258fcd2e7d9f8cbd5?d=identicon)[cbakker](/maintainers/cbakker)

---

Top Contributors

[![zogot](https://avatars.githubusercontent.com/u/493614?v=4)](https://github.com/zogot "zogot (131 commits)")[![remcotolsma](https://avatars.githubusercontent.com/u/869674?v=4)](https://github.com/remcotolsma "remcotolsma (48 commits)")[![NoDiscipline](https://avatars.githubusercontent.com/u/5564740?v=4)](https://github.com/NoDiscipline "NoDiscipline (16 commits)")[![stephangroen](https://avatars.githubusercontent.com/u/1607643?v=4)](https://github.com/stephangroen "stephangroen (14 commits)")[![casperbakker](https://avatars.githubusercontent.com/u/886975?v=4)](https://github.com/casperbakker "casperbakker (10 commits)")[![EmileBons](https://avatars.githubusercontent.com/u/3186640?v=4)](https://github.com/EmileBons "EmileBons (7 commits)")[![arnoutdemooij](https://avatars.githubusercontent.com/u/929767?v=4)](https://github.com/arnoutdemooij "arnoutdemooij (6 commits)")[![mmolhoek](https://avatars.githubusercontent.com/u/39786?v=4)](https://github.com/mmolhoek "mmolhoek (4 commits)")[![kleiram](https://avatars.githubusercontent.com/u/323498?v=4)](https://github.com/kleiram "kleiram (4 commits)")[![mastercoding](https://avatars.githubusercontent.com/u/306659?v=4)](https://github.com/mastercoding "mastercoding (2 commits)")[![NanneHuiges](https://avatars.githubusercontent.com/u/1526794?v=4)](https://github.com/NanneHuiges "NanneHuiges (1 commits)")[![rvanlaarhoven](https://avatars.githubusercontent.com/u/1857585?v=4)](https://github.com/rvanlaarhoven "rvanlaarhoven (1 commits)")[![vswarte](https://avatars.githubusercontent.com/u/6827387?v=4)](https://github.com/vswarte "vswarte (1 commits)")

---

Tags

apiclientphpsoaptwinfieldtwinfield

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/picqer-twinfield-php-client/health.svg)

```
[![Health](https://phpackages.com/badges/picqer-twinfield-php-client/health.svg)](https://phpackages.com/packages/picqer-twinfield-php-client)
```

###  Alternatives

[exsyst/swagger

A php library to manipulate Swagger specifications

35916.4M7](/packages/exsyst-swagger)[hubspot/api-client

Hubspot API client

24016.2M20](/packages/hubspot-api-client)[php-twinfield/twinfield

Library for using the Twinfield Soap Service.

33817.6k1](/packages/php-twinfield-twinfield)[pocketmine/bedrock-protocol

An implementation of the Minecraft: Bedrock Edition protocol in PHP

172445.0k15](/packages/pocketmine-bedrock-protocol)[botman/driver-telegram

Telegram driver for BotMan

93459.5k6](/packages/botman-driver-telegram)[pronamic/twinfield

\[DEPRECATED\] Library for using the Twinfield Soap Service.

21110.1k](/packages/pronamic-twinfield)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
