diff --git a/setup/MANIFEST.in b/MANIFEST.in similarity index 100% rename from setup/MANIFEST.in rename to MANIFEST.in diff --git a/addons/calendar/__openerp__.py b/addons/calendar/__openerp__.py index 0cae2b6faf9..a75d8975e0d 100644 --- a/addons/calendar/__openerp__.py +++ b/addons/calendar/__openerp__.py @@ -43,7 +43,6 @@ If you need to manage your meetings, you should install the CRM module. 'security/ir.model.access.csv', 'security/calendar_security.xml', 'calendar_view.xml', - 'contacts_view.xml', 'calendar_data.xml', 'views/calendar.xml', ], diff --git a/addons/calendar/contacts_view.xml b/addons/calendar/contacts_view.xml deleted file mode 100644 index 1d014fea1f6..00000000000 --- a/addons/calendar/contacts_view.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - My Coworkers - calendar.contacts - - - - - - - - - Calendar Contacts - calendar.contacts - form - tree - [('user_id','=',uid)] - - -

- Click on "create" to select colleagues you want to see meetings. -

- Your colleagues will appear in the right list to see them in the calendar view. You will easily manage collaboration and meeting with them. -

-
-
- -
-
\ No newline at end of file diff --git a/addons/calendar/static/src/css/calendar.css b/addons/calendar/static/src/css/calendar.css index a22fa2344ad..7e43b37a317 100644 --- a/addons/calendar/static/src/css/calendar.css +++ b/addons/calendar/static/src/css/calendar.css @@ -72,3 +72,13 @@ span.no-wrap { .cal_tab { margin: 20 0 20 0; } +.openerp .oe_remove_follower { + cursor: pointer; + position: absolute; + right: 0px; + line-height: 20px; + color: #D3D3D3; +} +.openerp .oe_add_input_box > div > input{ + width: 200px; +} \ No newline at end of file diff --git a/addons/calendar/static/src/js/base_calendar.js b/addons/calendar/static/src/js/base_calendar.js index 37669840818..a4459157f2d 100644 --- a/addons/calendar/static/src/js/base_calendar.js +++ b/addons/calendar/static/src/js/base_calendar.js @@ -1,9 +1,136 @@ openerp.calendar = function(instance) { - var _t = instance.web._t; + var _t = instance.web._t, + _lt = instance.web._lt; var QWeb = instance.web.qweb; instance.calendar = {}; +function reload_favorite_list(result) { + var self = current = result; + if (result.view) { + self = result.view; + } + new instance.web.Model("res.users").query(["partner_id"]).filter([["id", "=",self.dataset.context.uid]]).first() + .done( + function(result) { + var sidebar_items = {}; + var filter_value = result.partner_id[0]; + var filter_item = { + value: filter_value, + label: result.partner_id[1] + _lt(" [Me]"), + color: self.get_color(filter_value), + avatar_model: self.avatar_model, + is_checked: true, + is_remove: false, + }; + + sidebar_items[0] = filter_item ; + filter_item = { + value: -1, + label: _lt("Everybody's calendars"), + color: self.get_color(-1), + avatar_model: self.avatar_model, + is_checked: false + }; + sidebar_items[-1] = filter_item ; + //Get my coworkers/contacts + new instance.web.Model("calendar.contacts").query(["partner_id"]).filter([["user_id", "=",self.dataset.context.uid]]).all().then(function(result) { + _.each(result, function(item) { + filter_value = item.partner_id[0]; + filter_item = { + value: filter_value, + label: item.partner_id[1], + color: self.get_color(filter_value), + avatar_model: self.avatar_model, + is_checked: true + }; + sidebar_items[filter_value] = filter_item ; + }); + self.all_filters = sidebar_items; + self.now_filter_ids = $.map(self.all_filters, function(o) { return o.value; }); + + self.sidebar.filter.events_loaded(self.all_filters); + self.sidebar.filter.set_filters(); + self.sidebar.filter.set_distroy_filters(); + self.sidebar.filter.addInputBox(); + self.sidebar.filter.destroy_filter(); + }).done(function () { + self.$calendar.fullCalendar('refetchEvents'); + if (current.ir_model_m2o) { + current.ir_model_m2o.set_value(false); + } + }); + }); + } + instance.web_calendar.CalendarView.include({ + extraSideBar: function(){ + this._super(); + if (this.useContacts){ + new reload_favorite_list(this); + } + } + }); + + instance.web_calendar.SidebarFilter.include({ + set_distroy_filters: function() { + var self = this; + // When mouse-enter the favorite list it will show the 'X' for removing partner from the favorite list. + if (self.view.useContacts){ + self.$('.oe_calendar_all_responsibles').on('mouseenter mouseleave', function(e) { + self.$('.oe_remove_follower').toggleClass('hidden', e.type == 'mouseleave'); + }); + } + }, + addInputBox: function() { + var self = this; + if (this.dfm) + return; + this.dfm = new instance.web.form.DefaultFieldManager(self); + this.dfm.extend_field_desc({ + partner_id: { + relation: "res.partner", + }, + }); + this.ir_model_m2o = new instance.web.form.FieldMany2One(self.dfm, { + attrs: { + class: 'oe_add_input_box', + name: "partner_id", + type: "many2one", + options: '{"no_open": True}', + placeholder: _t("Select Favorite Calendar"), + }, + }); + this.ir_model_m2o.insertAfter($('div.oe_calendar_filter')); + this.ir_model_m2o.on('change:value', self, function() { + self.add_filter(); + }); + }, + add_filter: function() { + var self = this; + new instance.web.Model("res.users").query(["partner_id"]).filter([["id", "=",this.view.dataset.context.uid]]).first().done(function(result){ + $.map(self.ir_model_m2o.display_value, function(element,index) { + if (result.partner_id[0] != index){ + self.ds_message = new instance.web.DataSetSearch(self, 'calendar.contacts'); + self.ds_message.call("create", [{'partner_id': index}]); + } + }); + }); + new reload_favorite_list(this); + }, + destroy_filter: function(e) { + var self= this; + this.$(".oe_remove_follower").on('click', function(e) { + self.ds_message = new instance.web.DataSetSearch(self, 'calendar.contacts'); + if (! confirm(_t("Do you really want to delete this filter from favorite?"))) { return false; } + var id = $(e.currentTarget)[0].dataset.id; + self.ds_message.call('search', [[['partner_id', '=', parseInt(id)]]]).then(function(record){ + return self.ds_message.unlink(record); + }).done(function() { + new reload_favorite_list(self); + }); + }); + }, + }); instance.web.WebClient = instance.web.WebClient.extend({ diff --git a/addons/calendar/static/src/xml/base_calendar.xml b/addons/calendar/static/src/xml/base_calendar.xml index 20da2cebf48..0939d65b609 100644 --- a/addons/calendar/static/src/xml/base_calendar.xml +++ b/addons/calendar/static/src/xml/base_calendar.xml @@ -73,4 +73,13 @@ + + + + + + + + + diff --git a/addons/crm/crm_lead.py b/addons/crm/crm_lead.py index 0e0b734f72d..305ad549c9f 100644 --- a/addons/crm/crm_lead.py +++ b/addons/crm/crm_lead.py @@ -935,8 +935,10 @@ class crm_lead(format_address, osv.osv): def message_get_reply_to(self, cr, uid, ids, context=None): """ Override to get the reply_to of the parent project. """ - return [lead.section_id.message_get_reply_to()[0] if lead.section_id else False - for lead in self.browse(cr, SUPERUSER_ID, ids, context=context)] + leads = self.browse(cr, SUPERUSER_ID, ids, context=context) + section_ids = set([lead.section_id.id for lead in leads if lead.section_id]) + aliases = self.pool['crm.case.section'].message_get_reply_to(cr, uid, list(section_ids), context=context) + return dict((lead.id, aliases.get(lead.section_id and lead.section_id.id or 0, False)) for lead in leads) def get_formview_id(self, cr, uid, id, context=None): obj = self.browse(cr, uid, id, context=context) diff --git a/addons/email_template/tests/test_mail.py b/addons/email_template/tests/test_mail.py index beda74d0853..f88d11ec71d 100644 --- a/addons/email_template/tests/test_mail.py +++ b/addons/email_template/tests/test_mail.py @@ -237,8 +237,8 @@ class test_message_compose(TestMail): email_template.send_mail(cr, uid, email_template_id, self.group_pigs_id, force_send=True, context=context) sent_emails = self._build_email_kwargs_list email_to_lst = [ - ['b@b.b', 'c@c.c'], ['Administrator '], - ['Raoul Grosbedon '], ['Bert Tartignole ']] + ['b@b.b', 'c@c.c'], ['"Administrator" '], + ['"Raoul Grosbedon" '], ['"Bert Tartignole" ']] self.assertEqual(len(sent_emails), 4, 'email_template: send_mail: 3 valid email recipients + email_to -> should send 4 emails') for email in sent_emails: self.assertIn(email['email_to'], email_to_lst, 'email_template: send_mail: wrong email_recipients') diff --git a/addons/hr_recruitment/hr_recruitment.py b/addons/hr_recruitment/hr_recruitment.py index 775b84756ce..e0c3abffaa0 100644 --- a/addons/hr_recruitment/hr_recruitment.py +++ b/addons/hr_recruitment/hr_recruitment.py @@ -20,6 +20,8 @@ ############################################################################## from datetime import datetime + +from openerp import SUPERUSER_ID from openerp.osv import fields, osv from openerp.tools.translate import _ @@ -357,6 +359,13 @@ class hr_applicant(osv.Model): action['domain'] = str(['&', ('res_model', '=', self._name), ('res_id', 'in', ids)]) return action + def message_get_reply_to(self, cr, uid, ids, context=None): + """ Override to get the reply_to of the parent project. """ + applicants = self.browse(cr, SUPERUSER_ID, ids, context=context) + job_ids = set([applicant.job_id.id for applicant in applicants if applicant.job_id]) + aliases = self.pool['project.project'].message_get_reply_to(cr, uid, list(job_ids), context=context) + return dict((applicant.id, aliases.get(applicant.job_id and applicant.job_id.id or 0, False)) for applicant in applicants) + def message_get_suggested_recipients(self, cr, uid, ids, context=None): recipients = super(hr_applicant, self).message_get_suggested_recipients(cr, uid, ids, context=context) for applicant in self.browse(cr, uid, ids, context=context): diff --git a/addons/l10n_es/tax_codes_common.xml b/addons/l10n_es/tax_codes_common.xml index da07f44a178..35209b954d2 100644 --- a/addons/l10n_es/tax_codes_common.xml +++ b/addons/l10n_es/tax_codes_common.xml @@ -279,25 +279,25 @@ - Base adquisiciones intracomunitarias bienes y servicios corrientes + Base adquisiciones intracomunitarias bienes y serv. corrientes [30] 1.0 - Base adquisiciones intracomunitarias bienes y servicios corrientes (4%) + Base adquisiciones intracomunitarias bienes y serv. corr. (4%) -- 1.0 - Base adquisiciones intracomunitarias bienes y servicios corrientes (10%) + Base adquisiciones intracomunitarias bienes y serv. corr. (10%) -- 1.0 - Base adquisiciones intracomunitarias bienes y servicios corrientes (21%) + Base adquisiciones intracomunitarias bienes y serv. corr. (21%) -- 1.0 @@ -427,19 +427,19 @@ 1.0 - Cuotas devengadas importaciones bienes y servicios corrientes (4%) + Cuotas devengadas importaciones bienes y serv. corr. (4%) -- 1.0 - Cuotas devengadas importaciones bienes y servicios corrientes (10%) + Cuotas devengadas importaciones bienes y serv. corr. (10%) -- 1.0 - Cuotas devengadas importaciones bienes y servicios corrientes (21%) + Cuotas devengadas importaciones bienes y serv. corr. (21%) -- 1.0 @@ -478,19 +478,19 @@ 1.0 - En adquisiciones intracomunitarias bienes y servicios corrientes (4%) + En adquisiciones intracomunitarias bienes y serv. corr. (4%) -- 1.0 - En adquisiciones intracomunitarias bienes y servicios corrientes (10%) + En adquisiciones intracomunitarias bienes y serv. corr. (10%) -- 1.0 - En adquisiciones intracomunitarias bienes y servicios corrientes (21%) + En adquisiciones intracomunitarias bienes y serv. corr. (21%) -- 1.0 @@ -772,4 +772,4 @@ - \ No newline at end of file + diff --git a/addons/l10n_hu/__init__.py b/addons/l10n_hu/__init__.py new file mode 100644 index 00000000000..37f246eb2f7 --- /dev/null +++ b/addons/l10n_hu/__init__.py @@ -0,0 +1,20 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2014 InnOpen Group Kft (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + diff --git a/addons/l10n_hu/__openerp__.py b/addons/l10n_hu/__openerp__.py new file mode 100644 index 00000000000..8e2fcb0cfc0 --- /dev/null +++ b/addons/l10n_hu/__openerp__.py @@ -0,0 +1,54 @@ +# -*- encoding: utf-8 -*- +############################################################################## +# +# Copyright (C) 2014 InnOpen Group Kft (). +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as +# published by the Free Software Foundation, either version 3 of the +# License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +# +############################################################################## + + +{ + 'name': 'Hungarian - Accounting', + 'version': '1.0', + 'category': 'Localization/Account Charts', + 'description': """ + +Base module for Hungarian localization +========================================== + +This module consists : + + - Generic Hungarian chart of accounts + - Hungarian taxes + - Hungarian Bank information + + """, + 'author': 'InnOpen Group Kft', + 'website': 'http://www.innopen.eu', + 'license': 'AGPL-3', + 'depends': ['account','account_chart'], + 'data': [ + 'data/account.account.template.csv', + 'data/account.tax.code.template.csv', + 'data/account.chart.template.csv', + 'data/account.tax.template.csv', + 'data/account.fiscal.position.template.csv', + 'data/account.fiscal.position.tax.template.csv', + 'data/res.bank.csv', + ], + 'installable': True, + 'auto_install': False, + 'application':True, +} diff --git a/addons/l10n_hu/data/account.account.template.csv b/addons/l10n_hu/data/account.account.template.csv new file mode 100644 index 00000000000..37cf2e1ae5e --- /dev/null +++ b/addons/l10n_hu/data/account.account.template.csv @@ -0,0 +1,277 @@ +"id","code","name","parent_id/id","user_type/id","type","reconcile" +"chart_hu_0",0,"Magyar főkönyvi kivonat",,"account.data_account_type_view","view","FALSE" +"chart_hu_1_4","1-4","Mérleg számlák","chart_hu_0","account.data_account_type_view","view","FALSE" +"chart_hu_1",1,"BEFEKTETETT ESZKÖZÖK","chart_hu_1_4","account.account_type_asset_view1","view","FALSE" +"chart_hu_11",11,"IMMATERIÁLIS JAVAK","chart_hu_1","account.account_type_asset_view1","view","FALSE" +"chart_hu_111",111,"Alapítás-átszervezés aktívált értéke","chart_hu_11","account.data_account_type_asset","other","FALSE" +"chart_hu_112",112,"Kísérleti fejlesztés aktívált értéke","chart_hu_11","account.data_account_type_asset","other","FALSE" +"chart_hu_113",113,"Vagyoni értékû jogok","chart_hu_11","account.data_account_type_asset","other","FALSE" +"chart_hu_114",114,"Szellemi termékek","chart_hu_11","account.data_account_type_asset","other","FALSE" +"chart_hu_115",115,"Üzleti vagy cégérték","chart_hu_11","account.data_account_type_asset","other","FALSE" +"chart_hu_117",117,"Immateriális javak értékhelyesbítése","chart_hu_11","account.data_account_type_asset","other","FALSE" +"chart_hu_12",12,"INGATLANOK, KAPCS. VAGYONI ÉRT. JOGOK","chart_hu_1","account.account_type_asset_view1","view","FALSE" +"chart_hu_121",121,"Földterület","chart_hu_12","account.data_account_type_asset","other","FALSE" +"chart_hu_122",122,"Telek, telkesítés","chart_hu_12","account.data_account_type_asset","other","FALSE" +"chart_hu_123",123,"Épületek,épületrészek,tulajdoni hányadok","chart_hu_12","account.data_account_type_asset","other","FALSE" +"chart_hu_124",124,"Egyéb építmények","chart_hu_12","account.data_account_type_asset","other","FALSE" +"chart_hu_125",125,"Üzemkörön kivüli ingatlanok, épületek","chart_hu_12","account.data_account_type_asset","other","FALSE" +"chart_hu_126",126,"Ingatlanhoz kapcs. vagyoni ért. jogok","chart_hu_12","account.data_account_type_asset","other","FALSE" +"chart_hu_127",127,"Ingatlanok értékhelyesbítése","chart_hu_12","account.data_account_type_asset","other","FALSE" +"chart_hu_13",13,"MÜSZAKI BERENDEZÉSEK, GÉPEK, JÁRMÜVEK","chart_hu_1","account.account_type_asset_view1","view","FALSE" +"chart_hu_131",131,"Termelõ gépek, berendezések, gyártóeszk.","chart_hu_13","account.data_account_type_asset","other","FALSE" +"chart_hu_132",132,"Termelésben résztvevõ jármûvek","chart_hu_13","account.data_account_type_asset","other","FALSE" +"chart_hu_137",137,"Müszaki gépek,felsz,járm. értékhelyesb.","chart_hu_13","account.data_account_type_asset","other","FALSE" +"chart_hu_14",14,"EGYÉB BERENDEZÉSEK, FELSZ., JÁRMÜVEK","chart_hu_1","account.account_type_asset_view1","view","FALSE" +"chart_hu_141",141,"Üzemi berendezések, gépek,felszerelések","chart_hu_14","account.data_account_type_asset","other","FALSE" +"chart_hu_142",142,"Egyéb jármûvek","chart_hu_14","account.data_account_type_asset","other","FALSE" +"chart_hu_143",143,"Irodai, igazgatási berendezések","chart_hu_14","account.data_account_type_asset","other","FALSE" +"chart_hu_144",144,"Üzemkörön kivüli berendezések, felsz.","chart_hu_14","account.data_account_type_asset","other","FALSE" +"chart_hu_147",147,"Egyéb gépek,felsz,járm. értékhelyesbítés","chart_hu_14","account.data_account_type_asset","other","FALSE" +"chart_hu_15",15,"TENYÉSZÁLLATOK","chart_hu_1","account.account_type_asset_view1","view","FALSE" +"chart_hu_151",151,"Tenyészállatok","chart_hu_15","account.data_account_type_asset","other","FALSE" +"chart_hu_16",16,"BERUHÁZÁSOK, FELúJÍTÁSOK","chart_hu_1","account.account_type_asset_view1","view","FALSE" +"chart_hu_161",161,"Befejezetlen beruházások","chart_hu_16","account.data_account_type_asset","other","FALSE" +"chart_hu_162",162,"Felújítások","chart_hu_16","account.data_account_type_asset","other","FALSE" +"chart_hu_168",168,"Beruházások terven felüli értékcsökk.","chart_hu_16","account.data_account_type_asset","other","FALSE" +"chart_hu_17",17,"BEFEKTETETT Pü.I ESZKÖZÖK RÉSZESEDÉSEK","chart_hu_1","account.account_type_asset_view1","view","FALSE" +"chart_hu_171",171,"Tartós részesedés kapcs. vállalkozásban","chart_hu_17","account.data_account_type_asset","other","FALSE" +"chart_hu_172",172,"Egyéb tartós részesedés","chart_hu_17","account.data_account_type_asset","other","FALSE" +"chart_hu_177",177,"Részesedések értékhelyesbítése","chart_hu_17","account.data_account_type_asset","other","FALSE" +"chart_hu_179",179,"Részesedések értékvesztése, visszaírása","chart_hu_17","account.data_account_type_asset","other","FALSE" +"chart_hu_18",18,"HITELVISZONYT MEGTESTESÍTÖ ÉRTÉKPAPÍROK","chart_hu_1","account.account_type_asset_view1","view","FALSE" +"chart_hu_181",181,"Államkötvények","chart_hu_18","account.data_account_type_asset","other","FALSE" +"chart_hu_182",182,"Kapcsolt vállalkozások értékpapírjai","chart_hu_18","account.data_account_type_asset","other","FALSE" +"chart_hu_183",183,"Egyéb vállalkozások értékpapírjai","chart_hu_18","account.data_account_type_asset","other","FALSE" +"chart_hu_184",184,"Tartós diszkont értékpapírok","chart_hu_18","account.data_account_type_asset","other","FALSE" +"chart_hu_189",189,"Értékpapírok értékvesztése, visszaírása","chart_hu_18","account.data_account_type_asset","other","FALSE" +"chart_hu_19",19,"TARTÓSAN ADOTT KÖLCSÖNÖK","chart_hu_1","account.account_type_asset_view1","view","FALSE" +"chart_hu_191",191,"Tartósan adott kölcsönök kapcs. váll.","chart_hu_19","account.data_account_type_asset","other","FALSE" +"chart_hu_192",192,"Tartósan adott kölcsön egyéb rész.váll.","chart_hu_19","account.data_account_type_asset","other","FALSE" +"chart_hu_193",193,"Egyéb tartósan adott kölcsönök","chart_hu_19","account.data_account_type_asset","other","FALSE" +"chart_hu_195",195,"Tartós bankbetétek kapcs. váll.-ban","chart_hu_19","account.data_account_type_asset","other","FALSE" +"chart_hu_196",196,"Tartós bankbetétek egyéb rész. váll.-ban","chart_hu_19","account.data_account_type_asset","other","FALSE" +"chart_hu_197",197,"Egyéb tartós bankbetétek","chart_hu_19","account.data_account_type_asset","other","FALSE" +"chart_hu_198",198,"Pénzügyi lízing miatti tartós követelés","chart_hu_19","account.data_account_type_asset","other","FALSE" +"chart_hu_199",199,"Tartósan adott kölcsönök értékvesztése","chart_hu_19","account.data_account_type_asset","other","FALSE" +"chart_hu_2",2,"KÉSZLETEK","chart_hu_1_4","account.account_type_asset_view1","view","FALSE" +"chart_hu_21",21,"ANYAGOK","chart_hu_2","account.account_type_asset_view1","view","FALSE" +"chart_hu_211",211,"Nyers- és alapanyagok","chart_hu_21","account.data_account_type_asset","other","FALSE" +"chart_hu_22",22,"ANYAGOK","chart_hu_2","account.account_type_asset_view1","view","FALSE" +"chart_hu_221",221,"Segédanyagok","chart_hu_22","account.data_account_type_asset","other","FALSE" +"chart_hu_23",23,"BEFEJEZETLEN TERMELÉS ÉS FÉLKÉSZTERMÉKEK","chart_hu_2","account.account_type_asset_view1","view","FALSE" +"chart_hu_231",231,"Befejezetlen termelés","chart_hu_23","account.data_account_type_asset","other","FALSE" +"chart_hu_25",25,"KÉSZTERMÉKEK","chart_hu_2","account.account_type_asset_view1","view","FALSE" +"chart_hu_251",251,"Késztermékek","chart_hu_25","account.data_account_type_asset","other","FALSE" +"chart_hu_26",26,"ÁRUK","chart_hu_2","account.account_type_asset_view1","view","FALSE" +"chart_hu_261",261,"Áruk beszerzési áron","chart_hu_26","account.data_account_type_asset","other","FALSE" +"chart_hu_27",27,"KÖZVETÍTETT SZOLGÁLTATÁSOK","chart_hu_2","account.account_type_asset_view1","view","FALSE" +"chart_hu_271",271,"Közvetített szolgáltatások","chart_hu_27","account.data_account_type_asset","other","FALSE" +"chart_hu_28",28,"BETÉTDÍJAS GÖNGYÖLEGEK","chart_hu_2","account.account_type_asset_view1","view","FALSE" +"chart_hu_281",281,"Betétdíjas göngyölegek","chart_hu_28","account.data_account_type_asset","other","FALSE" +"chart_hu_3",3,"KÖVETELÉSEK,PÉNZÜGYI ESZK,AKTÍV IDÖB.ELH","chart_hu_1_4","account.account_type_asset_view1","view","FALSE" +"chart_hu_31",31,"KÖVETELÉSEK ÁRUSZÁLL.- SZOLGÁLTATÁSBÓL","chart_hu_3","account.account_type_asset_view1","view","FALSE" +"chart_hu_311",311,"Belföldi követelések","chart_hu_31","account.data_account_type_receivable","receivable","TRUE" +"chart_hu_316",316,"Külföldi követelések","chart_hu_31","account.data_account_type_receivable","receivable","TRUE" +"chart_hu_35",35,"ADOTT ELÖLEGEK","chart_hu_3","account.account_type_asset_view1","view","FALSE" +"chart_hu_351",351,"Adott elõlegek","chart_hu_35","account.data_account_type_asset","other","FALSE" +"chart_hu_36",36,"EGYÉB KÖVETELÉSEK","chart_hu_3","account.account_type_asset_view1","view","FALSE" +"chart_hu_361",361,"Munkavállalókkal szembeni követelés","chart_hu_36","account.data_account_type_asset","other","FALSE" +"chart_hu_368",368,"Különféle egyéb követelések","chart_hu_36","account.data_account_type_asset","other","FALSE" +"chart_hu_37",37,"ÉRTÉKPAPÍROK","chart_hu_3","account.account_type_asset_view1","view","FALSE" +"chart_hu_371",371,"Részesedés kapcsolt vállalkozásban","chart_hu_37","account.data_account_type_asset","other","FALSE" +"chart_hu_372",372,"Egyéb részesedés","chart_hu_37","account.data_account_type_asset","other","FALSE" +"chart_hu_373",373,"Saját részvények, saját üzletrészek","chart_hu_37","account.data_account_type_asset","other","FALSE" +"chart_hu_374",374,"Forgatási célú hitelv. m. értékpapírok","chart_hu_37","account.data_account_type_asset","other","FALSE" +"chart_hu_38",38,"PÉNZESZKÖZÖK","chart_hu_3","account.account_type_asset_view1","view","FALSE" +"chart_hu_381",381,"Pénztárak","chart_hu_38","account.account_type_asset_view1","view","FALSE" +"chart_hu_3811",3811,"Pénztár","chart_hu_381","account.data_account_type_cash","Liquidity","FALSE" +"chart_hu_382",382,"Valuta pénztár","chart_hu_38","account.data_account_type_cash","other","FALSE" +"chart_hu_384",384,"Elszámolási betétszámla","chart_hu_38","account.account_type_asset_view1","view","FALSE" +"chart_hu_3841",3841,"Bankszámla","chart_hu_384","account.data_account_type_bank","Liquidity","FALSE" +"chart_hu_385",385,"Elkülönített betétszámlák","chart_hu_38","account.data_account_type_bank","other","FALSE" +"chart_hu_386",386,"Deviza betétszámla","chart_hu_38","account.data_account_type_bank","other","FALSE" +"chart_hu_387",387,"Pénzhelyettesítõ eszk. (utalvány, jegy)","chart_hu_38","account.data_account_type_bank","other","FALSE" +"chart_hu_389",389,"Átvezetési számla","chart_hu_38","account.data_account_type_bank","other","FALSE" +"chart_hu_39",39,"AKTÍV IDÖBELI ELHATÁROLÁS","chart_hu_3","account.account_type_asset_view1","view","FALSE" +"chart_hu_391",391,"Aktív idõbeli elhatárolása","chart_hu_39","account.data_account_type_asset","other","FALSE" +"chart_hu_4",4,"FORRÁSOK (PASSZÍVÁK)","chart_hu_1_4","account.account_type_liability_view1","view","FALSE" +"chart_hu_41",41,"SAJÁT TÖKE","chart_hu_4","account.account_type_liability_view1","view","FALSE" +"chart_hu_411",411,"Jegyzett tõke","chart_hu_41","account.data_account_type_liability","other","FALSE" +"chart_hu_412",412,"Tõketartalék","chart_hu_41","account.data_account_type_liability","other","FALSE" +"chart_hu_413",413,"Eredménytartalék","chart_hu_41","account.data_account_type_liability","other","FALSE" +"chart_hu_414",414,"Lekötött tartalék","chart_hu_41","account.data_account_type_liability","other","FALSE" +"chart_hu_417",417,"Értékelési tartalék","chart_hu_41","account.data_account_type_liability","other","FALSE" +"chart_hu_419",419,"Mérleg szerinti eredmény","chart_hu_41","account.data_account_type_liability","other","FALSE" +"chart_hu_42",42,"CÉLTARTALÉKOK","chart_hu_4","account.account_type_liability_view1","view","FALSE" +"chart_hu_421",421,"Céltartalék várható kötelezettségre","chart_hu_42","account.data_account_type_liability","other","FALSE" +"chart_hu_43",43,"HÁTRASOROLT KÖTELEZETTSÉGEK","chart_hu_4","account.account_type_liability_view1","view","FALSE" +"chart_hu_431",431,"Hátrasorolt kötelezettség","chart_hu_43","account.data_account_type_liability","other","FALSE" +"chart_hu_44",44,"HOSSZÚ LEJÁRATÚ KÖTELEZETTSÉGEK","chart_hu_4","account.account_type_liability_view1","view","FALSE" +"chart_hu_441",441,"Hosszú lejáratra kapott kölcsönök","chart_hu_44","account.data_account_type_liability","other","FALSE" +"chart_hu_442",442,"Átváltoztatható kötvények","chart_hu_44","account.data_account_type_liability","other","FALSE" +"chart_hu_443",443,"Tartozások kötvénykibocsátásból","chart_hu_44","account.data_account_type_liability","other","FALSE" +"chart_hu_444",444,"Beruházási és fejlesztési hitelek","chart_hu_44","account.data_account_type_liability","other","FALSE" +"chart_hu_445",445,"Egyéb hosszú lejáratú hitelek","chart_hu_44","account.data_account_type_liability","other","FALSE" +"chart_hu_446",446,"Tartós köt. kapcs. vállalkozással sz.","chart_hu_44","account.data_account_type_liability","other","FALSE" +"chart_hu_447",447,"Tartós köt. egyéb rész. váll. szemben","chart_hu_44","account.data_account_type_liability","other","FALSE" +"chart_hu_448",448,"Pénzügyi lízinggel kapcsolatos kötelez.","chart_hu_44","account.data_account_type_liability","other","FALSE" +"chart_hu_449",449,"Egyéb hosszú lej. kötelezettségek","chart_hu_44","account.data_account_type_liability","other","FALSE" +"chart_hu_45",45,"RÖVID LEJÁRATú KÖTELEZETTSÉGEK","chart_hu_4","account.account_type_liability_view1","view","FALSE" +"chart_hu_451",451,"Rövid lejáratú kölcsönök","chart_hu_45","account.data_account_type_liability","other","FALSE" +"chart_hu_452",452,"Rövid lejáratú hitelek","chart_hu_45","account.data_account_type_liability","other","FALSE" +"chart_hu_453",453,"Vevõktõl kapott elõlegek","chart_hu_45","account.data_account_type_liability","other","FALSE" +"chart_hu_454",454,"Szállítók","chart_hu_45","account.account_type_liability_view1","view","FALSE" +"chart_hu_4541",4541,"Belföldi szállítók","chart_hu_454","account.data_account_type_payable","payable","TRUE" +"chart_hu_4542",4542,"Külföldi szállítók","chart_hu_454","account.data_account_type_payable","payable","TRUE" +"chart_hu_46",46,"EGYÉB RÖVID LEJÁRATú KÖTELEZETTSÉGEK","chart_hu_4","account.account_type_liability_view1","view","FALSE" +"chart_hu_461",461,"Társasági adó és osztalékadó elszámolás","chart_hu_46","account.data_account_type_liability","other","FALSE" +"chart_hu_462",462,"Személyi jövedelemadó elszámolása","chart_hu_46","account.data_account_type_liability","other","FALSE" +"chart_hu_463",463,"Költségvetési befizetési kötelezettségek","chart_hu_46","account.data_account_type_liability","other","FALSE" +"chart_hu_464",464,"Költségvetési befizetési köt.teljesítése","chart_hu_46","account.data_account_type_liability","other","FALSE" +"chart_hu_465",465,"Vám- és Pénzügyõrség elszámolási számla","chart_hu_46","account.data_account_type_liability","other","FALSE" +"chart_hu_466",466,"Elõzetesen felszámított ált.forgalmi adó","chart_hu_46","account.data_account_type_liability","other","FALSE" +"chart_hu_467",467,"Fizetendõ általános forgalmi adó","chart_hu_46","account.data_account_type_liability","other","FALSE" +"chart_hu_468",468,"Áfa pénzügyi elszámolási számla","chart_hu_46","account.data_account_type_liability","other","FALSE" +"chart_hu_469",469,"Önkormányzati adók elszámolási számla","chart_hu_46","account.data_account_type_liability","other","FALSE" +"chart_hu_47",47,"RÖVID LEJÁRATú KÖTELEZETTSÉGEK","chart_hu_4","account.account_type_liability_view1","view","FALSE" +"chart_hu_471",471,"Jövedelem elszámolási számla","chart_hu_47","account.data_account_type_liability","other","FALSE" +"chart_hu_472",472,"Fel nem vett járandóságok","chart_hu_47","account.data_account_type_liability","other","FALSE" +"chart_hu_473",473,"Társadalombiztosítási kötelezettség","chart_hu_47","account.data_account_type_liability","other","FALSE" +"chart_hu_474",474,"Elkülönített alapokkal kapcs. fiz. köt","chart_hu_47","account.data_account_type_liability","other","FALSE" +"chart_hu_475",475,"Magánnyugdíjpénztárak befiz. kötelezetts","chart_hu_47","account.data_account_type_liability","other","FALSE" +"chart_hu_476",476,"Egyéb rövid lej.kötelezettség munkaváll.","chart_hu_47","account.data_account_type_liability","other","FALSE" +"chart_hu_477",477,"Egyéb rövid lejáratú kötelezettség","chart_hu_47","account.data_account_type_liability","other","FALSE" +"chart_hu_478",478,"Magánszemélytõl levont 4% különadó","chart_hu_47","account.data_account_type_liability","other","FALSE" +"chart_hu_479",479,"Egyéb befizetési kötelezettségek","chart_hu_47","account.data_account_type_liability","other","FALSE" +"chart_hu_48",48,"PASSZÍV IDÖBELI ELHATÁROLÁS","chart_hu_4","account.account_type_liability_view1","view","FALSE" +"chart_hu_481",481,"Bevételek passzív idõbeli elhatárolása","chart_hu_48","account.data_account_type_liability","other","FALSE" +"chart_hu_482",482,"Költségek,ráford. passzív idõbeli elhat.","chart_hu_48","account.data_account_type_liability","other","FALSE" +"chart_hu_483",483,"Halasztott bevételek","chart_hu_48","account.data_account_type_liability","other","FALSE" +"chart_hu_49",49,"ÉVI MÉRLEG SZÁMLÁK","chart_hu_4","account.account_type_liability_view1","view","FALSE" +"chart_hu_491",491,"Nyitómérleg számla","chart_hu_49","account.data_account_type_liability","other","FALSE" +"chart_hu_5_9","5-9","Eredmény számlák","chart_hu_0","account.data_account_type_view","view","FALSE" +"chart_hu_5",5,"KÖLTSÉGNEMEK","chart_hu_5_9","account.data_account_type_expense","view","FALSE" +"chart_hu_51",51,"ANYAGKÖLTSÉG","chart_hu_5","account.data_account_type_expense","view","FALSE" +"chart_hu_511",511,"Vásárolt anyagok költségei","chart_hu_51","account.data_account_type_expense","other","FALSE" +"chart_hu_512",512,"Egy éven belül elhaszn. anyagi eszközök","chart_hu_51","account.data_account_type_expense","other","FALSE" +"chart_hu_513",513,"Egyéb anyagköltség","chart_hu_51","account.data_account_type_expense","other","FALSE" +"chart_hu_519",519,"Anyagköltség megtérülés","chart_hu_51","account.data_account_type_expense","other","FALSE" +"chart_hu_52",52,"IGÉNYBE VETT SZOLGÁLTATÁSOK KÖLTSÉGEI","chart_hu_5","account.data_account_type_expense","view","FALSE" +"chart_hu_521",521,"Szállítási, rakodási költség","chart_hu_52","account.data_account_type_expense","other","FALSE" +"chart_hu_522",522,"Bérleti díjak","chart_hu_52","account.data_account_type_expense","other","FALSE" +"chart_hu_523",523,"Javítási, karbantartási költségek","chart_hu_52","account.data_account_type_expense","other","FALSE" +"chart_hu_524",524,"Hirdetés, reklám-propaganda költség","chart_hu_52","account.data_account_type_expense","other","FALSE" +"chart_hu_525",525,"Oktatási, továbbképzési költségek","chart_hu_52","account.data_account_type_expense","other","FALSE" +"chart_hu_526",526,"Utazási- és kiküldetési költségek","chart_hu_52","account.data_account_type_expense","other","FALSE" +"chart_hu_527",527,"Postai, távközlési költségek","chart_hu_52","account.data_account_type_expense","other","FALSE" +"chart_hu_528",528,"Szakkönyv, folyóirat, napilap beszerzés","chart_hu_52","account.data_account_type_expense","other","FALSE" +"chart_hu_529",529,"Egyéb igénybevett szolgáltatások ktg-ei","chart_hu_52","account.data_account_type_expense","other","FALSE" +"chart_hu_53",53,"EGYÉB SZOLGÁLTATÁSOK KÖLTSÉGEI","chart_hu_5","account.data_account_type_expense","view","FALSE" +"chart_hu_531",531,"Hatósági igazgatási díjak (illetékek)","chart_hu_53","account.data_account_type_expense","other","FALSE" +"chart_hu_532",532,"Pénzügyi szolg-i díjak, bankköltségek","chart_hu_53","account.data_account_type_expense","other","FALSE" +"chart_hu_533",533,"Biztosítási díjak","chart_hu_53","account.data_account_type_expense","other","FALSE" +"chart_hu_54",54,"BÉRKÖLTSÉG","chart_hu_5","account.data_account_type_expense","view","FALSE" +"chart_hu_541",541,"Munkavállalók munkabér költsége","chart_hu_54","account.data_account_type_expense","other","FALSE" +"chart_hu_542",542,"Megbízási díjak bérköltség terhére","chart_hu_54","account.data_account_type_expense","other","FALSE" +"chart_hu_543",543,"Tagok személyes közr. ellenértéke","chart_hu_54","account.data_account_type_expense","other","FALSE" +"chart_hu_544",544,"Egyszerûsített fogl. bérköltsége","chart_hu_54","account.data_account_type_expense","other","FALSE" +"chart_hu_55",55,"SZEMÉLYI JELLEGû EGYÉB KIFIZETÉSEK","chart_hu_5","account.data_account_type_expense","view","FALSE" +"chart_hu_551",551,"Személyi jellegû kifizetések","chart_hu_55","account.data_account_type_expense","other","FALSE" +"chart_hu_552",552,"Jóléti és kulturális költségek","chart_hu_55","account.data_account_type_expense","other","FALSE" +"chart_hu_553",553,"Természetbeni juttatások","chart_hu_55","account.data_account_type_expense","other","FALSE" +"chart_hu_554",554,"Egyéb személyi jellegû kifizetések","chart_hu_55","account.data_account_type_expense","other","FALSE" +"chart_hu_555",555,"Magánnyugdíjpénztári tagdíjak, hozzájár.","chart_hu_55","account.data_account_type_expense","other","FALSE" +"chart_hu_556",556,"Foglalkoztatót terhelõ táppénz hjárulás","chart_hu_55","account.data_account_type_expense","other","FALSE" +"chart_hu_557",557,"Kifizetõt terhelõ személyi jövedelemadó","chart_hu_55","account.data_account_type_expense","other","FALSE" +"chart_hu_56",56,"BÉRJÁRULÉKOK","chart_hu_5","account.data_account_type_expense","view","FALSE" +"chart_hu_561",561,"Társadalombiztosítási járulék","chart_hu_56","account.data_account_type_expense","other","FALSE" +"chart_hu_562",562,"Egészségügyi hozzájárulás","chart_hu_56","account.data_account_type_expense","other","FALSE" +"chart_hu_563",563,"Munkaadói járulék","chart_hu_56","account.data_account_type_expense","other","FALSE" +"chart_hu_564",564,"Szakképzési hozzájárulás","chart_hu_56","account.data_account_type_expense","other","FALSE" +"chart_hu_565",565,"Rehabilitációs hozzájárulás","chart_hu_56","account.data_account_type_expense","other","FALSE" +"chart_hu_566",566,"Egyszerûsített közteherviselési hjár","chart_hu_56","account.data_account_type_expense","other","FALSE" +"chart_hu_567",567,"Egyszerûsített fogl. közteher","chart_hu_56","account.data_account_type_expense","other","FALSE" +"chart_hu_568",568,"Közteherjegy","chart_hu_56","account.data_account_type_expense","other","FALSE" +"chart_hu_57",57,"ÉRTÉKCSÖKKENÉSI LEÍRÁS","chart_hu_5","account.data_account_type_expense","view","FALSE" +"chart_hu_571",571,"Terv szerinti értékcsökkenés lineáris","chart_hu_57","account.data_account_type_expense","other","FALSE" +"chart_hu_572",572,"Terv szerinti egyösszegû (kisértékûek)","chart_hu_57","account.data_account_type_expense","other","FALSE" +"chart_hu_58",58,"AKTÍVÁLT SAJÁT TELJESÍTMÉNYEK ÉRTÉKE","chart_hu_5","account.data_account_type_expense","view","FALSE" +"chart_hu_581",581,"Saját term. készletek állományváltozása","chart_hu_58","account.data_account_type_expense","other","FALSE" +"chart_hu_582",582,"Saját elõállítási eszközök aktivált ért.","chart_hu_58","account.data_account_type_expense","other","FALSE" +"chart_hu_59",59,"KÖLTSÉGNEM ÁTVEZETÉSI SZÁMLA","chart_hu_5","account.data_account_type_expense","view","FALSE" +"chart_hu_591",591,"Anyagköltség átvezetési szla","chart_hu_59","account.data_account_type_expense","other","FALSE" +"chart_hu_592",592,"Igénybevett szolg. átvezetési szla","chart_hu_59","account.data_account_type_expense","other","FALSE" +"chart_hu_593",593,"Egyéb szolgáltatások átvezetési szla","chart_hu_59","account.data_account_type_expense","other","FALSE" +"chart_hu_594",594,"Bérköltség átvezetési szla","chart_hu_59","account.data_account_type_expense","other","FALSE" +"chart_hu_595",595,"Személyi jell. kif. átvezetési szla","chart_hu_59","account.data_account_type_expense","other","FALSE" +"chart_hu_596",596,"Bérjárulékok átvezetési szla","chart_hu_59","account.data_account_type_expense","other","FALSE" +"chart_hu_597",597,"Értékcsökkenési leírás átvez. szla","chart_hu_59","account.data_account_type_expense","other","FALSE" +"chart_hu_8",8,"AZ ÉRTÉKESÍTÉS ÖNKÖLTS. ÉS RÁFORDÍTÁSOK","chart_hu_5_9","account.data_account_type_expense","view","FALSE" +"chart_hu_81",81,"ANYAGJELLEGÛ RÁFORDÍTÁSOK","chart_hu_8","account.data_account_type_expense","view","FALSE" +"chart_hu_811",811,"Anyagköltség","chart_hu_81","account.data_account_type_expense","other","FALSE" +"chart_hu_812",812,"Igénybevett szolgáltatások értéke","chart_hu_81","account.data_account_type_expense","other","FALSE" +"chart_hu_813",813,"Egyéb szolgáltatások értéke","chart_hu_81","account.data_account_type_expense","other","FALSE" +"chart_hu_814",814,"Eladott áruk beszerzési értéke","chart_hu_81","account.data_account_type_expense","other","FALSE" +"chart_hu_815",815,"Eladott (közvetített) szolg. értéke","chart_hu_81","account.data_account_type_expense","other","FALSE" +"chart_hu_82",82,"SZEMÉLYI JELLEGû RÁFORDÍTÁSOK","chart_hu_8","account.data_account_type_expense","view","FALSE" +"chart_hu_821",821,"Bérköltség","chart_hu_82","account.data_account_type_expense","other","FALSE" +"chart_hu_822",822,"Személyi jellegü egyéb kifizetések","chart_hu_82","account.data_account_type_expense","other","FALSE" +"chart_hu_823",823,"Bérjárulékok","chart_hu_82","account.data_account_type_expense","other","FALSE" +"chart_hu_83",83,"ÉRTÉKCSÖKKENÉSI LEÍRÁS","chart_hu_8","account.data_account_type_expense","view","FALSE" +"chart_hu_86",86,"EGYÉB RÁFORDÍTÁSOK","chart_hu_8","account.data_account_type_expense","view","FALSE" +"chart_hu_861",861,"Értékesített eszk.imm.javak nytsz értéke","chart_hu_86","account.data_account_type_expense","other","FALSE" +"chart_hu_862",862,"Ért.átruházott követelések könyvsz. ért.","chart_hu_86","account.data_account_type_expense","other","FALSE" +"chart_hu_863",863,"Az üzleti évhez kapcs. ráfordítások","chart_hu_86","account.data_account_type_expense","other","FALSE" +"chart_hu_864",864,"Utólag adott pü. rendezett engedmény","chart_hu_86","account.data_account_type_expense","other","FALSE" +"chart_hu_865",865,"Céltartalék képzése","chart_hu_86","account.data_account_type_expense","other","FALSE" +"chart_hu_866",866,"Elszámolt értékvesztés, tervenf. értékcs","chart_hu_86","account.data_account_type_expense","other","FALSE" +"chart_hu_867",867,"Adók, illetékek, hozzájárulások","chart_hu_86","account.data_account_type_expense","other","FALSE" +"chart_hu_869",869,"Különféle egyéb ráfordítások","chart_hu_86","account.data_account_type_expense","other","FALSE" +"chart_hu_87",87,"PÉNZÜGYI MÜVELETEK RÁFORDÍTÁSAI","chart_hu_8","account.data_account_type_expense","view","FALSE" +"chart_hu_871",871,"Befektetett püi. eszk. árf.vesztesége","chart_hu_87","account.data_account_type_expense","other","FALSE" +"chart_hu_872",872,"Fizetendõ kamatok, kamatjell. ráford.","chart_hu_87","account.data_account_type_expense","other","FALSE" +"chart_hu_874",874,"Részesedések,é.papírok,bankb. értékveszt","chart_hu_87","account.data_account_type_expense","other","FALSE" +"chart_hu_875",875,"Forgóeszk. értékpapír árf.vesztesége","chart_hu_87","account.data_account_type_expense","other","FALSE" +"chart_hu_876",876,"Átváltási, értékelési árfolyamveszteség","chart_hu_87","account.data_account_type_expense","other","FALSE" +"chart_hu_877",877,"Egyéb árfolyamveszteségek, opciós díjak","chart_hu_87","account.data_account_type_expense","other","FALSE" +"chart_hu_878",878,"Vásárolt köv. kapcs. ráfordítások","chart_hu_87","account.data_account_type_expense","other","FALSE" +"chart_hu_879",879,"Egyéb pénzügyi ráfordítások","chart_hu_87","account.data_account_type_expense","other","FALSE" +"chart_hu_88",88,"RENDKIVÜLI RÁFORDÍTÁSOK","chart_hu_8","account.data_account_type_expense","view","FALSE" +"chart_hu_881",881,"Társaságban bevitt eszk. nytsz. értéke","chart_hu_88","account.data_account_type_expense","other","FALSE" +"chart_hu_887",887,"Saját üzletrész nyilvántartási értéke","chart_hu_88","account.data_account_type_expense","other","FALSE" +"chart_hu_888",888,"Tartozásátv. szerz. szerinti összege","chart_hu_88","account.data_account_type_expense","other","FALSE" +"chart_hu_889",889,"Egyéb vagyoncsökk. rendkívüli ráfordítás","chart_hu_88","account.data_account_type_expense","other","FALSE" +"chart_hu_89",89,"NYERESÉGET TERHELÖ ADÓK","chart_hu_8","account.data_account_type_expense","view","FALSE" +"chart_hu_891",891,"Társasági adó","chart_hu_89","account.data_account_type_expense","other","FALSE" +"chart_hu_892",892,"Társas vállalkozás különadója","chart_hu_89","account.data_account_type_expense","other","FALSE" +"chart_hu_895",895,"Egyszerüsített vállalkozói adó","chart_hu_89","account.data_account_type_expense","other","FALSE" +"chart_hu_9",9,"AZ ÉRTÉKESÍTÉS ÁRBEVÉTELE, BEVÉTELEK","chart_hu_5_9","account.data_account_type_income","view","FALSE" +"chart_hu_91",91,"BELFÖLDI ÉRKÉKESÍTÉS ÁRBEVÉTELE","chart_hu_9","account.data_account_type_income","view","FALSE" +"chart_hu_911",911,"Belföldi értékesítés árbevétele","chart_hu_91","account.data_account_type_income","other","FALSE" +"chart_hu_92",92,"BELFÖLDI ÉRTÉKESÍTÉS ÁRBEVÉTELE","chart_hu_9","account.data_account_type_income","view","FALSE" +"chart_hu_921",921,"Belföldi értékesítés árbevétele","chart_hu_92","account.data_account_type_income","other","FALSE" +"chart_hu_93",93,"EXPORT ÉRTÉKESÍTÉS ÁRBEVÉTELE","chart_hu_9","account.data_account_type_income","view","FALSE" +"chart_hu_931",931,"Export értékesítés árbev. EU tagországba","chart_hu_93","account.data_account_type_income","other","FALSE" +"chart_hu_932",932,"Export értékesítés árbev.nem EU tagorsz.","chart_hu_93","account.data_account_type_income","other","FALSE" +"chart_hu_96",96,"EGYÉB BEVÉTELEK","chart_hu_9","account.data_account_type_income","view","FALSE" +"chart_hu_961",961,"Ért.immat. javak, tárgyi eszk.bevétele","chart_hu_96","account.data_account_type_income","other","FALSE" +"chart_hu_962",962,"Ért,átruházott követelések elism.mértéke","chart_hu_96","account.data_account_type_income","other","FALSE" +"chart_hu_963",963,"Az üzleti évhez kapcs. egyéb bevételek","chart_hu_96","account.data_account_type_income","other","FALSE" +"chart_hu_964",964,"Utólag kapott pü. rendezett engedmény","chart_hu_96","account.data_account_type_income","other","FALSE" +"chart_hu_965",965,"Céltartalék felhasználása","chart_hu_96","account.data_account_type_income","other","FALSE" +"chart_hu_966",966,"Értékvesztések visszaírása, tervenf.écs.","chart_hu_96","account.data_account_type_income","other","FALSE" +"chart_hu_967",967,"Visszafiz. köt. nélkül kapott támogatás","chart_hu_96","account.data_account_type_income","other","FALSE" +"chart_hu_968",968,"Biztosító által visszaig. kártérítés ö.","chart_hu_96","account.data_account_type_income","other","FALSE" +"chart_hu_969",969,"Különféle egyéb bevételek","chart_hu_96","account.data_account_type_income","other","FALSE" +"chart_hu_97",97,"PÉNZÜGYI MÜVELETEK BEVÉTELEI","chart_hu_9","account.data_account_type_income","view","FALSE" +"chart_hu_971",971,"Kapott (járó) osztalék, részesedés","chart_hu_97","account.data_account_type_income","other","FALSE" +"chart_hu_972",972,"Részesedések ért. árfolyamnyeresége","chart_hu_97","account.data_account_type_income","other","FALSE" +"chart_hu_973",973,"Befekt. püi.eszk. kamatai, árf.nyeres.","chart_hu_97","account.data_account_type_income","other","FALSE" +"chart_hu_974",974,"Egyéb kapott kamatok,kamatjell.bevételek","chart_hu_97","account.data_account_type_income","other","FALSE" +"chart_hu_975",975,"Forgóeszk. értékpapír árfolyamnyeresége","chart_hu_97","account.data_account_type_income","other","FALSE" +"chart_hu_976",976,"Átváltási, átértékeléskori árf.nyereség","chart_hu_97","account.data_account_type_income","other","FALSE" +"chart_hu_977",977,"Egyéb árfolyamnyereségek, opciós bev.","chart_hu_97","account.data_account_type_income","other","FALSE" +"chart_hu_978",978,"Vás. követelésekkel kapcs. bevételek","chart_hu_97","account.data_account_type_income","other","FALSE" +"chart_hu_979",979,"Egyéb pénzügyi mûveletek bevételei","chart_hu_97","account.data_account_type_income","other","FALSE" +"chart_hu_98",98,"RENDKIVÜLI BEVÉTELEK","chart_hu_9","account.data_account_type_income","view","FALSE" +"chart_hu_981",981,"Rendkívüli bevételek","chart_hu_98","account.data_account_type_income","other","FALSE" diff --git a/addons/l10n_hu/data/account.chart.template.csv b/addons/l10n_hu/data/account.chart.template.csv new file mode 100644 index 00000000000..fd44d4fd532 --- /dev/null +++ b/addons/l10n_hu/data/account.chart.template.csv @@ -0,0 +1,2 @@ +"id","name","code_digits","account_root_id/id","tax_code_root_id/id","bank_account_view_id/id","property_account_receivable/id","property_account_payable/id","property_account_expense_categ/id","property_account_income_categ/id","property_account_expense/id","property_account_income/id","tax_code_root_id/id" +"hungarian_chart_template","Magyar főkönyvi kivonat",4,"chart_hu_0","tax_code_hu_1000","chart_hu_384","chart_hu_311","chart_hu_4541","chart_hu_81","chart_hu_911","chart_hu_81","chart_hu_911","tax_code_hu_vat" diff --git a/addons/l10n_hu/data/account.financial.report.csv b/addons/l10n_hu/data/account.financial.report.csv new file mode 100644 index 00000000000..ff33f7972d0 --- /dev/null +++ b/addons/l10n_hu/data/account.financial.report.csv @@ -0,0 +1,43 @@ +"id","display_detail","style_overwrite","account_type_ids/id","account_ids/id","parent_id/id","sign","name","account_report_id/id","sequence","type" +"l10n_hu.account_financial_report_pl_hu","Display children flat","Main Title 1 (bold, underlined)",,,,"Reverse balance sign","Eredménykimutatás – HU",,30,"View" +"l10n_hu.account_financial_report_pl_hu_G","Display children flat","Main Title 1 (bold, underlined)",,,"l10n_hu.account_financial_report_pl_hu","Reverse balance sign","Mérleg szerinti eredmény",,10,"View" +"l10n_hu.account_financial_report_pl_hu_F","Display children flat","Main Title 1 (bold, underlined)",,,"l10n_hu.account_financial_report_pl_hu_G","Reverse balance sign","Adózott eredmény",,12,"View" +"l10n_hu.account_financial_report_pl_hu_XIII","Display children with hierarchy","Normal Text","account_type_pl_hu_XIII",,"l10n_hu.account_financial_report_pl_hu_G","Reverse balance sign","Osztalék",,11,"Account Type" +"l10n_hu.account_financial_report_pl_hu_E","Display children flat","Main Title 1 (bold, underlined)",,,"l10n_hu.account_financial_report_pl_hu_F","Reverse balance sign","Adózás előtti eredmény",,14,"View" +"l10n_hu.account_financial_report_pl_hu_XII","Display children with hierarchy","Normal Text","account_type_pl_hu_XII",,"l10n_hu.account_financial_report_pl_hu_F","Reverse balance sign","Adófizetési kötelezettség",,13,"Account Type" +"l10n_hu.account_financial_report_pl_hu_D","Display children flat","Title 2 (bold)",,,"l10n_hu.account_financial_report_pl_hu_E","Reverse balance sign","Rendkívüli eredmény",,15,"View" +"l10n_hu.account_financial_report_pl_hu_X","Display children with hierarchy","Normal Text","account_type_pl_hu_X",,"l10n_hu.account_financial_report_pl_hu_D","Reverse balance sign","Rendkívüli bevételek",,17,"Account Type" +"l10n_hu.account_financial_report_pl_hu_XI","Display children with hierarchy","Normal Text","account_type_pl_hu_XI",,"l10n_hu.account_financial_report_pl_hu_D","Reverse balance sign","Rendkivüli ráfordítások",,16,"Account Type" +"l10n_hu.account_financial_report_pl_hu_C","Display children flat","Main Title 1 (bold, underlined)",,,"l10n_hu.account_financial_report_pl_hu_E","Reverse balance sign","Szokásos vállalkozási eredmény",,18,"View" +"l10n_hu.account_financial_report_pl_hu_A","Display children flat","Main Title 1 (bold, underlined)",,,"l10n_hu.account_financial_report_pl_hu_C","Reverse balance sign","Üzemi (üzleti) tevékenység eredménye",,22,"View" +"l10n_hu.account_financial_report_pl_hu_B","Display children flat","Title 2 (bold)",,,"l10n_hu.account_financial_report_pl_hu_C","Reverse balance sign","Pénzügyi műveletek eredménye",,19,"View" +"l10n_hu.account_financial_report_pl_hu_VIII","Display children with hierarchy","Normal Text","account_type_pl_hu_VIII",,"l10n_hu.account_financial_report_pl_hu_B","Reverse balance sign","Pénzügyi műveletek bevételei",,21,"Account Type" +"l10n_hu.account_financial_report_pl_hu_IX","Display children with hierarchy","Normal Text","account_type_pl_hu_IX",,"l10n_hu.account_financial_report_pl_hu_B","Reverse balance sign","Pénzügyi műveletek ráfordításai ",,20,"Account Type" +"l10n_hu.account_financial_report_pl_hu_I","Display children with hierarchy","Normal Text","account_type_pl_hu_I",,"l10n_hu.account_financial_report_pl_hu_A","Reverse balance sign","Értékesítés nettó árbevétele ",,1,"Account Type" +"l10n_hu.account_financial_report_pl_hu_II","Display children with hierarchy","Normal Text","account_type_pl_hu_II",,"l10n_hu.account_financial_report_pl_hu_A","Reverse balance sign","Aktivált saját teljesítmények értéke ",,2,"Account Type" +"l10n_hu.account_financial_report_pl_hu_III","Display children with hierarchy","Normal Text","account_type_pl_hu_III",,"l10n_hu.account_financial_report_pl_hu_A","Reverse balance sign","Egyéb bevételek",,3,"Account Type" +"l10n_hu.account_financial_report_pl_hu_IV","Display children with hierarchy","Normal Text","account_type_pl_hu_IV",,"l10n_hu.account_financial_report_pl_hu_A","Reverse balance sign","Anyagjellegű ráfordítások ",,4,"Account Type" +"l10n_hu.account_financial_report_pl_hu_V","Display children with hierarchy","Normal Text","account_type_pl_hu_V",,"l10n_hu.account_financial_report_pl_hu_A","Reverse balance sign","Személyi jellegű ráfordítások ",,5,"Account Type" +"l10n_hu.account_financial_report_pl_hu_VI","Display children with hierarchy","Normal Text","account_type_pl_hu_VI",,"l10n_hu.account_financial_report_pl_hu_A","Reverse balance sign","Értékcsökkenési leírás",,6,"Account Type" +"l10n_hu.account_financial_report_pl_hu_VII","Display children with hierarchy","Normal Text","account_type_pl_hu_VII",,"l10n_hu.account_financial_report_pl_hu_A","Reverse balance sign","Egyéb ráfordítások",,7,"Account Type" +"l10n_hu.account_financial_report_bs_hu","Display children flat",,,,,"Preserve balance sign","Mérleg – HU",,30,"View" +"l10n_hu.account_financial_report_bs_hu_AC","Display children with hierarchy","Main Title 1 (bold, underlined)",,,"l10n_hu.account_financial_report_bs_hu","Preserve balance sign","Eszközök Összesen",,100,"View" +"l10n_hu.account_financial_report_bs_hu_DG","Display children with hierarchy","Main Title 1 (bold, underlined)",,,"l10n_hu.account_financial_report_bs_hu","Reverse balance sign","Források Összesen",,200,"View" +"l10n_hu.account_financial_report_bs_hu_A","Display children flat","Title 2 (bold)","account_type_bs_hu_A",,"l10n_hu.account_financial_report_bs_hu_AC","Preserve balance sign","Befektetett Eszközök",,110,"View" +"l10n_hu.account_financial_report_bs_hu_AI","Display children flat","Normal Text","account_type_bs_hu_AI",,"l10n_hu.account_financial_report_bs_hu_A","Preserve balance sign","Immateriális Javak",,10,"Account Type" +"l10n_hu.account_financial_report_bs_hu_AII","Display children flat","Normal Text","account_type_bs_hu_AII",,"l10n_hu.account_financial_report_bs_hu_A","Preserve balance sign","Tárgyi Eszközök",,10,"Account Type" +"l10n_hu.account_financial_report_bs_hu_AIII","Display children flat","Normal Text","account_type_bs_hu_AIII",,"l10n_hu.account_financial_report_bs_hu_A","Preserve balance sign","Befektetett Pénzügyi Eszközök",,10,"Account Type" +"l10n_hu.account_financial_report_bs_hu_B","Display children with hierarchy","Title 2 (bold)","account_type_bs_hu_B",,"l10n_hu.account_financial_report_bs_hu_AC","Preserve balance sign","Forgóeszközök",,120,"View" +"l10n_hu.account_financial_report_bs_hu_BI","Display children flat","Normal Text","account_type_bs_hu_BI",,"l10n_hu.account_financial_report_bs_hu_B","Preserve balance sign","Készletek",,10,"Account Type" +"l10n_hu.account_financial_report_bs_hu_BII","Display children flat","Normal Text","account_type_bs_hu_BII",,"l10n_hu.account_financial_report_bs_hu_B","Preserve balance sign","Követelések",,10,"Account Type" +"l10n_hu.account_financial_report_bs_hu_BIII","Display children flat","Normal Text","account_type_bs_hu_BIII",,"l10n_hu.account_financial_report_bs_hu_B","Preserve balance sign","Értékpapírok",,10,"Account Type" +"l10n_hu.account_financial_report_bs_hu_BIV","Display children flat","Normal Text","account_type_bs_hu_BIV",,"l10n_hu.account_financial_report_bs_hu_B","Preserve balance sign","Pénzeszközök",,10,"Account Type" +"l10n_hu.account_financial_report_bs_hu_C","Display children with hierarchy","Title 2 (bold)","account_type_bs_hu_C",,"l10n_hu.account_financial_report_bs_hu_AC","Preserve balance sign","Aktív Időbeli Elhatárolások",,130,"Account Type" +"l10n_hu.account_financial_report_bs_hu_pl","Display children flat","Title 2 (bold)",,,"l10n_hu.account_financial_report_bs_hu_DG","Reverse balance sign","Számított eredmény","l10n_hu.account_financial_report_pl_hu",201,"Report Value" +"l10n_hu.account_financial_report_bs_hu_D","Display children with hierarchy","Title 2 (bold)","account_type_bs_hu_D",,"l10n_hu.account_financial_report_bs_hu_DG","Reverse balance sign","Saját Tőke",,210,"Account Type" +"l10n_hu.account_financial_report_bs_hu_E","Display children with hierarchy","Title 2 (bold)","account_type_bs_hu_E",,"l10n_hu.account_financial_report_bs_hu_DG","Reverse balance sign","Céltartalékok",,220,"Account Type" +"l10n_hu.account_financial_report_bs_hu_F","Display children with hierarchy","Title 2 (bold)","account_type_bs_hu_F",,"l10n_hu.account_financial_report_bs_hu_DG","Reverse balance sign","Kötelezettségek",,230,"View" +"l10n_hu.account_financial_report_bs_hu_FI","Display children with hierarchy","Normal Text","account_type_bs_hu_FI",,"l10n_hu.account_financial_report_bs_hu_F","Reverse balance sign","Hátrasorolt Kötelezettségek",,10,"Account Type" +"l10n_hu.account_financial_report_bs_hu_FII","Display children with hierarchy","Normal Text","account_type_bs_hu_FII",,"l10n_hu.account_financial_report_bs_hu_F","Reverse balance sign","Hosszú Lejáratú Kötelezettségek",,10,"Account Type" +"l10n_hu.account_financial_report_bs_hu_FIII","Display children with hierarchy","Normal Text","account_type_bs_hu_FIII",,"l10n_hu.account_financial_report_bs_hu_F","Reverse balance sign","Rövid Lejáratú Kötelezettségek",,10,"Account Type" +"l10n_hu.account_financial_report_bs_hu_G","Display children with hierarchy","Title 2 (bold)","account_type_bs_hu_G",,"l10n_hu.account_financial_report_bs_hu_DG","Reverse balance sign","Passzív Időbeli Elhatárolások",,240,"Account Type" diff --git a/addons/l10n_hu/data/account.fiscal.position.tax.template.csv b/addons/l10n_hu/data/account.fiscal.position.tax.template.csv new file mode 100644 index 00000000000..2aa52904f22 --- /dev/null +++ b/addons/l10n_hu/data/account.fiscal.position.tax.template.csv @@ -0,0 +1,23 @@ +"id","tax_src_id/id","tax_dest_id/id","position_id/id" +"fiscal_position_hu_exempt_tax_F27","F27","FA","fiscal_position_hu_exempt" +"fiscal_position_hu_exempt_tax_F18","F18","FA","fiscal_position_hu_exempt" +"fiscal_position_hu_exempt_tax_F5","F5","FA","fiscal_position_hu_exempt" +"fiscal_position_hu_exempt_tax_V27","V27","VA","fiscal_position_hu_exempt" +"fiscal_position_hu_exempt_tax_V18","V18","VA","fiscal_position_hu_exempt" +"fiscal_position_hu_exempt_tax_V5","V5","VA","fiscal_position_hu_exempt" +"fiscal_position_hu_eu_tax_F27","F27","FEU","fiscal_position_hu_eu" +"fiscal_position_hu_eu_tax_F18","F18","FEU","fiscal_position_hu_eu" +"fiscal_position_hu_eu_tax_F5","F5","FEU","fiscal_position_hu_eu" +"fiscal_position_hu_eu_tax_FA","FA","FEU","fiscal_position_hu_eu" +"fiscal_position_hu_eu_tax_V27","V27","VEU","fiscal_position_hu_eu" +"fiscal_position_hu_eu_tax_V18","V18","VEU","fiscal_position_hu_eu" +"fiscal_position_hu_eu_tax_V5","V5","VEU","fiscal_position_hu_eu" +"fiscal_position_hu_eu_tax_VA","VA","VEU","fiscal_position_hu_eu" +"fiscal_position_hu_eu_out_tax_F27","F27","FEUO","fiscal_position_hu_eu_out" +"fiscal_position_hu_eu_out_tax_F18","F18","FEUO","fiscal_position_hu_eu_out" +"fiscal_position_hu_eu_out_tax_F5","F5","FEUO","fiscal_position_hu_eu_out" +"fiscal_position_hu_eu_out_tax_FA","FA","FEUO","fiscal_position_hu_eu_out" +"fiscal_position_hu_eu_out_tax_V27","V27","VEUO","fiscal_position_hu_eu_out" +"fiscal_position_hu_eu_out_tax_V18","V18","VEUO","fiscal_position_hu_eu_out" +"fiscal_position_hu_eu_out_tax_V5","V5","VEUO","fiscal_position_hu_eu_out" +"fiscal_position_hu_eu_out_tax_VA","VA","VEUO","fiscal_position_hu_eu_out" diff --git a/addons/l10n_hu/data/account.fiscal.position.template.csv b/addons/l10n_hu/data/account.fiscal.position.template.csv new file mode 100644 index 00000000000..97d35b31c3d --- /dev/null +++ b/addons/l10n_hu/data/account.fiscal.position.template.csv @@ -0,0 +1,4 @@ +"id","chart_template_id/id","name" +"fiscal_position_hu_exempt","hungarian_chart_template","Alanyi adómentes" +"fiscal_position_hu_eu","hungarian_chart_template","EU partner" +"fiscal_position_hu_eu_out","hungarian_chart_template","EU-n kívüli partner" diff --git a/addons/l10n_hu/data/account.tax.code.template.csv b/addons/l10n_hu/data/account.tax.code.template.csv new file mode 100644 index 00000000000..04818068104 --- /dev/null +++ b/addons/l10n_hu/data/account.tax.code.template.csv @@ -0,0 +1,26 @@ +"id","name","code","parent_id:id","notprintable","sign" +"tax_code_hu_vat","Általános Forgalmi Adó","ÁFA",,,"1.0" +"tax_code_hu_vat_base","ÁFA alap","ÁFA – alap","tax_code_hu_vat",,"1.0" +"tax_code_hu_vat_position","ÁFA fizetndő / visszaigényelhető","ÁFA – fiz/vissz","tax_code_hu_vat",,"1.0" +"tax_code_hu_1021","Adóalap - Fizetendő ÁFA 18%","06","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1011","Adóalap - Fizetendő ÁFA 27%","07","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1031","Adóalap - Fizetendő ÁFA 5%","05","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1041","Adóalap - Fizetendő ÁFA alanyi adómentes","04","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1051","Adóalap - Fizetendő ÁFA EU","02","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1061","Adóalap - Fizetendő ÁFA tárgyi adómentes","04","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1071","Adóalap - Fizetendő ÁFA Export","01","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1081","Adóalap – Fordított ÁFA","29","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1221","Adóalap - Visszaigényelhető ÁFA 18%","65","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1211","Adóalap - Visszaigényelhető ÁFA 27%","66","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1231","Adóalap - Visszaigényelhető ÁFA 5%","64","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1240","Adóalap - Visszaigényelhető ÁFA alanyi adómentes","63","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1260","Adóalap - Visszaigényelhető ÁFA tárgyi adómentes","63","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1250","Adóalap - Visszaigényelhető ÁFA EU","11","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1270","Adóalap – Import ÁFA","23","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1280","Adóalap – Fordított ÁFA","23","tax_code_hu_vat_base","FALSE","1.0" +"tax_code_hu_1020","Fizetendő ÁFA 18%","06","tax_code_hu_vat_position","FALSE","1.0" +"tax_code_hu_1010","Fizetendő ÁFA 27%","07","tax_code_hu_vat_position","FALSE","1.0" +"tax_code_hu_1030","Fizetendő ÁFA 5%","05","tax_code_hu_vat_position","FALSE","1.0" +"tax_code_hu_1220","Visszaigényelhető ÁFA 18%","65","tax_code_hu_vat_position","FALSE","-1.0" +"tax_code_hu_1210","Visszaigényelhető ÁFA 27%","66","tax_code_hu_vat_position","FALSE","-1.0" +"tax_code_hu_1230","Visszaigényelhető ÁFA 5%","64","tax_code_hu_vat_position","FALSE","-1.0" diff --git a/addons/l10n_hu/data/account.tax.template.csv b/addons/l10n_hu/data/account.tax.template.csv new file mode 100644 index 00000000000..8ac513abfbf --- /dev/null +++ b/addons/l10n_hu/data/account.tax.template.csv @@ -0,0 +1,17 @@ +"id","description","chart_template_id/id","type_tax_use","name","type","amount","account_collected_id/id","account_paid_id/id","base_code_id/id","tax_code_id/id","ref_base_code_id/id","ref_tax_code_id/id","tax_sign","base_sign","ref_base_sign","ref_tax_sign","parent_id:id","sequence","price_include" +"F27","27%","hungarian_chart_template","sale","Fizetendő - 27%","percent",0.27,"chart_hu_467","chart_hu_467","tax_code_hu_1011","tax_code_hu_1010","tax_code_hu_1011","tax_code_hu_1010",1,1,-1,-1,,1,"False" +"F18","18%","hungarian_chart_template","sale","Fizetendő – 18%","percent",0.18,"chart_hu_467","chart_hu_467","tax_code_hu_1021","tax_code_hu_1020","tax_code_hu_1021","tax_code_hu_1020",1,1,-1,-1,,2,"False" +"F5","5%","hungarian_chart_template","sale","Fizetendő – 5%","percent",0.05,"chart_hu_467","chart_hu_467","tax_code_hu_1031","tax_code_hu_1030","tax_code_hu_1031","tax_code_hu_1030",1,1,-1,-1,,2,"False" +"FA","AAM","hungarian_chart_template","sale","Fizetendő – Alanyi Adómentes","percent",0,"chart_hu_467","chart_hu_467","tax_code_hu_1041",,"tax_code_hu_1041",,1,1,-1,-1,,2,"False" +"FT","TAM","hungarian_chart_template","sale","Fizetendő – Tárgyi Adómentes","percent",0,"chart_hu_467","chart_hu_467","tax_code_hu_1061",,"tax_code_hu_1061",,1,1,-1,-1,,2,"False" +"FF","FORD","hungarian_chart_template","sale","Fizetendő – Fordított ÁFA","percent",0,"chart_hu_467","chart_hu_467","tax_code_hu_1081",,"tax_code_hu_1081",,1,1,-1,-1,,2,"False" +"FEUO","Export","hungarian_chart_template","sale","Fizetendő – Export","percent",0,"chart_hu_467","chart_hu_467","tax_code_hu_1071",,"tax_code_hu_1071",,1,1,-1,-1,,2,"False" +"FEU","EU","hungarian_chart_template","sale","Fizetendő – EU","percent",0,"chart_hu_467","chart_hu_467","tax_code_hu_1051",,"tax_code_hu_1051",,1,1,-1,-1,,2,"False" +"V18","18%","hungarian_chart_template","purchase","Visszaigényelhető – 18%","percent",0.18,"chart_hu_466","chart_hu_466","tax_code_hu_1221","tax_code_hu_1220","tax_code_hu_1221","tax_code_hu_1220",1,1,-1,-1,,2,"False" +"V27","27%","hungarian_chart_template","purchase","Visszaigényelhető – 27%","percent",0.27,"chart_hu_466","chart_hu_466","tax_code_hu_1211","tax_code_hu_1210","tax_code_hu_1211","tax_code_hu_1210",1,1,-1,-1,,1,"False" +"V5","5%","hungarian_chart_template","purchase","Visszaigényelhető – 5%","percent",0.05,"chart_hu_466","chart_hu_466","tax_code_hu_1231","tax_code_hu_1230","tax_code_hu_1231","tax_code_hu_1230",1,1,-1,-1,,2,"False" +"VA","AAM","hungarian_chart_template","purchase","Visszaigényelhető – Alanyi Adómentes","percent",0,"chart_hu_466","chart_hu_466","tax_code_hu_1240",,"tax_code_hu_1240",,1,1,-1,-1,,2,"False" +"VT","TAM","hungarian_chart_template","purchase","Visszaigényelhető – Tárgyi Adómentes","percent",0,"chart_hu_466","chart_hu_466","tax_code_hu_1260",,"tax_code_hu_1260",,1,1,-1,-1,,2,"False" +"VEU","EU","hungarian_chart_template","purchase","Visszaigényelhető – EU","percent",0,"chart_hu_466","chart_hu_466","tax_code_hu_1250",,"tax_code_hu_1250",,1,1,-1,-1,,2,"False" +"VEUO","Import","hungarian_chart_template","purchase","Visszaigényelhető – Import","percent",0,"chart_hu_466","chart_hu_466","tax_code_hu_1270",,"tax_code_hu_1270",,1,1,-1,-1,,2,"False" +"VF","FORD","hungarian_chart_template","purchase","Visszaigényelhető – Fordított ÁFA","percent",0,"chart_hu_466","chart_hu_466","tax_code_hu_1280",,"tax_code_hu_1280",,1,1,-1,-1,,2,"False" diff --git a/addons/l10n_hu/data/res.bank.csv b/addons/l10n_hu/data/res.bank.csv new file mode 100644 index 00000000000..f1f8703f66c --- /dev/null +++ b/addons/l10n_hu/data/res.bank.csv @@ -0,0 +1,22 @@ +"id","name","bic","country/id","zip","city","street","email","phone","fax" +"BKCHHUHBXXX","Bank of China (Hungária) Hitelintézet Rt.","BKCHHUHBXXX","base.hu",1051,"Budapest","József Nádor tér 7.","service_hu@bank-of-china.com","+3614299200","+3614299201" +"BNPAHUHX","BNP Paribas Hungária Bank Rt.","BNPAHUHX","base.hu",1051,"Budapest","Széchenyi István tér 7-8.",,"+3613746300", +"BUDAHUHB","Budapest Hitel- és Fejlesztési Bank Rt.","BUDAHUHB","base.hu",1138,"Budapest","Váci út 188."," info@budapestbank.hu","+3614506060","+3614506062" +"CIBHHUHB","CIB Közép-Európai Nemzetközi Bank Zrt.","CIBHHUHB","base.hu",1027,"Budapest","Medve utca 4-14.","cib@cib.hu","+3614231000", +"CITIHUHX","Citibank Rt.","CITIHUHX","base.hu",1051,"Budapest","Szabadság tér 7.",,"+3613745000","+3613745100" +"COBAHUHX","Commerzbank Zártkörűen Működő Rt.","COBAHUHX","base.hu",1054,"Budapest","Széchenyi rakpart 8.","info.budapest@commerzbank.com","+3613748100","+3612694574" +"DEUTHU2B","Deutsche Bank Zártkörűen Működő Rt.","DEUTHU2B","base.hu",1054,"Budapest","Hold utca 27.","db.hungary@db.com","+3613013700","+3612693239" +"GIBAHUHB","ERSTE Bank Hungary Zrt.","GIBAHUHB","base.hu",1138,"Budapest","Népfürdő u. 24-26.","erste@erstebank.hu","+3640222221","+3612194766" +"FHKBHUHB","FHB Kereskedelmi Bank Zrt.","FHKBHUHB","base.hu",1082,"Budapest","Üllői út 48."," info@fhb.hu","+3614529100","+3614529200" +"GNBAHUHB","Gránit Bank Zrt.","GNBAHUHB","base.hu",1095,"Budapest","Lechner Ödön fasor 8.","info@granitbank.hu","+3640100777","+3612355906" +"INCNHUHB","IC Bank Rt.","INCNHUHB","base.hu",1088,"Budapest","Rákóczi út 1-3."," level@bancopopolare.hu ","+3640200515","+3612666815" +"INGBHUHB","ING Bank N.V. Magyarországi Fióktelepe","INGBHUHB","base.hu",1068,"Budapest","Dózsa György út 84.","communications.hu@ingbank.com","+362680140","+362680159" +"OKHBHUHB","K&H Bank Zrt.","OKHBHUHB","base.hu",1095,"Budapest","Lechner Ödön fasor 9."," bank@kh.hu ","+3613289000","+3613289696" +"HBWEHUHB","MagNet Magyar Közösségi Bank Zrt.","HBWEHUHB","base.hu",1062,"Budapest","Andrássy utca 98.","info@magnetbank.hu","+3614288888","+3614288889" +"MANEHUHB","Magyar Nemzeti Bank","MANEHUHB","base.hu",1054,"Budapest","Szabadság tér 8-9.","info@mnb.hu","+3614282600","+3614298000" +"MKKBHUHB","MKB Bank Zrt.","MKKBHUHB","base.hu",1056,"Budapest","Váci utca 38.","telebankar@mkb.hu","+3613278600","+3613278700" +"OTPVHUHB","OTP Bank Nyrt.","OTPVHUHB","base.hu",1051,"Budapest","Nádor utca 16.",,"+3614735000","+3614735955" +"UBRTHUHB","RAIFFEISEN Bank Zrt.","UBRTHUHB","base.hu",1054,"Budapest","Akadémia utca 6.",,"+3640484848", +"MAVOHUHB","Sberbank Magyarország Zrt.","MAVOHUHB","base.hu",1088,"Budapest","Rákóczi út 7.","info@sberbank.hu","+3614114200","+3613286660" +"TAKBHUHB","TakarékBank Zrt.","TAKBHUHB","base.hu",1122,"Budapest","Pethényi köz 10.","info@tbank.hu","+3612023777", +"BACXHUHB","UniCredit Bank Hungary Zrt.","BACXHUHB","base.hu",1054,"Budapest","Szabadság tér 5-6.","info@unicreditgroup.hu","+3613011271","+3613534959" diff --git a/addons/l10n_hu/static/description/icon.png b/addons/l10n_hu/static/description/icon.png new file mode 100644 index 00000000000..e69de29bb2d diff --git a/addons/mail/mail_followers.py b/addons/mail/mail_followers.py index e4028111a73..ddc7b74eac1 100644 --- a/addons/mail/mail_followers.py +++ b/addons/mail/mail_followers.py @@ -175,6 +175,11 @@ class mail_notification(osv.Model): # compute email references references = message.parent_id.message_id if message.parent_id else False + # custom values + custom_values = dict() + if message.model and message.res_id and self.pool.get(message.model) and hasattr(self.pool[message.model], 'message_get_email_values'): + custom_values = self.pool[message.model].message_get_email_values(cr, uid, message.res_id, message, context=context) + # create email values max_recipients = 50 chunks = [email_pids[x:x + max_recipients] for x in xrange(0, len(email_pids), max_recipients)] @@ -187,6 +192,7 @@ class mail_notification(osv.Model): 'recipient_ids': [(4, id) for id in chunk], 'references': references, } + mail_values.update(custom_values) email_ids.append(self.pool.get('mail.mail').create(cr, uid, mail_values, context=context)) if force_send and len(chunks) < 2: # for more than 50 followers, use the queue system self.pool.get('mail.mail').send(cr, uid, email_ids, context=context) diff --git a/addons/mail/mail_group.py b/addons/mail/mail_group.py index 186787c121a..a8eca07b93e 100644 --- a/addons/mail/mail_group.py +++ b/addons/mail/mail_group.py @@ -23,6 +23,7 @@ import openerp import openerp.tools as tools from openerp.osv import osv from openerp.osv import fields +from openerp.tools.safe_eval import safe_eval as eval from openerp import SUPERUSER_ID @@ -215,12 +216,13 @@ class mail_group(osv.Model): def message_get_email_values(self, cr, uid, id, notif_mail=None, context=None): res = super(mail_group, self).message_get_email_values(cr, uid, id, notif_mail=notif_mail, context=context) group = self.browse(cr, uid, id, context=context) - res.update({ - 'headers': { - 'Precedence': 'list', - } - }) - if group.alias_domain: - res['headers']['List-Id'] = '%s.%s' % (group.alias_name, group.alias_domain) - res['headers']['List-Post'] = '' % (group.alias_name, group.alias_domain) + try: + headers = eval(res.get('headers', '{}')) + except Exception: + headers = {} + headers['Precedence'] = 'list' + if group.alias_domain and group.alias_name: + headers['List-Id'] = '%s.%s' % (group.alias_name, group.alias_domain) + headers['List-Post'] = '' % (group.alias_name, group.alias_domain) + res['headers'] = '%s' % headers return res diff --git a/addons/mail/mail_mail.py b/addons/mail/mail_mail.py index cc12bde2436..0a6a250bcaa 100644 --- a/addons/mail/mail_mail.py +++ b/addons/mail/mail_mail.py @@ -22,13 +22,13 @@ import base64 import logging import re -from urllib import urlencode from urlparse import urljoin from openerp import tools from openerp import SUPERUSER_ID from openerp.addons.base.ir.ir_mail_server import MailDeliveryException from openerp.osv import fields, osv +from openerp.tools.safe_eval import safe_eval as eval from openerp.tools.translate import _ _logger = logging.getLogger(__name__) @@ -59,6 +59,7 @@ class mail_mail(osv.Model): 'recipient_ids': fields.many2many('res.partner', string='To (Partners)'), 'email_cc': fields.char('Cc', help='Carbon copy message recipients'), 'body_html': fields.text('Rich-text Contents', help="Rich-text/HTML message"), + 'headers': fields.text('Headers'), # Auto-detected based on create() - if 'mail_message_id' was passed then this mail is a notification # and during unlink() we will not cascade delete the parent and its attachments 'notification': fields.boolean('Is Notification', @@ -67,6 +68,7 @@ class mail_mail(osv.Model): _defaults = { 'state': 'outgoing', + 'headers': '{}', } def default_get(self, cr, uid, fields, context=None): @@ -186,11 +188,8 @@ class mail_mail(osv.Model): - if 'partner' and mail is a notification on a document: followers (Followers of 'Doc' ) - elif 'partner', no notificatoin or no doc: recipient specific (Partner Name ) - else fallback on mail.email_to splitting """ - if partner and mail.notification and mail.record_name: - sanitized_record_name = re.sub(r'[^\w+.]+', '-', mail.record_name) - email_to = [_('"Followers of %s" <%s>') % (sanitized_record_name, partner.email)] - elif partner: - email_to = ['%s <%s>' % (partner.name, partner.email)] + if partner: + email_to = ['"%s" <%s>' % (partner.name, partner.email)] else: email_to = tools.email_split(mail.email_to) return email_to @@ -210,8 +209,6 @@ class mail_mail(osv.Model): 'subject': self.send_get_mail_subject(cr, uid, mail, partner=partner, context=context), 'email_to': self.send_get_mail_to(cr, uid, mail, partner=partner, context=context), } - if mail.model and mail.res_id and self.pool.get(mail.model) and hasattr(self.pool[mail.model], 'message_get_email_values'): - res.update(self.pool[mail.model].message_get_email_values(cr, uid, mail.res_id, mail, context=context)) return res def send(self, cr, uid, ids, auto_commit=False, raise_exception=False, context=None): @@ -267,13 +264,15 @@ class mail_mail(osv.Model): headers['Return-Path'] = '%s-%d-%s-%d@%s' % (bounce_alias, mail.id, mail.model, mail.res_id, catchall_domain) else: headers['Return-Path'] = '%s-%d@%s' % (bounce_alias, mail.id, catchall_domain) + if mail.headers: + try: + headers.update(eval(mail.headers)) + except Exception: + pass # build an RFC2822 email.message.Message object and send it without queuing res = None for email in email_list: - email_headers = dict(headers) - if email.get('headers'): - email_headers.update(email['headers']) msg = ir_mail_server.build_email( email_from=mail.email_from, email_to=email.get('email_to'), @@ -288,7 +287,7 @@ class mail_mail(osv.Model): object_id=mail.res_id and ('%s-%s' % (mail.res_id, mail.model)), subtype='html', subtype_alternative='plain', - headers=email_headers) + headers=headers) res = ir_mail_server.send_email(cr, uid, msg, mail_server_id=mail.mail_server_id.id, context=context) diff --git a/addons/mail/mail_mail_view.xml b/addons/mail/mail_mail_view.xml index d32eade0dc4..233f407b8e1 100644 --- a/addons/mail/mail_mail_view.xml +++ b/addons/mail/mail_mail_view.xml @@ -34,26 +34,19 @@ -
- - - - - - - - -
-
- - - - - - - - -
+ + + + + + + + + + + + +
diff --git a/addons/mail/mail_message.py b/addons/mail/mail_message.py index 5b716a14ef2..b924bb68e8c 100644 --- a/addons/mail/mail_message.py +++ b/addons/mail/mail_message.py @@ -20,7 +20,6 @@ ############################################################################## import logging -import re from openerp import tools @@ -131,6 +130,8 @@ class mail_message(osv.Model): help="Email address of the sender. This field is set when no matching partner is found for incoming emails."), 'reply_to': fields.char('Reply-To', help='Reply email address. Setting the reply_to bypasses the automatic thread creation.'), + 'same_thread': fields.boolean('Same thread', + help='Redirect answers to the same discussion thread.'), 'author_id': fields.many2one('res.partner', 'Author', select=1, ondelete='set null', help="Author of the message. If not set, email_from may hold an email address that did not match any partner."), @@ -188,6 +189,7 @@ class mail_message(osv.Model): 'author_id': lambda self, cr, uid, ctx=None: self._get_default_author(cr, uid, ctx), 'body': '', 'email_from': lambda self, cr, uid, ctx=None: self._get_default_from(cr, uid, ctx), + 'same_thread': True, } #------------------------------------------------------ @@ -766,42 +768,12 @@ class mail_message(osv.Model): """ Return a specific reply_to: alias of the document through message_get_reply_to or take the email_from """ - email_reply_to = None - - ir_config_parameter = self.pool.get("ir.config_parameter") - catchall_domain = ir_config_parameter.get_param(cr, uid, "mail.catchall.domain", context=context) - - # model, res_id, email_from: comes from values OR related message model, res_id, email_from = values.get('model'), values.get('res_id'), values.get('email_from') - - # if model and res_id: try to use ``message_get_reply_to`` that returns the document alias - if not email_reply_to and model and res_id and catchall_domain and hasattr(self.pool[model], 'message_get_reply_to'): - email_reply_to = self.pool[model].message_get_reply_to(cr, uid, [res_id], context=context)[0] - # no alias reply_to -> catchall alias - if not email_reply_to and catchall_domain: - catchall_alias = ir_config_parameter.get_param(cr, uid, "mail.catchall.alias", context=context) - if catchall_alias: - email_reply_to = '%s@%s' % (catchall_alias, catchall_domain) - # still no reply_to -> reply_to will be the email_from - if not email_reply_to and email_from: - email_reply_to = email_from - - # format 'Document name ' - if email_reply_to and model and res_id: - emails = tools.email_split(email_reply_to) - if emails: - email_reply_to = emails[0] - document_name = self.pool[model].name_get(cr, SUPERUSER_ID, [res_id], context=context)[0] - if document_name: - # sanitize document name - sanitized_doc_name = re.sub(r'[^\w+.]+', '-', document_name[1]) - # generate reply to - email_reply_to = _('"Followers of %s" <%s>') % (sanitized_doc_name, email_reply_to) - - return email_reply_to + ctx = dict(context, thread_model=model) + return self.pool['mail.thread'].message_get_reply_to(cr, uid, [res_id], default=email_from, context=ctx)[res_id] def _get_message_id(self, cr, uid, values, context=None): - if values.get('reply_to'): + if values.get('same_thread', True) is False: message_id = tools.generate_tracking_message_id('reply_to') elif values.get('res_id') and values.get('model'): message_id = tools.generate_tracking_message_id('%(res_id)s-%(model)s' % values) diff --git a/addons/mail/mail_thread.py b/addons/mail/mail_thread.py index 76d3ab744d5..54f2b8d8f8b 100644 --- a/addons/mail/mail_thread.py +++ b/addons/mail/mail_thread.py @@ -31,6 +31,7 @@ except ImportError: from lxml import etree import logging import pytz +import re import socket import time import xmlrpclib @@ -688,22 +689,54 @@ class mail_thread(osv.AbstractModel): res[record.id] = {'partner_ids': list(recipient_ids), 'email_to': email_to, 'email_cc': email_cc} return res - def message_get_reply_to(self, cr, uid, ids, context=None): + def message_get_reply_to(self, cr, uid, ids, default=None, context=None): """ Returns the preferred reply-to email address that is basically the alias of the document, if it exists. """ - if not self._inherits.get('mail.alias'): - return [False for id in ids] - return ["%s@%s" % (record.alias_name, record.alias_domain) - if record.alias_domain and record.alias_name else False - for record in self.browse(cr, SUPERUSER_ID, ids, context=context)] + if context is None: + context = {} + model_name = context.get('thread_model') or self._name + alias_domain = self.pool['ir.config_parameter'].get_param(cr, uid, "mail.catchall.domain", context=context) + res = dict.fromkeys(ids, False) + + # alias domain: check for aliases and catchall + aliases = {} + doc_names = {} + if alias_domain: + if model_name and model_name != 'mail.thread': + alias_ids = self.pool['mail.alias'].search( + cr, SUPERUSER_ID, [ + ('alias_parent_model_id.model', '=', model_name), + ('alias_parent_thread_id', 'in', ids), + ('alias_name', '!=', False) + ], context=context) + aliases.update( + dict((alias.alias_parent_thread_id, '%s@%s' % (alias.alias_name, alias_domain)) + for alias in self.pool['mail.alias'].browse(cr, SUPERUSER_ID, alias_ids, context=context))) + doc_names.update( + dict((ng_res[0], ng_res[1]) + for ng_res in self.pool[model_name].name_get(cr, SUPERUSER_ID, aliases.keys(), context=context))) + # left ids: use catchall + left_ids = set(ids).difference(set(aliases.keys())) + if left_ids: + catchall_alias = self.pool['ir.config_parameter'].get_param(cr, uid, "mail.catchall.alias", context=context) + if catchall_alias: + aliases.update(dict((res_id, '%s@%s' % (catchall_alias, alias_domain)) for res_id in left_ids)) + # compute name of reply-to + company_name = self.pool['res.users'].browse(cr, SUPERUSER_ID, uid, context=context).company_id.name + res.update( + dict((res_id, '"%(company_name)s%(document_name)s" <%(email)s>' % + {'company_name': company_name, + 'document_name': doc_names.get(res_id) and ' ' + re.sub(r'[^\w+.]+', '-', doc_names[res_id]) or '', + 'email': aliases[res_id] + } or False) for res_id in aliases.keys())) + left_ids = set(ids).difference(set(aliases.keys())) + if left_ids and default: + res.update(dict((res_id, default) for res_id in left_ids)) + return res def message_get_email_values(self, cr, uid, id, notif_mail=None, context=None): - """ Temporary method to create custom notification email values for a given - model and document. This should be better to have a headers field on - the mail.mail model, computed when creating the notification email, but - this cannot be done in a stable version. - - TDE FIXME: rethink this ulgy thing. """ + """ Get specific notification email values to store on the notification + mail_mail. Void method, inherit it to add custom values. """ res = dict() return res diff --git a/addons/mail/tests/test_mail_features.py b/addons/mail/tests/test_mail_features.py index 0a481c78eca..17836ea186c 100644 --- a/addons/mail/tests/test_mail_features.py +++ b/addons/mail/tests/test_mail_features.py @@ -449,8 +449,8 @@ class test_mail(TestMail): 'message_post: mail.mail notifications should have been auto-deleted!') # Test: notifications emails: to a and b, c is email only, r is author - # test_emailto = ['Administrator ', 'Bert Tartopoils '] - test_emailto = ['"Followers of -Pigs-" ', '"Followers of -Pigs-" '] + test_emailto = ['"Administrator" ', '"Bert Tartopoils" '] + # test_emailto = ['"Followers of -Pigs-" ', '"Followers of -Pigs-" '] self.assertEqual(len(sent_emails), 2, 'message_post: notification emails wrong number of send emails') self.assertEqual(set([m['email_to'][0] for m in sent_emails]), set(test_emailto), @@ -462,7 +462,7 @@ class test_mail(TestMail): 'message_post: notification email sent to more than one email address instead of a precise partner') self.assertIn(sent_email['email_to'][0], test_emailto, 'message_post: notification email email_to incorrect') - self.assertEqual(sent_email['reply_to'], '"Followers of -Pigs-" ', + self.assertEqual(sent_email['reply_to'], '"YourCompany -Pigs-" ', 'message_post: notification email reply_to incorrect') self.assertEqual(_subject, sent_email['subject'], 'message_post: notification email subject incorrect') @@ -523,8 +523,8 @@ class test_mail(TestMail): self.assertFalse(self.mail_mail.search(cr, uid, [('mail_message_id', '=', msg2_id)]), 'mail.mail notifications should have been auto-deleted!') # Test: emails send by server (to a, b, c, d) - # test_emailto = [u'Administrator ', u'Bert Tartopoils ', u'Carine Poilvache ', u'D\xe9d\xe9 Grosbedon '] - test_emailto = [u'"Followers of Pigs" ', u'"Followers of Pigs" ', u'"Followers of Pigs" ', u'"Followers of Pigs" '] + test_emailto = [u'"Administrator" ', u'"Bert Tartopoils" ', u'"Carine Poilvache" ', u'"D\xe9d\xe9 Grosbedon" '] + # test_emailto = [u'"Followers of Pigs" ', u'"Followers of Pigs" ', u'"Followers of Pigs" ', u'"Followers of Pigs" '] # self.assertEqual(len(sent_emails), 3, 'sent_email number of sent emails incorrect') for sent_email in sent_emails: self.assertEqual(sent_email['email_from'], 'Raoul Grosbedon ', diff --git a/addons/mail/tests/test_mail_message.py b/addons/mail/tests/test_mail_message.py index 180661a0707..d4a7ae75df3 100644 --- a/addons/mail/tests/test_mail_message.py +++ b/addons/mail/tests/test_mail_message.py @@ -81,8 +81,7 @@ class TestMailMessage(TestMail): alias_domain = 'schlouby.fr' raoul_from = 'Raoul Grosbedon ' raoul_from_alias = 'Raoul Grosbedon ' - raoul_reply = '"Followers of Pigs" ' - raoul_reply_alias = '"Followers of Pigs" ' + raoul_reply_alias = '"YourCompany Pigs" ' # -------------------------------------------------- # Case1: without alias_domain @@ -91,7 +90,7 @@ class TestMailMessage(TestMail): self.registry('ir.config_parameter').unlink(cr, uid, param_ids) # Do: free message; specified values > default values - msg_id = self.mail_message.create(cr, user_raoul_id, {'reply_to': reply_to1, 'email_from': email_from1}) + msg_id = self.mail_message.create(cr, user_raoul_id, {'same_thread': False, 'reply_to': reply_to1, 'email_from': email_from1}) msg = self.mail_message.browse(cr, user_raoul_id, msg_id) # Test: message content self.assertIn('reply_to', msg.message_id, @@ -118,7 +117,7 @@ class TestMailMessage(TestMail): 'mail_message: message_id should contain model') self.assertIn('%s' % self.group_pigs_id, msg.message_id, 'mail_message: message_id should contain res_id') - self.assertEqual(msg.reply_to, raoul_reply, + self.assertEqual(msg.reply_to, raoul_from, 'mail_message: incorrect reply_to: should be Raoul') self.assertEqual(msg.email_from, raoul_from, 'mail_message: incorrect email_from: should be Raoul') @@ -152,7 +151,7 @@ class TestMailMessage(TestMail): msg_id = self.mail_message.create(cr, user_raoul_id, {}) msg = self.mail_message.browse(cr, user_raoul_id, msg_id) # Test: generated reply_to - self.assertEqual(msg.reply_to, 'gateway@schlouby.fr', + self.assertEqual(msg.reply_to, '"YourCompany" ', 'mail_mail: reply_to should equal the catchall email alias') # Do: create a mail_mail diff --git a/addons/mail/wizard/mail_compose_message.py b/addons/mail/wizard/mail_compose_message.py index e14a8f3dfe5..0425cd1ee0e 100644 --- a/addons/mail/wizard/mail_compose_message.py +++ b/addons/mail/wizard/mail_compose_message.py @@ -121,16 +121,12 @@ class mail_compose_message(osv.TransientModel): # mass mode options 'notify': fields.boolean('Notify followers', help='Notify followers of the document (mass post only)'), - 'same_thread': fields.boolean('Replies in the document', - help='Replies to the messages will go into the selected document (mass mail only)'), } - #TODO change same_thread to False in trunk (Require view update) _defaults = { 'composition_mode': 'comment', 'body': lambda self, cr, uid, ctx={}: '', 'subject': lambda self, cr, uid, ctx={}: False, 'partner_ids': lambda self, cr, uid, ctx={}: [], - 'same_thread': True, } def check_access_rule(self, cr, uid, ids, operation, context=None): @@ -251,6 +247,10 @@ class mail_compose_message(osv.TransientModel): # render all template-based value at once if mass_mail_mode and wizard.model: rendered_values = self.render_message_batch(cr, uid, wizard, res_ids, context=context) + # compute alias-based reply-to in batch + reply_to_value = dict.fromkeys(res_ids, None) + if mass_mail_mode and wizard.same_thread: + reply_to_value = self.pool['mail.thread'].message_get_reply_to(cr, uid, res_ids, default=wizard.email_from, context=dict(context, thread_model=wizard.model)) for res_id in res_ids: # static wizard (mail.message) values @@ -277,7 +277,9 @@ class mail_compose_message(osv.TransientModel): mail_values.update(email_dict) if wizard.same_thread: mail_values.pop('reply_to') - elif not mail_values.get('reply_to'): + if reply_to_value.get(res_id): + mail_values['reply_to'] = reply_to_value[res_id] + if not wizard.same_thread and not mail_values.get('reply_to'): mail_values['reply_to'] = mail_values['email_from'] # mail_mail values: body -> body_html, partner_ids -> recipient_ids mail_values['body_html'] = mail_values.get('body', '') diff --git a/addons/portal_project_issue/security/ir.model.access.csv b/addons/portal_project_issue/security/ir.model.access.csv index 360e0ccd997..65eff9bed1b 100644 --- a/addons/portal_project_issue/security/ir.model.access.csv +++ b/addons/portal_project_issue/security/ir.model.access.csv @@ -1,4 +1,4 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_issues,project_issue,project_issue.model_project_issue,base.group_portal,1,0,0,0 -access_case_section,crm_case_section,crm.model_crm_case_section,base.group_portal,1,0,0,0 +access_case_section,crm_case_section,sales_team.model_crm_case_section,base.group_portal,1,0,0,0 access_issues_public,project_issue,project_issue.model_project_issue,base.group_public,1,0,0,0 \ No newline at end of file diff --git a/addons/project/project.py b/addons/project/project.py index a9c487be244..8f665353325 100644 --- a/addons/project/project.py +++ b/addons/project/project.py @@ -1099,8 +1099,10 @@ class task(osv.osv): def message_get_reply_to(self, cr, uid, ids, context=None): """ Override to get the reply_to of the parent project. """ - return [task.project_id.message_get_reply_to()[0] if task.project_id else False - for task in self.browse(cr, uid, ids, context=context)] + tasks = self.browse(cr, SUPERUSER_ID, ids, context=context) + project_ids = set([task.project_id.id for task in tasks if task.project_id]) + aliases = self.pool['project.project'].message_get_reply_to(cr, uid, list(project_ids), context=context) + return dict((task.id, aliases.get(task.project_id and task.project_id.id or 0, False)) for task in tasks) def message_new(self, cr, uid, msg, custom_values=None, context=None): """ Override to updates the document according to the email. """ diff --git a/addons/project_issue/__openerp__.py b/addons/project_issue/__openerp__.py index 97b6f736f54..4f7045f6aca 100644 --- a/addons/project_issue/__openerp__.py +++ b/addons/project_issue/__openerp__.py @@ -37,7 +37,7 @@ It allows the manager to quickly check the issues, assign them and decide on the 'website': 'http://www.openerp.com', 'images': ['images/issue_analysis.jpeg','images/project_issue.jpeg'], 'depends': [ - 'crm', + 'sales_team', 'project', ], 'data': [ diff --git a/addons/project_issue/project_issue.py b/addons/project_issue/project_issue.py index 6c06f14d5fa..dd3b0a2d61f 100644 --- a/addons/project_issue/project_issue.py +++ b/addons/project_issue/project_issue.py @@ -23,7 +23,6 @@ from datetime import datetime from openerp import SUPERUSER_ID from openerp import tools -from openerp.addons.crm import crm from openerp.osv import fields, osv, orm from openerp.tools import html2plaintext from openerp.tools.translate import _ @@ -259,7 +258,7 @@ class project_issue(osv.Model): 'date_closed': fields.datetime('Closed', readonly=True,select=True), 'date': fields.datetime('Date'), 'date_last_stage_update': fields.datetime('Last Stage Update', select=True), - 'channel_id': fields.many2one('crm.case.channel', 'Channel', help="Communication channel."), + 'channel': fields.char('Channel', help="Communication channel."), 'categ_ids': fields.many2many('project.category', string='Tags'), 'priority': fields.selection([('0','Low'), ('1','Normal'), ('2','High')], 'Priority', select=True), 'version_id': fields.many2one('project.issue.version', 'Version'), @@ -414,8 +413,10 @@ class project_issue(osv.Model): def message_get_reply_to(self, cr, uid, ids, context=None): """ Override to get the reply_to of the parent project. """ - return [issue.project_id.message_get_reply_to()[0] if issue.project_id else False - for issue in self.browse(cr, uid, ids, context=context)] + issues = self.browse(cr, SUPERUSER_ID, ids, context=context) + project_ids = set([issue.project_id.id for issue in issues if issue.project_id]) + aliases = self.pool['project.project'].message_get_reply_to(cr, uid, list(project_ids), context=context) + return dict((issue.id, aliases.get(issue.project_id and issue.project_id.id or 0, False)) for issue in issues) def message_get_suggested_recipients(self, cr, uid, ids, context=None): recipients = super(project_issue, self).message_get_suggested_recipients(cr, uid, ids, context=context) diff --git a/addons/project_issue/report/project_issue_report.py b/addons/project_issue/report/project_issue_report.py index b8778918f87..5ac7b6e48c6 100644 --- a/addons/project_issue/report/project_issue_report.py +++ b/addons/project_issue/report/project_issue_report.py @@ -52,7 +52,7 @@ class project_issue_report(osv.osv): 'version_id': fields.many2one('project.issue.version', 'Version'), 'user_id' : fields.many2one('res.users', 'Assigned to',readonly=True), 'partner_id': fields.many2one('res.partner','Contact'), - 'channel_id': fields.many2one('crm.case.channel', 'Channel',readonly=True), + 'channel': fields.char('Channel', readonly=True, help="Communication Channel."), 'task_id': fields.many2one('project.task', 'Task'), 'email': fields.integer('# Emails', size=128, readonly=True), } @@ -81,7 +81,7 @@ class project_issue_report(osv.osv): c.version_id as version_id, 1 as nbr, c.partner_id, - c.channel_id, + c.channel, c.task_id, date_trunc('day',c.create_date) as create_date, c.day_open as delay_open, diff --git a/addons/project_issue/security/ir.model.access.csv b/addons/project_issue/security/ir.model.access.csv index ef4edfdc13a..400e118a6d0 100644 --- a/addons/project_issue/security/ir.model.access.csv +++ b/addons/project_issue/security/ir.model.access.csv @@ -5,6 +5,6 @@ access_project_issue_version_project,project_issue_version manager,model_project access_project_issue_version_project_user,project_issue_version user,model_project_issue_version,project.group_project_user,1,0,0,0 access_resource_calendar_project_manager,resource.calendar.project.manager,resource.model_resource_calendar,project.group_project_manager,1,1,1,1 access_project_issue_report_user,project.issue.report user,model_project_issue_report,project.group_project_user,1,0,0,0 -access_crm_case_section,crm.case.section,crm.model_crm_case_section,project.group_project_user,1,0,0,0 +access_crm_case_section,crm.case.section,sales_team.model_crm_case_section,project.group_project_user,1,0,0,0 access_project_issue_salesman,project.issue,model_project_issue,base.group_sale_salesman,1,0,0,0 access_project_issue_manager,project.issue,model_project_issue,base.group_sale_manager,1,0,0,0 diff --git a/addons/web/static/src/js/data.js b/addons/web/static/src/js/data.js index 6819634655d..f580d282516 100644 --- a/addons/web/static/src/js/data.js +++ b/addons/web/static/src/js/data.js @@ -21,6 +21,17 @@ instance.web.serialize_sort = function (criterion) { }).join(', '); }; +/** + * Reverse of the serialize_sort function: convert an array of SQL-like sort + * descriptors into a list of fields prefixed with '-' if necessary. + */ + instance.web.deserialize_sort = function (criterion) { + return _.map(criterion, function (criteria) { + var split = _.without(criteria.split(' '), ''); + return (split[1] && split[1].toLowerCase() === 'desc' ? '-' : '') + split[0]; + }); +}; + instance.web.Query = instance.web.Class.extend({ init: function (model, fields) { this._model = model; @@ -685,6 +696,15 @@ instance.web.DataSet = instance.web.Class.extend(instance.web.PropertiesMixin, this._sort.unshift((reverse ? '-' : '') + field); return undefined; }, + /** + * Set the sort criteria on the dataset. + * + * @param {Array} fields_list: list of fields order descriptors, as used by + * Odoo's ORM (such as 'name desc', 'product_id', 'order_date asc') + */ + set_sort: function (fields_list) { + this._sort = instance.web.deserialize_sort(fields_list); + }, size: function () { return this.ids.length; }, diff --git a/addons/web/static/src/js/view_list.js b/addons/web/static/src/js/view_list.js index 16d0310ab4d..6bea2bbe4ad 100644 --- a/addons/web/static/src/js/view_list.js +++ b/addons/web/static/src/js/view_list.js @@ -354,6 +354,12 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi this.sidebar.$el.hide(); } //Sort + var default_order = this.fields_view.arch.attrs.default_order, + unsorted = !this.dataset._sort.length; + if (unsorted && default_order) { + this.dataset.set_sort(default_order.split(',')); + } + if(this.dataset._sort.length){ if(this.dataset._sort[0].indexOf('-') == -1){ this.$el.find('th[data-id=' + this.dataset._sort[0] + ']').addClass("sortdown"); diff --git a/addons/web_calendar/static/src/js/web_calendar.js b/addons/web_calendar/static/src/js/web_calendar.js index a7cff99f436..532dd4f05b6 100644 --- a/addons/web_calendar/static/src/js/web_calendar.js +++ b/addons/web_calendar/static/src/js/web_calendar.js @@ -325,59 +325,6 @@ openerp.web_calendar = function(instance) { firstDay: translate.firstDay, }); - - if (this.useContacts) { - //Get my Partner ID - - new instance.web.Model("res.users").query(["partner_id"]).filter([["id", "=",this.dataset.context.uid]]).first() - .done( - function(result) { - var sidebar_items = {}; - var filter_value = result.partner_id[0]; - var filter_item = { - value: filter_value, - label: result.partner_id[1] + _lt(" [Me]"), - color: self.get_color(filter_value), - avatar_model: self.avatar_model, - is_checked: true - }; - - sidebar_items[filter_value] = filter_item ; - filter_item = { - value: -1, - label: _lt("Everybody's calendars"), - color: self.get_color(-1), - avatar_model: self.avatar_model, - is_checked: false - }; - sidebar_items[-1] = filter_item ; - //Get my coworkers/contacts - new instance.web.Model("calendar.contacts").query(["partner_id"]).filter([["user_id", "=",self.dataset.context.uid]]).all().then(function(result) { - _.each(result, function(item) { - filter_value = item.partner_id[0]; - filter_item = { - value: filter_value, - label: item.partner_id[1], - color: self.get_color(filter_value), - avatar_model: self.avatar_model, - is_checked: true - }; - sidebar_items[filter_value] = filter_item ; - }); - - self.all_filters = sidebar_items; - self.now_filter_ids = $.map(self.all_filters, function(o) { return o.value; }); - - self.sidebar.filter.events_loaded(self.all_filters); - self.sidebar.filter.set_filters(); - - self.sidebar.filter.addUpdateButton(); - }).done(function () { - self.$calendar.fullCalendar('refetchEvents'); - }); - } - ); - } this.extraSideBar(); } self.$calendar.fullCalendar(self.get_fc_init_options()); @@ -1430,20 +1377,14 @@ openerp.web_calendar = function(instance) { this.$el.html(QWeb.render('CalendarView.sidebar.responsible', { filters: filters })); }, filter_click: function(e) { - var self = this; - self.view.all_filters[parseInt(e.target.value)].is_checked = e.target.checked; + var self = this; + if (self.view.all_filters[0] && e.target.value == self.view.all_filters[0].value) { + self.view.all_filters[0].is_checked = e.target.checked; + } else { + self.view.all_filters[parseInt(e.target.value)].is_checked = e.target.checked; + } self.view.$calendar.fullCalendar('refetchEvents'); }, - addUpdateButton: function() { - var self=this; - this.$('div.oe_calendar_all_responsibles').append(QWeb.render('CalendarView.sidebar.button_add_contact')); - this.$(".add_contacts_link_btn").on('click', function() { - self.rpc("/web/action/load", { - action_id: "calendar.action_calendar_contacts" - }).then( function(result) { return self.do_action(result); }); - }); - - }, }); }; diff --git a/addons/web_calendar/static/src/xml/web_fullcalendar.xml b/addons/web_calendar/static/src/xml/web_fullcalendar.xml index 615599781c1..ca4c9466735 100644 --- a/addons/web_calendar/static/src/xml/web_fullcalendar.xml +++ b/addons/web_calendar/static/src/xml/web_fullcalendar.xml @@ -35,7 +35,7 @@ - + @@ -53,13 +53,6 @@ - -
- -
-
diff --git a/addons/web_kanban/static/src/js/kanban.js b/addons/web_kanban/static/src/js/kanban.js index 1d97522e011..239a703d276 100644 --- a/addons/web_kanban/static/src/js/kanban.js +++ b/addons/web_kanban/static/src/js/kanban.js @@ -62,6 +62,14 @@ instance.web_kanban.KanbanView = instance.web.View.extend({ }, load_kanban: function(data) { this.fields_view = data; + + // use default order if defined in xml description + var default_order = this.fields_view.arch.attrs.default_order, + unsorted = !this.dataset._sort.length; + if (unsorted && default_order) { + this.dataset.set_sort(default_order.split(',')); + } + this.$el.addClass(this.fields_view.arch.attrs['class']); this.$buttons = $(QWeb.render("KanbanView.buttons", {'widget': this})); if (this.options.$buttons) { diff --git a/addons/website/models/ir_http.py b/addons/website/models/ir_http.py index 8e6846dd7a8..6ffb267c214 100644 --- a/addons/website/models/ir_http.py +++ b/addons/website/models/ir_http.py @@ -24,6 +24,7 @@ class ir_http(orm.AbstractModel): _inherit = 'ir.http' rerouting_limit = 10 + geo_ip_resolver = None def _get_converters(self): return dict( @@ -53,6 +54,18 @@ class ir_http(orm.AbstractModel): request.website_multilang = request.website_enabled and func and func.routing.get('multilang', True) + if not request.session.has_key('geoip'): + record = {} + if self.geo_ip_resolver is None: + try: + import GeoIP + self.geo_ip_resolver = GeoIP.open('/usr/share/GeoIP/GeoIP.dat', GeoIP.GEOIP_STANDARD) + except ImportError: + self.geo_ip_resolver = False + if self.geo_ip_resolver: + record = self.geo_ip_resolver.record_by_addr(request.httprequest.remote_addr) or {} + request.session['geoip'] = record + if request.website_enabled: if func: self._authenticate(func.routing['auth']) diff --git a/addons/website_crm_partner_assign/controllers/main.py b/addons/website_crm_partner_assign/controllers/main.py index 7bec48c140a..9ae7a43289f 100644 --- a/addons/website_crm_partner_assign/controllers/main.py +++ b/addons/website_crm_partner_assign/controllers/main.py @@ -1,15 +1,6 @@ # -*- coding: utf-8 -*- -import logging import re import werkzeug - -_logger = logging.getLogger(__name__) -try: - import GeoIP -except ImportError: - GeoIP = None - _logger.warn("Please install GeoIP python module to use events localisation.") - from openerp import SUPERUSER_ID from openerp.addons.web import http from openerp.addons.web.http import request @@ -20,12 +11,6 @@ from openerp.tools.translate import _ class WebsiteCrmPartnerAssign(http.Controller): _references_per_page = 40 - def _get_current_country_code(self): - if not GeoIP: - return False - GI = GeoIP.open('/usr/share/GeoIP/GeoIP.dat', 0) - return GI.country_code_by_addr(request.httprequest.remote_addr) - @http.route([ '/partners', '/partners/page/', @@ -52,7 +37,7 @@ class WebsiteCrmPartnerAssign(http.Controller): # group by grade grade_domain = list(base_partner_domain) if not country and not country_all: - country_code = self._get_current_country_code() + country_code = request.session['geoip'].get('country_code') if country_code: country_ids = country_obj.search(request.cr, request.uid, [('code', '=', country_code)], context=request.context) if country_ids: diff --git a/addons/website_event/controllers/main.py b/addons/website_event/controllers/main.py index 16a6bd24edf..2e9aa4616d2 100644 --- a/addons/website_event/controllers/main.py +++ b/addons/website_event/controllers/main.py @@ -19,28 +19,18 @@ # ############################################################################## -import logging import time from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta import werkzeug.urls -from openerp import SUPERUSER_ID from openerp import http from openerp import tools from openerp.http import request from openerp.tools.translate import _ from openerp.addons.website.models.website import slug -_logger = logging.getLogger(__name__) - -try: - import GeoIP -except ImportError: - GeoIP = None - _logger.warn("Please install GeoIP python module to use events localisation.") - class website_event(http.Controller): @http.route(['/event', '/event/page/'], type='http', auth="public", website=True) def events(self, page=1, **searches): @@ -214,10 +204,6 @@ class website_event(http.Controller): event = Event.browse(request.cr, request.uid, event_id, context=context) return request.redirect("/event/%s/register?enable_editor=1" % slug(event)) - def get_visitors_country(self): - GI = GeoIP.open('/usr/share/GeoIP/GeoIP.dat', 0) - return {'country_code': GI.country_code_by_addr(request.httprequest.remote_addr), 'country_name': GI.country_name_by_addr(request.httprequest.remote_addr)} - def get_formated_date(self, event): start_date = datetime.strptime(event.date_begin, tools.DEFAULT_SERVER_DATETIME_FORMAT).date() end_date = datetime.strptime(event.date_end, tools.DEFAULT_SERVER_DATETIME_FORMAT).date() @@ -225,21 +211,19 @@ class website_event(http.Controller): @http.route('/event/get_country_event_list', type='http', auth='public', website=True) def get_country_events(self ,**post): - if not GeoIP: - return "" + cr, uid, context, event_ids = request.cr, request.uid, request.context,[] country_obj = request.registry['res.country'] event_obj = request.registry['event.event'] - cr, uid, context,event_ids = request.cr, request.uid, request.context,[] - country_code = self.get_visitors_country()['country_code'] + country_code = request.session['geoip'].get('country_code') result = {'events':[],'country':False} if country_code: - country_ids = country_obj.search(request.cr, request.uid, [('code', '=', country_code)], context=request.context) - event_ids = event_obj.search(request.cr, request.uid, ['|', ('address_id', '=', None),('country_id.code', '=', country_code),('date_begin','>=', time.strftime('%Y-%m-%d 00:00:00')),('state', '=', 'confirm')], order="date_begin", context=request.context) + country_ids = country_obj.search(cr, uid, [('code', '=', country_code)], context=context) + event_ids = event_obj.search(cr, uid, ['|', ('address_id', '=', None),('country_id.code', '=', country_code),('date_begin','>=', time.strftime('%Y-%m-%d 00:00:00')),('state', '=', 'confirm')], order="date_begin", context=context) if not event_ids: - event_ids = event_obj.search(request.cr, request.uid, [('date_begin','>=', time.strftime('%Y-%m-%d 00:00:00')),('state', '=', 'confirm')], order="date_begin", context=request.context) - for event in event_obj.browse(request.cr, request.uid, event_ids, context=request.context)[:6]: + event_ids = event_obj.search(cr, uid, [('date_begin','>=', time.strftime('%Y-%m-%d 00:00:00')),('state', '=', 'confirm')], order="date_begin", context=context) + for event in event_obj.browse(cr, uid, event_ids, context=context)[:6]: if country_code and event.country_id.code == country_code: - result['country'] = country_obj.browse(request.cr, request.uid, country_ids[0], context=request.context) + result['country'] = country_obj.browse(cr, uid, country_ids[0], context=context) result['events'].append({ "date": self.get_formated_date(event), "event": event, diff --git a/addons/website_mail_group/models/mail_group.py b/addons/website_mail_group/models/mail_group.py index 804785b66f9..8e790b2b8d5 100644 --- a/addons/website_mail_group/models/mail_group.py +++ b/addons/website_mail_group/models/mail_group.py @@ -1,6 +1,7 @@ # -*- coding: utf-8 -*- from openerp.osv import osv +from openerp.tools.safe_eval import safe_eval as eval class MailGroup(osv.Model): @@ -10,9 +11,14 @@ class MailGroup(osv.Model): res = super(MailGroup, self).message_get_email_values(cr, uid, id, notif_mail=notif_mail, context=context) group = self.browse(cr, uid, id, context=context) base_url = self.pool['ir.config_parameter'].get_param(cr, uid, 'web.base.url') - res['headers'].update({ + try: + headers = eval(res.get('headers', '{}')) + except Exception: + headers = {} + headers.update({ 'List-Archive': '<%s/groups/%s>' % (base_url, group.id), 'List-Subscribe': '<%s/groups>' % (base_url), 'List-Unsubscribe': '<%s/groups>' % (base_url), }) + res['headers'] = '%s' % headers return res diff --git a/addons/website_sale/static/src/js/website.tour.shop.js b/addons/website_sale/static/src/js/website.tour.shop.js index c39a8b2f9e8..7fc37a48b5b 100644 --- a/addons/website_sale/static/src/js/website.tour.shop.js +++ b/addons/website_sale/static/src/js/website.tour.shop.js @@ -47,16 +47,14 @@ popover: { next: _t("Continue") }, }, { - element: '.product_price .oe_currency_value', + element: '.product_price .oe_currency_value:visible', sampleText: '20.50', placement: 'left', title: _t("Change the price"), content: _t("Edit the price of this product by clicking on the amount."), }, - - { - waitNot: '.product_price .oe_currency_value:containsExact(1.00)', + waitNot: '.product_price .oe_currency_value:visible:containsExact(1.00)', element: '#wrap img.product_detail_img', placement: 'top', title: _t("Update image"), diff --git a/addons/website_sale/views/templates.xml b/addons/website_sale/views/templates.xml index fb5a83de1bd..21bab48a8b3 100644 --- a/addons/website_sale/views/templates.xml +++ b/addons/website_sale/views/templates.xml @@ -408,7 +408,7 @@ diff --git a/setup/debian/changelog b/debian/changelog similarity index 100% rename from setup/debian/changelog rename to debian/changelog diff --git a/setup/debian/compat b/debian/compat similarity index 100% rename from setup/debian/compat rename to debian/compat diff --git a/setup/debian/control b/debian/control similarity index 100% rename from setup/debian/control rename to debian/control diff --git a/setup/debian/copyright b/debian/copyright similarity index 100% rename from setup/debian/copyright rename to debian/copyright diff --git a/setup/debian/openerp-server.conf b/debian/openerp-server.conf similarity index 100% rename from setup/debian/openerp-server.conf rename to debian/openerp-server.conf diff --git a/setup/debian/openerp.init b/debian/openerp.init similarity index 100% rename from setup/debian/openerp.init rename to debian/openerp.init diff --git a/setup/debian/openerp.install b/debian/openerp.install similarity index 100% rename from setup/debian/openerp.install rename to debian/openerp.install diff --git a/setup/debian/openerp.logrotate b/debian/openerp.logrotate similarity index 100% rename from setup/debian/openerp.logrotate rename to debian/openerp.logrotate diff --git a/setup/debian/openerp.postinst b/debian/openerp.postinst similarity index 100% rename from setup/debian/openerp.postinst rename to debian/openerp.postinst diff --git a/setup/debian/openerp.postrm b/debian/openerp.postrm similarity index 100% rename from setup/debian/openerp.postrm rename to debian/openerp.postrm diff --git a/setup/debian/rules b/debian/rules similarity index 100% rename from setup/debian/rules rename to debian/rules diff --git a/setup/debian/run_all_with_tests.sh b/debian/run_all_with_tests.sh similarity index 100% rename from setup/debian/run_all_with_tests.sh rename to debian/run_all_with_tests.sh diff --git a/odoo.py b/odoo.py index ba4178fbbcc..ad34f9ddc1a 100755 --- a/odoo.py +++ b/odoo.py @@ -72,7 +72,6 @@ def cmd_setup_git(): # alias run('git','config','alias.st','status') # merge bzr style - run('git','config','merge.ff','no') run('git','config','merge.commit','no') # pull let me choose between merge or rebase only works in git > 2.0, use an alias for 1 run('git','config','pull.ff','only') diff --git a/openerp/addons/base/ir/ir_ui_view_view.xml b/openerp/addons/base/ir/ir_ui_view_view.xml index 23c5275cc3b..61b5af9b06d 100644 --- a/openerp/addons/base/ir/ir_ui_view_view.xml +++ b/openerp/addons/base/ir/ir_ui_view_view.xml @@ -28,6 +28,15 @@ + + + + + + + + + diff --git a/openerp/service/server.py b/openerp/service/server.py index c0dc15caab7..576d55e1cd7 100644 --- a/openerp/service/server.py +++ b/openerp/service/server.py @@ -130,14 +130,14 @@ class AutoReload(object): self.handler = EventHandler(self) self.notifier = pyinotify.Notifier(self.wm, self.handler, timeout=0) mask = pyinotify.IN_MODIFY | pyinotify.IN_CREATE # IN_MOVED_FROM, IN_MOVED_TO ? - for path in openerp.modules.modules.ad_paths: + for path in openerp.modules.module.ad_paths: _logger.info('Watching addons folder %s', path) self.wm.add_watch(path, mask, rec=True) def process_data(self, files): xml_files = [i for i in files if i.endswith('.xml')] for i in xml_files: - for path in openerp.modules.modules.ad_paths: + for path in openerp.modules.module.ad_paths: if i.startswith(path): # find out wich addons path the file belongs to # and extract it's module name diff --git a/setup/setup.cfg b/setup.cfg similarity index 66% rename from setup/setup.cfg rename to setup.cfg index 7693a84fc3a..40062a73157 100644 --- a/setup/setup.cfg +++ b/setup.cfg @@ -7,4 +7,4 @@ formats=gztar formats=rpm [bdist_rpm] -install_script=setup_rpm.sh +install_script=setup/setup_rpm.sh diff --git a/setup/windows/Makefile b/setup/windows/Makefile index 603951b6cd0..6378e17401b 100644 --- a/setup/windows/Makefile +++ b/setup/windows/Makefile @@ -1,10 +1,9 @@ include Makefile.version -include Makefile.python SERVER_DIRECTORY=../server FILES_DIRECTORY=files -LAUNCH_PY2EXE=/cygdrive/c/python${PYTHON_VERSION}/python.exe setup.py py2exe +LAUNCH_PY2EXE=/cygdrive/c/python26/python.exe setup.py py2exe MAKENSIS_ARGUMENTS=/DVERSION=$(VERSION) @@ -27,7 +26,7 @@ server_clean: server: server_clean (cd $(SERVER_DIRECTORY)/win32 && $(LAUNCH_PY2EXE)) (cd $(SERVER_DIRECTORY) && $(LAUNCH_PY2EXE)) - rm -rf `/usr/bin/find ${SERVER_DIRECTORY}/dist/openerp/addons -maxdepth 1 -mindepth 1 -not -name "web_*" -and -not -name "base" -and -not -name "web" -type d | xargs rm -rf` +# rm -rf `/usr/bin/find ${SERVER_DIRECTORY}/dist/openerp/addons -maxdepth 1 -mindepth 1 -not -name "web*" -and -not -name "base" -type d | xargs rm -rf` (cd $(SERVER_DIRECTORY) && $(LAUNCH_MAKENSIS)) cp $(SERVER_DIRECTORY)/openerp-*.exe $(FILES_DIRECTORY)/openerp-server-setup-$(VERSION).exe diff --git a/setup/windows/contrib.nsh b/setup/windows/contrib.nsh new file mode 100644 index 00000000000..ba93b6fa5ef --- /dev/null +++ b/setup/windows/contrib.nsh @@ -0,0 +1,329 @@ +# Source: http://nsis.sourceforge.net/CharToASCII +!include LogicLib.nsh + +!ifndef CHAR_TO_ASCII_NSH + +!define CharToASCII "!insertmacro CharToASCII" + +!macro CharToASCII AsciiCode Character + Push "${Character}" + Call CharToASCII + Pop "${AsciiCode}" +!macroend + +Function CharToASCII + Exch $0 ; given character + Push $1 ; current character + Push $2 ; current Ascii Code + + StrCpy $2 1 ; right from start +Loop: + IntFmt $1 %c $2 ; Get character from current ASCII code + ${If} $1 S== $0 ; case sensitive string comparison + StrCpy $0 $2 + Goto Done + ${EndIf} + IntOp $2 $2 + 1 + StrCmp $2 255 0 Loop ; ascii from 1 to 255 + StrCpy $0 0 ; ASCII code wasn't found -> return 0 +Done: + Pop $2 + Pop $1 + Exch $0 +FunctionEnd + +!endif ; CHAR_TO_ASCII_NSH + +# Source: http://nsis.sourceforge.net/Base64 +!ifndef BASE64_NSH +!define BASE64_NSH + +!define BASE64_ENCODINGTABLE "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/" +!define BASE64_ENCODINGTABLEURL "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_" + +!define BASE64_PADDING "=" + +VAR OCTETVALUE +VAR BASE64TEMP + +!define Base64_Encode "!insertmacro Base64_Encode" +!define Base64_URLEncode "!insertmacro Base64_URLEncode" + +!macro Base64_Encode _cleartext + push $R0 + push $R1 + push $R2 + push $0 + push $1 + push $2 + push $3 + push $4 + push $5 + push $6 + push $7 + push `${_cleartext}` + push `${BASE64_ENCODINGTABLE}` + Call Base64_Encode + Pop $BASE64TEMP + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + pop $R2 + pop $R1 + pop $R0 + Push $BASE64TEMP +!macroend + +!macro Base64_URLEncode _cleartext + push $R0 + push $R1 + push $R2 + push $0 + push $1 + push $2 + push $3 + push $4 + push $5 + push $6 + push $7 + push `${_cleartext}` + push `${BASE64_ENCODINGTABLEURL}` + Call Base64_Encode + Pop $BASE64TEMP + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + pop $R2 + pop $R1 + pop $R0 + Push $BASE64TEMP +!macroend + +Function Base64_Encode + pop $R2 ; Encoding table + pop $R0 ; Clear Text + StrCpy "$R1" "" # The result + + StrLen $1 "$R0" + StrCpy $0 0 + + ${WHILE} $0 < $1 + # Copy 3 characters, and for each character push their value. + StrCpy $OCTETVALUE 0 + + StrCpy $5 $0 + StrCpy $4 "$R0" 1 $5 + ${CharToASCII} $4 "$4" + + IntOp $OCTETVALUE $4 << 16 + + IntOp $5 $5 + 1 + ${IF} $5 < $1 + StrCpy $4 "$R0" 1 $5 + ${CharToASCII} $4 "$4" + + IntOp $4 $4 << 8 + IntOp $OCTETVALUE $OCTETVALUE + $4 + + IntOp $5 $5 + 1 + ${IF} $5 < $1 + StrCpy $4 "$R0" 1 $5 + ${CharToASCII} $4 "$4" + + IntOp $OCTETVALUE $OCTETVALUE + $4 + ${ENDIF} + ${ENDIF} + + # Now take the 4 indexes from the encoding table, based on 6bits each of the octet's value. + IntOp $4 $OCTETVALUE >> 18 + IntOp $4 $4 & 63 + StrCpy $5 "$R2" 1 $4 + StrCpy $R1 "$R1$5" + + IntOp $4 $OCTETVALUE >> 12 + IntOp $4 $4 & 63 + StrCpy $5 "$R2" 1 $4 + StrCpy $R1 "$R1$5" + + StrCpy $6 $0 + StrCpy $7 2 + + IntOp $6 $6 + 1 + ${IF} $6 < $1 + IntOp $4 $OCTETVALUE >> 6 + IntOp $4 $4 & 63 + StrCpy $5 "$R2" 1 $4 + StrCpy $R1 "$R1$5" + IntOp $7 $7 - 1 + ${ENDIF} + + IntOp $6 $6 + 1 + ${IF} $6 < $1 + IntOp $4 $OCTETVALUE & 63 + StrCpy $5 "$R2" 1 $4 + StrCpy $R1 "$R1$5" + IntOp $7 $7 - 1 + ${ENDIF} + + # If there is any padding required, we now write that here. + ${IF} $7 > 0 + ${WHILE} $7 > 0 + StrCpy $R1 "$R1${BASE64_PADDING}" + IntOp $7 $7 - 1 + ${ENDWHILE} + ${ENDIF} + + IntOp $0 $0 + 3 + ${ENDWHILE} + + Push "$R1" +FunctionEnd + + +!define Base64_Decode "!insertmacro Base64_Decode" +!define Base64_URLDecode "!insertmacro Base64_URLDecode" + +!macro Base64_Decode _encodedtext + push `${_encodedtext}` + push `${BASE64_ENCODINGTABLE}` + Call Base64_Decode +!macroend + +!macro Base64_URLDecode _encodedtext + push `${_encodedtext}` + push `${BASE64_ENCODINGTABLEURL}` + Call Base64_Decode +!macroend + +Function base64_Decode + ; Stack: strBase64table strEncoded + Push $9 ; Stack: $9 strBase64table strEncoded ; $9 = strDecoded + Exch 2 ; Stack: strEncoded strBase64table $9 + Exch ; Stack: strBase64table strEncoded $9 + Exch $0 ; Stack: $0 strEncoded $9 ; $0 = strBase64table + Exch ; Stack: strEncoded $0 $9 + Exch $1 ; Stack: $1 $0 $9 ; $1 = strEncoded + + Push $2 ; strBase64table.length + Push $3 ; strEncoded.length + Push $4 ; strBase64table.counter + Push $5 ; strEncoded.counter + Push $6 ; strBase64table.char + Push $7 ; strEncoded.char + + Push $R0 ; 6bit-group.counter + Push $R1 ; 6bit-group.a + Push $R2 ; 6bit-group.b + Push $R3 ; 6bit-group.c + Push $R4 ; 6bit-group.d + + Push $R5 ; bit-group.tempVar.a + Push $R6 ; bit-group.tempVar.b + + Push $R7 ; 8bit-group.A + Push $R8 ; 8bit-group.B + Push $R9 ; 8bit-group.C + + StrCpy $9 "" ; Result string + + StrLen $2 "$0" ; Get the length of the base64 table into $2 + StrLen $3 "$1" ; Get the length of the encoded text into $3 + IntOp $3 $3 - 1 ; Subtract one as the StrCpy offset is zero-based + + StrCpy $R0 4 ; Initialize the 6bit-group.counter + + ${ForEach} $5 0 $3 + 1 ; Loop over the encoded string + StrCpy $7 $1 1 $5 ; Grab the character at the loop counter's index + + ${If} $7 == "${BASE64_PADDING}" ; If it's the padding char + Push 0 ; Push value 0 (no impact on decoded string) + ${Else} ; Otherwise + ${ForEach} $4 0 $2 + 1 ; Loop over the base64 lookup table + StrCpy $6 $0 1 $4 ; Grab the character at this loop counter's index + ${If} $6 S== $7 ; If that character matches the encoded string character + ${ExitFor} ; Exit this loop early + ${EndIf} + ${Next} + Push $4 ; Push the lookup's index to the stack + ${EndIf} + + IntOp $R0 $R0 - 1 ; Decrease the 6bit-group counter + + ${If} $R0 = 0 ; If that counter reaches zero + ; Pop the index values off the stack to variables + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + + ; The way the base64 decoding works is like this... + ; Normal ASCII has 8 bits, base64 has 6 bits. + ; Those 8 bits need to be presented as 6 bits somehow + ; Turns out you can easily do that by taking their common multiple: 24 + ; This results in 3 8bit characters per each 4 6bit characters: + ; AAAAAAAA BBBBBBBB CCCCCCCC + ; aaaaaabb bbbbcccc ccdddddd + + ; So to go back to AAAAAAAA, you need: + ; aaaaaa shifted two bits to the left + ; the two left-most bits of bbbbbb, + ; which you can do by shifting it four bits to the right + IntOp $R5 $R1 << 2 + IntOp $R6 $R2 >> 4 + IntOp $R5 $R5 | $R6 + IntFmt $R7 "%c" $R5 ; IntFmt turns the resulting 8bit value to a character + + ; For BBBBBBBB, you need: + ; the four least significant bits of bbbbbb + ; which you can get by binary OR'ing with 2^4-1 = 15 + ; the four most significant bits of cccccc + ; which you can get by just shifting it two bits to the right + IntOp $R5 $R2 & 15 + InTop $R5 $R5 << 4 + IntOp $R6 $R3 >> 2 + IntOp $R5 $R5 | $R6 + IntFmt $R8 "%c" $R5 + + ; For CCCCCCCC, the procedure is entirely similar. + IntOp $R5 $R3 & 3 + IntOp $R5 $R5 << 6 + IntOp $R5 $R5 | $R4 + IntFmt $R9 "%c" $R5 + + StrCpy $9 "$9$R7$R8$R9" ; Tack it all onto the result + StrCpy $R0 4 ; Reset the 6bit-group counter + ${EndIf} + ${Next} + + ; Done. Now let's restore the user's variables + Pop $R9 + Pop $R8 + Pop $R7 + Pop $R6 + Pop $R5 + Pop $R4 + Pop $R3 + Pop $R2 + Pop $R1 + Pop $R0 + Pop $7 + Pop $6 + Pop $5 + Pop $4 + Pop $3 + Pop $2 + Pop $1 + Pop $0 + Exch $9 ; Stack: strDecoded +FunctionEnd +!endif ;BASE64_NSH \ No newline at end of file