summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
Diffstat (limited to 'include')
-rw-r--r--include/administration.hpp117
-rw-r--r--include/file_templates.hpp79
-rw-r--r--include/strops.hpp6
3 files changed, 186 insertions, 16 deletions
diff --git a/include/administration.hpp b/include/administration.hpp
index 774faf8..5e6f0c1 100644
--- a/include/administration.hpp
+++ b/include/administration.hpp
@@ -15,7 +15,7 @@
#define MAX_LEN_LONG_DESC 64
#define MAX_LEN_EMAIL 64
#define MAX_LEN_PHONE 16
-#define MAX_LEN_BANK 32
+#define MAX_LEN_BANK 35
#define MAX_LEN_TAXID 32
#define MAX_LEN_BUSINESSID 32
#define MAX_LEN_TAX_SECTION 16
@@ -27,7 +27,7 @@ typedef struct
char id[MAX_LEN_ID]; // T/[id]
char country_code[MAX_LEN_COUNTRY_CODE]; // 2 letter country code
float rate; // 0-100%
- char description[MAX_LEN_SHORT_DESC]; // Currently only used for global tax brackets
+ char description[MAX_LEN_SHORT_DESC];
} country_tax_bracket;
typedef struct
@@ -117,6 +117,113 @@ typedef struct
char tax_section[MAX_LEN_TAX_SECTION];
} billing_item;
+/**
+ * UN/CEFACT Payment Means Code (UNCL4461)
+ * Source: https://docs.peppol.eu/poacc/billing/3.0/codelist/UNCL4461/
+ */
+typedef enum {
+ PAYMENT_METHOD_INSTRUMENT_NOT_DEFINED = 1,
+ PAYMENT_METHOD_ACH_CREDIT = 2,
+ PAYMENT_METHOD_ACH_DEBIT = 3,
+ PAYMENT_METHOD_ACH_DEMAND_DEBIT_REVERSAL = 4,
+ PAYMENT_METHOD_ACH_DEMAND_CREDIT_REVERSAL = 5,
+ PAYMENT_METHOD_ACH_DEMAND_CREDIT = 6,
+ PAYMENT_METHOD_ACH_DEMAND_DEBIT = 7,
+ PAYMENT_METHOD_HOLD = 8,
+ PAYMENT_METHOD_NATIONAL_REGIONAL_CLEARING = 9,
+ PAYMENT_METHOD_CASH = 10,
+ PAYMENT_METHOD_ACH_SAVINGS_CREDIT_REVERSAL = 11,
+ PAYMENT_METHOD_ACH_SAVINGS_DEBIT_REVERSAL = 12,
+ PAYMENT_METHOD_ACH_SAVINGS_CREDIT = 13,
+ PAYMENT_METHOD_ACH_SAVINGS_DEBIT = 14,
+ PAYMENT_METHOD_BOOKENTRY_CREDIT = 15,
+ PAYMENT_METHOD_BOOKENTRY_DEBIT = 16,
+ PAYMENT_METHOD_ACH_DEMAND_CCD_CREDIT = 17,
+ PAYMENT_METHOD_ACH_DEMAND_CCD_DEBIT = 18,
+ PAYMENT_METHOD_ACH_DEMAND_CTP_CREDIT = 19,
+ PAYMENT_METHOD_CHEQUE = 20,
+ PAYMENT_METHOD_BANKERS_DRAFT = 21,
+ PAYMENT_METHOD_CERTIFIED_BANKERS_DRAFT = 22,
+ PAYMENT_METHOD_BANK_CHEQUE = 23,
+ PAYMENT_METHOD_BILL_OF_EXCHANGE_AWAITING_ACCEPTANCE = 24,
+ PAYMENT_METHOD_CERTIFIED_CHEQUE = 25,
+ PAYMENT_METHOD_LOCAL_CHEQUE = 26,
+ PAYMENT_METHOD_ACH_DEMAND_CTP_DEBIT = 27,
+ PAYMENT_METHOD_ACH_DEMAND_CTX_CREDIT = 28,
+ PAYMENT_METHOD_ACH_DEMAND_CTX_DEBIT = 29,
+ PAYMENT_METHOD_CREDIT_TRANSFER = 30,
+ PAYMENT_METHOD_DEBIT_TRANSFER = 31,
+ PAYMENT_METHOD_ACH_DEMAND_CCD_PLUS_CREDIT = 32,
+ PAYMENT_METHOD_ACH_DEMAND_CCD_PLUS_DEBIT = 33,
+ PAYMENT_METHOD_ACH_PPD = 34,
+ PAYMENT_METHOD_ACH_SAVINGS_CCD_CREDIT = 35,
+ PAYMENT_METHOD_ACH_SAVINGS_CCD_DEBIT = 36,
+ PAYMENT_METHOD_ACH_SAVINGS_CTP_CREDIT = 37,
+ PAYMENT_METHOD_ACH_SAVINGS_CTP_DEBIT = 38,
+ PAYMENT_METHOD_ACH_SAVINGS_CTX_CREDIT = 39,
+ PAYMENT_METHOD_ACH_SAVINGS_CTX_DEBIT = 40,
+ PAYMENT_METHOD_ACH_SAVINGS_CCD_PLUS_CREDIT = 41,
+ PAYMENT_METHOD_PAYMENT_TO_BANK_ACCOUNT = 42,
+ PAYMENT_METHOD_ACH_SAVINGS_CCD_PLUS_DEBIT = 43,
+ PAYMENT_METHOD_ACCEPTED_BILL_OF_EXCHANGE = 44,
+ PAYMENT_METHOD_REFERENCED_HOME_BANKING_CREDIT_TRANSFER = 45,
+ PAYMENT_METHOD_INTERBANK_DEBIT_TRANSFER = 46,
+ PAYMENT_METHOD_HOME_BANKING_DEBIT_TRANSFER = 47,
+ PAYMENT_METHOD_BANK_CARD = 48,
+ PAYMENT_METHOD_DIRECT_DEBIT = 49,
+ PAYMENT_METHOD_PAYMENT_BY_POSTGIRO = 50,
+ PAYMENT_METHOD_FR_NORME_6_97_CFONB_OPTION_A = 51,
+ PAYMENT_METHOD_URGENT_COMMERCIAL_PAYMENT = 52,
+ PAYMENT_METHOD_URGENT_TREASURY_PAYMENT = 53,
+ PAYMENT_METHOD_CREDIT_CARD = 54,
+ PAYMENT_METHOD_DEBIT_CARD = 55,
+ PAYMENT_METHOD_BANKGIRO = 56,
+ PAYMENT_METHOD_STANDING_AGREEMENT = 57,
+ PAYMENT_METHOD_SEPA_CREDIT_TRANSFER = 58,
+ PAYMENT_METHOD_SEPA_DIRECT_DEBIT = 59,
+ PAYMENT_METHOD_PROMISSORY_NOTE = 60,
+ PAYMENT_METHOD_PROMISSORY_NOTE_SIGNED_BY_DEBTOR = 61,
+ PAYMENT_METHOD_PROMISSORY_NOTE_SIGNED_BY_DEBTOR_AND_ENDORSED_BY_BANK = 62,
+ PAYMENT_METHOD_PROMISSORY_NOTE_SIGNED_BY_DEBTOR_AND_ENDORSED_BY_THIRD_PARTY = 63,
+ PAYMENT_METHOD_PROMISSORY_NOTE_SIGNED_BY_BANK = 64,
+ PAYMENT_METHOD_PROMISSORY_NOTE_SIGNED_BY_BANK_AND_ENDORSED_BY_ANOTHER_BANK = 65,
+ PAYMENT_METHOD_PROMISSORY_NOTE_SIGNED_BY_THIRD_PARTY = 66,
+ PAYMENT_METHOD_PROMISSORY_NOTE_SIGNED_BY_THIRD_PARTY_AND_ENDORSED_BY_BANK = 67,
+ PAYMENT_METHOD_ONLINE_PAYMENT_SERVICE = 68,
+ PAYMENT_METHOD_TRANSFER_ADVICE = 69,
+ PAYMENT_METHOD_BILL_DRAWN_BY_CREDITOR_ON_DEBTOR = 70,
+ PAYMENT_METHOD_BILL_DRAWN_BY_CREDITOR_ON_BANK = 74,
+ PAYMENT_METHOD_BILL_DRAWN_BY_CREDITOR_ENDORSED_BY_ANOTHER_BANK = 75,
+ PAYMENT_METHOD_BILL_DRAWN_BY_CREDITOR_ON_BANK_ENDORSED_BY_THIRD_PARTY = 76,
+ PAYMENT_METHOD_BILL_DRAWN_BY_CREDITOR_ON_THIRD_PARTY = 77,
+ PAYMENT_METHOD_BILL_DRAWN_BY_CREDITOR_ON_THIRD_PARTY_ACCEPTED_AND_ENDORSED_BY_BANK = 78,
+ PAYMENT_METHOD_NOT_TRANSFERABLE_BANKERS_DRAFT = 91,
+ PAYMENT_METHOD_NOT_TRANSFERABLE_LOCAL_CHEQUE = 92,
+ PAYMENT_METHOD_REFERENCE_GIRO = 93,
+ PAYMENT_METHOD_URGENT_GIRO = 94,
+ PAYMENT_METHOD_FREE_FORMAT_GIRO = 95,
+ PAYMENT_METHOD_REQUESTED_METHOD_NOT_USED = 96,
+ PAYMENT_METHOD_CLEARING_BETWEEN_PARTNERS = 97,
+ PAYMENT_METHOD_JP_ELECTRONICALLY_RECORDED_MONETARY_CLAIMS = 98,
+ PAYMENT_METHOD_MUTUALLY_DEFINED = -1 /** ZZZ */
+} payment_method;
+
+typedef struct
+{
+ char payee_bank_account[MAX_LEN_BANK]; // Recipient IBAN or BBAN account.
+ char payee_account_name[MAX_LEN_LONG_DESC]; // Name of account where payment is made to.
+ char service_provider_id[MAX_LEN_LONG_DESC]; // BIC or national clearing code.
+ char payer_bank_account[MAX_LEN_BANK]; // Sender IBAN or BBAN account.
+ payment_method payment_method;
+} payment_information;
+
+typedef struct
+{
+ float total;
+ float tax;
+ float net;
+} tax_subtotal;
+
typedef struct
{
char id[MAX_LEN_ID]; // I/[id]
@@ -138,9 +245,10 @@ typedef struct
float net;
char currency[MAX_LEN_CURRENCY]; // 3 letter code
- bool is_triangulation; // True of addressee != customer
+ bool is_triangulation; // True if addressee != customer
invoice_status status;
bool is_outgoing; // Outgoing or incomming invoice.
+ payment_information payment_means;
bool is_intra_community; // TODO uninplemented
time_t payment_on_account_date; // TODO uninplemented
@@ -253,6 +361,9 @@ u32 administration_invoice_get_partial_list_outgoing(u32 page_index, u32 pag
u32 administration_invoice_get_partial_list_incomming(u32 page_index, u32 page_size, invoice* buffer);
u32 administration_invoice_get_all(invoice* buffer);
+u32 administration_invoice_get_tax_brackets(invoice* invoice, country_tax_bracket* buffer);
+bool administration_invoice_get_subtotal_for_tax_bracket(invoice* invoice, country_tax_bracket bracket, tax_subtotal* buffer);
+
// Billing item functions.
// =======================
u32 administration_billing_item_count(invoice* invoice);
diff --git a/include/file_templates.hpp b/include/file_templates.hpp
index f267055..3559fbe 100644
--- a/include/file_templates.hpp
+++ b/include/file_templates.hpp
@@ -1,3 +1,67 @@
+const char* project_save_template =
+"<Project>\n"
+" <Id>{{PROJECT_ID}}</Id>\n"
+" <Description>{{PROJECT_DESCRIPTION}}</Description>\n"
+" <State>{{PROJECT_STATE}}</State>\n"
+" <StartDate>{{PROJECT_STARTDATE}}</StartDate>\n"
+" <EndDate>{{PROJECT_ENDDATE}}</EndDate>\n"
+"</Project>\n";
+
+const char* costcenter_save_template =
+"<CostCenter>\n"
+" <Id>{{COSTCENTER_ID}}</Id>\n"
+" <Code>{{COSTCENTER_CODE}}</Code>\n"
+" <Description>{{COSTCENTER_DESCRIPTION}}</Description>\n"
+"</CostCenter>\n";
+
+const char* taxbracket_save_template =
+"<CountryTaxBracket>\n"
+" <Id>{{TAXBRACKET_ID}}</Id>\n"
+" <CountryCode>{{TAXBRACKET_COUNTRY}}</CountryCode>\n"
+" <Rate>{{TAXBRACKET_RATE}}</Rate>\n"
+" <Description>{{TAXBRACKET_DESCRIPTION}}</Description>\n"
+"</CountryTaxBracket>\n";
+
+const char* contact_save_template =
+"<Contact>\n"
+" <Id>{{CONTACT_ID}}</Id>\n"
+" <Name>{{CONTACT_NAME}}</Name>\n"
+" <Type>{{CONTACT_TYPE}}</Type>\n"
+" <TaxId>{{CONTACT_TAXID}}</TaxId>\n"
+" <BusinessId>{{CONTACT_BUSINESSID}}</BusinessId>\n"
+" <Email>{{CONTACT_EMAIL}}</Email>\n"
+" <PhoneNumber>{{CONTACT_PHONENUMBER}}</PhoneNumber>\n"
+" <BankAccount>{{CONTACT_BANKACCOUNT}}</BankAccount>\n"
+" <Address>\n"
+" <AddressLine1>{{CONTACT_ADDRESS1}}</AddressLine1>\n"
+" <AddressLine2>{{CONTACT_ADDRESS2}}</AddressLine2>\n"
+" <CountryCode>{{CONTACT_COUNTRY}}</CountryCode>\n"
+" <City>{{CONTACT_CITY}}</City>\n"
+" <Postal>{{CONTACT_POSTAL}}</Postal>\n"
+" <Region>{{CONTACT_REGION}}</Region>\n"
+" </Address>\n"
+"</Contact>\n";
+
+const char* administration_save_template =
+"<Administration>\n"
+" <NextId>{{NEXT_ID}}</NextId>\n"
+" <NextSequenceNumber>{{NEXT_SEQUENCE_NUMBER}}</NextSequenceNumber>\n"
+" <ProgramVersion>{{PROGRAM_VERSION}}</ProgramVersion>\n"
+"</Administration>\n";
+
+const char* peppol_invoice_tax_subtotal_template =
+" <cac:TaxSubtotal>\n"
+" <cbc:TaxableAmount currencyID=\"{{CURRENCY}}\">{{TAXABLE_AMOUNT}}</cbc:TaxableAmount>\n"
+" <cbc:TaxAmount currencyID=\"{{CURRENCY}}\">{{TAX_AMOUNT}}</cbc:TaxAmount>\n"
+" <cac:TaxCategory>\n"
+" <cbc:ID>{{TAX_CATEGORY}}</cbc:ID>\n"
+" <cbc:Percent>{{TAX_PERCENT}}</cbc:Percent>\n"
+" <cac:TaxScheme>\n"
+" <cbc:ID>VAT</cbc:ID>\n"
+" </cac:TaxScheme>\n"
+" </cac:TaxCategory>\n"
+" </cac:TaxSubtotal>\n";
+
const char *peppol_invoice_template =
/*"<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"*/
"<Invoice xmlns=\"urn:oasis:names:specification:ubl:schema:xsd:Invoice-2\"\n"
@@ -63,7 +127,8 @@ const char *peppol_invoice_template =
" </cac:AccountingCustomerParty>\n"
"\n"
" <cac:PaymentMeans>\n"
-" <cbc:PaymentMeansCode>31</cbc:PaymentMeansCode>\n"
+" <cbc:PaymentMeansCode>{{PAYMENT_TYPE}}</cbc:PaymentMeansCode>\n"
+" <cbc:PaymentID>{{INVOICE_ID}}</cbc:PaymentID>\n"
" <cac:PayeeFinancialAccount>\n"
" <cbc:ID>{{SUPPLIER_IBAN}}</cbc:ID>\n"
" <cac:FinancialInstitutionBranch>\n"
@@ -76,17 +141,7 @@ const char *peppol_invoice_template =
"\n"
" <cac:TaxTotal>\n"
" <cbc:TaxAmount currencyID=\"{{CURRENCY}}\">{{TOTAL_TAX_AMOUNT}}</cbc:TaxAmount>\n"
-" <cac:TaxSubtotal>\n"
-" <cbc:TaxableAmount currencyID=\"{{CURRENCY}}\">{{TAXABLE_AMOUNT}}</cbc:TaxableAmount>\n"
-" <cbc:TaxAmount currencyID=\"{{CURRENCY}}\">{{TAX_AMOUNT}}</cbc:TaxAmount>\n"
-" <cac:TaxCategory>\n"
-" <cbc:ID>{{TAX_CATEGORY}}</cbc:ID>\n"
-" <cbc:Percent>{{TAX_PERCENT}}</cbc:Percent>\n"
-" <cac:TaxScheme>\n"
-" <cbc:ID>VAT</cbc:ID>\n"
-" </cac:TaxScheme>\n"
-" </cac:TaxCategory>\n"
-" </cac:TaxSubtotal>\n"
+" {{TAX_SUBTOTAL_LIST}}"
" </cac:TaxTotal>\n"
"\n"
" <cac:LegalMonetaryTotal>\n"
diff --git a/include/strops.hpp b/include/strops.hpp
index 4570a15..2874c4d 100644
--- a/include/strops.hpp
+++ b/include/strops.hpp
@@ -1,5 +1,9 @@
#pragma once
+#include <stdint.h>
size_t strops_copy(char *dst, const char *src, size_t size);
char* strops_stristr(char* a, char* b);
-void strops_replace(char *buf, size_t buf_size, const char *search, const char *replace); \ No newline at end of file
+void strops_replace(char *buf, size_t buf_size, const char *search, const char *replace);
+void strops_replace_int32(char *buf, size_t buf_size, const char *search, int32_t number);
+void strops_replace_int64(char *buf, size_t buf_size, const char *search, int64_t number);
+void strops_replace_float(char *buf, size_t buf_size, const char *search, float number, int decimals); \ No newline at end of file