syntax = "proto3"; package rfkpos; service RFKPOS { rpc Create(CreateTransaction) returns (TransactionReturn); rpc Get(GetTransaction) returns (TransactionReturn); } message GetTransaction { string token = 1; optional uint64 tid = 2; optional string signature = 99; } message CreateTransaction { string token = 1; Transaction transaction = 2; optional string signature = 99; } enum Currency { EUR = 0; USD = 1; NOK = 2; BTC = 3; LTN = 4; ETH = 5; DOT = 6; } message Money { int64 value = 1; uint64 dec = 2; Currency cur = 3; } message Timestamp { uint32 year = 1; uint32 month = 2; uint32 day = 3; uint32 hour = 4; uint32 minute = 5; uint32 second = 6; int32 tz = 7; } enum Units { U_D = 0; // discrete U_G = 1; // gram U_M = 2; // metre U_L = 3; // litre } message Usage { double amount = 1; uint64 item = 2; optional string comment = 3; } message Product { string name = 1; Money price = 2; // default price to use Units units = 3; bool to_sell = 10; bool to_buy = 11; bool need_date_from = 12; bool need_date_to = 13; map<string, string> identifiers = 14; // key is system name and value is identifier in that system optional string comment = 40; repeated Usage usage = 50; repeated string tag = 51; // product is shown in different places depending on tag repeated uint64 invalidates = 90; // tid's of products to invalidate } message PurchaseEntry { uint64 product = 1; double amount = 2; Money price = 3; optional Money discount = 4; optional Timestamp valid_from = 5; optional Timestamp valid_to = 6; } enum PurchaseType { P_SELL = 0; P_BUY = 1; P_RENT = 2; P_INVALIDATE = 3; } message Purchase { Timestamp ts = 1; PurchaseType purchase_type = 2; optional Timestamp valid_until = 3; optional uint64 customer = 4; // customer tid optional Money discount = 5; repeated PurchaseEntry entry = 6; repeated uint64 invalidate = 7; // tid of transaction to invalidate optional string comment = 8; } enum PaymentType { PAY_CASH = 0; PAY_CARD = 1; PAY_CRYPTO = 3; PAY_PAYPAL = 4; PAY_VIPS = 5; } message Payment { PaymentType type = 1; Money amount = 2; Timestamp ts = 3; optional uint64 customer = 4; // tid of the customer payed } message Customer { string name = 1; string address = 2; map<string, string> identifiers = 3; // identifers of that customer in different systems optional string comment = 4; repeated string tags = 5; } message User { string name = 1; string public_key = 2; } message Transaction { uint64 tid = 1; uint64 parent = 2; // tid of the parent transaction uint64 uid = 3; // tid of the user transaction uint64 ts = 4; // unix time in seconds oneof transaction_type { Purchase purchase = 10; Customer customer = 20; Product product = 21; Payment payment = 30; User user = 90; } optional string signature = 99; } message TransactionReturn { string token = 1; uint64 tid = 2; } message Database { uint64 next_tid = 1; map<uint64, Transaction> transactions = 2; }