Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Permite configurar a validade e expiração da fatura de forma independente #33

Merged
merged 3 commits into from
Oct 16, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
64 changes: 32 additions & 32 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -158,39 +158,39 @@ $payment = new \Potelo\MultiPayment\MultiPayment();
$payment->setGateway('iugu')->charge($options);
```

| atributo | obrigatório | tipo | descrição | exemplo |
|-------------------------------|---------------------------------------------------------------------|--------------------------------|-------------------------------------------|---------------------------------------|
| `amount` | **obrigatório** caso `items` não seja informado | int | valor em centavos | `10000` |
| `customer` | **obrigatório** | array | array com os dados do cliente | `['name' => 'Nome do cliente'...]` |
| `customer.name` | **obrigatório** | string | nome do cliente | `'Nome do cliente'` |
| `customer.email` | **obrigatório** | string | email do cliente | `'[email protected]'` |
| `customer.tax_document` | | string | cpf ou cnpj do cliente | `'12345678901'` |
| `birth_date` | | string formato `yyyy-mm-dd` | data de nascimento | `'01/01/1990'` |
| `customer.phone_number` | | string | telefone | `'999999999'` |
| `customer.phone_area` | | string | DDD | `'999999999'` |
| `customer.address` | **obrigatório** para o método de pagamento `bank_slip` | array | array com os dados do endereço do cliente | `['street' => 'Rua do cliente'...]` |
| `customer.address.street` | **obrigatório** | string | nome da rua | `'Nome da rua'` |
| `customer.address.number` | **obrigatório** | string | número da casa | `'123'` |
| `customer.address.district` | **obrigatório** | string | bairro | `'Bairro do cliente'` |
| `customer.address.city` | **obrigatório** | string | cidade | `'Salvador'` |
| `customer.address.state` | **obrigatório** | string | estado | `'Bahia'` |
| atributo | obrigatório | tipo | descrição | exemplo |
|------------------------------|---------------------------------------------------------------------|--------------------------------|-------------------------------------------|---------------------------------------|
| `amount` | **obrigatório** caso `items` não seja informado | int | valor em centavos | `10000` |
| `customer` | **obrigatório** | array | array com os dados do cliente | `['name' => 'Nome do cliente'...]` |
| `customer.name` | **obrigatório** | string | nome do cliente | `'Nome do cliente'` |
| `customer.email` | **obrigatório** | string | email do cliente | `'[email protected]'` |
| `customer.tax_document` | | string | cpf ou cnpj do cliente | `'12345678901'` |
| `birth_date` | | string formato `yyyy-mm-dd` | data de nascimento | `'01/01/1990'` |
| `customer.phone_number` | | string | telefone | `'999999999'` |
| `customer.phone_area` | | string | DDD | `'999999999'` |
| `customer.address` | **obrigatório** para o método de pagamento `bank_slip` | array | array com os dados do endereço do cliente | `['street' => 'Rua do cliente'...]` |
| `customer.address.street` | **obrigatório** | string | nome da rua | `'Nome da rua'` |
| `customer.address.number` | **obrigatório** | string | número da casa | `'123'` |
| `customer.address.district` | **obrigatório** | string | bairro | `'Bairro do cliente'` |
| `customer.address.city` | **obrigatório** | string | cidade | `'Salvador'` |
| `customer.address.state` | **obrigatório** | string | estado | `'Bahia'` |
| `customer.address.complement` | **obrigatório** | string | complemento | `'Apto. 123'` |
| `customer.address.zip_code` | **obrigatório** | string | cep | `'12345678'` |
| `items` | **obrigatório** caso `amount` não tenha sido informado | array | array com os itens da compra | `[['description' => 'Produto 1',...` |
| `items.description` | **obrigatório** | string | descrição do item | `'Produto 1'` |
| `items.quantity` | **obrigatório** | int | quantidade do item | `1` |
| `items.price` | **obrigatório** | int | valor do item | `10000` |
| `payment_method` | | `'credit_card'`,`'bank_slip'` | método de pagamento | `'credit_card'` |
| `expires_at` | **obrigatório** caso `payment_method` seja `'bank_slip'` ou `'pix'` | string no formato `yyyy-mm-dd` | data de expiração da fatura | `2021-10-10` |
| `credit_card` | **obrigatório** caso `payment_method` seja `'credit_card'` | array | array com os dados do cartão de crédito | `['number' => '1234567890123456',...` |
| `credit_card.token` | | string | token do cartão para o gateway escolhido | `'abcdefghijklmnopqrstuvwxyz'` |
| `credit_card.number` | **obrigatório** caso `token` não tenha sido informado | string | número do cartão de crédito | `'1234567890123456'` |
| `credit_card.month` | **obrigatório** caso `token` não tenha sido informado | string | mês de expiração do cartão de crédito | `'12'` |
| `credit_card.year` | **obrigatório** caso `token` não tenha sido informado | string | ano de expiração do cartão de crédito | `'2022'` |
| `credit_card.cvv` | **obrigatório** caso `token` não tenha sido informado | string | código de segurança do cartão de crédito | `'123'` |
| `credit_card.first_name` | | string | primeiro nome no cartão de crédito | `'João'` |
| `credit_card.last_name` | | string | último nome no cartão de crédito | `'Maria'` |
| `bank_slip` | | array | array com os dados do boleto | `['expires_at' => '2022-12-31',...` |
| `customer.address.zip_code` | **obrigatório** | string | cep | `'12345678'` |
| `items` | **obrigatório** caso `amount` não tenha sido informado | array | array com os itens da compra | `[['description' => 'Produto 1',...` |
| `items.description` | **obrigatório** | string | descrição do item | `'Produto 1'` |
| `items.quantity` | **obrigatório** | int | quantidade do item | `1` |
| `items.price` | **obrigatório** | int | valor do item | `10000` |
| `payment_method` | | `'credit_card'`,`'bank_slip'` | método de pagamento | `'credit_card'` |
| `due_at` | **obrigatório** caso `payment_method` seja `'bank_slip'` ou `'pix'` | string no formato `yyyy-mm-dd` | data de expiração da fatura | `2021-10-10` |
| `credit_card` | **obrigatório** caso `payment_method` seja `'credit_card'` | array | array com os dados do cartão de crédito | `['number' => '1234567890123456',...` |
| `credit_card.token` | | string | token do cartão para o gateway escolhido | `'abcdefghijklmnopqrstuvwxyz'` |
| `credit_card.number` | **obrigatório** caso `token` não tenha sido informado | string | número do cartão de crédito | `'1234567890123456'` |
| `credit_card.month` | **obrigatório** caso `token` não tenha sido informado | string | mês de expiração do cartão de crédito | `'12'` |
| `credit_card.year` | **obrigatório** caso `token` não tenha sido informado | string | ano de expiração do cartão de crédito | `'2022'` |
| `credit_card.cvv` | **obrigatório** caso `token` não tenha sido informado | string | código de segurança do cartão de crédito | `'123'` |
| `credit_card.first_name` | | string | primeiro nome no cartão de crédito | `'João'` |
| `credit_card.last_name` | | string | último nome no cartão de crédito | `'Maria'` |
| `bank_slip` | | array | array com os dados do boleto | `['due_at' => '2022-12-31',...` |

### Models
#### Customer
Expand Down
25 changes: 19 additions & 6 deletions src/Builders/InvoiceBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -58,18 +58,31 @@ public function setPaymentMethod(string $paymentMethod): InvoiceBuilder
}

/**
* set invoice expiresAt
* set invoice DueAt
*
* @param Carbon|string $expiresAt Carbon or string in Y-m-d format
* @param Carbon|string $dueAt Carbon or string in Y-m-d format
*
* @return InvoiceBuilder
*/
public function setExpiresAt($expiresAt): InvoiceBuilder
public function setDueAt($dueAt): InvoiceBuilder
{
if (is_string($expiresAt)) {
$expiresAt = Carbon::parse($expiresAt);
if (is_string($dueAt)) {
$dueAt = Carbon::parse($dueAt);
}
$this->model->expiresAt = $expiresAt;
$this->model->dueAt = $dueAt;
return $this;
}

/**
* set invoice expirationDays
*
* @param int $expirationDays
*
* @return InvoiceBuilder
*/
public function setExpirationDays(int $expirationDays): InvoiceBuilder
{
$this->model->expirationDays = $expirationDays;
return $this;
}

Expand Down
8 changes: 5 additions & 3 deletions src/Gateways/IuguGateway.php
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,7 @@ public function createInvoice(Invoice $invoice): Invoice
$iuguInvoiceData['customer_id'] = $invoice->customer->id;
$iuguInvoiceData['payer']['cpf_cnpj'] = $invoice->customer->taxDocument;
$iuguInvoiceData['email'] = $invoice->customer->email;
$iuguInvoiceData['expires_in'] = $invoice->expirationDays ?? 0;

$iuguInvoiceData['items'] = [];
foreach ($invoice->items as $item) {
Expand All @@ -76,8 +77,8 @@ public function createInvoice(Invoice $invoice): Invoice
}
}

$iuguInvoiceData['due_date'] = !empty($invoice->expiresAt)
? $invoice->expiresAt->format('Y-m-d')
$iuguInvoiceData['due_date'] = !empty($invoice->dueAt)
? $invoice->dueAt->format('Y-m-d')
: Carbon::now()->format('Y-m-d');

if (!empty($invoice->customer->address)) {
Expand Down Expand Up @@ -423,6 +424,7 @@ private function parseInvoice($iuguInvoice, ?Invoice $invoice = null): Invoice
$invoice->amount = $iuguInvoice->total_cents;
$invoice->paidAmount = $iuguInvoice->paid_cents;
$invoice->refundedAmount = $iuguInvoice->refunded_cents;
$invoice->expirationDays = $iuguInvoice->expires_in;

$invoice->customer = new Customer();
$invoice->customer->id = $iuguInvoice->customer_id;
Expand Down Expand Up @@ -454,7 +456,7 @@ private function parseInvoice($iuguInvoice, ?Invoice $invoice = null): Invoice
}

$invoice->paymentMethod = $this->iuguToMultiPaymentPaymentMethod($iuguInvoice->payment_method);
$invoice->expiresAt = !empty($iuguInvoice->due_date) ? new Carbon($iuguInvoice->due_date) : null;
$invoice->dueAt = !empty($iuguInvoice->due_date) ? new Carbon($iuguInvoice->due_date) : null;
$invoice->createdAt = new Carbon($iuguInvoice->created_at_iso);
$invoice->fee = $iuguInvoice->taxes_paid_cents ?? null;
$invoice->gateway = 'iugu';
Expand Down
17 changes: 11 additions & 6 deletions src/Models/Invoice.php
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,12 @@ class Invoice extends Model
/**
* @var Carbon|null
*/
public ?Carbon $expiresAt;
public ?Carbon $dueAt;

/**
* @var int|null
*/
public ?int $expirationDays;

/**
* @var int|null
Expand Down Expand Up @@ -165,9 +170,9 @@ public function fill(array $data): void
unset($data['customer']);
}

if (!empty($data['expires_at'])) {
$this->expiresAt = Carbon::createFromFormat('Y-m-d', $data['expires_at']);
unset($data['expires_at']);
if (!empty($data['due_at'])) {
$this->dueAt = Carbon::createFromFormat('Y-m-d', $data['due_at']);
unset($data['due_at']);
}

if (!empty($data['credit_card']) && is_array($data['credit_card'])) {
Expand Down Expand Up @@ -208,9 +213,9 @@ public function attributesExtraValidation($attributes): void
($this->paymentMethod == Invoice::PAYMENT_METHOD_BANK_SLIP ||
$this->paymentMethod == Invoice::PAYMENT_METHOD_PIX
) &&
empty($this->expiresAt)
empty($this->dueAt)
) {
throw new ModelAttributeValidationException('The `expiresAt` attribute is required for bank_slip or pix payment method.');
throw new ModelAttributeValidationException('The `dueAt` attribute is required for bank_slip or pix payment method.');
}

if (
Expand Down
Loading