def action_synchronize_iugu(self): for partner in self: token = self.env.company.iugu_api_token iugu.config(token=token) iugu_customer_api = iugu.Customer() commercial_part = partner.commercial_partner_id # TODO Validar telefone e passar vals = { 'email': partner.email, 'name': commercial_part.l10n_br_legal_name or commercial_part.name, 'notes': commercial_part.comment or '', 'cpf_cnpj': commercial_part.l10n_br_cnpj_cpf, 'zip_code': re.sub('[^0-9]', '', commercial_part.zip or ''), 'number': commercial_part.l10n_br_number, 'street': commercial_part.street, 'city': commercial_part.city_id.name, 'state': commercial_part.state_id.code, 'district': commercial_part.l10n_br_district or '', 'complement': commercial_part.street2 or '', } if not partner.iugu_id: data = iugu_customer_api.create(vals) if "errors" in data: msg = "\n".join( ["A integração com IUGU retornou os seguintes erros"] + [ "Field: %s %s" % (x[0], x[1][0]) for x in data['errors'].items() ]) raise UserError(msg) partner.iugu_id = data['id'] else: iugu_customer_api.change(partner.iugu_id, vals)
def action_change_invoice_iugu(self): if self.move_line_id.reconciled: raise UserError('O pagamento já está reconciliado') if self.date_change: token = self.env.company.iugu_api_token iugu.config(token=token) iugu_invoice_api = iugu.Invoice() data = iugu_invoice_api.duplicate( self.move_line_id.iugu_id, { 'due_date': self.date_change.strftime('%Y-%m-%d'), 'email': self.move_line_id.invoice_id.partner_id.email, }) if "errors" in data: msg = "\n".join( ["A integração com IUGU retornou os seguintes erros"] + ["%s" % data['errors']]) raise UserError(msg) self.move_line_id.write({ 'date_maturity': self.date_change, 'iugu_id': data['id'], 'iugu_secure_payment_url': data['secure_url'], 'iugu_digitable_line': data['bank_slip']['digitable_line'], 'iugu_barcode_url': data['bank_slip']['barcode'], })
def cancel_transaction_in_iugu(self): if not self.acquirer_reference: raise UserError('Esta parcela não foi enviada ao IUGU') token = self.env.company.iugu_api_token iugu.config(token=token) iugu_invoice_api = iugu.Invoice() iugu_invoice_api.cancel(self.acquirer_reference)
def action_cancel(self): res = super(SaleOrder, self).action_cancel() for order in self: for transaction_id in order.transaction_ids: if (transaction_id and transaction_id.acquirer_id.provider == "iugu"): iugu.config(token=transaction_id.acquirer_id.iugu_api_key) invoice_api = iugu.Invoice() invoice_api.cancel(transaction_id.acquirer_reference) return res
def action_verify_iugu_payment(self): if self.iugu_id: token = self.env.user.company_id.iugu_api_token iugu.config(token=token) iugu_invoice_api = iugu.Invoice() data = iugu_invoice_api.search(self.iugu_id) if "errors" in data: raise UserError(data['errors']) if data.get('status', '') == 'paid' and not self.reconciled: self.iugu_status = data['status'] self.action_mark_paid_iugu(data) else: self.iugu_status = data['status'] else: raise UserError('Esta parcela não foi enviada ao IUGU')
def action_verify_transaction(self): if self.acquirer_id.provider != 'iugu': return if not self.acquirer_reference: raise UserError('Esta transação não foi enviada a nenhum gateway de pagamento') token = self.env.company.iugu_api_token iugu.config(token=token) iugu_invoice_api = iugu.Invoice() data = iugu_invoice_api.search(self.acquirer_reference) if "errors" in data: raise UserError(data['errors']) if data.get('status', '') == 'paid' and self.state not in ('done', 'authorized'): self._set_transaction_done() self._post_process_after_done() if self.origin_move_line_id: self.origin_move_line_id._create_bank_tax_move( (data.get('taxes_paid_cents') or 0) / 100) else: self.iugu_status = data['status']
def iugu_form_generate_values(self, values): """ Função para gerar HTML POST do Iugu """ base_url = ( self.env["ir.config_parameter"].sudo().get_param("web.base.url") ) partner_id = values.get('billing_partner') items = [{ "description": 'Fatura Ref: %s' % values.get('reference'), "quantity": 1, "price_cents": int(values.get('amount') * 100), }] today = datetime.date.today() invoice_data = { "email": partner_id.email, "due_date": today.strftime("%d/%m/%Y"), "return_url": urls.url_join(base_url, "/payment/process"), "notification_url": urls.url_join( # ngrok_url base_url, "/iugu/notificacao/" ), "items": items, "payer": { "name": partner_id.name, "cpf_cnpj": partner_id.cnpj_cpf, "address": { "street": partner_id.street, "city": partner_id.city_id.name, "number": partner_id.number, "zip_code": re.sub('[^0-9]', '', partner_id.zip or ''), }, }, } iugu.config(token=self.iugu_api_key) invoice = iugu.Invoice() result = invoice.create(invoice_data) if "errors" in result: if isinstance(result["errors"], str): msg = result['errors'] else: msg = "\n".join( ["A integração com IUGU retornou os seguintes erros"] + ["Field: %s %s" % (x[0], x[1][0]) for x in result['errors'].items()]) raise UserError(msg) acquirer_reference = result.get("id") payment_transaction_id = self.env['payment.transaction'].search( [("reference", "=", values['reference'])]) payment_transaction_id.write({ "acquirer_reference": acquirer_reference, "invoice_url": result['secure_url'], }) url = result.get("secure_url") return { "checkout_url": urls.url_join(base_url, "/iugu/checkout/redirect"), "secure_url": url }
def send_information_to_iugu(self): if not self.payment_journal_id.receive_by_iugu: return base_url = ( self.env["ir.config_parameter"].sudo().get_param("web.base.url")) token = self.env.user.company_id.iugu_api_token iugu.config(token=token) iugu_invoice_api = iugu.Invoice() for moveline in self.receivable_move_line_ids: self.partner_id.action_synchronize_iugu() iugu_p = self.env['payment.acquirer'].search([('provider', '=', 'iugu')]) transaction = self.env['payment.transaction'].create({ 'acquirer_id': iugu_p.id, 'amount': moveline.amount_residual, 'currency_id': moveline.move_id.currency_id.id, 'partner_id': moveline.partner_id.id, 'type': 'server2server', 'date_maturity': moveline.date_maturity, 'origin_move_line_id': moveline.id, 'invoice_ids': [(6, 0, self.ids)] }) vals = { 'email': self.partner_id.email, 'due_date': moveline.date_maturity.strftime('%Y-%m-%d'), 'ensure_workday_due_date': True, 'items': [{ 'description': 'Fatura Ref: %s' % moveline.name, 'quantity': 1, 'price_cents': int(moveline.amount_residual * 100), }], 'return_url': '%s/my/invoices/%s' % (base_url, self.id), 'notification_url': '%s/iugu/webhook?id=%s' % (base_url, self.id), 'fines': True, 'late_payment_fine': 2, 'per_day_interest': True, 'customer_id': self.partner_id.iugu_id, 'early_payment_discount': False, 'order_id': transaction.reference, } data = iugu_invoice_api.create(vals) if "errors" in data: if isinstance(data['errors'], str): raise UserError('Erro na integração com IUGU:\n%s' % data['errors']) msg = "\n".join( ["A integração com IUGU retornou os seguintes erros"] + [ "Field: %s %s" % (x[0], x[1][0]) for x in data['errors'].items() ]) raise UserError(msg) transaction.write({ 'acquirer_reference': data['id'], 'transaction_url': data['secure_url'], }) moveline.write({ 'iugu_id': data['id'], 'iugu_secure_payment_url': data['secure_url'], 'iugu_digitable_line': data['bank_slip']['digitable_line'], 'iugu_barcode_url': data['bank_slip']['barcode'], })
import iugu api = iugu.config(token='39B1841C-3940-49D5-9F5FA2596755629D') iugu_token_api = iugu.Token() items = [ { 'description': 'Item 1', 'quantity': 1, 'price_cents': 1000 }, { 'description': 'Item 2', 'quantity': 1, 'price_cents': 2000 }, ] content = iugu_token_api.charge({ 'customer_payment_method_id': '4111111111111111', 'email': '*****@*****.**', 'test': 'true', 'items': items }) print(content)