Completed
Push — master ( df95c6...f74e51 )
by
unknown
13s
created

Payment::getInstallmentCount()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 2
nc 1
nop 0
dl 0
loc 4
rs 10
c 0
b 0
f 0
1
<?php
2
3
namespace Moip\Resource;
4
5
use Requests;
6
use stdClass;
7
8
/**
9
 * Class Payment.
10
 */
11
class Payment extends MoipResource
12
{
13
    /**
14
     * @const string
15
     */
16
    const PATH = 'payments';
17
18
    /**
19
     * @const string
20
     */
21
    const MULTI_PAYMENTS_PATH = 'multipayments';
22
23
    /**
24
     * @const string
25
     */
26
    const SIMULATOR_PATH = 'simulador';
27
28
    /**
29
     * Payment means.
30
     *
31
     * @const string
32
     */
33
    const METHOD_CREDIT_CARD = 'CREDIT_CARD';
34
35
    /**
36
     * Payment means.
37
     *
38
     * @const string
39
     */
40
    const METHOD_BOLETO = 'BOLETO';
41
42
    /**
43
     * Payment means.
44
     *
45
     * @const string
46
     */
47
    const METHOD_ONLINE_DEBIT = 'ONLINE_DEBIT';
48
49
    /**
50
     * Payment means.
51
     *
52
     * @const string
53
     */
54
    const METHOD_WALLET = 'WALLET';
55
56
    /**
57
     * Payment means.
58
     *
59
     * @const string
60
     */
61
    const METHOD_ONLINE_BANK_DEBIT = 'ONLINE_BANK_DEBIT';
62
63
    /**
64
     * @var \Moip\Resource\Orders
65
     */
66
    private $order;
67
68
    /**
69
     * Just created, but not initialized yet.
70
     */
71
    const STATUS_CREATED = 'CREATED';
72
73
    /**
74
     * Waiting for the payment.
75
     */
76
    const STATUS_WAITING = 'WAITING';
77
78
    /**
79
     * On risk analysis, it may be automatic or manual.
80
     */
81
    const STATUS_IN_ANALYSIS = 'IN_ANALYSIS';
82
83
    /**
84
     * The amount was reserved on client credit card, it may be caught or discarded until 5 days.
85
     */
86
    const STATUS_PRE_AUTHORIZED = 'PRE_AUTHORIZED';
87
88
    /**
89
     * Payment confirmed by the bank institution.
90
     */
91
    const STATUS_AUTHORIZED = 'AUTHORIZED';
92
93
    /**
94
     * Payment cancelled.
95
     */
96
    const STATUS_CANCELLED = 'CANCELLED';
97
98
    /**
99
     * Payment refunded.
100
     */
101
    const STATUS_REFUNDED = 'REFUNDED';
102
103
    /**
104
     * Paymend reversed (it means that the payment may was not recognized by the client).
105
     */
106
    const STATUS_REVERSED = 'REVERSED';
107
108
    /**
109
     * Payment finalized, the amout is on your account.
110
     */
111
    const STATUS_SETTLED = 'SETTLED';
112
113
    /**
114
     * @var \Moip\Resource\Multiorders
115
     */
116
    private $multiorder;
117
118
    /**
119
     * Initializes new instances.
120
     */
121
    protected function initialize()
122
    {
123
        $this->data = new stdClass();
124
        $this->data->installmentCount = 1;
125
        $this->data->fundingInstrument = new stdClass();
126
    }
127
128
    /**
129
     * Create a new payment in api MoIP.
130
     *
131
     * @return $this
132
     */
133
    public function execute()
134
    {
135
        if ($this->order !== null) {
136
            $path = sprintf('/%s/%s/%s/%s', MoipResource::VERSION, Orders::PATH, $this->order->getId(), self::PATH);
137
        } else {
138
            $path = sprintf('/%s/%s/%s/%s', MoipResource::VERSION, Multiorders::PATH, $this->multiorder->getId(), self::MULTI_PAYMENTS_PATH);
139
        }
140
141
        $response = $this->httpRequest($path, Requests::POST, $this);
142
143
        return $this->populate($response);
144
    }
145
146
    /**
147
     * Get an payment and multipayment in MoIP.
148
     *
149
     * @param string $id_moip Id MoIP payment
150
     *
151
     * @return stdClass
152
     */
153
    public function get($id_moip)
154
    {
155
        if ($this->order !== null) {
156
            return $this->getByPath(sprintf('/%s/%s/%s', MoipResource::VERSION, self::PATH, $id_moip));
157
        }
158
159
        return $this->getByPath(sprintf('/%s/%s/%s', MoipResource::VERSION, self::MULTI_PAYMENTS_PATH, $id_moip));
160
    }
161
162
    /**
163
     * Get id MoIP payment.
164
     *
165
     *
166
     * @return \Moip\Resource\Payment
167
     */
168
    public function getId()
169
    {
170
        return $this->getIfSet('id');
171
    }
172
173
    /**
174
     * Mount payment structure.
175
     *
176
     * @param \stdClass $response
177
     *
178
     * @return Payment
179
     */
180
    protected function populate(stdClass $response)
181
    {
182
        $payment = clone $this;
183
184
        $payment->data->id = $this->getIfSet('id', $response);
185
        $payment->data->status = $this->getIfSet('status', $response);
186
        $payment->data->delayCapture = $this->getIfSet('delayCapture', $response);
187
        $payment->data->amount = new stdClass();
188
        $payment->data->amount->total = $this->getIfSet('total', $response->amount);
189
        $payment->data->amount->currency = $this->getIfSet('currency', $response->amount);
190
        $payment->data->installmentCount = $this->getIfSet('installmentCount', $response);
191
        $payment->data->fundingInstrument = $this->getIfSet('fundingInstrument', $response);
192
        $payment->data->escrows = $this->getIfSet('escrows', $response);
193
        $payment->data->fees = $this->getIfSet('fees', $response);
194
        $payment->data->refunds = $this->getIfSet('refunds', $response);
195
        $payment->data->_links = $this->getIfSet('_links', $response);
196
        $payment->data->createdAt = $this->getIfSetDateTime('createdAt', $response);
197
        $payment->data->updatedAt = $this->getIfSetDateTime('updatedAt', $response);
198
199
        return $payment;
200
    }
201
202
    /**
203
     * Refunds.
204
     *
205
     * @return Refund
206
     */
207
    public function refunds()
208
    {
209
        $refund = new Refund($this->moip);
210
        $refund->setPayment($this);
211
212
        return $refund;
213
    }
214
215
    /**
216
     * Escrows.
217
     *
218
     * @return Escrow
219
     */
220
    public function escrows()
221
    {
222
        $escrow = new Escrow($this->moip);
223
        $escrow->setId($this->getEscrow()->id);
224
225
        return $escrow;
226
    }
227
228
    /**
229
     * Get payment status.
230
     *
231
     * @return string Payment status. Possible values CREATED, WAITING, IN_ANALYSIS, PRE_AUTHORIZED, AUTHORIZED, CANCELLED, REFUNDED, REVERSED, SETTLED
232
     */
233
    public function getStatus()
234
    {
235
        return $this->getIfSet('status');
236
    }
237
238
    /**
239
     * get creation time.
240
     *
241
     * @return \DateTime
242
     */
243
    public function getCreatedAt()
244
    {
245
        return $this->data->createdAt;
246
    }
247
248
    /**
249
     * Returns when the last update occurred.
250
     *
251
     * @return \DateTime
252
     */
253
    public function getUpdatedAt()
254
    {
255
        return $this->data->updatedAt;
256
    }
257
258
    /**
259
     * Returns the funding instrument.
260
     *
261
     * @return stdClass
262
     */
263
    public function getFundingInstrument()
264
    {
265
        //todo: return a funding instrument object
266
        return $this->data->fundingInstrument;
267
    }
268
269
    /**
270
     * Get href to Boleto
271
     * *.
272
     *
273
     * @return stdClass
274
     */
275
    public function getHrefBoleto()
276
    {
277
        return $this->getIfSet('_links')->payBoleto->redirectHref;
278
    }
279
280
    /**
281
     * Returns payment amount.
282
     *
283
     * @return stdClass
284
     */
285
    public function getAmount()
286
    {
287
        return $this->data->amount;
288
    }
289
290
    /**
291
     * Returns escrow.
292
     *
293
     * @return stdClass
294
     */
295
    public function getEscrow()
296
    {
297
        return reset($this->data->escrows);
298
    }
299
300
    /**
301
     * Returns installment count.
302
     *
303
     * @return stdClass
304
     */
305
    public function getInstallmentCount()
306
    {
307
        return $this->data->installmentCount;
308
    }
309
310
    /**
311
     * Set means of payment.
312
     *
313
     * @param \stdClass $fundingInstrument
314
     *
315
     * @return $this
316
     */
317
    public function setFundingInstrument(stdClass $fundingInstrument)
318
    {
319
        $this->data->fundingInstrument = $fundingInstrument;
320
321
        return $this;
322
    }
323
324
    /**
325
     * Set billet.
326
     *
327
     * @param \DateTime|string $expirationDate   Expiration date of a billet.
328
     * @param string           $logoUri          Logo of billet.
329
     * @param array            $instructionLines Instructions billet.
330
     *
331
     * @return $this
332
     */
333
    public function setBoleto($expirationDate, $logoUri, array $instructionLines = [])
334
    {
335
        $keys = ['first', 'second', 'third'];
336
337
        if (empty($instructionLines)) {
338
            //Avoid warning in array_combine
339
            $instructionLines = ['', '', ''];
340
        }
341
342
        if ($expirationDate instanceof \DateTime) {
343
            $expirationDate = $expirationDate->format('Y-m-d');
344
        }
345
346
        $this->data->fundingInstrument->method = self::METHOD_BOLETO;
347
        $this->data->fundingInstrument->boleto = new stdClass();
348
        $this->data->fundingInstrument->boleto->expirationDate = $expirationDate;
349
        $this->data->fundingInstrument->boleto->instructionLines = array_combine($keys, $instructionLines);
350
        $this->data->fundingInstrument->boleto->logoUri = $logoUri;
351
352
        return $this;
353
    }
354
355
    /**
356
     * Set credit card holder.
357
     *
358
     * @param \Moip\Resource\Customer $holder
359
     */
360
    private function setCreditCardHolder(Customer $holder)
361
    {
362
        $birthdate = $holder->getBirthDate();
363
        if ($birthdate instanceof \DateTime) {
364
            $birthdate = $birthdate->format('Y-m-d');
365
        }
366
        $this->data->fundingInstrument->creditCard->holder = new stdClass();
367
        $this->data->fundingInstrument->creditCard->holder->fullname = $holder->getFullname();
368
        $this->data->fundingInstrument->creditCard->holder->birthdate = $birthdate;
369
        $this->data->fundingInstrument->creditCard->holder->taxDocument = new stdClass();
370
        $this->data->fundingInstrument->creditCard->holder->taxDocument->type = $holder->getTaxDocumentType();
371
        $this->data->fundingInstrument->creditCard->holder->taxDocument->number = $holder->getTaxDocumentNumber();
372
        $this->data->fundingInstrument->creditCard->holder->phone = new stdClass();
373
        $this->data->fundingInstrument->creditCard->holder->phone->countryCode = $holder->getPhoneCountryCode();
374
        $this->data->fundingInstrument->creditCard->holder->phone->areaCode = $holder->getPhoneAreaCode();
375
        $this->data->fundingInstrument->creditCard->holder->phone->number = $holder->getPhoneNumber();
376
        $this->data->fundingInstrument->creditCard->holder->billingAddress = $holder->getBillingAddress();
377
    }
378
379
    /**
380
     * Set credit cardHash.
381
     *
382
     * @param string                  $hash   Credit card hash encripted using Moip.js
383
     * @param \Moip\Resource\Customer $holder
384
     * @param bool                    $store  Flag to know if credit card should be saved.
385
     *
386
     * @return $this
387
     */
388
    public function setCreditCardHash($hash, Customer $holder, $store = true)
389
    {
390
        $this->data->fundingInstrument->method = self::METHOD_CREDIT_CARD;
391
        $this->data->fundingInstrument->creditCard = new stdClass();
392
        $this->data->fundingInstrument->creditCard->hash = $hash;
393
        $this->data->fundingInstrument->creditCard->store = $store;
394
        $this->setCreditCardHolder($holder);
395
396
        return $this;
397
    }
398
399
    /**
400
     * Set credit card
401
     * Credit card used in a payment.
402
     * The card when returned within a parent resource is presented in its minimum representation.
403
     *
404
     * @param int                     $expirationMonth Card expiration month
405
     * @param int                     $expirationYear  Year of card expiration.
406
     * @param string                  $number          Card number.
407
     * @param int                     $cvc             Card Security Code.
408
     * @param \Moip\Resource\Customer $holder
409
     * @param bool                    $store           Flag to know if credit card should be saved.
410
     *
411
     * @return $this
412
     */
413
    public function setCreditCard($expirationMonth, $expirationYear, $number, $cvc, Customer $holder, $store = true)
414
    {
415
        $this->data->fundingInstrument->method = self::METHOD_CREDIT_CARD;
416
        $this->data->fundingInstrument->creditCard = new stdClass();
417
        $this->data->fundingInstrument->creditCard->expirationMonth = $expirationMonth;
418
        $this->data->fundingInstrument->creditCard->expirationYear = $expirationYear;
419
        $this->data->fundingInstrument->creditCard->number = $number;
420
        $this->data->fundingInstrument->creditCard->cvc = $cvc;
421
        $this->data->fundingInstrument->creditCard->store = $store;
422
        $this->setCreditCardHolder($holder);
423
424
        return $this;
425
    }
426
427
    /**
428
     * Sets data from a previously saved credit card
429
     * Credit card used in a payment.
430
     * Used when the credit card was saved with the customer and the payment made in a future date.
431
     *
432
     * @param string $creditCardId MoIP's Credit Card Id.
433
     * @param int    $cvc          Card Security Code.
434
     *
435
     * @return $this
436
     */
437
    public function setCreditCardSaved($creditCardId, $cvc)
438
    {
439
        $this->data->fundingInstrument = new stdClass();
440
        $this->data->fundingInstrument->method = self::METHOD_CREDIT_CARD;
441
        $this->data->fundingInstrument->creditCard = new stdClass();
442
        $this->data->fundingInstrument->creditCard->id = $creditCardId;
443
        $this->data->fundingInstrument->creditCard->cvc = $cvc;
444
445
        return $this;
446
    }
447
448
    /**
449
     * Set installment count.
450
     *
451
     * @param int $installmentCount
452
     *
453
     * @return $this
454
     */
455
    public function setInstallmentCount($installmentCount)
456
    {
457
        $this->data->installmentCount = $installmentCount;
458
459
        return $this;
460
    }
461
462
    /**
463
     * Set statement descriptor.
464
     *
465
     * @param string $statementDescriptor
466
     *
467
     * @return $this
468
     */
469
    public function setStatementDescriptor($statementDescriptor)
470
    {
471
        $this->data->statementDescriptor = $statementDescriptor;
472
473
        return $this;
474
    }
475
476
    /**
477
     * Set payment means made available by banks.
478
     *
479
     * @param string           $bankNumber     Bank number. Possible values: 001, 237, 341, 041.
480
     * @param \DateTime|string $expirationDate Date of expiration debit.
481
     * @param string           $returnUri      Return Uri.
482
     *
483
     * @return $this
484
     */
485
    public function setOnlineBankDebit($bankNumber, $expirationDate, $returnUri)
486
    {
487
        if ($expirationDate instanceof \DateTime) {
488
            $expirationDate = $expirationDate->format('Y-m-d');
489
        }
490
        $this->data->fundingInstrument->method = self::METHOD_ONLINE_BANK_DEBIT;
491
        $this->data->fundingInstrument->onlineBankDebit = new stdClass();
492
        $this->data->fundingInstrument->onlineBankDebit->bankNumber = $bankNumber;
493
        $this->data->fundingInstrument->onlineBankDebit->expirationDate = $expirationDate;
494
        $this->data->fundingInstrument->onlineBankDebit->returnUri = $returnUri;
495
496
        return $this;
497
    }
498
499
    /**
500
     * Set Multiorders.
501
     *
502
     * @param \Moip\Resource\Multiorders $multiorder
503
     *
504
     * @return $this
505
     */
506
    public function setMultiorder(Multiorders $multiorder)
507
    {
508
        $this->multiorder = $multiorder;
509
510
        return $this;
511
    }
512
513
    /**
514
     * Set order.
515
     *
516
     * @param \Moip\Resource\Orders $order
517
     *
518
     * @return $this
519
     */
520
    public function setOrder(Orders $order)
521
    {
522
        $this->order = $order;
523
524
        return $this;
525
    }
526
527
    /**
528
     * Turns on a delay on credit card payment capture (pre-authorization).
529
     *
530
     * @return $this
531
     */
532
    public function setDelayCapture()
533
    {
534
        $this->data->delayCapture = true;
535
536
        return $this;
537
    }
538
539
    /**
540
     * Set escrow to a payment.
541
     *
542
     * @param string $description
543
     *
544
     * @return $this
545
     */
546
    public function setEscrow($description)
547
    {
548
        $this->data->escrow = new stdClass();
549
        $this->data->escrow->description = $description;
550
551
        return $this;
552
    }
553
554
    /**
555
     * Capture a pre-authorized amount on a credit card payment.
556
     *
557
     * @throws \Exception
558
     *
559
     * @return Payment
560
     */
561
    public function capture()
562
    {
563
        if (is_null($this->order)) {
564
            throw new \Exception('Sorry, multipayment capture is not available on this version');
565
        }
566
        $path = sprintf('/%s/%s/%s/%s', MoipResource::VERSION, self::PATH, $this->getId(), 'capture');
567
568
        $response = $this->httpRequest($path, Requests::POST, $this);
569
570
        return $this->populate($response);
571
    }
572
573
    /**
574
     * Avoid a pre-authorized amount on a credit card payment.
575
     *
576
     * @throws \Exception
577
     *
578
     * @return Payment
579
     */
580
    public function avoid()
581
    {
582
        if (is_null($this->order)) {
583
            throw new \Exception('Sorry, multipayment capture is not available on this version');
584
        }
585
        $path = sprintf('/%s/%s/%s/%s', MoipResource::VERSION, self::PATH, $this->getId(), 'void');
586
587
        $response = $this->httpRequest($path, Requests::POST, $this);
588
589
        return $this->populate($response);
590
    }
591
592
    /**
593
     * Authorize a payment (Available only in sandbox to credit card payment with status IN_ANALYSIS and billet payment with status WAITING).
594
     *
595
     * @return bool
596
     */
597
    public function authorize($amount = null)
598
    {
599
        if (is_null($amount)) {
600
            $amount = $this->getAmount()->total;
601
        }
602
        $path = sprintf('/%s/%s?payment_id=%s&amount=%s', self::SIMULATOR_PATH, 'authorize', $this->getId(), $amount);
603
        $response = $this->httpRequest($path, Requests::GET);
604
605
        if (empty($response)) {
606
            return true;
607
        }
608
609
        return false;
610
    }
611
}
612