Order::close()   A
last analyzed

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 3
c 1
b 0
f 0
nc 1
nop 0
dl 0
loc 5
rs 10
1
<?php
2
3
namespace Helix\Shopify;
4
5
use Helix\Shopify\Base\AbstractEntity\CrudTrait;
6
use Helix\Shopify\Order\AbstractOrder;
7
use Helix\Shopify\Order\AppliedDiscount;
8
use Helix\Shopify\Order\Discount;
9
use Helix\Shopify\Order\Fulfillment;
10
use Helix\Shopify\Order\Refund;
11
use Helix\Shopify\Order\Shipping;
12
use Helix\Shopify\Order\Tax;
13
14
/**
15
 * An order.
16
 *
17
 * Orders cannot be placed through the REST API.
18
 *
19
 * Shopify allows order creation on the condition that it's for archival purposes,
20
 * like if you're migrating from somewhere. Only finalized orders can be created,
21
 * whether that finalization happened through fulfillment or cancellation.
22
 *
23
 * Open orders cannot be created through the API. Consider using a {@link DraftOrder} instead.
24
 *
25
 * Orders are mostly immutable except for a few things, which are documented here.
26
 *
27
 * - billing_address
28
 * - buyer_accepts_marketing
29
 * - email
30
 * - metafields
31
 * - note
32
 * - note_attributes
33
 * - phone
34
 * - shipping_address
35
 * - tags
36
 *
37
 * @see https://shopify.dev/docs/admin-api/rest/reference/orders/order
38
 *
39
 * @method $this setInventoryBehavior       (string $behavior) @depends create-only
40
 * @method $this setSendFulfillmentReceipt  (bool $receipt) @depends create-only
41
 * @method $this setTest                    (bool $test) @depends create-only
42
 * @method $this setSendReceipt             (bool $receipt) @depends create-only
43
 * @method $this setSourceName              (string $name) @depends create-only
44
 * @method $this setPresentmentCurrency     (string $currency) @depends create-only
45
 * @method $this setFinancialStatus         (string $status) @depends create-only
46
 * @method $this setCancelReason            (string $reason) @depends create-only
47
 * @method $this setLocationId              (string $id) @depends create-only
48
 * @method $this setDiscountCodes           (Discount[] $codes) @depends create-only
49
 * @method $this setFulfillmentStatus       (string $status) @depends create-only
50
 * @method $this setFulfillments            (string[] $fulfillments) @depends create-only
51
 * @method $this setProcessedAt             (string $iso8601) @depends create-only, historical creation date
52
 * @method $this setShippingLines           (Shipping[] $lines) @depends create-only
53
 * @method $this setSubtotalPriceSet        (string $set) @depends create-only
54
 * @method $this setTaxLines                (Tax[] $taxes) @depends create-only
55
 * @method $this setTotalDiscounts          (string $discounts) @depends create-only
56
 * @method $this setTotalDiscountsSet       (string $set) @depends create-only
57
 * @method $this setTotalLineItemsPrice     (number $price) @depends create-only
58
 * @method $this setTotalLineItemsPriceSet  (string $set) @depends create-only
59
 * @method $this setTotalPriceSet           (string $set) @depends create-only
60
 * @method $this setTotalTaxSet             (string $set) @depends create-only
61
 * @method $this setTotalTipReceived        (string $received) @depends create-only
62
 * @method $this setTotalWeight             (string $weight) @depends create-only
63
 *
64
 * @method string               getAppId                    ()
65
 * @method string               getBrowserIp                ()
66
 * @method bool                 getBuyerAcceptsMarketing    ()
67
 * @method string               getCancelReason             ()
68
 * @method string               getCancelledAt              ()
69
 * @method string               getCartToken                ()
70
 * @method string               getClientDetails            ()
71
 * @method string               getClosedAt                 ()
72
 * @method string               getCurrentTotalDutiesSet    ()
73
 * @method string               getCustomerLocale           ()
74
 * @method AppliedDiscount[]    getDiscountApplications     ()
75
 * @method Discount[]           getDiscountCodes            ()
76
 * @method string               getFinancialStatus          ()
77
 * @method string               getFulfillmentStatus        ()
78
 * @method Fulfillment[]        getFulfillments             ()
79
 * @method string               getLandingSite              ()
80
 * @method string               getLocationId               ()
81
 * @method string               getNumber                   ()
82
 * @method string               getOrderNumber              ()
83
 * @method string               getOrderStatusUrl           ()
84
 * @method string               getOriginalTotalDutiesSet   ()
85
 * @method string[]             getPaymentGatewayNames      ()
86
 * @method string               getPhone                    ()
87
 * @method string               getPresentmentCurrency      ()
88
 * @method string               getProcessedAt              ()
89
 * @method string               getProcessingMethod         ()
90
 * @method string               getReferringSite            ()
91
 * @method Refund[]             getRefunds                  ()
92
 * @method Shipping[]           getShippingLines            ()
93
 * @method string               getSourceName               ()
94
 * @method string               getSubtotalPriceSet         ()
95
 * @method string               getTaxesIncluded            ()
96
 * @method bool                 isTest                      ()
97
 * @method string               getToken                    ()
98
 * @method string               getTotalDiscounts           ()
99
 * @method string               getTotalDiscountsSet        ()
100
 * @method number               getTotalLineItemsPrice      ()
101
 * @method string               getTotalLineItemsPriceSet   ()
102
 * @method string               getTotalPriceSet            ()
103
 * @method string               getTotalTaxSet              ()
104
 * @method string               getTotalTipReceived         ()
105
 * @method string               getTotalWeight              ()
106
 * @method string               getUserId                   () staff account id
107
 *
108
 * @method bool hasDiscountApplications ()
109
 * @method bool hasDiscountCodes        ()
110
 * @method bool hasFulfillments         ()
111
 * @method bool hasNoteAttributes       ()
112
 * @method bool hasPaymentGatewayNames  ()
113
 * @method bool hasRefunds              ()
114
 * @method bool hasShippingLines        ()
115
 * @method bool hasTaxLines             ()
116
 *
117
 * @method $this setBuyerAcceptsMarketing   (bool $marketing)
118
 * @method $this setPhone                   (string $phone)
119
 * @method $this setReferringSite           (string $site)
120
 */
121
class Order extends AbstractOrder
122
{
123
124
    use CrudTrait;
125
126
    const TYPE = 'order';
127
    const DIR = 'orders';
128
129
    const MAP = parent::MAP + [
130
        'discount_applications' => [AppliedDiscount::class],
131
        'discount_codes' => [Discount::class],
132
        'fulfillments' => [Fulfillment::class],
133
        'refunds' => [Refund::class],
134
        'shipping_lines' => [Shipping::class],
135
    ];
136
137
    const INVENTORY_BYPASS = 'bypass';
138
    const INVENTORY_DECREMENT_IGNORE = 'decrement_ignoring_policy';
139
    const INVENTORY_DECREMENT_OBEY = 'decrement_obeying_policy';
140
141
    const PAYMENT_AUTHORIZED = 'authorized';
142
    const PAYMENT_COMPLETE = 'paid';
143
    const PAYMENT_PARTIAL = 'partially_paid';
144
    const PAYMENT_PARTIAL_REFUND = 'partially_refunded';
145
    const PAYMENT_PENDING = 'pending';
146
    const PAYMENT_REFUNDED = 'refunded';
147
    const PAYMENT_VOIDED = 'voided';
148
149
    const FULFILLMENT_COMPLETE = 'fulfilled';
150
    const FULFILLMENT_NONE = null;
151
    const FULFILLMENT_PARTIAL = 'partial';
152
    const FULFILLMENT_RESTOCKED = 'restocked';
153
154
    const SEARCH_STATUS_ANY = 'any';
155
    const SEARCH_STATUS_CANCELLED = 'cancelled';
156
    const SEARCH_STATUS_CLOSED = 'closed';
157
    const SEARCH_STATUS_OPEN = 'open';
158
    const SEARCH_PAYMENT_ANY = 'any';
159
    const SEARCH_PAYMENT_AUTHORIZED = 'authorized';
160
    const SEARCH_PAYMENT_COMPLETE = 'paid';
161
    const SEARCH_PAYMENT_INCOMPLETE = 'unpaid';
162
    const SEARCH_PAYMENT_PARTIAL = 'partially_paid';
163
    const SEARCH_PAYMENT_PARTIAL_REFUND = 'partially_refunded';
164
    const SEARCH_PAYMENT_PENDING = 'pending';
165
    const SEARCH_PAYMENT_REFUNDED = 'refunded';
166
    const SEARCH_PAYMENT_VOIDED = 'voided';
167
    const SEARCH_FULFILLMENT_ANY = 'any';
168
    const SEARCH_FULFILLMENT_PARTIAL = 'partial';
169
    const SEARCH_FULFILLMENT_SHIPPED = 'shipped';
170
    const SEARCH_FULFILLMENT_UNSHIPPED = 'unshipped';
171
172
    /**
173
     * Cancels the order.
174
     *
175
     * Applicable refunds must be issued before cancellation.
176
     *
177
     * @return $this
178
     */
179
    public function cancel()
180
    {
181
        assert($this->hasId());
182
        $this->api->post("{$this}/cancel");
183
        return $this->reload();
184
    }
185
186
    /**
187
     * Closes the order.
188
     *
189
     * @return $this
190
     */
191
    public function close()
192
    {
193
        assert($this->hasId());
194
        $this->api->post("{$this}/close");
195
        return $this->reload();
196
    }
197
198
    /**
199
     * @return Discount
200
     */
201
    public function newDiscount()
202
    {
203
        return $this->api->factory($this, Discount::class);
204
    }
205
206
    /**
207
     * @return Fulfillment
208
     */
209
    public function newFulfillment()
210
    {
211
        assert($this->hasId());
212
        return $this->api->factory($this, Fulfillment::class, [
213
            'order_id' => $this->getId()
214
        ]);
215
    }
216
217
    /**
218
     * @return Refund
219
     */
220
    public function newRefund()
221
    {
222
        assert($this->hasId());
223
        return $this->api->factory($this, Refund::class);
224
    }
225
226
    /**
227
     * @return Shipping
228
     */
229
    public function newShipping()
230
    {
231
        return $this->api->factory($this, Shipping::class);
232
    }
233
234
    /**
235
     * Reopens a closed order.
236
     *
237
     * @return $this
238
     */
239
    public function reopen()
240
    {
241
        assert($this->hasId());
242
        $this->api->post("{$this}/open");
243
        return $this->reload();
244
    }
245
}