You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

97 lines
4.8 KiB

  1. # -*- coding: utf-8 -*-
  2. from datetime import datetime
  3. from openerp import api, fields, models
  4. class account_invoice(models.Model):
  5. _inherit = 'account.invoice'
  6. subscription_request = fields.Many2one('subscription.request',
  7. string='Subscription request')
  8. release_capital_request = fields.Boolean(
  9. string='Release of capital request')
  10. @api.model
  11. def _prepare_refund(self, invoice, date_invoice=None, date=None,
  12. description=None, journal_id=None):
  13. values = super(account_invoice, self)._prepare_refund(
  14. invoice, date_invoice, date,
  15. description, journal_id)
  16. values['release_capital_request'] = self.release_capital_request
  17. return values
  18. def set_cooperator_effective(self, effective_date):
  19. # flag the partner as a effective member
  20. obj_sequence = self.env['ir.sequence']
  21. mail_template_name = 'Payment Received Confirmation - Send By Email'
  22. # if not yet cooperator we generate a cooperator number
  23. if self.partner_id.member is False and self.partner_id.old_member is False:
  24. sequence_id = obj_sequence.search([('name', '=', 'Subscription Register')])[0]
  25. sub_reg_num = sequence_id.next_by_id()
  26. self.partner_id.write({'member': True, 'old_member': False,
  27. 'cooperator_register_number': int(sub_reg_num)})
  28. elif self.partner_id.old_member:
  29. self.partner_id.write({'member': True, 'old_member': False})
  30. else:
  31. mail_template_name = 'Share Increase - Payment Received Confirmation - Send By Email'
  32. sequence_operation = obj_sequence.search([('name', '=', 'Register Operation')])[0]
  33. sub_reg_operation = sequence_operation.next_by_id()
  34. for line in self.invoice_line_ids:
  35. sub_reg = self.env['subscription.register'].create(
  36. {'name': sub_reg_operation,
  37. 'register_number_operation': int(sub_reg_operation),
  38. 'partner_id': self.partner_id.id,
  39. 'quantity': line.quantity,
  40. 'share_product_id': line.product_id.id,
  41. 'share_unit_price': line.price_unit,
  42. 'date': effective_date,
  43. 'type': 'subscription'})
  44. self.env['share.line'].create({'share_number': line.quantity,
  45. 'share_product_id': line.product_id.id,
  46. 'partner_id': self.partner_id.id,
  47. 'share_unit_price': line.price_unit,
  48. 'effective_date': effective_date})
  49. email_template_obj = self.env['mail.template']
  50. certificat_email_template = email_template_obj.search([('name', '=', mail_template_name)])[0]
  51. # we send the email with the certificat in attachment
  52. certificat_email_template.send_mail(self.partner_id.id, False)
  53. return True
  54. def post_process_confirm_paid(self, effective_date):
  55. self.set_cooperator_effective(effective_date)
  56. return True
  57. @api.multi
  58. def confirm_paid(self):
  59. for invoice in self:
  60. super(account_invoice, invoice).confirm_paid()
  61. # we check if there is an open refund for this invoice. in this case we
  62. # don't run the process_subscription function as the invoice has been
  63. # reconciled with a refund and not a payment.
  64. refund = self.search([('type', '=', 'out_refund'), ('origin', '=', invoice.number)]).filtered(lambda record: record.state == 'open')
  65. if invoice.partner_id.cooperator and invoice.release_capital_request \
  66. and invoice.type == 'out_invoice' and not refund:
  67. # take the effective date from the payment.
  68. # by default the confirmation date is the payment date
  69. effective_date = datetime.now().strftime("%d/%m/%Y")
  70. if invoice.payment_move_line_ids:
  71. move_line = invoice.payment_move_line_ids[0]
  72. effective_date = move_line.date
  73. invoice.subscription_request.state = 'paid'
  74. invoice.post_process_confirm_paid(effective_date)
  75. # if there is a open refund we mark the subscription as cancelled
  76. elif invoice.partner_id.cooperator and invoice.release_capital_request \
  77. and invoice.type == 'out_invoice' and refund:
  78. invoice.subscription_request.state = 'cancelled'
  79. return True