Merge lp:~openerp/openobject-addons/5.0-certified-addons into lp:openobject-addons

Proposed by Gelson Mata
Status: Rejected
Rejected by: Fabien (Open ERP)
Proposed branch: lp:~openerp/openobject-addons/5.0-certified-addons
Merge into: lp:openobject-addons
Diff against target: 32674 lines (+31330/-0) (has conflicts)
249 files modified
.bzrignore (+2/-0)
account_invoice_cash_discount/__init__.py (+27/-0)
account_invoice_cash_discount/__terp__.py (+48/-0)
account_invoice_cash_discount/account_invoice_cash_discount.py (+1179/-0)
account_invoice_cash_discount/account_invoice_cash_discount_view.xml (+268/-0)
account_invoice_cash_discount/account_invoice_cash_discount_wizard.xml (+30/-0)
account_invoice_cash_discount/i18n/account_invoice_cash_discount.pot (+673/-0)
account_invoice_cash_discount/i18n/de_DE.po (+675/-0)
account_invoice_cash_discount/security/ir.model.access.csv (+22/-0)
account_invoice_cash_discount/wizard/__init__.py (+29/-0)
account_invoice_cash_discount/wizard/account_pay_invoice.py (+651/-0)
account_invoice_cash_discount/wizard/account_pay_invoice_view.xml (+135/-0)
account_invoice_cash_discount/wizard/invoice_statement_payment.py (+288/-0)
account_invoice_cash_discount/wizard/wizard_discount_reconcile.py (+291/-0)
account_invoice_cash_discount/wizard/wizard_write_period_entry_calculation.py (+188/-0)
account_payment_discount_extension/__init__.py (+24/-0)
account_payment_discount_extension/__terp__.py (+44/-0)
account_payment_discount_extension/account_payment_discount.py (+115/-0)
account_payment_discount_extension/account_payment_discount_data.xml (+15/-0)
account_payment_discount_extension/account_payment_discount_view.xml (+138/-0)
account_payment_discount_extension/account_payment_disocunt_wizard.xml (+27/-0)
account_payment_discount_extension/i18n/account_payment_discount_extension.pot (+176/-0)
account_payment_discount_extension/i18n/de_DE.po (+176/-0)
account_payment_discount_extension/wizard/__init__.py (+28/-0)
account_payment_discount_extension/wizard/wizard_discount_pay.py (+84/-0)
account_payment_discount_extension/wizard/wizard_next_payment_date.py (+82/-0)
account_payment_discount_extension/wizard/wizard_payment_discount_order.py (+249/-0)
account_payment_extension/__init__.py (+34/-0)
account_payment_extension/__terp__.py (+37/-0)
account_payment_extension/account_invoice.py (+83/-0)
account_payment_extension/account_move_line.py (+136/-0)
account_payment_extension/i18n/account_payment_extension.pot (+201/-0)
account_payment_extension/i18n/ca_ES.po (+201/-0)
account_payment_extension/i18n/es_ES.po (+201/-0)
account_payment_extension/payment.py (+144/-0)
account_payment_extension/payment_sequence.xml (+16/-0)
account_payment_extension/payment_view.xml (+428/-0)
account_payment_extension/payment_wizard.xml (+6/-0)
account_payment_extension/wizard/__init__.py (+26/-0)
account_payment_extension/wizard/wizard_payment_order.py (+157/-0)
base_external_referentials/__init__.py (+2/-0)
base_external_referentials/__terp__.py (+56/-0)
base_external_referentials/base_external_referentials.py (+238/-0)
base_external_referentials/base_external_referentials_view.xml (+92/-0)
base_external_referentials/external_osv.py (+349/-0)
base_external_referentials/i18n/base_external_referentials.pot (+337/-0)
base_external_referentials/i18n/ca_ES.po (+350/-0)
base_external_referentials/i18n/es_ES.po (+350/-0)
base_sale_multichannels/__init__.py (+1/-0)
base_sale_multichannels/__terp__.py (+59/-0)
base_sale_multichannels/i18n/base_sale_multichannels.pot (+306/-0)
base_sale_multichannels/i18n/ca.po (+378/-0)
base_sale_multichannels/i18n/ca_ES.po (+333/-0)
base_sale_multichannels/i18n/es.po (+379/-0)
base_sale_multichannels/i18n/es_ES.po (+334/-0)
base_sale_multichannels/sale.py (+267/-0)
base_sale_multichannels/sale_view.xml (+79/-0)
bom_search_product/__init__.py (+20/-0)
bom_search_product/__terp__.py (+40/-0)
bom_search_product/wizard.xml (+16/-0)
bom_search_product/wizard/__init__.py (+20/-0)
bom_search_product/wizard/bom_search_product.py (+84/-0)
magentoerpconnect/__init__.py (+27/-0)
magentoerpconnect/__terp__.py (+56/-0)
magentoerpconnect/delivery.py (+41/-0)
magentoerpconnect/delivery_view.xml (+21/-0)
magentoerpconnect/i18n/ca_ES.po (+1606/-0)
magentoerpconnect/i18n/es_ES.po (+1609/-0)
magentoerpconnect/i18n/magentoerpconnect.pot (+1606/-0)
magentoerpconnect/i18n/x_magaerp.pot (+201/-0)
magentoerpconnect/invoice.py (+32/-0)
magentoerpconnect/magerp_core.py (+202/-0)
magentoerpconnect/magerp_core_view.xml (+144/-0)
magentoerpconnect/magerp_data.xml (+110/-0)
magentoerpconnect/magerp_menu.xml (+19/-0)
magentoerpconnect/magerp_osv.py (+267/-0)
magentoerpconnect/partner.py (+62/-0)
magentoerpconnect/partner_view.xml (+49/-0)
magentoerpconnect/product.py (+921/-0)
magentoerpconnect/product_images.py (+116/-0)
magentoerpconnect/product_images_view.xml (+25/-0)
magentoerpconnect/product_view.xml (+281/-0)
magentoerpconnect/sale.py (+419/-0)
magentoerpconnect/sale_view.xml (+69/-0)
magentoerpconnect/security/ir.model.access.csv (+8/-0)
magentoerpconnect/settings/external.mapping.template.csv (+14/-0)
magentoerpconnect/settings/external.mappinglines.template.csv (+229/-0)
magentoerpconnect/settings/external.referential.type.csv (+2/-0)
magentoerpconnect/settings/magerp_product_product_type.xml (+29/-0)
magentoerpconnect/stock.py (+95/-0)
mrp_prodlot_autosplit/__init__.py (+2/-0)
mrp_prodlot_autosplit/__terp__.py (+47/-0)
mrp_prodlot_autosplit/product.py (+14/-0)
mrp_prodlot_autosplit/product_view.xml (+18/-0)
mrp_prodlot_autosplit/stock.py (+88/-0)
mrp_prodlot_autosplit/stock_view.xml (+49/-0)
multi_dealers/__init__.py (+20/-0)
multi_dealers/__terp__.py (+46/-0)
multi_dealers/multi_dealers.py (+409/-0)
multi_dealers/multi_dealers_view.xml (+126/-0)
multi_dealers/multi_dealers_workflow.xml (+32/-0)
multi_dealers/security/multi_dealers_security.xml (+24/-0)
packing_barcode_check/__init__.py (+26/-0)
packing_barcode_check/__terp__.py (+51/-0)
packing_barcode_check/i18n/de_DE.po (+265/-0)
packing_barcode_check/i18n/packing_barcode_check.pot (+261/-0)
packing_barcode_check/packing_barcode_check.py (+173/-0)
packing_barcode_check/packing_barcode_check_report.xml (+13/-0)
packing_barcode_check/packing_barcode_check_view.xml (+89/-0)
packing_barcode_check/packing_barcode_check_wizard.xml (+11/-0)
packing_barcode_check/packing_barcode_check_workflow.xml (+30/-0)
packing_barcode_check/report/__init__.py (+26/-0)
packing_barcode_check/report/bar_code_check.py (+35/-0)
packing_barcode_check/report/bar_code_check.rml (+127/-0)
packing_barcode_check/security/ir.model.access.csv (+5/-0)
packing_barcode_check/wizard/__init__.py (+27/-0)
packing_barcode_check/wizard/scan_product.py (+174/-0)
packing_barcode_check/wizard/select_picking.py (+82/-0)
pos_tax_include/__init__.py (+1/-0)
pos_tax_include/__terp__.py (+20/-0)
pos_tax_include/pos.py (+136/-0)
pos_tax_include/pos.xml (+25/-0)
product_ean13_generator/__init__.py (+27/-0)
product_ean13_generator/__terp__.py (+51/-0)
product_ean13_generator/i18n/de_DE.po (+124/-0)
product_ean13_generator/i18n/product_ean13_generator.pot (+118/-0)
product_ean13_generator/product_ean13_generator.py (+59/-0)
product_ean13_generator/product_ean13_generator_report.xml (+12/-0)
product_ean13_generator/product_ean13_generator_sequence.xml (+48/-0)
product_ean13_generator/product_ean13_generator_wizard.xml (+11/-0)
product_ean13_generator/report/__init__.py (+25/-0)
product_ean13_generator/report/product_ean_generator_report.rml (+120/-0)
product_ean13_generator/report/report_product_ean_sequencer.py (+35/-0)
product_ean13_generator/security/ir.model.access.csv (+1/-0)
product_ean13_generator/wizard/__init__.py (+25/-0)
product_ean13_generator/wizard/generator_ean13.py (+84/-0)
product_images_olbs/__init__.py (+19/-0)
product_images_olbs/__terp__.py (+42/-0)
product_images_olbs/product.py (+28/-0)
product_images_olbs/product_images.py (+56/-0)
product_images_olbs/security/ir.model.access.csv (+2/-0)
product_images_olbs/views/product_images_view.xml (+58/-0)
product_m2mcategories/__init__.py (+18/-0)
product_m2mcategories/__terp__.py (+40/-0)
product_m2mcategories/i18n/ca.po (+65/-0)
product_m2mcategories/i18n/ca_ES.po (+58/-0)
product_m2mcategories/i18n/es.po (+64/-0)
product_m2mcategories/i18n/es_ES.po (+58/-0)
product_m2mcategories/i18n/product_m2mcategories.pot (+52/-0)
product_m2mcategories/product.py (+25/-0)
product_m2mcategories/product_view.xml (+21/-0)
product_price_information/__init__.py (+27/-0)
product_price_information/__terp__.py (+45/-0)
product_price_information/i18n/de_DE.po (+245/-0)
product_price_information/i18n/product_price_information.pot (+244/-0)
product_price_information/product_price_info.py (+188/-0)
product_price_information/product_price_info_view.xml (+113/-0)
product_price_information/security/ir.model.access.csv (+3/-0)
product_price_information/wizard/__init__.py (+26/-0)
product_price_information/wizard/sale_prize_information.py (+99/-0)
product_price_information/wizard/sale_prize_information_view.xml (+60/-0)
product_tax_include/.license (+21/-0)
product_tax_include/__init__.py (+28/-0)
product_tax_include/__terp__.py (+52/-0)
product_tax_include/i18n/ca.po (+78/-0)
product_tax_include/i18n/de_DE.po (+72/-0)
product_tax_include/i18n/es.po (+79/-0)
product_tax_include/i18n/fr.po (+71/-0)
product_tax_include/i18n/fr_FR.po (+66/-0)
product_tax_include/i18n/product_tax_include.pot (+66/-0)
product_tax_include/i18n/pt.po (+77/-0)
product_tax_include/object/__init__.py (+27/-0)
product_tax_include/object/company.py (+40/-0)
product_tax_include/object/product.py (+74/-0)
product_tax_include/view/company.xml (+41/-0)
product_tax_include/view/product.xml (+38/-0)
profile_artdeceau/__init__.py (+4/-0)
profile_artdeceau/__terp__.py (+60/-0)
profile_artdeceau/artdeceau.xml (+52/-0)
profile_artdeceau/report/invoice.rml (+200/-0)
profile_artdeceau/report/invoice_pos.rml (+128/-0)
profile_artdeceau/report/pos_lines.rml (+286/-0)
profile_artdeceau/report/pos_receipt.rml (+181/-0)
profile_artdeceau/report/purchase.rml (+228/-0)
profile_artdeceau/sale_crm.py (+9/-0)
profile_artdeceau/screens.py (+106/-0)
profile_artdeceau/screens_view.xml (+141/-0)
sale_invoice_collector/__init__.py (+1/-0)
sale_invoice_collector/__terp__.py (+28/-0)
sale_invoice_collector/sale.py (+288/-0)
sale_invoice_collector/sale.xml (+71/-0)
sale_order_report_extended/__init__.py (+20/-0)
sale_order_report_extended/__terp__.py (+45/-0)
sale_order_report_extended/report/sale.rml (+327/-0)
sale_order_report_extended/sale_order_report_extended.py (+76/-0)
sale_order_report_extended/sale_order_report_extended.xml (+13/-0)
sale_order_report_extended/sale_order_report_extended_view.xml (+68/-0)
sale_order_template/__init__.py (+2/-0)
sale_order_template/__terp__.py (+41/-0)
sale_order_template/sale.py (+66/-0)
sale_order_template/sale.xml (+46/-0)
sale_order_template/wizard.xml (+10/-0)
sale_order_template/wizard/__init__.py (+20/-0)
sale_order_template/wizard/import_template.py (+76/-0)
sale_tax_include/__init__.py (+25/-0)
sale_tax_include/__terp__.py (+42/-0)
sale_tax_include/i18n/de_DE.po (+65/-0)
sale_tax_include/i18n/fr.po (+60/-0)
sale_tax_include/i18n/fr_BE.po (+56/-0)
sale_tax_include/i18n/fr_FR.po (+60/-0)
sale_tax_include/i18n/sale_tax_include.pot (+61/-0)
sale_tax_include/sale_tax_incl.py (+132/-0)
sale_tax_include/sale_tax_incl.xml (+30/-0)
sale_tender/__init__.py (+24/-0)
sale_tender/__terp__.py (+40/-0)
sale_tender/sale_tender.py (+42/-0)
sale_tender/sale_tender_view.xml (+4/-0)
sales_shop_stock_availability/__init__.py (+27/-0)
sales_shop_stock_availability/__terp__.py (+46/-0)
sales_shop_stock_availability/i18n/de_DE.po (+156/-0)
sales_shop_stock_availability/i18n/sales_shop_stock_availability.pot (+151/-0)
sales_shop_stock_availability/sales_shop_stock_availability.py (+81/-0)
sales_shop_stock_availability/sales_shop_stock_availability_view.xml (+58/-0)
sales_shop_stock_availability/security/ir.model.access.csv (+3/-0)
sales_shop_stock_availability/wizard/__init__.py (+25/-0)
sales_shop_stock_availability/wizard/stock_shop_availability.py (+72/-0)
sales_shop_stock_availability/wizard/stock_shop_availability_view.xml (+48/-0)
seasonal_orderpoint/__init__.py (+1/-0)
seasonal_orderpoint/__terp__.py (+23/-0)
seasonal_orderpoint/i18n/fr_FR.po (+303/-0)
seasonal_orderpoint/orderpoint.py (+62/-0)
seasonal_orderpoint/seasonal_orderpoint_view.xml (+31/-0)
stock_minimum_calculator/__init__.py (+27/-0)
stock_minimum_calculator/__terp__.py (+45/-0)
stock_minimum_calculator/i18n/de_DE.po (+309/-0)
stock_minimum_calculator/i18n/stock_minimum_calculator.pot (+307/-0)
stock_minimum_calculator/security/ir.model.access.csv (+9/-0)
stock_minimum_calculator/stock_minimum_calculator.py (+77/-0)
stock_minimum_calculator/stock_minimum_calculator_demo.xml (+15/-0)
stock_minimum_calculator/stock_minimum_calculator_sequence.xml (+17/-0)
stock_minimum_calculator/stock_minimum_calculator_view.xml (+119/-0)
stock_minimum_calculator/stock_minimum_calculator_wizard.xml (+17/-0)
stock_minimum_calculator/supplier_cost_optimated_leadtimes.py (+69/-0)
stock_minimum_calculator/supplier_cost_optimated_leadtimes_view.xml (+46/-0)
stock_minimum_calculator/supplier_cost_optimized_leadtimes.py (+67/-0)
stock_minimum_calculator/supplier_cost_optimized_leadtimes_view.xml (+43/-0)
stock_minimum_calculator/wizard/__init__.py (+27/-0)
stock_minimum_calculator/wizard/seasonal_trend_set.py (+79/-0)
stock_minimum_calculator/wizard/stock_order_point_calculator.py (+374/-0)
Conflict adding file .bzrignore.  Moved existing file to .bzrignore.moved.
To merge this branch: bzr merge lp:~openerp/openobject-addons/5.0-certified-addons
Reviewer Review Type Date Requested Status
OpenERP Core Team Pending
Review via email: mp+69732@code.launchpad.net
To post a comment you must log in.
Revision history for this message
Fabien (Open ERP) (fp-tinyerp) wrote :

Hello,

I think it's better to keep these modules in a separate branch.

Unmerged revisions

13. By Olivier Laurent (Open ERP)

[CERT] added certificate numbers to artdeceau modules

12. By Olivier Laurent (Open ERP)

[ADD] added artdeceau modules

11. By Olivier Laurent (Open ERP)

[CERT] added certificates

10. By Olivier Laurent (Open ERP)

[CERT] new certified modules

9. By Stephane Wirtel (OpenERP)

[CERTIFICATION] Add the mrp_prodlot_autosplit module from lp:~openerp-commiter/openobject-addons/stable_5.0-extra-addons

8. By Stephane Wirtel (OpenERP)

[CERTIFICATION] Add the product_m2mcategories module from lp:~openerp-commiter/openobject-addons/stable_5.0-extra-addons

7. By Stephane Wirtel (OpenERP)

[CERTIFICATION] Add the base_external_referentials module from lp:~openerp-commiter/openobject-addons/stable_5.0-extra-addons

6. By Stephane Wirtel (OpenERP)

[CERTIFICATION] Add the account_payment_extension module from lp:~openerp-commiter/openobject-addons/stable_5.0-extra-addons

5. By Stephane Wirtel (OpenERP)

[CERTIFICATION] Add the base_sale_multichannels module from lp:~openerp-commiter/openobject-addons/stable_5.0-extra-addons

4. By Stephane Wirtel (OpenERP)

[CERTIFICATION] Add the product_images_olbs module from lp:~openerp-commiter/openobject-addons/stable_5.0-extra-addons

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== added file '.bzrignore'
--- .bzrignore 1970-01-01 00:00:00 +0000
+++ .bzrignore 2011-07-29 01:35:58 +0000
@@ -0,0 +1,2 @@
1.project
2.pydevproject
03
=== renamed file '.bzrignore' => '.bzrignore.moved'
=== added file 'README'
=== added directory 'account_invoice_cash_discount'
=== added file 'account_invoice_cash_discount/__init__.py'
--- account_invoice_cash_discount/__init__.py 1970-01-01 00:00:00 +0000
+++ account_invoice_cash_discount/__init__.py 2011-07-29 01:35:58 +0000
@@ -0,0 +1,27 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6# $Id$
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23import wizard
24import account_invoice_cash_discount
25
26# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
27
028
=== added file 'account_invoice_cash_discount/__terp__.py'
--- account_invoice_cash_discount/__terp__.py 1970-01-01 00:00:00 +0000
+++ account_invoice_cash_discount/__terp__.py 2011-07-29 01:35:58 +0000
@@ -0,0 +1,48 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6# $Id$
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22{
23 "name" : "Payment Term with Cash Discount",
24 "version" : "1.0",
25 "depends" : ["account","account_payment_discount_extension"],
26 "author" : "Big Consulting",
27 "website" : "http://www.openbig.org",
28 "category" : "",
29 "description": """
30 Module to add account move lines in case of payment with cash discount conditions in reconcilation form.
31 """,
32 "init_xml" : [
33 ],
34 "demo_xml" : [
35 ],
36 "update_xml" : [
37 "security/ir.model.access.csv",
38 'wizard/account_pay_invoice_view.xml',
39 "account_invoice_cash_discount_wizard.xml",
40 "account_invoice_cash_discount_view.xml",
41 ],
42 "active": False,
43 "installable": True,
44 'certificate': '001146321429795267965',
45
46}
47# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
48
049
=== added file 'account_invoice_cash_discount/account_invoice_cash_discount.py'
--- account_invoice_cash_discount/account_invoice_cash_discount.py 1970-01-01 00:00:00 +0000
+++ account_invoice_cash_discount/account_invoice_cash_discount.py 2011-07-29 01:35:58 +0000
@@ -0,0 +1,1179 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6# $Id$
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23from osv import fields, osv
24from tools import config
25import time
26from tools.translate import _
27import netsvc
28
29class account_payment_term(osv.osv):
30 _name = "account.payment.term"
31 _inherit = "account.payment.term"
32 _columns = {
33 'cash_discount_ids': fields.one2many('account.cash.discount', 'payment_id', 'Cash Discount Terms'),
34 }
35account_payment_term()
36
37class account_cash_discount(osv.osv):
38 _name = "account.cash.discount"
39 _description = "Cash Discount"
40 _order ="delay"
41 _columns = {
42 'name': fields.char('Name', size=32),
43 'delay': fields.integer('Number of Days', required=True),
44 'discount': fields.float('Discount (%)', digits=(16,2), required=True),
45 'discount_account_id': fields.many2one('account.account', 'Customer Discount Account', required=True),
46 'sup_discount_account_id': fields.many2one('account.account', 'Supplier Discount Account', required=True),
47 'payment_id': fields.many2one('account.payment.term', 'Related Payment Term'),
48 }
49account_cash_discount()
50
51class account_payment_term_line(osv.osv):
52 _inherit = "account.payment.term.line"
53 _columns = {
54 'day_tolerance': fields.integer('Tolerance (Days)', digits=(16,0)),
55 'payment_id': fields.many2one('account.payment.term', 'Payment Term', required=False, select=True),
56 'compl_cash_discount': fields.boolean('Use Complete Cash Discount'),
57 }
58 _defaults = {
59 'day_tolerance': lambda *a: 0,
60 }
61account_payment_term_line()
62
63class account_invoice(osv.osv):
64 _inherit = "account.invoice"
65
66 def _get_amount(self, cr, uid, ids, residual_amount, payment_term, context=None):
67 """
68 This function returns the amount to be paid according to the cash discount payment term for the corresponding payment term
69 """
70 if context is None:
71 context = {}
72 tax_obj = self.pool.get('account.tax')
73 invoice = self.browse(cr, uid, ids[0], context=context)
74
75 date1 = invoice.date_invoice or time.strftime('%Y-%m-%d')
76 date2 = 'date_p' in context and context['date_p'] or time.strftime('%Y-%m-%d')
77 from_dt = time.mktime(time.strptime(date1, '%Y-%m-%d'))
78 to_dt = time.mktime(time.strptime(date2, '%Y-%m-%d'))
79 diff_day = abs(from_dt - to_dt) / (3600 * 24)
80
81 discount = amount = tol_days = 0.0
82 payment_line_found = False
83
84 if payment_term:
85 payment_term_lines = self.pool.get('account.payment.term').browse(cr, uid, payment_term, context=context)
86 if payment_term_lines.line_ids:
87 res = dis = 0.0
88 for payment_line in payment_term_lines.line_ids:
89 if diff_day >= dis and diff_day <= payment_line.days:
90 if residual_amount:
91 payment_line_found = True
92 tol_days = payment_line.day_tolerance
93 if payment_line.value == 'procent':
94 res = round((residual_amount * payment_line.value_amount), int(config['price_accuracy']))
95 elif payment_line.value == 'fixed':
96 res = payment_line.value_amount
97 else:
98 res = residual_amount
99 amount = res
100 dis = payment_line.days
101 else:
102 amount = residual_amount
103
104 return {'amount': amount, 'tol_days': tol_days, 'found': payment_line_found}
105
106 def _get_payment(self, cr, uid, ids, residual_amount, payment_term, context=None):
107 """
108 This function returns the cash discount according to the cash discount payment term for the corresponding payment term
109 """
110 if context is None:
111 context = {}
112
113 tax_obj = self.pool.get('account.tax')
114 invoice = self.browse(cr, uid, ids[0], context=context)
115
116 date1 = invoice.date_invoice or time.strftime('%Y-%m-%d')
117 date2 = 'date_p' in context and context['date_p'] or time.strftime('%Y-%m-%d')
118 from_dt = time.mktime(time.strptime(date1, '%Y-%m-%d'))
119 to_dt = time.mktime(time.strptime(date2, '%Y-%m-%d'))
120 diff_day = abs(from_dt - to_dt) / (3600 * 24)
121 tolerance = self._get_amount(cr, uid, ids, residual_amount, payment_term, context)
122 tolerance_days = tolerance['tol_days']
123
124 discount = 0.0
125 if payment_term:
126 payment_term_lines = self.pool.get('account.payment.term').browse(cr, uid, payment_term, context=context)
127 if payment_term_lines.cash_discount_ids:
128 res = dis = 0.0
129 for discount_line in payment_term_lines.cash_discount_ids:
130 if diff_day >= dis and diff_day <= discount_line.delay + tolerance_days:
131 if residual_amount:
132 res = round((residual_amount * discount_line.discount / 100), int(config['price_accuracy']))
133 discount = res
134 dis = discount_line.delay + tolerance_days
135 return discount
136
137 def _get_account(self, cr, uid, ids, residual_amount, payment_term, context=None):
138 """
139 This function returns the account according to the cash discount payment term for the corresponding payment term
140 """
141 if context is None:
142 context = {}
143
144 account_id = False
145
146 tax_obj = self.pool.get('account.tax')
147 invoice = self.browse(cr, uid, ids[0], context=context)
148
149 date1 = invoice.date_invoice or time.strftime('%Y-%m-%d')
150 date2 = 'date_p' in context and context['date_p'] or time.strftime('%Y-%m-%d')
151 from_dt = time.mktime(time.strptime(date1, '%Y-%m-%d'))
152 to_dt = time.mktime(time.strptime(date2, '%Y-%m-%d'))
153 diff_day = abs(from_dt - to_dt) / (3600 * 24)
154 tolerance = self._get_amount(cr, uid, ids, residual_amount, payment_term, context)
155 tolerance_days = tolerance['tol_days']
156
157 if payment_term:
158 payment_term_lines = self.pool.get('account.payment.term').browse(cr, uid, payment_term, context=context)
159 if payment_term_lines.cash_discount_ids:
160 res = dis = 0.0
161 for discount_line in payment_term_lines.cash_discount_ids:
162 if diff_day >= dis and diff_day <= discount_line.delay + tolerance_days:
163 if invoice.type in ('in_invoice', 'in_refund'):
164 account_id = discount_line.sup_discount_account_id.id
165 else:
166 account_id = discount_line.discount_account_id.id
167 dis = discount_line.delay + tolerance_days
168 return account_id
169
170 def pay_and_reconcile(self, cr, uid, ids, pay_amount, pay_account_id, period_id, pay_journal_id, writeoff_acc_id, writeoff_period_id, writeoff_journal_id, context=None, name=''):
171 if context is None:
172 context = {}
173 #TODO check if we can use different period for payment and the writeoff line
174 assert len(ids) == 1, _("Can only pay one invoice at a time!")
175 invoice = self.browse(cr, uid, ids[0])
176
177 invoice_tax_obj = self.pool.get("account.invoice.tax")
178 journal_obj = self.pool.get('account.journal')
179 move_obj = self.pool.get('account.move')
180 move_line_obj = self.pool.get('account.move.line')
181 move_line_obj_memory = self.pool.get('account.move.line.memory')
182 tax_obj = self.pool.get('account.tax')
183 cur_obj = self.pool.get('res.currency')
184 res_users_obj = self.pool.get('res.user')
185
186 # get discount from payment term if any
187 amount_discount = invoice.payment_term and self._get_payment(cr, uid, ids, pay_amount, invoice.payment_term.id, context=context) or 0.0
188 journal_currency = journal_obj.browse(cr, uid, pay_journal_id, context=context).currency.id
189
190 if not name:
191 name = invoice.invoice_line and invoice.invoice_line[0].name or invoice.number
192 src_account_id = invoice.account_id.id
193 # Take the seq as name for move
194 types = {'out_invoice': -1, 'in_invoice': 1, 'out_refund': 1, 'in_refund': -1}
195 direction = types[invoice.type]
196 #take the choosen date
197 date = 'date_p' in context and context['date_p'] or time.strftime('%Y-%m-%d')
198
199 # Take the amount in currency and the currency of the payment
200 if 'amount_currency' in context and context['amount_currency'] and 'currency_id' in context and context['currency_id']:
201 amount_currency = context['amount_currency']
202 currency_id = context['currency_id']
203 else:
204 amount_currency = False
205 currency_id = False
206
207 if invoice.type in ('in_invoice', 'in_refund'):
208 ref = invoice.reference
209 else:
210 ref = self._convert_ref(cr, uid, invoice.number)
211
212 discount_amount = tax_total_amount = 0.0
213 if 'cash_amount' in context and context['cash_amount']:
214 discount_amount = context['cash_amount']
215 elif 'pay_cash_discount' in context and context['pay_cash_discount']:
216 discount_amount = context['pay_cash_discount']
217
218 # Pay attention to the sign for both debit/credit AND amount_currency
219 l1 = {
220 'debit': direction * pay_amount > 0 and abs(pay_amount) or 0.0,
221 'credit': direction * pay_amount < 0 and abs(pay_amount) or 0.0,
222 'account_id': src_account_id,
223 'partner_id': invoice.partner_id.id,
224 'ref': ref,
225 'date': date,
226 'currency_id': currency_id,
227 'amount_currency': amount_currency and direction * amount_currency or 0.0,
228 'name': name,
229 }
230
231 ### if we change the amount paid and in the disocunt then it used the changes discount
232 if amount_discount != discount_amount and discount_amount > 0.0:
233 amount_discount = discount_amount
234 l2 = {
235 'debit': direction * (pay_amount - amount_discount) < 0 and abs(pay_amount - amount_discount) or 0.0,
236 'credit': direction * (pay_amount - amount_discount) > 0 and abs(pay_amount - amount_discount) or 0.0,
237 'account_id': pay_account_id,
238 'partner_id': invoice.partner_id.id,
239 'ref': ref,
240 'date': date,
241 'currency_id': currency_id,
242 'amount_currency': amount_currency and -direction * amount_currency or 0.0,
243 'name': name,
244 }
245
246 lines = [(0, 0, l1), (0, 0, l2)]
247
248 ### When we make payment by pay invoice wizard and if found the taxes move then directly take the entry from the wizard
249 if 'tax_move_ids' in context and context['tax_move_ids']:
250 move_line = context['tax_move_ids']
251 for move_line_id in move_line:
252 move_line_data = move_line_obj_memory.browse(cr, uid,move_line_id)
253 l3 = {
254 'debit': move_line_data.debit,
255 'credit': move_line_data.credit,
256 'account_id': move_line_data.account_id.id,
257 'partner_id': invoice.partner_id.id,
258 'ref': ref,
259 'date': move_line_data.date,
260 'currency_id': move_line_data.currency_id.id,
261 'amount_currency': move_line_data.amount_currency and direction * move_line_data.amount_currency or 0.0,
262 'name': move_line_data.name,
263 'tax_code_id': move_line_data.tax_code_id.id,
264 'tax_amount': move_line_data.tax_amount,
265 }
266 lines.append((0, 0, l3))
267 else:
268 if amount_discount > 0.0:
269 for line in invoice.invoice_line:
270 line_tax_amount = 0.0
271 tax_account_id = tax_code_id = tax_base = tax_code = False
272
273 for tax in tax_obj.compute(cr, uid, line.invoice_line_tax_id, line.price_subtotal / line.quantity, line.quantity, invoice.address_invoice_id.id, line.product_id, invoice.partner_id):
274 line_tax_amount += tax['amount']
275 line_total = line.price_subtotal + line_tax_amount
276 invoice_res_amount = invoice.amount_total
277 line_ratio = line_total / invoice_res_amount
278
279 if line.invoice_line_tax_id:
280 total_tax_amount = tax_amount_currency = 0.0
281 for tax_id in line.invoice_line_tax_id:
282 tax_data = tax_obj.browse(cr, uid, tax_id.id, context=context)
283 discount_ratio = amount_discount * line_ratio
284 tax_amt = round((discount_ratio * tax_data.amount), int(config['price_accuracy']))
285 tax_real_amt = round((tax_amt / (1 + tax_data.amount)), int(config['price_accuracy']))
286 total_tax_amount += tax_real_amt
287
288 tax_base = tax_data.base_code_id.id
289 tax_code = tax_data.tax_code_id.id
290 tax_invoice_id = invoice_tax_obj.search(cr, uid, [('invoice_id', '=', invoice.id), ('tax_code_id', '=', tax_code), ('base_code_id', '=', tax_base)])
291
292 for tax_id2 in tax_invoice_id:
293 tax_value = invoice_tax_obj.browse(cr, uid, tax_id2)
294 tax_account_id = tax_value.account_id.id
295 tax_code_id = tax_value.tax_code_id.id
296
297 if invoice.company_id.currency_id.id <> invoice.currency_id.id:
298 tax_amount_currency = cur_obj.compute(cr, uid, invoice.currency_id.id, invoice.company_id.currency_id.id, tax_real_amt, context=context)
299 l3 = {
300 'debit': direction * tax_real_amt < 0 and abs(tax_real_amt) or 0.0,
301 'credit': direction * tax_real_amt > 0 and abs(tax_real_amt) or 0.0,
302 'account_id': tax_account_id,
303 'partner_id': invoice.partner_id.id,
304 'ref': ref,
305 'date': date,
306 'currency_id': currency_id,
307 'amount_currency': tax_amount_currency and direction * tax_amount_currency or 0.0,
308 'tax_code_id': tax_code_id,
309 'tax_amount': -tax_real_amt,
310 'name': name,
311 }
312 lines.append((0, 0, l3))
313 ### When we make payment by pay invoice wizard and if found the discount moves in wizard discount move then directly take the entry from the wizard
314 if 'discount_move_ids' in context and context['discount_move_ids']:
315 move_line = context['discount_move_ids']
316 for move_line_id in move_line:
317 move_line_data = move_line_obj_memory.browse(cr, uid, move_line_id)
318 l4 = {
319 'debit': move_line_data.debit,
320 'credit':move_line_data.credit,
321 'account_id': move_line_data.account_id.id,
322 'partner_id': invoice.partner_id.id,
323 'ref':ref,
324 'date': move_line_data.date,
325 'currency_id': move_line_data.currency_id.id,
326 'amount_currency': move_line_data.amount_currency and direction * move_line_data.amount_currency or 0.0,
327 'name': move_line_data.name,
328 'tax_code_id': move_line_data.tax_code_id.id,
329 'tax_amount': -move_line_data.tax_amount,
330 }
331 lines.append((0, 0, l4))
332 else:
333 if amount_discount > 0:
334 account_id = False
335 if 'account_id' in context and context['account_id']:
336 account_id = context['account_id']
337 elif 'pay_cash_dis_acc' in context and context['pay_cash_dis_acc']:
338 account_id = context['pay_cash_dis_acc']
339 else:
340 account_id = self._get_account(cr, uid, ids , pay_amount, invoice.payment_term.id, context=context)
341
342 fpos = invoice.fiscal_position or False
343 if account_id:
344 account_id = self.pool.get('account.fiscal.position').map_account(cr, uid, fpos, account_id)
345
346 for line in invoice.invoice_line:
347 tax_account_id = base_code_id = False
348 tax_base = tax_code = False
349
350 discount_amount_currency = line_tax_amount = total_tax_amount = 0.0
351 for tax in tax_obj.compute(cr, uid, line.invoice_line_tax_id, line.price_subtotal/line.quantity, line.quantity, invoice.address_invoice_id.id, line.product_id, invoice.partner_id):
352 line_tax_amount += tax['amount']
353 line_total = line.price_subtotal + line_tax_amount
354 invoice_res_amount = invoice.amount_total
355 line_ratio = line_total / invoice_res_amount
356
357 discount_ratio = amount_discount * line_ratio
358
359 for tax_id in line.invoice_line_tax_id:
360 tax_data = tax_obj.browse(cr, uid, tax_id.id, context=context)
361 tax_amt = round((discount_ratio * tax_data.amount), int(config['price_accuracy']))
362 tax_real_amt = round((tax_amt / (1 + tax_data.amount)), int(config['price_accuracy']))
363 total_tax_amount += tax_real_amt
364
365 tax_base = tax_data.base_code_id.id
366 tax_code = tax_data.tax_code_id.id
367 tax_invoice_id = invoice_tax_obj.search(cr, uid, [('invoice_id', '=', invoice.id), ('tax_code_id', '=', tax_code), ('base_code_id', '=', tax_base)])
368
369 for tax_id2 in tax_invoice_id:
370 tax_value = invoice_tax_obj.browse(cr, uid, tax_id2)
371 tax_account_id = tax_value.account_id.id
372 base_code_id = tax_value.base_code_id.id
373
374 if invoice.company_id.currency_id.id <> invoice.currency_id.id:
375 discount_amount = discount_ratio - total_tax_amount
376 discount_amount_currency = cur_obj.compute(cr, uid, invoice.currency_id.id, invoice.company_id.currency_id.id, discount_amount, context=context)
377 l4 = {
378 'debit': direction * (discount_ratio - total_tax_amount) < 0 and abs(discount_ratio - total_tax_amount) or 0.0,
379 'credit': direction * (discount_ratio - total_tax_amount) > 0 and abs(discount_ratio - total_tax_amount) or 0.0,
380 'account_id': account_id,
381 'partner_id': invoice.partner_id.id,
382 'ref': ref,
383 'date': date,
384 'currency_id': currency_id,
385 'amount_currency': discount_amount_currency and direction * discount_amount_currency or 0.0,
386 'tax_code_id': base_code_id,
387 'tax_amount': -(discount_ratio - total_tax_amount),
388 'name': name,
389 }
390 lines.append((0, 0, l4))
391
392 ########################### for currency difference#################
393 currency_diff = invoice_amount = payment_line_amount = 0.0
394
395 for line in invoice.move_id.line_id:
396 move_line_data = move_line_obj.browse(cr, uid, line.id, context=context)
397 invoice_amount += line.debit
398
399 for payment_line in invoice.payment_ids:
400 if payment_line.debit > 0.0:
401 payment_line_amount += payment_line.debit
402 elif payment_line.credit > 0.0:
403 payment_line_amount += payment_line.credit
404
405 payment_line_amount += pay_amount
406
407 if journal_currency != invoice.currency_id.id or invoice.currency_id.id != invoice.company_id.currency_id.id:
408 currency_diff = invoice_amount - payment_line_amount
409 expense_acc = invoice.company_id.expense_account_id
410 revenue_acc = invoice.company_id.revenue_account_id
411 partner_acc_id = curr_diff_account_id = False
412 ## Account selection############
413 if currency_diff < 0.00:
414 curr_diff_account_id = expense_acc.id
415 elif currency_diff > 0.00:
416 curr_diff_account_id = revenue_acc.id
417 ###### set fiscal position for the currency_diff account
418 fpos = invoice.fiscal_position or False
419 if curr_diff_account_id:
420 curr_diff_account_id = self.pool.get('account.fiscal.position').map_account(cr, uid, fpos, curr_diff_account_id)
421
422 if currency_diff < 0.00 and invoice.type in ['in_invoice','out_refund'] or currency_diff > 0.00 and invoice.type in ['out_invoice','in_refund']:
423 l5 = {
424 'ref': ref,
425 'date': date,
426 'partner_id': invoice.partner_id.id,
427 'account_id': invoice.account_id.id,
428 'credit': abs(currency_diff),
429 'debit': 0.0,
430 'amount_currency': 0.0,
431 'name': name,
432 }
433 lines.append((0, 0, l5))
434
435 l6 = {
436 'ref': ref,
437 'date': date,
438 'partner_id': invoice.partner_id.id,
439 'account_id': curr_diff_account_id,
440 'credit': 0.0,
441 'debit': abs(currency_diff),
442 'amount_currency': 0.0,
443 'name': name,
444 }
445 lines.append((0, 0, l6))
446
447 if currency_diff > 0.00 and invoice.type in ['in_invoice','out_refund'] or currency_diff < 0.00 and invoice.type in ['out_invoice','in_refund']:
448 l5 = {
449 'ref': ref,
450 'date': date,
451 'partner_id': invoice.partner_id.id,
452 'account_id': invoice.account_id.id,
453 'credit': 0.0,
454 'debit': abs(currency_diff),
455 'amount_currency': 0.0,
456 'name': name,
457 }
458 lines.append((0, 0, l5))
459
460 l6 = {
461 'ref': ref,
462 'date': date,
463 'partner_id': invoice.partner_id.id,
464 'account_id': curr_diff_account_id,
465 'credit': abs(currency_diff),
466 'debit': 0.0,
467 'amount_currency': 0.0,
468 'name': name,
469 }
470 lines.append((0, 0, l6))
471
472 move = {'ref': ref, 'line_id': lines, 'journal_id': pay_journal_id, 'period_id': period_id, 'date': date}
473 move_id = move_obj.create(cr, uid, move, context=context)
474
475 line_ids = []
476 total = 0.0
477 line = self.pool.get('account.move.line')
478 cr.execute('SELECT id FROM account_move_line WHERE move_id IN (%s, %s)', (move_id, invoice.move_id.id,))
479
480 lines = line.browse(cr, uid, map(lambda x: x[0], cr.fetchall()) )
481 for l in lines + invoice.payment_ids:
482 if l.account_id.id == src_account_id:
483 line_ids.append(l.id)
484 total += (l.debit or 0.0) - (l.credit or 0.0)
485 if (not round(total, int(config['price_accuracy']))) or writeoff_acc_id:
486 self.pool.get('account.move.line').reconcile(cr, uid, line_ids, 'manual', writeoff_acc_id, writeoff_period_id, writeoff_journal_id, context)
487 else:
488 self.pool.get('account.move.line').reconcile_partial(cr, uid, line_ids, 'manual', context)
489
490 # Update the stored value (fields.function), so we write to trigger recompute
491 self.pool.get('account.invoice').write(cr, uid, ids, {}, context=context)
492 return True
493
494account_invoice()
495
496class account_bank_statement_reconcile(osv.osv):
497 _inherit='account.bank.statement.reconcile'
498 def name_get(self, cursor, user, ids, context=None):
499 res = []
500 res = super(account_bank_statement_reconcile, self).name_get(cursor, user, ids, context)
501 for o in self.browse(cursor, user, ids, context=context):
502 data = res[0][1] + o.name
503 res.append((o.id, data))
504 return res
505account_bank_statement_reconcile()
506
507class account_bank_statement_reconcile_line(osv.osv):
508 _inherit='account.bank.statement.reconcile.line'
509 _columns = {
510 'tax_code_id': fields.many2one('account.tax.code', 'Tax Account'),
511 }
512account_bank_statement_reconcile_line()
513
514class res_company(osv.osv):
515 _inherit = "res.company"
516 _columns = {
517 'expense_account_id': fields.many2one('account.account', 'Account for Expense from Exchange Rate Difference', required=True),
518 'revenue_account_id': fields.many2one('account.account', 'Account for Revenue from Exchange Rate Difference', required=True),
519 }
520res_company()
521
522class res_company_wizard(osv.osv_memory):
523 _name = 'res.company.wizard'
524
525 _columns = {
526 'expense_account_id': fields.many2one('account.account', 'Account for Expense from Exchange Rate Difference', required=True),
527 'revenue_account_id': fields.many2one('account.account', 'Account for Revenue from Exchange Rate Difference', required=True),
528 }
529
530 def set_default(self, cr, uid, ids, context=None):
531 company_id = self.pool.get('res.users').browse(cr,uid,[uid],context)[0].company_id
532 for o in self.browse(cr, uid, ids, context=context):
533 self.pool.get('res.company').write(cr, uid, [company_id.id], {'expense_account_id': o.expense_account_id.id, 'revenue_account_id': o.revenue_account_id.id})
534 return {
535 'view_type': 'form',
536 'view_mode': 'form',
537 'res_model': 'ir.actions.configuration.wizard',
538 'type': 'ir.actions.act_window',
539 'target': 'new',
540 }
541
542 def action_cancel(self, cr, uid, ids, context=None):
543 return {
544 'view_type': 'form',
545 'view_mode': 'form',
546 'res_model': 'ir.actions.configuration.wizard',
547 'type': 'ir.actions.act_window',
548 'target': 'new',
549 }
550
551res_company_wizard()
552
553class account_bank_statement(osv.osv):
554 _inherit="account.bank.statement"
555
556 def _end_balance(self, cr, uid, ids, name, attr, context=None):
557 res_currency_obj = self.pool.get('res.currency')
558 res_users_obj = self.pool.get('res.users')
559 tax_obj = self.pool.get('account.tax')
560 res = {}
561
562 statements = self.browse(cr, uid, ids, context=context)
563 for statement in statements:
564 res[statement.id] = statement.balance_start
565 currency_id = statement.currency.id
566 for line in statement.move_line_ids:
567 if line.debit > 0 and line.account_id.id == statement.journal_id.default_debit_account_id.id:
568 res[statement.id] += line.amount_currency or line.debit
569 elif line.credit > 0 and line.account_id.id == statement.journal_id.default_credit_account_id.id:
570 res[statement.id] += line.amount_currency or -line.credit
571
572 if statement.state == 'draft':
573 for line in statement.line_ids:
574 tax = 1
575 if line.type == 'general' and line.tax_type == 'tax_excluded' and line.tax_id:
576 tax = 1 + tax_obj.browse(cr, uid, line.tax_id.id, context=context).amount
577 res[statement.id] += line.amount * tax - line.cash_discount * tax
578
579 for r in res:
580 res[r] = round(res[r], int(config['price_accuracy']))
581 return res
582
583 _columns = {
584 'balance_end': fields.function(_end_balance, method=True, string = 'Balance'),
585 }
586
587 def button_confirm(self, cr, uid, ids, context={}):
588 done = []
589 account_bank_statement_line_obj = self.pool.get('account.bank.statement.line')
590 account_move_obj = self.pool.get('account.move')
591 account_move_line_obj = self.pool.get('account.move.line')
592 tax_obj = self.pool.get('account.tax')
593 res_currency_obj = self.pool.get('res.currency')
594 res_users_obj = self.pool.get('res.users')
595
596 company_currency_id = res_users_obj.browse(cr, uid, uid, context=context).company_id.currency_id.id
597 expense_acc = res_users_obj.browse(cr, uid, uid, context=context).company_id.expense_account_id.id
598 revenue_acc = res_users_obj.browse(cr, uid, uid, context=context).company_id.revenue_account_id.id
599
600 for st in self.browse(cr, uid, ids, context):
601 if not st.state == 'draft':
602 continue
603 if not (abs(st.balance_end - st.balance_end_real) < 0.0001):
604 raise osv.except_osv(_('Error!'),
605 _('The statement balance is incorrect!\n') +
606 _('The expected balance (%.2f) is different than the computed one. (%.2f)') % (st.balance_end_real, st.balance_end))
607 if (not st.journal_id.default_credit_account_id) or (not st.journal_id.default_debit_account_id):
608 raise osv.except_osv(_('Configuration Error!'),
609 _('Please verify that an account is defined in the journal.'))
610 currency_id = st.currency.id <> company_currency_id and st.currency.id
611
612 for line in st.move_line_ids:
613 if line.state <> 'valid':
614 raise osv.except_osv(_('Error!'),
615 _('The account entry lines are not in valid state.'))
616 # for bank.statement.lines
617 # In line we get reconcile_id on bank.ste.rec.
618 # in bank stat.rec we get line_new_ids on bank.stat.rec.line
619 new_end_value = 0.0
620 for move in st.line_ids:
621 context.update({'date': move.date,})
622 move_id = account_move_obj.create(cr, uid, {
623 'journal_id': st.journal_id.id,
624 'period_id': st.period_id.id,
625 'date': move.date,
626 }, context=context)
627 account_bank_statement_line_obj.write(cr, uid, [move.id], {
628 'move_ids': [(4, move_id, False)]
629 })
630 if not move.amount:
631 continue
632 torec = []
633 account_id = move.amount >= 0 and st.journal_id.default_credit_account_id.id or st.journal_id.default_debit_account_id.id
634 acc_cur = move.amount <= 0 and st.journal_id.default_debit_account_id or move.account_id
635 amount = res_currency_obj.compute(cr, uid, st.currency.id,
636 company_currency_id, move.amount, context=context,
637 account = acc_cur)
638
639 st_tax_amount = move_tax_amount = tax_real_amt = 0.0
640 st_base_code_id = curr_diff_account_id = False
641
642 if move.type == 'general' and move.tax_type <> 'untaxed':
643 if move.tax_type == 'tax_included':
644 st_tax_data = tax_obj.browse(cr, uid, move.tax_id.id, context=context)
645 st_tax_amt = move.amount * st_tax_data.amount
646 st_tax_amount = st_tax_amt / (1 + st_tax_data.amount)
647 st_base_code_id = st_tax_data.base_code_id.id
648 amount = amount - st_tax_amount
649 tax_pay = st_tax_amount
650 st_tax_amount = 0.0
651 else:
652 st_tax_data = tax_obj.browse(cr, uid, move.tax_id.id, context=context)
653 st_tax_amt = move.amount * st_tax_data.amount
654 st_tax_amount = st_tax_amt
655 tax_pay = st_tax_amount
656 st_base_code_id = st_tax_data.base_code_id.id
657
658 if not st_tax_data.tax_code_id.id:
659 tax_val = {
660 'name': move.name,
661 'date': move.date,
662 'ref': move.ref,
663 'move_id': move_id,
664 'partner_id': move.partner_id and move.partner_id.id,
665 'account_id': move.account_id and move.account_id.id,
666 'credit': tax_pay > 0 and abs(tax_pay) or 0.0,
667 'debit': tax_pay < 0 and abs(tax_pay) or 0.0,
668 'statement_id': st.id,
669 'journal_id': st.journal_id.id,
670 'period_id': st.period_id.id,
671 'currency_id': currency_id,
672 'tax_code_id': st_base_code_id,
673 'tax_amount': move_tax_amount,
674 }
675 torec.append(account_move_line_obj.create(cr, uid, tax_val, context=context))
676
677 val = {
678 'name': move.name,
679 'date': move.date,
680 'ref': move.ref,
681 'move_id': move_id,
682 'partner_id': move.partner_id and move.partner_id.id,
683 'account_id': move.account_id and move.account_id.id,
684 'credit': amount > 0 and abs(amount) or 0.0,
685 'debit': amount < 0 and abs(amount) or 0.0,
686 'statement_id': st.id,
687 'journal_id': st.journal_id.id,
688 'period_id': st.period_id.id,
689 'currency_id': currency_id,
690 'tax_code_id': st_base_code_id,
691 'account_tax_id': move.tax_id.id,
692 'tax_amount': move_tax_amount,
693 }
694 amount = res_currency_obj.compute(cr, uid, st.currency.id,
695 company_currency_id, move.amount, context=context,
696 account=acc_cur)
697 val['amount_currency'] = currency_id and -move.amount or 0.00
698
699 if move.account_id.currency_id and \
700 st.currency.id <> company_currency_id <> move.account_id.currency_id.id <> st.currency_id:
701
702 val['currency_id'] = move.account_id.currency_id.id
703 val['amount_currency'] = res_currency_obj.compute(cr, uid, company_currency_id,
704 move.account_id.currency_id.id, -amount, context=context, account = acc_cur)
705
706 torec.append(account_move_line_obj.create(cr, uid, val, context=context))
707
708 newline_sum = 0.0
709 if move.reconcile_id and move.reconcile_id.line_new_ids:
710 newline_amount_currency = 0.0
711 for newline in move.reconcile_id.line_new_ids:
712 newline_amount_currency = res_currency_obj.compute(cr, uid, st.currency.id,
713 company_currency_id, newline.amount, context=context)
714 newline_amount_currency = round(newline_amount_currency, int(config['price_accuracy']))
715 newline_sum += newline_amount_currency
716
717 account_move_line_obj.create(cr, uid, {
718 'name': newline.name or move.name,
719 'date': move.date,
720 'ref': move.ref,
721 'move_id': move_id,
722 'partner_id': move.partner_id and move.partner_id.id,
723 'account_id': newline.account_id and newline.account_id.id,
724 'debit': newline_amount_currency > 0 and abs(newline_amount_currency) or 0.0,
725 'credit': newline_amount_currency < 0 and abs(newline_amount_currency) or 0.0,
726 'statement_id': st.id,
727 'tax_code_id': newline.tax_code_id.id,
728 'tax_amount': -newline_amount_currency,
729 'amount_currency': newline.amount,
730 'currency_id': currency_id,
731 'journal_id': st.journal_id.id,
732 'period_id': st.period_id.id,
733 }, context=context)
734
735 amount_currency = False
736 if move.reconcile_id and move.reconcile_id.line_ids:
737 for line in move.reconcile_id.line_ids:
738 move_line_data = self.pool.get('account.move.line').browse(cr, uid, line.id, context=context)
739 if st.currency.id <> company_currency_id:
740 balance = reconcile_sum = 0.0
741 context.update({'amount': move_line_data.amount_currency, 'currency_id': move_line_data.currency_id.id or company_currency_id})
742 reconcile_data = self.pool.get("account.bank.statement.reconcile").browse(cr, uid, move.reconcile_id.id, context=context)
743 balance_sum = reconcile_data.total_balance
744 for line_reconcile in reconcile_data.line_new_ids:
745 reconcile_sum += line_reconcile.amount
746 balance = round((balance_sum - reconcile_sum), int(config['price_accuracy']))
747
748 if st.currency.id <> move_line_data.currency_id.id:
749 invoice_cret_balance = 0.0
750 payment_balance = 0.0
751 context.update({'date': move_line_data.date})
752 inv_create_balance = res_currency_obj.compute(cr, uid, company_currency_id,
753 st.currency.id, amount, context=context)
754 currenct_date = time.strftime('%Y-%m-%d')
755 context.update({'date': currenct_date})
756 payment_balance = res_currency_obj.compute(cr, uid, company_currency_id,
757 st.currency.id, amount, context=context)
758 balance = round(inv_create_balance - payment_balance, int(config['price_accuracy']))
759
760 ## Account selection############
761 if balance < 0.00:
762 curr_diff_account_id = expense_acc
763 elif balance > 0.00:
764 curr_diff_account_id = revenue_acc
765 #######################################
766
767 ###### set fiscal position for the currency_diff account
768 fpos = move_line_data.invoice.fiscal_position or False
769 if curr_diff_account_id:
770 curr_diff_account_id = self.pool.get('account.fiscal.position').map_account(cr, uid, fpos, curr_diff_account_id)
771 if balance <> 0.0:
772 currency_diff1 = account_move_line_obj.create(cr, uid, {
773 'name': move.name,
774 'date': move.date,
775 'ref': move.ref,
776 'move_id': move_id,
777 'partner_id': move.partner_id and move.partner_id.id,
778 'account_id': move.account_id.id,
779 'credit': balance < 0.0 and abs(balance) or 0.0,
780 'debit': balance > 0.0 and abs(balance) or 0.0,
781 'statement_id': st.id,
782 'journal_id': st.journal_id.id,
783 'period_id': st.period_id.id,
784 'amount_currency': 0.0,
785 'currency_id': currency_id,
786 }, context=context)
787
788 currency_diff2 = account_move_line_obj.create(cr, uid, {
789 'name': move.name,
790 'date': move.date,
791 'ref': move.ref,
792 'move_id': move_id,
793 'partner_id': move.partner_id and move.partner_id.id,
794 'account_id': curr_diff_account_id,
795 'credit': balance > 0.0 and abs(balance) or 0.0,
796 'debit': balance < 0.0 and abs(balance) or 0.0,
797 'statement_id': st.id,
798 'journal_id': st.journal_id.id,
799 'period_id': st.period_id.id,
800 'amount_currency': 0.0,
801 'currency_id': currency_id,
802 }, context=context)
803
804 if move_line_data.invoice.currency_id.id != company_currency_id:
805 torec.append(currency_diff1)
806
807 if currency_id:
808 amount_currency = res_currency_obj.compute(cr, uid, company_currency_id, st.currency.id,
809 (amount + st_tax_amount - newline_sum), context=context, account = acc_cur)
810
811 account_move_line_obj.create(cr, uid, {
812 'name': move.name,
813 'date': move.date,
814 'ref': move.ref,
815 'move_id': move_id,
816 'partner_id': move.partner_id and move.partner_id.id,
817 'account_id': account_id,
818 'credit': (amount + st_tax_amount - newline_sum) < 0 and abs(amount + st_tax_amount - newline_sum) or 0.0,
819 'debit': (amount + st_tax_amount - newline_sum) > 0 and abs(amount + st_tax_amount - newline_sum) or 0.0,
820 'statement_id': st.id,
821 'journal_id': st.journal_id.id,
822 'period_id': st.period_id.id,
823 'amount_currency': amount_currency,
824 'currency_id': currency_id,
825 }, context=context)
826
827 account_move_line_obj.write(cr, uid, [x.id for x in
828 account_move_obj.browse(cr, uid, move_id, context=context).line_id], {'statement_id': st.id,})
829 for line in account_move_line_obj.browse(cr, uid, [x.id for x in
830 account_move_obj.browse(cr, uid, move_id, context=context).line_id], context=context):
831 if line.state <> 'valid':
832 raise osv.except_osv(_('Error!'),
833 _('Account move line "%s" is not valid') % line.name)
834 if move.reconcile_id and move.reconcile_id.line_ids:
835 torec += map(lambda x: x.id, move.reconcile_id.line_ids)
836 #try:
837 if abs(move.reconcile_amount - move.amount) < 0.0001:
838 writeoff_acc_id = False
839 #There should only be one write-off account!
840 for entry in move.reconcile_id.line_new_ids:
841 writeoff_acc_id = entry.account_id.id
842 break
843 account_move_line_obj.reconcile(cr, uid, torec, 'statement', writeoff_acc_id=writeoff_acc_id, writeoff_period_id=st.period_id.id, writeoff_journal_id=st.journal_id.id, context=context)
844 else:
845 account_move_line_obj.reconcile_partial(cr, uid, torec, 'statement', context)
846 #except:
847 # raise osv.except_osv(_('Error!'), _('Unable to reconcile entry "%s": %.2f') % (move.name, move.amount))
848
849 if st.journal_id.entry_posted:
850 account_move_obj.write(cr, uid, [move_id], {'state': 'posted'})
851 done.append(st.id)
852
853 self.write(cr, uid, done, {'state': 'confirm'}, context=context)
854 return True
855
856account_bank_statement()
857
858class account_bank_statement_line(osv.osv):
859 _inherit="account.bank.statement.line"
860 _columns = {
861 'tax_id': fields.many2one('account.tax', 'Tax'),
862 'tax_type': fields.selection([
863 ('untaxed', 'Untaxed'),
864 ('tax_included', 'Tax included'),
865 ('tax_excluded', 'Tax excluded')], 'Tax method', required=True,),
866 'cash_discount': fields.float('Cash Discount'),
867 'transferred_amount': fields.float('Transferred'),
868 }
869
870 def onchange_account_id(self, cr, uid, ids, account_id, context=None):
871 result = {}
872 tax = False
873 taxes = self.pool.get('account.account').browse(cr, uid, account_id, context=context).tax_ids
874 for tax_id in taxes:
875 tax = tax_id.id
876 result['tax_id'] = tax
877 return {'value': result}
878
879 def onchange_cash_discount(self, cr, uid, ids, amount, cash_discount, context=None):
880 return {'value': {'transferred_amount': amount - cash_discount}}
881
882 def onchange_transferred_amount(self, cr, uid, ids, amount, transferred_amount, context=None):
883 return {'value': {'cash_discount': amount - transferred_amount}}
884
885 def onchange_type(self, cr, uid, ids, type, context=None):
886 result={}
887 tax_id = self.pool.get('account.tax').search(cr, uid, [])
888
889 if type == 'general' and tax_id:
890 result['tax_id'] = tax_id[0]
891 else:
892 result['tax_id'] = False
893 return {'value': result}
894
895 _defaults = {
896 'tax_type':lambda *a: 'untaxed',
897 }
898account_bank_statement_line()
899
900
901class account_move_line(osv.osv):
902 _inherit="account.move.line"
903
904 def reconcile_discount(self, cr, uid, ids, type='auto', discount_acc_id=False, discount_period_id=False, discount_journal_id=False, context={}):
905 tax_obj = self.pool.get('account.tax')
906 cur_obj = self.pool.get('res.currency')
907 partner_obj = self.pool.get('res.partner')
908 res_users_obj = self.pool.get('res.users')
909
910 id_set = ','.join(map(str, ids))
911 reconcile_lines = []
912 credit = debit = currency = 0.0
913 currency_id = account_id = partner_id = invoice = ref = False
914 discount_account = curr_diff_account = False
915 if discount_acc_id:
916 discount_account = self.pool.get('account.account').browse(cr, uid, discount_acc_id, context=context)
917 lines = self.browse(cr, uid, ids, context=context)
918 unrec_lines = filter(lambda x: not x['reconcile_id'], lines)
919
920 for line in unrec_lines:
921 if line.invoice:
922 invoice = line.invoice
923 if line.state <> 'valid':
924 raise osv.except_osv(_('Error!'),
925 _('Entry "%s" is not valid !') % line.name)
926 credit += line['credit']
927 debit += line['debit']
928 currency += line['amount_currency'] or 0.0
929 currency_id = currency_id or line['currency_id']
930 account_id = line['account_id']['id']
931 account_type = line['account_id']['type']
932 partner_id = line['partner_id'] and line['partner_id']['id']
933 ref = ref or line['ref']
934
935 # simple rules for (full) reconciliation w/ cash discount:
936 # if there's foreign currency involved:
937 # - difference in foreign currency is cash discount
938 # - difference in company currency is currency exchange rate difference
939 # - negative difference is expense, positive difference is revenue
940 # if there's no foreign currency:
941 # - difference in foreign currency is 0.00
942 # - difference in company currency is cash discount
943 balance = credit - debit
944 # take fiscal position from invoice, from partner as fallback
945 fpos = invoice and invoice.fiscal_position
946 if not fpos and partner_id:
947 fpos = partner_obj.browse(cr, uid, partner_id, context=context).property_account_position
948 date = context.has_key('date_p') and context['date_p'] or time.strftime('%Y-%m-%d')
949
950 cr.execute('SELECT account_id, reconcile_id '\
951 'FROM account_move_line '\
952 'WHERE id IN %s '\
953 'GROUP BY account_id,reconcile_id',
954 (tuple(ids),))
955 r = cr.fetchall()
956#TODO: move this check to a constraint in the account_move_reconcile object
957 if (len(r) != 1) and not context.get('fy_closing', False):
958 raise osv.except_osv(_('Error!'), _('Entries are not of the same account or already reconciled!'))
959 if not unrec_lines:
960 raise osv.except_osv(_('Error!'), _('Entry is already reconciled!'))
961 account = self.pool.get('account.account').browse(cr, uid, account_id, context=context)
962 if not context.get('fy_closing', False) and not account.reconcile:
963 raise osv.except_osv(_('Error!'), _('The account is not configured to be reconciled!'))
964 if r[0][1] != None:
965 raise osv.except_osv(_('Error!'), _('Some entries are already reconciled!'))
966
967 # foreign currency
968 if currency_id:
969 # cash discount
970 if not cur_obj.is_zero(cr, uid, currency_id, currency):
971 if currency > 0:
972 osv.except_osv(_('Error!'), _('There seems to be a surcharge, not a cash discount. Can\'t reconcile this!'))
973 if not discount_acc_id:
974 raise osv.except_osv(_('Error!'), _('You have to provide a cash discount account!'))
975 if fpos:
976 discount_acc_id = self.pool.get('account.fiscal.position').map_account(cr, uid, fpos, discount_acc_id)
977 # TODO: Check if cash discount amount in company currency should be computed with current date
978 # or date of last payment or date of invoice
979 company_amount = round(cur_obj.compute(cr, uid, currency_id.id, account.company_id.currency_id.id, currency),
980 int(config['price_accuracy']))
981 reconcile_lines.append(
982 (0, 0, {
983 'name': invoice and invoice.number or 'comment' in context and context['comment'] or _('Cash Discount'),
984 'ref': ref,
985 'debit': abs(company_amount),
986 'credit': 0.0,
987 'account_id': account_id,
988 'date': date,
989 'partner_id': partner_id,
990 'currency_id': currency_id.id,
991 'amount_currency': -currency,
992 })
993 )
994 reconcile_lines.append(
995 (0, 0, {
996 'name': invoice and invoice.number or 'comment' in context and context['comment'] or _('Cash Discount'),
997 'ref': ref,
998 'debit': 0.0,
999 'credit': abs(company_amount),
1000 'account_id': discount_acc_id,
1001 'analytic_account_id': context.get('analytic_id', False),
1002 'date': date,
1003 'partner_id': partner_id,
1004 'currency_id': currency_id.id,
1005 'amount_currency': currency,
1006 })
1007 )
1008 # now the company currency difference needs to be corrected by the cash discount amount
1009 balance += company_amount
1010
1011 # currency difference
1012 if not cur_obj.is_zero(cr, uid, account.company_id.currency_id, balance):
1013 if balance < 0.0:
1014 curr_diff_account = res_users_obj.browse(cr, uid, uid, context=context).company_id.expense_account_id.id
1015 elif balance > 0.0:
1016 curr_diff_account = res_users_obj.browse(cr, uid, uid, context=context).company_id.revenue_account_id.id
1017 if fpos:
1018 curr_diff_account = self.pool.get('account.fiscal.position').map_account(cr, uid, fpos, curr_diff_account)
1019 reconcile_lines.append(
1020 (0, 0, {
1021 'name': invoice and invoice.number or balance < 0.0 and _('Currency Expense') or _('Currency Revenue'),
1022 'ref': ref,
1023 'debit': balance < 0.0 and abs(balance) or 0.0,
1024 'credit': balance > 0.0 and abs(balance) or 0.0,
1025 'account_id': curr_diff_account,
1026 'analytic_account_id': context.get('analytic_id', False),
1027 'date': date,
1028 'partner_id': partner_id,
1029 'currency_id': currency_id.id,
1030 'amount_currency': 0.0,
1031 })
1032 )
1033 reconcile_lines.append(
1034 (0, 0, {
1035 'name': invoice and invoice.number or balance < 0.0 and _('Currency Expense') or _('Currency Revenue'),
1036 'ref': ref,
1037 'debit': balance > 0.0 and abs(balance) or 0.0,
1038 'credit': balance < 0.0 and abs(balance) or 0.0,
1039 'account_id': account_id,
1040 'date': date,
1041 'partner_id': partner_id,
1042 'currency_id': currency_id.id,
1043 'amount_currency': 0.0,
1044 })
1045 )
1046 # no foreign currency
1047 else:
1048 # cash discount
1049 if not cur_obj.is_zero(cr, uid, account.company_id.currency_id, balance):
1050 if balance > 0:
1051 osv.except_osv(_('Error!'), _('There seems to be a surcharge, not a cash discount. Can\'t reconcile this!'))
1052 if not discount_acc_id:
1053 raise osv.except_osv(_('Error!'), _('You have to provide a cash discount account!'))
1054 if fpos:
1055 discount_acc_id = self.pool.get('account.fiscal.position').map_account(cr, uid, fpos, discount_acc_id)
1056 reconcile_lines.append(
1057 (0, 0, {
1058 'name': invoice and invoice.number or 'comment' in context and context['comment'] or _('Cash Discount'),
1059 'ref': ref,
1060 'debit': balance > 0.0 and abs(balance) or 0.0,
1061 'credit': balance < 0.0 and abs(balance) or 0.0,
1062 'account_id': account_id,
1063 'date': date,
1064 'partner_id': partner_id,
1065 })
1066 )
1067 # take care of taxes for the cash discount
1068 # cash discount -> base code
1069 # tax amount -> tax code
1070 taxed_balance = balance
1071 tax_amount = 0.0
1072 type = False
1073 # guess the type of payment
1074 if account.type == 'receivable':
1075 type = balance > 0.0 and 'invoice' or balance < 0.0 and 'refund'
1076 elif account.type == 'payable':
1077 type = balance < 0.0 and 'invoice' or balance > 0.0 and 'refund'
1078 if discount_account.tax_ids:
1079 for tax in discount_account.tax_ids:
1080 if tax.child_depend:
1081 for ctax in tax.child_ids:
1082 if not type or type == 'invoice':
1083 tax_amount = round(ctax.tax_sign * ctax.amount * balance,
1084 int(config['price_accuracy']))
1085 else:
1086 tax_amount = round(ctax.ref_tax_sign * ctax.amount * balance,
1087 int(config['price_accuracy']))
1088 reconcile_lines.append(
1089 (0, 0, {
1090 'name': invoice and invoice.number or 'comment' in context and context['comment'] or _('Cash Discount'),
1091 'ref': ref,
1092 'debit': balance < 0.0 and abs(tax_amount) or 0.0,
1093 'credit': balance > 0.0 and abs(tax_amount) or 0.0,
1094 'account_id': type == 'invoice' and ctax.account_collected_id.id or type == 'refund' and ctax.account_paid_id.id,
1095 'date': date,
1096 'partner_id': partner_id,
1097 'tax_code_id': type == 'invoice' and ctax.tax_code_id.id or type == 'refund' and ctax.ref_tax_code_id.id,
1098 'tax_amount': tax_amount,
1099 })
1100 )
1101 else:
1102 if not type or type == 'invoice':
1103 tax_amount = round(tax.tax_sign * tax.amount * balance, int(config['price_accuracy']))
1104 else:
1105 tax_amount = round(tax.ref_tax_sign * tax.amount * balance, int(config['price_accuracy']))
1106 reconcile_lines.append(
1107 (0, 0, {
1108 'name': invoice and invoice.number or 'comment' in context and context['comment'] or _('Cash Discount'),
1109 'ref': ref,
1110 'debit': balance < 0.0 and abs(tax_amount) or 0.0,
1111 'credit': balance > 0.0 and abs(tax_amount) or 0.0,
1112 'account_id': type == 'invoice' and tax.account_collected_id.id or type == 'refund' and tax.account_paid_id.id,
1113 'date': date,
1114 'partner_id': partner_id,
1115 'tax_code_id': type == 'invoice' and tax.tax_code_id.id or type == 'refund' and tax.ref_tax_code_id.id,
1116 'tax_amount': tax_amount,
1117 })
1118 )
1119 taxed_balance -= tax_amount
1120 # only post with debit/credit on the first tax. The other rows would be needed for
1121 # tax reports but need to have debit/credit of 0.0. We just need to have an entry
1122 # for the base tax amount.
1123 first_tax = True
1124 for tax in discount_account.tax_ids:
1125 reconcile_lines.append(
1126 (0, 0, {
1127 'name': invoice and invoice.number or 'comment' in context and context['comment'] or _('Cash Discount'),
1128 'ref': ref,
1129 'debit': first_tax and balance < 0.0 and abs(taxed_balance) or 0.0,
1130 'credit': first_tax and balance > 0.0 and abs(taxed_balance) or 0.0,
1131 'account_id': discount_acc_id,
1132 'analytic_account_id': context.get('analytic_id', False),
1133 'date': date,
1134 'partner_id': partner_id,
1135 'tax_code_id': type == 'invoice' and tax.base_code_id.id \
1136 or type == 'refund' and tax.ref_base_code_id.id,
1137 'tax_amount': taxed_balance,
1138 })
1139 )
1140 first_tax = False
1141 else:
1142 reconcile_lines.append(
1143 (0, 0, {
1144 'name': invoice and invoice.number or 'comment' in context and context['comment'] or _('Cash Discount'),
1145 'ref': ref,
1146 'debit': balance < 0.0 and abs(taxed_balance) or 0.0,
1147 'credit': balance > 0.0 and abs(taxed_balance) or 0.0,
1148 'account_id': discount_acc_id,
1149 'analytic_account_id': context.get('analytic_id', False),
1150 'date': date,
1151 'partner_id': partner_id,
1152 })
1153 )
1154 if len(reconcile_lines):
1155 reconcile_move_id = self.pool.get('account.move').create(cr, uid, {
1156 'period_id': discount_period_id,
1157 'journal_id': discount_journal_id,
1158 'date': date,
1159 'state': 'draft',
1160 'line_id': reconcile_lines,
1161 })
1162 reconcile_line_ids = self.search(cr, uid, [('move_id', '=', reconcile_move_id), ('account_id', '=', account_id)])
1163 ids += reconcile_line_ids
1164
1165 r_id = self.pool.get('account.move.reconcile').create(cr, uid, {
1166 'type': type,
1167 'line_id': map(lambda x: (4, x, False), ids),
1168 'line_partial_ids': map(lambda x: (3, x, False), ids)
1169 })
1170 wf_service = netsvc.LocalService("workflow")
1171 # the id of the move.reconcile is written in the move.line (self) by the create method above
1172 # because of the way the line_id are defined: (4, x, False)
1173 for id in ids:
1174 wf_service.trg_trigger(uid, 'account.move.line', id, cr)
1175 return r_id
1176
1177account_move_line()
1178# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
1179
01180
=== added file 'account_invoice_cash_discount/account_invoice_cash_discount_view.xml'
--- account_invoice_cash_discount/account_invoice_cash_discount_view.xml 1970-01-01 00:00:00 +0000
+++ account_invoice_cash_discount/account_invoice_cash_discount_view.xml 2011-07-29 01:35:58 +0000
@@ -0,0 +1,268 @@
1<?xml version="1.0"?>
2<openerp>
3 <data>
4
5 <!-- cash discount -->
6 <record model="ir.ui.view" id="view_cash_discount_form">
7 <field name="name">account.cash.discount.form</field>
8 <field name="model">account.cash.discount</field>
9 <field name="type">form</field>
10 <field name="arch" type="xml">
11 <form string="Cash Discount">
12 <field name="name" select="1"/>
13 <field name="delay" select="1"/>
14 <field name="discount" select="1"/>
15 <separator string="Cash Discount Account for Supplier and Customer" colspan="4"/>
16 <field name="discount_account_id" />
17 <field name="sup_discount_account_id"/>
18 </form>
19 </field>
20 </record>
21
22 <record model="ir.ui.view" id="view_cash_discount_tree">
23 <field name="name">account.cash.discount.tree</field>
24 <field name="model">account.cash.discount</field>
25 <field name="type">tree</field>
26 <field name="arch" type="xml">
27 <tree string="Cash Discount" editable="bottom">
28 <field name="name" select="1"/>
29 <field name="delay" select="1"/>
30 <field name="discount" select="1"/>
31 <field name="discount_account_id" />
32 <field name="sup_discount_account_id"/>
33 </tree>
34 </field>
35 </record>
36
37 <record model="ir.ui.view" id="view_payment_term_form">
38 <field name="name">account.payment.term.form</field>
39 <field name="model">account.payment.term</field>
40 <field name="inherit_id" ref="account.view_payment_term_form"/>
41 <field name="arch" type="xml">
42 <field name="line_ids" position="after">
43 <separator string="Cash Discount" colspan="4"/>
44 <field name="cash_discount_ids" colspan="4"/>
45 </field>
46 </field>
47 </record>
48
49 <record id="bank_statement_form_view1" model="ir.ui.view">
50 <field name="name">account.bank.statement.form</field>
51 <field name="model">account.bank.statement</field>
52 <field name="type">form</field>
53 <field name="inherit_id" ref="account.view_bank_statement_form"/>
54 <field name="arch" type="xml">
55 <xpath expr="//button[@string='Import Invoice']" position="replace">
56 <button name="%(wizard_populate_statement_from_inv1)d" type="action" string="Import Invoice" attrs="{'invisible': [('state', '=', 'confirm')]}"/>
57 </xpath>
58 </field>
59 </record>
60
61 <record id="bank_statement_reconcile_form_view1" model="ir.ui.view">
62 <field name="name">account.bank.statement.reconcile.form</field>
63 <field name="model">account.bank.statement.reconcile</field>
64 <field name="type">form</field>
65 <field name="inherit_id" ref="account.view_bank_statement_reconcile"/>
66 <field name="arch" type="xml">
67 <field name="total_new" position="replace">
68 <field name="total_new" string="Total Write-Off/Cash Discount"/>
69 </field>
70 </field>
71 </record>
72
73 <record id="view_bank_statement_reconcile_tree" model="ir.ui.view">
74 <field name="name">account.bank.statement.reconcile.tree</field>
75 <field name="model">account.bank.statement.reconcile</field>
76 <field name="type">tree</field>
77 <field name="arch" type="xml">
78 <tree string="Reconcile">
79 <field name="name" select="1"/>
80 <field name="total_amount"/>
81 <field name="total_currency"/>
82 <field name="total_entry"/>
83 <field name="total_new"/>
84 <field name="total_balance"/>
85 </tree>
86 </field>
87 </record>
88
89 <record id="bank_statement_reconcile_form_view2" model="ir.ui.view">
90 <field name="name">account.bank.statement.reconcile.form</field>
91 <field name="model">account.bank.statement.reconcile</field>
92 <field name="type">form</field>
93 <field name="inherit_id" ref="account.view_bank_statement_reconcile"/>
94 <field name="arch" type="xml">
95 <xpath expr="//tree[@string='Write-Off']" position="replace">
96 <tree editable="bottom" string="Write-Off and Cash Discount">
97 <field name="account_id" domain="[('type', '&lt;&gt;', 'view'), ('type', '&lt;&gt;', 'consolidation')]"/>
98 <field name="amount"/>
99 <field name="name"/>
100 </tree>
101 </xpath>
102 </field>
103 </record>
104
105 <record id="account_payment_term_line_view1" model="ir.ui.view">
106 <field name="name">account.payment.term.line.form</field>
107 <field name="model">account.payment.term.line</field>
108 <field name="type">form</field>
109 <field name="inherit_id" ref="account.view_payment_term_line_form"/>
110 <field name="arch" type="xml">
111 <field name="days2" position="after">
112 <field name="compl_cash_discount"/>
113 <field name="day_tolerance" required="1"/>
114 </field>
115 </field>
116 </record>
117
118 <record id="view_res_company_inherit_form" model="ir.ui.view">
119 <field name="name">res.company.inherit.form</field>
120 <field name="model">res.company</field>
121 <field name="type">form</field>
122 <field name="inherit_id" ref="base.view_company_form"/>
123 <field name="arch" type="xml">
124 <field name="currency_id" position="after">
125 <field name="expense_account_id" string="Acc for Exp from Curr Diff"/>
126 <field name="revenue_account_id" string="Acc for Rev from Curr Diff"/>
127 </field>
128 </field>
129 </record>
130
131 <record id="view_res_company_wizard" model="ir.ui.view">
132 <field name="name">Company Exchage Rate Difference Accounts</field>
133 <field name="model">res.company.wizard</field>
134 <field name="type">form</field>
135 <field name="arch" type="xml">
136 <form string="Currency Difference Account Configuration">
137 <field name="expense_account_id"/>
138 <newline/>
139 <field name="revenue_account_id"/>
140 <newline/>
141 <group col="4" colspan="4">
142 <button icon="gtk-cancel" name="action_cancel" type="object" special="cancel" string="Cancel"/>
143 <button icon="gtk-ok" name="set_default" string="Set Default" type="object"/>
144 </group>
145 </form>
146 </field>
147 </record>
148
149 <record id="action_res_company_wizard" model="ir.actions.act_window">
150 <field name="name">Company Currency Difference Accounts</field>
151 <field name="type">ir.actions.act_window</field>
152 <field name="res_model">res.company.wizard</field>
153 <field name="view_type">form</field>
154 <field name="view_mode">form</field>
155 <field name="target">new</field>
156 </record>
157
158 <record id="config_wizard_res_company_wizard" model="ir.actions.todo">
159 <field name="name">Company Currency Difference Accounts</field>
160 <field name="note">This configuration step sets the default accounts for expense and revenue generated by exchange rate differences</field>
161 <field name="action_id" ref="action_res_company_wizard"/>
162 </record>
163
164
165 <record model="ir.ui.view" id="view_bank_statement_reconcile_view122">
166 <field name="name">account.bank.statement.reconcile.form</field>
167 <field name="model">account.bank.statement.reconcile</field>
168 <field name="inherit_id" ref="account.view_bank_statement_reconcile" />
169 <field name="type">form</field>
170 <field name="arch" type="xml">
171 <xpath expr="//field[@name='line_new_ids']/tree/field[@name='name']" position="after">
172 <field name="tax_code_id"/>
173 </xpath>
174 </field>
175 </record>
176
177 <record id="view_move_line_tree1" model="ir.ui.view">
178 <field name="name">account.move.line.tree</field>
179 <field name="model">account.move.line</field>
180 <field name="type">tree</field>
181 <field eval="1" name="priority"/>
182 <field name="inherit_id" ref="account.view_move_line_tree"/>
183 <field name="arch" type="xml">
184 <field name="account_tax_id" position="after">
185 <field name="tax_code_id"/>
186 <field name="tax_amount"/>
187 </field>
188 </field>
189 </record>
190
191 <record model="ir.ui.view" id="view_bank_statement_acc_on_change_form">
192 <field name="name">account.bank.statement.form1</field>
193 <field name="model">account.bank.statement</field>
194 <field name="inherit_id" ref="account.view_bank_statement_form" />
195 <field name="type">form</field>
196 <field name="arch" type="xml">
197 <field name="account_id" position="replace">
198 <field name="account_id" on_change="onchange_account_id(account_id)"/>
199 </field>
200 </field>
201 </record>
202
203 <record model="ir.ui.view" id="view_bank_statement_tax_tree">
204 <field name="name">account.bank.statement.tree1</field>
205 <field name="model">account.bank.statement</field>
206 <field name="inherit_id" ref="account.view_bank_statement_form"/>
207 <field name="type">form</field>
208 <field name="arch" type="xml">
209 <xpath expr="//field[@name='line_ids']/tree/field[@name='reconcile_amount']" position="after">
210 <field name="tax_id"/>
211 <field name="tax_type"/>
212 </xpath>
213 </field>
214 </record>
215
216 <record model="ir.ui.view" id="view_bank_statement_tax_form">
217 <field name="name">account.bank.statement.form1</field>
218 <field name="model">account.bank.statement</field>
219 <field name="inherit_id" ref="account.view_bank_statement_form" />
220 <field name="type">form</field>
221 <field name="arch" type="xml">
222 <xpath expr="//field[@name='line_ids']/form/field[@name='ref']" position="after">
223 <field name="tax_id"/>
224 <field name="tax_type"/>
225 </xpath>
226 </field>
227 </record>
228
229 <record model="ir.ui.view" id="view_bank_statement_type_on_change_form">
230 <field name="name">account.bank.statement.form1</field>
231 <field name="model">account.bank.statement</field>
232 <field name="inherit_id" ref="account.view_bank_statement_form" />
233 <field name="type">form</field>
234 <field name="arch" type="xml">
235 <field name="type" position="replace">
236 <field name="type" on_change="onchange_type(type)"/>
237 </field>
238 </field>
239 </record>
240
241 <record model="ir.ui.view" id="view_bank_statement_tax_tree1">
242 <field name="name">account.bank.statement.tree1</field>
243 <field name="model">account.bank.statement</field>
244 <field name="inherit_id" ref="account.view_bank_statement_form"/>
245 <field name="type">form</field>
246 <field name="arch" type="xml">
247 <xpath expr="//field[@name='line_ids']/tree/field[@name='amount']" position="after">
248 <field name="cash_discount" on_change="onchange_cash_discount(amount, cash_discount)"/>
249 <field name="transferred_amount" on_change="onchange_transferred_amount(amount, transferred_amount)"/>
250 </xpath>
251 </field>
252 </record>
253
254 <record model="ir.ui.view" id="view_bank_statement_tax_form1">
255 <field name="name">account.bank.statement.form1</field>
256 <field name="model">account.bank.statement</field>
257 <field name="inherit_id" ref="account.view_bank_statement_form"/>
258 <field name="type">form</field>
259 <field name="arch" type="xml">
260 <xpath expr="//field[@name='line_ids']/form/field[@name='amount']" position="after">
261 <field name="cash_discount" on_change="onchange_cash_discount(amount, cash_discount)"/>
262 <field name="transferred_amount" on_change="onchange_transferred_amount(amount, transferred_amount)"/>
263 </xpath>
264 </field>
265 </record>
266
267 </data>
268</openerp>
0269
=== added file 'account_invoice_cash_discount/account_invoice_cash_discount_wizard.xml'
--- account_invoice_cash_discount/account_invoice_cash_discount_wizard.xml 1970-01-01 00:00:00 +0000
+++ account_invoice_cash_discount/account_invoice_cash_discount_wizard.xml 2011-07-29 01:35:58 +0000
@@ -0,0 +1,30 @@
1<?xml version="1.0"?>
2<openerp>
3 <data>
4 <wizard
5 string="Import invoices"
6 model="account.bank.statement"
7 name="populate_statement_from_inv1"
8 menu="False"
9 id="wizard_populate_statement_from_inv1"/>
10
11 <wizard
12 string="Reconcile Entries"
13 model="account.move.line"
14 name="account.move.line.discount.reconcile"
15 menu="True"
16 id="account.wizard_reconcile"/>
17 <wizard
18 string="Compute Period Wise Write-off Entry"
19 model="account.move.line"
20 name="account_period_write_calculation"
21 menu="True"
22 id="wizard_period_writeoff_calculation"/>
23
24 <menuitem
25 action="wizard_period_writeoff_calculation"
26 id="menu_period_writeoff_calculation"
27 parent="account_payment.menu_main"
28 type="wizard"/>
29 </data>
30</openerp>
031
=== added directory 'account_invoice_cash_discount/i18n'
=== added file 'account_invoice_cash_discount/i18n/account_invoice_cash_discount.pot'
--- account_invoice_cash_discount/i18n/account_invoice_cash_discount.pot 1970-01-01 00:00:00 +0000
+++ account_invoice_cash_discount/i18n/account_invoice_cash_discount.pot 2011-07-29 01:35:58 +0000
@@ -0,0 +1,673 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * account_invoice_cash_discount
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 5.0.14\n"
8"Report-Msgid-Bugs-To: support@openerp.com\n"
9"POT-Creation-Date: 2010-10-07 16:33:48+0000\n"
10"PO-Revision-Date: 2010-10-07 16:33:48+0000\n"
11"Last-Translator: Thomas Dreiling <thomas.dreiling@global-distribution.de>\n"
12"Language-Team: \n"
13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: \n"
16"Plural-Forms: \n"
17
18#. module: account_invoice_cash_discount
19#: code:addons/account_invoice_cash_discount/wizard/wizard_discount_reconcile.py:0
20#, python-format
21msgid "Write-Off"
22msgstr ""
23
24#. module: account_invoice_cash_discount
25#: field:account.invoice.pay,discount_move_ids:0
26msgid "Account Discount Moves"
27msgstr ""
28
29#. module: account_invoice_cash_discount
30#: selection:account.invoice.pay,cal_method_selection:0
31msgid "Calculate Discount with Gross Methodology"
32msgstr ""
33
34#. module: account_invoice_cash_discount
35#: constraint:ir.actions.act_window:0
36msgid "Invalid model name in the action definition."
37msgstr ""
38
39#. module: account_invoice_cash_discount
40#: field:account.bank.statement.reconcile.line,tax_code_id:0
41#: field:account.move.line.memory,tax_code_id:0
42msgid "Tax Account"
43msgstr ""
44
45#. module: account_invoice_cash_discount
46#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
47#, python-format
48msgid "Entries are not of the same account or already reconciled!"
49msgstr ""
50
51#. module: account_invoice_cash_discount
52#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
53#, python-format
54msgid "Account move line \"%s\" is not valid"
55msgstr ""
56
57#. module: account_invoice_cash_discount
58#: model:ir.model,name:account_invoice_cash_discount.model_res_company_wizard
59msgid "res.company.wizard"
60msgstr ""
61
62#. module: account_invoice_cash_discount
63#: field:account.invoice.pay,cash_amount:0
64msgid "Cash Discount Amount"
65msgstr ""
66
67#. module: account_invoice_cash_discount
68#: field:account.move.line.memory,account_id:0
69msgid "Account"
70msgstr ""
71
72#. module: account_invoice_cash_discount
73#: field:account.invoice.pay,journal_id:0
74msgid "Journal/Payment Mode"
75msgstr ""
76
77#. module: account_invoice_cash_discount
78#: view:account.message:0
79#: view:account.partial.message:0
80msgid "Messages"
81msgstr ""
82
83#. module: account_invoice_cash_discount
84#: wizard_field:account_period_write_calculation,init,tax_id:0
85msgid "Taxes"
86msgstr ""
87
88#. module: account_invoice_cash_discount
89#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
90#: code:addons/account_invoice_cash_discount/wizard/account_pay_invoice.py:0
91#, python-format
92msgid "Error!"
93msgstr ""
94
95#. module: account_invoice_cash_discount
96#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
97#, python-format
98msgid "The statement balance is incorrect!\n"
99msgstr ""
100
101#. module: account_invoice_cash_discount
102#: view:account.message:0
103#: view:account.partial.message:0
104msgid "OK"
105msgstr ""
106
107#. module: account_invoice_cash_discount
108#: view:account.bank.statement.reconcile:0
109msgid "Reconcile"
110msgstr ""
111
112#. module: account_invoice_cash_discount
113#: wizard_view:account_period_write_calculation,init:0
114msgid "Calculation"
115msgstr ""
116
117#. module: account_invoice_cash_discount
118#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
119#, python-format
120msgid "Currency Expense"
121msgstr ""
122
123#. module: account_invoice_cash_discount
124#: field:account.bank.statement.line,tax_id:0
125msgid "Tax"
126msgstr ""
127
128#. module: account_invoice_cash_discount
129#: field:account.move.line.memory,date:0
130msgid "Effective Date"
131msgstr ""
132
133#. module: account_invoice_cash_discount
134#: field:account.invoice.pay.writeoff,analytic_id:0
135#: field:account.move.line.memory,analytic_account_id:0
136msgid "Analytic Account"
137msgstr ""
138
139#. module: account_invoice_cash_discount
140#: field:account.cash.discount,discount_account_id:0
141msgid "Customer Discount Account"
142msgstr ""
143
144#. module: account_invoice_cash_discount
145#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
146#, python-format
147msgid "Entry \"%s\" is not valid !"
148msgstr ""
149
150#. module: account_invoice_cash_discount
151#: wizard_button:populate_statement_from_inv1,go,end:0
152#: wizard_button:populate_statement_from_inv1,init,end:0
153msgid "_Cancel"
154msgstr ""
155
156#. module: account_invoice_cash_discount
157#: view:account.cash.discount:0
158#: view:account.payment.term:0
159#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
160#: code:addons/account_invoice_cash_discount/wizard/wizard_discount_reconcile.py:0
161#: model:ir.model,name:account_invoice_cash_discount.model_account_cash_discount
162#, python-format
163msgid "Cash Discount"
164msgstr ""
165
166#. module: account_invoice_cash_discount
167#: view:account.invoice.pay.writeoff:0
168msgid "Pay and Reconcile"
169msgstr ""
170
171#. module: account_invoice_cash_discount
172#: view:account.invoice.pay:0
173msgid "Method For Calculation"
174msgstr ""
175
176#. module: account_invoice_cash_discount
177#: view:account.invoice.pay.writeoff:0
178msgid "Write-Off Move"
179msgstr ""
180
181#. module: account_invoice_cash_discount
182#: selection:account.invoice.pay,cal_method_selection:0
183msgid "Calculate Discount with Net Methodology"
184msgstr ""
185
186#. module: account_invoice_cash_discount
187#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
188#, python-format
189msgid "Please verify that an account is defined in the journal."
190msgstr ""
191
192#. module: account_invoice_cash_discount
193#: field:account.move.line.memory,debit:0
194msgid "Debit"
195msgstr ""
196
197#. module: account_invoice_cash_discount
198#: model:ir.actions.act_window,name:account_invoice_cash_discount.action_res_company_wizard
199msgid "Company Currency Difference Accounts"
200msgstr ""
201
202#. module: account_invoice_cash_discount
203#: wizard_view:account_period_write_calculation,init:0
204msgid "Calculation of period-wise Write-Off Amount"
205msgstr ""
206
207#. module: account_invoice_cash_discount
208#: field:account.payment.term.line,day_tolerance:0
209msgid "Tolerance (Days)"
210msgstr ""
211
212#. module: account_invoice_cash_discount
213#: wizard_button:populate_statement_from_inv1,init,go:0
214msgid "_Go"
215msgstr ""
216
217#. module: account_invoice_cash_discount
218#: field:account.cash.discount,delay:0
219msgid "Number of Days"
220msgstr ""
221
222#. module: account_invoice_cash_discount
223#: code:addons/account_invoice_cash_discount/wizard/wizard_write_period_entry_calculation.py:0
224#, python-format
225msgid "Computed Entries"
226msgstr ""
227
228#. module: account_invoice_cash_discount
229#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
230#, python-format
231msgid "Entry is already reconciled!"
232msgstr ""
233
234#. module: account_invoice_cash_discount
235#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
236#, python-format
237msgid "Configuration Error!"
238msgstr ""
239
240#. module: account_invoice_cash_discount
241#: field:account.bank.statement.line,tax_type:0
242msgid "Tax method"
243msgstr ""
244
245#. module: account_invoice_cash_discount
246#: constraint:ir.ui.view:0
247msgid "Invalid XML for View Architecture!"
248msgstr ""
249
250#. module: account_invoice_cash_discount
251#: view:account.invoice.pay:0
252#: model:ir.actions.act_window,name:account_invoice_cash_discount.action_view_account_invoice_pay
253msgid "Pay Invoice"
254msgstr ""
255
256#. module: account_invoice_cash_discount
257#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
258#, python-format
259msgid "Currency Revenue"
260msgstr ""
261
262#. module: account_invoice_cash_discount
263#: view:account.invoice.pay:0
264#: view:account.partial.message:0
265msgid "Partial Payment"
266msgstr ""
267
268#. module: account_invoice_cash_discount
269#: field:account.cash.discount,discount:0
270msgid "Discount (%)"
271msgstr ""
272
273#. module: account_invoice_cash_discount
274#: field:account.invoice.pay.writeoff,comment:0
275msgid "Comment"
276msgstr ""
277
278#. module: account_invoice_cash_discount
279#: wizard_field:populate_statement_from_inv1,go,lines:0
280msgid "Invoices"
281msgstr ""
282
283#. module: account_invoice_cash_discount
284#: field:account.cash.discount,sup_discount_account_id:0
285msgid "Supplier Discount Account"
286msgstr ""
287
288#. module: account_invoice_cash_discount
289#: field:account.move.line.memory,currency_id:0
290msgid "Currency"
291msgstr ""
292
293#. module: account_invoice_cash_discount
294#: view:account.invoice.pay:0
295#: view:account.message:0
296msgid "Full Payment"
297msgstr ""
298
299#. module: account_invoice_cash_discount
300#: code:addons/account_invoice_cash_discount/wizard/account_pay_invoice.py:0
301#, python-format
302msgid "Message"
303msgstr ""
304
305#. module: account_invoice_cash_discount
306#: view:res.company:0
307msgid "Acc for Rev from Curr Diff"
308msgstr ""
309
310#. module: account_invoice_cash_discount
311#: view:account.invoice.pay:0
312msgid "Calculate"
313msgstr ""
314
315#. module: account_invoice_cash_discount
316#: view:account.invoice.pay.writeoff:0
317#: code:addons/account_invoice_cash_discount/wizard/account_pay_invoice.py:0
318#, python-format
319msgid "Information Addendum"
320msgstr ""
321
322#. module: account_invoice_cash_discount
323#: model:ir.module.module,shortdesc:account_invoice_cash_discount.module_meta_information
324msgid "Payment Term with Cash Discount"
325msgstr ""
326
327#. module: account_invoice_cash_discount
328#: wizard_view:populate_statement_from_inv1,init:0
329msgid "Choose Journal and Payment Date"
330msgstr ""
331
332#. module: account_invoice_cash_discount
333#: help:populate_statement_from_inv1,init,journal_id:0
334msgid "This field allows you to choose the accounting journals you want to search invoices in. If you leave this field empty all sale, purchase and cash journals will be searched."
335msgstr ""
336
337#. module: account_invoice_cash_discount
338#: field:account.invoice.pay,account_id:0
339#: wizard_field:account_period_write_calculation,init,cash_discount_id:0
340msgid "Cash Discount Account"
341msgstr ""
342
343#. module: account_invoice_cash_discount
344#: constraint:ir.model:0
345msgid "The Object name must start with x_ and not contain any special character !"
346msgstr ""
347
348#. module: account_invoice_cash_discount
349#: model:ir.actions.wizard,name:account_invoice_cash_discount.wizard_populate_statement_from_inv1
350msgid "Import invoices"
351msgstr ""
352
353#. module: account_invoice_cash_discount
354#: view:account.bank.statement.reconcile:0
355msgid "Write-Off and Cash Discount"
356msgstr ""
357
358#. module: account_invoice_cash_discount
359#: view:res.company:0
360msgid "Acc for Exp from Curr Diff"
361msgstr ""
362
363#. module: account_invoice_cash_discount
364#: model:ir.model,name:account_invoice_cash_discount.model_account_message
365msgid "account.message"
366msgstr ""
367
368#. module: account_invoice_cash_discount
369#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
370#, python-format
371msgid "The expected balance (%.2f) is different than the computed one. (%.2f)"
372msgstr ""
373
374#. module: account_invoice_cash_discount
375#: code:addons/account_invoice_cash_discount/wizard/account_pay_invoice.py:0
376#, python-format
377msgid "Your journal must have a default credit and debit account."
378msgstr ""
379
380#. module: account_invoice_cash_discount
381#: field:res.company,revenue_account_id:0
382#: field:res.company.wizard,revenue_account_id:0
383msgid "Account for Revenue from Exchange Rate Difference"
384msgstr ""
385
386#. module: account_invoice_cash_discount
387#: field:account.invoice.pay,date:0
388#: wizard_field:populate_statement_from_inv1,init,date:0
389msgid "Payment Date"
390msgstr ""
391
392#. module: account_invoice_cash_discount
393#: selection:account.bank.statement.line,tax_type:0
394msgid "Untaxed"
395msgstr ""
396
397#. module: account_invoice_cash_discount
398#: wizard_button:account_period_write_calculation,init,calculate:0
399msgid "Compute"
400msgstr ""
401
402#. module: account_invoice_cash_discount
403#: view:account.bank.statement:0
404msgid "Import Invoice"
405msgstr ""
406
407#. module: account_invoice_cash_discount
408#: selection:account.bank.statement.line,tax_type:0
409msgid "Tax included"
410msgstr ""
411
412#. module: account_invoice_cash_discount
413#: field:account.invoice.pay.writeoff,writeoff_journal_id:0
414msgid "Write-Off Journal"
415msgstr ""
416
417#. module: account_invoice_cash_discount
418#: field:account.move.line.memory,credit:0
419msgid "Credit"
420msgstr ""
421
422#. module: account_invoice_cash_discount
423#: field:account.move.line.memory,amount_currency:0
424msgid "Amount Currency"
425msgstr ""
426
427#. module: account_invoice_cash_discount
428#: field:account.invoice.pay,tax_move_ids:0
429msgid "Account Taxes Moves"
430msgstr ""
431
432#. module: account_invoice_cash_discount
433#: model:ir.model,name:account_invoice_cash_discount.model_account_move_line_memory
434msgid "Account move line memory "
435msgstr ""
436
437#. module: account_invoice_cash_discount
438#: field:account.invoice.pay,name:0
439msgid "Entry Name"
440msgstr ""
441
442#. module: account_invoice_cash_discount
443#: help:account.move.line.memory,amount_currency:0
444msgid "The amount in the optional foreign currency if it is a multi-currency entry."
445msgstr ""
446
447#. module: account_invoice_cash_discount
448#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
449#, python-format
450msgid "Unable to reconcile entry \"%s\": %.2f"
451msgstr ""
452
453#. module: account_invoice_cash_discount
454#: field:account.invoice.pay,cash_residual_amount:0
455msgid "Residual Amount"
456msgstr ""
457
458#. module: account_invoice_cash_discount
459#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
460#, python-format
461msgid "The account entry lines are not in valid state."
462msgstr ""
463
464#. module: account_invoice_cash_discount
465#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
466#, python-format
467msgid "You have to provide a cash discount account!"
468msgstr ""
469
470#. module: account_invoice_cash_discount
471#: view:account.message:0
472msgid "Do you really want to reconcile this invoice? The proposed payment does not completely balance the invoiced amount. Please check the payment term lines. Usually, one would use Partial Payment to avoid the ready/paid state for this invoice."
473msgstr ""
474
475#. module: account_invoice_cash_discount
476#: field:account.invoice.pay,period_id:0
477#: wizard_field:account_period_write_calculation,init,period_id:0
478msgid "Period"
479msgstr ""
480
481#. module: account_invoice_cash_discount
482#: model:ir.module.module,description:account_invoice_cash_discount.module_meta_information
483msgid "\n"
484" Module to add account move lines in case of payment with cash discount conditions in reconcilation form.\n"
485" "
486msgstr ""
487
488#. module: account_invoice_cash_discount
489#: field:account.payment.term.line,compl_cash_discount:0
490msgid "Use Complete Cash Discount"
491msgstr ""
492
493#. module: account_invoice_cash_discount
494#: selection:account.bank.statement.line,tax_type:0
495msgid "Tax excluded"
496msgstr ""
497
498#. module: account_invoice_cash_discount
499#: view:account.invoice.pay:0
500#: view:account.invoice.pay.writeoff:0
501#: view:account.message:0
502#: view:account.partial.message:0
503#: wizard_button:account_period_write_calculation,init,end:0
504#: view:res.company.wizard:0
505msgid "Cancel"
506msgstr ""
507
508#. module: account_invoice_cash_discount
509#: code:addons/account_invoice_cash_discount/wizard/account_pay_invoice.py:0
510#, python-format
511msgid "Cannot pay invoices in draft/proforma/cancel/done state."
512msgstr ""
513
514#. module: account_invoice_cash_discount
515#: field:account.payment.term,cash_discount_ids:0
516msgid "Cash Discount Terms"
517msgstr ""
518
519#. module: account_invoice_cash_discount
520#: wizard_view:populate_statement_from_inv1,init:0
521msgid "Import Invoices in Statement"
522msgstr ""
523
524#. module: account_invoice_cash_discount
525#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
526#, python-format
527msgid "Can only pay one invoice at a time!"
528msgstr ""
529
530#. module: account_invoice_cash_discount
531#: field:res.company,expense_account_id:0
532#: field:res.company.wizard,expense_account_id:0
533msgid "Account for Expense from Exchange Rate Difference"
534msgstr ""
535
536#. module: account_invoice_cash_discount
537#: view:account.partial.message:0
538msgid "Do you really want to NOT reconcile this invoice? The proposed payment completely balances the invoiced amount. Please check the payment term lines. Usually, one would use Full Payment to receive ready/paid state for this invoice."
539msgstr ""
540
541#. module: account_invoice_cash_discount
542#: view:account.invoice.pay.writeoff:0
543msgid "Analytic"
544msgstr ""
545
546#. module: account_invoice_cash_discount
547#: view:account.move.line.memory:0
548msgid "Account Move Line"
549msgstr ""
550
551#. module: account_invoice_cash_discount
552#: model:ir.model,name:account_invoice_cash_discount.model_account_invoice_pay
553#: model:ir.model,name:account_invoice_cash_discount.model_account_invoice_pay_writeoff
554msgid "Pay Invoice "
555msgstr ""
556
557#. module: account_invoice_cash_discount
558#: view:res.company.wizard:0
559msgid "Set Default"
560msgstr ""
561
562#. module: account_invoice_cash_discount
563#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
564#, python-format
565msgid "The account is not configured to be reconciled!"
566msgstr ""
567
568#. module: account_invoice_cash_discount
569#: field:account.move.line.memory,tax_amount:0
570msgid "Tax/Base Amount"
571msgstr ""
572
573#. module: account_invoice_cash_discount
574#: field:account.cash.discount,payment_id:0
575msgid "Related Payment Term"
576msgstr ""
577
578#. module: account_invoice_cash_discount
579#: view:account.invoice.pay:0
580msgid "Account Cash Discount Moves"
581msgstr ""
582
583#. module: account_invoice_cash_discount
584#: view:account.cash.discount:0
585msgid "Cash Discount Account for Supplier and Customer"
586msgstr ""
587
588#. module: account_invoice_cash_discount
589#: wizard_button:populate_statement_from_inv1,go,finish:0
590msgid "O_k"
591msgstr ""
592
593#. module: account_invoice_cash_discount
594#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
595#, python-format
596msgid "Some entries are already reconciled!"
597msgstr ""
598
599#. module: account_invoice_cash_discount
600#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
601#, python-format
602msgid "There seems to be a surcharge, not a cash discount. Can\'t reconcile this!"
603msgstr ""
604
605#. module: account_invoice_cash_discount
606#: field:account.cash.discount,name:0
607#: field:account.move.line.memory,name:0
608msgid "Name"
609msgstr ""
610
611#. module: account_invoice_cash_discount
612#: view:account.bank.statement.reconcile:0
613msgid "Total Write-Off/Cash Discount"
614msgstr ""
615
616#. module: account_invoice_cash_discount
617#: model:ir.actions.wizard,name:account_invoice_cash_discount.wizard_period_writeoff_calculation
618#: model:ir.ui.menu,name:account_invoice_cash_discount.menu_period_writeoff_calculation
619msgid "Compute Period Wise Write-off Entry"
620msgstr ""
621
622#. module: account_invoice_cash_discount
623#: view:res.company.wizard:0
624msgid "Currency Difference Account Configuration"
625msgstr ""
626
627#. module: account_invoice_cash_discount
628#: field:account.invoice.pay,cal_method_selection:0
629msgid "Method for Calculation"
630msgstr ""
631
632#. module: account_invoice_cash_discount
633#: field:account.invoice.pay,amount:0
634msgid "Amount Paid"
635msgstr ""
636
637#. module: account_invoice_cash_discount
638#: view:account.invoice.pay:0
639msgid "Tax Account Moves"
640msgstr ""
641
642#. module: account_invoice_cash_discount
643#: model:ir.model,name:account_invoice_cash_discount.model_account_partial_message
644msgid "account.partial.message"
645msgstr ""
646
647#. module: account_invoice_cash_discount
648#: help:account.move.line.memory,currency_id:0
649msgid "The optional foreign currency if it is a multi-currency entry."
650msgstr ""
651
652#. module: account_invoice_cash_discount
653#: help:account.move.line.memory,tax_code_id:0
654msgid "The account can either be a base tax code or tax code account."
655msgstr ""
656
657#. module: account_invoice_cash_discount
658#: field:account.invoice.pay.writeoff,writeoff_acc_id:0
659msgid "Write-Off Account"
660msgstr ""
661
662#. module: account_invoice_cash_discount
663#: field:account.move.line.memory,journal_id:0
664#: wizard_field:account_period_write_calculation,init,journal_id:0
665#: wizard_field:populate_statement_from_inv1,init,journal_id:0
666msgid "Journal"
667msgstr ""
668
669#. module: account_invoice_cash_discount
670#: model:ir.actions.todo,note:account_invoice_cash_discount.config_wizard_res_company_wizard
671msgid "This configuration step sets the default accounts for expense and revenue generated by exchange rate differences"
672msgstr ""
673
0674
=== added file 'account_invoice_cash_discount/i18n/de_DE.po'
--- account_invoice_cash_discount/i18n/de_DE.po 1970-01-01 00:00:00 +0000
+++ account_invoice_cash_discount/i18n/de_DE.po 2011-07-29 01:35:58 +0000
@@ -0,0 +1,675 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * account_invoice_cash_discount
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 5.0.14\n"
8"Report-Msgid-Bugs-To: support@openerp.com\n"
9"POT-Creation-Date: 2010-10-07 16:33:48+0000\n"
10"PO-Revision-Date: 2010-10-07 16:33:48+0000\n"
11"Last-Translator: Thomas Dreiling <thomas.dreiling@global-distribution.de>\n"
12"Language-Team: \n"
13"MIME-Version: 1.0\n"
14"Content-Type: text/plain; charset=UTF-8\n"
15"Content-Transfer-Encoding: \n"
16"Plural-Forms: \n"
17
18#. module: account_invoice_cash_discount
19#: code:addons/account_invoice_cash_discount/wizard/wizard_discount_reconcile.py:0
20#, python-format
21msgid "Write-Off"
22msgstr "Abschreibung"
23
24#. module: account_invoice_cash_discount
25#: field:account.invoice.pay,discount_move_ids:0
26msgid "Account Discount Moves"
27msgstr "Skontobuchungen"
28
29#. module: account_invoice_cash_discount
30#: selection:account.invoice.pay,cal_method_selection:0
31msgid "Calculate Discount with Gross Methodology"
32msgstr "Berechne Skonto mit Bruttomethode"
33
34#. module: account_invoice_cash_discount
35#: constraint:ir.actions.act_window:0
36msgid "Invalid model name in the action definition."
37msgstr "Ungültiger Modellname in der Aktionsdefinition."
38
39#. module: account_invoice_cash_discount
40#: field:account.bank.statement.reconcile.line,tax_code_id:0
41#: field:account.move.line.memory,tax_code_id:0
42msgid "Tax Account"
43msgstr "Steuerkonto"
44
45#. module: account_invoice_cash_discount
46#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
47#, python-format
48msgid "Entries are not of the same account or already reconciled!"
49msgstr "Buchungen gehören nicht zum selben Konto oder sind bereits ausgeglichen!"
50
51#. module: account_invoice_cash_discount
52#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
53#, python-format
54msgid "Account move line \"%s\" is not valid"
55msgstr "Buchungszeile \"%s\" ist ungültig"
56
57#. module: account_invoice_cash_discount
58#: model:ir.model,name:account_invoice_cash_discount.model_res_company_wizard
59msgid "res.company.wizard"
60msgstr "res.company.wizard"
61
62#. module: account_invoice_cash_discount
63#: field:account.invoice.pay,cash_amount:0
64msgid "Cash Discount Amount"
65msgstr "Skontobetrag"
66
67#. module: account_invoice_cash_discount
68#: field:account.move.line.memory,account_id:0
69msgid "Account"
70msgstr "Konto"
71
72#. module: account_invoice_cash_discount
73#: field:account.invoice.pay,journal_id:0
74msgid "Journal/Payment Mode"
75msgstr "Journal/Zahlungsweise"
76
77#. module: account_invoice_cash_discount
78#: view:account.message:0
79#: view:account.partial.message:0
80msgid "Messages"
81msgstr "Nachrichten"
82
83#. module: account_invoice_cash_discount
84#: wizard_field:account_period_write_calculation,init,tax_id:0
85msgid "Taxes"
86msgstr "Steuern"
87
88#. module: account_invoice_cash_discount
89#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
90#: code:addons/account_invoice_cash_discount/wizard/account_pay_invoice.py:0
91#, python-format
92msgid "Error!"
93msgstr "Fehler!"
94
95#. module: account_invoice_cash_discount
96#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
97#, python-format
98msgid "The statement balance is incorrect!\n"
99msgstr "Das Saldo des Kontoauszugs stimmt nicht!\n"
100
101#. module: account_invoice_cash_discount
102#: view:account.message:0
103#: view:account.partial.message:0
104msgid "OK"
105msgstr "OK"
106
107#. module: account_invoice_cash_discount
108#: view:account.bank.statement.reconcile:0
109msgid "Reconcile"
110msgstr "OP-Ausgleich"
111
112#. module: account_invoice_cash_discount
113#: wizard_view:account_period_write_calculation,init:0
114msgid "Calculation"
115msgstr "Berechnung"
116
117#. module: account_invoice_cash_discount
118#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
119#, python-format
120msgid "Currency Expense"
121msgstr "Kursaufwand"
122
123#. module: account_invoice_cash_discount
124#: field:account.bank.statement.line,tax_id:0
125msgid "Tax"
126msgstr "Steuer"
127
128#. module: account_invoice_cash_discount
129#: field:account.move.line.memory,date:0
130msgid "Effective Date"
131msgstr "Stichtag"
132
133#. module: account_invoice_cash_discount
134#: field:account.invoice.pay.writeoff,analytic_id:0
135#: field:account.move.line.memory,analytic_account_id:0
136msgid "Analytic Account"
137msgstr "Analytisches Konto"
138
139#. module: account_invoice_cash_discount
140#: field:account.cash.discount,discount_account_id:0
141msgid "Customer Discount Account"
142msgstr "Skontokonto Debitor"
143
144#. module: account_invoice_cash_discount
145#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
146#, python-format
147msgid "Entry \"%s\" is not valid !"
148msgstr "Buchung \"%s\" ist ungültig!"
149
150#. module: account_invoice_cash_discount
151#: wizard_button:populate_statement_from_inv1,go,end:0
152#: wizard_button:populate_statement_from_inv1,init,end:0
153msgid "_Cancel"
154msgstr "_Cancel"
155
156#. module: account_invoice_cash_discount
157#: view:account.cash.discount:0
158#: view:account.payment.term:0
159#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
160#: code:addons/account_invoice_cash_discount/wizard/wizard_discount_reconcile.py:0
161#: model:ir.model,name:account_invoice_cash_discount.model_account_cash_discount
162#, python-format
163msgid "Cash Discount"
164msgstr "Skonto"
165
166#. module: account_invoice_cash_discount
167#: view:account.invoice.pay.writeoff:0
168msgid "Pay and Reconcile"
169msgstr "Zahlung und OP-Ausgleich"
170
171#. module: account_invoice_cash_discount
172#: view:account.invoice.pay:0
173msgid "Method For Calculation"
174msgstr "Berechnungsmethode"
175
176#. module: account_invoice_cash_discount
177#: view:account.invoice.pay.writeoff:0
178msgid "Write-Off Move"
179msgstr "Abschreibungsbuchung"
180
181#. module: account_invoice_cash_discount
182#: selection:account.invoice.pay,cal_method_selection:0
183msgid "Calculate Discount with Net Methodology"
184msgstr "Berechne Skonto mit Nettomethode"
185
186#. module: account_invoice_cash_discount
187#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
188#, python-format
189msgid "Please verify that an account is defined in the journal."
190msgstr "Bitte prüfen, ob im Journal ein Konto hinterlegt ist."
191
192#. module: account_invoice_cash_discount
193#: field:account.move.line.memory,debit:0
194msgid "Debit"
195msgstr "Soll"
196
197#. module: account_invoice_cash_discount
198#: model:ir.actions.act_window,name:account_invoice_cash_discount.action_res_company_wizard
199msgid "Company Currency Difference Accounts"
200msgstr "Kursdifferenzkonten der Firma"
201
202#. module: account_invoice_cash_discount
203#: wizard_view:account_period_write_calculation,init:0
204msgid "Calculation of period-wise Write-Off Amount"
205msgstr "Berechnung des periodenweisen Abschreibungsbetrags"
206
207#. module: account_invoice_cash_discount
208#: field:account.payment.term.line,day_tolerance:0
209msgid "Tolerance (Days)"
210msgstr "Toleranz (Tage)"
211
212#. module: account_invoice_cash_discount
213#: wizard_button:populate_statement_from_inv1,init,go:0
214msgid "_Go"
215msgstr "_Go"
216
217#. module: account_invoice_cash_discount
218#: field:account.cash.discount,delay:0
219msgid "Number of Days"
220msgstr "Anzahl Tage"
221
222#. module: account_invoice_cash_discount
223#: code:addons/account_invoice_cash_discount/wizard/wizard_write_period_entry_calculation.py:0
224#, python-format
225msgid "Computed Entries"
226msgstr "Berechnete Buchungen"
227
228#. module: account_invoice_cash_discount
229#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
230#, python-format
231msgid "Entry is already reconciled!"
232msgstr "Buchung ist bereits ausgeglichen!"
233
234#. module: account_invoice_cash_discount
235#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
236#, python-format
237msgid "Configuration Error!"
238msgstr "Konfigurationsfehler!"
239
240#. module: account_invoice_cash_discount
241#: field:account.bank.statement.line,tax_type:0
242msgid "Tax method"
243msgstr "Steuerberechnung"
244
245#. module: account_invoice_cash_discount
246#: constraint:ir.ui.view:0
247msgid "Invalid XML for View Architecture!"
248msgstr "Fehlerhafter XML-Code für diese Ansicht!"
249
250#. module: account_invoice_cash_discount
251#: view:account.invoice.pay:0
252#: model:ir.actions.act_window,name:account_invoice_cash_discount.action_view_account_invoice_pay
253msgid "Pay Invoice"
254msgstr "Bezahle Rechnung"
255
256#. module: account_invoice_cash_discount
257#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
258#, python-format
259msgid "Currency Revenue"
260msgstr "Kursertrag"
261
262#. module: account_invoice_cash_discount
263#: view:account.invoice.pay:0
264#: view:account.partial.message:0
265msgid "Partial Payment"
266msgstr "Teilzahlung"
267
268#. module: account_invoice_cash_discount
269#: field:account.cash.discount,discount:0
270msgid "Discount (%)"
271msgstr "Skonto (%)"
272
273#. module: account_invoice_cash_discount
274#: field:account.invoice.pay.writeoff,comment:0
275msgid "Comment"
276msgstr "Hinweis"
277
278#. module: account_invoice_cash_discount
279#: wizard_field:populate_statement_from_inv1,go,lines:0
280msgid "Invoices"
281msgstr "Rechnungen"
282
283#. module: account_invoice_cash_discount
284#: field:account.cash.discount,sup_discount_account_id:0
285msgid "Supplier Discount Account"
286msgstr "Skontokonto Kreditor"
287
288#. module: account_invoice_cash_discount
289#: field:account.move.line.memory,currency_id:0
290msgid "Currency"
291msgstr "Währung"
292
293#. module: account_invoice_cash_discount
294#: view:account.invoice.pay:0
295#: view:account.message:0
296msgid "Full Payment"
297msgstr "Vollständige Bezahlung"
298
299#. module: account_invoice_cash_discount
300#: code:addons/account_invoice_cash_discount/wizard/account_pay_invoice.py:0
301#, python-format
302msgid "Message"
303msgstr "Nachricht"
304
305#. module: account_invoice_cash_discount
306#: view:res.company:0
307msgid "Acc for Rev from Curr Diff"
308msgstr "Konto Kurserträge"
309
310#. module: account_invoice_cash_discount
311#: view:account.invoice.pay:0
312msgid "Calculate"
313msgstr "Berechne"
314
315#. module: account_invoice_cash_discount
316#: view:account.invoice.pay.writeoff:0
317#: code:addons/account_invoice_cash_discount/wizard/account_pay_invoice.py:0
318#, python-format
319msgid "Information Addendum"
320msgstr "Zusatzinformationen"
321
322#. module: account_invoice_cash_discount
323#: model:ir.module.module,shortdesc:account_invoice_cash_discount.module_meta_information
324msgid "Payment Term with Cash Discount"
325msgstr "Zahlungsbedingung mit Skonto"
326
327#. module: account_invoice_cash_discount
328#: wizard_view:populate_statement_from_inv1,init:0
329msgid "Choose Journal and Payment Date"
330msgstr "Wähle Journal und Zahlungsdatum"
331
332#. module: account_invoice_cash_discount
333#: help:populate_statement_from_inv1,init,journal_id:0
334msgid "This field allows you to choose the accounting journals you want to search invoices in. If you leave this field empty all sale, purchase and cash journals will be searched."
335msgstr "Mit diesem Feld können die Journale gewählt werden, in denen nach Rechnungen gesucht werden. Bleibt das Feld leer, werden alle Verkaufs-, Einkaufs- und Kassenjournale durchsucht."
336
337#. module: account_invoice_cash_discount
338#: field:account.invoice.pay,account_id:0
339#: wizard_field:account_period_write_calculation,init,cash_discount_id:0
340msgid "Cash Discount Account"
341msgstr "Skontokonto"
342
343#. module: account_invoice_cash_discount
344#: constraint:ir.model:0
345msgid "The Object name must start with x_ and not contain any special character !"
346msgstr "Der Objektname muss mit x_ beginnen und darf keine Sonderzeichen beinhalten!"
347
348#. module: account_invoice_cash_discount
349#: model:ir.actions.wizard,name:account_invoice_cash_discount.wizard_populate_statement_from_inv1
350msgid "Import invoices"
351msgstr "Importiere Rechnungen"
352
353#. module: account_invoice_cash_discount
354#: view:account.bank.statement.reconcile:0
355msgid "Write-Off and Cash Discount"
356msgstr "Abschreibung und Skonto"
357
358#. module: account_invoice_cash_discount
359#: view:res.company:0
360msgid "Acc for Exp from Curr Diff"
361msgstr "Konto Kursaufwendungen"
362
363#. module: account_invoice_cash_discount
364#: model:ir.model,name:account_invoice_cash_discount.model_account_message
365msgid "account.message"
366msgstr "account.message"
367
368#. module: account_invoice_cash_discount
369#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
370#, python-format
371msgid "The expected balance (%.2f) is different than the computed one. (%.2f)"
372msgstr "Der eingetragene Saldo (%.2f) stimmt nicht mit dem berechneten überein. (%.2f)"
373
374#. module: account_invoice_cash_discount
375#: code:addons/account_invoice_cash_discount/wizard/account_pay_invoice.py:0
376#, python-format
377msgid "Your journal must have a default credit and debit account."
378msgstr "Im Journal müssen Standardkonten für Soll und Haben konfiguriert sein."
379
380#. module: account_invoice_cash_discount
381#: field:res.company,revenue_account_id:0
382#: field:res.company.wizard,revenue_account_id:0
383msgid "Account for Revenue from Exchange Rate Difference"
384msgstr "Konto für Kurserträge"
385
386#. module: account_invoice_cash_discount
387#: field:account.invoice.pay,date:0
388#: wizard_field:populate_statement_from_inv1,init,date:0
389msgid "Payment Date"
390msgstr "Zahlungsdatum"
391
392#. module: account_invoice_cash_discount
393#: selection:account.bank.statement.line,tax_type:0
394msgid "Untaxed"
395msgstr "Unversteuert"
396
397#. module: account_invoice_cash_discount
398#: wizard_button:account_period_write_calculation,init,calculate:0
399msgid "Compute"
400msgstr "Berechne"
401
402#. module: account_invoice_cash_discount
403#: view:account.bank.statement:0
404msgid "Import Invoice"
405msgstr "Importiere Rechnungen"
406
407#. module: account_invoice_cash_discount
408#: selection:account.bank.statement.line,tax_type:0
409msgid "Tax included"
410msgstr "Inklusive Steuer"
411
412#. module: account_invoice_cash_discount
413#: field:account.invoice.pay.writeoff,writeoff_journal_id:0
414msgid "Write-Off Journal"
415msgstr "Abschreibungsjournal"
416
417#. module: account_invoice_cash_discount
418#: field:account.move.line.memory,credit:0
419msgid "Credit"
420msgstr "Haben"
421
422#. module: account_invoice_cash_discount
423#: field:account.move.line.memory,amount_currency:0
424msgid "Amount Currency"
425msgstr "Währungsbetrag"
426
427#. module: account_invoice_cash_discount
428#: field:account.invoice.pay,tax_move_ids:0
429msgid "Account Taxes Moves"
430msgstr "Steuerbuchung"
431
432#. module: account_invoice_cash_discount
433#: model:ir.model,name:account_invoice_cash_discount.model_account_move_line_memory
434msgid "Account move line memory "
435msgstr "Buchungshistorie"
436
437#. module: account_invoice_cash_discount
438#: field:account.invoice.pay,name:0
439msgid "Entry Name"
440msgstr "Buchungstext"
441
442#. module: account_invoice_cash_discount
443#: help:account.move.line.memory,amount_currency:0
444msgid "The amount in the optional foreign currency if it is a multi-currency entry."
445msgstr "Der Fremdwährungsbetrag bei einer Fremdwährungsbuchung."
446
447#. module: account_invoice_cash_discount
448#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
449#, python-format
450msgid "Unable to reconcile entry \"%s\": %.2f"
451msgstr "Kann Rechnung \"%s\": %.2f nicht ausgleichen"
452
453#. module: account_invoice_cash_discount
454#: field:account.invoice.pay,cash_residual_amount:0
455msgid "Residual Amount"
456msgstr "Offener Betrag"
457
458#. module: account_invoice_cash_discount
459#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
460#, python-format
461msgid "The account entry lines are not in valid state."
462msgstr "Die Buchungszeilen sind nicht im Status Gültig."
463
464#. module: account_invoice_cash_discount
465#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
466#, python-format
467msgid "You have to provide a cash discount account!"
468msgstr "Es muss ein Skontokonto angegeben werden!"
469
470#. module: account_invoice_cash_discount
471#: view:account.message:0
472msgid "Do you really want to reconcile this invoice? The proposed payment does not completely balance the invoiced amount. Please check the payment term lines. Usually, one would use Partial Payment to avoid the ready/paid state for this invoice."
473msgstr "Soll die Rechnung wirklich ausgeglichen werden? Die vorgeschlagene Zahlung deckt den Rechnungsbetrag nicht vollständig. Überprüfen sie die Zahlungsbedingung. In der Regel sollte hier eine Teilzahlung vorgenommen werden, um die Rechnung nicht als bezahlt zu kennzeichnen."
474
475#. module: account_invoice_cash_discount
476#: field:account.invoice.pay,period_id:0
477#: wizard_field:account_period_write_calculation,init,period_id:0
478msgid "Period"
479msgstr "Periode"
480
481#. module: account_invoice_cash_discount
482#: model:ir.module.module,description:account_invoice_cash_discount.module_meta_information
483msgid "\n"
484" Module to add account move lines in case of payment with cash discount conditions in reconcilation form.\n"
485" "
486msgstr "\n"
487" Modul für die Buchung von Zahlungen mit Skonto im Bankauszug.\n"
488" "
489
490#. module: account_invoice_cash_discount
491#: field:account.payment.term.line,compl_cash_discount:0
492msgid "Use Complete Cash Discount"
493msgstr "Verwende gesamtes Skonto"
494
495#. module: account_invoice_cash_discount
496#: selection:account.bank.statement.line,tax_type:0
497msgid "Tax excluded"
498msgstr "Exklusive Steuer"
499
500#. module: account_invoice_cash_discount
501#: view:account.invoice.pay:0
502#: view:account.invoice.pay.writeoff:0
503#: view:account.message:0
504#: view:account.partial.message:0
505#: wizard_button:account_period_write_calculation,init,end:0
506#: view:res.company.wizard:0
507msgid "Cancel"
508msgstr "Abbrechen"
509
510#. module: account_invoice_cash_discount
511#: code:addons/account_invoice_cash_discount/wizard/account_pay_invoice.py:0
512#, python-format
513msgid "Cannot pay invoices in draft/proforma/cancel/done state."
514msgstr "Rechnungen im Status Entwurf/Proforma/Abgebrochen/Erledigt können nicht bezahlt werden."
515
516#. module: account_invoice_cash_discount
517#: field:account.payment.term,cash_discount_ids:0
518msgid "Cash Discount Terms"
519msgstr "Skontobedingungen"
520
521#. module: account_invoice_cash_discount
522#: wizard_view:populate_statement_from_inv1,init:0
523msgid "Import Invoices in Statement"
524msgstr "Importiere Rechnungen"
525
526#. module: account_invoice_cash_discount
527#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
528#, python-format
529msgid "Can only pay one invoice at a time!"
530msgstr "Es kann immer nur eine einzelne Rechnung bezahlt werden!"
531
532#. module: account_invoice_cash_discount
533#: field:res.company,expense_account_id:0
534#: field:res.company.wizard,expense_account_id:0
535msgid "Account for Expense from Exchange Rate Difference"
536msgstr "Konto für Kursaufwendungen"
537
538#. module: account_invoice_cash_discount
539#: view:account.partial.message:0
540msgid "Do you really want to NOT reconcile this invoice? The proposed payment completely balances the invoiced amount. Please check the payment term lines. Usually, one would use Full Payment to receive ready/paid state for this invoice."
541msgstr "Soll die Rechnung wirklich NICHT ausgeglichen werden? Die vorgeschlagene Zahlung deckt den Rechnungsbetrag vollständig. Überprüfen sie die Zahlungsbedingung. In der Regel sollte hier eine vollständige Zahlung vorgenommen werden, um die Rechnung als bezahlt zu kennzeichnen."
542
543#. module: account_invoice_cash_discount
544#: view:account.invoice.pay.writeoff:0
545msgid "Analytic"
546msgstr "Analytisch"
547
548#. module: account_invoice_cash_discount
549#: view:account.move.line.memory:0
550msgid "Account Move Line"
551msgstr "Buchungssatz"
552
553#. module: account_invoice_cash_discount
554#: model:ir.model,name:account_invoice_cash_discount.model_account_invoice_pay
555#: model:ir.model,name:account_invoice_cash_discount.model_account_invoice_pay_writeoff
556msgid "Pay Invoice "
557msgstr "Zahle Rechnung"
558
559#. module: account_invoice_cash_discount
560#: view:res.company.wizard:0
561msgid "Set Default"
562msgstr "Standard setzen"
563
564#. module: account_invoice_cash_discount
565#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
566#, python-format
567msgid "The account is not configured to be reconciled!"
568msgstr "Dieses Konto ist nicht für den OP-Ausgleich konfiguriert!"
569
570#. module: account_invoice_cash_discount
571#: field:account.move.line.memory,tax_amount:0
572msgid "Tax/Base Amount"
573msgstr "Steuer-/Steuermessbetrag"
574
575#. module: account_invoice_cash_discount
576#: field:account.cash.discount,payment_id:0
577msgid "Related Payment Term"
578msgstr "Zugehörige Zahlungsbedingung"
579
580#. module: account_invoice_cash_discount
581#: view:account.invoice.pay:0
582msgid "Account Cash Discount Moves"
583msgstr "Skontobuchungen"
584
585#. module: account_invoice_cash_discount
586#: view:account.cash.discount:0
587msgid "Cash Discount Account for Supplier and Customer"
588msgstr "Skontokonto für Kreditoren und Debitoren"
589
590#. module: account_invoice_cash_discount
591#: wizard_button:populate_statement_from_inv1,go,finish:0
592msgid "O_k"
593msgstr "O_k"
594
595#. module: account_invoice_cash_discount
596#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
597#, python-format
598msgid "Some entries are already reconciled!"
599msgstr "Einige Buchungen sind bereits ausgeglichen!"
600
601#. module: account_invoice_cash_discount
602#: code:addons/account_invoice_cash_discount/account_invoice_cash_discount.py:0
603#, python-format
604msgid "There seems to be a surcharge, not a cash discount. Can\'t reconcile this!"
605msgstr "Es scheint hier einen Zuschlag zu geben, kein Skonto. Dies kann hiermit nicht ausgeglichen werden!"
606
607#. module: account_invoice_cash_discount
608#: field:account.cash.discount,name:0
609#: field:account.move.line.memory,name:0
610msgid "Name"
611msgstr "Bezeichnung"
612
613#. module: account_invoice_cash_discount
614#: view:account.bank.statement.reconcile:0
615msgid "Total Write-Off/Cash Discount"
616msgstr "Summe Abschreibungen/Skonto"
617
618#. module: account_invoice_cash_discount
619#: model:ir.actions.wizard,name:account_invoice_cash_discount.wizard_period_writeoff_calculation
620#: model:ir.ui.menu,name:account_invoice_cash_discount.menu_period_writeoff_calculation
621msgid "Compute Period Wise Write-off Entry"
622msgstr "Periodenweise Abschreibungen berechnen"
623
624#. module: account_invoice_cash_discount
625#: view:res.company.wizard:0
626msgid "Currency Difference Account Configuration"
627msgstr "Konfiguration der Kursdifferenzenkonten"
628
629#. module: account_invoice_cash_discount
630#: field:account.invoice.pay,cal_method_selection:0
631msgid "Method for Calculation"
632msgstr "Berechnungsmethode"
633
634#. module: account_invoice_cash_discount
635#: field:account.invoice.pay,amount:0
636msgid "Amount Paid"
637msgstr "Gezahlter Betrag"
638
639#. module: account_invoice_cash_discount
640#: view:account.invoice.pay:0
641msgid "Tax Account Moves"
642msgstr "Steuerkontobewegungen"
643
644#. module: account_invoice_cash_discount
645#: model:ir.model,name:account_invoice_cash_discount.model_account_partial_message
646msgid "account.partial.message"
647msgstr "account.partial.message"
648
649#. module: account_invoice_cash_discount
650#: help:account.move.line.memory,currency_id:0
651msgid "The optional foreign currency if it is a multi-currency entry."
652msgstr "Die optionale Fremdwährung bei einer Fremdwährungsbuchung."
653
654#. module: account_invoice_cash_discount
655#: help:account.move.line.memory,tax_code_id:0
656msgid "The account can either be a base tax code or tax code account."
657msgstr "Das Konto kann entweder ein Steuerbemessungs- oder ein Steuerkonto sein"
658
659#. module: account_invoice_cash_discount
660#: field:account.invoice.pay.writeoff,writeoff_acc_id:0
661msgid "Write-Off Account"
662msgstr "Abschreibungskonto"
663
664#. module: account_invoice_cash_discount
665#: field:account.move.line.memory,journal_id:0
666#: wizard_field:account_period_write_calculation,init,journal_id:0
667#: wizard_field:populate_statement_from_inv1,init,journal_id:0
668msgid "Journal"
669msgstr "Journal"
670
671#. module: account_invoice_cash_discount
672#: model:ir.actions.todo,note:account_invoice_cash_discount.config_wizard_res_company_wizard
673msgid "This configuration step sets the default accounts for expense and revenue generated by exchange rate differences"
674msgstr "Dieser Konfigurationsschritt setzt die Standardkonten für Aufwendungen und Erträge aus Kursdifferenzen"
675
0676
=== added directory 'account_invoice_cash_discount/security'
=== added file 'account_invoice_cash_discount/security/ir.model.access.csv'
--- account_invoice_cash_discount/security/ir.model.access.csv 1970-01-01 00:00:00 +0000
+++ account_invoice_cash_discount/security/ir.model.access.csv 2011-07-29 01:35:58 +0000
@@ -0,0 +1,22 @@
1"id","name","model_id:id","group_id:id","perm_read","perm_write","perm_create","perm_unlink"
2"access_account_cash_discount_manager","account.cash.discount","model_account_cash_discount","account.group_account_manager",1,1,1,1
3"access_account_cash_discount_invoice","account.cash.discount","model_account_cash_discount","account.group_account_invoice",1,0,0,0
4"access_account_cash_discount_accountant","account.cash.discount","model_account_cash_discount","account.group_account_user",1,0,0,0
5"access_account_invoice_pay_writeoff_manager","account.invoice.pay.writeoff","model_account_invoice_pay_writeoff","account.group_account_manager",1,1,1,1
6"access_account_invoice_pay_writeoff_invoive","account.invoice.pay.writeoff","model_account_invoice_pay_writeoff","account.group_account_invoice",1,0,0,0
7"access_account_invoice_pay_writeoff_accountant","account.invoice.pay.writeoff","model_account_invoice_pay_writeoff","account.group_account_user",1,0,0,0
8"access_account_invoice_pay_manager","account.invoice.pay","model_account_invoice_pay","account.group_account_manager",1,1,1,1
9"access_account_invoice_pay_invoice","account.invoice.pay","model_account_invoice_pay","account.group_account_invoice",1,0,0,0
10"access_account_invoice_pay_accountant","account.invoice.pay","model_account_invoice_pay","account.group_account_user",1,0,0,0
11"access_res_company_wizard_manager","res.company.wizard","model_res_company_wizard","account.group_account_manager",1,1,1,1
12"access_res_company_wizard_invoice","res.company.wizard","model_res_company_wizard","account.group_account_invoice",1,0,0,0
13"access_res_company_wizard_accountant","res.company.wizard","model_res_company_wizard","account.group_account_user",1,0,0,0
14"access_account_move_line_memory_manager","account.move.line.memory","model_account_move_line_memory","account.group_account_manager",1,1,1,1
15"access_account_move_line_memory_invoice","account.move.line.memory","model_account_move_line_memory","account.group_account_invoice",1,0,0,0
16"access_account_move_line_memory_accountant","account.move.line.memory","model_account_move_line_memory","account.group_account_user",1,0,0,0
17"access_account_message_manager","account.message","model_account_message","account.group_account_manager",1,1,1,1
18"access_account_message_invoice","account.message","model_account_message","account.group_account_invoice",1,0,0,0
19"access_account_message_accountant","account.message","model_account_message","account.group_account_user",1,0,0,0
20"access_account_partial_message_manager","account.partial.message","model_account_partial_message","account.group_account_manager",1,1,1,1
21"access_account_partial_message_invoice","account.partial.message","model_account_partial_message","account.group_account_invoice",1,0,0,0
22"access_account_partial_message_accountant","account.partial.message","model_account_partial_message","account.group_account_user",1,0,0,0
023
=== added directory 'account_invoice_cash_discount/wizard'
=== added file 'account_invoice_cash_discount/wizard/__init__.py'
--- account_invoice_cash_discount/wizard/__init__.py 1970-01-01 00:00:00 +0000
+++ account_invoice_cash_discount/wizard/__init__.py 2011-07-29 01:35:58 +0000
@@ -0,0 +1,29 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6# $Id$
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23import account_pay_invoice
24import invoice_statement_payment
25import wizard_discount_reconcile
26import wizard_write_period_entry_calculation
27
28# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
29
030
=== added file 'account_invoice_cash_discount/wizard/account_pay_invoice.py'
--- account_invoice_cash_discount/wizard/account_pay_invoice.py 1970-01-01 00:00:00 +0000
+++ account_invoice_cash_discount/wizard/account_pay_invoice.py 2011-07-29 01:35:58 +0000
@@ -0,0 +1,651 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2010 Tiny SPRL (<http://tiny.be>).
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21import time
22from lxml import etree
23from osv import fields, osv
24from tools.translate import _
25from tools import config
26
27class account_invoice_pay_writeoff(osv.osv_memory):
28 """
29 Opens the write-off amount pay form.
30 """
31 _name = "account.invoice.pay.writeoff"
32 _description = "Pay Invoice"
33 _columns = {
34 'writeoff_acc_id': fields.many2one('account.account', 'Write-Off Account', required=True),
35 'writeoff_journal_id': fields.many2one('account.journal', 'Write-Off Journal', required=True),
36 'comment': fields.char('Comment', size=64, required=True),
37 'analytic_id': fields.many2one('account.analytic.account', 'Analytic Account'),
38 }
39 _defaults = {
40 'comment':lambda *a: 'Write-Off',
41 }
42
43 def pay_and_reconcile_writeoff(self, cr, uid, ids, context=None):
44 pay_invoice = self.pool.get('account.invoice.pay')
45 data = self.read(cr, uid, ids, context=context)[0]
46 context.update({'write_off': data})
47 self.pool.get('account.invoice.pay').pay_and_reconcile(cr, uid, ids, context=context)
48 return {}
49
50account_invoice_pay_writeoff()
51
52class account_invoice_pay(osv.osv_memory):
53 """
54 Generate pay invoice wizard. The user can make partial or full payment of invoices.
55 """
56 _name = "account.invoice.pay"
57 _description = "Pay Invoice"
58 _columns = {
59 'amount': fields.float('Amount Paid', required=True),
60 'name': fields.char('Entry Name', size=64, required=True),
61 'date': fields.date('Payment Date', required=True),
62 'cash_residual_amount': fields.float('Residual Amount'),
63 'journal_id': fields.many2one('account.journal', 'Journal/Payment Mode', required=True),
64 'period_id': fields.many2one('account.period', 'Period', required=True),
65 'cash_amount': fields.float('Cash Discount Amount',),
66 'account_id': fields.many2one('account.account', 'Cash Discount Account',),
67 'cal_method_selection': fields.selection([('method_gross_methodology', 'Calculate Discount with Gross Methodology'),
68 ('method_net_methodology', 'Calculate Discount with Net Methodology'),],
69 'Method for Calculation'),
70 'discount_move_ids': fields.many2many('account.move.line.memory', 'account_discount_move_rel', 'discount_account_id', 'discount_move_id', 'Account Discount Moves'),
71 'tax_move_ids': fields.many2many('account.move.line.memory', 'account_tax_move_rel', 'tax_account_id', 'tax_move_id', 'Account Taxes Moves'),
72 }
73
74 def _get_period(self, cr, uid, context=None):
75 ids = self.pool.get('account.period').find(cr, uid, context=context)
76 period_id = False
77 if len(ids):
78 period_id = ids[0]
79 return period_id
80
81 def _get_amount(self, cr, uid, context=None):
82 obj_inv = self.pool.get('account.invoice')
83 tax_obj = self.pool.get('account.tax')
84 invoice = obj_inv.browse(cr, uid, context['id'], context=context)
85 total_tax_amount = total_amount = 0.0
86 amount = obj_inv._get_amount(cr, uid, [context['id']], invoice.residual, invoice.payment_term.id, context=context)
87 amount = amount['amount']
88 context.update({'found': amount})
89 discount = obj_inv._get_payment(cr, uid, [context['id']], amount, invoice.payment_term.id, context=context)
90 residual_amount = amount - discount
91 return residual_amount
92
93 def _get_discount(self, cr, uid, context=None):
94 obj_inv = self.pool.get('account.invoice')
95 tax_obj = self.pool.get('account.tax')
96 invoice = obj_inv.browse(cr, uid, context['id'], context=context)
97 amount = obj_inv._get_amount(cr, uid, [context['id']], invoice.residual, invoice.payment_term.id, context=context)
98 amount = amount['amount']
99 discount = obj_inv._get_payment(cr, uid, [context['id']], amount, invoice.payment_term.id, context=context)
100 return discount
101
102 def _get_account(self, cr, uid, context=None):
103 """
104 This function returns the account according to the cash discount payment term and maps the account with fiscal position
105 """
106 obj_inv = self.pool.get('account.invoice')
107 invoice = obj_inv.browse(cr, uid, context['id'], context=context)
108 account = obj_inv._get_account(cr, uid, [context['id']], invoice.residual, invoice.payment_term.id, context=context)
109 if account and invoice.fiscal_position:
110 account = self.pool.get('account.fiscal.position').map_account(cr, uid, invoice.fiscal_position, account)
111 return account
112
113 def _get_discount_move(self, cr, uid, context=None):
114 invoice_obj = self.pool.get('account.invoice')
115 invoice_tax_obj = self.pool.get("account.invoice.tax")
116 move_line_obj_memory = self.pool.get('account.move.line.memory')
117 tax_obj = self.pool.get('account.tax')
118 cur_obj = self.pool.get('res.currency')
119
120 invoice = self.pool.get('account.invoice').browse(cr, uid, context['id'], context=context)
121
122 #### to get direction
123 types = {'out_invoice': -1, 'in_invoice': 1, 'out_refund': 1, 'in_refund': -1}
124 direction = types[invoice.type]
125 date = time.strftime('%Y-%m-%d')
126
127 #### to get name
128 name = invoice.invoice_line and invoice.invoice_line[0].name or invoice.number
129 ##### Entry in the discount account moves and entry in the tax account moves
130
131 amount = discount = 0.0
132 discount_line_ids = []
133 discount_account_id = base_code_id = False
134
135 discount = self._get_discount(cr, uid, context=context)
136 discount_account_id = self._get_account(cr, uid, context=context)
137 if discount > 0.0:
138 for line in invoice.invoice_line:
139 total_tax_amount = line_tax_amount = 0.0
140 tax_base = tax_code = False
141
142 for tax in tax_obj.compute(cr, uid, line.invoice_line_tax_id, line.price_subtotal / line.quantity, line.quantity, invoice.address_invoice_id.id, line.product_id, invoice.partner_id):
143 line_tax_amount += tax['amount']
144 line_total = line.price_subtotal + line_tax_amount
145 invoice_res_amount = invoice.amount_total
146 line_ratio = line_total / invoice_res_amount
147 #####################################################
148 discount_pay = discount * line_ratio
149 tax_real_amt = 0.0
150 if line.invoice_line_tax_id:
151 for tax_id in line.invoice_line_tax_id:
152 tax_data = tax_obj.browse(cr, uid, tax_id.id, context=context)
153 tax_amt = round((discount_pay * tax_data.amount), int(config['price_accuracy']))
154 tax_real_amt = round((tax_amt / (1 + tax_data.amount)), int(config['price_accuracy']))
155 total_tax_amount += tax_real_amt
156
157 tax_base = tax_data.base_code_id.id
158 tax_code = tax_data.tax_code_id.id
159
160 tax_invoice_id = invoice_tax_obj.search(cr, uid, [('invoice_id', '=', invoice.id), ('tax_code_id', '=', tax_code), ('base_code_id', '=', tax_base)])
161 for tax_id in tax_invoice_id:
162 tax_value = invoice_tax_obj.browse(cr, uid, tax_id)
163 base_code_id = tax_value.base_code_id.id
164
165 if invoice.company_id.currency_id.id <> invoice.currency_id.id:
166 discount_amount = discount - tax_real_amt
167 amount = cur_obj.compute(cr, uid, invoice.currency_id.id, invoice.company_id.currency_id.id, discount_amount, context=context)
168
169 l4 = {
170 'debit': direction * (discount_pay - total_tax_amount) < 0 and abs(discount_pay - total_tax_amount) or 0.0,
171 'credit': direction * (discount_pay - total_tax_amount) > 0 and abs(discount_pay - total_tax_amount) or 0.0,
172 'account_id': discount_account_id,
173 'date': date,
174 'name': name,
175 'currency_id': invoice.currency_id and invoice.currency_id.id,
176 'journal_id': invoice.journal_id and invoice.journal_id.id,
177 'tax_code_id': base_code_id,
178 'tax_amount': -(discount_pay - total_tax_amount),
179 'amount_currency': amount and direction * amount or 0.0,
180 'analytic_account_id': line.account_analytic_id.id,
181 }
182
183 discount_line_id = move_line_obj_memory.create(cr, uid, l4, context=context)
184 discount_line_ids.append(l4)
185 return discount_line_ids
186
187 def _get_taxes_move(self, cr, uid, context=None):
188 invoice_obj = self.pool.get('account.invoice')
189 invoice_tax_obj = self.pool.get("account.invoice.tax")
190 move_line_obj_memory = self.pool.get('account.move.line.memory')
191 tax_obj = self.pool.get('account.tax')
192 cur_obj = self.pool.get('res.currency')
193
194 invoice = self.pool.get('account.invoice').browse(cr, uid, context['id'], context=context)
195
196 #### to get direction
197 types = {'out_invoice': -1, 'in_invoice': 1, 'out_refund': 1, 'in_refund': -1}
198 direction = types[invoice.type]
199 date = time.strftime('%Y-%m-%d')
200
201 #### to get name
202 name = invoice.invoice_line and invoice.invoice_line[0].name or invoice.number
203 ##### Entry in the discount account moves and entry in the tax account moves
204 amount = discount = 0.0
205 line_ids = []
206 tax_code_id = tax_account_id = tax_base = tax_code = False
207
208 discount = self._get_discount(cr, uid, context=context)
209 if discount > 0.0:
210 for line in invoice.invoice_line:
211 line_tax_amount = total_tax_amount = 0.0
212 ############# Ratio#####
213 for tax in tax_obj.compute(cr, uid, line.invoice_line_tax_id, line.price_subtotal / line.quantity, line.quantity, invoice.address_invoice_id.id, line.product_id, invoice.partner_id):
214 line_tax_amount += tax['amount']
215 line_total = line.price_subtotal + line_tax_amount
216 invoice_res_amount = invoice.amount_total
217 line_ratio = line_total / invoice_res_amount
218 #############
219 ### discount for the invoice line
220 discount_pay = discount * line_ratio
221 if line.invoice_line_tax_id:
222 for tax_id in line.invoice_line_tax_id:
223 tax_data = tax_obj.browse(cr, uid, tax_id.id, context=context)
224 tax_amt = round((discount_pay * tax_data.amount), int(config['price_accuracy']))
225 tax_real_amt = round((tax_amt / (1 + tax_data.amount)), int(config['price_accuracy']))
226 total_tax_amount += tax_real_amt
227
228 tax_base = tax_data.base_code_id.id
229 tax_code = tax_data.tax_code_id.id
230
231 tax_invoice_id = invoice_tax_obj.search(cr, uid, [('invoice_id', '=', invoice.id), ('tax_code_id', '=', tax_code), ('base_code_id', '=', tax_base)])
232
233 for tax_id in tax_invoice_id:
234 tax_value = invoice_tax_obj.browse(cr, uid, tax_id)
235 tax_account_id = tax_value.account_id.id
236 tax_code_id = tax_value.tax_code_id.id
237
238 if invoice.company_id.currency_id.id <> invoice.currency_id.id:
239 amount = cur_obj.compute(cr, uid, invoice.currency_id.id, invoice.company_id.currency_id.id, tax_real_amt, context=context)
240
241 l3 = {
242 'debit': direction * tax_real_amt < 0 and abs(tax_real_amt) or 0.0,
243 'credit': direction * tax_real_amt > 0 and abs(tax_real_amt) or 0.0,
244 'account_id': tax_account_id,
245 'date': date,
246 'journal_id': invoice.journal_id and invoice.journal_id.id,
247 'name': name,
248 'currency_id': invoice.currency_id and invoice.currency_id.id,
249 'tax_code_id': tax_code_id,
250 'tax_amount': -tax_real_amt,
251 'amount_currency': amount and direction * amount or 0.0,
252 'analytic_account_id': line.account_analytic_id.id,
253 }
254 line_id = move_line_obj_memory.create(cr, uid, l3, context=context)
255 line_ids.append(l3)
256 return line_ids
257
258 _defaults = {
259 'date': lambda *a: time.strftime('%Y-%m-%d'),
260 'period_id': _get_period,
261 'amount': _get_amount,
262 'cash_amount': _get_discount,
263 'account_id': _get_account,
264 'cash_residual_amount': lambda *a: 0.0,
265 'cal_method_selection': lambda *a: 'method_gross_methodology',
266 'discount_move_ids': _get_discount_move,
267 'tax_move_ids': _get_taxes_move,
268 }
269
270 def on_change_ammount(self, cr, uid, ids, amount, cash_amount, context=None):
271 """
272 This function returns the cash discount according to the Amount Paid and Cash Discount Payment Term
273 """
274 res = {}
275 obj_inv = self.pool.get('account.invoice')
276 invoice = obj_inv.browse(cr, uid, context['id'], context=context)
277 cal_amount = obj_inv._get_amount(cr, uid, [context['id']], invoice.residual, invoice.payment_term.id, context=context)
278 old_cal_amount = old_amount = cal_amount['amount']
279 diff_amount = round(old_amount - amount + cash_amount, int(config['price_accuracy']))
280
281 return {'value': {'cash_residual_amount': diff_amount}}
282
283 def on_change_cash_discount_amount(self, cr, uid, ids, discount_amount, amount, context=None):
284 ### Return discount amount
285 res = {}
286 obj_inv = self.pool.get('account.invoice')
287 invoice = obj_inv.browse(cr, uid, context['id'], context=context)
288 cal_amount = obj_inv._get_amount(cr, uid, [context['id']] ,invoice.residual, invoice.payment_term.id, context=context)
289 old_cal_amount = old_amount = cal_amount['amount']
290 discount = obj_inv._get_payment(cr, uid, [context['id']] , amount, invoice.payment_term.id, context=context)
291 diff_amount = round(old_amount - amount + discount_amount, int(config['price_accuracy']))
292
293 return {'value' : {'cash_amount':discount_amount,'cash_residual_amount':diff_amount}}
294
295 def _calculation(self, cr, uid, ids, context=None):
296 invoice_obj = self.pool.get('account.invoice')
297 invoice_tax_obj = self.pool.get("account.invoice.tax")
298 move_line_obj_memory = self.pool.get('account.move.line.memory')
299 tax_obj = self.pool.get('account.tax')
300 cur_obj = self.pool.get('res.currency')
301
302 data = self.read(cr, uid, ids, context=context)[0]
303 invoice = self.pool.get('account.invoice').browse(cr, uid, context['id'], context=context)
304 #### to get direction
305 types = {'out_invoice': -1, 'in_invoice': 1, 'out_refund': 1, 'in_refund': -1}
306 direction = types[invoice.type]
307 date = time.strftime('%Y-%m-%d')
308
309 #### to get name
310 name = invoice.invoice_line and invoice.invoice_line[0].name or invoice.number
311 ##### Entry in the discount account moves and entry in the tax account moves
312
313 if data.get('cash_amount', 0.0) <= 0.0:
314 return True
315
316 tax_total_amount = amount = discount = 0.0
317 line_ids = discount_line_ids = []
318 discount_account_id = tax_account_id = False
319 tax_code_id = base_code_id = tax_base = tax_code = False
320
321 for line in invoice.invoice_line:
322 line_tax_amount = total_tax_amount = tax_real_amt = 0.0
323 #####get the ratio of the line in the total invoice amount
324 for tax in tax_obj.compute(cr, uid, line.invoice_line_tax_id, line.price_subtotal / line.quantity, line.quantity, invoice.address_invoice_id.id, line.product_id, invoice.partner_id):
325 line_tax_amount += tax['amount']
326 line_total = line.price_subtotal + line_tax_amount
327 invoice_res_amount = invoice.amount_total
328 line_ratio = line_total / invoice_res_amount
329 ###########################
330 discount_pay = data['cash_amount'] * line_ratio
331 if line.invoice_line_tax_id:
332 for tax_id in line.invoice_line_tax_id:
333 tax_data = tax_obj.browse(cr, uid, tax_id.id, context=context)
334 tax_amt = round(discount_pay * tax_data.amount, int(config['price_accuracy']))
335 tax_real_amt = round(tax_amt / (1 + tax_data.amount), int(config['price_accuracy']))
336 total_tax_amount += tax_real_amt
337
338 tax_base = tax_data.base_code_id.id
339 tax_code = tax_data.tax_code_id.id
340
341 tax_invoice_id = invoice_tax_obj.search(cr, uid, [('invoice_id', '=', invoice.id), ('tax_code_id', '=', tax_code), ('base_code_id', '=', tax_base)])
342 for tax_id in tax_invoice_id:
343 tax_value = invoice_tax_obj.browse(cr, uid, tax_id)
344 tax_account_id = tax_value.account_id.id
345 tax_code_id = tax_value.tax_code_id.id
346 base_code_id = tax_value.base_code_id.id
347
348 if invoice.company_id.currency_id.id <> invoice.currency_id.id:
349 amount = cur_obj.compute(cr, uid, invoice.currency_id.id, invoice.company_id.currency_id.id, tax_real_amt, context=context)
350
351 l3 = {
352 'debit': direction * tax_real_amt < 0 and abs(tax_real_amt) or 0.0,
353 'credit': direction * tax_real_amt > 0 and abs(tax_real_amt) or 0.0,
354 'account_id': tax_account_id,
355 'date': date,
356 'journal_id': data.get('journal_id', False),
357 'name': name,
358 'currency_id': invoice.currency_id and invoice.currency_id.id,
359 'tax_code_id': tax_code_id,
360 'tax_amount': -tax_real_amt,
361 'amount_currency': amount and direction * amount or 0.0,
362 'analytic_account_id': line.account_analytic_id.id,
363 }
364 line_id = move_line_obj_memory.create(cr, uid, l3, context=context)
365 line_ids.append(line_id)
366
367 ### if calculation on the Net Methology then in discount field it will take product income account or product category income account
368 if data['cal_method_selection'] == 'method_net_methodology':
369 if invoice.type == 'in_invoice':
370 if line.product_id.property_account_income:
371 discount_account_id = line.product_id.property_account_income.id
372 else:
373 discount_account_id = line.product_id.categ_id.property_account_income_categ.id
374 else:
375 if line.product_id.property_account_income:
376 discount_account_id = line.product_id.property_account_expense.id
377 else:
378 discount_account_id = line.product_id.categ_id.property_account_expense_categ.id
379
380 else:
381 discount_account_id = data['account_id']
382
383 if invoice.company_id.currency_id.id <> invoice.currency_id.id:
384 discount_amount = discount_pay - tax_real_amt
385 amount = cur_obj.compute(cr, uid, invoice.currency_id.id, invoice.company_id.currency_id.id, discount_amount, context=context)
386
387 l4 = {
388 'debit': direction * (discount_pay - total_tax_amount) < 0 and abs(discount_pay - total_tax_amount) or 0.0,
389 'credit': direction * (discount_pay - total_tax_amount) > 0 and abs(discount_pay - total_tax_amount) or 0.0,
390 'account_id': discount_account_id,
391 'date': date,
392 'name': name,
393 'currency_id': invoice.currency_id and invoice.currency_id.id,
394 'journal_id': data.get('journal_id', False),
395 'tax_code_id': base_code_id,
396 'tax_amount': -(discount_pay - total_tax_amount),
397 'amount_currency': amount and direction * amount or 0.0,
398 'analytic_account_id': line.account_analytic_id.id,
399 }
400
401 discount_line_id = move_line_obj_memory.create(cr, uid, l4, context=context)
402 discount_line_ids.append(discount_line_id)
403
404 self.write(cr, uid, ids,
405 {'tax_move_ids': [(6, 0, line_ids)],
406 'discount_move_ids' : [(6, 0, discount_line_ids)],
407 }, context=context)
408
409 return True
410
411 def default_get(self, cr, uid, fields, context=None):
412 res = super(account_invoice_pay, self).default_get(cr, uid, fields, context=context)
413 invoice = self.pool.get('account.invoice').browse(cr, uid, context['id'], context=context)
414 if invoice.state in ['draft', 'proforma2', 'cancel', 'paid']:
415 raise osv.except_osv(_('Error!'), _('Cannot pay invoices in draft/proforma/cancel/done state.'))
416 return res
417
418 def _message(self, cr, uid, ids, context=None):
419 mod_obj = self.pool.get('ir.model.data')
420 data = self.read(cr, uid, ids, context=context)[0]
421 invoice = self.pool.get('account.invoice').browse(cr, uid, context['id'], context)
422
423 if data.get('discount_move_ids', False):
424 context.update({'discount_move_ids': data['discount_move_ids']})
425 if data.get('tax_move_ids', False):
426 context.update({'tax_move_ids': data['tax_move_ids']})
427 if data.get('amount', False):
428 context.update({'amount': data['amount']})
429 if data.get('cash_amount', False):
430 context.update({'cash_amount': data['cash_amount']})
431
432 total_data_amount = total_invoice_amount = 0.0
433 total_data_amount = data['amount'] + data['cash_amount']
434 total_invoice_amount = invoice.residual
435
436 model_data_ids = mod_obj.search(cr, uid,[('model', '=', 'ir.ui.view'), ('name', '=', 'view_account_message')], context=context)
437 resource_id = mod_obj.read(cr, uid, model_data_ids, fields=['res_id'], context=context)[0]['res_id']
438 if self.pool.get('res.currency').is_zero(cr, uid, invoice.company_id.currency_id, (total_invoice_amount - total_data_amount)):
439 self.pool.get('account.invoice.pay').pay_and_reconcile(cr, uid, ids, context=context)
440 return {}
441 else:
442 return {
443 'name': _('Message'),
444 'context': context,
445 'view_type': 'form',
446 'view_mode': 'form',
447 'res_model': 'account.message',
448 'views': [(resource_id, 'form')],
449 'type': 'ir.actions.act_window',
450 'target': 'new',
451 }
452
453 def _message_partial(self, cr, uid, ids, context=None):
454 mod_obj = self.pool.get('ir.model.data')
455 data = self.read(cr, uid, ids, context=context)[0]
456 invoice = self.pool.get('account.invoice').browse(cr, uid, context['id'], context)
457
458 total_data_amount = total_invoice_amount = 0.0
459
460 if data.get('discount_move_ids', False):
461 context.update({'discount_move_ids': data['discount_move_ids']})
462 if data.get('tax_move_ids', False):
463 context.update({'tax_move_ids': data['tax_move_ids']})
464 if data.get('amount', False):
465 context.update({'amount': data['amount']})
466 if data.get('cash_amount', False):
467 context.update({'cash_amount': data['cash_amount']})
468
469 total_data_amount = data['amount'] + data['cash_amount']
470 total_invoice_amount = invoice.residual
471
472 if self.pool.get('res.currency').is_zero(cr, uid, invoice.company_id.currency_id, (total_invoice_amount - total_data_amount)):
473 model_data_ids = mod_obj.search(cr, uid, [('model', '=', 'ir.ui.view'), ('name', '=', 'view_account_partial_message')], context=context)
474 resource_id = mod_obj.read(cr, uid, model_data_ids, fields=['res_id'], context=context)[0]['res_id']
475 return {
476 'name': _('Message'),
477 'context': context,
478 'view_type': 'form',
479 'view_mode': 'form',
480 'res_model': 'account.partial.message',
481 'views': [(resource_id, 'form')],
482 'type': 'ir.actions.act_window',
483 'target': 'new',
484 }
485 else:
486 self.pool.get('account.invoice.pay').pay_and_reconcile(cr, uid, ids, context=context)
487 return {}
488
489 def wo_check(self, cr, uid, ids, context=None):
490 cur_obj = self.pool.get('res.currency')
491 mod_obj = self.pool.get('ir.model.data')
492 obj_inv = self.pool.get('account.invoice')
493
494 if context is None:
495 context = {}
496 data = self.read(cr, uid, ids, context=context)[0]
497 invoice = self.pool.get('account.invoice').browse(cr, uid, context['id'], context)
498 journal = self.pool.get('account.journal').browse(cr, uid, data['journal_id'], context)
499 # Here we need that:
500 # The invoice total amount in company's currency <> paid amount in company currency
501 # (according to the correct day rate, invoicing rate and payment rate are may be different)
502 # => Ask to a write-off of the difference. This could happen even if both amount are equal,
503 # because if the currency rate
504 # Get the amount in company currency for the invoice (according to move lines)
505 inv_amount_company_currency = 0
506 for aml in invoice.move_id.line_id:
507 if aml.account_id.id == invoice.account_id.id or aml.account_id.type in ('receivable', 'payable'):
508 inv_amount_company_currency += aml.debit
509 inv_amount_company_currency -= aml.credit
510 inv_amount_company_currency = abs(inv_amount_company_currency)
511 # Get the current amount paid in company currency
512 if journal.currency and invoice.company_id.currency_id.id <> journal.currency.id:
513 ctx = {'date': data['date']}
514 amount_paid = cur_obj.compute(cr, uid, journal.currency.id, invoice.company_id.currency_id.id, data['amount'], round=True, context=ctx)
515 else:
516 amount_paid = data['amount'] + data['cash_amount']
517
518 # Get the old payment if there are some
519 if invoice.payment_ids:
520 debit = credit = 0.0
521 for payment in invoice.payment_ids:
522 debit += payment.debit
523 credit += payment.credit
524 amount_paid += abs(debit - credit)
525
526 if data['cash_residual_amount'] == 0.0 or self.pool.get('res.currency').is_zero(cr, uid, invoice.company_id.currency_id,
527 (amount_paid - inv_amount_company_currency)):
528 return self.pay_and_reconcile(cr, uid, ids, context=context)
529 else:
530 model_data_ids = mod_obj.search(cr, uid,[('model', '=', 'ir.ui.view'), ('name', '=', 'view_account_invoice_pay_writeoff')], context=context)
531 resource_id = mod_obj.read(cr, uid, model_data_ids, fields=['res_id'], context=context)[0]['res_id']
532 return {
533 'name': _('Information Addendum'),
534 'context': context,
535 'view_type': 'form',
536 'view_mode': 'form',
537 'res_model': 'account.invoice.pay.writeoff',
538 'views': [(resource_id, 'form')],
539 'type': 'ir.actions.act_window',
540 'target': 'new',
541 }
542
543 def pay_and_reconcile(self, cr, uid, ids, context=None):
544 cur_obj = self.pool.get('res.currency')
545 if context is None:
546 context = {}
547
548 data = self.read(cr, uid, ids, context=context)[0]
549 writeoff_account_id = writeoff_journal_id = comment = False
550
551 if 'write_off' in context and context['write_off'] :
552 writeoff_account_id = context['write_off']['writeoff_acc_id']
553 writeoff_journal_id = context['write_off']['writeoff_journal_id']
554 comment = context['write_off']['comment']
555
556 if context.get('amount', False):
557 amount = context['amount'] + context.get('cash_amount', 0.0)
558 else:
559 amount = data['amount'] + data['cash_amount']
560
561 invoice = self.pool.get('account.invoice').browse(cr, uid, context['id'], context=context)
562 journal = self.pool.get('account.journal').browse(cr, uid, data['journal_id'], context=context)
563 # Compute the amount in company's currency, with the journal currency (which is equal to payment currency)
564 # when it is needed : If payment currency (according to selected journal.currency) is <> from company currency
565 curr_diff = False
566 if journal.currency and invoice.company_id.currency_id.id <> journal.currency.id:
567 ctx = {'date': data['date']}
568 amount = cur_obj.compute(cr, uid, journal.currency.id, invoice.company_id.currency_id.id, amount, context=ctx)
569 currency_id = journal.currency.id
570 # Put the paid amount in currency, and the currency, in the context if currency is different from company's currency
571 if context.get('amount', False):
572 context.update({'amount_currency': context['amount'] + context.get('cash_amount', 0.0),'currency_id': currency_id})
573 else:
574 context.update({'amount_currency': data['amount'] + data['cash_amount'], 'currency_id': currency_id})
575 curr_diff = True
576
577 if not journal.currency and invoice.company_id.currency_id.id <> invoice.currency_id.id and not curr_diff:
578 ctx = {'date': data['date']}
579 amount = cur_obj.compute(cr, uid, invoice.currency_id.id, invoice.company_id.currency_id.id, amount, context=ctx)
580 currency_id = invoice.currency_id.id
581 # Put the paid amount in currency, and the currency, in the context if currency is different from company's currency
582 if context.get('amount', False):
583 context.update({'amount_currency': context['amount'] + context.get('cash_amount', 0.0), 'currency_id': currency_id})
584 else:
585 context.update({'amount_currency': data['amount'] + data['cash_amount'], 'currency_id': currency_id})
586
587 context.update({'account_id': data['account_id'], 'date_p': data['date'],'comment': comment or False})
588
589 if context.get('discount_move_ids', False):
590 context.update({'discount_move_ids': context['discount_move_ids']})
591 else:
592 context.update({'discount_move_ids': data['discount_move_ids']})
593
594 if context.get('tax_move_ids', False):
595 context.update({'tax_move_ids': context['tax_move_ids']})
596 else:
597 context.update({'tax_move_ids': data['tax_move_ids']})
598
599 if context.get('cash_amount', False):
600 context.update({'cash_amount': context['cash_amount']})
601 else:
602 context.update({'cash_amount': data['cash_amount']})
603
604 acc_id = journal.default_credit_account_id and journal.default_credit_account_id.id
605 if not acc_id:
606 raise osv.except_osv(_('Error!'), _('Your journal must have a default credit and debit account.'))
607
608 self.pool.get('account.invoice').pay_and_reconcile(cr, uid, [context['id']],
609 amount, acc_id, data['period_id'], data['journal_id'], writeoff_account_id,
610 data['period_id'], writeoff_journal_id, context, data['name'])
611 return {}
612
613account_invoice_pay()
614
615class account_move_line_memory(osv.osv_memory):
616 _name= "account.move.line.memory"
617 _description = "Account Move Line Memory "
618 _columns = {
619 'date': fields.date('Effective Date', required=True),
620 'name': fields.char('Name', size=64, required=True),
621 'account_id': fields.many2one('account.account', 'Account',),
622 'journal_id': fields.many2one('account.journal', 'Journal', required=True, select=1),
623 'debit': fields.float('Debit', digits=(16,2)),
624 'credit': fields.float('Credit', digits=(16,2)),
625 'tax_code_id': fields.many2one('account.tax.code', 'Tax Account', help="The account can either be a base tax code or tax code account."),
626 'tax_amount': fields.float('Tax/Base Amount', digits=(16,2), select=True),
627 'currency_id': fields.many2one('res.currency', 'Currency', help="The optional foreign currency if it is a multi-currency entry."),
628 'amount_currency': fields.float('Amount Currency', help="The amount in the optional foreign currency if it is a multi-currency entry."),
629 'analytic_account_id' : fields.many2one('account.analytic.account', 'Analytic Account'),
630 }
631account_move_line_memory()
632
633class account_message(osv.osv_memory):
634 _name = "account.message"
635 def _check(self, cr, uid, ids, context=None):
636 data = self.read(cr, uid, ids,context=context)[0]
637 result = self.pool.get('account.invoice.pay').wo_check(cr, uid, ids, context=context)
638 return result
639
640account_message()
641
642class account_partial_message(osv.osv_memory):
643 _name = "account.partial.message"
644 def _check_partial(self, cr, uid, ids, context=None):
645 data = self.read(cr, uid, ids,context=context)[0]
646 result = self.pool.get('account.invoice.pay').pay_and_reconcile(cr, uid, ids, context=context)
647 return result
648
649account_partial_message()
650
651# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0\ No newline at end of file652\ No newline at end of file
1653
=== added file 'account_invoice_cash_discount/wizard/account_pay_invoice_view.xml'
--- account_invoice_cash_discount/wizard/account_pay_invoice_view.xml 1970-01-01 00:00:00 +0000
+++ account_invoice_cash_discount/wizard/account_pay_invoice_view.xml 2011-07-29 01:35:58 +0000
@@ -0,0 +1,135 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4 <record id="view_account_invoice_pay" model="ir.ui.view">
5 <field name="name">account.invoice.pay.form</field>
6 <field name="model">account.invoice.pay</field>
7 <field name="type">form</field>
8 <field name="arch" type="xml">
9 <form string="Pay Invoice">
10 <group colspan="4">
11 <field name="amount" on_change="on_change_ammount(amount, cash_amount, context)"/>
12 <field name="cash_residual_amount"/>
13 <field name="name"/>
14 <field name="date"/>
15 <field name="journal_id" domain="[('type', '=', 'cash')]"/>
16 <field name="period_id"/>
17 <field name="cash_amount" on_change="on_change_cash_discount_amount(cash_amount, amount, context)" attrs="{'required': [('cash_amount', '>', 0)]}"/>
18 <field name="account_id" attrs="{'required':[('cash_amount', '>', 0)]}"/>
19 </group>
20 <group>
21 <separator string="Method For Calculation" colspan="4"/>
22 <field name="cal_method_selection" colspan="2" nolabel="1"/>
23 <button icon="gtk-execute" string="Calculate" name="_calculation" type="object"/>
24 </group>
25 <group colspan="4">
26 <separator string="Account Cash Discount Moves" colspan="4"/>
27 <field name="discount_move_ids" widget="one2many_list" nolabel="1"/>
28 </group>
29 <group colspan="4">
30 <separator string="Tax Account Moves" colspan="4"/>
31 <field name="tax_move_ids" widget="one2many_list" nolabel="1"/>
32 </group>
33 <group colspan="4" col="6">
34 <label string="" colspan="2"/>
35 <button icon="gtk-cancel" special="cancel" string="Cancel"/>
36 <button icon="gtk-execute" string="Partial Payment" name="_message_partial" type="object"/>
37 <button icon="gtk-execute" string="Full Payment" name="_message" type="object"/>
38 </group>
39 </form>
40 </field>
41 </record>
42
43 <act_window name="Pay Invoice"
44 res_model="account.invoice.pay"
45 src_model="account.invoice"
46 view_mode="form"
47 target="new"
48 context="{'id': active_id}"
49 id="action_view_account_invoice_pay"/>
50
51 <record id="view_account_invoice_pay_writeoff" model="ir.ui.view">
52 <field name="name">account.invoice.pay.writeoff.form</field>
53 <field name="model">account.invoice.pay.writeoff</field>
54 <field name="type">form</field>
55 <field name="arch" type="xml">
56 <form string="Information Addendum">
57 <group colspan="4">
58 <separator string="Write-Off Move" colspan="4"/>
59 <field name="writeoff_journal_id"/>
60 <field name="writeoff_acc_id" domain="[('type', '&lt;&gt;', 'view'), ('type', '&lt;&gt;', 'consolidation')]"/>
61 <field name="comment"/>
62 <separator string="Analytic" colspan="4"/>
63 <field name="analytic_id"/>
64 </group>
65 <group colspan="4" col="6">
66 <label string="" colspan="2"/>
67 <button icon="gtk-cancel" special="cancel" string="Cancel"/>
68 <button icon="gtk-execute" string="Pay and Reconcile" name="pay_and_reconcile_writeoff" type="object"/>
69 </group>
70 </form>
71 </field>
72 </record>
73
74 <record id="view_account_move_line_memory" model="ir.ui.view">
75 <field name="name">account.move.line.memory.form</field>
76 <field name="model">account.move.line.memory</field>
77 <field name="type">tree</field>
78 <field name="arch" type="xml">
79 <tree string="Account Move Line" editable="bottom">
80 <field name="date"/>
81 <field name="name"/>
82 <field name="account_id"/>
83 <field name="journal_id"/>
84 <field name="debit"/>
85 <field name="credit"/>
86 <field name="tax_code_id"/>
87 <field name="tax_amount"/>
88 <field name="currency_id"/>
89 <field name="amount_currency"/>
90 <field name="analytic_account_id"/>
91 </tree>
92 </field>
93 </record>
94
95 <record id="view_account_message" model="ir.ui.view">
96 <field name="name">account.message.form</field>
97 <field name="model">account.message</field>
98 <field name="type">form</field>
99 <field name="arch" type="xml">
100 <form string="Messages">
101 <group>
102 <separator string="Full Payment" colspan="4"/>
103 <label string ="Do you really want to reconcile this invoice?
104The proposed payment does not completely balance the invoiced amount.
105Please check the payment term lines. Usually, one would use Partial
106Payment to avoid the ready/paid state for this invoice." colspan="2"/>
107 <newline/>
108 <button icon="gtk-cancel" special="cancel" string="Cancel" colspan="1"/>
109 <button icon="gtk-execute" string="OK" name="_check" type="object" colspan="1"/>
110 </group>
111 </form>
112 </field>
113 </record>
114
115 <record id="view_account_partial_message" model="ir.ui.view">
116 <field name="name">account.partial.message.form</field>
117 <field name="model">account.partial.message</field>
118 <field name="type">form</field>
119 <field name="arch" type="xml">
120 <form string="Messages">
121 <group>
122 <separator string="Partial Payment" colspan="4"/>
123 <label string ="Do you really want to NOT reconcile this invoice?
124The proposed payment completely balances the invoiced amount.
125Please check the payment term lines. Usually, one would use Full Payment
126to receive ready/paid state for this invoice." colspan="2"/>
127 <newline/>
128 <button icon="gtk-cancel" special="cancel" string="Cancel" colspan="1"/>
129 <button icon="gtk-execute" string="OK" name="_check_partial" type="object" colspan="1"/>
130 </group>
131 </form>
132 </field>
133 </record>
134 </data>
135</openerp>
0\ No newline at end of file136\ No newline at end of file
1137
=== added file 'account_invoice_cash_discount/wizard/invoice_statement_payment.py'
--- account_invoice_cash_discount/wizard/invoice_statement_payment.py 1970-01-01 00:00:00 +0000
+++ account_invoice_cash_discount/wizard/invoice_statement_payment.py 2011-07-29 01:35:58 +0000
@@ -0,0 +1,288 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# Copyright (c) 2008 Camptocamp SA All Rights Reserved. (JGG)
5#
6# WARNING: This program as such is intended to be used by professional
7# programmers who take the whole responsability of assessing all potential
8# consequences resulting from its eventual inadequacies and bugs
9# End users who are looking for a ready-to-use solution with commercial
10# garantees and support are strongly adviced to contract a Free Software
11# Service Company
12#
13# This program is Free Software; you can redistribute it and/or
14# modify it under the terms of the GNU General Public License
15# as published by the Free Software Foundation; either version 2
16# of the License, or (at your option) any later version.
17#
18# This program is distributed in the hope that it will be useful,
19# but WITHOUT ANY WARRANTY; without even the implied warranty of
20# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21# GNU General Public License for more details.
22#
23# You should have received a copy of the GNU General Public License
24# along with this program; if not, write to the Free Software
25# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
26#
27##############################################################################
28
29import wizard
30import pooler
31from tools.misc import UpdateableStr
32import time
33
34FORM = UpdateableStr()
35
36FIELDS = {
37 'lines': {
38 'string': 'Invoices',
39 'type': 'many2many',
40 'relation': 'account.move.line',
41 },
42}
43
44START_FIELD = {
45 'date': {
46 'string': 'Payment Date',
47 'type': 'date',
48 'required': True,
49 'default': lambda *a: time.strftime('%Y-%m-%d'),
50 },
51 'journal_id': {
52 'string': 'Journal',
53 'type': 'many2many',
54 'relation': 'account.journal',
55 'domain': '[("type", "in", ["sale", "purchase", "cash"])]',
56 'help': 'This field allows you to choose the accounting journals you want to search invoices in. If you leave this field empty all sale, purchase and cash journals will be searched.',
57 },
58}
59
60START_FORM = '''<?xml version="1.0"?>
61<form string="Import Invoices in Statement">
62 <label string="Choose Journal and Payment Date" colspan="4"/>
63 <field name="date"/>
64 <field name="journal_id" colspan="4"/>
65</form>'''
66
67def _search_invoices(obj, cr, uid, data, context):
68 pool = pooler.get_pool(cr.dbname)
69 statement_obj = pool.get('account.bank.statement')
70 journal_obj = pool.get('account.journal')
71 line_obj = pool.get('account.move.line')
72
73 statement = statement_obj.browse(cr, uid, data['id'], context=context)
74 args_move_line = []
75 repeated_move_line_ids = []
76 # Creating a group that is unique for importing move lines (move lines, once imported into statement lines, should not appear again)
77 for st_line in statement.line_ids:
78 args_move_line = []
79 args_move_line.append(('name', '=', st_line.name))
80 args_move_line.append(('ref', '=', st_line.ref))
81 if st_line.partner_id:
82 args_move_line.append(('partner_id', '=', st_line.partner_id.id))
83 args_move_line.append(('account_id', '=', st_line.account_id.id))
84
85 move_line_id = line_obj.search(cr, uid, args_move_line, context=context)
86 if move_line_id:
87 repeated_move_line_ids += move_line_id
88
89 journal_ids = data['form']['journal_id'][0][2]
90
91 if journal_ids == []:
92 journal_ids = journal_obj.search(cr, uid, [('type', 'in', ('sale', 'cash', 'purchase'))], context=context)
93
94 args = [
95 ('reconcile_id', '=', False),
96 ('journal_id', 'in', journal_ids),
97 ('account_id.reconcile', '=', True)]
98
99 if repeated_move_line_ids:
100 args.append(('id', 'not in', repeated_move_line_ids))
101
102 line_ids = line_obj.search(cr, uid, args,
103 #order='date DESC, id DESC', #doesn't work
104 context=context)
105
106 FORM.string = '''<?xml version="1.0"?>
107<form string="Import Entries">
108 <field name="lines" colspan="4" height="300" width="800" nolabel="1"
109 domain="[('id', 'in', [%s])]"/>
110</form>''' % (','.join([str(x) for x in line_ids]))
111 return {}
112
113def _populate_statement(obj, cursor, user, data, context):
114
115 line_ids = data['form']['lines'][0][2]
116 line_date=data['form']['date']
117 if not line_ids:
118 return {}
119
120 pool = pooler.get_pool(cursor.dbname)
121 statement_obj = pool.get('account.bank.statement')
122 statement_line_obj = pool.get('account.bank.statement.line')
123 statement_reconcile_obj = pool.get('account.bank.statement.reconcile')
124 statement_reconcile_line_obj = pool.get('account.bank.statement.reconcile.line')
125 obj_inv = pool.get('account.invoice')
126 invoice_tax_obj = pool.get("account.invoice.tax")
127 line_obj = pool.get('account.move.line')
128 currency_obj = pool.get('res.currency')
129 tax_obj = pool.get('account.tax')
130
131 discount = 0.0
132
133 statement = statement_obj.browse(cursor, user, data['id'], context=context)
134 # for each selected move lines
135 for line in line_obj.browse(cursor, user, line_ids, context=context):
136 ctx = context.copy()
137 # take the date for computation of currency => use payment date
138 # if line.date_maturity:
139 # ctx['date'] = line.date_maturity
140 # else:
141 ctx['date'] = line_date
142 invoice_amount = cal_invoice_amount = 0.0
143 if line.debit > 0:
144 invoice_amount = line.debit
145 elif line.credit > 0:
146 invoice_amount = -line.credit
147
148 reconcile_id = statement_reconcile_obj.create(cursor, user, {
149 'line_ids': [(6, 0, [line.id])]
150 }, context=context)
151
152 ######################################### Calculation for discount and taxes######
153 if line.invoice.id:
154 discount = 0.0
155 account = False
156 invoice = obj_inv.browse(cursor, user, line.invoice.id, context=context)
157 for invoice_line in invoice.invoice_line:
158 line_tax_amount = total_tax_amount = 0.0
159 tax_account_id = tax_code_id = tax_base_id = False
160 #####get the ratio of the line in the total invoice amount
161 for tax in tax_obj.compute(cursor, user, invoice_line.invoice_line_tax_id, invoice_line.price_subtotal / invoice_line.quantity, invoice_line.quantity, invoice.address_invoice_id.id, invoice_line.product_id, invoice.partner_id):
162 line_tax_amount += tax['amount']
163 line_total = invoice_line.price_subtotal + line_tax_amount
164 invoice_res_amount = invoice.amount_total
165 line_ratio = line_total / invoice_res_amount
166 ###########################
167 if line.amount_currency:
168 invoice_amount = currency_obj.compute(cursor, user, line.currency_id.id, statement.currency.id, line.amount_currency, context=ctx)
169 elif line.invoice and line.invoice.currency_id.id <> statement.currency.id:
170 invoice_amount = currency_obj.compute(cursor, user, line.invoice.currency_id.id, statement.currency.id, invoice_amount, context=ctx)
171
172 amount = obj_inv._get_amount(cursor, user, [invoice.id], invoice_amount, invoice.payment_term.id, context=context)
173 cal_invoice_amount = amount['amount']
174 discount = obj_inv._get_payment(cursor, user, [invoice.id], cal_invoice_amount, invoice.payment_term.id, context=context)
175 account = obj_inv._get_account(cursor, user, [invoice.id], cal_invoice_amount, invoice.payment_term.id, context=context)
176
177 ### set fiscal positon for the discount account
178 if account and invoice.fiscal_position:
179 account = pool.get('account.fiscal.position').map_account(cursor, user, invoice.fiscal_position, account)
180
181 #### discount for the invoice line
182 discount_pay = discount * line_ratio
183 if invoice_line.invoice_line_tax_id:
184 tax_real_amt = 0.0
185 for tax_id in invoice_line.invoice_line_tax_id:
186 tax_data = tax_obj.browse(cursor, user, tax_id.id, context=context)
187 tax_amt = discount_pay * tax_data.amount
188 tax_real_amt = tax_amt / (1 + tax_data.amount)
189 total_tax_amount += tax_real_amt
190
191 tax_base = tax_data.base_code_id.id
192 tax_code = tax_data.tax_code_id.id
193
194 tax_invoice_id = invoice_tax_obj.search(cursor, user, [('invoice_id', '=', invoice.id), ('tax_code_id', '=', tax_code), ('base_code_id', '=', tax_base)])
195 for inv_tax_id in tax_invoice_id:
196 tax_value = invoice_tax_obj.browse(cursor, user, inv_tax_id)
197 tax_account_id = tax_value.account_id.id
198 tax_code_id = tax_value.tax_code_id.id
199 tax_base_id = tax_value.base_code_id.id
200
201 ### set fisical positon for the tax account
202 if tax_account_id and invoice.fiscal_position:
203 tax_account_id = pool.get('account.fiscal.position').map_account(cursor, user, invoice.fiscal_position, tax_account_id)
204
205 if tax_real_amt:
206 statement_reconcile_line_obj.create(cursor, user, {
207 'name': line.name,
208 'amount': tax_real_amt,
209 'account_id': tax_account_id,
210 'line_id': reconcile_id,
211 'tax_code_id': tax_code_id
212 }, context=context)
213
214 if discount:
215 discount = discount * line_ratio
216 statement_reconcile_line_obj.create(cursor, user, {
217 'name': line.name,
218 'amount': discount - total_tax_amount,
219 'account_id': account,
220 'line_id': reconcile_id,
221 'tax_code_id': tax_base_id
222 }, context=context)
223 ##########################################################################
224
225 if line.journal_id.type == 'sale':
226 type = 'customer'
227 elif line.journal_id.type == 'purchase':
228 type = 'supplier'
229 else:
230 type = 'general'
231
232 statement_line_obj.create(cursor, user, {
233 'name': line.name or '?',
234 'amount': cal_invoice_amount,
235 'type': type,
236 'partner_id': line.partner_id.id,
237 'account_id': line.account_id.id,
238 'statement_id': statement.id,
239 'ref': line.ref,
240 'reconcile_id': reconcile_id,
241 'date': line_date, #time.strftime('%Y-%m-%d'), #line.date_maturity or,
242 'cash_discount': discount,
243 'transferred_amount': cal_invoice_amount - discount,
244 }, context=context)
245 return {}
246
247
248class PopulateStatementFromInv(wizard.interface):
249 """
250 Populate the current statement with selected invoices
251 """
252 states = {
253 'init': {
254 'actions': [],
255 'result': {
256 'type': 'form',
257 'arch': START_FORM,
258 'fields':START_FIELD,
259 'state': [
260 ('end', '_Cancel'),
261 ('go', '_Go', '', True),
262 ]
263 },
264 },
265 'go': {
266 'actions': [_search_invoices],
267 'result': {
268 'type': 'form',
269 'arch': FORM,
270 'fields': FIELDS,
271 'state': [
272 ('end', '_Cancel','', True),
273 ('finish', 'O_k','', True)
274 ]
275 },
276 },
277
278 'finish': {
279 'actions': [],
280 'result': {
281 'type': 'action',
282 'action': _populate_statement,
283 'state': 'end'
284 },
285 },
286 }
287PopulateStatementFromInv('populate_statement_from_inv1')
288# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0289
=== added file 'account_invoice_cash_discount/wizard/wizard_discount_reconcile.py'
--- account_invoice_cash_discount/wizard/wizard_discount_reconcile.py 1970-01-01 00:00:00 +0000
+++ account_invoice_cash_discount/wizard/wizard_discount_reconcile.py 2011-07-29 01:35:58 +0000
@@ -0,0 +1,291 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6# $Id$
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23import wizard
24import netsvc
25import time
26import osv
27import pooler
28from mx import DateTime as datetime
29from tools.translate import _
30
31_transaction_form = '''<?xml version="1.0"?>
32<form string="Reconciliation">
33 <separator string="Reconciliation Transactions" colspan="4"/>
34 <field name="trans_nbr"/>
35 <newline/>
36 <field name="credit"/>
37 <field name="debit"/>
38 <separator string="Write-Off" colspan="4"/>
39 <field name="writeoff"/>
40</form>'''
41
42_transaction_fields = {
43 'trans_nbr': {
44 'string': '# of Transaction',
45 'type': 'integer',
46 'readonly': True,
47 },
48 'credit': {
49 'string': 'Credit Amount',
50 'type': 'float',
51 'readonly': True,
52 },
53 'debit': {
54 'string': 'Debit Amount',
55 'type': 'float',
56 'readonly': True,
57 },
58 'writeoff': {
59 'string': 'Write-Off Amount',
60 'type': 'float',
61 'readonly': True,
62 },
63}
64
65def _trans_rec_get(self, cr, uid, data, context=None):
66 pool = pooler.get_pool(cr.dbname)
67 account_move_line_obj = pool.get('account.move.line')
68 credit = debit = 0.0
69 account_id = False
70 count = 0
71 for line in account_move_line_obj.browse(cr, uid, data['ids'], context=context):
72 if not line.reconcile_id and not line.reconcile_id.id:
73 count += 1
74 credit += line.credit
75 debit += line.debit
76 account_id = line.account_id.id
77 return {'trans_nbr': count, 'account_id': account_id, 'credit': credit, 'debit': debit, 'writeoff': debit - credit}
78
79def _trans_rec_reconcile_partial(self, cr, uid, data, context=None):
80 pool = pooler.get_pool(cr.dbname)
81 account_move_line_obj = pool.get('account.move.line')
82 account_move_line_obj.reconcile_partial(cr, uid, data['ids'], 'manual', context=context)
83 return {}
84
85def _trans_rec_reconcile(self, cr, uid, data, context=None):
86 pool = pooler.get_pool(cr.dbname)
87 account_move_line_obj = pool.get('account.move.line')
88
89 form = data['form']
90 account_id = form.get('writeoff_acc_id', False)
91 context['date_p'] = form.get('date_p', False)
92 date = False
93 if context['date_p']:
94 date = datetime.strptime(context['date_p'], '%Y-%m-%d')
95 ids = pool.get('account.period').find(cr, uid, dt=date, context=context)
96 period_id = False
97 if len(ids):
98 period_id = ids[0]
99
100 journal_id = form.get('journal_id', False)
101 context['comment'] = form.get('comment', False)
102 context['analytic_id'] = form.get('analytic_id', False)
103 account_move_line_obj.reconcile(cr, uid, data['ids'], 'manual', account_id,
104 period_id, journal_id, context=context)
105 return {}
106
107def _trans_rec_reconcile_discount(self, cr, uid, data, context=None):
108 pool = pooler.get_pool(cr.dbname)
109 account_move_line_obj = pool.get('account.move.line')
110
111 form = data['form']
112 account_id = form.get('discount_acc_id', False)
113 context['date_p'] = form.get('date_p', False)
114 date = context['date_p'] and datetime.strptime(context['date_p'], '%Y-%m-%d')
115 ids = pool.get('account.period').find(cr, uid, dt=date, context=context)
116 period_id = False
117 if len(ids):
118 period_id = ids[0]
119
120 journal_id = form.get('journal_id', False)
121 context['comment'] = form.get('comment', False)
122 context['analytic_id'] = form.get('analytic_id', False)
123 account_move_line_obj.reconcile_discount(cr, uid, data['ids'], 'manual', account_id,
124 period_id, journal_id, context=context)
125 return {}
126
127def _partial_check(self, cr, uid, data, context):
128 if _trans_rec_get(self,cr,uid, data, context)['writeoff'] == 0:
129 return 'init_full'
130 return 'init_partial'
131
132_transaction_add_form = '''<?xml version="1.0"?>
133<form string="Information Addendum">
134 <separator string="Write-Off Move" colspan="4"/>
135 <field name="journal_id"/>
136 <field name="writeoff_acc_id" domain="[('type', '&lt;&gt;', 'view')]"/>
137 <field name="date_p"/>
138 <field name="comment"/>
139 <separator string="Analytic" colspan="4"/>
140 <field name="analytic_id"/>
141</form>'''
142
143_transaction_add_fields = {
144 'journal_id': {
145 'string': 'Write-Off Journal',
146 'type': 'many2one',
147 'relation': 'account.journal',
148 'required': True,
149 },
150 'writeoff_acc_id': {
151 'string': 'Write-Off account',
152 'type': 'many2one',
153 'relation': 'account.account',
154 'required': True,
155 },
156 'date_p': {
157 'string': 'Date',
158 'type': 'date',
159 },
160 'comment': {
161 'string': 'Comment',
162 'type': 'char',
163 'size': 64,
164 'required': True,
165 },
166 'analytic_id': {
167 'string': 'Analytic Account',
168 'type': 'many2one',
169 'relation': 'account.analytic.account',
170 },
171}
172
173def _trans_rec_addendum(self, cr, uid, data, context={}):
174 date_p = time.strftime('%Y-%m-%d')
175 return {'date_p': date_p, 'comment': _('Write-Off')}
176
177_transaction_discount_form = '''<?xml version="1.0"?>
178<form string="Cash Discount Information">
179 <separator string="Cash Discount Move" colspan="4"/>
180 <field name="journal_id"/>
181 <field name="discount_acc_id" domain="[('type', '&lt;&gt;', 'view')]"/>
182 <field name="date_p"/>
183 <field name="comment"/>
184 <separator string="Analytic" colspan="4"/>
185 <field name="analytic_id"/>
186</form>'''
187
188_transaction_discount_fields = {
189 'journal_id': {
190 'string': 'Cash Discount Journal',
191 'type': 'many2one',
192 'relation': 'account.journal',
193 'required': True,
194 },
195 'discount_acc_id': {
196 'string': 'Cash Discount account',
197 'type': 'many2one',
198 'relation': 'account.account',
199 'required': True,
200 },
201 'date_p': {
202 'string': 'Date',
203 'type': 'date',
204 },
205 'comment': {
206 'string': 'Comment',
207 'type': 'char',
208 'size': 64,
209 'required': True,
210 },
211 'analytic_id': {
212 'string': 'Analytic Account',
213 'type': 'many2one',
214 'relation': 'account.analytic.account',
215 },
216}
217
218def _trans_rec_discount(self, cr, uid, data, context={}):
219 date_p = time.strftime('%Y-%m-%d')
220 return {'date_p': date_p, 'comment': _('Cash Discount')}
221
222class wiz_reconcile(wizard.interface):
223 states = {
224 'init': {
225 'actions': [],
226 'result': {
227 'type': 'choice',
228 'next_state': _partial_check,
229 }
230 },
231 'init_full': {
232 'actions': [_trans_rec_get],
233 'result': {
234 'type': 'form',
235 'arch': _transaction_form,
236 'fields': _transaction_fields,
237 'state': [('end', 'Cancel'), ('reconcile', 'Reconcile')],
238 }
239 },
240 'init_partial': {
241 'actions': [_trans_rec_get],
242 'result': {
243 'type': 'form',
244 'arch': _transaction_form,
245 'fields': _transaction_fields,
246 'state': [('end', 'Cancel'), ('addendum', 'Reconcile with Write-Off'), ('discount', 'Reconcile with Cash Discount'), ('partial', 'Partial Reconcile')],
247 }
248 },
249 'addendum': {
250 'actions': [_trans_rec_addendum],
251 'result': {
252 'type': 'form',
253 'arch': _transaction_add_form,
254 'fields': _transaction_add_fields,
255 'state': [('end', 'Cancel'), ('reconcile', 'Reconcile')],
256 }
257 },
258 'discount': {
259 'actions': [_trans_rec_discount],
260 'result': {
261 'type': 'form',
262 'arch': _transaction_discount_form,
263 'fields': _transaction_discount_fields,
264 'state': [('end', 'Cancel'), ('reconcile_discount', 'Reconcile')],
265 }
266 },
267 'reconcile': {
268 'actions': [_trans_rec_reconcile],
269 'result': {
270 'type': 'state',
271 'state': 'end',
272 }
273 },
274 'reconcile_discount': {
275 'actions': [_trans_rec_reconcile_discount],
276 'result': {
277 'type': 'state',
278 'state': 'end',
279 }
280 },
281 'partial': {
282 'actions': [_trans_rec_reconcile_partial],
283 'result': {
284 'type': 'state',
285 'state': 'end',
286 }
287 }
288 }
289wiz_reconcile('account.move.line.discount.reconcile')
290
291# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0292
=== added file 'account_invoice_cash_discount/wizard/wizard_write_period_entry_calculation.py'
--- account_invoice_cash_discount/wizard/wizard_write_period_entry_calculation.py 1970-01-01 00:00:00 +0000
+++ account_invoice_cash_discount/wizard/wizard_write_period_entry_calculation.py 2011-07-29 01:35:58 +0000
@@ -0,0 +1,188 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2009 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6# $Id$
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23import wizard
24import pooler
25import time
26from datetime import datetime
27from dateutil.relativedelta import relativedelta
28from mx import DateTime
29from tools.translate import _
30
31_writeoff_entry_calculation_form = '''<?xml version="1.0"?>
32<form string="Calculation">
33 <separator string="Calculation of period-wise Write-Off Amount" colspan="4"/>
34 <field name="cash_discount_id"/>
35 <field name="tax_id"/>
36 <field name="period_id"/>
37 <field name="journal_id"/>
38</form>'''
39
40_writeoff_entry_calculation_fields = {
41 'cash_discount_id': {
42 'string': 'Cash Discount Account',
43 'type': 'many2one',
44 'relation': 'account.account',
45 'required': True,
46 },
47 'tax_id': {
48 'string': 'Taxes',
49 'type': 'many2one',
50 'relation': 'account.tax',
51 'required': True,
52 },
53 'period_id': {
54 'string': 'Period',
55 'type': 'many2one',
56 'relation': 'account.period',
57 'required': True,
58 },
59 'journal_id': {
60 'string': 'Journal',
61 'type': 'many2one',
62 'relation': 'account.journal',
63 'required': True,
64 },
65}
66
67def _compute(self, cr, uid, data, context):
68
69 pool = pooler.get_pool(cr.dbname)
70 invoice_obj = pool.get('account.invoice')
71 account_move_obj= pool.get('account.move')
72 account_move_line_obj = pool.get('account.move.line')
73 payment_term_obj = pool.get('account.payment.term')
74 tax_obj = pool.get('account.tax')
75
76 period_id = data['form']['period_id']
77 tax_id = data['form']['tax_id']
78 journal_id = data['form']['journal_id']
79 cash_discount_id = data['form']['cash_discount_id']
80
81 account_move_line_ids = account_move_line_obj.search(cr, uid, [('period_id', '=', period_id), ('account_id', '=', cash_discount_id)])
82 date = time.strftime('%Y-%m-%d')
83
84 discount_lines = []
85
86 tax_account_id = dis_tax_code_id = discount_code_id = False
87
88 for line in account_move_line_obj.browse(cr, uid, account_move_line_ids, context=context):
89 tax_discount_amt = 0.0
90 tax_discount_data = tax_obj.browse(cr, uid, tax_id, context=context)
91 tax_account_id = tax_discount_data.account_collected_id and tax_discount_data.account_collected_id.id or tax_discount_data.tax_code_id.id
92 discount_code_id = tax_discount_data.base_code_id.id
93 dis_tax_code_id = tax_discount_data.tax_code_id.id
94
95 if line.debit > 0.0:
96 tax_discount_amt = 0.0
97 tax_discount_amt = line.debit * tax_discount_data.amount
98
99 discount_lines.append(
100 (0, 0, {
101 'name': line.name,
102 'debit': 0.0,
103 'credit': tax_discount_amt,
104 'account_id': cash_discount_id,
105 'date': date,
106 'partner_id': line.partner_id.id,
107 'tax_amount': -tax_discount_amt,
108 'tax_code_id': discount_code_id,
109 })),
110 discount_lines.append(
111 (0, 0, {
112 'name': line.name,
113 'debit': tax_discount_amt,
114 'credit': 0.0,
115 'account_id': tax_account_id,
116 'date': date,
117 'partner_id': line.partner_id.id,
118 'tax_amount': -tax_discount_amt,
119 'tax_code_id': dis_tax_code_id,
120 }))
121 elif line.credit > 0.0:
122 tax_discount_amt = 0.0
123 tax_discount_amt = line.credit * tax_discount_data.amount
124
125 discount_lines.append(
126 (0, 0, {
127 'name': line.name,
128 'debit': 0.0,
129 'credit': tax_discount_amt,
130 'account_id': tax_account_id,
131 'date': date,
132 'partner_id': line.partner_id.id,
133 'tax_amount': -tax_discount_amt,
134 'tax_code_id': dis_tax_code_id,
135 }))
136 discount_lines.append(
137 (0, 0, {
138 'name': line.name,
139 'debit': tax_discount_amt,
140 'credit': 0.0,
141 'account_id': cash_discount_id,
142 'date': date,
143 'partner_id': line.partner_id.id,
144 'tax_amount': -tax_discount_amt,
145 'tax_code_id': discount_code_id,
146 })),
147
148 discount_move_line = account_move_obj.create(cr, uid,
149 {
150 'period_id': period_id,
151 'journal_id': journal_id,
152 'date': date,
153 'line_id': discount_lines,
154 })
155
156 return {
157 'domain': [('id', '=', discount_move_line)],
158 'name': _('Computed Entries'),
159 'view_type': 'form',
160 'view_mode': 'tree,form',
161 'view_id': False,
162 'res_model': 'account.move',
163 'type': 'ir.actions.act_window',
164 }
165
166class wiz_period_writeoff_calculation(wizard.interface):
167 states = {
168 'init': {
169 'actions': [],
170 'result': {
171 'type': 'form',
172 'arch': _writeoff_entry_calculation_form,
173 'fields': _writeoff_entry_calculation_fields,
174 'state': [('calculate', 'Compute'), ('end', 'Cancel')],
175 }
176 },
177 'calculate': {
178 'actions': [],
179 'result': {
180 'type': 'action',
181 'action': _compute,
182 'state': 'end',
183 }
184 }
185 }
186wiz_period_writeoff_calculation('account_period_write_calculation')
187
188# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
0189
=== added directory 'account_payment_discount_extension'
=== added file 'account_payment_discount_extension/__init__.py'
--- account_payment_discount_extension/__init__.py 1970-01-01 00:00:00 +0000
+++ account_payment_discount_extension/__init__.py 2011-07-29 01:35:58 +0000
@@ -0,0 +1,24 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6# $Id$
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23import account_payment_discount
24import wizard
0\ No newline at end of file25\ No newline at end of file
126
=== added file 'account_payment_discount_extension/__terp__.py'
--- account_payment_discount_extension/__terp__.py 1970-01-01 00:00:00 +0000
+++ account_payment_discount_extension/__terp__.py 2011-07-29 01:35:58 +0000
@@ -0,0 +1,44 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6# $Id$
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23{
24 "name" : "Account Payment Discount Extension",
25 "version" : "1.1",
26 "author" : "Big Consulting",
27 "website" : "http://www.openbig.org",
28 "category" : "Generic Modules/Accounting",
29 "license" : "GPL-3",
30 "depends" : ["base","account_payment_extension",],
31 "init_xml" : [
32 ],
33 "demo_xml" : [
34 ],
35 "update_xml" : [
36 "account_payment_disocunt_wizard.xml",
37 "account_payment_discount_view.xml",
38 "account_payment_discount_data.xml",
39 ],
40 "active": False,
41 "installable": True,
42 'certificate': '001057921598129524157',
43}
44
045
=== added file 'account_payment_discount_extension/account_payment_discount.py'
--- account_payment_discount_extension/account_payment_discount.py 1970-01-01 00:00:00 +0000
+++ account_payment_discount_extension/account_payment_discount.py 2011-07-29 01:35:58 +0000
@@ -0,0 +1,115 @@
1# -*- encoding: utf-8 -*-
2##############################################################################
3#
4# OpenERP, Open Source Management Solution
5# Copyright (C) 2004-2008 Tiny SPRL (<http://tiny.be>). All Rights Reserved
6# $Id$
7#
8# This program is free software: you can redistribute it and/or modify
9# it under the terms of the GNU General Public License as published by
10# the Free Software Foundation, either version 3 of the License, or
11# (at your option) any later version.
12#
13# This program is distributed in the hope that it will be useful,
14# but WITHOUT ANY WARRANTY; without even the implied warranty of
15# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16# GNU General Public License for more details.
17#
18# You should have received a copy of the GNU General Public License
19# along with this program. If not, see <http://www.gnu.org/licenses/>.
20#
21##############################################################################
22
23import netsvc
24from osv import fields, osv
25import time
26from mx import DateTime
27
28class payment_order(osv.osv):
29 _inherit='payment.order'
30 _columns={
31 'inter_bank_journal': fields.many2one('account.journal', 'Intermediate Bank Journal', required=False),
32 }
33payment_order()
34
35class account_invoice(osv.osv):
36 _inherit='account.invoice'
37 _columns={
38 'next_payment_date': fields.date('Next Payment Date', states={'open': [('readonly', True)], 'close': [('readonly', True)]},),
39 }
40
41 def action_date_assign(self, cr, uid, ids, *args):
42 data = super(account_invoice, self).action_date_assign(cr, uid, ids, *args)
43 for inv in self.browse(cr, uid, ids):
44 if inv.payment_term.id:
45 payment_data = self.pool.get('account.payment.term').browse(cr, uid, inv.payment_term.id).cash_discount_ids
46 if payment_data:
47 delay = payment_data[0].delay
48 if inv.date_invoice:
49 date_invoice = inv.date_invoice
50 else:
51 date_invoice = time.strftime('%Y-%m-%d')
52 self.write(cr, uid, [inv.id], {'next_payment_date': (DateTime.strptime(date_invoice, '%Y-%m-%d') + DateTime.RelativeDateTime(days = delay)).strftime('%Y-%m-%d')})
53 return data
54
55 def _next_date(self, cr, uid, ids, context=None):
56 payment_term_obj = self.pool.get('account.payment.term')
57 current_date = time.strftime('%Y-%m-%d')
58 ids = self.search(cr, uid, [('state', '=', 'open')])
59 for id in ids:
60 invoice_data = self.browse(cr, uid, id, context=context)
61 next_pay_date = invoice_data.next_payment_date
62 if invoice_data.payment_term:
63 payment_data = payment_term_obj.browse(cr, uid, invoice_data.payment_term.id)
64 if next_pay_date:
65 if next_pay_date < current_date:
66 for dis_line in payment_data.cash_discount_ids:
67 discount_date = (DateTime.strptime(invoice_data.date_invoice, '%Y-%m-%d') + DateTime.RelativeDateTime(days=dis_line.delay)).strftime('%Y-%m-%d')
68 if discount_date > current_date:
69 self.write(cr, uid, [id], {'next_payment_date': discount_date})
70 break
71 return True
72
73 def check_next_date(self, cr, uid, ids=[], context=None):
74 self._next_date(cr, uid, ids, context=context)
75
76 def copy(self, cr, uid, id, default=None, context=None):
77 if default is None:
78 default = {}
79 default = default.copy()
80 default.update({'next_payment_date': False})
81 return super(account_invoice, self).copy(cr, uid, id, default, context)
82
83account_invoice()
84
85class payment_line(osv.osv):
86 _name = 'payment.line'
87 _inherit = 'payment.line'
88 _columns = {
89 'cash_discount': fields.float('Cash Discount'),
90 'discount_date': fields.date('Discount Date'),
91 'pay_amount': fields.float('Pay Amount'),
92 }
93payment_line()
94
95class res_partner(osv.osv):
96 _inherit = 'res.partner'
97 _columns = {
98 'property_customer_cash_discount_account': fields.property(
99 'account.account',
100 type = 'many2one',
101 relation = 'account.account',
102 string = "Customer Cash Discount Account",
103 method = True,
104 view_load = True,
105 required = True),
106 'property_supplier_cash_discount_account': fields.property(
107 'account.account',
108 type = 'many2one',
109 relation = 'account.account',
110 string = "Supplier Cash Discount Account",
111 method = True,
112 view_load = True,
113 required = True),
114 }
115res_partner()
0116
=== added file 'account_payment_discount_extension/account_payment_discount_data.xml'
--- account_payment_discount_extension/account_payment_discount_data.xml 1970-01-01 00:00:00 +0000
+++ account_payment_discount_extension/account_payment_discount_data.xml 2011-07-29 01:35:58 +0000
@@ -0,0 +1,15 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data noupdate="1">
4 <record forcecreate="True" id="ir_cron_discount_action" model="ir.cron">
5 <field name="name">Next Payment Date</field>
6 <field name="interval_number">1</field>
7 <field name="interval_type">days</field>
8 <field name="numbercall">-1</field>
9 <field eval="False" name="doall"/>
10 <field eval="'account.invoice'" name="model"/>
11 <field eval="'check_next_date'" name="function"/>
12 <field eval="'(False,)'" name="args"/>
13 </record>
14 </data>
15</openerp>
016
=== added file 'account_payment_discount_extension/account_payment_discount_view.xml'
--- account_payment_discount_extension/account_payment_discount_view.xml 1970-01-01 00:00:00 +0000
+++ account_payment_discount_extension/account_payment_discount_view.xml 2011-07-29 01:35:58 +0000
@@ -0,0 +1,138 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4 <record model="ir.ui.view" id="invoice_customer_form_inherit11">
5 <field name="name">account.invoice.customer.form.inherit</field>
6 <field name="model">account.invoice</field>
7 <field name="type">form</field>
8 <field name="inherit_id" ref="account.invoice_form"/>
9 <field name="arch" type="xml">
10 <field name="date_due" position="after">
11 <field name="next_payment_date"/>
12 </field>
13 </field>
14 </record>
15
16 <record model="ir.ui.view" id="invoice_supplier_form_inherit11">
17 <field name="name">account.invoice.supplier.form.inherit</field>
18 <field name="model">account.invoice</field>
19 <field name="type">form</field>
20 <field name="inherit_id" ref="account.invoice_supplier_form"/>
21 <field name="priority">2</field>
22 <field name="arch" type="xml">
23 <field name="number" position="before">
24 <field name="next_payment_date"/>
25 </field>
26 </field>
27 </record>
28
29 <record id="view_payment_order_form_wizard_ext" model="ir.ui.view">
30 <field name="name">payment.order.form.ext11</field>
31 <field name="model">payment.order</field>
32 <field name="type">form</field>
33 <field name="inherit_id" ref="account_payment_extension.view_payment_order_form_ext1"/>
34 <field name="arch" type="xml">
35 <xpath expr="//button[@string='Select invoices to pay/receive payment']" position="replace">
36 <label string=""/>
37 <button name="%(wizard_populate_payment_discount_ext)d" string="Select invoices to pay/receive payment" type="action" attrs="{'invisible': [('state', '=', 'done')]}"/>
38 </xpath>
39 </field>
40 </record>
41
42 <record model="ir.ui.view" id="view_payment_order_form1">
43 <field name="name">payment.order.form1</field>
44 <field name="model">payment.order</field>
45 <field name="inherit_id" ref="account_payment.view_payment_order_form"/>
46 <field name="type">form</field>
47 <field name="arch" type="xml">
48 <xpath expr="//field[@name='partner_id']" position="before">
49 <field name="cash_discount"/>
50 <field name="discount_date"/>
51 <field name="pay_amount"/>
52 <label string=""/>
53 </xpath>
54 </field>
55 </record>
56
57 <record model="ir.ui.view" id="view_payment_order_tree1">
58 <field name="name">payment.order.form1</field>
59 <field name="model">payment.order</field>
60 <field name="inherit_id" ref="account_payment.view_payment_order_form"/>
61 <field name="type">tree</field>
62 <field name="arch" type="xml">
63 <xpath expr="//tree/field[@name='amount']" position="after">
64 <field name="cash_discount"/>
65 <field name="discount_date"/>
66 <field name="pay_amount"/>
67 </xpath>
68 </field>
69 </record>
70
71 <record model="ir.ui.view" id="view_payment_order_bank_form1">
72 <field name="name">payment.order.form1</field>
73 <field name="model">payment.order</field>
74 <field name="inherit_id" ref="account_payment.view_payment_order_form"/>
75 <field name="type">form</field>
76 <field name="arch" type="xml">
77 <field name="user_id" position="after">
78 <field name="inter_bank_journal" required="True"/>
79 </field>
80 </field>
81 </record>
82
83 <record id="view_payment_order_wizard_form" model="ir.ui.view">
84 <field name="name">payment.order.form1</field>
85 <field name="model">payment.order</field>
86 <field name="type">form</field>
87 <field name="inherit_id" ref="account_payment.view_payment_order_form"/>
88 <field name="arch" type="xml">
89 <xpath expr="//button[@string='Make Payments']" position="replace">
90 <button name="%(wizard_pay_discount_payment)d" states="open" string="Make Payments" type="action" />
91 </xpath>
92 </field>
93 </record>
94
95 <record id="view_partner_customer_discount_property_form" model="ir.ui.view">
96 <field name="name">res.partner.property.cus_discount.form.inherit</field>
97 <field name="model">res.partner</field>
98 <field name="type">form</field>
99 <field name="priority">2</field>
100 <field name="inherit_id" ref="account.view_partner_property_form"/>
101 <field name="arch" type="xml">
102 <field name="property_account_receivable" position="after">
103 <field name="property_customer_cash_discount_account"/>
104 </field>
105 </field>
106 </record>
107
108 <record id="view_partner_supplier_discount_property_form" model="ir.ui.view">
109 <field name="name">res.partner.property.sup_discount.form.inherit</field>
110 <field name="model">res.partner</field>
111 <field name="type">form</field>
112 <field name="priority">2</field>
113 <field name="inherit_id" ref="account.view_partner_property_form"/>
114 <field name="arch" type="xml">
115 <field name="property_account_payable" position="after">
116 <field name="property_supplier_cash_discount_account"/>
117 </field>
118 </field>
119 </record>
120
121 <!--**************************** Customer Invoice Refunds *******************************-->
122 <menuitem id="menu_customer_invoice_refund"
123 name="Customer Invoice Refunds"
124 parent="account_payment.menu_main"/>
125
126 <record id="action_menu_customer_invoice_refund" model="ir.actions.act_window">
127 <field name="name">Customer Invoice Refunds</field>
128 <field name="res_model">payment.order</field>
129 <field name="view_type">form</field>
130 <field name="view_mode">tree,form</field>
131 <field name="context">{'payment_type_customer': 'customer_refund'}</field>
132 <field name="domain">[('type', '=', 'payable')]</field>
133 </record>
134 <menuitem action="action_menu_customer_invoice_refund"
135 id="menu_action_menu_customer_invoice_refund"
136 parent="menu_customer_invoice_refund" />
137 </data>
138</openerp>
0139
=== added file 'account_payment_discount_extension/account_payment_disocunt_wizard.xml'
--- account_payment_discount_extension/account_payment_disocunt_wizard.xml 1970-01-01 00:00:00 +0000
+++ account_payment_discount_extension/account_payment_disocunt_wizard.xml 2011-07-29 01:35:58 +0000
@@ -0,0 +1,27 @@
1<?xml version="1.0" encoding="utf-8"?>
2<openerp>
3 <data>
4 <wizard id="wizard_populate_payment_discount_ext"
5 menu="False"
6 model="payment.order"
7 name="populate_payment_discount_ext"
8 string="Populate Payment to Pay"/>
9
10 <wizard id="wizard_pay_discount_payment"
11 menu="False"
12 model="payment.order"
13 name="pay_discount_payment"
14 string="Pay"/>
15
16 <wizard id="wizard_calculate_next_payment_date"
17 menu="True"
18 model="payment.order"
19 name="cal_next_payment_date"
20 string="Recompute Next Payment Date"/>
21
22 <menuitem action="wizard_calculate_next_payment_date"
23 id="menu_calculate_next_payment_date"
24 parent="account_payment.menu_main"
25 type="wizard"/>
26 </data>
27</openerp>
028
=== added directory 'account_payment_discount_extension/i18n'
=== added file 'account_payment_discount_extension/i18n/account_payment_discount_extension.pot'
--- account_payment_discount_extension/i18n/account_payment_discount_extension.pot 1970-01-01 00:00:00 +0000
+++ account_payment_discount_extension/i18n/account_payment_discount_extension.pot 2011-07-29 01:35:58 +0000
@@ -0,0 +1,176 @@
1# Translation of OpenERP Server.
2# This file contains the translation of the following modules:
3# * account_payment_discount_extension
4#
5msgid ""
6msgstr ""
7"Project-Id-Version: OpenERP Server 5.0.14\n"
8"Report-Msgid-Bugs-To: support@openerp.com\n"
9"POT-Creation-Date: 2010-10-08 10:04:15+0000\n"
10"PO-Revision-Date: 2010-10-08 10:04:15+0000\n"
11"Last-Translator: Thomas Dreiling <thomas.dreiling@global-distribution.de>\n"
The diff has been truncated for viewing.

Subscribers

People subscribed via source and target branches

to all changes: