예제 #1
0
        public static async Task <Guid> EnsureSubscriptionData(Guid subscriptionGuid, IncontrlApi api)
        {
            // i. create subscription, deserialize subscription from disk
            Subscription subscription = null;

            if (Guid.Empty.Equals(subscriptionGuid))
            {
                var subscriptionJson    = File.ReadAllText(@"Resources\create_subscription.json");
                var subscriptionRequest = Newtonsoft.Json.JsonConvert.DeserializeObject <CreateSubscriptionRequest>(subscriptionJson);
                subscriptionRequest.Company.LegalName += DateTime.Now.Second;
                subscriptionRequest.Company.Name      += DateTime.Now.Second;
                subscription = await api.Subscriptions().CreateAsync(subscriptionRequest);
            }
            else
            {
                subscription = await api.Subscription(subscriptionGuid).GetAsync();
            }
            var subscriptionApi = api.Subscription(subscription.Id.Value);

            // ii. ensure bank account for the subscription
            var bankAccounts = await subscriptionApi.BankAccounts().ListAsync();

            if (null == bankAccounts || 0 == bankAccounts.Count)
            {
                var bankAccount = await subscriptionApi.BankAccounts().CreateAsync(new BankAccount {
                    Bank = "NBG", Baseline = new Balance {
                        Amount = 1000, Date = DateTime.Now
                    }, Code = "1234", Name = "Main Bank Account", Number = "edw tha paei to iban",
                    Provider = new TransactionProviderConfig {
                        Name     = "nbg",
                        Settings = new {
                            provider       = "NBG", provider_id = "NBG.gr",
                            user_id        = "9d7f2ef4-7262-4429-a487-7979e4a76447",
                            username       = "******", sandbox_id = "inContrl",
                            application_id = "inContrl", account_id = "2cebef85-bf5b-4d1d-8727-d4441750d21d",
                            bank_id        = "DB173089-A8FE-43F1-8947-F1B2A8699829",
                            nbgApiUrl      = "https://apis.nbg.gr/public/nbgapis/obp/v3.0.1"
                        }
                    }
                });
            }
            // iii. ensure invoices in subscription

            var existingInvoices = await subscriptionApi.Invoices().ListAsync(new ListOptions <InvoiceListFilter> {
                Size = 3, Sort = "Date-"
            });

            if (existingInvoices.Count == 0)
            {
                var product = await subscriptionApi.Products().CreateAsync(new CreateProductRequest {
                    Amount = 450,
                    Name   = "My Precious",
                    Taxes  = new List <Tax> {
                        new Tax {
                            Name = "VAT", Rate = 0.24M, IsSalesTax = true
                        }
                    }
                });

                var company = await subscriptionApi.Organisations().CreateAsync(new CreateOrganisationRequest {
                    Email          = "*****@*****.**",
                    LegalName      = "INDICE OE",
                    Name           = "Indice",
                    LineOfBusiness = "Independent Software Vendor",
                    TaxCode        = "GR99",
                    TaxOffice      = "ΣΤ' ΑΘΗΝΩΝ",
                    Website        = "http://www.indice.gr",
                    Address        = new Address {
                        CountryCode = "GR",
                        Line1       = "22 Iakchou str.",
                        City        = "Athens",
                        ZipCode     = "11854"
                    }
                });

                await subscriptionApi.Invoices().CreateAsync(new CreateInvoiceRequest {
                    PaymentCode  = "171021000001",
                    CurrencyCode = "EUR",
                    Date         = DateTime.Now.AddSeconds(-4),
                    Status       = InvoiceStatus.Issued,
                    Recipient    = new Recipient {
                        Organisation = company
                    },
                    Lines = new List <InvoiceLine> {
                        new InvoiceLine {
                            Description = "This is a Nice expensive item", DiscountRate = 0.05, UnitAmount = 450, Product = product, Taxes = product.Taxes
                        }
                    }
                });

                await subscriptionApi.Invoices().CreateAsync(new CreateInvoiceRequest {
                    PaymentCode  = "171021000001",
                    CurrencyCode = "EUR",
                    Date         = DateTime.Now.AddSeconds(-2),
                    Status       = InvoiceStatus.Issued,
                    Recipient    = new Recipient {
                        Organisation = company
                    },
                    Lines = new List <InvoiceLine> {
                        new InvoiceLine {
                            Description = "This is a Nice expensive item 2", DiscountRate = 0.05, UnitAmount = 450, Product = product, Taxes = product.Taxes, Quantity = 2
                        }
                    }
                });

                var incoive = await subscriptionApi.Invoices().CreateAsync(new CreateInvoiceRequest {
                    PaymentCode  = "171021000001",
                    CurrencyCode = "EUR",
                    Date         = DateTime.Now,
                    Status       = InvoiceStatus.Issued,
                    Recipient    = new Recipient {
                        Organisation = company
                    },
                    Lines = new List <InvoiceLine> {
                        new InvoiceLine {
                            Description = "This is a Nice expensive item 3", DiscountRate = 0.05, UnitAmount = 450, Product = product, Taxes = product.Taxes, Quantity = 0.5
                        }
                    }
                });

                var invoices = await subscriptionApi.Invoices().ListAsync(new ListOptions <InvoiceListFilter> {
                    Size = 3, Sort = "Date-"
                });

                foreach (var invoice in invoices.Items)
                {
                    var url = $"{api.ApiAddress}/{invoice.PermaLink}";
                    OpenBrowser(url);
                }
            }

            return(subscription.Id.Value);
        }
예제 #2
0
        public static async Task Main(string[] args)
        {
            var builder = new ConfigurationBuilder()
                          .SetBasePath(Directory.GetCurrentDirectory())
                          .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                          .AddEnvironmentVariables();

            var configuration    = builder.Build();
            var clientId         = configuration["Client:ClientId"];
            var clientSecret     = configuration["Client:ClientSecret"];
            var baseApiAddress   = configuration["BaseApiAddress"]; //http://api-vnext.incontrl.io
            var subscriptionId   = configuration["SubscriptionId"];
            var subscriptionGuid = string.IsNullOrWhiteSpace(subscriptionId) ? Guid.Empty : new Guid(subscriptionId);
            var api = new IncontrlApi(clientId, clientSecret);

            api.Configure(baseApiAddress);
            api.LoginAsync(true).Wait();

            //cool ... ensure subscription here ...
            subscriptionGuid = await EnsureSubscriptionData(subscriptionGuid, api);

            //var subscriptionApi = api.Subscription(subscriptionGuid);

            var bankAccounts = api.Subscription(subscriptionGuid).BankAccounts().ListAsync().Result;
            var factory      = new BankProviderFactory();

            foreach (var bankAccount in bankAccounts.Items)
            {
                IBankProvider provider     = factory.Get(bankAccount.Provider.Name, bankAccount.Provider.Settings);
                var           transactions = await provider.GetTransactionsAsync(new BankTransactionSearchDocument());

                // i. save transactions to storage
                var savedTransactions = new List <BankTransaction>();
                foreach (var transaction in transactions)
                {
                    var savedTrans = await api.Subscription(subscriptionGuid).BankAccount(bankAccount.Id.Value).Transactions().CreateAsync(transaction);

                    // ii. get active invoices
                    var pendingInvoices = await api.Subscription(subscriptionGuid).Invoices().ListAsync(new ListOptions <InvoiceListFilter> {
                        Filter = new InvoiceListFilter {
                            Status = InvoiceStatus.Issued
                        }
                    });

                    foreach (var invoice in pendingInvoices.Items.ToList())
                    {
                        // iii. try to match (exact match please ...) invoices & transactions -> invoice.PaymentCode = transaction.Description

                        if (invoice.PaymentCode.Trim().Equals(savedTrans.Text.Trim()))
                        {
                            // a. add payments here ..
                            var payment = await api.Subscription(subscriptionGuid).BankAccount(bankAccount.Id.Value).Transaction(savedTrans.Id.Value).Payments().CreateAsync(new Payment {
                                InvoiceId = invoice.Id.Value, Amount = savedTrans.Amount
                            });

                            if (invoice.TotalPayable.Value == savedTrans.Amount)
                            {
                                // b. update the status now
                                InvoiceStatus invoiceStatus = await api.Subscription(subscriptionGuid).Invoice(invoice.Id.Value).Status().UpdateAsync(InvoiceStatus.Paid);

                                var url = $"http://api-vnext.incontrl.io/{invoice.PermaLink}";
                                OpenBrowser(url);
                                Console.ForegroundColor = ConsoleColor.Green;
                                Console.WriteLine($"We found a match !!! {payment.Amount:N2}");
                            }
                        }
                    }
                }

                //i. get bank accounts by subscriptionId
                //ii. create provider concrete class through BankProviderFactory
                //iii. get bank transactions by bank account
                //iv. store bank transactions to our storage
                //v. get invoices by subscriptionId
                //vi. matching .....

                Console.ReadKey();
            }
        }