# Introducing the .NET wrapper for the Sage One Accounting API

A while back my accountant convinced me to move our accounting package to Sage One Online. Not only am I very happy with the change, I’m also intrigued with their API, which enables developers to integrate with Sage One and perform a wide range of tasks . As a result I’ve created an open source project with the aim to create a fully fledged .Net wrapper library for the Sage One Accounting API. The code is available on [**GitHub**](https://github.com/Pietervdw/sageone-api-wrapper), so please feel free to grab your fork and start contributing! The project is still under active development and I’m adding features as I need them. As of writing, the library supports the following operation s:  

*   **Account**
    
    *   Get All
    *   Get
    *   Save (Create and Update)
    *   Delete
    *   Get with System Accounts
    *   Get by Category
*   **Customer**
    
    *   Get All
    *   Get
    *   Save (Create and Update)
    *   Delete
*   **Company**
    
    *   Get Current
*   **Item**
    
    *   Get All
    *   Get
    *   Save (Create and Update)
    *   Delete
*   **Categories (Account, Asset, Bank Account, Customer, Item, Supplier)**
    
    *   Get All
    *   Get
    *   Save (Create and Update) excl. Account Categories
    *   Delete
*   **Sales Representative**
    
    *   Get All
    *   Get
    *   Save (Create and Update)
    *   Delete
    *   HasActivity
*   **Supplier**
    
    *   Get All
    *   Get
    *   Save (Create and Update)
    *   Delete
*   **Tax Invoice**
    
    *   Get All
    *   Get
    *   Save (Create and Update)
    *   Calculate

For example to get a list of customers on Sage One you’ll use the following C# code:

```csharp
public void GetAllCustomers()
{
    var api = new ApiRequest(Username, Password, Apikey, CompanyId);
    var customers = api.CustomerRequest.Get();
}
```

The Sage One API is pretty neat in the fact that it support OData queries out of the box. For example to find a customer with an e-mail address, you can simply pass in a filter parameter to the Get method:

```csharp
public void GetCustomerByEmail()
{
    string filter = "Email eq 'info@contoso.com'";
    var api = new ApiRequest(Username, Password, Apikey, CompanyId);
    var customers = api.CustomerRequest.Get(filter);
}
```

In case you’re wondering how OData queries work, take a look at the following [example](http://www.odata.org/documentation/odata-version-2-0/uri-conventions/). The load a customer by ID, you’ll use the following:

```csharp
public void GetCustomer()
{
    int customerId = 12345;
    var api = new ApiRequest(Username, Password, Apikey, CompanyId);
    var customer = api.CustomerRequest.Get(customerId);
}
```

In order to create a new Sage One Customer, you’ll need to create a new instance of the Customer class, as illustrated below:

```csharp
public void SaveCustomer()
{
    var api = newApiRequest(Username, Password, Apikey, CompanyId);
    var customer = new Customer
    {
        Name = "Mr. David R. Robinett",
        AcceptsElectronicInvoices = true,
        Active = true,
        AutoAllocateToOldestInvoice = true,
        Balance = 0,
        ContactName = "Mr. David R. Robinett",
        DeliveryAddress01 = "Pappelallee 6667",
        DeliveryAddress02 = "Solingen",
        DeliveryAddress03 = "Nordrhein-Westfalen",
        DeliveryAddress04 = "42651",
        DeliveryAddress05 = "Germany",
        CommunicationMethod = 1,
        PostalAddress01 = "Pappelallee 6667",
        PostalAddress02 = "Solingen",
        PostalAddress03 = "Nordrhein-Westfalen",
        PostalAddress04 = "42651",
        PostalAddress05 = "Germany",
        Telephone = "238-555-0100",
        SalesRepresentativeId = null
    };
    api.CustomerRequest.Save(customer);
}
```

To delete a Sage One Customer, simply call the Delete method:

```csharp
public void Delete()
{
    int customerId = 12345;
    var api = new ApiRequest(Username, Password, Apikey, CompanyId);
    var result = api.CustomerRequest.Delete(customerId);
}
```

To create a Tax Invoice:
```csharp
public void CreateInvoice()
{
    var api = new ApiRequest(Username, Password, Apikey, CompanyId);
    var customerId = 0;
    var salesRepId = 0;
    var itemId = 0;
    var taxTypeId = 0;
    TaxInvoice invoice = new TaxInvoice();
    var customer = api.CustomerRequest.Get(customerId);
    var salesRep = api.SalesRepresentativeRequest.Get(salesRepId);
    // Must set both CustomerId and Customer in order to work
    invoice.CustomerId = customerId;
    invoice.Customer = customer;
    // Must set both SalesRepresentativeId and SalesRepresentative in order to work
    invoice.SalesRepresentativeId = salesRepId;
    invoice.SalesRepresentative = salesRep;
    invoice.Date = DateTime.Now;
    invoice.DueDate = new DateTime(2015, 12, 12);
    invoice.Lines = new List<CommercialDocumentLine>();
    var line1 = new CommercialDocumentLine
    {
        SelectionId = itemId, // This must be an item or account id
        TaxTypeId = taxTypeId, // Use TaxTypeRequest to get list of Tax Types
        LineType = 0, // 0=Item/1=Account
        Quantity = 1,
        UnitPriceExclusive = 390,
        UnitPriceInclusive = 390,
        DiscountPercentage = 0
    };
    invoice.Lines.Add(line1);
    var newTaxInvoice = api.TaxInvoiceRequest.Save(invoice);
}
```

Lots more to come. Keep watching this space!
