Browse Source

PA et import de contacts

master
root 3 years ago
parent
commit
ce08909884
23 changed files with 1034 additions and 204 deletions
  1. +8
    -2
      __manifest__.py
  2. +18
    -0
      data/donation_recurring_mail_template.xml
  3. +0
    -9
      data/recurring_donation_configuration.xml
  4. +97
    -2
      i18n/fr.po
  5. +3
    -0
      models/__init__.py
  6. +185
    -38
      models/donation.py
  7. +75
    -0
      models/donation_recurring_template_letter.py
  8. +2
    -2
      models/donation_tax_receipt.py
  9. +199
    -0
      models/partner_import.py
  10. +14
    -0
      models/settings.py
  11. +16
    -6
      report/report.xml
  12. +32
    -0
      report/report_donation_recurring.xml
  13. +0
    -74
      report/report_donationtax.xml
  14. +9
    -1
      security/ir.model.access.csv
  15. BIN
      static/description/icon.png
  16. BIN
      static/src/img/icon.png
  17. +148
    -0
      views/partner_import.xml
  18. +82
    -69
      views/recurring_donation.xml
  19. +55
    -0
      views/settings.xml
  20. +43
    -0
      views/template_pa.xml
  21. +2
    -1
      wizard/__init__.py
  22. +17
    -0
      wizard/recurring_donation_wizard.py
  23. +29
    -0
      wizard/recurring_donation_wizard.xml

+ 8
- 2
__manifest__.py View File

@ -26,12 +26,13 @@
'data': [ 'data': [
'security/ir.model.access.csv', 'security/ir.model.access.csv',
'security/security.xml', 'security/security.xml',
'views/settings.xml',
'views/qualifier.xml', 'views/qualifier.xml',
'views/address.xml', 'views/address.xml',
'views/email.xml', 'views/email.xml',
'views/phone.xml', 'views/phone.xml',
'views/partner.xml', 'views/partner.xml',
'views/donation.xml',
'views/recurring_donation.xml',
'data/recurring_donation_configuration.xml', 'data/recurring_donation_configuration.xml',
'views/relationship.xml', 'views/relationship.xml',
'views/operation.xml', 'views/operation.xml',
@ -43,11 +44,16 @@
'views/aggregate.xml', 'views/aggregate.xml',
'views/duplicate.xml', 'views/duplicate.xml',
'views/template_rf.xml', 'views/template_rf.xml',
'views/template_pa.xml',
'wizard/operation_duplicate_wizard.xml', 'wizard/operation_duplicate_wizard.xml',
'wizard/recurring_donation_wizard.xml',
'report/report_donationtax.xml', 'report/report_donationtax.xml',
'report/report_donation_recurring.xml',
'report/report.xml', 'report/report.xml',
'views/donation_tax_receipt.xml', 'views/donation_tax_receipt.xml',
'views/laposte_ref.xml'
'views/laposte_ref.xml',
'views/partner_import.xml',
'data/donation_recurring_mail_template.xml'
#'views/website_donation.xml' #'views/website_donation.xml'


+ 18
- 0
data/donation_recurring_mail_template.xml View File

@ -0,0 +1,18 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo noupdate="1">
<record id="donation_recurring_email_template" model="mail.template">
<field name="name">Send by Email</field>
<field
name="email_from"
>${(user.email and '%s &lt;%s&gt;' % (user.name, user.email) or '')|safe}</field>
<field
name="subject"
>${object.company_id.name} - Recurring donation information</field>
<field name="partner_to">${object.partner_id.id}</field>
<field name="model_id" ref="donation.model_donation_donation" />
<field name="auto_delete" eval="False" />
<field name="lang">${object.partner_id.lang}</field>
<field name="body_html"> </field>
</record>
</odoo>

+ 0
- 9
data/recurring_donation_configuration.xml View File

@ -1,12 +1,3 @@
<odoo> <odoo>
<data noupdate="1">
<record model="opendons.recurring_donation_configuration" id="num1">
<field name="generation_day">5</field>
<field name="limite_days_before">15</field>
</record>
</data>
</odoo> </odoo>

+ 97
- 2
i18n/fr.po View File

@ -526,7 +526,7 @@ msgid "Duplicate operation"
msgstr "Dupliquer l'opération" msgstr "Dupliquer l'opération"
#. module: opendons #. module: opendons
#: model:ir.model,name:opendons.model_opendons_operation_duplicate
#: model:ir.model,name:opendpendons.model_opendons_operation_duplicate
msgid "Duplicate the operation" msgid "Duplicate the operation"
msgstr "Dupliquer l'opération" msgstr "Dupliquer l'opération"
@ -1162,7 +1162,7 @@ msgstr "Code postal"
#. module: opendons #. module: opendons
#: model_terms:ir.ui.view,arch_db:opendons.view_opendons_donation_tax_receipt_form #: model_terms:ir.ui.view,arch_db:opendons.view_opendons_donation_tax_receipt_form
msgid "Print" msgid "Print"
msgstr "Imprimmer"
msgstr "Imprimer"
#. module: opendons #. module: opendons
#: model:ir.model.fields.selection,name:opendons.selection__res_partner__type__private #: model:ir.model.fields.selection,name:opendons.selection__res_partner__type__private
@ -2133,3 +2133,98 @@ msgstr ""
#: model:ir.model.fields,field_description:opendons.field_opendons_qualifier_partnerqualifier__value_text #: model:ir.model.fields,field_description:opendons.field_opendons_qualifier_partnerqualifier__value_text
msgid "value" msgid "value"
msgstr "valeur" msgstr "valeur"
#. module: opendons
#: model_terms:ir.ui.view,arch_db:opendons.view_opendons_donation_form
msgid "Stop"
msgstr "Arrêter les prélèvements"
#. module: opendons
#: model:ir.model.fields,field_description:opendons.field_donation_donation__stopped_reason
#: model:ir.model.fields,field_description:opendons.field_opendons_recurringdonation_wizard__stopped_reason
msgid "Stop reason"
msgstr "Raison"
#. module: opendons
#: code:addons/opendons/models/donation.py:0
#: model:ir.actions.act_window,name:opendons.action_recurring_donation_wizard
#, python-format
msgid "Stop recurring donation"
msgstr "Arrêter les prélèvements"
#. module: opendons
#: model:ir.model.fields.selection,name:opendons.selection__donation_donation__recurring_template__stopped
#: model_terms:ir.ui.view,arch_db:opendons.view_opendons_donation_form
msgid "Stopped"
msgstr "Stoppé"
#. module: opendons
#: model:ir.model.fields,field_description:opendons.field_donation_donation__stopped_date
msgid "Stopped Date"
msgstr "Date d'arrêt"
#. module: opendons
#: code:addons/opendons/models/donation.py:0
#, python-format
msgid "Stopped Recurring Donation %s"
msgstr "Prélèvement automatique stoppé %s"
#. module: opendons
#: model_terms:ir.ui.view,arch_db:opendons.view_opendons_donation_form
msgid "Suspend"
msgstr "Suspendre le prélèvement"
#. module: opendons
#: model_terms:ir.ui.view,arch_db:opendons.view_opendons_donation_form
msgid "This action is defintive, are you sure ?"
msgstr "Cette action est définitive, êtes-vous sûr ?"
#. module: opendons
#: model_terms:ir.ui.view,arch_db:opendons.recurring_donation_view
msgid "stop the recurring donation"
msgstr "Arrêter le prélèvement automatique"
#. module: opendons
#: model:ir.ui.menu,name:opendons.opendons_partnerdraft_title_menu
msgid "Partners import"
msgstr "Import de contacts"
#. module: opendons
#: model:ir.ui.menu,name:opendons.opendons_partnerdraft_menu
msgid "Partners imported"
msgstr "Contact importés pour transfert"
#. module: opendons
#: model:ir.ui.menu,name:opendons.opendons_partnerdraftfile_menu
msgid "Partners files"
msgstr "Fichiers d'import"
#. module: opendons
#: model:ir.ui.menu,name:opendons.opendons_partnerdraft_file_mapping_menu
msgid "mapping fields"
msgstr "mapping des champs"
#. module: opendons
#: model:ir.ui.menu,name:opendons.opendons_partnerdraftfileimport_menu
msgid "Import files"
msgstr "Importer les fichiers"
#. module: opendons
#: model:ir.actions.server,name:opendons.ir_action_partnerdraft_transfert
msgid "transfert draft partners"
msgstr "Transfert vers la base des contacts"
#. module: opendons
#: model:ir.ui.menu,name:opendons.opendons_partnerdraftfiletransfert_menu
msgid "Draft Partners transfert"
msgstr "Transfert vers la base des contacts"
#. module: opendons
#: model:ir.model.fields,field_description:opendons.field_opendons_partnerdraftfile_mapping__external_field
msgid "external field"
msgstr "Champ du fichier"
#. module: opendons
#: model:ir.model.fields,field_description:opendons.field_opendons_partnerdraftfile_mapping__odoo_field
msgid "odoo field"
msgstr "Champ interne"

+ 3
- 0
models/__init__.py View File

@ -17,4 +17,7 @@ from . import duplicate
from . import template_rf from . import template_rf
from . import donation_tax_receipt from . import donation_tax_receipt
from . import laposte_ref from . import laposte_ref
from . import settings
from . import donation_recurring_template_letter
from . import partner_import
#from . import res_partner_bank #from . import res_partner_bank

+ 185
- 38
models/donation.py View File

@ -1,17 +1,17 @@
from odoo import models, fields, api,_ from odoo import models, fields, api,_
from odoo.exceptions import UserError, ValidationError,Warning from odoo.exceptions import UserError, ValidationError,Warning
from psycopg2 import sql, DatabaseError from psycopg2 import sql, DatabaseError
from datetime import datetime
from datetime import datetime,timedelta,date
from dateutil.relativedelta import relativedelta
from werkzeug import utils from werkzeug import utils
import base64 import base64
class opendons_recurring_donation(models.Model): class opendons_recurring_donation(models.Model):
_name = 'opendons.recurring_donation_configuration'
_name = 'opendons.recurring_donation'
_description = 'recurring donation management' _description = 'recurring donation management'
generation_day=fields.Integer('Generation day in the month')
limite_days_before=fields.Integer('Limite_days before generation day')
last_execution_date=fields.Date('Last execution date')
class DonationDonation(models.Model): class DonationDonation(models.Model):
_inherit = 'donation.donation' _inherit = 'donation.donation'
@ -37,13 +37,32 @@ class DonationDonation(models.Model):
ondelete='restrict' ondelete='restrict'
) )
recurring_template = fields.Selection(
[("active", "Active"), ("suspended", "Suspended"),("stopped", "Stopped")],
string="Recurring Template",
copy=False,
index=True,
tracking=True,
)
start_date= fields.Date(
string='Start Date',
index=True,
required=True,
track_visibility='onchange'
)
end_date = fields.Date( end_date = fields.Date(
string='End Date', string='End Date',
index=True, index=True,
track_visibility='onchange'
)
stopped_date = fields.Date(
string='Stopped Date',
index=True,
readonly=True, readonly=True,
track_visibility='onchange' track_visibility='onchange'
) )
stopped_reason=fields.Selection(string='Stop reason',selection=[('motif1', 'Motif 1'), ('motif2', 'Motif 2')],default='motif1',track_visibility='onchange')
suspended_date = fields.Date( suspended_date = fields.Date(
string='Suspended Date', string='Suspended Date',
index=True, index=True,
@ -66,39 +85,20 @@ class DonationDonation(models.Model):
string='Payment Batch', string='Payment Batch',
ondelete='set null' ondelete='set null'
) )
@api.model
def create(self, vals):
vals['tax_receipt_option']='annual'
res = super(DonationDonation, self).create(vals)
#res.tax_receipt_option='annual'
# sepa_payment_method=self.env['account.payment.method'].search([('code','=','sepa_direct_debit')])
# if sepa_payment_method:
# sepa_payment_mode=self.env['account.payment.mode'].search([('payment_method_id','=',int( sepa_payment_method))])
# if sepa_payment_mode:
# res.payment_mode_id=sepa_payment_mode.id
# else:
# raise Warning('Please configure mode sepa payment')
# else:
# raise Warning('Please configure method sepa payment')
return res
def _default_payment_mode_id(self): def _default_payment_mode_id(self):
#if self.recurring_template=='active':
#raise Warning(self.recurring_template)
if self.recurring_template=='active':
sepa_payment_method=self.env['account.payment.method'].search([('code','=','sepa_direct_debit')])
if sepa_payment_method:
sepa_payment_method=self.env['account.payment.method'].search([('code','=','sepa_direct_debit')])
id=int(sepa_payment_method.id)
return 4
else:
raise Warning('veuillez configurer la méthode de paiment SEPA')
if sepa_payment_method:
id=int(sepa_payment_method.id)
return 4
else:
raise Warning('veuillez configurer la méthode de paiment SEPA')
payment_mode_id = fields.Many2one( payment_mode_id = fields.Many2one(
"account.payment.mode", "account.payment.mode",
@ -107,10 +107,60 @@ class DonationDonation(models.Model):
copy=False, copy=False,
tracking=True, tracking=True,
check_company=True, check_company=True,
default=_default_payment_mode_id,
states={"done": [("readonly", True)]} states={"done": [("readonly", True)]}
) )
@api.model
def create(self, vals):
vals['tax_receipt_option']='annual'
res = super(DonationDonation, self).create(vals)
return res
@api.onchange("partner_id")
def donation_partner_direct_debit_change(self):
if not self.payment_mode_id and self.recurring_template=='active':
self.mandate_id=False
sepa_payment_method=self.env['account.payment.method'].search([('code','=','sepa_direct_debit')],limit=1)
if sepa_payment_method:
sepa_payment_mode=self.env['account.payment.mode'].search([('payment_method_id','=',int(sepa_payment_method.id))],limit=1)
if sepa_payment_mode:
self.payment_mode_id=sepa_payment_mode.id
else:
raise Warning(_('Please configure a SEPA payment mode'))
else:
raise Warning(_('Please configure a SEPA payment method'))
if (
self.partner_id
and self.payment_mode_id
and self.payment_mode_id.payment_method_id.mandate_required
):
mandate = self.env["account.banking.mandate"].search(
[
("state", "=", "valid"),
("partner_id", "=", int(self.partner_id)),
],
limit=1,
)
if mandate:
self.mandate_id = mandate
else:
self.mandate_id=False
@api.onchange('operation_id') @api.onchange('operation_id')
@ -122,9 +172,48 @@ class DonationDonation(models.Model):
def generate_recurring_payment(self): def generate_recurring_payment(self):
#self.ensure_one() #self.ensure_one()
generation_day = self.env['ir.config_parameter'].get_param('opendons.generation_day', '')
limit_days_before = int(self.env['ir.config_parameter'].get_param('opendons.limit_days_before'))
debug_mode = self.env['ir.config_parameter'].get_param('opendons.pa_debug_mode')
r=self.env['opendons.recurring_donation'].search([])
if r.last_execution_date and not debug_mode:
month_last_exe=r.last_execution_date.month
month_today=datetime.now().date().month
#si le mois en cours a déjà été executé, l'execution est donc pour le mois suivant :
if month_last_exe==month_today:
date_generation=r.last_execution_date+relativedelta(months=1)
date_before=date_generation-timedelta(days=limit_days_before)
date_today=datetime.now().date()
#si la date du jour est antérieur à la date limite alors message
if date_today<date_before: raise Warning('you can\'t generate recurring payment before the '+str(date_before))
elif debug_mode :
#en mode debug on génère les dons même si déjà généré pour le mois
date_generation=datetime(datetime.now().date().year,datetime.now().date().month,int(generation_day))
else:
#si aucune génération de don effectuée, la date de génération est le mois en cours
date_generation=datetime(datetime.now().date().year,datetime.now().date().month,int(generation_day))
#si le mois en cours a déjà été executé, l'execution est donc pour le mois suivant :
#si la date < date limite inférieur du mois suivant : message d'erreur
#la date de dernière execution sera alors celle du mois suivant
#si le mois en cours n'a pas été executé alors execution
#la date de dernière execution sera alors celle du mois actuel
#if date_today<date_before and date_today>date_after:raise Warning('today you can\'t generate recurring payment')
doo = self.env["donation.donation"] doo = self.env["donation.donation"]
#chercher les templates de dons récurrents actifs #chercher les templates de dons récurrents actifs
donations = doo.search( donations = doo.search(
@ -140,10 +229,11 @@ class DonationDonation(models.Model):
#création d'un don si les dates sont bonnes #création d'un don si les dates sont bonnes
for donation in donations: for donation in donations:
if not donation.start_date: continue
generate=True generate=True
existing_recur_donations = doo.search([("source_recurring_id", "=",int(donation.id))]) existing_recur_donations = doo.search([("source_recurring_id", "=",int(donation.id))])
if donation.donation_date>fields.Date.context_today(self):
if donation.start_date>fields.Date.context_today(self):
generate=False generate=False
delta=0 delta=0
@ -164,7 +254,7 @@ class DonationDonation(models.Model):
if generate==True: if generate==True:
default = { default = {
"recurring_template":'', "recurring_template":'',
"donation_date": fields.Date.context_today(self),
"donation_date": date_generation,
"source_recurring_id": donation.id, "source_recurring_id": donation.id,
"payment_ref": '', "payment_ref": '',
"payment_mode_id":donation.payment_mode_id.id, "payment_mode_id":donation.payment_mode_id.id,
@ -177,7 +267,7 @@ class DonationDonation(models.Model):
#ajout du don à la collection des dons générés pour affichage #ajout du don à la collection des dons générés pour affichage
new_donation_ids.append(new_donation.id) new_donation_ids.append(new_donation.id)
#mise à jour de la date de dernière génération #mise à jour de la date de dernière génération
donation.lastexecution_date=datetime.now().date()
donation.lastexecution_date=date_generation
payment_mode_id=donation.payment_mode_id.id payment_mode_id=donation.payment_mode_id.id
if not new_donation_ids : raise Warning ("aucun don n'a été généré") if not new_donation_ids : raise Warning ("aucun don n'a été généré")
@ -198,6 +288,11 @@ class DonationDonation(models.Model):
# "limit": 500, # "limit": 500,
# } # }
# ) # )
if not r:r.create({'last_execution_date':date_generation})
if r:r.write({'last_execution_date':date_generation})
r=self.env['opendons.recurring_donation'].search([])
action = self.env.ref("account_payment_order.account_payment_order_inbound_action").sudo().read([])[0] action = self.env.ref("account_payment_order.account_payment_order_inbound_action").sudo().read([])[0]
action.update( action.update(
@ -430,4 +525,56 @@ class DonationDonation(models.Model):
# } # }
# ) # )
return action
return action
def active2suspended(self):
self.ensure_one()
assert self.recurring_template == "active"
self.write({"recurring_template": "suspended"})
self.write({"suspended_date": fields.Date.context_today(self)})
def suspended2active(self):
self.ensure_one()
assert self.recurring_template == "suspended"
self.write({"recurring_template": "active"})
self.write({"suspended_date": False})
def active2stopped(self):
self.ensure_one()
assert self.recurring_template == "active"
view=self.env.ref('opendons.recurring_donation_view')
wiz=self.env['opendons.recurringdonation.wizard'].create({'stopped_reason':'motif1','donation_id':self.id})
return {
'name': _('Stop recurring donation'),
'type': 'ir.actions.act_window',
'view_type': 'form',
'view_mode': 'form',
'res_model': 'opendons.recurringdonation.wizard',
'views': [(view.id, 'form')],
'view_id': view.id,
'target': 'new',
'res_id': wiz.id,
'context': self.env.context,
}
# self.write({"recurring_template": "stopped"})
# self.write({"stopped_date": fields.Date.context_today(self)})
@api.depends("state", "partner_id", "move_id", "recurring_template")
def name_get(self):
res = []
for donation in self:
if donation.recurring_template == "active":
name = _("Recurring Donation %s") % (donation.number)
elif donation.recurring_template == "suspended":
name = _("Suspended Recurring Donation %s") % (donation.number)
elif donation.recurring_template == "stopped":
name = _("Stopped Recurring Donation %s") % (donation.number)
else:
name = super(DonationDonation, donation).name_get()[0][1]
res.append((donation.id, name))
return res

+ 75
- 0
models/donation_recurring_template_letter.py View File

@ -0,0 +1,75 @@
from odoo import api, fields, models,_
from odoo.exceptions import UserError,Warning
class DonationRecurringTemplateLetter(models.Model):
_inherit = "donation.donation"
template_pa_id=fields.Many2one('opendons.template_pa_letter', '(e)mail to send')
html_content=fields.Html('html content',compute='pa_html_content')
html_content_print=fields.Html('html content print')
def action_print_pa(self):
self.ensure_one()
if self.html_content:
html_content_print=self.html_content
html_content_print=html_content_print.replace('{{partner_id.name}}',self.partner_id.name)
html_content_print=html_content_print.replace('{{partner_id.firstname}}',self.partner_id.firstname)
self.html_content_print=self.html_content
return self.env.ref("opendons.report_donation_recurring_letter").report_action(self)
else:
raise Warning('please select a mail to print')
def action_send_pa(self):
self.ensure_one()
if not self.partner_id.email:
raise UserError(
_("Missing email on partner '%s'.") % self.partner_id.display_name
)
self.partner_id.display_name
template = self.env.ref("opendons.donation_recurring_email_template")
compose_form = self.env.ref("mail.email_compose_message_wizard_form")
ctx = dict(
default_model="donation.donation",
default_res_id=self.id,
default_use_template=bool(template),
default_template_id=template.id,
default_composition_mode="comment",
default_body_html='dddd'
)
action = {
"name": _("Compose Email"),
"type": "ir.actions.act_window",
"view_mode": "form",
"res_model": "mail.compose.message",
"view_id": compose_form.id,
"target": "new",
"context": ctx,
}
return action
def pa_html_content(self):
self.html_content=self.template_pa_id.html_content
class opendons_template_pa(models.Model):
_name = 'opendons.template_pa_letter'
_description = 'manage pa html template'
name=fields.Char('name')
description=fields.Text('description')
active=fields.Boolean('active')
html_content=fields.Html('Html content')
def action_update_pa(self):
pa=self.env['donation.donation'].search([('template_pa_id','=',int(self.id))])
for p in pa:
p.html_content=self.html_content

+ 2
- 2
models/donation_tax_receipt.py View File

@ -5,7 +5,7 @@ class DonationTaxReceipt(models.Model):
_inherit = "donation.tax.receipt" _inherit = "donation.tax.receipt"
template_rf_id=fields.Many2one('opendons.template_rf', 'RF template') template_rf_id=fields.Many2one('opendons.template_rf', 'RF template')
html_content=fields.Html('html content',compute='_html_content')
html_content=fields.Html('html content',compute='_html_content_rf')
html_content_print=fields.Html('html content print') html_content_print=fields.Html('html content print')
def action_print_rf(self): def action_print_rf(self):
@ -22,5 +22,5 @@ class DonationTaxReceipt(models.Model):
return self.env.ref("opendons.report_donation_tax_receipt").report_action(self) return self.env.ref("opendons.report_donation_tax_receipt").report_action(self)
#return True #return True
def _html_content(self):
def _html_content_rf(self):
self.html_content=self.template_rf_id.html_content self.html_content=self.template_rf_id.html_content

+ 199
- 0
models/partner_import.py View File

@ -0,0 +1,199 @@
from odoo import models, fields, api
from odoo.exceptions import UserError, ValidationError, Warning
from psycopg2 import sql, DatabaseError
from odoo.tools.safe_eval import safe_eval, datetime
from werkzeug import utils
import csv
import base64
import io
import json
class opendons_partnerdraftfile(models.Model):
_name = 'opendons.partnerdraftfile'
_description = 'draft partner file'
#file= fields.Binary("Téléverser le fichier des contacts")
file = fields.Binary("Attachment")
file_name = fields.Char("Nom du fichier")
active = fields.Boolean("actif")
source_name=fields.Char("Source")
def import_csv_files(self):
self.env["opendons.partnerdraft"].search([]).unlink()
files= self.env["opendons.partnerdraftfile"].search([('active','=',True)])
#raise Warning('fff')
for f in files:
decrypted = base64.b64decode(f.file).decode('utf-8-sig')
source_name=f.source_name
with io.StringIO(decrypted) as fp:
reader = csv.DictReader(fp, delimiter=";", quotechar='"')
for row in reader:
vals={}
vals['source_name']=source_name
for key, value in row.items():
field_map=self.env['opendons.partnerdraftfile_mapping'].search([('external_field','=',key)])
if field_map:
odoo_field=field_map.odoo_field
vals[odoo_field]=str(value)
else: raise Warning('champ '+str(key)+' non trouvé')
self.env['opendons.partnerdraft'].create(vals)
#raise Warning(json.dumps(row))
action = self.env.ref("opendons.opendons_partnerdraft_action").sudo().read([])[0]
return action
def transfert_draftpartner(self):
#transfert des contacts importés, dans la base des contact odoo
partners=self.env['opendons.partnerdraft'].search([])
fields=self.env['opendons.partnerdraftfile_mapping'].search([])
if partners:
for p in partners:
vals={}
for f in fields:
if f.partner_field=='country_id':
if p[f.odoo_field]!='':
country=self.env['res.country'].search([('name','=',p[f.odoo_field])])
if country:vals[f.partner_field]=country.id
else:vals[f.partner_field]=False
elif f.partner_field=='title':
if p[f.odoo_field]!='':
title=self.env['res.partner.title'].search([('name','=',p[f.odoo_field])])
if title:vals[f.partner_field]=title.id
else:vals[f.partner_field]=False
else:
vals[f.partner_field]=False
elif f.partner_field in ('origine','statut_contact'):
if p[f.odoo_field]!=False:
vals[f.partner_field]=p[f.odoo_field].lower()
else:
vals[f.partner_field]=p[f.odoo_field]
vals['company_type']='person'
self.env['res.partner'].create(vals)
partners=self.env['opendons.partnerdraft'].search([]).unlink()
class opendons_partnerdraftfile_mapping(models.Model):
_name = 'opendons.partnerdraftfile_mapping'
_description = 'file mapping'
external_field=fields.Char('external field')
odoo_field=fields.Selection('odoo_field_selection', string='odoo field')
partner_field=fields.Selection('partner_field_selection', string='partner field')
@api.model
def odoo_field_selection(self):
field_list=self.env['opendons.partnerdraft'].fields_get()
result=[]
for key in field_list:
result.append((key,key))
result.sort()
return result
api.model
def partner_field_selection(self):
field_list=self.env['res.partner'].fields_get()
result=[]
for key in field_list:
result.append((key,key))
result.sort()
return result
class opendons_partnerdraft(models.Model):
_name = 'opendons.partnerdraft'
_description = 'import draft partner'
_order = "id asc"
external_id=fields.Char(string='external id')
name=fields.Char(string='nom')
firstname=fields.Char(string='prenom')
title=fields.Char(string='civilité')
street = fields.Char(string='adresse')
street2 = fields.Char(string='adresse2')
city = fields.Char(string='ville')
country = fields.Char(string='pays')
zip = fields.Char(string='code postal')
phone = fields.Char(string='tel')
email = fields.Char(string='Email')
statut_contact=fields.Char('Statut')
date_creation_contact=fields.Char(string='Date contact')
origine=fields.Char(string='Origine')
date_member=fields.Char(string='Date adhesion')
doublon=fields.Boolean(string='Doublon')
source_name=fields.Char(string='Source')
class partner(models.Model):
_inherit = 'res.partner'
external_id=fields.Char('id')
statut_contact=fields.Selection([('adhérent', 'Adhérent'), ('bienfaiteur', 'Bienfaiteur'),('contact', 'Contact'), ('soutien','Soutien') ],'Statut', index=True)
date_creation_contact=fields.Char(string='Date de création du contact', readonly=True)
origine=fields.Selection([
('boutique','Boutique'),
('visiteur','Visiteur'),
('vincennes','Vincennes'),
('bercy','Bercy'),
('salon zen','Salon Zen'),
('autre','Autre'),
('internet boutique','Internet Boutique'),
('conf m ricard','Conf M Ricard'),
('visite lzr 09','Visite lzr 09'),
('retraite','Retraite'),
('amis','Amis'),
('centre fpmt','Centre FPMT'),
('site réservations','Site réservations'),
('réservations','Réservations'),
('voyage inde','Voyage inde'),
('internet','Internet'),
('librairie','Librairie'),
('site internet boutique','Site internet boutique'),
('portes ouvertes st cosme','Portes ouvertes st cosme'),
('t','T'),
('maitreya','maitreya'),
('zen','Zen'),
('lille','Lille'),
('alan wallace','Alan wallace'),
('salon rouen','Salon Rouen'),
('stage','Stage'),
('b.actualit','B.Actualit'),
('b. actualit','B. Actualit'),
('r','R'),
('institut vy','Institut vy'),
('initiation kalachakr','Initiation kalachakr'),
('yoga','Yoga'),
('samsara','Samsara'),
('missun@gmail.com','missun@gmail.com'),
('reliques','Reliques'),
('journal m','Journal m'),
('nantes','Nantes'),
('retraite vipassana','retraite vipassana'),
('presse bouddhiste','Presse bouddhiste'),
('réservtions','Réservtions'),
('réservation','Réservation'),
('site','Site'),
('question mail','Question mail'),
('interreligieux','interreligieux'),
('refuge','Refuge'),
('zoom','zoom'),
('contact','contact'),
],'Origine', index=True)
date_adhesion=fields.Char(string='Date adhesion', readonly=True)

+ 14
- 0
models/settings.py View File

@ -0,0 +1,14 @@
from odoo import fields, models,api, _
class OpendonsSettings(models.TransientModel):
_inherit = 'res.config.settings'
#recurring donation params
generation_day=fields.Integer('Generation day in the month',config_parameter='opendons.generation_day')
limit_days_before=fields.Integer('Limit days before generation day',config_parameter='opendons.limit_days_before')
pa_debug_mode=fields.Boolean('Debug mode',config_parameter='opendons.pa_debug_mode')

+ 16
- 6
report/report.xml View File

@ -1,10 +1,5 @@
<?xml version="1.0" encoding="utf-8" ?> <?xml version="1.0" encoding="utf-8" ?>
<!--
Copyright 2014-2021 Barroux Abbey (www.barroux.org)
Copyright 2014-2021 Akretion France (www.akretion.com)
@author: Alexis de Lattre <alexis.delattre@akretion.com>
License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
-->
<odoo> <odoo>
<record id="report_donation_tax_receipt" model="ir.actions.report"> <record id="report_donation_tax_receipt" model="ir.actions.report">
<field name="name">Donation Tax Receipt</field> <field name="name">Donation Tax Receipt</field>
@ -19,4 +14,19 @@
<field name="attachment_use" eval="True" /> <field name="attachment_use" eval="True" />
<field name="binding_type">report</field> <field name="binding_type">report</field>
</record> </record>
<record id="report_donation_recurring_letter" model="ir.actions.report">
<field name="name">Donation recurring letter</field>
<field name="model">donation.donation</field>
<field name="report_type">qweb-pdf</field>
<field name="report_name">opendons.report_donation_recurring</field>
<field name="report_file">opendons.report_donation_recurring</field>
<field
name="print_report_name"
>'PA-'+(object.number or '').replace('/','')+'.pdf'</field>
<field name="binding_model_id" ref="model_donation_donation" />
<field name="attachment_use" eval="True" />
<field name="binding_type">report</field>
</record>
</odoo> </odoo>

+ 32
- 0
report/report_donation_recurring.xml View File

@ -0,0 +1,32 @@
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<template id="opendons.report_donation_recurring_document">
<t t-foreach="docs" t-as="o">
<t t-call="web.internal_layout">
<div t-field="o.html_content_print"/>
</t>
</t>
</template>
<template id="report_donation_recurring">
<t t-call="web.html_container">
<t t-foreach="docs" t-as="doc">
<t
t-call="opendons.report_donation_recurring_document"
t-lang="doc.partner_id.lang"
/>
</t>
</t>
</template>
</odoo>

+ 0
- 74
report/report_donationtax.xml View File

@ -24,80 +24,6 @@
</t> </t>
</template> </template>
<!-- <template id="opendons_template_donation_tax_receipt_old" inherit_id="donation_base.report_donationtaxreceipt_document">
<xpath expr="//div[@class='page']" position="replace">
<table border="1" cellspacing="0">
<tr>
<td>Logo</td>
<td>Paris le 25 mars 2022</td>
</tr>
<tr>
<td>adresse</td>
</tr>
<tr>
<td>ref donateur</td><td>flashcode</td>
</tr>
<tr>
<td width="50%"></td><td>adresse</td>
</tr>
<tr>
<td colspan="2">Cher donateur,
Cette semaine, grâce à votre aide et votre grande générosité, nous avons pu récolter assez de fonds pour pouvoir mettre en oeuvre notre projet.
C'est donc heureux et plus motivés que jamais que nous débutons la première phase des travaux qui permettront, comme vous le savez, d'accompagner des centaines de personnes dans le besoin et de leur redonner un peu d'espoir.
Nous vous remercions du fond du coeur pour ce beau projet que vous venez de rendre possible grâce à vos dons. Nous n'aurions jamais pu en arriver là où nous en sommes aujourd'hui sans vos généreux dons.t
</td>
</tr>
<tr>
<td width="50%"></td><td>signature</td>
</tr>
<tr>
<td width="50%"></td><td>Nom responsable donateur</td>
</tr>
<tr>
<td width="50%">
CERFA logo+ logo 2 +adresse
</td>
<td>
NUMERO D'ORDRE: S0061709
reconnait avoir reçu à titre de don la somme de : ***100,00 € ***
</td>
</tr>
<tr>
<td width="50%">
Reçu - Objet Association
</td>
<td>
Date de versement : 08/03/2022
Forme du don : Don manuel
Nature du don : Numéraire
Mode de versement : carte bancaire
Ref donateur
Nom et adresse donateur
</td>
</tr>
</table>
</xpath>
</template> -->
<template id="opendons_template_donation_tax_receipt" inherit_id="donation_base.report_donationtaxreceipt_document"> <template id="opendons_template_donation_tax_receipt" inherit_id="donation_base.report_donationtaxreceipt_document">


+ 9
- 1
security/ir.model.access.csv View File

@ -35,4 +35,12 @@ access_opendons_template_rf,opendons_template_rf,model_opendons_template_rf,dona
access_opendons_laposte_ref,opendons_laposte_ref,model_opendons_laposte_ref,donation.group_donation_manager,1,1,1,1 access_opendons_laposte_ref,opendons_laposte_ref,model_opendons_laposte_ref,donation.group_donation_manager,1,1,1,1
access_opendons_recurring_donation_configuration,opendons_recurring_donation_configuration,model_opendons_recurring_donation_configuration,donation.group_donation_manager,1,1,1,1
access_opendons_recurring_donation_wizard,opendons_recurring_donation_wizard,model_opendons_recurringdonation_wizard,donation.group_donation_manager,1,1,1,1
access_opendons_recurring_donation,opendons_recurring_donation,model_opendons_recurring_donation,donation.group_donation_manager,1,1,1,1
access_opendons_template_pa_letter,opendons_template_pa_letter,model_opendons_template_pa_letter,donation.group_donation_manager,1,1,1,1
access_opendons_partnerdraft,opendons_partnerdraft,model_opendons_partnerdraft,donation.group_donation_manager,1,1,1,1
access_opendons_partnerdraftfile,opendons_partnerdraftfile,model_opendons_partnerdraftfile,donation.group_donation_manager,1,1,1,1
access_opendons_partnerdraft_file_mapping,opendons_partnerdraft_file_mapping,model_opendons_partnerdraftfile_mapping,donation.group_donation_manager,1,1,1,1

BIN
static/description/icon.png View File

Before After
Width: 512  |  Height: 512  |  Size: 15 KiB

BIN
static/src/img/icon.png View File

Before After
Width: 512  |  Height: 512  |  Size: 15 KiB

+ 148
- 0
views/partner_import.xml View File

@ -0,0 +1,148 @@
<?xml version="1.0"?>
<odoo>
<record model="ir.ui.view" id="opendons.partner_draft">
<field name="name">_partner_draft list</field>
<field name="model">opendons.partnerdraft</field>
<field name="arch" type="xml">
<tree default_order="name,firstname">
<field name="external_id"/>
<field name="source_name"/>
<field name="name"/>
<field name="firstname"/>
<field name="title"/>
<field name="street"/>
<field name="street2"/>
<field name="city"/>
<field name="country"/>
<field name="zip"/>
<field name="phone"/>
<field name="email"/>
<field name="statut_contact"/>
<field name="date_creation_contact"/>
<field name="origine"/>
<field name="date_member"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="opendons.partner_draftfilelist">
<field name="name">_partner_draft file list</field>
<field name="model">opendons.partnerdraftfile</field>
<field name="arch" type="xml">
<tree>
<field name="active"/>
<field name="source_name"/>
<field name="file_name"/>
<field name="write_date"/>
<field name="create_date"/>
</tree>
</field>
</record>
<record model="ir.ui.view" id="opendons.partner_draftfileform">
<field name="name">_partner_draft file form</field>
<field name="model">opendons.partnerdraftfile</field>
<field name="arch" type="xml">
<form>
<group>
<field name="active"/>
<field name="source_name"/>
<field name="file" filename="file_name"/>
<field name="file_name" invisible="1"/>
</group>
</form>
</field>
</record>
<record model="ir.actions.server" id="ir_action_partnerdraft_import">
<field name="name">import file draft partner</field>
<field name="model_id" ref="opendons.model_opendons_partnerdraftfile"/>
<field name="state">code</field>
<field name="code">action=model.import_csv_files()</field>
</record>
<record model="ir.actions.server" id="ir_action_partnerdraft_transfert">
<field name="name">transfert draft partners</field>
<field name="model_id" ref="opendons.model_opendons_partnerdraftfile"/>
<field name="state">code</field>
<field name="code">action=model.transfert_draftpartner()</field>
</record>
<record model="ir.ui.view" id="opendons.partner_draftfile_mapping_list">
<field name="name">_partner_draft file ampping list</field>
<field name="model">opendons.partnerdraftfile_mapping</field>
<field name="arch" type="xml">
<tree>
<field name="external_field"/>
<field name="odoo_field"/>
<field name="partner_field"/>
</tree>
</field>
</record>
<record id="view_partner_form_info_import" model="ir.ui.view">
<field name="name">opendons.res.partner.form</field>
<field name="model">res.partner</field>
<field name="inherit_id" ref="base.view_partner_form" />
<field name="arch" type="xml">
<xpath expr="//page[@name='internal_notes']" position="before">
<page name="Import infos" string="Import infos">
<group name="Import infos" string="Import infos" col="6">
<field name="external_id"/>
<field name="statut_contact"/>
<field name="date_creation_contact"/>
<field name="origine"/>
<field name="date_adhesion"/>
</group>
</page>
</xpath>
</field>
</record>
<record id="opendons_partnerdraft_action" model="ir.actions.act_window">
<field name="name">Partners draft</field>
<field name="res_model">opendons.partnerdraft</field>
<field name="view_mode">tree,form</field>
<field name="context"></field>
</record>
<record id="opendons_partnerdraftfile_action" model="ir.actions.act_window">
<field name="name">Partners draft file</field>
<field name="res_model">opendons.partnerdraftfile</field>
<field name="view_mode">tree,form</field>
<field name="context"></field>
</record>
<record id="opendons_partnerdraft_file_mapping_action" model="ir.actions.act_window">
<field name="name">file mapping</field>
<field name="res_model">opendons.partnerdraftfile_mapping</field>
<field name="view_mode">tree,form</field>
<field name="context"></field>
</record>
<menuitem id="opendons_partnerdraft_title_menu" name ="Partners import"
parent="contacts.menu_contacts" sequence="4"/>
<menuitem id="opendons_partnerdraft_menu" action="opendons_partnerdraft_action" name ="Partners imported"
parent="opendons_partnerdraft_title_menu" sequence="1"/>
<menuitem id="opendons_partnerdraftfile_menu" action="opendons_partnerdraftfile_action" name ="Partners files"
parent="opendons_partnerdraft_title_menu" sequence="2"/>
<menuitem id="opendons_partnerdraft_file_mapping_menu" action="opendons_partnerdraft_file_mapping_action" name ="mapping fields"
parent="opendons_partnerdraft_title_menu" sequence="3"/>
<menuitem id="opendons_partnerdraftfileimport_menu" action="ir_action_partnerdraft_import" name ="Import files"
parent="opendons_partnerdraft_title_menu" sequence="4"/>
<menuitem id="opendons_partnerdraftfiletransfert_menu" action="ir_action_partnerdraft_transfert" name ="Draft Partners transfert"
parent="opendons_partnerdraft_title_menu" sequence="5"/>
</odoo>

views/donation.xml → views/recurring_donation.xml View File


+ 55
- 0
views/settings.xml View File

@ -0,0 +1,55 @@
<odoo>
<record id="res_config_settings_view_form" model="ir.ui.view">
<field name="name">res.config.settings.view.form.inherit.opendons</field>
<field name="model">res.config.settings</field>
<field name="inherit_id" ref="base.res_config_settings_view_form" />
<field name="arch" type="xml">
<xpath expr="//div[hasclass('settings')]" position="inside">
<div class="app_settings_block" data-string="Opendon" data-key="opendons">
<h2>Recurring payment management</h2>
<div class="row mt16 o_settings_container">
<div class="o_setting_left_pane">
<label for="generation_day" class="o_light_label"/>
<field name="generation_day"/>
<label for="limit_days_before" class="o_light_label"/>
<field name="limit_days_before"/>
<label for="pa_debug_mode" class="o_light_label"/>
<field name="pa_debug_mode"/>
</div>
</div>
</div>
</xpath>
</field>
</record>
<data noupdate="1">
<!-- <record id="opendons_generation_day_param" model="ir.config_parameter">
<field name="key">opendons.generation_day</field>
<field name="value">5</field>
</record>
<record id="opendons_limit_days_before_param" model="ir.config_parameter">
<field name="key">opendons.limit_days_before</field>
<field name="value">15</field>
</record>
<record id="opendons_pa_debug_mode" model="ir.config_parameter">
<field name="key">opendons.pa_debug_mode</field>
<field name="value">False</field>
</record> -->
</data>
<record model="ir.actions.act_window" id="action_recurring_payment_config">
<field name="name">Settings</field>
<field name="type">ir.actions.act_window</field>
<field name="res_model">res.config.settings</field>
<field name="view_id" ref="res_config_settings_view_form"/>
<field name="view_mode">form</field>
<field name="target">inline</field>
<field name="context">{'module':'opendons'}</field>
</record>
<menuitem id="menu_recurring_donation_configuration"
action="action_recurring_payment_config"
parent="recurring_donation_configuration_menu"
sequence="30"/>
</odoo>

+ 43
- 0
views/template_pa.xml View File

@ -0,0 +1,43 @@
<odoo>
<record model="ir.ui.view" id="opendons.template_pa_form" >
<field name="name">opendons_template_pa Form</field>
<field name="model">opendons.template_pa_letter</field>
<field name="arch" type="xml">
<form>
<header>
<!-- <button name="action_update_receipts" type="object" string="Update receipts" class="oe_highlight" confirm="Voulez-vous modifier les RF liés à ce template ?"/> -->
</header>
<sheet>
<group name="main">
<field name="name"/>
<field name="description"/>
<field name="active"/>
<field name="html_content"/>
</group>
</sheet>
</form>
</field>
</record>
<record model="ir.actions.act_window" id="template_pa_action">
<field name="name">Recurring donation Templates </field>
<field name="res_model">opendons.template_pa_letter</field>
<field name="view_mode">tree,form</field>
</record>
<menuitem
id="opendons_template_pa"
action="template_pa_action"
parent="opendons.recurring_donation_configuration_menu"
sequence="30"
/>
</odoo>

+ 2
- 1
wizard/__init__.py View File

@ -1 +1,2 @@
from . import operation_duplicate_wizard
from . import operation_duplicate_wizard
from . import recurring_donation_wizard

+ 17
- 0
wizard/recurring_donation_wizard.py View File

@ -0,0 +1,17 @@
from odoo import fields, models, _
class RecurringDonationWizard(models.TransientModel):
_name = 'opendons.recurringdonation.wizard'
_description = 'recurring donation wizard'
stopped_reason=fields.Selection(string='Stop reason',selection=[('motif1', 'Motif 1'), ('motif2', 'Motif 2')])
donation_id=fields.Integer('donation id')
def stopRecurringDonation(self):
donation=self.env['donation.donation'].search([('id','=',self.donation_id)])
donation.recurring_template="stopped"
donation.stopped_reason=self.stopped_reason
donation.stopped_date=fields.Date.context_today(self)

+ 29
- 0
wizard/recurring_donation_wizard.xml View File

@ -0,0 +1,29 @@
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<record id="recurring_donation_view" model="ir.ui.view">
<field name="name">donation.recurring.wizard</field>
<field name="model">opendons.recurringdonation.wizard</field>
<field name="arch" type="xml">
<form>
<p>Please select a raison :</p>
<field name="stopped_reason"/>
<footer>
<button name="stopRecurringDonation" string="stop the recurring donation" type="object"/>
<button string="Cancel" class="btn btn-secondary" special="cancel" />
</footer>
</form>
</field>
</record>
<record id="action_recurring_donation_wizard" model="ir.actions.act_window">
<field name="name">Stop recurring donation</field>
<field name="res_model">opendons.recurringdonation.wizard</field>
<field name="view_mode">form</field>
<field name="target">new</field>
<field name="binding_model_id" ref="donation.model_donation_donation"/>
</record>
</odoo>

Loading…
Cancel
Save