Completed
Push — master ( cac1c4...8ee032 )
by Jean C.
02:36
created

Payment::getFundingInstrument()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 5
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 5
rs 9.4285
c 0
b 0
f 0
cc 1
eloc 2
nc 1
nop 0
1
<?php
2
3
namespace Moip\Resource;
4
5
use Requests;
6
use stdClass;
7
8
class Payment extends MoipResource
9
{
10
    /**
11
     * @const string
12
     */
13
    const PATH = 'payments';
14
15
    /**
16
     * @const string
17
     */
18
    const MULTI_PAYMENTS_PATH = 'multipayments';
19
20
    /**
21
     * Payment means.
22
     *
23
     * @const string
24
     */
25
    const METHOD_CREDIT_CARD = 'CREDIT_CARD';
26
27
    /**
28
     * Payment means.
29
     *
30
     * @const string
31
     */
32
    const METHOD_BOLETO = 'BOLETO';
33
34
    /**
35
     * Payment means.
36
     *
37
     * @const string
38
     */
39
    const METHOD_ONLINE_DEBIT = 'ONLINE_DEBIT';
40
41
    /**
42
     * Payment means.
43
     *
44
     * @const string
45
     */
46
    const METHOD_WALLET = 'WALLET';
47
48
    /**
49
     * Payment means.
50
     *
51
     * @const string
52
     */
53
    const METHOD_ONLINE_BANK_DEBIT = 'ONLINE_BANK_DEBIT';
54
55
    /**
56
     * @var \Moip\Resource\Orders
57
     */
58
    private $order;
59
60
    /**
61
     * @var \Moip\Resource\Multiorders
62
     */
63
    private $multiorder;
64
65
    /**
66
     * Initializes new instances.
67
     */
68
    protected function initialize()
69
    {
70
        $this->data = new stdClass();
71
        $this->data->installmentCount = 1;
72
        $this->data->fundingInstrument = new stdClass();
73
    }
74
75
    /**
76
     * Create a new payment in api MoIP.
77
     *
78
     * @return $this
79
     */
80
    public function execute()
81
    {
82
        if ($this->order !== null) {
83
            $path = sprintf('/%s/%s/%s/%s', MoipResource::VERSION, Orders::PATH, $this->order->getId(), self::PATH);
84
        } else {
85
            $path = sprintf('/%s/%s/%s/%s', MoipResource::VERSION, Multiorders::PATH, $this->multiorder->getId(),
86
                self::MULTI_PAYMENTS_PATH);
87
        }
88
        $response = $this->httpRequest($path, Requests::POST, $this);
89
90
        return $this->populate($response);
91
    }
92
93
    /**
94
     * Get an payment in MoIP.
95
     *
96
     * @param string $id_moip Id MoIP payment
97
     *
98
     * @return stdClass
99
     */
100
    public function get($id_moip)
101
    {
102
        return $this->getByPath(sprintf('/%s/%s/%s', MoipResource::VERSION, self::PATH, $id_moip));
103
    }
104
105
    /**
106
     * Get id MoIP payment.
107
     *
108
     *
109
     * @return \Moip\Resource\Payment
110
     */
111
    public function getId()
112
    {
113
        return $this->getIfSet('id');
114
    }
115
116
    /**
117
     * Mount payment structure.
118
     *
119
     * @param \stdClass $response
120
     *
121
     * @return Payment
122
     */
123
    protected function populate(stdClass $response)
124
    {
125
        $payment = clone $this;
126
127
        $payment->data->id = $this->getIfSet('id', $response);
128
        $payment->data->status = $this->getIfSet('status', $response);
129
        $payment->data->delayCapture = $this->getIfSet('delayCapture', $response);
130
        $payment->data->amount = new stdClass();
131
        $payment->data->amount->total = $this->getIfSet('total', $response->amount);
132
        $payment->data->amount->currency = $this->getIfSet('currency', $response->amount);
133
        $payment->data->installmentCount = $this->getIfSet('installmentCount', $response);
134
        $payment->data->fundingInstrument = $this->getIfSet('fundingInstrument', $response);
135
        $payment->data->fees = $this->getIfSet('fees', $response);
136
        $payment->data->refunds = $this->getIfSet('refunds', $response);
137
        $payment->data->_links = $this->getIfSet('_links', $response);
138
        $payment->data->createdAt = $this->getIfSetDateTime('createdAt', $response);
139
        $payment->data->updatedAt = $this->getIfSetDateTime('updatedAt', $response);
140
141
        return $payment;
142
    }
143
144
    /**
145
     * Refunds.
146
     *
147
     * @return Refund
148
     */
149
    public function refunds()
150
    {
151
        $refund = new Refund($this->moip);
152
        $refund->setPayment($this);
153
154
        return $refund;
155
    }
156
	
157
	/**
158
	 * Get payment status.
159
	 *
160
	 * @return string Payment status. Possible values CREATED, WAITING, IN_ANALYSIS, PRE_AUTHORIZED, AUTHORIZED, CANCELLED, REFUNDED, REVERSED, SETTLED
161
	 */
162
	public function getStatus()
163
	{
164
		return $this->getIfSet('status');
165
	}
166
167
    /**
168
     * get creation time.
169
     *
170
     * @return \DateTime
171
     */
172
    public function getCreatedAt()
173
    {
174
        return $this->data->createdAt;
175
    }
176
177
    /**
178
     * Returns when the last update occurred.
179
     *
180
     * @return \DateTime
181
     */
182
    public function getUpdatedAt()
183
    {
184
        return $this->data->updatedAt;
185
    }
186
187
    /**
188
     * Returns the funding instrument.
189
     *
190
     * @return stdClass
191
     */
192
    public function getFundingInstrument()
193
    {
194
        //todo: return a funding instrument object
195
        return $this->data->fundingInstrument;
196
    }
197
198
    /**
199
     * Set means of payment.
200
     *
201
     * @param \stdClass $fundingInstrument
202
     *
203
     * @return $this
204
     */
205
    public function setFundingInstrument(stdClass $fundingInstrument)
206
    {
207
        $this->data->fundingInstrument = $fundingInstrument;
208
209
        return $this;
210
    }
211
212
    /**
213
     * Set billet.
214
     *
215
     * @param \DateTime|string $expirationDate   Expiration date of a billet.
216
     * @param string           $logoUri          Logo of billet.
217
     * @param array            $instructionLines Instructions billet.
218
     *
219
     * @return $this
220
     */
221
    public function setBoleto($expirationDate, $logoUri, array $instructionLines = [])
222
    {
223
        $keys = ['first', 'second', 'third'];
224
225
        if (empty($instructionLines)) {
226
            //Avoid warning in array_combine
227
            $instructionLines = ['', '', ''];
228
        }
229
230
        if ($expirationDate instanceof \DateTime) {
231
            $expirationDate = $expirationDate->format('Y-m-d');
232
        }
233
234
        $this->data->fundingInstrument->method = self::METHOD_BOLETO;
235
        $this->data->fundingInstrument->boleto = new stdClass();
236
        $this->data->fundingInstrument->boleto->expirationDate = $expirationDate;
237
        $this->data->fundingInstrument->boleto->instructionLines = array_combine($keys, $instructionLines);
238
        $this->data->fundingInstrument->boleto->logoUri = $logoUri;
239
240
        return $this;
241
    }
242
243
    /**
244
     * Set credit card holder.
245
     *
246
     * @param \Moip\Resource\Customer $holder
247
     */
248
    private function setCreditCardHolder(Customer $holder)
249
    {
250
        $birthdate = $holder->getBirthDate();
251
        if ($birthdate instanceof \DateTime) {
252
            $birthdate = $birthdate->format('Y-m-d');
253
        }
254
        $this->data->fundingInstrument->creditCard->holder = new stdClass();
255
        $this->data->fundingInstrument->creditCard->holder->fullname = $holder->getFullname();
256
        $this->data->fundingInstrument->creditCard->holder->birthdate = $birthdate;
257
        $this->data->fundingInstrument->creditCard->holder->taxDocument = new stdClass();
258
        $this->data->fundingInstrument->creditCard->holder->taxDocument->type = $holder->getTaxDocumentType();
259
        $this->data->fundingInstrument->creditCard->holder->taxDocument->number = $holder->getTaxDocumentNumber();
260
        $this->data->fundingInstrument->creditCard->holder->phone = new stdClass();
261
        $this->data->fundingInstrument->creditCard->holder->phone->countryCode = $holder->getPhoneCountryCode();
262
        $this->data->fundingInstrument->creditCard->holder->phone->areaCode = $holder->getPhoneAreaCode();
263
        $this->data->fundingInstrument->creditCard->holder->phone->number = $holder->getPhoneNumber();
264
    }
265
266
    /**
267
     * Set credit cardHash.
268
     *
269
     * @param string                  $hash   Credit card hash encripted using Moip.js
270
     * @param \Moip\Resource\Customer $holder
271
     *
272
     * @return $this
273
     */
274
    public function setCreditCardHash($hash, Customer $holder)
275
    {
276
        $this->data->fundingInstrument->method = self::METHOD_CREDIT_CARD;
277
        $this->data->fundingInstrument->creditCard = new stdClass();
278
        $this->data->fundingInstrument->creditCard->hash = $hash;
279
        $this->setCreditCardHolder($holder);
280
281
        return $this;
282
    }
283
284
    /**
285
     * Set credit card
286
     * Credit card used in a payment.
287
     * The card when returned within a parent resource is presented in its minimum representation.
288
     *
289
     * @param int                     $expirationMonth Card expiration month
290
     * @param int                     $expirationYear  Year of card expiration.
291
     * @param string                  $number          Card number.
292
     * @param int                     $cvc             Card Security Code.
293
     * @param \Moip\Resource\Customer $holder
294
     *
295
     * @return $this
296
     */
297
    public function setCreditCard($expirationMonth, $expirationYear, $number, $cvc, Customer $holder)
298
    {
299
        $this->data->fundingInstrument->method = self::METHOD_CREDIT_CARD;
300
        $this->data->fundingInstrument->creditCard = new stdClass();
301
        $this->data->fundingInstrument->creditCard->expirationMonth = $expirationMonth;
302
        $this->data->fundingInstrument->creditCard->expirationYear = $expirationYear;
303
        $this->data->fundingInstrument->creditCard->number = $number;
304
        $this->data->fundingInstrument->creditCard->cvc = $cvc;
305
        $this->setCreditCardHolder($holder);
306
307
        return $this;
308
    }
309
310
    /**
311
     * Set installment count.
312
     *
313
     * @param int $installmentCount
314
     *
315
     * @return $this
316
     */
317
    public function setInstallmentCount($installmentCount)
318
    {
319
        $this->data->installmentCount = $installmentCount;
320
321
        return $this;
322
    }
323
324
    /**
325
     * Set payment means made available by banks.
326
     *
327
     * @param string           $bankNumber     Bank number. Possible values: 001, 237, 341, 041.
328
     * @param \DateTime|string $expirationDate Date of expiration debit.
329
     * @param string           $returnUri      Return Uri.
330
     *
331
     * @return $this
332
     */
333
    public function setOnlineBankDebit($bankNumber, $expirationDate, $returnUri)
334
    {
335
        if ($expirationDate instanceof \DateTime) {
336
            $expirationDate = $expirationDate->format('Y-m-d');
337
        }
338
        $this->data->fundingInstrument->method = self::METHOD_ONLINE_BANK_DEBIT;
339
        $this->data->fundingInstrument->onlineBankDebit = new stdClass();
340
        $this->data->fundingInstrument->onlineBankDebit->bankNumber = $bankNumber;
341
        $this->data->fundingInstrument->onlineBankDebit->expirationDate = $expirationDate;
342
        $this->data->fundingInstrument->onlineBankDebit->returnUri = $returnUri;
343
344
        return $this;
345
    }
346
347
    /**
348
     * Set delay capture.
349
     *
350
     * @return $this
351
     */
352
    public function setDelayCapture()
353
    {
354
        $this->data->delayCapture = true;
355
356
        return $this;
357
    }
358
359
    /**
360
     * Set Multiorders.
361
     *
362
     * @param \Moip\Resource\Multiorders $multiorder
363
     *
364
     * @return $this
365
     */
366
    public function setMultiorder(Multiorders $multiorder)
367
    {
368
        $this->multiorder = $multiorder;
369
370
        return $this;
371
    }
372
373
    /**
374
     * Set order.
375
     *
376
     * @param \Moip\Resource\Orders $order
377
     *
378
     * @return $this
379
     */
380
    public function setOrder(Orders $order)
381
    {
382
        $this->order = $order;
383
384
        return $this;
385
    }
386
}
387