-
Notifications
You must be signed in to change notification settings - Fork 28
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge commit 'refs/pull/145/head' of github.com:acsone/acsone-addons …
…into 10.0-abi_master
- Loading branch information
Showing
8 changed files
with
300 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
Import Paypal Bank Statements | ||
============================= | ||
|
||
This module allows you to import the Paypal CSV files in Odoo as bank statements. | ||
|
||
Installation | ||
============ | ||
|
||
This module depends on the module *account_bank_statement_import* which | ||
is available: | ||
* for Odoo version 8: in the OCA project `bank-statement-import <https://github.com/OCA/bank-statement-import>` | ||
* for Odoo master (future version 9): it is an official module. | ||
|
||
Configuration | ||
============= | ||
|
||
In the menu Accounting > Configuration > Accounts > Setup your Bank Accounts, make sure that you have your Paypal bank account with the following parameters: | ||
* Bank Account Type: Normal Bank Account | ||
* Account Number: the email address associated with your Paypal account | ||
* Account Journal: the journal associated to your Paypal account | ||
|
||
Credits | ||
======= | ||
|
||
Contributors | ||
------------ | ||
|
||
* Alexis de Lattre <alexis.delattre@akretion.com> | ||
|
||
Maintainer | ||
---------- | ||
|
||
.. image:: http://odoo-community.org/logo.png | ||
:alt: Odoo Community Association | ||
:target: http://odoo-community.org | ||
|
||
This module is maintained by the OCA. | ||
|
||
OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. | ||
|
||
To contribute to this module, please visit http://odoo-community.org. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
# -*- encoding: utf-8 -*- | ||
from . import account_bank_statement_import_paypal |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,16 @@ | ||
# -*- coding: utf-8 -*- | ||
# Copyright 2014-2015 Akretion (<http://acsone.eu>) | ||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). | ||
|
||
{ | ||
'name': 'Import Paypal Bank Statements', | ||
'version': '10.0.1.0.0', | ||
'license': 'AGPL-3', | ||
'author': 'Akretion', | ||
'website': 'http://www.akretion.com', | ||
'summary': 'Import Paypal CSV files as Bank Statements in Odoo', | ||
'depends': ['account_bank_statement_import'], | ||
'external_dependencies': {'python': ['unicodecsv']}, | ||
'data': [], | ||
'installable': True, | ||
} |
232 changes: 232 additions & 0 deletions
232
account_bank_statement_import_paypal/account_bank_statement_import_paypal.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,232 @@ | ||
# -*- encoding: utf-8 -*- | ||
############################################################################## | ||
# | ||
# account_bank_statement_import_paypal module for Odoo | ||
# Copyright (C) 2014-2015 Akretion (http://www.akretion.com) | ||
# @author Alexis de Lattre <alexis.delattre@akretion.com> | ||
# | ||
# This program is free software: you can redistribute it and/or modify | ||
# it under the terms of the GNU Affero General Public License as | ||
# published by the Free Software Foundation, either version 3 of the | ||
# License, or (at your option) any later version. | ||
# | ||
# This program is distributed in the hope that it will be useful, | ||
# but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
# GNU Affero General Public License for more details. | ||
# | ||
# You should have received a copy of the GNU Affero General Public License | ||
# along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
# | ||
############################################################################## | ||
|
||
import logging | ||
from datetime import datetime | ||
from odoo import models, fields, api, _ | ||
from odoo.exceptions import Warning | ||
import re | ||
from cStringIO import StringIO | ||
|
||
_logger = logging.getLogger(__name__) | ||
|
||
try: | ||
import unicodecsv | ||
except ImportError: | ||
_logger.debug("Cannot import 'unicodecsv'.") | ||
|
||
|
||
class AccountBankStatementImport(models.TransientModel): | ||
_inherit = 'account.bank.statement.import' | ||
|
||
@api.model | ||
def _prepare_paypal_encoding(self): | ||
'''This method is designed to be inherited''' | ||
return 'UTF-8' | ||
|
||
@api.model | ||
def _prepare_paypal_date_format(self): | ||
'''This method is designed to be inherited''' | ||
return '%d/%m/%Y' | ||
|
||
@api.model | ||
def _valid_paypal_line(self, line): | ||
'''This method is designed to be inherited''' | ||
if line[5].startswith('Termin') or line[5].startswith('Rembours'): | ||
return True | ||
else: | ||
return False | ||
|
||
@api.model | ||
def _paypal_convert_amount(self, amount_str): | ||
'''This method is designed to be inherited''' | ||
valstr = re.sub(r'[^\d,.-]', '', amount_str) | ||
valstrdot = valstr.replace('.', '') | ||
valstrdot = valstrdot.replace(',', '.') | ||
return float(valstrdot) | ||
|
||
@api.model | ||
def _check_paypal(self, data_file): | ||
'''This method is designed to be inherited''' | ||
try: | ||
data_file_encode = data_file.strip()[:10].decode('utf-8') | ||
starts = u'"Date",' | ||
return data_file_encode == starts | ||
except: | ||
return False | ||
|
||
@api.model | ||
def _parse_file(self, data_file): | ||
""" Import a file in Paypal CSV format""" | ||
paypal = self._check_paypal(data_file) | ||
if not paypal: | ||
return super(AccountBankStatementImport, self)._parse_file( | ||
data_file) | ||
f = StringIO() | ||
f.write(data_file) | ||
f.seek(0) | ||
transactions = [] | ||
i = 0 | ||
start_balance = end_balance = start_date_str = end_date_str = False | ||
vals_line = False | ||
company_currency_name = self.env.user.company_id.currency_id.name | ||
commission_total = 0.0 | ||
raw_lines = [] | ||
paypal_email_account = False | ||
# To confirm : is the encoding always latin1 ? | ||
for line in unicodecsv.reader( | ||
f, encoding=self._prepare_paypal_encoding()): | ||
i += 1 | ||
_logger.debug("Line %d: %s" % (i, line)) | ||
if i == 1: | ||
_logger.debug('Skip header line') | ||
continue | ||
if not line: | ||
continue | ||
if not self._valid_paypal_line(line): | ||
_logger.info( | ||
'Skipping line %d because it is not in Done state' % i) | ||
continue | ||
date_dt = datetime.strptime( | ||
line[0], self._prepare_paypal_date_format()) | ||
rline = { | ||
'date': fields.Date.to_string(date_dt), | ||
'currency': line[6], | ||
'owner_name': line[3], | ||
'amount': line[7], | ||
'commission': line[8], | ||
'balance': line[29], | ||
'transac_ref': line[24], | ||
'ref': line[12], | ||
'line_nr': i, | ||
} | ||
for field in ['commission', 'amount', 'balance']: | ||
_logger.debug('Trying to convert %s to float' % rline[field]) | ||
try: | ||
rline[field] = self._paypal_convert_amount(rline[field]) | ||
except: | ||
raise Warning( | ||
_("Value '%s' for the field '%s' on line %d, " | ||
"cannot be converted to float") | ||
% (rline[field], field, i)) | ||
if rline['amount'] > 0: | ||
rline['name'] = line[3] + ' ' + line[10] | ||
rline['partner_email'] = line[10] | ||
if not paypal_email_account: | ||
paypal_email_account = line[11] | ||
else: | ||
rline['name'] = line[3] + ' ' + line[11] | ||
rline['partner_email'] = line[11] | ||
if not paypal_email_account: | ||
paypal_email_account = line[10] | ||
raw_lines.append(rline) | ||
|
||
# Second pass to sort out the lines in other currencies | ||
final_lines = [] | ||
other_currency_line = {} | ||
for wline in raw_lines: | ||
if company_currency_name != wline['currency']: | ||
if not wline['transac_ref'] and not other_currency_line: | ||
currencies = self.env['res.currency'].search( | ||
[('name', '=', wline['currency'])]) | ||
if not currencies: | ||
raise Warning( | ||
_('Currency %s on line %d cannot be found in Odoo') | ||
% (wline['currency'], wline['line_nr'])) | ||
other_currency_line = { | ||
'amount_currency': wline['amount'], | ||
'currency_id': currencies[0].id, | ||
'currency': wline['currency'], | ||
'name': wline['name'], | ||
'owner_name': wline['owner_name'], | ||
} | ||
if wline['transac_ref'] and other_currency_line: | ||
assert ( | ||
wline['currency'] == other_currency_line['currency']),\ | ||
'WRONG currency' | ||
assert ( | ||
wline['amount'] == | ||
other_currency_line['amount_currency'] * -1),\ | ||
'WRONG amount' | ||
other_currency_line['transac_ref'] = wline['transac_ref'] | ||
else: | ||
if ( | ||
other_currency_line | ||
and wline['transac_ref'] == | ||
other_currency_line['transac_ref']): | ||
wline.update(other_currency_line) | ||
# reset other_currency_line | ||
other_currency_line = {} | ||
final_lines.append(wline) | ||
|
||
# PayPal statements start with the end ! | ||
final_lines.reverse() | ||
j = 0 | ||
for fline in final_lines: | ||
j += 1 | ||
commission_total += fline['commission'] | ||
|
||
if j == 1: | ||
start_date_str = fline['date'] | ||
start_balance = fline['balance'] - fline['amount'] | ||
end_date_str = fline['date'] | ||
end_balance = fline['balance'] | ||
partners = False | ||
if fline['partner_email']: | ||
partners = self.env['res.partner'].search( | ||
[('email', '=', fline['partner_email'])]) | ||
if partners: | ||
partner_id = partners[0].commercial_partner_id.id | ||
else: | ||
partner_id = False | ||
vals_line = { | ||
'date': fline['date'], | ||
'name': fline['ref'], | ||
'ref': fline['name'], | ||
'unique_import_id': fline['ref'], | ||
'amount': fline['amount'], | ||
'partner_id': partner_id, | ||
'bank_account_id': False, | ||
'currency_id': fline.get('currency_id'), | ||
'amount_currency': fline.get('amount_currency'), | ||
} | ||
_logger.debug("vals_line = %s" % vals_line) | ||
transactions.append(vals_line) | ||
|
||
if commission_total: | ||
commission_line = { | ||
'date': end_date_str, | ||
'name': _('Paypal commissions'), | ||
'ref': _('PAYPAL-COSTS'), | ||
'amount': commission_total, | ||
'unique_import_id': False, | ||
} | ||
transactions.append(commission_line) | ||
|
||
vals_bank_statement = { | ||
'name': _('PayPal Import %s > %s') | ||
% (start_date_str, end_date_str), | ||
'balance_start': start_balance, | ||
'balance_end_real': end_balance, | ||
'transactions': transactions, | ||
} | ||
return None, None, [vals_bank_statement] |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
__import__('pkg_resources').declare_namespace(__name__) |
1 change: 1 addition & 0 deletions
1
setup/account_bank_statement_import_paypal/odoo/addons/__init__.py
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
__import__('pkg_resources').declare_namespace(__name__) |
1 change: 1 addition & 0 deletions
1
setup/account_bank_statement_import_paypal/odoo/addons/account_bank_statement_import_paypal
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
../../../../account_bank_statement_import_paypal |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
import setuptools | ||
|
||
setuptools.setup( | ||
setup_requires=['setuptools-odoo'], | ||
odoo_addon=True, | ||
) |