@ -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 <%s>' % (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> |
@ -1,12 +1,3 @@ | |||
<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> |
@ -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 |
@ -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) |
@ -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') | |||
@ -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,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> |
@ -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> |
@ -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> |
@ -1 +1,2 @@ | |||
from . import operation_duplicate_wizard | |||
from . import operation_duplicate_wizard | |||
from . import recurring_donation_wizard |
@ -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) | |||
@ -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> |