From 20c611e561bf9ad86515080276834cb0410a73e5 Mon Sep 17 00:00:00 2001 From: root Date: Sun, 11 Jun 2023 22:48:20 +0200 Subject: [PATCH] accounting file --- models/event_registration.py | 2 + wizard/accounting_file_wizard.py | 363 ++++++++++++++++++------------- 2 files changed, 214 insertions(+), 151 deletions(-) diff --git a/models/event_registration.py b/models/event_registration.py index d1f6c62..74986fb 100755 --- a/models/event_registration.py +++ b/models/event_registration.py @@ -14,6 +14,8 @@ class EventRegistration(models.Model): free_participation=fields.Boolean(related='event_id.free_participation') with_membership=fields.Boolean('with membership') headphone=fields.Boolean('headphone') + date_compta=fields.Datetime('date import',default=False) + date_compta_down_payment=fields.Datetime('date import down payment',default=False) def create(self,vals): diff --git a/wizard/accounting_file_wizard.py b/wizard/accounting_file_wizard.py index 885c180..f3acf4a 100644 --- a/wizard/accounting_file_wizard.py +++ b/wizard/accounting_file_wizard.py @@ -16,6 +16,14 @@ class AccountingFileWizard(models.TransientModel): 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' @@ -41,11 +49,14 @@ class AccountingFileWizard(models.TransientModel): #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) firstname=d.partner_id.firstname name=d.partner_id.name + if not firstname: firstname=' ' lib1=firstname[0]+' '+name + lib1=self._file_format(lib1,12) #lib1=lib1[11] @@ -58,6 +69,7 @@ class AccountingFileWizard(models.TransientModel): for line in d.line_ids: affectation=line.product_id.name amount=str(line.amount) + if not line.product_id.property_account_income_id: raise UserError(_("no credit account found for product %r",line.product_id)) account_credit_number=self._file_format(line.product_id.property_account_income_id.code,6) break @@ -88,6 +100,7 @@ class AccountingFileWizard(models.TransientModel): #si l'adhésion est liée à une facture, alors on récupère la facture pour trouver le mode de paiement if m.invoice_id: + if not m.invoice_id.payment_id.fixed_journal_id: raise UserError(_("no account found for payment mode %r",m.invoice_id.payment_id.name)) account_debit_number=self._file_format(str(m.invoice_id.payment_id.fixed_journal_id.default_account_id.code),6) #si l'adhésion est liée à une transaction,le mode de paiement est CB elif m.transaction_id: @@ -100,14 +113,17 @@ class AccountingFileWizard(models.TransientModel): #sinon on prend le mode de paiement au niveau de la fiche d'adhésion else: if m.payment_mode_id: + if not m.payment_mode_id: raise UserError(_("no payment mode found for membership %r",m.partner_id.name)) account_debit_number=self._file_format(str(m.payment_mode_id.fixed_journal_id.default_account_id.code),6) firstname=m.partner_id.firstname name=m.partner_id.name + if not firstname: firstname=' ' lib1=firstname[0]+' '+name lib1=self._file_format(lib1,12) date_line=self._date_format(str(m.start_date)) amount=str(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(m.product_id.property_account_income_id.code,6) affectation=m.product_id.name @@ -117,7 +133,7 @@ class AccountingFileWizard(models.TransientModel): elif m.invoice_id: lib_piece=self._file_format(m.invoice_id.name,20) else: - lib_piece=self._file_format(m.id,20) + lib_piece=self._file_format(m.partner_id.name,20) #credit line lib2=self._file_format(affectation,13) @@ -138,176 +154,221 @@ class AccountingFileWizard(models.TransientModel): #écritures pour les inscriptions évts hors RETRAITES avec facture payée non déjà exportés - move=self.env['account.move'].search([('date_compta','=',False),('payment_state','=','paid')]) - for m in move: - reg=self.env['event.registration'].search([('invoice_id','=',int(move.id))]) - if reg: - if not reg.event_id.booking_event and not reg.event_id.individual_booking_event: - m.date_compta=date_compta - account_debit_number=self._file_format(str(m.payment_id.fixed_journal_id.default_account_id.code),6) - firstname=m.partner_id.firstname - name=m.partner_id.name - lib1=firstname[0]+' '+name - lib1=self._file_format(lib1,12) - #date du paiement - date_line=self._date_format(str(m.write_date)) - - amount=str(m.amount_total) - account_credit_number=self._file_format(reg.event_id.participation_product_id.property_account_income_id.code,6) - affectation=reg.event_id.participation_product_id.name - - #si facture liée à une transaction: - trans=self.env['payment.transaction'].search([('invoice_ids','in',m.id)]) - if trans: - lib_piece=self._file_format(trans.reference,20) - else: - lib_piece=self._file_format(m.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=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) - no_mvt=no_mvt+1 - - #écritures pour les inscription aux RETRAITES avec facture acomptes payés + factures soldes payés non déjà exporté - reg=self.env['event.registration'].search(['|',('date_compta','=',False),('date_compta_down_payment','!=',False)]) - if reg: - reg.date_compta=date_compta - account_credit_number=self._file_format(reg.event_id.participation_product_id.property_account_income_id.code,6) - account_debit_number=self._file_format(str(m.payment_id.fixed_journal_id.default_account_id.code),6) - firstname=reg.firstname - name=reg.name - lib1=firstname[0]+' '+name - lib1=self._file_format(lib1,12) - lib2=self._file_format(reg.event_id.participation_product_id.name,13) - lib=lib1+' '+lib2 - - #si pas de facture d'acompte et facture payée: - if not down_payment_invoice_id and reg.payment_status=='paid' and not reg.date_compta : - - down_payment=False - balance_payment=False - - amount=reg.invoice_id.amount_total - #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 - - #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 - - date_line=self._date_format(str(reg.invoice_id.write_date)) - trans=self.env['payment.transaction'].search([('invoice_ids','in',reg.invoice_id)]) + + 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: + 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) + firstname=m.partner_id.firstname + name=m.partner_id.name + if not firstname: firstname=' ' + lib1=firstname[0]+' '+name + lib1=self._file_format(lib1,12) + #date du paiement + date_line=m.write_date.year+'-'+m.write_date.month+'-'+m.write_date.day + date_line=self._date_format(date_line) + + amount=str(m.amount) + 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) + affectation=reg.event_id.participation_product_id.name + + #si facture liée à une transaction: + trans=self.env['payment.transaction'].search([('invoice_ids','in',reg.invoice_id.id),('state','=','done')]) + 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) - + 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 + #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=no_mvt+1 - #si facture d'acompte payée et solde payée et pas encore exportée : - if reg.payment_status=='paid' and not reg.date_compta: - reg.date_compta=date_compta - down_payment=True - balance_payment=True + #é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(['|',('date_compta','=',False),('date_compta_down_payment','!=',False)]) + + for reg in registration: + if reg: membership_amount=0 donation_amount=0 - amount=reg.down_payment_invoice_id.amount_total+reg.balance_invoice_id.amount_total - date_line=self._date_format(str(reg.balance_invoice_id.write_date)) - #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 + donation_credit_line=False + reg.date_compta=date_compta + 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(reg.event_id.participation_product_id.property_account_income_id.code,6) + + firstname=reg.firstname + name=reg.name + if not firstname: firstname=' ' + lib1=firstname[0]+' '+name + lib1=self._file_format(lib1,12) + lib2=self._file_format(reg.event_id.participation_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.payment_status=='paid' and not reg.date_compta : + + 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) + amount=reg.invoice_id.amount_total + #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 + + #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 + date_line=self._date_format(str(reg.invoice_id.write_date)) + trans=self.env['payment.transaction'].search([('invoice_ids','in',reg.invoice_id)]) + - #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([('invoice_ids','in',reg.invoice_id)]) + #si facture d'acompte payée et solde payée et pas encore exportée : + if reg.payment_status=='paid' and not reg.date_compta: + 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) + amount=reg.down_payment_invoice_id.amount_total+reg.balance_invoice_id.amount_total + date_line=self._date_format(str(reg.balance_invoice_id.write_date)) + #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([('invoice_ids','in',reg.invoice_id)]) + + #si facture d'acompte payée pas encore exporté et solde non payée : + if reg.payment_status=='down payment paid' and not reg.date_compta_down_payment: + 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) + amount=reg.down_payment_invoice_id.amount_total + date_line=self._date_format(str(reg.down_payment_invoice_id.write_date)) - #si facture d'acompte payée pas encore exporté et solde non payée : - if reg.payment_status=='down payment paid' and not reg.date_compta_down_payment: - reg.date_compta_down_payment=date_compta - down_payment=True - balance_payment=False - donation_credit_line=False - membership_credit_line=False - amount=reg.down_payment_invoice_id.amount_total - date_line=self._date_format(str(reg.down_payment_invoice_id.write_date)) + #si facture d'acompte payée et exporté et solde payée pas exporté : + if reg.payment_status=='paid' and reg.date_compta_down_payment: + 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) + date_line=self._date_format(str(reg.balance_invoice_id.write_date)) + #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 - #si facture d'acompte payée et exporté et solde payée pas exporté : - if reg.payment_status=='paid' and reg.date_compta_down_payment: - reg.date_compta=date_compta - down_payment=False - balance_payment=True - date_line=self._date_format(str(reg.balance_invoice_id.write_date)) - #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 + #écritures pour les inscription aux RETRAITES avec facture complémentaire + + if trans: + lib_piece=self._file_format(trans.reference,20) + else: + lib_piece=self._file_format(lib2,20) - #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 - - #écritures pour les inscription aux RETRAITES avec facture complémentaire - - if trans: - lib_piece=self._file_format(trans.reference,20) - else: - lib_piece=self._file_format(lib2,20) - - - #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=no_mvt+1 - - #credit(s) line(s) - #participation credit line - 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 - if membership_credit_line: + #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=no_mvt+1 + + #credit(s) line(s) + #participation credit line + if not amount: amount=0 + amount=float(amount)-float(membership_amount)-float(donation_amount) debit='' - credit=str(membership_amount) + 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 - - if donation_credit_line: - for d in donations : + + if membership_credit_line: debit='' - credit=str(d.amount_total) + credit=str(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=no_mvt+1 + + if donation_credit_line: + for d in donations : + debit='' + credit=str(d.amount_total) + 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 + + 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' + }