Compare commits

...

6 Commits

Author SHA1 Message Date
e26333ce21 addpartner 2021-04-24 11:09:00 +02:00
fdbdd519cf paid invoices support 2021-04-23 22:54:36 +02:00
cddb6463cd getpartners 2019-12-25 21:12:23 +01:00
b038c239fd Update README.md 2019-11-03 13:06:00 +01:00
f35effb36d Update README.md 2019-11-03 13:04:27 +01:00
052c559a49 ci 2019-11-03 13:01:52 +01:00
3 changed files with 168 additions and 93 deletions

17
.github/workflows/dotnetcore.yml vendored Normal file
View File

@@ -0,0 +1,17 @@
name: .NET Core
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v1
- name: Setup .NET Core
uses: actions/setup-dotnet@v1
with:
dotnet-version: 2.2.108
- name: Build with dotnet
run: dotnet build --configuration Release

View File

@@ -10,55 +10,84 @@ using System.Threading.Tasks;
namespace CebelcaAPI
{
public class CebelcaAPISharp
public class CebelcaPartner
{
public string Id { get; set; }
public string Name { get; set; }
}
public class CebelcaAPISharp
{
private string _key = "";
public CebelcaAPISharp(string key)
{
private string _key = "";
public CebelcaAPISharp(string key)
{
_key = key;
}
private async Task<string> APICall(string region, string method, Dictionary<string, string> postvalues)
{
using (var client = new HttpClient())
{
var byteArray = Encoding.ASCII.GetBytes($"{_key}:x");
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
// var url = "https://www.cebelca.biz/API?_r=invoice-sent&_m=insert-into";
var url = $"https://www.cebelca.biz/API?_r={region}&_m={method}";
var content = new FormUrlEncodedContent(postvalues);
var response = await client.PostAsync(url, content);
_key = key;
}
private async Task<string> APICall(string region, string method, Dictionary<string, string> postvalues)
{
using (var client = new HttpClient())
{
var byteArray = Encoding.ASCII.GetBytes($"{_key}:x");
client.DefaultRequestHeaders.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray));
// var url = "https://www.cebelca.biz/API?_r=invoice-sent&_m=insert-into";
var url = $"https://www.cebelca.biz/API?_r={region}&_m={method}";
var content = new FormUrlEncodedContent(postvalues);
var response = await client.PostAsync(url, content);
var responseString = await response.Content.ReadAsStringAsync();
return responseString;
var responseString = await response.Content.ReadAsStringAsync();
return responseString;
}
}
}
}
public async Task<string> AddInvoiceHead(string partnerId, string idDocumentExt, DateTime dateSent, DateTime dateServed, DateTime dateToPay)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("sl-SI");
var values = new Dictionary<string, string>
public async Task<string> AddInvoiceHead(string partnerId, string idDocumentExt, DateTime dateSent, DateTime dateServed, DateTime dateToPay, bool paid = false)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("sl-SI");
var values = new Dictionary<string, string>
{
{ "date_sent",dateSent.ToShortDateString() },
{ "date_served",dateServed.ToShortDateString() },
{ "date_to_pay",dateToPay.ToShortDateString() },
{ "date_to_pay", dateToPay.ToShortDateString() },
{ "id_partner", partnerId },
{ "id_document_ext", idDocumentExt }
};
var ret = await APICall("invoice-sent", "insert-smart-2", values);
var json = JArray.Parse(ret);
var retname = (json[0][0] as JObject).Properties().First().Name;
if (retname != "id")
throw new Exception("Error from api: "+ret);
var id = json[0][0]["id"].Value<string>();
return id;
if (paid)
{
values.Add("payment", "paid");
values.Add("payment_act", "1");
}
var ret = await APICall("invoice-sent", "insert-smart-2", values);
var json = JArray.Parse(ret);
var retname = (json[0][0] as JObject).Properties().First().Name;
if (retname != "id")
throw new Exception("Error from api: " + ret);
var id = json[0][0]["id"].Value<string>();
return id;
}
}
public async Task SendInvoiceByEmail(string invoiceId, string to, string subject, string content)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("sl-SI");
var values = new Dictionary<string, string>
public async Task<IEnumerable<CebelcaPartner>> GetPartners()
{
var values = new Dictionary<string, string>();
var ret = await APICall("partner", "select-all", values);
var json = JArray.Parse(ret);
var retname = (json[0][0] as JObject).Properties().First().Name;
if (retname != "id")
throw new Exception("Error from api: " + ret);
var id = json[0][0]["id"].Value<string>();
//var l = new List<CebelcaPartner>();
var l = json[0].Select(x => new CebelcaPartner
{
Id = x["id"].Value<string>(),
Name = x["name"].Value<string>()
}).ToList();
return l;
}
public async Task SendInvoiceByEmail(string invoiceId, string to, string subject, string content)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("sl-SI");
var values = new Dictionary<string, string>
{
{ "id_invoice_sent", invoiceId},
{ "mto", to},
@@ -69,16 +98,16 @@ namespace CebelcaAPI
{ "content", content},
{ "format", "pdf"}
};
var ret = await APICall("mailer", "push-invoice-sent-doc", values);
}
var ret = await APICall("mailer", "push-invoice-sent-doc", values);
}
public async Task<string> AddInvoiceLine(string invoiceId,string title, string measuringUnit, string qty, decimal price, string vat, string discount)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("sl-SI");
var values = new Dictionary<string, string>
public async Task<string> AddInvoiceLine(string invoiceId, string title, string measuringUnit, string qty, decimal price, string vat, string discount)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("sl-SI");
var values = new Dictionary<string, string>
{
{ "title",title },
{ "mu",measuringUnit },
@@ -87,62 +116,62 @@ namespace CebelcaAPI
{ "price", price.ToString() },
{ "vat", vat }
};
var ret = await APICall("invoice-sent-b", "insert-into", values);
var json = JArray.Parse(ret);
var retname = (json[0][0] as JObject).Properties().First().Name;
if (retname != "id")
throw new Exception("Error from api: " + ret);
var id = json[0][0]["id"].Value<string>();
return id;
var ret = await APICall("invoice-sent-b", "insert-into", values);
var json = JArray.Parse(ret);
var retname = (json[0][0] as JObject).Properties().First().Name;
if (retname != "id")
throw new Exception("Error from api: " + ret);
var id = json[0][0]["id"].Value<string>();
return id;
}
}
public async Task<string> AddPayment(string invoiceId, DateTime dateOfPayment, decimal amount, string paymentMethod )
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("sl-SI");
var values = new Dictionary<string, string>
public async Task<string> AddPayment(string invoiceId, DateTime dateOfPayment, decimal amount, string paymentMethod)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("sl-SI");
var values = new Dictionary<string, string>
{
{ "date_of",dateOfPayment.ToShortDateString() },
{ "amount",amount.ToString() },
{ "id_invoice_sent", invoiceId },
{ "id_payment_method", paymentMethod},
};
var ret = await APICall("invoice-sent-p", "insert-into", values);
var json = JArray.Parse(ret);
var retname = (json[0][0] as JObject).Properties().First().Name;
if (retname != "id")
throw new Exception("Error from api: " + ret);
var id = json[0][0]["id"].Value<string>();
return id;
var ret = await APICall("invoice-sent-p", "insert-into", values);
var json = JArray.Parse(ret);
var retname = (json[0][0] as JObject).Properties().First().Name;
if (retname != "id")
throw new Exception("Error from api: " + ret);
var id = json[0][0]["id"].Value<string>();
return id;
}
}
public async Task<string> IssueInvoiceNoFiscalization(string invoiceId, string docType="0")
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("sl-SI");
var values = new Dictionary<string, string>
public async Task<string> IssueInvoiceNoFiscalization(string invoiceId, string docType = "0")
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("sl-SI");
var values = new Dictionary<string, string>
{
{ "id", invoiceId },
{ "doctype", docType},
};
var ret = await APICall("invoice-sent", "finalize-invoice-2015", values);
var json = JArray.Parse(ret);
var retname = (json[0][0] as JObject).Properties().First().Name;
if (retname != "new_title")
throw new Exception("Error from api: " + ret);
var id = json[0][0]["new_title"].Value<string>();
return id;
var ret = await APICall("invoice-sent", "finalize-invoice-2015", values);
var json = JArray.Parse(ret);
var retname = (json[0][0] as JObject).Properties().First().Name;
if (retname != "new_title")
throw new Exception("Error from api: " + ret);
var id = json[0][0]["new_title"].Value<string>();
return id;
}
}
public async Task<string> IssueInvoiceFiscalization(string invoiceId, string idLocation, string opTaxId, string opName, bool test_mode = false )
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("sl-SI");
var values = new Dictionary<string, string>
public async Task<string> IssueInvoiceFiscalization(string invoiceId, string idLocation, string opTaxId, string opName, bool test_mode = false)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("sl-SI");
var values = new Dictionary<string, string>
{
{ "id", invoiceId },
@@ -153,16 +182,41 @@ namespace CebelcaAPI
{ "test_mode", test_mode ? "1" : "0" },
};
var ret = await APICall("invoice-sent", "finalize-invoice", values);
var json = JArray.Parse(ret);
var retname = (json[0][0] as JObject).Properties().First().Name;
if (retname != "docnum")
throw new Exception("Error from api: " + ret);
var id = json[0][0]["docnum"].Value<string>();
var eor = json[0][0]["eor"].Value<string>();
return id;
}
var ret = await APICall("invoice-sent", "finalize-invoice", values);
var json = JArray.Parse(ret);
var retname = (json[0][0] as JObject).Properties().First().Name;
if (retname != "docnum")
throw new Exception("Error from api: " + ret);
var id = json[0][0]["docnum"].Value<string>();
var eor = json[0][0]["eor"].Value<string>();
return id;
}
public async Task<string> AddPartner(string name, string email, string street, string city,
string postal)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("sl-SI");
var values = new Dictionary<string, string>
{
{ "name", name },
{ "email", email },
{ "street", street },
{ "city", city },
{ "postal", postal },
};
var ret = await APICall("partner", "assure", values);
var json = JArray.Parse(ret);
var retname = (json[0][0] as JObject).Properties().First().Name;
if (retname != "id")
throw new Exception("Error from api: " + ret);
var id = json[0][0]["id"].Value<string>();
return id;
}
}
}

View File

@@ -1,2 +1,6 @@
# CebelcaAPISharp
A simple library for Cebelca.biz (InvoiceFox) API.
Currently supports creating invoice, adding items to it, issuing invoice, fiscalization and sending the invoice by email.
Not much error handling at the moment, not production ready, but feel free to improve :)