README.md

# QI Tech Elixir

Elixir wrapper for [QI Tech](https://www.qitech.com.br/documentacao?file=111) API.

## Installation

Add `qitech` to your list of dependencies in `mix.exs`:

```elixir
def deps do
  [
    {:qitech, "~> 0.2.6"}
  ]
end
```

## Configuration 

The default behaviour is to configure using the application environment:

```elixir
# config/config.exs

config :qitech,
  sandbox: true, # for production environment put false
  simplify_response: true, # default true
  api_client_key: "QI Tech API Client Key",
  client_adapter_opts: [adapter: [recv_timeout: 10_000]], # For more detail see Tesla Adapter
  public_key: " -----BEGIN PUBLIC KEY-----",
  private_key: "-----BEGIN EC PRIVATE KEY-----"
  ```

## Examples

Create a debt.

```elixir

body = %{
  "additional_data" =>  %{
  },
  "borrower" =>  %{
    "address" =>  %{
      "city" =>  "example",
      "complement" =>  "example",
      "neighborhood" =>  "example",
      "number" =>  "example",
      "postal_code" =>  "example",
      "state" =>  "RJ",
      "street" =>  "example"
    },
    "document_identification_number" =>  "",
    "email" =>  "example@example.com",
    "individual_document_number" =>  "xxxxxxxxxxx",
    "mother_name" =>  "",
    "name" =>  "example",
    "nationality" =>  "",
    "person_type" =>  "natural",
    "phone" =>  %{
      "area_code" =>  "00",
      "country_code" =>  "055",
      "number" =>  "000000000"
    },
    "profession" =>  ""
  },
  "disbursement_bank_accounts" =>  [
    %{
      "account_digit" =>  "0",
      "account_number" =>  "00000",
      "bank_code" =>  "000",
      "branch_number" =>  "0000",
      "document_number" =>  "xxxxxxxxxxxxxxx",
      "name" =>  "example",
      "percentage_receivable" =>  100
    }
  ],
  "financial" =>  %{
    "annual_interest_rate" =>  0.966751,
    "credit_operation_type" =>  "ccb",
    "disbursed_amount" =>  5000.0,
    "disbursement_date" =>  "2021-03-05",
    "fine_configuration" =>  %{
      "contract_fine_rate" =>  0.02,
      "interest_base" =>  "calendar_days",
      "monthly_rate" =>  0.01
    },
    "first_due_date" =>  "2021-03-10",
    "interest_grace_period" =>  0,
    "interest_subsidy_amount" =>  0,
    "interest_subsidy_percentage" =>  0,
    "interest_type" =>  "pre_price_days",
    "issue_date" =>  "2021-02-27",
    "number_of_installments" =>  2,
    "principal_grace_period" =>  0,
    "rebate" =>  35.0
  },
  "guarantors" =>  [],
  "installments" =>  [],
  "simplified" =>  true
}


body |> QITech.API.Debt.create()

# Response
{:ok,
 %{
   body: %{
     "data" => %{
       "assignment_amount" => 0000.000,
       "borrower" => %{
         "document_number" => "xxxxxxxxxxx",
         "name" => "exaple"
       },
       "contract" => %{
         "number" => "0000000/LF",
         "urls" => [""]
       },
       "contract_fee_amount" => 8.41,
       "contract_fees" => [%{"fee_amount" => 8.41, "fee_type" => "tac"}],
       "external_contract_fee_amount" => 00.0,
       "external_contract_fees" => [
         %{
           "fee_amount" => 00.00,
           "fee_type" => "tac_tax_free",
           "net_fee_amount" => 00.00,
           "tax_amount" => 0.0
         }
       ],
       "installments" => [
         %{
           "additional_costs" => [],
           "bank_slip_key" => nil,
           "business_due_date" => "2021-03-10",
           "calendar_days" => 5,
           "digitable_line" => nil,
           "due_date" => "2021-03-10",
           "due_interest" => 0.0,
           "due_principal" => 000.00,
           "fine_amount" => nil,
           "has_interest" => true,
           "installment_key" => "xxxxxxxxx-xxxx-xxxx-xxxxxxx",
           "installment_number" => 1,
           "installment_status" => "created",
           "installment_type" => "principal",
           "paid_amount" => 0.0,
           "paid_at" => nil,
           "post_fixed_amount" => 0,
           "pre_fixed_amount" => 5.000,
           "principal_amortization_amount" => 00.00,
           "tax_amount" => 0.00,
           "total_amount" => 00.15,
           "workdays" => 3.0
         },
         %{
           "additional_costs" => [],
           "bank_slip_key" => nil,
           "business_due_date" => "2021-04-12",
           "calendar_days" => 31,
           "digitable_line" => nil,
           "due_date" => "2021-04-10",
           "due_interest" => 0.0,
           "due_principal" => 000.0000,
           "fine_amount" => nil,
           "has_interest" => true,
           "installment_key" => "xxxxxxxxx-xxxx-xxxx-xxxxxxx",
           "installment_number" => 2,
           "installment_status" => "created",
           "installment_type" => "principal",
           "paid_amount" => 0.0,
           "paid_at" => nil,
           "post_fixed_amount" => 0,
           "pre_fixed_amount" => 00.0000,
           "principal_amortization_amount" => 000.000,
           "tax_amount" => 0.00,
           "total_amount" => 000.00,
           "workdays" => 0.0
         }
       ],
       "net_external_contract_fee_amount" => 218.65,
       "requester_identifier_key" => "xxxxxxxxx-xxxx-xxxx-xxxxxxx" 
     },
     "event_datetime" => "2021-02-27 01:37:41",
     "key" => "xxxxxxxxx-xxxx-xxxx-xxxxxxx",
     "status" => "waiting_signature",
     "webhook_type" => "debt"
   },
   status: 201
 }}
```
Retrieve a list of debt.

```elixir
QITech.API.Debt.get([page_size: 1]) 

# Response
{:ok,
 %{
   body: %{
     "data" => [
       %{
         "net_external_contract_fee_amount" => 00.00,
         "payment_and_settlement_agent" => nil,
         "credit_operation_type" => %{
           "created_at" => "2019-03-15T13:09:34",
           "enumerator" => "ccb",
           "translation_path" => "co.CreditOperationType.ccb"
         },
         "credit_operation_status" => %{
           "created_at" => "2019-03-15T13:09:34",
           "enumerator" => "waiting_signature",
           "translation_path" => "co.CreditOperationStatus.waiting_signature"
         },
         "share_quantity" => 2,
         "prefixed_interest_rate" => %{
           "annual_rate" => 0.000,
           "created_at" => "2021-02-27T01:37:34",
           "daily_rate" => 6.4803e-4,
           "interest_base" => %{
             "created_at" => "2020-09-01T14:57:56",
             "enumerator" => "calendar_days_365",
             "translation_path" => "co.InterestBase.calendar_days_365",
             "year_days" => 365
           },
           "monthly_rate" => 0.000
         },
         "principal_grace_period" => 0,
         "issuer_name" => "example",
         "rebate_account" => %{
           "account_branch" => "00",
           "account_digit" => "00",
           "account_number" => "00",
           "created_at" => "2020-10-22T16:04:28",
           "document_number" => "0000",
           "financial_institutions" => %{
             "code_number" => 00,
             "ispb" => 0000,
             "name" => "example"
           },
           "financial_institutions_code_number" => 237,
           "name" => "example"
         },
         "calculus_correction" => nil,
         "operation_type" => %{
           "created_at" => "2020-01-23T19:05:26",
           "enumerator" => "structured_operation",
           "translation_path" => "co.OperationType.structured_operation"
         },
         "custodian" => %{
           "created_at" => "2019-10-10T14:22:43",
           "enumerator" => "qi_scd",
           "translation_path" => "co.Custodian.qi_scd"
         },
         "disbursement_date" => "2021-03-05",
         "endorsement" => nil,
         "events" => [],
         "base_iof" => 0.00,
         "central_depository" => nil,
         "external_contract_fees" => [
           %{
             "amount" => 00.0,
             "amount_type" => %{
               "created_at" => "2020-02-10T13:32:52",
               "enumerator" => "percentage"
             },
             "created_at" => "2021-02-27T01:37:34",
             "fee_amount" => 00.65,
             "fee_type" => %{
               "created_at" => "2020-09-04T10:47:21",
               "enumerator" => "tac_tax_free"
             },
             "net_fee_amount" => 00.65,
             "tax_amount" => 0.0
           }
         ],
         "contract_number" => "000000000/LF",
         "total_iof" => 9.2,
         "disbursed_issue_amount" => 0000.65,
         "assignment_amount" => 0000.00,
         "isin_number" => nil,
         "registration_institution" => %{
           "created_at" => "2019-10-10T14:22:44",
           "enumerator" => "qi_scd",
           "translation_path" => "co.RegistrationInstitution.qi_scd"
         },
         "operation_extra_fields" => nil,
         "origin_key" => "xxxxx-xxx-xxxx-xxxxx",
         "attached_document_list" => [
           %{
             "created_at" => "2021-02-27T01:37:41",
             "document_key" => "xxxxx-xxx-xxxx-xxxxx",
             "document_type" => %{
               "created_at" => "2020-09-03T17:53:17",
               "enumerator" => "ccb_pre_price_days",
               "translation_path" => "co.DocumentType.ccb_pre_price_days"
             },
             "document_url" => "",
             "related_party_key" => nil,
             "signature_required" => true,
             "signature_url" => nil,
             "signed" => false
           }
         ],
         "modality" => %{
           "code" => "0499",
           "created_at" => "2021-01-11T17:30:53",
           "description" => "outros financiamentos",
           "visible" => true
         },
         "first_due_date_delay" => nil,
         "resource_source_account" => %{
           "created_at" => "2019-03-15T13:09:43",
           "enumerator" => "treasury_account",
           "translation_path" => "co.ResourceSourceAccount.treasury_account"
         },
         "interest_subsidy_percentage" => 0.0,
         "after_disbursement_actions" => [],
         "requester_key" => "xxxxx-xxx-xxxx-xxxxx",
         "post_fixed_interest_rate" => nil,
         "related_party_list" => [
           %{
             "address" => %{
               "city" => "example",
               "complement" => "example",
               "created_at" => "2021-02-27T01:37:34",
               "neighborhood" => "example",
               "number" => "88",
               "postal_code" => "example",
               "state" => "RJ",
               "street" => "example"
             },
             "attached_document_list" => [],
             "birth_date" => nil,
             "birth_place" => nil,
             "cnae_code" => nil,
             "company_document_number" => nil,
             "created_at" => "2021-02-27T01:37:34",
             "document_identification_number" => "",
             "email" => "example@example.com",
           }
         ],
         "interest_subsidy_amount" => 0.0,
         "disbursement_callback" => nil,
         "requester_name" => "example",
         "contract_fee_amount" => 8.41,
         "document_certifier" => %{
           "created_at" => "2020-02-07T17:14:42",
           "enumerator" => "clicksign",
           "translation_path" => "co.DocumentCertifier.clicksign"
         },
         "number_of_installments" => 2,
         "early_settlement_configuration" => %{
           "created_at" => "2021-02-27T01:37:34",
           "early_settlement_configuration_type" => %{
             "created_at" => "2019-03-15T13:09:36",
           },
           "effective_end_date" => nil,
         },
         "tax_configuration" => %{
           "created_at" => "2019-03-15T13:09:32",
           "iof_additional_rate" => 0.00,
         },
         "fine_configuration" => %{"contract_fine_rate" => 0.02, ...},
         "disbursement_end_date" => "2021-03-05",
         ...
       }
     ],
     "pagination" => %{ 
       "current_page" => 1,
       "next_page" => 2,
       "rows_per_page" => 1,
       "total_pages" => 7,
       "total_rows" => 7
     },
     "totals" => %{"issue_total_amount" => "00.00"}
   },
   status: 200
 }}
```

Retrieve a debt.

```elixir
QITech.API.Debt.get([key: "8b0f78d5-2574-442f-b5da-1f4752c45f48"])

# Response
%{
   body: %{
     "data" => %{
       "additional_iof" => 0.0,
       "base_iof" => 0.0,
       "borrower" => %{
         "document_number" => "xxxxxxxxxxx",
         "name" => "example"
       },
       "contract_fee_amount" => 0.00,
       "contract_fees" => [
         %{
           "amount" => 0.0,
           "amount_type" => %{
             "created_at" => "2020-02-10T13:32:52",
             "enumerator" => "percentage"
           },
           "created_at" => "2021-02-27T01:37:34",
           "fee_amount" => 0.00,
           "fee_type" => %{
             "created_at" => "2020-02-10T13:33:16",
             "enumerator" => "tac"
           }
         }
       ],
       "contract_number" => "00000/LF",
       "disbursed_issue_amount" => 00.00,
       "disbursement_account" => [
         %{
           "account_branch" => "00",
           "account_digit" => "0",
           "account_number" => "00",
           "amount_receivable" => nil,
           "created_at" => "2021-02-27T01:37:34",
           "document_number" => "xxxxxxxxxxx",
           "financial_institutions" => %{
             "code_number" => 00,
             "ispb" => 00,
             "name" => "example"
           },
           "financial_institutions_code_number" => 000,
           "name" => "example",
           "percentage_receivable" => 100.0,
           "transaction_key" => nil,
           "webhook_key" => nil
         }
       ],
       "disbursement_date" => "2021-03-05",
       "external_contract_fee_amount" => 00.00,
       "external_contract_fees" => [
         %{
           "amount" => 00.0,
           "amount_type" => %{
             "created_at" => "2020-02-10T13:32:52",
             "enumerator" => "percentage"
           },
           "created_at" => "2021-02-27T01:37:34",
           "fee_amount" => 00.00,
           "fee_type" => %{
             "created_at" => "2020-09-04T10:47:21",
             "enumerator" => "tac_tax_free"
           },
           "net_fee_amount" => 00.00,
           "tax_amount" => 0.0
         }
       ],
       "installments" => [
         %{
           "additional_costs" => [],
           "bank_slip_key" => nil,
           "business_due_date" => "2021-03-10",
           "calendar_days" => 5,
           "digitable_line" => nil,
           "due_date" => "2021-03-10",
           "due_interest" => 0.0,
           "due_principal" => 00.91,
           "fine_amount" => nil,
           "has_interest" => true, 
           "installment_key" => "xxxx-xxx-xxx-xxx-xxxxxxxxx",
           "installment_number" => 1,
           "installment_status" => "created",
           "installment_type" => "principal",
           "paid_amount" => 0.0,
           "paid_at" => nil,
           "post_fixed_amount" => 0.0,
           "pre_fixed_amount" => 5.00,
           "principal_amortization_amount" => 00.00,
           "tax_amount" => 0.00,
           "total_amount" => 00.00,
           "workdays" => 3
         },
         %{
           "additional_costs" => [],
           "bank_slip_key" => nil,
           "business_due_date" => "2021-04-12",
           "calendar_days" => 31,
           "digitable_line" => nil,
           "due_date" => "2021-04-10",
           "due_interest" => 0.0,
           "due_principal" => 00.00,
           "fine_amount" => nil,
           "has_interest" => true,
           "installment_key" => "xxxx-xx-xxxx-xxxx-xxxxxxx",
           "installment_number" => 2,
           "installment_status" => "created",
           "installment_type" => "principal",
           "paid_amount" => 0.0,
           "paid_at" => nil,
           "post_fixed_amount" => 0.0,
           "pre_fixed_amount" => 00.00,
           "principal_amortization_amount" => 00.00,
           "tax_amount" => 0.00,
           "total_amount" => 00.00,
           "workdays" => 21
         }
       ],
       "issue_amount" => 00.00,
       "net_external_contract_fee_amount" => 00.00,
       "post_fixed_interest_base" => %{
         "created_at" => "2019-03-15T13:09:33",
         "enumerator" => "workdays",
         "translation_path" => "co.InterestBase.workdays",
         "year_days" => 252
       },
       "post_fixed_interest_rate" => nil,
       "prefixed_interest_rate" => %{
         "annual_rate" => 0.00,
         "created_at" => "2021-02-27T01:37:34",
         "daily_rate" => 6.4803e-4,
         "interest_base" => %{
           "created_at" => "2020-09-01T14:57:56",
           "enumerator" => "calendar_days_365",
           "translation_path" => "co.InterestBase.calendar_days_365",
           "year_days" => 365
         },
         "monthly_rate" => 0.00
       },
       "purchaser_document_number" => nil,
       "total_iof" => 0.0
     },
     "operation_key" => "xxxxx-xxxxx-xxxx-xxxx-xxxxxxxx",
     "status" => "waiting_signature",
     "webhook_type" => "debt"
   },
   status: 200
 }}
```

Cancel a debt.

```elixir
QITech.API.Debt.cancel("d4935335-5263-430a-868d-505a7ce9d8f0")

# Response
{:ok, %{body: %{}, status: 201}}
```

Retrieve a bank slip.

```elixir
QITech.API.BankSlip.get("d4935335-5263-430a-868d-505a7ce9d8f0")

# Response
{:ok,
 %{
   body: %{
     "days_to_bankruptcy_protest" => 0,
     "beneficiary_document_number" => "xxxx",
     "days_before_interest" => nil,
     "nfe_key" => nil,
     "automatic_protest" => false,
     "days_to_write_off" => nil,
     "expiration" => "2022-01-15",
     "notification" => [
       %{
         "document_number" => "xxxx",
         "email" => "xxxx",
         "name" => "xxxx",
         "phone" => nil,
         "send_2_way" => false,
         "send_after_due_date" => 1,
         "send_before_due_date" => true,
         "send_on_protest" => false
       }
     ],
     "guarantor_document" => nil,
     "bank_slip_file" => [],
     "interest_daily_value" => 0.12,
     "has_protest_pending_feedback" => false,
     "payer_postal_code" => "00000000",
     "notary_office_number" => nil,
     "settlement_account_key" => "xxxx",
     "digitable_line" => "00000",
     "requester_profile_code" => "xxxx",
     "bank_teller_instructions" => "",
     "asset_type" => %{
       "created_at" => "2019-03-12T12:59:31",
       "enumerator" => "invoice",
       "translation_path" => "bank_slip.AssetType.invoice"
     },
     "payer_person_type" => %{
       "created_at" => "2019-03-12T12:59:31",
       "enumerator" => "natural",
       "translation_path" => "bank_slip.PersonType.natural"
     },
     "protocol_region" => nil,
     "paid_fine_amount" => nil,
     "beneficiary_account_branch" => "0001",
     "discounts" => [],
     "printing_policy" => %{
       "created_at" => "2019-03-12T12:59:31",
       "enumerator" => "no_printing",
       "translation_path" => "bank_slip.PrintingPolicy.no_printing"
     },
     "business_date_expiration" => "2022-01-17",
     "protest_status" => %{
       "created_at" => "2019-03-12T12:59:31",
       "enumerator" => "not_protested",
       "translation_path" => "bank_slip.ProtestStatus.not_protested"
     },
     "created_at" => "2021-08-12T22:33:27",
     "payer_branch_number" => nil,
     "beneficiary_name" => "XXX XXX XXX XXX",
     "lock_origin_type" => nil,
     "settlements" => [],
     "bank_slip_key" => "xxxxx",
     "protocol_date" => nil,
     "days_to_protest" => nil,
     "requester_profile" => 9,
     "paid_amount" => nil,
     "fine_percentage" => 2.0,
     "notary_office_protocol" => nil,
     "days_before_fine" => nil,
     "beneficiary_account_key" => "xxxxx",
     "original_expiration" => "2022-01-15",
     "tags" => "credit-operation",
     "automatic_bankruptcy_protest" => false,
     "billing_account_key" => "xxxxxx",
     "expenses" => [%{...}, ...],
     "document_number" => "8",
   },
   status: 200
 }}
```

Retrieve a copy of the bank slip

```elixir
QITech.API.BankSlip.copy("d4935335-5263-430a-868d-505a7ce9d8f0")

# Response
{:ok,
 %{
   body: %{
     "days_to_bankruptcy_protest" => 0,
     "beneficiary_document_number" => "xxxx",
     "days_before_interest" => nil,
     "nfe_key" => nil,
     "automatic_protest" => false,
     "days_to_write_off" => nil,
     "expiration" => "2022-01-15",
     "notification" => [
       %{
         "document_number" => "xxxx",
         "email" => "xxxx",
         "name" => "xxxx",
         "phone" => nil,
         "send_2_way" => false,
         "send_after_due_date" => 1,
         "send_before_due_date" => true,
         "send_on_protest" => false
       }
     ],
     "guarantor_document" => nil,
     "bank_slip_file" => [
       %{
         "barcode" => "0000000000000000000000000000000000000000000000",
         "created_at" => "2021-12-20T16:41:18",
         "digitable_line" => "0000000000000000000000000000000000000000000000",
         "url" => "https://linkparadownload.com/arquivo.pdf"
       }
     ],
     "interest_daily_value" => 0.12,
     "has_protest_pending_feedback" => false,
     "payer_postal_code" => "00000000",
     "notary_office_number" => nil,
     "settlement_account_key" => "xxxx",
     "digitable_line" => "00000",
     "requester_profile_code" => "xxxx",
     "bank_teller_instructions" => "",
     "asset_type" => %{
       "created_at" => "2019-03-12T12:59:31",
       "enumerator" => "invoice",
       "translation_path" => "bank_slip.AssetType.invoice"
     },
     "payer_person_type" => %{
       "created_at" => "2019-03-12T12:59:31",
       "enumerator" => "natural",
       "translation_path" => "bank_slip.PersonType.natural"
     },
     "protocol_region" => nil,
     "paid_fine_amount" => nil,
     "beneficiary_account_branch" => "0001",
     "discounts" => [],
     "printing_policy" => %{
       "created_at" => "2019-03-12T12:59:31",
       "enumerator" => "no_printing",
       "translation_path" => "bank_slip.PrintingPolicy.no_printing"
     },
     "business_date_expiration" => "2022-01-17",
     "protest_status" => %{
       "created_at" => "2019-03-12T12:59:31",
       "enumerator" => "not_protested",
       "translation_path" => "bank_slip.ProtestStatus.not_protested"
     },
     "created_at" => "2021-08-12T22:33:27",
     "payer_branch_number" => nil,
     "beneficiary_name" => "XXX XXX XXX XXX",
     "lock_origin_type" => nil,
     "settlements" => [],
     "bank_slip_key" => "xxxxx",
     "protocol_date" => nil,
     "days_to_protest" => nil,
     "requester_profile" => 9,
     "paid_amount" => nil,
     "fine_percentage" => 2.0,
     "notary_office_protocol" => nil,
     "days_before_fine" => nil,
     "beneficiary_account_key" => "xxxxx",
     "original_expiration" => "2022-01-15",
     "tags" => "credit-operation",
     "automatic_bankruptcy_protest" => false,
     "billing_account_key" => "xxxxxx",
     "expenses" => [%{...}, ...],
     "document_number" => "8",
   },
   status: 200
 }}
```

## Contributing

Feedback, feature requests, and fixes are welcomed and encouraged.

1. Fork it (https://github.com/caiaffa/qitech_ex/fork)
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request

## License

This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details