from odoo import fields, models,api,_
|
|
from odoo.exceptions import UserError, ValidationError, Warning
|
|
from datetime import datetime,date
|
|
import os,secrets
|
|
import decimal
|
|
import base64
|
|
import logging
|
|
import json
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
code_journal='IN'
|
|
date_compta=fields.datetime.now()
|
|
total_debit=total_credit=0
|
|
no_mvt=1
|
|
|
|
class AccountingFileWizard(models.TransientModel):
|
|
_name = 'accounting.file.wizard'
|
|
_description = 'accounting file wizard'
|
|
|
|
start_date=fields.Datetime('start date',required=True,default=lambda self: self._compute_start_date())
|
|
|
|
def _compute_start_date(self):
|
|
date_max=[]
|
|
#recherche de la date d'export d'écriture la plus récente
|
|
query="select max(date_compta) as date_compta from donation_donation"
|
|
self._cr.execute(query)
|
|
query_res = self._cr.dictfetchall()
|
|
for r in query_res:
|
|
d_date_compta=r['date_compta']
|
|
if d_date_compta: date_max.append(d_date_compta)
|
|
|
|
query="select max(date_compta) as date_compta from kalachakra_membership"
|
|
self._cr.execute(query)
|
|
query_res = self._cr.dictfetchall()
|
|
for r in query_res:
|
|
m_date_compta=r['date_compta']
|
|
if m_date_compta: date_max.append(m_date_compta)
|
|
|
|
query="select max(date_compta) as date_compta from event_registration"
|
|
self._cr.execute(query)
|
|
query_res = self._cr.dictfetchall()
|
|
for r in query_res:
|
|
e_date_compta=r['date_compta']
|
|
if e_date_compta: date_max.append(e_date_compta)
|
|
|
|
|
|
if date_max: return max(date_max)
|
|
else: return fields.Date.context_today(self)
|
|
|
|
|
|
|
|
#accounting_date=fields.Date(string='Accounting date',required=True)
|
|
|
|
def action_create_accounting_file(self):
|
|
global total_debit
|
|
global total_credit
|
|
total_debit=0
|
|
total_credit=0
|
|
|
|
#debug
|
|
donation=self.env['donation.donation'].search([])
|
|
for d in donation:
|
|
d.date_compta=False
|
|
membership=self.env['kalachakra.membership'].search([])
|
|
for m in membership:
|
|
m.date_compta=False
|
|
reg=self.env['event.registration'].search([])
|
|
for r in reg:
|
|
r.date_compta=False
|
|
r.date_compta_down_payment=False
|
|
|
|
|
|
tmstp=secrets.token_hex(16)
|
|
filename='/tmp/accounting_file_'+tmstp+'.txt'
|
|
f = open(filename, "a")
|
|
|
|
|
|
#N° mouvement 1-5
|
|
#Code du journal "IN" 6-7
|
|
#Date 8-17 (10 cars) ex:01/04/2022
|
|
#N° de compte 18-23 (6 cars)
|
|
#Libellé 24- (12+ 13 cars) 12:Initial prénom+nom 13:lib evt exemple :E Meurinne Besoins cent
|
|
#Débit ex: 200,00
|
|
#Crédit ex : 200,00
|
|
#N° de pièce: ref transaction , ex: txD-457
|
|
|
|
|
|
fic_line="N° mouvement;Code du journal;Date;N° de compte;Libellé;Débit;Crédit;N° de pièce"+"\n"
|
|
f.write(fic_line)
|
|
|
|
|
|
self.donation_lines(f)
|
|
self.membership_lines(f)
|
|
self.event_lines(f)
|
|
self.booking_event_lines(f)
|
|
fic_line="TOTAL_DEBIT="+str(total_debit)+ " TOTAL CREDIT="+str(total_credit)
|
|
f.write(fic_line)
|
|
|
|
f.close
|
|
f = open(filename, "r")
|
|
data = str.encode(f.read(), 'utf-8')
|
|
#raise UserError('gg'+f.read())
|
|
vals={}
|
|
vals['accounting_file']=base64.encodebytes(data)
|
|
vals['document_fname']='export_comptable.txt'
|
|
vals['exported_date']=fields.Date.context_today(self)
|
|
res=self.env['accounting.file'].create(vals)
|
|
f.close
|
|
os.unlink(filename)
|
|
|
|
#display account deposit
|
|
return {
|
|
'name': 'Account deposit form',
|
|
'view_type': 'form',
|
|
'view_mode': 'form',
|
|
'res_model': 'accounting.file',
|
|
'res_id': int(res.id),
|
|
'type': 'ir.actions.act_window',
|
|
'target': 'current'
|
|
}
|
|
|
|
|
|
#rajouter en fin de fichier un total DEBIT et un total CREDIT
|
|
|
|
f.close
|
|
|
|
#création de l'export en base
|
|
vals={}
|
|
|
|
|
|
f = open(filename, "r")
|
|
data = str.encode(f.read(), 'utf-8')
|
|
|
|
vals['accounting_file']=base64.encodebytes(data)
|
|
vals['document_fname']='export_comptable.csv'
|
|
vals['exported_date']=fields.Date.context_today(self)
|
|
res=self.env['accounting.file'].create(vals)
|
|
|
|
f.close
|
|
os.unlink(filename)
|
|
|
|
#affichage de l'export
|
|
|
|
return {
|
|
'name': 'Account file form',
|
|
'view_type': 'form',
|
|
'view_mode': 'form',
|
|
'res_model': 'accounting.file',
|
|
'res_id': int(res.id),
|
|
'type': 'ir.actions.act_window',
|
|
'target': 'current'
|
|
}
|
|
|
|
return True
|
|
def donation_lines(self,f):
|
|
global total_debit
|
|
global total_credit
|
|
global no_mvt
|
|
#écritures pour les dons validés (donc payés), non déjà exportés
|
|
donation=self.env['donation.donation'].search([('date_compta','=',False),('state','=','done')])
|
|
#raise UserError(donation)
|
|
for d in donation:
|
|
if datetime(d.donation_date.year, d.donation_date.month, d.donation_date.day)<self.start_date:continue
|
|
#on ne prend pas en compte les dons liés à une retraite
|
|
#car traité avec les retraites
|
|
if d.invoice_id: continue
|
|
d.date_compta=date_compta
|
|
#if not d.payment_mode_id: raise UserError(_("no payment mode found for donation %r ",donation.number))
|
|
#if not d.payment_mode_id.fixed_journal_id: raise UserError(_("no account found for payment mode %r",d.payment_mode_id.name))
|
|
account_debit_number=self._file_format(str(d.payment_mode_id.fixed_journal_id.default_account_id.code),6)
|
|
if d.transaction_id.acquirer_id.name=='Paypal':
|
|
|
|
account_debit_number=self._file_format(str(self.env['account.payment.mode'].search([('name','=','Paypal')]).fixed_journal_id.default_account_id.code),6)
|
|
|
|
firstname=d.partner_id.firstname
|
|
name=d.partner_id.name
|
|
if not name : name='N/A'
|
|
if not firstname: firstname=' '
|
|
lib1=firstname[0]+' '+name
|
|
|
|
lib1=self._file_format(lib1,12)
|
|
#lib1=lib1[11]
|
|
|
|
date_line=self._date_format(d.donation_date)
|
|
#recherche de la transaction
|
|
lib_piece=self._file_format(d.number,20)
|
|
pt=self.env['payment.transaction'].search([('donation_ids','in',d.id)],limit=1)
|
|
if pt: lib_piece=pt.reference
|
|
|
|
for line in d.line_ids:
|
|
affectation=line.product_id.name
|
|
amount=line.amount
|
|
#if not line.product_id.property_account_income_id: raise UserError(_("no credit account found for product %r",line.product_id.name))
|
|
account_credit_number=self._file_format(line.product_id.property_account_income_id.code,6)
|
|
|
|
break
|
|
#credit line
|
|
lib2=self._file_format(affectation,13)
|
|
lib=lib1+' '+lib2
|
|
debit=''
|
|
credit=str(amount)
|
|
total_credit+=amount
|
|
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+account_credit_number+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
no_mvt+=1
|
|
#debit line
|
|
debit=str(amount)
|
|
credit=''
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+account_debit_number+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
total_debit+=amount
|
|
no_mvt+=1
|
|
return no_mvt
|
|
def membership_lines(self,f):
|
|
global total_debit
|
|
global total_credit
|
|
global no_mvt
|
|
#écritures pour les ADHESIONS réglées non déjà exportés
|
|
membership=self.env['kalachakra.membership'].search([('date_compta','=',False),('state','=','done')])
|
|
for m in membership:
|
|
m.date_compta=date_compta
|
|
if datetime(m.start_date.year,m.start_date.month,m.start_date.day)<self.start_date:continue
|
|
#on ne prend pas en compte les adhésions liés à une retraite
|
|
#car traité avec les retraites
|
|
if m.balance_invoice_id: continue
|
|
if m.invoice_id:
|
|
reg=self.env['event.registration'].search([('invoice_id','=',int(m.invoice_id))])
|
|
if reg:
|
|
if reg.event_id.booking_event:continue
|
|
#si adhésion pas liée à une facture ou à une transaction, on ne prend pas
|
|
if not m.invoice_id and not m.transaction_id : continue
|
|
|
|
if m.transaction_id.acquirer_id.name=='Paypal':
|
|
|
|
account_debit_number=self._file_format(str(self.env['account.payment.mode'].search([('name','=','Paypal')]).fixed_journal_id.default_account_id.code),6)
|
|
else:
|
|
account_debit_number=self._file_format(str(self.env['account.payment.mode'].search([('name','=','CB')]).fixed_journal_id.default_account_id.code),6)
|
|
|
|
|
|
if m.invoice_id:
|
|
#if not m.invoice_id.payment_mode_id.fixed_journal_id: raise UserError(_("no account found for payment mode %r",d.payment_mode_id.name))
|
|
account_debit_number=self._file_format(str(m.invoice_id.payment_mode_id.fixed_journal_id.default_account_id.code),6)
|
|
|
|
firstname=m.partner_id.firstname
|
|
name=m.partner_id.name
|
|
if not name : name='N/A'
|
|
if not firstname: firstname=' '
|
|
lib1=firstname[0]+' '+name
|
|
lib1=self._file_format(lib1,12)
|
|
date_line=self._date_format(m.start_date)
|
|
amount=m.amount
|
|
#if not m.product_id.property_account_income_id: raise UserError(_("no credit account found for product %r",m.product_id.name))
|
|
account_credit_number=self._file_format('756100',6)
|
|
affectation=m.product_id.name
|
|
|
|
#lib pièce
|
|
if m.transaction_id:
|
|
lib_piece=self._file_format(m.transaction_id.reference,20)
|
|
elif m.invoice_id:
|
|
lib_piece=self._file_format(m.invoice_id.name,20)
|
|
else:
|
|
lib_piece=self._file_format(m.partner_id.name,20)
|
|
|
|
#credit line
|
|
lib2=self._file_format(affectation,13)
|
|
lib=lib1+' '+lib2
|
|
debit=''
|
|
credit=str(amount)
|
|
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+account_credit_number+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
no_mvt+=1
|
|
total_credit+=amount
|
|
#debit line
|
|
debit=str(amount)
|
|
credit=''
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+account_debit_number+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
no_mvt+=1
|
|
total_debit+=amount
|
|
return no_mvt
|
|
def event_lines(self,f):
|
|
global total_debit
|
|
global total_credit
|
|
global no_mvt
|
|
|
|
#écritures pour les inscriptions évts hors RETRAITES avec facture payée non déjà exportés
|
|
|
|
|
|
registration=self.env['event.registration'].search([('date_compta','=',False),('payment_status','=','paid'),('event_id.booking_event','=',False),('event_id.individual_booking_event','=',False)])
|
|
if registration:
|
|
for reg in registration:
|
|
membership_credit_line=False
|
|
membership_amount=0
|
|
reg.date_compta=date_compta
|
|
#if not reg.invoice_id.payment_mode_id.fixed_journal_id: raise UserError(_("no account found for payment mode %r",reg.invoice_id.payment_mode_id))
|
|
account_debit_number=self._file_format(str(reg.invoice_id.payment_mode_id.fixed_journal_id.default_account_id.code),6)
|
|
if not reg.invoice_id.payment_mode_id :
|
|
account_debit_number=self._file_format(str(self.env['account.payment.mode'].search([('name','=','Espèces')]).fixed_journal_id.default_account_id.code),6)
|
|
trans=self.env['payment.transaction'].search([('invoice_ids','in',reg.invoice_id.id),('state','=','done')],limit=1)
|
|
if trans:
|
|
if trans.acquirer_id.name=='Paypal':
|
|
|
|
account_debit_number=self._file_format(str(self.env['account.payment.mode'].search([('name','=','Paypal')]).fixed_journal_id.default_account_id.code),6)
|
|
|
|
firstname=reg.partner_id.firstname
|
|
name=reg.partner_id.name
|
|
if not name : name='N/A'
|
|
if not firstname: firstname=' '
|
|
lib1=firstname[0]+' '+name
|
|
lib1=self._file_format(lib1,12)
|
|
#date du paiement
|
|
|
|
if self._payment_date_date(reg.invoice_id):continue
|
|
date_line=self._payment_date(reg.invoice_id)
|
|
|
|
if reg.invoice_id.amount_total==0: continue
|
|
if reg.invoice_id.payment_state!='paid': continue
|
|
amount=reg.invoice_id.amount_total
|
|
#if not reg.event_id.participation_product_id: raise UserError(_("no credit account found for product %r",reg.event_id.participation_product_id.name))
|
|
account_credit_number=self._file_format(reg.event_id.participation_product_id.property_account_income_id.code,6)
|
|
if not reg.event_id.participation_product_id.property_account_income_id.code:
|
|
account_credit_number=self._file_format('754700',6)
|
|
affectation=reg.event_id.participation_product_id.name
|
|
|
|
#recherche d'une l'adhésion
|
|
membership_credit_line=False
|
|
membership=self.env['kalachakra.membership'].search([('invoice_id','=',int(reg.invoice_id))])
|
|
if membership:
|
|
membership_credit_line=True
|
|
membership_amount=membership.amount
|
|
|
|
#si facture liée à une transaction:
|
|
trans=self.env['payment.transaction'].search([('invoice_ids','in',reg.invoice_id.id),('state','=','done')],limit=1)
|
|
if trans:
|
|
lib_piece=self._file_format(trans.reference,20)
|
|
else:
|
|
lib_piece=self._file_format(reg.invoice_id.name,20)
|
|
#credit line
|
|
lib2=self._file_format(affectation,13)
|
|
lib=lib1+' '+lib2
|
|
debit=''
|
|
credit=str(amount-membership_amount)
|
|
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+account_credit_number+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
no_mvt+=1
|
|
total_credit+=amount
|
|
#debit line
|
|
debit=str(amount-membership_amount)
|
|
credit=''
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+account_debit_number+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
no_mvt+=1
|
|
total_debit+=amount
|
|
return no_mvt
|
|
def booking_event_lines(self,f):
|
|
global total_debit
|
|
global total_credit
|
|
global no_mvt
|
|
#écritures pour les inscription aux RETRAITES avec facture acomptes payés + factures soldes payés non déjà exporté
|
|
registration=self.env['event.registration'].search([])
|
|
|
|
for reg in registration:
|
|
if reg.event_id.booking_event:
|
|
#_logger.error('acompte:'+str(reg.down_payment_invoice_id.payment_state)+' solde :'+str(reg.balance_invoice_id.payment_state)+' date_compta'+str(reg.date_compta)+' date_compta_down_payment:'+str(reg.date_compta_down_payment))
|
|
membership_amount=0
|
|
donation_amount=0
|
|
membership_credit_line=False
|
|
donation_credit_line=False
|
|
|
|
#if not reg.event_id.participation_product_id.property_account_income_id: raise UserError(_("no credit account found for product %r",reg.event_id.participation_product_id.name))
|
|
account_credit_number=self._file_format('170000',6)
|
|
|
|
firstname=reg.partner_id.firstname
|
|
name=reg.partner_id.name
|
|
if not name : name='N/A'
|
|
if not firstname: firstname=' '
|
|
lib1=firstname[0]+' '+name
|
|
lib1=self._file_format(lib1,12)
|
|
lib2=self._file_format(reg.event_id.booking_product_id.name,13)
|
|
lib=lib1+' '+lib2
|
|
|
|
#si pas de facture d'acompte et facture payée:
|
|
if not reg.down_payment_invoice_id and reg.invoice_id.payment_state=='paid' and reg.date_compta==False :
|
|
_logger.error('CC1')
|
|
reg.date_compta=date_compta
|
|
case_line=1
|
|
down_payment=False
|
|
balance_payment=False
|
|
#if not reg.invoice_id.payment_mode_id.fixed_journal_id: raise UserError(_("no account found payment mode %r",reg.invoice_id.payment_mode_id.name))
|
|
account_debit_number=self._file_format(str(reg.invoice_id.payment_mode_id.fixed_journal_id.default_account_id.code),6)
|
|
trans=self.env['payment.transaction'].search([('invoice_ids','in',reg.invoice_id.id),('state','=','done')],limit=1)
|
|
if trans and trans.acquirer_id.name=='Paypal':
|
|
|
|
account_debit_number=self._file_format(str(self.env['account.payment.mode'].search([('name','=','Paypal')]).fixed_journal_id.default_account_id.code),6)
|
|
|
|
#recherche de l'adhésion
|
|
membership_credit_line=False
|
|
membership=self.env['kalachakra.membership'].search([('invoice_id','=',int(reg.invoice_id))])
|
|
if membership:
|
|
membership_credit_line=True
|
|
membership_amount=membership.amount
|
|
|
|
#recherche de dons
|
|
donation_credit_line=False
|
|
donations=donation_booking=self.env['donation.donation'].search([('invoice_id','=',int(reg.invoice_id))])
|
|
if donations:
|
|
donation_credit_line=True
|
|
for d in donations:
|
|
donation_amount+=d.amount_total
|
|
if self._payment_date_date(reg.invoice_id):continue
|
|
|
|
date_line=self._payment_date(reg.invoice_id)
|
|
|
|
trans=self.env['payment.transaction'].search([('state','=','done'),('invoice_ids','in',reg.invoice_id.id)],limit=1)
|
|
|
|
#si facture d'acompte payée et solde payée et pas encore exportée :
|
|
elif reg.down_payment_invoice_id.payment_state=='paid' and reg.balance_invoice_id.payment_state=='paid' and not reg.date_compta_down_payment and not reg.date_compta :
|
|
_logger.error('CC2 '+'date_compta='+str(reg.date_compta)+' date_compta_down_payment='+str(reg.date_compta_down_payment))
|
|
case_line=2
|
|
reg.date_compta=date_compta
|
|
down_payment=True
|
|
balance_payment=True
|
|
membership_amount=0
|
|
donation_amount=0
|
|
membership_credit_line=False
|
|
donation_credit_line=False
|
|
#if not reg.down_payment_invoice_id.payment_mode_id.fixed_journal_id: raise UserError(_("no account found payment mode %r",reg.down_payment_invoice_id.payment_mode_id.name))
|
|
account_debit_number=self._file_format(str(reg.down_payment_invoice_id.payment_mode_id.fixed_journal_id.default_account_id.code),6)
|
|
|
|
trans=self.env['payment.transaction'].search([('invoice_ids','in',reg.down_payment_invoice_id.id),('state','=','done')],limit=1)
|
|
if trans and trans.acquirer_id.name=='Paypal': account_debit_number=self._file_format(str(self.env['account.payment.mode'].search([('name','=','Paypal')]).fixed_journal_id.default_account_id.code),6)
|
|
|
|
amount=reg.down_payment_invoice_id.amount_total+reg.balance_invoice_id.amount_total
|
|
|
|
if self._payment_date_date(reg.balance_invoice_id):continue
|
|
date_line=self._payment_date(reg.balance_invoice_id)
|
|
|
|
#recherche de l'adhésion
|
|
|
|
membership=self.env['kalachakra.membership'].search([('balance_invoice_id','=',int(reg.balance_invoice_id))])
|
|
if membership:
|
|
membership_credit_line=True
|
|
membership_amount=membership.amount
|
|
|
|
|
|
#recherche de dons
|
|
donation_credit_line=False
|
|
donations=donation_booking=self.env['donation.donation'].search([('invoice_id','=',int(reg.balance_invoice_id))])
|
|
if donations:
|
|
donation_credit_line=True
|
|
for d in donations:
|
|
donation_amount=donation_amount+d.amount_total
|
|
|
|
trans=self.env['payment.transaction'].search([('state','=','done'),('invoice_ids','in',reg.down_payment_invoice_id.id)],limit=1)
|
|
|
|
#si facture d'acompte payée pas encore exporté et solde non payée :
|
|
elif reg.down_payment_invoice_id.payment_state=='paid' and not reg.date_compta_down_payment and reg.balance_invoice_id.payment_state!='paid':
|
|
_logger.error('CC3')
|
|
case_line=3
|
|
reg.date_compta_down_payment=date_compta
|
|
down_payment=True
|
|
balance_payment=False
|
|
donation_credit_line=False
|
|
membership_credit_line=False
|
|
#if not reg.down_payment_invoice_id.payment_mode_id.fixed_journal_id: raise UserError(_("no account found payment mode %r",reg.down_payment_invoice_id.payment_mode_id.name))
|
|
account_debit_number=self._file_format(str(reg.down_payment_invoice_id.payment_mode_id.fixed_journal_id.default_account_id.code),6)
|
|
trans=self.env['payment.transaction'].search([('invoice_ids','in',reg.down_payment_invoice_id.id),('state','=','done')],limit=1)
|
|
if trans and trans.acquirer_id.name=='Paypal': account_debit_number=self._file_format(str(self.env['account.payment.mode'].search([('name','=','Paypal')]).fixed_journal_id.default_account_id.code),6)
|
|
|
|
amount=reg.down_payment_invoice_id.amount_total
|
|
if self._payment_date_date(reg.down_payment_invoice_id):continue
|
|
date_line=self._payment_date(reg.down_payment_invoice_id)
|
|
|
|
trans=self.env['payment.transaction'].search([('state','=','done'),('invoice_ids','in',reg.down_payment_invoice_id.id)],limit=1)
|
|
#si facture d'acompte payée et exporté et solde payée pas exporté :
|
|
elif reg.down_payment_invoice_id.payment_state=='paid' and reg.balance_invoice_id.payment_state=='paid' and reg.date_compta_down_payment and not reg.date_compta:
|
|
_logger.error('CC4')
|
|
case_line=4
|
|
reg.date_compta=date_compta
|
|
down_payment=False
|
|
balance_payment=True
|
|
#if not reg.balance_invoice_id.payment_mode_id.fixed_journal_id: raise UserError(_("no account found payment mode %r",reg.balance_invoice_id.payment_mode_id.name))
|
|
account_debit_number=self._file_format(str(reg.down_payment_invoice_id.payment_mode_id.fixed_journal_id.default_account_id.code),6)
|
|
trans=self.env['payment.transaction'].search([('invoice_ids','in',reg.down_payment_invoice_id.id),('state','=','done')],limit=1)
|
|
if trans and trans.acquirer_id.name=='Paypal': account_debit_number=self._file_format(str(self.env['account.payment.mode'].search([('name','=','Paypal')]).fixed_journal_id.default_account_id.code),6)
|
|
|
|
if self._payment_date_date(reg.balance_invoice_id):continue
|
|
date_line=self._payment_date(reg.balance_invoice_id)
|
|
|
|
|
|
#recherche de l'adhésion
|
|
membership_credit_line=False
|
|
membership=self.env['kalachakra.membership'].search([('balance_invoice_id','=',int(reg.balance_invoice_id))])
|
|
if membership:
|
|
membership_credit_line=True
|
|
membership_amount=membership.amount
|
|
|
|
#recherche de dons
|
|
donation_credit_line=False
|
|
donations=donation_booking=self.env['donation.donation'].search([('invoice_id','=',int(reg.balance_invoice_id))])
|
|
if donations:
|
|
donation_credit_line=True
|
|
for d in donations:
|
|
amount_donation=amount_donation+donations.amount_total
|
|
trans=self.env['payment.transaction'].search([('state','=','done'),('invoice_ids','in',reg.balance_invoice_id.id)],limit=1)
|
|
|
|
|
|
|
|
else: continue
|
|
|
|
if trans:
|
|
lib_piece=self._file_format(trans.reference,20)
|
|
else:
|
|
if case_line==1:lib_piece=self._file_format(reg.invoice_id.name,20)
|
|
if case_line==2:lib_piece=self._file_format(reg.balance_invoice_id.name,20)
|
|
if case_line==3:lib_piece=self._file_format(reg.down_payment_invoice_id.name,20)
|
|
if case_line==4:lib_piece=self._file_format(reg.balance_invoice_id.name,20)
|
|
|
|
|
|
#debit line
|
|
if case_line==1:amount=reg.invoice_id.amount_total
|
|
if case_line==2:amount=reg.down_payment_invoice_id.amount_total+reg.balance_invoice_id.amount_total
|
|
if case_line==3:amount=reg.down_payment_invoice_id.amount_total
|
|
if case_line==4:amount=reg.balance_invoice_id.amount_total
|
|
if amount==0: continue
|
|
credit=''
|
|
debit=str(amount)
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+account_debit_number+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
no_mvt=no_mvt+1
|
|
total_debit+=amount
|
|
|
|
|
|
#credit(s) line(s)
|
|
#participation credit line
|
|
if not amount: amount=0
|
|
if case_line==1:
|
|
amount=amount-membership_amount-donation_amount
|
|
debit=''
|
|
credit=str(amount)
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+account_credit_number+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
no_mvt=no_mvt+1
|
|
total_credit+=amount
|
|
if case_line==2:
|
|
amount=reg.down_payment_invoice_id.amount_total
|
|
debit=''
|
|
credit=str(amount)
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+account_credit_number+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
no_mvt=no_mvt+1
|
|
total_credit+=amount
|
|
|
|
amount=float(reg.balance_invoice_id.amount_total)-float(membership_amount)-float(donation_amount)
|
|
debit=''
|
|
credit=str(amount)
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+account_credit_number+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
no_mvt=no_mvt+1
|
|
total_credit+=amount
|
|
if case_line==3:
|
|
amount=reg.down_payment_invoice_id.amount_total
|
|
debit=''
|
|
credit=str(amount)
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+account_credit_number+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
no_mvt=no_mvt+1
|
|
total_credit+=amount
|
|
if case_line==4:
|
|
amount=reg.balance_invoice_id.amount_total-membership_amount-donation_amount
|
|
debit=''
|
|
credit=str(amount)
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+account_credit_number+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
no_mvt=no_mvt+1
|
|
total_credit+=amount
|
|
|
|
|
|
|
|
if membership_credit_line:
|
|
debit=''
|
|
credit=str(membership_amount)
|
|
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+self._file_format('756100',6)+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
no_mvt=no_mvt+1
|
|
total_credit+=membership_amount
|
|
|
|
if donation_credit_line:
|
|
for d in donations :
|
|
debit=''
|
|
amount=d.amount_total
|
|
credit=str(amount)
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+account_credit_number+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
no_mvt=no_mvt+1
|
|
total_credit+=amount
|
|
|
|
#écritures pour la facture complémentaire
|
|
if reg.end_of_stay_invoice_id and reg.end_of_stay_invoice_id.payment_state=='paid' :
|
|
if self._payment_date_date(reg.end_of_stay_invoice_id):continue
|
|
date_line=self._payment_date(reg.end_of_stay_invoice_id)
|
|
#écriture de débit
|
|
amount=reg.end_of_stay_invoice_id.amount_total
|
|
if amount==0: continue
|
|
debit=str(amount)
|
|
credit=''
|
|
lib_piece=self._file_format(reg.end_of_stay_invoice_id.name,20)
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+account_debit_number+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
no_mvt+=1
|
|
total_debit+=amount
|
|
#écriture de crédit
|
|
debit=''
|
|
credit=str(amount)
|
|
fic_line=str(no_mvt)+';'+'IN'+';'+date_line+';'+account_credit_number+';'+lib+';'+debit+';'+credit+';'+lib_piece+'\n'
|
|
f.write(fic_line)
|
|
no_mvt+=1
|
|
total_credit+=amount
|
|
|
|
|
|
|
|
_logger.error('TOTAL DEBIT '+str(total_debit)+' TOTAL CREDIT '+str(total_credit))
|
|
return True
|
|
def _file_format(self,data,nbcars):
|
|
if data:
|
|
if len(data)>nbcars:
|
|
return data[0:nbcars]
|
|
else:
|
|
return data
|
|
else:
|
|
return ''
|
|
|
|
def _payment_(self,move_id):
|
|
if move_id.invoice_payments_widget:
|
|
payment_info=json.loads(move_id.invoice_payments_widget)
|
|
if payment_info:
|
|
if datetime.strptime(payment_info['content'][0]['date'],'%Y-%m-%d')>self.start_date:
|
|
return False
|
|
|
|
else:
|
|
return True
|
|
else:return True
|
|
|
|
def _payment_date_date(self,move_id):
|
|
if move_id.invoice_payments_widget:
|
|
payment_info=json.loads(move_id.invoice_payments_widget)
|
|
if payment_info:
|
|
if datetime.strptime(payment_info['content'][0]['date'],'%Y-%m-%d')>self.start_date:
|
|
return False
|
|
|
|
else:
|
|
return True
|
|
else:return True
|
|
|
|
def _payment_date(self,move_id):
|
|
if move_id.invoice_payments_widget:
|
|
payment_info=json.loads(move_id.invoice_payments_widget)
|
|
if payment_info:
|
|
return self._date_format(payment_info['content'][0]['date'])
|
|
#
|
|
|
|
else:
|
|
return 'False'
|
|
else:return 'False'
|
|
def _date_format(self,data):
|
|
#_logger.error('date='+str(data))
|
|
if data:
|
|
r=str(data).split('-')
|
|
|
|
return r[2]+'/'+r[1]+'/'+r[0]
|
|
else:
|
|
return 'False'
|
|
|