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