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.
 
 

289 lines
9.0 KiB

from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError,Warning
from psycopg2 import sql, DatabaseError
from werkzeug import utils
class opendons_payment_batch(models.Model):
_name = 'opendons_payment_batch'
_description = 'manage payment batch'
company_id = fields.Many2one(
"res.company",
string="Company",
ondelete="cascade",
default=lambda self: self.env.company,
)
payment_mode_id = fields.Many2one(
"account.payment.mode",
string="Payment Mode",
domain="[('company_id', '=', company_id), ('donation', '=', True)]",
copy=False,
tracking=True
)
product_id = fields.Many2one(
'product.product',
'Product',
domain=[('donation', '=', True)],
ondelete='restrict'
)
partner_id=fields.Many2one(
'res.partner',
string='Partner',
index=True,
track_visibility='onchange',
ondelete='restrict'
)
operation_id=fields.Many2one(
'opendons.operation',
string='Operation',
index=True,
domain=[('state', '=', 'exported')],
track_visibility='onchange',
ondelete='restrict'
)
segment_id=fields.Many2one(
'opendons.segment',
string='Segment',
index=True,
track_visibility='onchange',
ondelete='restrict'
)
donation_ids = fields.One2many(
'donation.donation',
'payment_batch_id',
string='donation',
track_visibility='onchange')
deposited_in_bank=fields.Boolean('deposited in bank')
bank_deposit_date=fields.Datetime(related='bankdeposit_id.create_date')
accounting_deposit_date=fields.Datetime(related='accountingdeposit_id.create_date')
bankdeposit_id = fields.Many2one(
'opendons.bankdeposit',
String='Bank deposit',
index=True,
readonly=True,
track_visibility='onchange',
)
accountingdeposit_id = fields.Many2one(
'opendons.accountingdeposit',
String='Accounting deposit',
index=True,
readonly=True,
track_visibility='onchange',
)
state = fields.Selection([
('draft', 'Draft'),
('validated', 'Validated'),
('deposited_in_bank', 'Deposited in bank'),
('deposited_in_accounting', 'Deposited in accounting')
],
string='State',
readonly=True,
copy=False,
default='draft',
index=True,
track_visibility='onchange'
)
def validate(self):
for payment in self:
vals = {'state': 'validated'}
payment.write(vals)
return
def validated2draft(self):
'''from Done state to Cancel state'''
for payment in self:
payment.state = 'draft'
@api.model
def _default_currency(self):
company = self.env['res.company']._company_default_get(
'donation.donation')
return company.currency_id
currency_id = fields.Many2one(
'res.currency',
string='Currency',
required=True,
states={'done': [('readonly', True)]},
track_visibility='onchange',
ondelete='restrict',
default=_default_currency
)
payment_count=fields.Integer(string='payments count', readonly=True,compute="_compute_total")
payment_input=fields.Char('Input field')
input_mode=fields.Selection([('manual','manual'),('loyalty','loyalty QRCODE'),('prospect','prospect QRCODE')])
assignment=fields.Selection([('single','single'),('multiple','multiple')])
donation_amount = fields.Monetary(
'Donation amount',
currency_field='currency_id',
)
company_id = fields.Many2one(
"res.company",
string="Company",
required=True,
default=lambda self: self.env.company
)
amount_total = fields.Monetary(
'Total amount',
currency_field='currency_id',compute="_compute_total"
)
@api.onchange('operation_id')
def _onchange_operation_id(self):
res = {}
res['domain']={'segment_id':[('operation_id', '=', self.operation_id.id)]}
return res
@api.onchange("payment_input")
def _onchange_payment_input(self):
if self.payment_input:
#si le QRCODE a déjà été utilisé, message d'avertissement
qrcode_exist=self.env['opendons.payment_batch_qrcode'].search([('qrcode','=',self.payment_input)])
if qrcode_exist : raise Warning('qrcode already used')
if self.input_mode=='loyalty':
inpt=self.payment_input.split(';')
if len(inpt)!=4:raise ValidationError('input string not valid')
partner_id=int(inpt[0])
key=inpt[1]
operation_id=int(inpt[2])
segment_id=int(inpt[3])
partner = self.env['res.partner'].sudo().search(['&',('id','=',int(partner_id)),('key','=',key)])
operation = self.env['res.partner'].sudo().search([('id','=',int(operation_id))])
segment = self.env['res.partner'].sudo().search([('id','=',int(segment_id))])
if not partner : ValidationError('partner not found')
if not operation : ValidationError('operation not found')
if not segment : ValidationError('segment not found')
self.partner_id=partner_id
self.operation_id=operation_id
self.segment_id=segment_id
res=self.action_add_payment()
if self.input_mode=='prospect':
inpt=self.payment_input.split(';')
if len(inpt)!=4:raise ValidationError('input string not valid')
partner_string=int(inpt[0])
key=inpt[1]
operation_id=int(inpt[2])
segment_id=int(inpt[3])
#partner = self.env['res.partner'].sudo().search(['&',('id','=',int(partner_id)),('key','=',key)])
operation = self.env['res.partner'].sudo().search([('id','=',int(operation_id))])
segment = self.env['res.partner'].sudo().search([('id','=',int(segment_id))])
#if not partner : ValidationError('partner not found')
if not operation : ValidationError('operation not found')
if not segment : ValidationError('segment not found')
#self.partner_id=partner_id
self.operation_id=operation_id
self.segment_id=segment_id
#res=self.action_ajouter_payment()
def action_add_payment(self):
vals={}
vals['payment_batch_id']=self.id
vals['payment_mode_id']=int(self.payment_mode_id)
vals['tax_receipt_option']='annual'
vals['partner_id']=self.partner_id.id
vals['operation_id']=self.operation_id.id
vals['segment_id']=self.segment_id.id
vals['donation_date']=fields.Date.context_today(self)
vals['check_total']=self.donation_amount
donation=self.env['donation.donation'].create(vals)
#creation de l'affectation du don si affectation simple
if self.assignment=='single':
vals={}
vals['donation_id']=donation.id
vals['currency_id']=self.currency_id
#vals['company_currency_id']=self.company_currency_id
vals['product_id']=self.product_id.id
vals['quantity']=1
vals['unit_price']=self.donation_amount
donation_line=self.env['donation.line'].create(vals)
donation.validate()
vals={}
vals['qrcode']=self.payment_input
self.env['opendons.payment_batch_qrcode'].create(vals)
# else:
# view_id = self.env.ref('donation.donation_form').id
# context = self._context.copy()
# return {
# 'name':'donation.form',
# 'view_type':'form',
# 'view_mode':'tree',
# 'views' : [(view_id,'form')],
# 'res_model':'donation.donation',
# 'view_id':view_id,
# 'type':'ir.actions.act_window',
# 'res_id':self.id,
# 'target':'new',
# 'context':context,
# }
return True
def _compute_total(self):
total=0
i=0
for donation_id in self.donation_ids:
for line in donation_id.line_ids:
line_total = line.quantity * line.unit_price
total += line_total
i=i+1
self.amount_total= total
self.payment_count= i
class opendons_payment_batch_qrcode(models.Model):
_name = 'opendons.payment_batch_qrcode'
_description = 'store qrcode to avoid duplicate entries'
qrcode=fields.Char('qrcode')