| 
					
				 | 
			
			
				@@ -0,0 +1,127 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Comal.Classes; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using FastReport.Data; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using InABox.Core; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using InABox.Poster.MYOB; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using MYOB.AccountRight.SDK.Services; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using MYOB.AccountRight.SDK.Services.Contact; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.Collections.Generic; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.Linq; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.Net; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.Text; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using System.Threading.Tasks; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using Customer = Comal.Classes.Customer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using MYOBCustomer = MYOB.AccountRight.SDK.Contracts.Version2.Contact.Customer; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+using MYOBAddress = MYOB.AccountRight.SDK.Contracts.Version2.Contact.Address; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+namespace PRS.Shared.Posters.MYOB; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+public class CustomerMYOBPoster : IMYOBPoster<Customer> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public MYOBPosterSettings Settings { get; set; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public MYOBGlobalPosterSettings GlobalSettings { get; set; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public MYOBConnectionData ConnectionData { get; set; } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static void SplitName(string name, out string firstName, out string lastName) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var names = name.Split(' ', 2, StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        firstName = names.Length > 0 ? names[0] : ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        lastName = names.Length > 1 ? names[1] : ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private static string TruncateString(string value, int maxLength) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        if(value.Length > maxLength) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return value[..maxLength]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            return value; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    private MYOBAddress ConvertAddress(Address address, int location, IContact contact) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return new MYOBAddress 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Location = location, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Street = address.Street, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            City = address.City, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            State = address.State, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            PostCode = address.PostCode, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Phone1 = contact.Mobile, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Phone2 = contact.Telephone, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            Email = contact.Email, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            ContactName = contact.Name 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    public IPostResult<Customer> Process(IDataModel<Customer> model) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var results = new PostResult<Customer>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var service = new CustomerService(ConnectionData.Configuration, null, ConnectionData.AuthKey); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        var customers = model.GetTable<Customer>().ToArray<Customer>(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        foreach(var customer in customers) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            try 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                Guid.TryParse(customer.PostedReference, out var myobID); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                SplitName(customer.DefaultContact.Name, out var firstName, out var lastName); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var myobCustomer = new MYOBCustomer 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    UID = myobID, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    CompanyName = customer.Name, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    FirstName = firstName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    LastName = lastName, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    IsIndividual = false, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    DisplayID = TruncateString(customer.Code, 15), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    IsActive = customer.CustomerStatus.Active, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    Addresses = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    [ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ConvertAddress(customer.Delivery, 1, customer.DefaultContact), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                        ConvertAddress(customer.Postal, 2, customer.DefaultContact) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    ], 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // Notes =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    CurrentBalance = (decimal)customer.Balance, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // PaymentDetails =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // PhotoURI = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    // RowVersion =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                }; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.SaleLayout =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.PrintedFOrm =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.InvoiceDelivery =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.ItemPriceLevel =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.IncomeAccount =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.ReceiptMemo =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.SalesPerson =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.SaleComment =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.ShippingMethod =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.HourlyBillRate =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.ABNBranch =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                myobCustomer.SellingDetails.ABN = customer.ABN; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.TaxCode =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.FreightTaxCode =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.UseCustomerTaxCode =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.Terms =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.Credit =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.TaxIdNumber =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                // myobCustomer.SellingDetails.Memo =  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                var result = service.Update(ConnectionData.CompanyFile, myobCustomer, ConnectionData.CompanyFileCredentials); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                results.AddSuccess(customer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            catch (Exception e) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                CoreUtils.LogException("", e, $"Error while posting customer {customer.ID}"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                results.AddFailed(customer, e.Message); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        return results; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |