1from __future__ import absolute_import, division, print_function
2
3from stripe import api_requestor
4from stripe import util
5from stripe.api_resources.abstract import CreateableAPIResource
6from stripe.api_resources.abstract import DeletableAPIResource
7from stripe.api_resources.abstract import ListableAPIResource
8from stripe.api_resources.abstract import UpdateableAPIResource
9from stripe.api_resources.abstract import custom_method
10
11
12@custom_method("finalize_invoice", http_verb="post", http_path="finalize")
13@custom_method("mark_uncollectible", http_verb="post")
14@custom_method("pay", http_verb="post")
15@custom_method("send_invoice", http_verb="post", http_path="send")
16@custom_method("void_invoice", http_verb="post", http_path="void")
17class Invoice(
18    CreateableAPIResource,
19    DeletableAPIResource,
20    ListableAPIResource,
21    UpdateableAPIResource,
22):
23    OBJECT_NAME = "invoice"
24
25    def finalize_invoice(self, idempotency_key=None, **params):
26        url = self.instance_url() + "/finalize"
27        headers = util.populate_headers(idempotency_key)
28        self.refresh_from(self.request("post", url, params, headers))
29        return self
30
31    def mark_uncollectible(self, idempotency_key=None, **params):
32        url = self.instance_url() + "/mark_uncollectible"
33        headers = util.populate_headers(idempotency_key)
34        self.refresh_from(self.request("post", url, params, headers))
35        return self
36
37    def pay(self, idempotency_key=None, **params):
38        url = self.instance_url() + "/pay"
39        headers = util.populate_headers(idempotency_key)
40        self.refresh_from(self.request("post", url, params, headers))
41        return self
42
43    def send_invoice(self, idempotency_key=None, **params):
44        url = self.instance_url() + "/send"
45        headers = util.populate_headers(idempotency_key)
46        self.refresh_from(self.request("post", url, params, headers))
47        return self
48
49    def void_invoice(self, idempotency_key=None, **params):
50        url = self.instance_url() + "/void"
51        headers = util.populate_headers(idempotency_key)
52        self.refresh_from(self.request("post", url, params, headers))
53        return self
54
55    @classmethod
56    def upcoming(
57        cls, api_key=None, stripe_version=None, stripe_account=None, **params
58    ):
59        requestor = api_requestor.APIRequestor(
60            api_key, api_version=stripe_version, account=stripe_account
61        )
62        url = cls.class_url() + "/upcoming"
63        response, api_key = requestor.request("get", url, params)
64        return util.convert_to_stripe_object(
65            response, api_key, stripe_version, stripe_account
66        )
67