|
@@ -0,0 +1,77 @@
|
|
|
+#-*- coding:utf-8 -*-
|
|
|
+from openerp import models, api, _
|
|
|
+from openerp.exceptions import Warning
|
|
|
+from datetime import datetime, date
|
|
|
+
|
|
|
+
|
|
|
+class account_invoice(models.Model):
|
|
|
+ _inherit = "account.invoice"
|
|
|
+
|
|
|
+ def invoice_validate(self):
|
|
|
+ # self.check_limit()
|
|
|
+ self.check_morosidad()
|
|
|
+ return super(account_invoice, self).invoice_validate()
|
|
|
+
|
|
|
+ @api.one
|
|
|
+ def check_limit(self):
|
|
|
+
|
|
|
+ if self.order_policy == 'prepaid':
|
|
|
+ return True
|
|
|
+
|
|
|
+ # We sum from all the sale orders that are aproved, the sale order
|
|
|
+ # lines that are not yet invoiced
|
|
|
+ domain = [('order_id.partner_id', '=', self.partner_id.id),
|
|
|
+ ('invoiced', '=', False),
|
|
|
+ ('order_id.state', 'not in', ['draft', 'cancel', 'sent'])]
|
|
|
+ order_lines = self.env['sale.order.line'].search(domain)
|
|
|
+ none_invoiced_amount = sum([x.price_subtotal for x in order_lines])
|
|
|
+
|
|
|
+ # We sum from all the invoices that are in draft the total amount
|
|
|
+ domain = [
|
|
|
+ ('partner_id', '=', self.partner_id.id), ('state', '=', 'draft')]
|
|
|
+ draft_invoices = self.env['account.invoice'].search(domain)
|
|
|
+ draft_invoices_amount = sum([x.amount_total for x in draft_invoices])
|
|
|
+
|
|
|
+ available_credit = self.partner_id.credit_limit - \
|
|
|
+ self.partner_id.credit - \
|
|
|
+ none_invoiced_amount - draft_invoices_amount
|
|
|
+
|
|
|
+ if self.amount_total > available_credit:
|
|
|
+ msg = 'No se puede confirmar el Pedido ya que el cliente no tiene credito suficiente.\
|
|
|
+ Puede pasar la politica de facturación del pedido a "Pago antes de envío" en la \
|
|
|
+ pestaña "Otra información"'
|
|
|
+ raise Warning(_(msg))
|
|
|
+ return False
|
|
|
+ return True
|
|
|
+
|
|
|
+ @api.multi
|
|
|
+ def check_morosidad(self):
|
|
|
+ now = datetime.now()
|
|
|
+ hoy = datetime.strptime(now.strftime("%Y-%m-%d"),"%Y-%m-%d")
|
|
|
+ domain = [('id', '=', self.partner_id.id)]
|
|
|
+ partner = self.env['res.partner'].search(domain)
|
|
|
+ invoices = self.env['account.invoice'].search([('partner_id', '=',self.partner_id.id),('state', '=','open'),('type', '=', 'out_invoice'),('journal_id.type','=','sale')])
|
|
|
+ for item in invoices:
|
|
|
+ moveLine = self.env['account.move.line'].search([('move_id','=', item.move_id.id),('debit','>',0)])
|
|
|
+ if moveLine.date_maturity < now.strftime("%Y-%m-%d"):
|
|
|
+ vencimiento = datetime.strptime(moveLine.date_maturity,"%Y-%m-%d")
|
|
|
+ if (hoy-vencimiento).days > partner.morosidad:
|
|
|
+ raise Warning(_("El cliente %s tiene cuotas vencidas con más de %s días de atraso") % (partner.name, partner.morosidad))
|
|
|
+ return False
|
|
|
+ return True
|
|
|
+
|
|
|
+ @api.multi
|
|
|
+ def save_payments_invoice(self,values):
|
|
|
+ bank_payments_type_id = values['bankPayments']['bank_payments_type_id']
|
|
|
+ payment_type = self.env['res.bank.payments.type'].search([('id', '=', bank_payments_type_id)])
|
|
|
+ domain = [('id', '=', self.partner_id.id)]
|
|
|
+ partner = self.env['res.partner'].search(domain)
|
|
|
+ # import web_pdb; web_pdb.set_trace()
|
|
|
+ if payment_type.code == 'CH' and values['amountPayments'] > partner.check_limit:
|
|
|
+ # raise Warning(_("El monto a pagar excede el límite de crédito concedido en cheques"))
|
|
|
+ return {
|
|
|
+ 'process': False,
|
|
|
+ 'removeModal': False,
|
|
|
+ 'message' : "El monto a pagar excede el límite de crédito concedido en cheques"
|
|
|
+ }
|
|
|
+ return super(account_invoice, self).save_payments_invoice()
|